Merge "Fix recursive calls on DC#ensureActivitiesVisible" into rvc-dev am: 37bdfa34a6
Change-Id: If5515ba3ba23c04ef23865220befd8616df81ac4
This commit is contained in:
@@ -625,6 +625,12 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
|
|||||||
// Used in performing layout
|
// Used in performing layout
|
||||||
private boolean mTmpWindowsBehindIme;
|
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 -> {
|
private final Consumer<WindowState> mUpdateWindowsForAnimator = w -> {
|
||||||
WindowStateAnimator winAnimator = w.mWinAnimator;
|
WindowStateAnimator winAnimator = w.mWinAnimator;
|
||||||
final ActivityRecord activity = w.mActivityRecord;
|
final ActivityRecord activity = w.mActivityRecord;
|
||||||
@@ -5442,10 +5448,19 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
|
|||||||
|
|
||||||
void ensureActivitiesVisible(ActivityRecord starting, int configChanges,
|
void ensureActivitiesVisible(ActivityRecord starting, int configChanges,
|
||||||
boolean preserveWindows, boolean notifyClients) {
|
boolean preserveWindows, boolean notifyClients) {
|
||||||
|
if (mInEnsureActivitiesVisible) {
|
||||||
|
// Don't do recursive work.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mInEnsureActivitiesVisible = true;
|
||||||
|
try {
|
||||||
for (int i = getTaskDisplayAreaCount() - 1; i >= 0; --i) {
|
for (int i = getTaskDisplayAreaCount() - 1; i >= 0; --i) {
|
||||||
getTaskDisplayAreaAt(i).ensureActivitiesVisible(starting, configChanges,
|
getTaskDisplayAreaAt(i).ensureActivitiesVisible(starting, configChanges,
|
||||||
preserveWindows, notifyClients);
|
preserveWindows, notifyClients);
|
||||||
}
|
}
|
||||||
|
} finally {
|
||||||
|
mInEnsureActivitiesVisible = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isSleeping() {
|
boolean isSleeping() {
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ import static org.junit.Assert.assertThat;
|
|||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.doAnswer;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.app.ActivityTaskManager;
|
import android.app.ActivityTaskManager;
|
||||||
@@ -1142,7 +1143,7 @@ public class DisplayContentTests extends WindowTestsBase {
|
|||||||
Mockito.doReturn(ROTATION_90).when(dr).rotationForOrientation(anyInt(), anyInt());
|
Mockito.doReturn(ROTATION_90).when(dr).rotationForOrientation(anyInt(), anyInt());
|
||||||
final boolean[] continued = new boolean[1];
|
final boolean[] continued = new boolean[1];
|
||||||
// TODO(display-merge): Remove cast
|
// TODO(display-merge): Remove cast
|
||||||
Mockito.doAnswer(
|
doAnswer(
|
||||||
invocation -> {
|
invocation -> {
|
||||||
continued[0] = true;
|
continued[0] = true;
|
||||||
return true;
|
return true;
|
||||||
@@ -1248,6 +1249,22 @@ public class DisplayContentTests extends WindowTestsBase {
|
|||||||
assertEquals(window, result);
|
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) {
|
private boolean isOptionsPanelAtRight(int displayId) {
|
||||||
return (mWm.getPreferredOptionsPanelGravity(displayId) & Gravity.RIGHT) == Gravity.RIGHT;
|
return (mWm.getPreferredOptionsPanelGravity(displayId) & Gravity.RIGHT) == Gravity.RIGHT;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user