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
This commit is contained in:
@@ -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<In
|
||||
}
|
||||
}
|
||||
|
||||
private fun authRequiredForMainlineUpdate(securityMode: SecurityMode): Pair<Int, Int> {
|
||||
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<Int, Int> {
|
||||
return when (securityMode) {
|
||||
SecurityMode.Pattern -> Pair(keyguard_enter_pattern, kg_prompt_pattern_auth_timeout)
|
||||
|
||||
@@ -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<Int> =
|
||||
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) {
|
||||
|
||||
@@ -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<KeyguardUpdateMonitorCallback>
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user