diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/KeyguardController.java | 61 |
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 |