setting to enable screenshot protection

This commit is contained in:
Fabian Freund
2026-05-01 05:18:32 +02:00
parent e7ccd1cf89
commit 0f011351ff
14 changed files with 2347 additions and 3193 deletions
@@ -107,6 +107,23 @@ class EngineSettingsReplicationService
},
);
ref.listen(
fireImmediately: true,
generalSettingsWithDefaultsProvider.select(
(settings) => settings.screenshotProtectionEnabled,
),
(previous, next) async {
await _service.setScreenshotProtectionEnabled(next);
},
onError: (error, stackTrace) {
logger.e(
'Error listening to screenshotProtectionEnabled',
error: error,
stackTrace: stackTrace,
);
},
);
ref.listen(
fireImmediately: true,
generalSettingsWithDefaultsProvider.select(
@@ -44,7 +44,7 @@ final class EngineSettingsReplicationServiceProvider
}
String _$engineSettingsReplicationServiceHash() =>
r'71b611a99af83187e392d16288cec280ef44269f';
r'8f37476c9beecd6cc70a07b8cd3a51864b077176';
abstract class _$EngineSettingsReplicationService extends $Notifier<void> {
void build();
@@ -144,6 +144,7 @@ class _PrivacySignalsSection extends StatelessWidget {
children: [
SettingSection(name: 'Privacy Signals & Modes'),
_IncognitoModeSection(),
_ScreenshotProtectionTile(),
_GlobalPrivacyControlTile(),
],
);
@@ -452,6 +453,36 @@ class _GlobalPrivacyControlTile extends HookConsumerWidget {
}
}
class _ScreenshotProtectionTile extends HookConsumerWidget {
const _ScreenshotProtectionTile();
@override
Widget build(BuildContext context, WidgetRef ref) {
final enabled = ref.watch(
generalSettingsWithDefaultsProvider.select(
(s) => s.screenshotProtectionEnabled,
),
);
return SwitchListTile.adaptive(
title: const Text('Screenshot protection'),
subtitle: const Text(
'Blocks screenshots and screen recordings for this app on Android.',
),
secondary: const Icon(MdiIcons.cameraOff),
value: enabled,
onChanged: (value) async {
await ref
.read(saveGeneralSettingsControllerProvider.notifier)
.save(
(currentSettings) => currentSettings.copyWith
.screenshotProtectionEnabled(value),
);
},
);
}
}
class _HttpsOnlyModeSection extends HookConsumerWidget {
const _HttpsOnlyModeSection();
@@ -76,6 +76,7 @@ class GeneralSettings with FastEquatable {
final bool enableReadability;
final bool enforceReadability;
final Set<DeleteBrowsingDataType>? deleteBrowsingDataOnQuit;
final bool screenshotProtectionEnabled;
@BangKeyConverter()
final BangKey? defaultSearchProvider;
final SearchSuggestionProviders defaultSearchSuggestionsProvider;
@@ -131,6 +132,7 @@ class GeneralSettings with FastEquatable {
required this.enableReadability,
required this.enforceReadability,
required this.deleteBrowsingDataOnQuit,
required this.screenshotProtectionEnabled,
required this.defaultSearchProvider,
required this.defaultSearchSuggestionsProvider,
required this.createChildTabsOption,
@@ -185,6 +187,7 @@ class GeneralSettings with FastEquatable {
bool? enableReadability,
bool? enforceReadability,
this.deleteBrowsingDataOnQuit,
bool? screenshotProtectionEnabled,
BangKey? defaultSearchProvider,
SearchSuggestionProviders? defaultSearchSuggestionsProvider,
bool? createChildTabsOption,
@@ -233,9 +236,10 @@ class GeneralSettings with FastEquatable {
uiScaleFactor = uiScaleFactor ?? defaultUiScaleFactor,
disableAnimations = disableAnimations ?? false,
showModalBarrier = showModalBarrier ?? true,
enableReadability = enableReadability ?? true,
enforceReadability = enforceReadability ?? false,
defaultSearchProvider = defaultSearchProvider ?? _fallbackSearchProvider,
enableReadability = enableReadability ?? true,
enforceReadability = enforceReadability ?? false,
screenshotProtectionEnabled = screenshotProtectionEnabled ?? false,
defaultSearchProvider = defaultSearchProvider ?? _fallbackSearchProvider,
defaultSearchSuggestionsProvider =
defaultSearchSuggestionsProvider ?? _fallbackAutocompleteProvider,
createChildTabsOption = createChildTabsOption ?? false,
@@ -320,6 +324,7 @@ class GeneralSettings with FastEquatable {
enableReadability,
enforceReadability,
deleteBrowsingDataOnQuit,
screenshotProtectionEnabled,
defaultSearchProvider,
defaultSearchSuggestionsProvider,
createChildTabsOption,
@@ -23,6 +23,8 @@ abstract class _$GeneralSettingsCWProxy {
Set<DeleteBrowsingDataType>? deleteBrowsingDataOnQuit,
);
GeneralSettings screenshotProtectionEnabled(bool screenshotProtectionEnabled);
GeneralSettings defaultSearchProvider(BangKey? defaultSearchProvider);
GeneralSettings defaultSearchSuggestionsProvider(
@@ -144,6 +146,7 @@ abstract class _$GeneralSettingsCWProxy {
bool enableReadability,
bool enforceReadability,
Set<DeleteBrowsingDataType>? deleteBrowsingDataOnQuit,
bool screenshotProtectionEnabled,
BangKey? defaultSearchProvider,
SearchSuggestionProviders defaultSearchSuggestionsProvider,
bool createChildTabsOption,
@@ -226,6 +229,11 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy {
Set<DeleteBrowsingDataType>? deleteBrowsingDataOnQuit,
) => call(deleteBrowsingDataOnQuit: deleteBrowsingDataOnQuit);
@override
GeneralSettings screenshotProtectionEnabled(
bool screenshotProtectionEnabled,
) => call(screenshotProtectionEnabled: screenshotProtectionEnabled);
@override
GeneralSettings defaultSearchProvider(BangKey? defaultSearchProvider) =>
call(defaultSearchProvider: defaultSearchProvider);
@@ -431,6 +439,7 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy {
Object? enableReadability = const $CopyWithPlaceholder(),
Object? enforceReadability = const $CopyWithPlaceholder(),
Object? deleteBrowsingDataOnQuit = const $CopyWithPlaceholder(),
Object? screenshotProtectionEnabled = const $CopyWithPlaceholder(),
Object? defaultSearchProvider = const $CopyWithPlaceholder(),
Object? defaultSearchSuggestionsProvider = const $CopyWithPlaceholder(),
Object? createChildTabsOption = const $CopyWithPlaceholder(),
@@ -516,6 +525,12 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy {
? _value.deleteBrowsingDataOnQuit
// ignore: cast_nullable_to_non_nullable
: deleteBrowsingDataOnQuit as Set<DeleteBrowsingDataType>?,
screenshotProtectionEnabled:
screenshotProtectionEnabled == const $CopyWithPlaceholder() ||
screenshotProtectionEnabled == null
? _value.screenshotProtectionEnabled
// ignore: cast_nullable_to_non_nullable
: screenshotProtectionEnabled as bool,
defaultSearchProvider:
defaultSearchProvider == const $CopyWithPlaceholder()
? _value.defaultSearchProvider
@@ -805,6 +820,7 @@ GeneralSettings _$GeneralSettingsFromJson(
deleteBrowsingDataOnQuit: (json['deleteBrowsingDataOnQuit'] as List<dynamic>?)
?.map((e) => $enumDecode(_$DeleteBrowsingDataTypeEnumMap, e))
.toSet(),
screenshotProtectionEnabled: json['screenshotProtectionEnabled'] as bool?,
defaultSearchProvider: const BangKeyConverter().fromJson(
json['defaultSearchProvider'] as String?,
),
@@ -908,6 +924,7 @@ Map<String, dynamic> _$GeneralSettingsToJson(
'deleteBrowsingDataOnQuit': instance.deleteBrowsingDataOnQuit
?.map((e) => _$DeleteBrowsingDataTypeEnumMap[e]!)
.toList(),
'screenshotProtectionEnabled': instance.screenshotProtectionEnabled,
'defaultSearchProvider': const BangKeyConverter().toJson(
instance.defaultSearchProvider,
),
@@ -71,6 +71,8 @@ class GeneralSettingsRepository extends _$GeneralSettingsRepository {
'deleteBrowsingDataOnQuit': settings['deleteBrowsingDataOnQuit']
?.readAs(DriftSqlType.string, db.typeMapping)
.mapNotNull(jsonDecode),
'screenshotProtectionEnabled': settings['screenshotProtectionEnabled']
?.readAs(DriftSqlType.bool, db.typeMapping),
'defaultSearchProvider': settings['defaultSearchProvider']?.readAs(
DriftSqlType.string,
db.typeMapping,
@@ -35,7 +35,7 @@ final class GeneralSettingsRepositoryProvider
}
String _$generalSettingsRepositoryHash() =>
r'9d34ea4b802d2d1b1c9543f41ad5fdf28f279e06';
r'f75d5cb1963c16404f5fd02db0097b72451717eb';
abstract class _$GeneralSettingsRepository
extends $StreamNotifier<GeneralSettings> {