add long press actions on contextual buttons; move extension shortcut into contextual; disable reader view button in tab bar;

This commit is contained in:
Fabian Freund
2026-03-12 08:25:56 +01:00
parent efb0aac5e2
commit bf4b8a31f4
15 changed files with 301 additions and 243 deletions
@@ -44,8 +44,8 @@ class TabSession extends _$TabSession {
return _sessionService.stopLoading();
}
Future<void> reload() {
return _sessionService.reload();
Future<void> reload({LoadUrlFlags flags = LoadUrlFlags.NONE}) {
return _sessionService.reload(flags: flags);
}
Future<void> goBack() {
@@ -57,7 +57,7 @@ final class TabSessionProvider extends $NotifierProvider<TabSession, void> {
}
}
String _$tabSessionHash() => r'b9381c334672fd3f733a4cc86ce696fb7de6fa5d';
String _$tabSessionHash() => r'be44598ad023c2fb23e48d3fa4bf805c4640c599';
final class TabSessionFamily extends $Family
with $ClassFamilyOverride<TabSession, void, void, void, String?> {
@@ -40,4 +40,5 @@ enum ToolbarButtonId {
pageUp,
pageDown,
font,
extensionShortcut,
}
@@ -147,6 +147,12 @@ const fontToolbarButtonSpec = ToolbarButtonSpec(
defaultVisible: false,
);
const extensionShortcutToolbarButtonSpec = ToolbarButtonSpec(
id: ToolbarButtonId.extensionShortcut,
defaultVisible: false,
canBeFallbackTarget: false,
);
const toolbarButtonSpecs = [
backToolbarButtonSpec,
forwardToolbarButtonSpec,
@@ -169,6 +175,7 @@ const toolbarButtonSpecs = [
pageUpToolbarButtonSpec,
pageDownToolbarButtonSpec,
fontToolbarButtonSpec,
extensionShortcutToolbarButtonSpec,
];
final Map<String, ToolbarButtonSpec> toolbarButtonSpecsById = {
@@ -18,6 +18,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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:flutter_mozilla_components/flutter_mozilla_components.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
@@ -27,11 +28,15 @@ import 'package:weblibre/features/geckoview/domain/providers.dart';
import 'package:weblibre/features/geckoview/domain/providers/desktop_mode.dart';
import 'package:weblibre/features/geckoview/domain/providers/tab_session.dart';
import 'package:weblibre/features/geckoview/domain/providers/tab_state.dart';
import 'package:weblibre/features/geckoview/domain/providers/web_extensions_state.dart';
import 'package:weblibre/features/geckoview/domain/repositories/tab.dart';
import 'package:weblibre/features/geckoview/features/bookmarks/domain/entities/bookmark_item.dart';
import 'package:weblibre/features/geckoview/features/bookmarks/domain/repositories/bookmarks.dart';
import 'package:weblibre/features/geckoview/features/browser/domain/entities/font_size_constants.dart';
import 'package:weblibre/features/geckoview/features/browser/features/contextual_toolbar/domain/entities/toolbar_button_spec.dart';
import 'package:weblibre/features/geckoview/features/browser/features/contextual_toolbar/presentation/models/contextual_toolbar_scope.dart';
import 'package:weblibre/features/geckoview/features/browser/features/contextual_toolbar/presentation/widgets/contextual_bar_buttons.dart';
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/extension_shortcut_menu.dart';
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/font_size_bottom_sheet.dart';
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/navigation_buttons.dart';
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/tabs_action_button.dart';
@@ -112,18 +117,7 @@ final List<ToolbarButtonDefinition> toolbarButtonRegistry = [
spec: bookmarksToolbarButtonSpec,
label: 'Bookmarks',
icon: MdiIcons.bookmarkMultiple,
builder: (scope, context, ref) {
return IconButton(
onPressed: scope.isPreview
? () {}
: () async {
await BookmarkListRoute(
entryGuid: BookmarkRoot.root.id,
).push(context);
},
icon: const Icon(MdiIcons.bookmarkMultiple),
);
},
builder: (scope, context, ref) => _BookmarkToolbarButton(scope: scope),
),
ToolbarButtonDefinition(
spec: shareToolbarButtonSpec,
@@ -177,21 +171,7 @@ final List<ToolbarButtonDefinition> toolbarButtonRegistry = [
spec: reloadToolbarButtonSpec,
label: 'Reload',
icon: Icons.refresh,
builder: (scope, context, ref) {
return IconButton(
onPressed: scope.isPreview
? () {}
: () async {
final tabId = scope.selectedTabId;
if (tabId != null) {
await ref
.read(tabSessionProvider(tabId: tabId).notifier)
.reload();
}
},
icon: const Icon(Icons.refresh),
);
},
builder: (scope, context, ref) => _ReloadToolbarButton(scope: scope),
),
ToolbarButtonDefinition(
spec: readerModeToolbarButtonSpec,
@@ -276,14 +256,7 @@ final List<ToolbarButtonDefinition> toolbarButtonRegistry = [
spec: closeTabToolbarButtonSpec,
label: 'Close Tab',
icon: MdiIcons.tabMinus,
builder: (scope, context, ref) {
return IconButton(
onPressed: scope.isPreview
? () {}
: () => _closeTab(context, ref, scope.selectedTabId),
icon: const Icon(MdiIcons.tabMinus),
);
},
builder: (scope, context, ref) => _CloseTabToolbarButton(scope: scope),
),
ToolbarButtonDefinition(
spec: inputUrlToolbarButtonSpec,
@@ -417,6 +390,24 @@ final List<ToolbarButtonDefinition> toolbarButtonRegistry = [
return _FontToolbarButton(selectedTabId: scope.selectedTabId);
},
),
ToolbarButtonDefinition(
spec: extensionShortcutToolbarButtonSpec,
label: 'Extensions',
icon: MdiIcons.puzzle,
isPrimaryAvailable: (scope, ref) => ref
.read(
webExtensionsStateProvider(
WebExtensionActionType.browser,
).select((value) => value.values),
)
.isNotEmpty,
builder: (scope, context, ref) {
if (scope.isPreview) {
return IconButton(onPressed: () {}, icon: const Icon(MdiIcons.puzzle));
}
return const _ExtensionShortcutToolbarButton();
},
),
];
final Map<String, ToolbarButtonDefinition> toolbarButtonRegistryById = {
@@ -452,6 +443,224 @@ Future<void> _closeTab(
}
}
class _ExtensionShortcutToolbarButton extends HookConsumerWidget {
const _ExtensionShortcutToolbarButton();
@override
Widget build(BuildContext context, WidgetRef ref) {
final menuController = useMemoized(MenuController.new);
return ExtensionShortcutMenu(
controller: menuController,
child: IconButton(
onPressed: menuController.open,
icon: const Icon(MdiIcons.puzzle),
),
);
}
}
class _ReloadToolbarButton extends HookConsumerWidget {
final ContextualToolbarScope scope;
const _ReloadToolbarButton({required this.scope});
@override
Widget build(BuildContext context, WidgetRef ref) {
final menuController = useMemoized(MenuController.new);
return MenuAnchor(
controller: menuController,
builder: (context, controller, child) => child!,
menuChildren: [
MenuItemButton(
leadingIcon: const Icon(Icons.refresh),
onPressed: () async {
final tabId = scope.selectedTabId;
if (tabId != null) {
await ref
.read(tabSessionProvider(tabId: tabId).notifier)
.reload(flags: LoadUrlFlags.BYPASS_CACHE);
}
},
child: const Text('Hard Refresh'),
),
],
child: IconButton(
onPressed: scope.isPreview
? () {}
: () async {
final tabId = scope.selectedTabId;
if (tabId != null) {
await ref
.read(tabSessionProvider(tabId: tabId).notifier)
.reload();
}
},
onLongPress: scope.isPreview ? null : menuController.open,
icon: const Icon(Icons.refresh),
),
);
}
}
class _CloseTabToolbarButton extends HookConsumerWidget {
final ContextualToolbarScope scope;
const _CloseTabToolbarButton({required this.scope});
@override
Widget build(BuildContext context, WidgetRef ref) {
final menuController = useMemoized(MenuController.new);
final host = ref.watch(
tabStateProvider(scope.selectedTabId).select((s) => s?.url.host),
);
return MenuAnchor(
controller: menuController,
builder: (context, controller, child) => child!,
menuChildren: [
MenuItemButton(
leadingIcon: const Icon(Icons.tab),
onPressed: () async {
final tabStates = ref.read(tabStatesProvider);
final otherIds = tabStates.keys
.where((id) => id != scope.selectedTabId)
.toList();
if (otherIds.isNotEmpty) {
await ref
.read(tabRepositoryProvider.notifier)
.closeTabs(otherIds);
}
},
child: const Text('Close Others'),
),
if (host != null && host.isNotEmpty)
MenuItemButton(
leadingIcon: const Icon(Icons.language),
onPressed: () async {
final tabStates = ref.read(tabStatesProvider);
final sameHostIds = tabStates.entries
.where((e) => e.value.url.host == host)
.map((e) => e.key)
.toList();
if (sameHostIds.isNotEmpty) {
await ref
.read(tabRepositoryProvider.notifier)
.closeTabs(sameHostIds);
}
},
child: const Text('Close from Same Host'),
),
],
child: IconButton(
onPressed: scope.isPreview
? () {}
: () => _closeTab(context, ref, scope.selectedTabId),
onLongPress: scope.isPreview ? null : menuController.open,
icon: const Icon(MdiIcons.tabMinus),
),
);
}
}
class _BookmarkToolbarButton extends HookConsumerWidget {
final ContextualToolbarScope scope;
const _BookmarkToolbarButton({required this.scope});
@override
Widget build(BuildContext context, WidgetRef ref) {
final menuController = useMemoized(MenuController.new);
final tabUrl = scope.tabState?.url;
final bookmarkable = tabUrl != null && !scope.isPreview;
// Walk the in-memory bookmark tree to find GUIDs for the current URL.
final existingGuids = ref.watch(
bookmarksRepositoryProvider.select((async) {
final result = <String>[];
if (!bookmarkable) return const <String>[];
final root = async.value;
if (root == null) return const <String>[];
void collect(BookmarkItem item) {
if (item is BookmarkEntry && item.url == tabUrl) {
result.add(item.guid);
}
if (item is BookmarkFolder) {
for (final child in item.children ?? const <BookmarkItem>[]) {
collect(child);
}
}
}
collect(root);
return result;
}),
);
final isBookmarked = existingGuids.isNotEmpty;
return MenuAnchor(
controller: menuController,
builder: (context, controller, child) => child!,
menuChildren: [
if (isBookmarked)
MenuItemButton(
leadingIcon: const Icon(MdiIcons.bookmarkRemove),
onPressed: () async {
for (final guid in existingGuids) {
await ref
.read(bookmarksRepositoryProvider.notifier)
.delete(guid);
}
if (context.mounted) {
ui_helper.showInfoMessage(context, 'Bookmark removed');
}
},
child: const Text('Remove Bookmark'),
)
else
MenuItemButton(
leadingIcon: const Icon(MdiIcons.bookmarkPlus),
onPressed: !bookmarkable
? null
: () async {
await ref
.read(bookmarksRepositoryProvider.notifier)
.addBookmark(
parentGuid: BookmarkRoot.mobile.id,
url: tabUrl,
title: scope.tabState!.titleOrAuthority,
);
if (context.mounted) {
ui_helper.showInfoMessage(context, 'Bookmark added');
}
},
child: const Text('Add Bookmark'),
),
],
child: IconButton(
onPressed: scope.isPreview
? () {}
: () async {
await BookmarkListRoute(
entryGuid: BookmarkRoot.root.id,
).push(context);
},
onLongPress: scope.isPreview ? null : menuController.open,
icon: const Icon(MdiIcons.bookmarkMultiple),
),
);
}
}
Future<void> _adjustFontSize(
BuildContext context,
WidgetRef ref, {
@@ -28,28 +28,23 @@ import 'package:flutter_material_design_icons/flutter_material_design_icons.dart
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:weblibre/core/design/app_colors.dart';
import 'package:weblibre/features/geckoview/domain/controllers/bottom_sheet.dart';
import 'package:weblibre/features/geckoview/domain/entities/states/readerable.dart';
import 'package:weblibre/features/geckoview/domain/providers/selected_tab.dart';
import 'package:weblibre/features/geckoview/domain/providers/tab_state.dart';
import 'package:weblibre/features/geckoview/domain/repositories/tab.dart';
import 'package:weblibre/features/geckoview/features/browser/domain/entities/sheet.dart';
import 'package:weblibre/features/geckoview/features/browser/domain/providers.dart';
import 'package:weblibre/features/geckoview/features/browser/features/contextual_toolbar/data/providers/toolbar_button_configs.dart';
import 'package:weblibre/features/geckoview/features/browser/features/contextual_toolbar/domain/entities/toolbar_button_id.dart';
import 'package:weblibre/features/geckoview/features/browser/features/contextual_toolbar/presentation/widgets/contextual_bar_buttons.dart';
import 'package:weblibre/features/geckoview/features/browser/features/contextual_toolbar/presentation/widgets/contextual_toolbar.dart';
import 'package:weblibre/features/geckoview/features/browser/presentation/controllers/toolbar_visibility.dart';
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/browser_modules/app_bar_title.dart';
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/extension_shortcut_menu.dart';
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/tab_icon.dart';
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/tab_menu.dart';
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/toolbar_button.dart';
import 'package:weblibre/features/geckoview/features/readerview/presentation/controllers/readerable.dart';
import 'package:weblibre/features/geckoview/features/readerview/presentation/widgets/reader_button.dart';
import 'package:weblibre/features/geckoview/features/tabs/data/entities/tab_mode.dart';
import 'package:weblibre/features/geckoview/features/tabs/domain/providers.dart';
import 'package:weblibre/features/geckoview/features/tabs/utils/container_colors.dart';
import 'package:weblibre/features/user/data/models/general_settings.dart';
import 'package:weblibre/features/user/domain/repositories/general_settings.dart';
import 'package:weblibre/presentation/hooks/menu_controller.dart';
import 'package:weblibre/presentation/widgets/selectable_chips.dart';
import 'package:weblibre/presentation/widgets/url_icon.dart';
@@ -72,8 +67,6 @@ class BrowserTopAppBar extends StatelessWidget {
displayedSheet: null,
showContextualToolbar: false,
showQuickTabSwitcherBar: false,
showMainToolbarNavigationButton: !showContextualToolbar,
showMainToolbarTabsCount: !showContextualToolbar,
);
}
@@ -108,8 +101,6 @@ class BrowserBottomAppBar extends StatelessWidget {
showMainToolbar: showMainToolbar,
showContextualToolbar: showContextualToolbar,
showQuickTabSwitcherBar: showQuickTabSwitcherBar,
showMainToolbarNavigationButton: !showContextualToolbar,
showMainToolbarTabsCount: !showContextualToolbar,
);
}
@@ -137,17 +128,12 @@ class BrowserTabBar extends HookConsumerWidget {
final bool showQuickTabSwitcherBar;
final Sheet? displayedSheet;
final bool showMainToolbarTabsCount;
final bool showMainToolbarNavigationButton;
const BrowserTabBar({
super.key,
required this.showMainToolbar,
required this.displayedSheet,
required this.showContextualToolbar,
required this.showQuickTabSwitcherBar,
required this.showMainToolbarTabsCount,
required this.showMainToolbarNavigationButton,
});
static const contextualToolabarHeight = 54.0;
@@ -180,18 +166,37 @@ class BrowserTabBar extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final extensionMenuController = useMenuController();
final selectedTabId = ref.watch(selectedTabProvider);
final settings = ref.watch(generalSettingsWithDefaultsProvider);
// Determine which buttons are actually visible in the contextual toolbar
// so we only hide them from the main toolbar when they're genuinely present there.
final contextualConfigs = ref
.watch(effectiveToolbarButtonConfigsProvider)
.value;
final tabsCountInContextual =
showContextualToolbar &&
contextualConfigs.any(
(c) => c.buttonId == ToolbarButtonId.tabsCount.name && c.isVisible,
);
final menuInContextual =
showContextualToolbar &&
contextualConfigs.any(
(c) =>
c.buttonId == ToolbarButtonId.navigationMenu.name && c.isVisible,
);
final showMainToolbarTabsCount = !tabsCountInContextual;
final showMainToolbarNavigationButton = !menuInContextual;
final containerColor = ref.watch(
watchTabContainerDataProvider(
selectedTabId,
).select((data) => data.value?.color),
);
final showExtensionShortcut = settings.showExtensionShortcut;
final quickTabSwitcherMode = settings.effectiveUiQuickTabSwitcherMode();
final tabBarPosition = settings.tabBarPosition;
@@ -221,58 +226,6 @@ class BrowserTabBar extends HookConsumerWidget {
: const AppBarTitle()
: null,
actions: [
if (showTabTitle)
Consumer(
builder: (context, ref, child) {
final tabBarReaderView = ref.watch(
generalSettingsWithDefaultsProvider.select(
(value) => value.tabBarReaderView,
),
);
final readerabilityStateActive = ref.watch(
selectedTabStateProvider.select(
(state) =>
(state?.readerableState ?? ReaderableState.$default())
.active,
),
);
return Visibility(
visible: tabBarReaderView || readerabilityStateActive,
child: ReaderButton(
buttonBuilder: (isLoading, readerActive, icon) =>
ToolbarButton(
onTap: isLoading
? null
: () async {
await ref
.read(
readerableScreenControllerProvider
.notifier,
)
.toggleReaderView(!readerActive);
},
child: icon,
),
),
);
},
),
if (showExtensionShortcut)
ExtensionShortcutMenu(
controller: extensionMenuController,
child: ToolbarButton(
onTap: () {
if (extensionMenuController.isOpen) {
extensionMenuController.close();
} else {
extensionMenuController.open();
}
},
child: const Icon(MdiIcons.puzzle),
),
),
if (showMainToolbarTabsCount)
TabsCountButton(
selectedTabId: selectedTabId,
@@ -234,8 +234,8 @@ class GridTabPreview extends HookConsumerWidget {
onPressed: () {
onDeleteAll?.call(tabState.url.host);
},
leadingIcon: const Icon(MdiIcons.closeBoxMultiple),
child: Text('Close all from ${tabState.url.host}'),
leadingIcon: const Icon(Icons.language),
child: const Text('Close from Same Host'),
),
],
child: SizedBox(
@@ -567,8 +567,8 @@ class ListTabPreview extends HookConsumerWidget {
onPressed: () {
onDeleteAll?.call(tabState.url.host);
},
leadingIcon: const Icon(MdiIcons.closeBoxMultiple),
child: Text('Close all from ${tabState.url.host}'),
leadingIcon: const Icon(Icons.language),
child: const Text('Close from Same Host'),
),
],
child: IconButton(
@@ -27,6 +27,7 @@ import 'package:weblibre/features/geckoview/features/browser/features/contextual
import 'package:weblibre/features/geckoview/features/browser/features/contextual_toolbar/presentation/models/contextual_toolbar_scope.dart';
import 'package:weblibre/features/geckoview/features/browser/features/contextual_toolbar/presentation/toolbar_button_registry.dart';
import 'package:weblibre/features/geckoview/features/browser/features/contextual_toolbar/presentation/widgets/contextual_toolbar.dart';
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/browser_modules/bottom_app_bar.dart';
import 'package:weblibre/features/user/data/database/definitions.drift.dart';
class ContextualToolbarSettingsScreen extends HookConsumerWidget {
@@ -273,10 +274,12 @@ class _ToolbarPreviewDelegate extends SliverPersistentHeaderDelegate {
final List<ToolbarButtonConfig> configs;
static const _previewHeight = BrowserTabBar.contextualToolabarHeight;
@override
double get minExtent => 56.0;
double get minExtent => _previewHeight;
@override
double get maxExtent => 56.0;
double get maxExtent => _previewHeight;
@override
Widget build(
@@ -284,9 +287,12 @@ class _ToolbarPreviewDelegate extends SliverPersistentHeaderDelegate {
double shrinkOffset,
bool overlapsContent,
) {
return ColoredBox(
color: Theme.of(context).colorScheme.surfaceContainer,
child: _ToolbarPreview(configs: configs),
return SizedBox(
height: maxExtent,
child: ColoredBox(
color: Theme.of(context).colorScheme.surfaceContainer,
child: _ToolbarPreview(configs: configs),
),
);
}
@@ -91,7 +91,6 @@ class _ContentViewingSection extends StatelessWidget {
SettingSection(name: 'Content Viewing'),
_PdfViewerTile(),
_EnableReaderModeTile(),
_ReaderModeInTabBarTile(),
_EnforceReaderModeTile(),
],
);
@@ -416,34 +415,6 @@ class _EnforceReaderModeTile extends HookConsumerWidget {
}
}
class _ReaderModeInTabBarTile extends HookConsumerWidget {
const _ReaderModeInTabBarTile();
@override
Widget build(BuildContext context, WidgetRef ref) {
final tabBarReaderView = ref.watch(
generalSettingsWithDefaultsProvider.select((s) => s.tabBarReaderView),
);
return SwitchListTile.adaptive(
title: const Text('Reader Mode in Tab Bar'),
subtitle: const Text(
'Show reader mode button in the tab bar instead of only in the tab menu',
),
secondary: const Icon(MdiIcons.bookHeart),
value: tabBarReaderView,
onChanged: (value) async {
await ref
.read(saveGeneralSettingsControllerProvider.notifier)
.save(
(currentSettings) =>
currentSettings.copyWith.tabBarReaderView(value),
);
},
);
}
}
class _PdfViewerTile extends HookConsumerWidget {
const _PdfViewerTile();
@@ -78,7 +78,6 @@ class _TabBarLayoutSection extends StatelessWidget {
children: [
_TabBarPositionSection(),
_TabBarLayoutModeSection(),
_ShowExtensionShortcutTile(),
_ShowContextualTabBarTile(),
_CustomizeToolbarButtonsTile(),
_AutoHideTabBarTile(),
@@ -256,12 +255,6 @@ class _TabBarPreviewCard extends HookWidget {
}
final mainToolbarActions = <Widget>[
if (settings.showExtensionShortcut)
IconButton(
onPressed: () {},
icon: const Icon(MdiIcons.puzzle),
tooltip: 'Extensions',
),
if (showMainToolbarActionButtons) tabCountButton,
if (showMainToolbarActionButtons) NavigationMenuButtonView(onTap: () {}),
];
@@ -639,34 +632,6 @@ class _CustomizeToolbarButtonsTile extends HookConsumerWidget {
}
}
class _ShowExtensionShortcutTile extends HookConsumerWidget {
const _ShowExtensionShortcutTile();
@override
Widget build(BuildContext context, WidgetRef ref) {
final showExtensionShortcut = ref.watch(
generalSettingsWithDefaultsProvider.select(
(s) => s.showExtensionShortcut,
),
);
return SwitchListTile.adaptive(
title: const Text('Show Extension Shortcut'),
subtitle: const Text('Display an extension menu directly on the tab bar'),
secondary: const Icon(MdiIcons.puzzleHeart),
value: showExtensionShortcut,
onChanged: (value) async {
await ref
.read(saveGeneralSettingsControllerProvider.notifier)
.save(
(currentSettings) =>
currentSettings.copyWith.showExtensionShortcut(value),
);
},
);
}
}
class _ShowQuickTabSwitcherBarTile extends HookConsumerWidget {
const _ShowQuickTabSwitcherBarTile();
@@ -248,15 +248,15 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable {
bool? automaticFontSizeAdjustment,
double? fontSizeFactor,
bool? fontInflationEnabled,
double? displayDensityOverride,
int? screenWidthOverride,
int? screenHeightOverride,
super.displayDensityOverride,
super.screenWidthOverride,
super.screenHeightOverride,
bool? inputAutoZoomEnabled,
bool? fissionEnabled,
bool? isolatedProcessEnabled,
bool? appZygoteProcessEnabled,
bool? extensionsWebAPIEnabled,
bool? lnaBlocking,
super.lnaBlocking,
bool? lnaBlockTrackers,
bool? lnaEnabled,
}) : queryParameterStripping =
@@ -314,17 +314,13 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable {
automaticFontSizeAdjustment: automaticFontSizeAdjustment ?? true,
fontSizeFactor: fontSizeFactor ?? 1.0,
fontInflationEnabled: fontInflationEnabled ?? false,
displayDensityOverride: displayDensityOverride,
screenWidthOverride: screenWidthOverride,
screenHeightOverride: screenHeightOverride,
inputAutoZoomEnabled: inputAutoZoomEnabled ?? true,
fissionEnabled: fissionEnabled ?? true,
isolatedProcessEnabled: isolatedProcessEnabled ?? false,
appZygoteProcessEnabled: appZygoteProcessEnabled ?? false,
extensionsWebAPIEnabled: extensionsWebAPIEnabled ?? true,
lnaBlocking: lnaBlocking,
lnaBlockTrackers: lnaBlockTrackers,
lnaEnabled: lnaEnabled,
lnaBlockTrackers: lnaBlockTrackers ?? true,
lnaEnabled: lnaEnabled ?? true,
);
static AddonCollection? _addonCollectionFromJson(String? json) =>
@@ -77,7 +77,6 @@ class GeneralSettings with FastEquatable {
final BangKey? defaultSearchProvider;
final SearchSuggestionProviders defaultSearchSuggestionsProvider;
final bool createChildTabsOption;
final bool showExtensionShortcut;
final bool enableLocalAiFeatures;
final bool showContainerUi;
final bool showIsolatedTabUi;
@@ -88,7 +87,6 @@ class GeneralSettings with FastEquatable {
final TabBarSwipeAction tabBarSwipeAction;
final Duration historyAutoCleanInterval;
final bool tabViewBottomSheet;
final bool tabBarReaderView;
final bool tabBarShowContextualBar;
final bool tabBarShowQuickTabSwitcherBar;
final TabBarPosition tabBarPosition;
@@ -127,7 +125,6 @@ class GeneralSettings with FastEquatable {
required this.defaultSearchProvider,
required this.defaultSearchSuggestionsProvider,
required this.createChildTabsOption,
required this.showExtensionShortcut,
required this.enableLocalAiFeatures,
required this.showContainerUi,
required this.showIsolatedTabUi,
@@ -137,7 +134,6 @@ class GeneralSettings with FastEquatable {
required this.tabBarSwipeAction,
required this.historyAutoCleanInterval,
required this.tabViewBottomSheet,
required this.tabBarReaderView,
required this.tabBarShowContextualBar,
required this.tabBarShowQuickTabSwitcherBar,
required this.tabBarPosition,
@@ -177,7 +173,6 @@ class GeneralSettings with FastEquatable {
BangKey? defaultSearchProvider,
SearchSuggestionProviders? defaultSearchSuggestionsProvider,
bool? createChildTabsOption,
bool? showExtensionShortcut,
bool? enableLocalAiFeatures,
bool? showContainerUi,
bool? showIsolatedTabUi,
@@ -187,7 +182,6 @@ class GeneralSettings with FastEquatable {
TabBarSwipeAction? tabBarSwipeAction,
Duration? historyAutoCleanInterval,
bool? tabViewBottomSheet,
bool? tabBarReaderView,
bool? tabBarShowContextualBar,
bool? tabBarShowQuickTabSwitcherBar,
TabBarPosition? tabBarPosition,
@@ -224,7 +218,6 @@ class GeneralSettings with FastEquatable {
defaultSearchSuggestionsProvider =
defaultSearchSuggestionsProvider ?? _fallbackAutocompleteProvider,
createChildTabsOption = createChildTabsOption ?? false,
showExtensionShortcut = showExtensionShortcut ?? false,
enableLocalAiFeatures = enableLocalAiFeatures ?? true,
showContainerUi = showContainerUi ?? true,
showIsolatedTabUi = showIsolatedTabUi ?? true,
@@ -237,7 +230,6 @@ class GeneralSettings with FastEquatable {
historyAutoCleanInterval =
historyAutoCleanInterval ?? const Duration(days: 90),
tabViewBottomSheet = tabViewBottomSheet ?? false,
tabBarReaderView = tabBarReaderView ?? false,
tabBarShowContextualBar = tabBarShowContextualBar ?? true,
tabBarShowQuickTabSwitcherBar = tabBarShowQuickTabSwitcherBar ?? true,
tabBarPosition = tabBarPosition ?? TabBarPosition.bottom,
@@ -304,7 +296,6 @@ class GeneralSettings with FastEquatable {
defaultSearchProvider,
defaultSearchSuggestionsProvider,
createChildTabsOption,
showExtensionShortcut,
enableLocalAiFeatures,
showContainerUi,
showIsolatedTabUi,
@@ -314,7 +305,6 @@ class GeneralSettings with FastEquatable {
tabBarSwipeAction,
historyAutoCleanInterval,
tabViewBottomSheet,
tabBarReaderView,
tabBarShowContextualBar,
tabBarShowQuickTabSwitcherBar,
tabBarPosition,
@@ -31,8 +31,6 @@ abstract class _$GeneralSettingsCWProxy {
GeneralSettings createChildTabsOption(bool createChildTabsOption);
GeneralSettings showExtensionShortcut(bool showExtensionShortcut);
GeneralSettings enableLocalAiFeatures(bool enableLocalAiFeatures);
GeneralSettings showContainerUi(bool showContainerUi);
@@ -55,8 +53,6 @@ abstract class _$GeneralSettingsCWProxy {
GeneralSettings tabViewBottomSheet(bool tabViewBottomSheet);
GeneralSettings tabBarReaderView(bool tabBarReaderView);
GeneralSettings tabBarShowContextualBar(bool tabBarShowContextualBar);
GeneralSettings tabBarShowQuickTabSwitcherBar(
@@ -137,7 +133,6 @@ abstract class _$GeneralSettingsCWProxy {
BangKey? defaultSearchProvider,
SearchSuggestionProviders defaultSearchSuggestionsProvider,
bool createChildTabsOption,
bool showExtensionShortcut,
bool enableLocalAiFeatures,
bool showContainerUi,
bool showIsolatedTabUi,
@@ -147,7 +142,6 @@ abstract class _$GeneralSettingsCWProxy {
TabBarSwipeAction tabBarSwipeAction,
Duration historyAutoCleanInterval,
bool tabViewBottomSheet,
bool tabBarReaderView,
bool tabBarShowContextualBar,
bool tabBarShowQuickTabSwitcherBar,
TabBarPosition tabBarPosition,
@@ -225,10 +219,6 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy {
GeneralSettings createChildTabsOption(bool createChildTabsOption) =>
call(createChildTabsOption: createChildTabsOption);
@override
GeneralSettings showExtensionShortcut(bool showExtensionShortcut) =>
call(showExtensionShortcut: showExtensionShortcut);
@override
GeneralSettings enableLocalAiFeatures(bool enableLocalAiFeatures) =>
call(enableLocalAiFeatures: enableLocalAiFeatures);
@@ -267,10 +257,6 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy {
GeneralSettings tabViewBottomSheet(bool tabViewBottomSheet) =>
call(tabViewBottomSheet: tabViewBottomSheet);
@override
GeneralSettings tabBarReaderView(bool tabBarReaderView) =>
call(tabBarReaderView: tabBarReaderView);
@override
GeneralSettings tabBarShowContextualBar(bool tabBarShowContextualBar) =>
call(tabBarShowContextualBar: tabBarShowContextualBar);
@@ -403,7 +389,6 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy {
Object? defaultSearchProvider = const $CopyWithPlaceholder(),
Object? defaultSearchSuggestionsProvider = const $CopyWithPlaceholder(),
Object? createChildTabsOption = const $CopyWithPlaceholder(),
Object? showExtensionShortcut = const $CopyWithPlaceholder(),
Object? enableLocalAiFeatures = const $CopyWithPlaceholder(),
Object? showContainerUi = const $CopyWithPlaceholder(),
Object? showIsolatedTabUi = const $CopyWithPlaceholder(),
@@ -413,7 +398,6 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy {
Object? tabBarSwipeAction = const $CopyWithPlaceholder(),
Object? historyAutoCleanInterval = const $CopyWithPlaceholder(),
Object? tabViewBottomSheet = const $CopyWithPlaceholder(),
Object? tabBarReaderView = const $CopyWithPlaceholder(),
Object? tabBarShowContextualBar = const $CopyWithPlaceholder(),
Object? tabBarShowQuickTabSwitcherBar = const $CopyWithPlaceholder(),
Object? tabBarPosition = const $CopyWithPlaceholder(),
@@ -498,12 +482,6 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy {
? _value.createChildTabsOption
// ignore: cast_nullable_to_non_nullable
: createChildTabsOption as bool,
showExtensionShortcut:
showExtensionShortcut == const $CopyWithPlaceholder() ||
showExtensionShortcut == null
? _value.showExtensionShortcut
// ignore: cast_nullable_to_non_nullable
: showExtensionShortcut as bool,
enableLocalAiFeatures:
enableLocalAiFeatures == const $CopyWithPlaceholder() ||
enableLocalAiFeatures == null
@@ -558,12 +536,6 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy {
? _value.tabViewBottomSheet
// ignore: cast_nullable_to_non_nullable
: tabViewBottomSheet as bool,
tabBarReaderView:
tabBarReaderView == const $CopyWithPlaceholder() ||
tabBarReaderView == null
? _value.tabBarReaderView
// ignore: cast_nullable_to_non_nullable
: tabBarReaderView as bool,
tabBarShowContextualBar:
tabBarShowContextualBar == const $CopyWithPlaceholder() ||
tabBarShowContextualBar == null
@@ -754,7 +726,6 @@ GeneralSettings _$GeneralSettingsFromJson(
json['defaultSearchSuggestionsProvider'],
),
createChildTabsOption: json['createChildTabsOption'] as bool?,
showExtensionShortcut: json['showExtensionShortcut'] as bool?,
enableLocalAiFeatures: json['enableLocalAiFeatures'] as bool?,
showContainerUi: json['showContainerUi'] as bool?,
showIsolatedTabUi: json['showIsolatedTabUi'] as bool?,
@@ -777,7 +748,6 @@ GeneralSettings _$GeneralSettingsFromJson(
microseconds: (json['historyAutoCleanInterval'] as num).toInt(),
),
tabViewBottomSheet: json['tabViewBottomSheet'] as bool?,
tabBarReaderView: json['tabBarReaderView'] as bool?,
tabBarShowContextualBar: json['tabBarShowContextualBar'] as bool?,
tabBarShowQuickTabSwitcherBar: json['tabBarShowQuickTabSwitcherBar'] as bool?,
tabBarPosition: $enumDecodeNullable(
@@ -843,7 +813,6 @@ Map<String, dynamic> _$GeneralSettingsToJson(
_$SearchSuggestionProvidersEnumMap[instance
.defaultSearchSuggestionsProvider]!,
'createChildTabsOption': instance.createChildTabsOption,
'showExtensionShortcut': instance.showExtensionShortcut,
'enableLocalAiFeatures': instance.enableLocalAiFeatures,
'showContainerUi': instance.showContainerUi,
'showIsolatedTabUi': instance.showIsolatedTabUi,
@@ -855,7 +824,6 @@ Map<String, dynamic> _$GeneralSettingsToJson(
'tabBarSwipeAction': _$TabBarSwipeActionEnumMap[instance.tabBarSwipeAction]!,
'historyAutoCleanInterval': instance.historyAutoCleanInterval.inMicroseconds,
'tabViewBottomSheet': instance.tabViewBottomSheet,
'tabBarReaderView': instance.tabBarReaderView,
'tabBarShowContextualBar': instance.tabBarShowContextualBar,
'tabBarShowQuickTabSwitcherBar': instance.tabBarShowQuickTabSwitcherBar,
'tabBarPosition': _$TabBarPositionEnumMap[instance.tabBarPosition]!,
@@ -84,10 +84,6 @@ class GeneralSettingsRepository extends _$GeneralSettingsRepository {
DriftSqlType.bool,
db.typeMapping,
),
'showExtensionShortcut': settings['showExtensionShortcut']?.readAs(
DriftSqlType.bool,
db.typeMapping,
),
'enableLocalAiFeatures': settings['enableLocalAiFeatures']?.readAs(
DriftSqlType.bool,
db.typeMapping,
@@ -124,10 +120,6 @@ class GeneralSettingsRepository extends _$GeneralSettingsRepository {
DriftSqlType.bool,
db.typeMapping,
),
'tabBarReaderView': settings['tabBarReaderView']?.readAs(
DriftSqlType.bool,
db.typeMapping,
),
'tabBarShowContextualBar': settings['tabBarShowContextualBar']?.readAs(
DriftSqlType.bool,
db.typeMapping,
@@ -35,7 +35,7 @@ final class GeneralSettingsRepositoryProvider
}
String _$generalSettingsRepositoryHash() =>
r'7a30fefa2cdc934232e08e8809c62a83e99635fd';
r'44aaf9f3c8c6e1a8c6569ed59b76fa0360528578';
abstract class _$GeneralSettingsRepository
extends $StreamNotifier<GeneralSettings> {