From 31e4f8ec2188ba097cda49e5f5adf3f5da1928f9 Mon Sep 17 00:00:00 2001 From: lumark Date: Thu, 10 Jan 2019 20:48:18 +0800 Subject: [PATCH] Fix IME window can't show on keyguard with setShowWhenLocked. For new API android:showWhenLocked and Activity#setShowWhenLocked has a bug that didn't sync window side, caused IME target window will still be treated no show when locked flag in PhoneWindowManager#shouldBeHiddenByKeyguard() and then the IME window will be hidden. Thanks to AM / WM unification, leverage this to call ActivityRecord#canShowWhenLocked in WM side rather then just checking FLAG_SHOW_WHEN_LOCKED. Bug: 119629545 Test: atest KeyguardLockedTests Change-Id: I59b01c24b54fb512c5ef4c107274fc36bb3c948e --- .../com/android/server/policy/PhoneWindowManager.java | 7 +++---- .../com/android/server/policy/WindowManagerPolicy.java | 3 +++ services/core/java/com/android/server/wm/WindowState.java | 8 ++++++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 2060aef370447..383549aff295a 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2270,9 +2270,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { } final LayoutParams attrs = win.getAttrs(); - final boolean showImeOverKeyguard = imeTarget != null && imeTarget.isVisibleLw() && - ((imeTarget.getAttrs().flags & FLAG_SHOW_WHEN_LOCKED) != 0 - || !canBeHiddenByKeyguardLw(imeTarget)); + final boolean showImeOverKeyguard = imeTarget != null && imeTarget.isVisibleLw() + && (imeTarget.canShowWhenLocked() || !canBeHiddenByKeyguardLw(imeTarget)); // Show IME over the keyguard if the target allows it boolean allowWhenLocked = (win.isInputMethodWindow() || imeTarget == this) @@ -2280,7 +2279,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (isKeyguardLocked() && isKeyguardOccluded()) { // Show SHOW_WHEN_LOCKED windows if Keyguard is occluded. - allowWhenLocked |= (attrs.flags & FLAG_SHOW_WHEN_LOCKED) != 0 + allowWhenLocked |= win.canShowWhenLocked() // Show error dialogs over apps that are shown on lockscreen || (attrs.privateFlags & PRIVATE_FLAG_SYSTEM_ERROR) != 0; } diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index 3da325c55b326..98f6f0e10c8e7 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -468,6 +468,9 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { /** @return true if this window desires key events. */ boolean canReceiveKeys(); + /** @return true if the window can show over keyguard. */ + boolean canShowWhenLocked(); + /** * Writes {@link com.android.server.wm.IdentifierProto} to stream. */ diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index cd29b3c29248d..8f86c003e4b01 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -2405,6 +2405,14 @@ class WindowState extends WindowContainer implements WindowManagerP && !cantReceiveTouchInput(); } + @Override + public boolean canShowWhenLocked() { + final boolean showBecauseOfActivity = + mAppToken != null && mAppToken.mActivityRecord.canShowWhenLocked(); + final boolean showBecauseOfWindow = (getAttrs().flags & FLAG_SHOW_WHEN_LOCKED) != 0; + return showBecauseOfActivity || showBecauseOfWindow; + } + /** @return false if this window desires touch events. */ boolean cantReceiveTouchInput() { return mAppToken != null && mAppToken.getTask() != null