add notification for lesson updates

This commit is contained in:
hihihaha 2023-08-29 15:36:23 +02:00
parent e280227ee1
commit ea2b91ca15
8 changed files with 334 additions and 12 deletions

View File

@ -20,7 +20,7 @@ const settingsDB = DatabaseStruct("settings", {
"grade_color4": int, "grade_color5": int, // grade colors "grade_color4": int, "grade_color5": int, // grade colors
"vibration_strength": int, "ab_weeks": int, "swap_ab_weeks": int, "vibration_strength": int, "ab_weeks": int, "swap_ab_weeks": int,
"notifications": int, "notifications_bitfield": int, "notifications": int, "notifications_bitfield": int,
"notification_poll_interval": int, "notifications_grades":int, "notifications_absences":int, "notifications_messages": int, // notifications "notification_poll_interval": int, "notifications_grades":int, "notifications_absences":int, "notifications_messages": int, "notifications_lessons":int, // notifications
"x_filc_id": String, "graph_class_avg": int, "presentation_mode": int, "x_filc_id": String, "graph_class_avg": int, "presentation_mode": int,
"bell_delay": int, "bell_delay_enabled": int, "bell_delay": int, "bell_delay_enabled": int,
"grade_opening_fun": int, "icon_pack": String, "premium_scopes": String, "grade_opening_fun": int, "icon_pack": String, "premium_scopes": String,

View File

@ -10,9 +10,12 @@ 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/absence.dart';
import 'package:filcnaplo_kreta_api/models/grade.dart'; import 'package:filcnaplo_kreta_api/models/grade.dart';
import 'package:filcnaplo_kreta_api/models/lesson.dart';
import 'package:filcnaplo_kreta_api/models/week.dart';
import 'package:filcnaplo_kreta_api/providers/grade_provider.dart'; import 'package:filcnaplo_kreta_api/providers/grade_provider.dart';
import 'package:filcnaplo_kreta_api/providers/timetable_provider.dart'; import 'package:filcnaplo_kreta_api/providers/timetable_provider.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart' hide Message; import 'package:flutter_local_notifications/flutter_local_notifications.dart' hide Message;
import 'package:i18n_extension/i18n_widget.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:filcnaplo_kreta_api/models/message.dart'; import 'package:filcnaplo_kreta_api/models/message.dart';
@ -45,6 +48,15 @@ class NotificationsHelper {
return combinedList; return combinedList;
} }
String dayTitle(DateTime date) {
try {
return DateFormat("EEEE", I18n.locale.languageCode)
.format(date);
} catch (e) {
return "Unknown";
}
}
@pragma('vm:entry-point') @pragma('vm:entry-point')
void backgroundJob() async { void backgroundJob() async {
// initialize providers // initialize providers
@ -65,7 +77,8 @@ class NotificationsHelper {
kretaClient.refreshLogin(); kretaClient.refreshLogin();
if(settingsProvider.notificationsGradesEnabled) gradeNotification(); if(settingsProvider.notificationsGradesEnabled) gradeNotification();
if(settingsProvider.notificationsAbsencesEnabled) absenceNotification(); if(settingsProvider.notificationsAbsencesEnabled) absenceNotification();
messageNotification(); if(settingsProvider.notificationsMessagesEnabled) messageNotification();
if(settingsProvider.notificationsLessonsEnabled) lessonNotification();
} }
} }
@ -265,4 +278,247 @@ class NotificationsHelper {
await database.userStore.storeMessages(combinedmessages, userId: userProvider.id!); await database.userStore.storeMessages(combinedmessages, userId: userProvider.id!);
} }
void lessonNotification() async {
// get lesson from api
TimetableProvider timetableProvider = TimetableProvider(
user: userProvider, database: database, kreta: kretaClient);
List<Lesson> storedlessons =
timetableProvider.lessons[Week.current()] ?? [];
List? apilessons = timetableProvider.getWeek(Week.current()) ?? [];
for (Lesson lesson in apilessons) {
for (Lesson storedLesson in storedlessons) {
if (lesson.id == storedLesson.id) {
lesson.isSeen = storedLesson.isSeen;
}
}
}
List<Lesson> modifiedlessons = [];
if (apilessons != storedlessons) {
// remove lessons that are not new
apilessons.removeWhere((element) => storedlessons.contains(element));
for (Lesson lesson in apilessons) {
if (!lesson.isSeen && lesson.isChanged) {
lesson.isSeen = true;
modifiedlessons.add(lesson);
const AndroidNotificationDetails androidNotificationDetails =
AndroidNotificationDetails('LESSONS', 'Órák',
channelDescription:
'Értesítés órák elmaradásáról, helyettesítésről',
importance: Importance.max,
priority: Priority.max,
color: const Color(0xFF3D7BF4),
ticker: 'Órák');
const NotificationDetails notificationDetails =
NotificationDetails(android: androidNotificationDetails);
if (userProvider.getUsers().length == 1) {
if (lesson.status?.name == "Elmaradt") {
switch (I18n.localeStr) {
case "en_en":
{
await flutterLocalNotificationsPlugin.show(
lesson.id.hashCode,
"title_lesson".i18n,
"body_lesson_canceled".i18n.fill([
lesson.lessonIndex,
lesson.name,
dayTitle(lesson.date)
]),
notificationDetails);
break;
}
case "hu_hu":
{
await flutterLocalNotificationsPlugin.show(
lesson.id.hashCode,
"title_lesson".i18n,
"body_lesson_canceled".i18n.fill([
dayTitle(lesson.date),
lesson.lessonIndex,
lesson.name
]),
notificationDetails);
break;
}
default:
{
await flutterLocalNotificationsPlugin.show(
lesson.id.hashCode,
"title_lesson".i18n,
"body_lesson_canceled".i18n.fill([
lesson.lessonIndex,
lesson.name,
dayTitle(lesson.date)
]),
notificationDetails);
break;
}
}
} else if (lesson.substituteTeacher?.name != "") {
switch (I18n.localeStr) {
case "en_en":
{
await flutterLocalNotificationsPlugin.show(
lesson.id.hashCode,
"title_lesson".i18n,
"body_lesson_substituted".i18n.fill([
lesson.lessonIndex,
lesson.name,
dayTitle(lesson.date),
lesson.substituteTeacher!.isRenamed
? lesson.substituteTeacher!.renamedTo!
: lesson.substituteTeacher!.name
]),
notificationDetails);
break;
}
case "hu_hu":
{
await flutterLocalNotificationsPlugin.show(
lesson.id.hashCode,
"title_lesson".i18n,
"body_lesson_substituted".i18n.fill([
dayTitle(lesson.date),
lesson.lessonIndex,
lesson.name,
lesson.substituteTeacher!.isRenamed
? lesson.substituteTeacher!.renamedTo!
: lesson.substituteTeacher!.name
]),
notificationDetails);
break;
}
default:
{
await flutterLocalNotificationsPlugin.show(
lesson.id.hashCode,
"title_lesson".i18n,
"body_lesson_substituted".i18n.fill([
lesson.lessonIndex,
lesson.name,
dayTitle(lesson.date),
lesson.substituteTeacher!.isRenamed
? lesson.substituteTeacher!.renamedTo!
: lesson.substituteTeacher!.name
]),
notificationDetails);
break;
}
}
}
} else {
if (lesson.status?.name == "Elmaradt") {
switch (I18n.localeStr) {
case "en_en":
{
await flutterLocalNotificationsPlugin.show(
lesson.id.hashCode,
"title_lesson".i18n,
"body_lesson_canceled".i18n.fill([
userProvider.displayName!,
lesson.lessonIndex,
lesson.name,
dayTitle(lesson.date)
]),
notificationDetails);
break;
}
case "hu_hu":
{
await flutterLocalNotificationsPlugin.show(
lesson.id.hashCode,
"title_lesson".i18n,
"body_lesson_canceled".i18n.fill([
userProvider.displayName!,
dayTitle(lesson.date),
lesson.lessonIndex,
lesson.name
]),
notificationDetails);
break;
}
default:
{
await flutterLocalNotificationsPlugin.show(
lesson.id.hashCode,
"title_lesson".i18n,
"body_lesson_canceled".i18n.fill([
userProvider.displayName!,
lesson.lessonIndex,
lesson.name,
dayTitle(lesson.date)
]),
notificationDetails);
break;
}
}
} else if (lesson.substituteTeacher?.name != "") {
switch (I18n.localeStr) {
case "en_en":
{
await flutterLocalNotificationsPlugin.show(
lesson.id.hashCode,
"title_lesson".i18n,
"body_lesson_substituted".i18n.fill([
userProvider.displayName!,
lesson.lessonIndex,
lesson.name,
dayTitle(lesson.date),
lesson.substituteTeacher!.isRenamed
? lesson.substituteTeacher!.renamedTo!
: lesson.substituteTeacher!.name
]),
notificationDetails);
break;
}
case "hu_hu":
{
await flutterLocalNotificationsPlugin.show(
lesson.id.hashCode,
"title_lesson".i18n,
"body_lesson_substituted".i18n.fill([
userProvider.displayName!,
dayTitle(lesson.date),
lesson.lessonIndex,
lesson.name,
lesson.substituteTeacher!.isRenamed
? lesson.substituteTeacher!.renamedTo!
: lesson.substituteTeacher!.name
]),
notificationDetails);
break;
}
default:
{
await flutterLocalNotificationsPlugin.show(
lesson.id.hashCode,
"title_lesson".i18n,
"body_lesson_substituted".i18n.fill([
userProvider.displayName!,
lesson.lessonIndex,
lesson.name,
dayTitle(lesson.date),
lesson.substituteTeacher!.isRenamed
? lesson.substituteTeacher!.renamedTo!
: lesson.substituteTeacher!.name
]),
notificationDetails);
break;
}
}
}
}
}
}
// combine modified lesson and storedlesson list and save them to the database
List<Lesson> combinedlessons = combineLists(
modifiedlessons,
storedlessons,
(Lesson message) => message.id,
);
Map<Week, List<Lesson>> timetableLessons = timetableProvider.lessons;
timetableLessons[Week.current()] = combinedlessons;
await database.userStore
.storeLessons(timetableLessons, userId: userProvider.id!);
}
}
} }

View File

@ -10,6 +10,11 @@ extension Localization on String {
"title_absence": "Absence recorded", "title_absence": "Absence recorded",
"body_absence": "An absence was recorded on %s for %s", "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", "body_absence_multiuser": "An absence was recorded for %s on %s for the subject %s",
"title_lesson": "Timetable modified",
"body_lesson_canceled": "Lesson #%s (%s) has been canceled on %s",
"body_lesson_canceled_multiuser": "(%s) Lesson #%s (%s) has been canceled on %s",
"body_lesson_substituted": "Lesson #%s (%s) on %s will be substituted by %s",
"body_lesson_substituted_multiuser": "(%s) Lesson #%s (%s) on %s will be substituted by %s"
}, },
"hu_hu": { "hu_hu": {
"title_grade": "Új jegy", "title_grade": "Új jegy",
@ -18,6 +23,11 @@ extension Localization on String {
"title_absence": "Új hiányzás", "title_absence": "Új hiányzás",
"body_absence": "Új hiányzást kaptál %s napon %s tantárgyból", "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", "body_absence_multiuser": "%s tanuló új hiányzást kapott %s napon %s tantárgyból",
"title_lesson": "Órarend szerkesztve",
"body_lesson_canceled": "%s-i %s. óra (%s) elmarad",
"body_lesson_canceled_multiuser": "(%s) %s-i %s. óra (%s) elmarad",
"body_lesson_substituted": "%s-i %s. (%s) órát %s helyetessíti",
"body_lesson_substituted_multiuser": "(%s) %s-i %s. (%s) órát %s helyetessíti"
}, },
"de_de": { "de_de": {
"title_grade": "Neue Note", "title_grade": "Neue Note",
@ -26,6 +36,11 @@ extension Localization on String {
"title_absence": "Abwesenheit aufgezeichnet", "title_absence": "Abwesenheit aufgezeichnet",
"body_absence": "Auf %s für %s wurde eine 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", "body_absence_multiuser": "Für %s wurde am %s für das Thema Mathematik eine Abwesenheit aufgezeichnet",
"title_lesson": "Fahrplan geändert",
"body_lesson_canceled": "Lektion Nr. %s (%s) wurde am %s abgesagt",
"body_lesson_canceled_multiuser": "(%s) Lektion Nr. %s (%s) wurde am %s abgesagt",
"body_lesson_substituted": "Lektion Nr. %s (%s) wird am %s durch %s ersetzt",
"body_lesson_substituted_multiuser": "(%s) Lektion Nr. %s (%s) wird am %s durch %s ersetzt"
}, },
}; };

View File

@ -34,6 +34,7 @@ class SettingsProvider extends ChangeNotifier {
bool _notificationsGradesEnabled; bool _notificationsGradesEnabled;
bool _notificationsAbsencesEnabled; bool _notificationsAbsencesEnabled;
bool _notificationsMessagesEnabled; bool _notificationsMessagesEnabled;
bool _notificationsLessonsEnabled;
/* /*
notificationsBitfield values: notificationsBitfield values:
@ -90,6 +91,7 @@ class SettingsProvider extends ChangeNotifier {
required bool notificationsGradesEnabled, required bool notificationsGradesEnabled,
required bool notificationsAbsencesEnabled, required bool notificationsAbsencesEnabled,
required bool notificationsMessagesEnabled, required bool notificationsMessagesEnabled,
required bool notificationsLessonsEnabled,
required int notificationsBitfield, required int notificationsBitfield,
required bool developerMode, required bool developerMode,
required int notificationPollInterval, required int notificationPollInterval,
@ -131,6 +133,7 @@ class SettingsProvider extends ChangeNotifier {
_notificationsGradesEnabled = notificationsGradesEnabled, _notificationsGradesEnabled = notificationsGradesEnabled,
_notificationsAbsencesEnabled = notificationsAbsencesEnabled, _notificationsAbsencesEnabled = notificationsAbsencesEnabled,
_notificationsMessagesEnabled = notificationsMessagesEnabled, _notificationsMessagesEnabled = notificationsMessagesEnabled,
_notificationsLessonsEnabled = notificationsLessonsEnabled,
_notificationsBitfield = notificationsBitfield, _notificationsBitfield = notificationsBitfield,
_developerMode = developerMode, _developerMode = developerMode,
_notificationPollInterval = notificationPollInterval, _notificationPollInterval = notificationPollInterval,
@ -190,6 +193,7 @@ class SettingsProvider extends ChangeNotifier {
notificationsGradesEnabled: map["notifications_grades"] == 1, notificationsGradesEnabled: map["notifications_grades"] == 1,
notificationsAbsencesEnabled: map["notifications_absences"] == 1, notificationsAbsencesEnabled: map["notifications_absences"] == 1,
notificationsMessagesEnabled: map["notifications_messages"] == 1, notificationsMessagesEnabled: map["notifications_messages"] == 1,
notificationsLessonsEnabled: map["notifications_lessons"] == 1,
notificationsBitfield: map["notifications_bitfield"], notificationsBitfield: map["notifications_bitfield"],
notificationPollInterval: map["notification_poll_interval"], notificationPollInterval: map["notification_poll_interval"],
developerMode: map["developer_mode"] == 1, developerMode: map["developer_mode"] == 1,
@ -235,6 +239,7 @@ class SettingsProvider extends ChangeNotifier {
"notifications_grades": _notificationsGradesEnabled ? 1 : 0, "notifications_grades": _notificationsGradesEnabled ? 1 : 0,
"notifications_absences": _notificationsAbsencesEnabled ? 1 : 0, "notifications_absences": _notificationsAbsencesEnabled ? 1 : 0,
"notifications_messages": _notificationsMessagesEnabled ? 1 : 0, "notifications_messages": _notificationsMessagesEnabled ? 1 : 0,
"notifications_lessons": _notificationsLessonsEnabled ? 1 : 0,
"notifications_bitfield": _notificationsBitfield, "notifications_bitfield": _notificationsBitfield,
"developer_mode": _developerMode ? 1 : 0, "developer_mode": _developerMode ? 1 : 0,
"grade_color1": _gradeColors[0].value, "grade_color1": _gradeColors[0].value,
@ -291,6 +296,7 @@ class SettingsProvider extends ChangeNotifier {
notificationsGradesEnabled: true, notificationsGradesEnabled: true,
notificationsAbsencesEnabled: true, notificationsAbsencesEnabled: true,
notificationsMessagesEnabled: true, notificationsMessagesEnabled: true,
notificationsLessonsEnabled: true,
notificationsBitfield: 255, notificationsBitfield: 255,
developerMode: false, developerMode: false,
notificationPollInterval: 1, notificationPollInterval: 1,
@ -335,6 +341,7 @@ class SettingsProvider extends ChangeNotifier {
bool get notificationsGradesEnabled => _notificationsGradesEnabled; bool get notificationsGradesEnabled => _notificationsGradesEnabled;
bool get notificationsAbsencesEnabled => _notificationsAbsencesEnabled; bool get notificationsAbsencesEnabled => _notificationsAbsencesEnabled;
bool get notificationsMessagesEnabled => _notificationsMessagesEnabled; bool get notificationsMessagesEnabled => _notificationsMessagesEnabled;
bool get notificationsLessonsEnabled => _notificationsLessonsEnabled;
int get notificationsBitfield => _notificationsBitfield; int get notificationsBitfield => _notificationsBitfield;
bool get developerMode => _developerMode; bool get developerMode => _developerMode;
int get notificationPollInterval => _notificationPollInterval; int get notificationPollInterval => _notificationPollInterval;
@ -381,6 +388,7 @@ class SettingsProvider extends ChangeNotifier {
bool? notificationsGradesEnabled, bool? notificationsGradesEnabled,
bool? notificationsAbsencesEnabled, bool? notificationsAbsencesEnabled,
bool? notificationsMessagesEnabled, bool? notificationsMessagesEnabled,
bool? notificationsLessonsEnabled,
int? notificationsBitfield, int? notificationsBitfield,
bool? developerMode, bool? developerMode,
int? notificationPollInterval, int? notificationPollInterval,
@ -444,6 +452,10 @@ class SettingsProvider extends ChangeNotifier {
notificationsMessagesEnabled != _notificationsMessagesEnabled) { notificationsMessagesEnabled != _notificationsMessagesEnabled) {
_notificationsMessagesEnabled = notificationsMessagesEnabled; _notificationsMessagesEnabled = notificationsMessagesEnabled;
} }
if (notificationsLessonsEnabled != null &&
notificationsLessonsEnabled != _notificationsLessonsEnabled) {
_notificationsLessonsEnabled = notificationsLessonsEnabled;
}
if (notificationsBitfield != null && if (notificationsBitfield != null &&
notificationsBitfield != _notificationsBitfield) { notificationsBitfield != _notificationsBitfield) {
_notificationsBitfield = notificationsBitfield; _notificationsBitfield = notificationsBitfield;

View File

@ -25,6 +25,7 @@ class Lesson {
String name; String name;
bool online; bool online;
bool isEmpty; bool isEmpty;
bool isSeen;
Lesson({ Lesson({
this.status, this.status,
@ -49,7 +50,15 @@ class Lesson {
this.online = false, this.online = false,
this.isEmpty = false, this.isEmpty = false,
this.json, this.json,
this.isSeen = false,
}); });
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is Lesson && runtimeType == other.runtimeType && id == other.id;
@override
int get hashCode => id.hashCode;
factory Lesson.fromJson(Map json) { factory Lesson.fromJson(Map json) {
return Lesson( return Lesson(
@ -90,6 +99,7 @@ class Lesson {
online: json["IsDigitalisOra"] ?? false, online: json["IsDigitalisOra"] ?? false,
isEmpty: json['isEmpty'] ?? false, isEmpty: json['isEmpty'] ?? false,
json: json, json: json,
isSeen: false
); );
} }

View File

@ -8,7 +8,7 @@ import 'package:filcnaplo_kreta_api/models/week.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class TimetableProvider with ChangeNotifier { class TimetableProvider with ChangeNotifier {
Map<Week, List<Lesson>> _lessons = {}; Map<Week, List<Lesson>> lessons = {};
late final UserProvider _user; late final UserProvider _user;
late final DatabaseProvider _database; late final DatabaseProvider _database;
late final KretaClient _kreta; late final KretaClient _kreta;
@ -29,7 +29,7 @@ class TimetableProvider with ChangeNotifier {
// Load lessons from the database // Load lessons from the database
if (userId != null) { if (userId != null) {
var dbLessons = await _database.userQuery.getLessons(userId: userId); var dbLessons = await _database.userQuery.getLessons(userId: userId);
_lessons = dbLessons; lessons = dbLessons;
await convertBySettings(); await convertBySettings();
} }
} }
@ -45,7 +45,7 @@ class TimetableProvider with ChangeNotifier {
? await _database.userQuery.renamedTeachers(userId: _user.id!) ? await _database.userQuery.renamedTeachers(userId: _user.id!)
: {}; : {};
for (Lesson lesson in _lessons.values.expand((e) => e)) { for (Lesson lesson in lessons.values.expand((e) => e)) {
lesson.subject.renamedTo = renamedSubjects.isNotEmpty lesson.subject.renamedTo = renamedSubjects.isNotEmpty
? renamedSubjects[lesson.subject.id] ? renamedSubjects[lesson.subject.id]
: null; : null;
@ -57,7 +57,7 @@ class TimetableProvider with ChangeNotifier {
notifyListeners(); notifyListeners();
} }
List<Lesson>? getWeek(Week week) => _lessons[week]; List<Lesson>? getWeek(Week week) => lessons[week];
// Fetches Lessons from the Kreta API then stores them in the database // Fetches Lessons from the Kreta API then stores them in the database
Future<void> fetch({Week? week}) async { Future<void> fetch({Week? week}) async {
@ -68,11 +68,11 @@ class TimetableProvider with ChangeNotifier {
List? lessonsJson = await _kreta List? lessonsJson = await _kreta
.getAPI(KretaAPI.timetable(iss, start: week.start, end: week.end)); .getAPI(KretaAPI.timetable(iss, start: week.start, end: week.end));
if (lessonsJson == null) throw "Cannot fetch Lessons for User ${user.id}"; if (lessonsJson == null) throw "Cannot fetch Lessons for User ${user.id}";
List<Lesson> lessons = lessonsJson.map((e) => Lesson.fromJson(e)).toList(); List<Lesson> lessonsList = lessonsJson.map((e) => Lesson.fromJson(e)).toList();
if (lessons.isEmpty && _lessons.isEmpty) return; if (lessons.isEmpty && lessons.isEmpty) return;
_lessons[week] = lessons; lessons[week] = lessonsList;
await store(); await store();
await convertBySettings(); await convertBySettings();
@ -85,7 +85,7 @@ class TimetableProvider with ChangeNotifier {
String userId = user.id; String userId = user.id;
// -TODO: clear indexes with weeks outside of the current school year // -TODO: clear indexes with weeks outside of the current school year
await _database.userStore.storeLessons(_lessons, userId: userId); await _database.userStore.storeLessons(lessons, userId: userId);
} }
// Future<void> setLessonCount(SubjectLessonCount lessonCount, {bool store = true}) async { // Future<void> setLessonCount(SubjectLessonCount lessonCount, {bool store = true}) async {

View File

@ -142,6 +142,32 @@ class NotificationsScreen extends StatelessWidget {
), ),
], ],
), ),
),
SwitchListTile(
value: settings.notificationsLessonsEnabled,
onChanged: (v) => {settings.update(notificationsLessonsEnabled: v)},
title: Row(
children: [
const SizedBox(width: 8),
settings.notificationsLessonsEnabled
? const Icon(FeatherIcons.calendar)
: Icon(FeatherIcons.calendar,
color:
AppColors.of(context).text.withOpacity(.25)),
const SizedBox(width: 23.0),
Expanded(
child: Text(
"lessons".i18n,
style: TextStyle(
fontWeight: FontWeight.w600,
fontSize: 16.0,
color: AppColors.of(context).text.withOpacity(
settings.notificationsLessonsEnabled ? 1.0 : .5),
),
),
),
],
),
) )
]), ]),
)))); ))));

View File

@ -8,6 +8,7 @@ extension SettingsLocalization on String {
"grades": "Grades", "grades": "Grades",
"absences": "Absences", "absences": "Absences",
"messages": "Messages", "messages": "Messages",
"lessons": "Lessons"
}, },
"hu_hu": { "hu_hu": {
@ -15,12 +16,14 @@ extension SettingsLocalization on String {
"grades": "Jegyek", "grades": "Jegyek",
"absences": "Hiányzások", "absences": "Hiányzások",
"messages": "Üzenetek", "messages": "Üzenetek",
"lessons": "Órák"
}, },
"de_de": { "de_de": {
"notifications_screen": "Mitteilung", "notifications_screen": "Mitteilung",
"grades": "Noten", "grades": "Noten",
"absences": "Fehlen", "absences": "Fehlen",
"messages": "Nachrichten" "messages": "Nachrichten",
"lessons": "Unterricht"
}, },
}; };