summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/TaskDisplayArea.java8
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java31
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 bda575974728..9d14e0d5d984 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<Task> {
.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 c5c947bf21d8..4bd8edd44f5c 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();