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

Commit 065c3275 authored by Joe Bolinger's avatar Joe Bolinger
Browse files

Extract nested types from BaseClientMonitor.

This is mostly and ide refactored operation to rename the previously
nested classes for clarity, and it adds a couple basic tests.

Bug: 208303000
Test: atest CompositeCallbackTest BaseClientMonitorTest
Change-Id: Iccc7fb8f5285f8fbf716d18711f98ec2f6914537
parent 23c2c9ec
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.server.biometrics.log;
import android.annotation.NonNull;

import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallback;

/**
 * Client monitor callback that exposes a probe.
@@ -27,7 +28,7 @@ import com.android.server.biometrics.sensors.BaseClientMonitor;
 *
 * @param <T> probe type
 */
public class CallbackWithProbe<T extends Probe> implements BaseClientMonitor.Callback {
public class CallbackWithProbe<T extends Probe> implements ClientMonitorCallback {
    private final boolean mStartWithClient;
    private final T mProbe;

+1 −1
Original line number Diff line number Diff line
@@ -138,7 +138,7 @@ public abstract class AcquisitionClient<T> extends HalClientMonitor<T> implement
    }

    @Override
    public void cancelWithoutStarting(@NonNull Callback callback) {
    public void cancelWithoutStarting(@NonNull ClientMonitorCallback callback) {
        Slog.d(TAG, "cancelWithoutStarting: " + this);

        final int errorCode = BiometricConstants.BIOMETRIC_ERROR_CANCELED;
+2 −2
Original line number Diff line number Diff line
@@ -91,7 +91,7 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T>

    /**
     * Handles lifecycle, e.g. {@link BiometricScheduler},
     * {@link com.android.server.biometrics.sensors.BaseClientMonitor.Callback} after authentication
     * {@link ClientMonitorCallback} after authentication
     * results are known. Note that this happens asynchronously from (but shortly after)
     * {@link #onAuthenticated(BiometricAuthenticator.Identifier, boolean, ArrayList)} and allows
     * {@link CoexCoordinator} a chance to invoke/delay this event.
@@ -440,7 +440,7 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T>
     * Start authentication
     */
    @Override
    public void start(@NonNull Callback callback) {
    public void start(@NonNull ClientMonitorCallback callback) {
        super.start(callback);

        final @LockoutTracker.LockoutMode int lockoutMode =
+12 −75
Original line number Diff line number Diff line
@@ -29,8 +29,6 @@ import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.biometrics.log.BiometricLogger;

import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;

/**
@@ -46,63 +44,6 @@ public abstract class BaseClientMonitor implements IBinder.DeathRecipient {
    // Counter used to distinguish between ClientMonitor instances to help debugging.
    private static int sCount = 0;

    /**
     * Interface that ClientMonitor holders should use to receive callbacks.
     */
    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 BaseClientMonitor clientMonitor) {
        }

        /**
         * Invoked when the ClientMonitor operation is complete. This abstracts away asynchronous
         * (i.e. Authenticate, Enroll, Enumerate, Remove) and synchronous (i.e. generateChallenge,
         * revokeChallenge) so that a scheduler can process ClientMonitors regardless of their
         * implementation.
         *
         * @param clientMonitor Reference of the ClientMonitor that finished.
         * @param success True if the operation completed successfully.
         */
        default void onClientFinished(@NonNull BaseClientMonitor clientMonitor, boolean success) {
        }
    }

    /** Holder for wrapping multiple handlers into a single Callback. */
    public static class CompositeCallback implements Callback {
        @NonNull
        private final List<Callback> mCallbacks;

        public CompositeCallback(@NonNull Callback... callbacks) {
            mCallbacks = new ArrayList<>();

            for (Callback callback : callbacks) {
                if (callback != null) {
                    mCallbacks.add(callback);
                }
            }
        }

        @Override
        public final void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
            for (int i = 0; i < mCallbacks.size(); i++) {
                mCallbacks.get(i).onClientStarted(clientMonitor);
            }
        }

        @Override
        public final void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
                boolean success) {
            for (int i = mCallbacks.size() - 1; i >= 0; i--) {
                mCallbacks.get(i).onClientFinished(clientMonitor, success);
            }
        }
    }

    private final int mSequentialId;
    @NonNull private final Context mContext;
    private final int mTargetUserId;
@@ -120,7 +61,7 @@ public abstract class BaseClientMonitor implements IBinder.DeathRecipient {

    // Use an empty callback by default since delayed operations can receive events
    // before they are started and cause NPE in subclasses that access this field directly.
    @NonNull protected Callback mCallback = new Callback() {
    @NonNull protected ClientMonitorCallback mCallback = new ClientMonitorCallback() {
        @Override
        public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
            Slog.e(TAG, "mCallback onClientStarted: called before set (should not happen)");
@@ -133,18 +74,6 @@ public abstract class BaseClientMonitor implements IBinder.DeathRecipient {
        }
    };

    /**
     * @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
@@ -189,11 +118,19 @@ public abstract class BaseClientMonitor implements IBinder.DeathRecipient {
        }
    }

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

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

    /**
     * Starts the ClientMonitor's lifecycle.
     * @param callback invoked when the operation is complete (succeeds, fails, etc)
     */
    public void start(@NonNull Callback callback) {
    public void start(@NonNull ClientMonitorCallback callback) {
        mCallback = wrapCallbackForStart(callback);
        mCallback.onClientStarted(this);
    }
@@ -204,7 +141,7 @@ public abstract class BaseClientMonitor implements IBinder.DeathRecipient {
     * Returns the original callback unless overridden.
     */
    @NonNull
    protected Callback wrapCallbackForStart(@NonNull Callback callback) {
    protected ClientMonitorCallback wrapCallbackForStart(@NonNull ClientMonitorCallback callback) {
        return callback;
    }

@@ -329,7 +266,7 @@ public abstract class BaseClientMonitor implements IBinder.DeathRecipient {
    }

    @VisibleForTesting
    public Callback getCallback() {
    public ClientMonitorCallback getCallback() {
        return mCallback;
    }

+3 −3
Original line number Diff line number Diff line
@@ -160,7 +160,7 @@ public class BiometricScheduler {
    // 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 final BaseClientMonitor.Callback mInternalCallback = new BaseClientMonitor.Callback() {
    private final ClientMonitorCallback mInternalCallback = new ClientMonitorCallback() {
        @Override
        public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
            Slog.d(getTag(), "[Started] " + clientMonitor);
@@ -247,7 +247,7 @@ public class BiometricScheduler {
    }

    @VisibleForTesting
    public BaseClientMonitor.Callback getInternalCallback() {
    public ClientMonitorCallback getInternalCallback() {
        return mInternalCallback;
    }

@@ -368,7 +368,7 @@ public class BiometricScheduler {
     * @param clientCallback optional callback, invoked when the client state changes.
     */
    public void scheduleClientMonitor(@NonNull BaseClientMonitor clientMonitor,
            @Nullable BaseClientMonitor.Callback clientCallback) {
            @Nullable ClientMonitorCallback clientCallback) {
        // 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.
Loading