Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import com.x8bit.bitwarden.ui.platform.feature.settings.other.navigateToOther
import com.x8bit.bitwarden.ui.platform.feature.settings.other.otherDestination
import com.x8bit.bitwarden.ui.platform.feature.settings.vault.navigateToVaultSettings
import com.x8bit.bitwarden.ui.platform.feature.settings.vault.vaultSettingsDestination
import com.x8bit.bitwarden.ui.vault.feature.importitems.importItemsDestination
import kotlinx.parcelize.Parcelize
import kotlinx.serialization.Serializable

Expand Down Expand Up @@ -114,6 +115,7 @@ fun NavGraphBuilder.settingsGraph(
onNavigateToFlightRecorder: () -> Unit,
onNavigateToRecordedLogs: () -> Unit,
onNavigateToImportLogins: () -> Unit,
onNavigateToImportItems: () -> Unit,
onNavigateToAboutPrivilegedApps: () -> Unit,
) {
navigation<SettingsGraphRoute>(
Expand Down Expand Up @@ -162,6 +164,11 @@ fun NavGraphBuilder.settingsGraph(
onNavigateToExportVault = onNavigateToExportVault,
onNavigateToFolders = onNavigateToFolders,
onNavigateToImportLogins = onNavigateToImportLogins,
onNavigateToImportItems = onNavigateToImportItems,
)
importItemsDestination(
onNavigateBack = { navController.popBackStack() },
onNavigateToImportLogins = onNavigateToImportLogins,
)
blockAutoFillDestination(onNavigateBack = { navController.popBackStack() })
privilegedAppsListDestination(onNavigateBack = { navController.popBackStack() })
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,15 @@ fun NavGraphBuilder.vaultSettingsDestination(
onNavigateToExportVault: () -> Unit,
onNavigateToFolders: () -> Unit,
onNavigateToImportLogins: () -> Unit,
onNavigateToImportItems: () -> Unit,
) {
composableWithPushTransitions<VaultSettingsRoute> {
VaultSettingsScreen(
onNavigateBack = onNavigateBack,
onNavigateToExportVault = onNavigateToExportVault,
onNavigateToFolders = onNavigateToFolders,
onNavigateToImportLogins = onNavigateToImportLogins,
onNavigateToImportItems = onNavigateToImportItems,
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ fun VaultSettingsScreen(
onNavigateToExportVault: () -> Unit,
onNavigateToFolders: () -> Unit,
onNavigateToImportLogins: () -> Unit,
onNavigateToImportItems: () -> Unit,
viewModel: VaultSettingsViewModel = hiltViewModel(),
) {
val state by viewModel.stateFlow.collectAsStateWithLifecycle()
Expand All @@ -60,6 +61,7 @@ fun VaultSettingsScreen(
VaultSettingsEvent.NavigateToExportVault -> onNavigateToExportVault()
VaultSettingsEvent.NavigateToFolders -> onNavigateToFolders()
is VaultSettingsEvent.NavigateToImportVault -> onNavigateToImportLogins()
is VaultSettingsEvent.NavigateToImportItems -> onNavigateToImportItems()
is VaultSettingsEvent.ShowSnackbar -> snackbarHostState.showSnackbar(event.data)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.x8bit.bitwarden.ui.platform.feature.settings.vault

import androidx.lifecycle.viewModelScope
import com.bitwarden.core.data.manager.model.FlagKey
import com.bitwarden.ui.platform.base.BackgroundEvent
import com.bitwarden.ui.platform.base.BaseViewModel
import com.bitwarden.ui.platform.components.snackbar.model.BitwardenSnackbarData
import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager
import com.x8bit.bitwarden.data.platform.manager.FirstTimeActionManager
import com.x8bit.bitwarden.ui.platform.manager.snackbar.SnackbarRelay
import com.x8bit.bitwarden.ui.platform.manager.snackbar.SnackbarRelayManager
Expand All @@ -22,6 +24,7 @@ import javax.inject.Inject
class VaultSettingsViewModel @Inject constructor(
snackbarRelayManager: SnackbarRelayManager,
private val firstTimeActionManager: FirstTimeActionManager,
private val featureFlagManager: FeatureFlagManager,
) : BaseViewModel<VaultSettingsState, VaultSettingsEvent, VaultSettingsAction>(
initialState = run {
val firstTimeState = firstTimeActionManager.currentOrDefaultUserFirstTimeState
Expand Down Expand Up @@ -106,7 +109,11 @@ class VaultSettingsViewModel @Inject constructor(
}

private fun handleImportItemsClicked() {
sendEvent(VaultSettingsEvent.NavigateToImportVault)
if (featureFlagManager.getFeatureFlag(FlagKey.CredentialExchangeProtocolImport)) {
sendEvent(VaultSettingsEvent.NavigateToImportItems)
} else {
sendEvent(VaultSettingsEvent.NavigateToImportVault)
}
}
}

Expand All @@ -131,6 +138,11 @@ sealed class VaultSettingsEvent {
*/
data object NavigateToImportVault : VaultSettingsEvent()

/**
* Navigate to the import vault URL.
*/
data object NavigateToImportItems : VaultSettingsEvent()

/**
* Navigate to the Export Vault screen.
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
@file:OmitFromCoverage

package com.x8bit.bitwarden.ui.platform.feature.vaultunlockednavbar

import androidx.navigation.NavController
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import com.x8bit.bitwarden.ui.tools.feature.send.navigateToSendGraph
import com.x8bit.bitwarden.ui.tools.feature.send.sendGraph
import com.x8bit.bitwarden.ui.tools.feature.send.viewsend.ViewSendRoute
import com.x8bit.bitwarden.ui.vault.feature.addedit.VaultAddEditArgs
import com.x8bit.bitwarden.ui.vault.feature.importitems.navigateToImportItemsScreen
import com.x8bit.bitwarden.ui.vault.feature.item.VaultItemArgs
import com.x8bit.bitwarden.ui.vault.feature.vault.VaultGraphRoute
import com.x8bit.bitwarden.ui.vault.feature.vault.navigateToVaultGraph
Expand Down Expand Up @@ -265,6 +266,7 @@ private fun VaultUnlockedNavBarScaffold(
onNavigateToSetupUnlockScreen = onNavigateToSetupUnlockScreen,
onNavigateToSetupAutoFillScreen = onNavigateToSetupAutoFillScreen,
onNavigateToImportLogins = onNavigateToImportLogins,
onNavigateToImportItems = { navController.navigateToImportItemsScreen() },
onNavigateToFlightRecorder = onNavigateToFlightRecorder,
onNavigateToRecordedLogs = onNavigateToRecordedLogs,
onNavigateToAboutPrivilegedApps = onNavigateToAboutPrivilegedApps,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,4 @@ enum class SnackbarRelay {
LOGINS_IMPORTED,
SEND_DELETED,
SEND_UPDATED,
VAULT_SYNC_FAILED,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

πŸ‘

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
@file:OmitFromCoverage

package com.x8bit.bitwarden.ui.vault.feature.importitems

import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavOptions
import com.bitwarden.annotation.OmitFromCoverage
import com.bitwarden.ui.platform.base.util.composableWithPushTransitions
import kotlinx.serialization.Serializable

/**
* The type-safe route for the import items screen.
*/
@Serializable
data object ImportItemsRoute

/**
* Helper function to navigate to the import items screen.
*/
fun NavController.navigateToImportItemsScreen(
navOptions: NavOptions? = null,
) {
navigate(route = ImportItemsRoute, navOptions = navOptions)
}

/**
* Add the import items screen to the nav graph.
*/
fun NavGraphBuilder.importItemsDestination(
onNavigateBack: () -> Unit,
onNavigateToImportLogins: () -> Unit,
) {
composableWithPushTransitions<ImportItemsRoute> {
ImportItemsScreen(
onNavigateBack = onNavigateBack,
onNavigateToImportFromComputer = onNavigateToImportLogins,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ import com.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog
import com.bitwarden.ui.platform.components.model.CardStyle
import com.bitwarden.ui.platform.components.row.BitwardenTextRow
import com.bitwarden.ui.platform.components.scaffold.BitwardenScaffold
import com.bitwarden.ui.platform.components.snackbar.BitwardenSnackbarHost
import com.bitwarden.ui.platform.components.snackbar.model.BitwardenSnackbarHostState
import com.bitwarden.ui.platform.components.snackbar.model.rememberBitwardenSnackbarHostState
import com.bitwarden.ui.platform.components.util.rememberVectorPainter
import com.bitwarden.ui.platform.resource.BitwardenDrawable
import com.bitwarden.ui.platform.resource.BitwardenString
Expand All @@ -46,7 +49,6 @@ import kotlinx.coroutines.launch
@Composable
fun ImportItemsScreen(
onNavigateBack: () -> Unit,
onNavigateToVault: () -> Unit,
onNavigateToImportFromComputer: () -> Unit,
viewModel: ImportItemsViewModel = hiltViewModel(),
credentialExchangeImporter: CredentialExchangeImporter =
Expand All @@ -55,11 +57,11 @@ fun ImportItemsScreen(
val state by viewModel.stateFlow.collectAsStateWithLifecycle()
val coroutineScope = rememberCoroutineScope()
val handler = rememberImportItemsHandler(viewModel = viewModel)
val snackbarHostState = rememberBitwardenSnackbarHostState()

EventsEffect(viewModel) { event ->
when (event) {
ImportItemsEvent.NavigateBack -> onNavigateBack()
ImportItemsEvent.NavigateToVault -> onNavigateToVault()
ImportItemsEvent.NavigateToImportFromComputer -> onNavigateToImportFromComputer()
is ImportItemsEvent.ShowRegisteredImportSources -> {
coroutineScope.launch {
Expand All @@ -73,6 +75,17 @@ fun ImportItemsScreen(
)
}
}

is ImportItemsEvent.ShowBasicSnackbar -> {
snackbarHostState.showSnackbar(event.data)
}

is ImportItemsEvent.ShowSyncFailedSnackbar -> {
snackbarHostState.showSnackbar(
snackbarData = event.data,
onActionPerformed = handler.onSyncFailedTryAgainClick,
)
}
}
}

Expand All @@ -85,6 +98,7 @@ fun ImportItemsScreen(
onNavigateBack = handler.onNavigateBack,
onImportFromComputerClick = handler.onImportFromComputerClick,
onImportFromAnotherAppClick = handler.onImportFromAnotherAppClick,
snackbarHostState = snackbarHostState,
)
}

Expand All @@ -95,6 +109,7 @@ private fun ImportItemsScaffold(
onImportFromComputerClick: () -> Unit,
onImportFromAnotherAppClick: () -> Unit,
modifier: Modifier = Modifier,
snackbarHostState: BitwardenSnackbarHostState = rememberBitwardenSnackbarHostState(),
) {
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
BitwardenScaffold(
Expand All @@ -112,6 +127,11 @@ private fun ImportItemsScaffold(
scrollBehavior = scrollBehavior,
)
},
snackbarHost = {
BitwardenSnackbarHost(
bitwardenHostState = snackbarHostState,
)
},
) {
ImportItemsContent(
onImportFromComputerClick = onImportFromComputerClick,
Expand Down
Loading