From 907910685fe099cffdc77e8689b41d005bc87de5 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Fri, 8 Jan 2021 14:18:13 -0800 Subject: [PATCH] 1/n: Add ClientMonitors for authenticatorId invalidation InvalidationRequesterClient (for requesting other clients to invalidate) will be fully implemented in subsequent CL's. InvalidationClient (for requesting HALs to invalidate authenticatorId) should be complete at this point. Also updates BiometricUtils to persist a "invalidationInProgress" flag on-disk for each pair. Bug: 159667191 Test: No effect on existing devices Test: Existing enrollments not affected Change-Id: I9eeb802b556ba86568cf41b456a4ceab4b896ef0 --- .../biometrics/sensors/AcquisitionClient.java | 4 +- .../sensors/AuthenticationClient.java | 3 +- .../sensors/BiometricUserState.java | 63 ++++++++++++-- .../biometrics/sensors/BiometricUtils.java | 2 + .../biometrics/sensors/ClientMonitor.java | 4 +- .../biometrics/sensors/EnrollClient.java | 4 +- .../sensors/GenerateChallengeClient.java | 2 +- .../sensors/InternalCleanupClient.java | 3 +- .../sensors/InternalEnumerateClient.java | 2 +- .../sensors/InvalidationClient.java | 58 +++++++++++++ .../sensors/InvalidationRequesterClient.java | 86 +++++++++++++++++++ .../biometrics/sensors/LoggableMonitor.java | 11 +-- .../biometrics/sensors/RemovalClient.java | 2 +- .../sensors/RevokeChallengeClient.java | 3 +- .../sensors/face/FaceUserState.java | 53 +++--------- .../biometrics/sensors/face/FaceUtils.java | 11 ++- .../sensors/face/aidl/FaceEnrollClient.java | 2 +- .../aidl/FaceGetAuthenticatorIdClient.java | 3 +- .../face/aidl/FaceInvalidationClient.java | 48 +++++++++++ .../face/aidl/FaceResetLockoutClient.java | 3 +- .../sensors/face/hidl/FaceEnrollClient.java | 2 +- .../face/hidl/FaceGetFeatureClient.java | 2 +- .../face/hidl/FaceResetLockoutClient.java | 3 +- .../face/hidl/FaceSetFeatureClient.java | 2 +- .../face/hidl/FaceUpdateActiveUserClient.java | 3 +- .../fingerprint/FingerprintUserState.java | 55 ++++-------- .../sensors/fingerprint/FingerprintUtils.java | 10 +++ .../aidl/FingerprintDetectClient.java | 2 +- .../aidl/FingerprintEnrollClient.java | 3 +- .../FingerprintGetAuthenticatorIdClient.java | 3 +- .../aidl/FingerprintInvalidationClient.java | 47 ++++++++++ .../aidl/FingerprintResetLockoutClient.java | 3 +- .../hidl/FingerprintDetectClient.java | 2 +- .../hidl/FingerprintEnrollClient.java | 3 +- .../FingerprintUpdateActiveUserClient.java | 3 +- .../sensors/BiometricSchedulerTest.java | 2 +- 36 files changed, 381 insertions(+), 131 deletions(-) create mode 100644 services/core/java/com/android/server/biometrics/sensors/InvalidationClient.java create mode 100644 services/core/java/com/android/server/biometrics/sensors/InvalidationRequesterClient.java create mode 100644 services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInvalidationClient.java create mode 100644 services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInvalidationClient.java diff --git a/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java b/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java index 493c68862567f..9898d76761784 100644 --- a/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java @@ -56,9 +56,9 @@ public abstract class AcquisitionClient extends ClientMonitor implements I public AcquisitionClient(@NonNull Context context, @NonNull LazyDaemon lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull String owner, int cookie, int sensorId, int statsModality, - int statsAction, int statsClient, boolean shouldLogMetrics) { + int statsAction, int statsClient) { super(context, lazyDaemon, token, listener, userId, owner, cookie, sensorId, statsModality, - statsAction, statsClient, shouldLogMetrics); + statsAction, statsClient); mPowerManager = context.getSystemService(PowerManager.class); mSuccessVibrationEffect = VibrationEffect.get(VibrationEffect.EFFECT_CLICK); mErrorVibrationEffect = VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK); 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 52923283f22c9..5663495db037c 100644 --- a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java @@ -66,8 +66,7 @@ public abstract class AuthenticationClient extends AcquisitionClient int statsModality, int statsClient, @Nullable TaskStackListener taskStackListener, @NonNull LockoutTracker lockoutTracker) { super(context, lazyDaemon, token, listener, targetUserId, owner, cookie, sensorId, - statsModality, BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient, - true /* shouldLogMetrics */); + statsModality, BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient); mIsStrongBiometric = isStrongBiometric; mOperationId = operationId; mRequireConfirmation = requireConfirmation; diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricUserState.java b/services/core/java/com/android/server/biometrics/sensors/BiometricUserState.java index d588b8d4aa13e..49cddaaf5ef8d 100644 --- a/services/core/java/com/android/server/biometrics/sensors/BiometricUserState.java +++ b/services/core/java/com/android/server/biometrics/sensors/BiometricUserState.java @@ -21,8 +21,10 @@ import android.content.Context; import android.hardware.biometrics.BiometricAuthenticator; import android.os.AsyncTask; import android.os.Environment; +import android.util.AtomicFile; import android.util.Slog; import android.util.TypedXmlPullParser; +import android.util.TypedXmlSerializer; import android.util.Xml; import com.android.internal.annotations.GuardedBy; @@ -35,6 +37,7 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -46,17 +49,16 @@ import java.util.List; public abstract class BiometricUserState { private static final String TAG = "UserState"; + private static final String TAG_INVALIDATION = "authenticatorIdInvalidation_tag"; + private static final String ATTR_INVALIDATION = "authenticatorIdInvalidation_attr"; + @GuardedBy("this") protected final ArrayList mBiometrics = new ArrayList<>(); + protected boolean mInvalidationInProgress; protected final Context mContext; protected final File mFile; - private final Runnable mWriteStateRunnable = new Runnable() { - @Override - public void run() { - doWriteState(); - } - }; + private final Runnable mWriteStateRunnable = this::doWriteStateInternal; /** * @return The tag for the biometrics. There may be multiple instances of a biometric within. @@ -73,10 +75,40 @@ public abstract class BiometricUserState getCopy(ArrayList array); + protected abstract void doWriteState(@NonNull TypedXmlSerializer serializer) throws Exception; + /** - * @return Writes the cached data to persistent storage. + * @Writes the cached data to persistent storage. */ - protected abstract void doWriteState(); + private void doWriteStateInternal() { + AtomicFile destination = new AtomicFile(mFile); + + FileOutputStream out = null; + + try { + out = destination.startWrite(); + TypedXmlSerializer serializer = Xml.resolveSerializer(out); + serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); + serializer.startDocument(null, true); + + // Store the authenticatorId + serializer.startTag(null, TAG_INVALIDATION); + serializer.attributeBoolean(null, ATTR_INVALIDATION, mInvalidationInProgress); + serializer.endTag(null, TAG_INVALIDATION); + + // Do any additional serialization that subclasses may require + doWriteState(serializer); + + serializer.endDocument(); + destination.finishWrite(out); + } catch (Throwable t) { + Slog.wtf(TAG, "Failed to write settings, restoring backup", t); + destination.failWrite(out); + throw new IllegalStateException("Failed to write to file: " + mFile.toString(), t); + } finally { + IoUtils.closeQuietly(out); + } + } /** * @return @@ -93,6 +125,19 @@ public abstract class BiometricUserState { void removeBiometricForUser(Context context, int userId, int biometricId); void renameBiometricForUser(Context context, int userId, int biometricId, CharSequence name); CharSequence getUniqueName(Context context, int userId); + void setInvalidationInProgress(Context context, int userId, boolean inProgress); + boolean isInvalidationInProgress(Context context, int userId); } \ No newline at end of file diff --git a/services/core/java/com/android/server/biometrics/sensors/ClientMonitor.java b/services/core/java/com/android/server/biometrics/sensors/ClientMonitor.java index 27c2dd069dce7..bbd652357888e 100644 --- a/services/core/java/com/android/server/biometrics/sensors/ClientMonitor.java +++ b/services/core/java/com/android/server/biometrics/sensors/ClientMonitor.java @@ -105,8 +105,8 @@ public abstract class ClientMonitor extends LoggableMonitor implements IBinde public ClientMonitor(@NonNull Context context, @NonNull LazyDaemon lazyDaemon, @Nullable IBinder token, @Nullable ClientMonitorCallbackConverter listener, int userId, @NonNull String owner, int cookie, int sensorId, int statsModality, int statsAction, - int statsClient, boolean shouldLogMetrics) { - super(statsModality, statsAction, statsClient, shouldLogMetrics); + int statsClient) { + super(statsModality, statsAction, statsClient); mSequentialId = sCount++; mContext = context; mLazyDaemon = lazyDaemon; diff --git a/services/core/java/com/android/server/biometrics/sensors/EnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/EnrollClient.java index fbe3d8469d81d..8bf9680d60cd1 100644 --- a/services/core/java/com/android/server/biometrics/sensors/EnrollClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/EnrollClient.java @@ -49,10 +49,10 @@ public abstract class EnrollClient extends AcquisitionClient { @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull byte[] hardwareAuthToken, @NonNull String owner, @NonNull BiometricUtils utils, int timeoutSec, int statsModality, int sensorId, - boolean shouldVibrate, boolean shouldLogMetrics) { + boolean shouldVibrate) { super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId, statsModality, BiometricsProtoEnums.ACTION_ENROLL, - BiometricsProtoEnums.CLIENT_UNKNOWN, shouldLogMetrics); + BiometricsProtoEnums.CLIENT_UNKNOWN); mBiometricUtils = utils; mHardwareAuthToken = Arrays.copyOf(hardwareAuthToken, hardwareAuthToken.length); mTimeoutSec = timeoutSec; diff --git a/services/core/java/com/android/server/biometrics/sensors/GenerateChallengeClient.java b/services/core/java/com/android/server/biometrics/sensors/GenerateChallengeClient.java index f6a1040f6a7b1..bac944fca1de4 100644 --- a/services/core/java/com/android/server/biometrics/sensors/GenerateChallengeClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/GenerateChallengeClient.java @@ -32,7 +32,7 @@ public abstract class GenerateChallengeClient extends ClientMonitor { @NonNull String owner, int sensorId) { super(context, lazyDaemon, token, listener, 0 /* userId */, owner, 0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN, - BiometricsProtoEnums.CLIENT_UNKNOWN, true /* shouldLogMetrics */); + BiometricsProtoEnums.CLIENT_UNKNOWN); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/InternalCleanupClient.java b/services/core/java/com/android/server/biometrics/sensors/InternalCleanupClient.java index e56e116f6e1de..e738d17f5f17d 100644 --- a/services/core/java/com/android/server/biometrics/sensors/InternalCleanupClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/InternalCleanupClient.java @@ -107,8 +107,7 @@ public abstract class InternalCleanupClient authenticatorIds) { super(context, lazyDaemon, null /* token */, null /* ClientMonitorCallbackConverter */, userId, owner, 0 /* cookie */, sensorId, statsModality, - BiometricsProtoEnums.ACTION_ENUMERATE, BiometricsProtoEnums.CLIENT_UNKNOWN, - true /* shouldLogMetrics */); + BiometricsProtoEnums.ACTION_ENUMERATE, BiometricsProtoEnums.CLIENT_UNKNOWN); mBiometricUtils = utils; mAuthenticatorIds = authenticatorIds; mEnrolledList = enrolledList; diff --git a/services/core/java/com/android/server/biometrics/sensors/InternalEnumerateClient.java b/services/core/java/com/android/server/biometrics/sensors/InternalEnumerateClient.java index 158b836c84cd0..e07f71298d139 100644 --- a/services/core/java/com/android/server/biometrics/sensors/InternalEnumerateClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/InternalEnumerateClient.java @@ -51,7 +51,7 @@ public abstract class InternalEnumerateClient extends ClientMonitor // is all done internally. super(context, lazyDaemon, token, null /* ClientMonitorCallbackConverter */, userId, owner, 0 /* cookie */, sensorId, statsModality, BiometricsProtoEnums.ACTION_ENUMERATE, - BiometricsProtoEnums.CLIENT_UNKNOWN, true /* shouldLogMetrics */); + BiometricsProtoEnums.CLIENT_UNKNOWN); mEnrolledList = enrolledList; mUtils = utils; } diff --git a/services/core/java/com/android/server/biometrics/sensors/InvalidationClient.java b/services/core/java/com/android/server/biometrics/sensors/InvalidationClient.java new file mode 100644 index 0000000000000..b8084d5135bf0 --- /dev/null +++ b/services/core/java/com/android/server/biometrics/sensors/InvalidationClient.java @@ -0,0 +1,58 @@ +/* + * 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 com.android.server.biometrics.sensors; + +import android.annotation.NonNull; +import android.content.Context; +import android.hardware.biometrics.BiometricAuthenticator; +import android.hardware.biometrics.BiometricsProtoEnums; + +/** + * ClientMonitor subclass for requesting authenticatorId invalidation. See + * {@link InvalidationRequesterClient} for more info. + */ +public abstract class InvalidationClient + extends ClientMonitor { + + private final BiometricUtils mUtils; + + public InvalidationClient(@NonNull Context context, @NonNull LazyDaemon lazyDaemon, + int userId, int sensorId, @NonNull BiometricUtils utils) { + super(context, lazyDaemon, null /* token */, null /* listener */, userId, + context.getOpPackageName(), 0 /* cookie */, sensorId, + BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN, + BiometricsProtoEnums.CLIENT_UNKNOWN); + mUtils = utils; + } + + public void onAuthenticatorIdInvalidated(long newAuthenticatorId) { + // TODO: Update framework w/ newAuthenticatorId + mCallback.onClientFinished(this, true /* success */); + } + + @Override + public void start(@NonNull Callback callback) { + super.start(callback); + + startHalOperation(); + } + + @Override + public void unableToStart() { + + } +} diff --git a/services/core/java/com/android/server/biometrics/sensors/InvalidationRequesterClient.java b/services/core/java/com/android/server/biometrics/sensors/InvalidationRequesterClient.java new file mode 100644 index 0000000000000..ca34eee17f7f2 --- /dev/null +++ b/services/core/java/com/android/server/biometrics/sensors/InvalidationRequesterClient.java @@ -0,0 +1,86 @@ +/* + * 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 com.android.server.biometrics.sensors; + +import android.annotation.NonNull; +import android.content.Context; +import android.hardware.biometrics.BiometricManager; +import android.hardware.biometrics.BiometricsProtoEnums; + +/** + * ClientMonitor subclass responsible for coordination of authenticatorId invalidation of other + * sensors. See {@link InvalidationClient} for the ClientMonitor subclass responsible for initiating + * the invalidation with individual HALs. AuthenticatorId invalidation is required on devices with + * multiple strong biometric sensors. + * + * The public Keystore and Biometric APIs are biometric-tied, not modality-tied, meaning that keys + * are unlockable by "any/all strong biometrics on the device", and not "only a specific strong + * sensor". The Keystore API allows for creation of biometric-tied keys that are invalidated upon + * new biometric enrollment. See + * {@link android.security.keystore.KeyGenParameterSpec.Builder#setInvalidatedByBiometricEnrollment} + * + * This has been supported on single-sensor devices by the various getAuthenticatorId APIs on the + * HIDL and AIDL biometric HAL interfaces, where: + * 1) authenticatorId is requested and stored during key generation + * 2) authenticatorId is contained within the HAT when biometric authentication succeeds + * 3) authenticatorId is automatically changed (below the framework) whenever a new biometric + * enrollment occurs. + * + * For multi-biometric devices, this will be done the following way: + * 1) New enrollment added for Sensor1. Sensor1's HAL/TEE updates its authenticatorId automatically + * when enrollment completes + * 2) Framework marks Sensor1 as "invalidationInProgress". See + * {@link BiometricUtils#setInvalidationInProgress(Context, int, boolean)} + * 3) After all other sensors have finished invalidation, the framework will clear the invalidation + * flag for Sensor1. + * 4) New keys that are generated will include all new authenticatorIds + * + * The above is robust to incomplete invalidation. For example, when system boots or after user + * switches, the framework can check if any sensor has the "invalidationInProgress" flag set. If so, + * the framework should re-start the invalidation process described above. + */ +public abstract class InvalidationRequesterClient extends ClientMonitor { + + private final BiometricManager mBiometricManager; + + public InvalidationRequesterClient(@NonNull Context context, @NonNull LazyDaemon lazyDaemon, + int userId, int sensorId) { + super(context, lazyDaemon, null /* token */, null /* listener */, userId, + context.getOpPackageName(), 0 /* cookie */, sensorId, + BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN, + BiometricsProtoEnums.CLIENT_UNKNOWN); + mBiometricManager = context.getSystemService(BiometricManager.class); + } + + @Override + public void start(@NonNull Callback callback) { + super.start(callback); + + // TODO(b/159667191): Request BiometricManager/BiometricService to invalidate + // authenticatorIds. Be sure to invoke BiometricUtils#setInvalidationInProgress(true) + } + + @Override + public void unableToStart() { + + } + + @Override + protected void startHalOperation() { + // No HAL operations necessary + } +} diff --git a/services/core/java/com/android/server/biometrics/sensors/LoggableMonitor.java b/services/core/java/com/android/server/biometrics/sensors/LoggableMonitor.java index 59e40da475786..3ca069100fbe0 100644 --- a/services/core/java/com/android/server/biometrics/sensors/LoggableMonitor.java +++ b/services/core/java/com/android/server/biometrics/sensors/LoggableMonitor.java @@ -38,7 +38,7 @@ public abstract class LoggableMonitor { private final int mStatsAction; private final int mStatsClient; private long mFirstAcquireTimeMs; - private boolean mShouldLogMetrics; + private boolean mShouldLogMetrics = true; /** * Only valid for AuthenticationClient. @@ -52,14 +52,15 @@ public abstract class LoggableMonitor { * @param statsModality One of {@link BiometricsProtoEnums} MODALITY_* constants. * @param statsAction One of {@link BiometricsProtoEnums} ACTION_* constants. * @param statsClient One of {@link BiometricsProtoEnums} CLIENT_* constants. - * @param shouldLogMetrics If set to false, metrics will not be reported to statsd. */ - public LoggableMonitor(int statsModality, int statsAction, int statsClient, - boolean shouldLogMetrics) { + public LoggableMonitor(int statsModality, int statsAction, int statsClient) { mStatsModality = statsModality; mStatsAction = statsAction; mStatsClient = statsClient; - mShouldLogMetrics = shouldLogMetrics; + } + + protected void setShouldLog(boolean shouldLog) { + mShouldLogMetrics = shouldLog; } public int getStatsClient() { diff --git a/services/core/java/com/android/server/biometrics/sensors/RemovalClient.java b/services/core/java/com/android/server/biometrics/sensors/RemovalClient.java index 22b57170e494f..f79abd59dbb40 100644 --- a/services/core/java/com/android/server/biometrics/sensors/RemovalClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/RemovalClient.java @@ -45,7 +45,7 @@ public abstract class RemovalClient authenticatorIds, int statsModality) { super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId, statsModality, BiometricsProtoEnums.ACTION_REMOVE, - BiometricsProtoEnums.CLIENT_UNKNOWN, true /* shouldLogMetrics */); + BiometricsProtoEnums.CLIENT_UNKNOWN); mBiometricId = biometricId; mBiometricUtils = utils; mAuthenticatorIds = authenticatorIds; diff --git a/services/core/java/com/android/server/biometrics/sensors/RevokeChallengeClient.java b/services/core/java/com/android/server/biometrics/sensors/RevokeChallengeClient.java index dcbd4b5d77685..5deb8fa26639e 100644 --- a/services/core/java/com/android/server/biometrics/sensors/RevokeChallengeClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/RevokeChallengeClient.java @@ -27,8 +27,7 @@ public abstract class RevokeChallengeClient extends ClientMonitor { @NonNull IBinder token, @NonNull String owner, int sensorId) { super(context, lazyDaemon, token, null /* listener */, 0 /* userId */, owner, 0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN, - BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN, - true /* shouldLogMetrics */); + BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceUserState.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceUserState.java index a26662dfd9708..a9981d0cfc206 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceUserState.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceUserState.java @@ -16,23 +16,18 @@ package com.android.server.biometrics.sensors.face; +import android.annotation.NonNull; import android.content.Context; import android.hardware.face.Face; -import android.util.AtomicFile; -import android.util.Slog; import android.util.TypedXmlPullParser; import android.util.TypedXmlSerializer; -import android.util.Xml; import com.android.internal.annotations.GuardedBy; import com.android.server.biometrics.sensors.BiometricUserState; -import libcore.io.IoUtils; - import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; -import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; @@ -75,46 +70,26 @@ public class FaceUserState extends BiometricUserState { } @Override - protected void doWriteState() { - AtomicFile destination = new AtomicFile(mFile); - - ArrayList faces; + protected void doWriteState(@NonNull TypedXmlSerializer serializer) throws Exception { + final ArrayList faces; synchronized (this) { faces = getCopy(mBiometrics); } - FileOutputStream out = null; - try { - out = destination.startWrite(); + serializer.startTag(null, TAG_FACES); - TypedXmlSerializer serializer = Xml.resolveSerializer(out); - serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); - serializer.startDocument(null, true); - serializer.startTag(null, TAG_FACES); - - final int count = faces.size(); - for (int i = 0; i < count; i++) { - Face f = faces.get(i); - serializer.startTag(null, TAG_FACE); - serializer.attributeInt(null, ATTR_FACE_ID, f.getBiometricId()); - serializer.attribute(null, ATTR_NAME, f.getName().toString()); - serializer.attributeLong(null, ATTR_DEVICE_ID, f.getDeviceId()); - serializer.endTag(null, TAG_FACE); - } - - serializer.endTag(null, TAG_FACES); - serializer.endDocument(); - destination.finishWrite(out); - - // Any error while writing is fatal. - } catch (Throwable t) { - Slog.wtf(TAG, "Failed to write settings, restoring backup", t); - destination.failWrite(out); - throw new IllegalStateException("Failed to write faces", t); - } finally { - IoUtils.closeQuietly(out); + final int count = faces.size(); + for (int i = 0; i < count; i++) { + Face f = faces.get(i); + serializer.startTag(null, TAG_FACE); + serializer.attributeInt(null, ATTR_FACE_ID, f.getBiometricId()); + serializer.attribute(null, ATTR_NAME, f.getName().toString()); + serializer.attributeLong(null, ATTR_DEVICE_ID, f.getDeviceId()); + serializer.endTag(null, TAG_FACE); } + + serializer.endTag(null, TAG_FACES); } @GuardedBy("this") diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceUtils.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceUtils.java index a0cd4a56ea128..c5744780cd71e 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceUtils.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceUtils.java @@ -18,7 +18,6 @@ package com.android.server.biometrics.sensors.face; import android.annotation.Nullable; import android.content.Context; -import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.face.Face; import android.text.TextUtils; import android.util.SparseArray; @@ -115,6 +114,16 @@ public class FaceUtils implements BiometricUtils { return getStateForUser(context, userId).getUniqueName(); } + @Override + public void setInvalidationInProgress(Context context, int userId, boolean inProgress) { + getStateForUser(context, userId).setInvalidationInProgress(inProgress); + } + + @Override + public boolean isInvalidationInProgress(Context context, int userId) { + return getStateForUser(context, userId).isInvalidationInProgress(); + } + private FaceUserState getStateForUser(Context ctx, int userId) { synchronized (this) { FaceUserState state = mUserStates.get(userId); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClient.java index 99b89e365b990..f09df1e1812e3 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClient.java @@ -62,7 +62,7 @@ public class FaceEnrollClient extends EnrollClient { @Nullable NativeHandle previewSurface, int sensorId, int maxTemplatesPerUser) { super(context, lazyDaemon, token, listener, userId, hardwareAuthToken, opPackageName, utils, timeoutSec, BiometricsProtoEnums.MODALITY_FACE, sensorId, - false /* shouldVibrate */, true /* shouldLogMetrics */); + false /* shouldVibrate */); mEnrollIgnoreList = getContext().getResources() .getIntArray(R.array.config_face_acquire_enroll_ignorelist); mEnrollIgnoreListVendor = getContext().getResources() diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetAuthenticatorIdClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetAuthenticatorIdClient.java index ce0bb4566ea35..c27b6e5a4b7d4 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetAuthenticatorIdClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetAuthenticatorIdClient.java @@ -38,8 +38,7 @@ class FaceGetAuthenticatorIdClient extends ClientMonitor { Map authenticatorIds) { super(context, lazyDaemon, null /* token */, null /* listener */, userId, opPackageName, 0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_FACE, - BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN, - true /* shouldLogMetrics */); + BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN); mAuthenticatorIds = authenticatorIds; } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInvalidationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInvalidationClient.java new file mode 100644 index 0000000000000..f512cef80d95d --- /dev/null +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInvalidationClient.java @@ -0,0 +1,48 @@ +/* + * 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 com.android.server.biometrics.sensors.face.aidl; + +import android.content.Context; +import android.hardware.biometrics.face.ISession; + +import android.annotation.NonNull; +import android.hardware.face.Face; +import android.os.RemoteException; +import android.util.Slog; + +import com.android.server.biometrics.sensors.InvalidationClient; +import com.android.server.biometrics.sensors.face.FaceUtils; + +public class FaceInvalidationClient extends InvalidationClient { + private static final String TAG = "FaceInvalidationClient"; + + public FaceInvalidationClient(@NonNull Context context, + @NonNull LazyDaemon lazyDaemon, int userId, int sensorId, + @NonNull FaceUtils utils) { + super(context, lazyDaemon, userId, sensorId, utils); + } + + @Override + protected void startHalOperation() { + try { + getFreshDaemon().invalidateAuthenticatorId(mSequentialId); + } catch (RemoteException e) { + Slog.e(TAG, "Remote exception", e); + mCallback.onClientFinished(this, false /* success */); + } + } +} diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceResetLockoutClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceResetLockoutClient.java index 500099522d0bd..5b1f5465ea0a4 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceResetLockoutClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceResetLockoutClient.java @@ -50,8 +50,7 @@ public class FaceResetLockoutClient extends ClientMonitor { @NonNull LockoutResetDispatcher lockoutResetDispatcher) { super(context, lazyDaemon, null /* token */, null /* listener */, userId, owner, 0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN, - BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN, - true /* shouldLogMetrics */); + BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN); mHardwareAuthToken = HardwareAuthTokenUtils.toHardwareAuthToken(hardwareAuthToken); mLockoutCache = lockoutTracker; mLockoutResetDispatcher = lockoutResetDispatcher; diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceEnrollClient.java index bc1eace3c9f74..1a7544fc7f015 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceEnrollClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceEnrollClient.java @@ -59,7 +59,7 @@ public class FaceEnrollClient extends EnrollClient { @Nullable NativeHandle surfaceHandle, int sensorId) { super(context, lazyDaemon, token, listener, userId, hardwareAuthToken, owner, utils, timeoutSec, BiometricsProtoEnums.MODALITY_FACE, sensorId, - false /* shouldVibrate */, true /* shouldLogMetrics */); + false /* shouldVibrate */); mDisabledFeatures = Arrays.copyOf(disabledFeatures, disabledFeatures.length); mSurfaceHandle = surfaceHandle; mEnrollIgnoreList = getContext().getResources() diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceGetFeatureClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceGetFeatureClient.java index 3758774e8d136..e25bb812caa63 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceGetFeatureClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceGetFeatureClient.java @@ -47,7 +47,7 @@ public class FaceGetFeatureClient extends ClientMonitor { @NonNull String owner, int sensorId, int feature, int faceId) { super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN, - BiometricsProtoEnums.CLIENT_UNKNOWN, true /* shouldLogMetrics */); + BiometricsProtoEnums.CLIENT_UNKNOWN); mFeature = feature; mFaceId = faceId; diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceResetLockoutClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceResetLockoutClient.java index 06808e0c30da2..8df9b9f305de0 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceResetLockoutClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceResetLockoutClient.java @@ -42,8 +42,7 @@ public class FaceResetLockoutClient extends ClientMonitor { @NonNull byte[] hardwareAuthToken) { super(context, lazyDaemon, null /* token */, null /* listener */, userId, owner, 0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN, - BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN, - true /* shouldLogMetrics */); + BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN); mHardwareAuthToken = new ArrayList<>(); for (byte b : hardwareAuthToken) { diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceSetFeatureClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceSetFeatureClient.java index b2db6c7d24bcb..0e2072823684b 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceSetFeatureClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceSetFeatureClient.java @@ -49,7 +49,7 @@ public class FaceSetFeatureClient extends ClientMonitor { byte[] hardwareAuthToken, int faceId) { super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN, - BiometricsProtoEnums.CLIENT_UNKNOWN, true /* shouldLogMetrics */); + BiometricsProtoEnums.CLIENT_UNKNOWN); mFeature = feature; mEnabled = enabled; mFaceId = faceId; diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceUpdateActiveUserClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceUpdateActiveUserClient.java index c9d2cd378c3a2..22275e5f9d326 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceUpdateActiveUserClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceUpdateActiveUserClient.java @@ -43,8 +43,7 @@ public class FaceUpdateActiveUserClient extends ClientMonitor { @NonNull Map authenticatorIds) { super(context, lazyDaemon, null /* token */, null /* listener */, userId, owner, 0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN, - BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN, - true /* shouldLogMetrics */); + BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN); mCurrentUserId = currentUserId; mHasEnrolledBiometrics = hasEnrolledBIometrics; mAuthenticatorIds = authenticatorIds; diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintUserState.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintUserState.java index 671e08bd8c563..ae173f7bf7e39 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintUserState.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintUserState.java @@ -16,23 +16,18 @@ package com.android.server.biometrics.sensors.fingerprint; +import android.annotation.NonNull; import android.content.Context; import android.hardware.fingerprint.Fingerprint; -import android.util.AtomicFile; -import android.util.Slog; import android.util.TypedXmlPullParser; import android.util.TypedXmlSerializer; -import android.util.Xml; import com.android.internal.annotations.GuardedBy; import com.android.server.biometrics.sensors.BiometricUserState; -import libcore.io.IoUtils; - import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; -import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; @@ -76,47 +71,27 @@ public class FingerprintUserState extends BiometricUserState { } @Override - protected void doWriteState() { - AtomicFile destination = new AtomicFile(mFile); - - ArrayList fingerprints; + protected void doWriteState(@NonNull TypedXmlSerializer serializer) throws Exception { + final ArrayList fingerprints; synchronized (this) { fingerprints = getCopy(mBiometrics); } - FileOutputStream out = null; - try { - out = destination.startWrite(); + serializer.startTag(null, TAG_FINGERPRINTS); - TypedXmlSerializer serializer = Xml.resolveSerializer(out); - serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); - serializer.startDocument(null, true); - serializer.startTag(null, TAG_FINGERPRINTS); - - final int count = fingerprints.size(); - for (int i = 0; i < count; i++) { - Fingerprint fp = fingerprints.get(i); - serializer.startTag(null, TAG_FINGERPRINT); - serializer.attributeInt(null, ATTR_FINGER_ID, fp.getBiometricId()); - serializer.attribute(null, ATTR_NAME, fp.getName().toString()); - serializer.attributeInt(null, ATTR_GROUP_ID, fp.getGroupId()); - serializer.attributeLong(null, ATTR_DEVICE_ID, fp.getDeviceId()); - serializer.endTag(null, TAG_FINGERPRINT); - } - - serializer.endTag(null, TAG_FINGERPRINTS); - serializer.endDocument(); - destination.finishWrite(out); - - // Any error while writing is fatal. - } catch (Throwable t) { - Slog.wtf(TAG, "Failed to write settings, restoring backup", t); - destination.failWrite(out); - throw new IllegalStateException("Failed to write fingerprints", t); - } finally { - IoUtils.closeQuietly(out); + final int count = fingerprints.size(); + for (int i = 0; i < count; i++) { + Fingerprint fp = fingerprints.get(i); + serializer.startTag(null, TAG_FINGERPRINT); + serializer.attributeInt(null, ATTR_FINGER_ID, fp.getBiometricId()); + serializer.attribute(null, ATTR_NAME, fp.getName().toString()); + serializer.attributeInt(null, ATTR_GROUP_ID, fp.getGroupId()); + serializer.attributeLong(null, ATTR_DEVICE_ID, fp.getDeviceId()); + serializer.endTag(null, TAG_FINGERPRINT); } + + serializer.endTag(null, TAG_FINGERPRINTS); } @GuardedBy("this") diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintUtils.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintUtils.java index b3d2419901e4f..dc6fd3a1b26de 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintUtils.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintUtils.java @@ -118,6 +118,16 @@ public class FingerprintUtils implements BiometricUtils { return getStateForUser(context, userId).getUniqueName(); } + @Override + public void setInvalidationInProgress(Context context, int userId, boolean inProgress) { + getStateForUser(context, userId).setInvalidationInProgress(inProgress); + } + + @Override + public boolean isInvalidationInProgress(Context context, int userId) { + return getStateForUser(context, userId).isInvalidationInProgress(); + } + private FingerprintUserState getStateForUser(Context ctx, int userId) { synchronized (this) { FingerprintUserState state = mUserStates.get(userId); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java index 483ca5ddec3f1..339832373b745 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java @@ -51,7 +51,7 @@ class FingerprintDetectClient extends AcquisitionClient { int statsClient) { super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_FINGERPRINT, BiometricsProtoEnums.ACTION_AUTHENTICATE, - statsClient, true /* shouldLogMetrics */); + statsClient); mIsStrongBiometric = isStrongBiometric; mUdfpsOverlayController = udfpsOverlayController; } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java index b4f705405fa98..ab59abd25b7d2 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java @@ -55,9 +55,10 @@ class FingerprintEnrollClient extends EnrollClient implements Udfps { boolean shouldLogMetrics) { super(context, lazyDaemon, token, listener, userId, hardwareAuthToken, owner, utils, 0 /* timeoutSec */, BiometricsProtoEnums.MODALITY_FINGERPRINT, sensorId, - true /* shouldVibrate */, shouldLogMetrics); + true /* shouldVibrate */); mUdfpsOverlayController = udfpsOvelayController; mMaxTemplatesPerUser = maxTemplatesPerUser; + setShouldLog(shouldLogMetrics); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGetAuthenticatorIdClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGetAuthenticatorIdClient.java index b30cc1a5f50a4..2ad1fa306781b 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGetAuthenticatorIdClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGetAuthenticatorIdClient.java @@ -38,8 +38,7 @@ class FingerprintGetAuthenticatorIdClient extends ClientMonitor { int sensorId, Map authenticatorIds) { super(context, lazyDaemon, null /* token */, null /* listener */, userId, owner, 0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_FINGERPRINT, - BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN, - true /* shouldLogMetrics */); + BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN); mAuthenticatorIds = authenticatorIds; } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInvalidationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInvalidationClient.java new file mode 100644 index 0000000000000..b6d8892c4874d --- /dev/null +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInvalidationClient.java @@ -0,0 +1,47 @@ +/* + * 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 com.android.server.biometrics.sensors.fingerprint.aidl; + +import android.annotation.NonNull; +import android.content.Context; +import android.hardware.biometrics.fingerprint.ISession; +import android.hardware.fingerprint.Fingerprint; +import android.os.RemoteException; +import android.util.Slog; + +import com.android.server.biometrics.sensors.InvalidationClient; +import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils; + +public class FingerprintInvalidationClient extends InvalidationClient { + private static final String TAG = "FingerprintInvalidationClient"; + + public FingerprintInvalidationClient(@NonNull Context context, + @NonNull LazyDaemon lazyDaemon, int userId, int sensorId, + @NonNull FingerprintUtils utils) { + super(context, lazyDaemon, userId, sensorId, utils); + } + + @Override + protected void startHalOperation() { + try { + getFreshDaemon().invalidateAuthenticatorId(mSequentialId); + } catch (RemoteException e) { + Slog.e(TAG, "Remote exception", e); + mCallback.onClientFinished(this, false /* success */); + } + } +} diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintResetLockoutClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintResetLockoutClient.java index 093c9449c498b..1f1d19d07121f 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintResetLockoutClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintResetLockoutClient.java @@ -50,8 +50,7 @@ class FingerprintResetLockoutClient extends ClientMonitor { @NonNull LockoutResetDispatcher lockoutResetDispatcher) { super(context, lazyDaemon, null /* token */, null /* listener */, userId, owner, 0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN, - BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN, - true /* shouldLogMetrics */); + BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN); mHardwareAuthToken = HardwareAuthTokenUtils.toHardwareAuthToken(hardwareAuthToken); mLockoutCache = lockoutTracker; mLockoutResetDispatcher = lockoutResetDispatcher; diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintDetectClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintDetectClient.java index c00dd048eeda0..4747488e5a706 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintDetectClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintDetectClient.java @@ -56,7 +56,7 @@ class FingerprintDetectClient extends AcquisitionClient boolean isStrongBiometric, int statsClient) { super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_FINGERPRINT, BiometricsProtoEnums.ACTION_AUTHENTICATE, - statsClient, true /* shouldLogMetrics */); + statsClient); mUdfpsOverlayController = udfpsOverlayController; mIsStrongBiometric = isStrongBiometric; } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java index a261b0b8fcdfe..d1f1cf8329354 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java @@ -56,8 +56,9 @@ public class FingerprintEnrollClient extends EnrollClient authenticatorIds) { super(context, lazyDaemon, null /* token */, null /* listener */, userId, owner, 0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN, - BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN, - true /* shouldLogMetrics */); + BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN); mCurrentUserId = currentUserId; mHasEnrolledBiometrics = hasEnrolledBiometrics; mAuthenticatorIds = authenticatorIds; diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java index 1fc0751563498..24e7d7d19e8df 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java @@ -218,7 +218,7 @@ public class BiometricSchedulerTest { @NonNull LazyDaemon lazyDaemon, int cookie) { super(context, lazyDaemon, token /* token */, null /* listener */, 0 /* userId */, TAG, cookie, TEST_SENSOR_ID, 0 /* statsModality */, - 0 /* statsAction */, 0 /* statsClient */, true /* shouldLogMetrics */); + 0 /* statsAction */, 0 /* statsClient */); }