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

Commit 1682b8f6 authored by Ilya Matyukhin's avatar Ilya Matyukhin
Browse files

Use UDFPS overlay for UDFPS enrollment and authentication

Bug: 158135499
Test: build
Change-Id: If18a1943d713703107b79b0d83ee362a61f20a0b
parent 70eef402
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -117,12 +117,6 @@ interface IFingerprintService {
    // Returns whether the specified sensor is an under-display fingerprint sensor (UDFPS).
    boolean isUdfps(int sensorId);

    // Shows the UDFPS overlay.
    void showUdfpsOverlay();

    // Hides the UDFPS overlay.
    void hideUdfpsOverlay();

    // Sets the controller for managing the UDFPS overlay.
    void setUdfpsOverlayController(in IUdfpsOverlayController controller);
}
+8 −2
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
import android.hardware.biometrics.fingerprint.V2_2.IBiometricsFingerprintClientCallback;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.Handler;
import android.os.IBinder;
import android.os.IHwBinder;
@@ -93,6 +94,7 @@ class Fingerprint21 implements IHwBinder.DeathRecipient {
    private final Map<Integer, Long> mAuthenticatorIds;

    private IBiometricsFingerprint mDaemon;
    @Nullable private IUdfpsOverlayController mUdfpsOverlayController;
    private int mCurrentUserId = UserHandle.USER_NULL;

    /**
@@ -464,7 +466,7 @@ class Fingerprint21 implements IHwBinder.DeathRecipient {
            final FingerprintEnrollClient client = new FingerprintEnrollClient(mContext,
                    mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), userId,
                    hardwareAuthToken, opPackageName, FingerprintUtils.getInstance(),
                    ENROLL_TIMEOUT_SEC, mSensorProperties.sensorId);
                    ENROLL_TIMEOUT_SEC, mSensorProperties.sensorId, mUdfpsOverlayController);
            mScheduler.scheduleClientMonitor(client);
        });

@@ -487,7 +489,7 @@ class Fingerprint21 implements IHwBinder.DeathRecipient {
                    mContext, mLazyDaemon, token, listener, userId, operationId, restricted,
                    opPackageName, cookie, false /* requireConfirmation */,
                    mSensorProperties.sensorId, isStrongBiometric, surface, statsClient,
                    mTaskStackListener, mLockoutTracker);
                    mTaskStackListener, mLockoutTracker, mUdfpsOverlayController);
            mScheduler.scheduleClientMonitor(client);
        });
    }
@@ -573,6 +575,10 @@ class Fingerprint21 implements IHwBinder.DeathRecipient {
        return mSensorProperties.isUdfps;
    }

    void setUdfpsOverlayController(IUdfpsOverlayController controller) {
        mUdfpsOverlayController = controller;
    }

    void dumpProto(FileDescriptor fd) {
        PerformanceTracker tracker =
                PerformanceTracker.getInstanceForSensorId(mSensorProperties.sensorId);
+30 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricFingerprintConstants;
import android.hardware.biometrics.BiometricsProtoEnums;
import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
@@ -47,6 +48,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient<IBiometricsFi
    private static final String TAG = "Biometrics/FingerprintAuthClient";

    private final LockoutFrameworkImpl mLockoutFrameworkImpl;
    @Nullable private final IUdfpsOverlayController mUdfpsOverlayController;

    FingerprintAuthenticationClient(@NonNull Context context,
            @NonNull LazyDaemon<IBiometricsFingerprint> lazyDaemon, @NonNull IBinder token,
@@ -54,12 +56,34 @@ class FingerprintAuthenticationClient extends AuthenticationClient<IBiometricsFi
            boolean restricted, @NonNull String owner, int cookie, boolean requireConfirmation,
            int sensorId, boolean isStrongBiometric, @Nullable Surface surface, int statsClient,
            @NonNull TaskStackListener taskStackListener,
            @NonNull LockoutFrameworkImpl lockoutTracker) {
            @NonNull LockoutFrameworkImpl lockoutTracker,
            @Nullable IUdfpsOverlayController udfpsOverlayController) {
        super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted,
                owner, cookie, requireConfirmation, sensorId, isStrongBiometric,
                BiometricsProtoEnums.MODALITY_FINGERPRINT, statsClient, taskStackListener,
                lockoutTracker);
        mLockoutFrameworkImpl = lockoutTracker;
        mUdfpsOverlayController = udfpsOverlayController;
    }

    private void showUdfpsOverlay() {
        if (mUdfpsOverlayController != null) {
            try {
                mUdfpsOverlayController.showUdfpsOverlay();
            } catch (RemoteException e) {
                Slog.e(TAG, "Remote exception when showing the UDFPS overlay", e);
            }
        }
    }

    private void hideUdfpsOverlay() {
        if (mUdfpsOverlayController != null) {
            try {
                mUdfpsOverlayController.hideUdfpsOverlay();
            } catch (RemoteException e) {
                Slog.e(TAG, "Remote exception when hiding the UDFPS overlay", e);
            }
        }
    }

    @Override
@@ -74,6 +98,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient<IBiometricsFi

        if (authenticated) {
            resetFailedAttempts(getTargetUserId());
            hideUdfpsOverlay();
            mFinishCallback.onClientFinished(this, true /* success */);
        } else {
            final @LockoutTracker.LockoutMode int lockoutMode =
@@ -86,6 +111,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient<IBiometricsFi
                // Send the error, but do not invoke the FinishCallback yet. Since lockout is not
                // controlled by the HAL, the framework must stop the sensor before finishing the
                // client.
                hideUdfpsOverlay();
                onErrorInternal(errorCode, 0 /* vendorCode */, false /* finish */);
                cancel();
            }
@@ -104,6 +130,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient<IBiometricsFi

    @Override
    protected void startHalOperation() {
        showUdfpsOverlay();
        try {
            // GroupId was never used. In fact, groupId is always the same as userId.
            getFreshDaemon().authenticate(mOperationId, getTargetUserId());
@@ -111,12 +138,14 @@ class FingerprintAuthenticationClient extends AuthenticationClient<IBiometricsFi
            Slog.e(TAG, "Remote exception when requesting auth", e);
            onError(BiometricFingerprintConstants.FINGERPRINT_ERROR_HW_UNAVAILABLE,
                    0 /* vendorCode */);
            hideUdfpsOverlay();
            mFinishCallback.onClientFinished(this, false /* success */);
        }
    }

    @Override
    protected void stopHalOperation() {
        hideUdfpsOverlay();
        try {
            getFreshDaemon().cancel();
        } catch (RemoteException e) {
+30 −1
Original line number Diff line number Diff line
@@ -17,10 +17,12 @@
package com.android.server.biometrics.sensors.fingerprint;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.hardware.biometrics.BiometricFingerprintConstants;
import android.hardware.biometrics.BiometricsProtoEnums;
import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
@@ -39,18 +41,43 @@ public class FingerprintEnrollClient extends EnrollClient<IBiometricsFingerprint

    private static final String TAG = "FingerprintEnrollClient";

    @Nullable private final IUdfpsOverlayController mUdfpsOverlayController;

    FingerprintEnrollClient(@NonNull Context context,
            @NonNull LazyDaemon<IBiometricsFingerprint> lazyDaemon, @NonNull IBinder token,
            @NonNull ClientMonitorCallbackConverter listener, int userId,
            @NonNull byte[] hardwareAuthToken, @NonNull String owner, @NonNull BiometricUtils utils,
            int timeoutSec, int sensorId) {
            int timeoutSec, int sensorId,
            @Nullable IUdfpsOverlayController udfpsOverlayController) {
        super(context, lazyDaemon, token, listener, userId, hardwareAuthToken, owner, utils,
                timeoutSec, BiometricsProtoEnums.MODALITY_FINGERPRINT, sensorId,
                true /* shouldVibrate */);
        mUdfpsOverlayController = udfpsOverlayController;
    }

    private void showUdfpsOverlay() {
        if (mUdfpsOverlayController != null) {
            try {
                mUdfpsOverlayController.showUdfpsOverlay();
            } catch (RemoteException e) {
                Slog.e(TAG, "Remote exception when showing the UDFPS overlay", e);
            }
        }
    }

    private void hideUdfpsOverlay() {
        if (mUdfpsOverlayController != null) {
            try {
                mUdfpsOverlayController.hideUdfpsOverlay();
            } catch (RemoteException e) {
                Slog.e(TAG, "Remote exception when hiding the UDFPS overlay", e);
            }
        }
    }

    @Override
    protected void startHalOperation() {
        showUdfpsOverlay();
        try {
            // GroupId was never used. In fact, groupId is always the same as userId.
            getFreshDaemon().enroll(mHardwareAuthToken, getTargetUserId(), mTimeoutSec);
@@ -58,12 +85,14 @@ public class FingerprintEnrollClient extends EnrollClient<IBiometricsFingerprint
            Slog.e(TAG, "Remote exception when requesting enroll", e);
            onError(BiometricFingerprintConstants.FINGERPRINT_ERROR_HW_UNAVAILABLE,
                    0 /* vendorCode */);
            hideUdfpsOverlay();
            mFinishCallback.onClientFinished(this, false /* success */);
        }
    }

    @Override
    protected void stopHalOperation() {
        hideUdfpsOverlay();
        try {
            getFreshDaemon().cancel();
        } catch (RemoteException e) {
+1 −30
Original line number Diff line number Diff line
@@ -71,7 +71,6 @@ public class FingerprintService extends SystemService {
    private final LockoutResetTracker mLockoutResetTracker;
    private final GestureAvailabilityTracker mGestureAvailabilityTracker;
    private Fingerprint21 mFingerprint21;
    private IUdfpsOverlayController mUdfpsOverlayController;

    /**
     * Receives the incoming binder calls from FingerprintManager.
@@ -318,38 +317,10 @@ public class FingerprintService extends SystemService {
            return mFingerprint21.isUdfps();
        }

        @Override
        public void showUdfpsOverlay() {
            Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL);
            if (mUdfpsOverlayController == null) {
                Slog.e(TAG, "showUdfpsOverlay | mUdfpsOverlayController is null");
                return;
            }
            try {
                mUdfpsOverlayController.showUdfpsOverlay();
            } catch (RemoteException e) {
                Slog.e(TAG, "showUdfpsOverlay | RemoteException: ", e);
            }
        }

        @Override
        public void hideUdfpsOverlay() {
            Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL);
            if (mUdfpsOverlayController == null) {
                Slog.e(TAG, "hideUdfpsOverlay | mUdfpsOverlayController is null");
                return;
            }
            try {
                mUdfpsOverlayController.hideUdfpsOverlay();
            } catch (RemoteException e) {
                Slog.e(TAG, "hideUdfpsOverlay | RemoteException: ", e);
            }
        }

        @Override
        public void setUdfpsOverlayController(IUdfpsOverlayController controller) {
            Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL);
            mUdfpsOverlayController = controller;
            mFingerprint21.setUdfpsOverlayController(controller);
        }
    }