11743ac469113301f6cf0e7c2e4fff4fb16812bbbTony Wickham/* 21743ac469113301f6cf0e7c2e4fff4fb16812bbbTony Wickham * Copyright (C) 2016 The Android Open Source Project 31743ac469113301f6cf0e7c2e4fff4fb16812bbbTony Wickham * 41743ac469113301f6cf0e7c2e4fff4fb16812bbbTony Wickham * Licensed under the Apache License, Version 2.0 (the "License"); 51743ac469113301f6cf0e7c2e4fff4fb16812bbbTony Wickham * you may not use this file except in compliance with the License. 61743ac469113301f6cf0e7c2e4fff4fb16812bbbTony Wickham * You may obtain a copy of the License at 71743ac469113301f6cf0e7c2e4fff4fb16812bbbTony Wickham * 81743ac469113301f6cf0e7c2e4fff4fb16812bbbTony Wickham * http://www.apache.org/licenses/LICENSE-2.0 91743ac469113301f6cf0e7c2e4fff4fb16812bbbTony Wickham * 101743ac469113301f6cf0e7c2e4fff4fb16812bbbTony Wickham * Unless required by applicable law or agreed to in writing, software 111743ac469113301f6cf0e7c2e4fff4fb16812bbbTony Wickham * distributed under the License is distributed on an "AS IS" BASIS, 121743ac469113301f6cf0e7c2e4fff4fb16812bbbTony Wickham * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131743ac469113301f6cf0e7c2e4fff4fb16812bbbTony Wickham * See the License for the specific language governing permissions and 141743ac469113301f6cf0e7c2e4fff4fb16812bbbTony Wickham * limitations under the License. 151743ac469113301f6cf0e7c2e4fff4fb16812bbbTony Wickham */ 161743ac469113301f6cf0e7c2e4fff4fb16812bbbTony Wickham 17dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickhampackage com.android.launcher3; 18dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham 19dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickhamimport android.animation.Animator; 20dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickhamimport android.animation.AnimatorListenerAdapter; 21dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickhamimport android.animation.ObjectAnimator; 22dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickhamimport android.animation.ValueAnimator; 23dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickhamimport android.util.Log; 24dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickhamimport android.view.View; 25ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyalimport android.view.animation.LinearInterpolator; 26dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham 279e76f682f3e52afa1f11172564b883c7dfda5063Sunny Goyalimport com.android.launcher3.anim.AnimationLayerSet; 286c46a6d324310bd2fc0ea223c9782ba6394512e7Sunny Goyalimport com.android.launcher3.userevent.nano.LauncherLogProto.Action; 296c46a6d324310bd2fc0ea223c9782ba6394512e7Sunny Goyalimport com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; 30c4de137793b5031523fe9e20ba6e3817d695afebJon Miranda 31dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickhamimport static com.android.launcher3.Workspace.State.NORMAL; 32dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickhamimport static com.android.launcher3.Workspace.State.OVERVIEW; 33dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham 34dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham/** 35dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * Manages the animations that play as the user pinches to/from overview mode. 36dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * 37dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * It will look like this pinching in: 38dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * - Workspace scales down 39dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * - At some threshold 1, hotseat and QSB fade out (full animation) 40dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * - At a later threshold 2, panel buttons fade in and scrim fades in 41dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * - At a final threshold 3, snap to overview 42dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * 43dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * Pinching out: 44dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * - Workspace scales up 45dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * - At threshold 1, panel buttons fade out 46dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * - At threshold 2, hotseat and QSB fade in and scrim fades out 47dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * - At threshold 3, snap to workspace 48dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * 49dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * @see PinchToOverviewListener 50dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * @see PinchThresholdManager 51dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham */ 52dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickhampublic class PinchAnimationManager { 53dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham private static final String TAG = "PinchAnimationManager"; 54dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham 55dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham private static final int THRESHOLD_ANIM_DURATION = 150; 56ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal private static final LinearInterpolator INTERPOLATOR = new LinearInterpolator(); 57dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham 586178f13e2d1f0c1a89cea74538b51993ef3439e3Sunny Goyal private static final int INDEX_HOTSEAT = 0; 59966d901af0fd319aa2b62d6abccc5ac728e68423Sunny Goyal private static final int INDEX_OVERVIEW_PANEL_BUTTONS = 1; 60966d901af0fd319aa2b62d6abccc5ac728e68423Sunny Goyal private static final int INDEX_SCRIM = 2; 61ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal 62966d901af0fd319aa2b62d6abccc5ac728e68423Sunny Goyal private final Animator[] mAnimators = new Animator[3]; 63ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal 64dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham private Launcher mLauncher; 65dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham private Workspace mWorkspace; 66dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham 67dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham private float mOverviewScale; 68dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham private float mOverviewTranslationY; 69dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham private int mNormalOverviewTransitionDuration; 70dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham private boolean mIsAnimating; 71dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham 72dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham public PinchAnimationManager(Launcher launcher) { 73dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham mLauncher = launcher; 74dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham mWorkspace = launcher.mWorkspace; 75dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham 76dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham mOverviewScale = mWorkspace.getOverviewModeShrinkFactor(); 77dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham mOverviewTranslationY = mWorkspace.getOverviewModeTranslationY(); 78dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham mNormalOverviewTransitionDuration = mWorkspace.getStateTransitionAnimation() 79dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham .mOverviewTransitionTime; 80dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } 81dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham 82dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham public int getNormalOverviewTransitionDuration() { 83dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham return mNormalOverviewTransitionDuration; 84dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } 85dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham 86dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham /** 87dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * Interpolate from {@param currentProgress} to {@param toProgress}, calling 88dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * {@link #setAnimationProgress(float)} throughout the duration. If duration is -1, 89dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * the default overview transition duration is used. 90dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham */ 91dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham public void animateToProgress(float currentProgress, float toProgress, int duration, 92dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham final PinchThresholdManager thresholdManager) { 93dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham if (duration == -1) { 94dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham duration = mNormalOverviewTransitionDuration; 95dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } 96dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham ValueAnimator animator = ValueAnimator.ofFloat(currentProgress, toProgress); 97dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 98f898b970cc9130d629d4bc969222aaa96a8a013aTony Wickham @Override 99f898b970cc9130d629d4bc969222aaa96a8a013aTony Wickham public void onAnimationUpdate(ValueAnimator animation) { 100f898b970cc9130d629d4bc969222aaa96a8a013aTony Wickham float pinchProgress = (Float) animation.getAnimatedValue(); 101f898b970cc9130d629d4bc969222aaa96a8a013aTony Wickham setAnimationProgress(pinchProgress); 102f898b970cc9130d629d4bc969222aaa96a8a013aTony Wickham thresholdManager.updateAndAnimatePassedThreshold(pinchProgress, 103f898b970cc9130d629d4bc969222aaa96a8a013aTony Wickham PinchAnimationManager.this); 104f898b970cc9130d629d4bc969222aaa96a8a013aTony Wickham } 105f898b970cc9130d629d4bc969222aaa96a8a013aTony Wickham } 106dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham ); 107dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham animator.addListener(new AnimatorListenerAdapter() { 108dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham @Override 109dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham public void onAnimationEnd(Animator animation) { 110dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham mIsAnimating = false; 111dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham thresholdManager.reset(); 112db364379312e56a3a3905a54d0de783062a92a73Sunny Goyal mWorkspace.onEndStateTransition(); 113dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } 114dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham }); 115dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham animator.setDuration(duration).start(); 116dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham mIsAnimating = true; 117dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } 118dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham 119dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham public boolean isAnimating() { 120dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham return mIsAnimating; 121dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } 122dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham 123dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham /** 124dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * Animates to the specified progress. This should be called repeatedly throughout the pinch 125dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * gesture to run animations that interpolate throughout the gesture. 126dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * @param interpolatedProgress The progress from 0 to 1, where 0 is overview and 1 is workspace. 127dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham */ 128dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham public void setAnimationProgress(float interpolatedProgress) { 129dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham float interpolatedScale = interpolatedProgress * (1f - mOverviewScale) + mOverviewScale; 130dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham float interpolatedTranslationY = (1f - interpolatedProgress) * mOverviewTranslationY; 131dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham mWorkspace.setScaleX(interpolatedScale); 132dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham mWorkspace.setScaleY(interpolatedScale); 133dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham mWorkspace.setTranslationY(interpolatedTranslationY); 134dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham setOverviewPanelsAlpha(1f - interpolatedProgress, 0); 135dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } 136dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham 137dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham /** 138dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * Animates certain properties based on which threshold was passed, and in what direction. The 139dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * starting state must also be taken into account because the thresholds mean different things 140dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * when going from workspace to overview and vice versa. 141dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * @param threshold One of {@link PinchThresholdManager#THRESHOLD_ONE}, 142dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * {@link PinchThresholdManager#THRESHOLD_TWO}, or 143dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * {@link PinchThresholdManager#THRESHOLD_THREE} 144dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * @param startState {@link Workspace.State#NORMAL} or {@link Workspace.State#OVERVIEW}. 145dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham * @param goingTowards {@link Workspace.State#NORMAL} or {@link Workspace.State#OVERVIEW}. 146ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal * Note that this doesn't have to be the opposite of startState; 147dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham */ 148dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham public void animateThreshold(float threshold, Workspace.State startState, 149dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham Workspace.State goingTowards) { 150dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham if (threshold == PinchThresholdManager.THRESHOLD_ONE) { 151dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham if (startState == OVERVIEW) { 152dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham animateOverviewPanelButtons(goingTowards == OVERVIEW); 153dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } else if (startState == NORMAL) { 154857bfcf3247ef765e16ce595c10e4c1fa5c2a69bSunny Goyal animateHotseatAndQsb(goingTowards == NORMAL); 155dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } 156dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } else if (threshold == PinchThresholdManager.THRESHOLD_TWO) { 157dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham if (startState == OVERVIEW) { 158857bfcf3247ef765e16ce595c10e4c1fa5c2a69bSunny Goyal animateHotseatAndQsb(goingTowards == NORMAL); 159dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham animateScrim(goingTowards == OVERVIEW); 160dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } else if (startState == NORMAL) { 161dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham animateOverviewPanelButtons(goingTowards == OVERVIEW); 162dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham animateScrim(goingTowards == OVERVIEW); 163dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } 164dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } else if (threshold == PinchThresholdManager.THRESHOLD_THREE) { 165dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham // Passing threshold 3 ends the pinch and snaps to the new state. 166dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham if (startState == OVERVIEW && goingTowards == NORMAL) { 167c4de137793b5031523fe9e20ba6e3817d695afebJon Miranda mLauncher.getUserEventDispatcher().logActionOnContainer( 1686c46a6d324310bd2fc0ea223c9782ba6394512e7Sunny Goyal Action.Touch.PINCH, Action.Direction.NONE, 1696c46a6d324310bd2fc0ea223c9782ba6394512e7Sunny Goyal ContainerType.OVERVIEW, mWorkspace.getCurrentPage()); 170dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham mLauncher.showWorkspace(true); 171f898b970cc9130d629d4bc969222aaa96a8a013aTony Wickham mWorkspace.snapToPage(mWorkspace.getCurrentPage()); 172dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } else if (startState == NORMAL && goingTowards == OVERVIEW) { 173c4de137793b5031523fe9e20ba6e3817d695afebJon Miranda mLauncher.getUserEventDispatcher().logActionOnContainer( 1746c46a6d324310bd2fc0ea223c9782ba6394512e7Sunny Goyal Action.Touch.PINCH, Action.Direction.NONE, 1756c46a6d324310bd2fc0ea223c9782ba6394512e7Sunny Goyal ContainerType.WORKSPACE, mWorkspace.getCurrentPage()); 176dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham mLauncher.showOverviewMode(true); 177dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } 178dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } else { 179dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham Log.e(TAG, "Received unknown threshold to animate: " + threshold); 180dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } 181dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } 182dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham 183dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham private void setOverviewPanelsAlpha(float alpha, int duration) { 1849ccafbff26f5835ab9725d876d1bf7ccd08ccf84Sunny Goyal int childCount = mWorkspace.getChildCount(); 1859ccafbff26f5835ab9725d876d1bf7ccd08ccf84Sunny Goyal for (int i = 0; i < childCount; i++) { 1869ccafbff26f5835ab9725d876d1bf7ccd08ccf84Sunny Goyal final CellLayout cl = (CellLayout) mWorkspace.getChildAt(i); 187dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham if (duration == 0) { 1889ccafbff26f5835ab9725d876d1bf7ccd08ccf84Sunny Goyal cl.setBackgroundAlpha(alpha); 189dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } else { 1909ccafbff26f5835ab9725d876d1bf7ccd08ccf84Sunny Goyal ObjectAnimator.ofFloat(cl, "backgroundAlpha", alpha).setDuration(duration).start(); 191dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } 192dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } 193dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } 194dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham 195857bfcf3247ef765e16ce595c10e4c1fa5c2a69bSunny Goyal private void animateHotseatAndQsb(boolean show) { 1966178f13e2d1f0c1a89cea74538b51993ef3439e3Sunny Goyal startAnimator(INDEX_HOTSEAT, 1976178f13e2d1f0c1a89cea74538b51993ef3439e3Sunny Goyal mWorkspace.createHotseatAlphaAnimator(show ? 1 : 0), THRESHOLD_ANIM_DURATION); 198dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } 199dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham 200dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham private void animateOverviewPanelButtons(boolean show) { 201ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal animateShowHideView(INDEX_OVERVIEW_PANEL_BUTTONS, mLauncher.getOverviewPanel(), show); 202dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } 203dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham 204dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham private void animateScrim(boolean show) { 205ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal float endValue = show ? mWorkspace.getStateTransitionAnimation().mWorkspaceScrimAlpha : 0; 206ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal startAnimator(INDEX_SCRIM, 207ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal ObjectAnimator.ofFloat(mLauncher.getDragLayer(), "backgroundAlpha", endValue), 208ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal mNormalOverviewTransitionDuration); 209ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal } 210ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal 211ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal private void animateShowHideView(int index, final View view, boolean show) { 2129e76f682f3e52afa1f11172564b883c7dfda5063Sunny Goyal Animator animator = ObjectAnimator.ofFloat(view, View.ALPHA, show ? 1 : 0); 2139e76f682f3e52afa1f11172564b883c7dfda5063Sunny Goyal animator.addListener(new AnimationLayerSet(view)); 214dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham if (show) { 215ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal view.setVisibility(View.VISIBLE); 216dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } else { 217ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal animator.addListener(new AnimatorListenerAdapter() { 2181c581c6d61ad51df26390027725521289bd9ce4aSunny Goyal private boolean mCancelled = false; 2191c581c6d61ad51df26390027725521289bd9ce4aSunny Goyal 2201c581c6d61ad51df26390027725521289bd9ce4aSunny Goyal @Override 2211c581c6d61ad51df26390027725521289bd9ce4aSunny Goyal public void onAnimationCancel(Animator animation) { 2221c581c6d61ad51df26390027725521289bd9ce4aSunny Goyal mCancelled = true; 2231c581c6d61ad51df26390027725521289bd9ce4aSunny Goyal } 2241c581c6d61ad51df26390027725521289bd9ce4aSunny Goyal 225ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal @Override 226ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal public void onAnimationEnd(Animator animation) { 2271c581c6d61ad51df26390027725521289bd9ce4aSunny Goyal if (!mCancelled) { 2281c581c6d61ad51df26390027725521289bd9ce4aSunny Goyal view.setVisibility(View.INVISIBLE); 2291c581c6d61ad51df26390027725521289bd9ce4aSunny Goyal } 230ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal } 231ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal }); 232ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal } 233ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal startAnimator(index, animator, THRESHOLD_ANIM_DURATION); 234ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal } 235ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal 236ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal private void startAnimator(int index, Animator animator, long duration) { 237ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal if (mAnimators[index] != null) { 238ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal mAnimators[index].cancel(); 239dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } 240ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal mAnimators[index] = animator; 241ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal mAnimators[index].setInterpolator(INTERPOLATOR); 242ed268c2c89c94098942ba04fd4cb90310743614aSunny Goyal mAnimators[index].setDuration(duration).start(); 243dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham } 244dadb304b4682998c43b9c07bef45b9a9380f3287Tony Wickham} 245