From 537a8c0485a60a1746adaec0262cd6cb566ee63e Mon Sep 17 00:00:00 2001 From: Jerry Chang Date: Wed, 12 May 2021 19:27:04 +0800 Subject: [PATCH] Dismiss stage split when unlock after folded Dismiss stage split to the last focused stage when unlocking after folded. Bug: 184795546 Test: enter split and fold the device, observe it dismisses to the proper stage after unlocked the device. Test: enter split after folded, unlock whon't dismiss split. Change-Id: I6abbf63c1675d612811c47b1c42f337607fb65fd --- .../wm/shell/splitscreen/SplitScreen.java | 6 +++++ .../splitscreen/SplitScreenController.java | 11 ++++++++++ .../shell/splitscreen/StageCoordinator.java | 22 ++++++++++++++++--- .../shell/splitscreen/StageTaskListener.java | 9 ++++++++ .../com/android/systemui/wmshell/WMShell.java | 5 +++++ 5 files changed, 50 insertions(+), 3 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 0e76da75e78c9..e86462f666c93 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 @@ -81,6 +81,12 @@ public interface SplitScreen { */ void onKeyguardOccludedChanged(boolean occluded); + /** + * Called when the visibility of the keyguard changes. + * @param showing Indicates if the keyguard is now visible. + */ + void onKeyguardVisibilityChanged(boolean showing); + /** 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 988efb63bc0b0..7804c777bc1b0 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 @@ -172,6 +172,10 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, mStageCoordinator.onKeyguardOccludedChanged(occluded); } + public void onKeyguardVisibilityChanged(boolean showing) { + mStageCoordinator.onKeyguardVisibilityChanged(showing); + } + public void exitSplitScreenOnHide(boolean exitSplitScreenOnHide) { mStageCoordinator.exitSplitScreenOnHide(exitSplitScreenOnHide); } @@ -371,6 +375,13 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, } }); } + + @Override + public void onKeyguardVisibilityChanged(boolean showing) { + mMainExecutor.execute(() -> { + SplitScreenController.this.onKeyguardVisibilityChanged(showing); + }); + } } /** 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 d1aa2d73f696d..962b5d5ce9be1 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 @@ -136,7 +136,10 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, /** Whether the device is supporting legacy split or not. */ private boolean mUseLegacySplit; - @SplitScreen.StageType int mDismissTop = NO_DISMISS; + @SplitScreen.StageType private int mDismissTop = NO_DISMISS; + + /** The target stage to dismiss to when unlock after folded. */ + @SplitScreen.StageType private int mTopStageAfterFoldDismiss = STAGE_TYPE_UNDEFINED; private final Runnable mOnTransitionAnimationComplete = () -> { // If still playing, let it finish. @@ -443,6 +446,13 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, mKeyguardOccluded = occluded; } + void onKeyguardVisibilityChanged(boolean showing) { + if (!showing && mMainStage.isActive() + && mTopStageAfterFoldDismiss != STAGE_TYPE_UNDEFINED) { + exitSplitScreen(mTopStageAfterFoldDismiss == STAGE_TYPE_MAIN ? mMainStage : mSideStage); + } + } + void exitSplitScreen() { exitSplitScreen(null /* childrenToTop */); } @@ -458,6 +468,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, mTaskOrganizer.applyTransaction(wct); // Reset divider position. mSplitLayout.resetDividerPosition(); + mTopStageAfterFoldDismiss = STAGE_TYPE_UNDEFINED; } /** @@ -808,8 +819,13 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, } private void onFoldedStateChanged(boolean folded) { - if (folded && mMainStage.isActive()) { - exitSplitScreen(mMainStage); + mTopStageAfterFoldDismiss = STAGE_TYPE_UNDEFINED; + if (!folded) return; + + if (mMainStage.isFocused()) { + mTopStageAfterFoldDismiss = STAGE_TYPE_MAIN; + } else if (mSideStage.isFocused()) { + mTopStageAfterFoldDismiss = STAGE_TYPE_SIDE; } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java index 4f73feec750d2..c47353a863b28 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java @@ -97,6 +97,15 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { return mChildrenTaskInfo.contains(taskId); } + /** @return {@code true} if this listener contains the currently focused task. */ + boolean isFocused() { + if (mRootTaskInfo.isFocused) return true; + for (int i = mChildrenTaskInfo.size() - 1; i >= 0; --i) { + if (mChildrenTaskInfo.valueAt(i).isFocused) return true; + } + return false; + } + @Override @CallSuper public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl leash) { diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java index f2db4f1cd9017..db965db13833b 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java @@ -241,6 +241,11 @@ public final class WMShell extends SystemUI @VisibleForTesting void initSplitScreen(SplitScreen splitScreen) { mSplitScreenKeyguardCallback = new KeyguardUpdateMonitorCallback() { + @Override + public void onKeyguardVisibilityChanged(boolean showing) { + splitScreen.onKeyguardVisibilityChanged(showing); + } + @Override public void onKeyguardOccludedChanged(boolean occluded) { splitScreen.onKeyguardOccludedChanged(occluded);