From 42f70e51c35f57afdebd760dbf3eecda528b5585 Mon Sep 17 00:00:00 2001 From: Chandru S Date: Mon, 31 Jul 2023 16:17:27 -0700 Subject: [PATCH] Support custom messages for mainline update Fixes: 293476665 Test: atest BouncerMessageRepositoryTest Test: verified manually, 1. Enable feature flag 2. Reboot the device 3. Before unlocking, run the command: `adb shell setprop sys.boot.reason.last reboot,mainline_update` 4. Relevant message should be shown on bouncer. Change-Id: I3f7029f586013159eff0756798f81048de372098 --- .../data/factory/BouncerMessageFactory.kt | 15 ++++++++++++++ .../repository/BouncerMessageRepository.kt | 12 ++++++++++- .../data/repo/BouncerMessageRepositoryTest.kt | 20 ++++++++++++++++++- 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/data/factory/BouncerMessageFactory.kt b/packages/SystemUI/src/com/android/systemui/bouncer/data/factory/BouncerMessageFactory.kt index 3b0b8125c02b9..4f6023b54fa95 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/data/factory/BouncerMessageFactory.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/data/factory/BouncerMessageFactory.kt @@ -32,6 +32,7 @@ import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_NON_STRONG_BIOMET import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_PREPARE_FOR_UPDATE import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_PRIMARY_AUTH_LOCKED_OUT import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_RESTART +import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_RESTART_FOR_MAINLINE_UPDATE import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_TIMEOUT import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_TRUSTAGENT_EXPIRED import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_USER_REQUEST @@ -53,6 +54,9 @@ import com.android.systemui.R.string.kg_primary_auth_locked_out_password import com.android.systemui.R.string.kg_primary_auth_locked_out_pattern import com.android.systemui.R.string.kg_primary_auth_locked_out_pin import com.android.systemui.R.string.kg_prompt_after_dpm_lock +import com.android.systemui.R.string.kg_prompt_after_update_password +import com.android.systemui.R.string.kg_prompt_after_update_pattern +import com.android.systemui.R.string.kg_prompt_after_update_pin import com.android.systemui.R.string.kg_prompt_after_user_lockdown_password import com.android.systemui.R.string.kg_prompt_after_user_lockdown_pattern import com.android.systemui.R.string.kg_prompt_after_user_lockdown_pin @@ -130,6 +134,7 @@ constructor( 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_FACE_LOCKED_OUT -> if (fpAllowedInBouncer) faceLockedOutButFingerprintAvailable(securityMode) @@ -174,6 +179,7 @@ constructor( PROMPT_REASON_NONE, PROMPT_REASON_RESTART, PROMPT_REASON_PRIMARY_AUTH_LOCKED_OUT, + PROMPT_REASON_RESTART_FOR_MAINLINE_UPDATE, ) annotation class BouncerPromptReason @@ -286,6 +292,15 @@ private fun authRequiredForUnattendedUpdate(securityMode: SecurityMode): Pair { + return when (securityMode) { + SecurityMode.Pattern -> Pair(keyguard_enter_pattern, kg_prompt_after_update_pattern) + SecurityMode.Password -> Pair(keyguard_enter_password, kg_prompt_after_update_password) + SecurityMode.PIN -> Pair(keyguard_enter_pin, kg_prompt_after_update_pin) + else -> Pair(0, 0) + } +} + private fun authRequiredAfterPrimaryAuthTimeout(securityMode: SecurityMode): Pair { return when (securityMode) { SecurityMode.Pattern -> Pair(keyguard_enter_pattern, kg_prompt_pattern_auth_timeout) diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/BouncerMessageRepository.kt b/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/BouncerMessageRepository.kt index 7e420cfcea757..6fb0d4cc5e135 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/BouncerMessageRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/BouncerMessageRepository.kt @@ -28,6 +28,7 @@ import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_NONE import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_NON_STRONG_BIOMETRIC_TIMEOUT import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_PREPARE_FOR_UPDATE import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_RESTART +import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_RESTART_FOR_MAINLINE_UPDATE import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_TIMEOUT import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_TRUSTAGENT_EXPIRED import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_USER_REQUEST @@ -38,6 +39,7 @@ import com.android.systemui.bouncer.shared.model.BouncerMessageModel import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.flags.SystemPropertiesHelper import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository import com.android.systemui.keyguard.data.repository.DeviceEntryFingerprintAuthRepository import com.android.systemui.keyguard.data.repository.TrustRepository @@ -105,6 +107,9 @@ interface BouncerMessageRepository { fun clearMessage() } +private const val SYS_BOOT_REASON_PROP = "sys.boot.reason.last" +private const val REBOOT_MAINLINE_UPDATE = "reboot,mainline_update" + @SysUISingleton class BouncerMessageRepositoryImpl @Inject @@ -114,6 +119,7 @@ constructor( updateMonitor: KeyguardUpdateMonitor, private val bouncerMessageFactory: BouncerMessageFactory, private val userRepository: UserRepository, + private val systemPropertiesHelper: SystemPropertiesHelper, fingerprintAuthRepository: DeviceEntryFingerprintAuthRepository, ) : BouncerMessageRepository { @@ -132,6 +138,9 @@ constructor( private val isAnyBiometricsEnabledAndEnrolled = or(isFaceEnrolledAndEnabled, isFingerprintEnrolledAndEnabled) + private val wasRebootedForMainlineUpdate + get() = systemPropertiesHelper.get(SYS_BOOT_REASON_PROP) == REBOOT_MAINLINE_UPDATE + private val authFlagsBasedPromptReason: Flow = combine( biometricSettingsRepository.authenticationFlags, @@ -144,7 +153,8 @@ constructor( return@map if ( trustOrBiometricsAvailable && flags.isPrimaryAuthRequiredAfterReboot ) { - PROMPT_REASON_RESTART + if (wasRebootedForMainlineUpdate) PROMPT_REASON_RESTART_FOR_MAINLINE_UPDATE + else PROMPT_REASON_RESTART } else if (trustOrBiometricsAvailable && flags.isPrimaryAuthRequiredAfterTimeout) { PROMPT_REASON_TIMEOUT } else if (flags.isPrimaryAuthRequiredAfterDpmLockdown) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/data/repo/BouncerMessageRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bouncer/data/repo/BouncerMessageRepositoryTest.kt index de712da9d99bf..ade09b916df40 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/data/repo/BouncerMessageRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/bouncer/data/repo/BouncerMessageRepositoryTest.kt @@ -51,6 +51,7 @@ import com.android.systemui.bouncer.data.repository.BouncerMessageRepositoryImpl import com.android.systemui.bouncer.shared.model.BouncerMessageModel import com.android.systemui.bouncer.shared.model.Message import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.flags.SystemPropertiesHelper import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFingerprintAuthRepository import com.android.systemui.keyguard.data.repository.FakeTrustRepository @@ -79,6 +80,7 @@ class BouncerMessageRepositoryTest : SysuiTestCase() { @Mock private lateinit var updateMonitor: KeyguardUpdateMonitor @Mock private lateinit var securityModel: KeyguardSecurityModel + @Mock private lateinit var systemPropertiesHelper: SystemPropertiesHelper @Captor private lateinit var updateMonitorCallback: ArgumentCaptor @@ -108,7 +110,8 @@ class BouncerMessageRepositoryTest : SysuiTestCase() { updateMonitor = updateMonitor, bouncerMessageFactory = BouncerMessageFactory(updateMonitor, securityModel), userRepository = userRepository, - fingerprintAuthRepository = fingerprintRepository + fingerprintAuthRepository = fingerprintRepository, + systemPropertiesHelper = systemPropertiesHelper ) } @@ -213,6 +216,21 @@ class BouncerMessageRepositoryTest : SysuiTestCase() { assertThat(lockedOutMessage()).isNull() } + @Test + fun onRestartForMainlineUpdate_shouldProvideRelevantMessage() = + testScope.runTest { + whenever(systemPropertiesHelper.get("sys.boot.reason.last")) + .thenReturn("reboot,mainline_update") + userRepository.setSelectedUserInfo(PRIMARY_USER) + biometricSettingsRepository.setFaceEnrolled(true) + biometricSettingsRepository.setIsFaceAuthEnabled(true) + + verifyMessagesForAuthFlag( + STRONG_AUTH_REQUIRED_AFTER_BOOT to + Pair(keyguard_enter_pin, R.string.kg_prompt_after_update_pin), + ) + } + @Test fun onAuthFlagsChanged_withTrustNotManagedAndNoBiometrics_isANoop() = testScope.runTest {