Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c0d53be1 authored by Daichi Hirono's avatar Daichi Hirono
Browse files

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
parent 54c1598b
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -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.
+31 −0
Original line number Diff line number Diff line
@@ -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();