summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/Task.java18
-rw-r--r--services/core/java/com/android/server/wm/TaskOrganizerController.java5
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java21
3 files changed, 25 insertions, 19 deletions
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index dc15cb781bc8..816d0a27e05a 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -1175,7 +1175,7 @@ class Task extends TaskFragment {
// Call this again after super onParentChanged in-case the surface wasn't created yet
// (happens when the task is first inserted into the hierarchy). It's a no-op if it
// already ran fully within super.onParentChanged
- updateTaskOrganizerState(false /* forceUpdate */);
+ updateTaskOrganizerState();
// TODO(b/168037178): The check for null display content and setting it to null doesn't
// really make sense here...
@@ -1951,7 +1951,7 @@ class Task extends TaskFragment {
}
saveLaunchingStateIfNeeded();
- final boolean taskOrgChanged = updateTaskOrganizerState(false /* forceUpdate */);
+ final boolean taskOrgChanged = updateTaskOrganizerState();
if (taskOrgChanged) {
updateSurfacePosition(getSyncTransaction());
if (!isOrganized()) {
@@ -4269,21 +4269,18 @@ class Task extends TaskFragment {
return true;
}
- boolean updateTaskOrganizerState(boolean forceUpdate) {
- return updateTaskOrganizerState(forceUpdate, false /* skipTaskAppeared */);
+ boolean updateTaskOrganizerState() {
+ return updateTaskOrganizerState(false /* skipTaskAppeared */);
}
/**
* Called when the task state changes (ie. from windowing mode change) an the task organizer
* state should also be updated.
*
- * @param forceUpdate Updates the task organizer to the one currently specified in the task
- * org controller for the task's windowing mode, ignoring the cached
- * windowing mode checks.
* @param skipTaskAppeared Skips calling taskAppeared for the new organizer if it has changed
* @return {@code true} if task organizer changed.
*/
- boolean updateTaskOrganizerState(boolean forceUpdate, boolean skipTaskAppeared) {
+ boolean updateTaskOrganizerState(boolean skipTaskAppeared) {
if (getSurfaceControl() == null) {
// Can't call onTaskAppeared without a surfacecontrol, so defer this until next one
// is created.
@@ -4295,7 +4292,10 @@ class Task extends TaskFragment {
final TaskOrganizerController controller = mWmService.mAtmService.mTaskOrganizerController;
final ITaskOrganizer organizer = controller.getTaskOrganizer();
- if (!forceUpdate && mTaskOrganizer == organizer) {
+ // Do not change to different organizer if the task is created by organizer because only
+ // the creator knows how to manage it.
+ if (mCreatedByOrganizer && mTaskOrganizer != null && organizer != null
+ && mTaskOrganizer != organizer) {
return false;
}
return setTaskOrganizer(organizer, skipTaskAppeared);
diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java
index 9bf988f16090..3ab4efda08c9 100644
--- a/services/core/java/com/android/server/wm/TaskOrganizerController.java
+++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java
@@ -257,7 +257,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
// organizer is disposed off to avoid inconsistent behavior.
t.removeImmediately();
} else {
- t.updateTaskOrganizerState(true /* forceUpdate */);
+ t.updateTaskOrganizerState();
}
if (mOrganizedTasks.contains(t)) {
// updateTaskOrganizerState should remove the task from the list, but still
@@ -381,8 +381,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
final TaskOrganizerState state = mTaskOrganizerStates.get(organizer.asBinder());
mService.mRootWindowContainer.forAllTasks((task) -> {
boolean returnTask = !task.mCreatedByOrganizer;
- task.updateTaskOrganizerState(true /* forceUpdate */,
- returnTask /* skipTaskAppeared */);
+ task.updateTaskOrganizerState(returnTask /* skipTaskAppeared */);
if (returnTask) {
SurfaceControl outSurfaceControl = state.addTaskWithoutCallback(task,
"TaskOrganizerController.registerTaskOrganizer");
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 832bd2d8b951..40ca2506fab1 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
@@ -370,13 +370,16 @@ public class WindowOrganizerTests extends WindowTestsBase {
// Ensure events dispatch to organizer.
mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
assertContainsTasks(existingTasks2, rootTask);
- verify(organizer2, times(1)).onTaskAppeared(any(RunningTaskInfo.class),
+ verify(organizer2, never()).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());
+ // The non-CreatedByOrganizer task is removed from the original organizer.
+ assertTaskVanished(organizer, true /* expectVanished */, rootTask);
+ assertEquals(organizer2, rootTask.mTaskOrganizer);
+ // The CreatedByOrganizer task should be still organized by the original organizer.
+ assertEquals(organizer, rootTask2.mTaskOrganizer);
+ clearInvocations(organizer);
// 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);
@@ -385,9 +388,13 @@ public class WindowOrganizerTests extends WindowTestsBase {
verify(organizer, times(2))
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
- assertFalse(rootTask2.isOrganized());
- assertTaskVanished(organizer2, true /* expectVanished */, rootTask,
- rootTask2);
+
+ // Unregister the first one. The CreatedByOrganizer task created by it must be removed.
+ mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer);
+ assertFalse(rootTask2.isAttached());
+ assertFalse(task2.isAttached());
+ // Normal task should keep.
+ assertTrue(task.isAttached());
}
@Test