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 748e57fe5b..c6ee85831d 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 @@ -201,7 +201,10 @@ fun NavGraphBuilder.vaultUnlockedGraph( onNavigateBack = { navController.popBackStack() }, ) - addSendDestination(onNavigateBack = { navController.popBackStack() }) + addSendDestination( + onNavigateBack = { navController.popBackStack() }, + onNavigateUpToRoot = { navController.navigateToVaultUnlockedRoot() }, + ) viewSendDestination( onNavigateBack = { navController.popBackStack() }, onNavigateToEditSend = { @@ -249,3 +252,7 @@ fun NavGraphBuilder.vaultUnlockedGraph( ) } } + +private fun NavController.navigateToVaultUnlockedRoot() { + this.popBackStack(route = VaultUnlockedNavbarRoute, inclusive = false) +} diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendNavigation.kt b/app/src/main/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendNavigation.kt index 7ddaa36fee..d2c21ca30a 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendNavigation.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendNavigation.kt @@ -60,9 +60,13 @@ private fun SavedStateHandle.toAddSendType(): AddSendType { */ fun NavGraphBuilder.addSendDestination( onNavigateBack: () -> Unit, + onNavigateUpToRoot: () -> Unit, ) { composableWithSlideTransitions { - AddSendScreen(onNavigateBack = onNavigateBack) + AddSendScreen( + onNavigateBack = onNavigateBack, + onNavigateUpToRoot = onNavigateUpToRoot, + ) } } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendScreen.kt b/app/src/main/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendScreen.kt index e961c97f83..d364a457a5 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendScreen.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendScreen.kt @@ -60,6 +60,7 @@ fun AddSendScreen( intentManager: IntentManager = LocalIntentManager.current, permissionsManager: PermissionsManager = LocalPermissionsManager.current, onNavigateBack: () -> Unit, + onNavigateUpToRoot: () -> Unit, ) { val state by viewModel.stateFlow.collectAsStateWithLifecycle() val addSendHandlers = remember(viewModel) { AddSendHandlers.create(viewModel) } @@ -84,6 +85,8 @@ fun AddSendScreen( is AddSendEvent.NavigateBack -> onNavigateBack() + is AddSendEvent.NavigateToRoot -> onNavigateUpToRoot() + is AddSendEvent.ShowChooserSheet -> { fileChooserLauncher.launch( intentManager.createFileChooserIntent(event.withCameraOption), diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendViewModel.kt index 720cf477fb..5c6a516ed2 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendViewModel.kt @@ -259,7 +259,7 @@ class AddSendViewModel @Inject constructor( is DeleteSendResult.Success -> { mutableStateFlow.update { it.copy(dialogState = null) } - navigateBack() + navigateBack(isDeleted = true) sendEvent(AddSendEvent.ShowToast(message = R.string.send_deleted.asText())) } } @@ -628,11 +628,15 @@ class AddSendViewModel @Inject constructor( } } - private fun navigateBack() { + private fun navigateBack(isDeleted: Boolean = false) { specialCircumstanceManager.specialCircumstance = null sendEvent( event = if (state.shouldFinishOnComplete) { AddSendEvent.ExitApp + } else if (isDeleted) { + // We need to make sure we don't land on the View Send screen + // since it has now been deleted. + AddSendEvent.NavigateToRoot } else { AddSendEvent.NavigateBack }, @@ -867,6 +871,11 @@ sealed class AddSendEvent { */ data object NavigateBack : AddSendEvent() + /** + * Navigate up to the root. + */ + data object NavigateToRoot : AddSendEvent() + /** * Show file chooser sheet. */ diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendScreenTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendScreenTest.kt index 29fe87a281..ce1eb9d3e1 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendScreenTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendScreenTest.kt @@ -41,6 +41,7 @@ import io.mockk.verify import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.test.runTest +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import java.time.ZonedDateTime @@ -49,6 +50,7 @@ import java.time.ZonedDateTime class AddSendScreenTest : BaseComposeTest() { private var onNavigateBackCalled = false + private var onNavigateUpToRootCalled = false private val exitManager: ExitManager = mockk(relaxed = true) { every { exitApplication() } just runs @@ -74,6 +76,7 @@ class AddSendScreenTest : BaseComposeTest() { AddSendScreen( viewModel = viewModel, onNavigateBack = { onNavigateBackCalled = true }, + onNavigateUpToRoot = { onNavigateUpToRootCalled = true }, ) } } @@ -81,7 +84,13 @@ class AddSendScreenTest : BaseComposeTest() { @Test fun `on NavigateBack should call onNavigateBack`() { mutableEventFlow.tryEmit(AddSendEvent.NavigateBack) - assert(onNavigateBackCalled) + assertTrue(onNavigateBackCalled) + } + + @Test + fun `on NavigateToRoot should call onNavigateUpToRoot`() { + mutableEventFlow.tryEmit(AddSendEvent.NavigateToRoot) + assertTrue(onNavigateUpToRootCalled) } @Test diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendViewModelTest.kt index e444e5cb06..adbcd190d2 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendViewModelTest.kt @@ -667,7 +667,7 @@ class AddSendViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { viewModel.trySendAction(AddSendAction.DeleteClick) - assertEquals(AddSendEvent.NavigateBack, awaitItem()) + assertEquals(AddSendEvent.NavigateToRoot, awaitItem()) assertEquals(AddSendEvent.ShowToast(R.string.send_deleted.asText()), awaitItem()) } }