From b323776b1b205a4b266e16fbdc4095871cc4d9ec Mon Sep 17 00:00:00 2001 From: Issei Suzuki Date: Fri, 10 Feb 2023 17:10:28 +0000 Subject: [PATCH] FIx occlusion status mismatch issue when screen turns off and on quickly When KeyguardController detects occlude status change while the keyguard is shown, it requests (UN)OCCLUDE app transition and PhoneWindowManager defers committing the occlude state. However KeyguardController and PhoneWindowManager use different predicates to decide if keygaurd is shown or not. In case the predicates return different value, occlude state in KeyguardController and PhoneWindowManager remain inconsistent. Test: manual 1. set secure lock method (pattern) 2. launch calculator app 3. push power button to screen off 4. just before the screen turns off, push power button to screen on again Bug: 232002936 Change-Id: I4cd7e62e6800897cce50a5376495c499a0b9ad10 (cherry picked from commit b71c7b40e7d0ade68e1d1a0ee93c8370edf6e415) --- .../java/com/android/server/policy/PhoneWindowManager.java | 4 ++-- .../java/com/android/server/policy/WindowManagerPolicy.java | 3 ++- .../core/java/com/android/server/wm/KeyguardController.java | 6 ++++-- .../src/com/android/server/wm/TestWindowManagerPolicy.java | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 7370d61b8b502..f913cef998137 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -3324,8 +3324,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { } @Override - public void onKeyguardOccludedChangedLw(boolean occluded) { - if (mKeyguardDelegate != null && mKeyguardDelegate.isShowing()) { + public void onKeyguardOccludedChangedLw(boolean occluded, boolean waitAppTransition) { + if (mKeyguardDelegate != null && waitAppTransition) { mPendingKeyguardOccluded = occluded; mKeyguardOccludedChanged = true; } else { diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index 4f00992c713e2..77007fa229a27 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -166,9 +166,10 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { /** * Called when the Keyguard occluded state changed. + * * @param occluded Whether Keyguard is currently occluded or not. */ - void onKeyguardOccludedChangedLw(boolean occluded); + void onKeyguardOccludedChangedLw(boolean occluded, boolean waitAppTransition); /** * Applies a keyguard occlusion change if one happened. diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java index 48258a11d13a7..1d21b9d8c141d 100644 --- a/services/core/java/com/android/server/wm/KeyguardController.java +++ b/services/core/java/com/android/server/wm/KeyguardController.java @@ -403,8 +403,10 @@ class KeyguardController { return; } - mWindowManager.mPolicy.onKeyguardOccludedChangedLw(isDisplayOccluded(DEFAULT_DISPLAY)); - if (isKeyguardLocked(displayId)) { + final boolean waitAppTransition = isKeyguardLocked(displayId); + mWindowManager.mPolicy.onKeyguardOccludedChangedLw(isDisplayOccluded(DEFAULT_DISPLAY), + waitAppTransition); + if (waitAppTransition) { mService.deferWindowLayout(); try { mRootWindowContainer.getDefaultDisplay() diff --git a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java index d2cb7ba5d3111..e2db2e6b19e1b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java @@ -222,7 +222,7 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { } @Override - public void onKeyguardOccludedChangedLw(boolean occluded) { + public void onKeyguardOccludedChangedLw(boolean occluded, boolean waitAppTransition) { } public void setSafeMode(boolean safeMode) {