mirror of
https://github.com/bitwarden/android.git
synced 2026-04-29 20:38:41 -05:00
PM-21631: Update Edit Send Screen to navigate to Vault Unlocked root (#5190)
This commit is contained in:
@@ -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)
|
||||||
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user