From 19e29abe63deb2e24173a64dfb045d5b6bd0942f Mon Sep 17 00:00:00 2001 From: Gfadebayo Date: Mon, 31 Jul 2023 11:33:05 +0100 Subject: [PATCH] Links added to Backup BackupConst bits increased by 1 in to accommodate Links, which is now the msb. BackupLink serializable class added to BackupManga --- .../settings/screen/SettingsBackupScreen.kt | 1 + .../tachiyomi/data/backup/BackupConst.kt | 20 +++++++++------- .../tachiyomi/data/backup/BackupManager.kt | 24 +++++++++++++++++++ .../tachiyomi/data/backup/BackupRestorer.kt | 15 ++++++++---- .../data/backup/models/BackupLink.kt | 10 ++++++++ .../data/backup/models/BackupManga.kt | 1 + .../sqldelight/tachiyomi/data/manga_link.sq | 12 ++++++++++ i18n/src/main/res/values/strings.xml | 2 ++ 8 files changed, 71 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupLink.kt diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBackupScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBackupScreen.kt index 8b16f3af96..99297f3313 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBackupScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBackupScreen.kt @@ -147,6 +147,7 @@ object SettingsBackupScreen : SearchableSettings { BackupConst.BACKUP_CHAPTER to R.string.chapters, BackupConst.BACKUP_TRACK to R.string.track, BackupConst.BACKUP_HISTORY to R.string.history, + BackupConst.BACKUP_LINK to R.string.links, ) } val flags = remember { choices.keys.toMutableStateList() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupConst.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupConst.kt index add7b3813d..d0480bf1f0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupConst.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupConst.kt @@ -2,13 +2,15 @@ package eu.kanade.tachiyomi.data.backup // Filter options internal object BackupConst { - const val BACKUP_CATEGORY = 0x1 - const val BACKUP_CATEGORY_MASK = 0x1 - const val BACKUP_CHAPTER = 0x2 - const val BACKUP_CHAPTER_MASK = 0x2 - const val BACKUP_HISTORY = 0x4 - const val BACKUP_HISTORY_MASK = 0x4 - const val BACKUP_TRACK = 0x8 - const val BACKUP_TRACK_MASK = 0x8 - const val BACKUP_ALL = 0xF + const val BACKUP_CATEGORY = 0x01 + const val BACKUP_CATEGORY_MASK = 0x01 + const val BACKUP_CHAPTER = 0x02 + const val BACKUP_CHAPTER_MASK = 0x02 + const val BACKUP_HISTORY = 0x04 + const val BACKUP_HISTORY_MASK = 0x04 + const val BACKUP_TRACK = 0x08 + const val BACKUP_TRACK_MASK = 0x08 + const val BACKUP_LINK = 0x10 + const val BACKUP_LINK_MASK = 0x10 + const val BACKUP_ALL = 0x1F } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt index a506e5d52b..1cd83b0093 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt @@ -12,11 +12,14 @@ import eu.kanade.tachiyomi.data.backup.BackupConst.BACKUP_CHAPTER import eu.kanade.tachiyomi.data.backup.BackupConst.BACKUP_CHAPTER_MASK import eu.kanade.tachiyomi.data.backup.BackupConst.BACKUP_HISTORY import eu.kanade.tachiyomi.data.backup.BackupConst.BACKUP_HISTORY_MASK +import eu.kanade.tachiyomi.data.backup.BackupConst.BACKUP_LINK +import eu.kanade.tachiyomi.data.backup.BackupConst.BACKUP_LINK_MASK import eu.kanade.tachiyomi.data.backup.BackupConst.BACKUP_TRACK import eu.kanade.tachiyomi.data.backup.BackupConst.BACKUP_TRACK_MASK import eu.kanade.tachiyomi.data.backup.models.Backup import eu.kanade.tachiyomi.data.backup.models.BackupCategory import eu.kanade.tachiyomi.data.backup.models.BackupHistory +import eu.kanade.tachiyomi.data.backup.models.BackupLink import eu.kanade.tachiyomi.data.backup.models.BackupManga import eu.kanade.tachiyomi.data.backup.models.BackupSerializer import eu.kanade.tachiyomi.data.backup.models.BackupSource @@ -218,6 +221,14 @@ class BackupManager( } } + if (options and BACKUP_LINK_MASK == BACKUP_LINK) { + val backupLinks = handler.awaitList { + manga_linkQueries.linkInfo(manga.id) { tag, position -> BackupLink(tag, position) } + } + + mangaObject.links = backupLinks + } + return mangaObject } @@ -473,6 +484,19 @@ class BackupManager( newChapters[false]?.let { insertChapters(it) } } + internal suspend fun restoreLinks(manga: Manga, links: List) { + handler.await(inTransaction = true) { + manga_linkQueries.delete(listOf(manga.id)) + + for (link in links) { + // Could lead to duplicate positions if a manga with that position already exists + manga_linkQueries.insert(link.tag, manga.id, link.position) + + manga_linkQueries.setDuplicatePositionToLast(link.tag, manga.id, link.position) + } + } + } + /** * Returns manga * diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestorer.kt index 34583f9d17..9ca29a7a2d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestorer.kt @@ -5,6 +5,7 @@ import android.net.Uri import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.backup.models.BackupCategory import eu.kanade.tachiyomi.data.backup.models.BackupHistory +import eu.kanade.tachiyomi.data.backup.models.BackupLink import eu.kanade.tachiyomi.data.backup.models.BackupManga import eu.kanade.tachiyomi.data.backup.models.BackupSource import eu.kanade.tachiyomi.util.BackupUtil @@ -115,18 +116,19 @@ class BackupRestorer( val history = backupManga.brokenHistory.map { BackupHistory(it.url, it.lastRead, it.readDuration) } + backupManga.history val tracks = backupManga.getTrackingImpl() + val links = backupManga.links try { val dbManga = backupManager.getMangaFromDatabase(manga.url, manga.source) if (dbManga == null) { // Manga not in database - restoreExistingManga(manga, chapters, categories, history, tracks, backupCategories) + restoreExistingManga(manga, chapters, categories, history, tracks, backupCategories, links) } else { // Manga in database // Copy information from manga already in database val updatedManga = backupManager.restoreExistingManga(manga, dbManga) // Fetch rest of manga information - restoreNewManga(updatedManga, chapters, categories, history, tracks, backupCategories) + restoreNewManga(updatedManga, chapters, categories, history, tracks, backupCategories, links) } } catch (e: Exception) { val sourceName = sourceMapping[manga.source] ?: manga.source.toString() @@ -151,10 +153,11 @@ class BackupRestorer( history: List, tracks: List, backupCategories: List, + links: List, ) { val fetchedManga = backupManager.restoreNewManga(manga) backupManager.restoreChapters(fetchedManga, chapters) - restoreExtras(fetchedManga, categories, history, tracks, backupCategories) + restoreExtras(fetchedManga, categories, history, tracks, backupCategories, links) } private suspend fun restoreNewManga( @@ -164,15 +167,17 @@ class BackupRestorer( history: List, tracks: List, backupCategories: List, + links: List, ) { backupManager.restoreChapters(backupManga, chapters) - restoreExtras(backupManga, categories, history, tracks, backupCategories) + restoreExtras(backupManga, categories, history, tracks, backupCategories, links) } - private suspend fun restoreExtras(manga: Manga, categories: List, history: List, tracks: List, backupCategories: List) { + private suspend fun restoreExtras(manga: Manga, categories: List, history: List, tracks: List, backupCategories: List, links: List) { backupManager.restoreCategories(manga, categories, backupCategories) backupManager.restoreHistory(history) backupManager.restoreTracking(manga, tracks) + backupManager.restoreLinks(manga, links) } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupLink.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupLink.kt new file mode 100644 index 0000000000..ef3a02df94 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupLink.kt @@ -0,0 +1,10 @@ +package eu.kanade.tachiyomi.data.backup.models + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class BackupLink( + @ProtoNumber(0) val tag: Long, + @ProtoNumber(1) val position: Long, +) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupManga.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupManga.kt index a3d0f4493e..6d9745c9f1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupManga.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupManga.kt @@ -32,6 +32,7 @@ data class BackupManga( @ProtoNumber(16) var chapters: List = emptyList(), @ProtoNumber(17) var categories: List = emptyList(), @ProtoNumber(18) var tracking: List = emptyList(), + @ProtoNumber(19) var links: List = emptyList(), // Bump by 100 for values that are not saved/implemented in 1.x but are used in 0.x @ProtoNumber(100) var favorite: Boolean = true, @ProtoNumber(101) var chapterFlags: Int = 0, diff --git a/data/src/main/sqldelight/tachiyomi/data/manga_link.sq b/data/src/main/sqldelight/tachiyomi/data/manga_link.sq index a9801cf7c7..f2174a9b67 100644 --- a/data/src/main/sqldelight/tachiyomi/data/manga_link.sq +++ b/data/src/main/sqldelight/tachiyomi/data/manga_link.sq @@ -51,3 +51,15 @@ manga_id FROM manga_link WHERE tag IN (SELECT tag FROM manga_link WHERE manga_id = :id)) ORDER BY ml.position; + +linkInfo: +SELECT tag, coalesce(position, 0) AS position +FROM manga_link +WHERE manga_id = ?; + +setDuplicatePositionToLast: +UPDATE manga_link +SET position = (SELECT max(position)+1 FROM manga_link WHERE tag = :tag) +WHERE tag = :tag +AND manga_id != :mangaId +AND position = :position; diff --git a/i18n/src/main/res/values/strings.xml b/i18n/src/main/res/values/strings.xml index a085ea088e..685ca353ea 100644 --- a/i18n/src/main/res/values/strings.xml +++ b/i18n/src/main/res/values/strings.xml @@ -14,6 +14,7 @@ Tracking Delete downloaded History + Links More @@ -106,6 +107,7 @@ Show entry Copy to clipboard Link + Unlink Open in WebView