From 17234d9d62bcb499f107646f7d82d76b4bdc0b64 Mon Sep 17 00:00:00 2001 From: jld3103 Date: Fri, 10 Mar 2023 21:07:19 +0100 Subject: [PATCH] neon: Move listeners for first launch and NextPush support to global level to avoid listening multiple times --- packages/neon/lib/src/app.dart | 20 ++++-- packages/neon/lib/src/neon.dart | 1 + packages/neon/lib/src/pages/home.dart | 50 ------------- .../neon/lib/src/utils/global_popups.dart | 72 +++++++++++++++++++ 4 files changed, 86 insertions(+), 57 deletions(-) create mode 100644 packages/neon/lib/src/utils/global_popups.dart diff --git a/packages/neon/lib/src/app.dart b/packages/neon/lib/src/app.dart index cf5b2dbd..51f70b21 100644 --- a/packages/neon/lib/src/app.dart +++ b/packages/neon/lib/src/app.dart @@ -27,6 +27,7 @@ class _NeonAppState extends State with WidgetsBindingObserver, tray.Tra late NeonPlatform _platform; late GlobalOptions _globalOptions; late AccountsBloc _accountsBloc; + final _globalPopups = const GlobalPopups(); NextcloudCoreServerCapabilities_Ocs_Data_Capabilities_Theming? _nextcloudTheme; final _platformBrightness = BehaviorSubject.seeded(WidgetsBinding.instance.window.platformBrightness); @@ -71,13 +72,18 @@ class _NeonAppState extends State with WidgetsBindingObserver, tray.Tra name: 'home', ); Widget builder(final context) => Scaffold( - body: HomePage( - account: activeAccount, - onThemeChanged: (final nextcloudTheme) { - setState(() { - _nextcloudTheme = nextcloudTheme; - }); - }, + body: Stack( + children: [ + _globalPopups, + HomePage( + account: activeAccount, + onThemeChanged: (final nextcloudTheme) { + setState(() { + _nextcloudTheme = nextcloudTheme; + }); + }, + ), + ], ), ); await _navigatorKey.currentState!.pushAndRemoveUntil( diff --git a/packages/neon/lib/src/neon.dart b/packages/neon/lib/src/neon.dart index 64c4fb0b..e6c9e37f 100644 --- a/packages/neon/lib/src/neon.dart +++ b/packages/neon/lib/src/neon.dart @@ -72,6 +72,7 @@ part 'utils/confirmation_dialog.dart'; part 'utils/env.dart'; part 'utils/global.dart'; part 'utils/global_options.dart'; +part 'utils/global_popups.dart'; part 'utils/hex_color.dart'; part 'utils/localizations.dart'; part 'utils/missing_permission_exception.dart'; diff --git a/packages/neon/lib/src/pages/home.dart b/packages/neon/lib/src/pages/home.dart index c6bacb75..77a90d39 100644 --- a/packages/neon/lib/src/pages/home.dart +++ b/packages/neon/lib/src/pages/home.dart @@ -24,8 +24,6 @@ class _HomePageState extends State { late AccountsBloc _accountsBloc; late AppsBloc _appsBloc; late CapabilitiesBloc _capabilitiesBloc; - late FirstLaunchBloc _firstLaunchBloc; - late NextPushBloc _nextPushBloc; @override void initState() { @@ -35,8 +33,6 @@ class _HomePageState extends State { _accountsBloc = Provider.of(context, listen: false); _appsBloc = _accountsBloc.getAppsBloc(widget.account); _capabilitiesBloc = _accountsBloc.getCapabilitiesBloc(widget.account); - _firstLaunchBloc = Provider.of(context, listen: false); - _nextPushBloc = Provider.of(context, listen: false); _appsBloc.openNotifications.listen((final _) async { final notificationsAppImplementation = _appsBloc.notificationsAppImplementation.valueOrNull; @@ -100,52 +96,6 @@ class _HomePageState extends State { } }); - _firstLaunchBloc.onFirstLaunch.listen((final _) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(AppLocalizations.of(context).firstLaunchGoToSettingsToEnablePushNotifications), - action: SnackBarAction( - label: AppLocalizations.of(context).settings, - onPressed: () async { - await Navigator.of(context).push( - MaterialPageRoute( - builder: (final context) => const SettingsPage(), - ), - ); - }, - ), - ), - ); - }); - - _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).no), - ), - ElevatedButton( - onPressed: () { - Navigator.of(context).pop(); - launchUrlString( - 'https://f-droid.org/packages/$unifiedPushNextPushID', - mode: LaunchMode.externalApplication, - ); - }, - child: Text(AppLocalizations.of(context).nextPushSupportedInstall), - ), - ], - ), - ); - }); - unawaited(_checkMaintenanceMode()); } diff --git a/packages/neon/lib/src/utils/global_popups.dart b/packages/neon/lib/src/utils/global_popups.dart new file mode 100644 index 00000000..5669d96a --- /dev/null +++ b/packages/neon/lib/src/utils/global_popups.dart @@ -0,0 +1,72 @@ +part of '../neon.dart'; + +class GlobalPopups extends StatefulWidget { + const GlobalPopups({ + super.key, + }); + + @override + State createState() => _GlobalPopupsState(); +} + +class _GlobalPopupsState extends State { + late FirstLaunchBloc _firstLaunchBloc; + late NextPushBloc _nextPushBloc; + + @override + void initState() { + super.initState(); + + _firstLaunchBloc = Provider.of(context, listen: false); + _nextPushBloc = Provider.of(context, listen: false); + + _firstLaunchBloc.onFirstLaunch.listen((final _) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(AppLocalizations.of(context).firstLaunchGoToSettingsToEnablePushNotifications), + action: SnackBarAction( + label: AppLocalizations.of(context).settings, + onPressed: () async { + await Navigator.of(context).push( + MaterialPageRoute( + builder: (final context) => const SettingsPage(), + ), + ); + }, + ), + ), + ); + }); + + _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).no), + ), + ElevatedButton( + onPressed: () { + Navigator.of(context).pop(); + launchUrlString( + 'https://f-droid.org/packages/$unifiedPushNextPushID', + mode: LaunchMode.externalApplication, + ); + }, + child: Text(AppLocalizations.of(context).nextPushSupportedInstall), + ), + ], + ), + ); + }); + } + + @override + Widget build(final BuildContext context) => Container(); +}