diff --git a/app/lib/domain/services/generic_website.dart b/app/lib/domain/services/generic_website.dart
index edcee6f7..b1b6377f 100644
--- a/app/lib/domain/services/generic_website.dart
+++ b/app/lib/domain/services/generic_website.dart
@@ -18,6 +18,7 @@
* along with this program. If not, see .
*/
import 'dart:async';
+import 'dart:io';
import 'dart:ui';
import 'package:exceptions/exceptions.dart';
@@ -29,7 +30,7 @@ import 'package:http/io_client.dart';
import 'package:nullability/nullability.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:socks5_proxy/socks_client.dart';
-import 'package:universal_io/io.dart';
+
import 'package:weblibre/core/http_error_handler.dart';
import 'package:weblibre/data/models/web_page_info.dart';
import 'package:weblibre/extensions/http_encoding.dart';
diff --git a/app/lib/features/bangs/presentation/widgets/bang_details.dart b/app/lib/features/bangs/presentation/widgets/bang_details.dart
index a9658d78..db291ef0 100644
--- a/app/lib/features/bangs/presentation/widgets/bang_details.dart
+++ b/app/lib/features/bangs/presentation/widgets/bang_details.dart
@@ -99,7 +99,7 @@ class BangDetails extends HookConsumerWidget {
.addTab(url: url, private: isPrivate);
if (context.mounted) {
- BrowserRoute().go(context);
+ const BrowserRoute().go(context);
}
},
label: Text(bangData.domain),
diff --git a/app/lib/features/geckoview/features/browser/presentation/dialogs/tab_tree.dart b/app/lib/features/geckoview/features/browser/presentation/dialogs/tab_tree.dart
index ccba7c41..5b9bc7cc 100644
--- a/app/lib/features/geckoview/features/browser/presentation/dialogs/tab_tree.dart
+++ b/app/lib/features/geckoview/features/browser/presentation/dialogs/tab_tree.dart
@@ -138,7 +138,7 @@ class TabTreeDialog extends HookConsumerWidget {
.requestDismiss();
}
- BrowserRoute().go(context);
+ const BrowserRoute().go(context);
},
onBeforeDelete: () {
if (graph.nodes.length <= 2) {
diff --git a/app/lib/features/geckoview/features/browser/presentation/screens/browser.dart b/app/lib/features/geckoview/features/browser/presentation/screens/browser.dart
index 5d93bd4a..128a1f19 100644
--- a/app/lib/features/geckoview/features/browser/presentation/screens/browser.dart
+++ b/app/lib/features/geckoview/features/browser/presentation/screens/browser.dart
@@ -582,7 +582,7 @@ class _ViewUrlSheet extends HookConsumerWidget {
.read(bottomSheetControllerProvider.notifier)
.requestDismiss();
} else {
- BrowserRoute().go(context);
+ const BrowserRoute().go(context);
}
},
initialHeight: initialHeight,
diff --git a/app/lib/features/geckoview/features/browser/presentation/screens/tab_view.dart b/app/lib/features/geckoview/features/browser/presentation/screens/tab_view.dart
index 2d6f120a..61dd0aed 100644
--- a/app/lib/features/geckoview/features/browser/presentation/screens/tab_view.dart
+++ b/app/lib/features/geckoview/features/browser/presentation/screens/tab_view.dart
@@ -24,14 +24,14 @@ class TabViewScreen extends HookConsumerWidget {
scrollController: scrollController,
showNewTabFab: false,
onClose: () {
- BrowserRoute().go(context);
+ const BrowserRoute().go(context);
},
)
: ViewTabsWidget(
scrollController: scrollController,
showNewTabFab: false,
onClose: () {
- BrowserRoute().go(context);
+ const BrowserRoute().go(context);
},
),
),
@@ -46,7 +46,7 @@ class TabViewScreen extends HookConsumerWidget {
).push(context);
if (context.mounted) {
- BrowserRoute().go(context);
+ const BrowserRoute().go(context);
}
},
child: const Icon(Icons.add),
diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/tab_menu.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/tab_menu.dart
index 21ad74f9..2baaad91 100644
--- a/app/lib/features/geckoview/features/browser/presentation/widgets/tab_menu.dart
+++ b/app/lib/features/geckoview/features/browser/presentation/widgets/tab_menu.dart
@@ -214,7 +214,7 @@ class TabMenu extends HookConsumerWidget {
leadingIcon: const Icon(MdiIcons.folderArrowUpDownOutline),
child: const Text('Assign container'),
onPressed: () async {
- final targetContainerId = await ContainerSelectionRoute()
+ final targetContainerId = await const ContainerSelectionRoute()
.push(context);
if (targetContainerId != null) {
@@ -237,7 +237,7 @@ class TabMenu extends HookConsumerWidget {
leadingIcon: const Icon(MdiIcons.webPlus),
child: const Text('Assign Site to Container'),
onPressed: () async {
- final targetContainerId = await ContainerSelectionRoute()
+ final targetContainerId = await const ContainerSelectionRoute()
.push(context);
if (targetContainerId != null) {
diff --git a/app/lib/features/geckoview/features/history/presentation/screens/history.dart b/app/lib/features/geckoview/features/history/presentation/screens/history.dart
index 877eefc7..785de9e7 100644
--- a/app/lib/features/geckoview/features/history/presentation/screens/history.dart
+++ b/app/lib/features/geckoview/features/history/presentation/screens/history.dart
@@ -1,3 +1,5 @@
+import 'dart:io';
+
import 'package:collection/collection.dart';
import 'package:fading_scroll/fading_scroll.dart';
import 'package:fast_equatable/fast_equatable.dart';
@@ -12,7 +14,7 @@ import 'package:nullability/nullability.dart';
import 'package:path/path.dart' as p;
import 'package:sliver_tools/sliver_tools.dart';
import 'package:timeago/timeago.dart' as timeago;
-import 'package:universal_io/io.dart';
+
import 'package:weblibre/features/geckoview/domain/repositories/tab.dart';
import 'package:weblibre/features/geckoview/features/browser/presentation/dialogs/delete_data.dart';
import 'package:weblibre/features/geckoview/features/history/domain/entities/history_filter_options.dart';
diff --git a/app/lib/features/geckoview/features/search/presentation/screens/search.dart b/app/lib/features/geckoview/features/search/presentation/screens/search.dart
index 1a8bd2f3..96e722f0 100644
--- a/app/lib/features/geckoview/features/search/presentation/screens/search.dart
+++ b/app/lib/features/geckoview/features/search/presentation/screens/search.dart
@@ -119,7 +119,7 @@ class SearchScreen extends HookConsumerWidget {
if (context.mounted) {
ref.read(bottomSheetControllerProvider.notifier).requestDismiss();
- BrowserRoute().go(context);
+ const BrowserRoute().go(context);
}
}
}
@@ -233,7 +233,7 @@ class SearchScreen extends HookConsumerWidget {
.read(bottomSheetControllerProvider.notifier)
.requestDismiss();
- BrowserRoute().go(context);
+ const BrowserRoute().go(context);
}
}
}
diff --git a/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/history_suggestions.dart b/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/history_suggestions.dart
index f98556b5..aa561f91 100644
--- a/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/history_suggestions.dart
+++ b/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/history_suggestions.dart
@@ -129,7 +129,7 @@ class HistorySuggestions extends HookConsumerWidget {
)
.requestDismiss();
- BrowserRoute().go(context);
+ const BrowserRoute().go(context);
}
}
}
diff --git a/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/tab_search.dart b/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/tab_search.dart
index 36333097..9f7dab4b 100644
--- a/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/tab_search.dart
+++ b/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/tab_search.dart
@@ -175,7 +175,7 @@ class TabSearch extends HookConsumerWidget {
.read(bottomSheetControllerProvider.notifier)
.requestDismiss();
- BrowserRoute().go(context);
+ const BrowserRoute().go(context);
}
},
);
diff --git a/app/lib/features/geckoview/features/tabs/presentation/screens/container_edit.dart b/app/lib/features/geckoview/features/tabs/presentation/screens/container_edit.dart
index c0af4e21..2a62c132 100644
--- a/app/lib/features/geckoview/features/tabs/presentation/screens/container_edit.dart
+++ b/app/lib/features/geckoview/features/tabs/presentation/screens/container_edit.dart
@@ -345,6 +345,7 @@ class ContainerEditScreen extends HookConsumerWidget {
context: context,
builder: (BuildContext context) {
return AlertDialog(
+ icon: const Icon(Icons.warning),
title: const Text('Delete Container'),
content: const Text(
'Are you sure you want to delete this container and close all attached tabs?',
diff --git a/app/lib/features/geckoview/features/tabs/presentation/widgets/container_chips.dart b/app/lib/features/geckoview/features/tabs/presentation/widgets/container_chips.dart
index 79987c9a..1e35aba8 100644
--- a/app/lib/features/geckoview/features/tabs/presentation/widgets/container_chips.dart
+++ b/app/lib/features/geckoview/features/tabs/presentation/widgets/container_chips.dart
@@ -171,7 +171,9 @@ class ContainerChips extends HookConsumerWidget {
label: Text(data!.length.toString()),
showCheckmark: false,
onSelected: (_) async {
- await ContainerDraftRoute().push(context);
+ await const ContainerDraftRoute().push(
+ context,
+ );
},
);
},
@@ -206,7 +208,7 @@ class ContainerChips extends HookConsumerWidget {
IconButton(
visualDensity: VisualDensity.compact,
onPressed: () async {
- await ContainerListRoute().push(context);
+ await const ContainerListRoute().push(context);
},
icon: const Icon(Icons.chevron_right),
),
diff --git a/app/lib/features/settings/presentation/screens/addon_collection.dart b/app/lib/features/settings/presentation/screens/addon_collection.dart
index ac2d25cf..10a4bb6e 100644
--- a/app/lib/features/settings/presentation/screens/addon_collection.dart
+++ b/app/lib/features/settings/presentation/screens/addon_collection.dart
@@ -1,12 +1,11 @@
-import 'dart:async';
-
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_mozilla_components/flutter_mozilla_components.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
-import 'package:universal_io/io.dart';
+
import 'package:weblibre/features/user/data/models/engine_settings.dart';
import 'package:weblibre/features/user/domain/repositories/engine_settings.dart';
+import 'package:weblibre/utils/exit_app.dart';
import 'package:weblibre/utils/form_validators.dart';
const _defaultServerUrl = 'https://services.addons.mozilla.org';
@@ -53,11 +52,7 @@ class AddonCollectionScreen extends HookConsumerWidget {
currentSettings.copyWith.addonCollection(null),
);
- unawaited(
- Future.delayed(const Duration(seconds: 1)).whenComplete(() {
- exit(0);
- }),
- );
+ await exitApp(ref.container);
},
icon: const Icon(Icons.delete),
),
@@ -122,13 +117,7 @@ class AddonCollectionScreen extends HookConsumerWidget {
),
);
- unawaited(
- Future.delayed(const Duration(seconds: 1)).whenComplete(
- () {
- exit(0);
- },
- ),
- );
+ await exitApp(ref.container);
}
},
child: const Text('Save & Restart Browser'),
diff --git a/app/lib/features/settings/presentation/screens/developer_settings.dart b/app/lib/features/settings/presentation/screens/developer_settings.dart
index 47143062..7f0db1ad 100644
--- a/app/lib/features/settings/presentation/screens/developer_settings.dart
+++ b/app/lib/features/settings/presentation/screens/developer_settings.dart
@@ -27,7 +27,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_material_design_icons/flutter_material_design_icons.dart';
import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
-import 'package:universal_io/io.dart';
+
import 'package:weblibre/core/logger.dart';
import 'package:weblibre/core/providers/app_state.dart';
import 'package:weblibre/core/routing/routes.dart';
@@ -35,6 +35,7 @@ import 'package:weblibre/features/settings/presentation/controllers/save_setting
import 'package:weblibre/features/settings/presentation/widgets/custom_list_tile.dart';
import 'package:weblibre/features/user/data/models/engine_settings.dart';
import 'package:weblibre/features/user/domain/repositories/engine_settings.dart';
+import 'package:weblibre/utils/exit_app.dart';
import 'package:weblibre/utils/ui_helper.dart';
class DeveloperSettingsScreen extends HookConsumerWidget {
@@ -95,9 +96,10 @@ class DeveloperSettingsScreen extends HookConsumerWidget {
final restart = await showDialog(
context: context,
builder: (context) => AlertDialog(
+ icon: const Icon(Icons.warning),
title: const Text('User Agent Changed'),
content: const Text(
- 'The app needs to restart for the new user agent to take effect',
+ 'The Browser needs to get restarted for the new user agent to take effect',
),
actions: [
TextButton(
@@ -117,7 +119,7 @@ class DeveloperSettingsScreen extends HookConsumerWidget {
);
if (restart == true) {
- exit(0);
+ await exitApp(ref.container);
}
}
},
diff --git a/app/lib/features/tor/data/services/builtin_bridges.dart b/app/lib/features/tor/data/services/builtin_bridges.dart
index 39923eff..67facec5 100644
--- a/app/lib/features/tor/data/services/builtin_bridges.dart
+++ b/app/lib/features/tor/data/services/builtin_bridges.dart
@@ -18,13 +18,13 @@
* along with this program. If not, see .
*/
import 'dart:convert';
+import 'dart:io';
import 'package:flutter/services.dart' show rootBundle;
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart' as path_provider;
import 'package:pluggable_transports_proxy/pluggable_transports_proxy.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
-import 'package:universal_io/io.dart';
part 'builtin_bridges.g.dart';
diff --git a/app/lib/features/web_feed/presentation/screens/feed_article.dart b/app/lib/features/web_feed/presentation/screens/feed_article.dart
index 7b24715e..f330ce6d 100644
--- a/app/lib/features/web_feed/presentation/screens/feed_article.dart
+++ b/app/lib/features/web_feed/presentation/screens/feed_article.dart
@@ -210,7 +210,7 @@ class FeedArticleScreen extends HookConsumerWidget {
);
if (context.mounted) {
- BrowserRoute().go(context);
+ const BrowserRoute().go(context);
}
},
icon: const Icon(Icons.open_in_browser),
@@ -258,7 +258,7 @@ class FeedArticleScreen extends HookConsumerWidget {
context,
tabName: title.whenNotEmpty,
onShow: () {
- BrowserRoute().go(context);
+ const BrowserRoute().go(context);
},
);
}
diff --git a/app/lib/utils/uri_parser.dart b/app/lib/utils/uri_parser.dart
index 9183f16f..1e6b17d9 100644
--- a/app/lib/utils/uri_parser.dart
+++ b/app/lib/utils/uri_parser.dart
@@ -17,7 +17,9 @@
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
-import 'package:universal_io/io.dart';
+
+import 'dart:io';
+
import 'package:weblibre/extensions/uri.dart';
final _domainRegex = RegExp(r'\.[a-zA-Z]{2,}$');