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 */); }