diff options
| author | 2022-11-24 16:42:33 +0000 | |
|---|---|---|
| committer | 2022-11-24 16:42:33 +0000 | |
| commit | 11c4903f5fa6e6ca59c52f7ba3402b6c6543404d (patch) | |
| tree | 526ab2b505c689e5e3c30cac874054125f6211d3 | |
| parent | 7c406753e61b9c1d9e4dca5380881c0cff4b36d0 (diff) | |
| parent | fb3ae6329091a62abb161b514aab3b8262e448af (diff) | |
Merge "Put transition collect in scope of defer layout" into tm-qpr-dev am: fb3ae63290
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20547393
Change-Id: Ic52fa9700cd7735c0ad2727734f6864f52555c2c
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
3 files changed, 28 insertions, 23 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java index c49d6729effc..56aae2d6db37 100644 --- a/services/core/java/com/android/server/wm/ActivityStartController.java +++ b/services/core/java/com/android/server/wm/ActivityStartController.java @@ -559,47 +559,52 @@ public class ActivityStartController { final Task rootTask = mService.mRootWindowContainer.getDefaultTaskDisplayArea() .getRootTask(WINDOWING_MODE_UNDEFINED, activityType); if (rootTask == null) return false; + final RemoteTransition remote = options.getRemoteTransition(); final ActivityRecord r = rootTask.topRunningActivity(); - if (r == null || r.mVisibleRequested || !r.attachedToProcess() + if (r == null || r.mVisibleRequested || !r.attachedToProcess() || remote == null || !r.mActivityComponent.equals(intent.getComponent()) // Recents keeps invisible while device is locked. || r.mDisplayContent.isKeyguardLocked()) { 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); + final ActivityMetricsLogger.LaunchingState launchingState = + mSupervisor.getActivityMetricsLogger().notifyActivityLaunching(intent); + final Transition transition = new Transition(WindowManager.TRANSIT_TO_FRONT, + 0 /* flags */, r.mTransitionController, mService.mWindowManager.mSyncEngine); + if (r.mTransitionController.isCollecting()) { // 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); + if (r.isAttached()) { + r.mTransitionController.moveToCollecting(transition); + } + }, + () -> { + if (r.isAttached() && transition.isCollecting()) { + startExistingRecentsIfPossibleInner(options, r, rootTask, + launchingState, remote, transition); + } }); } 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); + r.mTransitionController.moveToCollecting(transition); + startExistingRecentsIfPossibleInner(options, r, rootTask, launchingState, remote, + transition); } return true; } - void startExistingRecentsIfPossibleInner(Intent intent, ActivityOptions options, - ActivityRecord r, Task task, Task rootTask) { - final ActivityMetricsLogger.LaunchingState launchingState = - mSupervisor.getActivityMetricsLogger().notifyActivityLaunching(intent); + private void startExistingRecentsIfPossibleInner(ActivityOptions options, ActivityRecord r, + Task rootTask, ActivityMetricsLogger.LaunchingState launchingState, + RemoteTransition remoteTransition, Transition transition) { + final Task task = r.getTask(); mService.deferWindowLayout(); try { + r.mTransitionController.requestStartTransition(transition, + task, remoteTransition, null /* displayChange */); + r.mTransitionController.collect(task); r.mTransitionController.setTransientLaunch(r, TaskDisplayArea.getRootTaskAbove(rootTask)); task.moveToFront("startExistingRecents"); diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index b138d1e08c67..dc6fbbc96926 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -1389,9 +1389,9 @@ class ActivityStarter { && transitionController.getTransitionPlayer() != null) ? transitionController.createTransition(TRANSIT_OPEN) : null; RemoteTransition remoteTransition = r.takeRemoteTransition(); - transitionController.collect(r); try { mService.deferWindowLayout(); + transitionController.collect(r); try { Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "startActivityInner"); result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor, diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 4d29c4d0a134..b6e52aaff035 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -345,7 +345,7 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe return mFinishTransaction; } - private boolean isCollecting() { + boolean isCollecting() { return mState == STATE_COLLECTING || mState == STATE_STARTED; } |