diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/additem/AddEditLoginItems.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/additem/AddEditLoginItems.kt index f60bb3063d..83c1442d5d 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/additem/AddEditLoginItems.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/additem/AddEditLoginItems.kt @@ -167,8 +167,8 @@ fun LazyListScope.addEditLoginItems( Spacer(modifier = Modifier.height(8.dp)) BitwardenMultiSelectButton( label = stringResource(id = R.string.folder), - options = state.availableFolders.toImmutableList(), - selectedOption = state.folder, + options = state.availableFolders.map { it.invoke() }.toImmutableList(), + selectedOption = state.folderName.invoke(), onOptionSelected = loginItemTypeHandlers.onFolderTextChange, modifier = Modifier.padding(horizontal = 16.dp), ) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/additem/VaultAddItemViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/additem/VaultAddItemViewModel.kt index 633c06fde3..9ee8dc4d2c 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/additem/VaultAddItemViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/additem/VaultAddItemViewModel.kt @@ -167,76 +167,76 @@ class VaultAddItemViewModel @Inject constructor( ) { when (action) { is VaultAddItemAction.ItemType.LoginType.NameTextChange -> { - handleNameTextInputChange(action) + handleLoginNameTextInputChange(action) } is VaultAddItemAction.ItemType.LoginType.UsernameTextChange -> { - handleUsernameTextInputChange(action) + handleLoginUsernameTextInputChange(action) } is VaultAddItemAction.ItemType.LoginType.PasswordTextChange -> { - handlePasswordTextInputChange(action) + handleLoginPasswordTextInputChange(action) } is VaultAddItemAction.ItemType.LoginType.UriTextChange -> { - handleURITextInputChange(action) + handleLoginURITextInputChange(action) } is VaultAddItemAction.ItemType.LoginType.FolderChange -> { - handleFolderTextInputChange(action) + handleLoginFolderTextInputChange(action) } is VaultAddItemAction.ItemType.LoginType.ToggleFavorite -> { - handleToggleFavorite(action) + handleLoginToggleFavorite(action) } is VaultAddItemAction.ItemType.LoginType.ToggleMasterPasswordReprompt -> { - handleToggleMasterPasswordReprompt(action) + handleLoginToggleMasterPasswordReprompt(action) } is VaultAddItemAction.ItemType.LoginType.NotesTextChange -> { - handleNotesTextInputChange(action) + handleLoginNotesTextInputChange(action) } is VaultAddItemAction.ItemType.LoginType.OwnershipChange -> { - handleOwnershipTextInputChange(action) + handleLoginOwnershipTextInputChange(action) } is VaultAddItemAction.ItemType.LoginType.OpenUsernameGeneratorClick -> { - handleOpenUsernameGeneratorClick() + handleLoginOpenUsernameGeneratorClick() } is VaultAddItemAction.ItemType.LoginType.PasswordCheckerClick -> { - handlePasswordCheckerClick() + handleLoginPasswordCheckerClick() } is VaultAddItemAction.ItemType.LoginType.OpenPasswordGeneratorClick -> { - handleOpenPasswordGeneratorClick() + handleLoginOpenPasswordGeneratorClick() } is VaultAddItemAction.ItemType.LoginType.SetupTotpClick -> { - handleSetupTotpClick() + handleLoginSetupTotpClick() } is VaultAddItemAction.ItemType.LoginType.UriSettingsClick -> { - handleUriSettingsClick() + handleLoginUriSettingsClick() } is VaultAddItemAction.ItemType.LoginType.AddNewUriClick -> { - handleAddNewUriClick() + handleLoginAddNewUriClick() } is VaultAddItemAction.ItemType.LoginType.TooltipClick -> { - handleTooltipClick() + handleLoginTooltipClick() } is VaultAddItemAction.ItemType.LoginType.AddNewCustomFieldClick -> { - handleAddNewCustomFieldClick() + handleLoginAddNewCustomFieldClick() } } } - private fun handleNameTextInputChange( + private fun handleLoginNameTextInputChange( action: VaultAddItemAction.ItemType.LoginType.NameTextChange, ) { updateLoginType { loginType -> @@ -244,7 +244,7 @@ class VaultAddItemViewModel @Inject constructor( } } - private fun handleUsernameTextInputChange( + private fun handleLoginUsernameTextInputChange( action: VaultAddItemAction.ItemType.LoginType.UsernameTextChange, ) { updateLoginType { loginType -> @@ -252,7 +252,7 @@ class VaultAddItemViewModel @Inject constructor( } } - private fun handlePasswordTextInputChange( + private fun handleLoginPasswordTextInputChange( action: VaultAddItemAction.ItemType.LoginType.PasswordTextChange, ) { updateLoginType { loginType -> @@ -260,7 +260,7 @@ class VaultAddItemViewModel @Inject constructor( } } - private fun handleURITextInputChange( + private fun handleLoginURITextInputChange( action: VaultAddItemAction.ItemType.LoginType.UriTextChange, ) { updateLoginType { loginType -> @@ -268,15 +268,15 @@ class VaultAddItemViewModel @Inject constructor( } } - private fun handleFolderTextInputChange( + private fun handleLoginFolderTextInputChange( action: VaultAddItemAction.ItemType.LoginType.FolderChange, ) { updateLoginType { loginType -> - loginType.copy(folder = action.folder) + loginType.copy(folderName = action.folder) } } - private fun handleToggleFavorite( + private fun handleLoginToggleFavorite( action: VaultAddItemAction.ItemType.LoginType.ToggleFavorite, ) { updateLoginType { loginType -> @@ -284,7 +284,7 @@ class VaultAddItemViewModel @Inject constructor( } } - private fun handleToggleMasterPasswordReprompt( + private fun handleLoginToggleMasterPasswordReprompt( action: VaultAddItemAction.ItemType.LoginType.ToggleMasterPasswordReprompt, ) { updateLoginType { loginType -> @@ -292,7 +292,7 @@ class VaultAddItemViewModel @Inject constructor( } } - private fun handleNotesTextInputChange( + private fun handleLoginNotesTextInputChange( action: VaultAddItemAction.ItemType.LoginType.NotesTextChange, ) { updateLoginType { loginType -> @@ -300,7 +300,7 @@ class VaultAddItemViewModel @Inject constructor( } } - private fun handleOwnershipTextInputChange( + private fun handleLoginOwnershipTextInputChange( action: VaultAddItemAction.ItemType.LoginType.OwnershipChange, ) { updateLoginType { loginType -> @@ -308,7 +308,7 @@ class VaultAddItemViewModel @Inject constructor( } } - private fun handleOpenUsernameGeneratorClick() { + private fun handleLoginOpenUsernameGeneratorClick() { viewModelScope.launch { sendEvent( event = VaultAddItemEvent.ShowToast( @@ -318,7 +318,7 @@ class VaultAddItemViewModel @Inject constructor( } } - private fun handlePasswordCheckerClick() { + private fun handleLoginPasswordCheckerClick() { viewModelScope.launch { sendEvent( event = VaultAddItemEvent.ShowToast( @@ -328,7 +328,7 @@ class VaultAddItemViewModel @Inject constructor( } } - private fun handleOpenPasswordGeneratorClick() { + private fun handleLoginOpenPasswordGeneratorClick() { viewModelScope.launch { sendEvent( event = VaultAddItemEvent.ShowToast( @@ -338,7 +338,7 @@ class VaultAddItemViewModel @Inject constructor( } } - private fun handleSetupTotpClick() { + private fun handleLoginSetupTotpClick() { viewModelScope.launch { sendEvent( event = VaultAddItemEvent.ShowToast( @@ -348,7 +348,7 @@ class VaultAddItemViewModel @Inject constructor( } } - private fun handleUriSettingsClick() { + private fun handleLoginUriSettingsClick() { viewModelScope.launch { sendEvent( event = VaultAddItemEvent.ShowToast( @@ -358,7 +358,7 @@ class VaultAddItemViewModel @Inject constructor( } } - private fun handleAddNewUriClick() { + private fun handleLoginAddNewUriClick() { viewModelScope.launch { sendEvent( event = VaultAddItemEvent.ShowToast( @@ -368,7 +368,7 @@ class VaultAddItemViewModel @Inject constructor( } } - private fun handleTooltipClick() { + private fun handleLoginTooltipClick() { viewModelScope.launch { sendEvent( event = VaultAddItemEvent.ShowToast( @@ -378,7 +378,7 @@ class VaultAddItemViewModel @Inject constructor( } } - private fun handleAddNewCustomFieldClick() { + private fun handleLoginAddNewCustomFieldClick() { viewModelScope.launch { sendEvent( event = VaultAddItemEvent.ShowToast( @@ -613,11 +613,13 @@ data class VaultAddItemState( * @property username The username required for the login item. * @property password The password required for the login item. * @property uri The URI associated with the login item. - * @property folder The folder used for the login item + * @property folderName The folder used for the login item * @property favorite Indicates whether this login item is marked as a favorite. * @property masterPasswordReprompt Indicates if a master password reprompt is required. * @property notes Any additional notes or comments associated with the login item. * @property ownership The ownership email associated with the login item. + * @property availableFolders Retrieves a list of available folders. + * @property availableOwners Retrieves a list of available owners. */ @Parcelize data class Login( @@ -625,35 +627,25 @@ data class VaultAddItemState( val username: String = "", val password: String = "", val uri: String = "", - val folder: String = DEFAULT_FOLDER, + val folderName: Text = DEFAULT_FOLDER, val favorite: Boolean = false, val masterPasswordReprompt: Boolean = false, val notes: String = "", val ownership: String = DEFAULT_OWNERSHIP, + // TODO: Update this property to pull available owners from the data layer. (BIT-501) + val availableFolders: List = listOf( + "Folder 1".asText(), + "Folder 2".asText(), + "Folder 3".asText(), + ), + // TODO: Update this property to pull available owners from the data layer. (BIT-501) + val availableOwners: List = listOf("a@b.com", "c@d.com"), ) : ItemType() { override val displayStringResId: Int get() = ItemTypeOption.LOGIN.labelRes - /** - * Retrieves a list of available folders. - * - * TODO(BIT-501): Update this property to pull available folders from the data layer. - * Currently, it returns a hardcoded list of folders. - */ - val availableFolders: List - get() = listOf("Folder 1", "Folder 2", "Folder 3") - - /** - * Retrieves a list of available owners. - * - * TODO(BIT-501): Update this property to pull available owners from the data layer. - * Currently, it returns a hardcoded list of email addresses. - */ - val availableOwners: List - get() = listOf("a@b.com", "c@d.com") - companion object { - private const val DEFAULT_FOLDER: String = "No Folder" + private val DEFAULT_FOLDER: Text = R.string.folder_none.asText() private const val DEFAULT_OWNERSHIP: String = "placeholder@email.com" } } @@ -795,7 +787,7 @@ sealed class VaultAddItemAction { * * @property folder The new folder text. */ - data class FolderChange(val folder: String) : LoginType() + data class FolderChange(val folder: Text) : LoginType() /** * Fired when the Favorite toggle is changed. diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/additem/VaultAddLoginItemTypeHandlers.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/additem/VaultAddLoginItemTypeHandlers.kt index f4ac1325f7..fe3515b8db 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/additem/VaultAddLoginItemTypeHandlers.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/additem/VaultAddLoginItemTypeHandlers.kt @@ -1,5 +1,7 @@ package com.x8bit.bitwarden.ui.vault.feature.additem +import com.x8bit.bitwarden.ui.platform.base.util.asText + /** * A collection of handler functions specifically tailored for managing actions * within the context of adding login items to a vault. @@ -81,7 +83,7 @@ class VaultAddLoginItemTypeHandlers( }, onFolderTextChange = { newFolder -> viewModel.trySendAction( - VaultAddItemAction.ItemType.LoginType.FolderChange(newFolder), + VaultAddItemAction.ItemType.LoginType.FolderChange(newFolder.asText()), ) }, onToggleFavorite = { isFavorite -> diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/additem/VaultAddItemScreenTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/additem/VaultAddItemScreenTest.kt index 8cc62974e9..da9f0ce5b7 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/additem/VaultAddItemScreenTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/additem/VaultAddItemScreenTest.kt @@ -395,7 +395,7 @@ class VaultAddItemScreenTest : BaseComposeTest() { verify { viewModel.trySendAction( - VaultAddItemAction.ItemType.LoginType.FolderChange("Folder 1"), + VaultAddItemAction.ItemType.LoginType.FolderChange("Folder 1".asText()), ) } } @@ -411,7 +411,7 @@ class VaultAddItemScreenTest : BaseComposeTest() { .assertIsDisplayed() mutableStateFlow.update { currentState -> - updateLoginType(currentState) { copy(folder = "Folder 2") } + updateLoginType(currentState) { copy(folderName = "Folder 2".asText()) } } composeTestRule diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/additem/VaultAddItemViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/additem/VaultAddItemViewModelTest.kt index 033f2e3dff..579ca60d66 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/additem/VaultAddItemViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/additem/VaultAddItemViewModelTest.kt @@ -152,13 +152,13 @@ class VaultAddItemViewModelTest : BaseViewModelTest() { @Test fun `FolderChange should update folder in LoginItem`() = runTest { val viewModel = createAddVaultItemViewModel() - val action = VaultAddItemAction.ItemType.LoginType.FolderChange("newFolder") + val action = VaultAddItemAction.ItemType.LoginType.FolderChange("newFolder".asText()) viewModel.actionChannel.trySend(action) val expectedLoginItem = (initialState.selectedType as VaultAddItemState.ItemType.Login) - .copy(folder = "newFolder") + .copy(folderName = "newFolder".asText()) val expectedState = initialState.copy(selectedType = expectedLoginItem) @@ -500,7 +500,7 @@ class VaultAddItemViewModelTest : BaseViewModelTest() { username: String = "", password: String = "", uri: String = "", - folder: String = "No Folder", + folder: Text = "No Folder".asText(), favorite: Boolean = false, masterPasswordReprompt: Boolean = false, notes: String = "", @@ -512,7 +512,7 @@ class VaultAddItemViewModelTest : BaseViewModelTest() { username = username, password = password, uri = uri, - folder = folder, + folderName = folder, favorite = favorite, masterPasswordReprompt = masterPasswordReprompt, notes = notes, diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt index 779a6ccfb7..094e5e45ed 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt @@ -112,7 +112,7 @@ class VaultDataExtensionsTest { username = "mockUsername-1", password = "mockPassword-1", uri = "mockUri-1", - folder = "mockFolder-1", + folderName = "mockFolder-1".asText(), favorite = false, masterPasswordReprompt = false, notes = "mockNotes-1",