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

Commit da610367 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Use UDFPS overlay for UDFPS enrollment and authentication"

parents 734312d4 1682b8f6
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);
        }
    }