summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author lumark <lumark@google.com> 2019-01-10 20:48:18 +0800
committer lumark <lumark@google.com> 2019-01-15 17:08:58 +0800
commit31e4f8ec2188ba097cda49e5f5adf3f5da1928f9 (patch)
tree866530aa3fad5d5b213af95ec01879fe1af9bc17
parent560e9f271336148e93ff6f06470306c829f64008 (diff)
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
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java7
-rw-r--r--services/core/java/com/android/server/policy/WindowManagerPolicy.java3
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java8
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 2060aef37044..383549aff295 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 3da325c55b32..98f6f0e10c8e 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 cd29b3c29248..8f86c003e4b0 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<WindowState> 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