diff options
| author | 2021-11-19 08:53:26 +0000 | |
|---|---|---|
| committer | 2021-11-19 08:53:26 +0000 | |
| commit | cd70dc3d47aebf7db5da9143ab2576564278decc (patch) | |
| tree | 53ceb26d1f477384ea141f31addf2a1eaef71c05 /libs | |
| parent | 4f590a93840e0cb0691b62905ef8312d6ae64ea0 (diff) | |
| parent | 5611fc6c93fd73db2093f219f95c31be3c59bf47 (diff) | |
Merge "Fix split dismissed after click pip to split button" into sc-v2-dev am: 6a2ce827e2 am: 5611fc6c93
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16235342
Change-Id: I231cfa55010874edb1631bbed8dcb0519e8679a7
Diffstat (limited to 'libs')
3 files changed, 54 insertions, 7 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java index e86462f666c9..02edaa00fac3 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java @@ -87,6 +87,12 @@ public interface SplitScreen { */ void onKeyguardVisibilityChanged(boolean showing); + /** Called when device waking up finished. */ + void onFinishedWakingUp(); + + /** Called when device going to sleep finished. */ + void onFinishedGoingToSleep(); + /** Get a string representation of a stage type */ static String stageTypeToString(@StageType int stage) { switch (stage) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java index 34a8f99b4a46..6b42ed775fb7 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java @@ -232,6 +232,14 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, mStageCoordinator.onKeyguardVisibilityChanged(showing); } + public void onFinishedWakingUp() { + mStageCoordinator.onFinishedWakingUp(); + } + + public void onFinishedGoingToSleep() { + mStageCoordinator.onFinishedGoingToSleep(); + } + public void exitSplitScreenOnHide(boolean exitSplitScreenOnHide) { mStageCoordinator.exitSplitScreenOnHide(exitSplitScreenOnHide); } @@ -491,6 +499,20 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, SplitScreenController.this.onKeyguardVisibilityChanged(showing); }); } + + @Override + public void onFinishedWakingUp() { + mMainExecutor.execute(() -> { + SplitScreenController.this.onFinishedWakingUp(); + }); + } + + @Override + public void onFinishedGoingToSleep() { + mMainExecutor.execute(() -> { + SplitScreenController.this.onFinishedGoingToSleep(); + }); + } } /** 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 d0fc91ca8cf3..a3726d46d2a4 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 @@ -155,6 +155,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, private boolean mShouldUpdateRecents; private boolean mExitSplitScreenOnHide; private boolean mKeyguardOccluded; + private boolean mDeviceSleep; @SplitScreen.StageType private int mDismissTop = NO_DISMISS; @@ -547,6 +548,17 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } + void onFinishedWakingUp() { + if (mMainStage.isActive()) { + exitSplitScreenIfKeyguardOccluded(); + } + mDeviceSleep = false; + } + + void onFinishedGoingToSleep() { + mDeviceSleep = true; + } + void exitSplitScreenOnHide(boolean exitSplitScreenOnHide) { mExitSplitScreenOnHide = exitSplitScreenOnHide; } @@ -575,6 +587,19 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, applyExitSplitScreen(childrenToTop, wct, exitReason); } + private void exitSplitScreenIfKeyguardOccluded() { + final boolean mainStageVisible = mMainStageListener.mVisible; + final boolean oneStageVisible = mainStageVisible ^ mSideStageListener.mVisible; + if (mDeviceSleep && mKeyguardOccluded && oneStageVisible) { + // Only the stages include show-when-locked activity is visible while keyguard occluded. + // Dismiss split because there's show-when-locked activity showing on top of keyguard. + // Also make sure the task contains show-when-locked activity remains on top after split + // dismissed. + final StageTaskListener toTop = mainStageVisible ? mMainStage : mSideStage; + exitSplitScreen(toTop, EXIT_REASON_SCREEN_LOCKED_SHOW_ON_TOP); + } + } + private void applyExitSplitScreen(StageTaskListener childrenToTop, WindowContainerTransaction wct, @ExitReason int exitReason) { mRecentTasks.ifPresent(recentTasks -> { @@ -790,14 +815,8 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, // like the cases keyguard showing or screen off. exitSplitScreen(null /* childrenToTop */, EXIT_REASON_RETURN_HOME); } - } else if (mKeyguardOccluded) { - // At least one of the stages is visible while keyguard occluded. Dismiss split because - // there's show-when-locked activity showing on top of keyguard. Also make sure the - // task contains show-when-locked activity remains on top after split dismissed. - final StageTaskListener toTop = - mainStageVisible ? mMainStage : (sideStageVisible ? mSideStage : null); - exitSplitScreen(toTop, EXIT_REASON_SCREEN_LOCKED_SHOW_ON_TOP); } + exitSplitScreenIfKeyguardOccluded(); mSyncQueue.runInSync(t -> { // Same above, we only set root tasks and divider leash visibility when both stage |