diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt index 4db0f87c8a..62263aea8c 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt @@ -347,6 +347,21 @@ class VaultItemViewModel @Inject constructor( ) return@onContent } + mutableStateFlow.update { currentState -> + currentState.copy( + viewState = content.copy( + common = content.common.copy( + customFields = content.common.customFields.map { customField -> + if (customField == action.field) { + action.field.copy(isVisible = action.isVisible) + } else { + customField + } + }, + ), + ), + ) + } if (action.isVisible) { organizationEventManager.trackEvent( event = OrganizationEvent.CipherClientToggledHiddenFieldVisible( @@ -1600,6 +1615,7 @@ data class VaultItemState( val name: String, val value: String, val isCopyable: Boolean, + val isVisible: Boolean, ) : Custom() /** diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/component/VaultItemCustomField.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/component/VaultItemCustomField.kt index d1102282ad..469c628a71 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/component/VaultItemCustomField.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/component/VaultItemCustomField.kt @@ -1,10 +1,6 @@ package com.x8bit.bitwarden.ui.vault.feature.item.component import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource @@ -34,8 +30,6 @@ fun CustomField( cardStyle: CardStyle, modifier: Modifier = Modifier, ) { - var isVisible by rememberSaveable { mutableStateOf(false) } - when (customField) { is VaultItemState.ViewState.Content.Common.Custom.BooleanField -> { BitwardenSwitch( @@ -53,11 +47,8 @@ fun CustomField( BitwardenPasswordField( label = customField.name, value = customField.value, - showPasswordChange = { - onShowHiddenFieldClick(customField, it) - isVisible = it - }, - showPassword = isVisible, + showPasswordChange = { onShowHiddenFieldClick(customField, it) }, + showPassword = customField.isVisible, onValueChange = { }, readOnly = true, singleLine = false, @@ -78,11 +69,8 @@ fun CustomField( BitwardenPasswordField( label = customField.name, value = customField.value, - showPasswordChange = { - onShowHiddenFieldClick(customField, it) - isVisible = it - }, - showPassword = isVisible, + showPasswordChange = { onShowHiddenFieldClick(customField, it) }, + showPassword = customField.isVisible, onValueChange = { }, readOnly = true, singleLine = false, diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/util/CipherViewExtensions.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/util/CipherViewExtensions.kt index 86f19edc52..40b5fa1603 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/util/CipherViewExtensions.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/util/CipherViewExtensions.kt @@ -57,9 +57,7 @@ fun CipherView.toViewState( name = name, requiresReprompt = (reprompt == CipherRepromptType.PASSWORD && hasMasterPassword) && previousState?.common?.requiresReprompt != false, - customFields = fields.orEmpty().map { fieldView -> - fieldView.toCustomField() - }, + customFields = fields.orEmpty().map { it.toCustomField() }, lastUpdated = revisionDate.toFormattedPattern( pattern = LAST_UPDATED_DATE_TIME_PATTERN, clock = clock, @@ -209,6 +207,7 @@ private fun FieldView.toCustomField(): VaultItemState.ViewState.Content.Common.C name = name.orEmpty(), value = value.orZeroWidthSpace(), isCopyable = !value.isNullOrBlank(), + isVisible = false, ) FieldType.BOOLEAN -> VaultItemState.ViewState.Content.Common.Custom.BooleanField( diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt index 111276d582..aa5a871012 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt @@ -779,6 +779,7 @@ class VaultItemScreenTest : BaseComposeTest() { name = "hidden", value = "hidden password", isCopyable = true, + isVisible = false, ) EMPTY_VIEW_STATES @@ -816,6 +817,7 @@ class VaultItemScreenTest : BaseComposeTest() { name = "hidden", value = "hidden password", isCopyable = true, + isVisible = false, ) EMPTY_VIEW_STATES @@ -856,6 +858,7 @@ class VaultItemScreenTest : BaseComposeTest() { name = "hidden", value = "hidden password", isCopyable = true, + isVisible = false, ) EMPTY_VIEW_STATES @@ -3154,6 +3157,7 @@ private val DEFAULT_COMMON: VaultItemState.ViewState.Content.Common = name = "hidden", value = "hidden password", isCopyable = true, + isVisible = false, ), VaultItemState.ViewState.Content.Common.Custom.BooleanField( name = "boolean", diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt index c64fb2e11c..2626eff14e 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt @@ -1073,6 +1073,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { name = "hidden", value = "value", isCopyable = true, + isVisible = false, ) every { mockCipherView.toViewState( @@ -1137,6 +1138,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { name = "hidden", value = "value", isCopyable = true, + isVisible = false, ) val loginViewState = VaultItemState.ViewState.Content( common = createCommonContent( @@ -1180,7 +1182,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { viewState = loginViewState.copy( common = createCommonContent(isEmpty = true, isPremiumUser = true).copy( requiresReprompt = false, - customFields = listOf(hiddenField), + customFields = listOf(hiddenField.copy(isVisible = true)), ), ), ), @@ -3708,6 +3710,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { name = "hidden", value = "value", isCopyable = true, + isVisible = false, ), VaultItemState.ViewState.Content.Common.Custom.BooleanField( name = "boolean", diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/util/VaultItemTestUtil.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/util/VaultItemTestUtil.kt index 18edadd39b..99e45ba59d 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/util/VaultItemTestUtil.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/util/VaultItemTestUtil.kt @@ -197,6 +197,7 @@ fun createCommonContent( name = "hidden", value = "value", isCopyable = true, + isVisible = false, ), VaultItemState.ViewState.Content.Common.Custom.BooleanField( name = "boolean",