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}