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; 214c98d9235d164680186180974719f551cf935d08Winson Chungimport android.content.Context; 22cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwoodimport android.graphics.Rect; 234c98d9235d164680186180974719f551cf935d08Winson Chungimport android.util.AttributeSet; 244c98d9235d164680186180974719f551cf935d08Winson Chungimport android.view.View; 25006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chungimport android.view.accessibility.AccessibilityManager; 26a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chungimport android.view.animation.AccelerateInterpolator; 274c98d9235d164680186180974719f551cf935d08Winson Chungimport android.widget.FrameLayout; 284c98d9235d164680186180974719f551cf935d08Winson Chung 29d1ea63f24a751521e6c35cc06be0e548e0b04f23Sunny Goyalimport com.android.launcher3.util.Thunk; 30d1ea63f24a751521e6c35cc06be0e548e0b04f23Sunny Goyal 314c98d9235d164680186180974719f551cf935d08Winson Chung/* 324c98d9235d164680186180974719f551cf935d08Winson Chung * Ths bar will manage the transition between the QSB search bar and the delete drop 334c98d9235d164680186180974719f551cf935d08Winson Chung * targets so that each of the individual IconDropTargets don't have to. 344c98d9235d164680186180974719f551cf935d08Winson Chung */ 354c98d9235d164680186180974719f551cf935d08Winson Chungpublic class SearchDropTargetBar extends FrameLayout implements DragController.DragListener { 364c98d9235d164680186180974719f551cf935d08Winson Chung 37006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung /** The different states that the search bar space can be in. */ 38006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung public enum State { 39006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung INVISIBLE (0f, 0f), 40006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung SEARCH_BAR (1f, 0f), 41006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung DROP_TARGET (0f, 1f); 424c98d9235d164680186180974719f551cf935d08Winson Chung 43006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung private final float mSearchBarAlpha; 44006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung private final float mDropTargetBarAlpha; 45006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung 46006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung State(float sbAlpha, float dtbAlpha) { 47006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung mSearchBarAlpha = sbAlpha; 48006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung mDropTargetBarAlpha = dtbAlpha; 49006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung } 50006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung 51006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung float getSearchBarAlpha() { 52006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung return mSearchBarAlpha; 53006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung } 54006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung 55006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung float getDropTargetBarAlpha() { 56006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung return mDropTargetBarAlpha; 57006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung } 58006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung } 59006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung 60006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung private static int DEFAULT_DRAG_FADE_DURATION = 175; 61006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung 62006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung private LauncherViewPropertyAnimator mDropTargetBarAnimator; 63006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung private LauncherViewPropertyAnimator mQSBSearchBarAnimator; 6417f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung private static final AccelerateInterpolator sAccelerateInterpolator = 6517f1bb8ec9180cc3ee3f8b343b3b0d247c8d7bb7Winson Chung new AccelerateInterpolator(); 66201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung 67006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung private State mState = State.SEARCH_BAR; 68d1ea63f24a751521e6c35cc06be0e548e0b04f23Sunny Goyal @Thunk View mQSB; 69d1ea63f24a751521e6c35cc06be0e548e0b04f23Sunny Goyal @Thunk View mDropTargetBar; 70d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen private boolean mDeferOnDragEnd = false; 71d1ea63f24a751521e6c35cc06be0e548e0b04f23Sunny Goyal @Thunk boolean mAccessibilityEnabled = false; 724c98d9235d164680186180974719f551cf935d08Winson Chung 73fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal // Drop targets 74fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal private ButtonDropTarget mInfoDropTarget; 75fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal private ButtonDropTarget mDeleteDropTarget; 76fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal private ButtonDropTarget mUninstallDropTarget; 77fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal 784c98d9235d164680186180974719f551cf935d08Winson Chung public SearchDropTargetBar(Context context, AttributeSet attrs) { 794c98d9235d164680186180974719f551cf935d08Winson Chung this(context, attrs, 0); 804c98d9235d164680186180974719f551cf935d08Winson Chung } 814c98d9235d164680186180974719f551cf935d08Winson Chung 824c98d9235d164680186180974719f551cf935d08Winson Chung public SearchDropTargetBar(Context context, AttributeSet attrs, int defStyle) { 834c98d9235d164680186180974719f551cf935d08Winson Chung super(context, attrs, defStyle); 844c98d9235d164680186180974719f551cf935d08Winson Chung } 854c98d9235d164680186180974719f551cf935d08Winson Chung 864c98d9235d164680186180974719f551cf935d08Winson Chung public void setup(Launcher launcher, DragController dragController) { 874c98d9235d164680186180974719f551cf935d08Winson Chung dragController.addDragListener(this); 88fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal dragController.setFlingToDeleteDropTarget(mDeleteDropTarget); 89fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal 904c98d9235d164680186180974719f551cf935d08Winson Chung dragController.addDragListener(mInfoDropTarget); 914c98d9235d164680186180974719f551cf935d08Winson Chung dragController.addDragListener(mDeleteDropTarget); 92fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal dragController.addDragListener(mUninstallDropTarget); 93fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal 944c98d9235d164680186180974719f551cf935d08Winson Chung dragController.addDropTarget(mInfoDropTarget); 954c98d9235d164680186180974719f551cf935d08Winson Chung dragController.addDropTarget(mDeleteDropTarget); 96fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal dragController.addDropTarget(mUninstallDropTarget); 97fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal 984c98d9235d164680186180974719f551cf935d08Winson Chung mInfoDropTarget.setLauncher(launcher); 994c98d9235d164680186180974719f551cf935d08Winson Chung mDeleteDropTarget.setLauncher(launcher); 100fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal mUninstallDropTarget.setLauncher(launcher); 101594d76dc66cb5666830b62594909fed187987d42Sunny Goyal } 102594d76dc66cb5666830b62594909fed187987d42Sunny Goyal 1034c98d9235d164680186180974719f551cf935d08Winson Chung @Override 1044c98d9235d164680186180974719f551cf935d08Winson Chung protected void onFinishInflate() { 1054c98d9235d164680186180974719f551cf935d08Winson Chung super.onFinishInflate(); 1064c98d9235d164680186180974719f551cf935d08Winson Chung 1074c98d9235d164680186180974719f551cf935d08Winson Chung // Get the individual components 1084c98d9235d164680186180974719f551cf935d08Winson Chung mDropTargetBar = findViewById(R.id.drag_target_bar); 109a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung mInfoDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.info_target_text); 110a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung mDeleteDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.delete_target_text); 111fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal mUninstallDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.uninstall_target_text); 112a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung 113d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen mInfoDropTarget.setSearchDropTargetBar(this); 114d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen mDeleteDropTarget.setSearchDropTargetBar(this); 115fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal mUninstallDropTarget.setSearchDropTargetBar(this); 116d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen 117201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung // Create the various fade animations 118dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung mDropTargetBar.setAlpha(0f); 119006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung mDropTargetBarAnimator = new LauncherViewPropertyAnimator(mDropTargetBar); 120006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung mDropTargetBarAnimator.setInterpolator(sAccelerateInterpolator); 121006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung mDropTargetBarAnimator.addListener(new AnimatorListenerAdapter() { 122006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung @Override 123006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung public void onAnimationStart(Animator animation) { 124006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung // Ensure that the view is visible for the animation 125006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung mDropTargetBar.setVisibility(View.VISIBLE); 126006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung } 1274c98d9235d164680186180974719f551cf935d08Winson Chung 128006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung @Override 129006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung public void onAnimationEnd(Animator animation) { 130006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung if (mDropTargetBar != null) { 131006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung AlphaUpdateListener.updateVisibility(mDropTargetBar, mAccessibilityEnabled); 132006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung } 13319e3347e47f51367dc7ba1919eda6e87503b898eMichael Jurka } 134006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung }); 135f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 136dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung 137006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung public void setQsbSearchBar(View qsb) { 138006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung mQSB = qsb; 139006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung if (mQSB != null) { 140006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung // Update the search ber animation 141006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung mQSBSearchBarAnimator = new LauncherViewPropertyAnimator(mQSB); 142006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung mQSBSearchBarAnimator.setInterpolator(sAccelerateInterpolator); 143006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung mQSBSearchBarAnimator.addListener(new AnimatorListenerAdapter() { 144006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung @Override 145006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung public void onAnimationStart(Animator animation) { 146006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung // Ensure that the view is visible for the animation 147006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung if (mQSB != null) { 148006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung mQSB.setVisibility(View.VISIBLE); 149006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung } 150006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung } 151006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung 152006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung @Override 153006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung public void onAnimationEnd(Animator animation) { 154006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung if (mQSB != null) { 155006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung AlphaUpdateListener.updateVisibility(mQSB, mAccessibilityEnabled); 156006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung } 157006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung } 158006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung }); 159f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } else { 160006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung mQSBSearchBarAnimator = null; 161f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 162f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 163f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 164dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung /** 165006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung * Animates the current search bar state to a new state. If the {@param duration} is 0, then 166006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung * the state is applied immediately. 167f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung */ 168006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung public void animateToState(State newState, int duration) { 169006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung if (mState != newState) { 170006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung mState = newState; 171006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung 172006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung // Update the accessibility state 173006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung AccessibilityManager am = (AccessibilityManager) 174006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung getContext().getSystemService(Context.ACCESSIBILITY_SERVICE); 175006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung mAccessibilityEnabled = am.isEnabled(); 176006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung 177006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung animateViewAlpha(mQSBSearchBarAnimator, mQSB, newState.getSearchBarAlpha(), 178006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung duration); 179006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung animateViewAlpha(mDropTargetBarAnimator, mDropTargetBar, newState.getDropTargetBarAlpha(), 180006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung duration); 181006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung } 182f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 183dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung 184dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung /** 185006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung * Convenience method to animate the alpha of a view using hardware layers. 186dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung */ 187006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung private void animateViewAlpha(LauncherViewPropertyAnimator animator, View v, float alpha, 188006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung int duration) { 18981c5f7e39727085e1a8915cc36e9cbf2bb085890Winson if (v == null) { 19081c5f7e39727085e1a8915cc36e9cbf2bb085890Winson return; 19181c5f7e39727085e1a8915cc36e9cbf2bb085890Winson } 19281c5f7e39727085e1a8915cc36e9cbf2bb085890Winson 19381c5f7e39727085e1a8915cc36e9cbf2bb085890Winson animator.cancel(); 19481c5f7e39727085e1a8915cc36e9cbf2bb085890Winson if (Float.compare(v.getAlpha(), alpha) != 0) { 195006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung if (duration > 0) { 196006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung animator.alpha(alpha).withLayer().setDuration(duration).start(); 197006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung } else { 198006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung v.setAlpha(alpha); 199006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung AlphaUpdateListener.updateVisibility(v, mAccessibilityEnabled); 200006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung } 201006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung } 202f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 203f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 204f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung /* 2054c98d9235d164680186180974719f551cf935d08Winson Chung * DragController.DragListener implementation 2064c98d9235d164680186180974719f551cf935d08Winson Chung */ 2074c98d9235d164680186180974719f551cf935d08Winson Chung @Override 2084c98d9235d164680186180974719f551cf935d08Winson Chung public void onDragStart(DragSource source, Object info, int dragAction) { 209006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung animateToState(State.DROP_TARGET, DEFAULT_DRAG_FADE_DURATION); 210c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen } 211c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen 212006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung /** 213006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung * This is called to defer hiding the delete drop target until the drop animation has completed, 214006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung * instead of hiding immediately when the drag has ended. 215006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung */ 216d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen public void deferOnDragEnd() { 217d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen mDeferOnDragEnd = true; 218d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen } 219d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen 2204c98d9235d164680186180974719f551cf935d08Winson Chung @Override 2214c98d9235d164680186180974719f551cf935d08Winson Chung public void onDragEnd() { 222d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen if (!mDeferOnDragEnd) { 223006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung animateToState(State.SEARCH_BAR, DEFAULT_DRAG_FADE_DURATION); 224d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen } else { 225d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen mDeferOnDragEnd = false; 226f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 2274c98d9235d164680186180974719f551cf935d08Winson Chung } 228c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung 229006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung /** 230006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung * @return the bounds of the QSB search bar. 231006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung */ 232cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood public Rect getSearchBarBounds() { 233006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung if (mQSB != null) { 234cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood final int[] pos = new int[2]; 235006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung mQSB.getLocationOnScreen(pos); 236cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood 237cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood final Rect rect = new Rect(); 238629758ff081a354e43aa409159211210ee4ee85aMichael Jurka rect.left = pos[0]; 239629758ff081a354e43aa409159211210ee4ee85aMichael Jurka rect.top = pos[1]; 240006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung rect.right = pos[0] + mQSB.getWidth(); 241006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung rect.bottom = pos[1] + mQSB.getHeight(); 242cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood return rect; 243cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood } else { 244cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood return null; 245cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood } 246cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood } 2471a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal 2481a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal public void enableAccessibleDrag(boolean enable) { 249006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung if (mQSB != null) { 250006ee269ba2e9946a83b42f96d4a0296254cba4aWinson Chung mQSB.setVisibility(enable ? View.GONE : View.VISIBLE); 2511a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal } 2521a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal mInfoDropTarget.enableAccessibleDrag(enable); 2531a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal mDeleteDropTarget.enableAccessibleDrag(enable); 2541a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal mUninstallDropTarget.enableAccessibleDrag(enable); 2551a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal } 2564c98d9235d164680186180974719f551cf935d08Winson Chung} 257