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