diff options
| author | 2020-07-01 17:50:24 -0700 | |
|---|---|---|
| committer | 2020-07-07 15:03:21 -0700 | |
| commit | 1a8ab724eb1473daf9a5ad44577c7067bd911704 (patch) | |
| tree | cd73fd385e700d02d80f3aaecfd75d49ee6a3efa | |
| parent | 71520ed21765f93aca2ab4a4823dcf9f58959c3a (diff) | |
24/n: Use lazy retrieval for HAL
Instead of passing it in through ClientMonitor#start, which causes
whatever is scheduling the ClientMonitors to require knowledge of
the HAL type, make it a parameter in the constructor that allows for
lazy retrieval.
1) Reminder that we should always retrieve a fresh pointer to the
HAL, in case it crashed previously, or is stale, or was never
loaded, etc. This functionality is preserved
2) As mentioned above, this allows the scheduler to remain agnostic
of HAL type
Bug: 157790417
Test: Enroll, auth for fingerprint/face devices
Change-Id: Ib61cfecec17dc2b33937e089bdb9777f50e7a836
29 files changed, 242 insertions, 192 deletions
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 466465e0a3f5..93723ad48476 100644 --- a/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java @@ -47,12 +47,12 @@ public abstract class AcquisitionClient<T> extends ClientMonitor<T> private final VibrationEffect mSuccessVibrationEffect; private final VibrationEffect mErrorVibrationEffect; - AcquisitionClient(@NonNull Context context, @NonNull IBinder token, - @NonNull ClientMonitorCallbackConverter listener, int userId, + AcquisitionClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon, + @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull String owner, int cookie, int sensorId, int statsModality, int statsAction, int statsClient) { - super(context, token, listener, userId, owner, cookie, sensorId, statsModality, statsAction, - statsClient); + super(context, lazyDaemon, token, listener, userId, owner, cookie, sensorId, statsModality, + 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 a9cefbaf8ac0..5ba437f9a310 100644 --- a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java @@ -52,12 +52,13 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T> { protected boolean mAuthAttempted; - public AuthenticationClient(@NonNull Context context, @NonNull IBinder token, - @NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId, - boolean restricted, @NonNull String owner, int cookie, boolean requireConfirmation, - int sensorId, boolean isStrongBiometric, int statsModality, int statsClient, - @NonNull TaskStackListener taskStackListener, @NonNull LockoutTracker lockoutTracker) { - super(context, token, listener, targetUserId, owner, cookie, sensorId, + public AuthenticationClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon, + @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, + int targetUserId, long operationId, boolean restricted, @NonNull String owner, + int cookie, boolean requireConfirmation, int sensorId, boolean isStrongBiometric, + int statsModality, int statsClient, @NonNull TaskStackListener taskStackListener, + @NonNull LockoutTracker lockoutTracker) { + super(context, lazyDaemon, token, listener, targetUserId, owner, cookie, sensorId, statsModality, BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient); mIsStrongBiometric = isStrongBiometric; mOperationId = operationId; @@ -187,8 +188,8 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T> { * Start authentication */ @Override - public void start(@NonNull T daemon, @NonNull FinishCallback finishCallback) { - super.start(daemon, finishCallback); + public void start(@NonNull FinishCallback finishCallback) { + super.start(finishCallback); final @LockoutTracker.LockoutMode int lockoutMode = mLockoutTracker.getLockoutModeForUser(getTargetUserId()); diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/sensors/BiometricServiceBase.java index d7c1414cc069..aff839fef2ae 100644 --- a/services/core/java/com/android/server/biometrics/sensors/BiometricServiceBase.java +++ b/services/core/java/com/android/server/biometrics/sensors/BiometricServiceBase.java @@ -736,7 +736,7 @@ public abstract class BiometricServiceBase<T> extends SystemService return; } - final T daemon = getDaemon(); + final T daemon = mCurrentClient.getFreshDaemon(); if (daemon == null) { Slog.e(getTag(), "Daemon null, unable to start: " + mCurrentClient.getClass().getSimpleName()); @@ -745,7 +745,7 @@ public abstract class BiometricServiceBase<T> extends SystemService return; } - mCurrentClient.start(daemon, mClientFinishCallback); + mCurrentClient.start(mClientFinishCallback); notifyClientActiveCallbacks(true); } 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 5a2d63d667db..a635665d4908 100644 --- a/services/core/java/com/android/server/biometrics/sensors/ClientMonitor.java +++ b/services/core/java/com/android/server/biometrics/sensors/ClientMonitor.java @@ -51,7 +51,18 @@ public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinde void onClientFinished(ClientMonitor clientMonitor); } + /** + * Interface that allows ClientMonitor subclasses to retrieve a fresh instance to the HAL. + */ + public interface LazyDaemon<T> { + /** + * @return A fresh instance to the biometric HAL + */ + T getDaemon(); + } + @NonNull private final Context mContext; + @NonNull protected final LazyDaemon<T> mLazyDaemon; private final int mTargetUserId; @NonNull private final String mOwner; private final int mSensorId; // sensorId as configured by the framework @@ -63,11 +74,11 @@ public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinde private final int mCookie; boolean mAlreadyDone; - @NonNull protected T mDaemon; @NonNull protected FinishCallback mFinishCallback; /** * @param context system_server context + * @param lazyDaemon pointer for lazy retrieval of the HAL * @param token a unique token for the client * @param listener recipient of related events (e.g. authentication) * @param userId target user id for operation @@ -78,12 +89,13 @@ public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinde * @param statsAction One of {@link BiometricsProtoEnums} ACTION_* constants * @param statsClient One of {@link BiometricsProtoEnums} CLIENT_* constants */ - public ClientMonitor(@NonNull Context context, @Nullable IBinder token, - @Nullable ClientMonitorCallbackConverter listener, int userId, @NonNull String owner, - int cookie, int sensorId, int statsModality, int statsAction, + public ClientMonitor(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon, + @Nullable IBinder token, @Nullable ClientMonitorCallbackConverter listener, int userId, + @NonNull String owner, int cookie, int sensorId, int statsModality, int statsAction, int statsClient) { super(statsModality, statsAction, statsClient); mContext = context; + mLazyDaemon = lazyDaemon; mToken = token; mListener = listener; mTargetUserId = userId; @@ -107,18 +119,16 @@ public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinde /** * 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(Object, FinishCallback)}. + * {@link #start(FinishCallback)}. */ public abstract void unableToStart(); /** * Starts the ClientMonitor's lifecycle. Invokes {@link #startHalOperation()} when internal book * keeping is complete. - * @param daemon reference to the HAL * @param finishCallback invoked when the operation is complete (succeeds, fails, etc) */ - public void start(@NonNull T daemon, @NonNull FinishCallback finishCallback) { - mDaemon = daemon; + public void start(@NonNull FinishCallback finishCallback) { mFinishCallback = finishCallback; } @@ -190,4 +200,8 @@ public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinde public final int getSensorId() { return mSensorId; } + + public final T getFreshDaemon() { + return mLazyDaemon.getDaemon(); + } } 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 6637ede62b80..939c4203ec88 100644 --- a/services/core/java/com/android/server/biometrics/sensors/EnrollClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/EnrollClient.java @@ -41,13 +41,14 @@ public abstract class EnrollClient<T> extends AcquisitionClient<T> { private long mEnrollmentStartTimeMs; private boolean mAlreadyCancelled; - public EnrollClient(@NonNull Context context, @NonNull IBinder token, - @NonNull ClientMonitorCallbackConverter listener, int userId, + public EnrollClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon, + @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) { - super(context, token, listener, userId, owner, 0 /* cookie */, sensorId, statsModality, - BiometricsProtoEnums.ACTION_ENROLL, BiometricsProtoEnums.CLIENT_UNKNOWN); + super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId, + statsModality, BiometricsProtoEnums.ACTION_ENROLL, + BiometricsProtoEnums.CLIENT_UNKNOWN); mBiometricUtils = utils; mHardwareAuthToken = Arrays.copyOf(hardwareAuthToken, hardwareAuthToken.length); mTimeoutSec = timeoutSec; @@ -87,8 +88,8 @@ public abstract class EnrollClient<T> extends AcquisitionClient<T> { } @Override - public void start(@NonNull T daemon, @NonNull FinishCallback finishCallback) { - super.start(daemon, finishCallback); + public void start(@NonNull FinishCallback finishCallback) { + super.start(finishCallback); mEnrollmentStartTimeMs = System.currentTimeMillis(); startHalOperation(); 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 12584cfa7af3..bf3c60ce771a 100644 --- a/services/core/java/com/android/server/biometrics/sensors/GenerateChallengeClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/GenerateChallengeClient.java @@ -29,9 +29,10 @@ public abstract class GenerateChallengeClient<T> extends ClientMonitor<T> { protected long mChallenge; - public GenerateChallengeClient(Context context, IBinder token, - ClientMonitorCallbackConverter listener, String owner, int sensorId) { - super(context, token, listener, 0 /* userId */, owner, 0 /* cookie */, sensorId, + public GenerateChallengeClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon, + @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, + @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); } @@ -46,8 +47,8 @@ public abstract class GenerateChallengeClient<T> extends ClientMonitor<T> { } @Override - public void start(@NonNull T daemon, @NonNull FinishCallback finishCallback) { - super.start(daemon, finishCallback); + public void start(@NonNull FinishCallback finishCallback) { + super.start(finishCallback); startHalOperation(); try { 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 f3ade65d6748..5faf73a3cb2e 100644 --- a/services/core/java/com/android/server/biometrics/sensors/InternalCleanupClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/InternalCleanupClient.java @@ -85,19 +85,20 @@ public abstract class InternalCleanupClient<T> extends ClientMonitor<T> mFinishCallback.onClientFinished(this); }; - protected abstract InternalEnumerateClient<T> getEnumerateClient(Context context, IBinder token, - int userId, String owner, + protected abstract InternalEnumerateClient<T> getEnumerateClient(Context context, + LazyDaemon<T> lazyDaemon, IBinder token, int userId, String owner, List<? extends BiometricAuthenticator.Identifier> enrolledList, BiometricUtils utils, int sensorId); - protected abstract RemovalClient<T> getRemovalClient(Context context, IBinder token, - int biometricId, int userId, String owner, BiometricUtils utils, int sensorId); + protected abstract RemovalClient<T> getRemovalClient(Context context, LazyDaemon<T> lazyDaemon, + IBinder token, int biometricId, int userId, String owner, BiometricUtils utils, + int sensorId); - protected InternalCleanupClient(@NonNull Context context, int userId, - @NonNull String owner, int sensorId, int statsModality, + protected InternalCleanupClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon, + int userId, @NonNull String owner, int sensorId, int statsModality, @NonNull List<? extends BiometricAuthenticator.Identifier> enrolledList, @NonNull BiometricUtils utils) { - super(context, null /* token */, null /* ClientMonitorCallbackConverter */, + super(context, lazyDaemon, null /* token */, null /* ClientMonitorCallbackConverter */, userId, owner, 0 /* cookie */, sensorId, statsModality, BiometricsProtoEnums.ACTION_ENUMERATE, BiometricsProtoEnums.CLIENT_UNKNOWN); mBiometricUtils = utils; @@ -107,13 +108,13 @@ public abstract class InternalCleanupClient<T> extends ClientMonitor<T> private void startCleanupUnknownHalTemplates() { UserTemplate template = mUnknownHALTemplates.get(0); mUnknownHALTemplates.remove(template); - mCurrentTask = getRemovalClient(getContext(), getToken(), + mCurrentTask = getRemovalClient(getContext(), mLazyDaemon, getToken(), template.mIdentifier.getBiometricId(), template.mUserId, getContext().getPackageName(), mBiometricUtils, getSensorId()); FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED, mStatsModality, BiometricsProtoEnums.ISSUE_UNKNOWN_TEMPLATE_ENROLLED_HAL); - mCurrentTask.start(mDaemon, mRemoveFinishCallback); + mCurrentTask.start(mRemoveFinishCallback); } @Override @@ -122,13 +123,13 @@ public abstract class InternalCleanupClient<T> extends ClientMonitor<T> } @Override - public void start(@NonNull T daemon, @NonNull FinishCallback finishCallback) { - super.start(daemon, finishCallback); + public void start(@NonNull FinishCallback finishCallback) { + super.start(finishCallback); // Start enumeration. Removal will start if necessary, when enumeration is completed. - mCurrentTask = getEnumerateClient(getContext(), getToken(), getTargetUserId(), + mCurrentTask = getEnumerateClient(getContext(), mLazyDaemon, getToken(), getTargetUserId(), getOwnerString(), mEnrolledList, mBiometricUtils, getSensorId()); - mCurrentTask.start(daemon, mEnumerateFinishCallback); + mCurrentTask.start(mEnumerateFinishCallback); } @Override 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 9ce271c656c8..12c7e5fbdc12 100644 --- a/services/core/java/com/android/server/biometrics/sensors/InternalEnumerateClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/InternalEnumerateClient.java @@ -43,13 +43,13 @@ public abstract class InternalEnumerateClient<T> extends ClientMonitor<T> // List of templates to remove from the HAL private List<BiometricAuthenticator.Identifier> mUnknownHALTemplates = new ArrayList<>(); - protected InternalEnumerateClient(@NonNull Context context, @NonNull IBinder token, int userId, - @NonNull String owner, + protected InternalEnumerateClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon, + @NonNull IBinder token, int userId, @NonNull String owner, @NonNull List<? extends BiometricAuthenticator.Identifier> enrolledList, @NonNull BiometricUtils utils, int sensorId, int statsModality) { // Internal enumerate does not need to send results to anyone. Cleanup (enumerate + remove) // is all done internally. - super(context, token, null /* ClientMonitorCallbackConverter */, userId, owner, + super(context, lazyDaemon, token, null /* ClientMonitorCallbackConverter */, userId, owner, 0 /* cookie */, sensorId, statsModality, BiometricsProtoEnums.ACTION_ENUMERATE, BiometricsProtoEnums.CLIENT_UNKNOWN); mEnrolledList = enrolledList; @@ -72,8 +72,8 @@ public abstract class InternalEnumerateClient<T> extends ClientMonitor<T> } @Override - public void start(@NonNull T daemon, @NonNull FinishCallback finishCallback) { - super.start(daemon, finishCallback); + public void start(@NonNull FinishCallback finishCallback) { + super.start(finishCallback); // The biometric template ids will be removed when we get confirmation from the HAL startHalOperation(); 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 b734516322e4..672d8fd175bc 100644 --- a/services/core/java/com/android/server/biometrics/sensors/RemovalClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/RemovalClient.java @@ -34,11 +34,13 @@ public abstract class RemovalClient<T> extends ClientMonitor<T> implements Remov protected final int mBiometricId; private final BiometricUtils mBiometricUtils; - public RemovalClient(@NonNull Context context, @NonNull IBinder token, - @NonNull ClientMonitorCallbackConverter listener, int biometricId, int userId, - @NonNull String owner, @NonNull BiometricUtils utils, int sensorId, int statsModality) { - super(context, token, listener, userId, owner, 0 /* cookie */, sensorId, statsModality, - BiometricsProtoEnums.ACTION_REMOVE, BiometricsProtoEnums.CLIENT_UNKNOWN); + public RemovalClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon, + @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, + int biometricId, int userId, @NonNull String owner, @NonNull BiometricUtils utils, + int sensorId, int statsModality) { + super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId, + statsModality, BiometricsProtoEnums.ACTION_REMOVE, + BiometricsProtoEnums.CLIENT_UNKNOWN); mBiometricId = biometricId; mBiometricUtils = utils; } @@ -49,8 +51,8 @@ public abstract class RemovalClient<T> extends ClientMonitor<T> implements Remov } @Override - public void start(@NonNull T daemon, @NonNull FinishCallback finishCallback) { - super.start(daemon, finishCallback); + public void start(@NonNull FinishCallback finishCallback) { + super.start(finishCallback); // The biometric template ids will be removed when we get confirmation from the HAL startHalOperation(); 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 e00396b054e6..fdf33beea205 100644 --- a/services/core/java/com/android/server/biometrics/sensors/RevokeChallengeClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/RevokeChallengeClient.java @@ -23,10 +23,11 @@ import android.os.IBinder; public abstract class RevokeChallengeClient<T> extends ClientMonitor<T> { - public RevokeChallengeClient(Context context, IBinder token, String owner, int sensorId) { - super(context, token, null /* listener */, 0 /* userId */, owner, 0 /* cookie */, sensorId, - BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN, - BiometricsProtoEnums.CLIENT_UNKNOWN); + public RevokeChallengeClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon, + @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); } @Override @@ -35,8 +36,8 @@ public abstract class RevokeChallengeClient<T> extends ClientMonitor<T> { } @Override - public void start(@NonNull T daemon, @NonNull FinishCallback finishCallback) { - super.start(daemon, finishCallback); + public void start(@NonNull FinishCallback finishCallback) { + super.start(finishCallback); startHalOperation(); mFinishCallback.onClientFinished(this); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticationClient.java index a54357e922d2..105ad652848d 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticationClient.java @@ -62,13 +62,14 @@ class FaceAuthenticationClient extends AuthenticationClient<IBiometricsFace> { private int mLastAcquire; - FaceAuthenticationClient(@NonNull Context context, @NonNull IBinder token, + FaceAuthenticationClient(@NonNull Context context, + @NonNull LazyDaemon<IBiometricsFace> lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId, boolean restricted, String owner, int cookie, boolean requireConfirmation, int sensorId, boolean isStrongBiometric, int statsClient, @NonNull TaskStackListener taskStackListener, @NonNull LockoutTracker lockoutTracker, @NonNull UsageStats usageStats) { - super(context, token, listener, targetUserId, operationId, restricted, + super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted, owner, cookie, requireConfirmation, sensorId, isStrongBiometric, BiometricsProtoEnums.MODALITY_FACE, statsClient, taskStackListener, lockoutTracker); @@ -89,7 +90,7 @@ class FaceAuthenticationClient extends AuthenticationClient<IBiometricsFace> { @Override protected void startHalOperation() { try { - mDaemon.authenticate(mOperationId); + getFreshDaemon().authenticate(mOperationId); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting auth", e); onError(BiometricFaceConstants.FACE_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */); @@ -100,7 +101,7 @@ class FaceAuthenticationClient extends AuthenticationClient<IBiometricsFace> { @Override protected void stopHalOperation() { try { - mDaemon.cancel(); + getFreshDaemon().cancel(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting cancel", e); onError(BiometricFaceConstants.FACE_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceEnrollClient.java index b63b39e3cf6c..aa7e19cb077d 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceEnrollClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceEnrollClient.java @@ -51,13 +51,14 @@ public class FaceEnrollClient extends EnrollClient<IBiometricsFace> { @NonNull private final int[] mEnrollIgnoreList; @NonNull private final int[] mEnrollIgnoreListVendor; - FaceEnrollClient(@NonNull Context context, @NonNull IBinder token, - @NonNull ClientMonitorCallbackConverter listener, int userId, + FaceEnrollClient(@NonNull Context context, @NonNull LazyDaemon<IBiometricsFace> lazyDaemon, + @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull byte[] hardwareAuthToken, @NonNull String owner, @NonNull BiometricUtils utils, @NonNull int[] disabledFeatures, int timeoutSec, @Nullable NativeHandle surfaceHandle, int sensorId) { - super(context, token, listener, userId, hardwareAuthToken, owner, utils, timeoutSec, - BiometricsProtoEnums.MODALITY_FACE, sensorId, false /* shouldVibrate */); + super(context, lazyDaemon, token, listener, userId, hardwareAuthToken, owner, utils, + timeoutSec, BiometricsProtoEnums.MODALITY_FACE, sensorId, + false /* shouldVibrate */); mDisabledFeatures = Arrays.copyOf(disabledFeatures, disabledFeatures.length); mSurfaceHandle = surfaceHandle; mEnrollIgnoreList = getContext().getResources() @@ -89,13 +90,13 @@ public class FaceEnrollClient extends EnrollClient<IBiometricsFace> { } android.hardware.biometrics.face.V1_1.IBiometricsFace daemon11 = - android.hardware.biometrics.face.V1_1.IBiometricsFace.castFrom(mDaemon); + android.hardware.biometrics.face.V1_1.IBiometricsFace.castFrom(getFreshDaemon()); try { final int status; if (daemon11 != null) { status = daemon11.enroll_1_1(token, mTimeoutSec, disabledFeatures, mSurfaceHandle); } else if (mSurfaceHandle == null) { - status = mDaemon.enroll(token, mTimeoutSec, disabledFeatures); + status = getFreshDaemon().enroll(token, mTimeoutSec, disabledFeatures); } else { Slog.e(TAG, "enroll(): surface is only supported in @1.1 HAL"); status = BiometricFaceConstants.FACE_ERROR_UNABLE_TO_PROCESS; @@ -114,7 +115,7 @@ public class FaceEnrollClient extends EnrollClient<IBiometricsFace> { @Override protected void stopHalOperation() { try { - mDaemon.cancel(); + getFreshDaemon().cancel(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting cancel", e); onError(BiometricFaceConstants.FACE_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceGenerateChallengeClient.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceGenerateChallengeClient.java index 72188a516d65..67f2712d0b9d 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceGenerateChallengeClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceGenerateChallengeClient.java @@ -36,15 +36,16 @@ public class FaceGenerateChallengeClient extends GenerateChallengeClient<IBiomet private static final String TAG = "FaceGenerateChallengeClient"; private static final int CHALLENGE_TIMEOUT_SEC = 600; // 10 minutes - FaceGenerateChallengeClient(@NonNull Context context, @NonNull IBinder token, + FaceGenerateChallengeClient(@NonNull Context context, + @NonNull LazyDaemon<IBiometricsFace> lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, @NonNull String owner, int sensorId) { - super(context, token, listener, owner, sensorId); + super(context, lazyDaemon, token, listener, owner, sensorId); } @Override protected void startHalOperation() { try { - mChallenge = mDaemon.generateChallenge(CHALLENGE_TIMEOUT_SEC).value; + mChallenge = getFreshDaemon().generateChallenge(CHALLENGE_TIMEOUT_SEC).value; } catch (RemoteException e) { Slog.e(TAG, "generateChallenge failed", e); } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceGetFeatureClient.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceGetFeatureClient.java index 227d817e31ff..a4d2d68a49d3 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceGetFeatureClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceGetFeatureClient.java @@ -40,10 +40,10 @@ public class FaceGetFeatureClient extends ClientMonitor<IBiometricsFace> { private final int mFeature; private final int mFaceId; - FaceGetFeatureClient(@NonNull Context context, @NonNull IBinder token, - @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull String owner, - int sensorId, int feature, int faceId) { - super(context, token, listener, userId, owner, 0 /* cookie */, sensorId, + FaceGetFeatureClient(@NonNull Context context, @NonNull LazyDaemon<IBiometricsFace> lazyDaemon, + @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, + @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); mFeature = feature; @@ -61,15 +61,15 @@ public class FaceGetFeatureClient extends ClientMonitor<IBiometricsFace> { } @Override - public void start(@NonNull IBiometricsFace daemon, @NonNull FinishCallback finishCallback) { - super.start(daemon, finishCallback); + public void start(@NonNull FinishCallback finishCallback) { + super.start(finishCallback); startHalOperation(); } @Override protected void startHalOperation() { try { - final OptionalBool result = mDaemon.getFeature(mFeature, mFaceId); + final OptionalBool result = getFreshDaemon().getFeature(mFeature, mFaceId); getListener().onFeatureGet(result.status == Status.OK, mFeature, result.value); } catch (RemoteException e) { Slog.e(TAG, "Unable to getFeature", e); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceInternalCleanupClient.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceInternalCleanupClient.java index 388baa226dee..4c09d1f364f8 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceInternalCleanupClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceInternalCleanupClient.java @@ -37,28 +37,31 @@ import java.util.List; */ class FaceInternalCleanupClient extends InternalCleanupClient<IBiometricsFace> { - FaceInternalCleanupClient(@NonNull Context context, int userId, @NonNull String owner, + FaceInternalCleanupClient(@NonNull Context context, + @NonNull LazyDaemon<IBiometricsFace> lazyDaemon, int userId, @NonNull String owner, int sensorId, @NonNull List<? extends BiometricAuthenticator.Identifier> enrolledList, @NonNull BiometricUtils utils) { - super(context, userId, owner, sensorId, BiometricsProtoEnums.MODALITY_FACE, enrolledList, - utils); + super(context, lazyDaemon, userId, owner, sensorId, BiometricsProtoEnums.MODALITY_FACE, + enrolledList, utils); } @Override protected InternalEnumerateClient<IBiometricsFace> getEnumerateClient(Context context, - IBinder token, int userId, String owner, + LazyDaemon<IBiometricsFace> lazyDaemon, IBinder token, int userId, String owner, List<? extends BiometricAuthenticator.Identifier> enrolledList, BiometricUtils utils, int sensorId) { - return new FaceInternalEnumerateClient(context, token, userId, owner, enrolledList, utils, - sensorId); + return new FaceInternalEnumerateClient(context, lazyDaemon, token, userId, owner, + enrolledList, utils, sensorId); } @Override - protected RemovalClient<IBiometricsFace> getRemovalClient(Context context, IBinder token, + protected RemovalClient<IBiometricsFace> getRemovalClient(Context context, + LazyDaemon<IBiometricsFace> lazyDaemon, IBinder token, int biometricId, int userId, String owner, BiometricUtils utils, int sensorId) { // Internal remove does not need to send results to anyone. Cleanup (enumerate + remove) // is all done internally. - return new FaceRemovalClient(context, token, null /* ClientMonitorCallbackConverter */, - biometricId, userId, owner, utils, sensorId); + return new FaceRemovalClient(context, lazyDaemon, token, + null /* ClientMonitorCallbackConverter */, biometricId, userId, owner, utils, + sensorId); } } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceInternalEnumerateClient.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceInternalEnumerateClient.java index c6749c5713d9..bf0ce69c9d09 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceInternalEnumerateClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceInternalEnumerateClient.java @@ -38,18 +38,19 @@ import java.util.List; class FaceInternalEnumerateClient extends InternalEnumerateClient<IBiometricsFace> { private static final String TAG = "FaceInternalEnumerateClient"; - FaceInternalEnumerateClient(@NonNull Context context, @NonNull IBinder token, int userId, + FaceInternalEnumerateClient(@NonNull Context context, + @NonNull LazyDaemon<IBiometricsFace> lazyDaemon, @NonNull IBinder token, int userId, @NonNull String owner, @NonNull List<? extends BiometricAuthenticator.Identifier> enrolledList, @NonNull BiometricUtils utils, int sensorId) { - super(context, token, userId, owner, enrolledList, utils, sensorId, + super(context, lazyDaemon, token, userId, owner, enrolledList, utils, sensorId, BiometricsProtoEnums.MODALITY_FACE); } @Override protected void startHalOperation() { try { - mDaemon.enumerate(); + getFreshDaemon().enumerate(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting enumerate", e); mFinishCallback.onClientFinished(this); @@ -59,7 +60,7 @@ class FaceInternalEnumerateClient extends InternalEnumerateClient<IBiometricsFac @Override protected void stopHalOperation() { try { - mDaemon.cancel(); + getFreshDaemon().cancel(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting cancel", e); mFinishCallback.onClientFinished(this); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceRemovalClient.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceRemovalClient.java index b0ee9810a49b..994302c03975 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceRemovalClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceRemovalClient.java @@ -35,17 +35,18 @@ import com.android.server.biometrics.sensors.RemovalClient; class FaceRemovalClient extends RemovalClient<IBiometricsFace> { private static final String TAG = "FaceRemovalClient"; - FaceRemovalClient(@NonNull Context context, @NonNull IBinder token, - @NonNull ClientMonitorCallbackConverter listener, int biometricId, int userId, - @NonNull String owner, @NonNull BiometricUtils utils, int sensorId) { - super(context, token, listener, biometricId, userId, owner, utils, sensorId, + FaceRemovalClient(@NonNull Context context, @NonNull LazyDaemon<IBiometricsFace> lazyDaemon, + @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, + int biometricId, int userId, @NonNull String owner, @NonNull BiometricUtils utils, + int sensorId) { + super(context, lazyDaemon, token, listener, biometricId, userId, owner, utils, sensorId, BiometricsProtoEnums.MODALITY_FACE); } @Override protected void startHalOperation() { try { - mDaemon.remove(mBiometricId); + getFreshDaemon().remove(mBiometricId); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting remove", e); mFinishCallback.onClientFinished(this); @@ -55,7 +56,7 @@ class FaceRemovalClient extends RemovalClient<IBiometricsFace> { @Override protected void stopHalOperation() { try { - mDaemon.cancel(); + getFreshDaemon().cancel(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting cancel", e); mFinishCallback.onClientFinished(this); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceResetLockoutClient.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceResetLockoutClient.java index 441cb14f6600..0bc225eda8fa 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceResetLockoutClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceResetLockoutClient.java @@ -37,10 +37,11 @@ public class FaceResetLockoutClient extends ClientMonitor<IBiometricsFace> { private final ArrayList<Byte> mHardwareAuthToken; - FaceResetLockoutClient(@NonNull Context context, int userId, String owner, int sensorId, - byte[] hardwareAuthToken) { - super(context, null /* token */, null /* listener */, userId, owner, 0 /* cookie */, - sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN, + FaceResetLockoutClient(@NonNull Context context, + @NonNull LazyDaemon<IBiometricsFace> lazyDaemon, int userId, String owner, int sensorId, + @NonNull byte[] hardwareAuthToken) { + super(context, lazyDaemon, null /* token */, null /* listener */, userId, owner, + 0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN); mHardwareAuthToken = new ArrayList<>(); @@ -55,16 +56,15 @@ public class FaceResetLockoutClient extends ClientMonitor<IBiometricsFace> { } @Override - public void start(@NonNull IBiometricsFace daemon, @NonNull FinishCallback finishCallback) { - super.start(daemon, finishCallback); - + public void start(@NonNull FinishCallback finishCallback) { + super.start(finishCallback); startHalOperation(); } @Override protected void startHalOperation() { try { - mDaemon.resetLockout(mHardwareAuthToken); + getFreshDaemon().resetLockout(mHardwareAuthToken); } catch (RemoteException e) { Slog.e(TAG, "Unable to reset lockout", e); } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceRevokeChallengeClient.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceRevokeChallengeClient.java index 992a678d8205..a10c573f34fc 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceRevokeChallengeClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceRevokeChallengeClient.java @@ -33,15 +33,16 @@ public class FaceRevokeChallengeClient extends RevokeChallengeClient<IBiometrics private static final String TAG = "FaceRevokeChallengeClient"; - FaceRevokeChallengeClient(@NonNull Context context, @NonNull IBinder token, + FaceRevokeChallengeClient(@NonNull Context context, + @NonNull LazyDaemon<IBiometricsFace> lazyDaemon, @NonNull IBinder token, @NonNull String owner, int sensorId) { - super(context, token, owner, sensorId); + super(context, lazyDaemon, token, owner, sensorId); } @Override protected void startHalOperation() { try { - mDaemon.revokeChallenge(); + getFreshDaemon().revokeChallenge(); } catch (RemoteException e) { Slog.e(TAG, "revokeChallenge failed", e); } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java index dab6dcbe7004..ad1e7f572f7f 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java @@ -99,6 +99,7 @@ public class FaceService extends BiometricServiceBase<IBiometricsFace> { static final int NOTIFICATION_ID = 1; private final LockoutResetTracker mLockoutResetTracker; + private final ClientMonitor.LazyDaemon<IBiometricsFace> mLazyDaemon; /** * Receives the incoming binder calls from FaceManager. @@ -116,7 +117,7 @@ public class FaceService extends BiometricServiceBase<IBiometricsFace> { checkPermission(MANAGE_BIOMETRIC); final GenerateChallengeClient client = new FaceGenerateChallengeClient(getContext(), - token, new ClientMonitorCallbackConverter(receiver), opPackageName, + mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), opPackageName, getSensorId()); generateChallengeInternal(client); } @@ -125,8 +126,8 @@ public class FaceService extends BiometricServiceBase<IBiometricsFace> { public void revokeChallenge(IBinder token, String owner) { checkPermission(MANAGE_BIOMETRIC); - final RevokeChallengeClient client = new FaceRevokeChallengeClient(getContext(), token, - owner, getSensorId()); + final RevokeChallengeClient client = new FaceRevokeChallengeClient(getContext(), + mLazyDaemon, token, owner, getSensorId()); // TODO(b/137106905): Schedule binder calls in FaceService to avoid deadlocks. if (getCurrentClient() == null) { @@ -152,7 +153,7 @@ public class FaceService extends BiometricServiceBase<IBiometricsFace> { UserHandle.CURRENT); }); - final EnrollClient client = new FaceEnrollClient(getContext(), token, + final EnrollClient client = new FaceEnrollClient(getContext(), mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), userId, hardwareAuthToken, opPackageName, getBiometricUtils(), disabledFeatures, ENROLL_TIMEOUT_SEC, convertSurfaceToNativeHandle(surface), getSensorId()); @@ -183,11 +184,11 @@ public class FaceService extends BiometricServiceBase<IBiometricsFace> { final boolean restricted = isRestricted(); final int statsClient = isKeyguard(opPackageName) ? BiometricsProtoEnums.CLIENT_KEYGUARD : BiometricsProtoEnums.CLIENT_UNKNOWN; - final AuthenticationClient client = new FaceAuthenticationClient(getContext(), token, - new ClientMonitorCallbackConverter(receiver), userId, opId, restricted, - opPackageName, 0 /* cookie */, false /* requireConfirmation */, getSensorId(), - isStrongBiometric(), statsClient, mTaskStackListener, mLockoutTracker, - mUsageStats); + final AuthenticationClient client = new FaceAuthenticationClient(getContext(), + mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), userId, opId, + restricted, opPackageName, 0 /* cookie */, false /* requireConfirmation */, + getSensorId(), isStrongBiometric(), statsClient, mTaskStackListener, + mLockoutTracker, mUsageStats); authenticateInternal(client, opPackageName); } @@ -200,11 +201,11 @@ public class FaceService extends BiometricServiceBase<IBiometricsFace> { updateActiveGroup(userId); final boolean restricted = true; // BiometricPrompt is always restricted - final AuthenticationClient client = new FaceAuthenticationClient(getContext(), token, - new ClientMonitorCallbackConverter(sensorReceiver), userId, opId, restricted, - opPackageName, cookie, requireConfirmation, getSensorId(), isStrongBiometric(), - BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, mTaskStackListener, - mLockoutTracker, mUsageStats); + final AuthenticationClient client = new FaceAuthenticationClient(getContext(), + mLazyDaemon, token, new ClientMonitorCallbackConverter(sensorReceiver), userId, + opId, restricted, opPackageName, cookie, requireConfirmation, getSensorId(), + isStrongBiometric(), BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, + mTaskStackListener, mLockoutTracker, mUsageStats); authenticateInternal(client, opPackageName, callingUid, callingPid, callingUserId); } @@ -241,7 +242,7 @@ public class FaceService extends BiometricServiceBase<IBiometricsFace> { return; } - final RemovalClient client = new FaceRemovalClient(getContext(), token, + final RemovalClient client = new FaceRemovalClient(getContext(), mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), faceId, userId, opPackageName, getBiometricUtils(), getSensorId()); removeInternal(client); @@ -346,7 +347,8 @@ public class FaceService extends BiometricServiceBase<IBiometricsFace> { updateActiveGroup(userId); final FaceResetLockoutClient client = new FaceResetLockoutClient(getContext(), - userId, getContext().getOpPackageName(), getSensorId(), hardwareAuthToken); + mLazyDaemon, userId, getContext().getOpPackageName(), getSensorId(), + hardwareAuthToken); startClient(client, true /* initiatedByClient */); }); } @@ -370,8 +372,8 @@ public class FaceService extends BiometricServiceBase<IBiometricsFace> { final int faceId = getFirstTemplateForUser(mCurrentUserId); final FaceSetFeatureClient client = new FaceSetFeatureClient(getContext(), - token, new ClientMonitorCallbackConverter(receiver), userId, opPackageName, - getSensorId(), feature, enabled, hardwareAuthToken, faceId); + mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), userId, + opPackageName, getSensorId(), feature, enabled, hardwareAuthToken, faceId); startClient(client, true /* initiatedByClient */); }); @@ -397,9 +399,9 @@ public class FaceService extends BiometricServiceBase<IBiometricsFace> { // TODO: Support multiple faces final int faceId = getFirstTemplateForUser(mCurrentUserId); - final FaceGetFeatureClient client = new FaceGetFeatureClient(getContext(), token, - new ClientMonitorCallbackConverter(receiver), userId, opPackageName, - getSensorId(), feature, faceId); + final FaceGetFeatureClient client = new FaceGetFeatureClient(getContext(), + mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), userId, + opPackageName, getSensorId(), feature, faceId); startClient(client, true /* initiatedByClient */); }); @@ -553,6 +555,7 @@ public class FaceService extends BiometricServiceBase<IBiometricsFace> { public FaceService(Context context) { super(context); + mLazyDaemon = FaceService.this::getFaceDaemon; mLockoutResetTracker = new LockoutResetTracker(context); mLockoutTracker = new LockoutHalImpl(); mUsageStats = new UsageStats(context); @@ -702,8 +705,9 @@ public class FaceService extends BiometricServiceBase<IBiometricsFace> { protected void doTemplateCleanupForUser(int userId) { final List<? extends BiometricAuthenticator.Identifier> enrolledList = getEnrolledTemplates(userId); - final FaceInternalCleanupClient client = new FaceInternalCleanupClient(getContext(), userId, - getContext().getOpPackageName(), getSensorId(), enrolledList, getBiometricUtils()); + final FaceInternalCleanupClient client = new FaceInternalCleanupClient(getContext(), + mLazyDaemon, userId, getContext().getOpPackageName(), getSensorId(), enrolledList, + getBiometricUtils()); cleanupInternal(client); } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceSetFeatureClient.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceSetFeatureClient.java index 91f63e185ff8..f22ab1beae3f 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceSetFeatureClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceSetFeatureClient.java @@ -43,11 +43,11 @@ public class FaceSetFeatureClient extends ClientMonitor<IBiometricsFace> { private final ArrayList<Byte> mHardwareAuthToken; private final int mFaceId; - FaceSetFeatureClient(@NonNull Context context, @NonNull IBinder token, - @NonNull ClientMonitorCallbackConverter listener, int userId, + FaceSetFeatureClient(@NonNull Context context, @NonNull LazyDaemon<IBiometricsFace> lazyDaemon, + @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull String owner, int sensorId, int feature, boolean enabled, byte[] hardwareAuthToken, int faceId) { - super(context, token, listener, userId, owner, 0 /* cookie */, sensorId, + super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN); mFeature = feature; @@ -70,8 +70,8 @@ public class FaceSetFeatureClient extends ClientMonitor<IBiometricsFace> { } @Override - public void start(@NonNull IBiometricsFace daemon, @NonNull FinishCallback finishCallback) { - super.start(daemon, finishCallback); + public void start(@NonNull FinishCallback finishCallback) { + super.start(finishCallback); startHalOperation(); mFinishCallback.onClientFinished(this); @@ -80,7 +80,8 @@ public class FaceSetFeatureClient extends ClientMonitor<IBiometricsFace> { @Override protected void startHalOperation() { try { - final int result = mDaemon.setFeature(mFeature, mEnabled, mHardwareAuthToken, mFaceId); + final int result = getFreshDaemon() + .setFeature(mFeature, mEnabled, mHardwareAuthToken, mFaceId); getListener().onFeatureSet(result == Status.OK, mFeature); } catch (RemoteException e) { Slog.e(TAG, "Unable to set feature: " + mFeature + " to enabled: " + mEnabled, e); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticationClient.java index ba89d51b1f61..109196120042 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticationClient.java @@ -47,13 +47,14 @@ class FingerprintAuthenticationClient extends AuthenticationClient<IBiometricsFi private final LockoutFrameworkImpl mLockoutFrameworkImpl; - FingerprintAuthenticationClient(@NonNull Context context, @NonNull IBinder token, + FingerprintAuthenticationClient(@NonNull Context context, + @NonNull LazyDaemon<IBiometricsFingerprint> lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId, boolean restricted, @NonNull String owner, int cookie, boolean requireConfirmation, int sensorId, boolean isStrongBiometric, @Nullable Surface surface, int statsClient, @NonNull TaskStackListener taskStackListener, @NonNull LockoutFrameworkImpl lockoutTracker) { - super(context, token, listener, targetUserId, operationId, restricted, + super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted, owner, cookie, requireConfirmation, sensorId, isStrongBiometric, BiometricsProtoEnums.MODALITY_FINGERPRINT, statsClient, taskStackListener, lockoutTracker); @@ -102,7 +103,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient<IBiometricsFi protected void startHalOperation() { try { // GroupId was never used. In fact, groupId is always the same as userId. - mDaemon.authenticate(mOperationId, getTargetUserId()); + getFreshDaemon().authenticate(mOperationId, getTargetUserId()); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting auth", e); onError(BiometricFingerprintConstants.FINGERPRINT_ERROR_HW_UNAVAILABLE, @@ -114,7 +115,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient<IBiometricsFi @Override protected void stopHalOperation() { try { - mDaemon.cancel(); + getFreshDaemon().cancel(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting cancel", e); onError(BiometricFingerprintConstants.FINGERPRINT_ERROR_HW_UNAVAILABLE, diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintEnrollClient.java index 34681c38808b..ca795a18521a 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintEnrollClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintEnrollClient.java @@ -38,19 +38,21 @@ public class FingerprintEnrollClient extends EnrollClient<IBiometricsFingerprint private static final String TAG = "FingerprintEnrollClient"; - FingerprintEnrollClient(@NonNull Context context, @NonNull IBinder token, + FingerprintEnrollClient(@NonNull Context context, + @NonNull LazyDaemon<IBiometricsFingerprint> lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull byte[] hardwareAuthToken, @NonNull String owner, @NonNull BiometricUtils utils, int timeoutSec, int sensorId) { - super(context, token, listener, userId, hardwareAuthToken, owner, utils, timeoutSec, - BiometricsProtoEnums.MODALITY_FINGERPRINT, sensorId, true /* shouldVibrate */); + super(context, lazyDaemon, token, listener, userId, hardwareAuthToken, owner, utils, + timeoutSec, BiometricsProtoEnums.MODALITY_FINGERPRINT, sensorId, + true /* shouldVibrate */); } @Override protected void startHalOperation() { try { // GroupId was never used. In fact, groupId is always the same as userId. - mDaemon.enroll(mHardwareAuthToken, getTargetUserId(), mTimeoutSec); + getFreshDaemon().enroll(mHardwareAuthToken, getTargetUserId(), mTimeoutSec); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting enroll", e); onError(BiometricFingerprintConstants.FINGERPRINT_ERROR_HW_UNAVAILABLE, @@ -62,7 +64,7 @@ public class FingerprintEnrollClient extends EnrollClient<IBiometricsFingerprint @Override protected void stopHalOperation() { try { - mDaemon.cancel(); + getFreshDaemon().cancel(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting cancel", e); onError(BiometricFingerprintConstants.FINGERPRINT_ERROR_HW_UNAVAILABLE, diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintGenerateChallengeClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintGenerateChallengeClient.java index 2fa433305070..8fb8c992268d 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintGenerateChallengeClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintGenerateChallengeClient.java @@ -36,15 +36,16 @@ public class FingerprintGenerateChallengeClient private static final String TAG = "FingerprintGenerateChallengeClient"; - FingerprintGenerateChallengeClient(@NonNull Context context, @NonNull IBinder token, + FingerprintGenerateChallengeClient(@NonNull Context context, + @NonNull LazyDaemon<IBiometricsFingerprint> lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, @NonNull String owner, int sensorId) { - super(context, token, listener, owner, sensorId); + super(context, lazyDaemon, token, listener, owner, sensorId); } @Override protected void startHalOperation() { try { - mChallenge = mDaemon.preEnroll(); + mChallenge = getFreshDaemon().preEnroll(); } catch (RemoteException e) { Slog.e(TAG, "preEnroll failed", e); } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintInternalCleanupClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintInternalCleanupClient.java index 71e76703b9d5..6754128c4556 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintInternalCleanupClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintInternalCleanupClient.java @@ -37,28 +37,32 @@ import java.util.List; */ class FingerprintInternalCleanupClient extends InternalCleanupClient<IBiometricsFingerprint> { - FingerprintInternalCleanupClient(@NonNull Context context,int userId, @NonNull String owner, - int sensorId, @NonNull List<? extends BiometricAuthenticator.Identifier> enrolledList, + FingerprintInternalCleanupClient(@NonNull Context context, + @NonNull LazyDaemon<IBiometricsFingerprint> lazyDaemon, int userId, + @NonNull String owner, int sensorId, + @NonNull List<? extends BiometricAuthenticator.Identifier> enrolledList, @NonNull BiometricUtils utils) { - super(context, userId, owner, sensorId, BiometricsProtoEnums.MODALITY_FINGERPRINT, - enrolledList, utils); + super(context, lazyDaemon, userId, owner, sensorId, + BiometricsProtoEnums.MODALITY_FINGERPRINT, enrolledList, utils); } @Override protected InternalEnumerateClient<IBiometricsFingerprint> getEnumerateClient( - Context context, IBinder token, int userId, String owner, + Context context, LazyDaemon<IBiometricsFingerprint> lazyDaemon, IBinder token, + int userId, String owner, List<? extends BiometricAuthenticator.Identifier> enrolledList, BiometricUtils utils, int sensorId) { - return new FingerprintInternalEnumerateClient(context, token, userId, owner, enrolledList, - utils, sensorId); + return new FingerprintInternalEnumerateClient(context, lazyDaemon, token, userId, owner, + enrolledList, utils, sensorId); } @Override - protected RemovalClient<IBiometricsFingerprint> getRemovalClient(Context context, IBinder token, + protected RemovalClient<IBiometricsFingerprint> getRemovalClient(Context context, + LazyDaemon<IBiometricsFingerprint> lazyDaemon, IBinder token, int biometricId, int userId, String owner, BiometricUtils utils, int sensorId) { // Internal remove does not need to send results to anyone. Cleanup (enumerate + remove) // is all done internally. - return new FingerprintRemovalClient(context, token, + return new FingerprintRemovalClient(context, lazyDaemon, token, null /* ClientMonitorCallbackConverter */, biometricId, userId, owner, utils, sensorId); } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintInternalEnumerateClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintInternalEnumerateClient.java index ba412e3956ce..3450f759e00f 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintInternalEnumerateClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintInternalEnumerateClient.java @@ -38,18 +38,19 @@ import java.util.List; class FingerprintInternalEnumerateClient extends InternalEnumerateClient<IBiometricsFingerprint> { private static final String TAG = "FingerprintInternalEnumerateClient"; - FingerprintInternalEnumerateClient(@NonNull Context context, @NonNull IBinder token, int userId, - @NonNull String owner, + FingerprintInternalEnumerateClient(@NonNull Context context, + @NonNull LazyDaemon<IBiometricsFingerprint> lazyDaemon, @NonNull IBinder token, + int userId, @NonNull String owner, @NonNull List<? extends BiometricAuthenticator.Identifier> enrolledList, @NonNull BiometricUtils utils, int sensorId) { - super(context, token, userId, owner, enrolledList, utils, sensorId, + super(context, lazyDaemon, token, userId, owner, enrolledList, utils, sensorId, BiometricsProtoEnums.MODALITY_FINGERPRINT); } @Override protected void startHalOperation() { try { - mDaemon.enumerate(); + getFreshDaemon().enumerate(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting enumerate", e); mFinishCallback.onClientFinished(this); @@ -59,7 +60,7 @@ class FingerprintInternalEnumerateClient extends InternalEnumerateClient<IBiomet @Override protected void stopHalOperation() { try { - mDaemon.cancel(); + getFreshDaemon().cancel(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting cancel", e); mFinishCallback.onClientFinished(this); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintRemovalClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintRemovalClient.java index 6d7e76162029..f22bc61338e7 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintRemovalClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintRemovalClient.java @@ -36,10 +36,11 @@ import com.android.server.biometrics.sensors.RemovalClient; class FingerprintRemovalClient extends RemovalClient<IBiometricsFingerprint> { private static final String TAG = "FingerprintRemovalClient"; - FingerprintRemovalClient(@NonNull Context context, @NonNull IBinder token, + FingerprintRemovalClient(@NonNull Context context, + @NonNull LazyDaemon<IBiometricsFingerprint> lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int biometricId, int userId, @NonNull String owner, @NonNull BiometricUtils utils, int sensorId) { - super(context, token, listener, biometricId, userId, owner, utils, sensorId, + super(context, lazyDaemon, token, listener, biometricId, userId, owner, utils, sensorId, BiometricsProtoEnums.MODALITY_FINGERPRINT); } @@ -47,7 +48,7 @@ class FingerprintRemovalClient extends RemovalClient<IBiometricsFingerprint> { protected void startHalOperation() { try { // GroupId was never used. In fact, groupId is always the same as userId. - mDaemon.remove(getTargetUserId(), mBiometricId); + getFreshDaemon().remove(getTargetUserId(), mBiometricId); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting remove", e); mFinishCallback.onClientFinished(this); @@ -57,7 +58,7 @@ class FingerprintRemovalClient extends RemovalClient<IBiometricsFingerprint> { @Override protected void stopHalOperation() { try { - mDaemon.cancel(); + getFreshDaemon().cancel(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting cancel", e); mFinishCallback.onClientFinished(this); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintRevokeChallengeClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintRevokeChallengeClient.java index ccbea31d7c48..882660e7a618 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintRevokeChallengeClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintRevokeChallengeClient.java @@ -35,15 +35,16 @@ public class FingerprintRevokeChallengeClient private static final String TAG = "FingerprintRevokeChallengeClient"; - FingerprintRevokeChallengeClient(@NonNull Context context, @NonNull IBinder token, + FingerprintRevokeChallengeClient(@NonNull Context context, + @NonNull LazyDaemon<IBiometricsFingerprint> lazyDaemon, @NonNull IBinder token, @NonNull String owner, int sensorId) { - super(context, token, owner, sensorId); + super(context, lazyDaemon, token, owner, sensorId); } @Override protected void startHalOperation() { try { - mDaemon.postEnroll(); + getFreshDaemon().postEnroll(); } catch (RemoteException e) { Slog.e(TAG, "revokeChallenge/postEnroll failed", e); } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java index dad95a6aa1ed..13b2a758999d 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java @@ -64,6 +64,7 @@ import com.android.server.biometrics.fingerprint.PerformanceStatsProto; import com.android.server.biometrics.sensors.AuthenticationClient; import com.android.server.biometrics.sensors.BiometricServiceBase; import com.android.server.biometrics.sensors.BiometricUtils; +import com.android.server.biometrics.sensors.ClientMonitor; import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter; import com.android.server.biometrics.sensors.EnrollClient; import com.android.server.biometrics.sensors.GenerateChallengeClient; @@ -99,6 +100,7 @@ public class FingerprintService extends BiometricServiceBase<IBiometricsFingerpr private static final String FP_DATA_DIR = "fpdata"; private final LockoutResetTracker mLockoutResetTracker; + private final ClientMonitor.LazyDaemon<IBiometricsFingerprint> mLazyDaemon; /** * Receives the incoming binder calls from FingerprintManager. @@ -116,7 +118,7 @@ public class FingerprintService extends BiometricServiceBase<IBiometricsFingerpr checkPermission(MANAGE_FINGERPRINT); final GenerateChallengeClient client = new FingerprintGenerateChallengeClient( - getContext(), token, new ClientMonitorCallbackConverter(receiver), + getContext(), mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), opPackageName, getSensorId()); generateChallengeInternal(client); } @@ -126,7 +128,7 @@ public class FingerprintService extends BiometricServiceBase<IBiometricsFingerpr checkPermission(MANAGE_FINGERPRINT); final RevokeChallengeClient client = new FingerprintRevokeChallengeClient(getContext(), - token, owner, getSensorId()); + mLazyDaemon, token, owner, getSensorId()); revokeChallengeInternal(client); } @@ -137,8 +139,8 @@ public class FingerprintService extends BiometricServiceBase<IBiometricsFingerpr checkPermission(MANAGE_FINGERPRINT); updateActiveGroup(userId); - final EnrollClient client = new FingerprintEnrollClient(getContext(), token, - new ClientMonitorCallbackConverter(receiver), userId, cryptoToken, + final EnrollClient client = new FingerprintEnrollClient(getContext(), mLazyDaemon, + token, new ClientMonitorCallbackConverter(receiver), userId, cryptoToken, opPackageName, getBiometricUtils(), ENROLL_TIMEOUT_SEC, getSensorId()); enrollInternal(client, userId); @@ -168,9 +170,10 @@ public class FingerprintService extends BiometricServiceBase<IBiometricsFingerpr final int statsClient = isKeyguard(opPackageName) ? BiometricsProtoEnums.CLIENT_KEYGUARD : BiometricsProtoEnums.CLIENT_FINGERPRINT_MANAGER; final AuthenticationClient client = new FingerprintAuthenticationClient(getContext(), - token, new ClientMonitorCallbackConverter(receiver), userId, opId, restricted, - opPackageName, 0 /* cookie */, false /* requireConfirmation */, getSensorId(), - isStrongBiometric, surface, statsClient, mTaskStackListener, mLockoutTracker); + mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), userId, opId, + restricted, opPackageName, 0 /* cookie */, false /* requireConfirmation */, + getSensorId(), isStrongBiometric, surface, statsClient, mTaskStackListener, + mLockoutTracker); authenticateInternal(client, opPackageName); } @@ -178,14 +181,14 @@ public class FingerprintService extends BiometricServiceBase<IBiometricsFingerpr public void prepareForAuthentication(IBinder token, long opId, int userId, IBiometricSensorReceiver sensorReceiver, String opPackageName, int cookie, int callingUid, int callingPid, int callingUserId, - Surface surface) throws RemoteException { + Surface surface) { checkPermission(MANAGE_BIOMETRIC); updateActiveGroup(userId); final boolean restricted = true; // BiometricPrompt is always restricted final AuthenticationClient client = new FingerprintAuthenticationClient(getContext(), - token, new ClientMonitorCallbackConverter(sensorReceiver), userId, opId, - restricted, opPackageName, cookie, false /* requireConfirmation */, + mLazyDaemon, token, new ClientMonitorCallbackConverter(sensorReceiver), userId, + opId, restricted, opPackageName, cookie, false /* requireConfirmation */, getSensorId(), isStrongBiometric(), surface, BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, mTaskStackListener, mLockoutTracker); @@ -226,9 +229,9 @@ public class FingerprintService extends BiometricServiceBase<IBiometricsFingerpr return; } - final RemovalClient client = new FingerprintRemovalClient(getContext(), token, - new ClientMonitorCallbackConverter(receiver), fingerId, userId, opPackageName, - getBiometricUtils(), getSensorId()); + final RemovalClient client = new FingerprintRemovalClient(getContext(), mLazyDaemon, + token, new ClientMonitorCallbackConverter(receiver), fingerId, userId, + opPackageName, getBiometricUtils(), getSensorId()); removeInternal(client); } @@ -551,6 +554,7 @@ public class FingerprintService extends BiometricServiceBase<IBiometricsFingerpr public FingerprintService(Context context) { super(context); + mLazyDaemon = FingerprintService.this::getFingerprintDaemon; mLockoutResetTracker = new LockoutResetTracker(context); final LockoutFrameworkImpl.LockoutResetCallback lockoutResetCallback = userId -> { mLockoutResetTracker.notifyLockoutResetCallbacks(); @@ -713,8 +717,8 @@ public class FingerprintService extends BiometricServiceBase<IBiometricsFingerpr final List<? extends BiometricAuthenticator.Identifier> enrolledList = getEnrolledTemplates(userId); final FingerprintInternalCleanupClient client = new FingerprintInternalCleanupClient( - getContext(), userId, getContext().getOpPackageName(), getSensorId(), enrolledList, - getBiometricUtils()); + getContext(), mLazyDaemon, userId, getContext().getOpPackageName(), getSensorId(), + enrolledList, getBiometricUtils()); cleanupInternal(client); } |