diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index e9768a26f571a..cf1d59ff2fe44 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -928,12 +928,9 @@ class ActivityStack extends Task { mCurrentUser = userId; super.switchUser(userId); - forAllLeafTasks((t) -> { - if (t.showToCurrentUser() && t != this) { - mChildren.remove(t); - mChildren.add(t); - } - }, true /* traverseTopToBottom */); + if (isLeafTask() && showToCurrentUser()) { + getParent().positionChildAt(POSITION_TOP, this, false /*includeParents*/); + } } void minimalResumeActivityLocked(ActivityRecord r) { diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 930bfded39a47..21a76ff763a83 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -335,7 +335,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub } } } else { - throw new RuntimeException("Reparenting leaf Tasks is not supported now."); + throw new RuntimeException("Reparenting leaf Tasks is not supported now. " + task); } } else { // Ugh, of course ActivityStack has its own special reorder logic... diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java index 9d88ada5a90cb..9feb83fde4fa3 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java @@ -186,4 +186,19 @@ public class TaskTests extends WindowTestsBase { assertTrue(r.finishing); }); } + + @Test + public void testSwitchUser() { + final Task rootTask = createTaskStackOnDisplay(mDisplayContent); + final Task childTask = createTaskInStack((ActivityStack) rootTask, 0 /* userId */); + final Task leafTask1 = createTaskInStack((ActivityStack) childTask, 10 /* userId */); + final Task leafTask2 = createTaskInStack((ActivityStack) childTask, 0 /* userId */); + assertEquals(1, rootTask.getChildCount()); + assertEquals(leafTask2, childTask.getTopChild()); + + doReturn(true).when(leafTask1).showToCurrentUser(); + rootTask.switchUser(10); + assertEquals(1, rootTask.getChildCount()); + assertEquals(leafTask1, childTask.getTopChild()); + } }