Add navigation routing for the VaultEditItemScreen (#328)

This commit is contained in:
David Perez
2023-12-06 09:35:36 -06:00
committed by Álison Fernandes
parent b61c796f7b
commit 96866ee540
11 changed files with 71 additions and 14 deletions

View File

@@ -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() })
}
}

View File

@@ -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,
)

View File

@@ -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
},

View File

@@ -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,
)
}
}

View File

@@ -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()

View File

@@ -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,
)
}

View File

@@ -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)

View File

@@ -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.
*/

View File

@@ -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 = {},
)

View File

@@ -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<VaultItemEvent>(
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()

View File

@@ -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<VaultEvent>(
@@ -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