PM-21631: Update Edit Send Screen to navigate to Vault Unlocked root (#5190)

This commit is contained in:
David Perez
2025-05-14 12:51:56 -05:00
committed by GitHub
parent db956b9b91
commit ea70191429
6 changed files with 38 additions and 6 deletions

View File

@@ -201,7 +201,10 @@ fun NavGraphBuilder.vaultUnlockedGraph(
onNavigateBack = { navController.popBackStack() }, onNavigateBack = { navController.popBackStack() },
) )
addSendDestination(onNavigateBack = { navController.popBackStack() }) addSendDestination(
onNavigateBack = { navController.popBackStack() },
onNavigateUpToRoot = { navController.navigateToVaultUnlockedRoot() },
)
viewSendDestination( viewSendDestination(
onNavigateBack = { navController.popBackStack() }, onNavigateBack = { navController.popBackStack() },
onNavigateToEditSend = { onNavigateToEditSend = {
@@ -249,3 +252,7 @@ fun NavGraphBuilder.vaultUnlockedGraph(
) )
} }
} }
private fun NavController.navigateToVaultUnlockedRoot() {
this.popBackStack(route = VaultUnlockedNavbarRoute, inclusive = false)
}

View File

@@ -60,9 +60,13 @@ private fun SavedStateHandle.toAddSendType(): AddSendType {
*/ */
fun NavGraphBuilder.addSendDestination( fun NavGraphBuilder.addSendDestination(
onNavigateBack: () -> Unit, onNavigateBack: () -> Unit,
onNavigateUpToRoot: () -> Unit,
) { ) {
composableWithSlideTransitions<AddSendRoute> { composableWithSlideTransitions<AddSendRoute> {
AddSendScreen(onNavigateBack = onNavigateBack) AddSendScreen(
onNavigateBack = onNavigateBack,
onNavigateUpToRoot = onNavigateUpToRoot,
)
} }
} }

View File

@@ -60,6 +60,7 @@ fun AddSendScreen(
intentManager: IntentManager = LocalIntentManager.current, intentManager: IntentManager = LocalIntentManager.current,
permissionsManager: PermissionsManager = LocalPermissionsManager.current, permissionsManager: PermissionsManager = LocalPermissionsManager.current,
onNavigateBack: () -> Unit, onNavigateBack: () -> Unit,
onNavigateUpToRoot: () -> Unit,
) { ) {
val state by viewModel.stateFlow.collectAsStateWithLifecycle() val state by viewModel.stateFlow.collectAsStateWithLifecycle()
val addSendHandlers = remember(viewModel) { AddSendHandlers.create(viewModel) } val addSendHandlers = remember(viewModel) { AddSendHandlers.create(viewModel) }
@@ -84,6 +85,8 @@ fun AddSendScreen(
is AddSendEvent.NavigateBack -> onNavigateBack() is AddSendEvent.NavigateBack -> onNavigateBack()
is AddSendEvent.NavigateToRoot -> onNavigateUpToRoot()
is AddSendEvent.ShowChooserSheet -> { is AddSendEvent.ShowChooserSheet -> {
fileChooserLauncher.launch( fileChooserLauncher.launch(
intentManager.createFileChooserIntent(event.withCameraOption), intentManager.createFileChooserIntent(event.withCameraOption),

View File

@@ -259,7 +259,7 @@ class AddSendViewModel @Inject constructor(
is DeleteSendResult.Success -> { is DeleteSendResult.Success -> {
mutableStateFlow.update { it.copy(dialogState = null) } mutableStateFlow.update { it.copy(dialogState = null) }
navigateBack() navigateBack(isDeleted = true)
sendEvent(AddSendEvent.ShowToast(message = R.string.send_deleted.asText())) 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 specialCircumstanceManager.specialCircumstance = null
sendEvent( sendEvent(
event = if (state.shouldFinishOnComplete) { event = if (state.shouldFinishOnComplete) {
AddSendEvent.ExitApp 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 { } else {
AddSendEvent.NavigateBack AddSendEvent.NavigateBack
}, },
@@ -867,6 +871,11 @@ sealed class AddSendEvent {
*/ */
data object NavigateBack : AddSendEvent() data object NavigateBack : AddSendEvent()
/**
* Navigate up to the root.
*/
data object NavigateToRoot : AddSendEvent()
/** /**
* Show file chooser sheet. * Show file chooser sheet.
*/ */

View File

@@ -41,6 +41,7 @@ import io.mockk.verify
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Assert.assertTrue
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import java.time.ZonedDateTime import java.time.ZonedDateTime
@@ -49,6 +50,7 @@ import java.time.ZonedDateTime
class AddSendScreenTest : BaseComposeTest() { class AddSendScreenTest : BaseComposeTest() {
private var onNavigateBackCalled = false private var onNavigateBackCalled = false
private var onNavigateUpToRootCalled = false
private val exitManager: ExitManager = mockk(relaxed = true) { private val exitManager: ExitManager = mockk(relaxed = true) {
every { exitApplication() } just runs every { exitApplication() } just runs
@@ -74,6 +76,7 @@ class AddSendScreenTest : BaseComposeTest() {
AddSendScreen( AddSendScreen(
viewModel = viewModel, viewModel = viewModel,
onNavigateBack = { onNavigateBackCalled = true }, onNavigateBack = { onNavigateBackCalled = true },
onNavigateUpToRoot = { onNavigateUpToRootCalled = true },
) )
} }
} }
@@ -81,7 +84,13 @@ class AddSendScreenTest : BaseComposeTest() {
@Test @Test
fun `on NavigateBack should call onNavigateBack`() { fun `on NavigateBack should call onNavigateBack`() {
mutableEventFlow.tryEmit(AddSendEvent.NavigateBack) mutableEventFlow.tryEmit(AddSendEvent.NavigateBack)
assert(onNavigateBackCalled) assertTrue(onNavigateBackCalled)
}
@Test
fun `on NavigateToRoot should call onNavigateUpToRoot`() {
mutableEventFlow.tryEmit(AddSendEvent.NavigateToRoot)
assertTrue(onNavigateUpToRootCalled)
} }
@Test @Test

View File

@@ -667,7 +667,7 @@ class AddSendViewModelTest : BaseViewModelTest() {
viewModel.eventFlow.test { viewModel.eventFlow.test {
viewModel.trySendAction(AddSendAction.DeleteClick) viewModel.trySendAction(AddSendAction.DeleteClick)
assertEquals(AddSendEvent.NavigateBack, awaitItem()) assertEquals(AddSendEvent.NavigateToRoot, awaitItem())
assertEquals(AddSendEvent.ShowToast(R.string.send_deleted.asText()), awaitItem()) assertEquals(AddSendEvent.ShowToast(R.string.send_deleted.asText()), awaitItem())
} }
} }