From 38257988f50c4375ad055fa4851d17abeeb18c82 Mon Sep 17 00:00:00 2001 From: Evan Rosky Date: Thu, 21 May 2020 15:45:17 -0700 Subject: [PATCH] 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 --- .../com/android/server/wm/ActivityStack.java | 14 +--------- .../server/wm/ActivityStackSupervisor.java | 6 +---- .../android/server/wm/TaskDisplayArea.java | 26 +++++++++++++++++++ 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 9b9b613403321..efba84afd8c1c 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 @@ class ActivityStack extends Task { // 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 62979ffc4a8cc..21d0752311ab8 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 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { 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 6661c30723d27..1efd307d07b17 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 @@ final class TaskDisplayArea extends DisplayArea { 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);