Merge "Traverse all leaf task when processing activities visibility"
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 6ffd9a2..ef1a3be 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -5770,8 +5770,9 @@
boolean preserveWindows, boolean notifyClients) {
mStackSupervisor.beginActivityVisibilityUpdate();
try {
- mEnsureActivitiesVisibleHelper.process(starting, configChanges, preserveWindows,
- notifyClients);
+ forAllLeafTasks(task -> task.mEnsureActivitiesVisibleHelper.process(
+ starting, configChanges, preserveWindows, notifyClients),
+ true /* traverseTopToBottom */);
if (mTranslucentActivityWaiting != null &&
mUndrawnActivitiesBelowTopTranslucent.isEmpty()) {
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
index ace0400..3203ccb 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
@@ -23,6 +23,7 @@
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
@@ -181,17 +182,27 @@
}
@Test
- public void testSwitchUser() {
+ public void testEnsureActivitiesVisible() {
final Task rootTask = createTaskStackOnDisplay(mDisplayContent);
- final Task childTask = createTaskInStack(rootTask, 0 /* userId */);
- final Task leafTask1 = createTaskInStack(childTask, 10 /* userId */);
- final Task leafTask2 = createTaskInStack(childTask, 0 /* userId */);
- assertEquals(1, rootTask.getChildCount());
- assertEquals(leafTask2, childTask.getTopChild());
+ final Task leafTask1 = createTaskInStack(rootTask, 0 /* userId */);
+ final Task leafTask2 = createTaskInStack(rootTask, 0 /* userId */);
+ final ActivityRecord activity1 = createActivityRecordInTask(mDisplayContent, leafTask1);
+ final ActivityRecord activity2 = createActivityRecordInTask(mDisplayContent, leafTask2);
- doReturn(true).when(leafTask1).showToCurrentUser();
- rootTask.switchUser(10);
- assertEquals(1, rootTask.getChildCount());
- assertEquals(leafTask1, childTask.getTopChild());
+ // Check visibility of occluded tasks
+ doReturn(false).when(leafTask1).shouldBeVisible(any());
+ doReturn(true).when(leafTask2).shouldBeVisible(any());
+ rootTask.ensureActivitiesVisible(
+ null /* starting */ , 0 /* configChanges */, false /* preserveWindows */);
+ assertFalse(activity1.isVisible());
+ assertTrue(activity2.isVisible());
+
+ // Check visibility of not occluded tasks
+ doReturn(true).when(leafTask1).shouldBeVisible(any());
+ doReturn(true).when(leafTask2).shouldBeVisible(any());
+ rootTask.ensureActivitiesVisible(
+ null /* starting */ , 0 /* configChanges */, false /* preserveWindows */);
+ assertTrue(activity1.isVisible());
+ assertTrue(activity2.isVisible());
}
}