diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/KeyguardController.java | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java index 5f56fe59c1f2..177f244129f4 100644 --- a/services/core/java/com/android/server/wm/KeyguardController.java +++ b/services/core/java/com/android/server/wm/KeyguardController.java @@ -462,22 +462,19 @@ class KeyguardController { mOccluded = false; mDismissingKeyguardActivity = null; - // Only the top activity of the focused stack on each display may control it's - // occluded state. - final ActivityStack focusedStack = display.getFocusedStack(); - if (focusedStack != null) { - final ActivityRecord topDismissing = - focusedStack.getTopDismissingKeyguardActivity(); - mOccluded = focusedStack.topActivityOccludesKeyguard() || (topDismissing != null - && focusedStack.topRunningActivityLocked() == topDismissing - && controller.canShowWhileOccluded( + final ActivityStack stack = getStackForControllingOccluding(display); + if (stack != null) { + final ActivityRecord topDismissing = stack.getTopDismissingKeyguardActivity(); + mOccluded = stack.topActivityOccludesKeyguard() || (topDismissing != null + && stack.topRunningActivityLocked() == topDismissing + && controller.canShowWhileOccluded( true /* dismissKeyguard */, false /* showWhenLocked */)); - if (focusedStack.getTopDismissingKeyguardActivity() != null) { - mDismissingKeyguardActivity = focusedStack.getTopDismissingKeyguardActivity(); + if (stack.getTopDismissingKeyguardActivity() != null) { + mDismissingKeyguardActivity = stack.getTopDismissingKeyguardActivity(); } - mOccluded |= controller.mWindowManager.isShowingDream(); } + mOccluded |= controller.mWindowManager.isShowingDream(); // TODO(b/113840485): Handle app transition for individual display, and apply occluded // state change to secondary displays. @@ -492,6 +489,23 @@ class KeyguardController { } } + /** + * Gets the stack used to check the occluded state. + * <p> + * Only the top non-pinned activity of the focusable stack on each display can control its + * occlusion state. + */ + private ActivityStack getStackForControllingOccluding(ActivityDisplay display) { + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); + if (stack != null && stack.isFocusableAndVisible() + && !stack.inPinnedWindowingMode()) { + return stack; + } + } + return null; + } + void dumpStatus(PrintWriter pw, String prefix) { final StringBuilder sb = new StringBuilder(); sb.append(prefix); |