From 461829d607b32ee492b6123043ae4232ed82ae93 Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Wed, 3 Jun 2015 14:41:18 -0700 Subject: [PATCH] Prevent windows below the keyguard from showing Fixes a bug where windows below the lock screen could become visible if a SHOW_WHEN_LOCKED activity hides the status bar. Bug: 21450145 Change-Id: Ie660394cb96d7e6839bd4fb7c2729133bac2dfc5 --- core/java/android/view/WindowManagerPolicy.java | 7 +++++++ .../android/server/policy/PhoneWindowManager.java | 10 +++++++++- .../java/com/android/server/wm/WindowAnimator.java | 12 +++++++++--- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index f7b64052d14ec..ca5f5ad02dc71 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -1057,6 +1057,13 @@ public interface WindowManagerPolicy { */ public boolean isKeyguardSecure(); + /** + * Return whether the keyguard is on. + * + * @return true if in keyguard is on. + */ + public boolean isKeyguardShowingOrOccluded(); + /** * inKeyguardRestrictedKeyInputMode * diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index b8d06921f2350..2839f08cd3283 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2116,7 +2116,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { case TYPE_KEYGUARD_SCRIM: return false; default: - return true; + // Hide only windows below the keyguard host window. + return windowTypeToLayerLw(win.getBaseType()) + < windowTypeToLayerLw(TYPE_STATUS_BAR); } } @@ -5515,6 +5517,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { return mKeyguardDelegate.isSecure(); } + /** {@inheritDoc} */ + @Override + public boolean isKeyguardShowingOrOccluded() { + return mKeyguardDelegate == null ? false : mKeyguardDelegate.isShowing(); + } + /** {@inheritDoc} */ @Override public boolean inKeyguardRestrictedKeyInputMode() { diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index 9169351e7a588..3305e1ec29d10 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -191,7 +191,8 @@ public class WindowAnimator { private boolean shouldForceHide(WindowState win) { final WindowState imeTarget = mService.mInputMethodTarget; final boolean showImeOverKeyguard = imeTarget != null && imeTarget.isVisibleNow() && - (imeTarget.getAttrs().flags & FLAG_SHOW_WHEN_LOCKED) != 0; + ((imeTarget.getAttrs().flags & FLAG_SHOW_WHEN_LOCKED) != 0 + || !mPolicy.canBeForceHidden(imeTarget, imeTarget.mAttrs)); final WindowState winShowWhenLocked = (WindowState) mPolicy.getWinShowWhenLockedLw(); final AppWindowToken appShowWhenLocked = winShowWhenLocked == null ? @@ -203,7 +204,11 @@ public class WindowAnimator { || (win.mAttrs.flags & FLAG_SHOW_WHEN_LOCKED) != 0 && win.isAnimatingLw() // Show error dialogs over apps that dismiss keyguard. || (win.mAttrs.privateFlags & PRIVATE_FLAG_SYSTEM_ERROR) != 0))); - return (mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked; + + // Only hide windows if the keyguard is active and not animating away. + boolean keyguardOn = mPolicy.isKeyguardShowingOrOccluded() + && mForceHiding != KEYGUARD_ANIMATING_OUT; + return keyguardOn && hideWhenLocked; } private void updateWindowsLocked(final int displayId) { @@ -228,6 +233,7 @@ public class WindowAnimator { winAnimator.mAnimation.setDuration(KEYGUARD_ANIM_TIMEOUT_MS); winAnimator.mAnimationIsEntrance = false; winAnimator.mAnimationStartTime = -1; + winAnimator.mKeyguardGoingAwayAnimation = true; } } else { if (DEBUG_KEYGUARD) Slog.d(TAG, @@ -310,7 +316,7 @@ public class WindowAnimator { mKeyguardGoingAway = false; } if (win.isReadyForDisplay()) { - if (nowAnimating) { + if (nowAnimating && win.mWinAnimator.mKeyguardGoingAwayAnimation) { mForceHiding = KEYGUARD_ANIMATING_OUT; } else { mForceHiding = win.isDrawnLw() ? KEYGUARD_SHOWN : KEYGUARD_NOT_SHOWN;