diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/RootWindowContainer.java | 2 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java | 39 |
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 |