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

Commit e23d0966 authored by Chandru S's avatar Chandru S
Browse files

Change the default message to include fingerprint even for UDFPS.

Previously, we want to show the FP specific message only if FP auth was allowed on bouncer (SFPS)
UX requested that we can change this to be more generic, if FP auth is allowed at all we should show the FP specific message

Fixes: 293616192
Test: verified manually
Change-Id: Ibca81eedf9fe842903773aa213d73d4bd02f1d50
parent 9b08fcb5
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -2695,14 +2695,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
        return mAuthController.isUdfpsSupported();
    }

    /**
     * @return true if the FP sensor is non-UDFPS and the device can be unlocked using fingerprint
     * at this moment.
     */
    public boolean isFingerprintAllowedInBouncer() {
        return !isUdfpsSupported() && isUnlockingWithFingerprintAllowed();
    }

    /**
     * @return true if there's at least one sfps enrollment for the current user.
     */
+18 −13
Original line number Diff line number Diff line
@@ -99,7 +99,7 @@ constructor(
            getBouncerMessage(
                reason,
                securityModel.getSecurityMode(userId),
                updateMonitor.isFingerprintAllowedInBouncer
                updateMonitor.isUnlockingWithFingerprintAllowed
            )
        return pair?.let {
            BouncerMessageModel(
@@ -115,43 +115,48 @@ constructor(

    /**
     * Helper method that provides the relevant bouncer message that should be shown for different
     * scenarios indicated by [reason]. [securityMode] & [fpAllowedInBouncer] parameters are used to
     * scenarios indicated by [reason]. [securityMode] & [fpAuthIsAllowed] parameters are used to
     * provide a more specific message.
     */
    private fun getBouncerMessage(
        @BouncerPromptReason reason: Int,
        securityMode: SecurityMode,
        fpAllowedInBouncer: Boolean = false
        fpAuthIsAllowed: Boolean = false
    ): Pair<Int, Int>? {
        return when (reason) {
            // Primary auth locked out
            PROMPT_REASON_PRIMARY_AUTH_LOCKED_OUT -> primaryAuthLockedOut(securityMode)
            // Primary auth required reasons
            PROMPT_REASON_RESTART -> authRequiredAfterReboot(securityMode)
            PROMPT_REASON_TIMEOUT -> authRequiredAfterPrimaryAuthTimeout(securityMode)
            PROMPT_REASON_DEVICE_ADMIN -> authRequiredAfterAdminLockdown(securityMode)
            PROMPT_REASON_USER_REQUEST -> authRequiredAfterUserLockdown(securityMode)
            PROMPT_REASON_AFTER_LOCKOUT -> biometricLockout(securityMode)
            PROMPT_REASON_PREPARE_FOR_UPDATE -> authRequiredForUnattendedUpdate(securityMode)
            PROMPT_REASON_RESTART_FOR_MAINLINE_UPDATE -> authRequiredForMainlineUpdate(securityMode)
            PROMPT_REASON_FINGERPRINT_LOCKED_OUT -> fingerprintUnlockUnavailable(securityMode)
            PROMPT_REASON_AFTER_LOCKOUT -> biometricLockout(securityMode)
            // Non strong auth not available reasons
            PROMPT_REASON_FACE_LOCKED_OUT ->
                if (fpAllowedInBouncer) faceLockedOutButFingerprintAvailable(securityMode)
                if (fpAuthIsAllowed) faceLockedOutButFingerprintAvailable(securityMode)
                else faceLockedOut(securityMode)
            PROMPT_REASON_INCORRECT_PRIMARY_AUTH_INPUT ->
                if (fpAllowedInBouncer) incorrectSecurityInputWithFingerprint(securityMode)
                else incorrectSecurityInput(securityMode)
            PROMPT_REASON_NON_STRONG_BIOMETRIC_TIMEOUT ->
                if (fpAllowedInBouncer) nonStrongAuthTimeoutWithFingerprintAllowed(securityMode)
                if (fpAuthIsAllowed) nonStrongAuthTimeoutWithFingerprintAllowed(securityMode)
                else nonStrongAuthTimeout(securityMode)
            PROMPT_REASON_TRUSTAGENT_EXPIRED ->
                if (fpAllowedInBouncer) trustAgentDisabledWithFingerprintAllowed(securityMode)
                if (fpAuthIsAllowed) trustAgentDisabledWithFingerprintAllowed(securityMode)
                else trustAgentDisabled(securityMode)
            // Auth incorrect input reasons.
            PROMPT_REASON_INCORRECT_PRIMARY_AUTH_INPUT ->
                if (fpAuthIsAllowed) incorrectSecurityInputWithFingerprint(securityMode)
                else incorrectSecurityInput(securityMode)
            PROMPT_REASON_INCORRECT_FACE_INPUT ->
                if (fpAllowedInBouncer) incorrectFaceInputWithFingerprintAllowed(securityMode)
                if (fpAuthIsAllowed) incorrectFaceInputWithFingerprintAllowed(securityMode)
                else incorrectFaceInput(securityMode)
            PROMPT_REASON_INCORRECT_FINGERPRINT_INPUT -> incorrectFingerprintInput(securityMode)
            // Default message
            PROMPT_REASON_DEFAULT ->
                if (fpAllowedInBouncer) defaultMessageWithFingerprint(securityMode)
                if (fpAuthIsAllowed) defaultMessageWithFingerprint(securityMode)
                else defaultMessage(securityMode)
            PROMPT_REASON_PRIMARY_AUTH_LOCKED_OUT -> primaryAuthLockedOut(securityMode)
            else -> null
        }
    }
+20 −22
Original line number Diff line number Diff line
@@ -59,21 +59,21 @@ class BouncerMessageFactoryTest : SysuiTestCase() {
    }

    @Test
    fun bouncerMessages_choosesTheRightMessage_basedOnSecurityModeAndFpAllowedInBouncer() =
    fun bouncerMessages_choosesTheRightMessage_basedOnSecurityModeAndFpAuthIsAllowed() =
        testScope.runTest {
            primaryMessage(PROMPT_REASON_DEFAULT, mode = PIN, fpAllowedInBouncer = false)
            primaryMessage(PROMPT_REASON_DEFAULT, mode = PIN, fpAuthAllowed = false)
                .isEqualTo("Enter PIN")
            primaryMessage(PROMPT_REASON_DEFAULT, mode = PIN, fpAllowedInBouncer = true)
            primaryMessage(PROMPT_REASON_DEFAULT, mode = PIN, fpAuthAllowed = true)
                .isEqualTo("Unlock with PIN or fingerprint")

            primaryMessage(PROMPT_REASON_DEFAULT, mode = Password, fpAllowedInBouncer = false)
            primaryMessage(PROMPT_REASON_DEFAULT, mode = Password, fpAuthAllowed = false)
                .isEqualTo("Enter password")
            primaryMessage(PROMPT_REASON_DEFAULT, mode = Password, fpAllowedInBouncer = true)
            primaryMessage(PROMPT_REASON_DEFAULT, mode = Password, fpAuthAllowed = true)
                .isEqualTo("Unlock with password or fingerprint")

            primaryMessage(PROMPT_REASON_DEFAULT, mode = Pattern, fpAllowedInBouncer = false)
            primaryMessage(PROMPT_REASON_DEFAULT, mode = Pattern, fpAuthAllowed = false)
                .isEqualTo("Draw pattern")
            primaryMessage(PROMPT_REASON_DEFAULT, mode = Pattern, fpAllowedInBouncer = true)
            primaryMessage(PROMPT_REASON_DEFAULT, mode = Pattern, fpAuthAllowed = true)
                .isEqualTo("Unlock with pattern or fingerprint")
        }

@@ -94,44 +94,44 @@ class BouncerMessageFactoryTest : SysuiTestCase() {
        }

    @Test
    fun bouncerMessages_setsPrimaryAndSecondaryMessage_basedOnSecurityModeAndFpAllowedInBouncer() =
    fun bouncerMessages_setsPrimaryAndSecondaryMessage_basedOnSecurityModeAndFpAuthIsAllowed() =
        testScope.runTest {
            primaryMessage(
                    PROMPT_REASON_INCORRECT_PRIMARY_AUTH_INPUT,
                    mode = PIN,
                    fpAllowedInBouncer = true
                    fpAuthAllowed = true
                )
                .isEqualTo("Wrong PIN. Try again.")
            secondaryMessage(
                    PROMPT_REASON_INCORRECT_PRIMARY_AUTH_INPUT,
                    mode = PIN,
                    fpAllowedInBouncer = true
                    fpAuthAllowed = true
                )
                .isEqualTo("Or unlock with fingerprint")

            primaryMessage(
                    PROMPT_REASON_INCORRECT_PRIMARY_AUTH_INPUT,
                    mode = Password,
                    fpAllowedInBouncer = true
                    fpAuthAllowed = true
                )
                .isEqualTo("Wrong password. Try again.")
            secondaryMessage(
                    PROMPT_REASON_INCORRECT_PRIMARY_AUTH_INPUT,
                    mode = Password,
                    fpAllowedInBouncer = true
                    fpAuthAllowed = true
                )
                .isEqualTo("Or unlock with fingerprint")

            primaryMessage(
                    PROMPT_REASON_INCORRECT_PRIMARY_AUTH_INPUT,
                    mode = Pattern,
                    fpAllowedInBouncer = true
                    fpAuthAllowed = true
                )
                .isEqualTo("Wrong pattern. Try again.")
            secondaryMessage(
                    PROMPT_REASON_INCORRECT_PRIMARY_AUTH_INPUT,
                    mode = Pattern,
                    fpAllowedInBouncer = true
                    fpAuthAllowed = true
                )
                .isEqualTo("Or unlock with fingerprint")
        }
@@ -139,11 +139,11 @@ class BouncerMessageFactoryTest : SysuiTestCase() {
    private fun primaryMessage(
        reason: Int,
        mode: KeyguardSecurityModel.SecurityMode,
        fpAllowedInBouncer: Boolean
        fpAuthAllowed: Boolean
    ): StringSubject {
        return assertThat(
            context.resources.getString(
                bouncerMessageModel(mode, fpAllowedInBouncer, reason)!!.message!!.messageResId!!
                bouncerMessageModel(mode, fpAuthAllowed, reason)!!.message!!.messageResId!!
            )
        )!!
    }
@@ -151,25 +151,23 @@ class BouncerMessageFactoryTest : SysuiTestCase() {
    private fun secondaryMessage(
        reason: Int,
        mode: KeyguardSecurityModel.SecurityMode,
        fpAllowedInBouncer: Boolean
        fpAuthAllowed: Boolean
    ): StringSubject {
        return assertThat(
            context.resources.getString(
                bouncerMessageModel(mode, fpAllowedInBouncer, reason)!!
                    .secondaryMessage!!
                    .messageResId!!
                bouncerMessageModel(mode, fpAuthAllowed, reason)!!.secondaryMessage!!.messageResId!!
            )
        )!!
    }

    private fun bouncerMessageModel(
        mode: KeyguardSecurityModel.SecurityMode,
        fpAllowedInBouncer: Boolean,
        fpAuthAllowed: Boolean,
        reason: Int,
        secondaryMessageOverride: String? = null,
    ): BouncerMessageModel? {
        whenever(securityModel.getSecurityMode(0)).thenReturn(mode)
        whenever(updateMonitor.isFingerprintAllowedInBouncer).thenReturn(fpAllowedInBouncer)
        whenever(updateMonitor.isUnlockingWithFingerprintAllowed).thenReturn(fpAuthAllowed)

        return underTest.createFromPromptReason(
            reason,
+1 −1
Original line number Diff line number Diff line
@@ -101,7 +101,7 @@ class BouncerMessageRepositoryTest : SysuiTestCase() {
        fingerprintRepository = FakeDeviceEntryFingerprintAuthRepository()
        testScope = TestScope()

        whenever(updateMonitor.isFingerprintAllowedInBouncer).thenReturn(false)
        whenever(updateMonitor.isUnlockingWithFingerprintAllowed).thenReturn(false)
        whenever(securityModel.getSecurityMode(PRIMARY_USER_ID)).thenReturn(PIN)
        underTest =
            BouncerMessageRepositoryImpl(
+1 −1
Original line number Diff line number Diff line
@@ -76,7 +76,7 @@ class BouncerMessageInteractorTest : SysuiTestCase() {

        allowTestableLooperAsMainThread()
        whenever(securityModel.getSecurityMode(PRIMARY_USER_ID)).thenReturn(PIN)
        whenever(updateMonitor.isFingerprintAllowedInBouncer).thenReturn(false)
        whenever(updateMonitor.isUnlockingWithFingerprintAllowed).thenReturn(false)
    }

    suspend fun TestScope.init() {