blob: 76d70761812b09ff05c10acfbb4d07c3af110be7 [file] [log] [blame]
Winson Chung4c98d922011-05-31 16:50:48 -07001/*
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
17package com.android.launcher2;
18
Winson Chung201bc822011-06-20 15:41:53 -070019import android.animation.Animator;
20import android.animation.AnimatorListenerAdapter;
Winson Chunga62e9fd2011-07-11 15:20:48 -070021import android.animation.AnimatorSet;
Winson Chung201bc822011-06-20 15:41:53 -070022import android.animation.ObjectAnimator;
Winson Chung4c98d922011-05-31 16:50:48 -070023import android.content.Context;
Mathew Inwoodcf7f63b2011-10-13 11:31:38 +010024import android.graphics.Rect;
Winson Chungc51db6a2011-10-05 11:44:49 -070025import android.graphics.drawable.Drawable;
Winson Chung4c98d922011-05-31 16:50:48 -070026import android.util.AttributeSet;
27import android.view.View;
Winson Chunga62e9fd2011-07-11 15:20:48 -070028import android.view.animation.AccelerateInterpolator;
29import android.view.animation.DecelerateInterpolator;
Winson Chung4c98d922011-05-31 16:50:48 -070030import android.widget.FrameLayout;
31
32import com.android.launcher.R;
33
34/*
35 * Ths bar will manage the transition between the QSB search bar and the delete drop
36 * targets so that each of the individual IconDropTargets don't have to.
37 */
38public class SearchDropTargetBar extends FrameLayout implements DragController.DragListener {
39
Winson Chunga62e9fd2011-07-11 15:20:48 -070040 private static final int sTransitionInDuration = 200;
41 private static final int sTransitionOutDuration = 175;
Winson Chung4c98d922011-05-31 16:50:48 -070042
Winson Chunga62e9fd2011-07-11 15:20:48 -070043 private AnimatorSet mDropTargetBarFadeInAnim;
44 private AnimatorSet mDropTargetBarFadeOutAnim;
Winson Chung201bc822011-06-20 15:41:53 -070045 private ObjectAnimator mQSBSearchBarFadeInAnim;
46 private ObjectAnimator mQSBSearchBarFadeOutAnim;
47
Winson Chungf0ea4d32011-06-06 14:27:16 -070048 private boolean mIsSearchBarHidden;
Winson Chung4c98d922011-05-31 16:50:48 -070049 private View mQSBSearchBar;
50 private View mDropTargetBar;
Winson Chung61fa4192011-06-12 15:15:29 -070051 private ButtonDropTarget mInfoDropTarget;
52 private ButtonDropTarget mDeleteDropTarget;
Winson Chunga62e9fd2011-07-11 15:20:48 -070053 private int mBarHeight;
Adam Cohend4d7aa52011-07-19 21:47:37 -070054 private boolean mDeferOnDragEnd = false;
Winson Chung4c98d922011-05-31 16:50:48 -070055
Winson Chungc51db6a2011-10-05 11:44:49 -070056 private Drawable mPreviousBackground;
57
Winson Chung4c98d922011-05-31 16:50:48 -070058 public SearchDropTargetBar(Context context, AttributeSet attrs) {
59 this(context, attrs, 0);
60 }
61
62 public SearchDropTargetBar(Context context, AttributeSet attrs, int defStyle) {
63 super(context, attrs, defStyle);
64 }
65
66 public void setup(Launcher launcher, DragController dragController) {
67 dragController.addDragListener(this);
68 dragController.addDragListener(mInfoDropTarget);
69 dragController.addDragListener(mDeleteDropTarget);
70 dragController.addDropTarget(mInfoDropTarget);
71 dragController.addDropTarget(mDeleteDropTarget);
Winson Chung043f2af2012-03-01 16:09:54 -080072 dragController.setFlingToDeleteDropTarget(mDeleteDropTarget);
Winson Chung4c98d922011-05-31 16:50:48 -070073 mInfoDropTarget.setLauncher(launcher);
74 mDeleteDropTarget.setLauncher(launcher);
75 }
76
77 @Override
78 protected void onFinishInflate() {
79 super.onFinishInflate();
80
81 // Get the individual components
82 mQSBSearchBar = findViewById(R.id.qsb_search_bar);
83 mDropTargetBar = findViewById(R.id.drag_target_bar);
Winson Chunga6427b12011-07-27 10:53:39 -070084 mInfoDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.info_target_text);
85 mDeleteDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.delete_target_text);
Winson Chunga62e9fd2011-07-11 15:20:48 -070086 mBarHeight = getResources().getDimensionPixelSize(R.dimen.qsb_bar_height);
87
Adam Cohend4d7aa52011-07-19 21:47:37 -070088 mInfoDropTarget.setSearchDropTargetBar(this);
89 mDeleteDropTarget.setSearchDropTargetBar(this);
90
Winson Chunga62e9fd2011-07-11 15:20:48 -070091 boolean enableDropDownDropTargets =
92 getResources().getBoolean(R.bool.config_useDropTargetDownTransition);
Winson Chung201bc822011-06-20 15:41:53 -070093
94 // Create the various fade animations
Winson Chunga62e9fd2011-07-11 15:20:48 -070095 mDropTargetBar.setAlpha(0f);
96 ObjectAnimator fadeInAlphaAnim = ObjectAnimator.ofFloat(mDropTargetBar, "alpha", 1f);
97 fadeInAlphaAnim.setInterpolator(new DecelerateInterpolator());
98 mDropTargetBarFadeInAnim = new AnimatorSet();
99 AnimatorSet.Builder fadeInAnimators = mDropTargetBarFadeInAnim.play(fadeInAlphaAnim);
100 if (enableDropDownDropTargets) {
101 mDropTargetBar.setTranslationY(-mBarHeight);
102 fadeInAnimators.with(ObjectAnimator.ofFloat(mDropTargetBar, "translationY", 0f));
103 }
Winson Chung201bc822011-06-20 15:41:53 -0700104 mDropTargetBarFadeInAnim.setDuration(sTransitionInDuration);
105 mDropTargetBarFadeInAnim.addListener(new AnimatorListenerAdapter() {
106 @Override
107 public void onAnimationStart(Animator animation) {
108 mDropTargetBar.setVisibility(View.VISIBLE);
109 }
110 });
Winson Chunga62e9fd2011-07-11 15:20:48 -0700111 ObjectAnimator fadeOutAlphaAnim = ObjectAnimator.ofFloat(mDropTargetBar, "alpha", 0f);
112 fadeOutAlphaAnim.setInterpolator(new AccelerateInterpolator());
113 mDropTargetBarFadeOutAnim = new AnimatorSet();
114 AnimatorSet.Builder fadeOutAnimators = mDropTargetBarFadeOutAnim.play(fadeOutAlphaAnim);
115 if (enableDropDownDropTargets) {
116 fadeOutAnimators.with(ObjectAnimator.ofFloat(mDropTargetBar, "translationY",
117 -mBarHeight));
118 }
Winson Chung201bc822011-06-20 15:41:53 -0700119 mDropTargetBarFadeOutAnim.setDuration(sTransitionOutDuration);
120 mDropTargetBarFadeOutAnim.addListener(new AnimatorListenerAdapter() {
121 @Override
122 public void onAnimationEnd(Animator animation) {
Michael Jurka81efbad2011-11-03 13:50:45 -0700123 mDropTargetBar.setVisibility(View.INVISIBLE);
Winson Chunga62e9fd2011-07-11 15:20:48 -0700124 mDropTargetBar.setLayerType(View.LAYER_TYPE_NONE, null);
Winson Chung201bc822011-06-20 15:41:53 -0700125 }
126 });
127 mQSBSearchBarFadeInAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "alpha", 1f);
128 mQSBSearchBarFadeInAnim.setDuration(sTransitionInDuration);
129 mQSBSearchBarFadeInAnim.addListener(new AnimatorListenerAdapter() {
130 @Override
131 public void onAnimationStart(Animator animation) {
132 mQSBSearchBar.setVisibility(View.VISIBLE);
Michael Jurkabed61d22012-02-14 22:51:29 -0800133 mQSBSearchBar.setLayerType(View.LAYER_TYPE_HARDWARE, null);
134 }
135
136 @Override
137 public void onAnimationEnd(Animator animation) {
138 mQSBSearchBar.setLayerType(View.LAYER_TYPE_NONE, null);
Winson Chung201bc822011-06-20 15:41:53 -0700139 }
140 });
141 mQSBSearchBarFadeOutAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "alpha", 0f);
142 mQSBSearchBarFadeOutAnim.setDuration(sTransitionOutDuration);
143 mQSBSearchBarFadeOutAnim.addListener(new AnimatorListenerAdapter() {
144 @Override
Michael Jurkabed61d22012-02-14 22:51:29 -0800145 public void onAnimationStart(Animator animation) {
146 mQSBSearchBar.setLayerType(View.LAYER_TYPE_HARDWARE, null);
147 }
148
149 @Override
Winson Chung201bc822011-06-20 15:41:53 -0700150 public void onAnimationEnd(Animator animation) {
Michael Jurka81efbad2011-11-03 13:50:45 -0700151 mQSBSearchBar.setVisibility(View.INVISIBLE);
Michael Jurkabed61d22012-02-14 22:51:29 -0800152 mQSBSearchBar.setLayerType(View.LAYER_TYPE_NONE, null);
Winson Chung201bc822011-06-20 15:41:53 -0700153 }
154 });
155 }
156
Winson Chung043f2af2012-03-01 16:09:54 -0800157 public void finishAnimations() {
158 mDropTargetBarFadeInAnim.end();
159 mDropTargetBarFadeOutAnim.end();
160 mQSBSearchBarFadeInAnim.end();
161 mQSBSearchBarFadeOutAnim.end();
162 }
163
Winson Chung201bc822011-06-20 15:41:53 -0700164 private void cancelAnimations() {
165 mDropTargetBarFadeInAnim.cancel();
166 mDropTargetBarFadeOutAnim.cancel();
167 mQSBSearchBarFadeInAnim.cancel();
168 mQSBSearchBarFadeOutAnim.cancel();
Winson Chung4c98d922011-05-31 16:50:48 -0700169 }
170
171 /*
Winson Chungf0ea4d32011-06-06 14:27:16 -0700172 * Shows and hides the search bar.
173 */
174 public void showSearchBar(boolean animated) {
Winson Chung201bc822011-06-20 15:41:53 -0700175 cancelAnimations();
Winson Chungf0ea4d32011-06-06 14:27:16 -0700176 if (animated) {
Winson Chung201bc822011-06-20 15:41:53 -0700177 mQSBSearchBarFadeInAnim.start();
Winson Chungf0ea4d32011-06-06 14:27:16 -0700178 } else {
Winson Chung201bc822011-06-20 15:41:53 -0700179 mQSBSearchBar.setVisibility(View.VISIBLE);
Winson Chungf0ea4d32011-06-06 14:27:16 -0700180 mQSBSearchBar.setAlpha(1f);
181 }
182 mIsSearchBarHidden = false;
183 }
184 public void hideSearchBar(boolean animated) {
Winson Chung201bc822011-06-20 15:41:53 -0700185 cancelAnimations();
Winson Chungf0ea4d32011-06-06 14:27:16 -0700186 if (animated) {
Winson Chung201bc822011-06-20 15:41:53 -0700187 mQSBSearchBarFadeOutAnim.start();
Winson Chungf0ea4d32011-06-06 14:27:16 -0700188 } else {
Michael Jurka81efbad2011-11-03 13:50:45 -0700189 mQSBSearchBar.setVisibility(View.INVISIBLE);
Winson Chungf0ea4d32011-06-06 14:27:16 -0700190 mQSBSearchBar.setAlpha(0f);
191 }
192 mIsSearchBarHidden = true;
193 }
194
195 /*
196 * Gets various transition durations.
197 */
198 public int getTransitionInDuration() {
199 return sTransitionInDuration;
200 }
201 public int getTransitionOutDuration() {
202 return sTransitionOutDuration;
203 }
204
205 /*
Winson Chung4c98d922011-05-31 16:50:48 -0700206 * DragController.DragListener implementation
207 */
208 @Override
209 public void onDragStart(DragSource source, Object info, int dragAction) {
210 // Animate out the QSB search bar, and animate in the drop target bar
Winson Chunga62e9fd2011-07-11 15:20:48 -0700211 mDropTargetBar.setLayerType(View.LAYER_TYPE_HARDWARE, null);
212 mDropTargetBar.buildLayer();
213 mDropTargetBarFadeOutAnim.cancel();
Winson Chung201bc822011-06-20 15:41:53 -0700214 mDropTargetBarFadeInAnim.start();
Winson Chungf0ea4d32011-06-06 14:27:16 -0700215 if (!mIsSearchBarHidden) {
Winson Chunga62e9fd2011-07-11 15:20:48 -0700216 mQSBSearchBarFadeInAnim.cancel();
Winson Chung201bc822011-06-20 15:41:53 -0700217 mQSBSearchBarFadeOutAnim.start();
Winson Chungf0ea4d32011-06-06 14:27:16 -0700218 }
Winson Chung4c98d922011-05-31 16:50:48 -0700219 }
220
Adam Cohend4d7aa52011-07-19 21:47:37 -0700221 public void deferOnDragEnd() {
222 mDeferOnDragEnd = true;
223 }
224
Winson Chung4c98d922011-05-31 16:50:48 -0700225 @Override
226 public void onDragEnd() {
Adam Cohend4d7aa52011-07-19 21:47:37 -0700227 if (!mDeferOnDragEnd) {
228 // Restore the QSB search bar, and animate out the drop target bar
229 mDropTargetBarFadeInAnim.cancel();
230 mDropTargetBarFadeOutAnim.start();
231 if (!mIsSearchBarHidden) {
232 mQSBSearchBarFadeOutAnim.cancel();
233 mQSBSearchBarFadeInAnim.start();
234 }
235 } else {
236 mDeferOnDragEnd = false;
Winson Chungf0ea4d32011-06-06 14:27:16 -0700237 }
Winson Chung4c98d922011-05-31 16:50:48 -0700238 }
Winson Chungc51db6a2011-10-05 11:44:49 -0700239
240 public void onSearchPackagesChanged(boolean searchVisible, boolean voiceVisible) {
241 if (mQSBSearchBar != null) {
242 Drawable bg = mQSBSearchBar.getBackground();
243 if (bg != null && (!searchVisible && !voiceVisible)) {
244 // Save the background and disable it
245 mPreviousBackground = bg;
246 mQSBSearchBar.setBackgroundResource(0);
247 } else if (mPreviousBackground != null && (searchVisible || voiceVisible)) {
248 // Restore the background
249 mQSBSearchBar.setBackgroundDrawable(mPreviousBackground);
250 }
251 }
252 }
Mathew Inwoodcf7f63b2011-10-13 11:31:38 +0100253
254 public Rect getSearchBarBounds() {
255 if (mQSBSearchBar != null) {
256 final float appScale = mQSBSearchBar.getContext().getResources()
257 .getCompatibilityInfo().applicationScale;
258 final int[] pos = new int[2];
259 mQSBSearchBar.getLocationOnScreen(pos);
260
261 final Rect rect = new Rect();
262 rect.left = (int) (pos[0] * appScale + 0.5f);
263 rect.top = (int) (pos[1] * appScale + 0.5f);
264 rect.right = (int) ((pos[0] + mQSBSearchBar.getWidth()) * appScale + 0.5f);
265 rect.bottom = (int) ((pos[1] + mQSBSearchBar.getHeight()) * appScale + 0.5f);
266 return rect;
267 } else {
268 return null;
269 }
270 }
Winson Chung4c98d922011-05-31 16:50:48 -0700271}