From 967e8df7c9a3bcf02cb9e921668a4749fe2ec164 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Tue, 18 Jul 2023 12:28:02 +0300 Subject: [PATCH] Fix backup restoring --- .../kotatsu/core/backup/BackupRepository.kt | 9 +++++++-- .../kotatsu/core/backup/BackupZipInput.kt | 6 +++--- .../kotatsu/core/backup/CompositeResult.kt | 5 ++++- .../koitharu/kotatsu/core/prefs/AppSettings.kt | 2 +- .../org/koitharu/kotatsu/core/util/ext/String.kt | 7 ------- .../kotatsu/settings/backup/AppBackupAgent.kt | 14 +++++++++----- .../settings/backup/RestoreDialogFragment.kt | 5 +++++ .../kotatsu/settings/backup/RestoreViewModel.kt | 16 ++++++++++++---- app/src/main/res/values/strings.xml | 2 ++ 9 files changed, 43 insertions(+), 23 deletions(-) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/BackupRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/BackupRepository.kt index 28589ab9b..fa4893319 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/BackupRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/BackupRepository.kt @@ -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 diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/BackupZipInput.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/BackupZipInput.kt index 25e1d3688..5416836f9 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/BackupZipInput.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/BackupZipInput.kt @@ -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() } -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/CompositeResult.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/CompositeResult.kt index cd12a97fe..9311bb253 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/CompositeResult.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/CompositeResult.kt @@ -11,6 +11,9 @@ class CompositeResult { val failures: List 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 } -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt index 703b9519c..081d3ec0e 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -384,7 +384,7 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { fun getAllValues(): Map = prefs.all - fun restoreValuesFromMap(m: Map) { + fun upsertAll(m: Map) { prefs.edit { m.forEach { e -> when (e.value) { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/String.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/String.kt index d4acd2c96..b0124dd74 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/String.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/String.kt @@ -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 > String.getEnumValue(defaultValue: E): E { - return defaultValue.javaClass.enumConstants?.find { - it.name == this - } ?: defaultValue -} diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/AppBackupAgent.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/AppBackupAgent.kt index 71c63c342..5214f5b57 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/AppBackupAgent.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/AppBackupAgent.kt @@ -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() diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/RestoreDialogFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/RestoreDialogFragment.kt index b1dbec7ba..441505328 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/RestoreDialogFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/RestoreDialogFragment.kt @@ -68,6 +68,11 @@ class RestoreDialogFragment : AlertDialogFragment() { 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) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/RestoreViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/RestoreViewModel.kt index 10d27814e..13496cc4b 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/RestoreViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/RestoreViewModel.kt @@ -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) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e1f2e9f5f..c7cc01bb8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -458,4 +458,6 @@ White Black Background + Data was not restored + Make sure you have selected the correct backup file