From 6618f848ea5db2c2cd816dfcdff5a9ff99e19a01 Mon Sep 17 00:00:00 2001 From: arkon Date: Mon, 13 Sep 2021 17:49:58 -0400 Subject: [PATCH] Unify NSFW flagging for sources/extensions Since multisource extensions are no longer a thing, we now simply rely on the flag at the extension level, i.e. the per-Source/SourceFactory `@Nsfw` annotation is no longer checked. We'll have to remove all of the annotation usages from the existing sources, which will also effectively break the setting for older versions of the app. (cherry picked from commit a2cf210a524894e5c1d1f062e4813086b46777a4) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionHolder.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionPresenter.kt --- .../eu/kanade/tachiyomi/annotations/Nsfw.kt | 1 + .../data/preference/PreferenceKeys.kt | 2 -- .../data/preference/PreferencesHelper.kt | 2 -- .../extension/util/ExtensionLoader.kt | 28 +------------------ .../kanade/tachiyomi/source/SourceManager.kt | 1 - .../ui/browse/extension/ExtensionHolder.kt | 9 +----- .../ui/browse/extension/ExtensionPresenter.kt | 8 +++--- .../ui/setting/SettingsBrowseController.kt | 14 ---------- app/src/main/res/values/strings.xml | 4 +-- 9 files changed, 8 insertions(+), 61 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/annotations/Nsfw.kt b/app/src/main/java/eu/kanade/tachiyomi/annotations/Nsfw.kt index 964a42702..bc22dde13 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/annotations/Nsfw.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/annotations/Nsfw.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.annotations +// TODO: remove this when no longer used in extensions @Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.CLASS) annotation class Nsfw diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt index 917d03449..78d5c069e 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt @@ -160,8 +160,6 @@ object PreferenceKeys { const val automaticExtUpdates = "automatic_ext_updates" const val showNsfwSource = "show_nsfw_source" - const val showNsfwExtension = "show_nsfw_extension" - const val labelNsfwExtension = "label_nsfw_extension" const val startScreen = "start_screen" diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt index ef5d9836d..e33b05897 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt @@ -279,8 +279,6 @@ class PreferencesHelper(val context: Context) { fun automaticExtUpdates() = flowPrefs.getBoolean(Keys.automaticExtUpdates, true) fun showNsfwSource() = flowPrefs.getBoolean(Keys.showNsfwSource, true) - fun showNsfwExtension() = flowPrefs.getBoolean(Keys.showNsfwExtension, true) - fun labelNsfwExtension() = prefs.getBoolean(Keys.labelNsfwExtension, true) fun extensionUpdatesCount() = flowPrefs.getInt("ext_updates_count", 0) diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt index c2ec94041..cea226994 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt @@ -6,7 +6,6 @@ import android.content.pm.PackageInfo import android.content.pm.PackageManager import androidx.core.content.pm.PackageInfoCompat import dalvik.system.PathClassLoader -import eu.kanade.tachiyomi.annotations.Nsfw import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.extension.model.Extension import eu.kanade.tachiyomi.extension.model.LoadResult @@ -154,13 +153,7 @@ internal object ExtensionLoader { try { when (val obj = Class.forName(it, false, classLoader).newInstance()) { is Source -> listOf(obj) - is SourceFactory -> { - if (isSourceNsfw(obj)) { - emptyList() - } else { - obj.createSources() - } - } + is SourceFactory -> obj.createSources() else -> throw Exception("Unknown source class type! ${obj.javaClass}") } } catch (e: Throwable) { @@ -168,7 +161,6 @@ internal object ExtensionLoader { return LoadResult.Error(e) } } - .filter { !isSourceNsfw(it) } val langs = sources.filterIsInstance() .map { it.lang } @@ -215,22 +207,4 @@ internal object ExtensionLoader { null } } - - /** - * Checks whether a Source or SourceFactory is annotated with @Nsfw. - */ - private fun isSourceNsfw(clazz: Any): Boolean { - if (loadNsfwSource) { - return false - } - - if (clazz !is Source && clazz !is SourceFactory) { - return false - } - - // Annotations are proxied, hence this janky way of checking for them - return clazz.javaClass.annotations - .flatMap { it.javaClass.interfaces.map { it.simpleName } } - .firstOrNull { it == Nsfw::class.java.simpleName } != null - } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt b/app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt index cd280aa1a..1e11a46c9 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt @@ -43,7 +43,6 @@ import kotlin.reflect.KClass open class SourceManager(private val context: Context) { private val sourcesMap = mutableMapOf() - private val stubSourcesMap = mutableMapOf() // SY --> diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionHolder.kt index 1a3099fbf..d719ea2e9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionHolder.kt @@ -6,14 +6,12 @@ import coil.clear import coil.load import eu.davidea.viewholders.FlexibleViewHolder import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.databinding.ExtensionCardItemBinding import eu.kanade.tachiyomi.extension.api.ExtensionGithubApi import eu.kanade.tachiyomi.extension.model.Extension import eu.kanade.tachiyomi.extension.model.InstallStep import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.util.system.LocaleHelper -import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class ExtensionHolder(view: View, val adapter: ExtensionAdapter) : @@ -21,10 +19,6 @@ class ExtensionHolder(view: View, val adapter: ExtensionAdapter) : private val binding = ExtensionCardItemBinding.bind(view) - private val shouldLabelNsfw by lazy { - Injekt.get().labelNsfwExtension() - } - init { binding.extButton.setOnClickListener { adapter.buttonClickListener.onButtonClick(bindingAdapterPosition) @@ -42,8 +36,7 @@ class ExtensionHolder(view: View, val adapter: ExtensionAdapter) : extension is Extension.Installed && extension.isUnofficial -> itemView.context.getString(R.string.ext_unofficial) extension is Extension.Installed && extension.isObsolete -> itemView.context.getString(R.string.ext_obsolete) // SY --> - extension is Extension.Installed && extension.isRedundant -> itemView.context.getString(R.string.ext_redundant) - extension.isNsfw && shouldLabelNsfw -> itemView.context.getString(R.string.ext_nsfw_short).plusRepo(extension) + extension.isNsfw -> itemView.context.getString(R.string.ext_nsfw_short).plusRepo(extension) else -> "".plusRepo(extension) // SY <-- }.uppercase() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionPresenter.kt index 368521b01..79d105048 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionPresenter.kt @@ -55,14 +55,14 @@ open class ExtensionPresenter( private fun toItems(tuple: ExtensionTuple): List { val context = Injekt.get() val activeLangs = preferences.enabledLanguages().get() - val showNsfwExtensions = preferences.showNsfwExtension().get() + val showNsfwSources = preferences.showNsfwSource().get() val (installed, untrusted, available) = tuple val items = mutableListOf() - val updatesSorted = installed.filter { it.hasUpdate && (showNsfwExtensions || !it.isNsfw) }.sortedBy { it.name } - val installedSorted = installed.filter { !it.hasUpdate && (showNsfwExtensions || !it.isNsfw) }.sortedWith(compareBy({ !it.isObsolete /* SY --> */ && !it.isRedundant /* SY <-- */ }, { it.name })) + val updatesSorted = installed.filter { it.hasUpdate && (showNsfwSources || !it.isNsfw) }.sortedBy { it.name } + val installedSorted = installed.filter { !it.hasUpdate && (showNsfwSources || !it.isNsfw) }.sortedWith(compareBy({ !it.isObsolete /* SY --> */ && !it.isRedundant /* SY <-- */ }, { it.name })) val untrustedSorted = untrusted.sortedBy { it.name } val availableSorted = available // Filter out already installed extensions and disabled languages @@ -70,7 +70,7 @@ open class ExtensionPresenter( installed.none { it.pkgName == avail.pkgName } && untrusted.none { it.pkgName == avail.pkgName } && (avail.lang in activeLangs || avail.lang == "all") && - (showNsfwExtensions || !avail.isNsfw) + (showNsfwSources || !avail.isNsfw) } .sortedBy { it.name } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBrowseController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBrowseController.kt index 9c6f76ca3..2ba155763 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBrowseController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBrowseController.kt @@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.ui.setting import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.data.preference.asImmediateFlow import eu.kanade.tachiyomi.extension.ExtensionUpdateJob import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction import eu.kanade.tachiyomi.ui.category.repos.RepoController @@ -16,7 +15,6 @@ import eu.kanade.tachiyomi.util.preference.preferenceCategory import eu.kanade.tachiyomi.util.preference.summaryRes import eu.kanade.tachiyomi.util.preference.switchPreference import eu.kanade.tachiyomi.util.preference.titleRes -import kotlinx.coroutines.flow.launchIn import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys class SettingsBrowseController : SettingsController() { @@ -119,18 +117,6 @@ class SettingsBrowseController : SettingsController() { summaryRes = R.string.requires_app_restart defaultValue = true } - switchPreference { - key = Keys.showNsfwExtension - titleRes = R.string.pref_show_nsfw_extension - defaultValue = true - } - switchPreference { - key = Keys.labelNsfwExtension - titleRes = R.string.pref_label_nsfw_extension - defaultValue = true - - preferences.showNsfwExtension().asImmediateFlow { isVisible = it }.launchIn(viewScope) - } infoPreference(R.string.parental_controls_info) } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6c47f3b31..aba974421 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -189,9 +189,7 @@ Hide notification content NSFW (18+) sources - Show in sources list - Show in extensions list - Label in extensions list + Show in sources and extensions lists This does not prevent unofficial or potentially incorrectly flagged extensions from surfacing NSFW (18+) content within the app. Recently