Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java +6 −0 Original line number Original line Diff line number Diff line Loading @@ -87,6 +87,12 @@ public interface SplitScreen { */ */ void onKeyguardVisibilityChanged(boolean showing); 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 */ /** Get a string representation of a stage type */ static String stageTypeToString(@StageType int stage) { static String stageTypeToString(@StageType int stage) { switch (stage) { switch (stage) { Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +22 −0 Original line number Original line Diff line number Diff line Loading @@ -232,6 +232,14 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, mStageCoordinator.onKeyguardVisibilityChanged(showing); mStageCoordinator.onKeyguardVisibilityChanged(showing); } } public void onFinishedWakingUp() { mStageCoordinator.onFinishedWakingUp(); } public void onFinishedGoingToSleep() { mStageCoordinator.onFinishedGoingToSleep(); } public void exitSplitScreenOnHide(boolean exitSplitScreenOnHide) { public void exitSplitScreenOnHide(boolean exitSplitScreenOnHide) { mStageCoordinator.exitSplitScreenOnHide(exitSplitScreenOnHide); mStageCoordinator.exitSplitScreenOnHide(exitSplitScreenOnHide); } } Loading Loading @@ -491,6 +499,20 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, SplitScreenController.this.onKeyguardVisibilityChanged(showing); SplitScreenController.this.onKeyguardVisibilityChanged(showing); }); }); } } @Override public void onFinishedWakingUp() { mMainExecutor.execute(() -> { SplitScreenController.this.onFinishedWakingUp(); }); } @Override public void onFinishedGoingToSleep() { mMainExecutor.execute(() -> { SplitScreenController.this.onFinishedGoingToSleep(); }); } } } /** /** Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +26 −7 Original line number Original line Diff line number Diff line Loading @@ -155,6 +155,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, private boolean mShouldUpdateRecents; private boolean mShouldUpdateRecents; private boolean mExitSplitScreenOnHide; private boolean mExitSplitScreenOnHide; private boolean mKeyguardOccluded; private boolean mKeyguardOccluded; private boolean mDeviceSleep; @SplitScreen.StageType @SplitScreen.StageType private int mDismissTop = NO_DISMISS; private int mDismissTop = NO_DISMISS; Loading Loading @@ -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) { void exitSplitScreenOnHide(boolean exitSplitScreenOnHide) { mExitSplitScreenOnHide = exitSplitScreenOnHide; mExitSplitScreenOnHide = exitSplitScreenOnHide; } } Loading Loading @@ -575,6 +587,19 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, applyExitSplitScreen(childrenToTop, wct, exitReason); 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, private void applyExitSplitScreen(StageTaskListener childrenToTop, WindowContainerTransaction wct, @ExitReason int exitReason) { WindowContainerTransaction wct, @ExitReason int exitReason) { mRecentTasks.ifPresent(recentTasks -> { mRecentTasks.ifPresent(recentTasks -> { Loading Loading @@ -790,14 +815,8 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, // like the cases keyguard showing or screen off. // like the cases keyguard showing or screen off. exitSplitScreen(null /* childrenToTop */, EXIT_REASON_RETURN_HOME); 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 -> { mSyncQueue.runInSync(t -> { // Same above, we only set root tasks and divider leash visibility when both stage // Same above, we only set root tasks and divider leash visibility when both stage Loading packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java +12 −0 Original line number Original line Diff line number Diff line Loading @@ -260,6 +260,18 @@ public final class WMShell extends SystemUI } } }; }; mKeyguardUpdateMonitor.registerCallback(mSplitScreenKeyguardCallback); mKeyguardUpdateMonitor.registerCallback(mSplitScreenKeyguardCallback); mWakefulnessLifecycle.addObserver(new WakefulnessLifecycle.Observer() { @Override public void onFinishedWakingUp() { splitScreen.onFinishedWakingUp(); } @Override public void onFinishedGoingToSleep() { splitScreen.onFinishedGoingToSleep(); } }); } } @VisibleForTesting @VisibleForTesting Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java +6 −0 Original line number Original line Diff line number Diff line Loading @@ -87,6 +87,12 @@ public interface SplitScreen { */ */ void onKeyguardVisibilityChanged(boolean showing); 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 */ /** Get a string representation of a stage type */ static String stageTypeToString(@StageType int stage) { static String stageTypeToString(@StageType int stage) { switch (stage) { switch (stage) { Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +22 −0 Original line number Original line Diff line number Diff line Loading @@ -232,6 +232,14 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, mStageCoordinator.onKeyguardVisibilityChanged(showing); mStageCoordinator.onKeyguardVisibilityChanged(showing); } } public void onFinishedWakingUp() { mStageCoordinator.onFinishedWakingUp(); } public void onFinishedGoingToSleep() { mStageCoordinator.onFinishedGoingToSleep(); } public void exitSplitScreenOnHide(boolean exitSplitScreenOnHide) { public void exitSplitScreenOnHide(boolean exitSplitScreenOnHide) { mStageCoordinator.exitSplitScreenOnHide(exitSplitScreenOnHide); mStageCoordinator.exitSplitScreenOnHide(exitSplitScreenOnHide); } } Loading Loading @@ -491,6 +499,20 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, SplitScreenController.this.onKeyguardVisibilityChanged(showing); SplitScreenController.this.onKeyguardVisibilityChanged(showing); }); }); } } @Override public void onFinishedWakingUp() { mMainExecutor.execute(() -> { SplitScreenController.this.onFinishedWakingUp(); }); } @Override public void onFinishedGoingToSleep() { mMainExecutor.execute(() -> { SplitScreenController.this.onFinishedGoingToSleep(); }); } } } /** /** Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +26 −7 Original line number Original line Diff line number Diff line Loading @@ -155,6 +155,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, private boolean mShouldUpdateRecents; private boolean mShouldUpdateRecents; private boolean mExitSplitScreenOnHide; private boolean mExitSplitScreenOnHide; private boolean mKeyguardOccluded; private boolean mKeyguardOccluded; private boolean mDeviceSleep; @SplitScreen.StageType @SplitScreen.StageType private int mDismissTop = NO_DISMISS; private int mDismissTop = NO_DISMISS; Loading Loading @@ -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) { void exitSplitScreenOnHide(boolean exitSplitScreenOnHide) { mExitSplitScreenOnHide = exitSplitScreenOnHide; mExitSplitScreenOnHide = exitSplitScreenOnHide; } } Loading Loading @@ -575,6 +587,19 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, applyExitSplitScreen(childrenToTop, wct, exitReason); 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, private void applyExitSplitScreen(StageTaskListener childrenToTop, WindowContainerTransaction wct, @ExitReason int exitReason) { WindowContainerTransaction wct, @ExitReason int exitReason) { mRecentTasks.ifPresent(recentTasks -> { mRecentTasks.ifPresent(recentTasks -> { Loading Loading @@ -790,14 +815,8 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, // like the cases keyguard showing or screen off. // like the cases keyguard showing or screen off. exitSplitScreen(null /* childrenToTop */, EXIT_REASON_RETURN_HOME); 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 -> { mSyncQueue.runInSync(t -> { // Same above, we only set root tasks and divider leash visibility when both stage // Same above, we only set root tasks and divider leash visibility when both stage Loading
packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java +12 −0 Original line number Original line Diff line number Diff line Loading @@ -260,6 +260,18 @@ public final class WMShell extends SystemUI } } }; }; mKeyguardUpdateMonitor.registerCallback(mSplitScreenKeyguardCallback); mKeyguardUpdateMonitor.registerCallback(mSplitScreenKeyguardCallback); mWakefulnessLifecycle.addObserver(new WakefulnessLifecycle.Observer() { @Override public void onFinishedWakingUp() { splitScreen.onFinishedWakingUp(); } @Override public void onFinishedGoingToSleep() { splitScreen.onFinishedGoingToSleep(); } }); } } @VisibleForTesting @VisibleForTesting Loading