From 3e77df20a2c070b7ba7b11607cc0435d43401c50 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 26 Nov 2023 09:07:39 +0200 Subject: [PATCH] Improve manga memory cache usage --- .../kotatsu/core/parser/MangaLinkResolver.kt | 3 ++- .../kotatsu/core/parser/RemoteMangaRepository.kt | 14 ++++++++------ .../org/koitharu/kotatsu/tracker/domain/Tracker.kt | 8 ++++++-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/MangaLinkResolver.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/MangaLinkResolver.kt index d0b1efe1a..483776ef6 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/MangaLinkResolver.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/MangaLinkResolver.kt @@ -1,6 +1,7 @@ package org.koitharu.kotatsu.core.parser import android.net.Uri +import coil.request.CachePolicy import dagger.Reusable import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.util.ext.ifNullOrEmpty @@ -85,7 +86,7 @@ class MangaLinkResolver @Inject constructor( private suspend fun MangaRepository.getDetailsNoCache(manga: Manga): Manga { return if (this is RemoteMangaRepository) { - getDetails(manga, withCache = false) + getDetails(manga, CachePolicy.READ_ONLY) } else { getDetails(manga) } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/RemoteMangaRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/RemoteMangaRepository.kt index 18ab51fb7..273631348 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/RemoteMangaRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/RemoteMangaRepository.kt @@ -1,6 +1,7 @@ package org.koitharu.kotatsu.core.parser import android.util.Log +import coil.request.CachePolicy import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -82,7 +83,7 @@ class RemoteMangaRepository( } } - override suspend fun getDetails(manga: Manga): Manga = getDetails(manga, withCache = true) + override suspend fun getDetails(manga: Manga): Manga = getDetails(manga, CachePolicy.ENABLED) override suspend fun getPages(chapter: MangaChapter): List { cache.getPages(source, chapter.url)?.let { return it } @@ -116,17 +117,18 @@ class RemoteMangaRepository( return related.await() } - suspend fun getDetails(manga: Manga, withCache: Boolean): Manga { - if (!withCache) { - return parser.getDetails(manga) + suspend fun getDetails(manga: Manga, cachePolicy: CachePolicy): Manga { + if (cachePolicy.readEnabled) { + cache.getDetails(source, manga.url)?.let { return it } } - cache.getDetails(source, manga.url)?.let { return it } val details = asyncSafe { mirrorSwitchInterceptor.withMirrorSwitching { parser.getDetails(manga) } } - cache.putDetails(source, manga.url, details) + if (cachePolicy.writeEnabled) { + cache.putDetails(source, manga.url, details) + } return details.await() } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/domain/Tracker.kt b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/domain/Tracker.kt index 73dc18841..2c004ca9d 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/domain/Tracker.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/domain/Tracker.kt @@ -1,8 +1,10 @@ package org.koitharu.kotatsu.tracker.domain import androidx.annotation.VisibleForTesting +import coil.request.CachePolicy import org.koitharu.kotatsu.core.model.getPreferredBranch import org.koitharu.kotatsu.core.parser.MangaRepository +import org.koitharu.kotatsu.core.parser.RemoteMangaRepository import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.history.data.HistoryRepository import org.koitharu.kotatsu.parsers.model.Manga @@ -76,7 +78,9 @@ class Tracker @Inject constructor( } suspend fun fetchUpdates(track: MangaTracking, commit: Boolean): MangaUpdates.Success { - val manga = mangaRepositoryFactory.create(track.manga.source).getDetails(track.manga) + val repo = mangaRepositoryFactory.create(track.manga.source) + require(repo is RemoteMangaRepository) { "Repository ${repo.javaClass.simpleName} is not supported" } + val manga = repo.getDetails(track.manga, CachePolicy.WRITE_ONLY) val updates = compare(track, manga, getBranch(manga)) if (commit) { repository.saveUpdates(updates) @@ -120,7 +124,7 @@ class Tracker @Inject constructor( manga = manga, newChapters = emptyList(), isValid = chapters.lastOrNull()?.id == track.lastChapterId, - channelId = null + channelId = null, ) }