Loading services/core/java/com/android/server/wm/DisplayContent.java +18 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() { Loading services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +18 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; } Loading Loading
services/core/java/com/android/server/wm/DisplayContent.java +18 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() { Loading
services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +18 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; } Loading