diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/ActivityStartController.java | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java index d131457cb9a2..8cbd9fc4cc8d 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 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); - final Task task = r.getTask(); mService.deferWindowLayout(); try { - task.mTransitionController.requestTransitionIfNeeded(WindowManager.TRANSIT_TO_FRONT, - 0 /* flags */, task, task /* readyGroupRef */, - options.getRemoteTransition(), null /* displayChange */); 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, |