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

Commit de747a86 authored by Beverly's avatar Beverly Committed by Beverly Tai
Browse files

Update the initial bouncer message whenever the security mode changes

Flag: ACONFIG com.android.systemui.revamped_bouncer_messages NEXTFOOD
Test: After first boot, setup a PIN. From the lockscreen,
bring up the primary bouncer and observe the "Enter PIN" message.
Fixes: 336337248
Test: atest BouncerMessageInteractorTest

Change-Id: I0145b38ede1b3eed105952c52b641cea99d65e32
parent 69b03fa3
Loading
Loading
Loading
Loading
+30 −2
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import androidx.test.filters.SmallTest
import com.android.internal.widget.LockPatternUtils
import com.android.keyguard.KeyguardSecurityModel
import com.android.keyguard.KeyguardSecurityModel.SecurityMode.PIN
import com.android.keyguard.KeyguardSecurityModel.SecurityMode.Pattern
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
@@ -88,7 +89,9 @@ class BouncerMessageInteractorTest : SysuiTestCase() {
        overrideResource(kg_trust_agent_disabled, "Trust agent is unavailable")
    }

    suspend fun TestScope.init() {
    suspend fun TestScope.init(
        fingerprintAuthCurrentlyAllowed: Boolean = true,
    ) {
        kosmos.fakeUserRepository.setSelectedUserInfo(PRIMARY_USER)
        mSetFlagsRule.enableFlags(Flags.FLAG_REVAMPED_BOUNCER_MESSAGES)
        underTest =
@@ -107,13 +110,38 @@ class BouncerMessageInteractorTest : SysuiTestCase() {
                faceAuthRepository = kosmos.fakeDeviceEntryFaceAuthRepository,
                securityModel = securityModel
            )
        biometricSettingsRepository.setIsFingerprintAuthCurrentlyAllowed(true)
        biometricSettingsRepository.setIsFingerprintAuthCurrentlyAllowed(
            fingerprintAuthCurrentlyAllowed
        )
        kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(false)
        kosmos.fakeFingerprintPropertyRepository.supportsSideFps()
        kosmos.fakeKeyguardBouncerRepository.setPrimaryShow(true)
        runCurrent()
    }

    @Test
    fun initialMessage_pin() =
        testScope.runTest {
            init(fingerprintAuthCurrentlyAllowed = false)
            val bouncerMessage by collectLastValue(underTest.bouncerMessage)
            kosmos.fakeKeyguardBouncerRepository.setLastShownSecurityMode(
                KeyguardSecurityModel.SecurityMode.PIN
            )
            assertThat(bouncerMessage).isNotNull()
            assertThat(primaryResMessage(bouncerMessage)).isEqualTo("Enter PIN")
        }

    @Test
    fun onPrimaryAuthMethodChangeFromPinToPattern_initialMessageUpdates() =
        testScope.runTest {
            init(fingerprintAuthCurrentlyAllowed = false)
            val bouncerMessage by collectLastValue(underTest.bouncerMessage)
            whenever(securityModel.getSecurityMode(PRIMARY_USER_ID)).thenReturn(Pattern)
            kosmos.fakeKeyguardBouncerRepository.setLastShownSecurityMode(Pattern)
            assertThat(bouncerMessage).isNotNull()
            assertThat(primaryResMessage(bouncerMessage)).isEqualTo("Draw pattern")
        }

    @Test
    fun onIncorrectSecurityInput_providesTheAppropriateValueForBouncerMessage() =
        testScope.runTest {
+1 −0
Original line number Diff line number Diff line
@@ -577,6 +577,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
        SecurityMode securityMode = whitelistIpcs(() -> mSecurityModel.getSecurityMode(
                mSelectedUserInteractor.getSelectedUserId()));
        if (DEBUG) Log.v(TAG, "showPrimarySecurityScreen(turningOff=" + turningOff + ")");
        mPrimaryBouncerInteractor.get().setLastShownPrimarySecurityScreen(securityMode);
        showSecurityScreen(securityMode);
    }

+19 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.bouncer.data.repository

import android.os.Build
import android.util.Log
import com.android.keyguard.KeyguardSecurityModel
import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.EXPANSION_HIDDEN
import com.android.systemui.bouncer.shared.model.BouncerDismissActionModel
import com.android.systemui.bouncer.shared.model.BouncerShowMessageModel
@@ -89,6 +90,9 @@ interface KeyguardBouncerRepository {
    val alternateBouncerVisible: StateFlow<Boolean>
    val alternateBouncerUIAvailable: StateFlow<Boolean>

    /** Last shown security mode of the primary bouncer (ie: pin/pattern/password/SIM) */
    val lastShownSecurityMode: StateFlow<KeyguardSecurityModel.SecurityMode>

    /** Action that should be run right after the bouncer is dismissed. */
    var bouncerDismissActionModel: BouncerDismissActionModel?

@@ -123,6 +127,8 @@ interface KeyguardBouncerRepository {
    fun setAlternateVisible(isVisible: Boolean)

    fun setAlternateBouncerUIAvailable(isAvailable: Boolean)

    fun setLastShownSecurityMode(securityMode: KeyguardSecurityModel.SecurityMode)
}

@SysUISingleton
@@ -181,6 +187,11 @@ constructor(

    private val _showMessage = MutableStateFlow<BouncerShowMessageModel?>(null)
    override val showMessage = _showMessage.asStateFlow()
    private val _lastShownSecurityMode =
        MutableStateFlow(KeyguardSecurityModel.SecurityMode.Invalid)
    override val lastShownSecurityMode: StateFlow<KeyguardSecurityModel.SecurityMode> =
        _lastShownSecurityMode.asStateFlow()

    private val _resourceUpdateRequests = MutableStateFlow(false)
    override val resourceUpdateRequests = _resourceUpdateRequests.asStateFlow()

@@ -262,6 +273,10 @@ constructor(
        _isBackButtonEnabled.value = isBackButtonEnabled
    }

    override fun setLastShownSecurityMode(securityMode: KeyguardSecurityModel.SecurityMode) {
        _lastShownSecurityMode.value = securityMode
    }

    /** Sets up logs for state flows. */
    private fun setUpLogging() {
        if (!Build.IS_DEBUGGABLE) {
@@ -308,6 +323,10 @@ constructor(
        alternateBouncerUIAvailable
            .logDiffsForTable(buffer, "", "IsAlternateBouncerUIAvailable", false)
            .launchIn(applicationScope)
        lastShownSecurityMode
            .map { it.name }
            .logDiffsForTable(buffer, "", "lastShownSecurityMode", null)
            .launchIn(applicationScope)
    }

    companion object {
+4 −3
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ import com.android.systemui.flags.SystemPropertiesHelper
import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository
import com.android.systemui.keyguard.data.repository.TrustRepository
import com.android.systemui.user.data.repository.UserRepository
import com.android.systemui.util.kotlin.Sextuple
import com.android.systemui.util.kotlin.Septuple
import com.android.systemui.util.kotlin.combine
import javax.inject.Inject
import kotlin.math.roundToInt
@@ -145,15 +145,16 @@ constructor(

    private val initialBouncerMessage: Flow<BouncerMessageModel> =
        combine(
                primaryBouncerInteractor.lastShownSecurityMode, // required to update defaultMessage
                biometricSettingsRepository.authenticationFlags,
                trustRepository.isCurrentUserTrustManaged,
                isAnyBiometricsEnabledAndEnrolled,
                deviceEntryFingerprintAuthInteractor.isLockedOut,
                faceAuthRepository.isLockedOut,
                isFingerprintAuthCurrentlyAllowedOnBouncer,
                ::Sextuple
                ::Septuple
            )
            .map { (flags, _, biometricsEnrolledAndEnabled, fpLockedOut, faceLockedOut, _) ->
            .map { (_, flags, _, biometricsEnrolledAndEnabled, fpLockedOut, faceLockedOut, _) ->
                val isTrustUsuallyManaged = trustRepository.isCurrentUserTrustUsuallyManaged.value
                val trustOrBiometricsAvailable =
                    (isTrustUsuallyManaged || biometricsEnrolledAndEnabled)
+6 −0
Original line number Diff line number Diff line
@@ -103,6 +103,8 @@ constructor(
    val resourceUpdateRequests: Flow<Boolean> = repository.resourceUpdateRequests.filter { it }
    val keyguardPosition: Flow<Float> = repository.keyguardPosition.filterNotNull()
    val panelExpansionAmount: Flow<Float> = repository.panelExpansionAmount
    val lastShownSecurityMode: Flow<KeyguardSecurityModel.SecurityMode> =
        repository.lastShownSecurityMode

    /** 0f = bouncer fully hidden. 1f = bouncer fully visible. */
    val bouncerExpansion: Flow<Float> =
@@ -384,6 +386,10 @@ constructor(
        return isShowing.value
    }

    fun setLastShownPrimarySecurityScreen(securityMode: KeyguardSecurityModel.SecurityMode) {
        repository.setLastShownSecurityMode(securityMode)
    }

    /** Whether we want to wait to show the bouncer in case passive auth succeeds. */
    private fun usePrimaryBouncerPassiveAuthDelay(): Boolean {
        val canRunActiveUnlock =
Loading