Merge "Configures FingerprintService to use FingerprintStateCallback to notify clients of fingerprint sensor state changes" into sc-dev

This commit is contained in:
Grace Cheng
2021-04-22 00:55:18 +00:00
committed by Android (Google) Code Review
12 changed files with 229 additions and 32 deletions

View File

@@ -0,0 +1,53 @@
/*
* Copyright (C) 2021 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 android.hardware.fingerprint;
import android.annotation.IntDef;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* Interface for handling state changes in fingerprint-related events.
* @hide
*/
public abstract class FingerprintStateListener extends IFingerprintStateListener.Stub {
// Operation has not started yet.
public static final int STATE_IDLE = 0;
// Enrollment is in progress.
public static final int STATE_ENROLLING = 1;
// Lockscreen authentication in progress.
public static final int STATE_KEYGUARD_AUTH = 2;
// BiometricPrompt authentication in progress.
public static final int STATE_BP_AUTH = 3;
// Other Authentication State
public static final int STATE_AUTH_OTHER = 4;
@IntDef({STATE_IDLE, STATE_ENROLLING, STATE_KEYGUARD_AUTH, STATE_BP_AUTH, STATE_AUTH_OTHER})
@Retention(RetentionPolicy.SOURCE)
public @interface State {}
/**
* Defines behavior in response to state update
* @param newState new state of fingerprint sensor
*/
public abstract void onStateChanged(@FingerprintStateListener.State int newState);
}

View File

@@ -22,6 +22,7 @@ import android.hardware.biometrics.ITestSession;
import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.fingerprint.IFingerprintClientActiveCallback;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
import android.hardware.fingerprint.IFingerprintStateListener;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
@@ -154,4 +155,7 @@ interface IFingerprintService {
// Sets the controller for managing the UDFPS overlay.
void setUdfpsOverlayController(in IUdfpsOverlayController controller);
// Registers FingerprintStateListener in list stored by FingerprintService
void registerFingerprintStateListener(IFingerprintStateListener listener);
}

View File

@@ -0,0 +1,27 @@
/*
* Copyright (C) 2014 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 android.hardware.fingerprint;
import android.hardware.fingerprint.Fingerprint;
/**
* Communication channel for FingerprintManager to register the FingerprintStateListener
* in FingerprintService
* @hide
*/
oneway interface IFingerprintStateListener {
void onStateChanged(int newState);
}

View File

@@ -471,8 +471,7 @@ public class BiometricScheduler {
* Adds a {@link BaseClientMonitor} to the pending queue
*
* @param clientMonitor operation to be scheduled
* @param clientCallback optional callback, invoked when the client is finished, but
* before it has been removed from the queue.
* @param clientCallback optional callback, invoked when the client state changes
*/
public void scheduleClientMonitor(@NonNull BaseClientMonitor clientMonitor,
@Nullable BaseClientMonitor.Callback clientCallback) {

View File

@@ -29,6 +29,11 @@ import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPR
import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_USER_CANCELED;
import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_VENDOR;
import static android.hardware.biometrics.SensorProperties.STRENGTH_STRONG;
import static android.hardware.fingerprint.FingerprintStateListener.STATE_AUTH_OTHER;
import static android.hardware.fingerprint.FingerprintStateListener.STATE_BP_AUTH;
import static android.hardware.fingerprint.FingerprintStateListener.STATE_ENROLLING;
import static android.hardware.fingerprint.FingerprintStateListener.STATE_IDLE;
import static android.hardware.fingerprint.FingerprintStateListener.STATE_KEYGUARD_AUTH;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -50,9 +55,11 @@ import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.FingerprintServiceReceiver;
import android.hardware.fingerprint.FingerprintStateListener;
import android.hardware.fingerprint.IFingerprintClientActiveCallback;
import android.hardware.fingerprint.IFingerprintService;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
import android.hardware.fingerprint.IFingerprintStateListener;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.Binder;
import android.os.Build;
@@ -75,6 +82,8 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.server.ServiceThread;
import com.android.server.SystemService;
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.BiometricServiceCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
@@ -82,6 +91,7 @@ import com.android.server.biometrics.sensors.LockoutTracker;
import com.android.server.biometrics.sensors.fingerprint.aidl.FingerprintProvider;
import com.android.server.biometrics.sensors.fingerprint.hidl.Fingerprint21;
import com.android.server.biometrics.sensors.fingerprint.hidl.Fingerprint21UdfpsMock;
import com.android.server.biometrics.sensors.fingerprint.hidl.FingerprintEnrollClient;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -105,6 +115,62 @@ public class FingerprintService extends SystemService implements BiometricServic
private final LockPatternUtils mLockPatternUtils;
private final FingerprintServiceWrapper mServiceWrapper;
@NonNull private List<ServiceProvider> mServiceProviders;
@NonNull private final FingerprintStateCallback mFingerprintStateCallback;
@NonNull private @FingerprintStateListener.State int mFingerprintState;
private List<IFingerprintStateListener> mFingerprintStateListeners = new ArrayList<>();
/** Callback to receive notifications about changes in fingerprint state. */
public final class FingerprintStateCallback implements BaseClientMonitor.Callback {
@Override
public void onClientStarted(@NonNull BaseClientMonitor client) {
final int previousFingerprintState = mFingerprintState;
if (client instanceof AuthenticationClient) {
AuthenticationClient authClient = (AuthenticationClient) client;
if (authClient.isKeyguard()) {
mFingerprintState = STATE_KEYGUARD_AUTH;
} else if (authClient.isBiometricPrompt()) {
mFingerprintState = STATE_BP_AUTH;
} else {
mFingerprintState = STATE_AUTH_OTHER;
}
} else if (client instanceof FingerprintEnrollClient) {
mFingerprintState = STATE_ENROLLING;
} else {
Slog.w(TAG, "Other authentication client: " + Utils.getClientName(client));
mFingerprintState = STATE_IDLE;
}
Slog.d(TAG, "Fps state updated from " + previousFingerprintState + " to "
+ mFingerprintState + ", client " + client);
notifyFingerprintStateListeners(mFingerprintState);
}
@Override
public void onClientFinished(@NonNull BaseClientMonitor client, boolean success) {
mFingerprintState = STATE_IDLE;
Slog.d(TAG, "Client finished, fps state updated to " + mFingerprintState
+ ", client " + client);
notifyFingerprintStateListeners(mFingerprintState);
}
private void notifyFingerprintStateListeners(@FingerprintStateListener.State int newState) {
for (IFingerprintStateListener listener : mFingerprintStateListeners) {
try {
listener.onStateChanged(newState);
} catch (RemoteException e) {
Slog.e(TAG, "Remote exception in fingerprint state change", e);
}
}
}
}
/**
* Registers FingerprintStateListener in list stored by FingerprintService
* @param listener new FingerprintStateListener being added
*/
public void registerFingerprintStateListener(IFingerprintStateListener listener) {
mFingerprintStateListeners.add(listener);
}
/**
* Receives the incoming binder calls from FingerprintManager.
@@ -122,7 +188,8 @@ public class FingerprintService extends SystemService implements BiometricServic
return null;
}
return provider.createTestSession(sensorId, callback, opPackageName);
return provider.createTestSession(sensorId, callback, mFingerprintStateCallback,
opPackageName);
}
@Override
@@ -205,7 +272,7 @@ public class FingerprintService extends SystemService implements BiometricServic
}
provider.second.scheduleEnroll(provider.first, token, hardwareAuthToken, userId,
receiver, opPackageName, enrollReason);
receiver, opPackageName, enrollReason, mFingerprintStateCallback);
}
@Override // Binder call
@@ -284,7 +351,7 @@ public class FingerprintService extends SystemService implements BiometricServic
} else {
provider.second.scheduleAuthenticate(provider.first, token, operationId, userId,
0 /* cookie */, new ClientMonitorCallbackConverter(receiver), opPackageName,
restricted, statsClient, isKeyguard);
restricted, statsClient, isKeyguard, mFingerprintStateCallback);
}
}
@@ -393,7 +460,7 @@ public class FingerprintService extends SystemService implements BiometricServic
provider.second.scheduleFingerDetect(provider.first, token, userId,
new ClientMonitorCallbackConverter(receiver), opPackageName,
BiometricsProtoEnums.CLIENT_KEYGUARD);
BiometricsProtoEnums.CLIENT_KEYGUARD, mFingerprintStateCallback);
}
@Override // Binder call
@@ -411,7 +478,8 @@ public class FingerprintService extends SystemService implements BiometricServic
final boolean restricted = true; // BiometricPrompt is always restricted
provider.scheduleAuthenticate(sensorId, token, operationId, userId, cookie,
new ClientMonitorCallbackConverter(sensorReceiver), opPackageName, restricted,
BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, allowBackgroundAuthentication);
BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, allowBackgroundAuthentication,
mFingerprintStateCallback);
}
@Override // Binder call
@@ -568,6 +636,7 @@ public class FingerprintService extends SystemService implements BiometricServic
: provider.getSensorProperties()) {
pw.println("Dumping for sensorId: " + props.sensorId
+ ", provider: " + provider.getClass().getSimpleName());
pw.println("Fps state: " + mFingerprintState);
provider.dumpInternal(props.sensorId, pw);
pw.println();
}
@@ -813,6 +882,11 @@ public class FingerprintService extends SystemService implements BiometricServic
provider.setUdfpsOverlayController(controller);
}
}
@Override
public void registerFingerprintStateListener(@NonNull IFingerprintStateListener listener) {
FingerprintService.this.registerFingerprintStateListener(listener);
}
}
public FingerprintService(Context context) {
@@ -823,6 +897,8 @@ public class FingerprintService extends SystemService implements BiometricServic
mLockoutResetDispatcher = new LockoutResetDispatcher(context);
mLockPatternUtils = new LockPatternUtils(context);
mServiceProviders = new ArrayList<>();
mFingerprintStateCallback = new FingerprintStateCallback();
mFingerprintState = STATE_IDLE;
}
@Override

View File

@@ -86,18 +86,21 @@ public interface ServiceProvider {
void scheduleEnroll(int sensorId, @NonNull IBinder token, byte[] hardwareAuthToken, int userId,
@NonNull IFingerprintServiceReceiver receiver, @NonNull String opPackageName,
@FingerprintManager.EnrollReason int enrollReason);
@FingerprintManager.EnrollReason int enrollReason,
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback);
void cancelEnrollment(int sensorId, @NonNull IBinder token);
void scheduleFingerDetect(int sensorId, @NonNull IBinder token, int userId,
@NonNull ClientMonitorCallbackConverter callback, @NonNull String opPackageName,
int statsClient);
int statsClient,
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback);
void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, int userId,
int cookie, @NonNull ClientMonitorCallbackConverter callback,
@NonNull String opPackageName, boolean restricted, int statsClient,
boolean allowBackgroundAuthentication);
boolean allowBackgroundAuthentication,
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback);
void startPreparedClient(int sensorId, int cookie);
@@ -148,5 +151,6 @@ public interface ServiceProvider {
@NonNull
ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback,
@NonNull String opPackageName);
}

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.fingerprint.FingerprintService;
import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
import java.util.HashSet;
@@ -50,6 +51,7 @@ class BiometricTestSessionImpl extends ITestSession.Stub {
@NonNull private final Context mContext;
private final int mSensorId;
@NonNull private final ITestSessionCallback mCallback;
@NonNull private final FingerprintService.FingerprintStateCallback mFingerprintStateCallback;
@NonNull private final FingerprintProvider mProvider;
@NonNull private final Sensor mSensor;
@NonNull private final Set<Integer> mEnrollmentIds;
@@ -114,11 +116,14 @@ class BiometricTestSessionImpl extends ITestSession.Stub {
};
BiometricTestSessionImpl(@NonNull Context context, int sensorId,
@NonNull ITestSessionCallback callback, @NonNull FingerprintProvider provider,
@NonNull ITestSessionCallback callback,
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback,
@NonNull FingerprintProvider provider,
@NonNull Sensor sensor) {
mContext = context;
mSensorId = sensorId;
mCallback = callback;
mFingerprintStateCallback = fingerprintStateCallback;
mProvider = provider;
mSensor = sensor;
mEnrollmentIds = new HashSet<>();
@@ -138,7 +143,8 @@ class BiometricTestSessionImpl extends ITestSession.Stub {
Utils.checkPermission(mContext, TEST_BIOMETRIC);
mProvider.scheduleEnroll(mSensorId, new Binder(), new byte[69], userId, mReceiver,
mContext.getOpPackageName(), FingerprintManager.ENROLL_ENROLL);
mContext.getOpPackageName(), FingerprintManager.ENROLL_ENROLL,
mFingerprintStateCallback);
}
@Override

View File

@@ -55,6 +55,7 @@ import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.InvalidationRequesterClient;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
import com.android.server.biometrics.sensors.PerformanceTracker;
import com.android.server.biometrics.sensors.fingerprint.FingerprintService;
import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
import com.android.server.biometrics.sensors.fingerprint.GestureAvailabilityDispatcher;
import com.android.server.biometrics.sensors.fingerprint.ServiceProvider;
@@ -318,7 +319,8 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
@Override
public void scheduleEnroll(int sensorId, @NonNull IBinder token, byte[] hardwareAuthToken,
int userId, @NonNull IFingerprintServiceReceiver receiver,
@NonNull String opPackageName, @FingerprintManager.EnrollReason int enrollReason) {
@NonNull String opPackageName, @FingerprintManager.EnrollReason int enrollReason,
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback) {
mHandler.post(() -> {
final int maxTemplatesPerUser = mSensors.get(sensorId).getSensorProperties()
.maxEnrollmentsPerUser;
@@ -328,9 +330,16 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
opPackageName, FingerprintUtils.getInstance(sensorId), sensorId,
mUdfpsOverlayController, maxTemplatesPerUser, enrollReason);
scheduleForSensor(sensorId, client, new BaseClientMonitor.Callback() {
@Override
public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
fingerprintStateCallback.onClientStarted(clientMonitor);
}
@Override
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
boolean success) {
fingerprintStateCallback.onClientFinished(clientMonitor, success);
if (success) {
scheduleLoadAuthenticatorIdsForUser(sensorId, userId);
scheduleInvalidationRequest(sensorId, userId);
@@ -348,14 +357,15 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
@Override
public void scheduleFingerDetect(int sensorId, @NonNull IBinder token, int userId,
@NonNull ClientMonitorCallbackConverter callback, @NonNull String opPackageName,
int statsClient) {
int statsClient,
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback) {
mHandler.post(() -> {
final boolean isStrongBiometric = Utils.isStrongBiometric(sensorId);
final FingerprintDetectClient client = new FingerprintDetectClient(mContext,
mSensors.get(sensorId).getLazySession(), token, callback, userId,
opPackageName, sensorId, mUdfpsOverlayController, isStrongBiometric,
statsClient);
scheduleForSensor(sensorId, client);
scheduleForSensor(sensorId, client, fingerprintStateCallback);
});
}
@@ -363,7 +373,8 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
public void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId,
int userId, int cookie, @NonNull ClientMonitorCallbackConverter callback,
@NonNull String opPackageName, boolean restricted, int statsClient,
boolean allowBackgroundAuthentication) {
boolean allowBackgroundAuthentication,
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback) {
mHandler.post(() -> {
final boolean isStrongBiometric = Utils.isStrongBiometric(sensorId);
final FingerprintAuthenticationClient client = new FingerprintAuthenticationClient(
@@ -372,7 +383,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
false /* requireConfirmation */, sensorId, isStrongBiometric, statsClient,
mTaskStackListener, mSensors.get(sensorId).getLockoutCache(),
mUdfpsOverlayController, allowBackgroundAuthentication);
scheduleForSensor(sensorId, client);
scheduleForSensor(sensorId, client, fingerprintStateCallback);
});
}
@@ -561,8 +572,9 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
@NonNull
@Override
public ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback,
@NonNull String opPackageName) {
return mSensors.get(sensorId).createTestSession(callback);
return mSensors.get(sensorId).createTestSession(callback, fingerprintStateCallback);
}
@Override

View File

@@ -52,13 +52,13 @@ import com.android.server.biometrics.sensors.BiometricScheduler;
import com.android.server.biometrics.sensors.EnumerateConsumer;
import com.android.server.biometrics.sensors.ErrorConsumer;
import com.android.server.biometrics.sensors.HalClientMonitor;
import com.android.server.biometrics.sensors.Interruptable;
import com.android.server.biometrics.sensors.LockoutCache;
import com.android.server.biometrics.sensors.LockoutConsumer;
import com.android.server.biometrics.sensors.RemovalConsumer;
import com.android.server.biometrics.sensors.StartUserClient;
import com.android.server.biometrics.sensors.StopUserClient;
import com.android.server.biometrics.sensors.UserAwareBiometricScheduler;
import com.android.server.biometrics.sensors.fingerprint.FingerprintService;
import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
import com.android.server.biometrics.sensors.fingerprint.GestureAvailabilityDispatcher;
@@ -486,9 +486,10 @@ class Sensor {
}
}
@NonNull ITestSession createTestSession(@NonNull ITestSessionCallback callback) {
@NonNull ITestSession createTestSession(@NonNull ITestSessionCallback callback,
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback) {
return new BiometricTestSessionImpl(mContext, mSensorProperties.sensorId, callback,
mProvider, this);
fingerprintStateCallback, mProvider, this);
}
@NonNull BiometricScheduler getScheduler() {

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.fingerprint.FingerprintService;
import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
import java.util.ArrayList;
@@ -51,6 +52,7 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
@NonNull private final Context mContext;
private final int mSensorId;
@NonNull private final ITestSessionCallback mCallback;
@NonNull private final FingerprintService.FingerprintStateCallback mFingerprintStateCallback;
@NonNull private final Fingerprint21 mFingerprint21;
@NonNull private final Fingerprint21.HalResultController mHalResultController;
@NonNull private final Set<Integer> mEnrollmentIds;
@@ -116,12 +118,14 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
BiometricTestSessionImpl(@NonNull Context context, int sensorId,
@NonNull ITestSessionCallback callback,
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback,
@NonNull Fingerprint21 fingerprint21,
@NonNull Fingerprint21.HalResultController halResultController) {
mContext = context;
mSensorId = sensorId;
mCallback = callback;
mFingerprint21 = fingerprint21;
mFingerprintStateCallback = fingerprintStateCallback;
mHalResultController = halResultController;
mEnrollmentIds = new HashSet<>();
mRandom = new Random();
@@ -139,7 +143,8 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
Utils.checkPermission(mContext, TEST_BIOMETRIC);
mFingerprint21.scheduleEnroll(mSensorId, new Binder(), new byte[69], userId, mReceiver,
mContext.getOpPackageName(), FingerprintManager.ENROLL_ENROLL);
mContext.getOpPackageName(), FingerprintManager.ENROLL_ENROLL,
mFingerprintStateCallback);
}
@Override

View File

@@ -70,11 +70,11 @@ import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.EnumerateConsumer;
import com.android.server.biometrics.sensors.ErrorConsumer;
import com.android.server.biometrics.sensors.HalClientMonitor;
import com.android.server.biometrics.sensors.Interruptable;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
import com.android.server.biometrics.sensors.LockoutTracker;
import com.android.server.biometrics.sensors.PerformanceTracker;
import com.android.server.biometrics.sensors.RemovalConsumer;
import com.android.server.biometrics.sensors.fingerprint.FingerprintService;
import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
import com.android.server.biometrics.sensors.fingerprint.GestureAvailabilityDispatcher;
import com.android.server.biometrics.sensors.fingerprint.ServiceProvider;
@@ -120,7 +120,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
private int mCurrentUserId = UserHandle.USER_NULL;
private final boolean mIsUdfps;
private final int mSensorId;
private boolean mIsPowerbuttonFps;
private final boolean mIsPowerbuttonFps;
private final class BiometricTaskStackListener extends TaskStackListener {
@Override
@@ -573,7 +573,8 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
public void scheduleEnroll(int sensorId, @NonNull IBinder token,
@NonNull byte[] hardwareAuthToken, int userId,
@NonNull IFingerprintServiceReceiver receiver, @NonNull String opPackageName,
@FingerprintManager.EnrollReason int enrollReason) {
@FingerprintManager.EnrollReason int enrollReason,
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback) {
mHandler.post(() -> {
scheduleUpdateActiveUserWithoutHandler(userId);
@@ -583,9 +584,15 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
ENROLL_TIMEOUT_SEC, mSensorProperties.sensorId, mUdfpsOverlayController,
enrollReason);
mScheduler.scheduleClientMonitor(client, new BaseClientMonitor.Callback() {
@Override
public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
fingerprintStateCallback.onClientStarted(clientMonitor);
}
@Override
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
boolean success) {
fingerprintStateCallback.onClientFinished(clientMonitor, success);
if (success) {
// Update authenticatorIds
scheduleUpdateActiveUserWithoutHandler(clientMonitor.getTargetUserId(),
@@ -606,7 +613,8 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
@Override
public void scheduleFingerDetect(int sensorId, @NonNull IBinder token, int userId,
@NonNull ClientMonitorCallbackConverter listener, @NonNull String opPackageName,
int statsClient) {
int statsClient,
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback) {
mHandler.post(() -> {
scheduleUpdateActiveUserWithoutHandler(userId);
@@ -615,7 +623,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
mLazyDaemon, token, listener, userId, opPackageName,
mSensorProperties.sensorId, mUdfpsOverlayController, isStrongBiometric,
statsClient);
mScheduler.scheduleClientMonitor(client);
mScheduler.scheduleClientMonitor(client, fingerprintStateCallback);
});
}
@@ -623,7 +631,8 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
public void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId,
int userId, int cookie, @NonNull ClientMonitorCallbackConverter listener,
@NonNull String opPackageName, boolean restricted, int statsClient,
boolean allowBackgroundAuthentication) {
boolean allowBackgroundAuthentication,
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback) {
mHandler.post(() -> {
scheduleUpdateActiveUserWithoutHandler(userId);
@@ -634,7 +643,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
mSensorProperties.sensorId, isStrongBiometric, statsClient,
mTaskStackListener, mLockoutTracker, mUdfpsOverlayController,
allowBackgroundAuthentication);
mScheduler.scheduleClientMonitor(client);
mScheduler.scheduleClientMonitor(client, fingerprintStateCallback);
});
}
@@ -887,8 +896,9 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
@NonNull
@Override
public ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback,
@NonNull String opPackageName) {
return new BiometricTestSessionImpl(mContext, mSensorProperties.sensorId, callback, this,
mHalResultController);
return new BiometricTestSessionImpl(mContext, mSensorProperties.sensorId, callback,
fingerprintStateCallback, this, mHalResultController);
}
}

View File

@@ -402,7 +402,7 @@ public class Fingerprint21UdfpsMock extends Fingerprint21 implements TrustManage
// internal preemption logic is not run.
mFingerprint21.scheduleAuthenticate(mFingerprint21.mSensorProperties.sensorId, token,
operationId, user, cookie, listener, opPackageName, restricted, statsClient,
isKeyguard);
isKeyguard, null /* fingerprintStateCallback */);
}
}