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 b7d718aea..43446cc8e 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,7 +10,6 @@ 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 @@ -21,6 +20,7 @@ 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 readerPreferences: ReaderPreferences, + private val libraryPreferences: LibraryPreferences, ) { /** @@ -173,7 +173,8 @@ class SyncChaptersWithSource( val deletedChapterNumberDateFetchMap = removedChapters.sortedByDescending { it.dateFetch } .associate { it.chapterNumber to it.dateFetch } - val markDuplicateAsRead = readerPreferences.markDuplicateReadChapterAsRead().get() + val markDuplicateAsRead = libraryPreferences.markDuplicateReadChapterAsRead().get() + .contains(LibraryPreferences.MARK_DUPLICATE_CHAPTER_READ_NEW) // 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/SettingsDataScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt index 76f6f6b87..556c1f4b6 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt @@ -504,7 +504,7 @@ object SettingsDataScreen : SearchableSettings { ) } - //SY --> + // SY --> @Composable private fun getSyncPreferences(syncPreferences: SyncPreferences, syncService: Int): List { return listOf( 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 7b3ed7986..8c9b87567 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 @@ -38,6 +38,8 @@ import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_HAS_U import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_NON_COMPLETED import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_NON_READ import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_OUTSIDE_RELEASE_PERIOD +import tachiyomi.domain.library.service.LibraryPreferences.Companion.MARK_DUPLICATE_CHAPTER_READ_EXISTING +import tachiyomi.domain.library.service.LibraryPreferences.Companion.MARK_DUPLICATE_CHAPTER_READ_NEW import tachiyomi.i18n.MR import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.i18n.pluralStringResource @@ -64,7 +66,7 @@ object SettingsLibraryScreen : SearchableSettings { return listOf( getCategoriesGroup(LocalNavigator.currentOrThrow, allCategories, libraryPreferences), getGlobalUpdateGroup(allCategories, libraryPreferences), - getChapterSwipeActionsGroup(libraryPreferences), + getBehaviorGroup(libraryPreferences), // SY --> getSortingCategory(LocalNavigator.currentOrThrow, libraryPreferences), getMigrationCategory(unsortedPreferences), @@ -233,11 +235,11 @@ object SettingsLibraryScreen : SearchableSettings { } @Composable - private fun getChapterSwipeActionsGroup( + private fun getBehaviorGroup( libraryPreferences: LibraryPreferences, ): Preference.PreferenceGroup { return Preference.PreferenceGroup( - title = stringResource(MR.strings.pref_chapter_swipe), + title = stringResource(MR.strings.pref_behavior), preferenceItems = persistentListOf( Preference.PreferenceItem.ListPreference( preference = libraryPreferences.swipeToStartAction(), @@ -267,6 +269,16 @@ object SettingsLibraryScreen : SearchableSettings { ), title = stringResource(MR.strings.pref_chapter_swipe_end), ), + Preference.PreferenceItem.MultiSelectListPreference( + preference = libraryPreferences.markDuplicateReadChapterAsRead(), + entries = persistentMapOf( + MARK_DUPLICATE_CHAPTER_READ_EXISTING to + stringResource(MR.strings.pref_mark_duplicate_read_chapter_read_existing), + MARK_DUPLICATE_CHAPTER_READ_NEW to + stringResource(MR.strings.pref_mark_duplicate_read_chapter_read_new), + ), + title = stringResource(MR.strings.pref_mark_duplicate_read_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 9b73bfec3..99fef94cc 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 @@ -238,10 +238,6 @@ 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/ui/reader/ReaderViewModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt index 864fc9431..3bbdc63b9 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 @@ -95,6 +95,7 @@ import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.history.interactor.GetNextChapters import tachiyomi.domain.history.interactor.UpsertHistory import tachiyomi.domain.history.model.HistoryUpdate +import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.manga.interactor.GetFlatMetadataById import tachiyomi.domain.manga.interactor.GetManga import tachiyomi.domain.manga.interactor.GetMergedMangaById @@ -129,6 +130,7 @@ class ReaderViewModel @JvmOverloads constructor( private val updateChapter: UpdateChapter = Injekt.get(), private val setMangaViewerFlags: SetMangaViewerFlags = Injekt.get(), private val getIncognitoState: GetIncognitoState = Injekt.get(), + private val libraryPreferences: LibraryPreferences = Injekt.get(), // SY --> private val syncPreferences: SyncPreferences = Injekt.get(), private val uiPreferences: UiPreferences = Injekt.get(), @@ -700,42 +702,7 @@ class ReaderViewModel @JvmOverloads constructor( (hasExtraPage && readerChapter.pages?.lastIndex?.minus(1) == page.index) ) { // SY <-- - readerChapter.chapter.read = true - // SY --> - if (manga?.isEhBasedManga() == true) { - viewModelScope.launchNonCancellable { - val chapterUpdates = chapterList - .filter { it.chapter.source_order > readerChapter.chapter.source_order } - .map { chapter -> - ChapterUpdate( - id = chapter.chapter.id!!, - read = true, - ) - } - updateChapter.awaitAll(chapterUpdates) - } - } - // SY <-- - 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) - // SY --> - .also { deleteChapterIfNeeded(ReaderChapter(chapter)) } - // SY <-- - } else { - null - } - } - updateChapter.awaitAll(duplicateUnreadChapters) + updateChapterProgressOnComplete(readerChapter) // Check if syncing is enabled for chapter read: if (isSyncEnabled && syncTriggerOpt.syncOnChapterRead) { @@ -751,13 +718,59 @@ class ReaderViewModel @JvmOverloads constructor( ), ) + // SY --> // Check if syncing is enabled for chapter open: if (isSyncEnabled && syncTriggerOpt.syncOnChapterOpen && readerChapter.chapter.last_page_read == 0) { SyncDataJob.startNow(Injekt.get()) } + // SY <-- } } + private suspend fun updateChapterProgressOnComplete(readerChapter: ReaderChapter) { + readerChapter.chapter.read = true + // SY --> + if (manga?.isEhBasedManga() == true) { + viewModelScope.launchNonCancellable { + val chapterUpdates = chapterList + .filter { it.chapter.source_order > readerChapter.chapter.source_order } + .map { chapter -> + ChapterUpdate( + id = chapter.chapter.id!!, + read = true, + ) + } + updateChapter.awaitAll(chapterUpdates) + } + } + // SY <-- + + updateTrackChapterRead(readerChapter) + deleteChapterIfNeeded(readerChapter) + + val markDuplicateAsRead = libraryPreferences.markDuplicateReadChapterAsRead().get() + .contains(LibraryPreferences.MARK_DUPLICATE_CHAPTER_READ_EXISTING) + if (!markDuplicateAsRead) return + + 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) + // SY --> + .also { deleteChapterIfNeeded(ReaderChapter(chapter)) } + // SY <-- + } else { + null + } + } + updateChapter.awaitAll(duplicateUnreadChapters) + } + fun restartReadTimer() { chapterReadStartTime = Instant.now().toEpochMilli() } 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 05c8ac934..5bace4ac8 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,8 +143,6 @@ 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 5ade2d065..4cc1fd663 100644 --- a/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt +++ b/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt @@ -60,6 +60,8 @@ class LibraryPreferences( false, ) + fun markDuplicateReadChapterAsRead() = preferenceStore.getStringSet("mark_duplicate_read_chapter_read", emptySet()) + // region Filter fun filterDownloaded() = preferenceStore.getEnum( @@ -225,6 +227,9 @@ class LibraryPreferences( const val MANGA_NON_READ = "manga_started" const val MANGA_OUTSIDE_RELEASE_PERIOD = "manga_outside_release_period" + const val MARK_DUPLICATE_CHAPTER_READ_NEW = "new" + const val MARK_DUPLICATE_CHAPTER_READ_EXISTING = "existing" + const val DEFAULT_CATEGORY_PREF_KEY = "default_category" private const val LIBRARY_UPDATE_CATEGORIES_PREF_KEY = "library_update_categories" private const val LIBRARY_UPDATE_CATEGORIES_EXCLUDE_PREF_KEY = "library_update_categories_exclude" diff --git a/i18n/src/commonMain/moko-resources/base/strings.xml b/i18n/src/commonMain/moko-resources/base/strings.xml index 72aeb8827..06ecd076b 100755 --- a/i18n/src/commonMain/moko-resources/base/strings.xml +++ b/i18n/src/commonMain/moko-resources/base/strings.xml @@ -293,7 +293,6 @@ Skip unstarted entries Predict next release time Show unread count on Updates icon - Mark duplicate read chapters as read Automatically refresh metadata Check for new cover and details when updating library @@ -307,11 +306,14 @@ Include: %s Exclude: %s - Chapter swipe + Behavior - Swipe to right action + Chapter on swipe to right - Swipe to left action + Chapter on swipe to left + Mark duplicate read chapter as read + After reading a chapter + After fetching new chapter Multi