From b8bb85f23daaf6f20864d2d269be022d346fbada Mon Sep 17 00:00:00 2001 From: Jeff Chang Date: Wed, 14 Dec 2022 18:03:30 +0800 Subject: [PATCH] Always dismiss split after folded the device Change the split dismiss policy while folding the device. Splits will always be dismissed after the user folded the device. Bug: 259645779 Test: atest testExitSplitScreenAfterFolded Change-Id: Ib9e66e7addb6314b51a2ef8e081c98e80c2787e7 --- .../shell/splitscreen/StageCoordinator.java | 41 ++++++++----------- .../splitscreen/StageCoordinatorTests.java | 12 ++++++ 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 717ae91f74c52..8ddc3c04d991b 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -204,10 +204,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, private boolean mIsDropEntering; private boolean mIsExiting; - /** The target stage to dismiss to when unlock after folded. */ - @StageType - private int mTopStageAfterFoldDismiss = STAGE_TYPE_UNDEFINED; - private DefaultMixedHandler mMixedHandler; private final Toast mSplitUnsupportedToast; @@ -976,20 +972,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, return; } - if (!mKeyguardShowing && mTopStageAfterFoldDismiss != STAGE_TYPE_UNDEFINED) { - if (ENABLE_SHELL_TRANSITIONS) { - final WindowContainerTransaction wct = new WindowContainerTransaction(); - prepareExitSplitScreen(mTopStageAfterFoldDismiss, wct); - mSplitTransitions.startDismissTransition(wct, this, - mTopStageAfterFoldDismiss, EXIT_REASON_DEVICE_FOLDED); - } else { - exitSplitScreen( - mTopStageAfterFoldDismiss == STAGE_TYPE_MAIN ? mMainStage : mSideStage, - EXIT_REASON_DEVICE_FOLDED); - } - return; - } - setDividerVisibility(!mKeyguardShowing, null); } @@ -1828,14 +1810,28 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, sendOnBoundsChanged(); } - private void onFoldedStateChanged(boolean folded) { - mTopStageAfterFoldDismiss = STAGE_TYPE_UNDEFINED; + @VisibleForTesting + void onFoldedStateChanged(boolean folded) { + int topStageAfterFoldDismiss = STAGE_TYPE_UNDEFINED; if (!folded) return; + if (!mMainStage.isActive()) return; + if (mMainStage.isFocused()) { - mTopStageAfterFoldDismiss = STAGE_TYPE_MAIN; + topStageAfterFoldDismiss = STAGE_TYPE_MAIN; } else if (mSideStage.isFocused()) { - mTopStageAfterFoldDismiss = STAGE_TYPE_SIDE; + topStageAfterFoldDismiss = STAGE_TYPE_SIDE; + } + + if (ENABLE_SHELL_TRANSITIONS) { + final WindowContainerTransaction wct = new WindowContainerTransaction(); + prepareExitSplitScreen(topStageAfterFoldDismiss, wct); + mSplitTransitions.startDismissTransition(wct, this, + topStageAfterFoldDismiss, EXIT_REASON_DEVICE_FOLDED); + } else { + exitSplitScreen( + topStageAfterFoldDismiss == STAGE_TYPE_MAIN ? mMainStage : mSideStage, + EXIT_REASON_DEVICE_FOLDED); } } @@ -2118,7 +2114,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // Update divider state after animation so that it is still around and positioned // properly for the animation itself. mSplitLayout.release(); - mTopStageAfterFoldDismiss = STAGE_TYPE_UNDEFINED; } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java index 3569860b61282..98386421fb5fe 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java @@ -320,4 +320,16 @@ public class StageCoordinatorTests extends ShellTestCase { assertTrue(options.getBoolean( KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED_BY_PERMISSION)); } + + @Test + public void testExitSplitScreenAfterFolded() { + when(mMainStage.isActive()).thenReturn(true); + when(mMainStage.isFocused()).thenReturn(true); + when(mMainStage.getTopVisibleChildTaskId()).thenReturn(INVALID_TASK_ID); + + mStageCoordinator.onFoldedStateChanged(true); + + verify(mStageCoordinator).onSplitScreenExit(); + verify(mMainStage).deactivate(any(WindowContainerTransaction.class), eq(false)); + } }