• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.launcher2;
18 
19 import android.animation.Animator;
20 import android.animation.AnimatorListenerAdapter;
21 import android.animation.AnimatorSet;
22 import android.animation.ObjectAnimator;
23 import android.content.Context;
24 import android.graphics.drawable.Drawable;
25 import android.util.AttributeSet;
26 import android.view.View;
27 import android.view.animation.AccelerateInterpolator;
28 import android.view.animation.DecelerateInterpolator;
29 import android.widget.FrameLayout;
30 
31 import com.android.launcher.R;
32 
33 /*
34  * Ths bar will manage the transition between the QSB search bar and the delete drop
35  * targets so that each of the individual IconDropTargets don't have to.
36  */
37 public class SearchDropTargetBar extends FrameLayout implements DragController.DragListener {
38 
39     private static final int sTransitionInDuration = 200;
40     private static final int sTransitionOutDuration = 175;
41 
42     private AnimatorSet mDropTargetBarFadeInAnim;
43     private AnimatorSet mDropTargetBarFadeOutAnim;
44     private ObjectAnimator mQSBSearchBarFadeInAnim;
45     private ObjectAnimator mQSBSearchBarFadeOutAnim;
46 
47     private boolean mIsSearchBarHidden;
48     private View mQSBSearchBar;
49     private View mDropTargetBar;
50     private ButtonDropTarget mInfoDropTarget;
51     private ButtonDropTarget mDeleteDropTarget;
52     private int mBarHeight;
53     private boolean mDeferOnDragEnd = false;
54 
55     private Drawable mPreviousBackground;
56 
SearchDropTargetBar(Context context, AttributeSet attrs)57     public SearchDropTargetBar(Context context, AttributeSet attrs) {
58         this(context, attrs, 0);
59     }
60 
SearchDropTargetBar(Context context, AttributeSet attrs, int defStyle)61     public SearchDropTargetBar(Context context, AttributeSet attrs, int defStyle) {
62         super(context, attrs, defStyle);
63     }
64 
setup(Launcher launcher, DragController dragController)65     public void setup(Launcher launcher, DragController dragController) {
66         dragController.addDragListener(this);
67         dragController.addDragListener(mInfoDropTarget);
68         dragController.addDragListener(mDeleteDropTarget);
69         dragController.addDropTarget(mInfoDropTarget);
70         dragController.addDropTarget(mDeleteDropTarget);
71         mInfoDropTarget.setLauncher(launcher);
72         mDeleteDropTarget.setLauncher(launcher);
73     }
74 
75     @Override
onFinishInflate()76     protected void onFinishInflate() {
77         super.onFinishInflate();
78 
79         // Get the individual components
80         mQSBSearchBar = findViewById(R.id.qsb_search_bar);
81         mDropTargetBar = findViewById(R.id.drag_target_bar);
82         mInfoDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.info_target_text);
83         mDeleteDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.delete_target_text);
84         mBarHeight = getResources().getDimensionPixelSize(R.dimen.qsb_bar_height);
85 
86         mInfoDropTarget.setSearchDropTargetBar(this);
87         mDeleteDropTarget.setSearchDropTargetBar(this);
88 
89         boolean enableDropDownDropTargets =
90             getResources().getBoolean(R.bool.config_useDropTargetDownTransition);
91 
92         // Create the various fade animations
93         mDropTargetBar.setAlpha(0f);
94         ObjectAnimator fadeInAlphaAnim = ObjectAnimator.ofFloat(mDropTargetBar, "alpha", 1f);
95         fadeInAlphaAnim.setInterpolator(new DecelerateInterpolator());
96         mDropTargetBarFadeInAnim = new AnimatorSet();
97         AnimatorSet.Builder fadeInAnimators = mDropTargetBarFadeInAnim.play(fadeInAlphaAnim);
98         if (enableDropDownDropTargets) {
99             mDropTargetBar.setTranslationY(-mBarHeight);
100             fadeInAnimators.with(ObjectAnimator.ofFloat(mDropTargetBar, "translationY", 0f));
101         }
102         mDropTargetBarFadeInAnim.setDuration(sTransitionInDuration);
103         mDropTargetBarFadeInAnim.addListener(new AnimatorListenerAdapter() {
104             @Override
105             public void onAnimationStart(Animator animation) {
106                 mDropTargetBar.setVisibility(View.VISIBLE);
107             }
108         });
109         ObjectAnimator fadeOutAlphaAnim = ObjectAnimator.ofFloat(mDropTargetBar, "alpha", 0f);
110         fadeOutAlphaAnim.setInterpolator(new AccelerateInterpolator());
111         mDropTargetBarFadeOutAnim = new AnimatorSet();
112         AnimatorSet.Builder fadeOutAnimators = mDropTargetBarFadeOutAnim.play(fadeOutAlphaAnim);
113         if (enableDropDownDropTargets) {
114             fadeOutAnimators.with(ObjectAnimator.ofFloat(mDropTargetBar, "translationY",
115                     -mBarHeight));
116         }
117         mDropTargetBarFadeOutAnim.setDuration(sTransitionOutDuration);
118         mDropTargetBarFadeOutAnim.addListener(new AnimatorListenerAdapter() {
119             @Override
120             public void onAnimationEnd(Animator animation) {
121                 mDropTargetBar.setVisibility(View.GONE);
122                 mDropTargetBar.setLayerType(View.LAYER_TYPE_NONE, null);
123             }
124         });
125         mQSBSearchBarFadeInAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "alpha", 1f);
126         mQSBSearchBarFadeInAnim.setDuration(sTransitionInDuration);
127         mQSBSearchBarFadeInAnim.addListener(new AnimatorListenerAdapter() {
128             @Override
129             public void onAnimationStart(Animator animation) {
130                 mQSBSearchBar.setVisibility(View.VISIBLE);
131             }
132         });
133         mQSBSearchBarFadeOutAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "alpha", 0f);
134         mQSBSearchBarFadeOutAnim.setDuration(sTransitionOutDuration);
135         mQSBSearchBarFadeOutAnim.addListener(new AnimatorListenerAdapter() {
136             @Override
137             public void onAnimationEnd(Animator animation) {
138                 mQSBSearchBar.setVisibility(View.GONE);
139             }
140         });
141     }
142 
cancelAnimations()143     private void cancelAnimations() {
144         mDropTargetBarFadeInAnim.cancel();
145         mDropTargetBarFadeOutAnim.cancel();
146         mQSBSearchBarFadeInAnim.cancel();
147         mQSBSearchBarFadeOutAnim.cancel();
148     }
149 
150     /*
151      * Shows and hides the search bar.
152      */
showSearchBar(boolean animated)153     public void showSearchBar(boolean animated) {
154         cancelAnimations();
155         if (animated) {
156             mQSBSearchBarFadeInAnim.start();
157         } else {
158             mQSBSearchBar.setVisibility(View.VISIBLE);
159             mQSBSearchBar.setAlpha(1f);
160         }
161         mIsSearchBarHidden = false;
162     }
hideSearchBar(boolean animated)163     public void hideSearchBar(boolean animated) {
164         cancelAnimations();
165         if (animated) {
166             mQSBSearchBarFadeOutAnim.start();
167         } else {
168             mQSBSearchBar.setVisibility(View.GONE);
169             mQSBSearchBar.setAlpha(0f);
170         }
171         mIsSearchBarHidden = true;
172     }
173 
174     /*
175      * Gets various transition durations.
176      */
getTransitionInDuration()177     public int getTransitionInDuration() {
178         return sTransitionInDuration;
179     }
getTransitionOutDuration()180     public int getTransitionOutDuration() {
181         return sTransitionOutDuration;
182     }
183 
184     /*
185      * DragController.DragListener implementation
186      */
187     @Override
onDragStart(DragSource source, Object info, int dragAction)188     public void onDragStart(DragSource source, Object info, int dragAction) {
189         // Animate out the QSB search bar, and animate in the drop target bar
190         mDropTargetBar.setLayerType(View.LAYER_TYPE_HARDWARE, null);
191         mDropTargetBar.buildLayer();
192         mDropTargetBarFadeOutAnim.cancel();
193         mDropTargetBarFadeInAnim.start();
194         if (!mIsSearchBarHidden) {
195             mQSBSearchBarFadeInAnim.cancel();
196             mQSBSearchBarFadeOutAnim.start();
197         }
198     }
199 
deferOnDragEnd()200     public void deferOnDragEnd() {
201         mDeferOnDragEnd = true;
202     }
203 
204     @Override
onDragEnd()205     public void onDragEnd() {
206         if (!mDeferOnDragEnd) {
207             // Restore the QSB search bar, and animate out the drop target bar
208             mDropTargetBarFadeInAnim.cancel();
209             mDropTargetBarFadeOutAnim.start();
210             if (!mIsSearchBarHidden) {
211                 mQSBSearchBarFadeOutAnim.cancel();
212                 mQSBSearchBarFadeInAnim.start();
213             }
214         } else {
215             mDeferOnDragEnd = false;
216         }
217     }
218 
onSearchPackagesChanged(boolean searchVisible, boolean voiceVisible)219     public void onSearchPackagesChanged(boolean searchVisible, boolean voiceVisible) {
220         if (mQSBSearchBar != null) {
221             Drawable bg = mQSBSearchBar.getBackground();
222             if (bg != null && (!searchVisible && !voiceVisible)) {
223                 // Save the background and disable it
224                 mPreviousBackground = bg;
225                 mQSBSearchBar.setBackgroundResource(0);
226             } else if (mPreviousBackground != null && (searchVisible || voiceVisible)) {
227                 // Restore the background
228                 mQSBSearchBar.setBackgroundDrawable(mPreviousBackground);
229             }
230         }
231     }
232 }
233