diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml new file mode 100644 index 0000000..86624d6 --- /dev/null +++ b/.idea/libraries/Dart_Packages.xml @@ -0,0 +1,1286 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Dart_SDK.xml b/.idea/libraries/Dart_SDK.xml new file mode 100644 index 0000000..563d1c4 --- /dev/null +++ b/.idea/libraries/Dart_SDK.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..de791dd --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/filcnaplo/lib/helpers/notification_helper.dart b/filcnaplo/lib/helpers/notification_helper.dart index c1cfcb6..b3b70ba 100644 --- a/filcnaplo/lib/helpers/notification_helper.dart +++ b/filcnaplo/lib/helpers/notification_helper.dart @@ -1,37 +1,47 @@ -import 'dart:math'; import 'dart:ui'; import 'package:filcnaplo/api/providers/database_provider.dart'; import 'package:filcnaplo/api/providers/status_provider.dart'; 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_kreta_api/client/api.dart'; import 'package:filcnaplo_kreta_api/client/client.dart'; +import 'package:filcnaplo_kreta_api/models/absence.dart'; import 'package:filcnaplo_kreta_api/models/grade.dart'; import 'package:filcnaplo_kreta_api/providers/grade_provider.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:intl/intl.dart'; class NotificationsHelper { + late DatabaseProvider database; + late SettingsProvider settingsProvider; + late UserProvider userProvider; + late KretaClient kretaClient; + FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); @pragma('vm:entry-point') void backgroundJob() async { // initialize providers - FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = - FlutterLocalNotificationsPlugin(); - DatabaseProvider database = DatabaseProvider(); - var db = await initDB(database); + database = DatabaseProvider(); await database.init(); - SettingsProvider settingsProvider = + settingsProvider = await database.query.getSettings(database); - UserProvider userProvider = await database.query.getUsers(settingsProvider); + userProvider = await database.query.getUsers(settingsProvider); if (userProvider.id != null && settingsProvider.notificationsEnabled) { - // refresh grades + // refresh kreta login final status = StatusProvider(); - final kretaClient = KretaClient( + kretaClient = KretaClient( user: userProvider, settings: settingsProvider, status: status); kretaClient.refreshLogin(); - GradeProvider gradeProvider = GradeProvider( + gradeNotification(); + absenceNotification(); + } + } + + void gradeNotification() async { + // fetch grades + GradeProvider gradeProvider = GradeProvider( settings: settingsProvider, user: userProvider, database: database, @@ -54,13 +64,25 @@ class NotificationsHelper { priority: Priority.max, color: const Color(0xFF3D7BF4), ticker: 'Jegyek'); - const NotificationDetails notificationDetails = - NotificationDetails(android: androidNotificationDetails); + const NotificationDetails notificationDetails = NotificationDetails(android: androidNotificationDetails); + if(userProvider.getUsers().length == 1) { await flutterLocalNotificationsPlugin.show( - // probably shouldn't use a random int - Random().nextInt(432234 * 2), - "title".i18n, - "body".i18n.fill([ + grade.id.hashCode, + "title_grade".i18n, + "body_grade".i18n.fill([ + grade.value.value.toString(), + grade.subject.isRenamed && + settingsProvider.renamedSubjectsEnabled + ? grade.subject.renamedTo! + : grade.subject.name + ]), + notificationDetails); + } else { // multiple users are added, also display student name + await flutterLocalNotificationsPlugin.show( + grade.id.hashCode, + "title_grade".i18n, + "body_grade_multiuser".i18n.fill([ + userProvider.displayName!, grade.value.value.toString(), grade.subject.isRenamed && settingsProvider.renamedSubjectsEnabled @@ -69,9 +91,56 @@ class NotificationsHelper { ]), notificationDetails); } + } } // set grade seen status gradeProvider.seenAll(); + } + void absenceNotification() async { + List? absenceJson = await kretaClient.getAPI(KretaAPI.absences(userProvider.instituteCode ?? "")); + List storedAbsences = await database.userQuery.getAbsences(userId: userProvider.id!); + if(absenceJson == null) { + return; + } + List absences = absenceJson.map((e) => Absence.fromJson(e)).toList(); + if(absences != storedAbsences) { + absences.removeWhere((element) => storedAbsences.contains(element)); + for(Absence absence in absences) { + const AndroidNotificationDetails androidNotificationDetails = + AndroidNotificationDetails('ABSENCES', 'Hiányzások', + channelDescription: 'Értesítés hiányzások beírásakor', + importance: Importance.max, + priority: Priority.max, + color: const Color(0xFF3D7BF4), + ticker: 'Hiányzások'); + const NotificationDetails notificationDetails = NotificationDetails(android: androidNotificationDetails); + if(userProvider.getUsers().length == 1) { + await flutterLocalNotificationsPlugin.show( + absence.id.hashCode, + "title_absence".i18n, + "body_absence".i18n.fill([ + DateFormat("yyyy-MM-dd").format(absence.date), + absence.subject.isRenamed && + settingsProvider.renamedSubjectsEnabled + ? absence.subject.renamedTo! + : absence.subject.name + ]), + notificationDetails); + } else { + await flutterLocalNotificationsPlugin.show( + absence.id.hashCode, + "title_absence".i18n, + "body_absence_multiuser".i18n.fill([ + userProvider.displayName!, + DateFormat("yyyy-MM-dd").format(absence.date), + absence.subject.isRenamed && + settingsProvider.renamedSubjectsEnabled + ? absence.subject.renamedTo! + : absence.subject.name + ]), + notificationDetails); + } + } } } } diff --git a/filcnaplo/lib/helpers/notification_helper.i18n.dart b/filcnaplo/lib/helpers/notification_helper.i18n.dart index 5c96488..cccd35c 100644 --- a/filcnaplo/lib/helpers/notification_helper.i18n.dart +++ b/filcnaplo/lib/helpers/notification_helper.i18n.dart @@ -4,16 +4,28 @@ extension Localization on String { static final _t = Translations.byLocale("hu_hu") + { "en_en": { - "title": "New grade", - "body": "You got a %s in %s" + "title_grade": "New grade", + "body_grade": "You got a %s in %s", + "body_grade_multiuser": "%s got a %s in %s", + "title_absence": "Absence recorded", + "body_absence": "An absence was recorded on %s for %s", + "body_absence_multiuser": "An absence was recorded for %s on %s for the subject %s", }, "hu_hu": { - "title": "Új jegy", - "body": "%s-st kaptál %s tantárgyból" + "title_grade": "Új jegy", + "body_grade": "%s-st kaptál %s tantárgyból", + "body_grade_multiuser": "%s tanuló %s-st kapott %s tantárgyból", + "title_absence": "Új hiányzás", + "body_absence": "Új hiányzást kaptál %s napon %s tantárgyból", + "body_absence_multiuser": "%s tanuló új hiányzást kapott %s napon %s tantárgyból" }, "de_de": { - "title": "Neue Note", - "body": "Du hast eine %s in %s" + "title_grade": "Neue Note", + "body_grade": "Du hast eine %s in %s", + "body_grade_multiuser": "%s hast eine %s in %s", + "title_absence": "Abwesenheit aufgezeichnet", + "body_absence": "Auf %s für %s wurde eine Abwesenheit aufgezeichnet", + "body_absence_multiuser": "Für %s wurde am %s für das Thema Mathematik eine Abwesenheit aufgezeichnet" }, }; diff --git a/filcnaplo/lib/main.dart b/filcnaplo/lib/main.dart index 1131ffb..0dd0955 100644 --- a/filcnaplo/lib/main.dart +++ b/filcnaplo/lib/main.dart @@ -4,7 +4,6 @@ import 'package:filcnaplo/api/providers/database_provider.dart'; import 'package:filcnaplo/database/init.dart'; import 'package:filcnaplo/helpers/notification_helper.dart'; import 'package:filcnaplo/models/settings.dart'; -import 'package:filcnaplo_kreta_api/client/client.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:filcnaplo/app.dart'; diff --git a/filcnaplo/lib/ui/filter/widgets.dart b/filcnaplo/lib/ui/filter/widgets.dart index bce82ae..54589d7 100644 --- a/filcnaplo/lib/ui/filter/widgets.dart +++ b/filcnaplo/lib/ui/filter/widgets.dart @@ -89,7 +89,9 @@ Future> getFilterWidgets(FilterType activeData, // Grades case FilterType.grades: - gradeProvider.seenAll(); + if(!settingsProvider.gradeOpeningFun) { + gradeProvider.seenAll(); + } items = grade_filter.getWidgets( gradeProvider.grades, gradeProvider.lastSeenDate); if (settingsProvider.gradeOpeningFun) {