From 9618134c058d1e8bc555e3b9d04a7bef09e9702d Mon Sep 17 00:00:00 2001 From: Evan Rosky Date: Thu, 6 Apr 2023 15:01:53 -0700 Subject: [PATCH] Just record initial task-order, don't collect the task Since we are recording the order but don't yet know if the task is expected to change. If we collect it without changing it, it could end up waiting for a non-collected child to report. Bug: 276608270 Test: atest IncompleteMotionTest Change-Id: I7ebf72e21c0844e42db8bb4944b62b0e31e062c4 --- .../android/server/wm/BLASTSyncEngine.java | 4 ++-- .../core/java/com/android/server/wm/Task.java | 2 +- .../com/android/server/wm/Transition.java | 19 +++++++++++++++---- .../server/wm/TransitionController.java | 6 ++++++ 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/wm/BLASTSyncEngine.java b/services/core/java/com/android/server/wm/BLASTSyncEngine.java index 48cf567ba9bed..92ceedb0da0be 100644 --- a/services/core/java/com/android/server/wm/BLASTSyncEngine.java +++ b/services/core/java/com/android/server/wm/BLASTSyncEngine.java @@ -305,8 +305,8 @@ class BLASTSyncEngine { if (mActiveSyncs.size() != 0) { // We currently only support one sync at a time, so start a new SyncGroup when there is // another may cause issue. - ProtoLog.w(WM_DEBUG_SYNC_ENGINE, - "SyncGroup %d: Started when there is other active SyncGroup", s.mSyncId); + Slog.e(TAG, "SyncGroup " + s.mSyncId + + ": Started when there is other active SyncGroup"); } mActiveSyncs.put(s.mSyncId, s); ProtoLog.v(WM_DEBUG_SYNC_ENGINE, "SyncGroup %d: Started for listener: %s", diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index db44532970017..b5725aed4a7c8 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -4687,7 +4687,7 @@ class Task extends TaskFragment { if (!isAttached()) { return; } - mTransitionController.collect(this); + mTransitionController.recordTaskOrder(this); final TaskDisplayArea taskDisplayArea = getDisplayArea(); diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 0fe1f923e4e51..17bf3de03c672 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -520,10 +520,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { mChanges.put(wc, info); } mParticipants.add(wc); - if (wc.getDisplayContent() != null && !mTargetDisplays.contains(wc.getDisplayContent())) { - mTargetDisplays.add(wc.getDisplayContent()); - addOnTopTasks(wc.getDisplayContent(), mOnTopTasksStart); - } + recordDisplay(wc.getDisplayContent()); if (info.mShowWallpaper) { // Collect the wallpaper token (for isWallpaper(wc)) so it is part of the sync set. final WindowState wallpaper = @@ -534,6 +531,20 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { } } + private void recordDisplay(DisplayContent dc) { + if (dc == null || mTargetDisplays.contains(dc)) return; + mTargetDisplays.add(dc); + addOnTopTasks(dc, mOnTopTasksStart); + } + + /** + * Records information about the initial task order. This does NOT collect anything. Call this + * before any ordering changes *could* occur, but it is not known yet if it will occur. + */ + void recordTaskOrder(WindowContainer from) { + recordDisplay(from.getDisplayContent()); + } + /** Adds the top non-alwaysOnTop tasks within `task` to `out`. */ private static void addOnTopTasks(Task task, ArrayList out) { for (int i = task.getChildCount() - 1; i >= 0; --i) { diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java index bcb8c46de5eda..fc59b8575bae2 100644 --- a/services/core/java/com/android/server/wm/TransitionController.java +++ b/services/core/java/com/android/server/wm/TransitionController.java @@ -605,6 +605,12 @@ class TransitionController { mCollectingTransition.collectExistenceChange(wc); } + /** @see Transition#recordTaskOrder */ + void recordTaskOrder(@NonNull WindowContainer wc) { + if (mCollectingTransition == null) return; + mCollectingTransition.recordTaskOrder(wc); + } + /** * Collects the window containers which need to be synced with the changing display area into * the current collecting transition.