diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt index 2db43202..c29dbc4c 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt @@ -259,7 +259,8 @@ fun LobstersApp( composable(route = Destinations.DataTransfer.route) { DataTransferScreen( context = context, - dataTransferRepository = viewModel.dataTransferRepository, + importPosts = viewModel::importPosts, + exportPosts = viewModel::exportPosts, snackbarHostState = snackbarHostState, ) } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/datatransfer/DataTransferScreen.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/datatransfer/DataTransferScreen.kt index 50af2d3e..746f4b93 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/datatransfer/DataTransferScreen.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/datatransfer/DataTransferScreen.kt @@ -25,7 +25,8 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.unit.dp -import dev.msfjarvis.claw.android.viewmodel.DataTransferRepository +import java.io.InputStream +import java.io.OutputStream import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -34,14 +35,15 @@ private const val MIME_TYPE = "application/json" @Composable fun DataTransferScreen( context: Context, - dataTransferRepository: DataTransferRepository, + importPosts: suspend (InputStream) -> Unit, + exportPosts: suspend (OutputStream) -> Unit, snackbarHostState: SnackbarHostState, modifier: Modifier = Modifier, ) { val coroutineScope = rememberCoroutineScope() Column(modifier = modifier) { - ImportOption(context, coroutineScope, dataTransferRepository, snackbarHostState) - ExportOption(context, coroutineScope, dataTransferRepository, snackbarHostState) + ImportOption(context, coroutineScope, importPosts, snackbarHostState) + ExportOption(context, coroutineScope, exportPosts, snackbarHostState) } } @@ -49,7 +51,7 @@ fun DataTransferScreen( private fun ImportOption( context: Context, coroutineScope: CoroutineScope, - dataTransferRepository: DataTransferRepository, + importPosts: suspend (InputStream) -> Unit, snackbarHostState: SnackbarHostState, ) { val importAction = @@ -60,7 +62,7 @@ private fun ImportOption( } coroutineScope.launch { context.contentResolver.openInputStream(uri)?.use { stream -> - dataTransferRepository.importPosts(stream) + importPosts(stream) snackbarHostState.showSnackbarDismissing("Successfully imported posts") } } @@ -78,7 +80,7 @@ private fun ImportOption( private fun ExportOption( context: Context, coroutineScope: CoroutineScope, - dataTransferRepository: DataTransferRepository, + exportPosts: suspend (OutputStream) -> Unit, snackbarHostState: SnackbarHostState, ) { val exportAction = @@ -89,7 +91,7 @@ private fun ExportOption( } coroutineScope.launch { context.contentResolver.openOutputStream(uri)?.use { stream -> - dataTransferRepository.exportPosts(stream) + exportPosts(stream) snackbarHostState.showSnackbarDismissing("Successfully exported posts") } } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt index 07a90386..5dff2cd7 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt @@ -21,6 +21,8 @@ import dev.msfjarvis.claw.core.injection.IODispatcher import dev.msfjarvis.claw.database.local.SavedPost import dev.msfjarvis.claw.model.Comment import java.io.IOException +import java.io.InputStream +import java.io.OutputStream import java.net.HttpURLConnection import java.time.LocalDateTime import java.time.Month @@ -42,7 +44,7 @@ constructor( private val savedPostsRepository: SavedPostsRepository, private val commentsRepository: CommentsRepository, private val linkMetadataRepository: LinkMetadataRepository, - val dataTransferRepository: DataTransferRepository, + private val dataTransferRepository: DataTransferRepository, private val pagingSourceFactory: LobstersPagingSource.Factory, @IODispatcher private val ioDispatcher: CoroutineDispatcher, ) : ViewModel() { @@ -124,6 +126,10 @@ constructor( } } + suspend fun importPosts(input: InputStream) = dataTransferRepository.importPosts(input) + + suspend fun exportPosts(output: OutputStream) = dataTransferRepository.exportPosts(output) + /** * Parses a given [String] into a [LocalDateTime]. This method is only intended to be used for * dates in the format returned by the Lobsters API, and is not a general purpose parsing