summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jorim Jaggi <jjaggi@google.com> 2021-05-20 18:35:30 +0200
committer Jorim Jaggi <jjaggi@google.com> 2021-05-21 11:34:10 +0000
commit1fc88c383eb7d59b3eee7b0064a4aa80f3dee3ff (patch)
tree4a65f2d3bf981b02075de53a53f0a69231e4db2d
parent12f7871029999a41dc68746cdaaff66983fceab8 (diff)
Fix race condition between lockNow() and updateLockscreenTimeout
If updateLockscreenTimeout gets called before the Runnable queued from lockNow gets executed, lockNow request will be ignored. Fix this by not clearing out the runnable if it's pending lock request. Test: Switch user, ensure lockscreen comes up Bug: 161149543 Change-Id: Ie486396fd7328edf8ca0912df92524bb82a1fb7f (cherry picked from commit 875fa991aac0f3bbd5c66327408ceae60a24a6b3) Merged-In: Ie486396fd7328edf8ca0912df92524bb82a1fb7f
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java12
1 files changed, 11 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index da87b2f1994b..1288335dd3ae 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -618,6 +618,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private int mPowerButtonSuppressionDelayMillis = POWER_BUTTON_SUPPRESSION_DELAY_DEFAULT_MILLIS;
+ private boolean mLockNowPending = false;
+
private static final int MSG_DISPATCH_MEDIA_KEY_WITH_WAKE_LOCK = 3;
private static final int MSG_DISPATCH_MEDIA_KEY_REPEAT_WITH_WAKE_LOCK = 4;
private static final int MSG_KEYGUARD_DRAWN_COMPLETE = 5;
@@ -4988,6 +4990,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mKeyguardDelegate.doKeyguardTimeout(options);
}
mLockScreenTimerActive = false;
+ mLockNowPending = false;
options = null;
}
}
@@ -4997,7 +5000,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
- ScreenLockTimeout mScreenLockTimeout = new ScreenLockTimeout();
+ final ScreenLockTimeout mScreenLockTimeout = new ScreenLockTimeout();
@Override
public void lockNow(Bundle options) {
@@ -5009,6 +5012,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mScreenLockTimeout.setLockOptions(options);
}
mHandler.post(mScreenLockTimeout);
+ synchronized (mScreenLockTimeout) {
+ mLockNowPending = true;
+ }
}
// TODO (b/113840485): Move this logic to DisplayPolicy when lockscreen supports multi-display.
@@ -5024,6 +5030,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private void updateLockScreenTimeout() {
synchronized (mScreenLockTimeout) {
+ if (mLockNowPending) {
+ Log.w(TAG, "lockNow pending, ignore updating lockscreen timeout");
+ return;
+ }
final boolean enable = !mAllowLockscreenWhenOnDisplays.isEmpty()
&& mDefaultDisplayPolicy.isAwake()
&& mKeyguardDelegate != null && mKeyguardDelegate.isSecure(mCurrentUserId);