From 028da099ddf42b8b305afad04aba5f819a8ce24c Mon Sep 17 00:00:00 2001 From: arkon Date: Sun, 7 Jan 2024 16:03:12 -0500 Subject: [PATCH] Add filter library by customized update frequency Supersedes #9619 Co-authored-by: quangkieu --- .../library/LibrarySettingsDialog.kt | 10 ++++ .../ui/library/LibraryScreenModel.kt | 50 ++++++++++++------- .../library/service/LibraryPreferences.kt | 20 -------- .../commonMain/resources/MR/base/strings.xml | 6 +-- 4 files changed, 44 insertions(+), 42 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt b/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt index 5c9b092a3..1ab73504a 100644 --- a/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt @@ -74,6 +74,8 @@ private fun ColumnScope.FilterPage( ) { val filterDownloaded by screenModel.libraryPreferences.filterDownloaded().collectAsState() val downloadedOnly by screenModel.preferences.downloadedOnly().collectAsState() + val autoUpdateMangaRestrictions by screenModel.libraryPreferences.autoUpdateMangaRestrictions().collectAsState() + TriStateItem( label = stringResource(MR.strings.label_downloaded), state = if (downloadedOnly) { @@ -108,6 +110,14 @@ private fun ColumnScope.FilterPage( state = filterCompleted, onClick = { screenModel.toggleFilter(LibraryPreferences::filterCompleted) }, ) + if (LibraryPreferences.MANGA_OUTSIDE_RELEASE_PERIOD in autoUpdateMangaRestrictions) { + val filterIntervalCustom by screenModel.libraryPreferences.filterIntervalCustom().collectAsState() + TriStateItem( + label = stringResource(MR.strings.action_filter_interval_custom), + state = filterIntervalCustom, + onClick = { screenModel.toggleFilter(LibraryPreferences::filterIntervalCustom) }, + ) + } val trackers = remember { screenModel.trackers } when (trackers.size) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt index 105f1e2b3..a1b6c3b1b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt @@ -157,6 +157,7 @@ class LibraryScreenModel( prefs.filterStarted, prefs.filterBookmarked, prefs.filterCompleted, + prefs.filterIntervalCustom, ) + trackFilter.values ).any { it != TriState.DISABLED } } @@ -178,12 +179,13 @@ class LibraryScreenModel( ): LibraryMap { val prefs = getLibraryItemPreferencesFlow().first() val downloadedOnly = prefs.globalFilterDownloaded - val filterDownloaded = - if (downloadedOnly) TriState.ENABLED_IS else prefs.filterDownloaded + val skipOutsideReleasePeriod = prefs.skipOutsideReleasePeriod + val filterDownloaded = if (downloadedOnly) TriState.ENABLED_IS else prefs.filterDownloaded val filterUnread = prefs.filterUnread val filterStarted = prefs.filterStarted val filterBookmarked = prefs.filterBookmarked val filterCompleted = prefs.filterCompleted + val filterIntervalCustom = prefs.filterIntervalCustom val isNotLoggedInAnyTrack = loggedInTrackers.isEmpty() @@ -215,6 +217,14 @@ class LibraryScreenModel( applyFilter(filterCompleted) { it.libraryManga.manga.status.toInt() == SManga.COMPLETED } } + val filterFnIntervalCustom: (LibraryItem) -> Boolean = { + if (skipOutsideReleasePeriod) { + applyFilter(filterIntervalCustom) { it.libraryManga.manga.fetchInterval < 0 } + } else { + true + } + } + val filterFnTracking: (LibraryItem) -> Boolean = tracking@{ item -> if (isNotLoggedInAnyTrack || trackFiltersIsIgnored) return@tracking true @@ -225,7 +235,7 @@ class LibraryScreenModel( val isExcluded = excludedTracks.isNotEmpty() && mangaTracks.fastAny { it in excludedTracks } val isIncluded = includedTracks.isEmpty() || mangaTracks.fastAny { it in includedTracks } - return@tracking !isExcluded && isIncluded + !isExcluded && isIncluded } val filterFn: (LibraryItem) -> Boolean = { @@ -234,6 +244,7 @@ class LibraryScreenModel( filterFnStarted(it) && filterFnBookmarked(it) && filterFnCompleted(it) && + filterFnIntervalCustom(it) && filterFnTracking(it) } @@ -320,6 +331,7 @@ class LibraryScreenModel( libraryPreferences.downloadBadge().changes(), libraryPreferences.localBadge().changes(), libraryPreferences.languageBadge().changes(), + libraryPreferences.autoUpdateMangaRestrictions().changes(), preferences.downloadedOnly().changes(), libraryPreferences.filterDownloaded().changes(), @@ -327,20 +339,22 @@ class LibraryScreenModel( libraryPreferences.filterStarted().changes(), libraryPreferences.filterBookmarked().changes(), libraryPreferences.filterCompleted().changes(), - transform = { - ItemPreferences( - downloadBadge = it[0] as Boolean, - localBadge = it[1] as Boolean, - languageBadge = it[2] as Boolean, - globalFilterDownloaded = it[3] as Boolean, - filterDownloaded = it[4] as TriState, - filterUnread = it[5] as TriState, - filterStarted = it[6] as TriState, - filterBookmarked = it[7] as TriState, - filterCompleted = it[8] as TriState, - ) - }, - ) + libraryPreferences.filterIntervalCustom().changes(), + ) { + ItemPreferences( + downloadBadge = it[0] as Boolean, + localBadge = it[1] as Boolean, + languageBadge = it[2] as Boolean, + skipOutsideReleasePeriod = LibraryPreferences.MANGA_OUTSIDE_RELEASE_PERIOD in (it[3] as Set<*>), + globalFilterDownloaded = it[4] as Boolean, + filterDownloaded = it[5] as TriState, + filterUnread = it[6] as TriState, + filterStarted = it[7] as TriState, + filterBookmarked = it[8] as TriState, + filterCompleted = it[9] as TriState, + filterIntervalCustom = it[10] as TriState, + ) + } } /** @@ -699,6 +713,7 @@ class LibraryScreenModel( val downloadBadge: Boolean, val localBadge: Boolean, val languageBadge: Boolean, + val skipOutsideReleasePeriod: Boolean, val globalFilterDownloaded: Boolean, val filterDownloaded: TriState, @@ -706,6 +721,7 @@ class LibraryScreenModel( val filterStarted: TriState, val filterBookmarked: TriState, val filterCompleted: TriState, + val filterIntervalCustom: TriState, ) @Immutable 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 1a51fa659..22174c0e2 100644 --- a/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt +++ b/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt @@ -85,26 +85,6 @@ class LibraryPreferences( TriState.DISABLED, ) - fun filterIntervalLong() = preferenceStore.getEnum( - "pref_filter_library_interval_long", - TriState.DISABLED, - ) - - fun filterIntervalLate() = preferenceStore.getEnum( - "pref_filter_library_interval_late", - TriState.DISABLED, - ) - - fun filterIntervalDropped() = preferenceStore.getEnum( - "pref_filter_library_interval_dropped", - TriState.DISABLED, - ) - - fun filterIntervalPassed() = preferenceStore.getEnum( - "pref_filter_library_interval_passed", - TriState.DISABLED, - ) - fun filterTracking(id: Int) = preferenceStore.getEnum( "pref_filter_library_tracked_${id}_v2", TriState.DISABLED, diff --git a/i18n/src/commonMain/resources/MR/base/strings.xml b/i18n/src/commonMain/resources/MR/base/strings.xml index ff02bcf34..e4b3b04d1 100644 --- a/i18n/src/commonMain/resources/MR/base/strings.xml +++ b/i18n/src/commonMain/resources/MR/base/strings.xml @@ -54,11 +54,7 @@ Bookmarked Tracked Unread - Customized fetch interval - Fetch monthly (28 days) - Late 10+ check - Dropped? Late 20+ and 2 months - Passed check period + Customized update frequency Remove filter Alphabetically