costom tabs setting
This commit is contained in:
+10
-1
@@ -45,7 +45,12 @@ class NativeIntentGatekeeperReplicator
|
||||
Future<void>? _pendingAllowSync;
|
||||
|
||||
Future<void> _push(
|
||||
({bool enabled, Map<String, IntentSourcePolicy> policies}) config,
|
||||
({
|
||||
bool enabled,
|
||||
Map<String, IntentSourcePolicy> policies,
|
||||
bool customTabsEnabled,
|
||||
})
|
||||
config,
|
||||
) async {
|
||||
final blocked = config.policies.entries
|
||||
.where((entry) => entry.value == IntentSourcePolicy.block)
|
||||
@@ -54,6 +59,7 @@ class NativeIntentGatekeeperReplicator
|
||||
|
||||
try {
|
||||
await _api.setConfig(config.enabled, blocked);
|
||||
await _api.setCustomTabsEnabled(config.customTabsEnabled);
|
||||
} catch (error, stackTrace) {
|
||||
logger.e(
|
||||
'Failed to replicate intent gatekeeper config to native',
|
||||
@@ -116,6 +122,7 @@ class NativeIntentGatekeeperReplicator
|
||||
(settings) => EquatableValue((
|
||||
enabled: settings.blockExternalAppsEnabled,
|
||||
policies: settings.externalAppIntentPolicies,
|
||||
customTabsEnabled: settings.customTabsEnabled,
|
||||
)),
|
||||
),
|
||||
fireImmediately: true,
|
||||
@@ -125,6 +132,7 @@ class NativeIntentGatekeeperReplicator
|
||||
|
||||
if (previous != null &&
|
||||
previous.enabled == next.enabled &&
|
||||
previous.customTabsEnabled == next.customTabsEnabled &&
|
||||
const DeepCollectionEquality.unordered().equals(
|
||||
previous.policies,
|
||||
next.policies,
|
||||
@@ -139,6 +147,7 @@ class NativeIntentGatekeeperReplicator
|
||||
await _push((
|
||||
enabled: settings.blockExternalAppsEnabled,
|
||||
policies: settings.externalAppIntentPolicies,
|
||||
customTabsEnabled: settings.customTabsEnabled,
|
||||
));
|
||||
}());
|
||||
},
|
||||
|
||||
+1
-1
@@ -65,7 +65,7 @@ final class NativeIntentGatekeeperReplicatorProvider
|
||||
}
|
||||
|
||||
String _$nativeIntentGatekeeperReplicatorHash() =>
|
||||
r'bb2e2a252143879e558d513f9c48f3e66513baa9';
|
||||
r'1425d7d540d872d82a2d97e0a9fff6a4f6d9ae7b';
|
||||
|
||||
/// Mirrors the Flutter-side block list to the native side so the
|
||||
/// `IntentReceiverActivity` can reject intents without launching Flutter.
|
||||
|
||||
@@ -144,6 +144,20 @@ const List<SettingsSectionDefinition> browsingSettingsSections = [
|
||||
keywords: ['intents'],
|
||||
child: _ExternalLinkHandlingSection(),
|
||||
),
|
||||
SettingsEntryDefinition(
|
||||
title: 'Custom Tabs',
|
||||
subtitle:
|
||||
'Let other apps open links in a lightweight in-app tab, instead '
|
||||
'of the main browser',
|
||||
keywords: [
|
||||
'custom tabs',
|
||||
'in-app browser',
|
||||
'chrome custom tabs',
|
||||
'external app',
|
||||
'share',
|
||||
],
|
||||
child: _CustomTabsTile(),
|
||||
),
|
||||
SettingsEntryDefinition(
|
||||
title: 'URL Cleaner',
|
||||
subtitle: 'Tracking removal rules and catalog updates',
|
||||
@@ -821,6 +835,35 @@ class _PullToRefreshTile extends HookConsumerWidget {
|
||||
}
|
||||
}
|
||||
|
||||
class _CustomTabsTile extends HookConsumerWidget {
|
||||
const _CustomTabsTile();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final customTabsEnabled = ref.watch(
|
||||
generalSettingsWithDefaultsProvider.select((s) => s.customTabsEnabled),
|
||||
);
|
||||
|
||||
return SwitchListTile.adaptive(
|
||||
title: const Text('Custom Tabs'),
|
||||
subtitle: const Text(
|
||||
'Let other apps open links in a lightweight in-app tab. When off, '
|
||||
'these links and shared URLs open as normal tabs in the main browser.',
|
||||
),
|
||||
secondary: const Icon(Icons.web_asset),
|
||||
value: customTabsEnabled,
|
||||
onChanged: (value) async {
|
||||
await ref
|
||||
.read(saveGeneralSettingsControllerProvider.notifier)
|
||||
.save(
|
||||
(currentSettings) =>
|
||||
currentSettings.copyWith.customTabsEnabled(value),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _DoubleBackCloseTabTile extends HookConsumerWidget {
|
||||
const _DoubleBackCloseTabTile();
|
||||
|
||||
|
||||
@@ -196,6 +196,12 @@ class GeneralSettings with FastEquatable {
|
||||
final bool blockExternalAppsEnabled;
|
||||
final Map<String, IntentSourcePolicy> externalAppIntentPolicies;
|
||||
|
||||
/// Whether external Custom Tab intents (and URLs shared into WebLibre) open
|
||||
/// in a lightweight custom-tab activity. When false, they open as normal
|
||||
/// tabs in the main browser instead. Read natively by `IntentReceiverActivity`
|
||||
/// via the intent gatekeeper prefs bridge. Defaults to true.
|
||||
final bool customTabsEnabled;
|
||||
|
||||
/// Whether the local search index (`history` table populated via tab→
|
||||
/// history triggers) is active. When false, the SQL trigger guard returns
|
||||
/// without writing; existing rows stay until the user clears them.
|
||||
@@ -289,6 +295,7 @@ class GeneralSettings with FastEquatable {
|
||||
required this.allowNonManifestPwaInstall,
|
||||
required this.blockExternalAppsEnabled,
|
||||
required this.externalAppIntentPolicies,
|
||||
required this.customTabsEnabled,
|
||||
required this.enableLocalSearchIndex,
|
||||
required this.indexPrivateTabs,
|
||||
required this.acceptSuggestionOnSubmit,
|
||||
@@ -356,6 +363,7 @@ class GeneralSettings with FastEquatable {
|
||||
bool? allowNonManifestPwaInstall,
|
||||
bool? blockExternalAppsEnabled,
|
||||
Map<String, IntentSourcePolicy>? externalAppIntentPolicies,
|
||||
bool? customTabsEnabled,
|
||||
bool? enableLocalSearchIndex,
|
||||
bool? indexPrivateTabs,
|
||||
bool? acceptSuggestionOnSubmit,
|
||||
@@ -433,6 +441,7 @@ class GeneralSettings with FastEquatable {
|
||||
allowNonManifestPwaInstall = allowNonManifestPwaInstall ?? false,
|
||||
blockExternalAppsEnabled = blockExternalAppsEnabled ?? false,
|
||||
externalAppIntentPolicies = externalAppIntentPolicies ?? const {},
|
||||
customTabsEnabled = customTabsEnabled ?? true,
|
||||
enableLocalSearchIndex = enableLocalSearchIndex ?? true,
|
||||
indexPrivateTabs = indexPrivateTabs ?? false,
|
||||
acceptSuggestionOnSubmit = acceptSuggestionOnSubmit ?? false,
|
||||
@@ -574,6 +583,7 @@ class GeneralSettings with FastEquatable {
|
||||
allowNonManifestPwaInstall,
|
||||
blockExternalAppsEnabled,
|
||||
externalAppIntentPolicies,
|
||||
customTabsEnabled,
|
||||
enableLocalSearchIndex,
|
||||
indexPrivateTabs,
|
||||
acceptSuggestionOnSubmit,
|
||||
|
||||
@@ -141,6 +141,8 @@ abstract class _$GeneralSettingsCWProxy {
|
||||
Map<String, IntentSourcePolicy> externalAppIntentPolicies,
|
||||
);
|
||||
|
||||
GeneralSettings customTabsEnabled(bool customTabsEnabled);
|
||||
|
||||
GeneralSettings enableLocalSearchIndex(bool enableLocalSearchIndex);
|
||||
|
||||
GeneralSettings indexPrivateTabs(bool indexPrivateTabs);
|
||||
@@ -220,6 +222,7 @@ abstract class _$GeneralSettingsCWProxy {
|
||||
bool allowNonManifestPwaInstall,
|
||||
bool blockExternalAppsEnabled,
|
||||
Map<String, IntentSourcePolicy> externalAppIntentPolicies,
|
||||
bool customTabsEnabled,
|
||||
bool enableLocalSearchIndex,
|
||||
bool indexPrivateTabs,
|
||||
bool acceptSuggestionOnSubmit,
|
||||
@@ -483,6 +486,10 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy {
|
||||
Map<String, IntentSourcePolicy> externalAppIntentPolicies,
|
||||
) => call(externalAppIntentPolicies: externalAppIntentPolicies);
|
||||
|
||||
@override
|
||||
GeneralSettings customTabsEnabled(bool customTabsEnabled) =>
|
||||
call(customTabsEnabled: customTabsEnabled);
|
||||
|
||||
@override
|
||||
GeneralSettings enableLocalSearchIndex(bool enableLocalSearchIndex) =>
|
||||
call(enableLocalSearchIndex: enableLocalSearchIndex);
|
||||
@@ -578,6 +585,7 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy {
|
||||
Object? allowNonManifestPwaInstall = const $CopyWithPlaceholder(),
|
||||
Object? blockExternalAppsEnabled = const $CopyWithPlaceholder(),
|
||||
Object? externalAppIntentPolicies = const $CopyWithPlaceholder(),
|
||||
Object? customTabsEnabled = const $CopyWithPlaceholder(),
|
||||
Object? enableLocalSearchIndex = const $CopyWithPlaceholder(),
|
||||
Object? indexPrivateTabs = const $CopyWithPlaceholder(),
|
||||
Object? acceptSuggestionOnSubmit = const $CopyWithPlaceholder(),
|
||||
@@ -924,6 +932,12 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy {
|
||||
? _value.externalAppIntentPolicies
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: externalAppIntentPolicies as Map<String, IntentSourcePolicy>,
|
||||
customTabsEnabled:
|
||||
customTabsEnabled == const $CopyWithPlaceholder() ||
|
||||
customTabsEnabled == null
|
||||
? _value.customTabsEnabled
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: customTabsEnabled as bool,
|
||||
enableLocalSearchIndex:
|
||||
enableLocalSearchIndex == const $CopyWithPlaceholder() ||
|
||||
enableLocalSearchIndex == null
|
||||
@@ -1095,6 +1109,7 @@ GeneralSettings _$GeneralSettingsFromJson(
|
||||
(json['externalAppIntentPolicies'] as Map<String, dynamic>?)?.map(
|
||||
(k, e) => MapEntry(k, $enumDecode(_$IntentSourcePolicyEnumMap, e)),
|
||||
),
|
||||
customTabsEnabled: json['customTabsEnabled'] as bool?,
|
||||
enableLocalSearchIndex: json['enableLocalSearchIndex'] as bool?,
|
||||
indexPrivateTabs: json['indexPrivateTabs'] as bool?,
|
||||
acceptSuggestionOnSubmit: json['acceptSuggestionOnSubmit'] as bool?,
|
||||
@@ -1180,6 +1195,7 @@ Map<String, dynamic> _$GeneralSettingsToJson(
|
||||
'externalAppIntentPolicies': instance.externalAppIntentPolicies.map(
|
||||
(k, e) => MapEntry(k, _$IntentSourcePolicyEnumMap[e]!),
|
||||
),
|
||||
'customTabsEnabled': instance.customTabsEnabled,
|
||||
'enableLocalSearchIndex': instance.enableLocalSearchIndex,
|
||||
'indexPrivateTabs': instance.indexPrivateTabs,
|
||||
'acceptSuggestionOnSubmit': instance.acceptSuggestionOnSubmit,
|
||||
|
||||
@@ -268,6 +268,10 @@ class GeneralSettingsRepository extends _$GeneralSettingsRepository {
|
||||
'externalAppIntentPolicies': settings['externalAppIntentPolicies']
|
||||
?.readAs(DriftSqlType.string, db.typeMapping)
|
||||
.mapNotNull(jsonDecode),
|
||||
'customTabsEnabled': settings['customTabsEnabled']?.readAs(
|
||||
DriftSqlType.bool,
|
||||
db.typeMapping,
|
||||
),
|
||||
'enableLocalSearchIndex': settings['enableLocalSearchIndex']?.readAs(
|
||||
DriftSqlType.bool,
|
||||
db.typeMapping,
|
||||
|
||||
@@ -35,7 +35,7 @@ final class GeneralSettingsRepositoryProvider
|
||||
}
|
||||
|
||||
String _$generalSettingsRepositoryHash() =>
|
||||
r'9ee41d8283340300ec295d318ade92c15b19426d';
|
||||
r'4e72c8ebed8b08ced417ca24d6e4a840f2abf1be';
|
||||
|
||||
abstract class _$GeneralSettingsRepository
|
||||
extends $StreamNotifier<GeneralSettings> {
|
||||
|
||||
Reference in New Issue
Block a user