From 903fef67913645e6f1e07c762af694b06afb1e0a Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 26 Aug 2024 17:34:28 +0300 Subject: [PATCH] Apply the Disable NSFW option to all lists (closes #1057) --- .../favourites/ui/list/FavouritesListViewModel.kt | 2 +- .../kotatsu/history/ui/HistoryListViewModel.kt | 2 +- .../koitharu/kotatsu/list/ui/MangaListViewModel.kt | 14 +++++++++++++- .../kotatsu/local/data/LocalMangaRepository.kt | 3 +++ .../kotatsu/suggestions/ui/SuggestionsViewModel.kt | 2 +- .../kotatsu/suggestions/ui/SuggestionsWorker.kt | 4 ++-- 6 files changed, 21 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt index 282cf776a..f7718107e 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt @@ -152,7 +152,7 @@ class FavouritesListViewModel @Inject constructor( } private fun observeFavorites() = if (categoryId == NO_ID) { - combine(sortOrder.filterNotNull(), quickFilter.appliedOptions, limit, ::Triple) + combine(sortOrder.filterNotNull(), quickFilter.appliedOptions.combineWithSettings(), limit, ::Triple) .flatMapLatest { repository.observeAll(it.first, it.second - ListFilterOption.Downloaded, it.third) } } else { combine(quickFilter.appliedOptions, limit, ::Pair) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt index b3ebe4076..2b01621ba 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt @@ -157,7 +157,7 @@ class HistoryListViewModel @Inject constructor( } } - private fun observeHistory() = combine(sortOrder, quickFilter.appliedOptions, limit, ::Triple) + private fun observeHistory() = combine(sortOrder, quickFilter.appliedOptions.combineWithSettings(), limit, ::Triple) .flatMapLatest { repository.observeAllWithHistory(it.first, it.second - ListFilterOption.Downloaded, it.third) } private suspend fun mapList( diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt index 8ea51a48c..320e52046 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt @@ -10,6 +10,7 @@ import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.plus +import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ListMode import org.koitharu.kotatsu.core.prefs.observeAsFlow @@ -19,6 +20,7 @@ import org.koitharu.kotatsu.core.ui.util.ReversibleAction import org.koitharu.kotatsu.core.util.ext.MutableEventFlow import org.koitharu.kotatsu.core.util.ext.call import org.koitharu.kotatsu.download.ui.worker.DownloadWorker +import org.koitharu.kotatsu.list.domain.ListFilterOption import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaTag @@ -55,12 +57,22 @@ abstract class MangaListViewModel( } } - fun List.skipNsfwIfNeeded() = if (settings.isNsfwContentDisabled) { + protected fun List.skipNsfwIfNeeded() = if (settings.isNsfwContentDisabled) { filterNot { it.isNsfw } } else { this } + protected fun Flow>.combineWithSettings(): Flow> = combine( + settings.observeAsFlow(AppSettings.KEY_DISABLE_NSFW) { isNsfwContentDisabled }, + ) { filters, skipNsfw -> + if (skipNsfw) { + filters + ListFilterOption.Inverted(ListFilterOption.Macro.NSFW, R.drawable.ic_sfw, R.string.sfw, null) + } else { + filters + } + } + protected fun observeListModeWithTriggers(): Flow = combine( listMode, settings.observe().filter { key -> diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/local/data/LocalMangaRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/local/data/LocalMangaRepository.kt index dacba62ba..7c055de1d 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/local/data/LocalMangaRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/local/data/LocalMangaRepository.kt @@ -71,6 +71,9 @@ class LocalMangaRepository @Inject constructor( return emptyList() } val list = getRawList() + if (settings.isNsfwContentDisabled) { + list.removeIf { it.manga.isNsfw } + } when (filter) { is MangaListFilter.Search -> { list.retainAll { x -> x.isMatchesQuery(filter.query) } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt index c8aa14887..e1080f5c1 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt @@ -39,7 +39,7 @@ class SuggestionsViewModel @Inject constructor( .stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, settings.suggestionsListMode) override val content = combine( - quickFilter.appliedOptions.flatMapLatest { repository.observeAll(0, it) }, + quickFilter.appliedOptions.combineWithSettings().flatMapLatest { repository.observeAll(0, it) }, quickFilter.appliedOptions, observeListModeWithTriggers(), ) { list, filters, mode -> diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/suggestions/ui/SuggestionsWorker.kt b/app/src/main/kotlin/org/koitharu/kotatsu/suggestions/ui/SuggestionsWorker.kt index 4b06a43cf..07cb589c0 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/suggestions/ui/SuggestionsWorker.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/suggestions/ui/SuggestionsWorker.kt @@ -188,7 +188,7 @@ class SuggestionsWorker @AssistedInject constructor( val semaphore = Semaphore(MAX_PARALLELISM) val producer = channelFlow { for (it in sources.shuffled()) { - if (it.isNsfw() && appSettings.isSuggestionsExcludeNsfw) { + if (it.isNsfw() && (appSettings.isSuggestionsExcludeNsfw || appSettings.isNsfwContentDisabled)) { continue } launch { @@ -224,7 +224,7 @@ class SuggestionsWorker @AssistedInject constructor( if (details.rating > 0 && details.rating < RATING_MIN) { continue } - if (details.isNsfw && appSettings.isSuggestionsExcludeNsfw) { + if (details.isNsfw && (appSettings.isSuggestionsExcludeNsfw || appSettings.isNsfwContentDisabled)) { continue } if (details in tagsBlacklist) {