summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java6
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java22
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java33
-rw-r--r--packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java12
4 files changed, 66 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
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
index c3f9c9f7aacd..a56c177ef9ae 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
@@ -260,6 +260,18 @@ public final class WMShell extends SystemUI
}
};
mKeyguardUpdateMonitor.registerCallback(mSplitScreenKeyguardCallback);
+
+ mWakefulnessLifecycle.addObserver(new WakefulnessLifecycle.Observer() {
+ @Override
+ public void onFinishedWakingUp() {
+ splitScreen.onFinishedWakingUp();
+ }
+
+ @Override
+ public void onFinishedGoingToSleep() {
+ splitScreen.onFinishedGoingToSleep();
+ }
+ });
}
@VisibleForTesting