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

Commit 3f29aa87 authored by Wale Ogunwale's avatar Wale Ogunwale Committed by gitbuildkicker
Browse files

Move stack to front in-sync with task reparenting

When reparenting a task to another stack have window manager move the
destination stack to the front at the same time it is reparenting the
task if REPARENT_MOVE_STACK_TO_FRONT is set to avoid jank.

Test: manual
Bug: 37299899
Change-Id: I45678e742188a4871f93a11178f7ab2b60c7bcc3
(cherry picked from commit 2719cc13)
parent 971ebb4a
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -658,7 +658,8 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta

            // Must reparent first in window manager to avoid a situation where AM can delete the
            // we are coming from in WM before we reparent because it became empty.
            mWindowContainerController.reparent(toStack.getWindowContainerController(), position);
            mWindowContainerController.reparent(toStack.getWindowContainerController(), position,
                    moveStackMode == REPARENT_MOVE_STACK_TO_FRONT);

            // Move the task
            sourceStack.removeTask(this, reason, REMOVE_TASK_MODE_MOVING);
+2 −2
Original line number Diff line number Diff line
@@ -184,7 +184,7 @@ class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerU
        super.removeImmediately();
    }

    void reparent(TaskStack stack, int position) {
    void reparent(TaskStack stack, int position, boolean moveParents) {
        if (stack == mStack) {
            throw new IllegalArgumentException(
                    "task=" + this + " already child of stack=" + mStack);
@@ -195,7 +195,7 @@ class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerU
        final DisplayContent prevDisplayContent = getDisplayContent();

        getParent().removeChild(this);
        stack.addTask(this, position, showForAllUsers(), false /* moveParents */);
        stack.addTask(this, position, showForAllUsers(), moveParents);

        // Relayout display(s).
        final DisplayContent displayContent = stack.getDisplayContent();
+2 −2
Original line number Diff line number Diff line
@@ -121,7 +121,7 @@ public class TaskWindowContainerController
        }
    }

    public void reparent(StackWindowController stackController, int position) {
    public void reparent(StackWindowController stackController, int position, boolean moveParents) {
        synchronized (mWindowMap) {
            if (DEBUG_STACK) Slog.i(TAG_WM, "reparent: moving taskId=" + mTaskId
                    + " to stack=" + stackController + " at " + position);
@@ -135,7 +135,7 @@ public class TaskWindowContainerController
                throw new IllegalArgumentException("reparent: could not find stack="
                        + stackController);
            }
            mContainer.reparent(stack, position);
            mContainer.reparent(stack, position, moveParents);
            mContainer.getDisplayContent().layoutAndAssignWindowLayersIfNeeded();
        }
    }
+4 −4
Original line number Diff line number Diff line
@@ -89,7 +89,7 @@ public class TaskWindowContainerControllerTests extends WindowTestsBase {

        boolean gotException = false;
        try {
            taskController.reparent(stackController1, 0);
            taskController.reparent(stackController1, 0, false/* moveParents */);
        } catch (IllegalArgumentException e) {
            gotException = true;
        }
@@ -100,14 +100,14 @@ public class TaskWindowContainerControllerTests extends WindowTestsBase {
        stackController3.setContainer(null);
        gotException = false;
        try {
            taskController.reparent(stackController3, 0);
            taskController.reparent(stackController3, 0, false/* moveParents */);
        } catch (IllegalArgumentException e) {
            gotException = true;
        }
        assertTrue("Should not be able to reparent to a stack that doesn't have a container",
                gotException);

        taskController.reparent(stackController2, 0);
        taskController.reparent(stackController2, 0, false/* moveParents */);
        assertEquals(stackController2.mContainer, taskController.mContainer.getParent());
        assertEquals(0, ((WindowTestUtils.TestTask) taskController.mContainer).positionInParent());
        assertEquals(1, ((WindowTestUtils.TestTask) taskController2.mContainer).positionInParent());
@@ -135,7 +135,7 @@ public class TaskWindowContainerControllerTests extends WindowTestsBase {
                (WindowTestUtils.TestTask) taskController2.mContainer;

        // Reparent and check state
        taskController.reparent(stack2Controller, 0);
        taskController.reparent(stack2Controller, 0, false /* moveParents */);
        assertEquals(stack2, task1.getParent());
        assertEquals(0, task1.positionInParent());
        assertEquals(1, task2.positionInParent());