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
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;
4017f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung    private ObjectAnimator 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
52c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung    private Drawable mPreviousBackground;
5319e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka    private boolean mEnableDropDownDropTargets;
54c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung
554c98d9235d164680186180974719f551cf935d08Winson Chung    public SearchDropTargetBar(Context context, AttributeSet attrs) {
564c98d9235d164680186180974719f551cf935d08Winson Chung        this(context, attrs, 0);
574c98d9235d164680186180974719f551cf935d08Winson Chung    }
584c98d9235d164680186180974719f551cf935d08Winson Chung
594c98d9235d164680186180974719f551cf935d08Winson Chung    public SearchDropTargetBar(Context context, AttributeSet attrs, int defStyle) {
604c98d9235d164680186180974719f551cf935d08Winson Chung        super(context, attrs, defStyle);
614c98d9235d164680186180974719f551cf935d08Winson Chung    }
624c98d9235d164680186180974719f551cf935d08Winson Chung
634c98d9235d164680186180974719f551cf935d08Winson Chung    public void setup(Launcher launcher, DragController dragController) {
644c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDragListener(this);
654c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDragListener(mInfoDropTarget);
664c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDragListener(mDeleteDropTarget);
674c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDropTarget(mInfoDropTarget);
684c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDropTarget(mDeleteDropTarget);
69043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung        dragController.setFlingToDeleteDropTarget(mDeleteDropTarget);
704c98d9235d164680186180974719f551cf935d08Winson Chung        mInfoDropTarget.setLauncher(launcher);
714c98d9235d164680186180974719f551cf935d08Winson Chung        mDeleteDropTarget.setLauncher(launcher);
72476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu        mQSBSearchBar = launcher.getQsbBar();
73476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu        if (mEnableDropDownDropTargets) {
7466b7d011636ce930f4cae9500c7634d950415959Michael Jurka            mQSBSearchBarAnim = LauncherAnimUtils.ofFloat(mQSBSearchBar, "translationY", 0,
75476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu                    -mBarHeight);
76476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu        } else {
7766b7d011636ce930f4cae9500c7634d950415959Michael Jurka            mQSBSearchBarAnim = LauncherAnimUtils.ofFloat(mQSBSearchBar, "alpha", 1f, 0f);
78476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu        }
79476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu        setupAnimation(mQSBSearchBarAnim, mQSBSearchBar);
804c98d9235d164680186180974719f551cf935d08Winson Chung    }
814c98d9235d164680186180974719f551cf935d08Winson Chung
82c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung    private void prepareStartAnimation(View v) {
8317f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        // Enable the hw layers before the animation starts (will be disabled in the onAnimationEnd
8417f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        // callback below)
85c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung        v.setLayerType(View.LAYER_TYPE_HARDWARE, null);
86c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung    }
87c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung
8817f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung    private void setupAnimation(ObjectAnimator anim, final View v) {
8917f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        anim.setInterpolator(sAccelerateInterpolator);
9017f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        anim.setDuration(sTransitionInDuration);
9117f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        anim.addListener(new AnimatorListenerAdapter() {
92315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            @Override
93315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            public void onAnimationEnd(Animator animation) {
94315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung                v.setLayerType(View.LAYER_TYPE_NONE, null);
95315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            }
96315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung        });
97315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung    }
98315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung
994c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
1004c98d9235d164680186180974719f551cf935d08Winson Chung    protected void onFinishInflate() {
1014c98d9235d164680186180974719f551cf935d08Winson Chung        super.onFinishInflate();
1024c98d9235d164680186180974719f551cf935d08Winson Chung
1034c98d9235d164680186180974719f551cf935d08Winson Chung        // Get the individual components
1044c98d9235d164680186180974719f551cf935d08Winson Chung        mDropTargetBar = findViewById(R.id.drag_target_bar);
105a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung        mInfoDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.info_target_text);
106a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung        mDeleteDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.delete_target_text);
107a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung
108d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        mInfoDropTarget.setSearchDropTargetBar(this);
109d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        mDeleteDropTarget.setSearchDropTargetBar(this);
110d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen
11119e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka        mEnableDropDownDropTargets =
112a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung            getResources().getBoolean(R.bool.config_useDropTargetDownTransition);
113201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung
114201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung        // Create the various fade animations
11519e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka        if (mEnableDropDownDropTargets) {
1165f8afe6280eae34620067696173e71943e1a30a3Winson Chung            LauncherAppState app = LauncherAppState.getInstance();
1175f8afe6280eae34620067696173e71943e1a30a3Winson Chung            DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
1185f8afe6280eae34620067696173e71943e1a30a3Winson Chung            mBarHeight = grid.searchBarSpaceHeightPx;
119a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung            mDropTargetBar.setTranslationY(-mBarHeight);
12066b7d011636ce930f4cae9500c7634d950415959Michael Jurka            mDropTargetBarAnim = LauncherAnimUtils.ofFloat(mDropTargetBar, "translationY",
12117f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung                    -mBarHeight, 0f);
122476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu
123315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung        } else {
124315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            mDropTargetBar.setAlpha(0f);
12566b7d011636ce930f4cae9500c7634d950415959Michael Jurka            mDropTargetBarAnim = LauncherAnimUtils.ofFloat(mDropTargetBar, "alpha", 0f, 1f);
126a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung        }
12717f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        setupAnimation(mDropTargetBarAnim, mDropTargetBar);
128201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung    }
129201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung
130043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung    public void finishAnimations() {
13117f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        prepareStartAnimation(mDropTargetBar);
13217f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        mDropTargetBarAnim.reverse();
13317f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        prepareStartAnimation(mQSBSearchBar);
13417f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        mQSBSearchBarAnim.reverse();
1354c98d9235d164680186180974719f551cf935d08Winson Chung    }
1364c98d9235d164680186180974719f551cf935d08Winson Chung
1374c98d9235d164680186180974719f551cf935d08Winson Chung    /*
138f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     * Shows and hides the search bar.
139f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     */
140f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public void showSearchBar(boolean animated) {
1418246a1434c12b607743222c22285b72c9a96497bMac Duy Hai        boolean needToCancelOngoingAnimation = mQSBSearchBarAnim.isRunning() && !animated;
1428246a1434c12b607743222c22285b72c9a96497bMac Duy Hai        if (!mIsSearchBarHidden && !needToCancelOngoingAnimation) return;
143f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        if (animated) {
144c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung            prepareStartAnimation(mQSBSearchBar);
14517f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.reverse();
146f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        } else {
14717f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.cancel();
14819e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            if (mEnableDropDownDropTargets) {
14919e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka                mQSBSearchBar.setTranslationY(0);
15019e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            } else {
151324dbdd7a3d32b8c73d496111633cb3b843f4b16Michael Jurka                mQSBSearchBar.setAlpha(1f);
15219e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            }
153f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
154f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        mIsSearchBarHidden = false;
155f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
156f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public void hideSearchBar(boolean animated) {
1578246a1434c12b607743222c22285b72c9a96497bMac Duy Hai        boolean needToCancelOngoingAnimation = mQSBSearchBarAnim.isRunning() && !animated;
1588246a1434c12b607743222c22285b72c9a96497bMac Duy Hai        if (mIsSearchBarHidden && !needToCancelOngoingAnimation) return;
159f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        if (animated) {
160c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung            prepareStartAnimation(mQSBSearchBar);
16117f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.start();
162f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        } else {
16317f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.cancel();
16419e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            if (mEnableDropDownDropTargets) {
16517f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung                mQSBSearchBar.setTranslationY(-mBarHeight);
16619e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            } else {
167324dbdd7a3d32b8c73d496111633cb3b843f4b16Michael Jurka                mQSBSearchBar.setAlpha(0f);
16819e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka            }
169f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
170f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        mIsSearchBarHidden = true;
171f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
172f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
173f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    /*
174f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     * Gets various transition durations.
175f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     */
176f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public int getTransitionInDuration() {
177f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        return sTransitionInDuration;
178f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
179f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public int getTransitionOutDuration() {
180f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        return sTransitionOutDuration;
181f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
182f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
183f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    /*
1844c98d9235d164680186180974719f551cf935d08Winson Chung     * DragController.DragListener implementation
1854c98d9235d164680186180974719f551cf935d08Winson Chung     */
1864c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
1874c98d9235d164680186180974719f551cf935d08Winson Chung    public void onDragStart(DragSource source, Object info, int dragAction) {
1884c98d9235d164680186180974719f551cf935d08Winson Chung        // Animate out the QSB search bar, and animate in the drop target bar
189c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung        prepareStartAnimation(mDropTargetBar);
19017f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung        mDropTargetBarAnim.start();
191f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        if (!mIsSearchBarHidden) {
192c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung            prepareStartAnimation(mQSBSearchBar);
19317f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mQSBSearchBarAnim.start();
194f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
1954c98d9235d164680186180974719f551cf935d08Winson Chung    }
1964c98d9235d164680186180974719f551cf935d08Winson Chung
197d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    public void deferOnDragEnd() {
198d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        mDeferOnDragEnd = true;
199d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    }
200d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen
2014c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
2024c98d9235d164680186180974719f551cf935d08Winson Chung    public void onDragEnd() {
203d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        if (!mDeferOnDragEnd) {
204d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            // Restore the QSB search bar, and animate out the drop target bar
205c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung            prepareStartAnimation(mDropTargetBar);
20617f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung            mDropTargetBarAnim.reverse();
207d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            if (!mIsSearchBarHidden) {
208c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung                prepareStartAnimation(mQSBSearchBar);
20917f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung                mQSBSearchBarAnim.reverse();
210d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            }
211d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        } else {
212d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            mDeferOnDragEnd = false;
213f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
2144c98d9235d164680186180974719f551cf935d08Winson Chung    }
215c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung
216c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung    public void onSearchPackagesChanged(boolean searchVisible, boolean voiceVisible) {
217c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung        if (mQSBSearchBar != null) {
218c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung            Drawable bg = mQSBSearchBar.getBackground();
219c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung            if (bg != null && (!searchVisible && !voiceVisible)) {
220c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung                // Save the background and disable it
221c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung                mPreviousBackground = bg;
222c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung                mQSBSearchBar.setBackgroundResource(0);
223c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung            } else if (mPreviousBackground != null && (searchVisible || voiceVisible)) {
224c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung                // Restore the background
2253a9fcedbcd235372cd2ab64f825a0b5b3937f59eMichael Jurka                mQSBSearchBar.setBackground(mPreviousBackground);
226c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung            }
227c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung        }
228c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung    }
229cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood
230cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood    public Rect getSearchBarBounds() {
231cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood        if (mQSBSearchBar != null) {
232cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            final int[] pos = new int[2];
233cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            mQSBSearchBar.getLocationOnScreen(pos);
234cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood
235cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            final Rect rect = new Rect();
236629758ff081a354e43aa409159211210ee4ee85aMichael Jurka            rect.left = pos[0];
237629758ff081a354e43aa409159211210ee4ee85aMichael Jurka            rect.top = pos[1];
238629758ff081a354e43aa409159211210ee4ee85aMichael Jurka            rect.right = pos[0] + mQSBSearchBar.getWidth();
239629758ff081a354e43aa409159211210ee4ee85aMichael Jurka            rect.bottom = pos[1] + mQSBSearchBar.getHeight();
240cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            return rect;
241cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood        } else {
242cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            return null;
243cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood        }
244cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood    }
2454c98d9235d164680186180974719f551cf935d08Winson Chung}
246