diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/model/PolicyInformation.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/model/PolicyInformation.kt index 44c23b347c..c688dd398f 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/model/PolicyInformation.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/model/PolicyInformation.kt @@ -122,6 +122,18 @@ sealed class PolicyInformation { val minutes: Int?, @SerialName("action") - val action: String?, - ) : PolicyInformation() + val action: Action?, + ) : PolicyInformation() { + /** + * The action to take when the vault timeout is reached. + */ + @Serializable + enum class Action { + @SerialName("lock") + LOCK, + + @SerialName("logOut") + LOGOUT, + } + } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryImpl.kt index daf4941478..f3799a3b56 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryImpl.kt @@ -647,10 +647,9 @@ class SettingsRepositoryImpl( } } vaultUnlockPolicy.action?.let { - vaultTimeoutAction = if (it == "lock") { - VaultTimeoutAction.LOCK - } else { - VaultTimeoutAction.LOGOUT + vaultTimeoutAction = when (it) { + PolicyInformation.VaultTimeout.Action.LOCK -> VaultTimeoutAction.LOCK + PolicyInformation.VaultTimeout.Action.LOGOUT -> VaultTimeoutAction.LOGOUT } } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityScreen.kt index b56d03423a..d637c1e549 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityScreen.kt @@ -61,6 +61,7 @@ import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText +import com.x8bit.bitwarden.data.auth.repository.model.PolicyInformation import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeout import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeoutAction import com.x8bit.bitwarden.ui.platform.components.toggle.BitwardenUnlockWithBiometricsSwitch @@ -473,25 +474,25 @@ private fun AccountSecurityDialogs( @Composable private fun SessionTimeoutPolicyRow( vaultTimeoutPolicyMinutes: Int?, - vaultTimeoutPolicyAction: String?, + vaultTimeoutPolicyAction: PolicyInformation.VaultTimeout.Action?, modifier: Modifier = Modifier, ) { // Show the policy warning if applicable. - if (vaultTimeoutPolicyMinutes != null || !vaultTimeoutPolicyAction.isNullOrBlank()) { + if (vaultTimeoutPolicyMinutes != null || vaultTimeoutPolicyAction != null) { // Calculate the hours and minutes to show in the policy label. val hours = vaultTimeoutPolicyMinutes?.floorDiv(MINUTES_PER_HOUR) val minutes = vaultTimeoutPolicyMinutes?.mod(MINUTES_PER_HOUR) // Get the localized version of the action. - val action = if (vaultTimeoutPolicyAction == "lock") { - BitwardenString.lock.asText() - } else { - BitwardenString.log_out.asText() + val action = when (vaultTimeoutPolicyAction) { + PolicyInformation.VaultTimeout.Action.LOCK -> BitwardenString.lock.asText() + PolicyInformation.VaultTimeout.Action.LOGOUT -> BitwardenString.log_out.asText() + null -> BitwardenString.log_out.asText() } val policyText = if (hours == null || minutes == null) { BitwardenString.vault_timeout_action_policy_in_effect.asText(action) - } else if (vaultTimeoutPolicyAction.isNullOrBlank()) { + } else if (vaultTimeoutPolicyAction == null) { BitwardenString.vault_timeout_policy_in_effect.asText(hours, minutes) } else { BitwardenString.vault_timeout_policy_with_action_in_effect.asText( @@ -629,7 +630,7 @@ private fun SessionCustomTimeoutRow( @Composable private fun SessionTimeoutActionRow( isEnabled: Boolean, - vaultTimeoutPolicyAction: String?, + vaultTimeoutPolicyAction: PolicyInformation.VaultTimeout.Action?, selectedVaultTimeoutAction: VaultTimeoutAction, onVaultTimeoutActionSelect: (VaultTimeoutAction) -> Unit, modifier: Modifier = Modifier, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt index 6a84751ad2..50599a4ff1 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt @@ -519,7 +519,7 @@ data class AccountSecurityState( val vaultTimeout: VaultTimeout, val vaultTimeoutAction: VaultTimeoutAction, val vaultTimeoutPolicyMinutes: Int?, - val vaultTimeoutPolicyAction: String?, + val vaultTimeoutPolicyAction: PolicyInformation.VaultTimeout.Action?, val shouldShowUnlockActionCard: Boolean, val removeUnlockWithPinPolicyEnabled: Boolean, ) : Parcelable { diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/repository/util/SyncResponseJsonExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/repository/util/SyncResponseJsonExtensionsTest.kt index 7a9a12da44..408b352cad 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/repository/util/SyncResponseJsonExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/repository/util/SyncResponseJsonExtensionsTest.kt @@ -118,7 +118,7 @@ class SyncResponseJsonExtensionsTest { fun `policyInformation converts the VaultTimeout Json data to policy information`() { val policyInformation = PolicyInformation.VaultTimeout( minutes = 10, - action = "lock", + action = PolicyInformation.VaultTimeout.Action.LOCK, ) val policy = createMockPolicy( type = PolicyTypeJson.MAXIMUM_VAULT_TIMEOUT, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityScreenTest.kt index a2e1e85ba0..8387abc075 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityScreenTest.kt @@ -23,6 +23,7 @@ import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow import com.bitwarden.ui.platform.manager.IntentManager import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.assertNoDialogExists +import com.x8bit.bitwarden.data.auth.repository.model.PolicyInformation import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeout import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeoutAction import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest @@ -602,7 +603,7 @@ class AccountSecurityScreenTest : BitwardenComposeTest() { mutableStateFlow.update { it.copy( vaultTimeoutPolicyMinutes = 100, - vaultTimeoutPolicyAction = "lock", + vaultTimeoutPolicyAction = PolicyInformation.VaultTimeout.Action.LOCK, ) } val bothText = "Your organization policies are affecting your vault timeout. " + diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt index 9a959d6320..51ca4045f3 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt @@ -143,7 +143,7 @@ class AccountSecurityViewModelTest : BaseViewModelTest() { val policyInformation = PolicyInformation.VaultTimeout( minutes = 10, - action = "lock", + action = PolicyInformation.VaultTimeout.Action.LOCK, ) mutableActivePolicyFlow.emit( listOf( @@ -159,7 +159,7 @@ class AccountSecurityViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( vaultTimeoutPolicyMinutes = 10, - vaultTimeoutPolicyAction = "lock", + vaultTimeoutPolicyAction = PolicyInformation.VaultTimeout.Action.LOCK, ), awaitItem(), )