Start fingerprint after face fails quickly

Flag: NONE
Test: atest AuthControllerTest AuthSessionTest
Bug: 303839389
Change-Id: I77afe09f7cc6e8cb5b04b76b97bb91eb81457e15
This commit is contained in:
Diya Bera 2023-11-16 14:18:06 -08:00
parent be10ee5a41
commit 371a05afdb
4 changed files with 59 additions and 2 deletions

View File

@ -100,7 +100,6 @@ import javax.inject.Inject;
import javax.inject.Provider;
import kotlin.Unit;
import kotlinx.coroutines.CoroutineScope;
/**
@ -1099,6 +1098,7 @@ public class AuthController implements CoreStartable, CommandQueue.Callbacks,
// TODO(b/141025588): Create separate methods for handling hard and soft errors.
final boolean isSoftError = (error == BiometricConstants.BIOMETRIC_PAUSED_REJECTED
|| error == BiometricConstants.BIOMETRIC_ERROR_TIMEOUT
|| error == BiometricConstants.BIOMETRIC_ERROR_RE_ENROLL
|| isCameraPrivacyEnabled);
if (mCurrentDialog != null) {
if (mCurrentDialog.isAllowDeviceCredentials() && isLockout) {

View File

@ -474,6 +474,22 @@ public class AuthControllerTest extends SysuiTestCase {
mContext.getString(R.string.biometric_not_recognized));
}
@Test
public void testOnAuthenticationFailedInvoked_whenBiometricReEnrollRequired() {
showDialog(new int[] {1} /* sensorIds */, false /* credentialAllowed */);
final int modality = BiometricAuthenticator.TYPE_FACE;
mAuthController.onBiometricError(modality,
BiometricConstants.BIOMETRIC_ERROR_RE_ENROLL,
0 /* vendorCode */);
verify(mDialog1).onAuthenticationFailed(mModalityCaptor.capture(),
mMessageCaptor.capture());
assertThat(mModalityCaptor.getValue()).isEqualTo(modality);
assertThat(mMessageCaptor.getValue()).isEqualTo(mContext.getString(
R.string.face_recalibrate_notification_content));
}
@Test
public void testOnAuthenticationFailedInvoked_coex_whenFaceAuthRejected_withPaused() {
testOnAuthenticationFailedInvoked_coex_whenFaceAuthRejected(

View File

@ -576,7 +576,7 @@ public final class AuthSession implements IBinder.DeathRecipient {
}
void onDialogAnimatedIn(boolean startFingerprintNow) {
if (mState != STATE_AUTH_STARTED) {
if (mState != STATE_AUTH_STARTED && mState != STATE_ERROR_PENDING_SYSUI) {
Slog.e(TAG, "onDialogAnimatedIn, unexpected state: " + mState);
return;
}

View File

@ -28,6 +28,8 @@ import static com.android.server.biometrics.BiometricServiceStateProto.STATE_AUT
import static com.android.server.biometrics.BiometricServiceStateProto.STATE_AUTH_STARTED_UI_SHOWING;
import static com.android.server.biometrics.BiometricServiceStateProto.STATE_ERROR_PENDING_SYSUI;
import static com.google.common.truth.Truth.assertThat;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
@ -247,6 +249,45 @@ public class AuthSessionTest {
assertEquals(STATE_ERROR_PENDING_SYSUI, session.getState());
}
@Test
public void testOnErrorReceivedBeforeOnDialogAnimatedIn() throws RemoteException {
final int fingerprintId = 0;
final int faceId = 1;
setupFingerprint(fingerprintId, FingerprintSensorProperties.TYPE_REAR);
setupFace(faceId, true /* confirmationAlwaysRequired */,
mock(IBiometricAuthenticator.class));
final AuthSession session = createAuthSession(mSensors,
false /* checkDevicePolicyManager */,
Authenticators.BIOMETRIC_STRONG,
TEST_REQUEST_ID,
0 /* operationId */,
0 /* userId */);
session.goToInitialState();
for (BiometricSensor sensor : session.mPreAuthInfo.eligibleSensors) {
assertThat(sensor.getSensorState()).isEqualTo(BiometricSensor.STATE_WAITING_FOR_COOKIE);
session.onCookieReceived(
session.mPreAuthInfo.eligibleSensors.get(sensor.id).getCookie());
}
assertThat(session.allCookiesReceived()).isTrue();
assertThat(session.getState()).isEqualTo(STATE_AUTH_STARTED);
final BiometricSensor faceSensor = session.mPreAuthInfo.eligibleSensors.get(faceId);
final BiometricSensor fingerprintSensor = session.mPreAuthInfo.eligibleSensors.get(
fingerprintId);
final int cookie = faceSensor.getCookie();
session.onErrorReceived(0, cookie, BiometricConstants.BIOMETRIC_ERROR_RE_ENROLL, 0);
assertThat(faceSensor.getSensorState()).isEqualTo(BiometricSensor.STATE_STOPPED);
assertThat(session.getState()).isEqualTo(STATE_ERROR_PENDING_SYSUI);
session.onDialogAnimatedIn(true);
assertThat(session.getState()).isEqualTo(STATE_AUTH_STARTED_UI_SHOWING);
assertThat(fingerprintSensor.getSensorState()).isEqualTo(
BiometricSensor.STATE_AUTHENTICATING);
}
@Test
public void testCancelReducesAppetiteForCookies() throws Exception {
setupFace(0 /* id */, false /* confirmationAlwaysRequired */,