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
This commit is contained in:
Joe Bolinger
2022-01-20 18:42:46 -08:00
parent 23c2c9ec8b
commit 065c327593
66 changed files with 471 additions and 235 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 =

View File

@@ -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;
}

View File

@@ -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.

View File

@@ -65,7 +65,7 @@ public class BiometricSchedulerOperation {
protected static final int STATE_WAITING_FOR_COOKIE = 4;
/**
* The {@link BaseClientMonitor.Callback} has been invoked and the client is finished.
* The {@link ClientMonitorCallback} has been invoked and the client is finished.
*/
protected static final int STATE_FINISHED = 5;
@@ -83,7 +83,7 @@ public class BiometricSchedulerOperation {
@NonNull
private final BaseClientMonitor mClientMonitor;
@Nullable
private final BaseClientMonitor.Callback mClientCallback;
private final ClientMonitorCallback mClientCallback;
@OperationState
private int mState;
@VisibleForTesting
@@ -92,14 +92,14 @@ public class BiometricSchedulerOperation {
BiometricSchedulerOperation(
@NonNull BaseClientMonitor clientMonitor,
@Nullable BaseClientMonitor.Callback callback
@Nullable ClientMonitorCallback callback
) {
this(clientMonitor, callback, STATE_WAITING_IN_QUEUE);
}
protected BiometricSchedulerOperation(
@NonNull BaseClientMonitor clientMonitor,
@Nullable BaseClientMonitor.Callback callback,
@Nullable ClientMonitorCallback callback,
@OperationState int state
) {
mClientMonitor = clientMonitor;
@@ -139,7 +139,7 @@ public class BiometricSchedulerOperation {
* @param callback lifecycle callback
* @return if this operation started
*/
public boolean start(@NonNull BaseClientMonitor.Callback callback) {
public boolean start(@NonNull ClientMonitorCallback callback) {
checkInState("start",
STATE_WAITING_IN_QUEUE,
STATE_WAITING_FOR_COOKIE,
@@ -159,7 +159,7 @@ public class BiometricSchedulerOperation {
* @param cookie cookie indicting the operation should begin
* @return if this operation started
*/
public boolean startWithCookie(@NonNull BaseClientMonitor.Callback callback, int cookie) {
public boolean startWithCookie(@NonNull ClientMonitorCallback callback, int cookie) {
checkInState("start",
STATE_WAITING_IN_QUEUE,
STATE_WAITING_FOR_COOKIE,
@@ -173,8 +173,8 @@ public class BiometricSchedulerOperation {
return doStart(callback);
}
private boolean doStart(@NonNull BaseClientMonitor.Callback callback) {
final BaseClientMonitor.Callback cb = getWrappedCallback(callback);
private boolean doStart(@NonNull ClientMonitorCallback callback) {
final ClientMonitorCallback cb = getWrappedCallback(callback);
if (mState == STATE_WAITING_IN_QUEUE_CANCELING) {
Slog.d(TAG, "Operation marked for cancellation, cancelling now: " + this);
@@ -239,9 +239,9 @@ public class BiometricSchedulerOperation {
*
* @param handler handler to use for the cancellation watchdog
* @param callback lifecycle callback (only used if this operation hasn't started, otherwise
* the callback used from {@link #start(BaseClientMonitor.Callback)} is used)
* the callback used from {@link #start(ClientMonitorCallback)} is used)
*/
public void cancel(@NonNull Handler handler, @NonNull BaseClientMonitor.Callback callback) {
public void cancel(@NonNull Handler handler, @NonNull ClientMonitorCallback callback) {
checkNotInState("cancel", STATE_FINISHED);
final int currentState = mState;
@@ -270,14 +270,14 @@ public class BiometricSchedulerOperation {
}
@NonNull
private BaseClientMonitor.Callback getWrappedCallback() {
private ClientMonitorCallback getWrappedCallback() {
return getWrappedCallback(null);
}
@NonNull
private BaseClientMonitor.Callback getWrappedCallback(
@Nullable BaseClientMonitor.Callback callback) {
final BaseClientMonitor.Callback destroyCallback = new BaseClientMonitor.Callback() {
private ClientMonitorCallback getWrappedCallback(
@Nullable ClientMonitorCallback callback) {
final ClientMonitorCallback destroyCallback = new ClientMonitorCallback() {
@Override
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
boolean success) {
@@ -286,7 +286,7 @@ public class BiometricSchedulerOperation {
mState = STATE_FINISHED;
}
};
return new BaseClientMonitor.CompositeCallback(destroyCallback, callback, mClientCallback);
return new ClientMonitorCompositeCallback(destroyCallback, callback, mClientCallback);
}
/** {@link BaseClientMonitor#getSensorId()}. */

View File

@@ -0,0 +1,43 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.biometrics.sensors;
import android.annotation.NonNull;
/**
* Interface that ClientMonitor holders should use to receive callbacks.
*/
public interface ClientMonitorCallback {
/**
* 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) {}
}

View File

@@ -0,0 +1,53 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.biometrics.sensors;
import android.annotation.NonNull;
import java.util.ArrayList;
import java.util.List;
/** Holder for wrapping multiple handlers into a single Callback. */
public class ClientMonitorCompositeCallback implements ClientMonitorCallback {
@NonNull
private final List<ClientMonitorCallback> mCallbacks;
public ClientMonitorCompositeCallback(@NonNull ClientMonitorCallback... callbacks) {
mCallbacks = new ArrayList<>();
for (ClientMonitorCallback 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);
}
}
}

View File

@@ -98,7 +98,7 @@ public abstract class EnrollClient<T> extends AcquisitionClient<T> implements En
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
if (hasReachedEnrollmentLimit()) {

View File

@@ -23,7 +23,7 @@ public interface EnrollmentModifier {
/**
* Callers should typically check this after
* {@link BaseClientMonitor.Callback#onClientFinished(BaseClientMonitor, boolean)}
* {@link ClientMonitorCallback#onClientFinished(BaseClientMonitor, boolean)}
*
* @return true if the user has gone from:
* 1) none-enrolled --> enrolled

View File

@@ -47,7 +47,7 @@ public abstract class GenerateChallengeClient<T> extends HalClientMonitor<T> {
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();

View File

@@ -45,7 +45,7 @@ public abstract class HalClientMonitor<T> extends BaseClientMonitor {
/**
* 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(Callback)}.
* {@link #start(ClientMonitorCallback)}.
*/
public abstract void unableToStart();

View File

@@ -64,7 +64,7 @@ public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Ide
private final boolean mHasEnrollmentsBeforeStarting;
private BaseClientMonitor mCurrentTask;
private final Callback mEnumerateCallback = new Callback() {
private final ClientMonitorCallback mEnumerateCallback = new ClientMonitorCallback() {
@Override
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor, boolean success) {
final List<BiometricAuthenticator.Identifier> unknownHALTemplates =
@@ -90,7 +90,7 @@ public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Ide
}
};
private final Callback mRemoveCallback = new Callback() {
private final ClientMonitorCallback mRemoveCallback = new ClientMonitorCallback() {
@Override
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor, boolean success) {
Slog.d(TAG, "Remove onClientFinished: " + clientMonitor + ", success: " + success);
@@ -139,7 +139,7 @@ public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Ide
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
// Start enumeration. Removal will start if necessary, when enumeration is completed.

View File

@@ -72,7 +72,7 @@ public abstract class InternalEnumerateClient<T> extends HalClientMonitor<T>
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
// The biometric template ids will be removed when we get confirmation from the HAL

View File

@@ -29,15 +29,15 @@ public interface Interruptable {
/**
* Notifies the client that it needs to finish before
* {@link BaseClientMonitor#start(BaseClientMonitor.Callback)} was invoked. This usually happens
* {@link BaseClientMonitor#start(ClientMonitorCallback)} was invoked. This usually happens
* if the client is still waiting in the pending queue and got notified that a subsequent
* operation is preempting it.
*
* This method must invoke
* {@link BaseClientMonitor.Callback#onClientFinished(BaseClientMonitor, boolean)} on the
* {@link ClientMonitorCallback#onClientFinished(BaseClientMonitor, boolean)} on the
* given callback (with success).
*
* @param callback invoked when the operation is completed.
*/
void cancelWithoutStarting(@NonNull BaseClientMonitor.Callback callback);
void cancelWithoutStarting(@NonNull ClientMonitorCallback callback);
}

View File

@@ -62,7 +62,7 @@ public abstract class InvalidationClient<S extends BiometricAuthenticator.Identi
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();

View File

@@ -84,7 +84,7 @@ public class InvalidationRequesterClient<S extends BiometricAuthenticator.Identi
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
mUtils.setInvalidationInProgress(getContext(), getTargetUserId(), true /* inProgress */);

View File

@@ -17,7 +17,6 @@
package com.android.server.biometrics.sensors;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricsProtoEnums;
@@ -59,7 +58,7 @@ public abstract class RemovalClient<S extends BiometricAuthenticator.Identifier,
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
// The biometric template ids will be removed when we get confirmation from the HAL

View File

@@ -38,7 +38,7 @@ public abstract class RevokeChallengeClient<T> extends HalClientMonitor<T> {
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();

View File

@@ -56,7 +56,7 @@ public class UserAwareBiometricScheduler extends BiometricScheduler {
@NonNull private final UserSwitchCallback mUserSwitchCallback;
@Nullable private StopUserClient<?> mStopUserClient;
private class ClientFinishedCallback implements BaseClientMonitor.Callback {
private class ClientFinishedCallback implements ClientMonitorCallback {
private final BaseClientMonitor mOwner;
ClientFinishedCallback(BaseClientMonitor owner) {

View File

@@ -29,7 +29,7 @@ import android.os.IBinder;
import android.util.proto.ProtoOutputStream;
import android.view.Surface;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.LockoutTracker;
@@ -137,7 +137,7 @@ public interface ServiceProvider {
void startPreparedClient(int sensorId, int cookie);
void scheduleInternalCleanup(int sensorId, int userId,
@Nullable BaseClientMonitor.Callback callback);
@Nullable ClientMonitorCallback callback);
void dumpProtoState(int sensorId, @NonNull ProtoOutputStream proto,
boolean clearSchedulerBuffer);

View File

@@ -35,6 +35,7 @@ import android.util.Slog;
import com.android.server.biometrics.HardwareAuthTokenUtils;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.face.FaceUtils;
import java.util.HashSet;
@@ -221,7 +222,7 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
Utils.checkPermission(mContext, TEST_BIOMETRIC);
Slog.d(TAG, "cleanupInternalState: " + userId);
mProvider.scheduleInternalCleanup(mSensorId, userId, new BaseClientMonitor.Callback() {
mProvider.scheduleInternalCleanup(mSensorId, userId, new ClientMonitorCallback() {
@Override
public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
try {

View File

@@ -39,7 +39,9 @@ import com.android.internal.R;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.AuthenticationClient;
import com.android.server.biometrics.sensors.BiometricNotificationUtils;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.ClientMonitorCompositeCallback;
import com.android.server.biometrics.sensors.LockoutCache;
import com.android.server.biometrics.sensors.LockoutConsumer;
import com.android.server.biometrics.sensors.LockoutTracker;
@@ -97,15 +99,15 @@ class FaceAuthenticationClient extends AuthenticationClient<ISession> implements
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
mState = STATE_STARTED;
}
@NonNull
@Override
protected Callback wrapCallbackForStart(@NonNull Callback callback) {
return new CompositeCallback(
protected ClientMonitorCallback wrapCallbackForStart(@NonNull ClientMonitorCallback callback) {
return new ClientMonitorCompositeCallback(
getLogger().createALSCallback(true /* startWithClient */), callback);
}

View File

@@ -30,6 +30,7 @@ import android.util.Slog;
import com.android.server.biometrics.BiometricsProto;
import com.android.server.biometrics.sensors.AcquisitionClient;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.DetectionConsumer;
@@ -58,7 +59,7 @@ public class FaceDetectClient extends AcquisitionClient<ISession> implements Det
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();
}

View File

@@ -41,7 +41,9 @@ import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricNotificationUtils;
import com.android.server.biometrics.sensors.BiometricUtils;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.ClientMonitorCompositeCallback;
import com.android.server.biometrics.sensors.EnrollClient;
import com.android.server.biometrics.sensors.face.FaceService;
import com.android.server.biometrics.sensors.face.FaceUtils;
@@ -67,8 +69,8 @@ public class FaceEnrollClient extends EnrollClient<ISession> {
private final int mMaxTemplatesPerUser;
private final boolean mDebugConsent;
private final BaseClientMonitor.Callback mPreviewHandleDeleterCallback =
new BaseClientMonitor.Callback() {
private final ClientMonitorCallback mPreviewHandleDeleterCallback =
new ClientMonitorCallback() {
@Override
public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
}
@@ -101,7 +103,7 @@ public class FaceEnrollClient extends EnrollClient<ISession> {
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
BiometricNotificationUtils.cancelReEnrollNotification(getContext());
@@ -109,8 +111,8 @@ public class FaceEnrollClient extends EnrollClient<ISession> {
@NonNull
@Override
protected Callback wrapCallbackForStart(@NonNull Callback callback) {
return new CompositeCallback(mPreviewHandleDeleterCallback,
protected ClientMonitorCallback wrapCallbackForStart(@NonNull ClientMonitorCallback callback) {
return new ClientMonitorCompositeCallback(mPreviewHandleDeleterCallback,
getLogger().createALSCallback(true /* startWithClient */), callback);
}

View File

@@ -24,6 +24,7 @@ import android.os.RemoteException;
import android.util.Slog;
import com.android.server.biometrics.BiometricsProto;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.HalClientMonitor;
import java.util.Map;
@@ -48,7 +49,7 @@ class FaceGetAuthenticatorIdClient extends HalClientMonitor<ISession> {
// Nothing to do here
}
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();
}

View File

@@ -29,6 +29,7 @@ import android.provider.Settings;
import android.util.Slog;
import com.android.server.biometrics.BiometricsProto;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.ErrorConsumer;
import com.android.server.biometrics.sensors.HalClientMonitor;
@@ -60,7 +61,7 @@ public class FaceGetFeatureClient extends HalClientMonitor<ISession> implements
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();
}

View File

@@ -49,6 +49,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.AuthenticationClient;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.InvalidationRequesterClient;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
@@ -217,7 +218,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
}
private void scheduleForSensor(int sensorId, @NonNull BaseClientMonitor client,
BaseClientMonitor.Callback callback) {
ClientMonitorCallback callback) {
if (!mSensors.contains(sensorId)) {
throw new IllegalStateException("Unable to schedule client: " + client
+ " for sensor: " + sensorId);
@@ -341,7 +342,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
opPackageName, id, FaceUtils.getInstance(sensorId), disabledFeatures,
ENROLL_TIMEOUT_SEC, previewSurface, sensorId, maxTemplatesPerUser,
debugConsent);
scheduleForSensor(sensorId, client, new BaseClientMonitor.Callback() {
scheduleForSensor(sensorId, client, new ClientMonitorCallback() {
@Override
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
boolean success) {
@@ -511,7 +512,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
@Override
public void scheduleInternalCleanup(int sensorId, int userId,
@Nullable BaseClientMonitor.Callback callback) {
@Nullable ClientMonitorCallback callback) {
mHandler.post(() -> {
final List<Face> enrolledList = getEnrolledFaces(sensorId, userId);
final FaceInternalCleanupClient client =

View File

@@ -27,6 +27,7 @@ import android.util.Slog;
import com.android.server.biometrics.BiometricsProto;
import com.android.server.biometrics.HardwareAuthTokenUtils;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ErrorConsumer;
import com.android.server.biometrics.sensors.HalClientMonitor;
import com.android.server.biometrics.sensors.LockoutCache;
@@ -64,7 +65,7 @@ public class FaceResetLockoutClient extends HalClientMonitor<ISession> implement
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();
}

View File

@@ -28,6 +28,7 @@ import android.util.Slog;
import com.android.server.biometrics.BiometricsProto;
import com.android.server.biometrics.HardwareAuthTokenUtils;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.ErrorConsumer;
import com.android.server.biometrics.sensors.HalClientMonitor;
@@ -65,7 +66,7 @@ public class FaceSetFeatureClient extends HalClientMonitor<ISession> implements
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();
}

View File

@@ -27,6 +27,7 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.StartUserClient;
public class FaceStartUserClient extends StartUserClient<IFace, ISession> {
@@ -43,7 +44,7 @@ public class FaceStartUserClient extends StartUserClient<IFace, ISession> {
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();
}

View File

@@ -24,6 +24,7 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.StopUserClient;
public class FaceStopUserClient extends StopUserClient<ISession> {
@@ -36,7 +37,7 @@ public class FaceStopUserClient extends StopUserClient<ISession> {
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();
}

View File

@@ -32,6 +32,7 @@ import android.util.Slog;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.face.FaceUtils;
import java.util.ArrayList;
@@ -197,7 +198,7 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
public void cleanupInternalState(int userId) {
Utils.checkPermission(mContext, TEST_BIOMETRIC);
mFace10.scheduleInternalCleanup(mSensorId, userId, new BaseClientMonitor.Callback() {
mFace10.scheduleInternalCleanup(mSensorId, userId, new ClientMonitorCallback() {
@Override
public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
try {

View File

@@ -60,6 +60,7 @@ import com.android.server.biometrics.sensors.AuthenticationConsumer;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricNotificationUtils;
import com.android.server.biometrics.sensors.BiometricScheduler;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.EnumerateConsumer;
import com.android.server.biometrics.sensors.ErrorConsumer;
@@ -534,7 +535,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), userId,
opPackageName, mSensorId, sSystemClock.millis());
mGeneratedChallengeCache = client;
mScheduler.scheduleClientMonitor(client, new BaseClientMonitor.Callback() {
mScheduler.scheduleClientMonitor(client, new ClientMonitorCallback() {
@Override
public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
if (client != clientMonitor) {
@@ -562,7 +563,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
final FaceRevokeChallengeClient client = new FaceRevokeChallengeClient(mContext,
mLazyDaemon, token, userId, opPackageName, mSensorId);
mScheduler.scheduleClientMonitor(client, new BaseClientMonitor.Callback() {
mScheduler.scheduleClientMonitor(client, new ClientMonitorCallback() {
@Override
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
boolean success) {
@@ -591,7 +592,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
opPackageName, id, FaceUtils.getLegacyInstance(mSensorId), disabledFeatures,
ENROLL_TIMEOUT_SEC, previewSurface, mSensorId);
mScheduler.scheduleClientMonitor(client, new BaseClientMonitor.Callback() {
mScheduler.scheduleClientMonitor(client, new ClientMonitorCallback() {
@Override
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
boolean success) {
@@ -742,7 +743,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
final int faceId = faces.get(0).getBiometricId();
final FaceGetFeatureClient client = new FaceGetFeatureClient(mContext, mLazyDaemon,
token, listener, userId, opPackageName, mSensorId, feature, faceId);
mScheduler.scheduleClientMonitor(client, new BaseClientMonitor.Callback() {
mScheduler.scheduleClientMonitor(client, new ClientMonitorCallback() {
@Override
public void onClientFinished(
@NonNull BaseClientMonitor clientMonitor, boolean success) {
@@ -760,7 +761,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
}
private void scheduleInternalCleanup(int userId,
@Nullable BaseClientMonitor.Callback callback) {
@Nullable ClientMonitorCallback callback) {
mHandler.post(() -> {
scheduleUpdateActiveUserWithoutHandler(userId);
@@ -774,7 +775,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
@Override
public void scheduleInternalCleanup(int sensorId, int userId,
@Nullable BaseClientMonitor.Callback callback) {
@Nullable ClientMonitorCallback callback) {
scheduleInternalCleanup(userId, callback);
}
@@ -890,7 +891,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
final FaceUpdateActiveUserClient client = new FaceUpdateActiveUserClient(mContext,
mLazyDaemon, targetUserId, mContext.getOpPackageName(), mSensorId,
hasEnrolled, mAuthenticatorIds);
mScheduler.scheduleClientMonitor(client, new BaseClientMonitor.Callback() {
mScheduler.scheduleClientMonitor(client, new ClientMonitorCallback() {
@Override
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
boolean success) {

View File

@@ -34,7 +34,9 @@ import com.android.internal.R;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.AuthenticationClient;
import com.android.server.biometrics.sensors.BiometricNotificationUtils;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.ClientMonitorCompositeCallback;
import com.android.server.biometrics.sensors.LockoutTracker;
import com.android.server.biometrics.sensors.face.UsageStats;
@@ -87,15 +89,15 @@ class FaceAuthenticationClient extends AuthenticationClient<IBiometricsFace> {
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
mState = STATE_STARTED;
}
@NonNull
@Override
protected Callback wrapCallbackForStart(@NonNull Callback callback) {
return new CompositeCallback(
protected ClientMonitorCallback wrapCallbackForStart(@NonNull ClientMonitorCallback callback) {
return new ClientMonitorCompositeCallback(
getLogger().createALSCallback(true /* startWithClient */), callback);
}

View File

@@ -33,7 +33,9 @@ import android.view.Surface;
import com.android.internal.R;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.BiometricUtils;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.ClientMonitorCompositeCallback;
import com.android.server.biometrics.sensors.EnrollClient;
import java.util.ArrayList;
@@ -69,8 +71,8 @@ public class FaceEnrollClient extends EnrollClient<IBiometricsFace> {
@NonNull
@Override
protected Callback wrapCallbackForStart(@NonNull Callback callback) {
return new CompositeCallback(
protected ClientMonitorCallback wrapCallbackForStart(@NonNull ClientMonitorCallback callback) {
return new ClientMonitorCompositeCallback(
getLogger().createALSCallback(true /* startWithClient */), callback);
}

View File

@@ -25,6 +25,7 @@ import android.os.RemoteException;
import android.util.Slog;
import com.android.internal.util.Preconditions;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.GenerateChallengeClient;
@@ -39,7 +40,7 @@ public class FaceGenerateChallengeClient extends GenerateChallengeClient<IBiomet
private static final String TAG = "FaceGenerateChallengeClient";
static final int CHALLENGE_TIMEOUT_SEC = 600; // 10 minutes
private static final Callback EMPTY_CALLBACK = new Callback() {
private static final ClientMonitorCallback EMPTY_CALLBACK = new ClientMonitorCallback() {
};
private final long mCreatedAt;
@@ -94,7 +95,7 @@ public class FaceGenerateChallengeClient extends GenerateChallengeClient<IBiomet
}
private void sendChallengeResult(@NonNull ClientMonitorCallbackConverter receiver,
@NonNull Callback ownerCallback) {
@NonNull ClientMonitorCallback ownerCallback) {
Preconditions.checkState(mChallengeResult != null, "result not available");
try {
receiver.onChallengeGenerated(getSensorId(), getTargetUserId(), mChallengeResult);

View File

@@ -28,6 +28,7 @@ import android.os.RemoteException;
import android.util.Slog;
import com.android.server.biometrics.BiometricsProto;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.HalClientMonitor;
@@ -66,7 +67,7 @@ public class FaceGetFeatureClient extends HalClientMonitor<IBiometricsFace> {
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();
}

View File

@@ -24,6 +24,7 @@ import android.os.RemoteException;
import android.util.Slog;
import com.android.server.biometrics.BiometricsProto;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.HalClientMonitor;
import java.util.ArrayList;
@@ -57,7 +58,7 @@ public class FaceResetLockoutClient extends HalClientMonitor<IBiometricsFace> {
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();
}

View File

@@ -26,6 +26,7 @@ import android.os.RemoteException;
import android.util.Slog;
import com.android.server.biometrics.BiometricsProto;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.HalClientMonitor;
@@ -71,7 +72,7 @@ public class FaceSetFeatureClient extends HalClientMonitor<IBiometricsFace> {
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();

View File

@@ -25,6 +25,7 @@ import android.os.RemoteException;
import android.util.Slog;
import com.android.server.biometrics.BiometricsProto;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.HalClientMonitor;
import java.io.File;
@@ -49,7 +50,7 @@ public class FaceUpdateActiveUserClient extends HalClientMonitor<IBiometricsFace
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();
}

View File

@@ -31,6 +31,7 @@ import android.util.Slog;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.AuthenticationClient;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.EnrollClient;
import com.android.server.biometrics.sensors.EnrollmentModifier;
@@ -39,7 +40,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
/**
* A callback for receiving notifications about changes in fingerprint state.
*/
public class FingerprintStateCallback implements BaseClientMonitor.Callback {
public class FingerprintStateCallback implements ClientMonitorCallback {
@NonNull private final CopyOnWriteArrayList<IFingerprintStateListener>
mFingerprintStateListeners = new CopyOnWriteArrayList<>();

View File

@@ -30,7 +30,7 @@ import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.IBinder;
import android.util.proto.ProtoOutputStream;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.LockoutTracker;
@@ -121,7 +121,7 @@ public interface ServiceProvider {
@NonNull String opPackageName);
void scheduleInternalCleanup(int sensorId, int userId,
@Nullable BaseClientMonitor.Callback callback);
@Nullable ClientMonitorCallback callback);
boolean isHardwareDetected(int sensorId);

View File

@@ -32,6 +32,7 @@ import android.util.Slog;
import com.android.server.biometrics.HardwareAuthTokenUtils;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.fingerprint.FingerprintStateCallback;
import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
@@ -204,7 +205,7 @@ class BiometricTestSessionImpl extends ITestSession.Stub {
Utils.checkPermission(mContext, TEST_BIOMETRIC);
Slog.d(TAG, "cleanupInternalState: " + userId);
mProvider.scheduleInternalCleanup(mSensorId, userId, new BaseClientMonitor.Callback() {
mProvider.scheduleInternalCleanup(mSensorId, userId, new ClientMonitorCallback() {
@Override
public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
try {

View File

@@ -37,7 +37,9 @@ import com.android.server.biometrics.log.CallbackWithProbe;
import com.android.server.biometrics.log.Probe;
import com.android.server.biometrics.sensors.AuthenticationClient;
import com.android.server.biometrics.sensors.BiometricNotificationUtils;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.ClientMonitorCompositeCallback;
import com.android.server.biometrics.sensors.LockoutCache;
import com.android.server.biometrics.sensors.LockoutConsumer;
import com.android.server.biometrics.sensors.LockoutTracker;
@@ -86,7 +88,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient<ISession> imp
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
if (mSensorProps.isAnyUdfpsType()) {
@@ -99,8 +101,8 @@ class FingerprintAuthenticationClient extends AuthenticationClient<ISession> imp
@NonNull
@Override
protected Callback wrapCallbackForStart(@NonNull Callback callback) {
return new CompositeCallback(mALSProbeCallback, callback);
protected ClientMonitorCallback wrapCallbackForStart(@NonNull ClientMonitorCallback callback) {
return new ClientMonitorCompositeCallback(mALSProbeCallback, callback);
}
@Override

View File

@@ -30,6 +30,7 @@ import android.util.Slog;
import com.android.server.biometrics.BiometricsProto;
import com.android.server.biometrics.sensors.AcquisitionClient;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.DetectionConsumer;
import com.android.server.biometrics.sensors.SensorOverlays;
@@ -61,7 +62,7 @@ class FingerprintDetectClient extends AcquisitionClient<ISession> implements Det
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();
}

View File

@@ -37,7 +37,9 @@ import android.util.Slog;
import com.android.server.biometrics.HardwareAuthTokenUtils;
import com.android.server.biometrics.sensors.BiometricNotificationUtils;
import com.android.server.biometrics.sensors.BiometricUtils;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.ClientMonitorCompositeCallback;
import com.android.server.biometrics.sensors.EnrollClient;
import com.android.server.biometrics.sensors.SensorOverlays;
import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
@@ -82,8 +84,8 @@ class FingerprintEnrollClient extends EnrollClient<ISession> implements Udfps {
@NonNull
@Override
protected Callback wrapCallbackForStart(@NonNull Callback callback) {
return new CompositeCallback(
protected ClientMonitorCallback wrapCallbackForStart(@NonNull ClientMonitorCallback callback) {
return new ClientMonitorCompositeCallback(
getLogger().createALSCallback(true /* startWithClient */), callback);
}

View File

@@ -24,6 +24,7 @@ import android.os.RemoteException;
import android.util.Slog;
import com.android.server.biometrics.BiometricsProto;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.HalClientMonitor;
import java.util.Map;
@@ -48,7 +49,7 @@ class FingerprintGetAuthenticatorIdClient extends HalClientMonitor<ISession> {
// Nothing to do here
}
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();
}

View File

@@ -55,7 +55,9 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.AuthenticationClient;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.ClientMonitorCompositeCallback;
import com.android.server.biometrics.sensors.InvalidationRequesterClient;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
import com.android.server.biometrics.sensors.PerformanceTracker;
@@ -248,7 +250,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
}
private void scheduleForSensor(int sensorId, @NonNull BaseClientMonitor client,
BaseClientMonitor.Callback callback) {
ClientMonitorCallback callback) {
if (!mSensors.contains(sensorId)) {
throw new IllegalStateException("Unable to schedule client: " + client
+ " for sensor: " + sensorId);
@@ -361,7 +363,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
opPackageName, FingerprintUtils.getInstance(sensorId), sensorId,
mSensors.get(sensorId).getSensorProperties(),
mUdfpsOverlayController, mSidefpsController, maxTemplatesPerUser, enrollReason);
scheduleForSensor(sensorId, client, new BaseClientMonitor.Callback() {
scheduleForSensor(sensorId, client, new ClientMonitorCallback() {
@Override
public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
@@ -484,7 +486,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
@Override
public void scheduleInternalCleanup(int sensorId, int userId,
@Nullable BaseClientMonitor.Callback callback) {
@Nullable ClientMonitorCallback callback) {
mHandler.post(() -> {
final List<Fingerprint> enrolledList = getEnrolledFingerprints(sensorId, userId);
final FingerprintInternalCleanupClient client =
@@ -493,7 +495,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
mContext.getOpPackageName(), sensorId, enrolledList,
FingerprintUtils.getInstance(sensorId),
mSensors.get(sensorId).getAuthenticatorIds());
scheduleForSensor(sensorId, client, new BaseClientMonitor.CompositeCallback(callback,
scheduleForSensor(sensorId, client, new ClientMonitorCompositeCallback(callback,
mFingerprintStateCallback));
});
}

View File

@@ -27,6 +27,7 @@ import android.util.Slog;
import com.android.server.biometrics.BiometricsProto;
import com.android.server.biometrics.HardwareAuthTokenUtils;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ErrorConsumer;
import com.android.server.biometrics.sensors.HalClientMonitor;
import com.android.server.biometrics.sensors.LockoutCache;
@@ -64,7 +65,7 @@ class FingerprintResetLockoutClient extends HalClientMonitor<ISession> implement
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();
}

View File

@@ -27,6 +27,7 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.StartUserClient;
public class FingerprintStartUserClient extends StartUserClient<IFingerprint, ISession> {
@@ -44,7 +45,7 @@ public class FingerprintStartUserClient extends StartUserClient<IFingerprint, IS
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();
}

View File

@@ -24,6 +24,7 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.StopUserClient;
public class FingerprintStopUserClient extends StopUserClient<ISession> {
@@ -36,7 +37,7 @@ public class FingerprintStopUserClient extends StopUserClient<ISession> {
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();
}

View File

@@ -31,6 +31,7 @@ import android.util.Slog;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.fingerprint.FingerprintStateCallback;
import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
@@ -201,7 +202,7 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
public void cleanupInternalState(int userId) {
Utils.checkPermission(mContext, TEST_BIOMETRIC);
mFingerprint21.scheduleInternalCleanup(mSensorId, userId, new BaseClientMonitor.Callback() {
mFingerprint21.scheduleInternalCleanup(mSensorId, userId, new ClientMonitorCallback() {
@Override
public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
try {

View File

@@ -62,7 +62,9 @@ import com.android.server.biometrics.sensors.AuthenticationClient;
import com.android.server.biometrics.sensors.AuthenticationConsumer;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricScheduler;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.ClientMonitorCompositeCallback;
import com.android.server.biometrics.sensors.EnumerateConsumer;
import com.android.server.biometrics.sensors.ErrorConsumer;
import com.android.server.biometrics.sensors.HalClientMonitor;
@@ -492,7 +494,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
new FingerprintUpdateActiveUserClient(mContext, mLazyDaemon, targetUserId,
mContext.getOpPackageName(), mSensorProperties.sensorId,
this::getCurrentUser, hasEnrolled, mAuthenticatorIds, force);
mScheduler.scheduleClientMonitor(client, new BaseClientMonitor.Callback() {
mScheduler.scheduleClientMonitor(client, new ClientMonitorCallback() {
@Override
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
boolean success) {
@@ -577,7 +579,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
FingerprintUtils.getLegacyInstance(mSensorId), ENROLL_TIMEOUT_SEC,
mSensorProperties.sensorId, mUdfpsOverlayController, mSidefpsController,
enrollReason);
mScheduler.scheduleClientMonitor(client, new BaseClientMonitor.Callback() {
mScheduler.scheduleClientMonitor(client, new ClientMonitorCallback() {
@Override
public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
mFingerprintStateCallback.onClientStarted(clientMonitor);
@@ -699,7 +701,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
}
private void scheduleInternalCleanup(int userId,
@Nullable BaseClientMonitor.Callback callback) {
@Nullable ClientMonitorCallback callback) {
mHandler.post(() -> {
scheduleUpdateActiveUserWithoutHandler(userId);
@@ -715,8 +717,8 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
@Override
public void scheduleInternalCleanup(int sensorId, int userId,
@Nullable BaseClientMonitor.Callback callback) {
scheduleInternalCleanup(userId, new BaseClientMonitor.CompositeCallback(callback,
@Nullable ClientMonitorCallback callback) {
scheduleInternalCleanup(userId, new ClientMonitorCompositeCallback(callback,
mFingerprintStateCallback));
}

View File

@@ -36,7 +36,9 @@ import com.android.server.biometrics.log.CallbackWithProbe;
import com.android.server.biometrics.log.Probe;
import com.android.server.biometrics.sensors.AuthenticationClient;
import com.android.server.biometrics.sensors.BiometricNotificationUtils;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.ClientMonitorCompositeCallback;
import com.android.server.biometrics.sensors.LockoutTracker;
import com.android.server.biometrics.sensors.SensorOverlays;
import com.android.server.biometrics.sensors.fingerprint.Udfps;
@@ -86,7 +88,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient<IBiometricsFi
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
if (mSensorProps.isAnyUdfpsType()) {
@@ -99,8 +101,8 @@ class FingerprintAuthenticationClient extends AuthenticationClient<IBiometricsFi
@NonNull
@Override
protected Callback wrapCallbackForStart(@NonNull Callback callback) {
return new CompositeCallback(mALSProbeCallback, callback);
protected ClientMonitorCallback wrapCallbackForStart(@NonNull ClientMonitorCallback callback) {
return new ClientMonitorCompositeCallback(mALSProbeCallback, callback);
}
@Override

View File

@@ -32,6 +32,7 @@ import android.util.Slog;
import com.android.server.biometrics.BiometricsProto;
import com.android.server.biometrics.sensors.AcquisitionClient;
import com.android.server.biometrics.sensors.AuthenticationConsumer;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.PerformanceTracker;
import com.android.server.biometrics.sensors.SensorOverlays;
@@ -82,7 +83,7 @@ class FingerprintDetectClient extends AcquisitionClient<IBiometricsFingerprint>
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();
}

View File

@@ -33,7 +33,9 @@ import android.util.Slog;
import com.android.server.biometrics.sensors.BiometricNotificationUtils;
import com.android.server.biometrics.sensors.BiometricUtils;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.ClientMonitorCompositeCallback;
import com.android.server.biometrics.sensors.EnrollClient;
import com.android.server.biometrics.sensors.SensorOverlays;
import com.android.server.biometrics.sensors.fingerprint.Udfps;
@@ -75,8 +77,8 @@ public class FingerprintEnrollClient extends EnrollClient<IBiometricsFingerprint
@NonNull
@Override
protected Callback wrapCallbackForStart(@NonNull Callback callback) {
return new CompositeCallback(
protected ClientMonitorCallback wrapCallbackForStart(@NonNull ClientMonitorCallback callback) {
return new ClientMonitorCompositeCallback(
getLogger().createALSCallback(true /* startWithClient */), callback);
}

View File

@@ -22,6 +22,7 @@ import android.hardware.biometrics.BiometricsProtoEnums;
import com.android.server.biometrics.BiometricsProto;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
/**
* Clears lockout, which is handled in the framework (and not the HAL) for the
@@ -40,7 +41,7 @@ public class FingerprintResetLockoutClient extends BaseClientMonitor {
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
mLockoutTracker.resetFailedAttemptsForUser(true /* clearAttemptCounter */,
getTargetUserId());

View File

@@ -27,6 +27,7 @@ import android.os.SELinux;
import android.util.Slog;
import com.android.server.biometrics.BiometricsProto;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.HalClientMonitor;
import java.io.File;
@@ -62,7 +63,7 @@ public class FingerprintUpdateActiveUserClient extends HalClientMonitor<IBiometr
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
if (mCurrentUserId.get() == getTargetUserId() && !mForceUpdateAuthenticatorId) {

View File

@@ -52,7 +52,7 @@ public class AcquisitionClientTest {
@Mock
private ClientMonitorCallbackConverter mClientCallback;
@Mock
private BaseClientMonitor.Callback mSchedulerCallback;
private ClientMonitorCallback mSchedulerCallback;
@Before
public void setUp() {
@@ -96,7 +96,7 @@ public class AcquisitionClientTest {
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
startHalOperation();
}

View File

@@ -0,0 +1,130 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.biometrics.sensors;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.verify;
import android.content.Context;
import android.os.IBinder;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
import androidx.annotation.NonNull;
import androidx.test.filters.SmallTest;
import com.android.server.biometrics.log.BiometricLogger;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@Presubmit
@SmallTest
public class BaseClientMonitorTest {
@Mock
private Context mContext;
@Mock
private IBinder mToken;
private @Mock ClientMonitorCallbackConverter mListener;
@Mock
private BiometricLogger mLogger;
@Mock
private ClientMonitorCallback mCallback;
private TestClientMonitor mClientMonitor;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mClientMonitor = new TestClientMonitor();
}
@Test
public void preparesForDeath() throws RemoteException {
verify(mToken).linkToDeath(eq(mClientMonitor), anyInt());
mClientMonitor.binderDied();
assertThat(mClientMonitor.mCanceled).isTrue();
assertThat(mClientMonitor.getListener()).isNull();
}
@Test
public void ignoresDeathWhenDone() {
mClientMonitor.markAlreadyDone();
mClientMonitor.binderDied();
assertThat(mClientMonitor.mCanceled).isFalse();
}
@Test
public void start() {
mClientMonitor.start(mCallback);
verify(mCallback).onClientStarted(eq(mClientMonitor));
}
@Test
public void destroy() {
mClientMonitor.destroy();
mClientMonitor.destroy();
assertThat(mClientMonitor.isAlreadyDone()).isTrue();
verify(mToken).unlinkToDeath(eq(mClientMonitor), anyInt());
}
@Test
public void hasRequestId() {
assertThat(mClientMonitor.hasRequestId()).isFalse();
final int id = 200;
mClientMonitor.setRequestId(id);
assertThat(mClientMonitor.hasRequestId()).isTrue();
assertThat(mClientMonitor.getRequestId()).isEqualTo(id);
}
private class TestClientMonitor extends BaseClientMonitor implements Interruptable {
public boolean mCanceled = false;
TestClientMonitor() {
super(mContext, mToken, mListener, 9 /* userId */, "foo" /* owner */, 2 /* cookie */,
5 /* sensorId */, mLogger);
}
@Override
public int getProtoEnum() {
return 0;
}
@Override
public void cancel() {
mCanceled = true;
}
@Override
public void cancelWithoutStarting(@NonNull ClientMonitorCallback callback) {
mCanceled = true;
}
}
}

View File

@@ -61,11 +61,11 @@ public class BiometricSchedulerOperationTest {
@Mock
private InterruptableMonitor<FakeHal> mClientMonitor;
@Mock
private BaseClientMonitor.Callback mClientCallback;
private ClientMonitorCallback mClientCallback;
@Mock
private FakeHal mHal;
@Captor
ArgumentCaptor<BaseClientMonitor.Callback> mStartCallback;
ArgumentCaptor<ClientMonitorCallback> mStartCallback;
private Handler mHandler;
private BiometricSchedulerOperation mOperation;
@@ -89,7 +89,7 @@ public class BiometricSchedulerOperationTest {
assertThat(mOperation.isFinished()).isFalse();
final boolean started = mOperation.startWithCookie(
mock(BaseClientMonitor.Callback.class), cookie);
mock(ClientMonitorCallback.class), cookie);
assertThat(started).isTrue();
verify(mClientMonitor).start(mStartCallback.capture());
@@ -106,7 +106,7 @@ public class BiometricSchedulerOperationTest {
assertThat(mOperation.isReadyToStart()).isEqualTo(goodCookie);
final boolean started = mOperation.startWithCookie(
mock(BaseClientMonitor.Callback.class), badCookie);
mock(ClientMonitorCallback.class), badCookie);
assertThat(started).isFalse();
assertThat(mOperation.isStarted()).isFalse();
@@ -119,7 +119,7 @@ public class BiometricSchedulerOperationTest {
when(mClientMonitor.getCookie()).thenReturn(0);
when(mClientMonitor.getFreshDaemon()).thenReturn(mHal);
final BaseClientMonitor.Callback cb = mock(BaseClientMonitor.Callback.class);
final ClientMonitorCallback cb = mock(ClientMonitorCallback.class);
mOperation.start(cb);
verify(mClientMonitor).start(mStartCallback.capture());
mStartCallback.getValue().onClientStarted(mClientMonitor);
@@ -146,7 +146,7 @@ public class BiometricSchedulerOperationTest {
when(mClientMonitor.getCookie()).thenReturn(0);
when(mClientMonitor.getFreshDaemon()).thenReturn(null);
final BaseClientMonitor.Callback cb = mock(BaseClientMonitor.Callback.class);
final ClientMonitorCallback cb = mock(ClientMonitorCallback.class);
mOperation.start(cb);
verify(mClientMonitor, never()).start(any());
@@ -164,17 +164,17 @@ public class BiometricSchedulerOperationTest {
public void doesNotStartWithCookie() {
when(mClientMonitor.getCookie()).thenReturn(9);
assertThrows(IllegalStateException.class,
() -> mOperation.start(mock(BaseClientMonitor.Callback.class)));
() -> mOperation.start(mock(ClientMonitorCallback.class)));
}
@Test
public void cannotRestart() {
when(mClientMonitor.getFreshDaemon()).thenReturn(mHal);
mOperation.start(mock(BaseClientMonitor.Callback.class));
mOperation.start(mock(ClientMonitorCallback.class));
assertThrows(IllegalStateException.class,
() -> mOperation.start(mock(BaseClientMonitor.Callback.class)));
() -> mOperation.start(mock(ClientMonitorCallback.class)));
}
@Test
@@ -187,14 +187,14 @@ public class BiometricSchedulerOperationTest {
verify(mClientMonitor).unableToStart();
verify(mClientMonitor).destroy();
assertThrows(IllegalStateException.class,
() -> mOperation.start(mock(BaseClientMonitor.Callback.class)));
() -> mOperation.start(mock(ClientMonitorCallback.class)));
}
@Test
public void cannotAbortRunning() {
when(mClientMonitor.getFreshDaemon()).thenReturn(mHal);
mOperation.start(mock(BaseClientMonitor.Callback.class));
mOperation.start(mock(ClientMonitorCallback.class));
assertThrows(IllegalStateException.class, () -> mOperation.abort());
}
@@ -203,8 +203,8 @@ public class BiometricSchedulerOperationTest {
public void cancel() {
when(mClientMonitor.getFreshDaemon()).thenReturn(mHal);
final BaseClientMonitor.Callback startCb = mock(BaseClientMonitor.Callback.class);
final BaseClientMonitor.Callback cancelCb = mock(BaseClientMonitor.Callback.class);
final ClientMonitorCallback startCb = mock(ClientMonitorCallback.class);
final ClientMonitorCallback cancelCb = mock(ClientMonitorCallback.class);
mOperation.start(startCb);
verify(mClientMonitor).start(mStartCallback.capture());
mStartCallback.getValue().onClientStarted(mClientMonitor);
@@ -230,12 +230,12 @@ public class BiometricSchedulerOperationTest {
public void cancelWithoutStarting() {
when(mClientMonitor.getFreshDaemon()).thenReturn(mHal);
final BaseClientMonitor.Callback cancelCb = mock(BaseClientMonitor.Callback.class);
final ClientMonitorCallback cancelCb = mock(ClientMonitorCallback.class);
mOperation.cancel(mHandler, cancelCb);
assertThat(mOperation.isCanceling()).isTrue();
ArgumentCaptor<BaseClientMonitor.Callback> cbCaptor =
ArgumentCaptor.forClass(BaseClientMonitor.Callback.class);
ArgumentCaptor<ClientMonitorCallback> cbCaptor =
ArgumentCaptor.forClass(ClientMonitorCallback.class);
verify(mClientMonitor).cancelWithoutStarting(cbCaptor.capture());
cbCaptor.getValue().onClientFinished(mClientMonitor, true);
@@ -278,7 +278,7 @@ public class BiometricSchedulerOperationTest {
}
mOperation.markCanceling();
final BaseClientMonitor.Callback cb = mock(BaseClientMonitor.Callback.class);
final ClientMonitorCallback cb = mock(ClientMonitorCallback.class);
if (withCookie != null) {
mOperation.startWithCookie(cb, withCookie);
} else {
@@ -307,12 +307,12 @@ public class BiometricSchedulerOperationTest {
private void cancelWatchdog(boolean start) {
when(mClientMonitor.getFreshDaemon()).thenReturn(mHal);
mOperation.start(mock(BaseClientMonitor.Callback.class));
mOperation.start(mock(ClientMonitorCallback.class));
if (start) {
verify(mClientMonitor).start(mStartCallback.capture());
mStartCallback.getValue().onClientStarted(mClientMonitor);
}
mOperation.cancel(mHandler, mock(BaseClientMonitor.Callback.class));
mOperation.cancel(mHandler, mock(ClientMonitorCallback.class));
assertThat(mOperation.isCanceling()).isTrue();

View File

@@ -114,13 +114,13 @@ public class BiometricSchedulerTest {
final TestHalClientMonitor client2 = new TestHalClientMonitor(
mContext, mToken, () -> mock(Object.class));
final BaseClientMonitor.Callback callback1 = mock(BaseClientMonitor.Callback.class);
final BaseClientMonitor.Callback callback2 = mock(BaseClientMonitor.Callback.class);
final ClientMonitorCallback callback1 = mock(ClientMonitorCallback.class);
final ClientMonitorCallback callback2 = mock(ClientMonitorCallback.class);
// Pretend the scheduler is busy so the first operation doesn't start right away. We want
// to pretend like there are two operations in the queue before kicking things off
mScheduler.mCurrentOperation = new BiometricSchedulerOperation(
mock(BaseClientMonitor.class), mock(BaseClientMonitor.Callback.class));
mock(BaseClientMonitor.class), mock(ClientMonitorCallback.class));
mScheduler.scheduleClientMonitor(client1, callback1);
assertEquals(1, mScheduler.mPendingOperations.size());
@@ -152,13 +152,13 @@ public class BiometricSchedulerTest {
final TestHalClientMonitor client2 =
new TestHalClientMonitor(mContext, mToken, () -> daemon2);
final BaseClientMonitor.Callback callback1 = mock(BaseClientMonitor.Callback.class);
final BaseClientMonitor.Callback callback2 = mock(BaseClientMonitor.Callback.class);
final ClientMonitorCallback callback1 = mock(ClientMonitorCallback.class);
final ClientMonitorCallback callback2 = mock(ClientMonitorCallback.class);
// Pretend the scheduler is busy so the first operation doesn't start right away. We want
// to pretend like there are two operations in the queue before kicking things off
mScheduler.mCurrentOperation = new BiometricSchedulerOperation(
mock(BaseClientMonitor.class), mock(BaseClientMonitor.Callback.class));
mock(BaseClientMonitor.class), mock(ClientMonitorCallback.class));
mScheduler.scheduleClientMonitor(client1, callback1);
assertEquals(1, mScheduler.mPendingOperations.size());
@@ -187,7 +187,7 @@ public class BiometricSchedulerTest {
final HalClientMonitor.LazyDaemon<Object> lazyDaemon1 = () -> mock(Object.class);
final TestAuthenticationClient client1 = new TestAuthenticationClient(mContext,
lazyDaemon1, mToken, mock(ClientMonitorCallbackConverter.class));
final BaseClientMonitor.Callback callback1 = mock(BaseClientMonitor.Callback.class);
final ClientMonitorCallback callback1 = mock(ClientMonitorCallback.class);
// Schedule a BiometricPrompt authentication request
mScheduler.scheduleClientMonitor(client1, callback1);
@@ -628,7 +628,7 @@ public class BiometricSchedulerTest {
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
assertFalse(mStarted);
mStarted = true;

View File

@@ -17,36 +17,62 @@
package com.android.server.biometrics.sensors;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.SmallTest;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.Arrays;
import java.util.Collections;
import java.util.Objects;
@Presubmit
@SmallTest
public class CompositeCallbackTest {
@Mock
private BaseClientMonitor mClientMonitor;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testNullCallback() {
BaseClientMonitor.Callback callback1 = mock(BaseClientMonitor.Callback.class);
BaseClientMonitor.Callback callback2 = mock(BaseClientMonitor.Callback.class);
BaseClientMonitor.Callback callback3 = null;
public void testCallbacks() {
testCallbacks(mock(ClientMonitorCallback.class), mock(ClientMonitorCallback.class));
}
BaseClientMonitor.CompositeCallback callback = new BaseClientMonitor.CompositeCallback(
callback1, callback2, callback3);
@Test
public void testNullCallbacks() {
testCallbacks(null, mock(ClientMonitorCallback.class),
null, mock(ClientMonitorCallback.class));
}
BaseClientMonitor clientMonitor = mock(BaseClientMonitor.class);
private void testCallbacks(ClientMonitorCallback... callbacks) {
final ClientMonitorCallback[] expected = Arrays.stream(callbacks)
.filter(Objects::nonNull).toArray(ClientMonitorCallback[]::new);
callback.onClientStarted(clientMonitor);
verify(callback1).onClientStarted(eq(clientMonitor));
verify(callback2).onClientStarted(eq(clientMonitor));
ClientMonitorCompositeCallback callback = new ClientMonitorCompositeCallback(callbacks);
callback.onClientFinished(clientMonitor, true /* success */);
verify(callback1).onClientFinished(eq(clientMonitor), eq(true));
verify(callback2).onClientFinished(eq(clientMonitor), eq(true));
callback.onClientStarted(mClientMonitor);
final InOrder order = inOrder(expected);
for (ClientMonitorCallback cb : expected) {
order.verify(cb).onClientStarted(eq(mClientMonitor));
}
callback.onClientFinished(mClientMonitor, true /* success */);
Collections.reverse(Arrays.asList(expected));
for (ClientMonitorCallback cb : expected) {
order.verify(cb).onClientFinished(eq(mClientMonitor), eq(true));
}
}
}

View File

@@ -155,7 +155,7 @@ public class UserAwareBiometricSchedulerTest {
assertNull(mScheduler.mCurrentOperation);
final BiometricSchedulerOperation fakeOperation = new BiometricSchedulerOperation(
mock(BaseClientMonitor.class), new BaseClientMonitor.Callback() {});
mock(BaseClientMonitor.class), new ClientMonitorCallback() {});
mScheduler.mCurrentOperation = fakeOperation;
startUserClient.mCallback.onClientFinished(startUserClient, true);
assertSame(fakeOperation, mScheduler.mCurrentOperation);
@@ -234,7 +234,7 @@ public class UserAwareBiometricSchedulerTest {
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
onUserStopped();
}
@@ -248,7 +248,7 @@ public class UserAwareBiometricSchedulerTest {
private static class TestStartUserClient extends StartUserClient<Object, Object> {
private final boolean mShouldFinish;
Callback mCallback;
ClientMonitorCallback mCallback;
public TestStartUserClient(@NonNull Context context,
@NonNull LazyDaemon<Object> lazyDaemon, @Nullable IBinder token, int userId,
@@ -263,7 +263,7 @@ public class UserAwareBiometricSchedulerTest {
}
@Override
public void start(@NonNull Callback callback) {
public void start(@NonNull ClientMonitorCallback callback) {
super.start(callback);
mCallback = callback;

View File

@@ -34,7 +34,7 @@ import android.platform.test.annotations.Presubmit;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.filters.SmallTest;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import org.junit.Before;
@@ -61,7 +61,7 @@ public class FaceGenerateChallengeClientTest {
@Mock
private IFaceServiceReceiver mOtherReceiver;
@Mock
private BaseClientMonitor.Callback mMonitorCallback;
private ClientMonitorCallback mMonitorCallback;
private FaceGenerateChallengeClient mClient;