summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Orhan Uysal <uysalorhan@google.com> 2024-12-17 13:42:38 +0000
committer Orhan Uysal <uysalorhan@google.com> 2024-12-19 12:09:44 +0000
commitcb1c539c356e19d3ad2c44552fd8a3b376fc2472 (patch)
tree2033c071d575e685d80054b7575cf8529a7b24db
parent695f6d6cfbe0f1458f58c648e86eb4662ba8eeed (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.java8
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java14
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;