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

Commit 05ad9426 authored by Louis Chang's avatar Louis Chang
Browse files

Do not reposition leaf tasks from grandparent tasks

A leaf task was added to be the child of its grandparent while
switch user, which caused exception while reparenting split-screen
tasks to fullscreen.

Bug: 161167885
Test: switch user in split-screen
Test: atest TaskTests
Change-Id: Iffde4ddfbe315d0226961f7d98a897b34062c376
Merged-In: Iffde4ddfbe315d0226961f7d98a897b34062c376
parent b7130b27
Loading
Loading
Loading
Loading
+3 −6
Original line number Diff line number Diff line
@@ -928,12 +928,9 @@ class ActivityStack extends Task {
        mCurrentUser = userId;

        super.switchUser(userId);
        forAllLeafTasks((t) -> {
            if (t.showToCurrentUser() && t != this) {
                mChildren.remove(t);
                mChildren.add(t);
        if (isLeafTask() && showToCurrentUser()) {
            getParent().positionChildAt(POSITION_TOP, this, false /*includeParents*/);
        }
        }, true /* traverseTopToBottom */);
    }

    void minimalResumeActivityLocked(ActivityRecord r) {
+1 −1
Original line number Diff line number Diff line
@@ -335,7 +335,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
                    }
                }
            } else {
                throw new RuntimeException("Reparenting leaf Tasks is not supported now.");
                throw new RuntimeException("Reparenting leaf Tasks is not supported now. " + task);
            }
        } else {
            // Ugh, of course ActivityStack has its own special reorder logic...
+15 −0
Original line number Diff line number Diff line
@@ -186,4 +186,19 @@ public class TaskTests extends WindowTestsBase {
            assertTrue(r.finishing);
        });
    }

    @Test
    public void testSwitchUser() {
        final Task rootTask = createTaskStackOnDisplay(mDisplayContent);
        final Task childTask = createTaskInStack((ActivityStack) rootTask, 0 /* userId */);
        final Task leafTask1 = createTaskInStack((ActivityStack) childTask, 10 /* userId */);
        final Task leafTask2 = createTaskInStack((ActivityStack) childTask, 0 /* userId */);
        assertEquals(1, rootTask.getChildCount());
        assertEquals(leafTask2, childTask.getTopChild());

        doReturn(true).when(leafTask1).showToCurrentUser();
        rootTask.switchUser(10);
        assertEquals(1, rootTask.getChildCount());
        assertEquals(leafTask1, childTask.getTopChild());
    }
}