Remove IPC calls from KeyguardUpdateMonitor

Test: atest KeyguardUpdateMonitorTest AuthControllerTest DozeSensorsTest LockIconViewControllerTest FaceServiceRegistryTest FingerprintServiceRegistryTest BiometricStateCallbackTest
Bug: 221037350
Change-Id: I76f6092f7dc1af45b3df12f86b2bf3ec4b00ff8f
This commit is contained in:
Diya Bera
2022-09-30 16:38:31 +00:00
parent 5a3bf4a7b9
commit bd128a9e84
12 changed files with 125 additions and 65 deletions

View File

@@ -2227,8 +2227,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
private void updateFaceEnrolled(int userId) { private void updateFaceEnrolled(int userId) {
mIsFaceEnrolled = whitelistIpcs( mIsFaceEnrolled = whitelistIpcs(
() -> mFaceManager != null && mFaceManager.isHardwareDetected() () -> mFaceManager != null && mFaceManager.isHardwareDetected()
&& mFaceManager.hasEnrolledTemplates(userId) && mBiometricEnabledForUser.get(userId))
&& mBiometricEnabledForUser.get(userId)); && mAuthController.isFaceAuthEnrolled(userId);
} }
public boolean isFaceSupported() { public boolean isFaceSupported() {

View File

@@ -153,6 +153,7 @@ public class AuthController implements CoreStartable, CommandQueue.Callbacks,
@Nullable private List<FingerprintSensorPropertiesInternal> mSidefpsProps; @Nullable private List<FingerprintSensorPropertiesInternal> mSidefpsProps;
@NonNull private final SparseBooleanArray mUdfpsEnrolledForUser; @NonNull private final SparseBooleanArray mUdfpsEnrolledForUser;
@NonNull private final SparseBooleanArray mFaceEnrolledForUser;
@NonNull private final SensorPrivacyManager mSensorPrivacyManager; @NonNull private final SensorPrivacyManager mSensorPrivacyManager;
private final WakefulnessLifecycle mWakefulnessLifecycle; private final WakefulnessLifecycle mWakefulnessLifecycle;
private boolean mAllFingerprintAuthenticatorsRegistered; private boolean mAllFingerprintAuthenticatorsRegistered;
@@ -349,6 +350,15 @@ public class AuthController implements CoreStartable, CommandQueue.Callbacks,
} }
} }
} }
if (mFaceProps == null) {
Log.d(TAG, "handleEnrollmentsChanged, mFaceProps is null");
} else {
for (FaceSensorPropertiesInternal prop : mFaceProps) {
if (prop.sensorId == sensorId) {
mFaceEnrolledForUser.put(userId, hasEnrollments);
}
}
}
for (Callback cb : mCallbacks) { for (Callback cb : mCallbacks) {
cb.onEnrollmentsChanged(modality); cb.onEnrollmentsChanged(modality);
} }
@@ -715,6 +725,7 @@ public class AuthController implements CoreStartable, CommandQueue.Callbacks,
mWindowManager = windowManager; mWindowManager = windowManager;
mInteractionJankMonitor = jankMonitor; mInteractionJankMonitor = jankMonitor;
mUdfpsEnrolledForUser = new SparseBooleanArray(); mUdfpsEnrolledForUser = new SparseBooleanArray();
mFaceEnrolledForUser = new SparseBooleanArray();
mVibratorHelper = vibrator; mVibratorHelper = vibrator;
mOrientationListener = new BiometricDisplayListener( mOrientationListener = new BiometricDisplayListener(
@@ -1067,7 +1078,7 @@ public class AuthController implements CoreStartable, CommandQueue.Callbacks,
return false; return false;
} }
return mFaceManager.hasEnrolledTemplates(userId); return mFaceEnrolledForUser.get(userId);
} }
/** /**

View File

@@ -236,8 +236,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
when(mActivityService.getCurrentUser()).thenReturn(mCurrentUserInfo); when(mActivityService.getCurrentUser()).thenReturn(mCurrentUserInfo);
when(mActivityService.getCurrentUserId()).thenReturn(mCurrentUserId); when(mActivityService.getCurrentUserId()).thenReturn(mCurrentUserId);
when(mFaceManager.isHardwareDetected()).thenReturn(true); when(mFaceManager.isHardwareDetected()).thenReturn(true);
when(mFaceManager.hasEnrolledTemplates()).thenReturn(true); when(mAuthController.isFaceAuthEnrolled(anyInt())).thenReturn(true);
when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
when(mFaceManager.getSensorPropertiesInternal()).thenReturn(mFaceSensorProperties); when(mFaceManager.getSensorPropertiesInternal()).thenReturn(mFaceSensorProperties);
when(mSessionTracker.getSessionId(SESSION_KEYGUARD)).thenReturn(mKeyguardInstanceId); when(mSessionTracker.getSessionId(SESSION_KEYGUARD)).thenReturn(mKeyguardInstanceId);
@@ -592,7 +591,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
verify(mFaceManager).authenticate(any(), any(), any(), any(), anyInt(), anyBoolean()); verify(mFaceManager).authenticate(any(), any(), any(), any(), anyInt(), anyBoolean());
verify(mFaceManager).isHardwareDetected(); verify(mFaceManager).isHardwareDetected();
verify(mFaceManager).hasEnrolledTemplates(anyInt()); verify(mFaceManager, never()).hasEnrolledTemplates(anyInt());
} }
@Test @Test

View File

@@ -25,7 +25,9 @@ import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_AWA
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
@@ -236,7 +238,7 @@ public class AuthControllerTest extends SysuiTestCase {
2 /* sensorId */, 2 /* sensorId */,
SensorProperties.STRENGTH_STRONG, SensorProperties.STRENGTH_STRONG,
1 /* maxEnrollmentsPerUser */, 1 /* maxEnrollmentsPerUser */,
fpComponentInfo, faceComponentInfo,
FaceSensorProperties.TYPE_RGB, FaceSensorProperties.TYPE_RGB,
true /* supportsFaceDetection */, true /* supportsFaceDetection */,
true /* supportsSelfIllumination */, true /* supportsSelfIllumination */,
@@ -276,8 +278,6 @@ public class AuthControllerTest extends SysuiTestCase {
reset(mFingerprintManager); reset(mFingerprintManager);
reset(mFaceManager); reset(mFaceManager);
when(mVibratorHelper.hasVibrator()).thenReturn(true);
// This test requires an uninitialized AuthController. // This test requires an uninitialized AuthController.
AuthController authController = new TestableAuthController(mContextSpy, mExecution, AuthController authController = new TestableAuthController(mContextSpy, mExecution,
mCommandQueue, mActivityTaskManager, mWindowManager, mFingerprintManager, mCommandQueue, mActivityTaskManager, mWindowManager, mFingerprintManager,
@@ -308,8 +308,6 @@ public class AuthControllerTest extends SysuiTestCase {
reset(mFingerprintManager); reset(mFingerprintManager);
reset(mFaceManager); reset(mFaceManager);
when(mVibratorHelper.hasVibrator()).thenReturn(true);
// This test requires an uninitialized AuthController. // This test requires an uninitialized AuthController.
AuthController authController = new TestableAuthController(mContextSpy, mExecution, AuthController authController = new TestableAuthController(mContextSpy, mExecution,
mCommandQueue, mActivityTaskManager, mWindowManager, mFingerprintManager, mCommandQueue, mActivityTaskManager, mWindowManager, mFingerprintManager,
@@ -342,6 +340,36 @@ public class AuthControllerTest extends SysuiTestCase {
// Nothing should crash. // Nothing should crash.
} }
@Test
public void testFaceAuthEnrollmentStatus() throws RemoteException {
final int userId = 0;
reset(mFaceManager);
mAuthController.start();
verify(mFaceManager).addAuthenticatorsRegisteredCallback(
mFaceAuthenticatorsRegisteredCaptor.capture());
mFaceAuthenticatorsRegisteredCaptor.getValue().onAllAuthenticatorsRegistered(
mFaceManager.getSensorPropertiesInternal());
mTestableLooper.processAllMessages();
verify(mFaceManager).registerBiometricStateListener(
mBiometricStateCaptor.capture());
assertFalse(mAuthController.isFaceAuthEnrolled(userId));
// Enrollments changed for an unknown sensor.
for (BiometricStateListener listener : mBiometricStateCaptor.getAllValues()) {
listener.onEnrollmentsChanged(userId,
2 /* sensorId */, true /* hasEnrollments */);
}
mTestableLooper.processAllMessages();
assertTrue(mAuthController.isFaceAuthEnrolled(userId));
}
@Test @Test
public void testSendsReasonUserCanceled_whenDismissedByUserCancel() throws Exception { public void testSendsReasonUserCanceled_whenDismissedByUserCancel() throws Exception {
showDialog(new int[]{1} /* sensorIds */, false /* credentialAllowed */); showDialog(new int[]{1} /* sensorIds */, false /* credentialAllowed */);

View File

@@ -600,8 +600,9 @@ public class FaceService extends SystemService {
} }
try { try {
final SensorProps[] props = face.getSensorProps(); final SensorProps[] props = face.getSensorProps();
final FaceProvider provider = new FaceProvider(getContext(), props, instance, final FaceProvider provider = new FaceProvider(getContext(),
mLockoutResetDispatcher, BiometricContext.getInstance(getContext())); mBiometricStateCallback, props, instance, mLockoutResetDispatcher,
BiometricContext.getInstance(getContext()));
providers.add(provider); providers.add(provider);
} catch (RemoteException e) { } catch (RemoteException e) {
Slog.e(TAG, "Remote exception in getSensorProps: " + fqName); Slog.e(TAG, "Remote exception in getSensorProps: " + fqName);
@@ -612,14 +613,14 @@ public class FaceService extends SystemService {
} }
@android.annotation.EnforcePermission(android.Manifest.permission.USE_BIOMETRIC_INTERNAL) @android.annotation.EnforcePermission(android.Manifest.permission.USE_BIOMETRIC_INTERNAL)
@Override // Binder call
public void registerAuthenticators( public void registerAuthenticators(
@NonNull List<FaceSensorPropertiesInternal> hidlSensors) { @NonNull List<FaceSensorPropertiesInternal> hidlSensors) {
mRegistry.registerAll(() -> { mRegistry.registerAll(() -> {
final List<ServiceProvider> providers = new ArrayList<>(); final List<ServiceProvider> providers = new ArrayList<>();
for (FaceSensorPropertiesInternal hidlSensor : hidlSensors) { for (FaceSensorPropertiesInternal hidlSensor : hidlSensors) {
providers.add( providers.add(
Face10.newInstance(getContext(), hidlSensor, mLockoutResetDispatcher)); Face10.newInstance(getContext(), mBiometricStateCallback,
hidlSensor, mLockoutResetDispatcher));
} }
providers.addAll(getAidlProviders()); providers.addAll(getAidlProviders());
return providers; return providers;

View File

@@ -16,8 +16,6 @@
package com.android.server.biometrics.sensors.face.aidl; package com.android.server.biometrics.sensors.face.aidl;
import static android.Manifest.permission.TEST_BIOMETRIC;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.content.Context; import android.content.Context;
import android.hardware.biometrics.ITestSession; import android.hardware.biometrics.ITestSession;
@@ -33,7 +31,6 @@ import android.os.RemoteException;
import android.util.Slog; import android.util.Slog;
import com.android.server.biometrics.HardwareAuthTokenUtils; import com.android.server.biometrics.HardwareAuthTokenUtils;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.BaseClientMonitor; import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallback; import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.face.FaceUtils; import com.android.server.biometrics.sensors.face.FaceUtils;

View File

@@ -52,9 +52,11 @@ import com.android.server.biometrics.log.BiometricContext;
import com.android.server.biometrics.log.BiometricLogger; import com.android.server.biometrics.log.BiometricLogger;
import com.android.server.biometrics.sensors.AuthenticationClient; import com.android.server.biometrics.sensors.AuthenticationClient;
import com.android.server.biometrics.sensors.BaseClientMonitor; import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricStateCallback;
import com.android.server.biometrics.sensors.BiometricScheduler; import com.android.server.biometrics.sensors.BiometricScheduler;
import com.android.server.biometrics.sensors.ClientMonitorCallback; import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter; import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.ClientMonitorCompositeCallback;
import com.android.server.biometrics.sensors.InvalidationRequesterClient; import com.android.server.biometrics.sensors.InvalidationRequesterClient;
import com.android.server.biometrics.sensors.LockoutResetDispatcher; import com.android.server.biometrics.sensors.LockoutResetDispatcher;
import com.android.server.biometrics.sensors.PerformanceTracker; import com.android.server.biometrics.sensors.PerformanceTracker;
@@ -81,6 +83,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
private boolean mTestHalEnabled; private boolean mTestHalEnabled;
@NonNull private final Context mContext; @NonNull private final Context mContext;
@NonNull private final BiometricStateCallback mBiometricStateCallback;
@NonNull private final String mHalInstanceName; @NonNull private final String mHalInstanceName;
@NonNull @VisibleForTesting @NonNull @VisibleForTesting
final SparseArray<Sensor> mSensors; // Map of sensors that this HAL supports final SparseArray<Sensor> mSensors; // Map of sensors that this HAL supports
@@ -122,11 +125,14 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
} }
} }
public FaceProvider(@NonNull Context context, @NonNull SensorProps[] props, public FaceProvider(@NonNull Context context,
@NonNull BiometricStateCallback biometricStateCallback,
@NonNull SensorProps[] props,
@NonNull String halInstanceName, @NonNull String halInstanceName,
@NonNull LockoutResetDispatcher lockoutResetDispatcher, @NonNull LockoutResetDispatcher lockoutResetDispatcher,
@NonNull BiometricContext biometricContext) { @NonNull BiometricContext biometricContext) {
mContext = context; mContext = context;
mBiometricStateCallback = biometricStateCallback;
mHalInstanceName = halInstanceName; mHalInstanceName = halInstanceName;
mSensors = new SparseArray<>(); mSensors = new SparseArray<>();
mHandler = new Handler(Looper.getMainLooper()); mHandler = new Handler(Looper.getMainLooper());
@@ -363,16 +369,18 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
createLogger(BiometricsProtoEnums.ACTION_ENROLL, createLogger(BiometricsProtoEnums.ACTION_ENROLL,
BiometricsProtoEnums.CLIENT_UNKNOWN), BiometricsProtoEnums.CLIENT_UNKNOWN),
mBiometricContext, maxTemplatesPerUser, debugConsent); mBiometricContext, maxTemplatesPerUser, debugConsent);
scheduleForSensor(sensorId, client, new ClientMonitorCallback() { scheduleForSensor(sensorId, client, new ClientMonitorCompositeCallback(
@Override mBiometricStateCallback, new ClientMonitorCallback() {
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor, @Override
boolean success) { public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
if (success) { boolean success) {
scheduleLoadAuthenticatorIdsForUser(sensorId, userId); ClientMonitorCallback.super.onClientFinished(clientMonitor, success);
scheduleInvalidationRequest(sensorId, userId); if (success) {
} scheduleLoadAuthenticatorIdsForUser(sensorId, userId);
} scheduleInvalidationRequest(sensorId, userId);
}); }
}
}));
}); });
return id; return id;
} }
@@ -396,7 +404,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
token, id, callback, userId, opPackageName, sensorId, token, id, callback, userId, opPackageName, sensorId,
createLogger(BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient), createLogger(BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient),
mBiometricContext, isStrongBiometric); mBiometricContext, isStrongBiometric);
scheduleForSensor(sensorId, client); scheduleForSensor(sensorId, client, mBiometricStateCallback);
}); });
return id; return id;
@@ -424,7 +432,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
mBiometricContext, isStrongBiometric, mBiometricContext, isStrongBiometric,
mUsageStats, mSensors.get(sensorId).getLockoutCache(), mUsageStats, mSensors.get(sensorId).getLockoutCache(),
allowBackgroundAuthentication, isKeyguardBypassEnabled, biometricStrength); allowBackgroundAuthentication, isKeyguardBypassEnabled, biometricStrength);
scheduleForSensor(sensorId, client); scheduleForSensor(sensorId, client, mBiometricStateCallback);
}); });
} }
@@ -479,7 +487,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
BiometricsProtoEnums.CLIENT_UNKNOWN), BiometricsProtoEnums.CLIENT_UNKNOWN),
mBiometricContext, mBiometricContext,
mSensors.get(sensorId).getAuthenticatorIds()); mSensors.get(sensorId).getAuthenticatorIds());
scheduleForSensor(sensorId, client); scheduleForSensor(sensorId, client, mBiometricStateCallback);
}); });
} }
@@ -568,7 +576,8 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
if (favorHalEnrollments) { if (favorHalEnrollments) {
client.setFavorHalEnrollments(); client.setFavorHalEnrollments();
} }
scheduleForSensor(sensorId, client, callback); scheduleForSensor(sensorId, client, new ClientMonitorCompositeCallback(callback,
mBiometricStateCallback));
}); });
} }

View File

@@ -16,8 +16,6 @@
package com.android.server.biometrics.sensors.face.hidl; package com.android.server.biometrics.sensors.face.hidl;
import static android.Manifest.permission.TEST_BIOMETRIC;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.content.Context; import android.content.Context;
import android.hardware.biometrics.ITestSession; import android.hardware.biometrics.ITestSession;
@@ -30,7 +28,6 @@ import android.os.Binder;
import android.os.RemoteException; import android.os.RemoteException;
import android.util.Slog; import android.util.Slog;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.BaseClientMonitor; import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallback; import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.face.FaceUtils; import com.android.server.biometrics.sensors.face.FaceUtils;
@@ -53,6 +50,7 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
@NonNull private final Set<Integer> mEnrollmentIds; @NonNull private final Set<Integer> mEnrollmentIds;
@NonNull private final Random mRandom; @NonNull private final Random mRandom;
private final IFaceServiceReceiver mReceiver = new IFaceServiceReceiver.Stub() { private final IFaceServiceReceiver mReceiver = new IFaceServiceReceiver.Stub() {
@Override @Override
public void onEnrollResult(Face face, int remaining) { public void onEnrollResult(Face face, int remaining) {
@@ -116,7 +114,8 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
}; };
BiometricTestSessionImpl(@NonNull Context context, int sensorId, BiometricTestSessionImpl(@NonNull Context context, int sensorId,
@NonNull ITestSessionCallback callback, @NonNull Face10 face10, @NonNull ITestSessionCallback callback,
@NonNull Face10 face10,
@NonNull Face10.HalResultController halResultController) { @NonNull Face10.HalResultController halResultController) {
mContext = context; mContext = context;
mSensorId = sensorId; mSensorId = sensorId;

View File

@@ -62,8 +62,10 @@ import com.android.server.biometrics.sensors.AuthenticationConsumer;
import com.android.server.biometrics.sensors.BaseClientMonitor; import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricNotificationUtils; import com.android.server.biometrics.sensors.BiometricNotificationUtils;
import com.android.server.biometrics.sensors.BiometricScheduler; import com.android.server.biometrics.sensors.BiometricScheduler;
import com.android.server.biometrics.sensors.BiometricStateCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallback; import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter; import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.ClientMonitorCompositeCallback;
import com.android.server.biometrics.sensors.EnumerateConsumer; import com.android.server.biometrics.sensors.EnumerateConsumer;
import com.android.server.biometrics.sensors.ErrorConsumer; import com.android.server.biometrics.sensors.ErrorConsumer;
import com.android.server.biometrics.sensors.LockoutResetDispatcher; import com.android.server.biometrics.sensors.LockoutResetDispatcher;
@@ -110,6 +112,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
private boolean mTestHalEnabled; private boolean mTestHalEnabled;
@NonNull private final FaceSensorPropertiesInternal mSensorProperties; @NonNull private final FaceSensorPropertiesInternal mSensorProperties;
@NonNull private final BiometricStateCallback mBiometricStateCallback;
@NonNull private final Context mContext; @NonNull private final Context mContext;
@NonNull private final BiometricScheduler mScheduler; @NonNull private final BiometricScheduler mScheduler;
@NonNull private final Handler mHandler; @NonNull private final Handler mHandler;
@@ -336,6 +339,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
@VisibleForTesting @VisibleForTesting
Face10(@NonNull Context context, Face10(@NonNull Context context,
@NonNull BiometricStateCallback biometricStateCallback,
@NonNull FaceSensorPropertiesInternal sensorProps, @NonNull FaceSensorPropertiesInternal sensorProps,
@NonNull LockoutResetDispatcher lockoutResetDispatcher, @NonNull LockoutResetDispatcher lockoutResetDispatcher,
@NonNull Handler handler, @NonNull Handler handler,
@@ -343,6 +347,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
@NonNull BiometricContext biometricContext) { @NonNull BiometricContext biometricContext) {
mSensorProperties = sensorProps; mSensorProperties = sensorProps;
mContext = context; mContext = context;
mBiometricStateCallback = biometricStateCallback;
mSensorId = sensorProps.sensorId; mSensorId = sensorProps.sensorId;
mScheduler = scheduler; mScheduler = scheduler;
mHandler = handler; mHandler = handler;
@@ -366,11 +371,12 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
} }
public static Face10 newInstance(@NonNull Context context, public static Face10 newInstance(@NonNull Context context,
@NonNull BiometricStateCallback biometricStateCallback,
@NonNull FaceSensorPropertiesInternal sensorProps, @NonNull FaceSensorPropertiesInternal sensorProps,
@NonNull LockoutResetDispatcher lockoutResetDispatcher) { @NonNull LockoutResetDispatcher lockoutResetDispatcher) {
final Handler handler = new Handler(Looper.getMainLooper()); final Handler handler = new Handler(Looper.getMainLooper());
return new Face10(context, sensorProps, lockoutResetDispatcher, handler, return new Face10(context, biometricStateCallback, sensorProps, lockoutResetDispatcher,
new BiometricScheduler(TAG, BiometricScheduler.SENSOR_TYPE_FACE, handler, new BiometricScheduler(TAG, BiometricScheduler.SENSOR_TYPE_FACE,
null /* gestureAvailabilityTracker */), null /* gestureAvailabilityTracker */),
BiometricContext.getInstance(context)); BiometricContext.getInstance(context));
} }
@@ -614,9 +620,20 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
mBiometricContext); mBiometricContext);
mScheduler.scheduleClientMonitor(client, new ClientMonitorCallback() { mScheduler.scheduleClientMonitor(client, new ClientMonitorCallback() {
@Override
public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
mBiometricStateCallback.onClientStarted(clientMonitor);
}
@Override
public void onBiometricAction(int action) {
mBiometricStateCallback.onBiometricAction(action);
}
@Override @Override
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor, public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
boolean success) { boolean success) {
mBiometricStateCallback.onClientFinished(clientMonitor, success);
if (success) { if (success) {
// Update authenticatorIds // Update authenticatorIds
scheduleUpdateActiveUserWithoutHandler(client.getTargetUserId()); scheduleUpdateActiveUserWithoutHandler(client.getTargetUserId());
@@ -661,7 +678,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
createLogger(BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient), createLogger(BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient),
mBiometricContext, isStrongBiometric, mLockoutTracker, mBiometricContext, isStrongBiometric, mLockoutTracker,
mUsageStats, allowBackgroundAuthentication, isKeyguardBypassEnabled); mUsageStats, allowBackgroundAuthentication, isKeyguardBypassEnabled);
mScheduler.scheduleClientMonitor(client); mScheduler.scheduleClientMonitor(client, mBiometricStateCallback);
}); });
} }
@@ -696,7 +713,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
createLogger(BiometricsProtoEnums.ACTION_REMOVE, createLogger(BiometricsProtoEnums.ACTION_REMOVE,
BiometricsProtoEnums.CLIENT_UNKNOWN), BiometricsProtoEnums.CLIENT_UNKNOWN),
mBiometricContext, mAuthenticatorIds); mBiometricContext, mAuthenticatorIds);
mScheduler.scheduleClientMonitor(client); mScheduler.scheduleClientMonitor(client, mBiometricStateCallback);
}); });
} }
@@ -714,7 +731,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
createLogger(BiometricsProtoEnums.ACTION_REMOVE, createLogger(BiometricsProtoEnums.ACTION_REMOVE,
BiometricsProtoEnums.CLIENT_UNKNOWN), BiometricsProtoEnums.CLIENT_UNKNOWN),
mBiometricContext, mAuthenticatorIds); mBiometricContext, mAuthenticatorIds);
mScheduler.scheduleClientMonitor(client); mScheduler.scheduleClientMonitor(client, mBiometricStateCallback);
}); });
} }
@@ -806,14 +823,15 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
BiometricsProtoEnums.CLIENT_UNKNOWN), BiometricsProtoEnums.CLIENT_UNKNOWN),
mBiometricContext, enrolledList, mBiometricContext, enrolledList,
FaceUtils.getLegacyInstance(mSensorId), mAuthenticatorIds); FaceUtils.getLegacyInstance(mSensorId), mAuthenticatorIds);
mScheduler.scheduleClientMonitor(client, callback); mScheduler.scheduleClientMonitor(client, new ClientMonitorCompositeCallback(callback,
mBiometricStateCallback));
}); });
} }
@Override @Override
public void scheduleInternalCleanup(int sensorId, int userId, public void scheduleInternalCleanup(int sensorId, int userId,
@Nullable ClientMonitorCallback callback) { @Nullable ClientMonitorCallback callback) {
scheduleInternalCleanup(userId, callback); scheduleInternalCleanup(userId, mBiometricStateCallback);
} }
@Override @Override
@@ -1011,7 +1029,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
@Override @Override
public ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback, public ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
@NonNull String opPackageName) { @NonNull String opPackageName) {
return new BiometricTestSessionImpl(mContext, mSensorId, callback, this, return new BiometricTestSessionImpl(mContext, mSensorId, callback,
mHalResultController); this, mHalResultController);
} }
} }

View File

@@ -384,28 +384,18 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
mBiometricContext, mBiometricContext,
mSensors.get(sensorId).getSensorProperties(), mSensors.get(sensorId).getSensorProperties(),
mUdfpsOverlayController, mSidefpsController, maxTemplatesPerUser, enrollReason); mUdfpsOverlayController, mSidefpsController, maxTemplatesPerUser, enrollReason);
scheduleForSensor(sensorId, client, new ClientMonitorCallback() { scheduleForSensor(sensorId, client, new ClientMonitorCompositeCallback(
mBiometricStateCallback, new ClientMonitorCallback() {
@Override
public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
mBiometricStateCallback.onClientStarted(clientMonitor);
}
@Override
public void onBiometricAction(int action) {
mBiometricStateCallback.onBiometricAction(action);
}
@Override @Override
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor, public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
boolean success) { boolean success) {
mBiometricStateCallback.onClientFinished(clientMonitor, success); ClientMonitorCallback.super.onClientFinished(clientMonitor, success);
if (success) { if (success) {
scheduleLoadAuthenticatorIdsForUser(sensorId, userId); scheduleLoadAuthenticatorIdsForUser(sensorId, userId);
scheduleInvalidationRequest(sensorId, userId); scheduleInvalidationRequest(sensorId, userId);
} }
} }
}); }));
}); });
return id; return id;
} }

View File

@@ -39,6 +39,7 @@ import androidx.test.filters.SmallTest;
import com.android.server.biometrics.log.BiometricContext; import com.android.server.biometrics.log.BiometricContext;
import com.android.server.biometrics.sensors.BiometricScheduler; import com.android.server.biometrics.sensors.BiometricScheduler;
import com.android.server.biometrics.sensors.BiometricStateCallback;
import com.android.server.biometrics.sensors.HalClientMonitor; import com.android.server.biometrics.sensors.HalClientMonitor;
import com.android.server.biometrics.sensors.LockoutResetDispatcher; import com.android.server.biometrics.sensors.LockoutResetDispatcher;
@@ -63,6 +64,8 @@ public class FaceProviderTest {
private IFace mDaemon; private IFace mDaemon;
@Mock @Mock
private BiometricContext mBiometricContext; private BiometricContext mBiometricContext;
@Mock
private BiometricStateCallback mBiometricStateCallback;
private SensorProps[] mSensorProps; private SensorProps[] mSensorProps;
private LockoutResetDispatcher mLockoutResetDispatcher; private LockoutResetDispatcher mLockoutResetDispatcher;
@@ -91,8 +94,8 @@ public class FaceProviderTest {
mLockoutResetDispatcher = new LockoutResetDispatcher(mContext); mLockoutResetDispatcher = new LockoutResetDispatcher(mContext);
mFaceProvider = new TestableFaceProvider(mDaemon, mContext, mSensorProps, TAG, mFaceProvider = new TestableFaceProvider(mDaemon, mContext, mBiometricStateCallback,
mLockoutResetDispatcher, mBiometricContext); mSensorProps, TAG, mLockoutResetDispatcher, mBiometricContext);
} }
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
@@ -140,11 +143,13 @@ public class FaceProviderTest {
TestableFaceProvider(@NonNull IFace daemon, TestableFaceProvider(@NonNull IFace daemon,
@NonNull Context context, @NonNull Context context,
@NonNull BiometricStateCallback biometricStateCallback,
@NonNull SensorProps[] props, @NonNull SensorProps[] props,
@NonNull String halInstanceName, @NonNull String halInstanceName,
@NonNull LockoutResetDispatcher lockoutResetDispatcher, @NonNull LockoutResetDispatcher lockoutResetDispatcher,
@NonNull BiometricContext biometricContext) { @NonNull BiometricContext biometricContext) {
super(context, props, halInstanceName, lockoutResetDispatcher, biometricContext); super(context, biometricStateCallback, props, halInstanceName, lockoutResetDispatcher,
biometricContext);
mDaemon = daemon; mDaemon = daemon;
} }

View File

@@ -43,6 +43,7 @@ import androidx.test.filters.SmallTest;
import com.android.server.biometrics.log.BiometricContext; import com.android.server.biometrics.log.BiometricContext;
import com.android.server.biometrics.sensors.BiometricScheduler; import com.android.server.biometrics.sensors.BiometricScheduler;
import com.android.server.biometrics.sensors.BiometricStateCallback;
import com.android.server.biometrics.sensors.LockoutResetDispatcher; import com.android.server.biometrics.sensors.LockoutResetDispatcher;
import org.junit.Before; import org.junit.Before;
@@ -73,6 +74,8 @@ public class Face10Test {
private BiometricScheduler mScheduler; private BiometricScheduler mScheduler;
@Mock @Mock
private BiometricContext mBiometricContext; private BiometricContext mBiometricContext;
@Mock
private BiometricStateCallback mBiometricStateCallback;
private final Handler mHandler = new Handler(Looper.getMainLooper()); private final Handler mHandler = new Handler(Looper.getMainLooper());
private LockoutResetDispatcher mLockoutResetDispatcher; private LockoutResetDispatcher mLockoutResetDispatcher;
@@ -103,8 +106,8 @@ public class Face10Test {
resetLockoutRequiresChallenge); resetLockoutRequiresChallenge);
Face10.sSystemClock = Clock.fixed(Instant.ofEpochMilli(100), ZoneId.of("PST")); Face10.sSystemClock = Clock.fixed(Instant.ofEpochMilli(100), ZoneId.of("PST"));
mFace10 = new Face10(mContext, sensorProps, mLockoutResetDispatcher, mHandler, mScheduler, mFace10 = new Face10(mContext, mBiometricStateCallback, sensorProps,
mBiometricContext); mLockoutResetDispatcher, mHandler, mScheduler, mBiometricContext);
mBinder = new Binder(); mBinder = new Binder();
} }