summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Gaurav Bhola <gauravbhola@google.com> 2022-03-25 16:04:36 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-03-25 16:04:36 +0000
commit5e5efacd1fceb6ebfc91dfd44ff37af5117b0f8c (patch)
treee775a4f5bc606022c1bcc6ad6ad1f44854dc3257
parent20f8f2989dffdfc391244a82f601f5e12cd19adc (diff)
parent4d63b2bdf19bbaef02ff170082297039de831ea8 (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.java8
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java46
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);