Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6de518b9 authored by Diya Bera's avatar Diya Bera
Browse files

Cache AuthenticationPolicyManager in BiometricService

Fixes: 422207523
Test: atest BiometricServiceTest
Flag: EXEMPT bugfix
Change-Id: I8d1e98e90b2f344fd304775e94a5c8d88ce24106
parent f363a0f7
Loading
Loading
Loading
Loading
+14 −2
Original line number Diff line number Diff line
@@ -139,6 +139,11 @@ public class BiometricService extends SystemService {
    @VisibleForTesting
    IGateKeeperService mGateKeeper;

    //Initialized only after authenticate is called.
    @VisibleForTesting
    @Nullable
    AuthenticationPolicyManager mAuthenticationPolicyManager;

    // Get and cache the available biometric authenticators and their associated info.
    final CopyOnWriteArrayList<BiometricSensor> mSensors = new CopyOnWriteArrayList<>();

@@ -1879,6 +1884,14 @@ public class BiometricService extends SystemService {
            mAuthSession = null;
        }

        if (mAuthenticationPolicyManager == null) {
            mAuthenticationPolicyManager = mInjector.getAuthenticationPolicyManager(getContext());
            //Log error if authentication policy manager is still null
            if (mAuthenticationPolicyManager == null) {
                Slog.e(TAG, "AuthenticationPolicyManager is null");
            }
        }

        final boolean debugEnabled = mInjector.isDebugEnabled(getContext(), userId);
        mAuthSession = new AuthSession(getContext(), mBiometricContext, mStatusBarService,
                createSysuiReceiver(requestId), mKeyStoreAuthorization, mRandom,
@@ -1886,8 +1899,7 @@ public class BiometricService extends SystemService {
                operationId, userId, createBiometricSensorReceiver(requestId), receiver,
                opPackageName, promptInfo, debugEnabled,
                mInjector.getFingerprintSensorProperties(getContext()), new WatchRangingHelper(
                requestId,
                mInjector.getAuthenticationPolicyManager(getContext()), mHandler,
                requestId, mAuthenticationPolicyManager, mHandler,
                this::onWatchRangingStateChange));

        try {
+32 −0
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.atMostOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@@ -1426,6 +1427,37 @@ public class BiometricServiceTest {
        verify(mAuthenticationPolicyService).cancelWatchRangingForRequestId(anyLong());
    }

    @Test
    public void testAuthenticationPolicyManagerInitialization_whenAuthenticationIsInvoked()
            throws Exception {
        when(mInjector.getAuthenticationPolicyManager(mContext)).thenReturn(
                mAuthenticationPolicyManager);

        setupAuthForOnly(TYPE_FACE, Authenticators.BIOMETRIC_STRONG);
        invokeAuthenticateAndStart(mBiometricService.mImpl, mReceiver1,
                false /* requireConfirmation */, null /* authenticators */);

        verify(mInjector).getAuthenticationPolicyManager(mContext);
        assertThat(mBiometricService.mAuthenticationPolicyManager).isEqualTo(
                mAuthenticationPolicyManager);

        //Finish current authentication
        mBiometricService.mAuthSession.mSensorReceiver.onError(
                SENSOR_ID_FACE,
                getCookieForCurrentSession(mBiometricService.mAuthSession),
                BiometricConstants.BIOMETRIC_ERROR_TIMEOUT,
                0 /* vendorCode */);
        mBiometricService.mAuthSession.mSysuiReceiver.onDialogDismissed(
                BiometricPrompt.DISMISSED_REASON_CONTENT_VIEW_MORE_OPTIONS,
                null /* credentialAttestation */);
        waitForIdle();

        invokeAuthenticateAndStart(mBiometricService.mImpl, mReceiver1,
                false /* requireConfirmation */, null /* authenticators */);

        verify(mInjector, atMostOnce()).getAuthenticationPolicyManager(mContext);
    }

    @Test
    public void testAcquire_whenAuthenticating_sentToSystemUI() throws Exception {
        when(mContext.getResources().getString(anyInt())).thenReturn("test string");