LauncherStateTransitionAnimation.java revision 5f4e0fdd2e4edeb9211e2dcd1c99497f175731f8
1b745afbdd75157c73d581b345118cdaff99e912dWinson Chung/*
2b745afbdd75157c73d581b345118cdaff99e912dWinson Chung * Copyright (C) 2015 The Android Open Source Project
3b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *
4b745afbdd75157c73d581b345118cdaff99e912dWinson Chung * Licensed under the Apache License, Version 2.0 (the "License");
5b745afbdd75157c73d581b345118cdaff99e912dWinson Chung * you may not use this file except in compliance with the License.
6b745afbdd75157c73d581b345118cdaff99e912dWinson Chung * You may obtain a copy of the License at
7b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *
8b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *      http://www.apache.org/licenses/LICENSE-2.0
9b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *
10b745afbdd75157c73d581b345118cdaff99e912dWinson Chung * Unless required by applicable law or agreed to in writing, software
11b745afbdd75157c73d581b345118cdaff99e912dWinson Chung * distributed under the License is distributed on an "AS IS" BASIS,
12b745afbdd75157c73d581b345118cdaff99e912dWinson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b745afbdd75157c73d581b345118cdaff99e912dWinson Chung * See the License for the specific language governing permissions and
14b745afbdd75157c73d581b345118cdaff99e912dWinson Chung * limitations under the License.
15b745afbdd75157c73d581b345118cdaff99e912dWinson Chung */
16b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
17b745afbdd75157c73d581b345118cdaff99e912dWinson Chungpackage com.android.launcher3;
18b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
19b745afbdd75157c73d581b345118cdaff99e912dWinson Chungimport android.animation.Animator;
20b745afbdd75157c73d581b345118cdaff99e912dWinson Chungimport android.animation.AnimatorListenerAdapter;
21b745afbdd75157c73d581b345118cdaff99e912dWinson Chungimport android.animation.AnimatorSet;
22b745afbdd75157c73d581b345118cdaff99e912dWinson Chungimport android.animation.ObjectAnimator;
23b745afbdd75157c73d581b345118cdaff99e912dWinson Chungimport android.animation.PropertyValuesHolder;
24b745afbdd75157c73d581b345118cdaff99e912dWinson Chungimport android.animation.TimeInterpolator;
257066003b2032a49ae5e59dab9b706259bdeb7e6eSunny Goyalimport android.annotation.SuppressLint;
26b745afbdd75157c73d581b345118cdaff99e912dWinson Chungimport android.content.res.Resources;
27b745afbdd75157c73d581b345118cdaff99e912dWinson Chungimport android.util.Log;
28b745afbdd75157c73d581b345118cdaff99e912dWinson Chungimport android.view.View;
29b745afbdd75157c73d581b345118cdaff99e912dWinson Chungimport android.view.ViewAnimationUtils;
30b745afbdd75157c73d581b345118cdaff99e912dWinson Chungimport android.view.animation.AccelerateInterpolator;
31b745afbdd75157c73d581b345118cdaff99e912dWinson Chungimport android.view.animation.DecelerateInterpolator;
325f4e0fdd2e4edeb9211e2dcd1c99497f175731f8Winson Chungimport com.android.launcher3.allapps.AllAppsContainerView;
33091440a9cb9d4f42406631004aa484cbb79214caAdam Cohenimport com.android.launcher3.util.Thunk;
343f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Songimport com.android.launcher3.widget.WidgetsContainerView;
35b745afbdd75157c73d581b345118cdaff99e912dWinson Chungimport java.util.HashMap;
36b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
37b745afbdd75157c73d581b345118cdaff99e912dWinson Chung/**
38b745afbdd75157c73d581b345118cdaff99e912dWinson Chung * TODO: figure out what kind of tests we can write for this
39b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *
40b745afbdd75157c73d581b345118cdaff99e912dWinson Chung * Things to test when changing the following class.
41b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *   - Home from workspace
42b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - from center screen
43b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - from other screens
44b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *   - Home from all apps
45b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - from center screen
46b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - from other screens
47b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *   - Back from all apps
48b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - from center screen
49b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - from other screens
50b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *   - Launch app from workspace and quit
51b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - with back
52b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - with home
53b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *   - Launch app from all apps and quit
54b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - with back
55b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - with home
56b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *   - Go to a screen that's not the default, then all
57b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *     apps, and launch and app, and go back
58b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - with back
59b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          -with home
60b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *   - On workspace, long press power and go back
61b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - with back
62b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - with home
63b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *   - On all apps, long press power and go back
64b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - with back
65b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - with home
66b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *   - On workspace, power off
67b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *   - On all apps, power off
68b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *   - Launch an app and turn off the screen while in that app
69b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - Go back with home key
70b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - Go back with back key  TODO: make this not go to workspace
71b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - From all apps
72b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - From workspace
73b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *   - Enter and exit car mode (becuase it causes an extra configuration changed)
74b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - From all apps
75b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - From the center workspace
76b745afbdd75157c73d581b345118cdaff99e912dWinson Chung *          - From another workspace
77b745afbdd75157c73d581b345118cdaff99e912dWinson Chung */
78b745afbdd75157c73d581b345118cdaff99e912dWinson Chungpublic class LauncherStateTransitionAnimation {
79b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
80b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    /**
81b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     * Callbacks made during the state transition
82b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     */
83b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    interface Callbacks {
84b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        public void onStateTransitionHideSearchBar();
85b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    }
86b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
87b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    /**
88b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     * Private callbacks made during transition setup.
89b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     */
90b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    static abstract class PrivateTransitionCallbacks {
91b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        void onRevealViewVisible(View revealView, View contentView, View allAppsButtonView) {}
92b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        void onAnimationComplete(View revealView, View contentView, View allAppsButtonView) {}
93b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        float getMaterialRevealViewFinalAlpha(View revealView) {
94b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            return 0;
95b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        }
96b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        float getMaterialRevealViewFinalXDrift(View revealView) {
97b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            return 0;
98b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        }
99b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        float getMaterialRevealViewFinalYDrift(View revealView) {
100b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            return 0;
101b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        }
102b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        float getMaterialRevealViewStartFinalRadius() {
103b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            return 0;
104b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        }
105b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        AnimatorListenerAdapter getMaterialRevealViewAnimatorListener(View revealView,
106b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                View allAppsButtonView) {
107b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            return null;
108b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        }
109b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    }
110b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
111b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    public static final String TAG = "LauncherStateTransitionAnimation";
112b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
113b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    // Flags to determine how to set the layers on views before the transition animation
114b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    public static final int BUILD_LAYER = 0;
115b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    public static final int BUILD_AND_SET_LAYER = 1;
116b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    public static final int SINGLE_FRAME_DELAY = 16;
117b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
118091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen    @Thunk Launcher mLauncher;
119091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen    @Thunk Callbacks mCb;
120091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen    @Thunk AnimatorSet mStateAnimation;
121b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
122b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    public LauncherStateTransitionAnimation(Launcher l, Callbacks cb) {
123b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        mLauncher = l;
124b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        mCb = cb;
125b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    }
126b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
127b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    /**
128b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     * Starts an animation to the apps view.
129b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     */
130b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    public void startAnimationToAllApps(final boolean animated) {
1315f4e0fdd2e4edeb9211e2dcd1c99497f175731f8Winson Chung        final AllAppsContainerView toView = mLauncher.getAppsView();
132b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        PrivateTransitionCallbacks cb = new PrivateTransitionCallbacks() {
133b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            private int[] mAllAppsToPanelDelta;
134b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
135b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            @Override
136b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            public void onRevealViewVisible(View revealView, View contentView,
137b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    View allAppsButtonView) {
138b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                toView.setBackground(null);
139b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                // Get the y delta between the center of the page and the center of the all apps
140b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                // button
141b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                mAllAppsToPanelDelta = Utilities.getCenterDeltaInScreenSpace(revealView,
142b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        allAppsButtonView, null);
143b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
144b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            @Override
145b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            public float getMaterialRevealViewFinalAlpha(View revealView) {
146b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                return 1f;
147b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
148b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            @Override
149b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            public float getMaterialRevealViewFinalXDrift(View revealView) {
150b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                return mAllAppsToPanelDelta[0];
151b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
152b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            @Override
153b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            public float getMaterialRevealViewFinalYDrift(View revealView) {
154b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                return mAllAppsToPanelDelta[1];
155b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
156b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            @Override
157b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            public float getMaterialRevealViewStartFinalRadius() {
1582e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen                int allAppsButtonSize = mLauncher.getDeviceProfile().allAppsButtonVisualSize;
159b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                return allAppsButtonSize / 2;
160b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
161b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            @Override
162b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            public AnimatorListenerAdapter getMaterialRevealViewAnimatorListener(
163b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    final View revealView, final View allAppsButtonView) {
164b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                return new AnimatorListenerAdapter() {
165b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    public void onAnimationStart(Animator animation) {
166b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        allAppsButtonView.setVisibility(View.INVISIBLE);
167b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    }
168b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    public void onAnimationEnd(Animator animation) {
169b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        allAppsButtonView.setVisibility(View.VISIBLE);
170b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    }
171b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                };
172b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
173b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        };
174b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        startAnimationToOverlay(Workspace.State.NORMAL_HIDDEN, toView, toView.getContentView(),
175dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung                toView.getRevealView(), animated,
176dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung                !mLauncher.isAllAppsSearchOverridden() /* hideSearchBar */, cb);
177b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    }
178b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
179b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    /**
180b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     * Starts an animation to the widgets view.
181b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     */
182b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    public void startAnimationToWidgets(final boolean animated) {
1833f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song        final WidgetsContainerView toView = mLauncher.getWidgetsView();
1844cea4c830283e017fc36197cfe9d7ce713aec49dHyunyoung Song        final Resources res = mLauncher.getResources();
185b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        PrivateTransitionCallbacks cb = new PrivateTransitionCallbacks() {
186b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            @Override
1874cea4c830283e017fc36197cfe9d7ce713aec49dHyunyoung Song            public void onRevealViewVisible(View revealView, View contentView,
1884cea4c830283e017fc36197cfe9d7ce713aec49dHyunyoung Song                    View allAppsButtonView) {
1894cea4c830283e017fc36197cfe9d7ce713aec49dHyunyoung Song                revealView.setBackground(res.getDrawable(R.drawable.quantum_panel_dark));
1904cea4c830283e017fc36197cfe9d7ce713aec49dHyunyoung Song            }
1914cea4c830283e017fc36197cfe9d7ce713aec49dHyunyoung Song            @Override
192b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            public float getMaterialRevealViewFinalAlpha(View revealView) {
193b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                return 0.3f;
194b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
195b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            @Override
196b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            public float getMaterialRevealViewFinalYDrift(View revealView) {
197b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                return revealView.getMeasuredHeight() / 2;
198b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
199b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        };
2004cea4c830283e017fc36197cfe9d7ce713aec49dHyunyoung Song        startAnimationToOverlay(Workspace.State.OVERVIEW_HIDDEN, toView,
2014cea4c830283e017fc36197cfe9d7ce713aec49dHyunyoung Song                toView.getContentView(), toView.getRevealView(), animated, true /* hideSearchBar */,
2024cea4c830283e017fc36197cfe9d7ce713aec49dHyunyoung Song                cb);
203b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    }
204b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
205b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    /**
206b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     * Starts and animation to the workspace from the current overlay view.
207b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     */
208b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    public void startAnimationToWorkspace(final Launcher.State fromState,
209dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung              final Workspace.State toWorkspaceState, final int toWorkspacePage,
210dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung              final boolean animated, final Runnable onCompleteRunnable) {
211b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        if (toWorkspaceState != Workspace.State.NORMAL &&
212b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                toWorkspaceState != Workspace.State.SPRING_LOADED &&
213b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                toWorkspaceState != Workspace.State.OVERVIEW) {
214b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            Log.e(TAG, "Unexpected call to startAnimationToWorkspace");
215b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        }
216b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
217b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        if (fromState == Launcher.State.APPS || fromState == Launcher.State.APPS_SPRING_LOADED) {
218dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung            startAnimationToWorkspaceFromAllApps(fromState, toWorkspaceState, toWorkspacePage,
219dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung                    animated, onCompleteRunnable);
220b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        } else {
221dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung            startAnimationToWorkspaceFromWidgets(fromState, toWorkspaceState, toWorkspacePage,
222dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung                    animated, onCompleteRunnable);
223b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        }
224b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    }
225b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
226b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    /**
227b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     * Creates and starts a new animation to a particular overlay view.
228b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     */
2297066003b2032a49ae5e59dab9b706259bdeb7e6eSunny Goyal    @SuppressLint("NewApi")
230b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    private void startAnimationToOverlay(final Workspace.State toWorkspaceState, final View toView,
2310f785720667ab8afe4b4620a6c333d382d8659edWinson Chung             final View contentView, final View revealView, final boolean animated,
2320f785720667ab8afe4b4620a6c333d382d8659edWinson Chung             final boolean hideSearchBar, final PrivateTransitionCallbacks pCb) {
233b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        final Resources res = mLauncher.getResources();
234b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        final boolean material = Utilities.isLmpOrAbove();
2355f4e0fdd2e4edeb9211e2dcd1c99497f175731f8Winson Chung        final int revealDuration = res.getInteger(R.integer.config_overlayRevealTime);
236b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        final int itemsAlphaStagger =
2375f4e0fdd2e4edeb9211e2dcd1c99497f175731f8Winson Chung                res.getInteger(R.integer.config_overlayItemsAlphaStagger);
238b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
239b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        final View allAppsButtonView = mLauncher.getAllAppsButton();
240b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        final View fromView = mLauncher.getWorkspace();
241b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
242b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        final HashMap<View, Integer> layerViews = new HashMap<>();
243b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
244b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        // If for some reason our views aren't initialized, don't animate
245b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        boolean initialized = allAppsButtonView != null;
246b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
247b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        // Cancel the current animation
248b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        cancelAnimation();
249b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
250b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        // Create the workspace animation.
251b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        // NOTE: this call apparently also sets the state for the workspace if !animated
252cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung        Animator workspaceAnim = mLauncher.startWorkspaceStateChangeAnimation(toWorkspaceState, -1,
253cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung                animated, layerViews);
254b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
255b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        if (animated && initialized) {
256b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            mStateAnimation = LauncherAnimUtils.createAnimatorSet();
257b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
258b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            // Setup the reveal view animation
259b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            int width = revealView.getMeasuredWidth();
260b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            int height = revealView.getMeasuredHeight();
261f7a29e83f06909b378dba39c83a522375682710aSunny Goyal            float revealRadius = (float) Math.hypot(width / 2, height / 2);
262b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            revealView.setVisibility(View.VISIBLE);
263b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            revealView.setAlpha(0f);
264b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            revealView.setTranslationY(0f);
265b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            revealView.setTranslationX(0f);
266b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            pCb.onRevealViewVisible(revealView, contentView, allAppsButtonView);
267b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
268b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            // Calculate the final animation values
269b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            final float revealViewToAlpha;
270b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            final float revealViewToXDrift;
271b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            final float revealViewToYDrift;
272b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            if (material) {
273b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                revealViewToAlpha = pCb.getMaterialRevealViewFinalAlpha(revealView);
274b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                revealViewToYDrift = pCb.getMaterialRevealViewFinalYDrift(revealView);
275b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                revealViewToXDrift = pCb.getMaterialRevealViewFinalXDrift(revealView);
276b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            } else {
277b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                revealViewToAlpha = 0f;
278b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                revealViewToYDrift = 2 * height / 3;
279b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                revealViewToXDrift = 0;
280b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
281b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
282b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            // Create the animators
283b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            PropertyValuesHolder panelAlpha =
284b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    PropertyValuesHolder.ofFloat("alpha", revealViewToAlpha, 1f);
285b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            PropertyValuesHolder panelDriftY =
286b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    PropertyValuesHolder.ofFloat("translationY", revealViewToYDrift, 0);
287b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            PropertyValuesHolder panelDriftX =
288b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    PropertyValuesHolder.ofFloat("translationX", revealViewToXDrift, 0);
289b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            ObjectAnimator panelAlphaAndDrift = ObjectAnimator.ofPropertyValuesHolder(revealView,
290b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    panelAlpha, panelDriftY, panelDriftX);
291b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            panelAlphaAndDrift.setDuration(revealDuration);
292b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            panelAlphaAndDrift.setInterpolator(new LogDecelerateInterpolator(100, 0));
293b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
294b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            // Play the animation
295b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            layerViews.put(revealView, BUILD_AND_SET_LAYER);
296b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            mStateAnimation.play(panelAlphaAndDrift);
297b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
298b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            // Setup the animation for the content view
299b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            contentView.setVisibility(View.VISIBLE);
300b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            contentView.setAlpha(0f);
301b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            contentView.setTranslationY(revealViewToYDrift);
302b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            layerViews.put(contentView, BUILD_AND_SET_LAYER);
303b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
304b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            // Create the individual animators
305b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            ObjectAnimator pageDrift = ObjectAnimator.ofFloat(contentView, "translationY",
306b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    revealViewToYDrift, 0);
307b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            pageDrift.setDuration(revealDuration);
308b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            pageDrift.setInterpolator(new LogDecelerateInterpolator(100, 0));
309b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            pageDrift.setStartDelay(itemsAlphaStagger);
310b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            mStateAnimation.play(pageDrift);
311b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
312b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            ObjectAnimator itemsAlpha = ObjectAnimator.ofFloat(contentView, "alpha", 0f, 1f);
313b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            itemsAlpha.setDuration(revealDuration);
314b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            itemsAlpha.setInterpolator(new AccelerateInterpolator(1.5f));
315b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            itemsAlpha.setStartDelay(itemsAlphaStagger);
316b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            mStateAnimation.play(itemsAlpha);
317b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
318b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            if (material) {
319b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                // Animate the all apps button
320b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                float startRadius = pCb.getMaterialRevealViewStartFinalRadius();
321b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                AnimatorListenerAdapter listener = pCb.getMaterialRevealViewAnimatorListener(
322b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        revealView, allAppsButtonView);
323b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                Animator reveal = ViewAnimationUtils.createCircularReveal(revealView, width / 2,
324b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        height / 2, startRadius, revealRadius);
325b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                reveal.setDuration(revealDuration);
326b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                reveal.setInterpolator(new LogDecelerateInterpolator(100, 0));
327b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                if (listener != null) {
328b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    reveal.addListener(listener);
329b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                }
330b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                mStateAnimation.play(reveal);
331b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
332b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
333b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            mStateAnimation.addListener(new AnimatorListenerAdapter() {
334b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                @Override
335b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                public void onAnimationEnd(Animator animation) {
336b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    dispatchOnLauncherTransitionEnd(fromView, animated, false);
337b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    dispatchOnLauncherTransitionEnd(toView, animated, false);
338b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
339b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    // Hide the reveal view
340b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    revealView.setVisibility(View.INVISIBLE);
341b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    pCb.onAnimationComplete(revealView, contentView, allAppsButtonView);
342b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
343b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    // Disable all necessary layers
344b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    for (View v : layerViews.keySet()) {
345b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        if (layerViews.get(v) == BUILD_AND_SET_LAYER) {
346b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                            v.setLayerType(View.LAYER_TYPE_NONE, null);
347b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        }
348b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    }
349b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
3500f785720667ab8afe4b4620a6c333d382d8659edWinson Chung                    if (hideSearchBar) {
3510f785720667ab8afe4b4620a6c333d382d8659edWinson Chung                        mCb.onStateTransitionHideSearchBar();
3520f785720667ab8afe4b4620a6c333d382d8659edWinson Chung                    }
353b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
354b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    // This can hold unnecessary references to views.
355b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    mStateAnimation = null;
356b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                }
357b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
358b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            });
359b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
360b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            // Play the workspace animation
361b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            if (workspaceAnim != null) {
362b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                mStateAnimation.play(workspaceAnim);
363b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
364b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
365b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            // Dispatch the prepare transition signal
366b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            dispatchOnLauncherTransitionPrepare(fromView, animated, false);
367b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            dispatchOnLauncherTransitionPrepare(toView, animated, false);
368b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
369b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
370b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            final AnimatorSet stateAnimation = mStateAnimation;
371b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            final Runnable startAnimRunnable = new Runnable() {
372b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                public void run() {
373b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    // Check that mStateAnimation hasn't changed while
374b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    // we waited for a layout/draw pass
375b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    if (mStateAnimation != stateAnimation)
376b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        return;
377b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    dispatchOnLauncherTransitionStart(fromView, animated, false);
378b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    dispatchOnLauncherTransitionStart(toView, animated, false);
379b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
380b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    // Enable all necessary layers
38111509ad61afb7424ce83057b0d2a4b09f853651fWinson Chung                    boolean isLmpOrAbove = Utilities.isLmpOrAbove();
382b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    for (View v : layerViews.keySet()) {
383b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        if (layerViews.get(v) == BUILD_AND_SET_LAYER) {
384b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                            v.setLayerType(View.LAYER_TYPE_HARDWARE, null);
385b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        }
38611509ad61afb7424ce83057b0d2a4b09f853651fWinson Chung                        if (isLmpOrAbove && Utilities.isViewAttachedToWindow(v)) {
387b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                            v.buildLayer();
388b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        }
389b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    }
390b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
391b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    // Focus the new view
392b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    toView.requestFocus();
393b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
394b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    mStateAnimation.start();
395b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                }
396b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            };
397b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            toView.bringToFront();
398b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            toView.setVisibility(View.VISIBLE);
399b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            toView.post(startAnimRunnable);
400b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        } else {
401b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            toView.setTranslationX(0.0f);
402b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            toView.setTranslationY(0.0f);
403b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            toView.setScaleX(1.0f);
404b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            toView.setScaleY(1.0f);
405b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            toView.setVisibility(View.VISIBLE);
406b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            toView.bringToFront();
407b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
408b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            // Show the content view
409b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            contentView.setVisibility(View.VISIBLE);
410b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
4110f785720667ab8afe4b4620a6c333d382d8659edWinson Chung            if (hideSearchBar) {
4120f785720667ab8afe4b4620a6c333d382d8659edWinson Chung                mCb.onStateTransitionHideSearchBar();
4130f785720667ab8afe4b4620a6c333d382d8659edWinson Chung            }
414b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
415b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            dispatchOnLauncherTransitionPrepare(fromView, animated, false);
416b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            dispatchOnLauncherTransitionStart(fromView, animated, false);
417b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            dispatchOnLauncherTransitionEnd(fromView, animated, false);
418b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            dispatchOnLauncherTransitionPrepare(toView, animated, false);
419b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            dispatchOnLauncherTransitionStart(toView, animated, false);
420b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            dispatchOnLauncherTransitionEnd(toView, animated, false);
421b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        }
422b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    }
423b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
424b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    /**
425b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     * Starts and animation to the workspace from the apps view.
426b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     */
427b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    private void startAnimationToWorkspaceFromAllApps(final Launcher.State fromState,
428dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung              final Workspace.State toWorkspaceState, final int toWorkspacePage,
429dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung              final boolean animated, final Runnable onCompleteRunnable) {
4305f4e0fdd2e4edeb9211e2dcd1c99497f175731f8Winson Chung        AllAppsContainerView appsView = mLauncher.getAppsView();
431b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        PrivateTransitionCallbacks cb = new PrivateTransitionCallbacks() {
432b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            int[] mAllAppsToPanelDelta;
433b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
434b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            @Override
435b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            public void onRevealViewVisible(View revealView, View contentView,
436b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                                            View allAppsButtonView) {
437b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                // Get the y delta between the center of the page and the center of the all apps
438b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                // button
439b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                mAllAppsToPanelDelta = Utilities.getCenterDeltaInScreenSpace(revealView,
440b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        allAppsButtonView, null);
441b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
442b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            @Override
443b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            public float getMaterialRevealViewFinalXDrift(View revealView) {
444b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                return mAllAppsToPanelDelta[0];
445b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
446b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            @Override
447b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            public float getMaterialRevealViewFinalYDrift(View revealView) {
448b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                return mAllAppsToPanelDelta[1];
449b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
450b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            @Override
451b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            float getMaterialRevealViewFinalAlpha(View revealView) {
452b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                // No alpha anim from all apps
453b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                return 1f;
454b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
455b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            @Override
456b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            float getMaterialRevealViewStartFinalRadius() {
4572e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen                int allAppsButtonSize = mLauncher.getDeviceProfile().allAppsButtonVisualSize;
458b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                return allAppsButtonSize / 2;
459b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
460b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            @Override
461b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            public AnimatorListenerAdapter getMaterialRevealViewAnimatorListener(
462b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    final View revealView, final View allAppsButtonView) {
463b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                return new AnimatorListenerAdapter() {
464b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    public void onAnimationStart(Animator animation) {
465b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        // We set the alpha instead of visibility to ensure that the focus does not
466b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        // get taken from the all apps view
467b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        allAppsButtonView.setVisibility(View.VISIBLE);
468b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        allAppsButtonView.setAlpha(0f);
469b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    }
470b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    public void onAnimationEnd(Animator animation) {
471b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        // Hide the reveal view
472b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        revealView.setVisibility(View.INVISIBLE);
473b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
474b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        // Show the all apps button, and focus it
475b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        allAppsButtonView.setAlpha(1f);
476b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    }
477b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                };
478b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
479b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        };
480dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung        startAnimationToWorkspaceFromOverlay(toWorkspaceState, toWorkspacePage, appsView,
481dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung                appsView.getContentView(), appsView.getRevealView(), animated, onCompleteRunnable,
482dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung                cb);
483b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    }
484b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
485b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    /**
486b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     * Starts and animation to the workspace from the widgets view.
487b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     */
488b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    private void startAnimationToWorkspaceFromWidgets(final Launcher.State fromState,
489dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung              final Workspace.State toWorkspaceState, final int toWorkspacePage,
490dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung              final boolean animated, final Runnable onCompleteRunnable) {
4914cea4c830283e017fc36197cfe9d7ce713aec49dHyunyoung Song        final WidgetsContainerView widgetsView = mLauncher.getWidgetsView();
4924cea4c830283e017fc36197cfe9d7ce713aec49dHyunyoung Song        final Resources res = mLauncher.getResources();
493b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        PrivateTransitionCallbacks cb = new PrivateTransitionCallbacks() {
494b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            @Override
4954cea4c830283e017fc36197cfe9d7ce713aec49dHyunyoung Song            public void onRevealViewVisible(View revealView, View contentView,
4964cea4c830283e017fc36197cfe9d7ce713aec49dHyunyoung Song                                            View allAppsButtonView) {
4974cea4c830283e017fc36197cfe9d7ce713aec49dHyunyoung Song                revealView.setBackground(res.getDrawable(R.drawable.quantum_panel_dark));
4984cea4c830283e017fc36197cfe9d7ce713aec49dHyunyoung Song            }
4994cea4c830283e017fc36197cfe9d7ce713aec49dHyunyoung Song            @Override
500b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            public float getMaterialRevealViewFinalYDrift(View revealView) {
501b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                return revealView.getMeasuredHeight() / 2;
502b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
503b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            @Override
504b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            float getMaterialRevealViewFinalAlpha(View revealView) {
505b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                return 0.4f;
506b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
507b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            @Override
508b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            public AnimatorListenerAdapter getMaterialRevealViewAnimatorListener(
509b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    final View revealView, final View allAppsButtonView) {
510b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                return new AnimatorListenerAdapter() {
511b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    public void onAnimationEnd(Animator animation) {
512b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        // Hide the reveal view
513b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        revealView.setVisibility(View.INVISIBLE);
514b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    }
515b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                };
516b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
517b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        };
518dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung        startAnimationToWorkspaceFromOverlay(toWorkspaceState, toWorkspacePage, widgetsView,
5190f785720667ab8afe4b4620a6c333d382d8659edWinson Chung                widgetsView.getContentView(), widgetsView.getRevealView(), animated,
5200f785720667ab8afe4b4620a6c333d382d8659edWinson Chung                onCompleteRunnable, cb);
521b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    }
522b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
523b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    /**
524b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     * Creates and starts a new animation to the workspace.
525b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     */
526b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    private void startAnimationToWorkspaceFromOverlay(final Workspace.State toWorkspaceState,
527dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung              final int toWorkspacePage, final View fromView, final View contentView,
528dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung              final View revealView, final boolean animated, final Runnable onCompleteRunnable,
5290f785720667ab8afe4b4620a6c333d382d8659edWinson Chung              final PrivateTransitionCallbacks pCb) {
530b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        final Resources res = mLauncher.getResources();
531b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        final boolean material = Utilities.isLmpOrAbove();
5325f4e0fdd2e4edeb9211e2dcd1c99497f175731f8Winson Chung        final int revealDuration = res.getInteger(R.integer.config_overlayRevealTime);
533b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        final int itemsAlphaStagger =
5345f4e0fdd2e4edeb9211e2dcd1c99497f175731f8Winson Chung                res.getInteger(R.integer.config_overlayItemsAlphaStagger);
535b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
536b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        final View allAppsButtonView = mLauncher.getAllAppsButton();
537b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        final View toView = mLauncher.getWorkspace();
538b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
539b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        final HashMap<View, Integer> layerViews = new HashMap<>();
540b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
541b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        // If for some reason our views aren't initialized, don't animate
542b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        boolean initialized = allAppsButtonView != null;
543b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
544b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        // Cancel the current animation
545b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        cancelAnimation();
546b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
547b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        // Create the workspace animation.
548b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        // NOTE: this call apparently also sets the state for the workspace if !animated
549cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung        Animator workspaceAnim = mLauncher.startWorkspaceStateChangeAnimation(toWorkspaceState,
550cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung                toWorkspacePage, animated, layerViews);
551b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
552b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        if (animated && initialized) {
553b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            mStateAnimation = LauncherAnimUtils.createAnimatorSet();
554b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
555b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            // Play the workspace animation
556b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            if (workspaceAnim != null) {
557b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                mStateAnimation.play(workspaceAnim);
558b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
559b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
560b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            // hideAppsCustomizeHelper is called in some cases when it is already hidden
561b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            // don't perform all these no-op animations. In particularly, this was causing
562b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            // the all-apps button to pop in and out.
563b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            if (fromView.getVisibility() == View.VISIBLE) {
564b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                int width = revealView.getMeasuredWidth();
565b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                int height = revealView.getMeasuredHeight();
566f7a29e83f06909b378dba39c83a522375682710aSunny Goyal                float revealRadius = (float) Math.hypot(width / 2, height / 2);
567b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                revealView.setVisibility(View.VISIBLE);
568b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                revealView.setAlpha(1f);
569b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                revealView.setTranslationY(0);
570b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                layerViews.put(revealView, BUILD_AND_SET_LAYER);
571b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                pCb.onRevealViewVisible(revealView, contentView, allAppsButtonView);
572b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
573b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                // Calculate the final animation values
574b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                final float revealViewToXDrift;
575b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                final float revealViewToYDrift;
576b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                if (material) {
577b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    revealViewToYDrift = pCb.getMaterialRevealViewFinalYDrift(revealView);
578b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    revealViewToXDrift = pCb.getMaterialRevealViewFinalXDrift(revealView);
579b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                } else {
580b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    revealViewToYDrift = 2 * height / 3;
581b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    revealViewToXDrift = 0;
582b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                }
583b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
584b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                // The vertical motion of the apps panel should be delayed by one frame
585b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                // from the conceal animation in order to give the right feel. We correspondingly
586b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                // shorten the duration so that the slide and conceal end at the same time.
587b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                TimeInterpolator decelerateInterpolator = material ?
588b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        new LogDecelerateInterpolator(100, 0) :
589b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        new DecelerateInterpolator(1f);
590b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                ObjectAnimator panelDriftY = LauncherAnimUtils.ofFloat(revealView, "translationY",
591b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        0, revealViewToYDrift);
592b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                panelDriftY.setDuration(revealDuration - SINGLE_FRAME_DELAY);
593b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                panelDriftY.setStartDelay(itemsAlphaStagger + SINGLE_FRAME_DELAY);
594b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                panelDriftY.setInterpolator(decelerateInterpolator);
595b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                mStateAnimation.play(panelDriftY);
596b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
597b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                ObjectAnimator panelDriftX = LauncherAnimUtils.ofFloat(revealView, "translationX",
598b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        0, revealViewToXDrift);
599b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                panelDriftX.setDuration(revealDuration - SINGLE_FRAME_DELAY);
600b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                panelDriftX.setStartDelay(itemsAlphaStagger + SINGLE_FRAME_DELAY);
601b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                panelDriftX.setInterpolator(decelerateInterpolator);
602b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                mStateAnimation.play(panelDriftX);
603b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
604b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                // Setup animation for the reveal panel alpha
605b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                final float revealViewToAlpha = !material ? 0f :
606b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        pCb.getMaterialRevealViewFinalAlpha(revealView);
607b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                if (revealViewToAlpha != 1f) {
608b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    ObjectAnimator panelAlpha = LauncherAnimUtils.ofFloat(revealView, "alpha",
609b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                            1f, revealViewToAlpha);
610b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    panelAlpha.setDuration(material ? revealDuration : 150);
611b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    panelAlpha.setStartDelay(material ? 0 : itemsAlphaStagger + SINGLE_FRAME_DELAY);
612b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    panelAlpha.setInterpolator(decelerateInterpolator);
613b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    mStateAnimation.play(panelAlpha);
614b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                }
615b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
616b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                // Setup the animation for the content view
617b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                layerViews.put(contentView, BUILD_AND_SET_LAYER);
618b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
619b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                // Create the individual animators
620b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                ObjectAnimator pageDrift = LauncherAnimUtils.ofFloat(contentView, "translationY",
621b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        0, revealViewToYDrift);
622b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                contentView.setTranslationY(0);
623b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                pageDrift.setDuration(revealDuration - SINGLE_FRAME_DELAY);
624b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                pageDrift.setInterpolator(decelerateInterpolator);
625b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                pageDrift.setStartDelay(itemsAlphaStagger + SINGLE_FRAME_DELAY);
626b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                mStateAnimation.play(pageDrift);
627b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
628b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                contentView.setAlpha(1f);
629b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                ObjectAnimator itemsAlpha = LauncherAnimUtils.ofFloat(contentView, "alpha", 1f, 0f);
630b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                itemsAlpha.setDuration(100);
631b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                itemsAlpha.setInterpolator(decelerateInterpolator);
632b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                mStateAnimation.play(itemsAlpha);
633b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
634b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                if (material) {
635b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    // Animate the all apps button
636b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    float finalRadius = pCb.getMaterialRevealViewStartFinalRadius();
637b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    AnimatorListenerAdapter listener =
638b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                            pCb.getMaterialRevealViewAnimatorListener(revealView, allAppsButtonView);
639b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    Animator reveal =
640b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                            LauncherAnimUtils.createCircularReveal(revealView, width / 2,
641b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                                    height / 2, revealRadius, finalRadius);
642b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    reveal.setInterpolator(new LogDecelerateInterpolator(100, 0));
643b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    reveal.setDuration(revealDuration);
644b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    reveal.setStartDelay(itemsAlphaStagger);
645b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    if (listener != null) {
646b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        reveal.addListener(listener);
647b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    }
648b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    mStateAnimation.play(reveal);
649b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                }
650b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
651b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                dispatchOnLauncherTransitionPrepare(fromView, animated, true);
652b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                dispatchOnLauncherTransitionPrepare(toView, animated, true);
653b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
654b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
655b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            mStateAnimation.addListener(new AnimatorListenerAdapter() {
656b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                @Override
657b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                public void onAnimationEnd(Animator animation) {
658b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    fromView.setVisibility(View.GONE);
659b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    dispatchOnLauncherTransitionEnd(fromView, animated, true);
660b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    dispatchOnLauncherTransitionEnd(toView, animated, true);
661b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
662b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    // Run any queued runnables
663b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    if (onCompleteRunnable != null) {
664b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        onCompleteRunnable.run();
665b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    }
666b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
667b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    // Animation complete callback
668b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    pCb.onAnimationComplete(revealView, contentView, allAppsButtonView);
669b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
670b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    // Disable all necessary layers
671b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    for (View v : layerViews.keySet()) {
672b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        if (layerViews.get(v) == BUILD_AND_SET_LAYER) {
673b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                            v.setLayerType(View.LAYER_TYPE_NONE, null);
674b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        }
675b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    }
676b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
677b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    // Reset page transforms
678b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    if (contentView != null) {
679b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        contentView.setTranslationX(0);
680b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        contentView.setTranslationY(0);
681b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        contentView.setAlpha(1);
682b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    }
683b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
684b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    // This can hold unnecessary references to views.
685b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    mStateAnimation = null;
686b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                }
687b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            });
688b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
689b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            final AnimatorSet stateAnimation = mStateAnimation;
690b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            final Runnable startAnimRunnable = new Runnable() {
691b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                public void run() {
692b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    // Check that mStateAnimation hasn't changed while
693b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    // we waited for a layout/draw pass
694b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    if (mStateAnimation != stateAnimation)
695b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        return;
696b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    dispatchOnLauncherTransitionStart(fromView, animated, false);
697b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    dispatchOnLauncherTransitionStart(toView, animated, false);
698b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
699b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    // Enable all necessary layers
70011509ad61afb7424ce83057b0d2a4b09f853651fWinson Chung                    boolean isLmpOrAbove = Utilities.isLmpOrAbove();
701b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    for (View v : layerViews.keySet()) {
702b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        if (layerViews.get(v) == BUILD_AND_SET_LAYER) {
703b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                            v.setLayerType(View.LAYER_TYPE_HARDWARE, null);
704b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        }
70511509ad61afb7424ce83057b0d2a4b09f853651fWinson Chung                        if (isLmpOrAbove && Utilities.isViewAttachedToWindow(v)) {
706b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                            v.buildLayer();
707b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                        }
708b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    }
709b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    mStateAnimation.start();
710b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                }
711b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            };
712b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            fromView.post(startAnimRunnable);
713b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        } else {
714b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            fromView.setVisibility(View.GONE);
715b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            dispatchOnLauncherTransitionPrepare(fromView, animated, true);
716b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            dispatchOnLauncherTransitionStart(fromView, animated, true);
717b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            dispatchOnLauncherTransitionEnd(fromView, animated, true);
718b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            dispatchOnLauncherTransitionPrepare(toView, animated, true);
719b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            dispatchOnLauncherTransitionStart(toView, animated, true);
720b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            dispatchOnLauncherTransitionEnd(toView, animated, true);
721b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
722b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            // Run any queued runnables
723b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            if (onCompleteRunnable != null) {
724b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                onCompleteRunnable.run();
725b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            }
726b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        }
727b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    }
728b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
729b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
730b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    /**
731b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     * Dispatches the prepare-transition event to suitable views.
732b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     */
733b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    void dispatchOnLauncherTransitionPrepare(View v, boolean animated, boolean toWorkspace) {
734b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        if (v instanceof LauncherTransitionable) {
735b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            ((LauncherTransitionable) v).onLauncherTransitionPrepare(mLauncher, animated,
736b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    toWorkspace);
737b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        }
738b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    }
739b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
740b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    /**
741b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     * Dispatches the start-transition event to suitable views.
742b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     */
743b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    void dispatchOnLauncherTransitionStart(View v, boolean animated, boolean toWorkspace) {
744b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        if (v instanceof LauncherTransitionable) {
745b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            ((LauncherTransitionable) v).onLauncherTransitionStart(mLauncher, animated,
746b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    toWorkspace);
747b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        }
748b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
749b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        // Update the workspace transition step as well
750b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        dispatchOnLauncherTransitionStep(v, 0f);
751b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    }
752b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
753b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    /**
754b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     * Dispatches the step-transition event to suitable views.
755b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     */
756b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    void dispatchOnLauncherTransitionStep(View v, float t) {
757b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        if (v instanceof LauncherTransitionable) {
758b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            ((LauncherTransitionable) v).onLauncherTransitionStep(mLauncher, t);
759b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        }
760b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    }
761b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
762b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    /**
763b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     * Dispatches the end-transition event to suitable views.
764b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     */
765b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    void dispatchOnLauncherTransitionEnd(View v, boolean animated, boolean toWorkspace) {
766b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        if (v instanceof LauncherTransitionable) {
767b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            ((LauncherTransitionable) v).onLauncherTransitionEnd(mLauncher, animated,
768b745afbdd75157c73d581b345118cdaff99e912dWinson Chung                    toWorkspace);
769b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        }
770b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
771b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        // Update the workspace transition step as well
772b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        dispatchOnLauncherTransitionStep(v, 1f);
773b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    }
774b745afbdd75157c73d581b345118cdaff99e912dWinson Chung
775b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    /**
776b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     * Cancels the current animation.
777b745afbdd75157c73d581b345118cdaff99e912dWinson Chung     */
778b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    private void cancelAnimation() {
779b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        if (mStateAnimation != null) {
780b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            mStateAnimation.setDuration(0);
781b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            mStateAnimation.cancel();
782b745afbdd75157c73d581b345118cdaff99e912dWinson Chung            mStateAnimation = null;
783b745afbdd75157c73d581b345118cdaff99e912dWinson Chung        }
784b745afbdd75157c73d581b345118cdaff99e912dWinson Chung    }
785b745afbdd75157c73d581b345118cdaff99e912dWinson Chung}