Allow user to load installed extensions regardless of content warning (#3952)

This commit is contained in:
AntsyLich
2026-09-14 21:22:32 +06:00
committed by GitHub
parent a5cd541bdf
commit 0e0bc6972a
4 changed files with 27 additions and 2 deletions
@@ -48,6 +48,11 @@ class SourcePreferences(
setOf(ContentWarning.SAFE, ContentWarning.MIXED, ContentWarning.NSFW), setOf(ContentWarning.SAFE, ContentWarning.MIXED, ContentWarning.NSFW),
) )
val applyContentWarningsToInstalled: Preference<Boolean> = preferenceStore.getBoolean(
"apply_content_warnings_to_installed",
true,
)
val migrationSortingMode: Preference<SetMigrateSorting.Mode> = preferenceStore.getEnum( val migrationSortingMode: Preference<SetMigrateSorting.Mode> = preferenceStore.getEnum(
"pref_migration_sorting", "pref_migration_sorting",
SetMigrateSorting.Mode.ALPHABETICAL, SetMigrateSorting.Mode.ALPHABETICAL,
@@ -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)), Preference.PreferenceItem.InfoPreference(stringResource(MR.strings.content_warnings_info)),
), ),
), ),
@@ -223,7 +223,9 @@ internal object ExtensionLoader {
*/ */
private suspend fun loadExtension(context: Context, extensionInfo: ExtensionInfo): LoadResult { private suspend fun loadExtension(context: Context, extensionInfo: ExtensionInfo): LoadResult {
val trustExtension: TrustExtension = context.appGraph.trustExtension 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 pkgManager = context.packageManager
val pkgInfo = extensionInfo.packageInfo val pkgInfo = extensionInfo.packageInfo
@@ -281,7 +283,7 @@ internal object ExtensionLoader {
appInfo.metaData.getInt(METADATA_NSFW) == 1 -> ContentWarning.NSFW appInfo.metaData.getInt(METADATA_NSFW) == 1 -> ContentWarning.NSFW
else -> ContentWarning.SAFE else -> ContentWarning.SAFE
} }
if (contentWarning !in enabledContentWarnings) { if (applyContentWarningsToInstalled && contentWarning !in enabledContentWarnings) {
logcat(LogPriority.WARN) { "Extension $pkgName with $contentWarning not allowed" } logcat(LogPriority.WARN) { "Extension $pkgName with $contentWarning not allowed" }
return LoadResult.Error return LoadResult.Error
} }
@@ -268,6 +268,8 @@
<string name="pref_category_extensions">Extensions</string> <string name="pref_category_extensions">Extensions</string>
<string name="pref_allowed_content_warnings">Allowed content warnings</string> <string name="pref_allowed_content_warnings">Allowed content warnings</string>
<string name="pref_apply_content_warnings_to_installed">Also apply to installed extensions</string>
<string name="pref_apply_content_warnings_to_installed_summary">When off, extensions you already installed keep loading and updating regardless of their warning</string>
<string name="content_warnings_info">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.</string> <string name="content_warnings_info">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.</string>
<string name="relative_time_today">Today</string> <string name="relative_time_today">Today</string>