From fe685c40fc55496a7e0a373a28c8ad0e0ef58f7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Fri, 8 Sep 2023 21:58:54 +0200 Subject: [PATCH] Added dialog to ask users to enable Notifications --- lib/app.dart | 1 + lib/notification/notifyUpdater.dart | 21 ++++++++++++++++ lib/view/pages/talk/chatList.dart | 37 ++++++++++++++++++++++++++--- lib/view/settings/settings.dart | 14 +---------- 4 files changed, 57 insertions(+), 16 deletions(-) diff --git a/lib/app.dart b/lib/app.dart index dcb0833..192e866 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -53,6 +53,7 @@ class _AppState extends State { } FirebaseMessaging.onMessage.listen((message) => NotificationController.onForegroundMessageHandler(message, context)); + FirebaseMessaging.onMessageOpenedApp.listen((message) => NotificationController.onForegroundMessageHandler(message, context)); FirebaseMessaging.onBackgroundMessage(NotificationController.onBackgroundMessageHandler); super.initState(); diff --git a/lib/notification/notifyUpdater.dart b/lib/notification/notifyUpdater.dart index cf9cef6..a6740dc 100644 --- a/lib/notification/notifyUpdater.dart +++ b/lib/notification/notifyUpdater.dart @@ -1,3 +1,4 @@ +import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; import 'dart:developer'; @@ -5,13 +6,33 @@ import 'dart:developer'; import 'package:crypto/crypto.dart'; import 'package:fast_rsa/fast_rsa.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:marianum_mobile/storage/base/settingsProvider.dart'; import '../api/mhsl/notify/register/notifyRegister.dart'; import '../api/mhsl/notify/register/notifyRegisterParams.dart'; import '../model/accountData.dart'; import '../model/endpointData.dart'; +import '../widget/confirmDialog.dart'; class NotifyUpdater { + static ConfirmDialog enableAfterDisclaimer(SettingsProvider settings) { + return ConfirmDialog( + title: "Warnung", + icon: Icons.warning_amber, + content: "" + "Die Push-Benachrichtigungen werden durch mhsl.eu versendet.\n\n" + "Durch das aktivieren dieser Funktion wird dein Nutzername, dein Password und eine Geräte-ID von mhsl dauerhaft gespeichert und verarbeitet.\n\n" + "Für mehr Informationen drücke lange auf die Einstellungsoption!", + confirmButton: "Aktivieren", + onConfirm: () { + FirebaseMessaging.instance.requestPermission( + provisional: false + ); + settings.val(write: true).notificationSettings.enabled = true; + NotifyUpdater.registerToServer(); + }, + ); + } static void registerToServer() async { String? fcmToken = await FirebaseMessaging.instance.getToken(); diff --git a/lib/view/pages/talk/chatList.dart b/lib/view/pages/talk/chatList.dart index 4b1e963..89f5a49 100644 --- a/lib/view/pages/talk/chatList.dart +++ b/lib/view/pages/talk/chatList.dart @@ -7,6 +7,7 @@ import 'package:provider/provider.dart'; import '../../../api/marianumcloud/talk/createRoom/createRoom.dart'; import '../../../api/marianumcloud/talk/createRoom/createRoomParams.dart'; import '../../../model/chatList/chatListProps.dart'; +import '../../../notification/notifyUpdater.dart'; import '../../../storage/base/settingsProvider.dart'; import '../../../widget/confirmDialog.dart'; import '../../../widget/loadingSpinner.dart'; @@ -27,13 +28,43 @@ class _ChatListState extends State { void initState() { super.initState(); - FirebaseMessaging.instance.requestPermission( - provisional: false - ); + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { _query(); + + SettingsProvider settings = Provider.of(context, listen: false); + if(!settings.val().notificationSettings.enabled && !settings.val().notificationSettings.askUsageDismissed) { + settings.val(write: true).notificationSettings.askUsageDismissed = true; + + ConfirmDialog( + icon: Icons.notifications_active_outlined, + title: "Benachrichtigungen aktivieren", + content: "Auf wunsch kannst du Push-Benachrichtigungen aktivieren. Deine Einstellungen kannst du jederzeit ändern.", + confirmButton: "Weiter", + onConfirm: () { + FirebaseMessaging.instance.requestPermission( + provisional: false + ).then((value) { + switch (value.authorizationStatus) { + case AuthorizationStatus.authorized: + NotifyUpdater.enableAfterDisclaimer(settings).asDialog(context); + break; + case AuthorizationStatus.denied: + showDialog(context: context, builder: (context) => const AlertDialog( + content: Text("Du kannst die Benachrichtigungen später jederzeit in den App-Einstellungen aktivieren."), + )); + break; + default: + break; + } + }); + }, + ).asDialog(context); + } }); + + } void _query({bool renew = false}) { diff --git a/lib/view/settings/settings.dart b/lib/view/settings/settings.dart index f902198..bc5642a 100644 --- a/lib/view/settings/settings.dart +++ b/lib/view/settings/settings.dart @@ -157,19 +157,7 @@ class _SettingsState extends State { value: settings.val().notificationSettings.enabled, onChanged: (e) { if(e!) { - ConfirmDialog( - title: "Warnung", - icon: Icons.warning_amber, - content: "" - "Die Push-Benachrichtigungen werden durch mhsl.eu versendet.\n\n" - "Durch das aktivieren dieser Funktion wird dein Nutzername, dein Password und eine Geräte-ID von mhsl dauerhaft gespeichert und verarbeitet.\n\n" - "Für mehr Informationen drücke lange auf die Einstellungsoption!", - confirmButton: "Aktivieren", - onConfirm: () { - settings.val(write: true).notificationSettings.enabled = e; - NotifyUpdater.registerToServer(); - }, - ).asDialog(context); + NotifyUpdater.enableAfterDisclaimer(settings).asDialog(context); } else { settings.val(write: true).notificationSettings.enabled = e; }