summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/KeyguardController.java61
1 files changed, 29 insertions, 32 deletions
diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java
index 57f263885ef2..b31c2e462766 100644
--- a/services/core/java/com/android/server/wm/KeyguardController.java
+++ b/services/core/java/com/android/server/wm/KeyguardController.java
@@ -16,6 +16,7 @@
package com.android.server.wm;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
import static android.view.Display.DEFAULT_DISPLAY;
@@ -524,40 +525,36 @@ class KeyguardController {
boolean occludedByActivity = false;
final Task task = getRootTaskForControllingOccluding(display);
- if (task != null) {
- final ActivityRecord r = task.getTopNonFinishingActivity();
- if (r != null) {
- final boolean showWhenLocked = r.canShowWhenLocked();
- if (r.containsDismissKeyguardWindow()) {
- mDismissingKeyguardActivity = r;
- }
- if (r.getTurnScreenOnFlag()
- && r.currentLaunchCanTurnScreenOn()) {
- mTopTurnScreenOnActivity = r;
- }
-
- if (showWhenLocked) {
- mTopOccludesActivity = r;
- }
-
- // Only the top activity may control occluded, as we can't occlude the Keyguard
- // if the top app doesn't want to occlude it.
- occludedByActivity = showWhenLocked || (mDismissingKeyguardActivity != null
- && task.topRunningActivity() == mDismissingKeyguardActivity
- && controller.canShowWhileOccluded(
- true /* dismissKeyguard */, false /* showWhenLocked */));
- // FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD only apply for secondary display.
- if (mDisplayId != DEFAULT_DISPLAY && task.mDisplayContent != null) {
- occludedByActivity |=
- task.mDisplayContent.canShowWithInsecureKeyguard()
- && controller.canDismissKeyguard();
- }
+ final ActivityRecord top = task != null ? task.getTopNonFinishingActivity() : null;
+ if (top != null) {
+ if (top.containsDismissKeyguardWindow()) {
+ mDismissingKeyguardActivity = top;
+ }
+ if (top.getTurnScreenOnFlag() && top.currentLaunchCanTurnScreenOn()) {
+ mTopTurnScreenOnActivity = top;
+ }
+
+ final boolean showWhenLocked = top.canShowWhenLocked();
+ if (showWhenLocked) {
+ mTopOccludesActivity = top;
+ }
+
+ // Only the top activity may control occluded, as we can't occlude the Keyguard
+ // if the top app doesn't want to occlude it.
+ occludedByActivity = showWhenLocked || (mDismissingKeyguardActivity != null
+ && task.topRunningActivity() == mDismissingKeyguardActivity
+ && controller.canShowWhileOccluded(
+ true /* dismissKeyguard */, false /* showWhenLocked */));
+ // FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD only apply for secondary display.
+ if (mDisplayId != DEFAULT_DISPLAY) {
+ occludedByActivity |= display.canShowWithInsecureKeyguard()
+ && controller.canDismissKeyguard();
}
}
- // TODO(b/123372519): isShowingDream can only works on default display.
- mOccluded = occludedByActivity || (mDisplayId == DEFAULT_DISPLAY
- && mService.mRootWindowContainer.getDefaultDisplay()
- .getDisplayPolicy().isShowingDreamLw());
+
+ final boolean dreaming = display.getDisplayPolicy().isShowingDreamLw() && (top != null
+ && top.getActivityType() == ACTIVITY_TYPE_DREAM);
+ mOccluded = dreaming || occludedByActivity;
mRequestDismissKeyguard = lastDismissKeyguardActivity != mDismissingKeyguardActivity
&& !mOccluded
&& mDismissingKeyguardActivity != null