Fix backup restoring
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user