Convert backup helper methods to suspend functions.

This commit is contained in:
Isira Seneviratne 2023-02-03 20:24:00 +05:30
parent d2a6dd5c31
commit a5d6d8d9df
2 changed files with 41 additions and 36 deletions

View File

@ -11,8 +11,6 @@ import com.github.libretube.db.DatabaseHolder.Companion.Database
import com.github.libretube.extensions.TAG import com.github.libretube.extensions.TAG
import com.github.libretube.obj.BackupFile import com.github.libretube.obj.BackupFile
import com.github.libretube.obj.PreferenceItem import com.github.libretube.obj.PreferenceItem
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.json.booleanOrNull import kotlinx.serialization.json.booleanOrNull
import kotlinx.serialization.json.decodeFromStream import kotlinx.serialization.json.decodeFromStream
@ -43,42 +41,38 @@ object BackupHelper {
* Restore data from a [BackupFile] * Restore data from a [BackupFile]
*/ */
@OptIn(ExperimentalSerializationApi::class) @OptIn(ExperimentalSerializationApi::class)
fun restoreAdvancedBackup(context: Context, uri: Uri?) { suspend fun restoreAdvancedBackup(context: Context, uri: Uri) {
val backupFile = uri?.let { val backupFile = context.contentResolver.openInputStream(uri)?.use {
context.contentResolver.openInputStream(it)?.use { inputStream -> JsonHelper.json.decodeFromStream<BackupFile>(it)
JsonHelper.json.decodeFromStream<BackupFile>(inputStream)
}
} ?: return } ?: return
runBlocking(Dispatchers.IO) { Database.watchHistoryDao().insertAll(
Database.watchHistoryDao().insertAll( *backupFile.watchHistory.orEmpty().toTypedArray()
*backupFile.watchHistory.orEmpty().toTypedArray() )
) Database.searchHistoryDao().insertAll(
Database.searchHistoryDao().insertAll( *backupFile.searchHistory.orEmpty().toTypedArray()
*backupFile.searchHistory.orEmpty().toTypedArray() )
) Database.watchPositionDao().insertAll(
Database.watchPositionDao().insertAll( *backupFile.watchPositions.orEmpty().toTypedArray()
*backupFile.watchPositions.orEmpty().toTypedArray() )
) Database.localSubscriptionDao().insertAll(backupFile.localSubscriptions.orEmpty())
Database.localSubscriptionDao().insertAll(backupFile.localSubscriptions.orEmpty()) Database.customInstanceDao().insertAll(
Database.customInstanceDao().insertAll( *backupFile.customInstances.orEmpty().toTypedArray()
*backupFile.customInstances.orEmpty().toTypedArray() )
) Database.playlistBookmarkDao().insertAll(
Database.playlistBookmarkDao().insertAll( *backupFile.playlistBookmarks.orEmpty().toTypedArray()
*backupFile.playlistBookmarks.orEmpty().toTypedArray() )
)
backupFile.localPlaylists.orEmpty().forEach { backupFile.localPlaylists.orEmpty().forEach {
Database.localPlaylistsDao().createPlaylist(it.playlist) Database.localPlaylistsDao().createPlaylist(it.playlist)
val playlistId = Database.localPlaylistsDao().getAll().last().playlist.id val playlistId = Database.localPlaylistsDao().getAll().last().playlist.id
it.videos.forEach { it.videos.forEach {
it.playlistId = playlistId it.playlistId = playlistId
Database.localPlaylistsDao().addPlaylistVideo(it) Database.localPlaylistsDao().addPlaylistVideo(it)
}
} }
restorePreferences(context, backupFile.preferences)
} }
restorePreferences(context, backupFile.preferences)
} }
/** /**

View File

@ -3,6 +3,7 @@ package com.github.libretube.ui.preferences
import android.os.Bundle import android.os.Bundle
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.result.contract.ActivityResultContracts.CreateDocument import androidx.activity.result.contract.ActivityResultContracts.CreateDocument
import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference import androidx.preference.Preference
import com.github.libretube.R import com.github.libretube.R
import com.github.libretube.helpers.BackupHelper import com.github.libretube.helpers.BackupHelper
@ -10,22 +11,32 @@ import com.github.libretube.helpers.ImportHelper
import com.github.libretube.obj.BackupFile import com.github.libretube.obj.BackupFile
import com.github.libretube.ui.base.BasePreferenceFragment import com.github.libretube.ui.base.BasePreferenceFragment
import com.github.libretube.ui.dialogs.BackupDialog import com.github.libretube.ui.dialogs.BackupDialog
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.time.LocalDateTime import java.time.LocalDateTime
import java.time.format.DateTimeFormatter import java.time.format.DateTimeFormatter
class BackupRestoreSettings : BasePreferenceFragment() { class BackupRestoreSettings : BasePreferenceFragment() {
private val backupDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH:mm:ss") private val backupDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH:mm:ss")
private var backupFile = BackupFile()
override val titleResourceId: Int = R.string.backup_restore override val titleResourceId: Int = R.string.backup_restore
// backup and restore database // backup and restore database
private val getBackupFile = registerForActivityResult(ActivityResultContracts.GetContent()) { private val getBackupFile = registerForActivityResult(ActivityResultContracts.GetContent()) {
BackupHelper.restoreAdvancedBackup(requireContext(), it) it?.let {
lifecycleScope.launch(Dispatchers.IO) {
BackupHelper.restoreAdvancedBackup(requireContext(), it)
}
}
} }
private val createBackupFile = registerForActivityResult(CreateDocument(JSON)) { private val createBackupFile = registerForActivityResult(CreateDocument(JSON)) {
BackupHelper.createAdvancedBackup(requireContext(), it, backupFile) it?.let {
lifecycleScope.launch(Dispatchers.IO) {
BackupHelper.createAdvancedBackup(requireContext(), it, backupFile)
}
}
} }
private var backupFile = BackupFile()
/** /**
* result listeners for importing and exporting subscriptions * result listeners for importing and exporting subscriptions