diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt
index f587ba19e8..55cc5ba436 100644
--- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt
+++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt
@@ -2033,7 +2033,7 @@ class VaultAddEditViewModel @Inject constructor(
sendEvent(event = VaultAddEditEvent.ExitApp)
} else {
snackbarRelayManager.sendSnackbarData(
- data = BitwardenSnackbarData(BitwardenString.new_item_created.asText()),
+ data = BitwardenSnackbarData(state.savedSnackbarMessage),
relay = SnackbarRelay.CIPHER_CREATED,
)
sendEvent(event = VaultAddEditEvent.NavigateBack)
@@ -2066,7 +2066,7 @@ class VaultAddEditViewModel @Inject constructor(
sendEvent(event = VaultAddEditEvent.ExitApp)
} else {
snackbarRelayManager.sendSnackbarData(
- data = BitwardenSnackbarData(BitwardenString.item_updated.asText()),
+ data = BitwardenSnackbarData(state.savedSnackbarMessage),
relay = SnackbarRelay.CIPHER_UPDATED,
)
sendEvent(event = VaultAddEditEvent.NavigateBack)
@@ -2810,6 +2810,21 @@ data class VaultAddEditState(
}
}
+ /**
+ * Helper to determine the snackbar message shown after the item is successfully saved.
+ */
+ val savedSnackbarMessage: Text
+ get() = when (cipherType) {
+ VaultItemCipherType.LOGIN -> BitwardenString.login_saved.asText()
+ VaultItemCipherType.CARD -> BitwardenString.card_saved.asText()
+ VaultItemCipherType.IDENTITY -> BitwardenString.identity_saved.asText()
+ VaultItemCipherType.SECURE_NOTE -> BitwardenString.secure_note_saved.asText()
+ VaultItemCipherType.SSH_KEY -> BitwardenString.ssh_key_saved.asText()
+ VaultItemCipherType.BANK_ACCOUNT -> BitwardenString.bank_account_saved.asText()
+ VaultItemCipherType.DRIVERS_LICENSE -> BitwardenString.license_saved.asText()
+ VaultItemCipherType.PASSPORT -> BitwardenString.passport_saved.asText()
+ }
+
/**
* Whether the cipher is in a collection.
*/
diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModelTest.kt
index e3626626ed..58268711bb 100644
--- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModelTest.kt
+++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModelTest.kt
@@ -961,7 +961,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
}
verify(exactly = 1) {
snackbarRelayManager.sendSnackbarData(
- data = BitwardenSnackbarData(BitwardenString.new_item_created.asText()),
+ data = BitwardenSnackbarData(BitwardenString.login_saved.asText()),
relay = SnackbarRelay.CIPHER_CREATED,
)
}
@@ -1131,7 +1131,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
assertNotNull(specialCircumstanceManager.specialCircumstance)
verify(exactly = 1) {
snackbarRelayManager.sendSnackbarData(
- data = BitwardenSnackbarData(BitwardenString.new_item_created.asText()),
+ data = BitwardenSnackbarData(BitwardenString.login_saved.asText()),
relay = SnackbarRelay.CIPHER_CREATED,
)
}
@@ -1514,12 +1514,88 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
}
verify(exactly = 1) {
snackbarRelayManager.sendSnackbarData(
- data = BitwardenSnackbarData(BitwardenString.new_item_created.asText()),
+ data = BitwardenSnackbarData(BitwardenString.login_saved.asText()),
relay = SnackbarRelay.CIPHER_CREATED,
)
}
}
+ @Suppress("MaxLineLength")
+ @Test
+ fun `in add mode with a card, createCipherInOrganization success should send the card saved snackbar`() =
+ runTest {
+ val stateWithName = createVaultAddItemState(
+ vaultItemCipherType = VaultItemCipherType.CARD,
+ commonContentViewState = createCommonContentViewState(
+ name = "mockName-1",
+ ),
+ typeContentViewState = VaultAddEditState.ViewState.Content.ItemType.Card(),
+ )
+
+ mutableVaultDataFlow.value = DataState.Loaded(createVaultData())
+
+ val viewModel = createAddVaultItemViewModel(
+ createSavedStateHandleWithState(
+ state = stateWithName,
+ vaultAddEditType = VaultAddEditType.AddItem,
+ vaultItemCipherType = VaultItemCipherType.CARD,
+ ),
+ )
+
+ coEvery {
+ vaultRepository.createCipherInOrganization(any(), any())
+ } returns CreateCipherResult.Success
+ viewModel.eventFlow.test {
+ viewModel.trySendAction(VaultAddEditAction.Common.SaveClick)
+ assertEquals(VaultAddEditEvent.NavigateBack, awaitItem())
+ }
+ verify(exactly = 1) {
+ snackbarRelayManager.sendSnackbarData(
+ data = BitwardenSnackbarData(BitwardenString.card_saved.asText()),
+ relay = SnackbarRelay.CIPHER_CREATED,
+ )
+ }
+ }
+
+ @Test
+ fun `in edit mode with a card, updateCipher success should send the card saved snackbar`() =
+ runTest {
+ val cipherView = createMockCipherListView(1)
+ val stateWithName = createVaultAddItemState(
+ vaultAddEditType = VaultAddEditType.EditItem(DEFAULT_EDIT_ITEM_ID),
+ vaultItemCipherType = VaultItemCipherType.CARD,
+ commonContentViewState = createCommonContentViewState(
+ name = "mockName-1",
+ ),
+ typeContentViewState = VaultAddEditState.ViewState.Content.ItemType.Card(),
+ )
+
+ mutableVaultDataFlow.value =
+ DataState.Loaded(createVaultData(cipherListView = cipherView))
+
+ val viewModel = createAddVaultItemViewModel(
+ createSavedStateHandleWithState(
+ state = stateWithName,
+ vaultAddEditType = VaultAddEditType.EditItem(DEFAULT_EDIT_ITEM_ID),
+ vaultItemCipherType = VaultItemCipherType.CARD,
+ ),
+ )
+
+ coEvery {
+ vaultRepository.updateCipher(any(), any())
+ } returns UpdateCipherResult.Success
+ viewModel.eventFlow.test {
+ viewModel.trySendAction(VaultAddEditAction.Common.SaveClick)
+ assertEquals(VaultAddEditEvent.NavigateBack, awaitItem())
+ }
+ verify(exactly = 1) {
+ snackbarRelayManager.sendSnackbarData(
+ data = BitwardenSnackbarData(BitwardenString.card_saved.asText()),
+ relay = SnackbarRelay.CIPHER_UPDATED,
+ )
+ }
+ }
+
@Test
fun `in edit mode, canDelete should be true when cipher permission is true`() =
runTest {
@@ -1855,7 +1931,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
}
verify(exactly = 1) {
snackbarRelayManager.sendSnackbarData(
- data = BitwardenSnackbarData(BitwardenString.item_updated.asText()),
+ data = BitwardenSnackbarData(BitwardenString.login_saved.asText()),
relay = SnackbarRelay.CIPHER_UPDATED,
)
}
diff --git a/ui/src/main/res/values/strings.xml b/ui/src/main/res/values/strings.xml
index 44267d14d4..1df9b008a7 100644
--- a/ui/src/main/res/values/strings.xml
+++ b/ui/src/main/res/values/strings.xml
@@ -120,7 +120,6 @@
Minimum numbers
Minimum special
Never
- Item added
There are no cards in your vault.
Add card
There are no logins in your vault.
@@ -150,6 +149,14 @@
Select
Item details
Item saved
+ Bank account saved
+ Card saved
+ Identity saved
+ License saved
+ Login saved
+ Passport saved
+ Secure note saved
+ SSH key saved
Submitting…
Syncing…
Syncing complete