From 07bbafe7dd0811ec590b5d681fd27037a7d88251 Mon Sep 17 00:00:00 2001 From: hihihaha Date: Sat, 10 Jun 2023 20:34:01 +0200 Subject: [PATCH] add toggle for notifications in settings --- .../lib/helpers/notification_helper.dart | 80 +++++++++++-------- .../lib/screens/settings/settings_screen.dart | 43 +++++++++- 2 files changed, 89 insertions(+), 34 deletions(-) diff --git a/filcnaplo/lib/helpers/notification_helper.dart b/filcnaplo/lib/helpers/notification_helper.dart index 2464fd2..acc3a87 100644 --- a/filcnaplo/lib/helpers/notification_helper.dart +++ b/filcnaplo/lib/helpers/notification_helper.dart @@ -7,16 +7,14 @@ import 'package:filcnaplo/api/providers/user_provider.dart'; import 'package:filcnaplo/database/init.dart'; import 'package:filcnaplo/models/settings.dart'; import 'package:filcnaplo/helpers/notification_helper.i18n.dart'; -import 'package:filcnaplo/theme/colors/accent.dart'; import 'package:filcnaplo_kreta_api/client/client.dart'; -import 'package:filcnaplo_kreta_api/models/category.dart'; import 'package:filcnaplo_kreta_api/models/grade.dart'; -import 'package:filcnaplo_kreta_api/models/subject.dart'; import 'package:filcnaplo_kreta_api/providers/grade_provider.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; class NotificationsHelper { void backgroundJob() async { + // initialize providers FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); DatabaseProvider database = DatabaseProvider(); @@ -25,37 +23,53 @@ class NotificationsHelper { SettingsProvider settingsProvider = await database.query.getSettings(database); UserProvider userProvider = await database.query.getUsers(settingsProvider); - if(userProvider.id != null) { - final status = StatusProvider(); - final kretaClient = KretaClient( - user: userProvider, settings: settingsProvider, status: status); - kretaClient.refreshLogin(); - GradeProvider gradeProvider = GradeProvider( - settings: settingsProvider, - user: userProvider, - database: database, - kreta: kretaClient); - gradeProvider.fetch(); - List grades = - await database.userQuery.getGrades(userId: userProvider.id ?? ""); - DateTime lastSeenGrade = - await database.userQuery.lastSeenGrade(userId: userProvider.id ?? ""); - for (Grade grade in grades) { - if (grade.seenDate.isAfter(lastSeenGrade)) { - const AndroidNotificationDetails androidNotificationDetails = - AndroidNotificationDetails('GRADES', 'Jegyek', - channelDescription: 'Értesítés jegyek beírásakor', - importance: Importance.max, - priority: Priority.max, - color: const Color(0xFF3D7BF4), - ticker: 'ticker'); - const NotificationDetails notificationDetails = - NotificationDetails(android: androidNotificationDetails); - await flutterLocalNotificationsPlugin.show( - Random().nextInt(432234*2), "title".i18n, "body".i18n.fill([grade.value.value.toString(), grade.subject.name.toString()]), notificationDetails); + + if (userProvider.id != null && settingsProvider.notificationsEnabled) { + // refresh grades + final status = StatusProvider(); + final kretaClient = KretaClient( + user: userProvider, settings: settingsProvider, status: status); + kretaClient.refreshLogin(); + GradeProvider gradeProvider = GradeProvider( + settings: settingsProvider, + user: userProvider, + database: database, + kreta: kretaClient); + gradeProvider.fetch(); + List grades = + await database.userQuery.getGrades(userId: userProvider.id ?? ""); + DateTime lastSeenGrade = + await database.userQuery.lastSeenGrade(userId: userProvider.id ?? ""); + + // loop through grades and see which hasn't been seen yet + for (Grade grade in grades) { + if (grade.seenDate.isAfter(lastSeenGrade)) { + // send notificiation about new grade + const AndroidNotificationDetails androidNotificationDetails = + AndroidNotificationDetails('GRADES', 'Jegyek', + channelDescription: 'Értesítés jegyek beírásakor', + importance: Importance.max, + priority: Priority.max, + color: const Color(0xFF3D7BF4), + ticker: 'Jegyek'); + const NotificationDetails notificationDetails = + NotificationDetails(android: androidNotificationDetails); + await flutterLocalNotificationsPlugin.show( + // probably shouldn't use a random int + Random().nextInt(432234 * 2), + "title".i18n, + "body".i18n.fill([ + grade.value.value.toString(), + grade.subject.isRenamed && + settingsProvider.renamedSubjectsEnabled + ? grade.subject.renamedTo! + : grade.subject.name + ]), + notificationDetails); + } } - } - gradeProvider.seenAll(); + // set grade seen status + gradeProvider.seenAll(); } } } diff --git a/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart b/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart index 93410a8..0d1bcdd 100755 --- a/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart +++ b/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart @@ -153,7 +153,7 @@ class _SettingsScreenState extends State void initState() { super.initState(); Future.delayed(Duration.zero, () { - futureRelease = Provider.of(context).installedVersion(); + futureRelease = Provider.of(context, listen: false).installedVersion(); }); _hideContainersController = AnimationController( vsync: this, duration: const Duration(milliseconds: 200)); @@ -434,6 +434,47 @@ class _SettingsScreenState extends State activeColor: Theme.of(context).colorScheme.secondary, ), ), + PanelButton( + padding: const EdgeInsets.only(left: 14.0), + title: Row(children: [ + Text( + "notifications".i18n, + style: TextStyle( + color: AppColors.of(context).text.withOpacity( + settings.notificationsEnabled ? 1.0 : .5)), + ), + SizedBox( + width: 5, + ), + SizedBox( + height: 30, + child: AnimatedContainer( + duration: Duration(milliseconds: 200), + child: Padding( + padding: + const EdgeInsets.only(left: 10, right: 10), + child: Center( + child: Text("BETA", + style: TextStyle(fontSize: 9.1, color: AppColors.of(context).text.withOpacity(settings.notificationsEnabled ? 1.0 : .5), overflow: TextOverflow.ellipsis))), + ), + decoration: BoxDecoration( + color: AppColors.of(context).filc.withOpacity(settings.notificationsEnabled ? 1.0 : .5), + borderRadius: BorderRadius.circular(40)), + ), + ) + ]), + leading: settings.notificationsEnabled + ? const Icon(FeatherIcons.messageSquare) + : Icon(FeatherIcons.messageSquare, + color: + AppColors.of(context).text.withOpacity(.25)), + trailing: Switch( + onChanged: (v) => + settings.update(notificationsEnabled: v), + value: settings.notificationsEnabled, + activeColor: Theme.of(context).colorScheme.secondary, + ), + ), ], ), ),