Move pip behind home stack on dismiss
If home stack is nested, it means we're in split or some
other non-fullscreen mode. In these cases, dismissing a pip
task should move it to the back of the home-stack parent
rather than the back of the display.
This behavior is the same as what was done for Activity.moveToBack,
so this CL pulled that functionality into positionTaskBehindHome()
so it could be shared
Bug: 157159929
Test: ActivityStack tests. Or attempt repro in bug.
Change-Id: Icf04f87edf4c00b47e3f1e0a45d80bf9b680ce1c
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index 9b9b613..efba84a 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -943,19 +943,7 @@
// task's ordering. However, we still need to move 'task' to back. The intention is that
// this ends up behind the home-task so that it is made invisible; so, if the home task
// is not a child of this, reparent 'task' to the back of the home task's actual parent.
- final ActivityStack home = displayArea.getOrCreateRootHomeTask();
- final WindowContainer homeParent = home.getParent();
- final Task homeParentTask = homeParent != null ? homeParent.asTask() : null;
- if (homeParentTask == null) {
- ((ActivityStack) task).reparent(displayArea, false /* onTop */);
- } else if (homeParentTask == this) {
- // Apparently reparent early-outs if same stack, so we have to explicitly reorder.
- positionChildAtBottom(task);
- } else {
- task.reparent((ActivityStack) homeParentTask, false /* toTop */,
- REPARENT_LEAVE_STACK_IN_PLACE, false /* animate */, false /* deferResume */,
- "moveToBack");
- }
+ displayArea.positionTaskBehindHome((ActivityStack) task);
}
// TODO: Should each user have there own stacks?
diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
index 62979ff..21d0752 100644
--- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
@@ -1441,11 +1441,7 @@
try {
stack.setWindowingMode(WINDOWING_MODE_UNDEFINED);
stack.setBounds(null);
- if (toDisplay.getDisplayId() != stack.getDisplayId()) {
- stack.reparent(toDisplay.getDefaultTaskDisplayArea(), false /* onTop */);
- } else {
- toDisplay.getDefaultTaskDisplayArea().positionStackAtBottom(stack);
- }
+ toDisplay.getDefaultTaskDisplayArea().positionTaskBehindHome(stack);
// Follow on the workaround: activities are kept force hidden till the new windowing
// mode is set.
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java
index 6661c30..1efd307 100644
--- a/services/core/java/com/android/server/wm/TaskDisplayArea.java
+++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java
@@ -765,6 +765,32 @@
onStackOrderChanged(stack);
}
+ /**
+ * Moves/reparents `task` to the back of whatever container the home stack is in. This is for
+ * when we just want to move a task to "the back" vs. a specific place. The primary use-case
+ * is to make sure that moved-to-back apps go into secondary split when in split-screen mode.
+ */
+ void positionTaskBehindHome(ActivityStack task) {
+ final ActivityStack home = getOrCreateRootHomeTask();
+ final WindowContainer homeParent = home.getParent();
+ final Task homeParentTask = homeParent != null ? homeParent.asTask() : null;
+ if (homeParentTask == null) {
+ // reparent throws if parent didn't change...
+ if (task.getParent() == this) {
+ positionStackAtBottom(task);
+ } else {
+ task.reparent(this, false /* onTop */);
+ }
+ } else if (homeParentTask == task.getParent()) {
+ // Apparently reparent early-outs if same stack, so we have to explicitly reorder.
+ ((ActivityStack) homeParentTask).positionChildAtBottom(task);
+ } else {
+ task.reparent((ActivityStack) homeParentTask, false /* toTop */,
+ Task.REPARENT_LEAVE_STACK_IN_PLACE, false /* animate */,
+ false /* deferResume */, "positionTaskBehindHome");
+ }
+ }
+
ActivityStack getStack(int rootTaskId) {
for (int i = getStackCount() - 1; i >= 0; --i) {
final ActivityStack stack = getStackAt(i);