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

Commit 1a8ab724 authored by Kevin Chyn's avatar Kevin Chyn
Browse files

24/n: Use lazy retrieval for HAL

Instead of passing it in through ClientMonitor#start, which causes
whatever is scheduling the ClientMonitors to require knowledge of
the HAL type, make it a parameter in the constructor that allows for
lazy retrieval.

1) Reminder that we should always retrieve a fresh pointer to the
   HAL, in case it crashed previously, or is stale, or was never
   loaded, etc. This functionality is preserved
2) As mentioned above, this allows the scheduler to remain agnostic
   of HAL type

Bug: 157790417

Test: Enroll, auth for fingerprint/face devices
Change-Id: Ib61cfecec17dc2b33937e089bdb9777f50e7a836
parent 71520ed2
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -47,12 +47,12 @@ public abstract class AcquisitionClient<T> extends ClientMonitor<T>
    private final VibrationEffect mSuccessVibrationEffect;
    private final VibrationEffect mErrorVibrationEffect;

    AcquisitionClient(@NonNull Context context, @NonNull IBinder token,
            @NonNull ClientMonitorCallbackConverter listener, int userId,
    AcquisitionClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon,
            @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId,
            @NonNull String owner, int cookie, int sensorId, int statsModality,
            int statsAction, int statsClient) {
        super(context, token, listener, userId, owner, cookie, sensorId, statsModality, statsAction,
                statsClient);
        super(context, lazyDaemon, token, listener, userId, owner, cookie, sensorId, statsModality,
                statsAction, statsClient);
        mPowerManager = context.getSystemService(PowerManager.class);
        mSuccessVibrationEffect = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
        mErrorVibrationEffect = VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK);
+9 −8
Original line number Diff line number Diff line
@@ -52,12 +52,13 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T> {

    protected boolean mAuthAttempted;

    public AuthenticationClient(@NonNull Context context, @NonNull IBinder token,
            @NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId,
            boolean restricted, @NonNull String owner, int cookie, boolean requireConfirmation,
            int sensorId, boolean isStrongBiometric, int statsModality, int statsClient,
            @NonNull TaskStackListener taskStackListener, @NonNull LockoutTracker lockoutTracker) {
        super(context, token, listener, targetUserId, owner, cookie, sensorId,
    public AuthenticationClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon,
            @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener,
            int targetUserId, long operationId, boolean restricted, @NonNull String owner,
            int cookie, boolean requireConfirmation, int sensorId, boolean isStrongBiometric,
            int statsModality, int statsClient, @NonNull TaskStackListener taskStackListener,
            @NonNull LockoutTracker lockoutTracker) {
        super(context, lazyDaemon, token, listener, targetUserId, owner, cookie, sensorId,
                statsModality, BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient);
        mIsStrongBiometric = isStrongBiometric;
        mOperationId = operationId;
@@ -187,8 +188,8 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T> {
     * Start authentication
     */
    @Override
    public void start(@NonNull T daemon, @NonNull FinishCallback finishCallback) {
        super.start(daemon, finishCallback);
    public void start(@NonNull FinishCallback finishCallback) {
        super.start(finishCallback);

        final @LockoutTracker.LockoutMode int lockoutMode =
                mLockoutTracker.getLockoutModeForUser(getTargetUserId());
+2 −2
Original line number Diff line number Diff line
@@ -736,7 +736,7 @@ public abstract class BiometricServiceBase<T> extends SystemService
            return;
        }

        final T daemon = getDaemon();
        final T daemon = mCurrentClient.getFreshDaemon();
        if (daemon == null) {
            Slog.e(getTag(), "Daemon null, unable to start: "
                    + mCurrentClient.getClass().getSimpleName());
@@ -745,7 +745,7 @@ public abstract class BiometricServiceBase<T> extends SystemService
            return;
        }

        mCurrentClient.start(daemon, mClientFinishCallback);
        mCurrentClient.start(mClientFinishCallback);
        notifyClientActiveCallbacks(true);
    }

+22 −8
Original line number Diff line number Diff line
@@ -51,7 +51,18 @@ public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinde
        void onClientFinished(ClientMonitor clientMonitor);
    }

    /**
     * Interface that allows ClientMonitor subclasses to retrieve a fresh instance to the HAL.
     */
    public interface LazyDaemon<T> {
        /**
         * @return A fresh instance to the biometric HAL
         */
        T getDaemon();
    }

    @NonNull private final Context mContext;
    @NonNull protected final LazyDaemon<T> mLazyDaemon;
    private final int mTargetUserId;
    @NonNull private final String mOwner;
    private final int mSensorId; // sensorId as configured by the framework
@@ -63,11 +74,11 @@ public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinde
    private final int mCookie;
    boolean mAlreadyDone;

    @NonNull protected T mDaemon;
    @NonNull protected FinishCallback mFinishCallback;

    /**
     * @param context    system_server context
     * @param lazyDaemon pointer for lazy retrieval of the HAL
     * @param token      a unique token for the client
     * @param listener   recipient of related events (e.g. authentication)
     * @param userId     target user id for operation
@@ -78,12 +89,13 @@ public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinde
     * @param statsAction   One of {@link BiometricsProtoEnums} ACTION_* constants
     * @param statsClient   One of {@link BiometricsProtoEnums} CLIENT_* constants
     */
    public ClientMonitor(@NonNull Context context, @Nullable IBinder token,
            @Nullable ClientMonitorCallbackConverter listener, int userId, @NonNull String owner,
            int cookie, int sensorId, int statsModality, int statsAction,
    public ClientMonitor(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon,
            @Nullable IBinder token, @Nullable ClientMonitorCallbackConverter listener, int userId,
            @NonNull String owner, int cookie, int sensorId, int statsModality, int statsAction,
            int statsClient) {
        super(statsModality, statsAction, statsClient);
        mContext = context;
        mLazyDaemon = lazyDaemon;
        mToken = token;
        mListener = listener;
        mTargetUserId = userId;
@@ -107,18 +119,16 @@ public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinde
    /**
     * Invoked if the scheduler is unable to start the ClientMonitor (for example the HAL is null).
     * If such a problem is detected, the scheduler will not invoke
     * {@link #start(Object, FinishCallback)}.
     * {@link #start(FinishCallback)}.
     */
    public abstract void unableToStart();

    /**
     * Starts the ClientMonitor's lifecycle. Invokes {@link #startHalOperation()} when internal book
     * keeping is complete.
     * @param daemon reference to the HAL
     * @param finishCallback invoked when the operation is complete (succeeds, fails, etc)
     */
    public void start(@NonNull T daemon, @NonNull FinishCallback finishCallback) {
        mDaemon = daemon;
    public void start(@NonNull FinishCallback finishCallback) {
        mFinishCallback = finishCallback;
    }

@@ -190,4 +200,8 @@ public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinde
    public final int getSensorId() {
        return mSensorId;
    }

    public final T getFreshDaemon() {
        return mLazyDaemon.getDaemon();
    }
}
+7 −6
Original line number Diff line number Diff line
@@ -41,13 +41,14 @@ public abstract class EnrollClient<T> extends AcquisitionClient<T> {
    private long mEnrollmentStartTimeMs;
    private boolean mAlreadyCancelled;

    public EnrollClient(@NonNull Context context, @NonNull IBinder token,
            @NonNull ClientMonitorCallbackConverter listener, int userId,
    public EnrollClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon,
            @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId,
            @NonNull byte[] hardwareAuthToken, @NonNull String owner, @NonNull BiometricUtils utils,
            int timeoutSec, int statsModality, int sensorId,
            boolean shouldVibrate) {
        super(context, token, listener, userId, owner, 0 /* cookie */, sensorId, statsModality,
                BiometricsProtoEnums.ACTION_ENROLL, BiometricsProtoEnums.CLIENT_UNKNOWN);
        super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
                statsModality, BiometricsProtoEnums.ACTION_ENROLL,
                BiometricsProtoEnums.CLIENT_UNKNOWN);
        mBiometricUtils = utils;
        mHardwareAuthToken = Arrays.copyOf(hardwareAuthToken, hardwareAuthToken.length);
        mTimeoutSec = timeoutSec;
@@ -87,8 +88,8 @@ public abstract class EnrollClient<T> extends AcquisitionClient<T> {
    }

    @Override
    public void start(@NonNull T daemon, @NonNull FinishCallback finishCallback) {
        super.start(daemon, finishCallback);
    public void start(@NonNull FinishCallback finishCallback) {
        super.start(finishCallback);

        mEnrollmentStartTimeMs = System.currentTimeMillis();
        startHalOperation();
Loading