SearchDropTargetBar.java revision c9735cff2e558aa3f3810e49c15ef13049b9429c
14c98d9235d164680186180974719f551cf935d08Winson Chung/*
24c98d9235d164680186180974719f551cf935d08Winson Chung * Copyright (C) 2011 The Android Open Source Project
34c98d9235d164680186180974719f551cf935d08Winson Chung *
44c98d9235d164680186180974719f551cf935d08Winson Chung * Licensed under the Apache License, Version 2.0 (the "License");
54c98d9235d164680186180974719f551cf935d08Winson Chung * you may not use this file except in compliance with the License.
64c98d9235d164680186180974719f551cf935d08Winson Chung * You may obtain a copy of the License at
74c98d9235d164680186180974719f551cf935d08Winson Chung *
84c98d9235d164680186180974719f551cf935d08Winson Chung *      http://www.apache.org/licenses/LICENSE-2.0
94c98d9235d164680186180974719f551cf935d08Winson Chung *
104c98d9235d164680186180974719f551cf935d08Winson Chung * Unless required by applicable law or agreed to in writing, software
114c98d9235d164680186180974719f551cf935d08Winson Chung * distributed under the License is distributed on an "AS IS" BASIS,
124c98d9235d164680186180974719f551cf935d08Winson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134c98d9235d164680186180974719f551cf935d08Winson Chung * See the License for the specific language governing permissions and
144c98d9235d164680186180974719f551cf935d08Winson Chung * limitations under the License.
154c98d9235d164680186180974719f551cf935d08Winson Chung */
164c98d9235d164680186180974719f551cf935d08Winson Chung
17325dc23624160689e59fbac708cf6f222b20d025Daniel Sandlerpackage com.android.launcher3;
184c98d9235d164680186180974719f551cf935d08Winson Chung
19201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chungimport android.animation.Animator;
20201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chungimport android.animation.AnimatorListenerAdapter;
21201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chungimport android.animation.ObjectAnimator;
22c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohenimport android.animation.ValueAnimator;
234c98d9235d164680186180974719f551cf935d08Winson Chungimport android.content.Context;
24cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwoodimport android.graphics.Rect;
254c98d9235d164680186180974719f551cf935d08Winson Chungimport android.util.AttributeSet;
264c98d9235d164680186180974719f551cf935d08Winson Chungimport android.view.View;
27a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chungimport android.view.animation.AccelerateInterpolator;
284c98d9235d164680186180974719f551cf935d08Winson Chungimport android.widget.FrameLayout;
294c98d9235d164680186180974719f551cf935d08Winson Chung
304c98d9235d164680186180974719f551cf935d08Winson Chung/*
314c98d9235d164680186180974719f551cf935d08Winson Chung * Ths bar will manage the transition between the QSB search bar and the delete drop
324c98d9235d164680186180974719f551cf935d08Winson Chung * targets so that each of the individual IconDropTargets don't have to.
334c98d9235d164680186180974719f551cf935d08Winson Chung */
344c98d9235d164680186180974719f551cf935d08Winson Chungpublic class SearchDropTargetBar extends FrameLayout implements DragController.DragListener {
354c98d9235d164680186180974719f551cf935d08Winson Chung
36a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung    private static final int sTransitionInDuration = 200;
37a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung    private static final int sTransitionOutDuration = 175;
384c98d9235d164680186180974719f551cf935d08Winson Chung
3917f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung    private ObjectAnimator mDropTargetBarAnim;
40c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen    private ValueAnimator mQSBSearchBarAnim;
4117f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung    private static final AccelerateInterpolator sAccelerateInterpolator =
4217f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            new AccelerateInterpolator();
43201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung
44f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    private boolean mIsSearchBarHidden;
454c98d9235d164680186180974719f551cf935d08Winson Chung    private View mQSBSearchBar;
464c98d9235d164680186180974719f551cf935d08Winson Chung    private View mDropTargetBar;
4761fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung    private ButtonDropTarget mInfoDropTarget;
4861fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung    private ButtonDropTarget mDeleteDropTarget;
49a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung    private int mBarHeight;
50d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    private boolean mDeferOnDragEnd = false;
514c98d9235d164680186180974719f551cf935d08Winson Chung
5219e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka    private boolean mEnableDropDownDropTargets;
53c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung
544c98d9235d164680186180974719f551cf935d08Winson Chung    public SearchDropTargetBar(Context context, AttributeSet attrs) {
554c98d9235d164680186180974719f551cf935d08Winson Chung        this(context, attrs, 0);
564c98d9235d164680186180974719f551cf935d08Winson Chung    }
574c98d9235d164680186180974719f551cf935d08Winson Chung
584c98d9235d164680186180974719f551cf935d08Winson Chung    public SearchDropTargetBar(Context context, AttributeSet attrs, int defStyle) {
594c98d9235d164680186180974719f551cf935d08Winson Chung        super(context, attrs, defStyle);
604c98d9235d164680186180974719f551cf935d08Winson Chung    }
614c98d9235d164680186180974719f551cf935d08Winson Chung
624c98d9235d164680186180974719f551cf935d08Winson Chung    public void setup(Launcher launcher, DragController dragController) {
634c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDragListener(this);
644c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDragListener(mInfoDropTarget);
654c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDragListener(mDeleteDropTarget);
664c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDropTarget(mInfoDropTarget);
674c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDropTarget(mDeleteDropTarget);
68043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung        dragController.setFlingToDeleteDropTarget(mDeleteDropTarget);
694c98d9235d164680186180974719f551cf935d08Winson Chung        mInfoDropTarget.setLauncher(launcher);
704c98d9235d164680186180974719f551cf935d08Winson Chung        mDeleteDropTarget.setLauncher(launcher);
71594d76dc66cb5666830b62594909fed187987d42Sunny Goyal    }
72594d76dc66cb5666830b62594909fed187987d42Sunny Goyal
73594d76dc66cb5666830b62594909fed187987d42Sunny Goyal    public void setQsbSearchBar(View qsb) {
74594d76dc66cb5666830b62594909fed187987d42Sunny Goyal        mQSBSearchBar = qsb;
75c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen        if (mQSBSearchBar != null) {
76c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen            if (mEnableDropDownDropTargets) {
77c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen                mQSBSearchBarAnim = LauncherAnimUtils.ofFloat(mQSBSearchBar, "translationY", 0,
78c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen                        -mBarHeight);
79c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen            } else {
80c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen                mQSBSearchBarAnim = LauncherAnimUtils.ofFloat(mQSBSearchBar, "alpha", 1f, 0f);
81c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen            }
82c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen            setupAnimation(mQSBSearchBarAnim, mQSBSearchBar);
83476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu        } else {
84c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen            // Create a no-op animation of the search bar is null
85c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen            mQSBSearchBarAnim = ValueAnimator.ofFloat(0, 0);
86c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen            mQSBSearchBarAnim.setDuration(sTransitionInDuration);
87476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu        }
884c98d9235d164680186180974719f551cf935d08Winson Chung    }
894c98d9235d164680186180974719f551cf935d08Winson Chung
90c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung    private void prepareStartAnimation(View v) {
9117f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        // Enable the hw layers before the animation starts (will be disabled in the onAnimationEnd
9217f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        // callback below)
93c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen        if (v != null) {
94c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen            v.setLayerType(View.LAYER_TYPE_HARDWARE, null);
95c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen        }
96c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung    }
97c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung
98c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen    private void setupAnimation(ValueAnimator anim, final View v) {
9917f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        anim.setInterpolator(sAccelerateInterpolator);
10017f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        anim.setDuration(sTransitionInDuration);
10117f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        anim.addListener(new AnimatorListenerAdapter() {
102315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            @Override
103315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            public void onAnimationEnd(Animator animation) {
104c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen                if (v != null) {
105c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen                    v.setLayerType(View.LAYER_TYPE_NONE, null);
106c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen                }
107315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            }
108315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung        });
109315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung    }
110315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung
1114c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
1124c98d9235d164680186180974719f551cf935d08Winson Chung    protected void onFinishInflate() {
1134c98d9235d164680186180974719f551cf935d08Winson Chung        super.onFinishInflate();
1144c98d9235d164680186180974719f551cf935d08Winson Chung
1154c98d9235d164680186180974719f551cf935d08Winson Chung        // Get the individual components
1164c98d9235d164680186180974719f551cf935d08Winson Chung        mDropTargetBar = findViewById(R.id.drag_target_bar);
117a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung        mInfoDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.info_target_text);
118a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung        mDeleteDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.delete_target_text);
119a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung
120d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        mInfoDropTarget.setSearchDropTargetBar(this);
121d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        mDeleteDropTarget.setSearchDropTargetBar(this);
122d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen
12319e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka        mEnableDropDownDropTargets =
124a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung            getResources().getBoolean(R.bool.config_useDropTargetDownTransition);
125201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung
126201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung        // Create the various fade animations
12719e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka        if (mEnableDropDownDropTargets) {
1285f8afe6280eae34620067696173e71943e1a30a3Winson Chung            LauncherAppState app = LauncherAppState.getInstance();
1295f8afe6280eae34620067696173e71943e1a30a3Winson Chung            DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
1305f8afe6280eae34620067696173e71943e1a30a3Winson Chung            mBarHeight = grid.searchBarSpaceHeightPx;
131a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung            mDropTargetBar.setTranslationY(-mBarHeight);
13266b7d011636ce930f4cae9500c7634d950415959Michael Jurka            mDropTargetBarAnim = LauncherAnimUtils.ofFloat(mDropTargetBar, "translationY",
13317f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung                    -mBarHeight, 0f);
134476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu
135315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung        } else {
136315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            mDropTargetBar.setAlpha(0f);
13766b7d011636ce930f4cae9500c7634d950415959Michael Jurka            mDropTargetBarAnim = LauncherAnimUtils.ofFloat(mDropTargetBar, "alpha", 0f, 1f);
138a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung        }
13917f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        setupAnimation(mDropTargetBarAnim, mDropTargetBar);
140201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung    }
141201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung
142043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung    public void finishAnimations() {
14317f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        prepareStartAnimation(mDropTargetBar);
14417f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        mDropTargetBarAnim.reverse();
14517f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        prepareStartAnimation(mQSBSearchBar);
14617f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        mQSBSearchBarAnim.reverse();
1474c98d9235d164680186180974719f551cf935d08Winson Chung    }
1484c98d9235d164680186180974719f551cf935d08Winson Chung
1494c98d9235d164680186180974719f551cf935d08Winson Chung    /*
150f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     * Shows and hides the search bar.
151f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     */
152f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public void showSearchBar(boolean animated) {
1538246a1434c12b607743222c22285b72c9a96497bMac Duy Hai        boolean needToCancelOngoingAnimation = mQSBSearchBarAnim.isRunning() && !animated;
1548246a1434c12b607743222c22285b72c9a96497bMac Duy Hai        if (!mIsSearchBarHidden && !needToCancelOngoingAnimation) return;
155f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        if (animated) {
156c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung            prepareStartAnimation(mQSBSearchBar);
15717f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.reverse();
158f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        } else {
15917f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.cancel();
160c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen            if (mQSBSearchBar != null && mEnableDropDownDropTargets) {
16119e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka                mQSBSearchBar.setTranslationY(0);
162c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen            } else if (mQSBSearchBar != null) {
163324dbdd7a3d32b8c73d496111633cb3b843f4b16Michael Jurka                mQSBSearchBar.setAlpha(1f);
16419e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            }
165f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
166f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        mIsSearchBarHidden = false;
167f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
168f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public void hideSearchBar(boolean animated) {
1698246a1434c12b607743222c22285b72c9a96497bMac Duy Hai        boolean needToCancelOngoingAnimation = mQSBSearchBarAnim.isRunning() && !animated;
1708246a1434c12b607743222c22285b72c9a96497bMac Duy Hai        if (mIsSearchBarHidden && !needToCancelOngoingAnimation) return;
171f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        if (animated) {
172c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung            prepareStartAnimation(mQSBSearchBar);
17317f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.start();
174f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        } else {
17517f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.cancel();
176c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen            if (mQSBSearchBar != null && mEnableDropDownDropTargets) {
17717f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung                mQSBSearchBar.setTranslationY(-mBarHeight);
178c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen            } else if (mQSBSearchBar != null) {
179324dbdd7a3d32b8c73d496111633cb3b843f4b16Michael Jurka                mQSBSearchBar.setAlpha(0f);
18019e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            }
181f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
182f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        mIsSearchBarHidden = true;
183f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
184f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
185f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    /*
186f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     * Gets various transition durations.
187f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     */
188f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public int getTransitionInDuration() {
189f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        return sTransitionInDuration;
190f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
191f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public int getTransitionOutDuration() {
192f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        return sTransitionOutDuration;
193f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
194f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
195f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    /*
1964c98d9235d164680186180974719f551cf935d08Winson Chung     * DragController.DragListener implementation
1974c98d9235d164680186180974719f551cf935d08Winson Chung     */
1984c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
1994c98d9235d164680186180974719f551cf935d08Winson Chung    public void onDragStart(DragSource source, Object info, int dragAction) {
200c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        showDeleteTarget();
201c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    }
202c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
203c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    public void showDeleteTarget() {
2044c98d9235d164680186180974719f551cf935d08Winson Chung        // Animate out the QSB search bar, and animate in the drop target bar
205c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung        prepareStartAnimation(mDropTargetBar);
20617f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        mDropTargetBarAnim.start();
207f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        if (!mIsSearchBarHidden) {
208c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung            prepareStartAnimation(mQSBSearchBar);
20917f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.start();
210f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
2114c98d9235d164680186180974719f551cf935d08Winson Chung    }
2124c98d9235d164680186180974719f551cf935d08Winson Chung
213c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    public void hideDeleteTarget() {
214c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        // Restore the QSB search bar, and animate out the drop target bar
215c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        prepareStartAnimation(mDropTargetBar);
216c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        mDropTargetBarAnim.reverse();
217c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        if (!mIsSearchBarHidden) {
218c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen            prepareStartAnimation(mQSBSearchBar);
219c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen            mQSBSearchBarAnim.reverse();
220c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        }
221c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    }
222c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
223d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    public void deferOnDragEnd() {
224d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        mDeferOnDragEnd = true;
225d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    }
226d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen
2274c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
2284c98d9235d164680186180974719f551cf935d08Winson Chung    public void onDragEnd() {
229d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        if (!mDeferOnDragEnd) {
230c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen            hideDeleteTarget();
231d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        } else {
232d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            mDeferOnDragEnd = false;
233f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
2344c98d9235d164680186180974719f551cf935d08Winson Chung    }
235c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung
236cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood    public Rect getSearchBarBounds() {
237cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood        if (mQSBSearchBar != null) {
238cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            final int[] pos = new int[2];
239cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            mQSBSearchBar.getLocationOnScreen(pos);
240cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood
241cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            final Rect rect = new Rect();
242629758ff081a354e43aa409159211210ee4ee85aMichael Jurka            rect.left = pos[0];
243629758ff081a354e43aa409159211210ee4ee85aMichael Jurka            rect.top = pos[1];
244629758ff081a354e43aa409159211210ee4ee85aMichael Jurka            rect.right = pos[0] + mQSBSearchBar.getWidth();
245629758ff081a354e43aa409159211210ee4ee85aMichael Jurka            rect.bottom = pos[1] + mQSBSearchBar.getHeight();
246cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            return rect;
247cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood        } else {
248cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            return null;
249cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood        }
250cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood    }
2514c98d9235d164680186180974719f551cf935d08Winson Chung}
252