@@ -98,7 +98,8 @@ public class LockPatternKeyguardView extends KeyguardViewBase implements Handler
9898 private View mLockScreen;
9999 private View mUnlockScreen;
100100
101- private boolean mScreenOn = false;
101+ private volatile boolean mScreenOn = false;
102+ private volatile boolean mWindowFocused = false;
102103 private boolean mEnableFallback = false; // assume no fallback UI until we know better
103104
104105 private boolean mShowLockBeforeUnlock = false;
@@ -110,6 +111,7 @@ public class LockPatternKeyguardView extends KeyguardViewBase implements Handler
110111
111112 private boolean mFaceLockServiceRunning = false;
112113 private final Object mFaceLockServiceRunningLock = new Object();
114+ private final Object mFaceLockStartupLock = new Object();
113115
114116 private Handler mHandler;
115117 private final int MSG_SHOW_FACELOCK_AREA_VIEW = 0;
@@ -514,13 +516,10 @@ public void onScreenTurnedOff() {
514516 stopAndUnbindFromFaceLock();
515517 }
516518
517- @Override
518- public void onScreenTurnedOn() {
519- mScreenOn = true;
520- show();
521-
522- // When screen is turned on, need to bind to FaceLock service if we are using FaceLock
523- // But only if not dealing with a call
519+ /** When screen is turned on and focused, need to bind to FaceLock service if we are using
520+ * FaceLock, but only if we're not dealing with a call
521+ */
522+ private void activateFaceLockIfAble() {
524523 final boolean transportInvisible = mTransportControlView == null ? true :
525524 mTransportControlView.getVisibility() != View.VISIBLE;
526525 if (mUpdateMonitor.getPhoneState() == TelephonyManager.CALL_STATE_IDLE
@@ -534,12 +533,34 @@ public void onScreenTurnedOn() {
534533 }
535534 }
536535
537- /** Unbind from facelock if something covers this window (such as an alarm) */
536+ @Override
537+ public void onScreenTurnedOn() {
538+ boolean runFaceLock = false;
539+ //Make sure to start facelock iff the screen is both on and focused
540+ synchronized(mFaceLockStartupLock) {
541+ mScreenOn = true;
542+ runFaceLock = mWindowFocused;
543+ }
544+ show();
545+ if(runFaceLock) activateFaceLockIfAble();
546+ }
547+
548+ /** Unbind from facelock if something covers this window (such as an alarm)
549+ * bind to facelock if the lockscreen window just came into focus, and the screen is on
550+ */
538551 @Override
539552 public void onWindowFocusChanged (boolean hasWindowFocus) {
553+ boolean runFaceLock = false;
554+ //Make sure to start facelock iff the screen is both on and focused
555+ synchronized(mFaceLockStartupLock) {
556+ if(mScreenOn && !mWindowFocused) runFaceLock = hasWindowFocus;
557+ mWindowFocused = hasWindowFocus;
558+ }
540559 if(!hasWindowFocus) {
541560 stopAndUnbindFromFaceLock();
542561 mHandler.sendEmptyMessage(MSG_HIDE_FACELOCK_AREA_VIEW);
562+ } else if (runFaceLock) {
563+ activateFaceLockIfAble();
543564 }
544565 }
545566
0 commit comments