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
This commit is contained in:
Wale Ogunwale
2018-03-01 13:05:30 -08:00
parent 90c27c332a
commit bb28587195
2 changed files with 46 additions and 2 deletions

View File

@@ -989,13 +989,32 @@ class ActivityStack<T extends StackWindowController> 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);

View File

@@ -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 extends ActivityStack> T createStackForShouldBeVisibleTest(
ActivityDisplay display, int windowingMode, int activityType, boolean onTop) {
final T stack = display.createStack(windowingMode, activityType, onTop);