Remove IPC calls from KeyguardUpdateMonitor
Test: atest KeyguardUpdateMonitorTest AuthControllerTest DozeSensorsTest LockIconViewControllerTest FaceServiceRegistryTest FingerprintServiceRegistryTest BiometricStateCallbackTest Bug: 221037350 Change-Id: I76f6092f7dc1af45b3df12f86b2bf3ec4b00ff8f
This commit is contained in:
@@ -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() {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 */);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user