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

Commit 41d01649 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Fix recursive calls on DC#ensureActivitiesVisible" into rvc-dev am:...

Merge "Fix recursive calls on DC#ensureActivitiesVisible" into rvc-dev am: 37bdfa34 am: 6aab2543 am: a9562d4f am: 20b40b39

Change-Id: I02ee7c9390f0660f1fcc058e8cf3ca9bc0cc3f8a
parents 0ee4c872 20b40b39
Loading
Loading
Loading
Loading
+18 −3
Original line number Diff line number Diff line
@@ -626,6 +626,12 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
    // Used in performing layout
    private boolean mTmpWindowsBehindIme;

    /**
     * Used to prevent recursions when calling
     * {@link #ensureActivitiesVisible(ActivityRecord, int, boolean, boolean)}
     */
    private boolean mInEnsureActivitiesVisible = false;

    private final Consumer<WindowState> mUpdateWindowsForAnimator = w -> {
        WindowStateAnimator winAnimator = w.mWinAnimator;
        final ActivityRecord activity = w.mActivityRecord;
@@ -5380,10 +5386,19 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo

    void ensureActivitiesVisible(ActivityRecord starting, int configChanges,
            boolean preserveWindows, boolean notifyClients) {
        if (mInEnsureActivitiesVisible) {
            // Don't do recursive work.
            return;
        }
        mInEnsureActivitiesVisible = true;
        try {
            for (int i = getTaskDisplayAreaCount() - 1; i >= 0; --i) {
                getTaskDisplayAreaAt(i).ensureActivitiesVisible(starting, configChanges,
                        preserveWindows, notifyClients);
            }
        } finally {
            mInEnsureActivitiesVisible = false;
        }
    }

    boolean isSleeping() {
+18 −1
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;

import android.annotation.SuppressLint;
import android.app.ActivityTaskManager;
@@ -1142,7 +1143,7 @@ public class DisplayContentTests extends WindowTestsBase {
        Mockito.doReturn(ROTATION_90).when(dr).rotationForOrientation(anyInt(), anyInt());
        final boolean[] continued = new boolean[1];
        // TODO(display-merge): Remove cast
        Mockito.doAnswer(
        doAnswer(
                invocation -> {
                    continued[0] = true;
                    return true;
@@ -1248,6 +1249,22 @@ public class DisplayContentTests extends WindowTestsBase {
        assertEquals(window, result);
    }

    @Test
    public void testEnsureActivitiesVisibleNotRecursive() {
        final TaskDisplayArea mockTda = mock(TaskDisplayArea.class);
        doReturn(mockTda).when(mDisplayContent).getTaskDisplayAreaAt(anyInt());
        final boolean[] called = { false };
        doAnswer(invocation -> {
            // The assertion will fail if DisplayArea#ensureActivitiesVisible is called twice.
            assertFalse(called[0]);
            called[0] = true;
            mDisplayContent.ensureActivitiesVisible(null, 0, false, false);
            return null;
        }).when(mockTda).ensureActivitiesVisible(any(), anyInt(), anyBoolean(), anyBoolean());

        mDisplayContent.ensureActivitiesVisible(null, 0, false, false);
    }

    private boolean isOptionsPanelAtRight(int displayId) {
        return (mWm.getPreferredOptionsPanelGravity(displayId) & Gravity.RIGHT) == Gravity.RIGHT;
    }