diff --git a/app/src/main/java/eu/kanade/domain/source/service/SourcePreferences.kt b/app/src/main/java/eu/kanade/domain/source/service/SourcePreferences.kt index 39c64eb02..9df4bd09d 100644 --- a/app/src/main/java/eu/kanade/domain/source/service/SourcePreferences.kt +++ b/app/src/main/java/eu/kanade/domain/source/service/SourcePreferences.kt @@ -48,6 +48,11 @@ class SourcePreferences( setOf(ContentWarning.SAFE, ContentWarning.MIXED, ContentWarning.NSFW), ) + val applyContentWarningsToInstalled: Preference = preferenceStore.getBoolean( + "apply_content_warnings_to_installed", + true, + ) + val migrationSortingMode: Preference = preferenceStore.getEnum( "pref_migration_sorting", SetMigrateSorting.Mode.ALPHABETICAL, diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBrowseScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBrowseScreen.kt index 7d88d827b..a449dfba9 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBrowseScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBrowseScreen.kt @@ -81,6 +81,22 @@ object SettingsBrowseScreen : SearchableSettings { } }, ), + Preference.PreferenceItem.SwitchPreference( + preference = sourcePreferences.applyContentWarningsToInstalled, + title = stringResource(MR.strings.pref_apply_content_warnings_to_installed), + subtitle = stringResource(MR.strings.pref_apply_content_warnings_to_installed_summary), + onValueChanged = { newValue -> + if (newValue) { + true + } else { + (context as FragmentActivity).authenticate( + title = context.stringResource( + MR.strings.pref_apply_content_warnings_to_installed, + ), + ) + } + }, + ), Preference.PreferenceItem.InfoPreference(stringResource(MR.strings.content_warnings_info)), ), ), 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 e2a0552d4..a9276566a 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 @@ -223,7 +223,9 @@ internal object ExtensionLoader { */ private suspend fun loadExtension(context: Context, extensionInfo: ExtensionInfo): LoadResult { val trustExtension: TrustExtension = context.appGraph.trustExtension - val enabledContentWarnings = context.appGraph.sourcePreferences.enabledContentWarnings.get() + val sourcePreferences = context.appGraph.sourcePreferences + val enabledContentWarnings = sourcePreferences.enabledContentWarnings.get() + val applyContentWarningsToInstalled = sourcePreferences.applyContentWarningsToInstalled.get() val pkgManager = context.packageManager val pkgInfo = extensionInfo.packageInfo @@ -281,7 +283,7 @@ internal object ExtensionLoader { appInfo.metaData.getInt(METADATA_NSFW) == 1 -> ContentWarning.NSFW else -> ContentWarning.SAFE } - if (contentWarning !in enabledContentWarnings) { + if (applyContentWarningsToInstalled && contentWarning !in enabledContentWarnings) { logcat(LogPriority.WARN) { "Extension $pkgName with $contentWarning not allowed" } return LoadResult.Error } diff --git a/i18n/src/commonMain/moko-resources/base/strings.xml b/i18n/src/commonMain/moko-resources/base/strings.xml index b55589c09..452a4c6b8 100644 --- a/i18n/src/commonMain/moko-resources/base/strings.xml +++ b/i18n/src/commonMain/moko-resources/base/strings.xml @@ -268,6 +268,8 @@ Extensions Allowed content warnings + Also apply to installed extensions + When off, extensions you already installed keep loading and updating regardless of their warning Requires app restart to take effect. Extensions that aren\'t loaded won\'t provide their sources anywhere in the app. This does not prevent unofficial or potentially incorrectly flagged extensions from surfacing 18+ content within the app. Today