From 4efd4c16f9373569b26cdc2752727faf90b5c9c0 Mon Sep 17 00:00:00 2001 From: Joshua McCloskey Date: Wed, 24 Apr 2024 22:15:55 +0000 Subject: [PATCH] Restart fingerprint auth on cancel. Test: atest FingerprintSettingsFragmentTest Fixes: 336572954 Change-Id: Ie64d509caf052271a141e466f5c840e92f5dc119 --- .../fingerprint/FingerprintSettings.java | 5 ---- .../FingerprintSettingsFragmentTest.java | 30 ++++++++++++++++++- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java index f0415286a6d..109ae4f22fb 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java @@ -352,11 +352,6 @@ public class FingerprintSettings extends SubSettings { */ protected void handleError(int errMsgId, CharSequence msg) { switch (errMsgId) { - case FingerprintManager.FINGERPRINT_ERROR_CANCELED: - case FingerprintManager.FINGERPRINT_ERROR_USER_CANCELED: - // Only happens if we get preempted by another activity, or canceled by the - // user (e.g. swipe up to home). Ignored. - return; case FingerprintManager.FINGERPRINT_ERROR_LOCKOUT: mInFingerprintLockout = true; // We've been locked out. Reset after 30s. diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java index 58e7e2d4003..6407f648acb 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java @@ -17,6 +17,7 @@ package com.android.settings.biometrics.fingerprint; import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_POWER_BUTTON; +import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_REAR; import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_OPTICAL; import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment; @@ -33,13 +34,16 @@ import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.content.Context; import android.content.Intent; import android.content.pm.UserInfo; import android.hardware.biometrics.ComponentInfoInternal; import android.hardware.biometrics.SensorProperties; +import android.hardware.fingerprint.Fingerprint; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintSensorProperties; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; @@ -80,6 +84,7 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import java.util.ArrayList; +import java.util.List; @RunWith(RobolectricTestRunner.class) @Config(shadows = {ShadowSettingsPreferenceFragment.class, ShadowUtils.class, ShadowFragment.class, @@ -147,7 +152,6 @@ public class FingerprintSettingsFragmentTest { public void testCancellationSignalLifeCycle() { setUpFragment(false); - mFingerprintAuthenticateSidecar.setFingerprintManager(mFingerprintManager); doNothing().when(mFingerprintManager).authenticate(any(), mCancellationSignalArgumentCaptor.capture(), @@ -213,6 +217,7 @@ public class FingerprintSettingsFragmentTest { doReturn(fragmentManager).when(mActivity).getSupportFragmentManager(); mFingerprintAuthenticateSidecar = new FingerprintAuthenticateSidecar(); + mFingerprintAuthenticateSidecar.setFingerprintManager(mFingerprintManager); doReturn(mFingerprintAuthenticateSidecar).when(fragmentManager).findFragmentByTag( "authenticate_sidecar"); @@ -246,4 +251,27 @@ public class FingerprintSettingsFragmentTest { true /* resetLockoutRequiresHardwareAuthToken */)); doReturn(props).when(mFingerprintManager).getSensorPropertiesInternal(); } + + @Test + public void testAuthOnFragmentSetup() { + doReturn(List.of(new Fingerprint("Finger 1", 1, 2, 3))) + .when(mFingerprintManager).getEnrolledFingerprints(anyInt()); + setUpFragment(false, 1, TYPE_REAR); + + verify(mFingerprintManager).authenticate(any(), any(), + any(), any(), anyInt()); + } + + @Test + public void testErrorCancelledRestartsAuth() { + doReturn(List.of(new Fingerprint("Finger 1", 1, 2, 3))) + .when(mFingerprintManager).getEnrolledFingerprints(anyInt()); + setUpFragment(false, 1, TYPE_REAR); + + // When we receive a cancel, we should restart auth. + mFragment.handleError(FingerprintManager.FINGERPRINT_ERROR_CANCELED, "blah"); + + verify(mFingerprintManager, times(2)).authenticate(any(), any(), + any(), any(), anyInt()); + } }