diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java index d131457cb9a20..8cbd9fc4cc8d2 100644 --- a/services/core/java/com/android/server/wm/ActivityStartController.java +++ b/services/core/java/com/android/server/wm/ActivityStartController.java @@ -50,6 +50,7 @@ import android.util.Slog; import android.util.SparseArray; import android.view.RemoteAnimationAdapter; import android.view.WindowManager; +import android.window.RemoteTransition; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; @@ -566,14 +567,39 @@ public class ActivityStartController { return false; } mService.mRootWindowContainer.startPowerModeLaunchIfNeeded(true /* forceSend */, r); - final ActivityMetricsLogger.LaunchingState launchingState = - mSupervisor.getActivityMetricsLogger().notifyActivityLaunching(intent); - final Task task = r.getTask(); - mService.deferWindowLayout(); - try { + final RemoteTransition remote = options.getRemoteTransition(); + if (remote != null && rootTask.mTransitionController.isCollecting()) { + final Transition transition = new Transition(WindowManager.TRANSIT_TO_FRONT, + 0 /* flags */, rootTask.mTransitionController, + mService.mWindowManager.mSyncEngine); + // Special case: we are entering recents while an existing transition is running. In + // this case, we know it's safe to "defer" the activity launch, so lets do so now so + // that it can get its own transition and thus update launcher correctly. + mService.mWindowManager.mSyncEngine.queueSyncSet( + () -> rootTask.mTransitionController.moveToCollecting(transition), + () -> { + final Task task = r.getTask(); + task.mTransitionController.requestStartTransition(transition, + task, remote, null /* displayChange */); + task.mTransitionController.collect(task); + startExistingRecentsIfPossibleInner(intent, options, r, task, rootTask); + }); + } else { + final Task task = r.getTask(); task.mTransitionController.requestTransitionIfNeeded(WindowManager.TRANSIT_TO_FRONT, 0 /* flags */, task, task /* readyGroupRef */, options.getRemoteTransition(), null /* displayChange */); + startExistingRecentsIfPossibleInner(intent, options, r, task, rootTask); + } + return true; + } + + void startExistingRecentsIfPossibleInner(Intent intent, ActivityOptions options, + ActivityRecord r, Task task, Task rootTask) { + final ActivityMetricsLogger.LaunchingState launchingState = + mSupervisor.getActivityMetricsLogger().notifyActivityLaunching(intent); + mService.deferWindowLayout(); + try { r.mTransitionController.setTransientLaunch(r, TaskDisplayArea.getRootTaskAbove(rootTask)); task.moveToFront("startExistingRecents"); @@ -585,7 +611,6 @@ public class ActivityStartController { task.mInResumeTopActivity = false; mService.continueWindowLayout(); } - return true; } void registerRemoteAnimationForNextActivityStart(String packageName,