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

Commit c922b4c9 authored by Kevin Chyn's avatar Kevin Chyn
Browse files

Add BaseClientMonitor#interruptsPrecedingClients

Only a select few operations (such as auth or enroll related stuff)
should interrupt preceeding clients. Book-keeping operations (such
as generateChallenge, invalidation, etc) generally should not interrupt
preceding clients.

Fixes bug in existing test case, and adds new testcases for the newly
added functionality.

Fixes: 179646305
Test: atest CtsBiometricsTestCases
Test: atest com.android.server.biometrics

Change-Id: Ie51b121ba5f0cf3f51477c12807a8be4c80c7c61
parent 3919f6d2
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -311,4 +311,9 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T>
    public int getProtoEnum() {
        return BiometricsProto.CM_AUTHENTICATE;
    }

    @Override
    public boolean interruptsPrecedingClients() {
        return true;
    }
}
+8 −2
Original line number Diff line number Diff line
@@ -82,11 +82,17 @@ public abstract class BaseClientMonitor extends LoggableMonitor
    @NonNull protected Callback mCallback;

    /**
     * Returns a ClientMonitorEnum constant defined in biometrics.proto
     * @return
     * @return A ClientMonitorEnum constant defined in biometrics.proto
     */
    public abstract int getProtoEnum();

    /**
     * @return True if the ClientMonitor should cancel any current and pending interruptable clients
     */
    public boolean interruptsPrecedingClients() {
        return false;
    }

    /**
     * @param context    system_server context
     * @param token      a unique token for the client
+16 −10
Original line number Diff line number Diff line
@@ -475,8 +475,10 @@ public class BiometricScheduler {
     */
    public void scheduleClientMonitor(@NonNull BaseClientMonitor clientMonitor,
            @Nullable BaseClientMonitor.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.
        // If the incoming operation should interrupt preceding clients, 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.
        if (clientMonitor.interruptsPrecedingClients()) {
            for (Operation operation : mPendingOperations) {
                if (operation.mClientMonitor instanceof Interruptable
                        && operation.mState != Operation.STATE_WAITING_IN_QUEUE_CANCELING) {
@@ -485,13 +487,17 @@ public class BiometricScheduler {
                    operation.mState = Operation.STATE_WAITING_IN_QUEUE_CANCELING;
                }
            }
        }

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

        // If the current operation is cancellable, start the cancellation process.
        if (mCurrentOperation != null && mCurrentOperation.mClientMonitor instanceof Interruptable
        // If the new operation should interrupt preceding clients, and if the current operation is
        // cancellable, start the cancellation process.
        if (clientMonitor.interruptsPrecedingClients()
                && mCurrentOperation != null
                && mCurrentOperation.mClientMonitor instanceof Interruptable
                && mCurrentOperation.mState == Operation.STATE_STARTED) {
            Slog.d(getTag(), "[Cancelling Interruptable]: " + mCurrentOperation);
            cancelInternal(mCurrentOperation);
+5 −0
Original line number Diff line number Diff line
@@ -113,4 +113,9 @@ public abstract class EnrollClient<T> extends AcquisitionClient<T> {
    public int getProtoEnum() {
        return BiometricsProto.CM_ENROLL;
    }

    @Override
    public boolean interruptsPrecedingClients() {
        return true;
    }
}
+5 −0
Original line number Diff line number Diff line
@@ -98,4 +98,9 @@ class FingerprintDetectClient extends AcquisitionClient<ISession> {
    public int getProtoEnum() {
        return BiometricsProto.CM_DETECT_INTERACTION;
    }

    @Override
    public boolean interruptsPrecedingClients() {
        return true;
    }
}
Loading