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

Commit 86943d14 authored by Kevin Chyn's avatar Kevin Chyn
Browse files

1/n: Slight changes to ClientMonitor's Callback

1) Rename ClientMonitor.FinishCallback to ClientMonitor.Callback
2) Adds onClientStarted to ClientMonitor.Callback

This will allow owners (e.g. Face10, Fingerprint21) where needed to
keep track of more operation lifecycle. For example, as part of the
resetLockout cleanup that is happening, Face10 (which only supports
a single in-flight challenge) will need to keep track if a challenge
is currently "open", and notify challenge owners if it is interrupted
by another generateChallenge/revokeChallenge from potentially a
different owner.

Bug: 145978626
Test: Builds

Change-Id: Ie51b4e367a07401c604d64a146e881053b7cc4a7
parent 5af3df5d
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -98,7 +98,7 @@ public abstract class AcquisitionClient<T> extends ClientMonitor<T> implements I
        }

        if (finish) {
            mFinishCallback.onClientFinished(this, false /* success */);
            mCallback.onClientFinished(this, false /* success */);
        }
    }

@@ -114,7 +114,7 @@ public abstract class AcquisitionClient<T> extends ClientMonitor<T> implements I
    }

    @Override
    public void cancelWithoutStarting(@NonNull FinishCallback finishCallback) {
    public void cancelWithoutStarting(@NonNull Callback callback) {
        final int errorCode = BiometricConstants.BIOMETRIC_ERROR_CANCELED;
        try {
            if (getListener() != null) {
@@ -123,7 +123,7 @@ public abstract class AcquisitionClient<T> extends ClientMonitor<T> implements I
        } catch (RemoteException e) {
            Slog.w(TAG, "Failed to invoke sendError", e);
        }
        finishCallback.onClientFinished(this, true /* success */);
        callback.onClientFinished(this, true /* success */);
    }

    /**
@@ -155,7 +155,7 @@ public abstract class AcquisitionClient<T> extends ClientMonitor<T> implements I
            }
        } catch (RemoteException e) {
            Slog.w(TAG, "Failed to invoke sendAcquired", e);
            mFinishCallback.onClientFinished(this, false /* success */);
            mCallback.onClientFinished(this, false /* success */);
        }
    }

+3 −3
Original line number Diff line number Diff line
@@ -191,7 +191,7 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T>
            }
        } catch (RemoteException e) {
            Slog.e(TAG, "Unable to notify listener, finishing", e);
            mFinishCallback.onClientFinished(this, false /* success */);
            mCallback.onClientFinished(this, false /* success */);
        }
    }

@@ -211,8 +211,8 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T>
     * Start authentication
     */
    @Override
    public void start(@NonNull FinishCallback finishCallback) {
        super.start(finishCallback);
    public void start(@NonNull Callback callback) {
        super.start(callback);

        final @LockoutTracker.LockoutMode int lockoutMode =
                mLockoutTracker.getLockoutModeForUser(getTargetUserId());
+23 −17
Original line number Diff line number Diff line
@@ -85,7 +85,7 @@ public class BiometricScheduler {
        static final int STATE_WAITING_FOR_COOKIE = 4;

        /**
         * The {@link ClientMonitor.FinishCallback} has been invoked and the client is finished.
         * The {@link ClientMonitor.Callback} has been invoked and the client is finished.
         */
        static final int STATE_FINISHED = 5;

@@ -99,13 +99,13 @@ public class BiometricScheduler {
        @interface OperationState {}

        @NonNull final ClientMonitor<?> clientMonitor;
        @Nullable final ClientMonitor.FinishCallback clientFinishCallback;
        @Nullable final ClientMonitor.Callback mClientCallback;
        @OperationState int state;

        Operation(@NonNull ClientMonitor<?> clientMonitor,
                @Nullable ClientMonitor.FinishCallback finishCallback) {
                @Nullable ClientMonitor.Callback callback) {
            this.clientMonitor = clientMonitor;
            this.clientFinishCallback = finishCallback;
            this.mClientCallback = callback;
            state = STATE_WAITING_IN_QUEUE;
        }

@@ -133,7 +133,7 @@ public class BiometricScheduler {
        public void run() {
            if (operation.state != Operation.STATE_FINISHED) {
                Slog.e(tag, "[Watchdog Triggered]: " + operation);
                operation.clientMonitor.mFinishCallback
                operation.clientMonitor.mCallback
                        .onClientFinished(operation.clientMonitor, false /* success */);
            }
        }
@@ -175,15 +175,15 @@ public class BiometricScheduler {
    @Nullable private final GestureAvailabilityDispatcher mGestureAvailabilityDispatcher;
    @NonNull private final IBiometricService mBiometricService;
    @NonNull private final Handler mHandler = new Handler(Looper.getMainLooper());
    @NonNull private final InternalFinishCallback mInternalFinishCallback;
    @NonNull protected final InternalCallback mInternalCallback;
    @NonNull private final Queue<Operation> mPendingOperations;
    @Nullable private Operation mCurrentOperation;
    @NonNull private final ArrayDeque<CrashState> mCrashStates;

    // Internal finish callback, notified when an operation is complete. Notifies the requester
    // Internal callback, notified when an operation is complete. Notifies the requester
    // that the operation is complete, before performing internal scheduler work (such as
    // starting the next client).
    private class InternalFinishCallback implements ClientMonitor.FinishCallback {
    public class InternalCallback implements ClientMonitor.Callback {
        @Override
        public void onClientFinished(ClientMonitor<?> clientMonitor, boolean success) {
            mHandler.post(() -> {
@@ -203,8 +203,8 @@ public class BiometricScheduler {
                Slog.d(getTag(), "[Finishing] " + clientMonitor + ", success: " + success);
                mCurrentOperation.state = Operation.STATE_FINISHED;

                if (mCurrentOperation.clientFinishCallback != null) {
                    mCurrentOperation.clientFinishCallback.onClientFinished(clientMonitor, success);
                if (mCurrentOperation.mClientCallback != null) {
                    mCurrentOperation.mClientCallback.onClientFinished(clientMonitor, success);
                }

                if (mGestureAvailabilityDispatcher != null) {
@@ -227,7 +227,7 @@ public class BiometricScheduler {
    public BiometricScheduler(@NonNull String tag,
            @Nullable GestureAvailabilityDispatcher gestureAvailabilityDispatcher) {
        mBiometricTag = tag;
        mInternalFinishCallback = new InternalFinishCallback();
        mInternalCallback = new InternalCallback();
        mGestureAvailabilityDispatcher = gestureAvailabilityDispatcher;
        mPendingOperations = new ArrayDeque<>();
        mBiometricService = IBiometricService.Stub.asInterface(
@@ -262,7 +262,7 @@ public class BiometricScheduler {
            }

            final Interruptable interruptable = (Interruptable) currentClient;
            interruptable.cancelWithoutStarting(mInternalFinishCallback);
            interruptable.cancelWithoutStarting(mInternalCallback);
            // Now we wait for the client to send its FinishCallback, which kicks off the next
            // operation.
            return;
@@ -280,7 +280,10 @@ public class BiometricScheduler {
        final boolean shouldStartNow = currentClient.getCookie() == 0;
        if (shouldStartNow) {
            Slog.d(getTag(), "[Starting] " + mCurrentOperation);
            currentClient.start(mInternalFinishCallback);
            if (mCurrentOperation.mClientCallback != null) {
                mCurrentOperation.mClientCallback.onClientStarted(currentClient);
            }
            currentClient.start(mInternalCallback);
            mCurrentOperation.state = Operation.STATE_STARTED;
        } else {
            try {
@@ -323,8 +326,11 @@ public class BiometricScheduler {
        }

        Slog.d(getTag(), "[Starting] Prepared client: " + mCurrentOperation);
        if (mCurrentOperation.mClientCallback != null) {
            mCurrentOperation.mClientCallback.onClientStarted(mCurrentOperation.clientMonitor);
        }
        mCurrentOperation.state = Operation.STATE_STARTED;
        mCurrentOperation.clientMonitor.start(mInternalFinishCallback);
        mCurrentOperation.clientMonitor.start(mInternalCallback);
    }

    /**
@@ -340,11 +346,11 @@ public class BiometricScheduler {
     * Adds a {@link ClientMonitor} to the pending queue
     *
     * @param clientMonitor        operation to be scheduled
     * @param clientFinishCallback optional callback, invoked when the client is finished, but
     * @param clientCallback optional callback, invoked when the client is finished, but
     *                             before it has been removed from the queue.
     */
    public void scheduleClientMonitor(@NonNull ClientMonitor<?> clientMonitor,
            @Nullable ClientMonitor.FinishCallback clientFinishCallback) {
            @Nullable ClientMonitor.Callback clientCallback) {
        // Mark any interruptable pending clients as canceling. Once they reach the head of the
        // queue, the scheduler will send ERROR_CANCELED and skip the operation.
        for (Operation operation : mPendingOperations) {
@@ -356,7 +362,7 @@ public class BiometricScheduler {
            }
        }

        mPendingOperations.add(new Operation(clientMonitor, clientFinishCallback));
        mPendingOperations.add(new Operation(clientMonitor, clientCallback));
        Slog.d(getTag(), "[Added] " + clientMonitor
                + ", new queue size: " + mPendingOperations.size());

+15 −7
Original line number Diff line number Diff line
@@ -42,7 +42,15 @@ public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinde
    /**
     * Interface that ClientMonitor holders should use to receive callbacks.
     */
    public interface FinishCallback {
    public interface Callback {
        /**
         * Invoked when the ClientMonitor operation has been started (e.g. reached the head of
         * the queue and becomes the current operation).
         *
         * @param clientMonitor Reference of the ClientMonitor that is starting.
         */
        default void onClientStarted(@NonNull ClientMonitor<?> clientMonitor) {}

        /**
         * Invoked when the ClientMonitor operation is complete. This abstracts away asynchronous
         * (i.e. Authenticate, Enroll, Enumerate, Remove) and synchronous (i.e. generateChallenge,
@@ -52,7 +60,7 @@ public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinde
         * @param clientMonitor Reference of the ClientMonitor that finished.
         * @param success True if the operation completed successfully.
         */
        void onClientFinished(ClientMonitor<?> clientMonitor, boolean success);
        default void onClientFinished(@NonNull ClientMonitor<?> clientMonitor, boolean success) {}
    }

    /**
@@ -79,7 +87,7 @@ public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinde
    private final int mCookie;
    boolean mAlreadyDone;

    @NonNull protected FinishCallback mFinishCallback;
    @NonNull protected Callback mCallback;

    /**
     * @param context    system_server context
@@ -125,17 +133,17 @@ 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(FinishCallback)}.
     * {@link #start(Callback)}.
     */
    public abstract void unableToStart();

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

    /**
+4 −4
Original line number Diff line number Diff line
@@ -77,18 +77,18 @@ public abstract class EnrollClient<T> extends AcquisitionClient<T> {
            mBiometricUtils.addBiometricForUser(getContext(), getTargetUserId(), identifier);
            logOnEnrolled(getTargetUserId(), System.currentTimeMillis() - mEnrollmentStartTimeMs,
                    true /* enrollSuccessful */);
            mFinishCallback.onClientFinished(this, true /* success */);
            mCallback.onClientFinished(this, true /* success */);
        }
        notifyUserActivity();
    }

    @Override
    public void start(@NonNull FinishCallback finishCallback) {
        super.start(finishCallback);
    public void start(@NonNull Callback callback) {
        super.start(callback);

        if (hasReachedEnrollmentLimit()) {
            Slog.e(TAG, "Reached enrollment limit");
            finishCallback.onClientFinished(this, false /* success */);
            callback.onClientFinished(this, false /* success */);
            return;
        }

Loading