Loading core/java/android/hardware/fingerprint/FingerprintStateListener.java 0 → 100644 +53 −0 Original line number Diff line number Diff line /* * 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); } core/java/android/hardware/fingerprint/IFingerprintService.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } core/java/android/hardware/fingerprint/IFingerprintStateListener.aidl 0 → 100644 +27 −0 Original line number Diff line number Diff line /* * 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); } services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java +1 −2 Original line number Diff line number Diff line Loading @@ -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) { Loading services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java +81 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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. Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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); } } Loading Loading @@ -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 Loading @@ -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 Loading Loading @@ -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(); } Loading Loading @@ -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) { Loading @@ -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 Loading Loading
core/java/android/hardware/fingerprint/FingerprintStateListener.java 0 → 100644 +53 −0 Original line number Diff line number Diff line /* * 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); }
core/java/android/hardware/fingerprint/IFingerprintService.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); }
core/java/android/hardware/fingerprint/IFingerprintStateListener.aidl 0 → 100644 +27 −0 Original line number Diff line number Diff line /* * 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); }
services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java +1 −2 Original line number Diff line number Diff line Loading @@ -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) { Loading
services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java +81 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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. Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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); } } Loading Loading @@ -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 Loading @@ -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 Loading Loading @@ -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(); } Loading Loading @@ -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) { Loading @@ -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 Loading