OSDN Git Service

Adapted the behavior when unlocking with fingerprint is not allowed
authorSelim Cinek <cinek@google.com>
Mon, 20 Jul 2015 21:39:25 +0000 (14:39 -0700)
committerSelim Cinek <cinek@google.com>
Thu, 23 Jul 2015 22:27:32 +0000 (15:27 -0700)
We now keep the fingerprint running and switch to the bouncer when
the user successfully authenticated.

Bug: 21618072
Change-Id: If00061cb3914afd4d7a7d75964594484c792a890

packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java

index b098258..ec185eb 100644 (file)
@@ -111,7 +111,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
     private static final int MSG_DEVICE_PROVISIONED = 308;
     private static final int MSG_DPM_STATE_CHANGED = 309;
     private static final int MSG_USER_SWITCHING = 310;
-    private static final int MSG_KEYGUARD_VISIBILITY_CHANGED = 312;
+    private static final int MSG_KEYGUARD_VISIBILITY_CHANGED = 311;
+    private static final int MSG_KEYGUARD_RESET = 312;
     private static final int MSG_BOOT_COMPLETED = 313;
     private static final int MSG_USER_SWITCH_COMPLETE = 314;
     private static final int MSG_USER_INFO_CHANGED = 317;
@@ -135,6 +136,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
     private boolean mKeyguardIsVisible;
     private boolean mBouncer;
     private boolean mBootCompleted;
+    private boolean mUserHasAuthenticatedSinceBoot;
 
     // Device provisioning state
     private boolean mDeviceProvisioned;
@@ -194,6 +196,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
                 case MSG_KEYGUARD_VISIBILITY_CHANGED:
                     handleKeyguardVisibilityChanged(msg.arg1);
                     break;
+                case MSG_KEYGUARD_RESET:
+                    handleKeyguardReset();
+                    break;
                 case MSG_KEYGUARD_BOUNCER_CHANGED:
                     handleKeyguardBouncerChanged(msg.arg1);
                     break;
@@ -497,7 +502,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
     }
 
     public boolean getUserCanSkipBouncer(int userId) {
-        return getUserHasTrust(userId) || mUserFingerprintAuthenticated.get(userId);
+        return getUserHasTrust(userId) || (mUserFingerprintAuthenticated.get(userId)
+                && isUnlockingWithFingerprintAllowed());
     }
 
     public boolean getUserHasTrust(int userId) {
@@ -508,6 +514,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
         return mUserTrustIsManaged.get(userId) && !isTrustDisabled(userId);
     }
 
+    public boolean isUnlockingWithFingerprintAllowed() {
+        return mUserHasAuthenticatedSinceBoot;
+    }
+
     static class DisplayClientState {
         public int clientGeneration;
         public boolean clearing;
@@ -867,14 +877,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
     }
 
     private boolean shouldListenForFingerprint() {
-        return mKeyguardIsVisible && !mSwitchingUser
-                && mTrustManager.hasUserAuthenticatedSinceBoot(ActivityManager.getCurrentUser());
+        return mKeyguardIsVisible && !mSwitchingUser;
     }
 
     private void startListeningForFingerprint() {
         if (DEBUG) Log.v(TAG, "startListeningForFingerprint()");
         int userId = ActivityManager.getCurrentUser();
         if (isUnlockWithFingerPrintPossible(userId)) {
+            mUserHasAuthenticatedSinceBoot = mTrustManager.hasUserAuthenticatedSinceBoot(
+                    ActivityManager.getCurrentUser());
             if (mFingerprintCancelSignal != null) {
                 mFingerprintCancelSignal.cancel();
             }
@@ -1168,6 +1179,16 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
     }
 
     /**
+     * Handle {@link #MSG_KEYGUARD_RESET}
+     */
+    private void handleKeyguardReset() {
+        if (DEBUG) Log.d(TAG, "handleKeyguardReset");
+        if (!isUnlockingWithFingerprintAllowed()) {
+            updateFingerprintListeningState();
+        }
+    }
+
+    /**
      * Handle {@link #MSG_KEYGUARD_BOUNCER_CHANGED}
      * @see #sendKeyguardBouncerChanged(boolean)
      */
@@ -1274,6 +1295,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
         message.sendToTarget();
     }
 
+    public void sendKeyguardReset() {
+        mHandler.obtainMessage(MSG_KEYGUARD_RESET).sendToTarget();
+    }
+
     /**
      * @see #handleKeyguardBouncerChanged(int)
      */
index c01a485..f595847 100644 (file)
@@ -461,7 +461,9 @@ public class KeyguardViewMediator extends SystemUI {
         @Override
         public void onFingerprintAuthenticated(int userId, boolean wakeAndUnlocking) {
             if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
-                mStatusBarKeyguardViewManager.notifyKeyguardAuthenticated();
+                if (mUpdateMonitor.isUnlockingWithFingerprintAllowed()) {
+                    mStatusBarKeyguardViewManager.notifyKeyguardAuthenticated();
+                }
             } else {
                 if (wakeAndUnlocking) {
                     mWakeAndUnlocking = true;
index a5310a5..9d81e6e 100644 (file)
@@ -651,6 +651,9 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
 
         @Override
         public void onFingerprintHelp(int msgId, String helpString) {
+            if (!KeyguardUpdateMonitor.getInstance(mContext).isUnlockingWithFingerprintAllowed()) {
+                return;
+            }
             mLockIcon.setTransientFpError(true);
             mIndicationController.showTransientIndication(helpString,
                     getResources().getColor(R.color.system_warning_color, null));
@@ -660,6 +663,9 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
 
         @Override
         public void onFingerprintError(int msgId, String errString) {
+            if (!KeyguardUpdateMonitor.getInstance(mContext).isUnlockingWithFingerprintAllowed()) {
+                return;
+            }
             // TODO: Go to bouncer if this is "too many attempts" (lockout) error.
             mIndicationController.showTransientIndication(errString,
                     getResources().getColor(R.color.system_warning_color, null));
index 9e2ce15..d93f7c2 100644 (file)
@@ -224,13 +224,14 @@ public class LockIcon extends KeyguardAffordanceView {
     }
 
     private int getState() {
-        boolean fingerprintRunning =
-                KeyguardUpdateMonitor.getInstance(mContext).isFingerprintDetectionRunning();
+        KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+        boolean fingerprintRunning = updateMonitor.isFingerprintDetectionRunning();
+        boolean unlockingAllowed = updateMonitor.isUnlockingWithFingerprintAllowed();
         if (mUnlockMethodCache.canSkipBouncer()) {
             return STATE_LOCK_OPEN;
         } else if (mTransientFpError) {
             return STATE_FINGERPRINT_ERROR;
-        } else if (fingerprintRunning) {
+        } else if (fingerprintRunning && unlockingAllowed) {
             return STATE_FINGERPRINT;
         } else if (mUnlockMethodCache.isFaceUnlockRunning()) {
             return STATE_FACE_UNLOCK;
index e622144..6b3a59d 100644 (file)
@@ -150,6 +150,7 @@ public class StatusBarKeyguardViewManager {
             } else {
                 showBouncerOrKeyguard();
             }
+            KeyguardUpdateMonitor.getInstance(mContext).sendKeyguardReset();
             updateStates();
         }
     }
index f31311d..c8c45e3 100644 (file)
@@ -133,6 +133,9 @@ public class UnlockMethodCache {
 
         @Override
         public void onFingerprintAuthenticated(int userId, boolean wakeAndUnlocking) {
+            if (!mKeyguardUpdateMonitor.isUnlockingWithFingerprintAllowed()) {
+                return;
+            }
             update(false /* updateAlways */);
         }