forked from firka/student-legacy
absence notification
This commit is contained in:
parent
27ef942723
commit
633601a0f3
1286
.idea/libraries/Dart_Packages.xml
generated
Normal file
1286
.idea/libraries/Dart_Packages.xml
generated
Normal file
File diff suppressed because it is too large
Load Diff
27
.idea/libraries/Dart_SDK.xml
generated
Normal file
27
.idea/libraries/Dart_SDK.xml
generated
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Dart SDK">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/async" />
|
||||||
|
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/cli" />
|
||||||
|
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/collection" />
|
||||||
|
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/convert" />
|
||||||
|
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/core" />
|
||||||
|
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/developer" />
|
||||||
|
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/ffi" />
|
||||||
|
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/html" />
|
||||||
|
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/indexed_db" />
|
||||||
|
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/io" />
|
||||||
|
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/isolate" />
|
||||||
|
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/js" />
|
||||||
|
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/js_util" />
|
||||||
|
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/math" />
|
||||||
|
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/mirrors" />
|
||||||
|
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/svg" />
|
||||||
|
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/typed_data" />
|
||||||
|
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/web_audio" />
|
||||||
|
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/web_gl" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES />
|
||||||
|
</library>
|
||||||
|
</component>
|
4
.idea/misc.xml
generated
Normal file
4
.idea/misc.xml
generated
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectRootManager" version="2" project-jdk-name="Android API 33, extension level 3 Platform" project-jdk-type="Android SDK" />
|
||||||
|
</project>
|
@ -1,37 +1,47 @@
|
|||||||
import 'dart:math';
|
|
||||||
import 'dart:ui';
|
import 'dart:ui';
|
||||||
|
|
||||||
import 'package:filcnaplo/api/providers/database_provider.dart';
|
import 'package:filcnaplo/api/providers/database_provider.dart';
|
||||||
import 'package:filcnaplo/api/providers/status_provider.dart';
|
import 'package:filcnaplo/api/providers/status_provider.dart';
|
||||||
import 'package:filcnaplo/api/providers/user_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/models/settings.dart';
|
||||||
import 'package:filcnaplo/helpers/notification_helper.i18n.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/client/client.dart';
|
||||||
|
import 'package:filcnaplo_kreta_api/models/absence.dart';
|
||||||
import 'package:filcnaplo_kreta_api/models/grade.dart';
|
import 'package:filcnaplo_kreta_api/models/grade.dart';
|
||||||
import 'package:filcnaplo_kreta_api/providers/grade_provider.dart';
|
import 'package:filcnaplo_kreta_api/providers/grade_provider.dart';
|
||||||
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
|
||||||
class NotificationsHelper {
|
class NotificationsHelper {
|
||||||
|
late DatabaseProvider database;
|
||||||
|
late SettingsProvider settingsProvider;
|
||||||
|
late UserProvider userProvider;
|
||||||
|
late KretaClient kretaClient;
|
||||||
|
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
|
||||||
@pragma('vm:entry-point')
|
@pragma('vm:entry-point')
|
||||||
void backgroundJob() async {
|
void backgroundJob() async {
|
||||||
// initialize providers
|
// initialize providers
|
||||||
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
|
database = DatabaseProvider();
|
||||||
FlutterLocalNotificationsPlugin();
|
|
||||||
DatabaseProvider database = DatabaseProvider();
|
|
||||||
var db = await initDB(database);
|
|
||||||
await database.init();
|
await database.init();
|
||||||
SettingsProvider settingsProvider =
|
settingsProvider =
|
||||||
await database.query.getSettings(database);
|
await database.query.getSettings(database);
|
||||||
UserProvider userProvider = await database.query.getUsers(settingsProvider);
|
userProvider = await database.query.getUsers(settingsProvider);
|
||||||
|
|
||||||
if (userProvider.id != null && settingsProvider.notificationsEnabled) {
|
if (userProvider.id != null && settingsProvider.notificationsEnabled) {
|
||||||
// refresh grades
|
// refresh kreta login
|
||||||
final status = StatusProvider();
|
final status = StatusProvider();
|
||||||
final kretaClient = KretaClient(
|
kretaClient = KretaClient(
|
||||||
user: userProvider, settings: settingsProvider, status: status);
|
user: userProvider, settings: settingsProvider, status: status);
|
||||||
kretaClient.refreshLogin();
|
kretaClient.refreshLogin();
|
||||||
GradeProvider gradeProvider = GradeProvider(
|
gradeNotification();
|
||||||
|
absenceNotification();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void gradeNotification() async {
|
||||||
|
// fetch grades
|
||||||
|
GradeProvider gradeProvider = GradeProvider(
|
||||||
settings: settingsProvider,
|
settings: settingsProvider,
|
||||||
user: userProvider,
|
user: userProvider,
|
||||||
database: database,
|
database: database,
|
||||||
@ -54,13 +64,25 @@ class NotificationsHelper {
|
|||||||
priority: Priority.max,
|
priority: Priority.max,
|
||||||
color: const Color(0xFF3D7BF4),
|
color: const Color(0xFF3D7BF4),
|
||||||
ticker: 'Jegyek');
|
ticker: 'Jegyek');
|
||||||
const NotificationDetails notificationDetails =
|
const NotificationDetails notificationDetails = NotificationDetails(android: androidNotificationDetails);
|
||||||
NotificationDetails(android: androidNotificationDetails);
|
if(userProvider.getUsers().length == 1) {
|
||||||
await flutterLocalNotificationsPlugin.show(
|
await flutterLocalNotificationsPlugin.show(
|
||||||
// probably shouldn't use a random int
|
grade.id.hashCode,
|
||||||
Random().nextInt(432234 * 2),
|
"title_grade".i18n,
|
||||||
"title".i18n,
|
"body_grade".i18n.fill([
|
||||||
"body".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.value.value.toString(),
|
||||||
grade.subject.isRenamed &&
|
grade.subject.isRenamed &&
|
||||||
settingsProvider.renamedSubjectsEnabled
|
settingsProvider.renamedSubjectsEnabled
|
||||||
@ -69,9 +91,56 @@ class NotificationsHelper {
|
|||||||
]),
|
]),
|
||||||
notificationDetails);
|
notificationDetails);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// set grade seen status
|
// set grade seen status
|
||||||
gradeProvider.seenAll();
|
gradeProvider.seenAll();
|
||||||
|
}
|
||||||
|
void absenceNotification() async {
|
||||||
|
List? absenceJson = await kretaClient.getAPI(KretaAPI.absences(userProvider.instituteCode ?? ""));
|
||||||
|
List<Absence> storedAbsences = await database.userQuery.getAbsences(userId: userProvider.id!);
|
||||||
|
if(absenceJson == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
List<Absence> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,16 +4,28 @@ extension Localization on String {
|
|||||||
static final _t = Translations.byLocale("hu_hu") +
|
static final _t = Translations.byLocale("hu_hu") +
|
||||||
{
|
{
|
||||||
"en_en": {
|
"en_en": {
|
||||||
"title": "New grade",
|
"title_grade": "New grade",
|
||||||
"body": "You got a %s in %s"
|
"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": {
|
"hu_hu": {
|
||||||
"title": "Új jegy",
|
"title_grade": "Új jegy",
|
||||||
"body": "%s-st kaptál %s tantárgyból"
|
"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": {
|
"de_de": {
|
||||||
"title": "Neue Note",
|
"title_grade": "Neue Note",
|
||||||
"body": "Du hast eine %s in %s"
|
"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"
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -4,7 +4,6 @@ import 'package:filcnaplo/api/providers/database_provider.dart';
|
|||||||
import 'package:filcnaplo/database/init.dart';
|
import 'package:filcnaplo/database/init.dart';
|
||||||
import 'package:filcnaplo/helpers/notification_helper.dart';
|
import 'package:filcnaplo/helpers/notification_helper.dart';
|
||||||
import 'package:filcnaplo/models/settings.dart';
|
import 'package:filcnaplo/models/settings.dart';
|
||||||
import 'package:filcnaplo_kreta_api/client/client.dart';
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:filcnaplo/app.dart';
|
import 'package:filcnaplo/app.dart';
|
||||||
|
@ -89,7 +89,9 @@ Future<List<DateWidget>> getFilterWidgets(FilterType activeData,
|
|||||||
|
|
||||||
// Grades
|
// Grades
|
||||||
case FilterType.grades:
|
case FilterType.grades:
|
||||||
gradeProvider.seenAll();
|
if(!settingsProvider.gradeOpeningFun) {
|
||||||
|
gradeProvider.seenAll();
|
||||||
|
}
|
||||||
items = grade_filter.getWidgets(
|
items = grade_filter.getWidgets(
|
||||||
gradeProvider.grades, gradeProvider.lastSeenDate);
|
gradeProvider.grades, gradeProvider.lastSeenDate);
|
||||||
if (settingsProvider.gradeOpeningFun) {
|
if (settingsProvider.gradeOpeningFun) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user