SearchDropTargetBar.java revision c9735cff2e558aa3f3810e49c15ef13049b9429c
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; 22c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohenimport android.animation.ValueAnimator; 234c98d9235d164680186180974719f551cf935d08Winson Chungimport android.content.Context; 24cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwoodimport android.graphics.Rect; 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; 40c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen private ValueAnimator 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 5219e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka private boolean mEnableDropDownDropTargets; 53c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung 544c98d9235d164680186180974719f551cf935d08Winson Chung public SearchDropTargetBar(Context context, AttributeSet attrs) { 554c98d9235d164680186180974719f551cf935d08Winson Chung this(context, attrs, 0); 564c98d9235d164680186180974719f551cf935d08Winson Chung } 574c98d9235d164680186180974719f551cf935d08Winson Chung 584c98d9235d164680186180974719f551cf935d08Winson Chung public SearchDropTargetBar(Context context, AttributeSet attrs, int defStyle) { 594c98d9235d164680186180974719f551cf935d08Winson Chung super(context, attrs, defStyle); 604c98d9235d164680186180974719f551cf935d08Winson Chung } 614c98d9235d164680186180974719f551cf935d08Winson Chung 624c98d9235d164680186180974719f551cf935d08Winson Chung public void setup(Launcher launcher, DragController dragController) { 634c98d9235d164680186180974719f551cf935d08Winson Chung dragController.addDragListener(this); 644c98d9235d164680186180974719f551cf935d08Winson Chung dragController.addDragListener(mInfoDropTarget); 654c98d9235d164680186180974719f551cf935d08Winson Chung dragController.addDragListener(mDeleteDropTarget); 664c98d9235d164680186180974719f551cf935d08Winson Chung dragController.addDropTarget(mInfoDropTarget); 674c98d9235d164680186180974719f551cf935d08Winson Chung dragController.addDropTarget(mDeleteDropTarget); 68043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung dragController.setFlingToDeleteDropTarget(mDeleteDropTarget); 694c98d9235d164680186180974719f551cf935d08Winson Chung mInfoDropTarget.setLauncher(launcher); 704c98d9235d164680186180974719f551cf935d08Winson Chung mDeleteDropTarget.setLauncher(launcher); 71594d76dc66cb5666830b62594909fed187987d42Sunny Goyal } 72594d76dc66cb5666830b62594909fed187987d42Sunny Goyal 73594d76dc66cb5666830b62594909fed187987d42Sunny Goyal public void setQsbSearchBar(View qsb) { 74594d76dc66cb5666830b62594909fed187987d42Sunny Goyal mQSBSearchBar = qsb; 75c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen if (mQSBSearchBar != null) { 76c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen if (mEnableDropDownDropTargets) { 77c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen mQSBSearchBarAnim = LauncherAnimUtils.ofFloat(mQSBSearchBar, "translationY", 0, 78c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen -mBarHeight); 79c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen } else { 80c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen mQSBSearchBarAnim = LauncherAnimUtils.ofFloat(mQSBSearchBar, "alpha", 1f, 0f); 81c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen } 82c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen setupAnimation(mQSBSearchBarAnim, mQSBSearchBar); 83476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu } else { 84c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen // Create a no-op animation of the search bar is null 85c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen mQSBSearchBarAnim = ValueAnimator.ofFloat(0, 0); 86c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen mQSBSearchBarAnim.setDuration(sTransitionInDuration); 87476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu } 884c98d9235d164680186180974719f551cf935d08Winson Chung } 894c98d9235d164680186180974719f551cf935d08Winson Chung 90c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung private void prepareStartAnimation(View v) { 9117f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung // Enable the hw layers before the animation starts (will be disabled in the onAnimationEnd 9217f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung // callback below) 93c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen if (v != null) { 94c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen v.setLayerType(View.LAYER_TYPE_HARDWARE, null); 95c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen } 96c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung } 97c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung 98c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen private void setupAnimation(ValueAnimator anim, final View v) { 9917f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung anim.setInterpolator(sAccelerateInterpolator); 10017f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung anim.setDuration(sTransitionInDuration); 10117f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung anim.addListener(new AnimatorListenerAdapter() { 102315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung @Override 103315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung public void onAnimationEnd(Animator animation) { 104c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen if (v != null) { 105c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen v.setLayerType(View.LAYER_TYPE_NONE, null); 106c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen } 107315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung } 108315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung }); 109315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung } 110315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung 1114c98d9235d164680186180974719f551cf935d08Winson Chung @Override 1124c98d9235d164680186180974719f551cf935d08Winson Chung protected void onFinishInflate() { 1134c98d9235d164680186180974719f551cf935d08Winson Chung super.onFinishInflate(); 1144c98d9235d164680186180974719f551cf935d08Winson Chung 1154c98d9235d164680186180974719f551cf935d08Winson Chung // Get the individual components 1164c98d9235d164680186180974719f551cf935d08Winson Chung mDropTargetBar = findViewById(R.id.drag_target_bar); 117a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung mInfoDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.info_target_text); 118a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung mDeleteDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.delete_target_text); 119a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung 120d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen mInfoDropTarget.setSearchDropTargetBar(this); 121d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen mDeleteDropTarget.setSearchDropTargetBar(this); 122d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen 12319e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka mEnableDropDownDropTargets = 124a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung getResources().getBoolean(R.bool.config_useDropTargetDownTransition); 125201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung 126201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung // Create the various fade animations 12719e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka if (mEnableDropDownDropTargets) { 1285f8afe6280eae34620067696173e71943e1a30a3Winson Chung LauncherAppState app = LauncherAppState.getInstance(); 1295f8afe6280eae34620067696173e71943e1a30a3Winson Chung DeviceProfile grid = app.getDynamicGrid().getDeviceProfile(); 1305f8afe6280eae34620067696173e71943e1a30a3Winson Chung mBarHeight = grid.searchBarSpaceHeightPx; 131a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung mDropTargetBar.setTranslationY(-mBarHeight); 13266b7d011636ce930f4cae9500c7634d950415959Michael Jurka mDropTargetBarAnim = LauncherAnimUtils.ofFloat(mDropTargetBar, "translationY", 13317f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung -mBarHeight, 0f); 134476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu 135315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung } else { 136315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung mDropTargetBar.setAlpha(0f); 13766b7d011636ce930f4cae9500c7634d950415959Michael Jurka mDropTargetBarAnim = LauncherAnimUtils.ofFloat(mDropTargetBar, "alpha", 0f, 1f); 138a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung } 13917f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung setupAnimation(mDropTargetBarAnim, mDropTargetBar); 140201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung } 141201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung 142043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung public void finishAnimations() { 14317f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung prepareStartAnimation(mDropTargetBar); 14417f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung mDropTargetBarAnim.reverse(); 14517f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung prepareStartAnimation(mQSBSearchBar); 14617f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung mQSBSearchBarAnim.reverse(); 1474c98d9235d164680186180974719f551cf935d08Winson Chung } 1484c98d9235d164680186180974719f551cf935d08Winson Chung 1494c98d9235d164680186180974719f551cf935d08Winson Chung /* 150f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung * Shows and hides the search bar. 151f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung */ 152f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung public void showSearchBar(boolean animated) { 1538246a1434c12b607743222c22285b72c9a96497bMac Duy Hai boolean needToCancelOngoingAnimation = mQSBSearchBarAnim.isRunning() && !animated; 1548246a1434c12b607743222c22285b72c9a96497bMac Duy Hai if (!mIsSearchBarHidden && !needToCancelOngoingAnimation) return; 155f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung if (animated) { 156c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung prepareStartAnimation(mQSBSearchBar); 15717f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung mQSBSearchBarAnim.reverse(); 158f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } else { 15917f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung mQSBSearchBarAnim.cancel(); 160c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen if (mQSBSearchBar != null && mEnableDropDownDropTargets) { 16119e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka mQSBSearchBar.setTranslationY(0); 162c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen } else if (mQSBSearchBar != null) { 163324dbdd7a3d32b8c73d496111633cb3b843f4b16Michael Jurka mQSBSearchBar.setAlpha(1f); 16419e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka } 165f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 166f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung mIsSearchBarHidden = false; 167f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 168f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung public void hideSearchBar(boolean animated) { 1698246a1434c12b607743222c22285b72c9a96497bMac Duy Hai boolean needToCancelOngoingAnimation = mQSBSearchBarAnim.isRunning() && !animated; 1708246a1434c12b607743222c22285b72c9a96497bMac Duy Hai if (mIsSearchBarHidden && !needToCancelOngoingAnimation) return; 171f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung if (animated) { 172c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung prepareStartAnimation(mQSBSearchBar); 17317f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung mQSBSearchBarAnim.start(); 174f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } else { 17517f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung mQSBSearchBarAnim.cancel(); 176c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen if (mQSBSearchBar != null && mEnableDropDownDropTargets) { 17717f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung mQSBSearchBar.setTranslationY(-mBarHeight); 178c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen } else if (mQSBSearchBar != null) { 179324dbdd7a3d32b8c73d496111633cb3b843f4b16Michael Jurka mQSBSearchBar.setAlpha(0f); 18019e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka } 181f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 182f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung mIsSearchBarHidden = true; 183f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 184f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 185f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung /* 186f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung * Gets various transition durations. 187f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung */ 188f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung public int getTransitionInDuration() { 189f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung return sTransitionInDuration; 190f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 191f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung public int getTransitionOutDuration() { 192f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung return sTransitionOutDuration; 193f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 194f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 195f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung /* 1964c98d9235d164680186180974719f551cf935d08Winson Chung * DragController.DragListener implementation 1974c98d9235d164680186180974719f551cf935d08Winson Chung */ 1984c98d9235d164680186180974719f551cf935d08Winson Chung @Override 1994c98d9235d164680186180974719f551cf935d08Winson Chung public void onDragStart(DragSource source, Object info, int dragAction) { 200c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen showDeleteTarget(); 201c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen } 202c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen 203c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen public void showDeleteTarget() { 2044c98d9235d164680186180974719f551cf935d08Winson Chung // Animate out the QSB search bar, and animate in the drop target bar 205c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung prepareStartAnimation(mDropTargetBar); 20617f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung mDropTargetBarAnim.start(); 207f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung if (!mIsSearchBarHidden) { 208c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung prepareStartAnimation(mQSBSearchBar); 20917f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung mQSBSearchBarAnim.start(); 210f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 2114c98d9235d164680186180974719f551cf935d08Winson Chung } 2124c98d9235d164680186180974719f551cf935d08Winson Chung 213c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen public void hideDeleteTarget() { 214c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen // Restore the QSB search bar, and animate out the drop target bar 215c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen prepareStartAnimation(mDropTargetBar); 216c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen mDropTargetBarAnim.reverse(); 217c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen if (!mIsSearchBarHidden) { 218c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen prepareStartAnimation(mQSBSearchBar); 219c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen mQSBSearchBarAnim.reverse(); 220c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen } 221c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen } 222c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen 223d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen public void deferOnDragEnd() { 224d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen mDeferOnDragEnd = true; 225d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen } 226d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen 2274c98d9235d164680186180974719f551cf935d08Winson Chung @Override 2284c98d9235d164680186180974719f551cf935d08Winson Chung public void onDragEnd() { 229d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen if (!mDeferOnDragEnd) { 230c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen hideDeleteTarget(); 231d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen } else { 232d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen mDeferOnDragEnd = false; 233f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 2344c98d9235d164680186180974719f551cf935d08Winson Chung } 235c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung 236cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood public Rect getSearchBarBounds() { 237cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood if (mQSBSearchBar != null) { 238cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood final int[] pos = new int[2]; 239cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood mQSBSearchBar.getLocationOnScreen(pos); 240cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood 241cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood final Rect rect = new Rect(); 242629758ff081a354e43aa409159211210ee4ee85aMichael Jurka rect.left = pos[0]; 243629758ff081a354e43aa409159211210ee4ee85aMichael Jurka rect.top = pos[1]; 244629758ff081a354e43aa409159211210ee4ee85aMichael Jurka rect.right = pos[0] + mQSBSearchBar.getWidth(); 245629758ff081a354e43aa409159211210ee4ee85aMichael Jurka rect.bottom = pos[1] + mQSBSearchBar.getHeight(); 246cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood return rect; 247cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood } else { 248cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood return null; 249cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood } 250cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood } 2514c98d9235d164680186180974719f551cf935d08Winson Chung} 252