From 49aaf5b8e34aeef85a083182548222ccb564a338 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 (mihonapp/mihon#1839) (cherry picked from commit 22b5fb58ff8e89635d646f8fa29256b53c41ffbf) --- 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 01273526a..df8872921 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 exh.source.isEhBasedManga import tachiyomi.data.chapter.ChapterSanitizer import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId @@ -20,7 +21,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 @@ -36,7 +36,7 @@ class SyncChaptersWithSource( private val updateChapter: UpdateChapter, private val getChaptersByMangaId: GetChaptersByMangaId, private val getExcludedScanlators: GetExcludedScanlators, - private val libraryPreferences: LibraryPreferences, + private val readerPreferences: ReaderPreferences, ) { /** @@ -176,7 +176,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 7b925f220..3ad47503c 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 @@ -231,10 +231,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), - ), // KMK --> Preference.PreferenceItem.SwitchPreference( preference = libraryPreferences.showUpdatingProgressBanner(), 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 38e203c12..05b84da9a 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 @@ -239,6 +239,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 1eda22a83..cc1b6c42e 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 @@ -19,6 +19,7 @@ import eu.kanade.domain.sync.SyncPreferences import eu.kanade.domain.track.interactor.TrackChapter import eu.kanade.domain.track.service.TrackPreferences import eu.kanade.domain.ui.UiPreferences +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 @@ -747,6 +748,21 @@ class ReaderViewModel @JvmOverloads constructor( 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) + // Check if syncing is enabled for chapter read: if (isSyncEnabled && syncTriggerOpt.syncOnChapterRead) { SyncDataJob.startNow(Injekt.get()) 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 5bace4ac8..05c8ac934 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 @@ -143,6 +143,8 @@ class ReaderPreferences( fun showNavigationOverlayOnStart() = preferenceStore.getBoolean("reader_navigation_overlay_on_start", false) + fun markDuplicateReadChapterAsRead() = preferenceStore.getBoolean("mark_duplicate_chapter_read", false) + // endregion // SY --> 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 f2c038c96..f7f808004 100644 --- a/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt +++ b/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt @@ -152,8 +152,6 @@ class LibraryPreferences( fun categorizedDisplaySettings() = preferenceStore.getBoolean("categorized_display", false) - fun markDuplicateChapterRead() = preferenceStore.getBoolean("mark_duplicate_chapter_read", false) - // KMK --> fun showHiddenCategories() = preferenceStore.getBoolean("hide_hidden_categories", false) // KMK <-- diff --git a/i18n/src/commonMain/moko-resources/base/strings.xml b/i18n/src/commonMain/moko-resources/base/strings.xml index 1e9ca2010..f0d0356eb 100644 --- a/i18n/src/commonMain/moko-resources/base/strings.xml +++ b/i18n/src/commonMain/moko-resources/base/strings.xml @@ -294,7 +294,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