Merge "Fix recursive calls on DC#ensureActivitiesVisible" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
37bdfa34a6
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user