diff --git a/core/java/android/hardware/fingerprint/FingerprintStateListener.java b/core/java/android/hardware/fingerprint/FingerprintStateListener.java new file mode 100644 index 0000000000000..6e607a269cb26 --- /dev/null +++ b/core/java/android/hardware/fingerprint/FingerprintStateListener.java @@ -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); +} diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl index 469e87e2390ac..4bb3ab6e1bc6d 100644 --- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl +++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl @@ -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); } diff --git a/core/java/android/hardware/fingerprint/IFingerprintStateListener.aidl b/core/java/android/hardware/fingerprint/IFingerprintStateListener.aidl new file mode 100644 index 0000000000000..a4d34afcfcf40 --- /dev/null +++ b/core/java/android/hardware/fingerprint/IFingerprintStateListener.aidl @@ -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); +} diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java index cc27127ac58f4..f8a2156ce238a 100644 --- a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java +++ b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java @@ -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) { diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java index cbef6609873eb..deb251bc4853e 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java @@ -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 mServiceProviders; + @NonNull private final FingerprintStateCallback mFingerprintStateCallback; + @NonNull private @FingerprintStateListener.State int mFingerprintState; + + private List 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 diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java index c09d2d37de445..e610448028e93 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java @@ -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); } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java index 1c88d67cc96cc..66bd73c516550 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java @@ -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 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 diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java index 9851ae08ac3ad..f1e37e0dc6c23 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java @@ -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 diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java index 8be664e78f10e..49c454fcfaec1 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java @@ -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() { diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java index 766a8829e9682..4ff6a8fda0064 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java @@ -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 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 diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java index fd7ef0920f656..ed681c950dd59 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java @@ -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); } } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java index 90c4b4ab5b654..48419c35e28ec 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java @@ -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 */); } }