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

Commit baeb0e82 authored by Jerry Chang's avatar Jerry Chang
Browse files

Traverse all leaf task when processing activities visibility

To properly show top activities in multiple non-occluded child tasks,
traverses all leaf tasks when processing activities visibility instead
of processing it only in stack level.

Bug: 171198324
Test: atest TaskTests
Test: manual check split & bubbles behavior
Change-Id: Ic1554903f6623682c183c91dcbb1d947ed8bee55
parent c44ef9e2
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -5775,8 +5775,9 @@ class Task extends WindowContainer<WindowContainer> {
            boolean preserveWindows, boolean notifyClients) {
        mStackSupervisor.beginActivityVisibilityUpdate();
        try {
            mEnsureActivitiesVisibleHelper.process(starting, configChanges, preserveWindows,
                    notifyClients);
            forAllLeafTasks(task -> task.mEnsureActivitiesVisibleHelper.process(
                    starting, configChanges, preserveWindows, notifyClients),
                    true /* traverseTopToBottom */);

            if (mTranslucentActivityWaiting != null &&
                    mUndrawnActivitiesBelowTopTranslucent.isEmpty()) {
+22 −11
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.times;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
@@ -181,17 +182,27 @@ public class TaskTests extends WindowTestsBase {
    }

    @Test
    public void testSwitchUser() {
    public void testEnsureActivitiesVisible() {
        final Task rootTask = createTaskStackOnDisplay(mDisplayContent);
        final Task childTask = createTaskInStack(rootTask, 0 /* userId */);
        final Task leafTask1 = createTaskInStack(childTask, 10 /* userId */);
        final Task leafTask2 = createTaskInStack(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());
        final Task leafTask1 = createTaskInStack(rootTask, 0 /* userId */);
        final Task leafTask2 = createTaskInStack(rootTask, 0 /* userId */);
        final ActivityRecord activity1 = createActivityRecordInTask(mDisplayContent, leafTask1);
        final ActivityRecord activity2 = createActivityRecordInTask(mDisplayContent, leafTask2);

        // Check visibility of occluded tasks
        doReturn(false).when(leafTask1).shouldBeVisible(any());
        doReturn(true).when(leafTask2).shouldBeVisible(any());
        rootTask.ensureActivitiesVisible(
                null /* starting */ , 0 /* configChanges */, false /* preserveWindows */);
        assertFalse(activity1.isVisible());
        assertTrue(activity2.isVisible());

        // Check visibility of not occluded tasks
        doReturn(true).when(leafTask1).shouldBeVisible(any());
        doReturn(true).when(leafTask2).shouldBeVisible(any());
        rootTask.ensureActivitiesVisible(
                null /* starting */ , 0 /* configChanges */, false /* preserveWindows */);
        assertTrue(activity1.isVisible());
        assertTrue(activity2.isVisible());
    }
}