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