diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/BackupEntry.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/BackupEntry.kt index 7498608c2..116d1fd74 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/BackupEntry.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/BackupEntry.kt @@ -15,5 +15,6 @@ class BackupEntry( const val FAVOURITES = "favourites" const val SETTINGS = "settings" const val BOOKMARKS = "bookmarks" + const val SOURCES = "sources" } } 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 1ced43f5f..2444734b9 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 @@ -101,6 +101,16 @@ class BackupRepository @Inject constructor( return entry } + suspend fun dumpSources(): BackupEntry { + val entry = BackupEntry(BackupEntry.SOURCES, JSONArray()) + val all = db.getSourcesDao().findAll() + for (source in all) { + val json = JsonSerializer(source).toJson() + entry.data.put(json) + } + return entry + } + fun createIndex(): BackupEntry { val entry = BackupEntry(BackupEntry.INDEX, JSONArray()) val json = JSONObject() @@ -184,6 +194,17 @@ class BackupRepository @Inject constructor( return result } + suspend fun restoreSources(entry: BackupEntry): CompositeResult { + val result = CompositeResult() + for (item in entry.data.JSONIterator()) { + val source = JsonDeserializer(item).toMangaSourceEntity() + result += runCatchingCancellable { + db.getSourcesDao().upsert(source) + } + } + return result + } + fun restoreSettings(entry: BackupEntry): CompositeResult { val result = CompositeResult() for (item in entry.data.JSONIterator()) { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/JsonDeserializer.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/JsonDeserializer.kt index 3a0789048..60462178e 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/JsonDeserializer.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/JsonDeserializer.kt @@ -3,6 +3,7 @@ package org.koitharu.kotatsu.core.backup import org.json.JSONObject import org.koitharu.kotatsu.bookmarks.data.BookmarkEntity import org.koitharu.kotatsu.core.db.entity.MangaEntity +import org.koitharu.kotatsu.core.db.entity.MangaSourceEntity import org.koitharu.kotatsu.core.db.entity.TagEntity import org.koitharu.kotatsu.favourites.data.FavouriteCategoryEntity import org.koitharu.kotatsu.favourites.data.FavouriteEntity @@ -78,6 +79,12 @@ class JsonDeserializer(private val json: JSONObject) { percent = json.getDouble("percent").toFloat(), ) + fun toMangaSourceEntity() = MangaSourceEntity( + source = json.getString("source"), + isEnabled = json.getBoolean("enabled"), + sortKey = json.getInt("sort_key"), + ) + fun toMap(): Map { val map = mutableMapOf() val keys = json.keys() diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/JsonSerializer.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/JsonSerializer.kt index 34a406a3b..208f4ed32 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/JsonSerializer.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/JsonSerializer.kt @@ -3,6 +3,7 @@ package org.koitharu.kotatsu.core.backup import org.json.JSONObject import org.koitharu.kotatsu.bookmarks.data.BookmarkEntity import org.koitharu.kotatsu.core.db.entity.MangaEntity +import org.koitharu.kotatsu.core.db.entity.MangaSourceEntity import org.koitharu.kotatsu.core.db.entity.TagEntity import org.koitharu.kotatsu.favourites.data.FavouriteCategoryEntity import org.koitharu.kotatsu.favourites.data.FavouriteEntity @@ -82,6 +83,14 @@ class JsonSerializer private constructor(private val json: JSONObject) { }, ) + constructor(e: MangaSourceEntity) : this( + JSONObject().apply { + put("source", e.source) + put("enabled", e.isEnabled) + put("sort_key", e.sortKey) + }, + ) + constructor(m: Map) : this( JSONObject(m), ) 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 3822f0da3..9f24c2a75 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 @@ -69,6 +69,7 @@ class AppBackupAgent : BackupAgent() { backup.put(repository.dumpCategories()) backup.put(repository.dumpFavourites()) backup.put(repository.dumpBookmarks()) + backup.put(repository.dumpSources()) backup.put(repository.dumpSettings()) backup.finish() backup.file @@ -90,6 +91,7 @@ class AppBackupAgent : BackupAgent() { backup.getEntry(BackupEntry.CATEGORIES)?.let { repository.restoreCategories(it) } backup.getEntry(BackupEntry.FAVOURITES)?.let { repository.restoreFavourites(it) } backup.getEntry(BackupEntry.BOOKMARKS)?.let { repository.restoreBookmarks(it) } + backup.getEntry(BackupEntry.SOURCES)?.let { repository.restoreSources(it) } backup.getEntry(BackupEntry.SETTINGS)?.let { repository.restoreSettings(it) } } } finally { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/BackupViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/BackupViewModel.kt index 90933985f..654e1656b 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/BackupViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/BackupViewModel.kt @@ -24,21 +24,25 @@ class BackupViewModel @Inject constructor( init { launchLoadingJob { val file = BackupZipOutput(context).use { backup -> + val step = 1f / 6f backup.put(repository.createIndex()) progress.value = 0f backup.put(repository.dumpHistory()) - progress.value = 0.2f + progress.value += step backup.put(repository.dumpCategories()) - progress.value = 0.4f + progress.value += step backup.put(repository.dumpFavourites()) - progress.value = 0.6f + progress.value += step backup.put(repository.dumpBookmarks()) - progress.value = 0.8f + progress.value += step + backup.put(repository.dumpSources()) + + progress.value += step backup.put(repository.dumpSettings()) backup.finish() diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/PeriodicalBackupWorker.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/PeriodicalBackupWorker.kt index 3c7f5ced6..224df7b7b 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/PeriodicalBackupWorker.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/PeriodicalBackupWorker.kt @@ -42,6 +42,7 @@ class PeriodicalBackupWorker @AssistedInject constructor( backup.put(repository.dumpCategories()) backup.put(repository.dumpFavourites()) backup.put(repository.dumpBookmarks()) + backup.put(repository.dumpSources()) backup.put(repository.dumpSettings()) backup.finish() backup.file 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 fa0b1279b..85c91cc0e 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 @@ -46,28 +46,34 @@ class RestoreViewModel @Inject constructor( } try { val result = CompositeResult() + val step = 1f/6f progress.value = 0f backup.getEntry(BackupEntry.HISTORY)?.let { result += repository.restoreHistory(it) } - progress.value = 0.2f + progress.value += step backup.getEntry(BackupEntry.CATEGORIES)?.let { result += repository.restoreCategories(it) } - progress.value = 0.4f + progress.value += step backup.getEntry(BackupEntry.FAVOURITES)?.let { result += repository.restoreFavourites(it) } - progress.value = 0.6f + progress.value += step backup.getEntry(BackupEntry.BOOKMARKS)?.let { result += repository.restoreBookmarks(it) } - progress.value = 0.8f + progress.value += step + backup.getEntry(BackupEntry.SOURCES)?.let { + result += repository.restoreSources(it) + } + + progress.value += step backup.getEntry(BackupEntry.SETTINGS)?.let { result += repository.restoreSettings(it) }