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
174c98d9235d164680186180974719f551cf935d08Winson Chungpackage com.android.launcher2;
184c98d9235d164680186180974719f551cf935d08Winson Chung
19201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chungimport android.animation.Animator;
20201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chungimport android.animation.AnimatorListenerAdapter;
21201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chungimport android.animation.ObjectAnimator;
224c98d9235d164680186180974719f551cf935d08Winson Chungimport android.content.Context;
23cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwoodimport android.graphics.Rect;
24c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chungimport android.graphics.drawable.Drawable;
254c98d9235d164680186180974719f551cf935d08Winson Chungimport android.util.AttributeSet;
264c98d9235d164680186180974719f551cf935d08Winson Chungimport android.view.View;
27a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chungimport android.view.animation.AccelerateInterpolator;
284c98d9235d164680186180974719f551cf935d08Winson Chungimport android.widget.FrameLayout;
294c98d9235d164680186180974719f551cf935d08Winson Chung
304c98d9235d164680186180974719f551cf935d08Winson Chungimport com.android.launcher.R;
314c98d9235d164680186180974719f551cf935d08Winson Chung
324c98d9235d164680186180974719f551cf935d08Winson Chung/*
334c98d9235d164680186180974719f551cf935d08Winson Chung * Ths bar will manage the transition between the QSB search bar and the delete drop
344c98d9235d164680186180974719f551cf935d08Winson Chung * targets so that each of the individual IconDropTargets don't have to.
354c98d9235d164680186180974719f551cf935d08Winson Chung */
364c98d9235d164680186180974719f551cf935d08Winson Chungpublic class SearchDropTargetBar extends FrameLayout implements DragController.DragListener {
374c98d9235d164680186180974719f551cf935d08Winson Chung
38a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung    private static final int sTransitionInDuration = 200;
39a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung    private static final int sTransitionOutDuration = 175;
404c98d9235d164680186180974719f551cf935d08Winson Chung
4117f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung    private ObjectAnimator mDropTargetBarAnim;
4217f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung    private ObjectAnimator mQSBSearchBarAnim;
4317f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung    private static final AccelerateInterpolator sAccelerateInterpolator =
4417f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            new AccelerateInterpolator();
45201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung
46f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    private boolean mIsSearchBarHidden;
474c98d9235d164680186180974719f551cf935d08Winson Chung    private View mQSBSearchBar;
484c98d9235d164680186180974719f551cf935d08Winson Chung    private View mDropTargetBar;
4961fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung    private ButtonDropTarget mInfoDropTarget;
5061fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung    private ButtonDropTarget mDeleteDropTarget;
51a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung    private int mBarHeight;
52d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    private boolean mDeferOnDragEnd = false;
534c98d9235d164680186180974719f551cf935d08Winson Chung
54c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung    private Drawable mPreviousBackground;
5519e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka    private boolean mEnableDropDownDropTargets;
56c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung
574c98d9235d164680186180974719f551cf935d08Winson Chung    public SearchDropTargetBar(Context context, AttributeSet attrs) {
584c98d9235d164680186180974719f551cf935d08Winson Chung        this(context, attrs, 0);
594c98d9235d164680186180974719f551cf935d08Winson Chung    }
604c98d9235d164680186180974719f551cf935d08Winson Chung
614c98d9235d164680186180974719f551cf935d08Winson Chung    public SearchDropTargetBar(Context context, AttributeSet attrs, int defStyle) {
624c98d9235d164680186180974719f551cf935d08Winson Chung        super(context, attrs, defStyle);
634c98d9235d164680186180974719f551cf935d08Winson Chung    }
644c98d9235d164680186180974719f551cf935d08Winson Chung
654c98d9235d164680186180974719f551cf935d08Winson Chung    public void setup(Launcher launcher, DragController dragController) {
664c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDragListener(this);
674c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDragListener(mInfoDropTarget);
684c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDragListener(mDeleteDropTarget);
694c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDropTarget(mInfoDropTarget);
704c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDropTarget(mDeleteDropTarget);
71043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung        dragController.setFlingToDeleteDropTarget(mDeleteDropTarget);
724c98d9235d164680186180974719f551cf935d08Winson Chung        mInfoDropTarget.setLauncher(launcher);
734c98d9235d164680186180974719f551cf935d08Winson Chung        mDeleteDropTarget.setLauncher(launcher);
744c98d9235d164680186180974719f551cf935d08Winson Chung    }
754c98d9235d164680186180974719f551cf935d08Winson Chung
76c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung    private void prepareStartAnimation(View v) {
7717f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        // Enable the hw layers before the animation starts (will be disabled in the onAnimationEnd
7817f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        // callback below)
79c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung        v.setLayerType(View.LAYER_TYPE_HARDWARE, null);
80c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung    }
81c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung
8217f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung    private void setupAnimation(ObjectAnimator anim, final View v) {
8317f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        anim.setInterpolator(sAccelerateInterpolator);
8417f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        anim.setDuration(sTransitionInDuration);
8517f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        anim.addListener(new AnimatorListenerAdapter() {
86315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            @Override
87315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            public void onAnimationEnd(Animator animation) {
88315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung                v.setLayerType(View.LAYER_TYPE_NONE, null);
89315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            }
90315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung        });
91315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung    }
92315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung
934c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
944c98d9235d164680186180974719f551cf935d08Winson Chung    protected void onFinishInflate() {
954c98d9235d164680186180974719f551cf935d08Winson Chung        super.onFinishInflate();
964c98d9235d164680186180974719f551cf935d08Winson Chung
974c98d9235d164680186180974719f551cf935d08Winson Chung        // Get the individual components
984c98d9235d164680186180974719f551cf935d08Winson Chung        mQSBSearchBar = findViewById(R.id.qsb_search_bar);
994c98d9235d164680186180974719f551cf935d08Winson Chung        mDropTargetBar = findViewById(R.id.drag_target_bar);
100a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung        mInfoDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.info_target_text);
101a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung        mDeleteDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.delete_target_text);
102a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung        mBarHeight = getResources().getDimensionPixelSize(R.dimen.qsb_bar_height);
103a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung
104d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        mInfoDropTarget.setSearchDropTargetBar(this);
105d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        mDeleteDropTarget.setSearchDropTargetBar(this);
106d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen
10719e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka        mEnableDropDownDropTargets =
108a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung            getResources().getBoolean(R.bool.config_useDropTargetDownTransition);
109201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung
110201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung        // Create the various fade animations
11119e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka        if (mEnableDropDownDropTargets) {
112a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung            mDropTargetBar.setTranslationY(-mBarHeight);
1139a6e951fed69cc67b801391abef0b5a4e3d12f40Adam Cohen            mDropTargetBarAnim = ObjectAnimator.ofFloat(mDropTargetBar, "translationY", -mBarHeight, 0f);
1149a6e951fed69cc67b801391abef0b5a4e3d12f40Adam Cohen            mQSBSearchBarAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "translationY", 0f, -mBarHeight);
115315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung        } else {
116315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            mDropTargetBar.setAlpha(0f);
1179a6e951fed69cc67b801391abef0b5a4e3d12f40Adam Cohen            mDropTargetBarAnim = ObjectAnimator.ofFloat(mDropTargetBar, "alpha", 0f, 1f);
1189a6e951fed69cc67b801391abef0b5a4e3d12f40Adam Cohen            mQSBSearchBarAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "alpha", 1f, 0f);
119a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung        }
12017f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        setupAnimation(mDropTargetBarAnim, mDropTargetBar);
12117f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        setupAnimation(mQSBSearchBarAnim, mQSBSearchBar);
122201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung    }
123201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung
124043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung    public void finishAnimations() {
12517f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        prepareStartAnimation(mDropTargetBar);
12617f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        mDropTargetBarAnim.reverse();
12717f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        prepareStartAnimation(mQSBSearchBar);
12817f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        mQSBSearchBarAnim.reverse();
1294c98d9235d164680186180974719f551cf935d08Winson Chung    }
1304c98d9235d164680186180974719f551cf935d08Winson Chung
1314c98d9235d164680186180974719f551cf935d08Winson Chung    /*
132f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     * Shows and hides the search bar.
133f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     */
134f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public void showSearchBar(boolean animated) {
13517f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        if (!mIsSearchBarHidden) return;
136f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        if (animated) {
137c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung            prepareStartAnimation(mQSBSearchBar);
13817f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.reverse();
139f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        } else {
14017f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.cancel();
14119e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            if (mEnableDropDownDropTargets) {
14219e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka                mQSBSearchBar.setTranslationY(0);
14319e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            } else {
144324dbdd7a3d32b8c73d496111633cb3b843f4b16Michael Jurka                mQSBSearchBar.setAlpha(1f);
14519e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            }
146f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
147f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        mIsSearchBarHidden = false;
148f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
149f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public void hideSearchBar(boolean animated) {
15017f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        if (mIsSearchBarHidden) return;
151f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        if (animated) {
152c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung            prepareStartAnimation(mQSBSearchBar);
15317f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.start();
154f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        } else {
15517f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.cancel();
15619e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            if (mEnableDropDownDropTargets) {
15717f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung                mQSBSearchBar.setTranslationY(-mBarHeight);
15819e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            } else {
159324dbdd7a3d32b8c73d496111633cb3b843f4b16Michael Jurka                mQSBSearchBar.setAlpha(0f);
16019e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            }
161f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
162f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        mIsSearchBarHidden = true;
163f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
164f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
165f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    /*
166f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     * Gets various transition durations.
167f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     */
168f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public int getTransitionInDuration() {
169f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        return sTransitionInDuration;
170f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
171f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public int getTransitionOutDuration() {
172f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        return sTransitionOutDuration;
173f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
174f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
175f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    /*
1764c98d9235d164680186180974719f551cf935d08Winson Chung     * DragController.DragListener implementation
1774c98d9235d164680186180974719f551cf935d08Winson Chung     */
1784c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
1794c98d9235d164680186180974719f551cf935d08Winson Chung    public void onDragStart(DragSource source, Object info, int dragAction) {
1804c98d9235d164680186180974719f551cf935d08Winson Chung        // Animate out the QSB search bar, and animate in the drop target bar
181c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung        prepareStartAnimation(mDropTargetBar);
18217f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        mDropTargetBarAnim.start();
183f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        if (!mIsSearchBarHidden) {
184c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung            prepareStartAnimation(mQSBSearchBar);
18517f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.start();
186f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
1874c98d9235d164680186180974719f551cf935d08Winson Chung    }
1884c98d9235d164680186180974719f551cf935d08Winson Chung
189d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    public void deferOnDragEnd() {
190d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        mDeferOnDragEnd = true;
191d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    }
192d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen
1934c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
1944c98d9235d164680186180974719f551cf935d08Winson Chung    public void onDragEnd() {
195d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        if (!mDeferOnDragEnd) {
196d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            // Restore the QSB search bar, and animate out the drop target bar
197c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung            prepareStartAnimation(mDropTargetBar);
19817f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mDropTargetBarAnim.reverse();
199d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            if (!mIsSearchBarHidden) {
200c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung                prepareStartAnimation(mQSBSearchBar);
20117f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung                mQSBSearchBarAnim.reverse();
202d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            }
203d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        } else {
204d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            mDeferOnDragEnd = false;
205f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
2064c98d9235d164680186180974719f551cf935d08Winson Chung    }
207c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung
208c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung    public void onSearchPackagesChanged(boolean searchVisible, boolean voiceVisible) {
209c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung        if (mQSBSearchBar != null) {
210c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung            Drawable bg = mQSBSearchBar.getBackground();
211c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung            if (bg != null && (!searchVisible && !voiceVisible)) {
212c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung                // Save the background and disable it
213c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung                mPreviousBackground = bg;
214c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung                mQSBSearchBar.setBackgroundResource(0);
215c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung            } else if (mPreviousBackground != null && (searchVisible || voiceVisible)) {
216c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung                // Restore the background
2173a9fcedbcd235372cd2ab64f825a0b5b3937f59eMichael Jurka                mQSBSearchBar.setBackground(mPreviousBackground);
218c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung            }
219c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung        }
220c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung    }
221cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood
222cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood    public Rect getSearchBarBounds() {
223cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood        if (mQSBSearchBar != null) {
224cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            final int[] pos = new int[2];
225cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            mQSBSearchBar.getLocationOnScreen(pos);
226cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood
227cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            final Rect rect = new Rect();
228629758ff081a354e43aa409159211210ee4ee85aMichael Jurka            rect.left = pos[0];
229629758ff081a354e43aa409159211210ee4ee85aMichael Jurka            rect.top = pos[1];
230629758ff081a354e43aa409159211210ee4ee85aMichael Jurka            rect.right = pos[0] + mQSBSearchBar.getWidth();
231629758ff081a354e43aa409159211210ee4ee85aMichael Jurka            rect.bottom = pos[1] + mQSBSearchBar.getHeight();
232cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            return rect;
233cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood        } else {
234cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            return null;
235cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood        }
236cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood    }
2374c98d9235d164680186180974719f551cf935d08Winson Chung}
238