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

Commit d674adf8 authored by Austin Delgado's avatar Austin Delgado
Browse files

Add reset lockout flow to Biometric Prompt

Test: atest AuthSessionTest
Bug: 420950003
Flag: android.hardware.biometrics.bp_fallback_options

Change-Id: I51af2539e7bfb4adbe59d65adee6e1f65235d25f
parent 4fcc661e
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