Return enabledOnKeyguard for all alive users

Test: atest BiometricServiceTest
Fixes: 269374736
Change-Id: Iea9667da46ddedc60776f06fbd9d6095af0bc373
This commit is contained in:
Diya Bera
2023-05-09 10:15:22 -07:00
parent eb6d0c3576
commit 177184e4dd
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.
@EnforcePermission("USE_BIOMETRIC_INTERNAL")
void registerEnabledOnKeyguardCallback(IBiometricEnabledOnKeyguardCallback callback,
int callingUserId);
void registerEnabledOnKeyguardCallback(IBiometricEnabledOnKeyguardCallback callback);
// Notify BiometricService when <Biometric>Service is ready to start the prepared client.
// Client lifecycle is still managed in <Biometric>Service.

View File

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

View File

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

View File

@@ -367,7 +367,7 @@ public class AuthServiceTest {
waitForIdle();
verify(mBiometricService).registerEnabledOnKeyguardCallback(
eq(callback), eq(UserHandle.getCallingUserId()));
eq(callback));
}
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.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import android.app.IActivityManager;
@@ -55,12 +56,14 @@ import android.app.admin.DevicePolicyManager;
import android.app.trust.ITrustManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.BiometricPrompt;
import android.hardware.biometrics.IBiometricAuthenticator;
import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback;
import android.hardware.biometrics.IBiometricSensorReceiver;
import android.hardware.biometrics.IBiometricService;
import android.hardware.biometrics.IBiometricServiceReceiver;
@@ -75,6 +78,7 @@ import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.UserManager;
import android.platform.test.annotations.Presubmit;
import android.security.KeyStore;
import android.view.Display;
@@ -152,6 +156,8 @@ public class BiometricServiceTest {
private ISessionListener mSessionListener;
@Mock
private AuthSessionCoordinator mAuthSessionCoordinator;
@Mock
private UserManager mUserManager;
BiometricContextProvider mBiometricContextProvider;
@@ -177,6 +183,7 @@ public class BiometricServiceTest {
when(mInjector.getTrustManager()).thenReturn(mTrustManager);
when(mInjector.getDevicePolicyManager(any())).thenReturn(mDevicePolicyManager);
when(mInjector.getRequestGenerator()).thenReturn(() -> TEST_REQUEST_ID);
when(mInjector.getUserManager(any())).thenReturn(mUserManager);
when(mResources.getString(R.string.biometric_error_hw_unavailable))
.thenReturn(ERROR_HW_UNAVAILABLE);
@@ -1597,6 +1604,33 @@ public class BiometricServiceTest {
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
private int invokeCanAuthenticate(BiometricService service, int authenticators)