diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index b6ca67d25f77a..7767fe611f870 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -4630,6 +4630,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { return mKeyguardDelegate.isInputRestricted(); } + /** {@inheritDoc} */ + @Override + public boolean isKeyguardUnoccluding() { + return keyguardOn() && !mWindowManagerFuncs.isAppTransitionStateIdle(); + } + @Override public void dismissKeyguardLw(IKeyguardDismissCallback callback, CharSequence message) { if (mKeyguardDelegate != null && mKeyguardDelegate.isShowing()) { diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index 78b03b2b88e76..510ab93e1af50 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -367,6 +367,12 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { * as the top display. */ void moveDisplayToTop(int displayId); + + /** + * Return whether the app transition state is idle. + * @return {@code true} if app transition state is idle on the default display. + */ + boolean isAppTransitionStateIdle(); } /** @@ -973,6 +979,14 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { */ public boolean isKeyguardOccluded(); + /** + * Return whether the keyguard is unoccluding. + * @return {@code true} if the keyguard is unoccluding. + */ + default boolean isKeyguardUnoccluding() { + return false; + } + /** * @return true if in keyguard is on. */ diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index c1b287ff8077a..c61cfeeac9170 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -365,6 +365,10 @@ public class AppTransition implements Dump { setAppTransitionState(APP_STATE_IDLE); } + boolean isIdle() { + return mAppTransitionState == APP_STATE_IDLE; + } + boolean isTimeout() { return mAppTransitionState == APP_STATE_TIMEOUT; } diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index 4ff6d3c9a5f22..1f2a9a29932c7 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -159,7 +159,8 @@ class WallpaperController { boolean needsShowWhenLockedWallpaper = false; if ((w.mAttrs.flags & FLAG_SHOW_WHEN_LOCKED) != 0 && mService.mPolicy.isKeyguardLocked() - && mService.mPolicy.isKeyguardOccluded()) { + && (mService.mPolicy.isKeyguardOccluded() + || mService.mPolicy.isKeyguardUnoccluding())) { // The lowest show when locked window decides whether we need to put the wallpaper // behind. needsShowWhenLockedWallpaper = !isFullscreen(w.mAttrs) diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index e3b25a5fda3e7..e3ff9e75dbd88 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -3071,6 +3071,11 @@ public class WindowManagerService extends IWindowManager.Stub syncInputTransactions(true /* waitForAnimations */); } + @Override + public boolean isAppTransitionStateIdle() { + return getDefaultDisplayContentLocked().mAppTransition.isIdle(); + } + /** * Notifies activity manager that some Keyguard flags have changed and that it needs to * reevaluate the visibilities of the activities.