From ee504e3361ab2f4e990ac4024995e14c1c6e5da2 Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Thu, 20 Jul 2023 11:53:00 +0800 Subject: [PATCH] Upgrade db, extract common gallery info --- .../com.hippo.ehviewer.dao.EhDatabase/14.json | 402 ++++++++++++++++++ app/src/main/java/com/hippo/ehviewer/EhDB.kt | 146 +++---- .../com/hippo/ehviewer/client/EhEngine.kt | 3 +- .../client/data/AbstractDownloadInfo.kt | 14 + .../client/data/AbstractGalleryInfo.kt | 23 - .../ehviewer/client/data/BaseGalleryInfo.kt | 9 +- .../ehviewer/client/data/GalleryDetail.kt | 7 +- .../hippo/ehviewer/client/data/GalleryInfo.kt | 23 +- .../client/parser/GalleryListParser.kt | 6 +- .../hippo/ehviewer/dao/CommonGalleryInfo.kt | 43 -- .../java/com/hippo/ehviewer/dao/Database.kt | 40 +- .../hippo/ehviewer/dao/DownloadDirnameDao.kt | 8 +- .../com/hippo/ehviewer/dao/DownloadInfo.kt | 49 ++- .../com/hippo/ehviewer/dao/DownloadsDao.kt | 26 +- .../java/com/hippo/ehviewer/dao/FilterDao.kt | 3 + .../com/hippo/ehviewer/dao/GalleriesDao.kt | 22 - .../java/com/hippo/ehviewer/dao/GalleryDao.kt | 34 ++ .../java/com/hippo/ehviewer/dao/HistoryDao.kt | 26 +- .../com/hippo/ehviewer/dao/HistoryInfo.kt | 23 +- .../hippo/ehviewer/dao/LocalFavoriteInfo.kt | 23 +- .../hippo/ehviewer/dao/LocalFavoritesDao.kt | 24 +- .../java/com/hippo/ehviewer/dao/TimeInfo.kt | 13 + .../ehviewer/download/DownloadManager.kt | 10 +- .../ehviewer/download/DownloadService.kt | 4 +- .../com/hippo/ehviewer/ui/CommonOperations.kt | 23 +- .../java/com/hippo/ehviewer/ui/UrlOpener.kt | 4 +- .../hippo/ehviewer/ui/scene/DownloadsScene.kt | 6 +- .../hippo/ehviewer/ui/scene/FavoritesScene.kt | 16 +- .../hippo/ehviewer/ui/scene/GalleryAdapter.kt | 16 +- .../ehviewer/ui/scene/GalleryDetailScene.kt | 17 +- .../ehviewer/ui/scene/GalleryListScene.kt | 6 +- .../ehviewer/ui/scene/GalleryPreviewScreen.kt | 2 +- .../tachiyomi/ui/reader/ReaderActivity.kt | 4 +- 33 files changed, 741 insertions(+), 334 deletions(-) create mode 100644 app/schemas/com.hippo.ehviewer.dao.EhDatabase/14.json create mode 100644 app/src/main/java/com/hippo/ehviewer/client/data/AbstractDownloadInfo.kt delete mode 100644 app/src/main/java/com/hippo/ehviewer/client/data/AbstractGalleryInfo.kt delete mode 100644 app/src/main/java/com/hippo/ehviewer/dao/CommonGalleryInfo.kt delete mode 100644 app/src/main/java/com/hippo/ehviewer/dao/GalleriesDao.kt create mode 100644 app/src/main/java/com/hippo/ehviewer/dao/GalleryDao.kt create mode 100644 app/src/main/java/com/hippo/ehviewer/dao/TimeInfo.kt diff --git a/app/schemas/com.hippo.ehviewer.dao.EhDatabase/14.json b/app/schemas/com.hippo.ehviewer.dao.EhDatabase/14.json new file mode 100644 index 000000000..286e92549 --- /dev/null +++ b/app/schemas/com.hippo.ehviewer.dao.EhDatabase/14.json @@ -0,0 +1,402 @@ +{ + "formatVersion": 1, + "database": { + "version": 14, + "identityHash": "54e4f2704cc47c5a6a2f4b96de978cce", + "entities": [ + { + "tableName": "GALLERIES", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`GID` INTEGER NOT NULL, `TOKEN` TEXT, `TITLE` TEXT, `TITLE_JPN` TEXT, `THUMB` TEXT, `CATEGORY` INTEGER NOT NULL, `POSTED` TEXT, `UPLOADER` TEXT, `RATING` REAL NOT NULL, `SIMPLE_LANGUAGE` TEXT, `FAVORITE_SLOT` INTEGER NOT NULL, PRIMARY KEY(`GID`))", + "fields": [ + { + "fieldPath": "gid", + "columnName": "GID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "token", + "columnName": "TOKEN", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "title", + "columnName": "TITLE", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "titleJpn", + "columnName": "TITLE_JPN", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "thumbKey", + "columnName": "THUMB", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "category", + "columnName": "CATEGORY", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "posted", + "columnName": "POSTED", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "uploader", + "columnName": "UPLOADER", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "rating", + "columnName": "RATING", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "simpleLanguage", + "columnName": "SIMPLE_LANGUAGE", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "favoriteSlot", + "columnName": "FAVORITE_SLOT", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "GID" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "DOWNLOADS", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`GID` INTEGER NOT NULL, `STATE` INTEGER NOT NULL, `LEGACY` INTEGER NOT NULL, `TIME` INTEGER NOT NULL, `LABEL` TEXT, `POSITION` INTEGER NOT NULL, PRIMARY KEY(`GID`), FOREIGN KEY(`GID`) REFERENCES `GALLERIES`(`GID`) ON UPDATE NO ACTION ON DELETE NO ACTION )", + "fields": [ + { + "fieldPath": "gid", + "columnName": "GID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "state", + "columnName": "STATE", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "legacy", + "columnName": "LEGACY", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "time", + "columnName": "TIME", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "label", + "columnName": "LABEL", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "position", + "columnName": "POSITION", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "GID" + ] + }, + "indices": [], + "foreignKeys": [ + { + "table": "GALLERIES", + "onDelete": "NO ACTION", + "onUpdate": "NO ACTION", + "columns": [ + "GID" + ], + "referencedColumns": [ + "GID" + ] + } + ] + }, + { + "tableName": "DOWNLOAD_LABELS", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`LABEL` TEXT NOT NULL, `POSITION` INTEGER NOT NULL, `_id` INTEGER, PRIMARY KEY(`_id`))", + "fields": [ + { + "fieldPath": "label", + "columnName": "LABEL", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "POSITION", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "_id", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "_id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "DOWNLOAD_DIRNAME", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`GID` INTEGER NOT NULL, `DIRNAME` TEXT NOT NULL, PRIMARY KEY(`GID`))", + "fields": [ + { + "fieldPath": "gid", + "columnName": "GID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "dirname", + "columnName": "DIRNAME", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "GID" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "FILTER", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`MODE` INTEGER NOT NULL, `TEXT` TEXT NOT NULL, `ENABLE` INTEGER NOT NULL, `_id` INTEGER, PRIMARY KEY(`_id`))", + "fields": [ + { + "fieldPath": "mode", + "columnName": "MODE", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "text", + "columnName": "TEXT", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "enable", + "columnName": "ENABLE", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "_id", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "_id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "HISTORY", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`GID` INTEGER NOT NULL, `TIME` INTEGER NOT NULL, PRIMARY KEY(`GID`), FOREIGN KEY(`GID`) REFERENCES `GALLERIES`(`GID`) ON UPDATE NO ACTION ON DELETE NO ACTION )", + "fields": [ + { + "fieldPath": "gid", + "columnName": "GID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "time", + "columnName": "TIME", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "GID" + ] + }, + "indices": [], + "foreignKeys": [ + { + "table": "GALLERIES", + "onDelete": "NO ACTION", + "onUpdate": "NO ACTION", + "columns": [ + "GID" + ], + "referencedColumns": [ + "GID" + ] + } + ] + }, + { + "tableName": "LOCAL_FAVORITES", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`GID` INTEGER NOT NULL, `TIME` INTEGER NOT NULL, PRIMARY KEY(`GID`), FOREIGN KEY(`GID`) REFERENCES `GALLERIES`(`GID`) ON UPDATE NO ACTION ON DELETE NO ACTION )", + "fields": [ + { + "fieldPath": "gid", + "columnName": "GID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "time", + "columnName": "TIME", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "GID" + ] + }, + "indices": [], + "foreignKeys": [ + { + "table": "GALLERIES", + "onDelete": "NO ACTION", + "onUpdate": "NO ACTION", + "columns": [ + "GID" + ], + "referencedColumns": [ + "GID" + ] + } + ] + }, + { + "tableName": "QUICK_SEARCH", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER, `NAME` TEXT NOT NULL, `MODE` INTEGER NOT NULL, `CATEGORY` INTEGER NOT NULL, `KEYWORD` TEXT, `ADVANCE_SEARCH` INTEGER NOT NULL, `MIN_RATING` INTEGER NOT NULL, `PAGE_FROM` INTEGER NOT NULL, `PAGE_TO` INTEGER NOT NULL, `POSITION` INTEGER NOT NULL, PRIMARY KEY(`_id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "NAME", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "mode", + "columnName": "MODE", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "CATEGORY", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "keyword", + "columnName": "KEYWORD", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "advanceSearch", + "columnName": "ADVANCE_SEARCH", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "minRating", + "columnName": "MIN_RATING", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "pageFrom", + "columnName": "PAGE_FROM", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "pageTo", + "columnName": "PAGE_TO", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "POSITION", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "_id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '54e4f2704cc47c5a6a2f4b96de978cce')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hippo/ehviewer/EhDB.kt b/app/src/main/java/com/hippo/ehviewer/EhDB.kt index 2c3603142..92fb75619 100644 --- a/app/src/main/java/com/hippo/ehviewer/EhDB.kt +++ b/app/src/main/java/com/hippo/ehviewer/EhDB.kt @@ -19,10 +19,9 @@ import android.content.Context import android.net.Uri import android.os.ParcelFileDescriptor import android.os.ParcelFileDescriptor.MODE_READ_ONLY -import androidx.paging.PagingSource import arrow.fx.coroutines.release import arrow.fx.coroutines.resource -import com.hippo.ehviewer.client.data.GalleryInfo +import com.hippo.ehviewer.client.data.BaseGalleryInfo import com.hippo.ehviewer.dao.DownloadDirname import com.hippo.ehviewer.dao.DownloadInfo import com.hippo.ehviewer.dao.DownloadLabel @@ -39,7 +38,15 @@ import splitties.arch.room.roomDb object EhDB { private val db = roomDb("eh.db") - suspend fun getAllDownloadInfo() = db.downloadsDao().list().onEach { + private suspend fun putGalleryInfo(galleryInfo: BaseGalleryInfo) { + db.galleryDao().upsert(galleryInfo) + } + + private suspend fun deleteGalleryInfo(galleryInfo: BaseGalleryInfo) { + runCatching { db.galleryDao().delete(galleryInfo) } + } + + suspend fun getAllDownloadInfo() = db.downloadsDao().joinList().onEach { if (it.state == DownloadInfo.STATE_WAIT || it.state == DownloadInfo.STATE_DOWNLOAD) { it.state = DownloadInfo.STATE_NONE } @@ -47,28 +54,27 @@ object EhDB { suspend fun updateDownloadInfo(downloadInfo: List) { val dao = db.downloadsDao() - dao.update(downloadInfo) + dao.update(downloadInfo.map(DownloadInfo::downloadInfo)) } suspend fun putDownloadInfo(downloadInfo: DownloadInfo) { - db.downloadsDao().run { - if (load(downloadInfo.gid) != null) { - update(downloadInfo) - } else { - insert(downloadInfo) - } - } + putGalleryInfo(downloadInfo.galleryInfo) + db.downloadsDao().upsert(downloadInfo.downloadInfo) } suspend fun removeDownloadInfo(downloadInfo: DownloadInfo) { val dao = db.downloadsDao() - dao.delete(downloadInfo) + dao.delete(downloadInfo.downloadInfo) dao.fill(downloadInfo.position) + deleteGalleryInfo(downloadInfo.galleryInfo) } suspend fun removeDownloadInfo(downloadInfo: List) { val dao = db.downloadsDao() - dao.delete(downloadInfo) + downloadInfo.forEach { + dao.delete(it.downloadInfo) + deleteGalleryInfo(it.galleryInfo) + } dao.fill(downloadInfo.first().position, downloadInfo.size) } @@ -80,13 +86,7 @@ object EhDB { suspend fun putDownloadDirname(gid: Long, dirname: String) { val dao = db.downloadDirnameDao() - var raw = dao.load(gid) - if (raw != null) { - dao.update(raw.copy(dirname = dirname)) - } else { - raw = DownloadDirname(gid, dirname) - dao.insert(raw) - } + dao.upsert(DownloadDirname(gid, dirname)) } suspend fun removeDownloadDirname(gid: Long) { @@ -120,14 +120,14 @@ object EhDB { dao.fill(raw.position) } - suspend fun removeLocalFavorites(gid: Long) { - db.localFavoritesDao().deleteByKey(gid) + suspend fun removeLocalFavorites(galleryInfo: BaseGalleryInfo) { + db.localFavoritesDao().deleteByKey(galleryInfo.gid) + deleteGalleryInfo(galleryInfo) } - suspend fun removeLocalFavorites(gidArray: LongArray) { - val dao = db.localFavoritesDao() - for (gid in gidArray) { - dao.deleteByKey(gid) + suspend fun removeLocalFavorites(galleryInfoList: List) { + galleryInfoList.forEach { + removeLocalFavorites(it) } } @@ -136,24 +136,19 @@ object EhDB { return dao.contains(gid) } - suspend fun putLocalFavorites(galleryInfo: GalleryInfo) { - val dao = db.localFavoritesDao() - if (null == dao.load(galleryInfo.gid)) { - val info: LocalFavoriteInfo - if (galleryInfo is LocalFavoriteInfo) { - info = galleryInfo - } else { - info = LocalFavoriteInfo(galleryInfo) - info.time = System.currentTimeMillis() - } - dao.insert(info) + suspend fun putLocalFavorites(galleryInfo: BaseGalleryInfo) { + putGalleryInfo(galleryInfo) + db.localFavoritesDao().upsert(LocalFavoriteInfo(galleryInfo.gid)) + } + + suspend fun putLocalFavorites(galleryInfoList: List) { + galleryInfoList.forEach { + putLocalFavorites(it) } } - suspend fun putLocalFavorites(galleryInfoList: List) { - for (gi in galleryInfoList) { - putLocalFavorites(gi) - } + private suspend fun importLocalFavorites(localFavorites: List) { + db.localFavoritesDao().insertOrIgnore(localFavorites) } suspend fun getAllQuickSearch() = db.quickSearchDao().list() @@ -179,57 +174,46 @@ object EhDB { dao.update(quickSearchList) } - val historyLazyList: PagingSource - get() = db.historyDao().listLazy() + val historyLazyList + get() = db.historyDao().joinListLazy() - val localFavLazyList: PagingSource - get() = db.localFavoritesDao().listLazy() + val localFavLazyList + get() = db.localFavoritesDao().joinListLazy() val localFavCount: Flow get() = db.localFavoritesDao().count() - fun searchLocalFav(keyword: String) = db.localFavoritesDao().listLazy("%$keyword%") + fun searchLocalFav(keyword: String) = db.localFavoritesDao().joinListLazy("%$keyword%") - suspend fun putHistoryInfo(galleryInfo: GalleryInfo) { - val dao = db.historyDao() - val info: HistoryInfo = if (galleryInfo is HistoryInfo) { - galleryInfo - } else { - HistoryInfo(galleryInfo) - } - info.time = System.currentTimeMillis() - if (null != dao.load(info.gid)) { - dao.update(info) - } else { - dao.insert(info) - } + suspend fun putHistoryInfo(galleryInfo: BaseGalleryInfo) { + putGalleryInfo(galleryInfo) + db.historyDao().upsert(HistoryInfo(galleryInfo.gid)) } suspend fun modifyHistoryInfoFavslotNonRefresh(gid: Long, slot: Int) { - val dao = db.historyDao() + val dao = db.galleryDao() dao.load(gid)?.let { it.favoriteSlot = slot dao.update(it) } } - private suspend fun putHistoryInfo(historyInfoList: List) { + private suspend fun importHistoryInfo(historyInfoList: List) { val dao = db.historyDao() - for (info in historyInfoList) { - if (null == dao.load(info.gid)) { - dao.insert(info) - } - } + dao.insertOrIgnore(historyInfoList) } - suspend fun deleteHistoryInfo(info: HistoryInfo) { + suspend fun deleteHistoryInfo(galleryInfo: BaseGalleryInfo) { val dao = db.historyDao() - dao.delete(info) + dao.deleteByKey(galleryInfo.gid) + deleteGalleryInfo(galleryInfo) } suspend fun clearHistoryInfo() { val dao = db.historyDao() + val historyList = dao.list() dao.deleteAll() + historyList.forEach { runCatching { db.galleryDao().deleteByKey(it.gid) } } } suspend fun getAllFilter() = db.filterDao().list() @@ -262,14 +246,14 @@ object EhDB { it.close() context.deleteDatabase(ehExportName) } use { newDb -> - db.galleryDao().list().let { newDb.galleryDao().insert(it) } - db.downloadsDao().list().forEach { newDb.downloadsDao().insert(it) } - db.downloadLabelDao().list().forEach { newDb.downloadLabelDao().insert(it) } - db.downloadDirnameDao().list().forEach { newDb.downloadDirnameDao().insert(it) } - db.historyDao().list().forEach { newDb.historyDao().insert(it) } - db.quickSearchDao().list().forEach { newDb.quickSearchDao().insert(it) } - db.localFavoritesDao().list().forEach { newDb.localFavoritesDao().insert(it) } - db.filterDao().list().forEach { newDb.filterDao().insert(it) } + db.galleryDao().list().let { newDb.galleryDao().insertOrIgnore(it) } + db.downloadsDao().list().let { newDb.downloadsDao().insert(it) } + db.downloadLabelDao().list().let { newDb.downloadLabelDao().insert(it) } + db.downloadDirnameDao().list().let { newDb.downloadDirnameDao().insert(it) } + db.historyDao().list().let { newDb.historyDao().insertOrIgnore(it) } + db.quickSearchDao().list().let { newDb.quickSearchDao().insert(it) } + db.localFavoritesDao().list().let { newDb.localFavoritesDao().insertOrIgnore(it) } + db.filterDao().list().let { newDb.filterDao().insert(it) } newDb.close() val dbFile = context.getDatabasePath(ehExportName) context.contentResolver.openFileDescriptor(uri, "rw")!!.use { toFd -> @@ -290,14 +274,14 @@ object EhDB { context.deleteDatabase(tempDBName) } use { oldDB -> runCatching { - db.galleryDao().insert(oldDB.galleryDao().list()) + db.galleryDao().insertOrIgnore(oldDB.galleryDao().list()) } runCatching { val downloadLabelList = oldDB.downloadLabelDao().list() DownloadManager.addDownloadLabel(downloadLabelList) } runCatching { - val downloadInfoList = oldDB.downloadsDao().list() + val downloadInfoList = oldDB.downloadsDao().joinList() DownloadManager.addDownload(downloadInfoList, false) } runCatching { @@ -307,7 +291,7 @@ object EhDB { } runCatching { val historyInfoList = oldDB.historyDao().list() - putHistoryInfo(historyInfoList) + importHistoryInfo(historyInfoList) } runCatching { val quickSearchList = oldDB.quickSearchDao().list() @@ -319,8 +303,8 @@ object EhDB { importQuickSearch(importList) } runCatching { - oldDB.localFavoritesDao().list().forEach { - putLocalFavorites(it) + oldDB.localFavoritesDao().list().let { + importLocalFavorites(it) } } runCatching { diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt index 56404ee5c..81ebd1505 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt @@ -20,6 +20,7 @@ import arrow.fx.coroutines.parMap import arrow.fx.coroutines.parZip import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings +import com.hippo.ehviewer.client.data.BaseGalleryInfo import com.hippo.ehviewer.client.data.GalleryInfo import com.hippo.ehviewer.client.exception.EhException import com.hippo.ehviewer.client.exception.InsufficientFundsException @@ -456,7 +457,7 @@ object EhEngine { } }.executeAndParsingWith(GalleryListParser::parse).apply { fillGalleryList(galleryInfoList, EhUrl.imageSearchUrl, true) } - private suspend fun fillGalleryList(list: MutableList, url: String, filter: Boolean) { + private suspend fun fillGalleryList(list: MutableList, url: String, filter: Boolean) { // Filter title and uploader if (filter) list.removeAllSuspend { EhFilter.filterTitle(it) || EhFilter.filterUploader(it) } diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/AbstractDownloadInfo.kt b/app/src/main/java/com/hippo/ehviewer/client/data/AbstractDownloadInfo.kt new file mode 100644 index 000000000..a1aa6a44a --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/client/data/AbstractDownloadInfo.kt @@ -0,0 +1,14 @@ +package com.hippo.ehviewer.client.data + +interface AbstractDownloadInfo { + var state: Int + var legacy: Int + var time: Long + var label: String? + var position: Int + var speed: Long + var remaining: Long + var finished: Int + var downloaded: Int + var total: Int +} diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/AbstractGalleryInfo.kt b/app/src/main/java/com/hippo/ehviewer/client/data/AbstractGalleryInfo.kt deleted file mode 100644 index 7337b3125..000000000 --- a/app/src/main/java/com/hippo/ehviewer/client/data/AbstractGalleryInfo.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.hippo.ehviewer.client.data - -interface AbstractGalleryInfo { - var gid: Long - var token: String? - var title: String? - var titleJpn: String? - var thumbKey: String? - var category: Int - var posted: String? - var uploader: String? - var disowned: Boolean - var rating: Float - var rated: Boolean - var simpleTags: ArrayList? - var pages: Int - var thumbWidth: Int - var thumbHeight: Int - var simpleLanguage: String? - var favoriteSlot: Int - var favoriteName: String? - var favoriteNote: String? -} diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/BaseGalleryInfo.kt b/app/src/main/java/com/hippo/ehviewer/client/data/BaseGalleryInfo.kt index ab26efe2b..4706acc77 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/data/BaseGalleryInfo.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/data/BaseGalleryInfo.kt @@ -15,13 +15,16 @@ */ package com.hippo.ehviewer.client.data +import android.os.Parcelable import androidx.room.ColumnInfo +import androidx.room.Entity import androidx.room.Ignore import androidx.room.PrimaryKey import com.hippo.ehviewer.client.data.GalleryInfo.Companion.NOT_FAVORITED import kotlinx.parcelize.Parcelize @Parcelize +@Entity(tableName = "GALLERIES") open class BaseGalleryInfo( @PrimaryKey @ColumnInfo(name = "GID") @@ -72,7 +75,7 @@ open class BaseGalleryInfo( @ColumnInfo(name = "SIMPLE_LANGUAGE") override var simpleLanguage: String? = null, - @Ignore + @ColumnInfo(name = "FAVORITE_SLOT") override var favoriteSlot: Int = NOT_FAVORITED, @Ignore @@ -80,4 +83,6 @@ open class BaseGalleryInfo( @Ignore override var favoriteNote: String? = null, -) : GalleryInfo +) : GalleryInfo, Parcelable { + constructor() : this(0) +} diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/GalleryDetail.kt b/app/src/main/java/com/hippo/ehviewer/client/data/GalleryDetail.kt index dc42cd36a..c2ab5a880 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/data/GalleryDetail.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/data/GalleryDetail.kt @@ -15,6 +15,7 @@ */ package com.hippo.ehviewer.client.data +import android.os.Parcelable import com.hippo.ehviewer.client.data.GalleryInfo.Companion.S_LANGS import kotlinx.parcelize.Parcelize @@ -37,14 +38,14 @@ private val LANGUAGES = arrayOf( @Parcelize class GalleryDetail( - val galleryInfo: GalleryInfo = BaseGalleryInfo(), + val galleryInfo: BaseGalleryInfo = BaseGalleryInfo(), var apiUid: Long = -1L, var apiKey: String? = null, var torrentCount: Int = 0, var torrentUrl: String? = null, var archiveUrl: String? = null, var parent: String? = null, - var newerVersions: ArrayList = ArrayList(), + var newerVersions: ArrayList = ArrayList(), var visible: String? = null, var language: String? = null, var size: String? = null, @@ -54,7 +55,7 @@ class GalleryDetail( var comments: GalleryCommentList, val previewPages: Int, val previewList: List, -) : AbstractGalleryInfo by galleryInfo, GalleryInfo { +) : GalleryInfo by galleryInfo, Parcelable { override fun generateSLang() { val index = LANGUAGES.indexOf(language) if (index != -1) simpleLanguage = S_LANGS[index] diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/GalleryInfo.kt b/app/src/main/java/com/hippo/ehviewer/client/data/GalleryInfo.kt index a5305b45b..d3da54f6f 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/data/GalleryInfo.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/data/GalleryInfo.kt @@ -15,10 +15,29 @@ */ package com.hippo.ehviewer.client.data -import android.os.Parcelable import java.util.regex.Pattern -interface GalleryInfo : AbstractGalleryInfo, Parcelable { +interface GalleryInfo { + var gid: Long + var token: String? + var title: String? + var titleJpn: String? + var thumbKey: String? + var category: Int + var posted: String? + var uploader: String? + var disowned: Boolean + var rating: Float + var rated: Boolean + var simpleTags: ArrayList? + var pages: Int + var thumbWidth: Int + var thumbHeight: Int + var simpleLanguage: String? + var favoriteSlot: Int + var favoriteName: String? + var favoriteNote: String? + fun generateSLang() { simpleLanguage = simpleTags?.let { generateSLangFromTags(it) } ?: title?.let { generateSLangFromTitle(it) } diff --git a/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryListParser.kt b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryListParser.kt index 12a890887..34f9a5e18 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryListParser.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryListParser.kt @@ -17,7 +17,7 @@ package com.hippo.ehviewer.client.parser import android.util.Log import com.hippo.ehviewer.EhDB -import com.hippo.ehviewer.client.data.GalleryInfo +import com.hippo.ehviewer.client.data.BaseGalleryInfo import com.hippo.ehviewer.client.data.GalleryInfo.Companion.LOCAL_FAVORITED import com.hippo.ehviewer.client.data.GalleryInfo.Companion.NOT_FAVORITED import com.hippo.ehviewer.client.exception.ParseException @@ -120,8 +120,8 @@ object GalleryListParser { var prev: String? = null var next: String? = null var noWatchedTags = false - val galleryInfoList = mutableListOf() + val galleryInfoList = mutableListOf() } } -private external fun parseGalleryInfo(e: String): GalleryInfo +private external fun parseGalleryInfo(e: String): BaseGalleryInfo diff --git a/app/src/main/java/com/hippo/ehviewer/dao/CommonGalleryInfo.kt b/app/src/main/java/com/hippo/ehviewer/dao/CommonGalleryInfo.kt deleted file mode 100644 index 6ae0b0f30..000000000 --- a/app/src/main/java/com/hippo/ehviewer/dao/CommonGalleryInfo.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.hippo.ehviewer.dao - -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.PrimaryKey -import com.hippo.ehviewer.client.data.BaseGalleryInfo - -@Entity(tableName = "GALLERIES") -data class CommonGalleryInfo( - @PrimaryKey - @ColumnInfo(name = "GID") - override var gid: Long, - - @ColumnInfo(name = "TOKEN") - override var token: String?, - - @ColumnInfo(name = "TITLE") - override var title: String?, - - @ColumnInfo(name = "TITLE_JPN") - override var titleJpn: String?, - - @ColumnInfo(name = "THUMB") - override var thumbKey: String?, - - @ColumnInfo(name = "CATEGORY") - override var category: Int = 0, - - @ColumnInfo(name = "POSTED") - override var posted: String?, - - @ColumnInfo(name = "UPLOADER") - override var uploader: String?, - - @ColumnInfo(name = "RATING") - override var rating: Float, - - @ColumnInfo(name = "SIMPLE_LANGUAGE") - override var simpleLanguage: String?, - - @ColumnInfo(name = "FAVORITE_SLOT") - override var favoriteSlot: Int, -) : BaseGalleryInfo() diff --git a/app/src/main/java/com/hippo/ehviewer/dao/Database.kt b/app/src/main/java/com/hippo/ehviewer/dao/Database.kt index 47f087ad9..7a229002d 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/Database.kt +++ b/app/src/main/java/com/hippo/ehviewer/dao/Database.kt @@ -9,6 +9,7 @@ import androidx.room.RoomDatabase import androidx.room.TypeConverters import androidx.room.migration.AutoMigrationSpec import androidx.sqlite.db.SupportSQLiteDatabase +import com.hippo.ehviewer.client.data.BaseGalleryInfo import com.hippo.ehviewer.client.data.GalleryInfo.Companion.NOT_FAVORITED @DeleteTable(tableName = "BOOKMARKS") @@ -56,6 +57,36 @@ class AddGalleryTable : AutoMigrationSpec { } } +@DeleteColumn(tableName = "HISTORY", columnName = "TOKEN") +@DeleteColumn(tableName = "HISTORY", columnName = "TITLE") +@DeleteColumn(tableName = "HISTORY", columnName = "TITLE_JPN") +@DeleteColumn(tableName = "HISTORY", columnName = "THUMB") +@DeleteColumn(tableName = "HISTORY", columnName = "CATEGORY") +@DeleteColumn(tableName = "HISTORY", columnName = "POSTED") +@DeleteColumn(tableName = "HISTORY", columnName = "UPLOADER") +@DeleteColumn(tableName = "HISTORY", columnName = "RATING") +@DeleteColumn(tableName = "HISTORY", columnName = "SIMPLE_LANGUAGE") +@DeleteColumn(tableName = "HISTORY", columnName = "FAVORITE_SLOT") +@DeleteColumn(tableName = "LOCAL_FAVORITES", columnName = "TOKEN") +@DeleteColumn(tableName = "LOCAL_FAVORITES", columnName = "TITLE") +@DeleteColumn(tableName = "LOCAL_FAVORITES", columnName = "TITLE_JPN") +@DeleteColumn(tableName = "LOCAL_FAVORITES", columnName = "THUMB") +@DeleteColumn(tableName = "LOCAL_FAVORITES", columnName = "CATEGORY") +@DeleteColumn(tableName = "LOCAL_FAVORITES", columnName = "POSTED") +@DeleteColumn(tableName = "LOCAL_FAVORITES", columnName = "UPLOADER") +@DeleteColumn(tableName = "LOCAL_FAVORITES", columnName = "RATING") +@DeleteColumn(tableName = "LOCAL_FAVORITES", columnName = "SIMPLE_LANGUAGE") +@DeleteColumn(tableName = "DOWNLOADS", columnName = "TOKEN") +@DeleteColumn(tableName = "DOWNLOADS", columnName = "TITLE") +@DeleteColumn(tableName = "DOWNLOADS", columnName = "TITLE_JPN") +@DeleteColumn(tableName = "DOWNLOADS", columnName = "THUMB") +@DeleteColumn(tableName = "DOWNLOADS", columnName = "CATEGORY") +@DeleteColumn(tableName = "DOWNLOADS", columnName = "POSTED") +@DeleteColumn(tableName = "DOWNLOADS", columnName = "UPLOADER") +@DeleteColumn(tableName = "DOWNLOADS", columnName = "RATING") +@DeleteColumn(tableName = "DOWNLOADS", columnName = "SIMPLE_LANGUAGE") +class GalleryTableMigration : AutoMigrationSpec + class ThumbKeyMigration : AutoMigrationSpec { override fun onPostMigrate(db: SupportSQLiteDatabase) { val needMigrationTables = arrayOf( @@ -77,8 +108,8 @@ class ThumbKeyMigration : AutoMigrationSpec { } @Database( - entities = [CommonGalleryInfo::class, DownloadInfo::class, DownloadLabel::class, DownloadDirname::class, Filter::class, HistoryInfo::class, LocalFavoriteInfo::class, QuickSearch::class], - version = 13, + entities = [BaseGalleryInfo::class, DownloadEntity::class, DownloadLabel::class, DownloadDirname::class, Filter::class, HistoryInfo::class, LocalFavoriteInfo::class, QuickSearch::class], + version = 14, exportSchema = true, autoMigrations = [ AutoMigration( @@ -123,6 +154,11 @@ class ThumbKeyMigration : AutoMigrationSpec { to = 13, spec = AddGalleryTable::class, ), + AutoMigration( + from = 13, + to = 14, + spec = GalleryTableMigration::class, + ), ], ) @TypeConverters(FilterModeConverter::class) diff --git a/app/src/main/java/com/hippo/ehviewer/dao/DownloadDirnameDao.kt b/app/src/main/java/com/hippo/ehviewer/dao/DownloadDirnameDao.kt index 9021a83bd..aebe5f352 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/DownloadDirnameDao.kt +++ b/app/src/main/java/com/hippo/ehviewer/dao/DownloadDirnameDao.kt @@ -3,18 +3,18 @@ package com.hippo.ehviewer.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.Query -import androidx.room.Update +import androidx.room.Upsert @Dao interface DownloadDirnameDao { @Query("SELECT * FROM DOWNLOAD_DIRNAME WHERE GID = :gid") suspend fun load(gid: Long): DownloadDirname? - @Update - suspend fun update(downloadDirname: DownloadDirname) + @Upsert + suspend fun upsert(downloadDirname: DownloadDirname) @Insert - suspend fun insert(t: DownloadDirname): Long + suspend fun insert(downloadDirnameList: List) @Query("DELETE FROM DOWNLOAD_DIRNAME WHERE GID = :gid") suspend fun deleteByKey(gid: Long) diff --git a/app/src/main/java/com/hippo/ehviewer/dao/DownloadInfo.kt b/app/src/main/java/com/hippo/ehviewer/dao/DownloadInfo.kt index a83546882..6c25513c6 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/DownloadInfo.kt +++ b/app/src/main/java/com/hippo/ehviewer/dao/DownloadInfo.kt @@ -1,50 +1,61 @@ package com.hippo.ehviewer.dao import androidx.room.ColumnInfo +import androidx.room.Embedded import androidx.room.Entity +import androidx.room.ForeignKey import androidx.room.Ignore -import com.hippo.ehviewer.client.data.AbstractGalleryInfo +import androidx.room.PrimaryKey +import androidx.room.Relation +import com.hippo.ehviewer.client.data.AbstractDownloadInfo import com.hippo.ehviewer.client.data.BaseGalleryInfo import com.hippo.ehviewer.client.data.GalleryInfo +import java.time.Instant -@Suppress("DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE") -@Entity(tableName = "DOWNLOADS") -class DownloadInfo( - @Ignore - val galleryInfo: GalleryInfo = BaseGalleryInfo(), -) : BaseGalleryInfo(), AbstractGalleryInfo by galleryInfo { - constructor() : this(galleryInfo = BaseGalleryInfo()) +@Entity(tableName = "DOWNLOADS", foreignKeys = [ForeignKey(BaseGalleryInfo::class, ["GID"], ["GID"])]) +class DownloadEntity( + @PrimaryKey + @ColumnInfo(name = "GID") + var gid: Long, @ColumnInfo(name = "STATE") - var state = 0 + override var state: Int = 0, @ColumnInfo(name = "LEGACY") - var legacy = 0 + override var legacy: Int = 0, @ColumnInfo(name = "TIME") - var time: Long = 0 + override var time: Long = Instant.now().toEpochMilli(), @ColumnInfo(name = "LABEL") - var label: String? = null + override var label: String? = null, @ColumnInfo(name = "POSITION") - var position: Int = 0 + override var position: Int = 0, +) : AbstractDownloadInfo { + @Ignore + override var speed: Long = 0 @Ignore - var speed: Long = 0 + override var remaining: Long = 0 @Ignore - var remaining: Long = 0 + override var finished = 0 @Ignore - var finished = 0 + override var downloaded = 0 @Ignore - var downloaded = 0 + override var total = 0 +} - @Ignore - var total = 0 +data class DownloadInfo( + @Relation(parentColumn = "GID", entityColumn = "GID") + val galleryInfo: BaseGalleryInfo, + @Embedded + val downloadInfo: DownloadEntity = DownloadEntity(galleryInfo.gid), +) : GalleryInfo by galleryInfo, AbstractDownloadInfo by downloadInfo { companion object { const val STATE_INVALID = -1 const val STATE_NONE = 0 diff --git a/app/src/main/java/com/hippo/ehviewer/dao/DownloadsDao.kt b/app/src/main/java/com/hippo/ehviewer/dao/DownloadsDao.kt index 102d8c594..e6dc1cd69 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/DownloadsDao.kt +++ b/app/src/main/java/com/hippo/ehviewer/dao/DownloadsDao.kt @@ -4,34 +4,34 @@ import androidx.room.Dao import androidx.room.Delete import androidx.room.Insert import androidx.room.Query +import androidx.room.Transaction import androidx.room.Update +import androidx.room.Upsert @Dao interface DownloadsDao { @Query("SELECT * FROM DOWNLOADS ORDER BY POSITION DESC") - suspend fun list(): List + suspend fun list(): List - @Query("SELECT * FROM DOWNLOADS ORDER BY POSITION DESC LIMIT :limit OFFSET :offset") - suspend fun list(offset: Int, limit: Int): List - - @Query("SELECT * FROM DOWNLOADS WHERE GID = :gid") - suspend fun load(gid: Long): DownloadInfo? + @Transaction + @Query("SELECT * FROM DOWNLOADS ORDER BY POSITION DESC") + suspend fun joinList(): List @Query("UPDATE DOWNLOADS SET POSITION = POSITION - :offset WHERE POSITION > :position") suspend fun fill(position: Int, offset: Int = 1) @Update - suspend fun update(downloadInfo: List) - - @Update - suspend fun update(downloadInfo: DownloadInfo) + suspend fun update(downloadInfo: List) @Insert - suspend fun insert(t: DownloadInfo): Long + suspend fun insert(downloadInfo: List) + + @Upsert + suspend fun upsert(t: DownloadEntity) @Delete - suspend fun delete(downloadInfo: DownloadInfo) + suspend fun delete(downloadInfo: DownloadEntity) @Delete - suspend fun delete(downloadInfo: List) + suspend fun delete(downloadInfo: List) } diff --git a/app/src/main/java/com/hippo/ehviewer/dao/FilterDao.kt b/app/src/main/java/com/hippo/ehviewer/dao/FilterDao.kt index eeffc7fcf..8f1e0a4a0 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/FilterDao.kt +++ b/app/src/main/java/com/hippo/ehviewer/dao/FilterDao.kt @@ -17,6 +17,9 @@ interface FilterDao { @Insert suspend fun insert(t: Filter): Long + @Insert + suspend fun insert(filters: List) + @Delete suspend fun delete(filter: Filter) diff --git a/app/src/main/java/com/hippo/ehviewer/dao/GalleriesDao.kt b/app/src/main/java/com/hippo/ehviewer/dao/GalleriesDao.kt deleted file mode 100644 index 179a1e9ea..000000000 --- a/app/src/main/java/com/hippo/ehviewer/dao/GalleriesDao.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.hippo.ehviewer.dao - -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query -import androidx.room.Update - -@Dao -interface GalleryDao { - @Query("SELECT * FROM GALLERIES WHERE GID = :gid") - suspend fun load(gid: Long): CommonGalleryInfo? - - @Query("SELECT * FROM GALLERIES") - suspend fun list(): List - - @Insert(onConflict = OnConflictStrategy.IGNORE) - suspend fun insert(galleryInfoList: List) - - @Update - suspend fun update(galleryInfo: CommonGalleryInfo) -} diff --git a/app/src/main/java/com/hippo/ehviewer/dao/GalleryDao.kt b/app/src/main/java/com/hippo/ehviewer/dao/GalleryDao.kt new file mode 100644 index 000000000..000eb7477 --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/dao/GalleryDao.kt @@ -0,0 +1,34 @@ +package com.hippo.ehviewer.dao + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import androidx.room.Update +import androidx.room.Upsert +import com.hippo.ehviewer.client.data.BaseGalleryInfo + +@Dao +interface GalleryDao { + @Query("SELECT * FROM GALLERIES WHERE GID = :gid") + suspend fun load(gid: Long): BaseGalleryInfo? + + @Query("SELECT * FROM GALLERIES") + suspend fun list(): List + + @Insert(onConflict = OnConflictStrategy.IGNORE) + suspend fun insertOrIgnore(galleryInfoList: List) + + @Update + suspend fun update(galleryInfo: BaseGalleryInfo) + + @Upsert + suspend fun upsert(galleryInfo: BaseGalleryInfo) + + @Delete + suspend fun delete(galleryInfo: BaseGalleryInfo) + + @Query("DELETE FROM GALLERIES WHERE GID = :gid") + suspend fun deleteByKey(gid: Long) +} diff --git a/app/src/main/java/com/hippo/ehviewer/dao/HistoryDao.kt b/app/src/main/java/com/hippo/ehviewer/dao/HistoryDao.kt index fce0dc945..c705f26c9 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/HistoryDao.kt +++ b/app/src/main/java/com/hippo/ehviewer/dao/HistoryDao.kt @@ -2,30 +2,30 @@ package com.hippo.ehviewer.dao import androidx.paging.PagingSource import androidx.room.Dao -import androidx.room.Delete import androidx.room.Insert +import androidx.room.OnConflictStrategy import androidx.room.Query -import androidx.room.Update +import androidx.room.RewriteQueriesToDropUnusedColumns +import androidx.room.Upsert +import com.hippo.ehviewer.client.data.BaseGalleryInfo @Dao interface HistoryDao { - @Query("SELECT * FROM HISTORY WHERE GID = :gid") - suspend fun load(gid: Long): HistoryInfo? - @Query("SELECT * FROM HISTORY ORDER BY TIME DESC") suspend fun list(): List - @Query("SELECT * FROM HISTORY ORDER BY TIME DESC") - fun listLazy(): PagingSource + @RewriteQueriesToDropUnusedColumns + @Query("SELECT * FROM HISTORY JOIN GALLERIES USING(GID) ORDER BY TIME DESC") + fun joinListLazy(): PagingSource - @Update - suspend fun update(historyInfo: HistoryInfo) + @Insert(onConflict = OnConflictStrategy.IGNORE) + suspend fun insertOrIgnore(historyInfoList: List) - @Insert - suspend fun insert(t: HistoryInfo): Long + @Upsert + suspend fun upsert(historyInfo: HistoryInfo) - @Delete - suspend fun delete(historyInfo: HistoryInfo) + @Query("DELETE FROM HISTORY WHERE GID = :gid") + suspend fun deleteByKey(gid: Long) @Query("DELETE FROM HISTORY") suspend fun deleteAll() diff --git a/app/src/main/java/com/hippo/ehviewer/dao/HistoryInfo.kt b/app/src/main/java/com/hippo/ehviewer/dao/HistoryInfo.kt index 77adaca25..2ccd5d296 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/HistoryInfo.kt +++ b/app/src/main/java/com/hippo/ehviewer/dao/HistoryInfo.kt @@ -1,24 +1,9 @@ package com.hippo.ehviewer.dao -import androidx.room.ColumnInfo import androidx.room.Entity -import androidx.room.Ignore -import com.hippo.ehviewer.client.data.AbstractGalleryInfo +import androidx.room.ForeignKey import com.hippo.ehviewer.client.data.BaseGalleryInfo -import com.hippo.ehviewer.client.data.GalleryInfo -import com.hippo.ehviewer.client.data.GalleryInfo.Companion.NOT_FAVORITED +import java.time.Instant -@Suppress("DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE") -@Entity(tableName = "HISTORY") -class HistoryInfo( - @Ignore - val galleryInfo: GalleryInfo = BaseGalleryInfo(), -) : BaseGalleryInfo(), AbstractGalleryInfo by galleryInfo { - constructor() : this(galleryInfo = BaseGalleryInfo()) - - @ColumnInfo(name = "TIME") - var time: Long = 0 - - @ColumnInfo(name = "FAVORITE_SLOT") - override var favoriteSlot: Int = NOT_FAVORITED -} +@Entity(tableName = "HISTORY", foreignKeys = [ForeignKey(BaseGalleryInfo::class, ["GID"], ["GID"])]) +class HistoryInfo(gid: Long, time: Long = Instant.now().toEpochMilli()) : TimeInfo(gid, time) diff --git a/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoriteInfo.kt b/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoriteInfo.kt index 31a515e7d..48fab966b 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoriteInfo.kt +++ b/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoriteInfo.kt @@ -1,24 +1,9 @@ package com.hippo.ehviewer.dao -import androidx.room.ColumnInfo import androidx.room.Entity -import androidx.room.Ignore -import com.hippo.ehviewer.client.data.AbstractGalleryInfo +import androidx.room.ForeignKey import com.hippo.ehviewer.client.data.BaseGalleryInfo -import com.hippo.ehviewer.client.data.GalleryInfo -import com.hippo.ehviewer.client.data.GalleryInfo.Companion.LOCAL_FAVORITED +import java.time.Instant -@Suppress("DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE") -@Entity(tableName = "LOCAL_FAVORITES") -class LocalFavoriteInfo( - @Ignore - val galleryInfo: GalleryInfo = BaseGalleryInfo(), -) : BaseGalleryInfo(), AbstractGalleryInfo by galleryInfo { - constructor() : this(galleryInfo = BaseGalleryInfo()) - - @ColumnInfo(name = "TIME") - var time: Long = 0 - - @Ignore - override var favoriteSlot = LOCAL_FAVORITED -} +@Entity(tableName = "LOCAL_FAVORITES", foreignKeys = [ForeignKey(BaseGalleryInfo::class, ["GID"], ["GID"])]) +class LocalFavoriteInfo(gid: Long = 0, time: Long = Instant.now().toEpochMilli()) : TimeInfo(gid, time) diff --git a/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoritesDao.kt b/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoritesDao.kt index d2ee16234..76cb48504 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoritesDao.kt +++ b/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoritesDao.kt @@ -3,7 +3,11 @@ package com.hippo.ehviewer.dao import androidx.paging.PagingSource import androidx.room.Dao import androidx.room.Insert +import androidx.room.OnConflictStrategy import androidx.room.Query +import androidx.room.RewriteQueriesToDropUnusedColumns +import androidx.room.Upsert +import com.hippo.ehviewer.client.data.BaseGalleryInfo import kotlinx.coroutines.flow.Flow @Dao @@ -14,20 +18,22 @@ interface LocalFavoritesDao { @Query("SELECT * FROM LOCAL_FAVORITES ORDER BY TIME DESC") suspend fun list(): List - @Query("SELECT * FROM LOCAL_FAVORITES ORDER BY TIME DESC") - fun listLazy(): PagingSource + @RewriteQueriesToDropUnusedColumns + @Query("SELECT * FROM LOCAL_FAVORITES JOIN GALLERIES USING(GID) ORDER BY TIME DESC") + fun joinListLazy(): PagingSource - @Query("SELECT * FROM LOCAL_FAVORITES WHERE TITLE LIKE :title ORDER BY TIME DESC") - fun listLazy(title: String): PagingSource - - @Query("SELECT * FROM LOCAL_FAVORITES WHERE GID = :gid") - suspend fun load(gid: Long): LocalFavoriteInfo? + @RewriteQueriesToDropUnusedColumns + @Query("SELECT * FROM LOCAL_FAVORITES JOIN GALLERIES USING(GID) WHERE TITLE LIKE :title ORDER BY TIME DESC") + fun joinListLazy(title: String): PagingSource @Query("SELECT EXISTS(SELECT * FROM LOCAL_FAVORITES WHERE GID = :gid)") suspend fun contains(gid: Long): Boolean - @Insert - suspend fun insert(t: LocalFavoriteInfo): Long + @Insert(onConflict = OnConflictStrategy.IGNORE) + suspend fun insertOrIgnore(localFavorites: List) + + @Upsert + suspend fun upsert(t: LocalFavoriteInfo) @Query("DELETE FROM LOCAL_FAVORITES WHERE GID = :gid") suspend fun deleteByKey(gid: Long) diff --git a/app/src/main/java/com/hippo/ehviewer/dao/TimeInfo.kt b/app/src/main/java/com/hippo/ehviewer/dao/TimeInfo.kt new file mode 100644 index 000000000..665165adf --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/dao/TimeInfo.kt @@ -0,0 +1,13 @@ +package com.hippo.ehviewer.dao + +import androidx.room.ColumnInfo +import androidx.room.PrimaryKey + +open class TimeInfo( + @PrimaryKey + @ColumnInfo(name = "GID") + var gid: Long, + + @ColumnInfo(name = "TIME") + val time: Long, +) diff --git a/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.kt b/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.kt index 77a6516fb..070479160 100644 --- a/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.kt +++ b/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.kt @@ -21,7 +21,7 @@ import android.util.SparseLongArray import com.google.android.material.math.MathUtils import com.hippo.ehviewer.EhDB import com.hippo.ehviewer.Settings -import com.hippo.ehviewer.client.data.GalleryInfo +import com.hippo.ehviewer.client.data.BaseGalleryInfo import com.hippo.ehviewer.dao.DownloadInfo import com.hippo.ehviewer.dao.DownloadLabel import com.hippo.ehviewer.image.Image @@ -175,7 +175,7 @@ object DownloadManager : OnSpiderListener { } } - suspend fun startDownload(galleryInfo: GalleryInfo, label: String?) { + suspend fun startDownload(galleryInfo: BaseGalleryInfo, label: String?) { if (mCurrentTask != null && mCurrentTask!!.gid == galleryInfo.gid) { // It is current task return @@ -206,7 +206,6 @@ object DownloadManager : OnSpiderListener { info = DownloadInfo(galleryInfo) info.label = label info.state = DownloadInfo.STATE_WAIT - info.time = System.currentTimeMillis() info.position = allInfoList.size // Add to label download list @@ -236,7 +235,7 @@ object DownloadManager : OnSpiderListener { launchIO { // Add it to history - EhDB.putHistoryInfo(info) + EhDB.putHistoryInfo(info.galleryInfo) } } } @@ -371,7 +370,7 @@ object DownloadManager : OnSpiderListener { } } - suspend fun addDownload(galleryInfo: GalleryInfo, label: String?) { + suspend fun addDownload(galleryInfo: BaseGalleryInfo, label: String?) { if (containDownloadInfo(galleryInfo.gid)) { // Contain return @@ -381,7 +380,6 @@ object DownloadManager : OnSpiderListener { val info = DownloadInfo(galleryInfo) info.label = label info.state = DownloadInfo.STATE_NONE - info.time = System.currentTimeMillis() info.position = allInfoList.size // Add to label download list diff --git a/app/src/main/java/com/hippo/ehviewer/download/DownloadService.kt b/app/src/main/java/com/hippo/ehviewer/download/DownloadService.kt index 65f2db9e6..93a7446f2 100644 --- a/app/src/main/java/com/hippo/ehviewer/download/DownloadService.kt +++ b/app/src/main/java/com/hippo/ehviewer/download/DownloadService.kt @@ -31,7 +31,7 @@ import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import com.hippo.ehviewer.R import com.hippo.ehviewer.client.EhUtils -import com.hippo.ehviewer.client.data.GalleryInfo +import com.hippo.ehviewer.client.data.BaseGalleryInfo import com.hippo.ehviewer.dao.DownloadInfo import com.hippo.ehviewer.ui.MainActivity import com.hippo.ehviewer.ui.scene.DownloadsScene @@ -96,7 +96,7 @@ class DownloadService : Service(), DownloadManager.DownloadListener, CoroutineSc private suspend fun handleIntent(intent: Intent?) { when (intent?.action) { ACTION_START -> { - val gi = intent.getParcelableExtraCompat(KEY_GALLERY_INFO) + val gi = intent.getParcelableExtraCompat(KEY_GALLERY_INFO) val label = intent.getStringExtra(KEY_LABEL) if (gi != null) { deferredMgr.await().startDownload(gi, label) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.kt b/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.kt index ac928d949..0065d047f 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.kt @@ -36,6 +36,7 @@ import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.EhEngine import com.hippo.ehviewer.client.EhUtils +import com.hippo.ehviewer.client.data.BaseGalleryInfo import com.hippo.ehviewer.client.data.GalleryInfo import com.hippo.ehviewer.client.data.GalleryInfo.Companion.LOCAL_FAVORITED import com.hippo.ehviewer.client.data.GalleryInfo.Companion.NOT_FAVORITED @@ -62,14 +63,14 @@ import rikka.core.util.ContextUtils.requireActivity import splitties.init.appCtx object CommonOperations { - fun startDownload(activity: MainActivity?, galleryInfo: GalleryInfo, forceDefault: Boolean) { + fun startDownload(activity: MainActivity?, galleryInfo: BaseGalleryInfo, forceDefault: Boolean) { startDownload(activity!!, listOf(galleryInfo), forceDefault) } @OptIn(DelicateCoroutinesApi::class) fun startDownload( activity: MainActivity, - galleryInfos: List, + galleryInfos: List, forceDefault: Boolean, ) { launchNow { @@ -82,11 +83,11 @@ object CommonOperations { private fun doStartDownload( activity: MainActivity, - galleryInfos: List, + galleryInfos: List, forceDefault: Boolean, ) { val toStart = LongList() - val toAdd: MutableList = ArrayList() + val toAdd: MutableList = ArrayList() for (gi in galleryInfos) { if (DownloadManager.containDownloadInfo(gi.gid)) { toStart.add(gi.gid) @@ -194,7 +195,7 @@ suspend fun keepNoMediaFileStatus() { } } -suspend fun DialogState.addToFavorites(galleryInfo: GalleryInfo): Boolean { +suspend fun DialogState.addToFavorites(galleryInfo: BaseGalleryInfo): Boolean { val localFavorited = EhDB.containLocalFavorites(galleryInfo.gid) val localFav = if (localFavorited) { Icons.Default.Favorite @@ -219,7 +220,7 @@ suspend fun DialogState.addToFavorites(galleryInfo: GalleryInfo): Boolean { } private suspend fun doAddToFavorites( - galleryInfo: GalleryInfo, + galleryInfo: BaseGalleryInfo, slot: Int = NOT_FAVORITED, note: String = "", localFavorited: Boolean = true, @@ -229,14 +230,14 @@ private suspend fun doAddToFavorites( if (galleryInfo.favoriteSlot > LOCAL_FAVORITED) { EhEngine.addFavorites(galleryInfo.gid, galleryInfo.token) } else if (localFavorited) { - EhDB.removeLocalFavorites(galleryInfo.gid) + EhDB.removeLocalFavorites(galleryInfo) } false } LOCAL_FAVORITED -> { if (localFavorited) { - EhDB.removeLocalFavorites(galleryInfo.gid) + EhDB.removeLocalFavorites(galleryInfo) } else { EhDB.putLocalFavorites(galleryInfo) } @@ -265,9 +266,9 @@ private suspend fun doAddToFavorites( return add } -suspend fun removeFromFavorites(galleryInfo: GalleryInfo) = doAddToFavorites(galleryInfo) +suspend fun removeFromFavorites(galleryInfo: BaseGalleryInfo) = doAddToFavorites(galleryInfo) -fun Context.navToReader(info: GalleryInfo, page: Int = -1) { +fun Context.navToReader(info: BaseGalleryInfo, page: Int = -1) { val intent = Intent(this, ReaderActivity::class.java) intent.action = ReaderActivity.ACTION_EH intent.putExtra(ReaderActivity.KEY_GALLERY_INFO, info) @@ -275,7 +276,7 @@ fun Context.navToReader(info: GalleryInfo, page: Int = -1) { startActivity(intent) } -suspend fun DialogState.doGalleryInfoAction(info: GalleryInfo, context: Context) { +suspend fun DialogState.doGalleryInfoAction(info: BaseGalleryInfo, context: Context) { val downloaded = DownloadManager.getDownloadState(info.gid) != DownloadInfo.STATE_INVALID val favourite = info.favoriteSlot != NOT_FAVORITED val selected = if (!downloaded) { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/UrlOpener.kt b/app/src/main/java/com/hippo/ehviewer/ui/UrlOpener.kt index 66f9c5661..3fcf67a2f 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/UrlOpener.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/UrlOpener.kt @@ -40,13 +40,13 @@ fun Context.openBrowser(url: String) { fun Context.jumpToReaderByPage(url: String, detail: GalleryDetail): Boolean { GalleryPageUrlParser.parse(url)?.let { if (it.gid == detail.gid) { - navToReader(detail, it.page) + navToReader(detail.galleryInfo, it.page) return true } } if (url.startsWith("#c")) { runCatching { - navToReader(detail, url.replace("#c", "").toInt() - 1) + navToReader(detail.galleryInfo, url.replace("#c", "").toInt() - 1) return true } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt index e3964e53e..0c0805660 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt @@ -536,7 +536,7 @@ class DownloadsScene : if (position < 0 || position >= list.size) { return false } - context.navToReader(list[position]) + context.navToReader(list[position].galleryInfo) return true } @@ -844,14 +844,14 @@ class DownloadsScene : GalleryDetailScene.KEY_ACTION, GalleryDetailScene.ACTION_GALLERY_INFO, ) - args.putParcelable(GalleryDetailScene.KEY_GALLERY_INFO, list[index]) + args.putParcelable(GalleryDetailScene.KEY_GALLERY_INFO, list[index].galleryInfo) navAnimated(R.id.galleryDetailScene, args) } binding.start -> { val intent = Intent(activity, DownloadService::class.java) intent.action = DownloadService.ACTION_START - intent.putExtra(DownloadService.KEY_GALLERY_INFO, list[index]) + intent.putExtra(DownloadService.KEY_GALLERY_INFO, list[index].galleryInfo) ContextCompat.startForegroundService(activity, intent) } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.kt index 8632fe48f..d46568c0a 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.kt @@ -48,7 +48,6 @@ import androidx.lifecycle.viewModelScope import androidx.paging.LoadState import androidx.paging.Pager import androidx.paging.PagingConfig -import androidx.paging.PagingData import androidx.paging.PagingSource import androidx.paging.PagingState import androidx.paging.cachedIn @@ -64,8 +63,8 @@ import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.EhEngine import com.hippo.ehviewer.client.EhUrl +import com.hippo.ehviewer.client.data.BaseGalleryInfo import com.hippo.ehviewer.client.data.FavListUrlBuilder -import com.hippo.ehviewer.client.data.GalleryInfo import com.hippo.ehviewer.client.ehUrl import com.hippo.ehviewer.databinding.SceneFavoritesBinding import com.hippo.ehviewer.ui.CommonOperations @@ -102,8 +101,8 @@ import java.util.Locale class VMStorage : ViewModel() { var urlBuilder = FavListUrlBuilder(favCat = Settings.recentFavCat) private val cloudDataFlow = Pager(PagingConfig(25)) { - object : PagingSource() { - override fun getRefreshKey(state: PagingState): String? = null + object : PagingSource() { + override fun getRefreshKey(state: PagingState): String? = null override suspend fun load(params: LoadParams) = withIOContext { when (params) { is LoadParams.Prepend -> urlBuilder.setIndex(params.key, isNext = false) @@ -182,8 +181,7 @@ class FavoritesScene : SearchBarScene() { collectJob?.cancel() collectJob = viewLifecycleOwner.lifecycleScope.launchIO { vm.dataflow().collectLatest { - @Suppress("UNCHECKED_CAST") - mAdapter?.submitData(it as PagingData) + mAdapter?.submitData(it) } } mAdapter?.refresh() @@ -483,8 +481,7 @@ class FavoritesScene : SearchBarScene() { val info = takeCheckedInfo() lifecycleScope.launchIO { if (urlBuilder.favCat == FavListUrlBuilder.FAV_CAT_LOCAL) { // Delete local fav - val gidArray = info.map { it.gid }.toLongArray() - EhDB.removeLocalFavorites(gidArray) + EhDB.removeLocalFavorites(info) } else { val delList = info.map { it.gid to it.token!! } EhEngine.addFavoritesRange(delList, -1) @@ -503,8 +500,7 @@ class FavoritesScene : SearchBarScene() { lifecycleScope.launchIO { if (srcCat == FavListUrlBuilder.FAV_CAT_LOCAL) { // Move from local to cloud - val gidArray = info.map { it.gid }.toLongArray() - EhDB.removeLocalFavorites(gidArray) + EhDB.removeLocalFavorites(info) val galleryList = info.map { it.gid to it.token!! } runCatching { EhEngine.addFavoritesRange(galleryList, dstCat) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryAdapter.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryAdapter.kt index 6827ce31a..86c095bae 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryAdapter.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryAdapter.kt @@ -28,7 +28,7 @@ import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings import com.hippo.ehviewer.Settings.detailSize import com.hippo.ehviewer.Settings.thumbSizeDp -import com.hippo.ehviewer.client.data.GalleryInfo +import com.hippo.ehviewer.client.data.BaseGalleryInfo import com.hippo.ehviewer.ui.legacy.AutoStaggeredGridLayoutManager import com.hippo.ehviewer.ui.legacy.MarginItemDecoration import com.hippo.ehviewer.ui.legacy.STRATEGY_MIN_SIZE @@ -36,24 +36,24 @@ import com.hippo.ehviewer.ui.legacy.STRATEGY_SUITABLE_SIZE import com.hippo.ehviewer.util.dp2px import splitties.init.appCtx -private val diffCallback = object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: GalleryInfo, newItem: GalleryInfo) = oldItem.gid == newItem.gid - override fun areContentsTheSame(oldItem: GalleryInfo, newItem: GalleryInfo) = oldItem.gid == newItem.gid +private val diffCallback = object : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: BaseGalleryInfo, newItem: BaseGalleryInfo) = oldItem.gid == newItem.gid + override fun areContentsTheSame(oldItem: BaseGalleryInfo, newItem: BaseGalleryInfo) = oldItem.gid == newItem.gid } class GalleryAdapter( private val recyclerView: RecyclerView, private val showFavorite: Boolean, - private val onItemClick: (GalleryInfo) -> Unit, - private val onItemLongClick: (GalleryInfo) -> Unit, -) : PagingDataAdapter(diffCallback) { + private val onItemClick: (BaseGalleryInfo) -> Unit, + private val onItemLongClick: (BaseGalleryInfo) -> Unit, +) : PagingDataAdapter(diffCallback) { private val resources = recyclerView.context.resources private val layoutManager: AutoStaggeredGridLayoutManager = AutoStaggeredGridLayoutManager(0, StaggeredGridLayoutManager.VERTICAL) private val mPaddingTopSB: Int = resources.getDimensionPixelOffset(R.dimen.gallery_padding_top_search_bar) private var mListDecoration: ItemDecoration? = null private var mGirdDecoration: MarginItemDecoration? = null private var mType = TYPE_INVALID - var tracker: GallerySelectionTracker? = null + var tracker: GallerySelectionTracker? = null var type: Int get() = mType diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt index 72ac0b4d4..b710d6967 100755 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt @@ -110,6 +110,7 @@ import com.hippo.ehviewer.client.EhEngine import com.hippo.ehviewer.client.EhFilter.remember import com.hippo.ehviewer.client.EhUrl import com.hippo.ehviewer.client.EhUtils +import com.hippo.ehviewer.client.data.BaseGalleryInfo import com.hippo.ehviewer.client.data.GalleryComment import com.hippo.ehviewer.client.data.GalleryDetail import com.hippo.ehviewer.client.data.GalleryInfo @@ -183,7 +184,7 @@ class GalleryDetailScene : BaseScene() { private var mToken: String? = null private var mPage = 0 - private var composeBindingGI by mutableStateOf(null) + private var composeBindingGI by mutableStateOf(null) private var composeBindingGD by mutableStateOf(null) private var readButtonText by mutableStateOf("") private var downloadButtonText by mutableStateOf("") @@ -637,7 +638,7 @@ class GalleryDetailScene : BaseScene() { EhPreviewItem( galleryPreview = it, position = it.position, - onClick = { context?.navToReader(gd, it.position) }, + onClick = { context?.navToReader(gd.galleryInfo, it.position) }, ) } item(span = { GridItemSpan(maxLineSpan) }) { @@ -787,7 +788,7 @@ class GalleryDetailScene : BaseScene() { if (EhDownloadManager.getDownloadState(galleryDetail.gid) == DownloadInfo.STATE_INVALID) { CommonOperations.startDownload( activity as MainActivity, - galleryDetail, + galleryDetail.galleryInfo, false, ) } else { @@ -838,7 +839,7 @@ class GalleryDetailScene : BaseScene() { EhEngine.getGalleryDetail(url) }.onSuccess { galleryDetail -> galleryDetailCache.put(galleryDetail.gid, galleryDetail) - EhDB.putHistoryInfo(galleryDetail) + EhDB.putHistoryInfo(galleryDetail.galleryInfo) if (Settings.preloadThumbAggressively) { lifecycleScope.launchIO { galleryDetail.previewList.forEach { @@ -847,7 +848,7 @@ class GalleryDetailScene : BaseScene() { } } composeBindingGD = galleryDetail - composeBindingGI = galleryDetail + composeBindingGI = galleryDetail.galleryInfo updateDownloadState() bindViewSecond() }.onFailure { @@ -873,7 +874,7 @@ class GalleryDetailScene : BaseScene() { favoritesLock.withLock { var remove = false runCatching { - remove = !dialogState.addToFavorites(galleryDetail) + remove = !dialogState.addToFavorites(galleryDetail.galleryInfo) if (remove) { showTip(R.string.remove_from_favorite_success, LENGTH_SHORT) } else { @@ -947,9 +948,9 @@ class GalleryDetailScene : BaseScene() { requireActivity().findViewById(R.id.snackbar), getString(R.string.read_from, mPage), Snackbar.LENGTH_LONG, - ).setAction(R.string.read) { context?.navToReader(gd, mPage) }.show() + ).setAction(R.string.read) { context?.navToReader(gd.galleryInfo, mPage) }.show() } - composeBindingGI = gd + composeBindingGI = gd.galleryInfo composeBindingGD = gd updateDownloadText() updateFavoriteDrawable() diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt index bbb49763a..02d74dbe3 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt @@ -65,7 +65,7 @@ import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.EhEngine import com.hippo.ehviewer.client.EhTagDatabase import com.hippo.ehviewer.client.EhUtils -import com.hippo.ehviewer.client.data.GalleryInfo +import com.hippo.ehviewer.client.data.BaseGalleryInfo import com.hippo.ehviewer.client.data.ListUrlBuilder import com.hippo.ehviewer.client.data.ListUrlBuilder.Companion.MODE_NORMAL import com.hippo.ehviewer.client.data.ListUrlBuilder.Companion.MODE_SUBSCRIPTION @@ -123,8 +123,8 @@ import java.util.Locale class VMStorage1 : ViewModel() { var urlBuilder = ListUrlBuilder() val dataFlow = Pager(PagingConfig(25)) { - object : PagingSource() { - override fun getRefreshKey(state: PagingState): String? = null + object : PagingSource() { + override fun getRefreshKey(state: PagingState): String? = null override suspend fun load(params: LoadParams) = withIOContext { if (urlBuilder.mode == MODE_TOPLIST) { // TODO: Since we know total pages, let pager support jump diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewScreen.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewScreen.kt index 39088588c..0aeccd7f4 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewScreen.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewScreen.kt @@ -72,7 +72,7 @@ class GalleryPreviewScreen : Fragment() { setMD3Content { val galleryDetail = remember { requireArguments().getParcelableCompat(KEY_GALLERY_DETAIL)!! } val context = LocalContext.current - fun onPreviewCLick(index: Int) = context.navToReader(galleryDetail, index) + fun onPreviewCLick(index: Int) = context.navToReader(galleryDetail.galleryInfo, index) var toNextPage by rememberSaveable { mutableStateOf(requireArguments().getBoolean(KEY_NEXT_PAGE)) } val scrollBehaviour = TopAppBarDefaults.pinnedScrollBehavior() val columnCount = calculateSuitableSpanCount() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index e4f52f414..bf09741c6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -66,7 +66,7 @@ import com.google.android.material.shape.MaterialShapeDrawable import com.hippo.ehviewer.BuildConfig import com.hippo.ehviewer.R import com.hippo.ehviewer.client.EhUrl -import com.hippo.ehviewer.client.data.GalleryInfo +import com.hippo.ehviewer.client.data.BaseGalleryInfo import com.hippo.ehviewer.databinding.ReaderActivityBinding import com.hippo.ehviewer.gallery.ArchivePageLoader import com.hippo.ehviewer.gallery.EhPageLoader @@ -121,7 +121,7 @@ class ReaderActivity : EhActivity() { private var mAction: String? = null private var mFilename: String? = null private var mUri: Uri? = null - private var mGalleryInfo: GalleryInfo? = null + private var mGalleryInfo: BaseGalleryInfo? = null private var mPage: Int = 0 private var mCacheFileName: String? = null