diff options
author | 2025-02-05 18:25:09 -0800 | |
---|---|---|
committer | 2025-02-05 18:25:09 -0800 | |
commit | 944d40f261641d62550dd153c4b64c99056efda8 (patch) | |
tree | 26877bdba0a0e8e3f9d3576922f5e859deb39f3c | |
parent | 81da2d84656d107413de6ef5d8abce42a9ecaa1d (diff) | |
parent | a862f5250381f31feac3a23c35f89ae784adaf62 (diff) |
Merge "Rename TaskDisplayArea#remove()" into main
6 files changed, 54 insertions, 23 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java b/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java index afeeaf707a18..d7579294cac6 100644 --- a/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java +++ b/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java @@ -366,10 +366,10 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl taskDisplayArea.setOrganizer(null); mService.mRootWindowContainer.mTaskSupervisor.beginDeferResume(); - // TaskDisplayArea#remove() move the stacks to the default TaskDisplayArea. + // TaskDisplayArea#remove() moves the stacks to the default TaskDisplayArea. Task lastReparentedRootTask; try { - lastReparentedRootTask = taskDisplayArea.remove(); + lastReparentedRootTask = taskDisplayArea.prepareForRemoval(); } finally { mService.mRootWindowContainer.mTaskSupervisor.endDeferResume(); } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 19f2fd9543cf..5cb39d44586f 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -3265,7 +3265,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mWmService.mDisplayWindowSettings.setShouldShowSystemDecorsLocked(this, shouldShow); if (!shouldShow) { - clearAllTasksOnDisplay(null); + clearAllTasksOnDisplay(null /* clearTasksCallback */, false /* isRemovingDisplay */); } } @@ -6471,12 +6471,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return mRemoving; } - void clearAllTasksOnDisplay(@Nullable Runnable clearTasksCallback) { + private void clearAllTasksOnDisplay(@Nullable Runnable clearTasksCallback, + boolean isRemovingDisplay) { Task lastReparentedRootTask; mRootWindowContainer.mTaskSupervisor.beginDeferResume(); try { lastReparentedRootTask = reduceOnAllTaskDisplayAreas((taskDisplayArea, rootTask) -> { - final Task lastReparentedRootTaskFromArea = taskDisplayArea.remove(); + final Task lastReparentedRootTaskFromArea = isRemovingDisplay + ? taskDisplayArea.prepareForRemoval() + : taskDisplayArea.setShouldKeepNoTask(true); if (lastReparentedRootTaskFromArea != null) { return lastReparentedRootTaskFromArea; } @@ -6506,7 +6509,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp if (mContentRecorder != null) { mContentRecorder.stopRecording(); } - }); + }, true /* isRemovingDisplay */); releaseSelfIfNeeded(); mDisplayPolicy.release(); diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 1fe6ad68a313..95d9b3e612ac 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -1407,8 +1407,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent> // When display content mode management flag is enabled, the task display area is marked as // removed when switching from extended display to mirroring display. We need to restart the // task display area before starting the home. - if (enableDisplayContentModeManagement() && taskDisplayArea.isRemoved()) { - taskDisplayArea.restart(); + if (enableDisplayContentModeManagement() && taskDisplayArea.shouldKeepNoTask()) { + taskDisplayArea.setShouldKeepNoTask(false); } Intent homeIntent = null; diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index d962b6b11187..cc14383fc9f9 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -155,6 +155,14 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { private boolean mRemoved; /** + * Whether the TaskDisplayArea has root tasks. + * If {@code true}, the TaskDisplayArea cannot have a new task. + * + * TODO(b/394466501): Prevent a Task being added to the TaskDisplayArea that shouldKeepNoTask. + */ + private boolean mShouldKeepNoTask; + + /** * The id of a leaf task that most recently being moved to front. */ private int mLastLeafTaskToFrontId; @@ -1787,6 +1795,10 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { return mRemoved; } + boolean shouldKeepNoTask() { + return mShouldKeepNoTask; + } + @Override boolean canCreateRemoteAnimationTarget() { // In the legacy transition system, promoting animation target from TaskFragment to @@ -1812,12 +1824,31 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { } } + @Nullable + Task prepareForRemoval() { + mShouldKeepNoTask = true; + final Task lastReparentedTask = removeAllTasks(); + mRemoved = true; + return lastReparentedTask; + } + + @Nullable + Task setShouldKeepNoTask(boolean shouldKeepNoTask) { + if (mShouldKeepNoTask == shouldKeepNoTask) { + return null; + } + + mShouldKeepNoTask = shouldKeepNoTask; + return shouldKeepNoTask ? removeAllTasks() : null; + } + /** * Removes the root tasks in the node applying the content removal node from the display. * * @return last reparented root task, or {@code null} if the root tasks had to be destroyed. */ - Task remove() { + @Nullable + private Task removeAllTasks() { final TaskDisplayArea toDisplayArea = getReparentToTaskDisplayArea(getFocusedRootTask()); mPreferredTopFocusableRootTask = null; // TODO(b/153090332): Allow setting content removal mode per task display area @@ -1835,7 +1866,7 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { for (int i = 0; i < numRootTasks; i++) { final WindowContainer child = mChildren.get(i); if (child.asTaskDisplayArea() != null) { - lastReparentedRootTask = child.asTaskDisplayArea().remove(); + lastReparentedRootTask = child.asTaskDisplayArea().removeAllTasks(); continue; } final Task task = mChildren.get(i).asTask(); @@ -1882,16 +1913,9 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { lastReparentedRootTask.getRootTask().moveToFront("display-removed"); } - mRemoved = true; - return lastReparentedRootTask; } - // TODO(b/385263090): Remove this method - void restart() { - mRemoved = false; - } - /** * Returns the {@link TaskDisplayArea} to which root tasks should be reparented. * diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaOrganizerTest.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaOrganizerTest.java index d2f0385131d5..7f94c0e982e2 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaOrganizerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaOrganizerTest.java @@ -223,9 +223,10 @@ public class DisplayAreaOrganizerTest extends WindowTestsBase { mOrganizerController.deleteTaskDisplayArea(newTda.mRemoteToken.toWindowContainerToken()); - verify(newTda).remove(); + verify(newTda).prepareForRemoval(); verify(newTda).removeImmediately(); assertThat(newTda.mOrganizer).isNull(); + assertThat(newTda.shouldKeepNoTask()).isTrue(); assertThat(newTda.isRemoved()).isTrue(); final TaskDisplayArea curTda = mDisplayContent.getItemFromDisplayAreas( @@ -248,9 +249,10 @@ public class DisplayAreaOrganizerTest extends WindowTestsBase { mOrganizerController.unregisterOrganizer(organizer); - verify(newTda).remove(); + verify(newTda).prepareForRemoval(); verify(newTda).removeImmediately(); assertThat(newTda.mOrganizer).isNull(); + assertThat(newTda.shouldKeepNoTask()).isTrue(); assertThat(newTda.isRemoved()).isTrue(); final TaskDisplayArea curTda = mDisplayContent.getItemFromDisplayAreas( diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java index f795d93b2487..986532ce5897 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java @@ -550,10 +550,11 @@ public class TaskDisplayAreaTests extends WindowTestsBase { @Test @UseTestDisplay - public void testRemove_reparentToDefault() { + public void testPrepareForRemoval_reparentToDefault() { final Task task = createTask(mDisplayContent); final TaskDisplayArea displayArea = task.getDisplayArea(); - displayArea.remove(); + displayArea.prepareForRemoval(); + assertTrue(displayArea.shouldKeepNoTask()); assertTrue(displayArea.isRemoved()); assertFalse(displayArea.hasChild()); @@ -565,11 +566,12 @@ public class TaskDisplayAreaTests extends WindowTestsBase { @Test @UseTestDisplay - public void testRemove_rootTaskCreatedByOrganizer() { + public void testPrepareForRemoval_rootTaskCreatedByOrganizer() { final Task task = createTask(mDisplayContent); task.mCreatedByOrganizer = true; final TaskDisplayArea displayArea = task.getDisplayArea(); - displayArea.remove(); + displayArea.prepareForRemoval(); + assertTrue(displayArea.shouldKeepNoTask()); assertTrue(displayArea.isRemoved()); assertFalse(displayArea.hasChild()); |