diff options
| -rw-r--r-- | packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java | 18 | ||||
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java | 25 |
2 files changed, 38 insertions, 5 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 204f09ee4678..064dd9134f22 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -96,6 +96,7 @@ import android.hardware.biometrics.BiometricFingerprintConstants; import android.hardware.biometrics.BiometricManager; import android.hardware.biometrics.BiometricSourceType; import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback; +import android.hardware.biometrics.SensorProperties; import android.hardware.face.FaceManager; import android.hardware.face.FaceSensorPropertiesInternal; import android.hardware.fingerprint.FingerprintManager; @@ -2986,6 +2987,23 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab return isUnlockWithFacePossible(userId) || isUnlockWithFingerprintPossible(userId); } + /** + * If non-strong (i.e. weak or convenience) biometrics hardware is available, not disabled, and + * user has enrolled templates. This does NOT check if the device is encrypted or in lockdown. + * + * @param userId User that's trying to unlock. + * @return {@code true} if possible. + */ + public boolean isUnlockingWithNonStrongBiometricsPossible(int userId) { + // This assumes that there is at most one face and at most one fingerprint sensor + return (mFaceManager != null && !mFaceSensorProperties.isEmpty() + && (mFaceSensorProperties.get(0).sensorStrength != SensorProperties.STRENGTH_STRONG) + && isUnlockWithFacePossible(userId)) + || (mFpm != null && !mFingerprintSensorProperties.isEmpty() + && (mFingerprintSensorProperties.get(0).sensorStrength + != SensorProperties.STRENGTH_STRONG) && isUnlockWithFingerprintPossible(userId)); + } + @SuppressLint("MissingPermission") @VisibleForTesting boolean isUnlockWithFingerprintPossible(int userId) { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index fe84ac5a32bc..d62d5aed7988 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -2447,15 +2447,28 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, } mKeyguardDisplayManager.show(); - // schedule 4hr idle timeout after which non-strong biometrics (i.e. weak or convenience - // biometric) can't be used to unlock device until unlocking with strong biometric or - // primary auth (i.e. PIN/pattern/password) - mLockPatternUtils.scheduleNonStrongBiometricIdleTimeout( - KeyguardUpdateMonitor.getCurrentUser()); + scheduleNonStrongBiometricIdleTimeout(); Trace.endSection(); } + /** + * Schedule 4-hour idle timeout for non-strong biometrics when the device is locked + */ + private void scheduleNonStrongBiometricIdleTimeout() { + final int currentUser = KeyguardUpdateMonitor.getCurrentUser(); + // If unlocking with non-strong (i.e. weak or convenience) biometrics is possible, schedule + // 4hr idle timeout after which non-strong biometrics can't be used to unlock device until + // unlocking with strong biometric or primary auth (i.e. PIN/pattern/password) + if (mUpdateMonitor.isUnlockingWithNonStrongBiometricsPossible(currentUser)) { + if (DEBUG) { + Log.d(TAG, "scheduleNonStrongBiometricIdleTimeout: schedule an alarm for " + + "currentUser=" + currentUser); + } + mLockPatternUtils.scheduleNonStrongBiometricIdleTimeout(currentUser); + } + } + private final Runnable mKeyguardGoingAwayRunnable = new Runnable() { @Override public void run() { @@ -2949,6 +2962,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, if (DEBUG) Log.d(TAG, "handleReset"); mKeyguardViewControllerLazy.get().reset(true /* hideBouncerWhenShowing */); } + + scheduleNonStrongBiometricIdleTimeout(); } /** |