Fix backup restoring

This commit is contained in:
Koitharu
2023-07-18 12:28:02 +03:00
parent f86d873361
commit 967e8df7c9
9 changed files with 43 additions and 23 deletions

View File

@@ -73,7 +73,12 @@ class BackupRepository @Inject constructor(
fun dumpSettings(): BackupEntry {
val entry = BackupEntry(BackupEntry.SETTINGS, JSONArray())
val json = JsonSerializer(settings.getAllValues()).toJson()
val settingsDump = settings.getAllValues().toMutableMap()
settingsDump.remove(AppSettings.KEY_APP_PASSWORD)
settingsDump.remove(AppSettings.KEY_PROXY_PASSWORD)
settingsDump.remove(AppSettings.KEY_PROXY_LOGIN)
settingsDump.remove(AppSettings.KEY_INCOGNITO_MODE)
val json = JsonSerializer(settingsDump).toJson()
entry.data.put(json)
return entry
}
@@ -143,7 +148,7 @@ class BackupRepository @Inject constructor(
val result = CompositeResult()
for (item in entry.data.JSONIterator()) {
result += runCatchingCancellable {
settings.restoreValuesFromMap(JsonDeserializer(item).toMap())
settings.upsertAll(JsonDeserializer(item).toMap())
}
}
return result

View File

@@ -11,8 +11,8 @@ class BackupZipInput(val file: File) : Closeable {
private val zipFile = ZipFile(file)
suspend fun getEntry(name: String): BackupEntry = runInterruptible(Dispatchers.IO) {
val entry = zipFile.getEntry(name)
suspend fun getEntry(name: String): BackupEntry? = runInterruptible(Dispatchers.IO) {
val entry = zipFile.getEntry(name) ?: return@runInterruptible null
val json = zipFile.getInputStream(entry).use {
JSONArray(it.bufferedReader().readText())
}
@@ -22,4 +22,4 @@ class BackupZipInput(val file: File) : Closeable {
override fun close() {
zipFile.close()
}
}
}

View File

@@ -11,6 +11,9 @@ class CompositeResult {
val failures: List<Throwable>
get() = errors.filterNotNull()
val isEmpty: Boolean
get() = errors.isEmpty() && successCount == 0
val isAllSuccess: Boolean
get() = errors.none { it != null }
@@ -36,4 +39,4 @@ class CompositeResult {
result.errors.addAll(other.errors)
return result
}
}
}

View File

@@ -384,7 +384,7 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
fun getAllValues(): Map<String, *> = prefs.all
fun restoreValuesFromMap(m: Map<String, *>) {
fun upsertAll(m: Map<String, *>) {
prefs.edit {
m.forEach { e ->
when (e.value) {

View File

@@ -1,6 +1,5 @@
package org.koitharu.kotatsu.core.util.ext
import android.content.SharedPreferences
import androidx.annotation.FloatRange
import org.koitharu.kotatsu.parsers.util.levenshteinDistance
import java.util.UUID
@@ -41,9 +40,3 @@ fun CharSequence.sanitize(): CharSequence {
}
fun Char.isReplacement() = this in '\uFFF0'..'\uFFFF'
fun <E : Enum<E>> String.getEnumValue(defaultValue: E): E {
return defaultValue.javaClass.enumConstants?.find {
it.name == this
} ?: defaultValue
}

View File

@@ -14,7 +14,11 @@ 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.*
import java.io.File
import java.io.FileDescriptor
import java.io.FileInputStream
import java.io.InputStream
import java.io.OutputStream
class AppBackupAgent : BackupAgent() {
@@ -81,10 +85,10 @@ class AppBackupAgent : BackupAgent() {
val backup = BackupZipInput(tempFile)
try {
runBlocking {
repository.restoreHistory(backup.getEntry(BackupEntry.HISTORY))
repository.restoreCategories(backup.getEntry(BackupEntry.CATEGORIES))
repository.restoreFavourites(backup.getEntry(BackupEntry.FAVOURITES))
repository.restoreSettings(backup.getEntry(BackupEntry.SETTINGS))
backup.getEntry(BackupEntry.HISTORY)?.let { repository.restoreHistory(it) }
backup.getEntry(BackupEntry.CATEGORIES)?.let { repository.restoreCategories(it) }
backup.getEntry(BackupEntry.FAVOURITES)?.let { repository.restoreFavourites(it) }
backup.getEntry(BackupEntry.SETTINGS)?.let { repository.restoreSettings(it) }
}
} finally {
backup.close()

View File

@@ -68,6 +68,11 @@ class RestoreDialogFragment : AlertDialogFragment<DialogProgressBinding>() {
private fun onRestoreDone(result: CompositeResult) {
val builder = MaterialAlertDialogBuilder(context ?: return)
when {
result.isEmpty -> {
builder.setTitle(R.string.data_not_restored)
.setMessage(R.string.data_not_restored_text)
}
result.isAllSuccess -> {
builder.setTitle(R.string.data_restored)
.setMessage(R.string.data_restored_success)

View File

@@ -48,16 +48,24 @@ class RestoreViewModel @Inject constructor(
val result = CompositeResult()
progress.value = 0f
result += repository.restoreHistory(backup.getEntry(BackupEntry.HISTORY))
backup.getEntry(BackupEntry.HISTORY)?.let {
result += repository.restoreHistory(it)
}
progress.value = 0.25f
result += repository.restoreCategories(backup.getEntry(BackupEntry.CATEGORIES))
backup.getEntry(BackupEntry.CATEGORIES)?.let {
result += repository.restoreCategories(it)
}
progress.value = 0.5f
result += repository.restoreFavourites(backup.getEntry(BackupEntry.FAVOURITES))
backup.getEntry(BackupEntry.FAVOURITES)?.let {
result += repository.restoreFavourites(it)
}
progress.value = 0.75f
result += repository.restoreSettings(backup.getEntry(BackupEntry.SETTINGS))
backup.getEntry(BackupEntry.SETTINGS)?.let {
result += repository.restoreSettings(it)
}
progress.value = 1f
onRestoreDone.call(result)

View File

@@ -458,4 +458,6 @@
<string name="color_white">White</string>
<string name="color_black">Black</string>
<string name="background">Background</string>
<string name="data_not_restored">Data was not restored</string>
<string name="data_not_restored_text">Make sure you have selected the correct backup file</string>
</resources>