diff options
21 files changed, 201 insertions, 15 deletions
diff --git a/core/java/android/hardware/biometrics/BiometricManager.java b/core/java/android/hardware/biometrics/BiometricManager.java index 1fdce5e773b1..acfad1354ccf 100644 --- a/core/java/android/hardware/biometrics/BiometricManager.java +++ b/core/java/android/hardware/biometrics/BiometricManager.java @@ -29,6 +29,7 @@ import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.TestApi; import android.content.Context; +import android.os.IBinder; import android.os.RemoteException; import android.security.keystore.KeyProperties; import android.util.Slog; @@ -410,6 +411,36 @@ public class BiometricManager { } /** + * Requests all other biometric sensors to resetLockout. Note that this is a "time bound" + * See the {@link android.hardware.biometrics.fingerprint.ISession#resetLockout(int, + * HardwareAuthToken)} and {@link android.hardware.biometrics.face.ISession#resetLockout(int, + * HardwareAuthToken)} documentation for complete details. + * + * @param token A binder from the caller, for the service to linkToDeath + * @param opPackageName Caller's package name + * @param fromSensorId The originating sensor that just authenticated. Note that this MUST + * be a sensor that meets {@link Authenticators#BIOMETRIC_STRONG} strength. + * The strength will also be enforced on the BiometricService side. + * @param userId The user that authentication succeeded for, and also the user that resetLockout + * should be applied to. + * @param hardwareAuthToken A valid HAT generated upon successful biometric authentication. Note + * that it is not necessary for the HAT to contain a challenge. + * @hide + */ + @RequiresPermission(USE_BIOMETRIC_INTERNAL) + public void resetLockoutTimeBound(IBinder token, String opPackageName, int fromSensorId, + int userId, byte[] hardwareAuthToken) { + if (mService != null) { + try { + mService.resetLockoutTimeBound(token, opPackageName, fromSensorId, userId, + hardwareAuthToken); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + } + + /** * Provides a localized string that may be used as the label for a button that invokes * {@link BiometricPrompt}. * diff --git a/core/java/android/hardware/biometrics/IAuthService.aidl b/core/java/android/hardware/biometrics/IAuthService.aidl index 1472bb940be5..86df0994a222 100644 --- a/core/java/android/hardware/biometrics/IAuthService.aidl +++ b/core/java/android/hardware/biometrics/IAuthService.aidl @@ -69,6 +69,10 @@ interface IAuthService { // land as SIDs, and are used during key generation. long[] getAuthenticatorIds(); + // See documentation in BiometricManager. + void resetLockoutTimeBound(IBinder token, String opPackageName, int fromSensorId, int userId, + in byte[] hardwareAuthToken); + // Provides a localized string that may be used as the label for a button that invokes // BiometricPrompt. CharSequence getButtonLabel(int userId, String opPackageName, int authenticators); diff --git a/core/java/android/hardware/biometrics/IBiometricAuthenticator.aidl b/core/java/android/hardware/biometrics/IBiometricAuthenticator.aidl index 7639c5dd4d16..059bf2622b00 100644 --- a/core/java/android/hardware/biometrics/IBiometricAuthenticator.aidl +++ b/core/java/android/hardware/biometrics/IBiometricAuthenticator.aidl @@ -70,4 +70,8 @@ interface IBiometricAuthenticator { // Gets the authenticator ID representing the current set of enrolled templates long getAuthenticatorId(int callingUserId); + + // Requests the sensor to reset its lockout state + void resetLockout(IBinder token, String opPackageName, int userId, + in byte[] hardwareAuthToken); } diff --git a/core/java/android/hardware/biometrics/IBiometricService.aidl b/core/java/android/hardware/biometrics/IBiometricService.aidl index 6d8bf0fb5543..64b51183a170 100644 --- a/core/java/android/hardware/biometrics/IBiometricService.aidl +++ b/core/java/android/hardware/biometrics/IBiometricService.aidl @@ -74,6 +74,10 @@ interface IBiometricService { // land as SIDs, and are used during key generation. long[] getAuthenticatorIds(int callingUserId); + // See documentation in BiometricManager. + void resetLockoutTimeBound(IBinder token, String opPackageName, int fromSensorId, int userId, + in byte[] hardwareAuthToken); + int getCurrentStrength(int sensorId); // Returns a bit field of the modality (or modalities) that are will be used for authentication. diff --git a/core/proto/android/server/biometrics.proto b/core/proto/android/server/biometrics.proto index 900235ea65fb..bbb0edd4fd59 100644 --- a/core/proto/android/server/biometrics.proto +++ b/core/proto/android/server/biometrics.proto @@ -125,6 +125,13 @@ message SensorStateProto { // User states for this sensor. repeated UserStateProto user_states = 4; + + // True if resetLockout requires a HAT to be verified in the TEE or equivalent. + optional bool reset_lockout_requires_hardware_auth_token = 5; + + // True if a HAT is required (field above) AND a challenge needs to be generated by the + // biometric TEE (or equivalent), and wrapped within the HAT. + optional bool reset_lockout_requires_challenge = 6; } // State of a specific user for a specific sensor. diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java index c1cf8d31bd67..9f77b7d26c96 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java @@ -19,6 +19,7 @@ package com.android.systemui.accessibility; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; import android.annotation.NonNull; +import android.annotation.UiContext; import android.content.Context; import android.content.pm.ActivityInfo; import android.graphics.PixelFormat; @@ -69,7 +70,7 @@ class MagnificationModeSwitch implements MagnificationGestureDetector.OnGestureL private final MagnificationGestureDetector mGestureDetector; private boolean mSingleTapDetected = false; - MagnificationModeSwitch(Context context) { + MagnificationModeSwitch(@UiContext Context context) { this(context, createView(context)); } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/ModeSwitchesController.java b/packages/SystemUI/src/com/android/systemui/accessibility/ModeSwitchesController.java index 50f6e9f6af44..1a01ad85fccc 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/ModeSwitchesController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/ModeSwitchesController.java @@ -16,6 +16,8 @@ package com.android.systemui.accessibility; +import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY; + import android.annotation.MainThread; import android.content.Context; import android.hardware.display.DisplayManager; @@ -106,10 +108,9 @@ public class ModeSwitchesController { @Override protected MagnificationModeSwitch createInstance(Display display) { - final Context context = (display.getDisplayId() == Display.DEFAULT_DISPLAY) - ? mContext - : mContext.createDisplayContext(display); - return new MagnificationModeSwitch(context); + final Context uiContext = mContext.createWindowContext(display, + TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY, /* options */ null); + return new MagnificationModeSwitch(uiContext); } } } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java index f52dcd596a55..cdd69429132a 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java @@ -16,6 +16,8 @@ package com.android.systemui.accessibility; +import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY; + import android.annotation.MainThread; import android.annotation.Nullable; import android.content.Context; @@ -82,9 +84,8 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall @Override protected WindowMagnificationAnimationController createInstance(Display display) { - final Context context = (display.getDisplayId() == Display.DEFAULT_DISPLAY) - ? mContext - : mContext.createDisplayContext(display); + final Context windowContext = mContext.createWindowContext(display, + TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY, /* options */ null); final WindowMagnificationController controller = new WindowMagnificationController( mContext, mHandler, new SfVsyncFrameCallbackProvider(), null, @@ -92,7 +93,7 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall final int navBarMode = mNavigationModeController.addListener( controller::onNavigationModeChanged); controller.onNavigationModeChanged(navBarMode); - return new WindowMagnificationAnimationController(context, controller); + return new WindowMagnificationAnimationController(windowContext, controller); } } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationAnimationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationAnimationController.java index 24d83884f093..5758b1575f5a 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationAnimationController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationAnimationController.java @@ -20,6 +20,7 @@ import android.animation.Animator; import android.animation.ValueAnimator; import android.annotation.IntDef; import android.annotation.Nullable; +import android.annotation.UiContext; import android.content.Context; import android.content.res.Resources; import android.os.RemoteException; @@ -69,8 +70,8 @@ class WindowMagnificationAnimationController implements ValueAnimator.AnimatorUp @MagnificationState private int mState = STATE_DISABLED; - WindowMagnificationAnimationController( - Context context, WindowMagnificationController controller) { + WindowMagnificationAnimationController(@UiContext Context context, + WindowMagnificationController controller) { this(context, controller, newValueAnimator(context.getResources())); } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java index 3f7d2d837e2d..2b666f13efcc 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java @@ -24,6 +24,7 @@ import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.UiContext; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.res.Resources; @@ -134,7 +135,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold @Nullable private MirrorWindowControl mMirrorWindowControl; - WindowMagnificationController(Context context, @NonNull Handler handler, + WindowMagnificationController(@UiContext Context context, @NonNull Handler handler, SfVsyncFrameCallbackProvider sfVsyncFrameProvider, MirrorWindowControl mirrorWindowControl, SurfaceControl.Transaction transaction, @NonNull WindowMagnifierCallback callback) { @@ -147,7 +148,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold mDisplayId = mContext.getDisplayId(); mRotation = display.getRotation(); - mWm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + mWm = context.getSystemService(WindowManager.class); mResources = mContext.getResources(); mScale = mResources.getInteger(R.integer.magnification_default_scale); diff --git a/services/core/java/com/android/server/biometrics/AuthService.java b/services/core/java/com/android/server/biometrics/AuthService.java index 285f3185abc2..5b9fa7922e9d 100644 --- a/services/core/java/com/android/server/biometrics/AuthService.java +++ b/services/core/java/com/android/server/biometrics/AuthService.java @@ -340,6 +340,20 @@ public class AuthService extends SystemService { } @Override + public void resetLockoutTimeBound(IBinder token, String opPackageName, int fromSensorId, + int userId, byte[] hardwareAuthToken) throws RemoteException { + checkInternalPermission(); + + final long identity = Binder.clearCallingIdentity(); + try { + mBiometricService.resetLockoutTimeBound(token, opPackageName, fromSensorId, userId, + hardwareAuthToken); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + @Override public CharSequence getButtonLabel( int userId, String opPackageName, diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java index a88820988ef7..63e7b4b84366 100644 --- a/services/core/java/com/android/server/biometrics/BiometricService.java +++ b/services/core/java/com/android/server/biometrics/BiometricService.java @@ -754,7 +754,7 @@ public class BiometricService extends SystemService { } } - @Override + @Override // Binder call public void invalidateAuthenticatorIds(int userId, int fromSensorId, IInvalidationCallback callback) { checkInternalPermission(); @@ -790,6 +790,45 @@ public class BiometricService extends SystemService { } @Override // Binder call + public void resetLockoutTimeBound(IBinder token, String opPackageName, int fromSensorId, + int userId, byte[] hardwareAuthToken) { + checkInternalPermission(); + + // Check originating strength + if (!Utils.isAtLeastStrength(getSensorForId(fromSensorId).getCurrentStrength(), + Authenticators.BIOMETRIC_STRONG)) { + Slog.w(TAG, "Sensor: " + fromSensorId + " is does not meet the required strength to" + + " request resetLockout"); + return; + } + + // Request resetLockout for applicable sensors + for (BiometricSensor sensor : mSensors) { + if (sensor.id == fromSensorId) { + continue; + } + try { + final SensorPropertiesInternal props = sensor.impl + .getSensorProperties(getContext().getOpPackageName()); + final boolean supportsChallengelessHat = + props.resetLockoutRequiresHardwareAuthToken + && !props.resetLockoutRequiresChallenge; + final boolean doesNotRequireHat = !props.resetLockoutRequiresHardwareAuthToken; + + if (supportsChallengelessHat || doesNotRequireHat) { + Slog.d(TAG, "resetLockout from: " + fromSensorId + + ", for: " + sensor.id + + ", userId: " + userId); + sensor.impl.resetLockout(token, opPackageName, userId, + hardwareAuthToken); + } + } catch (RemoteException e) { + Slog.e(TAG, "Remote exception", e); + } + } + } + + @Override // Binder call public int getCurrentStrength(int sensorId) { checkInternalPermission(); @@ -1294,6 +1333,16 @@ public class BiometricService extends SystemService { } } + @Nullable + private BiometricSensor getSensorForId(int sensorId) { + for (BiometricSensor sensor : mSensors) { + if (sensor.id == sensorId) { + return sensor; + } + } + return null; + } + private void dumpInternal(PrintWriter pw) { pw.println("Sensors:"); for (BiometricSensor sensor : mSensors) { diff --git a/services/core/java/com/android/server/biometrics/Utils.java b/services/core/java/com/android/server/biometrics/Utils.java index d9e21a83e45a..f4cb38738f7e 100644 --- a/services/core/java/com/android/server/biometrics/Utils.java +++ b/services/core/java/com/android/server/biometrics/Utils.java @@ -176,7 +176,8 @@ public class Utils { * @param requestedStrength the strength that it must meet * @return true only if the sensor is at least as strong as the requested strength */ - public static boolean isAtLeastStrength(int sensorStrength, int requestedStrength) { + public static boolean isAtLeastStrength(@Authenticators.Types int sensorStrength, + @Authenticators.Types int requestedStrength) { // Clear out any bits that are not reserved for biometric sensorStrength &= Authenticators.BIOMETRIC_MIN_STRENGTH; diff --git a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java index b31a54b8b15e..9617bb09e153 100644 --- a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java @@ -26,6 +26,7 @@ import android.content.Context; import android.content.pm.ApplicationInfo; import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricConstants; +import android.hardware.biometrics.BiometricManager; import android.hardware.biometrics.BiometricsProtoEnums; import android.os.IBinder; import android.os.RemoteException; @@ -50,6 +51,7 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T> private final boolean mIsStrongBiometric; private final boolean mRequireConfirmation; private final ActivityTaskManager mActivityTaskManager; + private final BiometricManager mBiometricManager; @Nullable private final TaskStackListener mTaskStackListener; private final LockoutTracker mLockoutTracker; private final boolean mIsRestricted; @@ -73,6 +75,7 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T> mOperationId = operationId; mRequireConfirmation = requireConfirmation; mActivityTaskManager = ActivityTaskManager.getInstance(); + mBiometricManager = context.getSystemService(BiometricManager.class); mTaskStackListener = taskStackListener; mLockoutTracker = lockoutTracker; mIsRestricted = restricted; @@ -207,6 +210,13 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T> for (int i = 0; i < hardwareAuthToken.size(); i++) { byteToken[i] = hardwareAuthToken.get(i); } + + if (mIsStrongBiometric) { + mBiometricManager.resetLockoutTimeBound(getToken(), + getContext().getOpPackageName(), + getSensorId(), getTargetUserId(), byteToken); + } + if (isBiometricPrompt() && listener != null) { // BiometricService will add the token to keystore listener.onAuthenticationSucceeded(getSensorId(), identifier, byteToken, diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java index 06b049be4501..2926260321f1 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java @@ -104,4 +104,11 @@ public final class FaceAuthenticator extends IBiometricAuthenticator.Stub { public long getAuthenticatorId(int callingUserId) throws RemoteException { return mFaceService.getAuthenticatorId(mSensorId, callingUserId); } + + @Override + public void resetLockout(IBinder token, String opPackageName, int userId, + byte[] hardwareAuthToken) throws RemoteException { + mFaceService.resetLockout(token, mSensorId, userId, hardwareAuthToken, + opPackageName); + } } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java index 3434acbf73cc..c7d2f0f87b6c 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java @@ -495,6 +495,15 @@ public class Sensor { Slog.w(mTag, "setTestHalEnabled: " + enabled); if (enabled != mTestHalEnabled) { // The framework should retrieve a new session from the HAL. + try { + if (mCurrentSession != null && mCurrentSession.mSession != null) { + // TODO(181984005): This should be scheduled instead of directly invoked + Slog.d(mTag, "Closing old session"); + mCurrentSession.mSession.close(888 /* cookie */); + } + } catch (RemoteException e) { + Slog.e(mTag, "RemoteException", e); + } mCurrentSession = null; } mTestHalEnabled = enabled; @@ -519,6 +528,11 @@ public class Sensor { proto.end(userToken); } + proto.write(SensorStateProto.RESET_LOCKOUT_REQUIRES_HARDWARE_AUTH_TOKEN, + mSensorProperties.resetLockoutRequiresHardwareAuthToken); + proto.write(SensorStateProto.RESET_LOCKOUT_REQUIRES_CHALLENGE, + mSensorProperties.resetLockoutRequiresChallenge); + proto.end(sensorToken); } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java index afe7f24edeaf..40c050f4838b 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java @@ -798,6 +798,11 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider { proto.end(userToken); } + proto.write(SensorStateProto.RESET_LOCKOUT_REQUIRES_HARDWARE_AUTH_TOKEN, + mSensorProperties.resetLockoutRequiresHardwareAuthToken); + proto.write(SensorStateProto.RESET_LOCKOUT_REQUIRES_CHALLENGE, + mSensorProperties.resetLockoutRequiresChallenge); + proto.end(sensorToken); } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java index 32e9409de4b2..9e82ffcfadc6 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java @@ -105,4 +105,11 @@ public final class FingerprintAuthenticator extends IBiometricAuthenticator.Stub public long getAuthenticatorId(int callingUserId) throws RemoteException { return mFingerprintService.getAuthenticatorId(mSensorId, callingUserId); } + + @Override + public void resetLockout(IBinder token, String opPackageName, int userId, + byte[] hardwareAuthToken) throws RemoteException { + mFingerprintService.resetLockout(token, mSensorId, userId, hardwareAuthToken, + opPackageName); + } } 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 a98e7db43f79..b9dee7d1e321 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 @@ -475,6 +475,15 @@ class Sensor { Slog.w(mTag, "setTestHalEnabled: " + enabled); if (enabled != mTestHalEnabled) { // The framework should retrieve a new session from the HAL. + try { + if (mCurrentSession != null && mCurrentSession.mSession != null) { + // TODO(181984005): This should be scheduled instead of directly invoked + Slog.d(mTag, "Closing old session"); + mCurrentSession.mSession.close(999 /* cookie */); + } + } catch (RemoteException e) { + Slog.e(mTag, "RemoteException", e); + } mCurrentSession = null; } mTestHalEnabled = enabled; @@ -499,6 +508,11 @@ class Sensor { proto.end(userToken); } + proto.write(SensorStateProto.RESET_LOCKOUT_REQUIRES_HARDWARE_AUTH_TOKEN, + mSensorProperties.resetLockoutRequiresHardwareAuthToken); + proto.write(SensorStateProto.RESET_LOCKOUT_REQUIRES_CHALLENGE, + mSensorProperties.resetLockoutRequiresChallenge); + proto.end(sensorToken); } 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 7ff5ec305b88..e737677a7f53 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 @@ -761,6 +761,11 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider proto.end(userToken); } + proto.write(SensorStateProto.RESET_LOCKOUT_REQUIRES_HARDWARE_AUTH_TOKEN, + mSensorProperties.resetLockoutRequiresHardwareAuthToken); + proto.write(SensorStateProto.RESET_LOCKOUT_REQUIRES_CHALLENGE, + mSensorProperties.resetLockoutRequiresChallenge); + proto.end(sensorToken); } diff --git a/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java index f44e0691bb9d..95915b7809f3 100644 --- a/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java +++ b/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java @@ -95,4 +95,9 @@ public final class IrisAuthenticator extends IBiometricAuthenticator.Stub { public long getAuthenticatorId(int callingUserId) throws RemoteException { return 0; } + + @Override + public void resetLockout(IBinder token, String opPackageName, int userId, + byte[] hardwareAuthToken) throws RemoteException { + } }
\ No newline at end of file |