RecentsAnimation.java revision 44a7e2ecad3d40efc809608c5238feb7b538b8c4
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 1954cff64ec6ef818e270eb39a74d6a58068553d66Jorim Jaggiimport static android.app.ActivityManager.START_TASK_TO_FRONT; 20f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chungimport static android.app.AppOpsManager.OP_ASSIST_STRUCTURE; 21f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chungimport static android.app.AppOpsManager.OP_NONE; 22e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; 233e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chungimport static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS; 243e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chungimport static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; 25e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; 26e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport static android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION; 27584d652a1dba2b09975a1555c71ed339374faac7Winson Chungimport static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER; 28e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport static android.view.WindowManager.TRANSIT_NONE; 29e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS; 303e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chungimport static com.android.server.wm.RecentsAnimationController.REORDER_KEEP_IN_PLACE; 313e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chungimport static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_ORIGINAL_POSITION; 323e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chungimport static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_TOP; 33e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 34e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport android.app.ActivityOptions; 35f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chungimport android.app.AppOpsManager; 36f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chungimport android.app.IAssistDataReceiver; 37e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport android.content.ComponentName; 38f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chungimport android.content.Context; 39e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport android.content.Intent; 40ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chungimport android.os.RemoteException; 41584d652a1dba2b09975a1555c71ed339374faac7Winson Chungimport android.os.Trace; 42ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chungimport android.util.Slog; 43e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport android.view.IRecentsAnimationRunner; 446a38fca2d81e5d5bc0343c57e4db3629c3a9a619Winson Chungimport com.android.server.wm.RecentsAnimationController; 45e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport com.android.server.wm.RecentsAnimationController.RecentsAnimationCallbacks; 46e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport com.android.server.wm.WindowManagerService; 47e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 48e2d721781fc024cbd9a14929741e5b476242291fWinson Chung/** 49e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * Manages the recents animation, including the reordering of the stacks for the transition and 50e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * cleanup. See {@link com.android.server.wm.RecentsAnimationController}. 51e2d721781fc024cbd9a14929741e5b476242291fWinson Chung */ 520f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chungclass RecentsAnimation implements RecentsAnimationCallbacks, 530f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chung ActivityDisplay.OnStackOrderChangedListener { 54e2d721781fc024cbd9a14929741e5b476242291fWinson Chung private static final String TAG = RecentsAnimation.class.getSimpleName(); 5544a7e2ecad3d40efc809608c5238feb7b538b8c4Winson Chung private static final boolean DEBUG = false; 56e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 57e2d721781fc024cbd9a14929741e5b476242291fWinson Chung private final ActivityManagerService mService; 58e2d721781fc024cbd9a14929741e5b476242291fWinson Chung private final ActivityStackSupervisor mStackSupervisor; 59e2d721781fc024cbd9a14929741e5b476242291fWinson Chung private final ActivityStartController mActivityStartController; 60e2d721781fc024cbd9a14929741e5b476242291fWinson Chung private final WindowManagerService mWindowManager; 61e2d721781fc024cbd9a14929741e5b476242291fWinson Chung private final UserController mUserController; 623e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung private final ActivityDisplay mDefaultDisplay; 63bc2aabe84568c6b1a54c1b1467a539781488c8caJorim Jaggi private final int mCallingPid; 64e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 653e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung private int mTargetActivityType; 66f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung private AssistDataRequester mAssistDataRequester; 673e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung 683e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung // The stack to restore the target stack behind when the animation is finished 693e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung private ActivityStack mRestoreTargetBehindStack; 70e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 71e2d721781fc024cbd9a14929741e5b476242291fWinson Chung RecentsAnimation(ActivityManagerService am, ActivityStackSupervisor stackSupervisor, 72e2d721781fc024cbd9a14929741e5b476242291fWinson Chung ActivityStartController activityStartController, WindowManagerService wm, 73bc2aabe84568c6b1a54c1b1467a539781488c8caJorim Jaggi UserController userController, int callingPid) { 74e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mService = am; 75e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mStackSupervisor = stackSupervisor; 763e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung mDefaultDisplay = stackSupervisor.getDefaultDisplay(); 77e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mActivityStartController = activityStartController; 78e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mWindowManager = wm; 79e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mUserController = userController; 80bc2aabe84568c6b1a54c1b1467a539781488c8caJorim Jaggi mCallingPid = callingPid; 81e2d721781fc024cbd9a14929741e5b476242291fWinson Chung } 82e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 83e2d721781fc024cbd9a14929741e5b476242291fWinson Chung void startRecentsActivity(Intent intent, IRecentsAnimationRunner recentsAnimationRunner, 84f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung ComponentName recentsComponent, int recentsUid, 85f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung IAssistDataReceiver assistDataReceiver) { 86f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung if (DEBUG) Slog.d(TAG, "startRecentsActivity(): intent=" + intent 87f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung + " assistDataReceiver=" + assistDataReceiver); 88584d652a1dba2b09975a1555c71ed339374faac7Winson Chung Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "RecentsAnimation#startRecentsActivity"); 89ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung 90ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung if (!mWindowManager.canStartRecentsAnimation()) { 91ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung notifyAnimationCancelBeforeStart(recentsAnimationRunner); 92c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung if (DEBUG) Slog.d(TAG, "Can't start recents animation, nextAppTransition=" 93c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung + mWindowManager.getPendingAppTransition()); 94ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung return; 95ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung } 96ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung 973e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung // If the activity is associated with the recents stack, then try and get that first 983e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung mTargetActivityType = intent.getComponent() != null 993e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung && recentsComponent.equals(intent.getComponent()) 1003e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung ? ACTIVITY_TYPE_RECENTS 1013e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung : ACTIVITY_TYPE_HOME; 1023e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung final ActivityStack targetStack = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED, 1033e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung mTargetActivityType); 10400a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung ActivityRecord targetActivity = getTargetActivity(targetStack, intent.getComponent()); 1053e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung final boolean hasExistingActivity = targetActivity != null; 1063e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung if (hasExistingActivity) { 1073e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung final ActivityDisplay display = targetActivity.getDisplay(); 1083e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung mRestoreTargetBehindStack = display.getStackAbove(targetStack); 1093e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung if (mRestoreTargetBehindStack == null) { 110ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung notifyAnimationCancelBeforeStart(recentsAnimationRunner); 111c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung if (DEBUG) Slog.d(TAG, "No stack above target stack=" + targetStack); 112ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung return; 113ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung } 114ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung } 115ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung 1163e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung // Send launch hint if we are actually launching the target. If it's already visible 1173e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung // (shouldn't happen in general) we don't need to send it. 1183e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung if (targetActivity == null || !targetActivity.visible) { 119ac96052733c4c07f68f81c203fa05a05940c0f31Jorim Jaggi mStackSupervisor.sendPowerHintForLaunchStartIfNeeded(true /* forceSend */, 1203e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung targetActivity); 121ac96052733c4c07f68f81c203fa05a05940c0f31Jorim Jaggi } 122ac96052733c4c07f68f81c203fa05a05940c0f31Jorim Jaggi 12354cff64ec6ef818e270eb39a74d6a58068553d66Jorim Jaggi mStackSupervisor.getActivityMetricsLogger().notifyActivityLaunching(); 12454cff64ec6ef818e270eb39a74d6a58068553d66Jorim Jaggi 125bc2aabe84568c6b1a54c1b1467a539781488c8caJorim Jaggi mService.setRunningRemoteAnimation(mCallingPid, true); 126bc2aabe84568c6b1a54c1b1467a539781488c8caJorim Jaggi 1271e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung mWindowManager.deferSurfaceLayout(); 1281e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung try { 129f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung // Kick off the assist data request in the background before showing the target activity 130f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung if (assistDataReceiver != null) { 131f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung final AppOpsManager appOpsManager = (AppOpsManager) 132f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung mService.mContext.getSystemService(Context.APP_OPS_SERVICE); 133f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung final AssistDataReceiverProxy proxy = new AssistDataReceiverProxy( 134f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung assistDataReceiver, recentsComponent.getPackageName()); 135f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung mAssistDataRequester = new AssistDataRequester(mService.mContext, mService, 136f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung mWindowManager, appOpsManager, proxy, this, OP_ASSIST_STRUCTURE, OP_NONE); 137f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung mAssistDataRequester.requestAssistData(mStackSupervisor.getTopVisibleActivities(), 138f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung true /* fetchData */, false /* fetchScreenshots */, 139f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung true /* allowFetchData */, false /* allowFetchScreenshots */, 140f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung recentsUid, recentsComponent.getPackageName()); 141f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung } 142f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung 1433e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung if (hasExistingActivity) { 1443e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung // Move the recents activity into place for the animation if it is not top most 1450f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chung mDefaultDisplay.moveStackBehindBottomMostVisibleStack(targetStack); 146c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung if (DEBUG) Slog.d(TAG, "Moved stack=" + targetStack + " behind stack=" 1470f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chung + mDefaultDisplay.getStackAbove(targetStack)); 14800a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung 14900a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung // If there are multiple tasks in the target stack (ie. the home stack, with 3p 15000a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung // and default launchers coexisting), then move the task to the top as a part of 15100a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung // moving the stack to the front 15200a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung if (targetStack.topTask() != targetActivity.getTask()) { 15300a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung targetStack.addTask(targetActivity.getTask(), true /* toTop */, 15400a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung "startRecentsActivity"); 15500a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung } 156ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung } else { 1573e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung // No recents activity 1583e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung ActivityOptions options = ActivityOptions.makeBasic(); 1593e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung options.setLaunchActivityType(mTargetActivityType); 1603e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung options.setAvoidMoveToFront(); 1611e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung intent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_NO_ANIMATION); 1621e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung 1631e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung mActivityStartController 1643e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung .obtainStarter(intent, "startRecentsActivity_noTargetActivity") 1651e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung .setCallingUid(recentsUid) 1661e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung .setCallingPackage(recentsComponent.getPackageName()) 1673e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung .setActivityOptions(SafeActivityOptions.fromBundle(options.toBundle())) 1681e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung .setMayWait(mUserController.getCurrentUserId()) 1691e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung .execute(); 1701e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung mWindowManager.prepareAppTransition(TRANSIT_NONE, false); 171e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 1723e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung targetActivity = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED, 1733e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung mTargetActivityType).getTopActivity(); 174ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung 1751e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung // TODO: Maybe wait for app to draw in this particular case? 176c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung 177c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung if (DEBUG) Slog.d(TAG, "Started intent=" + intent); 1781e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung } 179e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 1803e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung // Mark the target activity as launch-behind to bump its visibility for the 1811e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung // duration of the gesture that is driven by the recents component 1823e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung targetActivity.mLaunchTaskBehind = true; 183e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 1841e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung // Fetch all the surface controls and pass them to the client to get the animation 18565c5f99aae6969e6353e3be8991619c076450e43Winson Chung // started. Cancel any existing recents animation running synchronously (do not hold the 18665c5f99aae6969e6353e3be8991619c076450e43Winson Chung // WM lock) 18765c5f99aae6969e6353e3be8991619c076450e43Winson Chung mWindowManager.cancelRecentsAnimationSynchronously(REORDER_MOVE_TO_ORIGINAL_POSITION, 188c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung "startRecentsActivity"); 1893e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung mWindowManager.initializeRecentsAnimation(mTargetActivityType, recentsAnimationRunner, 1900f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chung this, mDefaultDisplay.mDisplayId, 1910f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chung mStackSupervisor.mRecentTasks.getRecentTaskIds()); 192e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 1931e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung // If we updated the launch-behind state, update the visibility of the activities after 1941e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung // we fetch the visible tasks to be controlled by the animation 1951e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, PRESERVE_WINDOWS); 19654cff64ec6ef818e270eb39a74d6a58068553d66Jorim Jaggi 19754cff64ec6ef818e270eb39a74d6a58068553d66Jorim Jaggi mStackSupervisor.getActivityMetricsLogger().notifyActivityLaunched(START_TASK_TO_FRONT, 1983e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung targetActivity); 1990f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chung 2000f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chung // Register for stack order changes 2010f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chung mDefaultDisplay.registerStackOrderChangedListener(this); 202c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung } catch (Exception e) { 203c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung Slog.e(TAG, "Failed to start recents activity", e); 204c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung throw e; 2051e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung } finally { 2061e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung mWindowManager.continueSurfaceLayout(); 207584d652a1dba2b09975a1555c71ed339374faac7Winson Chung Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); 2081e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung } 209e2d721781fc024cbd9a14929741e5b476242291fWinson Chung } 210e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 21165c5f99aae6969e6353e3be8991619c076450e43Winson Chung private void finishAnimation(@RecentsAnimationController.ReorderMode int reorderMode) { 212e2d721781fc024cbd9a14929741e5b476242291fWinson Chung synchronized (mService) { 213c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung if (DEBUG) Slog.d(TAG, "onAnimationFinished(): controller=" 21465c5f99aae6969e6353e3be8991619c076450e43Winson Chung + mWindowManager.getRecentsAnimationController() 21565c5f99aae6969e6353e3be8991619c076450e43Winson Chung + " reorderMode=" + reorderMode); 216f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung 217f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung // Cancel the associated assistant data request 218f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung if (mAssistDataRequester != null) { 219f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung mAssistDataRequester.cancel(); 220f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung mAssistDataRequester = null; 221f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung } 222f993016ac6375ddb18f61a98b62e8a01aa890a55Winson Chung 2230f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chung // Unregister for stack order changes 2240f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chung mDefaultDisplay.unregisterStackOrderChangedListener(this); 2250f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chung 226e2d721781fc024cbd9a14929741e5b476242291fWinson Chung if (mWindowManager.getRecentsAnimationController() == null) return; 227e2d721781fc024cbd9a14929741e5b476242291fWinson Chung 2283e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung // Just to be sure end the launch hint in case the target activity was never launched. 2293e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung // However, if we're keeping the activity and making it visible, we can leave it on. 2303e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung if (reorderMode != REORDER_KEEP_IN_PLACE) { 231ac96052733c4c07f68f81c203fa05a05940c0f31Jorim Jaggi mStackSupervisor.sendPowerHintForLaunchEndIfNeeded(); 232ac96052733c4c07f68f81c203fa05a05940c0f31Jorim Jaggi } 233ac96052733c4c07f68f81c203fa05a05940c0f31Jorim Jaggi 234bc2aabe84568c6b1a54c1b1467a539781488c8caJorim Jaggi mService.setRunningRemoteAnimation(mCallingPid, false); 235bc2aabe84568c6b1a54c1b1467a539781488c8caJorim Jaggi 236e2d721781fc024cbd9a14929741e5b476242291fWinson Chung mWindowManager.inSurfaceTransaction(() -> { 237584d652a1dba2b09975a1555c71ed339374faac7Winson Chung Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, 238584d652a1dba2b09975a1555c71ed339374faac7Winson Chung "RecentsAnimation#onAnimationFinished_inSurfaceTransaction"); 2391e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung mWindowManager.deferSurfaceLayout(); 2401e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung try { 2416a38fca2d81e5d5bc0343c57e4db3629c3a9a619Winson Chung mWindowManager.cleanupRecentsAnimation(reorderMode); 2421e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung 2433e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung final ActivityStack targetStack = mDefaultDisplay.getStack( 2443e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung WINDOWING_MODE_UNDEFINED, mTargetActivityType); 24582389a9333718fd24ab1d7bc046b696074d65956Winson Chung final ActivityRecord targetActivity = targetStack != null 24682389a9333718fd24ab1d7bc046b696074d65956Winson Chung ? targetStack.getTopActivity() 24782389a9333718fd24ab1d7bc046b696074d65956Winson Chung : null; 248c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung if (DEBUG) Slog.d(TAG, "onAnimationFinished(): targetStack=" + targetStack 249c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung + " targetActivity=" + targetActivity 250c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung + " mRestoreTargetBehindStack=" + mRestoreTargetBehindStack); 2513e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung if (targetActivity == null) { 2521e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung return; 2531e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung } 2541e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung 2551e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung // Restore the launched-behind state 2563e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung targetActivity.mLaunchTaskBehind = false; 2573e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung 2583e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung if (reorderMode == REORDER_MOVE_TO_TOP) { 2593e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung // Bring the target stack to the front 2603e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung mStackSupervisor.mNoAnimActivities.add(targetActivity); 2613e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung targetStack.moveToFront("RecentsAnimation.onAnimationFinished()"); 262c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung if (DEBUG) { 263c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung final ActivityStack topStack = getTopNonAlwaysOnTopStack(); 264c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung if (topStack != targetStack) { 265c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung Slog.w(TAG, "Expected target stack=" + targetStack 266c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung + " to be top most but found stack=" + topStack); 267c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung } 268c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung } 2693e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung } else if (reorderMode == REORDER_MOVE_TO_ORIGINAL_POSITION){ 2703e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung // Restore the target stack to its previous position 2713e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung final ActivityDisplay display = targetActivity.getDisplay(); 2723e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung display.moveStackBehindStack(targetStack, mRestoreTargetBehindStack); 273c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung if (DEBUG) { 274c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung final ActivityStack aboveTargetStack = 275c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung mDefaultDisplay.getStackAbove(targetStack); 276c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung if (mRestoreTargetBehindStack != null 277c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung && aboveTargetStack != mRestoreTargetBehindStack) { 278c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung Slog.w(TAG, "Expected target stack=" + targetStack 279c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung + " to restored behind stack=" + mRestoreTargetBehindStack 280c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung + " but it is behind stack=" + aboveTargetStack); 281c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung } 282c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung } 2836a38fca2d81e5d5bc0343c57e4db3629c3a9a619Winson Chung } else { 2843e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung // Keep target stack in place, nothing changes, so ignore the transition 2853e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung // logic below 2866a38fca2d81e5d5bc0343c57e4db3629c3a9a619Winson Chung return; 2871e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung } 2881e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung 2891e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung mWindowManager.prepareAppTransition(TRANSIT_NONE, false); 2901e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, false); 2911e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung mStackSupervisor.resumeFocusedStackTopActivityLocked(); 2921e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung 2931e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung // No reason to wait for the pausing activity in this case, as the hiding of 2941e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung // surfaces needs to be done immediately. 2951e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung mWindowManager.executeAppTransition(); 296f557c3b56547de332b1f116f316b3a81dabd230dWinson Chung 297f557c3b56547de332b1f116f316b3a81dabd230dWinson Chung // After reordering the stacks, reset the minimized state. At this point, either 2983e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung // the target activity is now top-most and we will stay minimized (if in 2993e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung // split-screen), or we will have returned to the app, and the minimized state 3003e2980ed3251ec5f8ca85d7ce23f44daf717dd82Winson Chung // should be reset 301f557c3b56547de332b1f116f316b3a81dabd230dWinson Chung mWindowManager.checkSplitScreenMinimizedChanged(true /* animate */); 302c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung } catch (Exception e) { 303c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung Slog.e(TAG, "Failed to clean up recents activity", e); 304c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung throw e; 3051e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung } finally { 3061e6d4a9e001f910de9396f4056eb74fdf9b8257cWinson Chung mWindowManager.continueSurfaceLayout(); 307584d652a1dba2b09975a1555c71ed339374faac7Winson Chung Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); 308e2d721781fc024cbd9a14929741e5b476242291fWinson Chung } 309e2d721781fc024cbd9a14929741e5b476242291fWinson Chung }); 310e2d721781fc024cbd9a14929741e5b476242291fWinson Chung } 311e2d721781fc024cbd9a14929741e5b476242291fWinson Chung } 312ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung 31365c5f99aae6969e6353e3be8991619c076450e43Winson Chung @Override 31465c5f99aae6969e6353e3be8991619c076450e43Winson Chung public void onAnimationFinished(@RecentsAnimationController.ReorderMode int reorderMode, 31565c5f99aae6969e6353e3be8991619c076450e43Winson Chung boolean runSychronously) { 31665c5f99aae6969e6353e3be8991619c076450e43Winson Chung if (runSychronously) { 31765c5f99aae6969e6353e3be8991619c076450e43Winson Chung finishAnimation(reorderMode); 31865c5f99aae6969e6353e3be8991619c076450e43Winson Chung } else { 31965c5f99aae6969e6353e3be8991619c076450e43Winson Chung mService.mHandler.post(() -> finishAnimation(reorderMode)); 32065c5f99aae6969e6353e3be8991619c076450e43Winson Chung } 32165c5f99aae6969e6353e3be8991619c076450e43Winson Chung } 32265c5f99aae6969e6353e3be8991619c076450e43Winson Chung 3230f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chung @Override 3240f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chung public void onStackOrderChanged() { 3250f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chung // If the activity display stack order changes, cancel any running recents animation in 3260f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chung // place 3270f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chung mWindowManager.cancelRecentsAnimationSynchronously(REORDER_KEEP_IN_PLACE, 3280f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chung "stackOrderChanged"); 3290f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chung } 3300f7ec96b756a90def4c5dd786d18b798d343ad3dWinson Chung 331ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung /** 332ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung * Called only when the animation should be canceled prior to starting. 333ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung */ 334ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung private void notifyAnimationCancelBeforeStart(IRecentsAnimationRunner recentsAnimationRunner) { 335ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung try { 336ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung recentsAnimationRunner.onAnimationCanceled(); 337ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung } catch (RemoteException e) { 338ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung Slog.e(TAG, "Failed to cancel recents animation before start", e); 339ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung } 340ddf62975798eff2a68422d075441a4bfcf1cd6b4Winson Chung } 341c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung 342c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung /** 343c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung * @return The top stack that is not always-on-top. 344c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung */ 345c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung private ActivityStack getTopNonAlwaysOnTopStack() { 346c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung for (int i = mDefaultDisplay.getChildCount() - 1; i >= 0; i--) { 347c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung final ActivityStack s = mDefaultDisplay.getChildAt(i); 348c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung if (s.getWindowConfiguration().isAlwaysOnTop()) { 349c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung continue; 350c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung } 351c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung return s; 352c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung } 353c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung return null; 354c6c3f851dc0c2e7f17581b55d08f17b508c791afWinson Chung } 35500a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung 35600a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung /** 35700a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung * @return the top activity in the {@param targetStack} matching the {@param component}, or just 35800a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung * the top activity of the top task if no task matches the component. 35900a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung */ 36000a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung private ActivityRecord getTargetActivity(ActivityStack targetStack, ComponentName component) { 36100a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung if (targetStack == null) { 36200a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung return null; 36300a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung } 36400a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung 36500a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung for (int i = targetStack.getChildCount() - 1; i >= 0; i--) { 36600a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung final TaskRecord task = (TaskRecord) targetStack.getChildAt(i); 36700a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung if (task.getBaseIntent().getComponent().equals(component)) { 36800a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung return task.getTopActivity(); 36900a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung } 37000a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung } 37100a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung return targetStack.getTopActivity(); 37200a0969b50b88000d9cc2ddb7af0582c32b20c32Winson Chung } 373e2d721781fc024cbd9a14929741e5b476242291fWinson Chung} 374