From 2079686919ac9b456c3a0327bea42361a4792ac8 Mon Sep 17 00:00:00 2001 From: Tony Huang Date: Tue, 4 Jan 2022 17:06:17 +0800 Subject: [PATCH] Fix updateRecentTasksSplitPair unexpectly While split pair switching, split remain as active so it might record new bounds with old top task pair unexpectly. Fix this by set flag to false on startTasksWithLegacyTransition and reset to true after remote animation finished. Fix: 213128767 Test: manual Test: pass existing tests Change-Id: I42b4c79558467dec23b789a3b5cc2f8f38cd1c36 --- .../android/wm/shell/splitscreen/StageCoordinator.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 4c28be0421962..83830ec56c325 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -382,6 +382,8 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, float splitRatio, RemoteAnimationAdapter adapter) { // Init divider first to make divider leash for remote animation target. mSplitLayout.init(); + // Set false to avoid record new bounds with old task still on top; + mShouldUpdateRecents = false; final WindowContainerTransaction wct = new WindowContainerTransaction(); final WindowContainerTransaction evictWct = new WindowContainerTransaction(); prepareEvictChildTasks(SPLIT_POSITION_TOP_OR_LEFT, evictWct); @@ -406,6 +408,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, new IRemoteAnimationFinishedCallback.Stub() { @Override public void onAnimationFinished() throws RemoteException { + mShouldUpdateRecents = true; mSyncQueue.queue(evictWct); mSyncQueue.runInSync(t -> setDividerVisibility(true, t)); finishedCallback.onAnimationFinished(); @@ -428,6 +431,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, @Override public void onAnimationCancelled() { + mShouldUpdateRecents = true; mSyncQueue.queue(evictWct); mSyncQueue.runInSync(t -> setDividerVisibility(true, t)); try { @@ -834,7 +838,9 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, mLogger.logSideStageAppChange(getSideStagePosition(), mSideStage.getTopChildTaskUid(), mSplitLayout.isLandscape()); } - updateRecentTasksSplitPair(); + if (present && visible) { + updateRecentTasksSplitPair(); + } for (int i = mListeners.size() - 1; i >= 0; --i) { mListeners.get(i).onTaskStageChanged(taskId, stage, visible); @@ -850,7 +856,6 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, if (!mShouldUpdateRecents) { return; } - mRecentTasks.ifPresent(recentTasks -> { Rect topLeftBounds = mSplitLayout.getBounds1(); Rect bottomRightBounds = mSplitLayout.getBounds2();