Fix backup restoring
This commit is contained in:
@@ -73,7 +73,12 @@ class BackupRepository @Inject constructor(
|
|||||||
|
|
||||||
fun dumpSettings(): BackupEntry {
|
fun dumpSettings(): BackupEntry {
|
||||||
val entry = BackupEntry(BackupEntry.SETTINGS, JSONArray())
|
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)
|
entry.data.put(json)
|
||||||
return entry
|
return entry
|
||||||
}
|
}
|
||||||
@@ -143,7 +148,7 @@ class BackupRepository @Inject constructor(
|
|||||||
val result = CompositeResult()
|
val result = CompositeResult()
|
||||||
for (item in entry.data.JSONIterator()) {
|
for (item in entry.data.JSONIterator()) {
|
||||||
result += runCatchingCancellable {
|
result += runCatchingCancellable {
|
||||||
settings.restoreValuesFromMap(JsonDeserializer(item).toMap())
|
settings.upsertAll(JsonDeserializer(item).toMap())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ class BackupZipInput(val file: File) : Closeable {
|
|||||||
|
|
||||||
private val zipFile = ZipFile(file)
|
private val zipFile = ZipFile(file)
|
||||||
|
|
||||||
suspend fun getEntry(name: String): BackupEntry = runInterruptible(Dispatchers.IO) {
|
suspend fun getEntry(name: String): BackupEntry? = runInterruptible(Dispatchers.IO) {
|
||||||
val entry = zipFile.getEntry(name)
|
val entry = zipFile.getEntry(name) ?: return@runInterruptible null
|
||||||
val json = zipFile.getInputStream(entry).use {
|
val json = zipFile.getInputStream(entry).use {
|
||||||
JSONArray(it.bufferedReader().readText())
|
JSONArray(it.bufferedReader().readText())
|
||||||
}
|
}
|
||||||
@@ -22,4 +22,4 @@ class BackupZipInput(val file: File) : Closeable {
|
|||||||
override fun close() {
|
override fun close() {
|
||||||
zipFile.close()
|
zipFile.close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,9 @@ class CompositeResult {
|
|||||||
val failures: List<Throwable>
|
val failures: List<Throwable>
|
||||||
get() = errors.filterNotNull()
|
get() = errors.filterNotNull()
|
||||||
|
|
||||||
|
val isEmpty: Boolean
|
||||||
|
get() = errors.isEmpty() && successCount == 0
|
||||||
|
|
||||||
val isAllSuccess: Boolean
|
val isAllSuccess: Boolean
|
||||||
get() = errors.none { it != null }
|
get() = errors.none { it != null }
|
||||||
|
|
||||||
@@ -36,4 +39,4 @@ class CompositeResult {
|
|||||||
result.errors.addAll(other.errors)
|
result.errors.addAll(other.errors)
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,7 +384,7 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
|
|||||||
|
|
||||||
fun getAllValues(): Map<String, *> = prefs.all
|
fun getAllValues(): Map<String, *> = prefs.all
|
||||||
|
|
||||||
fun restoreValuesFromMap(m: Map<String, *>) {
|
fun upsertAll(m: Map<String, *>) {
|
||||||
prefs.edit {
|
prefs.edit {
|
||||||
m.forEach { e ->
|
m.forEach { e ->
|
||||||
when (e.value) {
|
when (e.value) {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package org.koitharu.kotatsu.core.util.ext
|
package org.koitharu.kotatsu.core.util.ext
|
||||||
|
|
||||||
import android.content.SharedPreferences
|
|
||||||
import androidx.annotation.FloatRange
|
import androidx.annotation.FloatRange
|
||||||
import org.koitharu.kotatsu.parsers.util.levenshteinDistance
|
import org.koitharu.kotatsu.parsers.util.levenshteinDistance
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
@@ -41,9 +40,3 @@ fun CharSequence.sanitize(): CharSequence {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun Char.isReplacement() = this in '\uFFF0'..'\uFFFF'
|
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.backup.BackupZipOutput
|
||||||
import org.koitharu.kotatsu.core.db.MangaDatabase
|
import org.koitharu.kotatsu.core.db.MangaDatabase
|
||||||
import org.koitharu.kotatsu.core.prefs.AppSettings
|
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() {
|
class AppBackupAgent : BackupAgent() {
|
||||||
|
|
||||||
@@ -81,10 +85,10 @@ class AppBackupAgent : BackupAgent() {
|
|||||||
val backup = BackupZipInput(tempFile)
|
val backup = BackupZipInput(tempFile)
|
||||||
try {
|
try {
|
||||||
runBlocking {
|
runBlocking {
|
||||||
repository.restoreHistory(backup.getEntry(BackupEntry.HISTORY))
|
backup.getEntry(BackupEntry.HISTORY)?.let { repository.restoreHistory(it) }
|
||||||
repository.restoreCategories(backup.getEntry(BackupEntry.CATEGORIES))
|
backup.getEntry(BackupEntry.CATEGORIES)?.let { repository.restoreCategories(it) }
|
||||||
repository.restoreFavourites(backup.getEntry(BackupEntry.FAVOURITES))
|
backup.getEntry(BackupEntry.FAVOURITES)?.let { repository.restoreFavourites(it) }
|
||||||
repository.restoreSettings(backup.getEntry(BackupEntry.SETTINGS))
|
backup.getEntry(BackupEntry.SETTINGS)?.let { repository.restoreSettings(it) }
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
backup.close()
|
backup.close()
|
||||||
|
|||||||
@@ -68,6 +68,11 @@ class RestoreDialogFragment : AlertDialogFragment<DialogProgressBinding>() {
|
|||||||
private fun onRestoreDone(result: CompositeResult) {
|
private fun onRestoreDone(result: CompositeResult) {
|
||||||
val builder = MaterialAlertDialogBuilder(context ?: return)
|
val builder = MaterialAlertDialogBuilder(context ?: return)
|
||||||
when {
|
when {
|
||||||
|
result.isEmpty -> {
|
||||||
|
builder.setTitle(R.string.data_not_restored)
|
||||||
|
.setMessage(R.string.data_not_restored_text)
|
||||||
|
}
|
||||||
|
|
||||||
result.isAllSuccess -> {
|
result.isAllSuccess -> {
|
||||||
builder.setTitle(R.string.data_restored)
|
builder.setTitle(R.string.data_restored)
|
||||||
.setMessage(R.string.data_restored_success)
|
.setMessage(R.string.data_restored_success)
|
||||||
|
|||||||
@@ -48,16 +48,24 @@ class RestoreViewModel @Inject constructor(
|
|||||||
val result = CompositeResult()
|
val result = CompositeResult()
|
||||||
|
|
||||||
progress.value = 0f
|
progress.value = 0f
|
||||||
result += repository.restoreHistory(backup.getEntry(BackupEntry.HISTORY))
|
backup.getEntry(BackupEntry.HISTORY)?.let {
|
||||||
|
result += repository.restoreHistory(it)
|
||||||
|
}
|
||||||
|
|
||||||
progress.value = 0.25f
|
progress.value = 0.25f
|
||||||
result += repository.restoreCategories(backup.getEntry(BackupEntry.CATEGORIES))
|
backup.getEntry(BackupEntry.CATEGORIES)?.let {
|
||||||
|
result += repository.restoreCategories(it)
|
||||||
|
}
|
||||||
|
|
||||||
progress.value = 0.5f
|
progress.value = 0.5f
|
||||||
result += repository.restoreFavourites(backup.getEntry(BackupEntry.FAVOURITES))
|
backup.getEntry(BackupEntry.FAVOURITES)?.let {
|
||||||
|
result += repository.restoreFavourites(it)
|
||||||
|
}
|
||||||
|
|
||||||
progress.value = 0.75f
|
progress.value = 0.75f
|
||||||
result += repository.restoreSettings(backup.getEntry(BackupEntry.SETTINGS))
|
backup.getEntry(BackupEntry.SETTINGS)?.let {
|
||||||
|
result += repository.restoreSettings(it)
|
||||||
|
}
|
||||||
|
|
||||||
progress.value = 1f
|
progress.value = 1f
|
||||||
onRestoreDone.call(result)
|
onRestoreDone.call(result)
|
||||||
|
|||||||
@@ -458,4 +458,6 @@
|
|||||||
<string name="color_white">White</string>
|
<string name="color_white">White</string>
|
||||||
<string name="color_black">Black</string>
|
<string name="color_black">Black</string>
|
||||||
<string name="background">Background</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>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user