diff options
| author | 2020-08-28 14:16:52 -0700 | |
|---|---|---|
| committer | 2020-09-02 20:36:20 +0000 | |
| commit | 1cae475b47cc3950c09538d7869f7135a4581350 (patch) | |
| tree | 11d8f5ab7ac322d9428b68f196106576bb655623 | |
| parent | 056630f142a730fe852155033e84a107ddbef5c1 (diff) | |
Read and cache features when user switches
Bug: 163830899
Test: Verified feature is stored to secure setting.
1. Flashed flame device to QDA release build
2. Verified require_attention was being reported as 1
3. Flashed to most recent change, verified require_attention setting
was upated to 0.
Change-Id: I0187e27b641edf0836fa187530cb2a193082fe5d
3 files changed, 42 insertions, 10 deletions
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/Face10.java b/services/core/java/com/android/server/biometrics/sensors/face/Face10.java index d9c62df3f3ea..c134a3faca4f 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/Face10.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/Face10.java @@ -25,12 +25,14 @@ import android.app.UserSwitchObserver; import android.content.Context; import android.content.pm.UserInfo; import android.hardware.biometrics.BiometricConstants; +import android.hardware.biometrics.BiometricFaceConstants; import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.face.V1_0.IBiometricsFace; import android.hardware.biometrics.face.V1_0.IBiometricsFaceClientCallback; import android.hardware.face.Face; import android.hardware.face.FaceSensorProperties; import android.hardware.face.IFaceServiceReceiver; +import android.os.Binder; import android.os.Build; import android.os.Handler; import android.os.IBinder; @@ -109,6 +111,9 @@ class Face10 implements IHwBinder.DeathRecipient { @Override public void onUserSwitching(int newUserId) { scheduleInternalCleanup(newUserId); + scheduleGetFeature(new Binder(), newUserId, + BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION, + null, mContext.getOpPackageName()); } }; @@ -360,6 +365,9 @@ class Face10 implements IHwBinder.DeathRecipient { if (halId != 0) { scheduleLoadAuthenticatorIds(); scheduleInternalCleanup(ActivityManager.getCurrentUser()); + scheduleGetFeature(new Binder(), ActivityManager.getCurrentUser(), + BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION, + null, mContext.getOpPackageName()); } else { Slog.e(TAG, "Unable to set callback"); mDaemon = null; @@ -450,7 +458,7 @@ class Face10 implements IHwBinder.DeathRecipient { } void scheduleGetFeature(@NonNull IBinder token, int userId, int feature, - @NonNull IFaceServiceReceiver receiver, @NonNull String opPackageName) { + @Nullable ClientMonitorCallbackConverter listener, @NonNull String opPackageName) { mHandler.post(() -> { final List<Face> faces = getEnrolledFaces(userId); if (faces.isEmpty()) { @@ -461,10 +469,22 @@ class Face10 implements IHwBinder.DeathRecipient { scheduleUpdateActiveUserWithoutHandler(userId); final int faceId = faces.get(0).getBiometricId(); - final FaceGetFeatureClient client = new FaceGetFeatureClient(mContext, - mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), userId, - opPackageName, mSensorId, feature, faceId); - mScheduler.scheduleClientMonitor(client); + final FaceGetFeatureClient client = new FaceGetFeatureClient(mContext, mLazyDaemon, + token, listener, userId, opPackageName, mSensorId, feature, faceId); + mScheduler.scheduleClientMonitor(client, new ClientMonitor.Callback() { + @Override + public void onClientFinished( + @NonNull ClientMonitor<?> clientMonitor, boolean success) { + if (success && feature == BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION) { + final int settingsValue = client.getValue() ? 1 : 0; + Slog.d(TAG, "Updating attention value for user: " + userId + + " to value: " + settingsValue); + Settings.Secure.putIntForUser(mContext.getContentResolver(), + Settings.Secure.FACE_UNLOCK_ATTENTION_REQUIRED, + settingsValue, userId); + } + } + }); }); } 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 8c7b99d6eb52..33b2b6ada24c 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 @@ -17,6 +17,7 @@ package com.android.server.biometrics.sensors.face; import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.Context; import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.face.V1_0.IBiometricsFace; @@ -39,9 +40,10 @@ public class FaceGetFeatureClient extends ClientMonitor<IBiometricsFace> { private final int mFeature; private final int mFaceId; + private boolean mValue; FaceGetFeatureClient(@NonNull Context context, @NonNull LazyDaemon<IBiometricsFace> lazyDaemon, - @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, + @NonNull IBinder token, @Nullable 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, @@ -54,7 +56,9 @@ public class FaceGetFeatureClient extends ClientMonitor<IBiometricsFace> { @Override public void unableToStart() { try { - getListener().onFeatureGet(false /* success */, mFeature, false /* value */); + if (getListener() != null) { + getListener().onFeatureGet(false /* success */, mFeature, false /* value */); + } } catch (RemoteException e) { Slog.e(TAG, "Unable to send error", e); } @@ -70,11 +74,18 @@ public class FaceGetFeatureClient extends ClientMonitor<IBiometricsFace> { protected void startHalOperation() { try { final OptionalBool result = getFreshDaemon().getFeature(mFeature, mFaceId); - getListener().onFeatureGet(result.status == Status.OK, mFeature, result.value); + mValue = result.value; + if (getListener() != null) { + getListener().onFeatureGet(result.status == Status.OK, mFeature, mValue); + } mCallback.onClientFinished(this, true /* success */); } catch (RemoteException e) { Slog.e(TAG, "Unable to getFeature", e); mCallback.onClientFinished(this, false /* success */); } } + + boolean getValue() { + return mValue; + } } 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 b689106bbc44..c6664f4d96ff 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 @@ -25,9 +25,9 @@ import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.IBiometricSensorReceiver; import android.hardware.biometrics.IBiometricServiceLockoutResetCallback; import android.hardware.face.Face; +import android.hardware.face.FaceSensorProperties; import android.hardware.face.IFaceService; import android.hardware.face.IFaceServiceReceiver; -import android.hardware.face.FaceSensorProperties; import android.os.Binder; import android.os.IBinder; import android.os.NativeHandle; @@ -303,7 +303,8 @@ public class FaceService extends SystemService { public void getFeature(final IBinder token, int userId, int feature, IFaceServiceReceiver receiver, final String opPackageName) { Utils.checkPermission(getContext(), MANAGE_BIOMETRIC); - mFace10.scheduleGetFeature(token, userId, feature, receiver, opPackageName); + mFace10.scheduleGetFeature(token, userId, feature, + new ClientMonitorCallbackConverter(receiver), opPackageName); } @Override // Binder call |