diff options
| author | 2024-12-17 13:42:38 +0000 | |
|---|---|---|
| committer | 2024-12-19 12:09:44 +0000 | |
| commit | cb1c539c356e19d3ad2c44552fd8a3b376fc2472 (patch) | |
| tree | 2033c071d575e685d80054b7575cf8529a7b24db | |
| parent | 695f6d6cfbe0f1458f58c648e86eb4662ba8eeed (diff) | |
Restore all user visible tasks on user switch.
Also make sure that there is only one entry for tasks being added for
non-current users.
Test: Manually test that an activity that's marked as visible for all
users and runs on User 0, is restored on user switch if it's also
visible previously.
Test: atest RootWindowContainerTest
Bug: 381038076
Flag: com.android.window.flags.enable_top_visible_root_task_per_user_tracking
Change-Id: Ibfa050915a354b7a31e63bcb1f2c510203a0d2f7
| -rw-r--r-- | services/core/java/com/android/server/wm/RootWindowContainer.java | 8 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java | 14 |
2 files changed, 17 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 3d2868540334..cb24c583325b 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -1941,7 +1941,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent> if (Flags.enableTopVisibleRootTaskPerUserTracking()) { final IntArray visibleRootTasks = new IntArray(); forAllRootTasks(rootTask -> { - if (mCurrentUser == rootTask.mUserId && rootTask.isVisibleRequested()) { + if ((mCurrentUser == rootTask.mUserId || rootTask.showForAllUsers()) + && rootTask.isVisible()) { visibleRootTasks.add(rootTask.getRootTaskId()); } }, /* traverseTopToBottom */ false); @@ -2045,6 +2046,11 @@ class RootWindowContainer extends WindowContainer<DisplayContent> if (Flags.enableTopVisibleRootTaskPerUserTracking()) { final IntArray rootTasks = mUserVisibleRootTasks.get(userId, new IntArray()); + // If root task already exists in the list, move it to the top instead. + final int rootTaskIndex = rootTasks.indexOf(rootTask.getRootTaskId()); + if (rootTaskIndex != -1) { + rootTasks.remove(rootTaskIndex); + } rootTasks.add(rootTask.getRootTaskId()); mUserVisibleRootTasks.put(userId, rootTasks); } else { diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java index 699ed0263756..7e62b89d35bb 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java @@ -1348,13 +1348,19 @@ public class RootWindowContainerTests extends WindowTestsBase { WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, true /* onTop */); doReturn(rootTask3).when(mRootWindowContainer).getTopDisplayFocusedRootTask(); - // Set up user ids and visibility + // Set up child tasks inside root tasks and set some of them visible + final Task task1 = new TaskBuilder(mSupervisor).setOnTop(true).setParentTask( + rootTask1).build(); + final Task task2 = new TaskBuilder(mSupervisor).setOnTop(true).setParentTask( + rootTask2).build(); + final Task task3 = new TaskBuilder(mSupervisor).setOnTop(true).setParentTask( + rootTask3).build(); rootTask1.mUserId = mRootWindowContainer.mCurrentUser; rootTask2.mUserId = mRootWindowContainer.mCurrentUser; rootTask3.mUserId = mRootWindowContainer.mCurrentUser; - rootTask1.mVisibleRequested = false; - rootTask2.mVisibleRequested = true; - rootTask3.mVisibleRequested = true; + doReturn(false).when(task1).isVisible(); + doReturn(true).when(task2).isVisible(); + doReturn(true).when(task3).isVisible(); // Switch to a different user int currentUser = mRootWindowContainer.mCurrentUser; |