summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java39
2 files changed, 40 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 26d6c78b5d33..d455ef77faf4 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -2214,7 +2214,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
// It is possible that request to finish activity might also remove its task and
// stack, so we need to be careful with indexes in the loop and check child count
// every time.
- for (int stackNdx = 0; stackNdx < display.getStackCount(); ++stackNdx) {
+ for (int stackNdx = 0; stackNdx < taskDisplayArea.getStackCount(); ++stackNdx) {
final ActivityStack stack = taskDisplayArea.getStackAt(stackNdx);
final Task t = stack.finishTopCrashedActivityLocked(app, reason);
if (stack == focusedStack || finishedTask == null) {
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
index b648346eeb28..d0b93d03204a 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
@@ -26,6 +26,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMAR
import static android.content.pm.ActivityInfo.FLAG_ALWAYS_FOCUSABLE;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.TYPE_VIRTUAL;
+import static android.window.DisplayAreaOrganizer.FEATURE_VENDOR_FIRST;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
@@ -247,6 +248,44 @@ public class RootActivityContainerTests extends ActivityTestsBase {
assertEquals(originalStackCount, defaultTaskDisplayArea.getStackCount());
}
+ /**
+ * Verifies that removal of activities with task and stack is done correctly when there are
+ * several task display areas.
+ */
+ @Test
+ public void testRemovingStackOnAppCrash_multipleDisplayAreas() {
+ final TaskDisplayArea defaultTaskDisplayArea = mRootWindowContainer
+ .getDefaultTaskDisplayArea();
+ final int originalStackCount = defaultTaskDisplayArea.getStackCount();
+ final ActivityStack stack = defaultTaskDisplayArea.createStack(
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, false /* onTop */);
+ final ActivityRecord firstActivity = new ActivityBuilder(mService).setCreateTask(true)
+ .setStack(stack).build();
+ assertEquals(originalStackCount + 1, defaultTaskDisplayArea.getStackCount());
+
+ final DisplayContent dc = defaultTaskDisplayArea.getDisplayContent();
+ doReturn(2).when(dc).getTaskDisplayAreaCount();
+ final TaskDisplayArea secondTaskDisplayArea = new TaskDisplayArea(dc,
+ mRootWindowContainer.mWmService, "SecondaryTaskDisplayArea", FEATURE_VENDOR_FIRST);
+ // Add second display area right above the default one
+ defaultTaskDisplayArea.getParent().addChild(secondTaskDisplayArea,
+ defaultTaskDisplayArea.getParent().mChildren.indexOf(defaultTaskDisplayArea) + 1);
+ doReturn(secondTaskDisplayArea).when(dc).getTaskDisplayAreaAt(1);
+ final ActivityStack secondStack = secondTaskDisplayArea.createStack(
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, false /* onTop */);
+ new ActivityBuilder(mService).setCreateTask(true).setStack(secondStack)
+ .setUseProcess(firstActivity.app).build();
+ assertEquals(1, secondTaskDisplayArea.getStackCount());
+
+ // Let's pretend that the app has crashed.
+ firstActivity.app.setThread(null);
+ mRootWindowContainer.finishTopCrashedActivities(firstActivity.app, "test");
+
+ // Verify that the stacks were removed.
+ assertEquals(originalStackCount, defaultTaskDisplayArea.getStackCount());
+ assertEquals(0, secondTaskDisplayArea.getStackCount());
+ }
+
@Test
public void testFocusability() {
final TaskDisplayArea defaultTaskDisplayArea = mRootWindowContainer