diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsPresenter.kt index 56b6baba1c..138df111a7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsPresenter.kt @@ -485,17 +485,16 @@ class RecentsPresenter( private suspend fun getNextChapter(manga: Manga): Chapter? { val mangaId = manga.id ?: return null - val chapters = getChapter.awaitAll(mangaId, true) - return ChapterSort(manga, chapterFilter, preferences).getNextUnreadChapter(chapters, false) + val chapters = getChapter.awaitUnread(mangaId, true) + return ChapterSort(manga, chapterFilter, preferences).getNextChapter(chapters, false) } private suspend fun getFirstUpdatedChapter(manga: Manga, chapter: Chapter): Chapter? { val mangaId = manga.id ?: return null - val chapters = getChapter.awaitAll(mangaId, true) - return chapters - .sortedWith(ChapterSort(manga, chapterFilter, preferences).sortComparator(true)).find { - !it.read && abs(it.date_fetch - chapter.date_fetch) <= TimeUnit.HOURS.toMillis(12) - } + val chapters = getChapter.awaitUnread(mangaId, true) + return chapters.sortedWith(ChapterSort(manga, chapterFilter, preferences).sortComparator(true)).find { + abs(it.date_fetch - chapter.date_fetch) <= TimeUnit.HOURS.toMillis(12) + } } override fun onDestroy() { diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterSort.kt b/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterSort.kt index dd118ac77c..4e2075e5e9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterSort.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterSort.kt @@ -30,6 +30,14 @@ class ChapterSort(val manga: Manga, val chapterFilter: ChapterFilter = Injekt.ge return chapters.sortedWith(sortComparator()) } + fun getNextChapter(rawChapters: List, andFiltered: Boolean = true): T? { + val chapters = when { + andFiltered -> chapterFilter.filterChapters(rawChapters, manga) + else -> rawChapters + } + return chapters.sortedWith(sortComparator(true)).firstOrNull() + } + fun getNextUnreadChapter(rawChapters: List, andFiltered: Boolean = true): T? { val chapters = when { andFiltered -> chapterFilter.filterChapters(rawChapters, manga) diff --git a/app/src/main/java/yokai/data/chapter/ChapterRepositoryImpl.kt b/app/src/main/java/yokai/data/chapter/ChapterRepositoryImpl.kt index 1b38b71a9f..868e0748e8 100644 --- a/app/src/main/java/yokai/data/chapter/ChapterRepositoryImpl.kt +++ b/app/src/main/java/yokai/data/chapter/ChapterRepositoryImpl.kt @@ -43,6 +43,11 @@ class ChapterRepositoryImpl(private val handler: DatabaseHandler) : ChapterRepos chaptersQueries.getChaptersByUrlAndMangaId(url, mangaId, filterScanlators.toInt().toLong(), Chapter::mapper) } + override suspend fun getUnread(mangaId: Long, filterScanlators: Boolean): List = + handler.awaitList { + chaptersQueries.findUnreadByMangaId(mangaId, filterScanlators.toInt().toLong(), Chapter::mapper) + } + override suspend fun getRecents(filterScanlators: Boolean, search: String, limit: Long, offset: Long): List = handler.awaitList { chaptersQueries.getRecents(search, filterScanlators.toInt().toLong(), limit, offset, MangaChapter::mapper) } diff --git a/app/src/main/java/yokai/domain/chapter/ChapterRepository.kt b/app/src/main/java/yokai/domain/chapter/ChapterRepository.kt index dd39b017a1..eb061a809d 100644 --- a/app/src/main/java/yokai/domain/chapter/ChapterRepository.kt +++ b/app/src/main/java/yokai/domain/chapter/ChapterRepository.kt @@ -16,6 +16,7 @@ interface ChapterRepository { suspend fun getChaptersByUrlAndMangaId(url: String, mangaId: Long, filterScanlators: Boolean): List suspend fun getChapterByUrlAndMangaId(url: String, mangaId: Long, filterScanlators: Boolean): Chapter? + suspend fun getUnread(mangaId: Long, filterScanlators: Boolean): List suspend fun getRecents(filterScanlators: Boolean, search: String = "", limit: Long = 25L, offset: Long = 0L): List diff --git a/app/src/main/java/yokai/domain/chapter/interactor/GetChapter.kt b/app/src/main/java/yokai/domain/chapter/interactor/GetChapter.kt index 01d3b8b42a..648614506d 100644 --- a/app/src/main/java/yokai/domain/chapter/interactor/GetChapter.kt +++ b/app/src/main/java/yokai/domain/chapter/interactor/GetChapter.kt @@ -11,6 +11,9 @@ class GetChapter( suspend fun awaitAll(manga: Manga, filterScanlators: Boolean? = null) = awaitAll(manga.id!!, filterScanlators ?: (manga.filtered_scanlators?.isNotEmpty() == true)) + suspend fun awaitUnread(mangaId: Long, filterScanlators: Boolean) = + chapterRepository.getUnread(mangaId, filterScanlators) + suspend fun awaitById(id: Long) = chapterRepository.getChapterById(id) suspend fun awaitAllByUrl(chapterUrl: String, filterScanlators: Boolean) = diff --git a/data/src/commonMain/sqldelight/tachiyomi/data/chapters.sq b/data/src/commonMain/sqldelight/tachiyomi/data/chapters.sq index 636236ae58..329fa4a8d4 100644 --- a/data/src/commonMain/sqldelight/tachiyomi/data/chapters.sq +++ b/data/src/commonMain/sqldelight/tachiyomi/data/chapters.sq @@ -58,6 +58,17 @@ AND ( :apply_filter = 0 OR S.name IS NULL ); +findUnreadByMangaId: +SELECT C.* +FROM chapters AS C +LEFT JOIN scanlators_view AS S +ON C.manga_id = S.manga_id +AND C.scanlator = S.name +WHERE C.manga_id = :manga_id AND C.read = 0 +AND ( + :apply_filter = 0 OR S.name IS NULL +); + getRecents: SELECT M.*,