From 40c2f1a3178e65b4bce56ba5f4fb90f65a5f3a9a Mon Sep 17 00:00:00 2001 From: Joe Bolinger Date: Wed, 19 Jan 2022 12:59:00 -0800 Subject: [PATCH] Use new context HAL methods for all biometric operations. Bug: 204584403 Bug: 204585936 Test: manual (via BP test app) Test: atest com.android.server.biometrics.sensors Change-Id: I653cc16595ffbc3346ad5009b4b742cd14aecc12 --- .../biometrics/sensors/AcquisitionClient.java | 10 +-- .../sensors/AuthenticationClient.java | 32 ++++----- .../biometrics/sensors/HalClientMonitor.java | 26 ++++---- .../biometrics/sensors/StartUserClient.java | 2 +- .../sensors/face/aidl/AidlSession.java | 66 +++++++++++++++++++ .../face/aidl/BiometricTestSessionImpl.java | 10 +-- .../face/aidl/FaceAuthenticationClient.java | 26 ++++++-- .../sensors/face/aidl/FaceDetectClient.java | 25 +++++-- .../sensors/face/aidl/FaceEnrollClient.java | 34 ++++++++-- .../aidl/FaceGenerateChallengeClient.java | 7 +- .../aidl/FaceGetAuthenticatorIdClient.java | 8 +-- .../face/aidl/FaceGetFeatureClient.java | 7 +- .../face/aidl/FaceInternalCleanupClient.java | 13 ++-- .../aidl/FaceInternalEnumerateClient.java | 7 +- .../face/aidl/FaceInvalidationClient.java | 7 +- .../sensors/face/aidl/FaceRemovalClient.java | 7 +- .../face/aidl/FaceResetLockoutClient.java | 7 +- .../face/aidl/FaceRevokeChallengeClient.java | 7 +- .../face/aidl/FaceSetFeatureClient.java | 8 +-- .../face/aidl/FaceStartUserClient.java | 10 +-- .../sensors/face/aidl/FaceStopUserClient.java | 8 +-- .../biometrics/sensors/face/aidl/Sensor.java | 52 ++++++--------- .../sensors/fingerprint/aidl/AidlSession.java | 65 ++++++++++++++++++ .../aidl/BiometricTestSessionImpl.java | 10 +-- .../aidl/FingerprintAuthenticationClient.java | 53 +++++++++++++-- .../aidl/FingerprintDetectClient.java | 25 +++++-- .../aidl/FingerprintEnrollClient.java | 57 +++++++++++++--- .../FingerprintGenerateChallengeClient.java | 7 +- .../FingerprintGetAuthenticatorIdClient.java | 7 +- .../FingerprintInternalCleanupClient.java | 13 ++-- .../FingerprintInternalEnumerateClient.java | 7 +- .../aidl/FingerprintInvalidationClient.java | 7 +- .../aidl/FingerprintRemovalClient.java | 7 +- .../aidl/FingerprintResetLockoutClient.java | 7 +- .../FingerprintRevokeChallengeClient.java | 7 +- .../aidl/FingerprintStartUserClient.java | 7 +- .../aidl/FingerprintStopUserClient.java | 8 +-- .../sensors/fingerprint/aidl/Sensor.java | 51 +++++--------- .../UserAwareBiometricSchedulerTest.java | 5 +- .../sensors/face/aidl/SensorTest.java | 4 +- .../sensors/fingerprint/aidl/SensorTest.java | 4 +- 41 files changed, 483 insertions(+), 247 deletions(-) create mode 100644 services/core/java/com/android/server/biometrics/sensors/face/aidl/AidlSession.java create mode 100644 services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/AidlSession.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 3936d5bff1922..8b8103e6e2c93 100644 --- a/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java @@ -54,11 +54,6 @@ public abstract class AcquisitionClient extends HalClientMonitor implement private boolean mShouldSendErrorToClient = true; private boolean mAlreadyCancelled; - /** - * Stops the HAL operation specific to the ClientMonitor subclass. - */ - protected abstract void stopHalOperation(); - public AcquisitionClient(@NonNull Context context, @NonNull Supplier lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull String owner, int cookie, int sensorId, boolean shouldVibrate, @@ -69,6 +64,11 @@ public abstract class AcquisitionClient extends HalClientMonitor implement mShouldVibrate = shouldVibrate; } + /** + * Stops the HAL operation specific to the ClientMonitor subclass. + */ + protected abstract void stopHalOperation(); + @Override public void unableToStart() { try { 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 6e3e8821d116a..b715faf3ca8f8 100644 --- a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java @@ -90,22 +90,6 @@ public abstract class AuthenticationClient extends AcquisitionClient // the state. We should think of a way to improve this in the future. protected @State int mState = STATE_NEW; - /** - * Handles lifecycle, e.g. {@link BiometricScheduler}, - * {@link ClientMonitorCallback} after authentication - * results are known. Note that this happens asynchronously from (but shortly after) - * {@link #onAuthenticated(BiometricAuthenticator.Identifier, boolean, ArrayList)} and allows - * {@link CoexCoordinator} a chance to invoke/delay this event. - * @param authenticated - */ - protected abstract void handleLifecycleAfterAuth(boolean authenticated); - - /** - * @return true if a user was detected (i.e. face was found, fingerprint sensor was touched. - * etc) - */ - public abstract boolean wasUserDetected(); - public AuthenticationClient(@NonNull Context context, @NonNull Supplier lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId, boolean restricted, @NonNull String owner, @@ -475,6 +459,22 @@ public abstract class AuthenticationClient extends AcquisitionClient } } + /** + * Handles lifecycle, e.g. {@link BiometricScheduler}, + * {@link com.android.server.biometrics.sensors.BaseClientMonitor.Callback} after authentication + * results are known. Note that this happens asynchronously from (but shortly after) + * {@link #onAuthenticated(BiometricAuthenticator.Identifier, boolean, ArrayList)} and allows + * {@link CoexCoordinator} a chance to invoke/delay this event. + * @param authenticated + */ + protected abstract void handleLifecycleAfterAuth(boolean authenticated); + + /** + * @return true if a user was detected (i.e. face was found, fingerprint sensor was touched. + * etc) + */ + public abstract boolean wasUserDetected(); + public @State int getState() { return mState; } diff --git a/services/core/java/com/android/server/biometrics/sensors/HalClientMonitor.java b/services/core/java/com/android/server/biometrics/sensors/HalClientMonitor.java index 603af9c86cddf..66a1c6e876aba 100644 --- a/services/core/java/com/android/server/biometrics/sensors/HalClientMonitor.java +++ b/services/core/java/com/android/server/biometrics/sensors/HalClientMonitor.java @@ -29,19 +29,7 @@ import java.util.function.Supplier; * @param HAL template */ public abstract class HalClientMonitor extends BaseClientMonitor { - - /** - * Starts the HAL operation specific to the ClientMonitor subclass. - */ - protected abstract void startHalOperation(); - - /** - * Invoked if the scheduler is unable to start the ClientMonitor (for example the HAL is null). - * If such a problem is detected, the scheduler will not invoke - * {@link #start(ClientMonitorCallback)}. - */ - public abstract void unableToStart(); - + @NonNull protected final Supplier mLazyDaemon; @@ -71,4 +59,16 @@ public abstract class HalClientMonitor extends BaseClientMonitor { public T getFreshDaemon() { return mLazyDaemon.get(); } + + /** + * Starts the HAL operation specific to the ClientMonitor subclass. + */ + protected abstract void startHalOperation(); + + /** + * Invoked if the scheduler is unable to start the ClientMonitor (for example the HAL is null). + * If such a problem is detected, the scheduler will not invoke + * {@link #start(ClientMonitorCallback)}. + */ + public abstract void unableToStart(); } diff --git a/services/core/java/com/android/server/biometrics/sensors/StartUserClient.java b/services/core/java/com/android/server/biometrics/sensors/StartUserClient.java index a74fe4f63cb62..1bc3248cd0e7f 100644 --- a/services/core/java/com/android/server/biometrics/sensors/StartUserClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/StartUserClient.java @@ -39,7 +39,7 @@ public abstract class StartUserClient extends HalClientMonitor { * @param New user object. */ public interface UserStartedCallback { - void onUserStarted(int newUserId, U newUser); + void onUserStarted(int newUserId, U newUser, int halInterfaceVersion); } @NonNull @VisibleForTesting diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/AidlSession.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/AidlSession.java new file mode 100644 index 0000000000000..006667ac659ff --- /dev/null +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/AidlSession.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2022 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.annotation.NonNull; +import android.hardware.biometrics.face.ISession; + +import static com.android.server.biometrics.sensors.face.aidl.Sensor.HalSessionCallback; + +/** + * A holder for an AIDL {@link ISession} with additional metadata about the current user + * and the backend. + */ +public class AidlSession { + + private final int mHalInterfaceVersion; + @NonNull + private final ISession mSession; + private final int mUserId; + @NonNull private final HalSessionCallback mHalSessionCallback; + + public AidlSession(int halInterfaceVersion, @NonNull ISession session, int userId, + HalSessionCallback halSessionCallback) { + mHalInterfaceVersion = halInterfaceVersion; + mSession = session; + mUserId = userId; + mHalSessionCallback = halSessionCallback; + } + + /** The underlying {@link ISession}. */ + @NonNull public ISession getSession() { + return mSession; + } + + /** The user id associated with the session. */ + public int getUserId() { + return mUserId; + } + + /** The HAL callback, which should only be used in tests {@See BiometricTestSessionImpl}. */ + HalSessionCallback getHalSessionCallback() { + return mHalSessionCallback; + } + + /** + * If this backend implements the *WithContext methods for enroll, authenticate, and + * detectInteraction. These variants should always be called if they are available. + */ + public boolean hasContextMethods() { + return mHalInterfaceVersion >= 2; + } +} diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java index 89982691ae388..9bd7476abca21 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java @@ -165,7 +165,7 @@ public class BiometricTestSessionImpl extends ITestSession.Stub { } mEnrollmentIds.add(nextRandomId); - mSensor.getSessionForUser(userId).mHalSessionCallback + mSensor.getSessionForUser(userId).getHalSessionCallback() .onEnrollmentProgress(nextRandomId, 0 /* remaining */); } @@ -181,7 +181,7 @@ public class BiometricTestSessionImpl extends ITestSession.Stub { return; } final int fid = faces.get(0).getBiometricId(); - mSensor.getSessionForUser(userId).mHalSessionCallback.onAuthenticationSucceeded(fid, + mSensor.getSessionForUser(userId).getHalSessionCallback().onAuthenticationSucceeded(fid, HardwareAuthTokenUtils.toHardwareAuthToken(new byte[69])); } @@ -189,7 +189,7 @@ public class BiometricTestSessionImpl extends ITestSession.Stub { public void rejectAuthentication(int userId) { Utils.checkPermission(mContext, TEST_BIOMETRIC); - mSensor.getSessionForUser(userId).mHalSessionCallback.onAuthenticationFailed(); + mSensor.getSessionForUser(userId).getHalSessionCallback().onAuthenticationFailed(); } // TODO(b/178414967): replace with notifyAuthenticationFrame and notifyEnrollmentFrame. @@ -205,7 +205,7 @@ public class BiometricTestSessionImpl extends ITestSession.Stub { // TODO(b/178414967): Currently onAuthenticationFrame and onEnrollmentFrame are the same. // This will need to call the correct callback once the onAcquired callback is removed. - mSensor.getSessionForUser(userId).mHalSessionCallback.onAuthenticationFrame( + mSensor.getSessionForUser(userId).getHalSessionCallback().onAuthenticationFrame( authenticationFrame); } @@ -213,7 +213,7 @@ public class BiometricTestSessionImpl extends ITestSession.Stub { public void notifyError(int userId, int errorCode) { Utils.checkPermission(mContext, TEST_BIOMETRIC); - mSensor.getSessionForUser(userId).mHalSessionCallback.onError((byte) errorCode, + mSensor.getSessionForUser(userId).getHalSessionCallback().onError((byte) errorCode, 0 /* vendorCode */); } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java index f9a0efc4b1014..c4e050215134f 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java @@ -27,8 +27,9 @@ import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.BiometricFaceConstants; import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.common.ICancellationSignal; +import android.hardware.biometrics.common.OperationContext; +import android.hardware.biometrics.common.OperationReason; import android.hardware.biometrics.face.IFace; -import android.hardware.biometrics.face.ISession; import android.hardware.face.FaceAuthenticationFrame; import android.hardware.face.FaceManager; import android.os.IBinder; @@ -53,7 +54,8 @@ import java.util.function.Supplier; /** * Face-specific authentication client for the {@link IFace} AIDL HAL interface. */ -class FaceAuthenticationClient extends AuthenticationClient implements LockoutConsumer { +class FaceAuthenticationClient extends AuthenticationClient + implements LockoutConsumer { private static final String TAG = "FaceAuthenticationClient"; @NonNull private final UsageStats mUsageStats; @@ -70,7 +72,7 @@ class FaceAuthenticationClient extends AuthenticationClient implements @FaceManager.FaceAcquired private int mLastAcquire = FaceManager.FACE_ACQUIRED_UNKNOWN; FaceAuthenticationClient(@NonNull Context context, - @NonNull Supplier lazyDaemon, + @NonNull Supplier lazyDaemon, @NonNull IBinder token, long requestId, @NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId, boolean restricted, String owner, int cookie, boolean requireConfirmation, int sensorId, @@ -123,7 +125,7 @@ class FaceAuthenticationClient extends AuthenticationClient implements 0 /* vendorCode */); mCallback.onClientFinished(this, false /* success */); } else { - mCancellationSignal = getFreshDaemon().authenticate(mOperationId); + mCancellationSignal = doAuthenticate(); } } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting auth", e); @@ -132,6 +134,22 @@ class FaceAuthenticationClient extends AuthenticationClient implements } } + private ICancellationSignal doAuthenticate() throws RemoteException { + final AidlSession session = getFreshDaemon(); + + if (session.hasContextMethods()) { + final OperationContext context = new OperationContext(); + // TODO: add reason, id, and isAoD + context.id = 0; + context.reason = OperationReason.UNKNOWN; + context.isAoD = false; + context.isCrypto = isCryptoOperation(); + return session.getSession().authenticateWithContext(mOperationId, context); + } else { + return session.getSession().authenticate(mOperationId); + } + } + @Override protected void stopHalOperation() { if (mCancellationSignal != null) { diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceDetectClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceDetectClient.java index 84ce8df08ef27..3f3db4342a7a9 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceDetectClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceDetectClient.java @@ -23,7 +23,8 @@ import android.hardware.SensorPrivacyManager; import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.common.ICancellationSignal; -import android.hardware.biometrics.face.ISession; +import android.hardware.biometrics.common.OperationContext; +import android.hardware.biometrics.common.OperationReason; import android.os.IBinder; import android.os.RemoteException; import android.util.Slog; @@ -40,7 +41,7 @@ import java.util.function.Supplier; * Performs face detection without exposing any matching information (e.g. accept/reject have the * same haptic, lockout counter is not increased). */ -public class FaceDetectClient extends AcquisitionClient implements DetectionConsumer { +public class FaceDetectClient extends AcquisitionClient implements DetectionConsumer { private static final String TAG = "FaceDetectClient"; @@ -48,7 +49,7 @@ public class FaceDetectClient extends AcquisitionClient implements Det @Nullable private ICancellationSignal mCancellationSignal; @Nullable private SensorPrivacyManager mSensorPrivacyManager; - public FaceDetectClient(@NonNull Context context, @NonNull Supplier lazyDaemon, + FaceDetectClient(@NonNull Context context, @NonNull Supplier lazyDaemon, @NonNull IBinder token, long requestId, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull String owner, int sensorId, boolean isStrongBiometric, int statsClient) { @@ -89,13 +90,29 @@ public class FaceDetectClient extends AcquisitionClient implements Det } try { - mCancellationSignal = getFreshDaemon().detectInteraction(); + mCancellationSignal = doDetectInteraction(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting face detect", e); mCallback.onClientFinished(this, false /* success */); } } + private ICancellationSignal doDetectInteraction() throws RemoteException { + final AidlSession session = getFreshDaemon(); + + if (session.hasContextMethods()) { + final OperationContext context = new OperationContext(); + // TODO: add reason, id, and isAoD + context.id = 0; + context.reason = OperationReason.UNKNOWN; + context.isAoD = false; + context.isCrypto = isCryptoOperation(); + return session.getSession().detectInteractionWithContext(context); + } else { + return session.getSession().detectInteraction(); + } + } + @Override public void onInteractionDetected() { vibrateSuccess(); 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 b1be9fbe443dd..8dc53b6346a46 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 @@ -22,14 +22,16 @@ import android.content.Context; import android.hardware.biometrics.BiometricFaceConstants; import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.common.ICancellationSignal; +import android.hardware.biometrics.common.OperationContext; +import android.hardware.biometrics.common.OperationReason; import android.hardware.biometrics.face.EnrollmentType; import android.hardware.biometrics.face.Feature; import android.hardware.biometrics.face.IFace; -import android.hardware.biometrics.face.ISession; import android.hardware.common.NativeHandle; import android.hardware.face.Face; import android.hardware.face.FaceEnrollFrame; import android.hardware.face.FaceManager; +import android.hardware.keymaster.HardwareAuthToken; import android.os.IBinder; import android.os.RemoteException; import android.util.Slog; @@ -56,7 +58,7 @@ import java.util.function.Supplier; /** * Face-specific enroll client for the {@link IFace} AIDL HAL interface. */ -public class FaceEnrollClient extends EnrollClient { +public class FaceEnrollClient extends EnrollClient { private static final String TAG = "FaceEnrollClient"; @@ -83,7 +85,7 @@ public class FaceEnrollClient extends EnrollClient { } }; - FaceEnrollClient(@NonNull Context context, @NonNull Supplier lazyDaemon, + FaceEnrollClient(@NonNull Context context, @NonNull Supplier lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull byte[] hardwareAuthToken, @NonNull String opPackageName, long requestId, @NonNull BiometricUtils utils, @NonNull int[] disabledFeatures, int timeoutSec, @@ -178,14 +180,12 @@ public class FaceEnrollClient extends EnrollClient { featureList.add(Feature.REQUIRE_DIVERSE_POSES); } - byte[] features = new byte[featureList.size()]; + final byte[] features = new byte[featureList.size()]; for (int i = 0; i < featureList.size(); i++) { features[i] = featureList.get(i); } - mCancellationSignal = getFreshDaemon().enroll( - HardwareAuthTokenUtils.toHardwareAuthToken(mHardwareAuthToken), - EnrollmentType.DEFAULT, features, mHwPreviewHandle); + mCancellationSignal = doEnroll(features); } catch (RemoteException | IllegalArgumentException e) { Slog.e(TAG, "Exception when requesting enroll", e); onError(BiometricFaceConstants.FACE_ERROR_UNABLE_TO_PROCESS, 0 /* vendorCode */); @@ -193,6 +193,26 @@ public class FaceEnrollClient extends EnrollClient { } } + private ICancellationSignal doEnroll(byte[] features) throws RemoteException { + final AidlSession session = getFreshDaemon(); + final HardwareAuthToken hat = + HardwareAuthTokenUtils.toHardwareAuthToken(mHardwareAuthToken); + + if (session.hasContextMethods()) { + final OperationContext context = new OperationContext(); + // TODO: add reason, id, and isAoD + context.id = 0; + context.reason = OperationReason.UNKNOWN; + context.isAoD = false; + context.isCrypto = isCryptoOperation(); + return session.getSession().enrollWithContext( + hat, EnrollmentType.DEFAULT, features, mHwPreviewHandle, context); + } else { + return session.getSession().enroll(hat, EnrollmentType.DEFAULT, features, + mHwPreviewHandle); + } + } + @Override protected void stopHalOperation() { if (mCancellationSignal != null) { diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGenerateChallengeClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGenerateChallengeClient.java index aebbc5348f95b..bdad268b9422d 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGenerateChallengeClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGenerateChallengeClient.java @@ -19,7 +19,6 @@ package com.android.server.biometrics.sensors.face.aidl; import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.face.IFace; -import android.hardware.biometrics.face.ISession; import android.os.IBinder; import android.os.RemoteException; import android.util.Slog; @@ -32,11 +31,11 @@ import java.util.function.Supplier; /** * Face-specific generateChallenge client for the {@link IFace} AIDL HAL interface. */ -public class FaceGenerateChallengeClient extends GenerateChallengeClient { +public class FaceGenerateChallengeClient extends GenerateChallengeClient { private static final String TAG = "FaceGenerateChallengeClient"; FaceGenerateChallengeClient(@NonNull Context context, - @NonNull Supplier lazyDaemon, @NonNull IBinder token, + @NonNull Supplier lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull String owner, int sensorId) { super(context, lazyDaemon, token, listener, userId, owner, sensorId); @@ -45,7 +44,7 @@ public class FaceGenerateChallengeClient extends GenerateChallengeClient { +class FaceGetAuthenticatorIdClient extends HalClientMonitor { private static final String TAG = "FaceGetAuthenticatorIdClient"; private final Map mAuthenticatorIds; - FaceGetAuthenticatorIdClient(@NonNull Context context, @NonNull Supplier lazyDaemon, + FaceGetAuthenticatorIdClient(@NonNull Context context, + @NonNull Supplier lazyDaemon, int userId, @NonNull String opPackageName, int sensorId, Map authenticatorIds) { super(context, lazyDaemon, null /* token */, null /* listener */, userId, opPackageName, @@ -58,7 +58,7 @@ class FaceGetAuthenticatorIdClient extends HalClientMonitor { @Override protected void startHalOperation() { try { - getFreshDaemon().getAuthenticatorId(); + getFreshDaemon().getSession().getAuthenticatorId(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception", e); } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetFeatureClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetFeatureClient.java index 3401587caa341..79479bebc7592 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetFeatureClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetFeatureClient.java @@ -22,7 +22,6 @@ import android.content.Context; import android.hardware.biometrics.BiometricFaceConstants; import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.face.IFace; -import android.hardware.biometrics.face.ISession; import android.os.IBinder; import android.os.RemoteException; import android.provider.Settings; @@ -41,13 +40,13 @@ import java.util.function.Supplier; /** * Face-specific get feature client for the {@link IFace} AIDL HAL interface. */ -public class FaceGetFeatureClient extends HalClientMonitor implements ErrorConsumer { +public class FaceGetFeatureClient extends HalClientMonitor implements ErrorConsumer { private static final String TAG = "FaceGetFeatureClient"; private final int mUserId; - FaceGetFeatureClient(@NonNull Context context, @NonNull Supplier lazyDaemon, + FaceGetFeatureClient(@NonNull Context context, @NonNull Supplier lazyDaemon, @NonNull IBinder token, @Nullable ClientMonitorCallbackConverter listener, int userId, @NonNull String owner, int sensorId) { super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId, @@ -70,7 +69,7 @@ public class FaceGetFeatureClient extends HalClientMonitor implements @Override protected void startHalOperation() { try { - getFreshDaemon().getFeatures(); + getFreshDaemon().getSession().getFeatures(); } catch (RemoteException e) { Slog.e(TAG, "Unable to getFeature", e); mCallback.onClientFinished(this, false /* success */); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInternalCleanupClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInternalCleanupClient.java index 19095c59896f0..a2b0339b282fa 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInternalCleanupClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInternalCleanupClient.java @@ -20,7 +20,6 @@ import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.face.IFace; -import android.hardware.biometrics.face.ISession; import android.hardware.face.Face; import android.os.IBinder; @@ -36,10 +35,10 @@ import java.util.function.Supplier; /** * Face-specific internal cleanup client for the {@link IFace} AIDL HAL interface. */ -class FaceInternalCleanupClient extends InternalCleanupClient { +class FaceInternalCleanupClient extends InternalCleanupClient { FaceInternalCleanupClient(@NonNull Context context, - @NonNull Supplier lazyDaemon, int userId, @NonNull String owner, + @NonNull Supplier lazyDaemon, int userId, @NonNull String owner, int sensorId, @NonNull List enrolledList, @NonNull BiometricUtils utils, @NonNull Map authenticatorIds) { super(context, lazyDaemon, userId, owner, sensorId, BiometricsProtoEnums.MODALITY_FACE, @@ -47,16 +46,16 @@ class FaceInternalCleanupClient extends InternalCleanupClient { } @Override - protected InternalEnumerateClient getEnumerateClient(Context context, - Supplier lazyDaemon, IBinder token, int userId, String owner, + protected InternalEnumerateClient getEnumerateClient(Context context, + Supplier lazyDaemon, IBinder token, int userId, String owner, List enrolledList, BiometricUtils utils, int sensorId) { return new FaceInternalEnumerateClient(context, lazyDaemon, token, userId, owner, enrolledList, utils, sensorId); } @Override - protected RemovalClient getRemovalClient(Context context, - Supplier lazyDaemon, IBinder token, + protected RemovalClient getRemovalClient(Context context, + Supplier lazyDaemon, IBinder token, int biometricId, int userId, String owner, BiometricUtils utils, int sensorId, Map authenticatorIds) { // Internal remove does not need to send results to anyone. Cleanup (enumerate + remove) diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInternalEnumerateClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInternalEnumerateClient.java index de5f1154fd2b4..88c9d3bd10352 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInternalEnumerateClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInternalEnumerateClient.java @@ -20,7 +20,6 @@ import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.face.IFace; -import android.hardware.biometrics.face.ISession; import android.hardware.face.Face; import android.os.IBinder; import android.os.RemoteException; @@ -35,11 +34,11 @@ import java.util.function.Supplier; /** * Face-specific internal enumerate client for the {@link IFace} AIDL HAL interface. */ -class FaceInternalEnumerateClient extends InternalEnumerateClient { +class FaceInternalEnumerateClient extends InternalEnumerateClient { private static final String TAG = "FaceInternalEnumerateClient"; FaceInternalEnumerateClient(@NonNull Context context, - @NonNull Supplier lazyDaemon, @NonNull IBinder token, int userId, + @NonNull Supplier lazyDaemon, @NonNull IBinder token, int userId, @NonNull String owner, @NonNull List enrolledList, @NonNull BiometricUtils utils, int sensorId) { super(context, lazyDaemon, token, userId, owner, enrolledList, utils, sensorId, @@ -49,7 +48,7 @@ class FaceInternalEnumerateClient extends InternalEnumerateClient { @Override protected void startHalOperation() { try { - getFreshDaemon().enumerateEnrollments(); + getFreshDaemon().getSession().enumerateEnrollments(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting enumerate", e); mCallback.onClientFinished(this, false /* success */); 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 index 416921a0b098b..04ea2cfc6effa 100644 --- 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 @@ -19,7 +19,6 @@ package com.android.server.biometrics.sensors.face.aidl; import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.IInvalidationCallback; -import android.hardware.biometrics.face.ISession; import android.hardware.face.Face; import android.os.RemoteException; import android.util.Slog; @@ -29,11 +28,11 @@ import com.android.server.biometrics.sensors.InvalidationClient; import java.util.Map; import java.util.function.Supplier; -public class FaceInvalidationClient extends InvalidationClient { +public class FaceInvalidationClient extends InvalidationClient { private static final String TAG = "FaceInvalidationClient"; public FaceInvalidationClient(@NonNull Context context, - @NonNull Supplier lazyDaemon, int userId, int sensorId, + @NonNull Supplier lazyDaemon, int userId, int sensorId, @NonNull Map authenticatorIds, @NonNull IInvalidationCallback callback) { super(context, lazyDaemon, userId, sensorId, authenticatorIds, callback); } @@ -41,7 +40,7 @@ public class FaceInvalidationClient extends InvalidationClient { @Override protected void startHalOperation() { try { - getFreshDaemon().invalidateAuthenticatorId(); + getFreshDaemon().getSession().invalidateAuthenticatorId(); } 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/FaceRemovalClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceRemovalClient.java index 1995c378fff90..130a05a861d93 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceRemovalClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceRemovalClient.java @@ -20,7 +20,6 @@ import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.face.IFace; -import android.hardware.biometrics.face.ISession; import android.hardware.face.Face; import android.os.IBinder; import android.os.RemoteException; @@ -36,12 +35,12 @@ import java.util.function.Supplier; /** * Face-specific removal client for the {@link IFace} AIDL HAL interface. */ -class FaceRemovalClient extends RemovalClient { +class FaceRemovalClient extends RemovalClient { private static final String TAG = "FaceRemovalClient"; final int[] mBiometricIds; - FaceRemovalClient(@NonNull Context context, @NonNull Supplier lazyDaemon, + FaceRemovalClient(@NonNull Context context, @NonNull Supplier lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int[] biometricIds, int userId, @NonNull String owner, @NonNull BiometricUtils utils, int sensorId, @@ -54,7 +53,7 @@ class FaceRemovalClient extends RemovalClient { @Override protected void startHalOperation() { try { - getFreshDaemon().removeEnrollments(mBiometricIds); + getFreshDaemon().getSession().removeEnrollments(mBiometricIds); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting remove", 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 0a3e7651bac4f..67bf3f5b2e4f8 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 @@ -20,7 +20,6 @@ import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.face.IFace; -import android.hardware.biometrics.face.ISession; import android.hardware.keymaster.HardwareAuthToken; import android.os.RemoteException; import android.util.Slog; @@ -41,7 +40,7 @@ import java.util.function.Supplier; * Updates the framework's lockout cache and notifies clients such as Keyguard when lockout is * cleared. */ -public class FaceResetLockoutClient extends HalClientMonitor implements ErrorConsumer { +public class FaceResetLockoutClient extends HalClientMonitor implements ErrorConsumer { private static final String TAG = "FaceResetLockoutClient"; @@ -50,7 +49,7 @@ public class FaceResetLockoutClient extends HalClientMonitor implement private final LockoutResetDispatcher mLockoutResetDispatcher; FaceResetLockoutClient(@NonNull Context context, - @NonNull Supplier lazyDaemon, int userId, String owner, int sensorId, + @NonNull Supplier lazyDaemon, int userId, String owner, int sensorId, @NonNull byte[] hardwareAuthToken, @NonNull LockoutCache lockoutTracker, @NonNull LockoutResetDispatcher lockoutResetDispatcher) { super(context, lazyDaemon, null /* token */, null /* listener */, userId, owner, @@ -75,7 +74,7 @@ public class FaceResetLockoutClient extends HalClientMonitor implement @Override protected void startHalOperation() { try { - getFreshDaemon().resetLockout(mHardwareAuthToken); + getFreshDaemon().getSession().resetLockout(mHardwareAuthToken); } catch (RemoteException e) { Slog.e(TAG, "Unable to reset lockout", e); mCallback.onClientFinished(this, false /* success */); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceRevokeChallengeClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceRevokeChallengeClient.java index 5e902ac480a5f..acd2e0589ccc8 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceRevokeChallengeClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceRevokeChallengeClient.java @@ -19,7 +19,6 @@ package com.android.server.biometrics.sensors.face.aidl; import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.face.IFace; -import android.hardware.biometrics.face.ISession; import android.os.IBinder; import android.os.RemoteException; import android.util.Slog; @@ -31,14 +30,14 @@ import java.util.function.Supplier; /** * Face-specific revokeChallenge client for the {@link IFace} AIDL HAL interface. */ -public class FaceRevokeChallengeClient extends RevokeChallengeClient { +public class FaceRevokeChallengeClient extends RevokeChallengeClient { private static final String TAG = "FaceRevokeChallengeClient"; private final long mChallenge; FaceRevokeChallengeClient(@NonNull Context context, - @NonNull Supplier lazyDaemon, @NonNull IBinder token, + @NonNull Supplier lazyDaemon, @NonNull IBinder token, int userId, @NonNull String owner, int sensorId, long challenge) { super(context, lazyDaemon, token, userId, owner, sensorId); mChallenge = challenge; @@ -47,7 +46,7 @@ public class FaceRevokeChallengeClient extends RevokeChallengeClient { @Override protected void startHalOperation() { try { - getFreshDaemon().revokeChallenge(mChallenge); + getFreshDaemon().getSession().revokeChallenge(mChallenge); } catch (RemoteException e) { Slog.e(TAG, "Unable to revokeChallenge", e); mCallback.onClientFinished(this, false /* success */); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceSetFeatureClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceSetFeatureClient.java index 962f900c87fd2..9d535a26e12d5 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceSetFeatureClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceSetFeatureClient.java @@ -20,7 +20,6 @@ import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.face.IFace; -import android.hardware.biometrics.face.ISession; import android.hardware.keymaster.HardwareAuthToken; import android.os.IBinder; import android.os.RemoteException; @@ -38,7 +37,7 @@ import java.util.function.Supplier; /** * Face-specific get feature client for the {@link IFace} AIDL HAL interface. */ -public class FaceSetFeatureClient extends HalClientMonitor implements ErrorConsumer { +public class FaceSetFeatureClient extends HalClientMonitor implements ErrorConsumer { private static final String TAG = "FaceSetFeatureClient"; @@ -46,7 +45,7 @@ public class FaceSetFeatureClient extends HalClientMonitor implements private final boolean mEnabled; private final HardwareAuthToken mHardwareAuthToken; - FaceSetFeatureClient(@NonNull Context context, @NonNull Supplier lazyDaemon, + FaceSetFeatureClient(@NonNull Context context, @NonNull Supplier lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull String owner, int sensorId, int feature, boolean enabled, byte[] hardwareAuthToken) { @@ -76,8 +75,7 @@ public class FaceSetFeatureClient extends HalClientMonitor implements @Override protected void startHalOperation() { try { - getFreshDaemon() - .setFeature(mHardwareAuthToken, + getFreshDaemon().getSession().setFeature(mHardwareAuthToken, AidlConversionUtils.convertFrameworkToAidlFeature(mFeature), mEnabled); } catch (RemoteException | IllegalArgumentException e) { Slog.e(TAG, "Unable to set feature: " + mFeature + " to enabled: " + mEnabled, e); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceStartUserClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceStartUserClient.java index 9b559034b9aff..f5a98ff5881b9 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceStartUserClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceStartUserClient.java @@ -37,7 +37,8 @@ public class FaceStartUserClient extends StartUserClient { @NonNull private final ISessionCallback mSessionCallback; - public FaceStartUserClient(@NonNull Context context, @NonNull Supplier lazyDaemon, + public FaceStartUserClient(@NonNull Context context, + @NonNull Supplier lazyDaemon, @Nullable IBinder token, int userId, int sensorId, @NonNull ISessionCallback sessionCallback, @NonNull UserStartedCallback callback) { @@ -54,10 +55,12 @@ public class FaceStartUserClient extends StartUserClient { @Override protected void startHalOperation() { try { - final ISession newSession = getFreshDaemon().createSession(getSensorId(), + final IFace hal = getFreshDaemon(); + final int version = hal.getInterfaceVersion(); + final ISession newSession = hal.createSession(getSensorId(), getTargetUserId(), mSessionCallback); Binder.allowBlocking(newSession.asBinder()); - mUserStartedCallback.onUserStarted(getTargetUserId(), newSession); + mUserStartedCallback.onUserStarted(getTargetUserId(), newSession, version); getCallback().onClientFinished(this, true /* success */); } catch (RemoteException e) { Slog.e(TAG, "Remote exception", e); @@ -67,6 +70,5 @@ public class FaceStartUserClient extends StartUserClient { @Override public void unableToStart() { - } } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceStopUserClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceStopUserClient.java index 55da0d284af90..48b4856fa4b6a 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceStopUserClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceStopUserClient.java @@ -19,7 +19,6 @@ package com.android.server.biometrics.sensors.face.aidl; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; -import android.hardware.biometrics.face.ISession; import android.os.IBinder; import android.os.RemoteException; import android.util.Slog; @@ -29,10 +28,10 @@ import com.android.server.biometrics.sensors.StopUserClient; import java.util.function.Supplier; -public class FaceStopUserClient extends StopUserClient { +public class FaceStopUserClient extends StopUserClient { private static final String TAG = "FaceStopUserClient"; - public FaceStopUserClient(@NonNull Context context, @NonNull Supplier lazyDaemon, + public FaceStopUserClient(@NonNull Context context, @NonNull Supplier lazyDaemon, @Nullable IBinder token, int userId, int sensorId, @NonNull UserStoppedCallback callback) { super(context, lazyDaemon, token, userId, sensorId, callback); @@ -47,7 +46,7 @@ public class FaceStopUserClient extends StopUserClient { @Override protected void startHalOperation() { try { - getFreshDaemon().close(); + getFreshDaemon().getSession().close(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception", e); getCallback().onClientFinished(this, false /* success */); @@ -56,6 +55,5 @@ public class FaceStopUserClient extends StopUserClient { @Override public void unableToStart() { - } } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java index 6ae3a9e3a821c..33e6fa4ebf934 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java @@ -84,24 +84,9 @@ public class Sensor { @NonNull private final UserAwareBiometricScheduler mScheduler; @NonNull private final LockoutCache mLockoutCache; @NonNull private final Map mAuthenticatorIds; - @NonNull private final Supplier mLazySession; - @Nullable private Session mCurrentSession; - static class Session { - @NonNull final HalSessionCallback mHalSessionCallback; - @NonNull private final String mTag; - @NonNull private final ISession mSession; - private final int mUserId; - - Session(@NonNull String tag, @NonNull ISession session, int userId, - @NonNull HalSessionCallback halSessionCallback) { - mTag = tag; - mSession = session; - mUserId = userId; - mHalSessionCallback = halSessionCallback; - Slog.d(mTag, "New session created for user: " + userId); - } - } + @NonNull private final Supplier mLazySession; + @Nullable private AidlSession mCurrentSession; static class HalSessionCallback extends ISessionCallback.Stub { /** @@ -496,7 +481,7 @@ public class Sensor { mSensorProperties = sensorProperties; mScheduler = new UserAwareBiometricScheduler(tag, BiometricScheduler.SENSOR_TYPE_FACE, null /* gestureAvailabilityDispatcher */, - () -> mCurrentSession != null ? mCurrentSession.mUserId : UserHandle.USER_NULL, + () -> mCurrentSession != null ? mCurrentSession.getUserId() : UserHandle.USER_NULL, new UserAwareBiometricScheduler.UserSwitchCallback() { @NonNull @Override @@ -508,21 +493,22 @@ public class Sensor { @NonNull @Override public StartUserClient getStartUserClient(int newUserId) { - final HalSessionCallback.Callback callback = () -> { - Slog.e(mTag, "Got ERROR_HW_UNAVAILABLE"); - mCurrentSession = null; - }; - final int sensorId = mSensorProperties.sensorId; final HalSessionCallback resultController = new HalSessionCallback(mContext, mHandler, mTag, mScheduler, sensorId, newUserId, mLockoutCache, - lockoutResetDispatcher, callback); + lockoutResetDispatcher, () -> { + Slog.e(mTag, "Got ERROR_HW_UNAVAILABLE"); + mCurrentSession = null; + }); final StartUserClient.UserStartedCallback userStartedCallback = - (userIdStarted, newSession) -> { - mCurrentSession = new Session(mTag, newSession, userIdStarted, - resultController); + (userIdStarted, newSession, halInterfaceVersion) -> { + Slog.d(mTag, "New session created for user: " + + userIdStarted + " with hal version: " + + halInterfaceVersion); + mCurrentSession = new AidlSession(halInterfaceVersion, + newSession, userIdStarted, resultController); if (FaceUtils.getLegacyInstance(sensorId) .isInvalidationInProgress(mContext, userIdStarted)) { Slog.w(mTag, @@ -542,10 +528,10 @@ public class Sensor { }); mLockoutCache = new LockoutCache(); mAuthenticatorIds = new HashMap<>(); - mLazySession = () -> mCurrentSession != null ? mCurrentSession.mSession : null; + mLazySession = () -> mCurrentSession != null ? mCurrentSession : null; } - @NonNull Supplier getLazySession() { + @NonNull Supplier getLazySession() { return mLazySession; } @@ -553,8 +539,8 @@ public class Sensor { return mSensorProperties; } - @Nullable Session getSessionForUser(int userId) { - if (mCurrentSession != null && mCurrentSession.mUserId == userId) { + @Nullable AidlSession getSessionForUser(int userId) { + if (mCurrentSession != null && mCurrentSession.getUserId() == userId) { return mCurrentSession; } else { return null; @@ -583,10 +569,10 @@ public class Sensor { if (enabled != mTestHalEnabled) { // The framework should retrieve a new session from the HAL. try { - if (mCurrentSession != null && mCurrentSession.mSession != null) { + if (mCurrentSession != null) { // TODO(181984005): This should be scheduled instead of directly invoked Slog.d(mTag, "Closing old session"); - mCurrentSession.mSession.close(); + mCurrentSession.getSession().close(); } } catch (RemoteException e) { Slog.e(mTag, "RemoteException", e); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/AidlSession.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/AidlSession.java new file mode 100644 index 0000000000000..727101a69b065 --- /dev/null +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/AidlSession.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2022 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.hardware.biometrics.fingerprint.ISession; + +import static com.android.server.biometrics.sensors.fingerprint.aidl.Sensor.HalSessionCallback; + +/** + * A holder for an AIDL {@link ISession} with additional metadata about the current user + * and the backend. + */ +public class AidlSession { + + private final int mHalInterfaceVersion; + @NonNull private final ISession mSession; + private final int mUserId; + @NonNull private final HalSessionCallback mHalSessionCallback; + + public AidlSession(int halInterfaceVersion, @NonNull ISession session, int userId, + HalSessionCallback halSessionCallback) { + mHalInterfaceVersion = halInterfaceVersion; + mSession = session; + mUserId = userId; + mHalSessionCallback = halSessionCallback; + } + + /** The underlying {@link ISession}. */ + @NonNull public ISession getSession() { + return mSession; + } + + /** The user id associated with the session. */ + public int getUserId() { + return mUserId; + } + + /** The HAL callback, which should only be used in tests {@See BiometricTestSessionImpl}. */ + HalSessionCallback getHalSessionCallback() { + return mHalSessionCallback; + } + + /** + * If this backend implements the *WithContext methods for enroll, authenticate, and + * detectInteraction. These variants should always be called if they are available. + */ + public boolean hasContextMethods() { + return mHalInterfaceVersion >= 2; + } +} diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java index b29fbb66fa50d..0528cd489ae5e 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java @@ -157,7 +157,7 @@ class BiometricTestSessionImpl extends ITestSession.Stub { } mEnrollmentIds.add(nextRandomId); - mSensor.getSessionForUser(userId).mHalSessionCallback + mSensor.getSessionForUser(userId).getHalSessionCallback() .onEnrollmentProgress(nextRandomId, 0 /* remaining */); } @@ -173,7 +173,7 @@ class BiometricTestSessionImpl extends ITestSession.Stub { return; } final int fid = fingerprints.get(0).getBiometricId(); - mSensor.getSessionForUser(userId).mHalSessionCallback.onAuthenticationSucceeded(fid, + mSensor.getSessionForUser(userId).getHalSessionCallback().onAuthenticationSucceeded(fid, HardwareAuthTokenUtils.toHardwareAuthToken(new byte[69])); } @@ -181,14 +181,14 @@ class BiometricTestSessionImpl extends ITestSession.Stub { public void rejectAuthentication(int userId) { Utils.checkPermission(mContext, TEST_BIOMETRIC); - mSensor.getSessionForUser(userId).mHalSessionCallback.onAuthenticationFailed(); + mSensor.getSessionForUser(userId).getHalSessionCallback().onAuthenticationFailed(); } @Override public void notifyAcquired(int userId, int acquireInfo) { Utils.checkPermission(mContext, TEST_BIOMETRIC); - mSensor.getSessionForUser(userId).mHalSessionCallback + mSensor.getSessionForUser(userId).getHalSessionCallback() .onAcquired((byte) acquireInfo, 0 /* vendorCode */); } @@ -196,7 +196,7 @@ class BiometricTestSessionImpl extends ITestSession.Stub { public void notifyError(int userId, int errorCode) { Utils.checkPermission(mContext, TEST_BIOMETRIC); - mSensor.getSessionForUser(userId).mHalSessionCallback.onError((byte) errorCode, + mSensor.getSessionForUser(userId).getHalSessionCallback().onError((byte) errorCode, 0 /* vendorCode */); } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java index 62a8a47da9114..2c1c80ccabb3e 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java @@ -25,7 +25,9 @@ import android.hardware.biometrics.BiometricFingerprintConstants; import android.hardware.biometrics.BiometricFingerprintConstants.FingerprintAcquired; import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.common.ICancellationSignal; -import android.hardware.biometrics.fingerprint.ISession; +import android.hardware.biometrics.common.OperationContext; +import android.hardware.biometrics.common.OperationReason; +import android.hardware.biometrics.fingerprint.PointerContext; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.hardware.fingerprint.ISidefpsController; import android.hardware.fingerprint.IUdfpsOverlayController; @@ -53,7 +55,7 @@ import java.util.function.Supplier; * Fingerprint-specific authentication client supporting the * {@link android.hardware.biometrics.fingerprint.IFingerprint} AIDL interface. */ -class FingerprintAuthenticationClient extends AuthenticationClient implements +class FingerprintAuthenticationClient extends AuthenticationClient implements Udfps, LockoutConsumer { private static final String TAG = "FingerprintAuthenticationClient"; @@ -66,7 +68,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient imp private boolean mIsPointerDown; FingerprintAuthenticationClient(@NonNull Context context, - @NonNull Supplier lazyDaemon, + @NonNull Supplier lazyDaemon, @NonNull IBinder token, long requestId, @NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId, boolean restricted, @NonNull String owner, int cookie, boolean requireConfirmation, @@ -159,7 +161,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient imp mSensorOverlays.show(getSensorId(), getShowOverlayReason(), this); try { - mCancellationSignal = getFreshDaemon().authenticate(mOperationId); + mCancellationSignal = doAuthenticate(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception", e); onError(BiometricFingerprintConstants.FINGERPRINT_ERROR_HW_UNAVAILABLE, @@ -169,6 +171,22 @@ class FingerprintAuthenticationClient extends AuthenticationClient imp } } + private ICancellationSignal doAuthenticate() throws RemoteException { + final AidlSession session = getFreshDaemon(); + + if (session.hasContextMethods()) { + final OperationContext context = new OperationContext(); + // TODO: add reason, id, and isAoD + context.id = 0; + context.reason = OperationReason.UNKNOWN; + context.isAoD = false; + context.isCrypto = isCryptoOperation(); + return session.getSession().authenticateWithContext(mOperationId, context); + } else { + return session.getSession().authenticate(mOperationId); + } + } + @Override protected void stopHalOperation() { mSensorOverlays.hide(getSensorId()); @@ -192,7 +210,20 @@ class FingerprintAuthenticationClient extends AuthenticationClient imp mIsPointerDown = true; mState = STATE_STARTED; mALSProbeCallback.getProbe().enable(); - getFreshDaemon().onPointerDown(0 /* pointerId */, x, y, minor, major); + + final AidlSession session = getFreshDaemon(); + if (session.hasContextMethods()) { + final PointerContext context = new PointerContext(); + context.pointerId = 0; + context.x = x; + context.y = y; + context.minor = minor; + context.major = major; + context.isAoD = false; // TODO; get value + session.getSession().onPointerDownWithContext(context); + } else { + session.getSession().onPointerDown(0 /* pointerId */, x, y, minor, major); + } if (getListener() != null) { getListener().onUdfpsPointerDown(getSensorId()); @@ -208,7 +239,15 @@ class FingerprintAuthenticationClient extends AuthenticationClient imp mIsPointerDown = false; mState = STATE_STARTED_PAUSED_ATTEMPTED; mALSProbeCallback.getProbe().disable(); - getFreshDaemon().onPointerUp(0 /* pointerId */); + + final AidlSession session = getFreshDaemon(); + if (session.hasContextMethods()) { + final PointerContext context = new PointerContext(); + context.pointerId = 0; + session.getSession().onPointerUpWithContext(context); + } else { + session.getSession().onPointerUp(0 /* pointerId */); + } if (getListener() != null) { getListener().onUdfpsPointerUp(getSensorId()); @@ -226,7 +265,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient imp @Override public void onUiReady() { try { - getFreshDaemon().onUiReady(); + getFreshDaemon().getSession().onUiReady(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception", e); } 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 55960f61d4aeb..6645332c1facb 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 @@ -22,7 +22,8 @@ import android.content.Context; import android.hardware.biometrics.BiometricOverlayConstants; import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.common.ICancellationSignal; -import android.hardware.biometrics.fingerprint.ISession; +import android.hardware.biometrics.common.OperationContext; +import android.hardware.biometrics.common.OperationReason; import android.hardware.fingerprint.IUdfpsOverlayController; import android.os.IBinder; import android.os.RemoteException; @@ -41,7 +42,7 @@ import java.util.function.Supplier; * Performs fingerprint detection without exposing any matching information (e.g. accept/reject * have the same haptic, lockout counter is not increased). */ -class FingerprintDetectClient extends AcquisitionClient implements DetectionConsumer { +class FingerprintDetectClient extends AcquisitionClient implements DetectionConsumer { private static final String TAG = "FingerprintDetectClient"; @@ -49,7 +50,7 @@ class FingerprintDetectClient extends AcquisitionClient implements Det @NonNull private final SensorOverlays mSensorOverlays; @Nullable private ICancellationSignal mCancellationSignal; - FingerprintDetectClient(@NonNull Context context, @NonNull Supplier lazyDaemon, + FingerprintDetectClient(@NonNull Context context, @NonNull Supplier lazyDaemon, @NonNull IBinder token, long requestId, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull String owner, int sensorId, @@ -86,7 +87,7 @@ class FingerprintDetectClient extends AcquisitionClient implements Det mSensorOverlays.show(getSensorId(), BiometricOverlayConstants.REASON_AUTH_KEYGUARD, this); try { - mCancellationSignal = getFreshDaemon().detectInteraction(); + mCancellationSignal = doDetectInteraction(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting finger detect", e); mSensorOverlays.hide(getSensorId()); @@ -94,6 +95,22 @@ class FingerprintDetectClient extends AcquisitionClient implements Det } } + private ICancellationSignal doDetectInteraction() throws RemoteException { + final AidlSession session = getFreshDaemon(); + + if (session.hasContextMethods()) { + final OperationContext context = new OperationContext(); + // TODO: add reason, id, and isAoD + context.id = 0; + context.reason = OperationReason.UNKNOWN; + context.isAoD = false; + context.isCrypto = isCryptoOperation(); + return session.getSession().detectInteractionWithContext(context); + } else { + return session.getSession().detectInteraction(); + } + } + @Override public void onInteractionDetected() { vibrateSuccess(); 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 ee47e9586265b..d0c5bb8851e64 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 @@ -24,12 +24,15 @@ import android.hardware.biometrics.BiometricFingerprintConstants; import android.hardware.biometrics.BiometricFingerprintConstants.FingerprintAcquired; import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.common.ICancellationSignal; -import android.hardware.biometrics.fingerprint.ISession; +import android.hardware.biometrics.common.OperationContext; +import android.hardware.biometrics.common.OperationReason; +import android.hardware.biometrics.fingerprint.PointerContext; import android.hardware.fingerprint.Fingerprint; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.hardware.fingerprint.ISidefpsController; import android.hardware.fingerprint.IUdfpsOverlayController; +import android.hardware.keymaster.HardwareAuthToken; import android.os.IBinder; import android.os.RemoteException; import android.util.Slog; @@ -48,7 +51,7 @@ import com.android.server.biometrics.sensors.fingerprint.UdfpsHelper; import java.util.function.Supplier; -class FingerprintEnrollClient extends EnrollClient implements Udfps { +class FingerprintEnrollClient extends EnrollClient implements Udfps { private static final String TAG = "FingerprintEnrollClient"; @@ -61,7 +64,7 @@ class FingerprintEnrollClient extends EnrollClient implements Udfps { private boolean mIsPointerDown; FingerprintEnrollClient(@NonNull Context context, - @NonNull Supplier lazyDaemon, @NonNull IBinder token, long requestId, + @NonNull Supplier lazyDaemon, @NonNull IBinder token, long requestId, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull byte[] hardwareAuthToken, @NonNull String owner, @NonNull BiometricUtils utils, int sensorId, @@ -158,8 +161,7 @@ class FingerprintEnrollClient extends EnrollClient implements Udfps { BiometricNotificationUtils.cancelBadCalibrationNotification(getContext()); try { - mCancellationSignal = getFreshDaemon().enroll( - HardwareAuthTokenUtils.toHardwareAuthToken(mHardwareAuthToken)); + mCancellationSignal = doEnroll(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting enroll", e); onError(BiometricFingerprintConstants.FINGERPRINT_ERROR_UNABLE_TO_PROCESS, @@ -168,11 +170,42 @@ class FingerprintEnrollClient extends EnrollClient implements Udfps { } } + private ICancellationSignal doEnroll() throws RemoteException { + final AidlSession session = getFreshDaemon(); + final HardwareAuthToken hat = + HardwareAuthTokenUtils.toHardwareAuthToken(mHardwareAuthToken); + + if (session.hasContextMethods()) { + final OperationContext context = new OperationContext(); + // TODO: add reason, id, and isAoD + context.id = 0; + context.reason = OperationReason.UNKNOWN; + context.isAoD = false; + context.isCrypto = isCryptoOperation(); + return session.getSession().enrollWithContext(hat, context); + } else { + return session.getSession().enroll(hat); + } + } + @Override public void onPointerDown(int x, int y, float minor, float major) { try { mIsPointerDown = true; - getFreshDaemon().onPointerDown(0 /* pointerId */, x, y, minor, major); + + final AidlSession session = getFreshDaemon(); + if (session.hasContextMethods()) { + final PointerContext context = new PointerContext(); + context.pointerId = 0; + context.x = x; + context.y = y; + context.minor = minor; + context.major = major; + context.isAoD = false; + session.getSession().onPointerDownWithContext(context); + } else { + session.getSession().onPointerDown(0 /* pointerId */, x, y, minor, major); + } } catch (RemoteException e) { Slog.e(TAG, "Unable to send pointer down", e); } @@ -182,7 +215,15 @@ class FingerprintEnrollClient extends EnrollClient implements Udfps { public void onPointerUp() { try { mIsPointerDown = false; - getFreshDaemon().onPointerUp(0 /* pointerId */); + + final AidlSession session = getFreshDaemon(); + if (session.hasContextMethods()) { + final PointerContext context = new PointerContext(); + context.pointerId = 0; + session.getSession().onPointerUpWithContext(context); + } else { + session.getSession().onPointerUp(0 /* pointerId */); + } } catch (RemoteException e) { Slog.e(TAG, "Unable to send pointer up", e); } @@ -196,7 +237,7 @@ class FingerprintEnrollClient extends EnrollClient implements Udfps { @Override public void onUiReady() { try { - getFreshDaemon().onUiReady(); + getFreshDaemon().getSession().onUiReady(); } catch (RemoteException e) { Slog.e(TAG, "Unable to send UI ready", e); } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGenerateChallengeClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGenerateChallengeClient.java index 37131768f6d86..04a7ca086ced7 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGenerateChallengeClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGenerateChallengeClient.java @@ -19,7 +19,6 @@ package com.android.server.biometrics.sensors.fingerprint.aidl; import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.fingerprint.IFingerprint; -import android.hardware.biometrics.fingerprint.ISession; import android.os.IBinder; import android.os.RemoteException; import android.util.Slog; @@ -32,11 +31,11 @@ import java.util.function.Supplier; /** * Fingerprint-specific generateChallenge client for the {@link IFingerprint} AIDL HAL interface. */ -class FingerprintGenerateChallengeClient extends GenerateChallengeClient { +class FingerprintGenerateChallengeClient extends GenerateChallengeClient { private static final String TAG = "FingerprintGenerateChallengeClient"; FingerprintGenerateChallengeClient(@NonNull Context context, - @NonNull Supplier lazyDaemon, + @NonNull Supplier lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull String owner, int sensorId) { @@ -46,7 +45,7 @@ class FingerprintGenerateChallengeClient extends GenerateChallengeClient { +class FingerprintGetAuthenticatorIdClient extends HalClientMonitor { private static final String TAG = "FingerprintGetAuthenticatorIdClient"; private final Map mAuthenticatorIds; FingerprintGetAuthenticatorIdClient(@NonNull Context context, - @NonNull Supplier lazyDaemon, int userId, @NonNull String owner, + @NonNull Supplier lazyDaemon, int userId, @NonNull String owner, int sensorId, Map authenticatorIds) { super(context, lazyDaemon, null /* token */, null /* listener */, userId, owner, 0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_FINGERPRINT, @@ -58,7 +57,7 @@ class FingerprintGetAuthenticatorIdClient extends HalClientMonitor { @Override protected void startHalOperation() { try { - getFreshDaemon().getAuthenticatorId(); + getFreshDaemon().getSession().getAuthenticatorId(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception", e); } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInternalCleanupClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInternalCleanupClient.java index a608ba572f571..0ecad725cbebc 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInternalCleanupClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInternalCleanupClient.java @@ -19,7 +19,6 @@ package com.android.server.biometrics.sensors.fingerprint.aidl; import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.BiometricsProtoEnums; -import android.hardware.biometrics.fingerprint.ISession; import android.hardware.fingerprint.Fingerprint; import android.os.IBinder; @@ -37,10 +36,10 @@ import java.util.function.Supplier; * Fingerprint-specific internal cleanup client supporting the * {@link android.hardware.biometrics.fingerprint.IFingerprint} AIDL interface. */ -class FingerprintInternalCleanupClient extends InternalCleanupClient { +class FingerprintInternalCleanupClient extends InternalCleanupClient { FingerprintInternalCleanupClient(@NonNull Context context, - @NonNull Supplier lazyDaemon, int userId, @NonNull String owner, + @NonNull Supplier lazyDaemon, int userId, @NonNull String owner, int sensorId, @NonNull List enrolledList, @NonNull FingerprintUtils utils, @NonNull Map authenticatorIds) { super(context, lazyDaemon, userId, owner, sensorId, @@ -48,16 +47,16 @@ class FingerprintInternalCleanupClient extends InternalCleanupClient getEnumerateClient(Context context, - Supplier lazyDaemon, IBinder token, int userId, String owner, + protected InternalEnumerateClient getEnumerateClient(Context context, + Supplier lazyDaemon, IBinder token, int userId, String owner, List enrolledList, BiometricUtils utils, int sensorId) { return new FingerprintInternalEnumerateClient(context, lazyDaemon, token, userId, owner, enrolledList, utils, sensorId); } @Override - protected RemovalClient getRemovalClient(Context context, - Supplier lazyDaemon, IBinder token, int biometricId, int userId, + protected RemovalClient getRemovalClient(Context context, + Supplier lazyDaemon, IBinder token, int biometricId, int userId, String owner, BiometricUtils utils, int sensorId, Map authenticatorIds) { return new FingerprintRemovalClient(context, lazyDaemon, token, diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInternalEnumerateClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInternalEnumerateClient.java index e2ec823f00667..06ba6d45b4076 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInternalEnumerateClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInternalEnumerateClient.java @@ -19,7 +19,6 @@ package com.android.server.biometrics.sensors.fingerprint.aidl; import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.BiometricsProtoEnums; -import android.hardware.biometrics.fingerprint.ISession; import android.hardware.fingerprint.Fingerprint; import android.os.IBinder; import android.os.RemoteException; @@ -35,11 +34,11 @@ import java.util.function.Supplier; * Fingerprint-specific internal client supporting the * {@link android.hardware.biometrics.fingerprint.IFingerprint} AIDL interface. */ -class FingerprintInternalEnumerateClient extends InternalEnumerateClient { +class FingerprintInternalEnumerateClient extends InternalEnumerateClient { private static final String TAG = "FingerprintInternalEnumerateClient"; protected FingerprintInternalEnumerateClient(@NonNull Context context, - @NonNull Supplier lazyDaemon, @NonNull IBinder token, int userId, + @NonNull Supplier lazyDaemon, @NonNull IBinder token, int userId, @NonNull String owner, @NonNull List enrolledList, @NonNull BiometricUtils utils, int sensorId) { super(context, lazyDaemon, token, userId, owner, enrolledList, utils, sensorId, @@ -49,7 +48,7 @@ class FingerprintInternalEnumerateClient extends InternalEnumerateClient { +public class FingerprintInvalidationClient extends InvalidationClient { private static final String TAG = "FingerprintInvalidationClient"; public FingerprintInvalidationClient(@NonNull Context context, - @NonNull Supplier lazyDaemon, int userId, int sensorId, + @NonNull Supplier lazyDaemon, int userId, int sensorId, @NonNull Map authenticatorIds, @NonNull IInvalidationCallback callback) { super(context, lazyDaemon, userId, sensorId, authenticatorIds, callback); } @@ -41,7 +40,7 @@ public class FingerprintInvalidationClient extends InvalidationClient { +class FingerprintRemovalClient extends RemovalClient { private static final String TAG = "FingerprintRemovalClient"; private final int[] mBiometricIds; FingerprintRemovalClient(@NonNull Context context, - @NonNull Supplier lazyDaemon, @NonNull IBinder token, + @NonNull Supplier lazyDaemon, @NonNull IBinder token, @Nullable ClientMonitorCallbackConverter listener, int[] biometricIds, int userId, @NonNull String owner, @NonNull BiometricUtils utils, int sensorId, @NonNull Map authenticatorIds) { @@ -55,7 +54,7 @@ class FingerprintRemovalClient extends RemovalClient { @Override protected void startHalOperation() { try { - getFreshDaemon().removeEnrollments(mBiometricIds); + getFreshDaemon().getSession().removeEnrollments(mBiometricIds); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting remove", 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 9c7df589d29f2..0e64dab5d3253 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 @@ -20,7 +20,6 @@ import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.fingerprint.IFingerprint; -import android.hardware.biometrics.fingerprint.ISession; import android.hardware.keymaster.HardwareAuthToken; import android.os.RemoteException; import android.util.Slog; @@ -41,7 +40,7 @@ import java.util.function.Supplier; * Updates the framework's lockout cache and notifies clients such as Keyguard when lockout is * cleared. */ -class FingerprintResetLockoutClient extends HalClientMonitor implements ErrorConsumer { +class FingerprintResetLockoutClient extends HalClientMonitor implements ErrorConsumer { private static final String TAG = "FingerprintResetLockoutClient"; @@ -50,7 +49,7 @@ class FingerprintResetLockoutClient extends HalClientMonitor implement private final LockoutResetDispatcher mLockoutResetDispatcher; FingerprintResetLockoutClient(@NonNull Context context, - @NonNull Supplier lazyDaemon, int userId, String owner, int sensorId, + @NonNull Supplier lazyDaemon, int userId, String owner, int sensorId, @NonNull byte[] hardwareAuthToken, @NonNull LockoutCache lockoutTracker, @NonNull LockoutResetDispatcher lockoutResetDispatcher) { super(context, lazyDaemon, null /* token */, null /* listener */, userId, owner, @@ -75,7 +74,7 @@ class FingerprintResetLockoutClient extends HalClientMonitor implement @Override protected void startHalOperation() { try { - getFreshDaemon().resetLockout(mHardwareAuthToken); + getFreshDaemon().getSession().resetLockout(mHardwareAuthToken); } catch (RemoteException e) { Slog.e(TAG, "Unable to reset lockout", e); mCallback.onClientFinished(this, false /* success */); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintRevokeChallengeClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintRevokeChallengeClient.java index 28292010fe748..fd938677105cf 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintRevokeChallengeClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintRevokeChallengeClient.java @@ -19,7 +19,6 @@ package com.android.server.biometrics.sensors.fingerprint.aidl; import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.fingerprint.IFingerprint; -import android.hardware.biometrics.fingerprint.ISession; import android.os.IBinder; import android.os.RemoteException; import android.util.Slog; @@ -31,14 +30,14 @@ import java.util.function.Supplier; /** * Fingerprint-specific revokeChallenge client for the {@link IFingerprint} AIDL HAL interface. */ -class FingerprintRevokeChallengeClient extends RevokeChallengeClient { +class FingerprintRevokeChallengeClient extends RevokeChallengeClient { private static final String TAG = "FingerpirntRevokeChallengeClient"; private final long mChallenge; FingerprintRevokeChallengeClient(@NonNull Context context, - @NonNull Supplier lazyDaemon, @NonNull IBinder token, + @NonNull Supplier lazyDaemon, @NonNull IBinder token, int userId, @NonNull String owner, int sensorId, long challenge) { super(context, lazyDaemon, token, userId, owner, sensorId); mChallenge = challenge; @@ -47,7 +46,7 @@ class FingerprintRevokeChallengeClient extends RevokeChallengeClient { @Override protected void startHalOperation() { try { - getFreshDaemon().revokeChallenge(mChallenge); + getFreshDaemon().getSession().revokeChallenge(mChallenge); } catch (RemoteException e) { Slog.e(TAG, "Unable to revokeChallenge", e); mCallback.onClientFinished(this, false /* success */); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintStartUserClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintStartUserClient.java index ef53df4ca594f..9dc06e1e0665f 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintStartUserClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintStartUserClient.java @@ -55,10 +55,12 @@ public class FingerprintStartUserClient extends StartUserClient { +public class FingerprintStopUserClient extends StopUserClient { private static final String TAG = "FingerprintStopUserClient"; public FingerprintStopUserClient(@NonNull Context context, - @NonNull Supplier lazyDaemon, @Nullable IBinder token, int userId, + @NonNull Supplier lazyDaemon, @Nullable IBinder token, int userId, int sensorId, @NonNull UserStoppedCallback callback) { super(context, lazyDaemon, token, userId, sensorId, callback); } @@ -47,7 +46,7 @@ public class FingerprintStopUserClient extends StopUserClient { @Override protected void startHalOperation() { try { - getFreshDaemon().close(); + getFreshDaemon().getSession().close(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception", e); getCallback().onClientFinished(this, false /* success */); @@ -56,6 +55,5 @@ public class FingerprintStopUserClient extends StopUserClient { @Override public void unableToStart() { - } } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java index e1e73a32661a3..22762329926b5 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java @@ -86,24 +86,8 @@ class Sensor { @NonNull private final LockoutCache mLockoutCache; @NonNull private final Map mAuthenticatorIds; - @Nullable private Session mCurrentSession; - @NonNull private final Supplier mLazySession; - - static class Session { - @NonNull private final String mTag; - @NonNull private final ISession mSession; - private final int mUserId; - @NonNull final HalSessionCallback mHalSessionCallback; - - Session(@NonNull String tag, @NonNull ISession session, int userId, - @NonNull HalSessionCallback halSessionCallback) { - mTag = tag; - mSession = session; - mUserId = userId; - mHalSessionCallback = halSessionCallback; - Slog.d(mTag, "New session created for user: " + userId); - } - } + @Nullable private AidlSession mCurrentSession; + @NonNull private final Supplier mLazySession; static class HalSessionCallback extends ISessionCallback.Stub { @@ -452,7 +436,7 @@ class Sensor { mScheduler = new UserAwareBiometricScheduler(tag, BiometricScheduler.sensorTypeFromFingerprintProperties(mSensorProperties), gestureAvailabilityDispatcher, - () -> mCurrentSession != null ? mCurrentSession.mUserId : UserHandle.USER_NULL, + () -> mCurrentSession != null ? mCurrentSession.getUserId() : UserHandle.USER_NULL, new UserAwareBiometricScheduler.UserSwitchCallback() { @NonNull @Override @@ -464,20 +448,21 @@ class Sensor { @NonNull @Override public StartUserClient getStartUserClient(int newUserId) { - final HalSessionCallback.Callback callback = () -> { - Slog.e(mTag, "Got ERROR_HW_UNAVAILABLE"); - mCurrentSession = null; - }; - final int sensorId = mSensorProperties.sensorId; final HalSessionCallback resultController = new HalSessionCallback(mContext, mHandler, mTag, mScheduler, sensorId, newUserId, mLockoutCache, - lockoutResetDispatcher, callback); + lockoutResetDispatcher, () -> { + Slog.e(mTag, "Got ERROR_HW_UNAVAILABLE"); + mCurrentSession = null; + }); final StartUserClient.UserStartedCallback userStartedCallback = - (userIdStarted, newSession) -> { - mCurrentSession = new Session(mTag, + (userIdStarted, newSession, halInterfaceVersion) -> { + Slog.d(mTag, "New session created for user: " + + userIdStarted + " with hal version: " + + halInterfaceVersion); + mCurrentSession = new AidlSession(halInterfaceVersion, newSession, userIdStarted, resultController); if (FingerprintUtils.getInstance(sensorId) .isInvalidationInProgress(mContext, userIdStarted)) { @@ -497,10 +482,10 @@ class Sensor { } }); mAuthenticatorIds = new HashMap<>(); - mLazySession = () -> mCurrentSession != null ? mCurrentSession.mSession : null; + mLazySession = () -> mCurrentSession != null ? mCurrentSession : null; } - @NonNull Supplier getLazySession() { + @NonNull Supplier getLazySession() { return mLazySession; } @@ -508,8 +493,8 @@ class Sensor { return mSensorProperties; } - @Nullable Session getSessionForUser(int userId) { - if (mCurrentSession != null && mCurrentSession.mUserId == userId) { + @Nullable AidlSession getSessionForUser(int userId) { + if (mCurrentSession != null && mCurrentSession.getUserId() == userId) { return mCurrentSession; } else { return null; @@ -539,10 +524,10 @@ class Sensor { if (enabled != mTestHalEnabled) { // The framework should retrieve a new session from the HAL. try { - if (mCurrentSession != null && mCurrentSession.mSession != null) { + if (mCurrentSession != null) { // TODO(181984005): This should be scheduled instead of directly invoked Slog.d(mTag, "Closing old session"); - mCurrentSession.mSession.close(); + mCurrentSession.getSession().close(); } } catch (RemoteException e) { Slog.e(mTag, "RemoteException", e); diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/UserAwareBiometricSchedulerTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/UserAwareBiometricSchedulerTest.java index 25904e026b608..30777cd79a0c1 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/UserAwareBiometricSchedulerTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/UserAwareBiometricSchedulerTest.java @@ -217,7 +217,7 @@ public class UserAwareBiometricSchedulerTest { int numInvocations; @Override - public void onUserStarted(int newUserId, Object newObject) { + public void onUserStarted(int newUserId, Object newObject, int halInterfaceVersion) { numInvocations++; mCurrentUserId = newUserId; } @@ -270,7 +270,8 @@ public class UserAwareBiometricSchedulerTest { mCallback = callback; if (mShouldFinish) { - mUserStartedCallback.onUserStarted(getTargetUserId(), new Object()); + mUserStartedCallback.onUserStarted( + getTargetUserId(), new Object(), 1 /* halInterfaceVersion */); callback.onClientFinished(this, true /* success */); } } diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/SensorTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/SensorTest.java index 2718bf90d8572..61e4776e9c504 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/SensorTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/SensorTest.java @@ -101,8 +101,8 @@ public class SensorTest { mLockoutCache.setLockoutModeForUser(USER_ID, LockoutTracker.LOCKOUT_TIMED); mScheduler.scheduleClientMonitor(new FaceResetLockoutClient(mContext, - () -> mSession, USER_ID, TAG, SENSOR_ID, HAT, mLockoutCache, - mLockoutResetDispatcher)); + () -> new AidlSession(1, mSession, USER_ID, mHalCallback), + USER_ID, TAG, SENSOR_ID, HAT, mLockoutCache, mLockoutResetDispatcher)); mLooper.dispatchAll(); verifyNotLocked(); diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/SensorTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/SensorTest.java index d4609b55afba7..8b7b484b84624 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/SensorTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/SensorTest.java @@ -101,8 +101,8 @@ public class SensorTest { mLockoutCache.setLockoutModeForUser(USER_ID, LockoutTracker.LOCKOUT_TIMED); mScheduler.scheduleClientMonitor(new FingerprintResetLockoutClient(mContext, - () -> mSession, USER_ID, TAG, SENSOR_ID, HAT, mLockoutCache, - mLockoutResetDispatcher)); + () -> new AidlSession(1, mSession, USER_ID, mHalCallback), + USER_ID, TAG, SENSOR_ID, HAT, mLockoutCache, mLockoutResetDispatcher)); mLooper.dispatchAll(); verifyNotLocked();