From a33818cf1cd45f1b3c6ba7634f0d1b8b0e940ecd Mon Sep 17 00:00:00 2001 From: Andrii Kulian Date: Thu, 16 Feb 2017 16:11:30 -0800 Subject: [PATCH] Move activities to fullscreen stack on display removal Instead of moving dynamic stacks from secondary to primary display on removal, move activities to fullscreen stack. This way activities are guaranteed to appear in valid launch stack and will respect split-screen mode bounds. Bug: 34263289 Bug: 35258038 Test: android.server.cts.ActivityManagerDisplayTests Test: #testStackFocusSwitchOnDisplayRemoved Test: #testStackFocusSwitchOnDisplayRemoved2 Change-Id: Iebd3bef3e0cf8afd482630dd5ad8ec4315497950 --- .../android/server/am/ActivityStackSupervisor.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 95734a4ed782..cb1f51031209 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -3776,18 +3776,27 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } private void handleDisplayRemoved(int displayId) { + if (displayId == DEFAULT_DISPLAY) { + throw new IllegalArgumentException("Can't remove the primary display."); + } + synchronized (mService) { ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); if (activityDisplay != null) { final boolean destroyContentOnRemoval = activityDisplay.shouldDestroyContentOnRemove(); - ArrayList stacks = activityDisplay.mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); - moveStackToDisplayLocked(stack.mStackId, DEFAULT_DISPLAY, - !destroyContentOnRemoval /* onTop */); + final ArrayList stacks = activityDisplay.mStacks; + while (!stacks.isEmpty()) { + final ActivityStack stack = stacks.get(0); if (destroyContentOnRemoval) { + moveStackToDisplayLocked(stack.mStackId, DEFAULT_DISPLAY, + false /* onTop */); stack.finishAllActivitiesLocked(true /* immediately */); + } else { + // Moving all tasks to fullscreen stack, because it's guaranteed to be + // a valid launch stack for all activities. This way the task history from + // external display will be preserved on primary after move. + moveTasksToFullscreenStackLocked(stack.getStackId(), true /* onTop */); } } mActivityDisplays.remove(displayId); -- 2.11.0