From bb28587195be2fa9d8c201cfffccbb456d953427 Mon Sep 17 00:00:00 2001 From: Wale Ogunwale Date: Thu, 1 Mar 2018 13:05:30 -0800 Subject: [PATCH] Move primary-split-screen stack forward in some cases. If we are moving a stack in split-screen seconardy mode forward, we need to make sure we move the primary split-screen stack forward in the case it is current behind a fulscreen stack so both halves of the split-screen appear on-top and the fullscreen stack isn't cutting between them. Mostly a workaround until fix can fix b/70677280 where we would have a stack as a parent of another stack. Change-Id: I7d030b80c12771e0370a1fea8e1abf96560a9029 Fixes: 71899050 Bug: 70677280 Test: atest ActivityStackTests#testSplitScreenMoveToFront --- .../com/android/server/am/ActivityStack.java | 21 ++++++++++++++- .../android/server/am/ActivityStackTests.java | 27 ++++++++++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 728c07d02d461..a3044f8899536 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -989,13 +989,32 @@ class ActivityStack extends ConfigurationContai return; } + final ActivityDisplay display = getDisplay(); + + if (inSplitScreenSecondaryWindowingMode()) { + // If the stack is in split-screen seconardy mode, we need to make sure we move the + // primary split-screen stack forward in the case it is currently behind a fullscreen + // stack so both halves of the split-screen appear on-top and the fullscreen stack isn't + // cutting between them. + // TODO(b/70677280): This is a workaround until we can fix as part of b/70677280. + final ActivityStack topFullScreenStack = + display.getTopStackInWindowingMode(WINDOWING_MODE_FULLSCREEN); + if (topFullScreenStack != null) { + final ActivityStack primarySplitScreenStack = display.getSplitScreenPrimaryStack(); + if (display.getIndexOf(topFullScreenStack) + > display.getIndexOf(primarySplitScreenStack)) { + primarySplitScreenStack.moveToFront(reason + " splitScreenToTop"); + } + } + } + if (!isActivityTypeHome() && returnsToHomeStack()) { // Make sure the home stack is behind this stack since that is where we should return to // when this stack is no longer visible. mStackSupervisor.moveHomeStackToFront(reason + " returnToHome"); } - getDisplay().positionChildAtTop(this); + display.positionChildAtTop(this); mStackSupervisor.setFocusStackUnchecked(reason, this); if (task != null) { insertTaskAtTop(task, null); diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java index c62820e8e3c31..a98d5a161f808 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java @@ -47,7 +47,7 @@ import org.junit.Test; * Tests for the {@link ActivityStack} class. * * Build/Install/Run: - * atest ActivityStackTests + * atest FrameworksServicesTests:com.android.server.am.ActivityStackTests */ @SmallTest @Presubmit @@ -425,6 +425,31 @@ public class ActivityStackTests extends ActivityTestsBase { assertTrue(display.getStackAboveHome() == fullscreenStack2); } + @Test + public void testSplitScreenMoveToFront() throws Exception { + final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay(); + final TestActivityStack splitScreenPrimary = createStackForShouldBeVisibleTest(display, + WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */); + final TestActivityStack splitScreenSecondary = createStackForShouldBeVisibleTest(display, + WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, true /* onTop */); + final TestActivityStack assistantStack = createStackForShouldBeVisibleTest(display, + WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_ASSISTANT, true /* onTop */); + + splitScreenPrimary.setIsTranslucent(false); + splitScreenSecondary.setIsTranslucent(false); + assistantStack.setIsTranslucent(false); + + assertFalse(splitScreenPrimary.shouldBeVisible(null /* starting */)); + assertFalse(splitScreenSecondary.shouldBeVisible(null /* starting */)); + assertTrue(assistantStack.shouldBeVisible(null /* starting */)); + + splitScreenSecondary.moveToFront("testSplitScreenMoveToFront"); + + assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */)); + assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */)); + assertFalse(assistantStack.shouldBeVisible(null /* starting */)); + } + private T createStackForShouldBeVisibleTest( ActivityDisplay display, int windowingMode, int activityType, boolean onTop) { final T stack = display.createStack(windowingMode, activityType, onTop);