diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java index 65d93660276..526ae8f6ed0 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java @@ -42,6 +42,8 @@ import android.os.Bundle; import android.os.Handler; import android.os.UserHandle; import android.os.UserManager; +import android.os.VibrationEffect; +import android.os.Vibrator; import android.text.InputFilter; import android.text.Spanned; import android.text.TextUtils; @@ -109,6 +111,9 @@ public class FingerprintSettings extends SubSettings { private static final int RESULT_FINISHED = BiometricEnrollBase.RESULT_FINISHED; private static final int RESULT_SKIP = BiometricEnrollBase.RESULT_SKIP; private static final int RESULT_TIMEOUT = BiometricEnrollBase.RESULT_TIMEOUT; + @VisibleForTesting + static final VibrationEffect SUCCESS_VIBRATION_EFFECT = + VibrationEffect.get(VibrationEffect.EFFECT_CLICK); @Override public Intent getIntent() { @@ -285,6 +290,7 @@ public class FingerprintSettings extends SubSettings { private FingerprintAuthenticateSidecar mAuthenticateSidecar; private FingerprintRemoveSidecar mRemovalSidecar; private HashMap mFingerprintsRenaming; + private Vibrator mVibrator; @Nullable private UdfpsEnrollCalibrator mCalibrator; @@ -367,8 +373,8 @@ public class FingerprintSettings extends SubSettings { break; case MSG_FINGER_AUTH_HELP: { // Not used + break; } - break; } } }; @@ -511,6 +517,7 @@ public class FingerprintSettings extends SubSettings { addFirstFingerprint(null); } } + mVibrator = getContext().getSystemService(Vibrator.class); final PreferenceScreen root = getPreferenceScreen(); root.removeAll(); addPreferencesFromResource(getPreferenceScreenResId()); @@ -1095,6 +1102,7 @@ public class FingerprintSettings extends SubSettings { } private void highlightFingerprintItem(int fpId) { + mVibrator.vibrate(SUCCESS_VIBRATION_EFFECT); String prefName = genKey(fpId); FingerprintPreference fpref = (FingerprintPreference) findPreference(prefName); final Drawable highlight = getHighlightDrawable(); 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 b3e1c5dd08b..ca76c1e6069 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java @@ -54,6 +54,7 @@ import android.os.Bundle; import android.os.CancellationSignal; import android.os.Looper; import android.os.UserHandle; +import android.os.Vibrator; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; @@ -128,6 +129,9 @@ public class FingerprintSettingsFragmentTest { mAuthenticationCallbackArgumentCaptor = ArgumentCaptor.forClass( FingerprintManager.AuthenticationCallback.class); + @Mock + private Vibrator mVibrator; + private FingerprintAuthenticateSidecar mFingerprintAuthenticateSidecar; private FingerprintRemoveSidecar mFingerprintRemoveSidecar; @@ -141,6 +145,7 @@ public class FingerprintSettingsFragmentTest { doReturn(mContext).when(mFragment).getContext(); doReturn(mBiometricManager).when(mContext).getSystemService(BiometricManager.class); doReturn(true).when(mFingerprintManager).isHardwareDetected(); + doReturn(mVibrator).when(mContext).getSystemService(Vibrator.class); when(mBiometricManager.canAuthenticate( BiometricManager.Authenticators.MANDATORY_BIOMETRICS)) .thenReturn(BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE); @@ -287,6 +292,28 @@ public class FingerprintSettingsFragmentTest { assertThat(mFragment.isVisible()).isTrue(); } + @Test + @Ignore("b/353726774") + public void fingerprintVibratesOnAuthSuccess() { + setUpFragment(false); + + doNothing().when(mFingerprintManager).authenticate(any(), + mCancellationSignalArgumentCaptor.capture(), + mAuthenticationCallbackArgumentCaptor.capture(), any(), anyInt()); + + mFingerprintAuthenticateSidecar.startAuthentication(1); + + assertThat(mAuthenticationCallbackArgumentCaptor.getValue()).isNotNull(); + assertThat(mCancellationSignalArgumentCaptor.getValue()).isNotNull(); + + mAuthenticationCallbackArgumentCaptor.getValue() + .onAuthenticationSucceeded(new FingerprintManager.AuthenticationResult(null, + new Fingerprint("finger 1", 1, 1), 0 /* userId */, false)); + + shadowOf(Looper.getMainLooper()).idle(); + verify(mVibrator).vibrate(FingerprintSettings.SUCCESS_VIBRATION_EFFECT); + } + @Test public void testNotIndexable_whenDisabled() { doReturn(mPackageManager).when(mContext).getPackageManager();