From 9fd095baf3b25e589243fdb5fb464593fdfd6384 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Fri, 24 Jan 2020 14:40:06 -0800 Subject: [PATCH] TaskOrganizer: Control Root Task Following Stacks becoming Tasks this seems to make more sense. Bug: 147849315 Bug: 139371701 Test: TaskOrganizerTests Change-Id: Idee35274d6ab4018b9bc4d43610fdb57db9d8956 --- .../com/android/server/wm/ActivityStack.java | 45 +++++++--------- .../core/java/com/android/server/wm/Task.java | 22 +------- .../android/server/wm/TaskOrganizerTests.java | 52 +++---------------- 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 663423f8728b8..ddf0117987dd3 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 @@ public void onConfigurationChanged(Configuration newParentConfig) { 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 @@ public void onConfigurationChanged(Configuration newParentConfig) { } } + 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 @@ public void setWindowingMode(int windowingMode) { 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 @@ boolean isTopActivityVisible() { 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 9dba0d3ee051e..a02ba64b4c9c3 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 @@ void handleUnknownTag(String name, XmlPullParser in) } 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 @@ void getRelativeDisplayedPosition(Point outPos) { 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 8d2da1e6cb5b7..c9fd79fb4e391 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 void testAppearVanish() throws RemoteException { task.setTaskOrganizer(organizer); verify(organizer).taskAppeared(any(), any()); - assertTrue(task.isControlledByTaskOrganizer()); task.removeImmediately(); verify(organizer).taskVanished(any()); @@ -106,48 +105,13 @@ public void testClearOrganizer() throws RemoteException { 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 void testRegisterTaskOrganizerStackWindowingModeChanges() throws RemoteEx 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()); } }