RecentsAnimation.java revision e2d721781fc024cbd9a14929741e5b476242291f
1e2d721781fc024cbd9a14929741e5b476242291fWinson Chung/* 2e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * Copyright (C) 2018 The Android Open Source Project 3e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * 4e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * Licensed under the Apache License, Version 2.0 (the "License"); 5e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * you may not use this file except in compliance with the License. 6e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * You may obtain a copy of the License at 7e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * 8e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * http://www.apache.org/licenses/LICENSE-2.0 9e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * 10e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * Unless required by applicable law or agreed to in writing, software 11e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * distributed under the License is distributed on an "AS IS" BASIS, 12e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * See the License for the specific language governing permissions and 14e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * limitations under the License. 15e2d721781fc024cbd9a14929741e5b476242291fWinson Chung */ 16e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 17e2d721781fc024cbd9a14929741e5b476242291fWinson Chungpackage com.android.server.am; 18e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 19e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport static android.app.ActivityManager.StackId.INVALID_STACK_ID; 20e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; 21e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; 22e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport static android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION; 23e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport static android.view.WindowManager.TRANSIT_NONE; 24e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS; 25e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 26e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport android.app.ActivityOptions; 27e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport android.content.ComponentName; 28e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport android.content.Intent; 29e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport android.os.Handler; 30e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport android.view.IRecentsAnimationRunner; 31e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport com.android.server.wm.RecentsAnimationController.RecentsAnimationCallbacks; 32e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport com.android.server.wm.WindowManagerService; 33e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 34e2d721781fc024cbd9a14929741e5b476242291fWinson Chung/** 35e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * Manages the recents animation, including the reordering of the stacks for the transition and 36e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * cleanup. See {@link com.android.server.wm.RecentsAnimationController}. 37e2d721781fc024cbd9a14929741e5b476242291fWinson Chung */ 38e2d721781fc024cbd9a14929741e5b476242291fWinson Chungclass RecentsAnimation implements RecentsAnimationCallbacks { 39e2d721781fc024cbd9a14929741e5b476242291fWinson Chung private static final String TAG = RecentsAnimation.class.getSimpleName(); 40e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 41e2d721781fc024cbd9a14929741e5b476242291fWinson Chung private static final int RECENTS_ANIMATION_TIMEOUT = 10 * 1000; 42e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 43e2d721781fc024cbd9a14929741e5b476242291fWinson Chung private final ActivityManagerService mService; 44e2d721781fc024cbd9a14929741e5b476242291fWinson Chung private final ActivityStackSupervisor mStackSupervisor; 45e2d721781fc024cbd9a14929741e5b476242291fWinson Chung private final ActivityStartController mActivityStartController; 46e2d721781fc024cbd9a14929741e5b476242291fWinson Chung private final WindowManagerService mWindowManager; 47e2d721781fc024cbd9a14929741e5b476242291fWinson Chung private final UserController mUserController; 48e2d721781fc024cbd9a14929741e5b476242291fWinson Chung private final Handler mHandler; 49e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 50e2d721781fc024cbd9a14929741e5b476242291fWinson Chung private final Runnable mCancelAnimationRunnable; 51e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 52e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // The stack to restore the home stack behind when the animation is finished 53e2d721781fc024cbd9a14929741e5b476242291fWinson Chung private ActivityStack mRestoreHomeBehindStack; 54e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 55e2d721781fc024cbd9a14929741e5b476242291fWinson Chung RecentsAnimation(ActivityManagerService am, ActivityStackSupervisor stackSupervisor, 56e2d721781fc024cbd9a14929741e5b476242291fWinson Chung ActivityStartController activityStartController, WindowManagerService wm, 57e2d721781fc024cbd9a14929741e5b476242291fWinson Chung UserController userController) { 58e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mService = am; 59e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mStackSupervisor = stackSupervisor; 60e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mActivityStartController = activityStartController; 61e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mHandler = new Handler(mStackSupervisor.mLooper); 62e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mWindowManager = wm; 63e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mUserController = userController; 64e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mCancelAnimationRunnable = () -> { 65e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // The caller has not finished the animation in a predefined amount of time, so 66e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // force-cancel the animation 67e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mWindowManager.cancelRecentsAnimation(); 68e2d721781fc024cbd9a14929741e5b476242291fWinson Chung }; 69e2d721781fc024cbd9a14929741e5b476242291fWinson Chung } 70e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 71e2d721781fc024cbd9a14929741e5b476242291fWinson Chung void startRecentsActivity(Intent intent, IRecentsAnimationRunner recentsAnimationRunner, 72e2d721781fc024cbd9a14929741e5b476242291fWinson Chung ComponentName recentsComponent, int recentsUid) { 73e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 74e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // Cancel the previous recents animation if necessary 75e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mWindowManager.cancelRecentsAnimation(); 76e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 77e2d721781fc024cbd9a14929741e5b476242291fWinson Chung final boolean hasExistingHomeActivity = mStackSupervisor.getHomeActivity() != null; 78e2d721781fc024cbd9a14929741e5b476242291fWinson Chung if (!hasExistingHomeActivity) { 79e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // No home activity 80e2d721781fc024cbd9a14929741e5b476242291fWinson Chung final ActivityOptions opts = ActivityOptions.makeBasic(); 81e2d721781fc024cbd9a14929741e5b476242291fWinson Chung opts.setLaunchActivityType(ACTIVITY_TYPE_HOME); 82e2d721781fc024cbd9a14929741e5b476242291fWinson Chung opts.setAvoidMoveToFront(); 83e2d721781fc024cbd9a14929741e5b476242291fWinson Chung intent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_NO_ANIMATION); 84e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 85e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mActivityStartController.obtainStarter(intent, "startRecentsActivity_noHomeActivity") 86e2d721781fc024cbd9a14929741e5b476242291fWinson Chung .setCallingUid(recentsUid) 87e2d721781fc024cbd9a14929741e5b476242291fWinson Chung .setCallingPackage(recentsComponent.getPackageName()) 88e2d721781fc024cbd9a14929741e5b476242291fWinson Chung .setActivityOptions(SafeActivityOptions.fromBundle(opts.toBundle())) 89e2d721781fc024cbd9a14929741e5b476242291fWinson Chung .setMayWait(mUserController.getCurrentUserId()) 90e2d721781fc024cbd9a14929741e5b476242291fWinson Chung .execute(); 91e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mWindowManager.prepareAppTransition(TRANSIT_NONE, false); 92e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 93e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // TODO: Maybe wait for app to draw in this particular case? 94e2d721781fc024cbd9a14929741e5b476242291fWinson Chung } 95e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 96e2d721781fc024cbd9a14929741e5b476242291fWinson Chung final ActivityRecord homeActivity = mStackSupervisor.getHomeActivity(); 97e2d721781fc024cbd9a14929741e5b476242291fWinson Chung final ActivityDisplay display = homeActivity.getDisplay(); 98e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 99e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // Save the initial position of the home activity stack to be restored to after the 100e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // animation completes 101e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mRestoreHomeBehindStack = hasExistingHomeActivity 102e2d721781fc024cbd9a14929741e5b476242291fWinson Chung ? display.getStackAboveHome() 103e2d721781fc024cbd9a14929741e5b476242291fWinson Chung : null; 104e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 105e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // Move the home activity into place for the animation 106e2d721781fc024cbd9a14929741e5b476242291fWinson Chung display.moveHomeStackBehindBottomMostVisibleStack(); 107e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 108e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // Mark the home activity as launch-behind to bump its visibility for the 109e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // duration of the gesture that is driven by the recents component 110e2d721781fc024cbd9a14929741e5b476242291fWinson Chung homeActivity.mLaunchTaskBehind = true; 111e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 112e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // Fetch all the surface controls and pass them to the client to get the animation 113e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // started 114e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mWindowManager.initializeRecentsAnimation(recentsAnimationRunner, this, display.mDisplayId); 115e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 116e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // If we updated the launch-behind state, update the visibility of the activities after we 117e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // fetch the visible tasks to be controlled by the animation 118e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, PRESERVE_WINDOWS); 119e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 120e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // Post a timeout for the animation 121e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mHandler.postDelayed(mCancelAnimationRunnable, RECENTS_ANIMATION_TIMEOUT); 122e2d721781fc024cbd9a14929741e5b476242291fWinson Chung } 123e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 124e2d721781fc024cbd9a14929741e5b476242291fWinson Chung @Override 125e2d721781fc024cbd9a14929741e5b476242291fWinson Chung public void onAnimationFinished(boolean moveHomeToTop) { 126e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mHandler.removeCallbacks(mCancelAnimationRunnable); 127e2d721781fc024cbd9a14929741e5b476242291fWinson Chung synchronized (mService) { 128e2d721781fc024cbd9a14929741e5b476242291fWinson Chung if (mWindowManager.getRecentsAnimationController() == null) return; 129e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 130e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mWindowManager.inSurfaceTransaction(() -> { 131e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mWindowManager.cleanupRecentsAnimation(); 132e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 133e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // Move the home stack to the front 134e2d721781fc024cbd9a14929741e5b476242291fWinson Chung final ActivityRecord homeActivity = mStackSupervisor.getHomeActivity(); 135e2d721781fc024cbd9a14929741e5b476242291fWinson Chung if (homeActivity == null) { 136e2d721781fc024cbd9a14929741e5b476242291fWinson Chung return; 137e2d721781fc024cbd9a14929741e5b476242291fWinson Chung } 138e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 139e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // Restore the launched-behind state 140e2d721781fc024cbd9a14929741e5b476242291fWinson Chung homeActivity.mLaunchTaskBehind = false; 141e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 142e2d721781fc024cbd9a14929741e5b476242291fWinson Chung if (moveHomeToTop) { 143e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // Bring the home stack to the front 144e2d721781fc024cbd9a14929741e5b476242291fWinson Chung final ActivityStack homeStack = homeActivity.getStack(); 145e2d721781fc024cbd9a14929741e5b476242291fWinson Chung homeStack.mNoAnimActivities.add(homeActivity); 146e2d721781fc024cbd9a14929741e5b476242291fWinson Chung homeStack.moveToFront("RecentsAnimation.onAnimationFinished()"); 147e2d721781fc024cbd9a14929741e5b476242291fWinson Chung } else { 148e2d721781fc024cbd9a14929741e5b476242291fWinson Chung // Restore the home stack to its previous position 149e2d721781fc024cbd9a14929741e5b476242291fWinson Chung final ActivityDisplay display = homeActivity.getDisplay(); 150e2d721781fc024cbd9a14929741e5b476242291fWinson Chung display.moveHomeStackBehindStack(mRestoreHomeBehindStack); 151e2d721781fc024cbd9a14929741e5b476242291fWinson Chung } 152e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 153e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mWindowManager.prepareAppTransition(TRANSIT_NONE, false); 154e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, false); 155e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mStackSupervisor.resumeFocusedStackTopActivityLocked(); 156e2d721781fc024cbd9a14929741e5b476242291fWinson Chung }); 157e2d721781fc024cbd9a14929741e5b476242291fWinson Chung } 158e2d721781fc024cbd9a14929741e5b476242291fWinson Chung } 159e2d721781fc024cbd9a14929741e5b476242291fWinson Chung} 160