Merge changes from topic "biometric-haptic" into sc-dev

* changes:
  2/n: Update fingerprint vibration logic
  1/n: Move UDFPS enroll haptics back to system_server
This commit is contained in:
Kevin Chyn
2021-07-16 21:59:18 +00:00
committed by Android (Google) Code Review
15 changed files with 45 additions and 48 deletions

View File

@@ -21,11 +21,8 @@ import android.annotation.Nullable;
import android.content.Context; import android.content.Context;
import android.graphics.PointF; import android.graphics.PointF;
import android.hardware.fingerprint.IUdfpsOverlayController; import android.hardware.fingerprint.IUdfpsOverlayController;
import android.media.AudioAttributes;
import android.os.Build; import android.os.Build;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.provider.Settings; import android.provider.Settings;
import android.util.Log; import android.util.Log;
import android.util.TypedValue; import android.util.TypedValue;
@@ -50,12 +47,6 @@ public class UdfpsEnrollHelper {
// Enroll with two center touches before going to guided enrollment // Enroll with two center touches before going to guided enrollment
private static final int NUM_CENTER_TOUCHES = 2; private static final int NUM_CENTER_TOUCHES = 2;
private static final AudioAttributes VIBRATION_SONFICATION_ATTRIBUTES =
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
.build();
interface Listener { interface Listener {
void onEnrollmentProgress(int remaining, int totalSteps); void onEnrollmentProgress(int remaining, int totalSteps);
void onLastStepAcquired(); void onLastStepAcquired();
@@ -66,9 +57,6 @@ public class UdfpsEnrollHelper {
private final int mEnrollReason; private final int mEnrollReason;
private final boolean mAccessibilityEnabled; private final boolean mAccessibilityEnabled;
@NonNull private final List<PointF> mGuidedEnrollmentPoints; @NonNull private final List<PointF> mGuidedEnrollmentPoints;
@NonNull private final Vibrator mVibrator;
@NonNull private final VibrationEffect mEffectClick =
VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
private int mTotalSteps = -1; private int mTotalSteps = -1;
private int mRemainingSteps = -1; private int mRemainingSteps = -1;
@@ -82,7 +70,6 @@ public class UdfpsEnrollHelper {
public UdfpsEnrollHelper(@NonNull Context context, int reason) { public UdfpsEnrollHelper(@NonNull Context context, int reason) {
mContext = context; mContext = context;
mEnrollReason = reason; mEnrollReason = reason;
mVibrator = context.getSystemService(Vibrator.class);
final AccessibilityManager am = context.getSystemService(AccessibilityManager.class); final AccessibilityManager am = context.getSystemService(AccessibilityManager.class);
mAccessibilityEnabled = am.isEnabled(); mAccessibilityEnabled = am.isEnabled();
@@ -141,7 +128,6 @@ public class UdfpsEnrollHelper {
if (remaining != mRemainingSteps) { if (remaining != mRemainingSteps) {
mLocationsEnrolled++; mLocationsEnrolled++;
vibrateSuccess();
} }
mRemainingSteps = remaining; mRemainingSteps = remaining;
@@ -202,11 +188,6 @@ public class UdfpsEnrollHelper {
if (mRemainingSteps <= 2 && mRemainingSteps >= 0) { if (mRemainingSteps <= 2 && mRemainingSteps >= 0) {
mListener.onLastStepAcquired(); mListener.onLastStepAcquired();
vibrateSuccess();
} }
} }
private void vibrateSuccess() {
mVibrator.vibrate(mEffectClick, VIBRATION_SONFICATION_ATTRIBUTES);
}
} }

View File

@@ -22,6 +22,7 @@ import android.hardware.biometrics.BiometricConstants;
import android.media.AudioAttributes; import android.media.AudioAttributes;
import android.os.IBinder; import android.os.IBinder;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.SystemClock; import android.os.SystemClock;
import android.os.VibrationEffect; import android.os.VibrationEffect;
@@ -49,6 +50,8 @@ public abstract class AcquisitionClient<T> extends HalClientMonitor<T> implement
VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK); VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK);
private final PowerManager mPowerManager; private final PowerManager mPowerManager;
// If haptics should occur when auth result (success/reject) is known
protected final boolean mShouldVibrate;
private boolean mShouldSendErrorToClient = true; private boolean mShouldSendErrorToClient = true;
private boolean mAlreadyCancelled; private boolean mAlreadyCancelled;
@@ -59,11 +62,12 @@ public abstract class AcquisitionClient<T> extends HalClientMonitor<T> implement
public AcquisitionClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon, public AcquisitionClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon,
@NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId,
@NonNull String owner, int cookie, int sensorId, int statsModality, @NonNull String owner, int cookie, int sensorId, boolean shouldVibrate,
int statsAction, int statsClient) { int statsModality, int statsAction, int statsClient) {
super(context, lazyDaemon, token, listener, userId, owner, cookie, sensorId, statsModality, super(context, lazyDaemon, token, listener, userId, owner, cookie, sensorId, statsModality,
statsAction, statsClient); statsAction, statsClient);
mPowerManager = context.getSystemService(PowerManager.class); mPowerManager = context.getSystemService(PowerManager.class);
mShouldVibrate = shouldVibrate;
} }
@Override @Override
@@ -191,14 +195,22 @@ public abstract class AcquisitionClient<T> extends HalClientMonitor<T> implement
protected final void vibrateSuccess() { protected final void vibrateSuccess() {
Vibrator vibrator = getContext().getSystemService(Vibrator.class); Vibrator vibrator = getContext().getSystemService(Vibrator.class);
if (vibrator != null) { if (vibrator != null) {
vibrator.vibrate(SUCCESS_VIBRATION_EFFECT, VIBRATION_SONIFICATION_ATTRIBUTES); vibrator.vibrate(Process.myUid(),
getContext().getOpPackageName(),
SUCCESS_VIBRATION_EFFECT,
getClass().getSimpleName() + "::success",
VIBRATION_SONIFICATION_ATTRIBUTES);
} }
} }
protected final void vibrateError() { protected final void vibrateError() {
Vibrator vibrator = getContext().getSystemService(Vibrator.class); Vibrator vibrator = getContext().getSystemService(Vibrator.class);
if (vibrator != null) { if (vibrator != null) {
vibrator.vibrate(ERROR_VIBRATION_EFFECT, VIBRATION_SONIFICATION_ATTRIBUTES); vibrator.vibrate(Process.myUid(),
getContext().getOpPackageName(),
ERROR_VIBRATION_EFFECT,
getClass().getSimpleName() + "::error",
VIBRATION_SONIFICATION_ATTRIBUTES);
} }
} }
} }

View File

@@ -68,9 +68,11 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T>
int targetUserId, long operationId, boolean restricted, @NonNull String owner, int targetUserId, long operationId, boolean restricted, @NonNull String owner,
int cookie, boolean requireConfirmation, int sensorId, boolean isStrongBiometric, int cookie, boolean requireConfirmation, int sensorId, boolean isStrongBiometric,
int statsModality, int statsClient, @Nullable TaskStackListener taskStackListener, int statsModality, int statsClient, @Nullable TaskStackListener taskStackListener,
@NonNull LockoutTracker lockoutTracker, boolean allowBackgroundAuthentication) { @NonNull LockoutTracker lockoutTracker, boolean allowBackgroundAuthentication,
boolean shouldVibrate) {
super(context, lazyDaemon, token, listener, targetUserId, owner, cookie, sensorId, super(context, lazyDaemon, token, listener, targetUserId, owner, cookie, sensorId,
statsModality, BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient); shouldVibrate, statsModality, BiometricsProtoEnums.ACTION_AUTHENTICATE,
statsClient);
mIsStrongBiometric = isStrongBiometric; mIsStrongBiometric = isStrongBiometric;
mOperationId = operationId; mOperationId = operationId;
mRequireConfirmation = requireConfirmation; mRequireConfirmation = requireConfirmation;
@@ -204,7 +206,7 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T>
mAlreadyDone = true; mAlreadyDone = true;
if (listener != null) { if (listener != null && mShouldVibrate) {
vibrateSuccess(); vibrateSuccess();
} }
@@ -250,7 +252,7 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T>
Slog.w(TAG, "Client not listening"); Slog.w(TAG, "Client not listening");
} }
} else { } else {
if (listener != null) { if (listener != null && mShouldVibrate) {
vibrateError(); vibrateError();
} }

View File

@@ -38,7 +38,6 @@ public abstract class EnrollClient<T> extends AcquisitionClient<T> {
protected final byte[] mHardwareAuthToken; protected final byte[] mHardwareAuthToken;
protected final int mTimeoutSec; protected final int mTimeoutSec;
protected final BiometricUtils mBiometricUtils; protected final BiometricUtils mBiometricUtils;
private final boolean mShouldVibrate;
private long mEnrollmentStartTimeMs; private long mEnrollmentStartTimeMs;
@@ -50,15 +49,13 @@ public abstract class EnrollClient<T> extends AcquisitionClient<T> {
public EnrollClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon, public EnrollClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon,
@NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId,
@NonNull byte[] hardwareAuthToken, @NonNull String owner, @NonNull BiometricUtils utils, @NonNull byte[] hardwareAuthToken, @NonNull String owner, @NonNull BiometricUtils utils,
int timeoutSec, int statsModality, int sensorId, int timeoutSec, int statsModality, int sensorId, boolean shouldVibrate) {
boolean shouldVibrate) {
super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId, super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
statsModality, BiometricsProtoEnums.ACTION_ENROLL, shouldVibrate, statsModality, BiometricsProtoEnums.ACTION_ENROLL,
BiometricsProtoEnums.CLIENT_UNKNOWN); BiometricsProtoEnums.CLIENT_UNKNOWN);
mBiometricUtils = utils; mBiometricUtils = utils;
mHardwareAuthToken = Arrays.copyOf(hardwareAuthToken, hardwareAuthToken.length); mHardwareAuthToken = Arrays.copyOf(hardwareAuthToken, hardwareAuthToken.length);
mTimeoutSec = timeoutSec; mTimeoutSec = timeoutSec;
mShouldVibrate = shouldVibrate;
} }
public void onEnrollResult(BiometricAuthenticator.Identifier identifier, int remaining) { public void onEnrollResult(BiometricAuthenticator.Identifier identifier, int remaining) {

View File

@@ -73,7 +73,7 @@ class FaceAuthenticationClient extends AuthenticationClient<ISession> implements
super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted, super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted,
owner, cookie, requireConfirmation, sensorId, isStrongBiometric, owner, cookie, requireConfirmation, sensorId, isStrongBiometric,
BiometricsProtoEnums.MODALITY_FACE, statsClient, null /* taskStackListener */, BiometricsProtoEnums.MODALITY_FACE, statsClient, null /* taskStackListener */,
lockoutCache, allowBackgroundAuthentication); lockoutCache, allowBackgroundAuthentication, true /* shouldVibrate */);
mUsageStats = usageStats; mUsageStats = usageStats;
mLockoutCache = lockoutCache; mLockoutCache = lockoutCache;
mNotificationManager = context.getSystemService(NotificationManager.class); mNotificationManager = context.getSystemService(NotificationManager.class);

View File

@@ -46,8 +46,8 @@ public class FaceDetectClient extends AcquisitionClient<ISession> implements Det
@NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId,
@NonNull String owner, int sensorId, boolean isStrongBiometric, int statsClient) { @NonNull String owner, int sensorId, boolean isStrongBiometric, int statsClient) {
super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId, super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
BiometricsProtoEnums.MODALITY_FACE, BiometricsProtoEnums.ACTION_AUTHENTICATE, true /* shouldVibrate */, BiometricsProtoEnums.MODALITY_FACE,
statsClient); BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient);
mIsStrongBiometric = isStrongBiometric; mIsStrongBiometric = isStrongBiometric;
} }

View File

@@ -65,7 +65,7 @@ class FaceAuthenticationClient extends AuthenticationClient<IBiometricsFace> {
super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted, super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted,
owner, cookie, requireConfirmation, sensorId, isStrongBiometric, owner, cookie, requireConfirmation, sensorId, isStrongBiometric,
BiometricsProtoEnums.MODALITY_FACE, statsClient, null /* taskStackListener */, BiometricsProtoEnums.MODALITY_FACE, statsClient, null /* taskStackListener */,
lockoutTracker, allowBackgroundAuthentication); lockoutTracker, allowBackgroundAuthentication, true /* shouldVibrate */);
mUsageStats = usageStats; mUsageStats = usageStats;
final Resources resources = getContext().getResources(); final Resources resources = getContext().getResources();

View File

@@ -26,6 +26,7 @@ import android.hardware.biometrics.BiometricFingerprintConstants.FingerprintAcqu
import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.BiometricsProtoEnums;
import android.hardware.biometrics.common.ICancellationSignal; import android.hardware.biometrics.common.ICancellationSignal;
import android.hardware.biometrics.fingerprint.ISession; import android.hardware.biometrics.fingerprint.ISession;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.IUdfpsOverlayController; import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.IBinder; import android.os.IBinder;
import android.os.RemoteException; import android.os.RemoteException;
@@ -62,11 +63,12 @@ class FingerprintAuthenticationClient extends AuthenticationClient<ISession> imp
int sensorId, boolean isStrongBiometric, int statsClient, int sensorId, boolean isStrongBiometric, int statsClient,
@Nullable TaskStackListener taskStackListener, @NonNull LockoutCache lockoutCache, @Nullable TaskStackListener taskStackListener, @NonNull LockoutCache lockoutCache,
@Nullable IUdfpsOverlayController udfpsOverlayController, @Nullable IUdfpsOverlayController udfpsOverlayController,
boolean allowBackgroundAuthentication) { boolean allowBackgroundAuthentication,
@NonNull FingerprintSensorPropertiesInternal sensorProps) {
super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted, owner, super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted, owner,
cookie, requireConfirmation, sensorId, isStrongBiometric, cookie, requireConfirmation, sensorId, isStrongBiometric,
BiometricsProtoEnums.MODALITY_FINGERPRINT, statsClient, taskStackListener, BiometricsProtoEnums.MODALITY_FINGERPRINT, statsClient, taskStackListener,
lockoutCache, allowBackgroundAuthentication); lockoutCache, allowBackgroundAuthentication, true /* shouldVibrate */);
mLockoutCache = lockoutCache; mLockoutCache = lockoutCache;
mUdfpsOverlayController = udfpsOverlayController; mUdfpsOverlayController = udfpsOverlayController;
} }

View File

@@ -52,8 +52,8 @@ class FingerprintDetectClient extends AcquisitionClient<ISession> implements Det
@Nullable IUdfpsOverlayController udfpsOverlayController, boolean isStrongBiometric, @Nullable IUdfpsOverlayController udfpsOverlayController, boolean isStrongBiometric,
int statsClient) { int statsClient) {
super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId, super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
BiometricsProtoEnums.MODALITY_FINGERPRINT, BiometricsProtoEnums.ACTION_AUTHENTICATE, true /* shouldVibrate */, BiometricsProtoEnums.MODALITY_FINGERPRINT,
statsClient); BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient);
mIsStrongBiometric = isStrongBiometric; mIsStrongBiometric = isStrongBiometric;
mUdfpsOverlayController = udfpsOverlayController; mUdfpsOverlayController = udfpsOverlayController;
} }

View File

@@ -65,7 +65,7 @@ class FingerprintEnrollClient extends EnrollClient<ISession> implements Udfps {
@Nullable IUdfpsOverlayController udfpsOvelayController, @Nullable IUdfpsOverlayController udfpsOvelayController,
@Nullable ISidefpsController sidefpsController, @Nullable ISidefpsController sidefpsController,
int maxTemplatesPerUser, @FingerprintManager.EnrollReason int enrollReason) { int maxTemplatesPerUser, @FingerprintManager.EnrollReason int enrollReason) {
// UDFPS enroll vibrations are handled in SystemUI // UDFPS haptics occur when an image is acquired (instead of when the result is known)
super(context, lazyDaemon, token, listener, userId, hardwareAuthToken, owner, utils, super(context, lazyDaemon, token, listener, userId, hardwareAuthToken, owner, utils,
0 /* timeoutSec */, BiometricsProtoEnums.MODALITY_FINGERPRINT, sensorId, 0 /* timeoutSec */, BiometricsProtoEnums.MODALITY_FINGERPRINT, sensorId,
!sensorProps.isAnyUdfpsType() /* shouldVibrate */); !sensorProps.isAnyUdfpsType() /* shouldVibrate */);
@@ -104,6 +104,7 @@ class FingerprintEnrollClient extends EnrollClient<ISession> implements Udfps {
// See AcquiredInfo#GOOD and AcquiredInfo#RETRYING_CAPTURE // See AcquiredInfo#GOOD and AcquiredInfo#RETRYING_CAPTURE
if (acquiredInfo == BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_GOOD if (acquiredInfo == BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_GOOD
&& mSensorProps.isAnyUdfpsType()) { && mSensorProps.isAnyUdfpsType()) {
vibrateSuccess();
UdfpsHelper.onAcquiredGood(getSensorId(), mUdfpsOverlayController); UdfpsHelper.onAcquiredGood(getSensorId(), mUdfpsOverlayController);
} }

View File

@@ -395,7 +395,8 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
operationId, restricted, opPackageName, cookie, operationId, restricted, opPackageName, cookie,
false /* requireConfirmation */, sensorId, isStrongBiometric, statsClient, false /* requireConfirmation */, sensorId, isStrongBiometric, statsClient,
mTaskStackListener, mSensors.get(sensorId).getLockoutCache(), mTaskStackListener, mSensors.get(sensorId).getLockoutCache(),
mUdfpsOverlayController, allowBackgroundAuthentication); mUdfpsOverlayController, allowBackgroundAuthentication,
mSensors.get(sensorId).getSensorProperties());
scheduleForSensor(sensorId, client, fingerprintStateCallback); scheduleForSensor(sensorId, client, fingerprintStateCallback);
}); });
} }

View File

@@ -65,7 +65,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient<IBiometricsFi
super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted, super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted,
owner, cookie, requireConfirmation, sensorId, isStrongBiometric, owner, cookie, requireConfirmation, sensorId, isStrongBiometric,
BiometricsProtoEnums.MODALITY_FINGERPRINT, statsClient, taskStackListener, BiometricsProtoEnums.MODALITY_FINGERPRINT, statsClient, taskStackListener,
lockoutTracker, allowBackgroundAuthentication); lockoutTracker, allowBackgroundAuthentication, true /* shouldVibrate */);
mLockoutFrameworkImpl = lockoutTracker; mLockoutFrameworkImpl = lockoutTracker;
mUdfpsOverlayController = udfpsOverlayController; mUdfpsOverlayController = udfpsOverlayController;
} }

View File

@@ -56,8 +56,8 @@ class FingerprintDetectClient extends AcquisitionClient<IBiometricsFingerprint>
int sensorId, @Nullable IUdfpsOverlayController udfpsOverlayController, int sensorId, @Nullable IUdfpsOverlayController udfpsOverlayController,
boolean isStrongBiometric, int statsClient) { boolean isStrongBiometric, int statsClient) {
super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId, super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
BiometricsProtoEnums.MODALITY_FINGERPRINT, BiometricsProtoEnums.ACTION_AUTHENTICATE, true /* shouldVibrate */, BiometricsProtoEnums.MODALITY_FINGERPRINT,
statsClient); BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient);
mUdfpsOverlayController = udfpsOverlayController; mUdfpsOverlayController = udfpsOverlayController;
mIsStrongBiometric = isStrongBiometric; mIsStrongBiometric = isStrongBiometric;
} }

View File

@@ -90,7 +90,8 @@ public class AcquisitionClientTest {
@NonNull LazyDaemon<Object> lazyDaemon, @NonNull IBinder token, @NonNull LazyDaemon<Object> lazyDaemon, @NonNull IBinder token,
@NonNull ClientMonitorCallbackConverter callback) { @NonNull ClientMonitorCallbackConverter callback) {
super(context, lazyDaemon, token, callback, 0 /* userId */, "Test", 0 /* cookie */, super(context, lazyDaemon, token, callback, 0 /* userId */, "Test", 0 /* cookie */,
TEST_SENSOR_ID /* sensorId */, 0 /* statsModality */, 0 /* statsAction */, TEST_SENSOR_ID /* sensorId */, true /* shouldVibrate */, 0 /* statsModality */,
0 /* statsAction */,
0 /* statsClient */); 0 /* statsClient */);
} }

View File

@@ -359,7 +359,7 @@ public class BiometricSchedulerTest {
false /* restricted */, TAG, 1 /* cookie */, false /* requireConfirmation */, false /* restricted */, TAG, 1 /* cookie */, false /* requireConfirmation */,
TEST_SENSOR_ID, true /* isStrongBiometric */, 0 /* statsModality */, TEST_SENSOR_ID, true /* isStrongBiometric */, 0 /* statsModality */,
0 /* statsClient */, null /* taskStackListener */, mock(LockoutTracker.class), 0 /* statsClient */, null /* taskStackListener */, mock(LockoutTracker.class),
false /* isKeyguard */); false /* isKeyguard */, true /* shouldVibrate */);
} }
@Override @Override
@@ -382,7 +382,7 @@ public class BiometricSchedulerTest {
false /* restricted */, TAG, 1 /* cookie */, false /* requireConfirmation */, false /* restricted */, TAG, 1 /* cookie */, false /* requireConfirmation */,
TEST_SENSOR_ID, true /* isStrongBiometric */, 0 /* statsModality */, TEST_SENSOR_ID, true /* isStrongBiometric */, 0 /* statsModality */,
0 /* statsClient */, null /* taskStackListener */, mock(LockoutTracker.class), 0 /* statsClient */, null /* taskStackListener */, mock(LockoutTracker.class),
false /* isKeyguard */); false /* isKeyguard */, true /* shouldVibrate */);
} }
@Override @Override