diff --git a/packages/neon/neon/lib/src/pages/home.dart b/packages/neon/neon/lib/src/pages/home.dart index b0e31211..f0792c17 100644 --- a/packages/neon/neon/lib/src/pages/home.dart +++ b/packages/neon/neon/lib/src/pages/home.dart @@ -74,6 +74,7 @@ class _HomePageState extends State { @override void dispose() { unawaited(_versionCheckSubscription.cancel()); + GlobalPopups().dispose(); super.dispose(); } diff --git a/packages/neon/neon/lib/src/utils/global_popups.dart b/packages/neon/neon/lib/src/utils/global_popups.dart index 4b73b3a0..10748f2b 100644 --- a/packages/neon/neon/lib/src/utils/global_popups.dart +++ b/packages/neon/neon/lib/src/utils/global_popups.dart @@ -1,9 +1,12 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:meta/meta.dart'; import 'package:neon/l10n/localizations.dart'; import 'package:neon/src/blocs/first_launch.dart'; import 'package:neon/src/blocs/next_push.dart'; import 'package:neon/src/pages/settings.dart'; +import 'package:neon/src/platform/platform.dart'; import 'package:neon/src/router.dart'; import 'package:neon/src/utils/global_options.dart'; import 'package:provider/provider.dart'; @@ -22,8 +25,19 @@ class GlobalPopups { static GlobalPopups? instance; bool _registered = false; + late BuildContext _context; + final _subscriptions = []; + + void dispose() { + for (final subscription in _subscriptions) { + unawaited(subscription.cancel()); + } + _subscriptions.clear(); + _registered = false; + } void register(final BuildContext context) { + _context = context; if (_registered) { return; } @@ -31,53 +45,62 @@ class GlobalPopups { final globalOptions = Provider.of(context, listen: false); final firstLaunchBloc = Provider.of(context, listen: false); final nextPushBloc = Provider.of(context, listen: false); + final platform = Provider.of(context, listen: false); - firstLaunchBloc.onFirstLaunch.listen((final _) { - if (globalOptions.pushNotificationsEnabled.enabled) { - if (!context.mounted) { - return; - } - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(AppLocalizations.of(context).firstLaunchGoToSettingsToEnablePushNotifications), - action: SnackBarAction( - label: AppLocalizations.of(context).settings, - onPressed: () { - const SettingsRoute(initialCategory: SettingsCageories.pushNotifications).go(context); - }, - ), - ), - ); - } - }); + _subscriptions.addAll([ + if (platform.canUsePushNotifications) ...[ + firstLaunchBloc.onFirstLaunch.listen((final _) { + assert(context.mounted, 'Context should be mounted'); + if (!globalOptions.pushNotificationsEnabled.enabled) { + return; + } - nextPushBloc.onNextPushSupported.listen((final _) async { - await showDialog( - context: context, - builder: (final context) => AlertDialog( - title: Text(AppLocalizations.of(context).nextPushSupported), - content: Text(AppLocalizations.of(context).nextPushSupportedText), - actions: [ - OutlinedButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: Text(AppLocalizations.of(context).actionNo), + ScaffoldMessenger.of(_context).showSnackBar( + SnackBar( + content: Text(AppLocalizations.of(_context).firstLaunchGoToSettingsToEnablePushNotifications), + action: SnackBarAction( + label: AppLocalizations.of(_context).settings, + onPressed: () { + const SettingsRoute(initialCategory: SettingsCageories.pushNotifications).go(_context); + }, + ), ), - ElevatedButton( - onPressed: () { - Navigator.of(context).pop(); - launchUrlString( - 'https://f-droid.org/packages/$unifiedPushNextPushID', - mode: LaunchMode.externalApplication, - ); - }, - child: Text(AppLocalizations.of(context).nextPushSupportedInstall), + ); + }), + nextPushBloc.onNextPushSupported.listen((final _) async { + assert(context.mounted, 'Context should be mounted'); + if (!globalOptions.pushNotificationsEnabled.enabled) { + return; + } + + await showDialog( + context: _context, + builder: (final context) => AlertDialog( + title: Text(AppLocalizations.of(context).nextPushSupported), + content: Text(AppLocalizations.of(context).nextPushSupportedText), + actions: [ + OutlinedButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text(AppLocalizations.of(context).actionNo), + ), + ElevatedButton( + onPressed: () { + Navigator.of(context).pop(); + launchUrlString( + 'https://f-droid.org/packages/$unifiedPushNextPushID', + mode: LaunchMode.externalApplication, + ); + }, + child: Text(AppLocalizations.of(context).nextPushSupportedInstall), + ), + ], ), - ], - ), - ); - }); + ); + }), + ], + ]); _registered = true; }