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