summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java4
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java11
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java4
-rw-r--r--services/core/java/com/android/server/wm/TaskDisplayArea.java42
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayAreaOrganizerTest.java6
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java10
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());