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