From c0d53be1ae06448f30e2c59df87b18a5a224900d Mon Sep 17 00:00:00 2001 From: Daichi Hirono Date: Mon, 19 Oct 2020 15:09:08 +0900 Subject: [PATCH] Don't reparent stack created by organizer. An organizer controlls its stacks. The system should not move them to another display. With this CL, for stacks created by organizer, the system tries reparenting their direct children, then removed the stacks. Bug: 162825804 Test: atest TaskDisplayAreaTests Change-Id: I18fcae7a8c61d83014d5ab227a5a9ab9683299a7 --- .../android/server/wm/TaskDisplayArea.java | 8 +++-- .../server/wm/TaskDisplayAreaTests.java | 31 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index bda5759747287..9d14e0d5d9849 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -1851,8 +1851,12 @@ final class TaskDisplayArea extends DisplayArea { .getTopStackInWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY) : null; for (int stackNdx = 0; stackNdx < numStacks; stackNdx++) { final Task stack = getStackAt(stackNdx); - // Always finish non-standard type stacks. - if (destroyContentOnRemoval || !stack.isActivityTypeStandardOrUndefined()) { + // Always finish non-standard type stacks and stacks created by a organizer. + // TODO: For stacks created by organizer, consider reparenting children tasks if the use + // case arises in the future. + if (destroyContentOnRemoval + || !stack.isActivityTypeStandardOrUndefined() + || stack.mCreatedByOrganizer) { stack.finishAllActivitiesImmediately(); } else { // Reparent the stack to the root task of secondary-split-screen or display area. diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java index c5c947bf21d89..4bd8edd44f5c6 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java @@ -296,6 +296,37 @@ public class TaskDisplayAreaTests extends WindowTestsBase { assertThat(taskDisplayArea.getOrientation()).isEqualTo(SCREEN_ORIENTATION_UNSET); } + @Test + @UseTestDisplay + public void testRemove_reparentToDefault() { + final Task task = createTaskStackOnDisplay(mDisplayContent); + final TaskDisplayArea displayArea = task.getDisplayArea(); + displayArea.remove(); + assertTrue(displayArea.isRemoved()); + assertFalse(displayArea.hasChild()); + + final RootWindowContainer rootWindowContainer = mWm.mAtmService.mRootWindowContainer; + final TaskDisplayArea defaultTaskDisplayArea = + rootWindowContainer.getDefaultTaskDisplayArea(); + assertTrue(defaultTaskDisplayArea.mChildren.contains(task)); + } + + @Test + @UseTestDisplay + public void testRemove_stackCreatedByOrganizer() { + final Task task = createTaskStackOnDisplay(mDisplayContent); + task.mCreatedByOrganizer = true; + final TaskDisplayArea displayArea = task.getDisplayArea(); + displayArea.remove(); + assertTrue(displayArea.isRemoved()); + assertFalse(displayArea.hasChild()); + + final RootWindowContainer rootWindowContainer = mWm.mAtmService.mRootWindowContainer; + final TaskDisplayArea defaultTaskDisplayArea = + rootWindowContainer.getDefaultTaskDisplayArea(); + assertFalse(defaultTaskDisplayArea.mChildren.contains(task)); + } + private void assertGetOrCreateStack(int windowingMode, int activityType, Task candidateTask, boolean reuseCandidate) { final TaskDisplayArea taskDisplayArea = candidateTask.getDisplayArea();