add setting to disable automatic clipboard access (#159)

This commit is contained in:
Fabian Freund
2026-02-05 17:19:18 +01:00
parent d17c6e542f
commit be9dd7d2aa
10 changed files with 101 additions and 21 deletions
@@ -541,23 +541,27 @@ class _BrowserViewState extends ConsumerState<BrowserView>
if (_suggestionCountTime != null &&
DateTime.now().difference(_suggestionCountTime!) >
widget.suggestionTimeout) {
final topRoute = ref.read(currentTopRouteProvider);
//Don't do anything if a child route is active
if (GoRouterState.of(context).topRoute?.name == BrowserRoute.name) {
if (topRoute is GoRoute && topRoute.name == BrowserRoute.name) {
final settings = ref.read(generalSettingsWithDefaultsProvider);
unawaited(
showSuggestNewTabMessage(
context,
onAdd: (searchText) async {
await SearchRoute(
tabType:
ref.read(selectedTabTypeProvider) ??
settings.defaultCreateTabType,
searchText: searchText ?? SearchRoute.emptySearchText,
).push(context);
},
),
);
if (settings.allowClipboardAccess) {
unawaited(
showSuggestNewTabMessage(
context,
onAdd: (searchText) async {
await SearchRoute(
tabType:
ref.read(selectedTabTypeProvider) ??
settings.defaultCreateTabType,
searchText: searchText ?? SearchRoute.emptySearchText,
).push(context);
},
),
);
}
}
}
@@ -23,6 +23,7 @@ import 'package:riverpod/riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:rxdart/rxdart.dart';
import 'package:weblibre/features/geckoview/domain/providers.dart';
import 'package:weblibre/features/user/domain/repositories/general_settings.dart';
part 'engine_suggestions.g.dart';
@@ -39,9 +40,17 @@ class EngineSuggestions extends _$EngineSuggestions {
String query, {
List<GeckoSuggestionType> providers = const [GeckoSuggestionType.history],
}) {
final allowClipboard = ref.read(
generalSettingsWithDefaultsProvider.select((s) => s.allowClipboardAccess),
);
return ref
.read(engineSuggestionsServiceProvider)
.querySuggestions(query, providers: providers);
.querySuggestions(
query,
providers: providers,
allowClipboard: allowClipboard,
);
}
@override
@@ -33,7 +33,7 @@ final class EngineSuggestionsProvider
EngineSuggestions create() => EngineSuggestions();
}
String _$engineSuggestionsHash() => r'ba2c2d7f0a5e99fd9e639acd020b8cf3016c6126';
String _$engineSuggestionsHash() => r'10d4a8a53d184b6c1d107d8634a2f662dfd297f1';
abstract class _$EngineSuggestions
extends $StreamNotifier<List<GeckoSuggestion>> {
@@ -20,16 +20,26 @@
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_material_design_icons/flutter_material_design_icons.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:weblibre/features/user/domain/repositories/general_settings.dart';
import 'package:weblibre/presentation/hooks/cached_future.dart';
import 'package:weblibre/utils/clipboard.dart';
class ClipboardFillLink extends HookWidget {
class ClipboardFillLink extends HookConsumerWidget {
final TextEditingController controller;
const ClipboardFillLink({super.key, required this.controller});
@override
Widget build(BuildContext context) {
Widget build(BuildContext context, WidgetRef ref) {
final allowClipboardAccess = ref.watch(
generalSettingsWithDefaultsProvider.select((s) => s.allowClipboardAccess),
);
if (!allowClipboardAccess) {
return const SizedBox.shrink();
}
final clipboardUrl = useCachedFuture(() => tryGetUriFromClipboard());
final currentText = useValueListenable(controller);