mirror of
https://github.com/bitwarden/android.git
synced 2025-02-17 12:30:00 +03:00
Implement navigation for listing sends (#661)
This commit is contained in:
parent
dfbfeda0e7
commit
ff361a7b61
15 changed files with 317 additions and 29 deletions
|
@ -215,6 +215,7 @@ private fun VaultUnlockedNavBarScaffold(
|
|||
},
|
||||
)
|
||||
sendGraph(
|
||||
navController = navController,
|
||||
onNavigateToAddSend = navigateToAddSend,
|
||||
onNavigateToEditSend = onNavigateToEditSend,
|
||||
)
|
||||
|
|
|
@ -4,6 +4,9 @@ import androidx.navigation.NavController
|
|||
import androidx.navigation.NavGraphBuilder
|
||||
import androidx.navigation.NavOptions
|
||||
import androidx.navigation.navigation
|
||||
import com.x8bit.bitwarden.ui.vault.feature.itemlisting.navigateToSendItemListing
|
||||
import com.x8bit.bitwarden.ui.vault.feature.itemlisting.sendItemListingDestination
|
||||
import com.x8bit.bitwarden.ui.vault.model.VaultItemListingType
|
||||
|
||||
const val SEND_GRAPH_ROUTE: String = "send_graph"
|
||||
|
||||
|
@ -11,6 +14,7 @@ const val SEND_GRAPH_ROUTE: String = "send_graph"
|
|||
* Add send destination to the nav graph.
|
||||
*/
|
||||
fun NavGraphBuilder.sendGraph(
|
||||
navController: NavController,
|
||||
onNavigateToAddSend: () -> Unit,
|
||||
onNavigateToEditSend: (sendItemId: String) -> Unit,
|
||||
) {
|
||||
|
@ -21,6 +25,17 @@ fun NavGraphBuilder.sendGraph(
|
|||
sendDestination(
|
||||
onNavigateToAddSend = onNavigateToAddSend,
|
||||
onNavigateToEditSend = onNavigateToEditSend,
|
||||
onNavigateToSendFilesList = {
|
||||
navController.navigateToSendItemListing(VaultItemListingType.SendFile)
|
||||
},
|
||||
onNavigateToSendTextList = {
|
||||
navController.navigateToSendItemListing(VaultItemListingType.SendText)
|
||||
},
|
||||
)
|
||||
sendItemListingDestination(
|
||||
onNavigateBack = { navController.popBackStack() },
|
||||
onNavigateToAddSendItem = onNavigateToAddSend,
|
||||
onNavigateToEditSendItem = onNavigateToEditSend,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,6 +13,8 @@ const val SEND_ROUTE: String = "send"
|
|||
fun NavGraphBuilder.sendDestination(
|
||||
onNavigateToAddSend: () -> Unit,
|
||||
onNavigateToEditSend: (sendItemId: String) -> Unit,
|
||||
onNavigateToSendFilesList: () -> Unit,
|
||||
onNavigateToSendTextList: () -> Unit,
|
||||
) {
|
||||
composableWithRootPushTransitions(
|
||||
route = SEND_ROUTE,
|
||||
|
@ -20,6 +22,8 @@ fun NavGraphBuilder.sendDestination(
|
|||
SendScreen(
|
||||
onNavigateToAddSend = onNavigateToAddSend,
|
||||
onNavigateToEditSend = onNavigateToEditSend,
|
||||
onNavigateToSendFilesList = onNavigateToSendFilesList,
|
||||
onNavigateToSendTextList = onNavigateToSendTextList,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -53,6 +53,8 @@ import kotlinx.collections.immutable.persistentListOf
|
|||
fun SendScreen(
|
||||
onNavigateToAddSend: () -> Unit,
|
||||
onNavigateToEditSend: (sendItemId: String) -> Unit,
|
||||
onNavigateToSendFilesList: () -> Unit,
|
||||
onNavigateToSendTextList: () -> Unit,
|
||||
viewModel: SendViewModel = hiltViewModel(),
|
||||
intentManager: IntentManager = LocalIntentManager.current,
|
||||
) {
|
||||
|
@ -87,6 +89,9 @@ fun SendScreen(
|
|||
.makeText(context, event.message(context.resources), Toast.LENGTH_SHORT)
|
||||
.show()
|
||||
}
|
||||
|
||||
SendEvent.NavigateToFileSends -> onNavigateToSendFilesList()
|
||||
SendEvent.NavigateToTextSends -> onNavigateToSendTextList()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -257,13 +257,11 @@ class SendViewModel @Inject constructor(
|
|||
}
|
||||
|
||||
private fun handleFileTypeClick() {
|
||||
// TODO: Navigate to the file type send list screen (BIT-1388)
|
||||
sendEvent(SendEvent.ShowToast("Not yet implemented".asText()))
|
||||
sendEvent(SendEvent.NavigateToFileSends)
|
||||
}
|
||||
|
||||
private fun handleTextTypeClick() {
|
||||
// TODO: Navigate to the text type send list screen (BIT-1388)
|
||||
sendEvent(SendEvent.ShowToast("Not yet implemented".asText()))
|
||||
sendEvent(SendEvent.NavigateToTextSends)
|
||||
}
|
||||
|
||||
private fun handleDeleteSendClick(action: SendAction.DeleteSendClick) {
|
||||
|
@ -563,6 +561,16 @@ sealed class SendEvent {
|
|||
*/
|
||||
data object NavigateToAboutSend : SendEvent()
|
||||
|
||||
/**
|
||||
* Navigate to the send file list screen.
|
||||
*/
|
||||
data object NavigateToFileSends : SendEvent()
|
||||
|
||||
/**
|
||||
* Navigate to the send text screen.
|
||||
*/
|
||||
data object NavigateToTextSends : SendEvent()
|
||||
|
||||
/**
|
||||
* Show a share sheet with the given content.
|
||||
*/
|
||||
|
|
|
@ -16,6 +16,8 @@ private const val FOLDER: String = "folder"
|
|||
private const val IDENTITY: String = "identity"
|
||||
private const val LOGIN: String = "login"
|
||||
private const val SECURE_NOTE: String = "secure_note"
|
||||
private const val SEND_FILE: String = "send_file"
|
||||
private const val SEND_TEXT: String = "send_text"
|
||||
private const val TRASH: String = "trash"
|
||||
private const val VAULT_ITEM_LISTING_PREFIX: String = "vault_item_listing"
|
||||
private const val VAULT_ITEM_LISTING_TYPE: String = "vault_item_listing_type"
|
||||
|
@ -23,6 +25,10 @@ private const val ID: String = "id"
|
|||
private const val VAULT_ITEM_LISTING_ROUTE: String =
|
||||
"$VAULT_ITEM_LISTING_PREFIX/{$VAULT_ITEM_LISTING_TYPE}" +
|
||||
"?$ID={$ID}"
|
||||
private const val SEND_ITEM_LISTING_PREFIX: String = "send_item_listing"
|
||||
private const val SEND_ITEM_LISTING_ROUTE: String =
|
||||
"$SEND_ITEM_LISTING_PREFIX/{$VAULT_ITEM_LISTING_TYPE}" +
|
||||
"?$ID={$ID}"
|
||||
|
||||
/**
|
||||
* Class to retrieve vault item listing arguments from the [SavedStateHandle].
|
||||
|
@ -49,8 +55,48 @@ fun NavGraphBuilder.vaultItemListingDestination(
|
|||
onNavigateToVaultItemScreen: (id: String) -> Unit,
|
||||
onNavigateToVaultAddItemScreen: () -> Unit,
|
||||
) {
|
||||
composableWithPushTransitions(
|
||||
internalVaultItemListingDestination(
|
||||
route = VAULT_ITEM_LISTING_ROUTE,
|
||||
onNavigateBack = onNavigateBack,
|
||||
onNavigateToAddSendItem = { },
|
||||
onNavigateToEditSendItem = { },
|
||||
onNavigateToVaultAddItemScreen = onNavigateToVaultAddItemScreen,
|
||||
onNavigateToVaultItemScreen = onNavigateToVaultItemScreen,
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the [VaultItemListingScreen] to the nav graph.
|
||||
*/
|
||||
fun NavGraphBuilder.sendItemListingDestination(
|
||||
onNavigateBack: () -> Unit,
|
||||
onNavigateToAddSendItem: () -> Unit,
|
||||
onNavigateToEditSendItem: (sendId: String) -> Unit,
|
||||
) {
|
||||
internalVaultItemListingDestination(
|
||||
route = SEND_ITEM_LISTING_ROUTE,
|
||||
onNavigateBack = onNavigateBack,
|
||||
onNavigateToAddSendItem = onNavigateToAddSendItem,
|
||||
onNavigateToEditSendItem = onNavigateToEditSendItem,
|
||||
onNavigateToVaultAddItemScreen = { },
|
||||
onNavigateToVaultItemScreen = { },
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the [VaultItemListingScreen] to the nav graph.
|
||||
*/
|
||||
@Suppress("LongParameterList")
|
||||
private fun NavGraphBuilder.internalVaultItemListingDestination(
|
||||
route: String,
|
||||
onNavigateBack: () -> Unit,
|
||||
onNavigateToVaultItemScreen: (id: String) -> Unit,
|
||||
onNavigateToVaultAddItemScreen: () -> Unit,
|
||||
onNavigateToAddSendItem: () -> Unit,
|
||||
onNavigateToEditSendItem: (sendId: String) -> Unit,
|
||||
) {
|
||||
composableWithPushTransitions(
|
||||
route = route,
|
||||
arguments = listOf(
|
||||
navArgument(
|
||||
name = VAULT_ITEM_LISTING_TYPE,
|
||||
|
@ -69,12 +115,14 @@ fun NavGraphBuilder.vaultItemListingDestination(
|
|||
onNavigateBack = onNavigateBack,
|
||||
onNavigateToVaultItem = onNavigateToVaultItemScreen,
|
||||
onNavigateToVaultAddItemScreen = onNavigateToVaultAddItemScreen,
|
||||
onNavigateToAddSendItem = onNavigateToAddSendItem,
|
||||
onNavigateToEditSendItem = onNavigateToEditSendItem,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Navigate to the [VaultItemListingScreen].
|
||||
* Navigate to the [VaultItemListingScreen] for vault.
|
||||
*/
|
||||
fun NavController.navigateToVaultItemListing(
|
||||
vaultItemListingType: VaultItemListingType,
|
||||
|
@ -87,6 +135,20 @@ fun NavController.navigateToVaultItemListing(
|
|||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Navigate to the [VaultItemListingScreen] for sends.
|
||||
*/
|
||||
fun NavController.navigateToSendItemListing(
|
||||
vaultItemListingType: VaultItemListingType,
|
||||
navOptions: NavOptions? = null,
|
||||
) {
|
||||
navigate(
|
||||
route = "$SEND_ITEM_LISTING_PREFIX/${vaultItemListingType.toTypeString()}" +
|
||||
"?$ID=${vaultItemListingType.toIdOrNull()}",
|
||||
navOptions = navOptions,
|
||||
)
|
||||
}
|
||||
|
||||
private fun VaultItemListingType.toTypeString(): String {
|
||||
return when (this) {
|
||||
is VaultItemListingType.Card -> CARD
|
||||
|
@ -96,6 +158,8 @@ private fun VaultItemListingType.toTypeString(): String {
|
|||
is VaultItemListingType.Login -> LOGIN
|
||||
is VaultItemListingType.SecureNote -> SECURE_NOTE
|
||||
is VaultItemListingType.Trash -> TRASH
|
||||
is VaultItemListingType.SendFile -> SEND_FILE
|
||||
is VaultItemListingType.SendText -> SEND_TEXT
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -108,6 +172,8 @@ private fun VaultItemListingType.toIdOrNull(): String? =
|
|||
is VaultItemListingType.Login -> null
|
||||
is VaultItemListingType.SecureNote -> null
|
||||
is VaultItemListingType.Trash -> null
|
||||
is VaultItemListingType.SendFile -> null
|
||||
is VaultItemListingType.SendText -> null
|
||||
}
|
||||
|
||||
private fun determineVaultItemListingType(
|
||||
|
@ -122,6 +188,8 @@ private fun determineVaultItemListingType(
|
|||
TRASH -> VaultItemListingType.Trash
|
||||
FOLDER -> VaultItemListingType.Folder(folderId = id)
|
||||
COLLECTION -> VaultItemListingType.Collection(collectionId = requireNotNull(id))
|
||||
SEND_FILE -> VaultItemListingType.SendFile
|
||||
SEND_TEXT -> VaultItemListingType.SendText
|
||||
// This should never occur, vaultItemListingTypeString must match
|
||||
else -> throw IllegalStateException()
|
||||
}
|
||||
|
|
|
@ -35,6 +35,8 @@ fun VaultItemListingScreen(
|
|||
onNavigateBack: () -> Unit,
|
||||
onNavigateToVaultItem: (id: String) -> Unit,
|
||||
onNavigateToVaultAddItemScreen: () -> Unit,
|
||||
onNavigateToAddSendItem: () -> Unit,
|
||||
onNavigateToEditSendItem: (sendId: String) -> Unit,
|
||||
viewModel: VaultItemListingViewModel = hiltViewModel(),
|
||||
) {
|
||||
val context = LocalContext.current
|
||||
|
@ -55,6 +57,14 @@ fun VaultItemListingScreen(
|
|||
onNavigateToVaultAddItemScreen()
|
||||
}
|
||||
|
||||
is VaultItemListingEvent.NavigateToAddSendItem -> {
|
||||
onNavigateToAddSendItem()
|
||||
}
|
||||
|
||||
is VaultItemListingEvent.NavigateToSendItem -> {
|
||||
onNavigateToEditSendItem(event.id)
|
||||
}
|
||||
|
||||
is VaultItemListingEvent.NavigateToVaultSearchScreen -> {
|
||||
// TODO Create vault search screen and navigation implementation BIT-213
|
||||
Toast
|
||||
|
|
|
@ -77,17 +77,29 @@ class VaultItemListingViewModel @Inject constructor(
|
|||
}
|
||||
|
||||
private fun handleAddVaultItemClick() {
|
||||
sendEvent(
|
||||
event = VaultItemListingEvent.NavigateToAddVaultItem,
|
||||
)
|
||||
val event = when (state.itemListingType) {
|
||||
is VaultItemListingState.ItemListingType.Vault -> {
|
||||
VaultItemListingEvent.NavigateToAddVaultItem
|
||||
}
|
||||
|
||||
is VaultItemListingState.ItemListingType.Send -> {
|
||||
VaultItemListingEvent.NavigateToAddSendItem
|
||||
}
|
||||
}
|
||||
sendEvent(event)
|
||||
}
|
||||
|
||||
private fun handleItemClick(action: VaultItemListingsAction.ItemClick) {
|
||||
sendEvent(
|
||||
event = VaultItemListingEvent.NavigateToVaultItem(
|
||||
id = action.id,
|
||||
),
|
||||
)
|
||||
val event = when (state.itemListingType) {
|
||||
is VaultItemListingState.ItemListingType.Vault -> {
|
||||
VaultItemListingEvent.NavigateToVaultItem(id = action.id)
|
||||
}
|
||||
|
||||
is VaultItemListingState.ItemListingType.Send -> {
|
||||
VaultItemListingEvent.NavigateToSendItem(id = action.id)
|
||||
}
|
||||
}
|
||||
sendEvent(event)
|
||||
}
|
||||
|
||||
private fun handleBackClick() {
|
||||
|
@ -180,15 +192,28 @@ class VaultItemListingViewModel @Inject constructor(
|
|||
collectionList = vaultData
|
||||
.collectionViewList,
|
||||
),
|
||||
viewState = vaultData
|
||||
.cipherViewList
|
||||
.filter { cipherView ->
|
||||
cipherView.determineListingPredicate(currentState.itemListingType)
|
||||
viewState = when (val listingType = currentState.itemListingType) {
|
||||
is VaultItemListingState.ItemListingType.Vault -> {
|
||||
vaultData
|
||||
.cipherViewList
|
||||
.filter { cipherView ->
|
||||
cipherView.determineListingPredicate(listingType)
|
||||
}
|
||||
.toViewState(
|
||||
baseIconUrl = state.baseIconUrl,
|
||||
isIconLoadingDisabled = state.isIconLoadingDisabled,
|
||||
)
|
||||
}
|
||||
.toViewState(
|
||||
baseIconUrl = state.baseIconUrl,
|
||||
isIconLoadingDisabled = state.isIconLoadingDisabled,
|
||||
),
|
||||
|
||||
is VaultItemListingState.ItemListingType.Send -> {
|
||||
vaultData
|
||||
.sendViewList
|
||||
.filter { sendView ->
|
||||
sendView.determineListingPredicate(listingType)
|
||||
}
|
||||
.toViewState()
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -344,6 +369,27 @@ data class VaultItemListingState(
|
|||
override val hasFab: Boolean get() = false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents different types of vault item listings.
|
||||
*/
|
||||
sealed class Send : ItemListingType() {
|
||||
/**
|
||||
* A Send File item listing.
|
||||
*/
|
||||
data object SendFile : Send() {
|
||||
override val titleText: Text get() = R.string.file.asText()
|
||||
override val hasFab: Boolean get() = true
|
||||
}
|
||||
|
||||
/**
|
||||
* A Send Text item listing.
|
||||
*/
|
||||
data object SendText : Send() {
|
||||
override val titleText: Text get() = R.string.text.asText()
|
||||
override val hasFab: Boolean get() = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -362,6 +408,18 @@ sealed class VaultItemListingEvent {
|
|||
*/
|
||||
data object NavigateToAddVaultItem : VaultItemListingEvent()
|
||||
|
||||
/**
|
||||
* Navigates to the AddSendItemScreen.
|
||||
*/
|
||||
data object NavigateToAddSendItem : VaultItemListingEvent()
|
||||
|
||||
/**
|
||||
* Navigates to the AddSendScreen.
|
||||
*
|
||||
* @property id the id of the send to navigate to.
|
||||
*/
|
||||
data class NavigateToSendItem(val id: String) : VaultItemListingEvent()
|
||||
|
||||
/**
|
||||
* Navigates to the VaultItemScreen.
|
||||
*
|
||||
|
|
|
@ -5,6 +5,8 @@ import com.bitwarden.core.CipherType
|
|||
import com.bitwarden.core.CipherView
|
||||
import com.bitwarden.core.CollectionView
|
||||
import com.bitwarden.core.FolderView
|
||||
import com.bitwarden.core.SendType
|
||||
import com.bitwarden.core.SendView
|
||||
import com.x8bit.bitwarden.R
|
||||
import com.x8bit.bitwarden.ui.platform.components.model.IconData
|
||||
import com.x8bit.bitwarden.ui.vault.feature.itemlisting.VaultItemListingState
|
||||
|
@ -15,7 +17,7 @@ import com.x8bit.bitwarden.ui.vault.feature.vault.util.toLoginIconData
|
|||
* [VaultItemListingState.ItemListingType].
|
||||
*/
|
||||
fun CipherView.determineListingPredicate(
|
||||
itemListingType: VaultItemListingState.ItemListingType,
|
||||
itemListingType: VaultItemListingState.ItemListingType.Vault,
|
||||
): Boolean =
|
||||
when (itemListingType) {
|
||||
is VaultItemListingState.ItemListingType.Vault.Card -> {
|
||||
|
@ -47,6 +49,23 @@ fun CipherView.determineListingPredicate(
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines a predicate to filter a list of [CipherView] based on the
|
||||
* [VaultItemListingState.ItemListingType].
|
||||
*/
|
||||
fun SendView.determineListingPredicate(
|
||||
itemListingType: VaultItemListingState.ItemListingType.Send,
|
||||
): Boolean =
|
||||
when (itemListingType) {
|
||||
is VaultItemListingState.ItemListingType.Send.SendFile -> {
|
||||
type == SendType.FILE
|
||||
}
|
||||
|
||||
is VaultItemListingState.ItemListingType.Send.SendText -> {
|
||||
type == SendType.TEXT
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Transforms a list of [CipherView] into [VaultItemListingState.ViewState].
|
||||
*/
|
||||
|
@ -65,6 +84,16 @@ fun List<CipherView>.toViewState(
|
|||
VaultItemListingState.ViewState.NoItems
|
||||
}
|
||||
|
||||
/**
|
||||
* Transforms a list of [CipherView] into [VaultItemListingState.ViewState].
|
||||
*/
|
||||
fun List<SendView>.toViewState(): VaultItemListingState.ViewState =
|
||||
if (isNotEmpty()) {
|
||||
VaultItemListingState.ViewState.Content(displayItemList = toDisplayItemList())
|
||||
} else {
|
||||
VaultItemListingState.ViewState.NoItems
|
||||
}
|
||||
|
||||
/** * Updates a [VaultItemListingState.ItemListingType] with the given data if necessary. */
|
||||
fun VaultItemListingState.ItemListingType.updateWithAdditionalDataIfNecessary(
|
||||
folderList: List<FolderView>,
|
||||
|
@ -90,6 +119,8 @@ fun VaultItemListingState.ItemListingType.updateWithAdditionalDataIfNecessary(
|
|||
is VaultItemListingState.ItemListingType.Vault.Login -> this
|
||||
is VaultItemListingState.ItemListingType.Vault.SecureNote -> this
|
||||
is VaultItemListingState.ItemListingType.Vault.Trash -> this
|
||||
is VaultItemListingState.ItemListingType.Send.SendFile -> this
|
||||
is VaultItemListingState.ItemListingType.Send.SendText -> this
|
||||
}
|
||||
|
||||
private fun List<CipherView>.toDisplayItemList(
|
||||
|
@ -103,6 +134,9 @@ private fun List<CipherView>.toDisplayItemList(
|
|||
)
|
||||
}
|
||||
|
||||
private fun List<SendView>.toDisplayItemList(): List<VaultItemListingState.DisplayItem> =
|
||||
this.map { it.toDisplayItem() }
|
||||
|
||||
private fun CipherView.toDisplayItem(
|
||||
baseIconUrl: String,
|
||||
isIconLoadingDisabled: Boolean,
|
||||
|
@ -135,6 +169,19 @@ private fun CipherView.toIconData(
|
|||
}
|
||||
}
|
||||
|
||||
private fun SendView.toDisplayItem(): VaultItemListingState.DisplayItem =
|
||||
VaultItemListingState.DisplayItem(
|
||||
id = id.orEmpty(),
|
||||
title = name,
|
||||
subtitle = deletionDate.toString(),
|
||||
iconData = IconData.Local(
|
||||
iconRes = when (type) {
|
||||
SendType.TEXT -> R.drawable.ic_send_text
|
||||
SendType.FILE -> R.drawable.ic_send_file
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
@Suppress("MagicNumber")
|
||||
private val CipherView.subtitle: String?
|
||||
get() = when (type) {
|
||||
|
|
|
@ -20,4 +20,7 @@ fun VaultItemListingType.toItemListingType(): VaultItemListingState.ItemListingT
|
|||
is VaultItemListingType.Collection -> {
|
||||
VaultItemListingState.ItemListingType.Vault.Collection(collectionId = collectionId)
|
||||
}
|
||||
|
||||
is VaultItemListingType.SendFile -> VaultItemListingState.ItemListingType.Send.SendFile
|
||||
is VaultItemListingType.SendText -> VaultItemListingState.ItemListingType.Send.SendText
|
||||
}
|
||||
|
|
|
@ -43,4 +43,14 @@ sealed class VaultItemListingType {
|
|||
* @param collectionId the ID of the collection.
|
||||
*/
|
||||
data class Collection(val collectionId: String) : VaultItemListingType()
|
||||
|
||||
/**
|
||||
* A Send File listing.
|
||||
*/
|
||||
data object SendFile : VaultItemListingType()
|
||||
|
||||
/**
|
||||
* A Send Text listing.
|
||||
*/
|
||||
data object SendText : VaultItemListingType()
|
||||
}
|
||||
|
|
|
@ -39,6 +39,8 @@ import org.junit.Test
|
|||
class SendScreenTest : BaseComposeTest() {
|
||||
|
||||
private var onNavigateToNewSendCalled = false
|
||||
private var onNavigateToSendFilesListCalled = false
|
||||
private var onNavigateToSendTextListCalled = false
|
||||
private var onNavigateToEditSendId: String? = null
|
||||
|
||||
private val intentManager = mockk<IntentManager> {
|
||||
|
@ -59,6 +61,8 @@ class SendScreenTest : BaseComposeTest() {
|
|||
viewModel = viewModel,
|
||||
onNavigateToAddSend = { onNavigateToNewSendCalled = true },
|
||||
onNavigateToEditSend = { onNavigateToEditSendId = it },
|
||||
onNavigateToSendFilesList = { onNavigateToSendFilesListCalled = true },
|
||||
onNavigateToSendTextList = { onNavigateToSendTextListCalled = true },
|
||||
intentManager = intentManager,
|
||||
)
|
||||
}
|
||||
|
@ -77,6 +81,18 @@ class SendScreenTest : BaseComposeTest() {
|
|||
assertEquals(sendId, onNavigateToEditSendId)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `on NavigateToFileSends should call onNavigateToSendFilesList`() {
|
||||
mutableEventFlow.tryEmit(SendEvent.NavigateToFileSends)
|
||||
assertTrue(onNavigateToSendFilesListCalled)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `on NavigateToTextSends should call onNavigateToSendTextList`() {
|
||||
mutableEventFlow.tryEmit(SendEvent.NavigateToTextSends)
|
||||
assertTrue(onNavigateToSendTextListCalled)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `on NavigateToAboutSend should call launchUri on intentManager`() {
|
||||
mutableEventFlow.tryEmit(SendEvent.NavigateToAboutSend)
|
||||
|
|
|
@ -275,20 +275,20 @@ class SendViewModelTest : BaseViewModelTest() {
|
|||
}
|
||||
|
||||
@Test
|
||||
fun `FileTypeClick should emit ShowToast`() = runTest {
|
||||
fun `FileTypeClick should emit NavigateToFileSends`() = runTest {
|
||||
val viewModel = createViewModel()
|
||||
viewModel.eventFlow.test {
|
||||
viewModel.trySendAction(SendAction.FileTypeClick)
|
||||
assertEquals(SendEvent.ShowToast("Not yet implemented".asText()), awaitItem())
|
||||
assertEquals(SendEvent.NavigateToFileSends, awaitItem())
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `TextTypeClick should emit ShowToast`() = runTest {
|
||||
fun `TextTypeClick should emit NavigateToTextSends`() = runTest {
|
||||
val viewModel = createViewModel()
|
||||
viewModel.eventFlow.test {
|
||||
viewModel.trySendAction(SendAction.TextTypeClick)
|
||||
assertEquals(SendEvent.ShowToast("Not yet implemented".asText()), awaitItem())
|
||||
assertEquals(SendEvent.NavigateToTextSends, awaitItem())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -31,6 +31,8 @@ class VaultItemListingScreenTest : BaseComposeTest() {
|
|||
|
||||
private var onNavigateBackCalled = false
|
||||
private var onNavigateToVaultAddItemScreenCalled = false
|
||||
private var onNavigateToAddSendScreenCalled = false
|
||||
private var onNavigateToEditSendItemId: String? = null
|
||||
private var onNavigateToVaultItemId: String? = null
|
||||
|
||||
private val mutableEventFlow = bufferedMutableSharedFlow<VaultItemListingEvent>()
|
||||
|
@ -48,6 +50,8 @@ class VaultItemListingScreenTest : BaseComposeTest() {
|
|||
onNavigateBack = { onNavigateBackCalled = true },
|
||||
onNavigateToVaultItem = { onNavigateToVaultItemId = it },
|
||||
onNavigateToVaultAddItemScreen = { onNavigateToVaultAddItemScreenCalled = true },
|
||||
onNavigateToAddSendItem = { onNavigateToAddSendScreenCalled = true },
|
||||
onNavigateToEditSendItem = { onNavigateToEditSendItemId = it },
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -108,6 +112,19 @@ class VaultItemListingScreenTest : BaseComposeTest() {
|
|||
assertTrue(onNavigateToVaultAddItemScreenCalled)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `NavigateToAddSendItem should call onNavigateToAddSendScreen`() {
|
||||
mutableEventFlow.tryEmit(VaultItemListingEvent.NavigateToAddSendItem)
|
||||
assertTrue(onNavigateToAddSendScreenCalled)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `NavigateToSendItem event should call onNavigateToEditSendItemId`() {
|
||||
val sendId = "sendId"
|
||||
mutableEventFlow.tryEmit(VaultItemListingEvent.NavigateToSendItem(sendId))
|
||||
assertEquals(sendId, onNavigateToEditSendItemId)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `NavigateToVaultItem event should call NavigateToVaultItemScreen`() {
|
||||
val id = "id4321"
|
||||
|
|
|
@ -84,7 +84,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
|
|||
}
|
||||
|
||||
@Test
|
||||
fun `ItemClick should emit NavigateToVaultItem`() = runTest {
|
||||
fun `ItemClick for vault item should emit NavigateToVaultItem`() = runTest {
|
||||
val viewModel = createVaultItemListingViewModel()
|
||||
viewModel.eventFlow.test {
|
||||
viewModel.actionChannel.trySend(VaultItemListingsAction.ItemClick(id = "mock"))
|
||||
|
@ -93,7 +93,18 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
|
|||
}
|
||||
|
||||
@Test
|
||||
fun `AddVaultItemClick should emit NavigateToAddVaultItem`() = runTest {
|
||||
fun `ItemClick for send item should emit NavigateToSendItem`() = runTest {
|
||||
val viewModel = createVaultItemListingViewModel(
|
||||
createSavedStateHandleWithVaultItemListingType(VaultItemListingType.SendFile),
|
||||
)
|
||||
viewModel.eventFlow.test {
|
||||
viewModel.actionChannel.trySend(VaultItemListingsAction.ItemClick(id = "mock"))
|
||||
assertEquals(VaultItemListingEvent.NavigateToSendItem(id = "mock"), awaitItem())
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `AddVaultItemClick for vault item should emit NavigateToAddVaultItem`() = runTest {
|
||||
val viewModel = createVaultItemListingViewModel()
|
||||
viewModel.eventFlow.test {
|
||||
viewModel.actionChannel.trySend(VaultItemListingsAction.AddVaultItemClick)
|
||||
|
@ -101,6 +112,17 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
|
|||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `AddVaultItemClick for send item should emit NavigateToAddVaultItem`() = runTest {
|
||||
val viewModel = createVaultItemListingViewModel(
|
||||
createSavedStateHandleWithVaultItemListingType(VaultItemListingType.SendText),
|
||||
)
|
||||
viewModel.eventFlow.test {
|
||||
viewModel.actionChannel.trySend(VaultItemListingsAction.AddVaultItemClick)
|
||||
assertEquals(VaultItemListingEvent.NavigateToAddSendItem, awaitItem())
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `RefreshClick should sync`() = runTest {
|
||||
val viewModel = createVaultItemListingViewModel()
|
||||
|
@ -489,6 +511,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
|
|||
is VaultItemListingType.Login -> "login"
|
||||
is VaultItemListingType.SecureNote -> "secure_note"
|
||||
is VaultItemListingType.Trash -> "trash"
|
||||
is VaultItemListingType.SendFile -> "send_file"
|
||||
is VaultItemListingType.SendText -> "send_text"
|
||||
},
|
||||
)
|
||||
set(
|
||||
|
@ -501,6 +525,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
|
|||
is VaultItemListingType.Login -> null
|
||||
is VaultItemListingType.SecureNote -> null
|
||||
is VaultItemListingType.Trash -> null
|
||||
is VaultItemListingType.SendFile -> null
|
||||
is VaultItemListingType.SendText -> null
|
||||
},
|
||||
)
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue