From 96866ee540dd9b7951dd7bc1e763d92c6ae1ec64 Mon Sep 17 00:00:00 2001 From: David Perez Date: Wed, 6 Dec 2023 09:35:36 -0600 Subject: [PATCH] Add navigation routing for the VaultEditItemScreen (#328) --- .../vaultunlocked/VaultUnlockedNavigation.kt | 13 +++++++++--- .../VaultUnlockedNavBarNavigation.kt | 2 ++ .../VaultUnlockedNavBarScreen.kt | 4 ++++ .../vault/feature/item/VaultItemNavigation.kt | 10 ++++++--- .../ui/vault/feature/item/VaultItemScreen.kt | 5 ++--- .../ui/vault/feature/vault/VaultNavigation.kt | 2 ++ .../ui/vault/feature/vault/VaultScreen.kt | 3 +++ .../ui/vault/feature/vault/VaultViewModel.kt | 7 +++++++ .../VaultUnlockedNavBarScreenTest.kt | 8 +++++++ .../vault/feature/item/VaultItemScreenTest.kt | 10 +++++++++ .../ui/vault/feature/vault/VaultScreenTest.kt | 21 ++++++++++++++----- 11 files changed, 71 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlocked/VaultUnlockedNavigation.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlocked/VaultUnlockedNavigation.kt index 75e337f9aa..ec36d1b385 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlocked/VaultUnlockedNavigation.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlocked/VaultUnlockedNavigation.kt @@ -10,10 +10,12 @@ import com.x8bit.bitwarden.ui.platform.feature.vaultunlockednavbar.VAULT_UNLOCKE import com.x8bit.bitwarden.ui.platform.feature.vaultunlockednavbar.vaultUnlockedNavBarDestination import com.x8bit.bitwarden.ui.tools.feature.send.navigateToNewSend import com.x8bit.bitwarden.ui.tools.feature.send.newSendDestination -import com.x8bit.bitwarden.ui.vault.feature.item.navigateToVaultItem -import com.x8bit.bitwarden.ui.vault.feature.item.vaultItemDestination import com.x8bit.bitwarden.ui.vault.feature.additem.navigateToVaultAddItem import com.x8bit.bitwarden.ui.vault.feature.additem.vaultAddItemDestination +import com.x8bit.bitwarden.ui.vault.feature.edit.navigateToVaultEditItem +import com.x8bit.bitwarden.ui.vault.feature.edit.vaultEditItemDestination +import com.x8bit.bitwarden.ui.vault.feature.item.navigateToVaultItem +import com.x8bit.bitwarden.ui.vault.feature.item.vaultItemDestination const val VAULT_UNLOCKED_GRAPH_ROUTE: String = "vault_unlocked_graph" @@ -37,12 +39,17 @@ fun NavGraphBuilder.vaultUnlockedGraph( vaultUnlockedNavBarDestination( onNavigateToVaultAddItem = { navController.navigateToVaultAddItem() }, onNavigateToVaultItem = { navController.navigateToVaultItem(it) }, + onNavigateToVaultEditItem = { navController.navigateToVaultEditItem(it) }, onNavigateToNewSend = { navController.navigateToNewSend() }, onNavigateToDeleteAccount = { navController.navigateToDeleteAccount() }, ) deleteAccountDestination(onNavigateBack = { navController.popBackStack() }) vaultAddItemDestination(onNavigateBack = { navController.popBackStack() }) - vaultItemDestination(onNavigateBack = { navController.popBackStack() }) + vaultItemDestination( + onNavigateBack = { navController.popBackStack() }, + onNavigateToVaultEditItem = { navController.navigateToVaultEditItem(it) }, + ) + vaultEditItemDestination(onNavigateBack = { navController.popBackStack() }) newSendDestination(onNavigateBack = { navController.popBackStack() }) } } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarNavigation.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarNavigation.kt index 2dad4eaa49..000a3d44ec 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarNavigation.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarNavigation.kt @@ -24,6 +24,7 @@ fun NavController.navigateToVaultUnlockedNavBar(navOptions: NavOptions? = null) fun NavGraphBuilder.vaultUnlockedNavBarDestination( onNavigateToVaultAddItem: () -> Unit, onNavigateToVaultItem: (vaultItemId: String) -> Unit, + onNavigateToVaultEditItem: (vaultItemId: String) -> Unit, onNavigateToNewSend: () -> Unit, onNavigateToDeleteAccount: () -> Unit, ) { @@ -37,6 +38,7 @@ fun NavGraphBuilder.vaultUnlockedNavBarDestination( VaultUnlockedNavBarScreen( onNavigateToVaultAddItem = onNavigateToVaultAddItem, onNavigateToVaultItem = onNavigateToVaultItem, + onNavigateToVaultEditItem = onNavigateToVaultEditItem, onNavigateToNewSend = onNavigateToNewSend, onNavigateToDeleteAccount = onNavigateToDeleteAccount, ) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreen.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreen.kt index 7b79030748..ea0e8c0521 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreen.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreen.kt @@ -67,6 +67,7 @@ fun VaultUnlockedNavBarScreen( navController: NavHostController = rememberNavController(), onNavigateToVaultAddItem: () -> Unit, onNavigateToVaultItem: (vaultItemId: String) -> Unit, + onNavigateToVaultEditItem: (vaultItemId: String) -> Unit, onNavigateToNewSend: () -> Unit, onNavigateToDeleteAccount: () -> Unit, ) { @@ -95,6 +96,7 @@ fun VaultUnlockedNavBarScreen( VaultUnlockedNavBarScaffold( navController = navController, onNavigateToVaultItem = onNavigateToVaultItem, + onNavigateToVaultEditItem = onNavigateToVaultEditItem, navigateToVaultAddItem = onNavigateToVaultAddItem, navigateToNewSend = onNavigateToNewSend, navigateToDeleteAccount = onNavigateToDeleteAccount, @@ -126,6 +128,7 @@ private fun VaultUnlockedNavBarScaffold( settingsTabClickedAction: () -> Unit, navigateToVaultAddItem: () -> Unit, onNavigateToVaultItem: (vaultItemId: String) -> Unit, + onNavigateToVaultEditItem: (vaultItemId: String) -> Unit, navigateToNewSend: () -> Unit, navigateToDeleteAccount: () -> Unit, ) { @@ -182,6 +185,7 @@ private fun VaultUnlockedNavBarScaffold( navigateToVaultAddItem() }, onNavigateToVaultItemScreen = onNavigateToVaultItem, + onNavigateToVaultEditItemScreen = onNavigateToVaultEditItem, onDimBottomNavBarRequest = { shouldDim -> shouldDimNavBar = shouldDim }, diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemNavigation.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemNavigation.kt index 68de4ab486..7c224576cc 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemNavigation.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemNavigation.kt @@ -27,6 +27,7 @@ class VaultItemArgs(val vaultItemId: String) { */ fun NavGraphBuilder.vaultItemDestination( onNavigateBack: () -> Unit, + onNavigateToVaultEditItem: (vaultItemId: String) -> Unit, ) { composable( route = VAULT_ITEM_ROUTE, @@ -34,11 +35,14 @@ fun NavGraphBuilder.vaultItemDestination( navArgument(VAULT_ITEM_ID) { type = NavType.StringType }, ), enterTransition = TransitionProviders.Enter.slideUp, - exitTransition = TransitionProviders.Exit.slideDown, - popEnterTransition = TransitionProviders.Enter.slideUp, + exitTransition = TransitionProviders.Exit.stay, + popEnterTransition = TransitionProviders.Enter.stay, popExitTransition = TransitionProviders.Exit.slideDown, ) { - VaultItemScreen(onNavigateBack = onNavigateBack) + VaultItemScreen( + onNavigateBack = onNavigateBack, + onNavigateToVaultEditItem = onNavigateToVaultEditItem, + ) } } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreen.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreen.kt index 695f6f9c4b..5e39771561 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreen.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreen.kt @@ -49,6 +49,7 @@ fun VaultItemScreen( clipboardManager: ClipboardManager = LocalClipboardManager.current, intentHandler: IntentHandler = IntentHandler(context = LocalContext.current), onNavigateBack: () -> Unit, + onNavigateToVaultEditItem: (vaultItemId: String) -> Unit, ) { val state by viewModel.stateFlow.collectAsStateWithLifecycle() val context = LocalContext.current @@ -61,9 +62,7 @@ fun VaultItemScreen( VaultItemEvent.NavigateBack -> onNavigateBack() - is VaultItemEvent.NavigateToEdit -> { - Toast.makeText(context, "Not yet implemented.", Toast.LENGTH_SHORT).show() - } + is VaultItemEvent.NavigateToEdit -> onNavigateToVaultEditItem(event.itemId) is VaultItemEvent.NavigateToPasswordHistory -> { Toast.makeText(context, "Not yet implemented.", Toast.LENGTH_SHORT).show() diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultNavigation.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultNavigation.kt index 7e595a93ad..3f1c92b114 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultNavigation.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultNavigation.kt @@ -13,12 +13,14 @@ const val VAULT_ROUTE: String = "vault" fun NavGraphBuilder.vaultDestination( onNavigateToVaultAddItemScreen: () -> Unit, onNavigateToVaultItemScreen: (vaultItemId: String) -> Unit, + onNavigateToVaultEditItemScreen: (vaultItemId: String) -> Unit, onDimBottomNavBarRequest: (shouldDim: Boolean) -> Unit, ) { composable(VAULT_ROUTE) { VaultScreen( onNavigateToVaultAddItemScreen = onNavigateToVaultAddItemScreen, onNavigateToVaultItemScreen = onNavigateToVaultItemScreen, + onNavigateToVaultEditItemScreen = onNavigateToVaultEditItemScreen, onDimBottomNavBarRequest = onDimBottomNavBarRequest, ) } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultScreen.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultScreen.kt index 3a019bd7b2..2a60246b54 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultScreen.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultScreen.kt @@ -46,6 +46,7 @@ fun VaultScreen( viewModel: VaultViewModel = hiltViewModel(), onNavigateToVaultAddItemScreen: () -> Unit, onNavigateToVaultItemScreen: (vaultItemId: String) -> Unit, + onNavigateToVaultEditItemScreen: (vaultItemId: String) -> Unit, onDimBottomNavBarRequest: (shouldDim: Boolean) -> Unit, ) { val context = LocalContext.current @@ -62,6 +63,8 @@ fun VaultScreen( is VaultEvent.NavigateToVaultItem -> onNavigateToVaultItemScreen(event.itemId) + is VaultEvent.NavigateToEditVaultItem -> onNavigateToVaultEditItemScreen(event.itemId) + VaultEvent.NavigateToCardGroup -> { Toast .makeText(context, "Navigate to card type screen.", Toast.LENGTH_SHORT) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt index 86215584d6..b425ab50ed 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt @@ -419,6 +419,13 @@ sealed class VaultEvent { val itemId: String, ) : VaultEvent() + /** + * Navigate to the item edit screen. + */ + data class NavigateToEditVaultItem( + val itemId: String, + ) : VaultEvent() + /** * Navigate to the card group screen. */ diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreenTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreenTest.kt index 683545ee5e..b0e1b3312a 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreenTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreenTest.kt @@ -34,6 +34,7 @@ class VaultUnlockedNavBarScreenTest : BaseComposeTest() { navController = fakeNavHostController, onNavigateToVaultAddItem = {}, onNavigateToVaultItem = {}, + onNavigateToVaultEditItem = {}, onNavigateToNewSend = {}, onNavigateToDeleteAccount = {}, ) @@ -58,6 +59,7 @@ class VaultUnlockedNavBarScreenTest : BaseComposeTest() { navController = fakeNavHostController, onNavigateToVaultAddItem = {}, onNavigateToVaultItem = {}, + onNavigateToVaultEditItem = {}, onNavigateToNewSend = {}, onNavigateToDeleteAccount = {}, ) @@ -83,6 +85,7 @@ class VaultUnlockedNavBarScreenTest : BaseComposeTest() { navController = fakeNavHostController, onNavigateToVaultAddItem = {}, onNavigateToVaultItem = {}, + onNavigateToVaultEditItem = {}, onNavigateToNewSend = {}, onNavigateToDeleteAccount = {}, ) @@ -107,6 +110,7 @@ class VaultUnlockedNavBarScreenTest : BaseComposeTest() { navController = fakeNavHostController, onNavigateToVaultAddItem = {}, onNavigateToVaultItem = {}, + onNavigateToVaultEditItem = {}, onNavigateToNewSend = {}, onNavigateToDeleteAccount = {}, ) @@ -132,6 +136,7 @@ class VaultUnlockedNavBarScreenTest : BaseComposeTest() { navController = fakeNavHostController, onNavigateToVaultAddItem = {}, onNavigateToVaultItem = {}, + onNavigateToVaultEditItem = {}, onNavigateToNewSend = {}, onNavigateToDeleteAccount = {}, ) @@ -156,6 +161,7 @@ class VaultUnlockedNavBarScreenTest : BaseComposeTest() { navController = fakeNavHostController, onNavigateToVaultAddItem = {}, onNavigateToVaultItem = {}, + onNavigateToVaultEditItem = {}, onNavigateToNewSend = {}, onNavigateToDeleteAccount = {}, ) @@ -181,6 +187,7 @@ class VaultUnlockedNavBarScreenTest : BaseComposeTest() { navController = fakeNavHostController, onNavigateToVaultAddItem = {}, onNavigateToVaultItem = {}, + onNavigateToVaultEditItem = {}, onNavigateToNewSend = {}, onNavigateToDeleteAccount = {}, ) @@ -205,6 +212,7 @@ class VaultUnlockedNavBarScreenTest : BaseComposeTest() { navController = fakeNavHostController, onNavigateToVaultAddItem = {}, onNavigateToVaultItem = {}, + onNavigateToVaultEditItem = {}, onNavigateToNewSend = {}, onNavigateToDeleteAccount = {}, ) 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 6cf6d50329..6cf268535e 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 @@ -8,12 +8,14 @@ import io.mockk.mockk import io.mockk.verify import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow +import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test class VaultItemScreenTest : BaseComposeTest() { private var onNavigateBackCalled = false + private var onNavigateToVaultEditItemId: String? = null private val mutableEventFlow = MutableSharedFlow( extraBufferCapacity = Int.MAX_VALUE, @@ -30,10 +32,18 @@ class VaultItemScreenTest : BaseComposeTest() { VaultItemScreen( viewModel = viewModel, onNavigateBack = { onNavigateBackCalled = true }, + onNavigateToVaultEditItem = { onNavigateToVaultEditItemId = it }, ) } } + @Test + fun `NavigateToEdit event should invoke onNavigateToVaultEditItem`() { + val id = "id1234" + mutableEventFlow.tryEmit(VaultItemEvent.NavigateToEdit(id)) + assertEquals(id, onNavigateToVaultEditItemId) + } + @Test fun `clicking close button should send CloseClick action`() { composeTestRule.onNodeWithContentDescription(label = "Close").performClick() diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultScreenTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultScreenTest.kt index 963db0f49d..7e3f64fc2b 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultScreenTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultScreenTest.kt @@ -20,6 +20,7 @@ import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.update +import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Before @@ -28,7 +29,8 @@ import org.junit.Test class VaultScreenTest : BaseComposeTest() { private var onNavigateToVaultAddItemScreenCalled = false - private var onNavigateToVaultItemScreenCalled = false + private var onNavigateToVaultItemId: String? = null + private var onNavigateToVaultEditItemId: String? = null private var onDimBottomNavBarRequestCalled = false private val mutableEventFlow = MutableSharedFlow( @@ -46,7 +48,8 @@ class VaultScreenTest : BaseComposeTest() { VaultScreen( viewModel = viewModel, onNavigateToVaultAddItemScreen = { onNavigateToVaultAddItemScreenCalled = true }, - onNavigateToVaultItemScreen = { onNavigateToVaultItemScreenCalled = true }, + onNavigateToVaultItemScreen = { onNavigateToVaultItemId = it }, + onNavigateToVaultEditItemScreen = { onNavigateToVaultEditItemId = it }, onDimBottomNavBarRequest = { onDimBottomNavBarRequestCalled = true }, ) } @@ -118,9 +121,17 @@ class VaultScreenTest : BaseComposeTest() { } @Test - fun `NavigateToVaultItem event should call onNavigateToVaultItemScreenCalled`() { - mutableEventFlow.tryEmit(VaultEvent.NavigateToVaultItem(itemId = "id")) - assertTrue(onNavigateToVaultItemScreenCalled) + fun `NavigateToVaultItem event should call onNavigateToVaultItemScreen`() { + val id = "id4321" + mutableEventFlow.tryEmit(VaultEvent.NavigateToVaultItem(itemId = id)) + assertEquals(id, onNavigateToVaultItemId) + } + + @Test + fun `NavigateToEditVaultItem event should call onNavigateToVaultEditItemScreen`() { + val id = "id1234" + mutableEventFlow.tryEmit(VaultEvent.NavigateToEditVaultItem(itemId = id)) + assertEquals(id, onNavigateToVaultEditItemId) } @Test