From f5a613e5282542ea356c20b3f397276f06d68fe9 Mon Sep 17 00:00:00 2001 From: Issei Suzuki Date: Thu, 14 Oct 2021 19:56:24 +0200 Subject: [PATCH] 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 --- .../android/server/policy/PhoneWindowManager.java | 6 ++++++ .../android/server/policy/WindowManagerPolicy.java | 14 ++++++++++++++ .../java/com/android/server/wm/AppTransition.java | 4 ++++ .../com/android/server/wm/WallpaperController.java | 3 ++- .../android/server/wm/WindowManagerService.java | 5 +++++ 5 files changed, 31 insertions(+), 1 deletion(-) 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.