SearchDropTargetBar.java revision 315b3ba6f1174f71b321301afa61cd826f7a1e97
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; 21a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chungimport android.animation.AnimatorSet; 22201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chungimport android.animation.ObjectAnimator; 234c98d9235d164680186180974719f551cf935d08Winson Chungimport android.content.Context; 24cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwoodimport android.graphics.Rect; 25c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chungimport android.graphics.drawable.Drawable; 264c98d9235d164680186180974719f551cf935d08Winson Chungimport android.util.AttributeSet; 274c98d9235d164680186180974719f551cf935d08Winson Chungimport android.view.View; 28a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chungimport android.view.animation.AccelerateInterpolator; 29a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chungimport android.view.animation.DecelerateInterpolator; 304c98d9235d164680186180974719f551cf935d08Winson Chungimport android.widget.FrameLayout; 314c98d9235d164680186180974719f551cf935d08Winson Chung 324c98d9235d164680186180974719f551cf935d08Winson Chungimport com.android.launcher.R; 334c98d9235d164680186180974719f551cf935d08Winson Chung 344c98d9235d164680186180974719f551cf935d08Winson Chung/* 354c98d9235d164680186180974719f551cf935d08Winson Chung * Ths bar will manage the transition between the QSB search bar and the delete drop 364c98d9235d164680186180974719f551cf935d08Winson Chung * targets so that each of the individual IconDropTargets don't have to. 374c98d9235d164680186180974719f551cf935d08Winson Chung */ 384c98d9235d164680186180974719f551cf935d08Winson Chungpublic class SearchDropTargetBar extends FrameLayout implements DragController.DragListener { 394c98d9235d164680186180974719f551cf935d08Winson Chung 40a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung private static final int sTransitionInDuration = 200; 41a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung private static final int sTransitionOutDuration = 175; 424c98d9235d164680186180974719f551cf935d08Winson Chung 43315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung private ObjectAnimator mDropTargetBarFadeInAnim; 44315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung private ObjectAnimator mDropTargetBarFadeOutAnim; 45201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung private ObjectAnimator mQSBSearchBarFadeInAnim; 46201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung private ObjectAnimator mQSBSearchBarFadeOutAnim; 47201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung 48f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung private boolean mIsSearchBarHidden; 494c98d9235d164680186180974719f551cf935d08Winson Chung private View mQSBSearchBar; 504c98d9235d164680186180974719f551cf935d08Winson Chung private View mDropTargetBar; 5161fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung private ButtonDropTarget mInfoDropTarget; 5261fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung private ButtonDropTarget mDeleteDropTarget; 53a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung private int mBarHeight; 54d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen private boolean mDeferOnDragEnd = false; 554c98d9235d164680186180974719f551cf935d08Winson Chung 56c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung private Drawable mPreviousBackground; 57c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung 584c98d9235d164680186180974719f551cf935d08Winson Chung public SearchDropTargetBar(Context context, AttributeSet attrs) { 594c98d9235d164680186180974719f551cf935d08Winson Chung this(context, attrs, 0); 604c98d9235d164680186180974719f551cf935d08Winson Chung } 614c98d9235d164680186180974719f551cf935d08Winson Chung 624c98d9235d164680186180974719f551cf935d08Winson Chung public SearchDropTargetBar(Context context, AttributeSet attrs, int defStyle) { 634c98d9235d164680186180974719f551cf935d08Winson Chung super(context, attrs, defStyle); 644c98d9235d164680186180974719f551cf935d08Winson Chung } 654c98d9235d164680186180974719f551cf935d08Winson Chung 664c98d9235d164680186180974719f551cf935d08Winson Chung public void setup(Launcher launcher, DragController dragController) { 674c98d9235d164680186180974719f551cf935d08Winson Chung dragController.addDragListener(this); 684c98d9235d164680186180974719f551cf935d08Winson Chung dragController.addDragListener(mInfoDropTarget); 694c98d9235d164680186180974719f551cf935d08Winson Chung dragController.addDragListener(mDeleteDropTarget); 704c98d9235d164680186180974719f551cf935d08Winson Chung dragController.addDropTarget(mInfoDropTarget); 714c98d9235d164680186180974719f551cf935d08Winson Chung dragController.addDropTarget(mDeleteDropTarget); 72043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung dragController.setFlingToDeleteDropTarget(mDeleteDropTarget); 734c98d9235d164680186180974719f551cf935d08Winson Chung mInfoDropTarget.setLauncher(launcher); 744c98d9235d164680186180974719f551cf935d08Winson Chung mDeleteDropTarget.setLauncher(launcher); 754c98d9235d164680186180974719f551cf935d08Winson Chung } 764c98d9235d164680186180974719f551cf935d08Winson Chung 77315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung private void prepareAnimation(ObjectAnimator in, ObjectAnimator out, final View v) { 78315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung in.setInterpolator(new AccelerateInterpolator()); 79315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung in.setDuration(sTransitionInDuration); 80315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung in.addListener(new AnimatorListenerAdapter() { 81315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung @Override 82315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung public void onAnimationStart(Animator animation) { 83315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung v.setVisibility(View.VISIBLE); 84315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung } 85315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung }); 86315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung out.setInterpolator(new DecelerateInterpolator()); 87315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung out.setDuration(sTransitionOutDuration); 88315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung out.addListener(new AnimatorListenerAdapter() { 89315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung @Override 90315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung public void onAnimationEnd(Animator animation) { 91315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung v.setVisibility(View.INVISIBLE); 92315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung v.setLayerType(View.LAYER_TYPE_NONE, null); 93315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung } 94315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung }); 95315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung } 96315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung 974c98d9235d164680186180974719f551cf935d08Winson Chung @Override 984c98d9235d164680186180974719f551cf935d08Winson Chung protected void onFinishInflate() { 994c98d9235d164680186180974719f551cf935d08Winson Chung super.onFinishInflate(); 1004c98d9235d164680186180974719f551cf935d08Winson Chung 1014c98d9235d164680186180974719f551cf935d08Winson Chung // Get the individual components 1024c98d9235d164680186180974719f551cf935d08Winson Chung mQSBSearchBar = findViewById(R.id.qsb_search_bar); 1034c98d9235d164680186180974719f551cf935d08Winson Chung mDropTargetBar = findViewById(R.id.drag_target_bar); 104a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung mInfoDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.info_target_text); 105a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung mDeleteDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.delete_target_text); 106a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung mBarHeight = getResources().getDimensionPixelSize(R.dimen.qsb_bar_height); 107a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung 108d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen mInfoDropTarget.setSearchDropTargetBar(this); 109d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen mDeleteDropTarget.setSearchDropTargetBar(this); 110d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen 111a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung boolean enableDropDownDropTargets = 112a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung getResources().getBoolean(R.bool.config_useDropTargetDownTransition); 113201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung 114201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung // Create the various fade animations 115a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung if (enableDropDownDropTargets) { 116a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung mDropTargetBar.setTranslationY(-mBarHeight); 117315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung mDropTargetBarFadeInAnim = ObjectAnimator.ofFloat(mDropTargetBar, "translationY", 0f); 118315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung mDropTargetBarFadeOutAnim = ObjectAnimator.ofFloat(mDropTargetBar, "translationY", 119315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung -mBarHeight); 120315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung mQSBSearchBarFadeInAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "translationY", 0); 121315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung mQSBSearchBarFadeOutAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "translationY", 122315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung -mBarHeight); 123315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung } else { 124315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung mDropTargetBar.setAlpha(0f); 125315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung mDropTargetBarFadeInAnim = ObjectAnimator.ofFloat(mDropTargetBar, "alpha", 1f); 126315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung mDropTargetBarFadeOutAnim = ObjectAnimator.ofFloat(mDropTargetBar, "alpha", 0f); 127315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung mQSBSearchBarFadeInAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "alpha", 1f); 128315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung mQSBSearchBarFadeOutAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "alpha", 0f); 129a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung } 130315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung prepareAnimation(mDropTargetBarFadeInAnim, mDropTargetBarFadeOutAnim, mDropTargetBar); 131315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung prepareAnimation(mQSBSearchBarFadeInAnim, mQSBSearchBarFadeOutAnim, mQSBSearchBar); 132201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung } 133201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung 134043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung public void finishAnimations() { 135043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung mDropTargetBarFadeInAnim.end(); 136043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung mDropTargetBarFadeOutAnim.end(); 137043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung mQSBSearchBarFadeInAnim.end(); 138043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung mQSBSearchBarFadeOutAnim.end(); 139043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung } 140043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung 141201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung private void cancelAnimations() { 142201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung mDropTargetBarFadeInAnim.cancel(); 143201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung mDropTargetBarFadeOutAnim.cancel(); 144201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung mQSBSearchBarFadeInAnim.cancel(); 145201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung mQSBSearchBarFadeOutAnim.cancel(); 1464c98d9235d164680186180974719f551cf935d08Winson Chung } 1474c98d9235d164680186180974719f551cf935d08Winson Chung 1484c98d9235d164680186180974719f551cf935d08Winson Chung /* 149f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung * Shows and hides the search bar. 150f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung */ 151f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung public void showSearchBar(boolean animated) { 152201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung cancelAnimations(); 153f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung if (animated) { 154201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung mQSBSearchBarFadeInAnim.start(); 155f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } else { 156201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung mQSBSearchBar.setVisibility(View.VISIBLE); 157f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung mQSBSearchBar.setAlpha(1f); 158f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 159f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung mIsSearchBarHidden = false; 160f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 161f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung public void hideSearchBar(boolean animated) { 162201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung cancelAnimations(); 163f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung if (animated) { 164201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung mQSBSearchBarFadeOutAnim.start(); 165f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } else { 16681efbad05e0ce69b06d7323749ef2e200b84b98eMichael Jurka mQSBSearchBar.setVisibility(View.INVISIBLE); 167f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung mQSBSearchBar.setAlpha(0f); 168f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 169f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung mIsSearchBarHidden = true; 170f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 171f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 172f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung /* 173f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung * Gets various transition durations. 174f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung */ 175f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung public int getTransitionInDuration() { 176f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung return sTransitionInDuration; 177f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 178f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung public int getTransitionOutDuration() { 179f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung return sTransitionOutDuration; 180f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 181f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 182f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung /* 1834c98d9235d164680186180974719f551cf935d08Winson Chung * DragController.DragListener implementation 1844c98d9235d164680186180974719f551cf935d08Winson Chung */ 1854c98d9235d164680186180974719f551cf935d08Winson Chung @Override 1864c98d9235d164680186180974719f551cf935d08Winson Chung public void onDragStart(DragSource source, Object info, int dragAction) { 1874c98d9235d164680186180974719f551cf935d08Winson Chung // Animate out the QSB search bar, and animate in the drop target bar 188a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung mDropTargetBar.setLayerType(View.LAYER_TYPE_HARDWARE, null); 189a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung mDropTargetBar.buildLayer(); 190a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung mDropTargetBarFadeOutAnim.cancel(); 191201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung mDropTargetBarFadeInAnim.start(); 192f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung if (!mIsSearchBarHidden) { 193a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung mQSBSearchBarFadeInAnim.cancel(); 194201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung mQSBSearchBarFadeOutAnim.start(); 195f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 1964c98d9235d164680186180974719f551cf935d08Winson Chung } 1974c98d9235d164680186180974719f551cf935d08Winson Chung 198d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen public void deferOnDragEnd() { 199d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen mDeferOnDragEnd = true; 200d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen } 201d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen 2024c98d9235d164680186180974719f551cf935d08Winson Chung @Override 2034c98d9235d164680186180974719f551cf935d08Winson Chung public void onDragEnd() { 204d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen if (!mDeferOnDragEnd) { 205d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen // Restore the QSB search bar, and animate out the drop target bar 206d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen mDropTargetBarFadeInAnim.cancel(); 207d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen mDropTargetBarFadeOutAnim.start(); 208d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen if (!mIsSearchBarHidden) { 209d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen mQSBSearchBarFadeOutAnim.cancel(); 210d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen mQSBSearchBarFadeInAnim.start(); 211d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen } 212d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen } else { 213d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen mDeferOnDragEnd = false; 214f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 2154c98d9235d164680186180974719f551cf935d08Winson Chung } 216c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung 217c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung public void onSearchPackagesChanged(boolean searchVisible, boolean voiceVisible) { 218c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung if (mQSBSearchBar != null) { 219c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung Drawable bg = mQSBSearchBar.getBackground(); 220c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung if (bg != null && (!searchVisible && !voiceVisible)) { 221c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung // Save the background and disable it 222c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung mPreviousBackground = bg; 223c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung mQSBSearchBar.setBackgroundResource(0); 224c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung } else if (mPreviousBackground != null && (searchVisible || voiceVisible)) { 225c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung // Restore the background 2263a9fcedbcd235372cd2ab64f825a0b5b3937f59eMichael Jurka mQSBSearchBar.setBackground(mPreviousBackground); 227c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung } 228c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung } 229c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung } 230cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood 231cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood public Rect getSearchBarBounds() { 232cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood if (mQSBSearchBar != null) { 233cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood final float appScale = mQSBSearchBar.getContext().getResources() 234cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood .getCompatibilityInfo().applicationScale; 235cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood final int[] pos = new int[2]; 236cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood mQSBSearchBar.getLocationOnScreen(pos); 237cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood 238cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood final Rect rect = new Rect(); 239cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood rect.left = (int) (pos[0] * appScale + 0.5f); 240cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood rect.top = (int) (pos[1] * appScale + 0.5f); 241cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood rect.right = (int) ((pos[0] + mQSBSearchBar.getWidth()) * appScale + 0.5f); 242cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood rect.bottom = (int) ((pos[1] + mQSBSearchBar.getHeight()) * appScale + 0.5f); 243cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood return rect; 244cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood } else { 245cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood return null; 246cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood } 247cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood } 2484c98d9235d164680186180974719f551cf935d08Winson Chung} 249