// GCG.MeinCantor - Die Schulplattform für Cantorianer. // Copyright (C) 2021-2022 Georg-Cantor-Gymnasium Halle (Saale) // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published // by the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . import 'dart:convert'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:intl/intl.dart'; import 'package:meincantor/timetable.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:http/http.dart' as http; import 'package:meincantor/networking.dart'; Future backgroundFetchTimetable() async { SharedPreferences prefs = await SharedPreferences.getInstance(); String? todayTimetable = prefs.getString("todayTimetable"); String? tomorrowTimetable = prefs.getString("tomorrowTimetable"); http.Response todayResponse = await fetchClassTimetable( "/${DateFormat("yyyyMMdd").format(DateTime.now())}", null); http.Response tomorrowResponse = await fetchClassTimetable( "/${DateFormat("yyyyMMdd").format(DateTime.now().add(const Duration(days: 1)))}", null); if (todayResponse.statusCode == 200) { if (todayTimetable != todayResponse.body) { FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); const AndroidNotificationDetails androidPlatformChannelSpecificsTodayPlan = AndroidNotificationDetails( 'de.cantorgymnasium.meincantor.today.plan', 'Vertretungsplan für heute', channelDescription: '', importance: Importance.max, priority: Priority.high, ticker: 'ticker'); const NotificationDetails platformChannelSpecificsTodayPlan = NotificationDetails( android: androidPlatformChannelSpecificsTodayPlan); const AndroidNotificationDetails androidPlatformChannelSpecificsTodayInfo = AndroidNotificationDetails( 'de.cantorgymnasium.meincantor.today.info', 'Informationen für heute', channelDescription: '', importance: Importance.max, priority: Priority.high, ticker: 'ticker'); const NotificationDetails platformChannelSpecificsTodayInfo = NotificationDetails( android: androidPlatformChannelSpecificsTodayInfo); List lessonsList = ClassTimetable.fromJson(jsonDecode(todayResponse.body)).timetable; List changedLessons = []; for (var element in lessonsList) { if (element.info.isNotEmpty) { changedLessons.add(element.count); } } String subtitle; if (changedLessons.isNotEmpty && changedLessons.length > 1) { subtitle = "Änderungen in den Stunden "; for (var i in changedLessons) { subtitle += "$i"; if (changedLessons.indexOf(i) != changedLessons.length - 1) { subtitle += ", "; } } } else if (changedLessons.isNotEmpty && changedLessons.length == 1) { subtitle = "Änderungen in Stunde ${changedLessons[0]}"; } else { subtitle = "Keine Änderungen im Plan gefunden!"; } await flutterLocalNotificationsPlugin.show( 0, 'Neuer Vertretungsplan für heute geladen!', subtitle, platformChannelSpecificsTodayPlan, payload: 'item x'); if ((jsonDecode(todayResponse.body)["info"] as String).isNotEmpty) { await flutterLocalNotificationsPlugin.show( 1, 'Informationen für heute', (jsonDecode(todayResponse.body)["info"] as String), platformChannelSpecificsTodayInfo, payload: 'item x'); } prefs.setString("todayTimetable", todayResponse.body); } } if (tomorrowResponse.statusCode == 200) { if (tomorrowTimetable != tomorrowResponse.body) { FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); const AndroidNotificationDetails androidPlatformChannelSpecificsTomorrowPlan = AndroidNotificationDetails( 'de.cantorgymnasium.meincantor.tomorrow.plan', 'Vertretungsplan für morgen', channelDescription: '', importance: Importance.max, priority: Priority.high, ticker: 'ticker'); const NotificationDetails platformChannelSpecificsTomorrowPlan = NotificationDetails( android: androidPlatformChannelSpecificsTomorrowPlan); const AndroidNotificationDetails androidPlatformChannelSpecificsTomorrowInfo = AndroidNotificationDetails( 'de.cantorgymnasium.meincantor.tomorrow.info', 'Informationen für morgen', channelDescription: '', importance: Importance.max, priority: Priority.high, ticker: 'ticker'); const NotificationDetails platformChannelSpecificsTomorrowInfo = NotificationDetails( android: androidPlatformChannelSpecificsTomorrowInfo); List lessonsList = ClassTimetable.fromJson(jsonDecode(tomorrowResponse.body)).timetable; List changedLessons = []; for (var element in lessonsList) { if (element.info.isNotEmpty) { changedLessons.add(element.count); } } String subtitle; if (changedLessons.isNotEmpty && changedLessons.length > 1) { subtitle = "Änderungen in den Stunden "; for (var i in changedLessons) { subtitle += "$i"; if (changedLessons.indexOf(i) != changedLessons.length - 1) { subtitle += ", "; } } } else if (changedLessons.isNotEmpty && changedLessons.length == 1) { subtitle = "Änderungen in Stunde ${changedLessons[0]}"; } else { subtitle = "Keine Änderungen im Plan gefunden!"; } await flutterLocalNotificationsPlugin.show( 2, 'Neuer Vertretungsplan für morgen geladen!', subtitle, platformChannelSpecificsTomorrowPlan, payload: 'item x'); if ((jsonDecode(tomorrowResponse.body)["info"] as String).isNotEmpty) { await flutterLocalNotificationsPlugin.show( 3, 'Informationen für morgen', (jsonDecode(tomorrowResponse.body)["info"] as String), platformChannelSpecificsTomorrowInfo, payload: 'item x'); } prefs.setString("tomorrowTimetable", tomorrowResponse.body); } } } Future backgroundFetchArticles() async { SharedPreferences prefs = await SharedPreferences.getInstance(); String? articles = prefs.getString("articles"); String? news = prefs.getString("news"); http.Response fetchedArticles = await getArticles(); http.Response fetchedNews = await getNews(); if (fetchedArticles.statusCode == 200) { if (articles != fetchedArticles.body) { FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); const AndroidNotificationDetails androidPlatformChannelSpecificsSZ = AndroidNotificationDetails( 'de.cantorgymnasium.meincantor.sz', 'Schülerzeitung', channelDescription: '', importance: Importance.max, priority: Priority.high, ticker: 'ticker'); const NotificationDetails platformChannelSpecificsSZ = NotificationDetails(android: androidPlatformChannelSpecificsSZ); String subtitle; List listFetchedArticles = jsonDecode(fetchedArticles.body)["data"]; if (articles != null && articles.isNotEmpty) { List listSavedArticles = jsonDecode(articles)["data"]; int diff = listFetchedArticles.length - listSavedArticles.length; diff == 1 ? subtitle = "1 neuer Artikel!" : diff > 1 ? subtitle = "$diff neue Artikel!" : subtitle = "Fehler beim Ermitteln der Änderungen!"; } else { int len = listFetchedArticles.length; len == 1 ? subtitle = "1 neuer Artikel!" : len > 1 ? subtitle = "$len neue Artikel!" : subtitle = "Fehler beim Ermitteln der Änderungen!"; } await flutterLocalNotificationsPlugin.show( 4, 'Neuer Inhalt von der Schülerzeitung verfügbar!', subtitle, platformChannelSpecificsSZ, payload: 'item x'); prefs.setString("articles", fetchedArticles.body); } } if (fetchedNews.statusCode == 200) { if (news != fetchedNews.body) { FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); const AndroidNotificationDetails androidPlatformChannelSpecificsNews = AndroidNotificationDetails( 'de.cantorgymnasium.meincantor.news', 'Aktuelles', channelDescription: '', importance: Importance.max, priority: Priority.high, ticker: 'ticker'); const NotificationDetails platformChannelSpecificsNews = NotificationDetails(android: androidPlatformChannelSpecificsNews); String subtitle; List listFetchedNews = jsonDecode(fetchedNews.body)["data"]; if (news != null && news.isNotEmpty) { List listSavedNews = jsonDecode(news)["data"]; int diff = listFetchedNews.length - listSavedNews.length; diff == 1 ? subtitle = "1 neuer Artikel!" : diff > 1 ? subtitle = "$diff neue Artikel!" : subtitle = "Fehler beim Ermitteln der Änderungen!"; } else { int len = listFetchedNews.length; len == 1 ? subtitle = "1 neuer Artikel!" : len > 1 ? subtitle = "$len neue Artikel!" : subtitle = "Fehler beim Ermitteln der Änderungen!"; } await flutterLocalNotificationsPlugin.show( 5, 'Neue Informationen verfügbar!', subtitle, platformChannelSpecificsNews, payload: 'item x'); prefs.setString("news", fetchedNews.body); } } }