diff options
| author | 2022-03-25 16:04:36 +0000 | |
|---|---|---|
| committer | 2022-03-25 16:04:36 +0000 | |
| commit | 5e5efacd1fceb6ebfc91dfd44ff37af5117b0f8c (patch) | |
| tree | e775a4f5bc606022c1bcc6ad6ad1f44854dc3257 | |
| parent | 20f8f2989dffdfc391244a82f601f5e12cd19adc (diff) | |
| parent | 4d63b2bdf19bbaef02ff170082297039de831ea8 (diff) | |
Merge "Remove the tasks created by the organizer when it dies." into tm-dev
| -rw-r--r-- | services/core/java/com/android/server/wm/TaskOrganizerController.java | 8 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java | 46 |
2 files changed, 53 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java index 3a8c8c7d6c94..18a76408fa24 100644 --- a/services/core/java/com/android/server/wm/TaskOrganizerController.java +++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java @@ -251,7 +251,13 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { // possible. while (!mOrganizedTasks.isEmpty()) { final Task t = mOrganizedTasks.get(0); - t.updateTaskOrganizerState(true /* forceUpdate */); + if (t.mCreatedByOrganizer) { + // The tasks created by this organizer should ideally be deleted when this + // organizer is disposed off to avoid inconsistent behavior. + t.removeImmediately(); + } else { + t.updateTaskOrganizerState(true /* forceUpdate */); + } if (mOrganizedTasks.contains(t)) { // updateTaskOrganizerState should remove the task from the list, but still // check it again to avoid while-loop isn't terminate. diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java index 9faf499f391a..eb91d5ec4d96 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java @@ -309,6 +309,52 @@ public class WindowOrganizerTests extends WindowTestsBase { } @Test + public void testUnregisterOrganizer_removesTasksCreatedByIt() throws RemoteException { + final Task rootTask = createRootTask(); + final Task task = createTask(rootTask); + final Task rootTask2 = createRootTask(); + rootTask2.mCreatedByOrganizer = true; + final Task task2 = createTask(rootTask2); + final ArrayList<TaskAppearedInfo> existingTasks = new ArrayList<>(); + final ITaskOrganizer organizer = registerMockOrganizer(existingTasks); + // Ensure events dispatch to organizer. + mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents(); + + // verify that tasks are returned and taskAppeared is called only for rootTask2 since it + // is the one created by this organizer. + assertContainsTasks(existingTasks, rootTask); + verify(organizer, times(1)).onTaskAppeared(any(RunningTaskInfo.class), + any(SurfaceControl.class)); + verify(organizer, times(0)).onTaskVanished(any()); + assertTrue(rootTask.isOrganized()); + + // Now we replace the registration and verify the new organizer receives existing tasks + final ArrayList<TaskAppearedInfo> existingTasks2 = new ArrayList<>(); + final ITaskOrganizer organizer2 = registerMockOrganizer(existingTasks2); + // Ensure events dispatch to organizer. + mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents(); + assertContainsTasks(existingTasks2, rootTask); + verify(organizer2, times(1)).onTaskAppeared(any(RunningTaskInfo.class), + any(SurfaceControl.class)); + verify(organizer2, times(0)).onTaskVanished(any()); + // Removed tasks from the original organizer + assertTaskVanished(organizer, true /* expectVanished */, rootTask, rootTask2); + assertTrue(rootTask2.isOrganized()); + + // Now we unregister the second one, the first one should automatically be reregistered + // so we verify that it's now seeing changes. + mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer2); + // Ensure events dispatch to organizer. + mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents(); + + verify(organizer, times(2)) + .onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); + assertFalse(rootTask2.isOrganized()); + assertTaskVanished(organizer2, true /* expectVanished */, rootTask, + rootTask2); + } + + @Test public void testOrganizerDeathReturnsRegistrationToPrevious() throws RemoteException { final Task rootTask = createRootTask(); final Task task = createTask(rootTask); |