From 9c5b677cef5568cb5c5db3e8b639e44caf78e9b1 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Thu, 16 Jun 2022 22:36:14 +0800 Subject: [PATCH] Request starting window first when moving task with shell transition Both binder calls (add-starting-window, request-transition) from core to shell will post to wmshell.main thread. And because starting window controller will post to its wmshell.splashscreen thread, if starting window is scheduled earlier, these 2 operations can run in parallel. This aligns the same order as startActivity. Bug: 235323163 Test: adb shell setprop persist.wm.debug.shell_transit 1; reboot Launch app from recents. Change-Id: Ibcefb4c446217f8a3bdc2e20bfbfce8029d6981b --- .../server/wm/ActivityTaskManagerService.java | 8 -------- .../server/wm/ActivityTaskSupervisor.java | 19 +++++++++++++++---- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 7bc551b2aacc6..b76582fcf3b95 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -2179,14 +2179,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { : null; mTaskSupervisor.findTaskToMoveToFront(task, flags, realOptions, "moveTaskToFront", false /* forceNonResizable */); - - final ActivityRecord topActivity = task.getTopNonFinishingActivity(); - if (topActivity != null) { - - // We are reshowing a task, use a starting window to hide the initial draw delay - // so the transition can start earlier. - topActivity.showStartingWindow(true /* taskSwitch */); - } } finally { Binder.restoreCallingIdentity(origId); } diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java index 863faa190692c..84740683f6aa1 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java @@ -1434,10 +1434,10 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { mUserLeaving = true; } - task.mTransitionController.requestTransitionIfNeeded(TRANSIT_TO_FRONT, - 0 /* flags */, task, task /* readyGroupRef */, - options != null ? options.getRemoteTransition() : null, - null /* displayChange */); + final Transition newTransition = task.mTransitionController.isShellTransitionsEnabled() + ? task.mTransitionController.isCollecting() ? null + : task.mTransitionController.createTransition(TRANSIT_TO_FRONT) : null; + task.mTransitionController.collect(task); reason = reason + " findTaskToMoveToFront"; boolean reparented = false; if (task.isResizeable() && canUseActivityOptionsLaunchBounds(options)) { @@ -1480,6 +1480,17 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { handleNonResizableTaskIfNeeded(task, WINDOWING_MODE_UNDEFINED, mRootWindowContainer.getDefaultTaskDisplayArea(), currentRootTask, forceNonResizeable); + if (r != null) { + // Use a starting window to reduce the transition latency for reshowing the task. + // Note that with shell transition, this should be executed before requesting + // transition to avoid delaying the starting window. + r.showStartingWindow(true /* taskSwitch */); + } + if (newTransition != null) { + task.mTransitionController.requestStartTransition(newTransition, task, + options != null ? options.getRemoteTransition() : null, + null /* displayChange */); + } } finally { mUserLeaving = false; }