summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/ActivityStack.java45
-rw-r--r--services/core/java/com/android/server/wm/Task.java22
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java52
3 files changed, 26 insertions, 93 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index 663423f8728b..ddf0117987dd 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -660,6 +660,8 @@ class ActivityStack extends Task implements BoundsAnimationTarget {
super.onConfigurationChanged(newParentConfig);
+ updateTaskOrganizerState();
+
// Only need to update surface size here since the super method will handle updating
// surface position.
updateSurfaceSize(getPendingTransaction());
@@ -762,6 +764,22 @@ class ActivityStack extends Task implements BoundsAnimationTarget {
}
}
+ void updateTaskOrganizerState() {
+ if (!isRootTask()) {
+ return;
+ }
+
+ final int windowingMode = getWindowingMode();
+ /*
+ * Different windowing modes may be managed by different task organizers. If
+ * getTaskOrganizer returns null, we still call setTaskOrganizer to
+ * make sure we clear it.
+ */
+ final ITaskOrganizer org =
+ mWmService.mAtmService.mTaskOrganizerController.getTaskOrganizer(windowingMode);
+ setTaskOrganizer(org);
+ }
+
@Override
public void setWindowingMode(int windowingMode) {
// Calling Task#setWindowingMode() for leaf task since this is the a specialization of
@@ -774,15 +792,6 @@ class ActivityStack extends Task implements BoundsAnimationTarget {
setWindowingMode(windowingMode, false /* animate */, false /* showRecents */,
false /* enteringSplitScreenMode */, false /* deferEnsuringVisibility */,
false /* creating */);
- windowingMode = getWindowingMode();
- /*
- * Different windowing modes may be managed by different task organizers. If
- * getTaskOrganizer returns null, we still call transferToTaskOrganizer to
- * make sure we clear it.
- */
- final ITaskOrganizer org =
- mWmService.mAtmService.mTaskOrganizerController.getTaskOrganizer(windowingMode);
- transferToTaskOrganizer(org);
}
/**
@@ -1583,24 +1592,6 @@ class ActivityStack extends Task implements BoundsAnimationTarget {
return topActivity != null && topActivity.mVisibleRequested;
}
- private static void transferSingleTaskToOrganizer(Task tr, ITaskOrganizer organizer) {
- tr.setTaskOrganizer(organizer);
- }
-
- /**
- * Transfer control of the leashes and IWindowContainers to the given ITaskOrganizer.
- * This will (or shortly there-after) invoke the taskAppeared callbacks.
- * If the tasks had a previous TaskOrganizer, setTaskOrganizer will take care of
- * emitting the taskVanished callbacks.
- */
- void transferToTaskOrganizer(ITaskOrganizer organizer) {
- final PooledConsumer c = PooledLambda.obtainConsumer(
- ActivityStack::transferSingleTaskToOrganizer,
- PooledLambda.__(Task.class), organizer);
- forAllTasks(c, true /* traverseTopToBottom */, this);
- c.recycle();
- }
-
/**
* Returns true if the stack should be visible.
*
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 9dba0d3ee051..a02ba64b4c9c 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -3864,9 +3864,8 @@ class Task extends WindowContainer<WindowContainer> {
}
boolean isControlledByTaskOrganizer() {
- // TODO(b/147849315): Clean-up relationship between task-org and task-hierarchy. Ideally
- // we only give control of the root task.
- return getTopMostTask().mTaskOrganizer != null;
+ final Task rootTask = getRootTask();
+ return rootTask == this && rootTask.mTaskOrganizer != null;
}
@Override
@@ -3938,23 +3937,6 @@ class Task extends WindowContainer<WindowContainer> {
super.getRelativeDisplayedPosition(outPos);
}
- @Override
- public void setWindowingMode(int windowingMode) {
- super.setWindowingMode(windowingMode);
- windowingMode = getWindowingMode();
-
- // TODO(b/147849315): Clean-up relationship between task-org and task-hierarchy. Ideally
- // we only give control of the root task.
- // Different windowing modes may be managed by different task organizers. If
- // getTaskOrganizer returns null, we still call transferToTaskOrganizer to make sure we
- // clear it.
- if (!isRootTask()) {
- final ITaskOrganizer org =
- mAtmService.mTaskOrganizerController.getTaskOrganizer(windowingMode);
- setTaskOrganizer(org);
- }
- }
-
/**
* @return true if the task is currently focused.
*/
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java
index 8d2da1e6cb5b..c9fd79fb4e39 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java
@@ -80,7 +80,6 @@ public class TaskOrganizerTests extends WindowTestsBase {
task.setTaskOrganizer(organizer);
verify(organizer).taskAppeared(any(), any());
- assertTrue(task.isControlledByTaskOrganizer());
task.removeImmediately();
verify(organizer).taskVanished(any());
@@ -106,48 +105,13 @@ public class TaskOrganizerTests extends WindowTestsBase {
final Task task = createTaskInStack(stack, 0 /* userId */);
final ITaskOrganizer organizer = makeAndRegisterMockOrganizer();
- task.setTaskOrganizer(organizer);
- verify(organizer).taskAppeared(any(), any());
- assertTrue(task.isControlledByTaskOrganizer());
-
- task.setTaskOrganizer(null);
- verify(organizer).taskVanished(any());
- assertFalse(task.isControlledByTaskOrganizer());
- }
-
- @Test
- public void testTransferStackToOrganizer() throws RemoteException {
- final ActivityStack stack = createTaskStackOnDisplay(mDisplayContent);
- final Task task = createTaskInStack(stack, 0 /* userId */);
- final Task task2 = createTaskInStack(stack, 0 /* userId */);
- final ITaskOrganizer organizer = makeAndRegisterMockOrganizer();
-
- stack.transferToTaskOrganizer(organizer);
-
- verify(organizer, times(2)).taskAppeared(any(), any());
- assertTrue(task.isControlledByTaskOrganizer());
- assertTrue(task2.isControlledByTaskOrganizer());
-
- stack.transferToTaskOrganizer(null);
-
- verify(organizer, times(2)).taskVanished(any());
- assertFalse(task.isControlledByTaskOrganizer());
- assertFalse(task2.isControlledByTaskOrganizer());
- }
-
- @Test
- public void testRegisterTaskOrganizerTaskWindowingModeChanges() throws RemoteException {
- final ITaskOrganizer organizer = makeAndRegisterMockOrganizer();
-
- final ActivityStack stack = createTaskStackOnDisplay(mDisplayContent);
- final Task task = createTaskInStack(stack, 0 /* userId */);
- task.setWindowingMode(WINDOWING_MODE_PINNED);
+ stack.setTaskOrganizer(organizer);
verify(organizer).taskAppeared(any(), any());
- assertTrue(task.isControlledByTaskOrganizer());
+ assertTrue(stack.isControlledByTaskOrganizer());
- task.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+ stack.setTaskOrganizer(null);
verify(organizer).taskVanished(any());
- assertFalse(task.isControlledByTaskOrganizer());
+ assertFalse(stack.isControlledByTaskOrganizer());
}
@Test
@@ -158,13 +122,9 @@ public class TaskOrganizerTests extends WindowTestsBase {
final Task task = createTaskInStack(stack, 0 /* userId */);
final Task task2 = createTaskInStack(stack, 0 /* userId */);
stack.setWindowingMode(WINDOWING_MODE_PINNED);
- verify(organizer, times(2)).taskAppeared(any(), any());
- assertTrue(task.isControlledByTaskOrganizer());
- assertTrue(task2.isControlledByTaskOrganizer());
+ verify(organizer, times(1)).taskAppeared(any(), any());
stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
- verify(organizer, times(2)).taskVanished(any());
- assertFalse(task.isControlledByTaskOrganizer());
- assertFalse(task2.isControlledByTaskOrganizer());
+ verify(organizer, times(1)).taskVanished(any());
}
}