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

This commit is contained in:
TreeHugger Robot
2020-05-25 12:07:20 +00:00
committed by Android (Google) Code Review
2 changed files with 36 additions and 4 deletions

View File

@@ -625,6 +625,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;
@@ -5442,9 +5448,18 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
void ensureActivitiesVisible(ActivityRecord starting, int configChanges,
boolean preserveWindows, boolean notifyClients) {
for (int i = getTaskDisplayAreaCount() - 1; i >= 0; --i) {
getTaskDisplayAreaAt(i).ensureActivitiesVisible(starting, configChanges,
preserveWindows, 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;
}
}

View File

@@ -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;
}