diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/FoldersScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/FoldersScreen.kt index 95d9ee1b38d..7a935f232b3 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/FoldersScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/FoldersScreen.kt @@ -75,7 +75,7 @@ fun FoldersScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = BitwardenString.folders), + title = stringResource(id = BitwardenString.my_folders), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = BitwardenString.close), diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/vault/VaultSettingsScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/vault/VaultSettingsScreen.kt index 666c6234652..95e9d519ad9 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/vault/VaultSettingsScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/vault/VaultSettingsScreen.kt @@ -119,7 +119,7 @@ fun VaultSettingsScreen( ) } BitwardenTextRow( - text = stringResource(BitwardenString.folders), + text = stringResource(BitwardenString.my_folders), onClick = { viewModel.trySendAction(VaultSettingsAction.FoldersButtonClick) }, withDivider = false, cardStyle = CardStyle.Top(), diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditItemContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditItemContent.kt index 7f1eb83fec9..6f6ba0d5094 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditItemContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditItemContent.kt @@ -184,7 +184,7 @@ fun CoachMarkScope.VaultAddEditContent( item { Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenTextSelectionButton( - label = stringResource(id = BitwardenString.folder), + label = stringResource(id = BitwardenString.my_folder), selectedOption = state.common.selectedFolder?.name, onClick = commonTypeHandlers.onSelectOrAddFolderForItem, cardStyle = if (isAddItemMode && state.common.hasOrganizations) { diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreen.kt index 9e358ec9633..fdd9a5497db 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreen.kt @@ -372,7 +372,7 @@ fun VaultAddEditScreen( .takeUnless { state.isAddItemMode }, OverflowMenuItemData( text = stringResource( - id = BitwardenString.move_to_vault, + id = BitwardenString.move, ), onClick = { viewModel.trySendAction( @@ -658,7 +658,7 @@ private fun FolderSelectionBottomSheet( mutableStateOf(state.selectedFolder?.name.orEmpty()) } BitwardenModalBottomSheet( - sheetTitle = stringResource(BitwardenString.folders), + sheetTitle = stringResource(BitwardenString.my_folders), onDismiss = handlers.onDismissBottomSheet, topBarActions = { animatedOnDismiss -> BitwardenTextButton( diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreen.kt index 0aaaa4d169f..290659c7874 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreen.kt @@ -202,7 +202,7 @@ fun VaultItemScreen( ) .takeUnless { state.isCipherInCollection }, OverflowMenuItemData( - text = stringResource(id = BitwardenString.move_to_vault), + text = stringResource(id = BitwardenString.move), onClick = { viewModel.trySendAction( VaultItemAction.Common.MoveToOrganizationClick, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingContent.kt index 22cdb83ad2c..224787e6540 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingContent.kt @@ -169,7 +169,7 @@ fun VaultItemListingContent( item(key = "folders_header") { Spacer(modifier = Modifier.height(height = 12.dp)) BitwardenListHeaderText( - label = stringResource(id = BitwardenString.folders), + label = stringResource(id = BitwardenString.my_folders), supportingLabel = state.displayFolderList.count().toString(), modifier = Modifier .animateItem() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationContent.kt index 7017efc94d2..f834598ff43 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationContent.kt @@ -40,6 +40,7 @@ fun VaultMoveToOrganizationContent( item { BitwardenMultiSelectButton( label = stringResource(id = BitwardenString.vault), + dialogTitle = stringResource(id = BitwardenString.filter_by_vault), options = state .organizations .map { it.name } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModel.kt index fab657fafc2..1438f3cc8d3 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModel.kt @@ -351,7 +351,7 @@ data class VaultMoveToOrganizationState( get() = if (onlyShowCollections) { BitwardenString.shared_folders.asText() } else { - BitwardenString.move_to_vault.asText() + BitwardenString.move.asText() } val appBarButtonText: Text diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultContent.kt index 3e65ffe88a3..49f3c98fe71 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultContent.kt @@ -376,7 +376,7 @@ fun VaultContent( if (state.folderItems.isNotEmpty()) { item(key = "folders_header") { BitwardenListHeaderText( - label = stringResource(id = BitwardenString.folders), + label = stringResource(id = BitwardenString.my_folders), supportingLabel = state.folderItems.count().toString(), modifier = Modifier .animateItem() diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt index 6c631430988..bda55111b01 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt @@ -3560,7 +3560,7 @@ class VaultAddEditScreenTest : BitwardenComposeTest() { // Opens the menu composeTestRule - .onNodeWithContentDescriptionAfterScroll(label = "No Folder. Folder") + .onNodeWithContentDescriptionAfterScroll(label = "No Folder. My folder") .performClick() verify { @@ -3575,7 +3575,7 @@ class VaultAddEditScreenTest : BitwardenComposeTest() { updateStateWithFolders() composeTestRule - .onNodeWithContentDescriptionAfterScroll(label = "No Folder. Folder") + .onNodeWithContentDescriptionAfterScroll(label = "No Folder. My folder") .assertIsDisplayed() mutableStateFlow.update { currentState -> @@ -3583,7 +3583,7 @@ class VaultAddEditScreenTest : BitwardenComposeTest() { } composeTestRule - .onNodeWithContentDescriptionAfterScroll(label = "mockFolderName-1. Folder") + .onNodeWithContentDescriptionAfterScroll(label = "mockFolderName-1. My folder") .assertIsDisplayed() } @@ -3594,7 +3594,7 @@ class VaultAddEditScreenTest : BitwardenComposeTest() { } composeTestRule - .onNodeWithText("Folders") + .onNodeWithText("My folders") .assertIsDisplayed() composeTestRule @@ -3609,7 +3609,7 @@ class VaultAddEditScreenTest : BitwardenComposeTest() { } composeTestRule - .onNodeWithText("Folders") + .onNodeWithText("My folders") .assertIsDisplayed() composeTestRule @@ -3633,7 +3633,7 @@ class VaultAddEditScreenTest : BitwardenComposeTest() { } composeTestRule - .onNodeWithText("Folders") + .onNodeWithText("My folders") .assertIsDisplayed() composeTestRule @@ -3656,7 +3656,7 @@ class VaultAddEditScreenTest : BitwardenComposeTest() { val newFolderName = "newFolderName" composeTestRule - .onNodeWithText("Folders") + .onNodeWithText("My folders") .assertIsDisplayed() composeTestRule @@ -4422,7 +4422,7 @@ class VaultAddEditScreenTest : BitwardenComposeTest() { .assertIsDisplayed() composeTestRule - .onAllNodesWithText("Move to vault") + .onAllNodesWithText("Move") .filterToOne(hasAnyAncestor(isPopup())) .assertDoesNotExist() @@ -4510,7 +4510,7 @@ class VaultAddEditScreenTest : BitwardenComposeTest() { .assertIsDisplayed() composeTestRule - .onAllNodesWithText("Move to vault") + .onAllNodesWithText("Move") .filterToOne(hasAnyAncestor(isPopup())) .assertIsDisplayed() @@ -5181,7 +5181,7 @@ class VaultAddEditScreenTest : BitwardenComposeTest() { // Confirm dropdown version of item is absent composeTestRule - .onAllNodesWithText("Move to vault") + .onAllNodesWithText("Move") .filter(hasAnyAncestor(isPopup())) .assertCountEquals(0) // Open the overflow menu @@ -5191,7 +5191,7 @@ class VaultAddEditScreenTest : BitwardenComposeTest() { // Confirm it does not exist composeTestRule - .onAllNodesWithText("Move to vault") + .onAllNodesWithText("Move") .filterToOne(hasAnyAncestor(isPopup())) .assertIsNotDisplayed() } @@ -5216,7 +5216,7 @@ class VaultAddEditScreenTest : BitwardenComposeTest() { // Confirm dropdown version of item is absent composeTestRule - .onAllNodesWithText("Move to vault") + .onAllNodesWithText("Move") .filter(hasAnyAncestor(isPopup())) .assertCountEquals(0) @@ -5225,7 +5225,7 @@ class VaultAddEditScreenTest : BitwardenComposeTest() { .performClick() composeTestRule - .onAllNodesWithText("Move to vault") + .onAllNodesWithText("Move") .filterToOne(hasAnyAncestor(isPopup())) .assertIsDisplayed() } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt index 539d5033f96..d9e3ee52a21 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt @@ -1547,14 +1547,14 @@ class VaultItemScreenTest : BitwardenComposeTest() { // Confirm dropdown version of item is absent composeTestRule - .onAllNodesWithText("Move to vault") + .onAllNodesWithText("Move") .filter(hasAnyAncestor(isPopup())) .assertCountEquals(0) // Open the overflow menu composeTestRule.onNodeWithContentDescription("More options").performClick() // Click on the move to organization hint item in the dropdown composeTestRule - .onAllNodesWithText("Move to vault") + .onAllNodesWithText("Move") .filterToOne(hasAnyAncestor(isPopup())) .performClick() verify { @@ -1574,14 +1574,14 @@ class VaultItemScreenTest : BitwardenComposeTest() { // Confirm dropdown version of item is absent composeTestRule - .onAllNodesWithText("Move to vault") + .onAllNodesWithText("Move") .filter(hasAnyAncestor(isPopup())) .assertCountEquals(0) // Open the overflow menu composeTestRule.onNodeWithContentDescription("More options").performClick() // Confirm it does not exist composeTestRule - .onAllNodesWithText("Move to vault") + .onAllNodesWithText("Move") .filterToOne(hasAnyAncestor(isPopup())) .assertDoesNotExist() } @@ -1696,7 +1696,7 @@ class VaultItemScreenTest : BitwardenComposeTest() { .assertIsDisplayed() composeTestRule - .onAllNodesWithText("Move to vault") + .onAllNodesWithText("Move") .filterToOne(hasAnyAncestor(isPopup())) .assertDoesNotExist() @@ -1724,7 +1724,7 @@ class VaultItemScreenTest : BitwardenComposeTest() { .assertIsDisplayed() composeTestRule - .onAllNodesWithText("Move to vault") + .onAllNodesWithText("Move") .filterToOne(hasAnyAncestor(isPopup())) .assertIsDisplayed() diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreenTest.kt index b3873f7f446..9f510565559 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreenTest.kt @@ -792,7 +792,7 @@ class VaultItemListingScreenTest : BitwardenComposeTest() { @Test fun `Folders text should be displayed according to state`() { - val folders = "FOLDERS (1)" + val folders = "MY FOLDERS (1)" mutableStateFlow.update { DEFAULT_STATE } composeTestRule .onNodeWithText(text = folders) @@ -822,7 +822,7 @@ class VaultItemListingScreenTest : BitwardenComposeTest() { fun `Folders text count should be displayed according to state`() { mutableStateFlow.update { DEFAULT_STATE } composeTestRule - .onNodeWithText(text = "FOLDERS (1)") + .onNodeWithText(text = "MY FOLDERS (1)") .assertDoesNotExist() mutableStateFlow.update { @@ -837,7 +837,7 @@ class VaultItemListingScreenTest : BitwardenComposeTest() { ) } composeTestRule - .onNodeWithTextAfterScroll(text = "FOLDERS (1)") + .onNodeWithTextAfterScroll(text = "MY FOLDERS (1)") .assertIsDisplayed() mutableStateFlow.update { @@ -867,7 +867,7 @@ class VaultItemListingScreenTest : BitwardenComposeTest() { } composeTestRule - .onNodeWithTextAfterScroll(text = "FOLDERS (3)") + .onNodeWithTextAfterScroll(text = "MY FOLDERS (3)") .assertIsDisplayed() } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreenTest.kt index dfca141ba9a..5638139f28a 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreenTest.kt @@ -6,6 +6,7 @@ import androidx.compose.ui.test.assertIsOff import androidx.compose.ui.test.assertIsOn import androidx.compose.ui.test.filterToOne import androidx.compose.ui.test.hasAnyAncestor +import androidx.compose.ui.test.hasClickAction import androidx.compose.ui.test.isDialog import androidx.compose.ui.test.onAllNodesWithText import androidx.compose.ui.test.onLast @@ -60,7 +61,8 @@ class VaultMoveToOrganizationScreenTest : BitwardenComposeTest() { .onNodeWithText(text = "Shared folders") .assertIsNotDisplayed() composeTestRule - .onNodeWithText(text = "Move to vault") + .onAllNodesWithText(text = "Move") + .filterToOne(!hasClickAction()) .assertIsDisplayed() mutableStateFlow.update { currentState -> @@ -68,7 +70,7 @@ class VaultMoveToOrganizationScreenTest : BitwardenComposeTest() { } composeTestRule - .onNodeWithText(text = "Move to vault") + .onNodeWithText(text = "Move") .assertIsNotDisplayed() composeTestRule .onNodeWithText(text = "Shared folders") @@ -85,7 +87,8 @@ class VaultMoveToOrganizationScreenTest : BitwardenComposeTest() { .onNodeWithText(text = "Save") .assertIsNotDisplayed() composeTestRule - .onNodeWithText(text = "Move") + .onAllNodesWithText(text = "Move") + .filterToOne(hasClickAction()) .assertIsDisplayed() mutableStateFlow.update { currentState -> @@ -155,7 +158,8 @@ class VaultMoveToOrganizationScreenTest : BitwardenComposeTest() { @Test fun `clicking move button should send MoveClick action`() { composeTestRule - .onNodeWithText(text = "Move") + .onAllNodesWithText(text = "Move") + .filterToOne(hasClickAction()) .performClick() verify { diff --git a/ui/src/main/kotlin/com/bitwarden/ui/platform/components/dropdown/BitwardenMultiSelectButton.kt b/ui/src/main/kotlin/com/bitwarden/ui/platform/components/dropdown/BitwardenMultiSelectButton.kt index bfed456b2a0..02ae22c35dc 100644 --- a/ui/src/main/kotlin/com/bitwarden/ui/platform/components/dropdown/BitwardenMultiSelectButton.kt +++ b/ui/src/main/kotlin/com/bitwarden/ui/platform/components/dropdown/BitwardenMultiSelectButton.kt @@ -49,6 +49,7 @@ import kotlinx.collections.immutable.toImmutableList * @param isEnabled Whether the button is enabled. * @param cardStyle Indicates the type of card style to be applied. * @param modifier A [Modifier] that you can use to apply custom modifications to the composable. + * @param dialogTitle The title to apply to the dialog (defaults to [label] when `null`). * @param dialogSubtitle The subtitle to apply to the dialog. * @param supportingText An optional supporting text that will appear below the text field. * @param helpData An optional [BitwardenHelpButtonData], representing the help button. @@ -67,6 +68,7 @@ fun BitwardenMultiSelectButton( onOptionSelected: (String) -> Unit, cardStyle: CardStyle?, modifier: Modifier = Modifier, + dialogTitle: String? = null, dialogSubtitle: String? = null, isEnabled: Boolean = true, supportingText: String? = null, @@ -78,6 +80,7 @@ fun BitwardenMultiSelectButton( ) { BitwardenMultiSelectButton( label = label, + dialogTitle = dialogTitle, dialogSubtitle = dialogSubtitle, options = options.map { MultiSelectOption.Row(it) }.toImmutableList(), selectedOption = selectedOption?.let { MultiSelectOption.Row(it) }, @@ -119,6 +122,7 @@ fun BitwardenMultiSelectButton( * @param supportingContent An optional supporting content that will appear below the button. * @param cardStyle Indicates the type of card style to be applied. * @param modifier A [Modifier] that you can use to apply custom modifications to the composable. + * @param dialogTitle The title to apply to the dialog (defaults to [label] when `null`). * @param helpData An optional [BitwardenHelpButtonData], representing the help button. * @param insets Inner padding to be applied withing the card. * @param textFieldTestTag The optional test tag associated with the inner text field. @@ -135,6 +139,7 @@ fun BitwardenMultiSelectButton( onOptionSelected: (MultiSelectOption.Row) -> Unit, cardStyle: CardStyle?, modifier: Modifier = Modifier, + dialogTitle: String? = null, dialogSubtitle: String? = null, isEnabled: Boolean = true, supportingContent: @Composable (ColumnScope.() -> Unit)?, @@ -166,7 +171,7 @@ fun BitwardenMultiSelectButton( if (shouldShowDialog) { BitwardenSelectionDialog( - title = label, + title = dialogTitle ?: label, subTitle = dialogSubtitle, onDismissRequest = { shouldShowDialog = false }, ) { diff --git a/ui/src/main/res/values/strings.xml b/ui/src/main/res/values/strings.xml index 9ccd65afcf3..fc95c3df0d7 100644 --- a/ui/src/main/res/values/strings.xml +++ b/ui/src/main/res/values/strings.xml @@ -24,7 +24,6 @@ New folder created. Folder deleted. No Folder - Folders Folder saved Hide Please connect to the internet before continuing. @@ -44,6 +43,8 @@ Master password (required) New master password (required) More options + My folder + My folders My vault Name Item name (required) @@ -341,7 +342,6 @@ Scanning will happen automatically. %1$s moved to %2$s. You must select at least one shared folder. Share - Move to vault No vaults to list. Choose a vault that you wish to move this item to. Moving to another vault transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved. Number of words