Support manga sources in backups
This commit is contained in:
@@ -15,5 +15,6 @@ class BackupEntry(
|
|||||||
const val FAVOURITES = "favourites"
|
const val FAVOURITES = "favourites"
|
||||||
const val SETTINGS = "settings"
|
const val SETTINGS = "settings"
|
||||||
const val BOOKMARKS = "bookmarks"
|
const val BOOKMARKS = "bookmarks"
|
||||||
|
const val SOURCES = "sources"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -101,6 +101,16 @@ class BackupRepository @Inject constructor(
|
|||||||
return entry
|
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 {
|
fun createIndex(): BackupEntry {
|
||||||
val entry = BackupEntry(BackupEntry.INDEX, JSONArray())
|
val entry = BackupEntry(BackupEntry.INDEX, JSONArray())
|
||||||
val json = JSONObject()
|
val json = JSONObject()
|
||||||
@@ -184,6 +194,17 @@ class BackupRepository @Inject constructor(
|
|||||||
return result
|
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 {
|
fun restoreSettings(entry: BackupEntry): CompositeResult {
|
||||||
val result = CompositeResult()
|
val result = CompositeResult()
|
||||||
for (item in entry.data.JSONIterator()) {
|
for (item in entry.data.JSONIterator()) {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package org.koitharu.kotatsu.core.backup
|
|||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
import org.koitharu.kotatsu.bookmarks.data.BookmarkEntity
|
import org.koitharu.kotatsu.bookmarks.data.BookmarkEntity
|
||||||
import org.koitharu.kotatsu.core.db.entity.MangaEntity
|
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.core.db.entity.TagEntity
|
||||||
import org.koitharu.kotatsu.favourites.data.FavouriteCategoryEntity
|
import org.koitharu.kotatsu.favourites.data.FavouriteCategoryEntity
|
||||||
import org.koitharu.kotatsu.favourites.data.FavouriteEntity
|
import org.koitharu.kotatsu.favourites.data.FavouriteEntity
|
||||||
@@ -78,6 +79,12 @@ class JsonDeserializer(private val json: JSONObject) {
|
|||||||
percent = json.getDouble("percent").toFloat(),
|
percent = json.getDouble("percent").toFloat(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
fun toMangaSourceEntity() = MangaSourceEntity(
|
||||||
|
source = json.getString("source"),
|
||||||
|
isEnabled = json.getBoolean("enabled"),
|
||||||
|
sortKey = json.getInt("sort_key"),
|
||||||
|
)
|
||||||
|
|
||||||
fun toMap(): Map<String, Any?> {
|
fun toMap(): Map<String, Any?> {
|
||||||
val map = mutableMapOf<String, Any?>()
|
val map = mutableMapOf<String, Any?>()
|
||||||
val keys = json.keys()
|
val keys = json.keys()
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package org.koitharu.kotatsu.core.backup
|
|||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
import org.koitharu.kotatsu.bookmarks.data.BookmarkEntity
|
import org.koitharu.kotatsu.bookmarks.data.BookmarkEntity
|
||||||
import org.koitharu.kotatsu.core.db.entity.MangaEntity
|
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.core.db.entity.TagEntity
|
||||||
import org.koitharu.kotatsu.favourites.data.FavouriteCategoryEntity
|
import org.koitharu.kotatsu.favourites.data.FavouriteCategoryEntity
|
||||||
import org.koitharu.kotatsu.favourites.data.FavouriteEntity
|
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<String, *>) : this(
|
constructor(m: Map<String, *>) : this(
|
||||||
JSONObject(m),
|
JSONObject(m),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ class AppBackupAgent : BackupAgent() {
|
|||||||
backup.put(repository.dumpCategories())
|
backup.put(repository.dumpCategories())
|
||||||
backup.put(repository.dumpFavourites())
|
backup.put(repository.dumpFavourites())
|
||||||
backup.put(repository.dumpBookmarks())
|
backup.put(repository.dumpBookmarks())
|
||||||
|
backup.put(repository.dumpSources())
|
||||||
backup.put(repository.dumpSettings())
|
backup.put(repository.dumpSettings())
|
||||||
backup.finish()
|
backup.finish()
|
||||||
backup.file
|
backup.file
|
||||||
@@ -90,6 +91,7 @@ class AppBackupAgent : BackupAgent() {
|
|||||||
backup.getEntry(BackupEntry.CATEGORIES)?.let { repository.restoreCategories(it) }
|
backup.getEntry(BackupEntry.CATEGORIES)?.let { repository.restoreCategories(it) }
|
||||||
backup.getEntry(BackupEntry.FAVOURITES)?.let { repository.restoreFavourites(it) }
|
backup.getEntry(BackupEntry.FAVOURITES)?.let { repository.restoreFavourites(it) }
|
||||||
backup.getEntry(BackupEntry.BOOKMARKS)?.let { repository.restoreBookmarks(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) }
|
backup.getEntry(BackupEntry.SETTINGS)?.let { repository.restoreSettings(it) }
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
@@ -24,21 +24,25 @@ class BackupViewModel @Inject constructor(
|
|||||||
init {
|
init {
|
||||||
launchLoadingJob {
|
launchLoadingJob {
|
||||||
val file = BackupZipOutput(context).use { backup ->
|
val file = BackupZipOutput(context).use { backup ->
|
||||||
|
val step = 1f / 6f
|
||||||
backup.put(repository.createIndex())
|
backup.put(repository.createIndex())
|
||||||
|
|
||||||
progress.value = 0f
|
progress.value = 0f
|
||||||
backup.put(repository.dumpHistory())
|
backup.put(repository.dumpHistory())
|
||||||
|
|
||||||
progress.value = 0.2f
|
progress.value += step
|
||||||
backup.put(repository.dumpCategories())
|
backup.put(repository.dumpCategories())
|
||||||
|
|
||||||
progress.value = 0.4f
|
progress.value += step
|
||||||
backup.put(repository.dumpFavourites())
|
backup.put(repository.dumpFavourites())
|
||||||
|
|
||||||
progress.value = 0.6f
|
progress.value += step
|
||||||
backup.put(repository.dumpBookmarks())
|
backup.put(repository.dumpBookmarks())
|
||||||
|
|
||||||
progress.value = 0.8f
|
progress.value += step
|
||||||
|
backup.put(repository.dumpSources())
|
||||||
|
|
||||||
|
progress.value += step
|
||||||
backup.put(repository.dumpSettings())
|
backup.put(repository.dumpSettings())
|
||||||
|
|
||||||
backup.finish()
|
backup.finish()
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ class PeriodicalBackupWorker @AssistedInject constructor(
|
|||||||
backup.put(repository.dumpCategories())
|
backup.put(repository.dumpCategories())
|
||||||
backup.put(repository.dumpFavourites())
|
backup.put(repository.dumpFavourites())
|
||||||
backup.put(repository.dumpBookmarks())
|
backup.put(repository.dumpBookmarks())
|
||||||
|
backup.put(repository.dumpSources())
|
||||||
backup.put(repository.dumpSettings())
|
backup.put(repository.dumpSettings())
|
||||||
backup.finish()
|
backup.finish()
|
||||||
backup.file
|
backup.file
|
||||||
|
|||||||
@@ -46,28 +46,34 @@ class RestoreViewModel @Inject constructor(
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
val result = CompositeResult()
|
val result = CompositeResult()
|
||||||
|
val step = 1f/6f
|
||||||
|
|
||||||
progress.value = 0f
|
progress.value = 0f
|
||||||
backup.getEntry(BackupEntry.HISTORY)?.let {
|
backup.getEntry(BackupEntry.HISTORY)?.let {
|
||||||
result += repository.restoreHistory(it)
|
result += repository.restoreHistory(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
progress.value = 0.2f
|
progress.value += step
|
||||||
backup.getEntry(BackupEntry.CATEGORIES)?.let {
|
backup.getEntry(BackupEntry.CATEGORIES)?.let {
|
||||||
result += repository.restoreCategories(it)
|
result += repository.restoreCategories(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
progress.value = 0.4f
|
progress.value += step
|
||||||
backup.getEntry(BackupEntry.FAVOURITES)?.let {
|
backup.getEntry(BackupEntry.FAVOURITES)?.let {
|
||||||
result += repository.restoreFavourites(it)
|
result += repository.restoreFavourites(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
progress.value = 0.6f
|
progress.value += step
|
||||||
backup.getEntry(BackupEntry.BOOKMARKS)?.let {
|
backup.getEntry(BackupEntry.BOOKMARKS)?.let {
|
||||||
result += repository.restoreBookmarks(it)
|
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 {
|
backup.getEntry(BackupEntry.SETTINGS)?.let {
|
||||||
result += repository.restoreSettings(it)
|
result += repository.restoreSettings(it)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user