Fix excluding NSFW

master
Koitharu 2 years ago
parent 9cba6e694a
commit 05b5953f35
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

@ -87,7 +87,7 @@ dependencies {
exclude group: 'org.json', module: 'json' exclude group: 'org.json', module: 'json'
} }
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.0'
implementation 'org.jetbrains.kotlin:kotlin-stdlib:2.0.10' implementation 'org.jetbrains.kotlin:kotlin-stdlib:2.0.10'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0-RC.2' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0-RC.2'

@ -56,6 +56,7 @@ abstract class TrackLogsDao : MangaQueryBuilder.ConditionCallback {
ListFilterOption.Macro.FAVORITE -> "EXISTS(SELECT * FROM favourites WHERE favourites.manga_id = track_logs.manga_id)" ListFilterOption.Macro.FAVORITE -> "EXISTS(SELECT * FROM favourites WHERE favourites.manga_id = track_logs.manga_id)"
is ListFilterOption.Favorite -> "EXISTS(SELECT * FROM favourites WHERE favourites.manga_id = track_logs.manga_id AND favourites.category_id = ${option.category.id})" is ListFilterOption.Favorite -> "EXISTS(SELECT * FROM favourites WHERE favourites.manga_id = track_logs.manga_id AND favourites.category_id = ${option.category.id})"
is ListFilterOption.Tag -> "EXISTS(SELECT * FROM manga_tags WHERE manga_tags.manga_id = track_logs.manga_id AND tag_id = ${option.tagId})" is ListFilterOption.Tag -> "EXISTS(SELECT * FROM manga_tags WHERE manga_tags.manga_id = track_logs.manga_id AND tag_id = ${option.tagId})"
ListFilterOption.Macro.NSFW -> "(SELECT nsfw FROM manga WHERE manga.manga_id = track_logs.manga_id) = 1"
else -> null else -> null
} }
} }

@ -81,6 +81,7 @@ abstract class TracksDao : MangaQueryBuilder.ConditionCallback {
ListFilterOption.Macro.FAVORITE -> "EXISTS(SELECT * FROM favourites WHERE favourites.manga_id = tracks.manga_id)" ListFilterOption.Macro.FAVORITE -> "EXISTS(SELECT * FROM favourites WHERE favourites.manga_id = tracks.manga_id)"
is ListFilterOption.Favorite -> "EXISTS(SELECT * FROM favourites WHERE favourites.manga_id = tracks.manga_id AND favourites.category_id = ${option.category.id})" is ListFilterOption.Favorite -> "EXISTS(SELECT * FROM favourites WHERE favourites.manga_id = tracks.manga_id AND favourites.category_id = ${option.category.id})"
is ListFilterOption.Tag -> "EXISTS(SELECT * FROM manga_tags WHERE manga_tags.manga_id = tracks.manga_id AND tag_id = ${option.tagId})" is ListFilterOption.Tag -> "EXISTS(SELECT * FROM manga_tags WHERE manga_tags.manga_id = tracks.manga_id AND tag_id = ${option.tagId})"
ListFilterOption.Macro.NSFW -> "(SELECT nsfw FROM manga WHERE manga.manga_id = tracks.manga_id) = 1"
else -> null else -> null
} }
} }

@ -4,6 +4,7 @@ import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.CoroutineStart
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.catch
@ -15,12 +16,14 @@ import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.plus import kotlinx.coroutines.plus
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.core.prefs.observeAsFlow
import org.koitharu.kotatsu.core.prefs.observeAsStateFlow import org.koitharu.kotatsu.core.prefs.observeAsStateFlow
import org.koitharu.kotatsu.core.ui.BaseViewModel import org.koitharu.kotatsu.core.ui.BaseViewModel
import org.koitharu.kotatsu.core.ui.model.DateTimeAgo import org.koitharu.kotatsu.core.ui.model.DateTimeAgo
import org.koitharu.kotatsu.core.util.ext.MutableEventFlow import org.koitharu.kotatsu.core.util.ext.MutableEventFlow
import org.koitharu.kotatsu.core.util.ext.calculateTimeAgo import org.koitharu.kotatsu.core.util.ext.calculateTimeAgo
import org.koitharu.kotatsu.core.util.ext.call import org.koitharu.kotatsu.core.util.ext.call
import org.koitharu.kotatsu.list.domain.ListFilterOption
import org.koitharu.kotatsu.list.domain.MangaListMapper import org.koitharu.kotatsu.list.domain.MangaListMapper
import org.koitharu.kotatsu.list.domain.QuickFilterListener import org.koitharu.kotatsu.list.domain.QuickFilterListener
import org.koitharu.kotatsu.list.ui.model.EmptyState import org.koitharu.kotatsu.list.ui.model.EmptyState
@ -67,7 +70,7 @@ class FeedViewModel @Inject constructor(
val content = combine( val content = combine(
observeHeader(), observeHeader(),
quickFilter.appliedOptions, quickFilter.appliedOptions,
combine(limit, quickFilter.appliedOptions, ::Pair) combine(limit, quickFilter.appliedOptions.combineWithSettings(), ::Pair)
.flatMapLatest { repository.observeTrackingLog(it.first, it.second) }, .flatMapLatest { repository.observeTrackingLog(it.first, it.second) },
) { header, filters, list -> ) { header, filters, list ->
val result = ArrayList<ListModel>((list.size * 1.4).toInt().coerceAtLeast(3)) val result = ArrayList<ListModel>((list.size * 1.4).toInt().coerceAtLeast(3))
@ -141,7 +144,7 @@ class FeedViewModel @Inject constructor(
private fun observeHeader() = isHeaderEnabled.flatMapLatest { hasHeader -> private fun observeHeader() = isHeaderEnabled.flatMapLatest { hasHeader ->
if (hasHeader) { if (hasHeader) {
quickFilter.appliedOptions.flatMapLatest { quickFilter.appliedOptions.combineWithSettings().flatMapLatest {
repository.observeUpdatedManga(10, it) repository.observeUpdatedManga(10, it)
}.map { mangaList -> }.map { mangaList ->
if (mangaList.isEmpty()) { if (mangaList.isEmpty()) {
@ -156,4 +159,14 @@ class FeedViewModel @Inject constructor(
flowOf(null) flowOf(null)
} }
} }
private fun Flow<Set<ListFilterOption>>.combineWithSettings(): Flow<Set<ListFilterOption>> = 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
}
}
} }

@ -49,7 +49,7 @@ class TrackerNotificationHelper @Inject constructor(
if (newChapters.isEmpty() || !applicationContext.checkNotificationPermission(CHANNEL_ID)) { if (newChapters.isEmpty() || !applicationContext.checkNotificationPermission(CHANNEL_ID)) {
return null return null
} }
if (manga.isNsfw && settings.isTrackerNsfwDisabled) { if (manga.isNsfw && (settings.isTrackerNsfwDisabled || settings.isNsfwContentDisabled)) {
return null return null
} }
val id = manga.url.hashCode() val id = manga.url.hashCode()

Loading…
Cancel
Save