summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/hardware/biometrics/BiometricManager.java31
-rw-r--r--core/java/android/hardware/biometrics/IAuthService.aidl4
-rw-r--r--core/java/android/hardware/biometrics/IBiometricAuthenticator.aidl4
-rw-r--r--core/java/android/hardware/biometrics/IBiometricService.aidl4
-rw-r--r--core/proto/android/server/biometrics.proto7
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/ModeSwitchesController.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationAnimationController.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java5
-rw-r--r--services/core/java/com/android/server/biometrics/AuthService.java14
-rw-r--r--services/core/java/com/android/server/biometrics/BiometricService.java51
-rw-r--r--services/core/java/com/android/server/biometrics/Utils.java3
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java10
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java7
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java14
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java5
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java7
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java14
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java5
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java5
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