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
This commit is contained in:
Daichi Hirono
2020-10-19 15:09:08 +09:00
parent 54c1598b59
commit c0d53be1ae
2 changed files with 37 additions and 2 deletions

View File

@@ -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.

View File

@@ -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();