From 671e62aa47c759db30d824c6d49d54b466ea09d3 Mon Sep 17 00:00:00 2001 From: Mady Mellor Date: Thu, 31 Mar 2022 21:25:27 +0000 Subject: [PATCH] When calling removeTask pass mRemoveWithTaskOrganizer In this one case of calling removeTask false was always being passed instead of the value on mRemoveWithTaskOrganizer. This caused the bubble activity to remain on the display after a sysui crash/ runtime restart. The fix is to use the value on the task. Test: atest WindowOrganizerTests Test: manual - expand a bubble - adb shell am crash com.android.systemui => observe that the expanded bubble view isn't hanging around onscreen and opening the bubble works fine Bug: 227520971 Change-Id: I8b2861da82cf5eda56aa58015c1f11c5d6aed2c0 --- .../server/wm/TaskOrganizerController.java | 2 +- .../server/wm/WindowOrganizerTests.java | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java index 18a76408fa245..8a0ae65267a32 100644 --- a/services/core/java/com/android/server/wm/TaskOrganizerController.java +++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java @@ -602,7 +602,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { void onTaskVanished(ITaskOrganizer organizer, Task task) { final TaskOrganizerState state = mTaskOrganizerStates.get(organizer.asBinder()); - if (state != null && state.removeTask(task, false /* removeFromSystem */)) { + if (state != null && state.removeTask(task, task.mRemoveWithTaskOrganizer)) { onTaskVanishedInternal(organizer, task); } } 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 eb91d5ec4d964..832bd2d8b9517 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java @@ -246,6 +246,42 @@ public class WindowOrganizerTests extends WindowTestsBase { assertFalse(rootTask.isOrganized()); } + @Test + public void testRemoveWithOrganizerRemovesTask() throws RemoteException { + final ITaskOrganizer organizer = registerMockOrganizer(); + final Task rootTask = createRootTask(); + final Task task = createTask(rootTask); + rootTask.mRemoveWithTaskOrganizer = true; + + mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents(); + verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); + assertTrue(rootTask.isOrganized()); + + spyOn(mWm.mAtmService); + rootTask.setTaskOrganizer(null); + mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents(); + + verify(mWm.mAtmService).removeTask(eq(rootTask.mTaskId)); + } + + @Test + public void testNoRemoveWithOrganizerNoRemoveTask() throws RemoteException { + final ITaskOrganizer organizer = registerMockOrganizer(); + final Task rootTask = createRootTask(); + final Task task = createTask(rootTask); + rootTask.mRemoveWithTaskOrganizer = false; + + mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents(); + verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); + assertTrue(rootTask.isOrganized()); + + spyOn(mWm.mAtmService); + rootTask.setTaskOrganizer(null); + mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents(); + + verify(mWm.mAtmService, never()).removeTask(eq(rootTask.mTaskId)); + } + @Test public void testUnregisterOrganizer() throws RemoteException { final ITaskOrganizer organizer = registerMockOrganizer();