From 22b5fb58ff8e89635d646f8fa29256b53c41ffbf Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Sun, 9 Mar 2025 12:37:14 +0600 Subject: [PATCH] Make option to mark duplicate chapter as read apply when reading (#1839) --- CHANGELOG.md | 2 +- .../chapter/interactor/SyncChaptersWithSource.kt | 6 +++--- .../settings/screen/SettingsLibraryScreen.kt | 4 ---- .../more/settings/screen/SettingsReaderScreen.kt | 4 ++++ .../tachiyomi/data/database/models/Chapter.kt | 3 +++ .../tachiyomi/ui/reader/ReaderViewModel.kt | 16 ++++++++++++++++ .../ui/reader/setting/ReaderPreferences.kt | 2 ++ .../domain/library/service/LibraryPreferences.kt | 2 -- .../commonMain/moko-resources/base/strings.xml | 2 +- 9 files changed, 30 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 019d0b0fd..e7837a45c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,7 +21,7 @@ The format is a modified version of [Keep a Changelog](https://keepachangelog.co - Add private tracking support for Kitsu ([@MajorTanya](https://github.com/MajorTanya)) ([#1774](https://github.com/mihonapp/mihon/pull/1774)) - Add option to export minimal library information to a CSV file ([@Animeboynz](https://github.com/Animeboynz), [@AntsyLich](https://github.com/AntsyLich)) ([#1161](https://github.com/mihonapp/mihon/pull/1161)) - Add back support for drag-and-drop category reordering ([@cuong-tran](https://github.com/cuong-tran)) ([#1427](https://github.com/mihonapp/mihon/pull/1427)) -- Add option to mark new duplicate read chapters as read +- Add option to mark duplicate read chapters as read - Display staff information on Anilist tracker search results ([@NarwhalHorns](https://github.com/NarwhalHorns)) ([#1810](https://github.com/mihonapp/mihon/pull/1810)) ### Changed diff --git a/app/src/main/java/eu/kanade/domain/chapter/interactor/SyncChaptersWithSource.kt b/app/src/main/java/eu/kanade/domain/chapter/interactor/SyncChaptersWithSource.kt index 1f52d2d1d..29e85d849 100644 --- a/app/src/main/java/eu/kanade/domain/chapter/interactor/SyncChaptersWithSource.kt +++ b/app/src/main/java/eu/kanade/domain/chapter/interactor/SyncChaptersWithSource.kt @@ -10,6 +10,7 @@ import eu.kanade.tachiyomi.data.download.DownloadProvider import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.online.HttpSource +import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences import tachiyomi.data.chapter.ChapterSanitizer import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId import tachiyomi.domain.chapter.interactor.ShouldUpdateDbChapter @@ -19,7 +20,6 @@ import tachiyomi.domain.chapter.model.NoChaptersException import tachiyomi.domain.chapter.model.toChapterUpdate import tachiyomi.domain.chapter.repository.ChapterRepository import tachiyomi.domain.chapter.service.ChapterRecognition -import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.manga.model.Manga import tachiyomi.source.local.isLocal import java.lang.Long.max @@ -35,7 +35,7 @@ class SyncChaptersWithSource( private val updateChapter: UpdateChapter, private val getChaptersByMangaId: GetChaptersByMangaId, private val getExcludedScanlators: GetExcludedScanlators, - private val libraryPreferences: LibraryPreferences, + private val readerPreferences: ReaderPreferences, ) { /** @@ -168,7 +168,7 @@ class SyncChaptersWithSource( val deletedChapterNumberDateFetchMap = removedChapters.sortedByDescending { it.dateFetch } .associate { it.chapterNumber to it.dateFetch } - val markDuplicateAsRead = libraryPreferences.markDuplicateChapterRead().get() + val markDuplicateAsRead = readerPreferences.markDuplicateReadChapterAsRead().get() // Date fetch is set in such a way that the upper ones will have bigger value than the lower ones // Sources MUST return the chapters from most to less recent, which is common. diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt index d54623f8f..e3e9825a5 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt @@ -205,10 +205,6 @@ object SettingsLibraryScreen : SearchableSettings { preference = libraryPreferences.newShowUpdatesCount(), title = stringResource(MR.strings.pref_library_update_show_tab_badge), ), - Preference.PreferenceItem.SwitchPreference( - preference = libraryPreferences.markDuplicateChapterRead(), - title = stringResource(MR.strings.pref_mark_duplicate_chapter_read), - ), ), ) } diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt index 903397bca..7118f7c48 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt @@ -197,6 +197,10 @@ object SettingsReaderScreen : SearchableSettings { preference = readerPreferences.alwaysShowChapterTransition(), title = stringResource(MR.strings.pref_always_show_chapter_transition), ), + Preference.PreferenceItem.SwitchPreference( + preference = readerPreferences.markDuplicateReadChapterAsRead(), + title = stringResource(MR.strings.pref_mark_duplicate_read_chapter_read), + ), ), ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Chapter.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Chapter.kt index 53ddbd36c..50a9f8889 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Chapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Chapter.kt @@ -27,6 +27,9 @@ interface Chapter : SChapter, Serializable { var version: Long } +val Chapter.isRecognizedNumber: Boolean + get() = chapter_number >= 0f + fun Chapter.toDomainChapter(): DomainChapter? { if (id == null || manga_id == null) return null return DomainChapter( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt index 40c9e8297..5ca99c6c0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt @@ -15,6 +15,7 @@ import eu.kanade.domain.manga.model.readingMode import eu.kanade.domain.source.interactor.GetIncognitoState import eu.kanade.domain.track.interactor.TrackChapter import eu.kanade.domain.track.service.TrackPreferences +import eu.kanade.tachiyomi.data.database.models.isRecognizedNumber import eu.kanade.tachiyomi.data.database.models.toDomainChapter import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.download.DownloadProvider @@ -537,6 +538,21 @@ class ReaderViewModel @JvmOverloads constructor( readerChapter.chapter.read = true updateTrackChapterRead(readerChapter) deleteChapterIfNeeded(readerChapter) + + val duplicateUnreadChapters = chapterList + .mapNotNull { + val chapter = it.chapter + if ( + !chapter.read && + chapter.isRecognizedNumber && + chapter.chapter_number == readerChapter.chapter.chapter_number + ) { + ChapterUpdate(id = chapter.id!!, read = true) + } else { + null + } + } + updateChapter.awaitAll(duplicateUnreadChapters) } updateChapter.await( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt index 5cd742ad1..a722d1d24 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt @@ -137,6 +137,8 @@ class ReaderPreferences( fun showNavigationOverlayOnStart() = preferenceStore.getBoolean("reader_navigation_overlay_on_start", false) + fun markDuplicateReadChapterAsRead() = preferenceStore.getBoolean("mark_duplicate_chapter_read", false) + // endregion enum class FlashColor { diff --git a/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt b/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt index da957e954..68b4c7ae4 100644 --- a/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt +++ b/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt @@ -119,8 +119,6 @@ class LibraryPreferences( fun categorizedDisplaySettings() = preferenceStore.getBoolean("categorized_display", false) - fun markDuplicateChapterRead() = preferenceStore.getBoolean("mark_duplicate_chapter_read", false) - fun updateCategories() = preferenceStore.getStringSet(LIBRARY_UPDATE_CATEGORIES_PREF_KEY, emptySet()) fun updateCategoriesExclude() = preferenceStore.getStringSet(LIBRARY_UPDATE_CATEGORIES_EXCLUDE_PREF_KEY, emptySet()) diff --git a/i18n/src/commonMain/moko-resources/base/strings.xml b/i18n/src/commonMain/moko-resources/base/strings.xml index 3965aceb1..dddaa86eb 100644 --- a/i18n/src/commonMain/moko-resources/base/strings.xml +++ b/i18n/src/commonMain/moko-resources/base/strings.xml @@ -292,7 +292,7 @@ Skip unstarted entries Predict next release time Show unread count on Updates icon - Mark new duplicate read chapters as read + Mark duplicate read chapters as read Automatically refresh metadata Check for new cover and details when updating library