add settings backup

This commit is contained in:
javlon
2023-07-15 21:22:16 +02:00
parent 44a2b6db11
commit a8176e6589
11 changed files with 292 additions and 53 deletions

View File

@@ -13,6 +13,7 @@ import org.koitharu.kotatsu.core.backup.BackupRepository
import org.koitharu.kotatsu.core.backup.BackupZipInput
import org.koitharu.kotatsu.core.backup.BackupZipOutput
import org.koitharu.kotatsu.core.db.MangaDatabase
import org.koitharu.kotatsu.core.prefs.AppSettings
import java.io.*
class AppBackupAgent : BackupAgent() {
@@ -31,7 +32,8 @@ class AppBackupAgent : BackupAgent() {
override fun onFullBackup(data: FullBackupDataOutput) {
super.onFullBackup(data)
val file = createBackupFile(this, BackupRepository(MangaDatabase(applicationContext)))
val file =
createBackupFile(this, BackupRepository(MangaDatabase(applicationContext), AppSettings(applicationContext)))
try {
fullBackupFile(file, data)
} finally {
@@ -48,7 +50,7 @@ class AppBackupAgent : BackupAgent() {
mtime: Long
) {
if (destination?.name?.endsWith(".bk.zip") == true) {
restoreBackupFile(data.fileDescriptor, size, BackupRepository(MangaDatabase(applicationContext)))
restoreBackupFile(data.fileDescriptor, size, BackupRepository(MangaDatabase(applicationContext), AppSettings(applicationContext)))
destination.delete()
} else {
super.onRestoreFile(data, size, destination, type, mode, mtime)
@@ -62,6 +64,7 @@ class AppBackupAgent : BackupAgent() {
backup.put(repository.dumpHistory())
backup.put(repository.dumpCategories())
backup.put(repository.dumpFavourites())
backup.put(repository.dumpSettings())
backup.finish()
backup.file
}
@@ -81,6 +84,7 @@ class AppBackupAgent : BackupAgent() {
repository.restoreHistory(backup.getEntry(BackupEntry.HISTORY))
repository.restoreCategories(backup.getEntry(BackupEntry.CATEGORIES))
repository.restoreFavourites(backup.getEntry(BackupEntry.FAVOURITES))
repository.restoreSettings(backup.getEntry(BackupEntry.SETTINGS))
}
} finally {
backup.close()
@@ -102,4 +106,4 @@ class AppBackupAgent : BackupAgent() {
bytes = read(buffer, 0, buffer.size.coerceAtMost(bytesLeft))
}
}
}
}

View File

@@ -29,13 +29,15 @@ class BackupViewModel @Inject constructor(
progress.value = 0f
backup.put(repository.dumpHistory())
progress.value = 0.3f
progress.value = 0.25f
backup.put(repository.dumpCategories())
progress.value = 0.6f
progress.value = 0.5f
backup.put(repository.dumpFavourites())
progress.value = 0.9f
progress.value = 0.75f
backup.put(repository.dumpSettings())
backup.finish()
progress.value = 1f
backup.close()

View File

@@ -5,6 +5,7 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.core.view.postDelayed
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.viewModels
import com.google.android.material.dialog.MaterialAlertDialogBuilder
@@ -12,16 +13,21 @@ import dagger.hilt.android.AndroidEntryPoint
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.backup.CompositeResult
import org.koitharu.kotatsu.core.ui.AlertDialogFragment
import org.koitharu.kotatsu.core.ui.util.ActivityRecreationHandle
import org.koitharu.kotatsu.core.util.ext.getDisplayMessage
import org.koitharu.kotatsu.core.util.ext.observe
import org.koitharu.kotatsu.core.util.ext.observeEvent
import org.koitharu.kotatsu.core.util.ext.withArgs
import org.koitharu.kotatsu.databinding.DialogProgressBinding
import javax.inject.Inject
import kotlin.math.roundToInt
@AndroidEntryPoint
class RestoreDialogFragment : AlertDialogFragment<DialogProgressBinding>() {
@Inject
lateinit var activityRecreationHandle: ActivityRecreationHandle
private val viewModel: RestoreViewModel by viewModels()
override fun onCreateViewBinding(
@@ -67,8 +73,11 @@ class RestoreDialogFragment : AlertDialogFragment<DialogProgressBinding>() {
private fun onRestoreDone(result: CompositeResult) {
val builder = MaterialAlertDialogBuilder(context ?: return)
when {
result.isAllSuccess -> builder.setTitle(R.string.data_restored)
.setMessage(R.string.data_restored_success)
result.isAllSuccess -> {
builder.setTitle(R.string.data_restored)
.setMessage(R.string.data_restored_success)
postRestart()
}
result.isAllFailed -> builder.setTitle(R.string.error)
.setMessage(
@@ -85,6 +94,12 @@ class RestoreDialogFragment : AlertDialogFragment<DialogProgressBinding>() {
dismiss()
}
private fun postRestart() {
view?.postDelayed(400) {
activityRecreationHandle.recreateAll()
}
}
companion object {
const val ARG_FILE = "file"

View File

@@ -50,12 +50,15 @@ class RestoreViewModel @Inject constructor(
progress.value = 0f
result += repository.restoreHistory(backup.getEntry(BackupEntry.HISTORY))
progress.value = 0.3f
progress.value = 0.25f
result += repository.restoreCategories(backup.getEntry(BackupEntry.CATEGORIES))
progress.value = 0.6f
progress.value = 0.5f
result += repository.restoreFavourites(backup.getEntry(BackupEntry.FAVOURITES))
progress.value = 0.75f
result += repository.restoreSettings(backup.getEntry(BackupEntry.SETTINGS))
progress.value = 1f
onRestoreDone.call(result)
} finally {