diff --git a/app/src/main/java/io/legado/app/data/dao/BookDao.kt b/app/src/main/java/io/legado/app/data/dao/BookDao.kt index b0c07339c..5ba798703 100644 --- a/app/src/main/java/io/legado/app/data/dao/BookDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/BookDao.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData import androidx.room.* import io.legado.app.constant.BookType import io.legado.app.data.entities.Book +import io.legado.app.data.entities.BookProgress @Dao interface BookDao { @@ -67,4 +68,10 @@ interface BookDao { @Query("update books set `group` = :newGroupId where `group` = :oldGroupId") fun upGroup(oldGroupId: Int, newGroupId: Int) + + @get:Query("select bookUrl, durChapterIndex, durChapterPos from books") + val allBookProgress: List + + @Query("update books set durChapterIndex = :durChapterIndex, durChapterPos = :durChapterPos where bookUrl = :bookUrl") + fun upBookProgress(bookUrl: String, durChapterIndex: Int, durChapterPos: Int) } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/entities/BookProgress.kt b/app/src/main/java/io/legado/app/data/entities/BookProgress.kt new file mode 100644 index 000000000..ed2d8abdd --- /dev/null +++ b/app/src/main/java/io/legado/app/data/entities/BookProgress.kt @@ -0,0 +1,7 @@ +package io.legado.app.data.entities + +data class BookProgress( + val bookUrl: String, + val durChapterIndex: Int, + var durChapterPos: Int +) \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/storage/SyncBookProgress.kt b/app/src/main/java/io/legado/app/help/storage/SyncBookProgress.kt new file mode 100644 index 000000000..76ff8cb1f --- /dev/null +++ b/app/src/main/java/io/legado/app/help/storage/SyncBookProgress.kt @@ -0,0 +1,41 @@ +package io.legado.app.help.storage + +import io.legado.app.App +import io.legado.app.data.entities.BookProgress +import io.legado.app.lib.webdav.WebDav +import io.legado.app.utils.FileUtils +import io.legado.app.utils.GSON +import io.legado.app.utils.fromJsonArray + +object SyncBookProgress { + private val file = FileUtils.createFileIfNotExist(App.INSTANCE.cacheDir, "bookProgress.json") + private val webDavUrl = WebDavHelp.getWebDavUrl() + "legado/bookProgress.json" + + fun uploadBookProgress() { + val value = App.db.bookDao().allBookProgress + if (value.isNotEmpty()) { + val json = GSON.toJson(value) + file.writeText(json) + if (WebDavHelp.initWebDav()) { + WebDav(WebDavHelp.getWebDavUrl() + "legado").makeAsDir() + WebDav(webDavUrl).upload(file.absolutePath) + } + } + } + + + fun downloadBookProgress() { + WebDav(webDavUrl).downloadTo(file.absolutePath, true) + if (file.exists()) { + val json = file.readText() + GSON.fromJsonArray(json)?.forEach { + App.db.bookDao().upBookProgress( + it.bookUrl, + it.durChapterIndex, + it.durChapterPos + ) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/storage/WebDavHelp.kt b/app/src/main/java/io/legado/app/help/storage/WebDavHelp.kt index a1386f9f7..0b4b97aab 100644 --- a/app/src/main/java/io/legado/app/help/storage/WebDavHelp.kt +++ b/app/src/main/java/io/legado/app/help/storage/WebDavHelp.kt @@ -25,7 +25,7 @@ object WebDavHelp { private const val defaultWebDavUrl = "https://dav.jianguoyun.com/dav/" private val zipFilePath = "${FileUtils.getCachePath()}${File.separator}backup.zip" - private fun getWebDavUrl(): String { + fun getWebDavUrl(): String { var url = App.INSTANCE.getPrefString(PreferKey.webDavUrl) if (url.isNullOrEmpty()) { url = defaultWebDavUrl @@ -34,7 +34,7 @@ object WebDavHelp { return url } - private fun initWebDav(): Boolean { + fun initWebDav(): Boolean { val account = App.INSTANCE.getPrefString(PreferKey.webDavAccount) val password = App.INSTANCE.getPrefString(PreferKey.webDavPassword) if (!account.isNullOrBlank() && !password.isNullOrBlank()) { @@ -82,8 +82,8 @@ object WebDavHelp { private fun restoreWebDav(name: String, success: () -> Unit) { Coroutine.async { getWebDavUrl().let { - val file = WebDav(it + "legado/" + name) - file.downloadTo(zipFilePath, true) + val webDav = WebDav(it + "legado/" + name) + webDav.downloadTo(zipFilePath, true) @Suppress("BlockingMethodInNonBlockingContext") ZipUtils.unzipFile(zipFilePath, Backup.backupPath) Restore.restore(Backup.backupPath)