Merge "Return enabledOnKeyguard for all alive users" into udc-dev

This commit is contained in:
Diya Bera
2023-05-10 18:00:01 +00:00
committed by Android (Google) Code Review
5 changed files with 52 additions and 8 deletions

View File

@@ -66,8 +66,7 @@ interface IBiometricService {
// Register callback for when keyguard biometric eligibility changes. // Register callback for when keyguard biometric eligibility changes.
@EnforcePermission("USE_BIOMETRIC_INTERNAL") @EnforcePermission("USE_BIOMETRIC_INTERNAL")
void registerEnabledOnKeyguardCallback(IBiometricEnabledOnKeyguardCallback callback, void registerEnabledOnKeyguardCallback(IBiometricEnabledOnKeyguardCallback callback);
int callingUserId);
// Notify BiometricService when <Biometric>Service is ready to start the prepared client. // Notify BiometricService when <Biometric>Service is ready to start the prepared client.
// Client lifecycle is still managed in <Biometric>Service. // Client lifecycle is still managed in <Biometric>Service.

View File

@@ -342,10 +342,9 @@ public class AuthService extends SystemService {
public void registerEnabledOnKeyguardCallback( public void registerEnabledOnKeyguardCallback(
IBiometricEnabledOnKeyguardCallback callback) throws RemoteException { IBiometricEnabledOnKeyguardCallback callback) throws RemoteException {
checkInternalPermission(); checkInternalPermission();
final int callingUserId = UserHandle.getCallingUserId();
final long identity = Binder.clearCallingIdentity(); final long identity = Binder.clearCallingIdentity();
try { try {
mBiometricService.registerEnabledOnKeyguardCallback(callback, callingUserId); mBiometricService.registerEnabledOnKeyguardCallback(callback);
} finally { } finally {
Binder.restoreCallingIdentity(identity); Binder.restoreCallingIdentity(identity);
} }

View File

@@ -31,6 +31,7 @@ import android.app.trust.ITrustManager;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.BiometricConstants;
@@ -58,6 +59,7 @@ import android.os.Looper;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager; import android.os.ServiceManager;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings; import android.provider.Settings;
import android.security.KeyStore; import android.security.KeyStore;
import android.text.TextUtils; import android.text.TextUtils;
@@ -103,6 +105,7 @@ public class BiometricService extends SystemService {
private final Random mRandom = new Random(); private final Random mRandom = new Random();
@NonNull private final Supplier<Long> mRequestCounter; @NonNull private final Supplier<Long> mRequestCounter;
@NonNull private final BiometricContext mBiometricContext; @NonNull private final BiometricContext mBiometricContext;
private final UserManager mUserManager;
@VisibleForTesting @VisibleForTesting
IStatusBarService mStatusBarService; IStatusBarService mStatusBarService;
@@ -692,14 +695,18 @@ public class BiometricService extends SystemService {
@android.annotation.EnforcePermission(android.Manifest.permission.USE_BIOMETRIC_INTERNAL) @android.annotation.EnforcePermission(android.Manifest.permission.USE_BIOMETRIC_INTERNAL)
@Override // Binder call @Override // Binder call
public void registerEnabledOnKeyguardCallback( public void registerEnabledOnKeyguardCallback(
IBiometricEnabledOnKeyguardCallback callback, int callingUserId) { IBiometricEnabledOnKeyguardCallback callback) {
super.registerEnabledOnKeyguardCallback_enforcePermission(); super.registerEnabledOnKeyguardCallback_enforcePermission();
mEnabledOnKeyguardCallbacks.add(new EnabledOnKeyguardCallback(callback)); mEnabledOnKeyguardCallbacks.add(new EnabledOnKeyguardCallback(callback));
final List<UserInfo> aliveUsers = mUserManager.getAliveUsers();
try { try {
callback.onChanged(mSettingObserver.getEnabledOnKeyguard(callingUserId), for (UserInfo userInfo: aliveUsers) {
callingUserId); final int userId = userInfo.id;
callback.onChanged(mSettingObserver.getEnabledOnKeyguard(userId),
userId);
}
} catch (RemoteException e) { } catch (RemoteException e) {
Slog.w(TAG, "Remote exception", e); Slog.w(TAG, "Remote exception", e);
} }
@@ -1014,6 +1021,10 @@ public class BiometricService extends SystemService {
public BiometricContext getBiometricContext(Context context) { public BiometricContext getBiometricContext(Context context) {
return BiometricContext.getInstance(context); return BiometricContext.getInstance(context);
} }
public UserManager getUserManager(Context context) {
return context.getSystemService(UserManager.class);
}
} }
/** /**
@@ -1041,6 +1052,7 @@ public class BiometricService extends SystemService {
mEnabledOnKeyguardCallbacks); mEnabledOnKeyguardCallbacks);
mRequestCounter = mInjector.getRequestGenerator(); mRequestCounter = mInjector.getRequestGenerator();
mBiometricContext = injector.getBiometricContext(context); mBiometricContext = injector.getBiometricContext(context);
mUserManager = injector.getUserManager(context);
try { try {
injector.getActivityManagerService().registerUserSwitchObserver( injector.getActivityManagerService().registerUserSwitchObserver(

View File

@@ -367,7 +367,7 @@ public class AuthServiceTest {
waitForIdle(); waitForIdle();
verify(mBiometricService).registerEnabledOnKeyguardCallback( verify(mBiometricService).registerEnabledOnKeyguardCallback(
eq(callback), eq(UserHandle.getCallingUserId())); eq(callback));
} }
private static void setInternalAndTestBiometricPermissions( private static void setInternalAndTestBiometricPermissions(

View File

@@ -48,6 +48,7 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.app.IActivityManager; import android.app.IActivityManager;
@@ -55,12 +56,14 @@ import android.app.admin.DevicePolicyManager;
import android.app.trust.ITrustManager; import android.app.trust.ITrustManager;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.pm.UserInfo;
import android.content.res.Resources; import android.content.res.Resources;
import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricManager; import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.BiometricPrompt; import android.hardware.biometrics.BiometricPrompt;
import android.hardware.biometrics.IBiometricAuthenticator; import android.hardware.biometrics.IBiometricAuthenticator;
import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback;
import android.hardware.biometrics.IBiometricSensorReceiver; import android.hardware.biometrics.IBiometricSensorReceiver;
import android.hardware.biometrics.IBiometricService; import android.hardware.biometrics.IBiometricService;
import android.hardware.biometrics.IBiometricServiceReceiver; import android.hardware.biometrics.IBiometricServiceReceiver;
@@ -75,6 +78,7 @@ import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.os.Binder; import android.os.Binder;
import android.os.IBinder; import android.os.IBinder;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.UserManager;
import android.platform.test.annotations.Presubmit; import android.platform.test.annotations.Presubmit;
import android.security.KeyStore; import android.security.KeyStore;
import android.view.Display; import android.view.Display;
@@ -152,6 +156,8 @@ public class BiometricServiceTest {
private ISessionListener mSessionListener; private ISessionListener mSessionListener;
@Mock @Mock
private AuthSessionCoordinator mAuthSessionCoordinator; private AuthSessionCoordinator mAuthSessionCoordinator;
@Mock
private UserManager mUserManager;
BiometricContextProvider mBiometricContextProvider; BiometricContextProvider mBiometricContextProvider;
@@ -177,6 +183,7 @@ public class BiometricServiceTest {
when(mInjector.getTrustManager()).thenReturn(mTrustManager); when(mInjector.getTrustManager()).thenReturn(mTrustManager);
when(mInjector.getDevicePolicyManager(any())).thenReturn(mDevicePolicyManager); when(mInjector.getDevicePolicyManager(any())).thenReturn(mDevicePolicyManager);
when(mInjector.getRequestGenerator()).thenReturn(() -> TEST_REQUEST_ID); when(mInjector.getRequestGenerator()).thenReturn(() -> TEST_REQUEST_ID);
when(mInjector.getUserManager(any())).thenReturn(mUserManager);
when(mResources.getString(R.string.biometric_error_hw_unavailable)) when(mResources.getString(R.string.biometric_error_hw_unavailable))
.thenReturn(ERROR_HW_UNAVAILABLE); .thenReturn(ERROR_HW_UNAVAILABLE);
@@ -1597,6 +1604,33 @@ public class BiometricServiceTest {
verify(mReceiver2, never()).onError(anyInt(), anyInt(), anyInt()); verify(mReceiver2, never()).onError(anyInt(), anyInt(), anyInt());
} }
@Test
public void testRegisterEnabledOnKeyguardCallback() throws RemoteException {
final UserInfo userInfo1 = new UserInfo(0 /* userId */, "user1" /* name */, 0 /* flags */);
final UserInfo userInfo2 = new UserInfo(10 /* userId */, "user2" /* name */, 0 /* flags */);
final List<UserInfo> aliveUsers = List.of(userInfo1, userInfo2);
final IBiometricEnabledOnKeyguardCallback callback =
mock(IBiometricEnabledOnKeyguardCallback.class);
mBiometricService = new BiometricService(mContext, mInjector);
when(mUserManager.getAliveUsers()).thenReturn(aliveUsers);
when(mBiometricService.mSettingObserver.getEnabledOnKeyguard(userInfo1.id))
.thenReturn(true);
when(mBiometricService.mSettingObserver.getEnabledOnKeyguard(userInfo2.id))
.thenReturn(false);
when(callback.asBinder()).thenReturn(mock(IBinder.class));
mBiometricService.mImpl.registerEnabledOnKeyguardCallback(callback);
waitForIdle();
verify(callback).asBinder();
verify(callback).onChanged(true, userInfo1.id);
verify(callback).onChanged(false, userInfo2.id);
verifyNoMoreInteractions(callback);
}
// Helper methods // Helper methods
private int invokeCanAuthenticate(BiometricService service, int authenticators) private int invokeCanAuthenticate(BiometricService service, int authenticators)