From 177184e4dd18c2b2ecbe3c3510486c586c5889da Mon Sep 17 00:00:00 2001 From: Diya Bera Date: Tue, 9 May 2023 10:15:22 -0700 Subject: [PATCH] Return enabledOnKeyguard for all alive users Test: atest BiometricServiceTest Fixes: 269374736 Change-Id: Iea9667da46ddedc60776f06fbd9d6095af0bc373 --- .../biometrics/IBiometricService.aidl | 3 +- .../server/biometrics/AuthService.java | 3 +- .../server/biometrics/BiometricService.java | 18 ++++++++-- .../server/biometrics/AuthServiceTest.java | 2 +- .../biometrics/BiometricServiceTest.java | 34 +++++++++++++++++++ 5 files changed, 52 insertions(+), 8 deletions(-) diff --git a/core/java/android/hardware/biometrics/IBiometricService.aidl b/core/java/android/hardware/biometrics/IBiometricService.aidl index 1a38c8897b76e..1286046e6a01b 100644 --- a/core/java/android/hardware/biometrics/IBiometricService.aidl +++ b/core/java/android/hardware/biometrics/IBiometricService.aidl @@ -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 Service is ready to start the prepared client. // Client lifecycle is still managed in Service. diff --git a/services/core/java/com/android/server/biometrics/AuthService.java b/services/core/java/com/android/server/biometrics/AuthService.java index acfc2a72d503f..f8cb9e98c714d 100644 --- a/services/core/java/com/android/server/biometrics/AuthService.java +++ b/services/core/java/com/android/server/biometrics/AuthService.java @@ -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); } diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java index f44d14bfa12c2..0ab74b8580c1a 100644 --- a/services/core/java/com/android/server/biometrics/BiometricService.java +++ b/services/core/java/com/android/server/biometrics/BiometricService.java @@ -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 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 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( diff --git a/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java b/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java index 4b86dd048cd1f..85d159c25be21 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java @@ -367,7 +367,7 @@ public class AuthServiceTest { waitForIdle(); verify(mBiometricService).registerEnabledOnKeyguardCallback( - eq(callback), eq(UserHandle.getCallingUserId())); + eq(callback)); } private static void setInternalAndTestBiometricPermissions( diff --git a/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java b/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java index b51a8c4e1b6cb..46fa3abe5122f 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java @@ -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 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)