Merge "Move UDFPS enroll haptics to SystemUI" into sc-dev

This commit is contained in:
Kevin Chyn
2021-06-08 04:02:22 +00:00
committed by Android (Google) Code Review
3 changed files with 28 additions and 2 deletions

View File

@@ -21,8 +21,11 @@ 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;
@@ -47,6 +50,12 @@ 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();
@@ -57,6 +66,9 @@ 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;
@@ -70,6 +82,7 @@ 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();
@@ -128,6 +141,7 @@ public class UdfpsEnrollHelper {
if (remaining != mRemainingSteps) { if (remaining != mRemainingSteps) {
mLocationsEnrolled++; mLocationsEnrolled++;
vibrateSuccess();
} }
mRemainingSteps = remaining; mRemainingSteps = remaining;
@@ -188,6 +202,11 @@ 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

@@ -27,6 +27,7 @@ import android.hardware.biometrics.common.ICancellationSignal;
import android.hardware.biometrics.fingerprint.ISession; import android.hardware.biometrics.fingerprint.ISession;
import android.hardware.fingerprint.Fingerprint; import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.ISidefpsController; import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.IUdfpsOverlayController; import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.IBinder; import android.os.IBinder;
@@ -46,6 +47,7 @@ class FingerprintEnrollClient extends EnrollClient<ISession> implements Udfps {
private static final String TAG = "FingerprintEnrollClient"; private static final String TAG = "FingerprintEnrollClient";
@NonNull private final FingerprintSensorPropertiesInternal mSensorProps;
@Nullable private final IUdfpsOverlayController mUdfpsOverlayController; @Nullable private final IUdfpsOverlayController mUdfpsOverlayController;
@Nullable private final ISidefpsController mSidefpsController; @Nullable private final ISidefpsController mSidefpsController;
@@ -58,12 +60,15 @@ class FingerprintEnrollClient extends EnrollClient<ISession> implements Udfps {
@NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull ClientMonitorCallbackConverter listener, int userId,
@NonNull byte[] hardwareAuthToken, @NonNull String owner, @NonNull byte[] hardwareAuthToken, @NonNull String owner,
@NonNull BiometricUtils<Fingerprint> utils, int sensorId, @NonNull BiometricUtils<Fingerprint> utils, int sensorId,
@NonNull FingerprintSensorPropertiesInternal sensorProps,
@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
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,
true /* shouldVibrate */); !sensorProps.isAnyUdfpsType() /* shouldVibrate */);
mSensorProps = sensorProps;
mUdfpsOverlayController = udfpsOvelayController; mUdfpsOverlayController = udfpsOvelayController;
mSidefpsController = sidefpsController; mSidefpsController = sidefpsController;
mMaxTemplatesPerUser = maxTemplatesPerUser; mMaxTemplatesPerUser = maxTemplatesPerUser;
@@ -90,7 +95,8 @@ class FingerprintEnrollClient extends EnrollClient<ISession> implements Udfps {
public void onAcquired(@FingerprintAcquired int acquiredInfo, int vendorCode) { public void onAcquired(@FingerprintAcquired int acquiredInfo, int vendorCode) {
// For UDFPS, notify SysUI that the illumination can be turned off. // For UDFPS, notify SysUI that the illumination can be turned off.
// 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()) {
UdfpsHelper.onAcquiredGood(getSensorId(), mUdfpsOverlayController); UdfpsHelper.onAcquiredGood(getSensorId(), mUdfpsOverlayController);
} }

View File

@@ -340,6 +340,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
mSensors.get(sensorId).getLazySession(), token, mSensors.get(sensorId).getLazySession(), token,
new ClientMonitorCallbackConverter(receiver), userId, hardwareAuthToken, new ClientMonitorCallbackConverter(receiver), userId, hardwareAuthToken,
opPackageName, FingerprintUtils.getInstance(sensorId), sensorId, opPackageName, FingerprintUtils.getInstance(sensorId), sensorId,
mSensors.get(sensorId).getSensorProperties(),
mUdfpsOverlayController, mSidefpsController, maxTemplatesPerUser, enrollReason); mUdfpsOverlayController, mSidefpsController, maxTemplatesPerUser, enrollReason);
scheduleForSensor(sensorId, client, new BaseClientMonitor.Callback() { scheduleForSensor(sensorId, client, new BaseClientMonitor.Callback() {