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