From 02489893ec6b4841f5fa0d9d7566a029a36f3e30 Mon Sep 17 00:00:00 2001 From: tarsin Date: Wed, 12 Jul 2023 09:46:09 +0800 Subject: [PATCH] Suspend DownloadDirnameDao update insert --- app/src/main/java/com/hippo/ehviewer/EhDB.kt | 3 +- .../hippo/ehviewer/dao/DownloadDirnameDao.kt | 4 +- .../com/hippo/ehviewer/spider/SpiderDen.kt | 16 +++-- .../com/hippo/ehviewer/spider/SpiderQueen.kt | 67 ++++++++++--------- .../ehviewer/ui/settings/DownloadScreen.kt | 2 +- 5 files changed, 48 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/EhDB.kt b/app/src/main/java/com/hippo/ehviewer/EhDB.kt index a9dcd9078..b583cd645 100644 --- a/app/src/main/java/com/hippo/ehviewer/EhDB.kt +++ b/app/src/main/java/com/hippo/ehviewer/EhDB.kt @@ -76,8 +76,7 @@ object EhDB { return raw?.dirname } - @Synchronized - fun putDownloadDirname(gid: Long, dirname: String) { + suspend fun putDownloadDirname(gid: Long, dirname: String) { val dao = db.downloadDirnameDao() var raw = dao.load(gid) if (raw != null) { 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 5fa8201d9..a2d81e9b9 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/DownloadDirnameDao.kt +++ b/app/src/main/java/com/hippo/ehviewer/dao/DownloadDirnameDao.kt @@ -11,10 +11,10 @@ interface DownloadDirnameDao { fun load(gid: Long): DownloadDirname? @Update - fun update(downloadDirname: DownloadDirname) + suspend fun update(downloadDirname: DownloadDirname) @Insert - fun insert(t: DownloadDirname): Long + suspend fun insert(t: DownloadDirname): Long @Query("DELETE FROM DOWNLOAD_DIRNAME WHERE GID = :gid") suspend fun deleteByKey(gid: Long) diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt b/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt index 9a37e6129..86693be4a 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt @@ -51,13 +51,15 @@ class SpiderDen(private val mGalleryInfo: GalleryInfo) { @Volatile @SpiderQueen.Mode var mode = SpiderQueen.MODE_READ - set(value) { - field = value - if (field == SpiderQueen.MODE_DOWNLOAD && downloadDir == null) { - mGalleryInfo.putToDownloadDir() - downloadDir = getGalleryDownloadDir(mGid)!!.apply { check(ensureDir()) { "Download directory $uri is not valid directory!" } } - } + private set + + suspend fun setMode(value: Int) { + mode = value + if (mode == SpiderQueen.MODE_DOWNLOAD && downloadDir == null) { + mGalleryInfo.putToDownloadDir() + downloadDir = getGalleryDownloadDir(mGid)!!.apply { check(ensureDir()) { "Download directory $uri is not valid directory!" } } } + } private fun containInCache(index: Int): Boolean { val key = getImageKey(mGid, index) @@ -288,7 +290,7 @@ private fun findImageFile(dir: UniFile, index: Int): UniFile? { return COMPAT_IMAGE_EXTENSIONS.firstNotNullOfOrNull { dir.findFile(perFilename(index, it)) } } -fun GalleryInfo.putToDownloadDir() { +suspend fun GalleryInfo.putToDownloadDir() { val title = getSuitableTitle(this) val dirname = FileUtils.sanitizeFilename("$gid-$title") EhDB.putDownloadDirname(gid, dirname) diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.kt b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.kt index b33d23496..1f450e25b 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.kt @@ -167,39 +167,42 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS val isReady get() = this::mSpiderInfo.isInitialized && this::mPageStateArray.isInitialized - @Synchronized - private fun updateMode() { - if (!isReady) return - val mode: Int = if (mDownloadReference > 0) { - MODE_DOWNLOAD - } else { - MODE_READ - } - mSpiderDen.mode = mode + private val updateLock = Mutex() - // Update download page - val intoDownloadMode = mode == MODE_DOWNLOAD - if (intoDownloadMode && !downloadMode) { - // Clear download state - synchronized(mPageStateLock) { - val temp: IntArray = mPageStateArray - var i = 0 - val n = temp.size - while (i < n) { - val oldState = temp[i] - if (STATE_DOWNLOADING != oldState) { - temp[i] = STATE_NONE - } - i++ - } - mDownloadedPages.lazySet(0) - mFinishedPages.lazySet(0) - mPageErrorMap.clear() - mPagePercentMap.clear() + private suspend fun updateMode() { + if (!awaitReady()) return + updateLock.withLock { + val mode: Int = if (mDownloadReference > 0) { + MODE_DOWNLOAD + } else { + MODE_READ } - mWorkerScope.enterDownloadMode() + mSpiderDen.setMode(mode) + + // Update download page + val intoDownloadMode = mode == MODE_DOWNLOAD + if (intoDownloadMode && !downloadMode) { + // Clear download state + synchronized(mPageStateLock) { + val temp: IntArray = mPageStateArray + var i = 0 + val n = temp.size + while (i < n) { + val oldState = temp[i] + if (STATE_DOWNLOADING != oldState) { + temp[i] = STATE_NONE + } + i++ + } + mDownloadedPages.lazySet(0) + mFinishedPages.lazySet(0) + mPageErrorMap.clear() + mPagePercentMap.clear() + } + mWorkerScope.enterDownloadMode() + } + downloadMode = intoDownloadMode } - downloadMode = intoDownloadMode } private fun setMode(@Mode mode: Int) { @@ -505,7 +508,7 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS val gid = galleryInfo.gid return (sQueenMap[gid] ?: SpiderQueen(galleryInfo).also { sQueenMap[gid] = it }).apply { setMode(mode) - launchIO { if (awaitReady()) updateMode() } + launchIO { updateMode() } } } @@ -516,7 +519,7 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS stop() sQueenMap.remove(galleryInfo.gid) } else { - launchIO { if (awaitReady()) updateMode() } + launchIO { updateMode() } } } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/settings/DownloadScreen.kt b/app/src/main/java/com/hippo/ehviewer/ui/settings/DownloadScreen.kt index 564ebc106..261722775 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/settings/DownloadScreen.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/settings/DownloadScreen.kt @@ -155,7 +155,7 @@ fun DownloadScreen() { summary = stringResource(id = R.string.settings_download_restore_download_items_summary), ) { var restoreDirCount = 0 - fun getRestoreItem(file: UniFile): RestoreItem? { + suspend fun getRestoreItem(file: UniFile): RestoreItem? { if (!file.isDirectory) return null val siFile = file.findFile(SpiderQueen.SPIDER_INFO_FILENAME) ?: return null return runCatching {