From f3004223438b8e1ad8251abbabae537a2276ee8d Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Thu, 14 Jan 2021 11:55:49 -0800 Subject: [PATCH] 5/n: Add invalidation plumbing in fingerprint/face providers A subsequent CL will initiate the invalidation, e.g. create an InvalidationRequesterClient when enroll finishes. Bug: 159667191 Test: Presubmit Change-Id: I80338fc3cec4b441ea4eef6359fd36969ce04277 --- .../sensors/InvalidationClient.java | 20 +++++++++---- .../face/aidl/FaceInvalidationClient.java | 6 ++-- .../sensors/face/aidl/FaceProvider.java | 28 ++++++++++++++++++- .../biometrics/sensors/face/aidl/Sensor.java | 12 +++++++- .../aidl/FingerprintInvalidationClient.java | 6 ++-- .../fingerprint/aidl/FingerprintProvider.java | 28 +++++++++++++++++++ .../sensors/fingerprint/aidl/Sensor.java | 13 ++++++++- 7 files changed, 99 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/biometrics/sensors/InvalidationClient.java b/services/core/java/com/android/server/biometrics/sensors/InvalidationClient.java index fe946cb0189df..cdd0abf2845e3 100644 --- a/services/core/java/com/android/server/biometrics/sensors/InvalidationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/InvalidationClient.java @@ -20,6 +20,9 @@ import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricsProtoEnums; +import android.hardware.biometrics.IInvalidationCallback; +import android.os.RemoteException; +import android.util.Slog; import java.util.Map; @@ -30,22 +33,29 @@ import java.util.Map; public abstract class InvalidationClient extends ClientMonitor { - private final BiometricUtils mUtils; - private final Map mAuthenticatorIds; + private static final String TAG = "InvalidationClient"; + + @NonNull private final Map mAuthenticatorIds; + @NonNull private final IInvalidationCallback mInvalidationCallback; public InvalidationClient(@NonNull Context context, @NonNull LazyDaemon lazyDaemon, - int userId, int sensorId, @NonNull BiometricUtils utils, - @NonNull Map authenticatorIds) { + int userId, int sensorId, @NonNull Map authenticatorIds, + @NonNull IInvalidationCallback callback) { super(context, lazyDaemon, null /* token */, null /* listener */, userId, context.getOpPackageName(), 0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN); - mUtils = utils; mAuthenticatorIds = authenticatorIds; + mInvalidationCallback = callback; } public void onAuthenticatorIdInvalidated(long newAuthenticatorId) { mAuthenticatorIds.put(getTargetUserId(), newAuthenticatorId); + try { + mInvalidationCallback.onCompleted(); + } catch (RemoteException e) { + Slog.e(TAG, "Remote exception", e); + } mCallback.onClientFinished(this, true /* success */); } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInvalidationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInvalidationClient.java index 9c6438ecd0140..855ee1dbf52fe 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInvalidationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInvalidationClient.java @@ -18,13 +18,13 @@ package com.android.server.biometrics.sensors.face.aidl; import android.annotation.NonNull; import android.content.Context; +import android.hardware.biometrics.IInvalidationCallback; import android.hardware.biometrics.face.ISession; import android.hardware.face.Face; import android.os.RemoteException; import android.util.Slog; import com.android.server.biometrics.sensors.InvalidationClient; -import com.android.server.biometrics.sensors.face.FaceUtils; import java.util.Map; @@ -33,8 +33,8 @@ public class FaceInvalidationClient extends InvalidationClient { public FaceInvalidationClient(@NonNull Context context, @NonNull LazyDaemon lazyDaemon, int userId, int sensorId, - @NonNull FaceUtils utils, @NonNull Map authenticatorIds) { - super(context, lazyDaemon, userId, sensorId, utils, authenticatorIds); + @NonNull Map authenticatorIds, @NonNull IInvalidationCallback callback) { + super(context, lazyDaemon, userId, sensorId, authenticatorIds, callback); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java index cec1cb8654fc7..e90cc247da582 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java @@ -20,10 +20,10 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityTaskManager; -import android.app.IActivityTaskManager; import android.app.TaskStackListener; import android.content.Context; import android.content.pm.UserInfo; +import android.hardware.biometrics.IInvalidationCallback; import android.hardware.biometrics.ITestSession; import android.hardware.biometrics.face.IFace; import android.hardware.biometrics.face.SensorProps; @@ -268,6 +268,32 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { return FaceUtils.getInstance(sensorId).getBiometricsForUser(mContext, userId); } + @Override + public void scheduleInvalidateAuthenticatorId(int sensorId, int userId, + @NonNull IInvalidationCallback callback) { + mHandler.post(() -> { + final IFace daemon = getHalInstance(); + if (daemon == null) { + Slog.e(getTag(), "Null daemon during scheduleInvalidateAuthenticatorId: " + + sensorId); + return; + } + + try { + if (!mSensors.get(sensorId).hasSessionForUser(userId)) { + createNewSessionWithoutHandler(daemon, sensorId, userId); + } + + final FaceInvalidationClient client = new FaceInvalidationClient(mContext, + mSensors.get(sensorId).getLazySession(), userId, sensorId, + mSensors.get(sensorId).getAuthenticatorIds(), callback); + mSensors.get(sensorId).getScheduler().scheduleClientMonitor(client); + } catch (RemoteException e) { + Slog.e(getTag(), "Remote exception", e); + } + }); + } + @Override public int getLockoutModeForUser(int sensorId, int userId) { return mSensors.get(sensorId).getLockoutCache().getLockoutModeForUser(userId); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java index 2cf729c54e64e..32f12e6b2cf46 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java @@ -376,7 +376,17 @@ public class Sensor implements IBinder.DeathRecipient { @Override public void onAuthenticatorIdInvalidated(long newAuthenticatorId) { - // TODO(b/159667191) + mHandler.post(() -> { + final ClientMonitor client = mScheduler.getCurrentClient(); + if (!(client instanceof FaceInvalidationClient)) { + Slog.e(mTag, "onAuthenticatorIdInvalidated for wrong consumer: " + + Utils.getClientName(client)); + return; + } + + final FaceInvalidationClient invalidationClient = (FaceInvalidationClient) client; + invalidationClient.onAuthenticatorIdInvalidated(newAuthenticatorId); + }); } } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInvalidationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInvalidationClient.java index 3d07334f04a14..80d1a0ffea6b1 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInvalidationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInvalidationClient.java @@ -18,13 +18,13 @@ package com.android.server.biometrics.sensors.fingerprint.aidl; import android.annotation.NonNull; import android.content.Context; +import android.hardware.biometrics.IInvalidationCallback; import android.hardware.biometrics.fingerprint.ISession; import android.hardware.fingerprint.Fingerprint; import android.os.RemoteException; import android.util.Slog; import com.android.server.biometrics.sensors.InvalidationClient; -import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils; import java.util.Map; @@ -33,8 +33,8 @@ public class FingerprintInvalidationClient extends InvalidationClient lazyDaemon, int userId, int sensorId, - @NonNull FingerprintUtils utils, @NonNull Map authenticatorIds) { - super(context, lazyDaemon, userId, sensorId, utils, authenticatorIds); + @NonNull Map authenticatorIds, @NonNull IInvalidationCallback callback) { + super(context, lazyDaemon, userId, sensorId, authenticatorIds, callback); } @Override 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 a03debadf36c2..adf465981065c 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,6 +23,7 @@ import android.app.ActivityTaskManager; import android.app.TaskStackListener; import android.content.Context; import android.content.pm.UserInfo; +import android.hardware.biometrics.IInvalidationCallback; import android.hardware.biometrics.ITestSession; import android.hardware.biometrics.fingerprint.IFingerprint; import android.hardware.biometrics.fingerprint.SensorProps; @@ -541,6 +542,33 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi return FingerprintUtils.getInstance(sensorId).getBiometricsForUser(mContext, userId); } + @Override + public void scheduleInvalidateAuthenticatorId(int sensorId, int userId, + @NonNull IInvalidationCallback callback) { + mHandler.post(() -> { + final IFingerprint daemon = getHalInstance(); + if (daemon == null) { + Slog.e(getTag(), "Null daemon during scheduleInvalidateAuthenticatorId: " + + sensorId); + return; + } + + try { + if (!mSensors.get(sensorId).hasSessionForUser(userId)) { + createNewSessionWithoutHandler(daemon, sensorId, userId); + } + + final FingerprintInvalidationClient client = + new FingerprintInvalidationClient(mContext, + mSensors.get(sensorId).getLazySession(), userId, sensorId, + mSensors.get(sensorId).getAuthenticatorIds(), callback); + mSensors.get(sensorId).getScheduler().scheduleClientMonitor(client); + } catch (RemoteException e) { + Slog.e(getTag(), "Remote exception", e); + } + }); + } + @Override public int getLockoutModeForUser(int sensorId, int userId) { return mSensors.get(sensorId).getLockoutCache().getLockoutModeForUser(userId); 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 5fefe98aaabf1..a27ac42042bf5 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 @@ -389,7 +389,18 @@ class Sensor implements IBinder.DeathRecipient { @Override public void onAuthenticatorIdInvalidated(long newAuthenticatorId) { - // TODO(159667191) + mHandler.post(() -> { + final ClientMonitor client = mScheduler.getCurrentClient(); + if (!(client instanceof FingerprintInvalidationClient)) { + Slog.e(mTag, "onAuthenticatorIdInvalidated for wrong consumer: " + + Utils.getClientName(client)); + return; + } + + final FingerprintInvalidationClient invalidationClient = + (FingerprintInvalidationClient) client; + invalidationClient.onAuthenticatorIdInvalidated(newAuthenticatorId); + }); } }