diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index cda7407dc98c0..b7d4d22d3966a 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -4625,6 +4625,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 87465a4b2ffea..2f2f94d3b5ded 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -370,6 +370,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(); } /** @@ -969,6 +975,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 bd08d01768e30..b9353e1f9a0c2 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -367,6 +367,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 d93b649b390af..4b2aa0f76272e 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -165,7 +165,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 df295ee23825b..d17c9dd8de3c5 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -3092,6 +3092,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.