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