Fix black frame flicker in UNOCCLUDE transition. When an activity which occludes the keyguard finishes, WindowManager immediately updatees the keyguard occluded status, so show-when-locked wallpaper was not used anymore. However sysui needed some time to finish keyguard occluded status change in their side, and meantime no wallpaper target existed. With this change, we keep using show-when-locked wallpaper until app transition finishes. Bug: 201560359 Test: manual. Show assist app on the lockscreen and close. Change-Id: I4958a2f5ecdd12b3db43b44ee4a221972070ab2c (cherry picked from commit f5a613e5282542ea356c20b3f397276f06d68fe9) Merged-In:I4958a2f5ecdd12b3db43b44ee4a221972070ab2c
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index b6ca67d..7767fe6 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 @@ 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 78b03b2..510ab93 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 @@ * 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(); } /** @@ -974,6 +980,14 @@ 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. */ boolean isKeyguardShowing();
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index c1b287f..c61cfee 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 @@ 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 4ff6d3c..1f2a9a2 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 @@ 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 e3b25a5..e3ff9e7 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 @@ 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.