Merge "Do not run face detection for bypass when the user is authenticated by FP" into tm-qpr-dev am: 6e16fac514
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20493546
Change-Id: Ib3a81e55c8ad6b8cd34e67c75ce5b9ec6e027500
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardListenModel.kt b/packages/SystemUI/src/com/android/keyguard/KeyguardListenModel.kt
index a0206f1..8197685 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardListenModel.kt
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardListenModel.kt
@@ -50,10 +50,9 @@
override val listening: Boolean,
// keep sorted
val authInterruptActive: Boolean,
- val becauseCannotSkipBouncer: Boolean,
val biometricSettingEnabledForUser: Boolean,
val bouncerFullyShown: Boolean,
- val faceAuthenticated: Boolean,
+ val faceAndFpNotAuthenticated: Boolean,
val faceDisabled: Boolean,
val faceLockedOut: Boolean,
val fpLockedOut: Boolean,
@@ -67,7 +66,9 @@
val secureCameraLaunched: Boolean,
val switchingUser: Boolean,
val udfpsBouncerShowing: Boolean,
-) : KeyguardListenModel()
+ val udfpsFingerDown: Boolean,
+ val userNotTrustedOrDetectionIsNeeded: Boolean,
+ ) : KeyguardListenModel()
/**
* Verbose debug information associated with [KeyguardUpdateMonitor.shouldTriggerActiveUnlock].
*/
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 1304934..88477aaa 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -810,9 +810,9 @@
}
// Don't send cancel if authentication succeeds
mFingerprintCancelSignal = null;
+ mLogger.logFingerprintSuccess(userId, isStrongBiometric);
updateBiometricListeningState(BIOMETRIC_ACTION_UPDATE,
FACE_AUTH_UPDATED_FP_AUTHENTICATED);
- mLogger.logFingerprintSuccess(userId, isStrongBiometric);
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
@@ -2726,9 +2726,9 @@
final boolean canBypass = mKeyguardBypassController != null
&& mKeyguardBypassController.canBypass();
// There's no reason to ask the HAL for authentication when the user can dismiss the
- // bouncer, unless we're bypassing and need to auto-dismiss the lock screen even when
- // TrustAgents or biometrics are keeping the device unlocked.
- final boolean becauseCannotSkipBouncer = !getUserCanSkipBouncer(user) || canBypass;
+ // bouncer because the user is trusted, unless we're bypassing and need to auto-dismiss
+ // the lock screen even when TrustAgents are keeping the device unlocked.
+ final boolean userNotTrustedOrDetectionIsNeeded = !getUserHasTrust(user) || canBypass;
// Scan even when encrypted or timeout to show a preemptive bouncer when bypassing.
// Lock-down mode shouldn't scan, since it is more explicit.
@@ -2745,11 +2745,12 @@
strongAuthAllowsScanning = false;
}
- // If the face has recently been authenticated do not attempt to authenticate again.
- final boolean faceAuthenticated = getIsFaceAuthenticated();
+ // If the face or fp has recently been authenticated do not attempt to authenticate again.
+ final boolean faceAndFpNotAuthenticated = !getUserUnlockedWithBiometric(user);
final boolean faceDisabledForUser = isFaceDisabled(user);
final boolean biometricEnabledForUser = mBiometricEnabledForUser.get(user);
final boolean shouldListenForFaceAssistant = shouldListenForFaceAssistant();
+ final boolean isUdfpsFingerDown = mAuthController.isUdfpsFingerDown();
// Only listen if this KeyguardUpdateMonitor belongs to the primary user. There is an
// instance of KeyguardUpdateMonitor for each user but KeyguardUpdateMonitor is user-aware.
@@ -2759,13 +2760,13 @@
|| mOccludingAppRequestingFace
|| awakeKeyguard
|| shouldListenForFaceAssistant
- || mAuthController.isUdfpsFingerDown()
+ || isUdfpsFingerDown
|| mUdfpsBouncerShowing)
- && !mSwitchingUser && !faceDisabledForUser && becauseCannotSkipBouncer
+ && !mSwitchingUser && !faceDisabledForUser && userNotTrustedOrDetectionIsNeeded
&& !mKeyguardGoingAway && biometricEnabledForUser
&& strongAuthAllowsScanning && mIsPrimaryUser
&& (!mSecureCameraLaunched || mOccludingAppRequestingFace)
- && !faceAuthenticated
+ && faceAndFpNotAuthenticated
&& !mGoingToSleep
// We only care about fp locked out state and not face because we still trigger
// face auth even when face is locked out to show the user a message that face
@@ -2779,10 +2780,9 @@
user,
shouldListen,
mAuthInterruptActive,
- becauseCannotSkipBouncer,
biometricEnabledForUser,
mPrimaryBouncerFullyShown,
- faceAuthenticated,
+ faceAndFpNotAuthenticated,
faceDisabledForUser,
isFaceLockedOut(),
fpLockedOut,
@@ -2795,7 +2795,9 @@
strongAuthAllowsScanning,
mSecureCameraLaunched,
mSwitchingUser,
- mUdfpsBouncerShowing));
+ mUdfpsBouncerShowing,
+ isUdfpsFingerDown,
+ userNotTrustedOrDetectionIsNeeded));
return shouldListen;
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardListenQueueTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardListenQueueTest.kt
index 131cf7d..8839662 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardListenQueueTest.kt
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardListenQueueTest.kt
@@ -84,10 +84,9 @@
userId = user,
listening = false,
authInterruptActive = false,
- becauseCannotSkipBouncer = false,
biometricSettingEnabledForUser = false,
bouncerFullyShown = false,
- faceAuthenticated = false,
+ faceAndFpNotAuthenticated = false,
faceDisabled = false,
faceLockedOut = false,
fpLockedOut = false,
@@ -101,4 +100,6 @@
secureCameraLaunched = false,
switchingUser = false,
udfpsBouncerShowing = false,
+ udfpsFingerDown = false,
+ userNotTrustedOrDetectionIsNeeded = false
)
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
index 89cbc7a..beb9a72 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
@@ -1382,6 +1382,29 @@
}
@Test
+ public void testShouldListenForFace_whenFpIsAlreadyAuthenticated_returnsFalse()
+ throws RemoteException {
+ // Face auth should run when the following is true.
+ bouncerFullyVisibleAndNotGoingToSleep();
+ keyguardNotGoingAway();
+ currentUserIsPrimary();
+ strongAuthNotRequired();
+ biometricsEnabledForCurrentUser();
+ currentUserDoesNotHaveTrust();
+ biometricsNotDisabledThroughDevicePolicyManager();
+ userNotCurrentlySwitching();
+
+ mTestableLooper.processAllMessages();
+
+ assertThat(mKeyguardUpdateMonitor.shouldListenForFace()).isTrue();
+
+ successfulFingerprintAuth();
+ mTestableLooper.processAllMessages();
+
+ assertThat(mKeyguardUpdateMonitor.shouldListenForFace()).isFalse();
+ }
+
+ @Test
public void testShouldListenForFace_whenUserIsNotPrimary_returnsFalse() throws RemoteException {
cleanupKeyguardUpdateMonitor();
// This disables face auth
@@ -1935,6 +1958,15 @@
.onAuthenticationAcquired(FINGERPRINT_ACQUIRED_START);
}
+ private void successfulFingerprintAuth() {
+ mKeyguardUpdateMonitor.mFingerprintAuthenticationCallback
+ .onAuthenticationSucceeded(
+ new FingerprintManager.AuthenticationResult(null,
+ null,
+ mCurrentUserId,
+ true));
+ }
+
private void triggerSuccessfulFaceAuth() {
mKeyguardUpdateMonitor.requestFaceAuth(FaceAuthApiRequestReason.UDFPS_POINTER_DOWN);
verify(mFaceManager).authenticate(any(),