Merge "Schedule idle timeout when Keyguard state is reset and only if possible" into tm-qpr-dev

This commit is contained in:
Haining Chen
2023-02-09 18:40:07 +00:00
committed by Android (Google) Code Review
2 changed files with 38 additions and 5 deletions

View File

@@ -94,6 +94,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;
@@ -2999,6 +3000,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) {

View File

@@ -2445,15 +2445,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() {
@@ -2947,6 +2960,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
if (DEBUG) Log.d(TAG, "handleReset");
mKeyguardViewControllerLazy.get().reset(true /* hideBouncerWhenShowing */);
}
scheduleNonStrongBiometricIdleTimeout();
}
/**