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;
214c98d9235d164680186180974719f551cf935d08Winson Chungimport android.content.Context;
22cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwoodimport android.graphics.Rect;
234c98d9235d164680186180974719f551cf935d08Winson Chungimport android.util.AttributeSet;
244c98d9235d164680186180974719f551cf935d08Winson Chungimport android.view.View;
25006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chungimport android.view.accessibility.AccessibilityManager;
26a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chungimport android.view.animation.AccelerateInterpolator;
274c98d9235d164680186180974719f551cf935d08Winson Chungimport android.widget.FrameLayout;
284c98d9235d164680186180974719f551cf935d08Winson Chung
29d1ea63f24a751521e6c35cc06be0e548e0b04f23Sunny Goyalimport com.android.launcher3.util.Thunk;
30d1ea63f24a751521e6c35cc06be0e548e0b04f23Sunny Goyal
314c98d9235d164680186180974719f551cf935d08Winson Chung/*
324c98d9235d164680186180974719f551cf935d08Winson Chung * Ths bar will manage the transition between the QSB search bar and the delete drop
334c98d9235d164680186180974719f551cf935d08Winson Chung * targets so that each of the individual IconDropTargets don't have to.
344c98d9235d164680186180974719f551cf935d08Winson Chung */
354c98d9235d164680186180974719f551cf935d08Winson Chungpublic class SearchDropTargetBar extends FrameLayout implements DragController.DragListener {
364c98d9235d164680186180974719f551cf935d08Winson Chung
37006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung    /** The different states that the search bar space can be in. */
38006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung    public enum State {
39006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        INVISIBLE   (0f, 0f),
40006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        SEARCH_BAR  (1f, 0f),
41006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        DROP_TARGET (0f, 1f);
424c98d9235d164680186180974719f551cf935d08Winson Chung
43006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        private final float mSearchBarAlpha;
44006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        private final float mDropTargetBarAlpha;
45006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung
46006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        State(float sbAlpha, float dtbAlpha) {
47006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            mSearchBarAlpha = sbAlpha;
48006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            mDropTargetBarAlpha = dtbAlpha;
49006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        }
50006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung
51006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        float getSearchBarAlpha() {
52006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            return mSearchBarAlpha;
53006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        }
54006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung
55006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        float getDropTargetBarAlpha() {
56006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            return mDropTargetBarAlpha;
57006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        }
58006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung    }
59006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung
60006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung    private static int DEFAULT_DRAG_FADE_DURATION = 175;
61006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung
62006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung    private LauncherViewPropertyAnimator mDropTargetBarAnimator;
63006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung    private LauncherViewPropertyAnimator mQSBSearchBarAnimator;
6417f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung    private static final AccelerateInterpolator sAccelerateInterpolator =
6517f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            new AccelerateInterpolator();
66201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung
67006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung    private State mState = State.SEARCH_BAR;
68d1ea63f24a751521e6c35cc06be0e548e0b04f23Sunny Goyal    @Thunk View mQSB;
69d1ea63f24a751521e6c35cc06be0e548e0b04f23Sunny Goyal    @Thunk View mDropTargetBar;
70d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    private boolean mDeferOnDragEnd = false;
71d1ea63f24a751521e6c35cc06be0e548e0b04f23Sunny Goyal    @Thunk boolean mAccessibilityEnabled = false;
724c98d9235d164680186180974719f551cf935d08Winson Chung
73fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal    // Drop targets
74fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal    private ButtonDropTarget mInfoDropTarget;
75fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal    private ButtonDropTarget mDeleteDropTarget;
76fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal    private ButtonDropTarget mUninstallDropTarget;
77fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal
784c98d9235d164680186180974719f551cf935d08Winson Chung    public SearchDropTargetBar(Context context, AttributeSet attrs) {
794c98d9235d164680186180974719f551cf935d08Winson Chung        this(context, attrs, 0);
804c98d9235d164680186180974719f551cf935d08Winson Chung    }
814c98d9235d164680186180974719f551cf935d08Winson Chung
824c98d9235d164680186180974719f551cf935d08Winson Chung    public SearchDropTargetBar(Context context, AttributeSet attrs, int defStyle) {
834c98d9235d164680186180974719f551cf935d08Winson Chung        super(context, attrs, defStyle);
844c98d9235d164680186180974719f551cf935d08Winson Chung    }
854c98d9235d164680186180974719f551cf935d08Winson Chung
864c98d9235d164680186180974719f551cf935d08Winson Chung    public void setup(Launcher launcher, DragController dragController) {
874c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDragListener(this);
88fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal        dragController.setFlingToDeleteDropTarget(mDeleteDropTarget);
89fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal
904c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDragListener(mInfoDropTarget);
914c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDragListener(mDeleteDropTarget);
92fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal        dragController.addDragListener(mUninstallDropTarget);
93fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal
944c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDropTarget(mInfoDropTarget);
954c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDropTarget(mDeleteDropTarget);
96fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal        dragController.addDropTarget(mUninstallDropTarget);
97fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal
984c98d9235d164680186180974719f551cf935d08Winson Chung        mInfoDropTarget.setLauncher(launcher);
994c98d9235d164680186180974719f551cf935d08Winson Chung        mDeleteDropTarget.setLauncher(launcher);
100fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal        mUninstallDropTarget.setLauncher(launcher);
101594d76dc66cb5666830b62594909fed187987d42Sunny Goyal    }
102594d76dc66cb5666830b62594909fed187987d42Sunny Goyal
1034c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
1044c98d9235d164680186180974719f551cf935d08Winson Chung    protected void onFinishInflate() {
1054c98d9235d164680186180974719f551cf935d08Winson Chung        super.onFinishInflate();
1064c98d9235d164680186180974719f551cf935d08Winson Chung
1074c98d9235d164680186180974719f551cf935d08Winson Chung        // Get the individual components
1084c98d9235d164680186180974719f551cf935d08Winson Chung        mDropTargetBar = findViewById(R.id.drag_target_bar);
109a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung        mInfoDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.info_target_text);
110a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung        mDeleteDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.delete_target_text);
111fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal        mUninstallDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.uninstall_target_text);
112a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung
113d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        mInfoDropTarget.setSearchDropTargetBar(this);
114d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        mDeleteDropTarget.setSearchDropTargetBar(this);
115fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal        mUninstallDropTarget.setSearchDropTargetBar(this);
116d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen
117201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung        // Create the various fade animations
118dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung        mDropTargetBar.setAlpha(0f);
119006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        mDropTargetBarAnimator = new LauncherViewPropertyAnimator(mDropTargetBar);
120006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        mDropTargetBarAnimator.setInterpolator(sAccelerateInterpolator);
121006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        mDropTargetBarAnimator.addListener(new AnimatorListenerAdapter() {
122006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            @Override
123006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            public void onAnimationStart(Animator animation) {
124006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                // Ensure that the view is visible for the animation
125006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                mDropTargetBar.setVisibility(View.VISIBLE);
126006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            }
1274c98d9235d164680186180974719f551cf935d08Winson Chung
128006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            @Override
129006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            public void onAnimationEnd(Animator animation) {
130006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                if (mDropTargetBar != null) {
131006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                    AlphaUpdateListener.updateVisibility(mDropTargetBar, mAccessibilityEnabled);
132006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                }
13319e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            }
134006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        });
135f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
136dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung
137006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung    public void setQsbSearchBar(View qsb) {
138006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        mQSB = qsb;
139006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        if (mQSB != null) {
140006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            // Update the search ber animation
141006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            mQSBSearchBarAnimator = new LauncherViewPropertyAnimator(mQSB);
142006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            mQSBSearchBarAnimator.setInterpolator(sAccelerateInterpolator);
143006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            mQSBSearchBarAnimator.addListener(new AnimatorListenerAdapter() {
144006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                @Override
145006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                public void onAnimationStart(Animator animation) {
146006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                    // Ensure that the view is visible for the animation
147006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                    if (mQSB != null) {
148006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                        mQSB.setVisibility(View.VISIBLE);
149006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                    }
150006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                }
151006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung
152006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                @Override
153006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                public void onAnimationEnd(Animator animation) {
154006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                    if (mQSB != null) {
155006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                        AlphaUpdateListener.updateVisibility(mQSB, mAccessibilityEnabled);
156006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                    }
157006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                }
158006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            });
159f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        } else {
160006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            mQSBSearchBarAnimator = null;
161f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
162f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
163f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
164dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung    /**
165006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung     * Animates the current search bar state to a new state.  If the {@param duration} is 0, then
166006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung     * the state is applied immediately.
167f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     */
168006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung    public void animateToState(State newState, int duration) {
169006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        if (mState != newState) {
170006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            mState = newState;
171006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung
172006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            // Update the accessibility state
173006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            AccessibilityManager am = (AccessibilityManager)
174006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                    getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
175006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            mAccessibilityEnabled = am.isEnabled();
176006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung
177006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            animateViewAlpha(mQSBSearchBarAnimator, mQSB, newState.getSearchBarAlpha(),
178006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                    duration);
179006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            animateViewAlpha(mDropTargetBarAnimator, mDropTargetBar, newState.getDropTargetBarAlpha(),
180006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                    duration);
181006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        }
182f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
183dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung
184dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung    /**
185006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung     * Convenience method to animate the alpha of a view using hardware layers.
186dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung     */
187006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung    private void animateViewAlpha(LauncherViewPropertyAnimator animator, View v, float alpha,
188006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            int duration) {
18981c5f7e39727085e1a8915cc36e9cbf2bb085890Winson        if (v == null) {
19081c5f7e39727085e1a8915cc36e9cbf2bb085890Winson            return;
19181c5f7e39727085e1a8915cc36e9cbf2bb085890Winson        }
19281c5f7e39727085e1a8915cc36e9cbf2bb085890Winson
19381c5f7e39727085e1a8915cc36e9cbf2bb085890Winson        animator.cancel();
19481c5f7e39727085e1a8915cc36e9cbf2bb085890Winson        if (Float.compare(v.getAlpha(), alpha) != 0) {
195006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            if (duration > 0) {
196006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                animator.alpha(alpha).withLayer().setDuration(duration).start();
197006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            } else {
198006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                v.setAlpha(alpha);
199006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung                AlphaUpdateListener.updateVisibility(v, mAccessibilityEnabled);
200006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            }
201006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        }
202f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
203f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
204f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    /*
2054c98d9235d164680186180974719f551cf935d08Winson Chung     * DragController.DragListener implementation
2064c98d9235d164680186180974719f551cf935d08Winson Chung     */
2074c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
2084c98d9235d164680186180974719f551cf935d08Winson Chung    public void onDragStart(DragSource source, Object info, int dragAction) {
209006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        animateToState(State.DROP_TARGET, DEFAULT_DRAG_FADE_DURATION);
210c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    }
211c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
212006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung    /**
213006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung     * This is called to defer hiding the delete drop target until the drop animation has completed,
214006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung     * instead of hiding immediately when the drag has ended.
215006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung     */
216d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    public void deferOnDragEnd() {
217d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        mDeferOnDragEnd = true;
218d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    }
219d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen
2204c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
2214c98d9235d164680186180974719f551cf935d08Winson Chung    public void onDragEnd() {
222d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        if (!mDeferOnDragEnd) {
223006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            animateToState(State.SEARCH_BAR, DEFAULT_DRAG_FADE_DURATION);
224d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        } else {
225d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            mDeferOnDragEnd = false;
226f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
2274c98d9235d164680186180974719f551cf935d08Winson Chung    }
228c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung
229006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung    /**
230006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung     * @return the bounds of the QSB search bar.
231006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung     */
232cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood    public Rect getSearchBarBounds() {
233006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        if (mQSB != null) {
234cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            final int[] pos = new int[2];
235006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            mQSB.getLocationOnScreen(pos);
236cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood
237cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            final Rect rect = new Rect();
238629758ff081a354e43aa409159211210ee4ee85aMichael Jurka            rect.left = pos[0];
239629758ff081a354e43aa409159211210ee4ee85aMichael Jurka            rect.top = pos[1];
240006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            rect.right = pos[0] + mQSB.getWidth();
241006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            rect.bottom = pos[1] + mQSB.getHeight();
242cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            return rect;
243cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood        } else {
244cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            return null;
245cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood        }
246cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood    }
2471a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal
2481a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal    public void enableAccessibleDrag(boolean enable) {
249006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung        if (mQSB != null) {
250006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung            mQSB.setVisibility(enable ? View.GONE : View.VISIBLE);
2511a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal        }
2521a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal        mInfoDropTarget.enableAccessibleDrag(enable);
2531a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal        mDeleteDropTarget.enableAccessibleDrag(enable);
2541a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal        mUninstallDropTarget.enableAccessibleDrag(enable);
2551a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal    }
2564c98d9235d164680186180974719f551cf935d08Winson Chung}
257