From af77803228c4c06f17be8e814dd1ab20bedceded Mon Sep 17 00:00:00 2001 From: Chilun Huang Date: Wed, 8 Feb 2023 17:59:24 +0800 Subject: [PATCH] Remove split pair according to last visible task Sometimes a split pair may exit in the background. At this time, the stage has no visible tasks and cause missing to reomve the split pair. This is to get the last visible task id to remove the split pair. Bug: 267245649 Test: atest WMShellUnitTests Change-Id: I995518f4f3171f545ef78f9c6c40b34310a041ac --- .../wm/shell/splitscreen/StageCoordinator.java | 4 ++-- .../wm/shell/splitscreen/StageTaskListener.java | 14 ++++++++++++++ 2 files changed, 16 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 219f87eac7f26..3e142d6c05e96 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 @@ -1148,8 +1148,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // Notify recents if we are exiting in a way that breaks the pair, and disable further // updates to splits in the recents until we enter split again if (shouldBreakPairedTaskInRecents(exitReason) && mShouldUpdateRecents) { - recentTasks.removeSplitPair(mMainStage.getTopVisibleChildTaskId()); - recentTasks.removeSplitPair(mSideStage.getTopVisibleChildTaskId()); + recentTasks.removeSplitPair(mMainStage.getLastVisibleTaskId()); + recentTasks.removeSplitPair(mSideStage.getLastVisibleTaskId()); } }); mShouldUpdateRecents = false; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java index a841b7f96d3c5..0359761388dc2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java @@ -92,6 +92,7 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { protected SurfaceControl mDimLayer; protected SparseArray mChildrenTaskInfo = new SparseArray<>(); private final SparseArray mChildrenLeashes = new SparseArray<>(); + private int mLastVisibleTaskId = INVALID_TASK_ID; // TODO(b/204308910): Extracts SplitDecorManager related code to common package. private SplitDecorManager mSplitDecorManager; @@ -122,6 +123,13 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { return contains(t -> t.token.asBinder() == binder); } + /** + * Returns the last visible task's id. + */ + int getLastVisibleTaskId() { + return mLastVisibleTaskId; + } + /** * Returns the top visible child task's id. */ @@ -221,6 +229,9 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { return; } mChildrenTaskInfo.put(taskInfo.taskId, taskInfo); + if (taskInfo.isVisible && taskInfo.taskId != mLastVisibleTaskId) { + mLastVisibleTaskId = taskInfo.taskId; + } mCallbacks.onChildTaskStatusChanged(taskInfo.taskId, true /* present */, taskInfo.isVisible); if (!ENABLE_SHELL_TRANSITIONS) { @@ -253,6 +264,9 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { } else if (mChildrenTaskInfo.contains(taskId)) { mChildrenTaskInfo.remove(taskId); mChildrenLeashes.remove(taskId); + if (taskId == mLastVisibleTaskId) { + mLastVisibleTaskId = INVALID_TASK_ID; + } mCallbacks.onChildTaskStatusChanged(taskId, false /* present */, taskInfo.isVisible); if (ENABLE_SHELL_TRANSITIONS) { // Status is managed/synchronized by the transition lifecycle.