Merge "Added haptic feedback in fingerprint settings auth" into main

This commit is contained in:
Joshua Mccloskey
2024-08-09 00:43:42 +00:00
committed by Android (Google) Code Review
2 changed files with 36 additions and 1 deletions

View File

@@ -42,6 +42,8 @@ import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.text.InputFilter; import android.text.InputFilter;
import android.text.Spanned; import android.text.Spanned;
import android.text.TextUtils; 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_FINISHED = BiometricEnrollBase.RESULT_FINISHED;
private static final int RESULT_SKIP = BiometricEnrollBase.RESULT_SKIP; private static final int RESULT_SKIP = BiometricEnrollBase.RESULT_SKIP;
private static final int RESULT_TIMEOUT = BiometricEnrollBase.RESULT_TIMEOUT; private static final int RESULT_TIMEOUT = BiometricEnrollBase.RESULT_TIMEOUT;
@VisibleForTesting
static final VibrationEffect SUCCESS_VIBRATION_EFFECT =
VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
@Override @Override
public Intent getIntent() { public Intent getIntent() {
@@ -285,6 +290,7 @@ public class FingerprintSettings extends SubSettings {
private FingerprintAuthenticateSidecar mAuthenticateSidecar; private FingerprintAuthenticateSidecar mAuthenticateSidecar;
private FingerprintRemoveSidecar mRemovalSidecar; private FingerprintRemoveSidecar mRemovalSidecar;
private HashMap<Integer, String> mFingerprintsRenaming; private HashMap<Integer, String> mFingerprintsRenaming;
private Vibrator mVibrator;
@Nullable @Nullable
private UdfpsEnrollCalibrator mCalibrator; private UdfpsEnrollCalibrator mCalibrator;
@@ -367,8 +373,8 @@ public class FingerprintSettings extends SubSettings {
break; break;
case MSG_FINGER_AUTH_HELP: { case MSG_FINGER_AUTH_HELP: {
// Not used // Not used
break;
} }
break;
} }
} }
}; };
@@ -511,6 +517,7 @@ public class FingerprintSettings extends SubSettings {
addFirstFingerprint(null); addFirstFingerprint(null);
} }
} }
mVibrator = getContext().getSystemService(Vibrator.class);
final PreferenceScreen root = getPreferenceScreen(); final PreferenceScreen root = getPreferenceScreen();
root.removeAll(); root.removeAll();
addPreferencesFromResource(getPreferenceScreenResId()); addPreferencesFromResource(getPreferenceScreenResId());
@@ -1095,6 +1102,7 @@ public class FingerprintSettings extends SubSettings {
} }
private void highlightFingerprintItem(int fpId) { private void highlightFingerprintItem(int fpId) {
mVibrator.vibrate(SUCCESS_VIBRATION_EFFECT);
String prefName = genKey(fpId); String prefName = genKey(fpId);
FingerprintPreference fpref = (FingerprintPreference) findPreference(prefName); FingerprintPreference fpref = (FingerprintPreference) findPreference(prefName);
final Drawable highlight = getHighlightDrawable(); final Drawable highlight = getHighlightDrawable();

View File

@@ -54,6 +54,7 @@ import android.os.Bundle;
import android.os.CancellationSignal; import android.os.CancellationSignal;
import android.os.Looper; import android.os.Looper;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.Vibrator;
import android.platform.test.annotations.EnableFlags; import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule; import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings; import android.provider.Settings;
@@ -128,6 +129,9 @@ public class FingerprintSettingsFragmentTest {
mAuthenticationCallbackArgumentCaptor = ArgumentCaptor.forClass( mAuthenticationCallbackArgumentCaptor = ArgumentCaptor.forClass(
FingerprintManager.AuthenticationCallback.class); FingerprintManager.AuthenticationCallback.class);
@Mock
private Vibrator mVibrator;
private FingerprintAuthenticateSidecar mFingerprintAuthenticateSidecar; private FingerprintAuthenticateSidecar mFingerprintAuthenticateSidecar;
private FingerprintRemoveSidecar mFingerprintRemoveSidecar; private FingerprintRemoveSidecar mFingerprintRemoveSidecar;
@@ -141,6 +145,7 @@ public class FingerprintSettingsFragmentTest {
doReturn(mContext).when(mFragment).getContext(); doReturn(mContext).when(mFragment).getContext();
doReturn(mBiometricManager).when(mContext).getSystemService(BiometricManager.class); doReturn(mBiometricManager).when(mContext).getSystemService(BiometricManager.class);
doReturn(true).when(mFingerprintManager).isHardwareDetected(); doReturn(true).when(mFingerprintManager).isHardwareDetected();
doReturn(mVibrator).when(mContext).getSystemService(Vibrator.class);
when(mBiometricManager.canAuthenticate( when(mBiometricManager.canAuthenticate(
BiometricManager.Authenticators.MANDATORY_BIOMETRICS)) BiometricManager.Authenticators.MANDATORY_BIOMETRICS))
.thenReturn(BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE); .thenReturn(BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE);
@@ -287,6 +292,28 @@ public class FingerprintSettingsFragmentTest {
assertThat(mFragment.isVisible()).isTrue(); 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 @Test
public void testNotIndexable_whenDisabled() { public void testNotIndexable_whenDisabled() {
doReturn(mPackageManager).when(mContext).getPackageManager(); doReturn(mPackageManager).when(mContext).getPackageManager();