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 e923943bd3867..8acf4f5204a96 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 @@ -43,7 +43,7 @@ import java.util.ArrayList; * Fingerprint-specific authentication client supporting the * {@link android.hardware.biometrics.fingerprint.IFingerprint} AIDL interface. */ -public class FingerprintAuthenticationClient extends AuthenticationClient implements +class FingerprintAuthenticationClient extends AuthenticationClient implements Udfps, LockoutConsumer { private static final String TAG = "FingerprintAuthenticationClient"; @@ -51,7 +51,7 @@ public class FingerprintAuthenticationClient extends AuthenticationClient lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId, boolean restricted, @NonNull String owner, int cookie, boolean requireConfirmation, 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 new file mode 100644 index 0000000000000..a0aa7e0f39f4d --- /dev/null +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2020 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.annotation.Nullable; +import android.content.Context; +import android.hardware.biometrics.BiometricsProtoEnums; +import android.hardware.biometrics.common.ICancellationSignal; +import android.hardware.biometrics.fingerprint.ISession; +import android.hardware.fingerprint.IUdfpsOverlayController; +import android.os.IBinder; +import android.os.RemoteException; +import android.util.Slog; + +import com.android.server.biometrics.sensors.AcquisitionClient; +import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter; +import com.android.server.biometrics.sensors.fingerprint.UdfpsHelper; + +/** + * 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 { + + private static final String TAG = "FingerprintDetectClient"; + + private final boolean mIsStrongBiometric; + @Nullable private final IUdfpsOverlayController mUdfpsOverlayController; + + @Nullable private ICancellationSignal mCancellationSignal; + + FingerprintDetectClient(@NonNull Context context, @NonNull LazyDaemon lazyDaemon, + @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, + @NonNull String owner, int sensorId, + @Nullable IUdfpsOverlayController udfpsOverlayController, boolean isStrongBiometric, + int statsClient) { + super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId, + BiometricsProtoEnums.MODALITY_FINGERPRINT, BiometricsProtoEnums.ACTION_AUTHENTICATE, + statsClient); + mIsStrongBiometric = isStrongBiometric; + mUdfpsOverlayController = udfpsOverlayController; + } + + @Override + protected void stopHalOperation() { + UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController); + try { + mCancellationSignal.cancel(); + } catch (RemoteException e) { + Slog.e(TAG, "Remote exception", e); + mCallback.onClientFinished(this, false /* success */); + } + } + + @Override + protected void startHalOperation() { + UdfpsHelper.showUdfpsOverlay(getSensorId(), mUdfpsOverlayController); + try { + mCancellationSignal = getFreshDaemon().detectInteraction(mSequentialId); + } catch (RemoteException e) { + Slog.e(TAG, "Remote exception when requesting finger detect", e); + UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController); + mCallback.onClientFinished(this, false /* success */); + } + } +} 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 062fbbd3b73eb..437ecd7a0f8d9 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 @@ -38,7 +38,7 @@ import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils; import com.android.server.biometrics.sensors.fingerprint.Udfps; import com.android.server.biometrics.sensors.fingerprint.UdfpsHelper; -public class FingerprintEnrollClient extends EnrollClient implements Udfps { +class FingerprintEnrollClient extends EnrollClient implements Udfps { private static final String TAG = "FingerprintEnrollClient"; @@ -46,7 +46,7 @@ public class FingerprintEnrollClient extends EnrollClient implements U @Nullable private ICancellationSignal mCancellationSignal; private final int mMaxTemplatesPerUser; - public FingerprintEnrollClient(@NonNull Context context, + FingerprintEnrollClient(@NonNull Context context, @NonNull LazyDaemon lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull byte[] hardwareAuthToken, @NonNull String owner, 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 7db01eed571ef..331bec186e9d0 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 @@ -30,7 +30,7 @@ import com.android.server.biometrics.sensors.GenerateChallengeClient; /** * Fingerprint-specific generateChallenge client for the {@link IFingerprint} AIDL HAL interface. */ -public class FingerprintGenerateChallengeClient extends GenerateChallengeClient { +class FingerprintGenerateChallengeClient extends GenerateChallengeClient { private static final String TAG = "FingerprintGenerateChallengeClient"; private static final int CHALLENGE_TIMEOUT_SEC = 600; // 10 minutes @@ -50,7 +50,7 @@ public class FingerprintGenerateChallengeClient extends GenerateChallengeClient< } }; - public FingerprintGenerateChallengeClient(@NonNull Context context, + FingerprintGenerateChallengeClient(@NonNull Context context, @NonNull LazyDaemon lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGetAuthenticatorIdClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGetAuthenticatorIdClient.java new file mode 100644 index 0000000000000..bc89d5f6a96d0 --- /dev/null +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGetAuthenticatorIdClient.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.biometrics.sensors.fingerprint.aidl; + +import android.annotation.NonNull; +import android.content.Context; +import android.hardware.biometrics.BiometricsProtoEnums; +import android.hardware.biometrics.fingerprint.ISession; +import android.os.RemoteException; +import android.util.Slog; + +import com.android.server.biometrics.sensors.ClientMonitor; + +class FingerprintGetAuthenticatorIdClient extends ClientMonitor { + + private static final String TAG = "FingerprintGetAuthenticatorIdClient"; + + FingerprintGetAuthenticatorIdClient(@NonNull Context context, + @NonNull LazyDaemon lazyDaemon, int userId, @NonNull String owner, + int sensorId) { + super(context, lazyDaemon, null /* token */, null /* listener */, userId, owner, + 0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_FINGERPRINT, + BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN); + } + + @Override + public void unableToStart() { + // Nothing to do here + } + + @Override + protected void startHalOperation() { + try { + getFreshDaemon().getAuthenticatorId(mSequentialId); + } 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 new file mode 100644 index 0000000000000..2a0e984e59334 --- /dev/null +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInternalCleanupClient.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.biometrics.sensors.fingerprint.aidl; + +import android.annotation.NonNull; +import android.content.Context; +import android.hardware.biometrics.BiometricsProtoEnums; +import android.hardware.biometrics.fingerprint.ISession; +import android.hardware.fingerprint.Fingerprint; +import android.os.IBinder; + +import com.android.server.biometrics.sensors.BiometricUtils; +import com.android.server.biometrics.sensors.InternalCleanupClient; +import com.android.server.biometrics.sensors.InternalEnumerateClient; +import com.android.server.biometrics.sensors.RemovalClient; +import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils; + +import java.util.List; +import java.util.Map; + +/** + * Fingerprint-specific internal cleanup client supporting the + * {@link android.hardware.biometrics.fingerprint.IFingerprint} AIDL interface. + */ +class FingerprintInternalCleanupClient extends InternalCleanupClient { + + FingerprintInternalCleanupClient(@NonNull Context context, + @NonNull LazyDaemon lazyDaemon, int userId, @NonNull String owner, + int sensorId, @NonNull List enrolledList, + @NonNull FingerprintUtils utils, @NonNull Map authenticatorIds) { + super(context, lazyDaemon, userId, owner, sensorId, + BiometricsProtoEnums.MODALITY_FINGERPRINT, enrolledList, utils, authenticatorIds); + } + + @Override + protected InternalEnumerateClient getEnumerateClient(Context context, + LazyDaemon 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, + LazyDaemon lazyDaemon, IBinder token, int biometricId, int userId, + String owner, BiometricUtils utils, int sensorId, + Map authenticatorIds) { + return new FingerprintRemovalClient(context, lazyDaemon, token, + null /* ClientMonitorCallbackConverter */, biometricId, userId, owner, utils, + sensorId, authenticatorIds); + } +} 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 new file mode 100644 index 0000000000000..c9303609c8dcc --- /dev/null +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInternalEnumerateClient.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.biometrics.sensors.fingerprint.aidl; + +import android.annotation.NonNull; +import android.content.Context; +import android.hardware.biometrics.BiometricsProtoEnums; +import android.hardware.biometrics.fingerprint.ISession; +import android.hardware.fingerprint.Fingerprint; +import android.os.IBinder; +import android.os.RemoteException; +import android.util.Slog; + +import com.android.server.biometrics.sensors.BiometricUtils; +import com.android.server.biometrics.sensors.InternalEnumerateClient; + +import java.util.List; + +/** + * Fingerprint-specific internal client supporting the + * {@link android.hardware.biometrics.fingerprint.IFingerprint} AIDL interface. + */ +class FingerprintInternalEnumerateClient extends InternalEnumerateClient { + private static final String TAG = "FingerprintInternalEnumerateClient"; + + protected FingerprintInternalEnumerateClient(@NonNull Context context, + @NonNull LazyDaemon 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, + BiometricsProtoEnums.MODALITY_FINGERPRINT); + } + + @Override + protected void startHalOperation() { + try { + getFreshDaemon().enumerateEnrollments(mSequentialId); + } 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/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java index f16aa8a9763e3..528fbb63bfcae 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java @@ -23,7 +23,7 @@ import android.app.ActivityTaskManager; import android.app.IActivityTaskManager; import android.app.TaskStackListener; import android.content.Context; -import android.hardware.biometrics.BiometricsProtoEnums; +import android.content.pm.UserInfo; import android.hardware.biometrics.fingerprint.IFingerprint; import android.hardware.biometrics.fingerprint.SensorProps; import android.hardware.fingerprint.Fingerprint; @@ -35,6 +35,7 @@ import android.os.IBinder; import android.os.Looper; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.UserManager; import android.util.Slog; import android.util.SparseArray; import android.view.Surface; @@ -44,6 +45,7 @@ import com.android.server.biometrics.sensors.AuthenticationClient; import com.android.server.biometrics.sensors.ClientMonitor; import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter; import com.android.server.biometrics.sensors.LockoutResetDispatcher; +import com.android.server.biometrics.sensors.PerformanceTracker; import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils; import com.android.server.biometrics.sensors.fingerprint.GestureAvailabilityDispatcher; import com.android.server.biometrics.sensors.fingerprint.ServiceProvider; @@ -69,6 +71,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi @NonNull private final IActivityTaskManager mActivityTaskManager; @NonNull private final BiometricTaskStackListener mTaskStackListener; + @Nullable private IFingerprint mDaemon; @Nullable private IUdfpsOverlayController mUdfpsOverlayController; private final class BiometricTaskStackListener extends TaskStackListener { @@ -143,15 +146,21 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi @Nullable private synchronized IFingerprint getHalInstance() { - final IFingerprint daemon = IFingerprint.Stub.asInterface( + if (mDaemon != null) { + return mDaemon; + } + + Slog.d(getTag(), "Daemon was null, reconnecting"); + + mDaemon = IFingerprint.Stub.asInterface( ServiceManager.waitForDeclaredService(mHalInstanceName)); - if (daemon == null) { + if (mDaemon == null) { Slog.e(getTag(), "Unable to get daemon"); return null; } try { - daemon.asBinder().linkToDeath(this, 0 /* flags */); + mDaemon.asBinder().linkToDeath(this, 0 /* flags */); } catch (RemoteException e) { Slog.e(getTag(), "Unable to linkToDeath", e); } @@ -162,7 +171,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi scheduleInternalCleanup(sensorId, ActivityManager.getCurrentUser()); } - return daemon; + return mDaemon; } private void scheduleForSensor(int sensorId, @NonNull ClientMonitor client) { @@ -191,14 +200,6 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi mSensors.get(sensorId).createNewSession(daemon, sensorId, userId); } - private void scheduleLoadAuthenticatorIdsWithoutHandler(int sensorId) { - - } - - private void scheduleLoadAuthenticatorIds(int sensorId) { - - } - @Override public boolean containsSensor(int sensorId) { return mSensors.contains(sensorId); @@ -214,6 +215,38 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi return props; } + private void scheduleLoadAuthenticatorIds(int sensorId) { + for (UserInfo user : UserManager.get(mContext).getAliveUsers()) { + scheduleLoadAuthenticatorIdsForUser(sensorId, user.id); + } + } + + private void scheduleLoadAuthenticatorIdsForUser(int sensorId, int userId) { + mHandler.post(() -> { + final IFingerprint daemon = getHalInstance(); + if (daemon == null) { + Slog.e(getTag(), "Null daemon during loadAuthenticatorIds, sensorId: " + sensorId); + return; + } + + try { + if (!mSensors.get(sensorId).hasSessionForUser(userId)) { + createNewSessionWithoutHandler(daemon, sensorId, userId); + } + + final FingerprintGetAuthenticatorIdClient client = + new FingerprintGetAuthenticatorIdClient(mContext, + mSensors.get(sensorId).getLazySession(), userId, + mContext.getOpPackageName(), sensorId); + mSensors.get(sensorId).getScheduler().scheduleClientMonitor(client); + } catch (RemoteException e) { + Slog.e(getTag(), "Remote exception when scheduling loadAuthenticatorId" + + ", sensorId: " + sensorId + + ", userId: " + userId, e); + } + }); + } + @Override public void scheduleResetLockout(int sensorId, int userId, @Nullable byte[] hardwareAuthToken) { mHandler.post(() -> { @@ -292,7 +325,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi public void onClientFinished(@NonNull ClientMonitor clientMonitor, boolean success) { if (success) { - scheduleLoadAuthenticatorIdsWithoutHandler(sensorId); + scheduleLoadAuthenticatorIdsForUser(sensorId, userId); } } }); @@ -311,7 +344,31 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi public void scheduleFingerDetect(int sensorId, @NonNull IBinder token, int userId, @NonNull ClientMonitorCallbackConverter callback, @NonNull String opPackageName, @Nullable Surface surface, int statsClient) { + mHandler.post(() -> { + final IFingerprint daemon = getHalInstance(); + if (daemon == null) { + Slog.e(getTag(), "Null daemon during finger detect, sensorId: " + sensorId); + // If this happens, we need to send HW_UNAVAILABLE after the scheduler gets to + // this operation. We should not send the callback yet, since the scheduler may + // be processing something else. + return; + } + try { + if (!mSensors.get(sensorId).hasSessionForUser(userId)) { + createNewSessionWithoutHandler(daemon, sensorId, userId); + } + + final boolean isStrongBiometric = Utils.isStrongBiometric(sensorId); + final FingerprintDetectClient client = new FingerprintDetectClient(mContext, + mSensors.get(sensorId).getLazySession(), token, callback, userId, + opPackageName, sensorId, mUdfpsOverlayController, isStrongBiometric, + statsClient); + mSensors.get(sensorId).getScheduler().scheduleClientMonitor(client); + } catch (RemoteException e) { + Slog.e(getTag(), "Remote exception when scheduling finger detect", e); + } + }); } @Override @@ -390,24 +447,48 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi } @Override - public void scheduleInternalCleanup(int userId, int sensorId) { + public void scheduleInternalCleanup(int sensorId, int userId) { + mHandler.post(() -> { + final IFingerprint daemon = getHalInstance(); + if (daemon == null) { + Slog.e(getTag(), "Null daemon during internal cleanup, sensorId: " + sensorId); + return; + } + try { + if (!mSensors.get(sensorId).hasSessionForUser(userId)) { + createNewSessionWithoutHandler(daemon, sensorId, userId); + } + + final List enrolledList = getEnrolledFingerprints(sensorId, userId); + final FingerprintInternalCleanupClient client = + new FingerprintInternalCleanupClient(mContext, + mSensors.get(sensorId).getLazySession(), userId, + mContext.getOpPackageName(), sensorId, enrolledList, + FingerprintUtils.getInstance(sensorId), + mSensors.get(sensorId).getAuthenticatorIds()); + mSensors.get(sensorId).getScheduler().scheduleClientMonitor(client); + } catch (RemoteException e) { + Slog.e(getTag(), "Remote exception when scheduling internal cleanup", e); + } + }); } @Override public boolean isHardwareDetected(int sensorId) { - return false; + return getHalInstance() != null; } @Override public void rename(int sensorId, int fingerId, int userId, @NonNull String name) { - + FingerprintUtils.getInstance(sensorId) + .renameBiometricForUser(mContext, userId, fingerId, name); } @NonNull @Override public List getEnrolledFingerprints(int sensorId, int userId) { - return new ArrayList<>(); + return FingerprintUtils.getInstance(sensorId).getBiometricsForUser(mContext, userId); } @Override @@ -417,7 +498,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi @Override public long getAuthenticatorId(int sensorId, int userId) { - return 0; + return mSensors.get(sensorId).getAuthenticatorIds().getOrDefault(userId, 0L); } @Override @@ -459,6 +540,14 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi @Override public void binderDied() { + Slog.e(getTag(), "HAL died"); + mHandler.post(() -> { + mDaemon = null; + for (int i = 0; i < mSensors.size(); i++) { + final int sensorId = mSensors.keyAt(i); + PerformanceTracker.getInstanceForSensorId(sensorId).incrementHALDeathCount(); + } + }); } } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintRemovalClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintRemovalClient.java index d567bbc0edceb..4a99a7b29638b 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintRemovalClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintRemovalClient.java @@ -17,6 +17,7 @@ package com.android.server.biometrics.sensors.fingerprint.aidl; import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.Context; import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.fingerprint.ISession; @@ -35,12 +36,12 @@ import java.util.Map; * Fingerprint-specific removal client supporting the * {@link android.hardware.biometrics.fingerprint.IFingerprint} interface. */ -public class FingerprintRemovalClient extends RemovalClient { +class FingerprintRemovalClient extends RemovalClient { private static final String TAG = "FingerprintRemovalClient"; - public FingerprintRemovalClient(@NonNull Context context, + FingerprintRemovalClient(@NonNull Context context, @NonNull LazyDaemon lazyDaemon, @NonNull IBinder token, - @NonNull ClientMonitorCallbackConverter listener, int biometricId, int userId, + @Nullable ClientMonitorCallbackConverter listener, int biometricId, int userId, @NonNull String owner, @NonNull BiometricUtils utils, int sensorId, @NonNull Map authenticatorIds) { super(context, lazyDaemon, token, listener, biometricId, userId, owner, utils, sensorId, 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 bc35ad4b2807f..17181264c6203 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 @@ -35,7 +35,7 @@ import com.android.server.biometrics.sensors.LockoutTracker; * Updates the framework's lockout cache and notifies clients such as Keyguard when lockout is * cleared. */ -public class FingerprintResetLockoutClient extends ClientMonitor { +class FingerprintResetLockoutClient extends ClientMonitor { private static final String TAG = "FingerprintResetLockoutClient"; @@ -43,7 +43,7 @@ public class FingerprintResetLockoutClient extends ClientMonitor { private final LockoutCache mLockoutCache; private final LockoutResetDispatcher mLockoutResetDispatcher; - public FingerprintResetLockoutClient(@NonNull Context context, + FingerprintResetLockoutClient(@NonNull Context context, @NonNull LazyDaemon lazyDaemon, int userId, String owner, int sensorId, @NonNull byte[] hardwareAuthToken, @NonNull LockoutCache lockoutTracker, @NonNull LockoutResetDispatcher lockoutResetDispatcher) { 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 e97dbe795f749..06edd650cbe51 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 @@ -29,7 +29,7 @@ import com.android.server.biometrics.sensors.RevokeChallengeClient; /** * Fingerprint-specific revokeChallenge client for the {@link IFingerprint} AIDL HAL interface. */ -public class FingerprintRevokeChallengeClient extends RevokeChallengeClient { +class FingerprintRevokeChallengeClient extends RevokeChallengeClient { private static final String TAG = "FingerpirntRevokeChallengeClient"; @@ -44,10 +44,8 @@ public class FingerprintRevokeChallengeClient extends RevokeChallengeClient lazyDaemon, - @NonNull IBinder token, + FingerprintRevokeChallengeClient(@NonNull Context context, + @NonNull LazyDaemon lazyDaemon, @NonNull IBinder token, @NonNull String owner, int sensorId, long challenge) { super(context, lazyDaemon, token, owner, sensorId); mChallenge = challenge; diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/LockoutCache.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/LockoutCache.java index 2abbcb0c7493b..2fae1f3d9d43f 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/LockoutCache.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/LockoutCache.java @@ -23,7 +23,7 @@ import com.android.server.biometrics.sensors.LockoutTracker; /** * For a single sensor, caches lockout states for all users. */ -public class LockoutCache implements LockoutTracker { +class LockoutCache implements LockoutTracker { // Map of userId to LockoutMode private final SparseIntArray mUserLockoutStates; 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 5f5f44ba1fc3b..dacb441b881d1 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 @@ -100,6 +100,7 @@ class Sensor { return mSensorProperties; } + @SuppressWarnings("BooleanMethodIsAlwaysInverted") boolean hasSessionForUser(int userId) { return mCurrentSession != null && mCurrentSession.mUserId == userId; } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java index da68bc8b79da7..470fa1a2b4091 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java @@ -632,7 +632,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider } @Override - public void scheduleInternalCleanup(int userId, int sensorId) { + public void scheduleInternalCleanup(int sensorId, int userId) { scheduleInternalCleanup(userId); }