From 05ad942626b230b41d5cf9654ed86d6e436b1f70 Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Wed, 22 Jul 2020 16:07:02 +0800 Subject: Do not reposition leaf tasks from grandparent tasks A leaf task was added to be the child of its grandparent while switch user, which caused exception while reparenting split-screen tasks to fullscreen. Bug: 161167885 Test: switch user in split-screen Test: atest TaskTests Change-Id: Iffde4ddfbe315d0226961f7d98a897b34062c376 Merged-In: Iffde4ddfbe315d0226961f7d98a897b34062c376 --- .../core/java/com/android/server/wm/ActivityStack.java | 9 +++------ .../com/android/server/wm/WindowOrganizerController.java | 2 +- .../wmtests/src/com/android/server/wm/TaskTests.java | 15 +++++++++++++++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index e9768a26f571..cf1d59ff2fe4 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 930bfded39a4..21a76ff763a8 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 9d88ada5a90c..9feb83fde4fa 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()); + } } -- cgit v1.2.3-59-g8ed1b