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

Commit 752d4d22 authored by Austin Delgado's avatar Austin Delgado Committed by Android (Google) Code Review
Browse files

Merge "Add reset lockout flow to Biometric Prompt" into main

parents 31327ce2 d674adf8
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -32,4 +32,8 @@ oneway interface IBiometricSysuiReceiver {
    void onDialogAnimatedIn(boolean startFingerprintNow);
    // Notifies that the fingerprint should start now (after onDialogAnimatedIn(false)).
    void onStartFingerprintNow();
    // Notifies that authentication should be paused
    void onPauseAuthentication();
    // Notifies that authentication should resume
    void onResumeAuthentication();
}
+9 −0
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricPrompt;
import android.hardware.biometrics.BiometricStateListener;
import android.hardware.biometrics.ComponentInfoInternal;
import android.hardware.biometrics.Flags;
import android.hardware.biometrics.IBiometricContextListener;
import android.hardware.biometrics.IBiometricSysuiReceiver;
import android.hardware.biometrics.PromptInfo;
@@ -73,6 +74,9 @@ import android.os.Handler;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
import android.platform.test.annotations.RequiresFlagsDisabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.testing.TestableContext;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -130,6 +134,9 @@ public class AuthControllerTest extends SysuiTestCase {

    @Rule
    public final MockitoRule mMockitoRule = MockitoJUnit.rule();
    @Rule
    public final CheckFlagsRule mCheckFlagsRule =
            DeviceFlagsValueProvider.createCheckFlagsRule();

    @Mock
    private PackageManager mPackageManager;
@@ -643,6 +650,7 @@ public class AuthControllerTest extends SysuiTestCase {
    }

    @Test
    @RequiresFlagsDisabled(Flags.FLAG_BP_FALLBACK_OPTIONS)
    public void testErrorLockout_whenCredentialNotAllowed_sendsOnError() {
        showDialog(new int[] {1} /* sensorIds */, false /* credentialAllowed */);
        final int modality = BiometricAuthenticator.TYPE_FACE;
@@ -658,6 +666,7 @@ public class AuthControllerTest extends SysuiTestCase {
    }

    @Test
    @RequiresFlagsDisabled(Flags.FLAG_BP_FALLBACK_OPTIONS)
    public void testErrorLockoutPermanent_whenCredentialNotAllowed_sendsOnError() {
        showDialog(new int[] {1} /* sensorIds */, false /* credentialAllowed */);
        final int modality = BiometricAuthenticator.TYPE_FACE;
+23 −4
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.biometrics.AuthController
import com.android.systemui.biometrics.shared.model.BiometricModalities
import com.android.systemui.biometrics.shared.model.PromptKind
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.util.concurrency.FakeExecutor
@@ -105,10 +106,11 @@ class PromptRepositoryImplTest : SysuiTestCase() {
                repository.setPrompt(
                    PromptInfo().apply { isConfirmationRequested = case },
                    USER_ID,
                    BiometricModalities(),
                    REQUEST_ID,
                    CHALLENGE,
                    PromptKind.Biometric(),
                    OP_PACKAGE_NAME
                    OP_PACKAGE_NAME,
                )

                assertThat(isConfirmationRequired).isEqualTo(case)
@@ -125,10 +127,11 @@ class PromptRepositoryImplTest : SysuiTestCase() {
                repository.setPrompt(
                    PromptInfo().apply { isConfirmationRequested = case },
                    USER_ID,
                    BiometricModalities(),
                    REQUEST_ID,
                    CHALLENGE,
                    PromptKind.Biometric(),
                    OP_PACKAGE_NAME
                    OP_PACKAGE_NAME,
                )

                assertThat(isConfirmationRequired).isTrue()
@@ -141,7 +144,15 @@ class PromptRepositoryImplTest : SysuiTestCase() {
            val kind = PromptKind.Pin
            val promptInfo = PromptInfo()

            repository.setPrompt(promptInfo, USER_ID, REQUEST_ID, CHALLENGE, kind, OP_PACKAGE_NAME)
            repository.setPrompt(
                promptInfo,
                USER_ID,
                BiometricModalities(),
                REQUEST_ID,
                CHALLENGE,
                kind,
                OP_PACKAGE_NAME,
            )

            assertThat(repository.promptKind.value).isEqualTo(kind)
            assertThat(repository.userId.value).isEqualTo(USER_ID)
@@ -163,7 +174,15 @@ class PromptRepositoryImplTest : SysuiTestCase() {
            val kind = PromptKind.Pin
            val promptInfo = PromptInfo()

            repository.setPrompt(promptInfo, USER_ID, REQUEST_ID, CHALLENGE, kind, OP_PACKAGE_NAME)
            repository.setPrompt(
                promptInfo,
                USER_ID,
                BiometricModalities(),
                REQUEST_ID,
                CHALLENGE,
                kind,
                OP_PACKAGE_NAME,
            )

            assertThat(repository.promptKind.value).isEqualTo(kind)
            assertThat(repository.userId.value).isEqualTo(USER_ID)
+7 −5
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ import com.android.systemui.biometrics.data.repository.FakePromptRepository
import com.android.systemui.biometrics.domain.model.BiometricOperationInfo
import com.android.systemui.biometrics.domain.model.BiometricPromptRequest
import com.android.systemui.biometrics.promptInfo
import com.android.systemui.biometrics.shared.model.BiometricModalities
import com.android.systemui.biometrics.shared.model.BiometricUserInfo
import com.android.systemui.biometrics.shared.model.PromptKind
import com.android.systemui.coroutines.collectLastValue
@@ -113,7 +114,7 @@ class PromptCredentialInteractorTest : SysuiTestCase() {
                userId = USER_ID,
                requestId = REQUEST_ID,
                challenge = OPERATION_ID,
                opPackageName = OP_PACKAGE_NAME
                opPackageName = OP_PACKAGE_NAME,
            )
            assertThat(showTitleOnly).isFalse()
        }
@@ -139,7 +140,7 @@ class PromptCredentialInteractorTest : SysuiTestCase() {
                userId = USER_ID,
                requestId = REQUEST_ID,
                challenge = OPERATION_ID,
                opPackageName = OP_PACKAGE_NAME
                opPackageName = OP_PACKAGE_NAME,
            )
            assertThat(showTitleOnly).isTrue()
        }
@@ -168,7 +169,7 @@ class PromptCredentialInteractorTest : SysuiTestCase() {
                userId = USER_ID,
                requestId = REQUEST_ID,
                challenge = OPERATION_ID,
                opPackageName = OP_PACKAGE_NAME
                opPackageName = OP_PACKAGE_NAME,
            )
            assertThat(showTitleOnly).isFalse()
        }
@@ -202,7 +203,7 @@ class PromptCredentialInteractorTest : SysuiTestCase() {
                userId = USER_ID,
                requestId = REQUEST_ID,
                challenge = OPERATION_ID,
                opPackageName = OP_PACKAGE_NAME
                opPackageName = OP_PACKAGE_NAME,
            )

            assertThat(prompt?.title).isEqualTo(title)
@@ -356,6 +357,7 @@ class PromptCredentialInteractorTest : SysuiTestCase() {
        biometricPromptRepository.setPrompt(
            promptInfo,
            userId,
            BiometricModalities(),
            requestId,
            challenge,
            kind,
@@ -373,7 +375,7 @@ private fun pinRequest(): BiometricPromptRequest.Credential.Pin =
    BiometricPromptRequest.Credential.Pin(
        promptInfo(),
        BiometricUserInfo(USER_ID),
        BiometricOperationInfo(OPERATION_ID)
        BiometricOperationInfo(OPERATION_ID),
    )

private fun verified(hat: ByteArray) = CredentialStatus.Success.Verified(hat)
+9 −1
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ import com.android.systemui.biometrics.domain.interactor.FakeCredentialInteracto
import com.android.systemui.biometrics.domain.interactor.PromptCredentialInteractor
import com.android.systemui.biometrics.domain.interactor.promptSelectorInteractor
import com.android.systemui.biometrics.promptInfo
import com.android.systemui.biometrics.shared.model.BiometricModalities
import com.android.systemui.biometrics.shared.model.PromptKind
import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.testKosmos
@@ -181,7 +182,14 @@ class CredentialViewModelTest : SysuiTestCase() {
    ) =
        runTest(dispatcher) {
            init()
            promptRepository.setPrompt(promptInfo(), USER_ID, REQUEST_ID, OPERATION_ID, kind)
            promptRepository.setPrompt(
                promptInfo(),
                USER_ID,
                BiometricModalities(),
                REQUEST_ID,
                OPERATION_ID,
                kind,
            )
            block()
        }
}
Loading