SearchDropTargetBar.java revision 325dc23624160689e59fbac708cf6f222b20d025
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;
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
30325dc23624160689e59fbac708cf6f222b20d025Daniel Sandlerimport com.android.launcher3.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);
1132ecf995e0d2d55eb71d03f7230ca87270872d1a3Michael Jurka            mDropTargetBarAnim = LauncherAnimUtils.ofFloat(mDropTargetBar, "translationY",
11417f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung                    -mBarHeight, 0f);
1152ecf995e0d2d55eb71d03f7230ca87270872d1a3Michael Jurka            mQSBSearchBarAnim = LauncherAnimUtils.ofFloat(mQSBSearchBar, "translationY", 0,
116315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung                    -mBarHeight);
117315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung        } else {
118315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            mDropTargetBar.setAlpha(0f);
1192ecf995e0d2d55eb71d03f7230ca87270872d1a3Michael Jurka            mDropTargetBarAnim = LauncherAnimUtils.ofFloat(mDropTargetBar, "alpha", 0f, 1f);
1202ecf995e0d2d55eb71d03f7230ca87270872d1a3Michael Jurka            mQSBSearchBarAnim = LauncherAnimUtils.ofFloat(mQSBSearchBar, "alpha", 1f, 0f);
121a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung        }
12217f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        setupAnimation(mDropTargetBarAnim, mDropTargetBar);
12317f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        setupAnimation(mQSBSearchBarAnim, mQSBSearchBar);
124201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung    }
125201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung
126043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung    public void finishAnimations() {
12717f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        prepareStartAnimation(mDropTargetBar);
12817f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        mDropTargetBarAnim.reverse();
12917f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        prepareStartAnimation(mQSBSearchBar);
13017f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        mQSBSearchBarAnim.reverse();
1314c98d9235d164680186180974719f551cf935d08Winson Chung    }
1324c98d9235d164680186180974719f551cf935d08Winson Chung
1334c98d9235d164680186180974719f551cf935d08Winson Chung    /*
134f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     * Shows and hides the search bar.
135f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     */
136f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public void showSearchBar(boolean animated) {
13717f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        if (!mIsSearchBarHidden) return;
138f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        if (animated) {
139c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung            prepareStartAnimation(mQSBSearchBar);
14017f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.reverse();
141f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        } else {
14217f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.cancel();
14319e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            if (mEnableDropDownDropTargets) {
14419e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka                mQSBSearchBar.setTranslationY(0);
14519e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            } else {
146324dbdd7a3d32b8c73d496111633cb3b843f4b16Michael Jurka                mQSBSearchBar.setAlpha(1f);
14719e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            }
148f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
149f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        mIsSearchBarHidden = false;
150f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
151f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public void hideSearchBar(boolean animated) {
15217f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        if (mIsSearchBarHidden) return;
153f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        if (animated) {
154c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung            prepareStartAnimation(mQSBSearchBar);
15517f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.start();
156f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        } else {
15717f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.cancel();
15819e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            if (mEnableDropDownDropTargets) {
15917f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung                mQSBSearchBar.setTranslationY(-mBarHeight);
16019e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            } else {
161324dbdd7a3d32b8c73d496111633cb3b843f4b16Michael Jurka                mQSBSearchBar.setAlpha(0f);
16219e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            }
163f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
164f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        mIsSearchBarHidden = true;
165f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
166f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
167f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    /*
168f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     * Gets various transition durations.
169f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     */
170f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public int getTransitionInDuration() {
171f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        return sTransitionInDuration;
172f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
173f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public int getTransitionOutDuration() {
174f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        return sTransitionOutDuration;
175f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
176f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
177f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    /*
1784c98d9235d164680186180974719f551cf935d08Winson Chung     * DragController.DragListener implementation
1794c98d9235d164680186180974719f551cf935d08Winson Chung     */
1804c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
1814c98d9235d164680186180974719f551cf935d08Winson Chung    public void onDragStart(DragSource source, Object info, int dragAction) {
1824c98d9235d164680186180974719f551cf935d08Winson Chung        // Animate out the QSB search bar, and animate in the drop target bar
183c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung        prepareStartAnimation(mDropTargetBar);
18417f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        mDropTargetBarAnim.start();
185f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        if (!mIsSearchBarHidden) {
186c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung            prepareStartAnimation(mQSBSearchBar);
18717f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.start();
188f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
1894c98d9235d164680186180974719f551cf935d08Winson Chung    }
1904c98d9235d164680186180974719f551cf935d08Winson Chung
191d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    public void deferOnDragEnd() {
192d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        mDeferOnDragEnd = true;
193d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    }
194d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen
1954c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
1964c98d9235d164680186180974719f551cf935d08Winson Chung    public void onDragEnd() {
197d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        if (!mDeferOnDragEnd) {
198d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            // Restore the QSB search bar, and animate out the drop target bar
199c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung            prepareStartAnimation(mDropTargetBar);
20017f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mDropTargetBarAnim.reverse();
201d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            if (!mIsSearchBarHidden) {
202c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung                prepareStartAnimation(mQSBSearchBar);
20317f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung                mQSBSearchBarAnim.reverse();
204d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            }
205d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        } else {
206d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            mDeferOnDragEnd = false;
207f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
2084c98d9235d164680186180974719f551cf935d08Winson Chung    }
209c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung
210c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung    public void onSearchPackagesChanged(boolean searchVisible, boolean voiceVisible) {
211c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung        if (mQSBSearchBar != null) {
212c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung            Drawable bg = mQSBSearchBar.getBackground();
213c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung            if (bg != null && (!searchVisible && !voiceVisible)) {
214c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung                // Save the background and disable it
215c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung                mPreviousBackground = bg;
216c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung                mQSBSearchBar.setBackgroundResource(0);
217c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung            } else if (mPreviousBackground != null && (searchVisible || voiceVisible)) {
218c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung                // Restore the background
2193a9fcedbcd235372cd2ab64f825a0b5b3937f59eMichael Jurka                mQSBSearchBar.setBackground(mPreviousBackground);
220c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung            }
221c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung        }
222c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung    }
223cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood
224cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood    public Rect getSearchBarBounds() {
225cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood        if (mQSBSearchBar != null) {
226cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            final int[] pos = new int[2];
227cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            mQSBSearchBar.getLocationOnScreen(pos);
228cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood
229cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            final Rect rect = new Rect();
230629758ff081a354e43aa409159211210ee4ee85aMichael Jurka            rect.left = pos[0];
231629758ff081a354e43aa409159211210ee4ee85aMichael Jurka            rect.top = pos[1];
232629758ff081a354e43aa409159211210ee4ee85aMichael Jurka            rect.right = pos[0] + mQSBSearchBar.getWidth();
233629758ff081a354e43aa409159211210ee4ee85aMichael Jurka            rect.bottom = pos[1] + mQSBSearchBar.getHeight();
234cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            return rect;
235cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood        } else {
236cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            return null;
237cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood        }
238cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood    }
2394c98d9235d164680186180974719f551cf935d08Winson Chung}
240