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
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 728c07d..a3044f8 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 @@
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 c62820e..a98d5a1 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 @@
* Tests for the {@link ActivityStack} class.
*
* Build/Install/Run:
- * atest ActivityStackTests
+ * atest FrameworksServicesTests:com.android.server.am.ActivityStackTests
*/
@SmallTest
@Presubmit
@@ -425,6 +425,31 @@
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 extends ActivityStack> T createStackForShouldBeVisibleTest(
ActivityDisplay display, int windowingMode, int activityType, boolean onTop) {
final T stack = display.createStack(windowingMode, activityType, onTop);