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) {