Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8cb64d15 authored by Kevin Chyn's avatar Kevin Chyn
Browse files

Move UDFPS enroll haptics to SystemUI

For the last enrollment step, we provide an additional haptic that
occurs when a good image is acquired.

Bug: 187460696
Test: manual
Change-Id: Icdae01b9c8b5f070e1ee35a705910ec8de3b1c0f
parent eb0e2f28
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -21,8 +21,11 @@ import android.annotation.Nullable;
import android.content.Context;
import android.graphics.PointF;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.media.AudioAttributes;
import android.os.Build;
import android.os.UserHandle;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.provider.Settings;
import android.util.Log;
import android.util.TypedValue;
@@ -47,6 +50,12 @@ public class UdfpsEnrollHelper {
    // Enroll with two center touches before going to guided enrollment
    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 {
        void onEnrollmentProgress(int remaining, int totalSteps);
        void onLastStepAcquired();
@@ -57,6 +66,9 @@ public class UdfpsEnrollHelper {
    private final int mEnrollReason;
    private final boolean mAccessibilityEnabled;
    @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 mRemainingSteps = -1;
@@ -70,6 +82,7 @@ public class UdfpsEnrollHelper {
    public UdfpsEnrollHelper(@NonNull Context context, int reason) {
        mContext = context;
        mEnrollReason = reason;
        mVibrator = context.getSystemService(Vibrator.class);

        final AccessibilityManager am = context.getSystemService(AccessibilityManager.class);
        mAccessibilityEnabled = am.isEnabled();
@@ -128,6 +141,7 @@ public class UdfpsEnrollHelper {

        if (remaining != mRemainingSteps) {
            mLocationsEnrolled++;
            vibrateSuccess();
        }

        mRemainingSteps = remaining;
@@ -188,6 +202,11 @@ public class UdfpsEnrollHelper {

        if (mRemainingSteps <= 2 && mRemainingSteps >= 0) {
            mListener.onLastStepAcquired();
            vibrateSuccess();
        }
    }

    private void vibrateSuccess() {
        mVibrator.vibrate(mEffectClick, VIBRATION_SONFICATION_ATTRIBUTES);
    }
}
+8 −2
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.hardware.biometrics.common.ICancellationSignal;
import android.hardware.biometrics.fingerprint.ISession;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.IBinder;
@@ -46,6 +47,7 @@ class FingerprintEnrollClient extends EnrollClient<ISession> implements Udfps {

    private static final String TAG = "FingerprintEnrollClient";

    @NonNull private final FingerprintSensorPropertiesInternal mSensorProps;
    @Nullable private final IUdfpsOverlayController mUdfpsOverlayController;
    @Nullable private final ISidefpsController mSidefpsController;

@@ -58,12 +60,15 @@ class FingerprintEnrollClient extends EnrollClient<ISession> implements Udfps {
            @NonNull ClientMonitorCallbackConverter listener, int userId,
            @NonNull byte[] hardwareAuthToken, @NonNull String owner,
            @NonNull BiometricUtils<Fingerprint> utils, int sensorId,
            @NonNull FingerprintSensorPropertiesInternal sensorProps,
            @Nullable IUdfpsOverlayController udfpsOvelayController,
            @Nullable ISidefpsController sidefpsController,
            int maxTemplatesPerUser, @FingerprintManager.EnrollReason int enrollReason) {
        // UDFPS enroll vibrations are handled in SystemUI
        super(context, lazyDaemon, token, listener, userId, hardwareAuthToken, owner, utils,
                0 /* timeoutSec */, BiometricsProtoEnums.MODALITY_FINGERPRINT, sensorId,
                true /* shouldVibrate */);
                !sensorProps.isAnyUdfpsType() /* shouldVibrate */);
        mSensorProps = sensorProps;
        mUdfpsOverlayController = udfpsOvelayController;
        mSidefpsController = sidefpsController;
        mMaxTemplatesPerUser = maxTemplatesPerUser;
@@ -90,7 +95,8 @@ class FingerprintEnrollClient extends EnrollClient<ISession> implements Udfps {
    public void onAcquired(@FingerprintAcquired int acquiredInfo, int vendorCode) {
        // For UDFPS, notify SysUI that the illumination can be turned off.
        // 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);
        }

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