From 633601a0f3a0bc0616279a10b6d019423a84a25b Mon Sep 17 00:00:00 2001 From: hihihaha Date: Thu, 15 Jun 2023 18:31:27 +0200 Subject: [PATCH 01/60] absence notification --- .idea/libraries/Dart_Packages.xml | 1286 +++++++++++++++++ .idea/libraries/Dart_SDK.xml | 27 + .idea/misc.xml | 4 + .../lib/helpers/notification_helper.dart | 103 +- .../lib/helpers/notification_helper.i18n.dart | 24 +- filcnaplo/lib/main.dart | 1 - filcnaplo/lib/ui/filter/widgets.dart | 4 +- 7 files changed, 1424 insertions(+), 25 deletions(-) create mode 100644 .idea/libraries/Dart_Packages.xml create mode 100644 .idea/libraries/Dart_SDK.xml create mode 100644 .idea/misc.xml 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) { From d2003893e84cb585592181f84d4481f9bda59161 Mon Sep 17 00:00:00 2001 From: Kima Date: Wed, 16 Aug 2023 02:11:41 +0200 Subject: [PATCH 02/60] changed error message in api client (nothing lol) --- filcnaplo/test/widget_test.dart | 48 ++++++------ filcnaplo_kreta_api/lib/client/api.dart | 91 +++++++++++++++------- filcnaplo_kreta_api/lib/client/client.dart | 43 ++++++---- 3 files changed, 116 insertions(+), 66 deletions(-) diff --git a/filcnaplo/test/widget_test.dart b/filcnaplo/test/widget_test.dart index a4b75df..1b85968 100644 --- a/filcnaplo/test/widget_test.dart +++ b/filcnaplo/test/widget_test.dart @@ -1,30 +1,30 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. +// // This is a basic Flutter widget test. +// // +// // To perform an interaction with a widget in your test, use the WidgetTester +// // utility in the flutter_test package. For example, you can send tap and scroll +// // gestures. You can also use WidgetTester to find child widgets in the widget +// // tree, read text, and verify that the values of widget properties are correct. -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; +// import 'package:flutter/material.dart'; +// import 'package:flutter_test/flutter_test.dart'; -import 'package:filcnaplo/main.dart'; +// import 'package:filcnaplo/main.dart'; -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); +// void main() { +// testWidgets('Counter increments smoke test', (WidgetTester tester) async { +// // Build our app and trigger a frame. +// await tester.pumpWidget(const MyApp()); - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); +// // Verify that our counter starts at 0. +// expect(find.text('0'), findsOneWidget); +// expect(find.text('1'), findsNothing); - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); +// // Tap the '+' icon and trigger a frame. +// await tester.tap(find.byIcon(Icons.add)); +// await tester.pump(); - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -} +// // Verify that our counter has incremented. +// expect(find.text('0'), findsNothing); +// expect(find.text('1'), findsOneWidget); +// }); +// } diff --git a/filcnaplo_kreta_api/lib/client/api.dart b/filcnaplo_kreta_api/lib/client/api.dart index 6371b17..93146d9 100644 --- a/filcnaplo_kreta_api/lib/client/api.dart +++ b/filcnaplo_kreta_api/lib/client/api.dart @@ -7,39 +7,69 @@ class KretaAPI { static const clientId = "kreta-ellenorzo-mobile-android"; // ELLENORZO API - static String notes(String iss) => BaseKreta.kreta(iss) + KretaApiEndpoints.notes; - static String events(String iss) => BaseKreta.kreta(iss) + KretaApiEndpoints.events; - static String student(String iss) => BaseKreta.kreta(iss) + KretaApiEndpoints.student; - static String grades(String iss) => BaseKreta.kreta(iss) + KretaApiEndpoints.grades; - static String absences(String iss) => BaseKreta.kreta(iss) + KretaApiEndpoints.absences; - static String groups(String iss) => BaseKreta.kreta(iss) + KretaApiEndpoints.groups; + static String notes(String iss) => + BaseKreta.kreta(iss) + KretaApiEndpoints.notes; + static String events(String iss) => + BaseKreta.kreta(iss) + KretaApiEndpoints.events; + static String student(String iss) => + BaseKreta.kreta(iss) + KretaApiEndpoints.student; + static String grades(String iss) => + BaseKreta.kreta(iss) + KretaApiEndpoints.grades; + static String absences(String iss) => + BaseKreta.kreta(iss) + KretaApiEndpoints.absences; + static String groups(String iss) => + BaseKreta.kreta(iss) + KretaApiEndpoints.groups; static String groupAverages(String iss, String uid) => - BaseKreta.kreta(iss) + KretaApiEndpoints.groupAverages + "?oktatasiNevelesiFeladatUid=" + uid; + BaseKreta.kreta(iss) + + KretaApiEndpoints.groupAverages + + "?oktatasiNevelesiFeladatUid=" + + uid; static String timetable(String iss, {DateTime? start, DateTime? end}) => BaseKreta.kreta(iss) + KretaApiEndpoints.timetable + - (start != null && end != null ? "?datumTol=" + start.toUtc().toIso8601String() + "&datumIg=" + end.toUtc().toIso8601String() : ""); - static String exams(String iss) => BaseKreta.kreta(iss) + KretaApiEndpoints.exams; + (start != null && end != null + ? "?datumTol=" + + start.toUtc().toIso8601String() + + "&datumIg=" + + end.toUtc().toIso8601String() + : ""); + static String exams(String iss) => + BaseKreta.kreta(iss) + KretaApiEndpoints.exams; static String homework(String iss, {DateTime? start, String? id}) => BaseKreta.kreta(iss) + KretaApiEndpoints.homework + (id != null ? "/$id" : "") + - (id == null && start != null ? "?datumTol=" + DateFormat('yyyy-MM-dd').format(start) : ""); - static String capabilities(String iss) => BaseKreta.kreta(iss) + KretaApiEndpoints.capabilities; - static String downloadHomeworkAttachments(String iss, String uid, String type) => - BaseKreta.kreta(iss) + KretaApiEndpoints.downloadHomeworkAttachments(uid, type); + (id == null && start != null + ? "?datumTol=" + DateFormat('yyyy-MM-dd').format(start) + : ""); + static String capabilities(String iss) => + BaseKreta.kreta(iss) + KretaApiEndpoints.capabilities; + static String downloadHomeworkAttachments( + String iss, String uid, String type) => + BaseKreta.kreta(iss) + + KretaApiEndpoints.downloadHomeworkAttachments(uid, type); // ADMIN API - static const sendMessage = BaseKreta.kretaAdmin + KretaAdminEndpoints.sendMessage; - static String messages(String endpoint) => BaseKreta.kretaAdmin + KretaAdminEndpoints.messages(endpoint); - static String message(String id) => BaseKreta.kretaAdmin + KretaAdminEndpoints.message(id); - static const recipientCategories = BaseKreta.kretaAdmin + KretaAdminEndpoints.recipientCategories; - static const availableCategories = BaseKreta.kretaAdmin + KretaAdminEndpoints.availableCategories; - static const recipientsTeacher = BaseKreta.kretaAdmin + KretaAdminEndpoints.recipientsTeacher; - static const uploadAttachment = BaseKreta.kretaAdmin + KretaAdminEndpoints.uploadAttachment; - static String downloadAttachment(String id) => BaseKreta.kretaAdmin + KretaAdminEndpoints.downloadAttachment(id); - static const trashMessage = BaseKreta.kretaAdmin + KretaAdminEndpoints.trashMessage; - static const deleteMessage = BaseKreta.kretaAdmin + KretaAdminEndpoints.deleteMessage; + static const sendMessage = + BaseKreta.kretaAdmin + KretaAdminEndpoints.sendMessage; + static String messages(String endpoint) => + BaseKreta.kretaAdmin + KretaAdminEndpoints.messages(endpoint); + static String message(String id) => + BaseKreta.kretaAdmin + KretaAdminEndpoints.message(id); + static const recipientCategories = + BaseKreta.kretaAdmin + KretaAdminEndpoints.recipientCategories; + static const availableCategories = + BaseKreta.kretaAdmin + KretaAdminEndpoints.availableCategories; + static const recipientsTeacher = + BaseKreta.kretaAdmin + KretaAdminEndpoints.recipientsTeacher; + static const uploadAttachment = + BaseKreta.kretaAdmin + KretaAdminEndpoints.uploadAttachment; + static String downloadAttachment(String id) => + BaseKreta.kretaAdmin + KretaAdminEndpoints.downloadAttachment(id); + static const trashMessage = + BaseKreta.kretaAdmin + KretaAdminEndpoints.trashMessage; + static const deleteMessage = + BaseKreta.kretaAdmin + KretaAdminEndpoints.deleteMessage; } class BaseKreta { @@ -58,25 +88,30 @@ class KretaApiEndpoints { static const grades = "/ellenorzo/V3/Sajat/Ertekelesek"; static const absences = "/ellenorzo/V3/Sajat/Mulasztasok"; static const groups = "/ellenorzo/V3/Sajat/OsztalyCsoportok"; - static const groupAverages = "/ellenorzo/V3/Sajat/Ertekelesek/Atlagok/OsztalyAtlagok"; + static const groupAverages = + "/ellenorzo/V3/Sajat/Ertekelesek/Atlagok/OsztalyAtlagok"; static const timetable = "/ellenorzo/V3/Sajat/OrarendElemek"; static const exams = "/ellenorzo/V3/Sajat/BejelentettSzamonkeresek"; static const homework = "/ellenorzo/V3/Sajat/HaziFeladatok"; // static const homeworkDone = "/ellenorzo/V3/Sajat/HaziFeladatok/Megoldva"; // Removed from the API static const capabilities = "/ellenorzo/V3/Sajat/Intezmenyek"; - static String downloadHomeworkAttachments(String uid, String type) => "/ellenorzo/V3/Sajat/Csatolmany/$uid"; + static String downloadHomeworkAttachments(String uid, String type) => + "/ellenorzo/V3/Sajat/Csatolmany/$uid"; } class KretaAdminEndpoints { //static const messages = "/api/v1/kommunikacio/postaladaelemek/sajat"; static const sendMessage = "/api/v1/kommunikacio/uzenetek"; - static String messages(String endpoint) => "/api/v1/kommunikacio/postaladaelemek/$endpoint"; - static String message(String id) => "/api/v1/kommunikacio/postaladaelemek/$id"; + static String messages(String endpoint) => + "/api/v1/kommunikacio/postaladaelemek/$endpoint"; + static String message(String id) => + "/api/v1/kommunikacio/postaladaelemek/$id"; static const recipientCategories = "/api/v1/adatszotarak/cimzetttipusok"; static const availableCategories = "/api/v1/kommunikacio/cimezhetotipusok"; static const recipientsTeacher = "/api/v1/kreta/alkalmazottak/tanar"; static const uploadAttachment = "/ideiglenesfajlok"; - static String downloadAttachment(String id) => "/api/v1/dokumentumok/uzenetek/$id"; + static String downloadAttachment(String id) => + "/api/v1/dokumentumok/uzenetek/$id"; static const trashMessage = "/api/v1/kommunikacio/postaladaelemek/kuka"; static const deleteMessage = "/api/v1/kommunikacio/postaladaelemek/torles"; } diff --git a/filcnaplo_kreta_api/lib/client/client.dart b/filcnaplo_kreta_api/lib/client/client.dart index 9910d60..d980d0f 100644 --- a/filcnaplo_kreta_api/lib/client/client.dart +++ b/filcnaplo_kreta_api/lib/client/client.dart @@ -66,8 +66,10 @@ class KretaClient { for (int i = 0; i < 3; i++) { if (autoHeader) { - if (!headerMap.containsKey("authorization") && accessToken != null) headerMap["authorization"] = "Bearer $accessToken"; - if (!headerMap.containsKey("user-agent") && userAgent != null) headerMap["user-agent"] = "$userAgent"; + if (!headerMap.containsKey("authorization") && accessToken != null) + headerMap["authorization"] = "Bearer $accessToken"; + if (!headerMap.containsKey("user-agent") && userAgent != null) + headerMap["user-agent"] = "$userAgent"; } res = await client.get(Uri.parse(url), headers: headerMap); @@ -94,7 +96,8 @@ class KretaClient { return res.body; } } on http.ClientException catch (error) { - print("ERROR: KretaClient.getAPI ($url) ClientException: ${error.message}"); + print( + "ERROR: KretaClient.getAPI ($url) ClientException: ${error.message}"); } catch (error) { print("ERROR: KretaClient.getAPI ($url) ${error.runtimeType}: $error"); } @@ -120,9 +123,12 @@ class KretaClient { for (int i = 0; i < 3; i++) { if (autoHeader) { - if (!headerMap.containsKey("authorization") && accessToken != null) headerMap["authorization"] = "Bearer $accessToken"; - if (!headerMap.containsKey("user-agent") && userAgent != null) headerMap["user-agent"] = "$userAgent"; - if (!headerMap.containsKey("content-type")) headerMap["content-type"] = "application/json"; + if (!headerMap.containsKey("authorization") && accessToken != null) + headerMap["authorization"] = "Bearer $accessToken"; + if (!headerMap.containsKey("user-agent") && userAgent != null) + headerMap["user-agent"] = "$userAgent"; + if (!headerMap.containsKey("content-type")) + headerMap["content-type"] = "application/json"; } res = await client.post(Uri.parse(url), headers: headerMap, body: body); @@ -142,9 +148,10 @@ class KretaClient { return res.body; } } on http.ClientException catch (error) { - print("ERROR: KretaClient.getAPI ($url) ClientException: ${error.message}"); + print( + "ERROR: KretaClient.postAPI ($url) ClientException: ${error.message}"); } catch (error) { - print("ERROR: KretaClient.getAPI ($url) ${error.runtimeType}: $error"); + print("ERROR: KretaClient.postAPI ($url) ${error.runtimeType}: $error"); } } @@ -157,7 +164,8 @@ class KretaClient { }; String nonceStr = await getAPI(KretaAPI.nonce, json: false); - Nonce nonce = getNonce(nonceStr, loginUser.username, loginUser.instituteCode); + Nonce nonce = + getNonce(nonceStr, loginUser.username, loginUser.instituteCode); headers.addAll(nonce.header()); if (_settings.presentationMode) { @@ -175,18 +183,25 @@ class KretaClient { )); if (loginRes != null) { - if (loginRes.containsKey("access_token")) accessToken = loginRes["access_token"]; - if (loginRes.containsKey("refresh_token")) refreshToken = loginRes["refresh_token"]; + if (loginRes.containsKey("access_token")) + accessToken = loginRes["access_token"]; + if (loginRes.containsKey("refresh_token")) + refreshToken = loginRes["refresh_token"]; // Update role - loginUser.role = JwtUtils.getRoleFromJWT(accessToken ?? "") ?? Role.student; + loginUser.role = + JwtUtils.getRoleFromJWT(accessToken ?? "") ?? Role.student; } if (refreshToken != null) { Map? refreshRes = await postAPI(KretaAPI.login, - headers: headers, body: User.refreshBody(refreshToken: refreshToken!, instituteCode: loginUser.instituteCode)); + headers: headers, + body: User.refreshBody( + refreshToken: refreshToken!, + instituteCode: loginUser.instituteCode)); if (refreshRes != null) { - if (refreshRes.containsKey("id_token")) idToken = refreshRes["id_token"]; + if (refreshRes.containsKey("id_token")) + idToken = refreshRes["id_token"]; } } } From bad9ed000b049561cc6facb3f0178b13432116fb Mon Sep 17 00:00:00 2001 From: Kima Date: Fri, 25 Aug 2023 23:20:22 +0200 Subject: [PATCH 03/60] fixed some of the widget bugs and removed assets --- .../android/app/src/main/AndroidManifest.xml | 4 ++++ .../app/src/main/java/hu/filc/naplo/database | 1 - .../app/src/main/java/hu/filc/naplo/utils | 1 - .../main/java/hu/filc/naplo/widget_timetable | 1 - .../hu/{filc => refilc}/naplo/MainActivity.java | 16 +++++++--------- .../app/src/main/java/hu/refilc/naplo/database | 1 + .../app/src/main/java/hu/refilc/naplo/utils | 1 + .../main/java/hu/refilc/naplo/widget_timetable | 1 + .../src/main/res/drawable-hdpi/tinta_icon.png | Bin 1451 -> 0 bytes .../drawable-v21/launch_gradient_background.xml | 11 ----------- .../res/drawable-xhdpi/launch_background.xml | 7 ------- .../launch_gradient_background.xml | 11 ----------- .../res/drawable/launch_gradient_background.xml | 11 ----------- .../app/src/main/res/mipmap-hdpi/ic_splash.png | Bin 15091 -> 0 bytes .../app/src/main/res/mipmap-mdpi/ic_splash.png | Bin 12814 -> 0 bytes .../app/src/main/res/mipmap-xhdpi/ic_splash.png | Bin 18172 -> 0 bytes .../src/main/res/mipmap-xxhdpi/ic_splash.png | Bin 23824 -> 0 bytes .../src/main/res/mipmap-xxxhdpi/ic_splash.png | Bin 11474 -> 0 bytes .../app/src/main/res/values-v21/styles.xml | 12 ------------ 19 files changed, 14 insertions(+), 64 deletions(-) delete mode 120000 filcnaplo/android/app/src/main/java/hu/filc/naplo/database delete mode 120000 filcnaplo/android/app/src/main/java/hu/filc/naplo/utils delete mode 120000 filcnaplo/android/app/src/main/java/hu/filc/naplo/widget_timetable rename filcnaplo/android/app/src/main/java/hu/{filc => refilc}/naplo/MainActivity.java (69%) create mode 100644 filcnaplo/android/app/src/main/java/hu/refilc/naplo/database create mode 100644 filcnaplo/android/app/src/main/java/hu/refilc/naplo/utils create mode 100644 filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable delete mode 100644 filcnaplo/android/app/src/main/res/drawable-hdpi/tinta_icon.png delete mode 100644 filcnaplo/android/app/src/main/res/drawable-v21/launch_gradient_background.xml delete mode 100644 filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_background.xml delete mode 100644 filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_gradient_background.xml delete mode 100644 filcnaplo/android/app/src/main/res/drawable/launch_gradient_background.xml delete mode 100644 filcnaplo/android/app/src/main/res/mipmap-hdpi/ic_splash.png delete mode 100644 filcnaplo/android/app/src/main/res/mipmap-mdpi/ic_splash.png delete mode 100644 filcnaplo/android/app/src/main/res/mipmap-xhdpi/ic_splash.png delete mode 100644 filcnaplo/android/app/src/main/res/mipmap-xxhdpi/ic_splash.png delete mode 100644 filcnaplo/android/app/src/main/res/mipmap-xxxhdpi/ic_splash.png delete mode 100644 filcnaplo/android/app/src/main/res/values-v21/styles.xml diff --git a/filcnaplo/android/app/src/main/AndroidManifest.xml b/filcnaplo/android/app/src/main/AndroidManifest.xml index 1a19772..e7d7bbe 100644 --- a/filcnaplo/android/app/src/main/AndroidManifest.xml +++ b/filcnaplo/android/app/src/main/AndroidManifest.xml @@ -8,6 +8,8 @@ android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize" android:showWhenLocked="true" android:turnScreenOn="true"> + @@ -57,6 +59,8 @@ android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true" /> + + diff --git a/filcnaplo/android/app/src/main/java/hu/filc/naplo/database b/filcnaplo/android/app/src/main/java/hu/filc/naplo/database deleted file mode 120000 index a298c9a..0000000 --- a/filcnaplo/android/app/src/main/java/hu/filc/naplo/database +++ /dev/null @@ -1 +0,0 @@ -../../../../../../../../../filcnaplo_premium/android/database \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/java/hu/filc/naplo/utils b/filcnaplo/android/app/src/main/java/hu/filc/naplo/utils deleted file mode 120000 index 0a05323..0000000 --- a/filcnaplo/android/app/src/main/java/hu/filc/naplo/utils +++ /dev/null @@ -1 +0,0 @@ -../../../../../../../../../filcnaplo_premium/android/utils \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/java/hu/filc/naplo/widget_timetable b/filcnaplo/android/app/src/main/java/hu/filc/naplo/widget_timetable deleted file mode 120000 index 0314e40..0000000 --- a/filcnaplo/android/app/src/main/java/hu/filc/naplo/widget_timetable +++ /dev/null @@ -1 +0,0 @@ -../../../../../../../../../filcnaplo_premium/android/widget_timetable \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/java/hu/filc/naplo/MainActivity.java b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/MainActivity.java similarity index 69% rename from filcnaplo/android/app/src/main/java/hu/filc/naplo/MainActivity.java rename to filcnaplo/android/app/src/main/java/hu/refilc/naplo/MainActivity.java index 2fb810e..ff22fb7 100644 --- a/filcnaplo/android/app/src/main/java/hu/filc/naplo/MainActivity.java +++ b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/MainActivity.java @@ -1,9 +1,7 @@ -package hu.refilc.naplo; - -import io.flutter.embedding.android.FlutterActivity; - -import io.flutter.embedding.engine.FlutterEngine; - -public class MainActivity extends FlutterActivity { - -} +package hu.refilc.naplo; + +import io.flutter.embedding.android.FlutterActivity; + +public class MainActivity extends FlutterActivity { + +} diff --git a/filcnaplo/android/app/src/main/java/hu/refilc/naplo/database b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/database new file mode 100644 index 0000000..a298c9a --- /dev/null +++ b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/database @@ -0,0 +1 @@ +../../../../../../../../../filcnaplo_premium/android/database \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/java/hu/refilc/naplo/utils b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/utils new file mode 100644 index 0000000..0a05323 --- /dev/null +++ b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/utils @@ -0,0 +1 @@ +../../../../../../../../../filcnaplo_premium/android/utils \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable new file mode 100644 index 0000000..0314e40 --- /dev/null +++ b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable @@ -0,0 +1 @@ +../../../../../../../../../filcnaplo_premium/android/widget_timetable \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/res/drawable-hdpi/tinta_icon.png b/filcnaplo/android/app/src/main/res/drawable-hdpi/tinta_icon.png deleted file mode 100644 index bdb67716d008494126f5f65598988c1728d3cdaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1451 zcmV;c1yuTpP)002k`1^@s6zS;;x00009a7bBm001F4 z001F40Y#QEU;qFB0drDELIAGL9O(c600d`2O+f$vv5yP&=+6B#};e750BCzs*xr%wLptZt{)Yp1+K2jJO{3OlgN2HTufc_%T;PxH4Mv@PLdwQ-; z*d6PPCKp_ztYIYxc7JhXUAPFVSOI6sBx;0>Fzw()M|^ED7kw)d-WbpVfBL z6g;pERG4SQEK^Y|%7pE}G!@^47XFEFnDRrK55KS-d^B7O&U?j>_119h!nW|qa7_qA zC|NqME5ekQjK2)mvSn12r1#i2rNt%I9H_8w{B>0nCP0Y_N#8b{F?*kNU zA$$)-C%<~`6Z&Tk zT4#mFcGJi@lb(7J)_>7y%Hkpx`(HFDeKHiNI{BG2?AS&^&<5MNj;HZU(@NM9-#a0G zYbi;wU$Fad8E-mfP}tx$d{5Y0T%n>Jtp4%Aqc?Pv?}&I~E2H2G1WkmiVY*=* z1K^k8K9}fyr=i^bs=gy`QV+P{iZfeN0m0qtrd3XGFTdKrr8d?T?!daSlsOaE(f>m5 zPZO>DfInhhq{$UA>xwRCc9!Yc^ zHQ~LK8Nq9 zl-VA(_+HY^5gPb*|2cZz6?A4H?2dU?yqL^p4#EUGVUy3r9+{6QAwC(`Fdc%Out}(x z$4^zbr^Ffe)EClW+e@}&fX`=1cvar*#W>x3PnNV{51Do6nC9OM@;%H@Bkl)-UOW6T zZn`HdA$Yhd>kBN$9{^I{x-;0V*EPs&J@sV$)qoxI{uY+jy|?H-&Zt*KM{xGdzA(?D zrZfKORL`V)_Ran=li^y&fp7@%ua>wvXwO0r(tBGCRUei*^o8_{>m-swPX76@8w{xE z8=^82@nw)_`bS?MF~1<03e`J0cj3R&`EsQ@ - - - - - - - \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_background.xml b/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_background.xml deleted file mode 100644 index 293a93c..0000000 --- a/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_background.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_gradient_background.xml b/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_gradient_background.xml deleted file mode 100644 index 67e425a..0000000 --- a/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_gradient_background.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/res/drawable/launch_gradient_background.xml b/filcnaplo/android/app/src/main/res/drawable/launch_gradient_background.xml deleted file mode 100644 index 67e425a..0000000 --- a/filcnaplo/android/app/src/main/res/drawable/launch_gradient_background.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/res/mipmap-hdpi/ic_splash.png b/filcnaplo/android/app/src/main/res/mipmap-hdpi/ic_splash.png deleted file mode 100644 index 08e9ceb7412ec034790dcc446fae716875952551..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15091 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 diff --git a/filcnaplo/android/app/src/main/res/mipmap-mdpi/ic_splash.png b/filcnaplo/android/app/src/main/res/mipmap-mdpi/ic_splash.png deleted file mode 100644 index f1bec95f472b3a4024796bdfad5d2634e43ca11d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12814 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

;{;3BK+mWrgO)b)A}5&l5nJW#?`=#S#3SVoPnM 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 diff --git a/filcnaplo/android/app/src/main/res/mipmap-xxhdpi/ic_splash.png b/filcnaplo/android/app/src/main/res/mipmap-xxhdpi/ic_splash.png deleted file mode 100644 index 982dc3deac9cda6fb54382930f5a2c38aeb0790e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23824 zcmeFYWl)^Kwl+Grd$8c{?(P;mK=9xeY;gA=0fIxYV1eN75MZzn++Bm~Fu|QWWbd=j zK6Sr8r|N#c?w+ctdZ&B!vVMB?>h<<~(oj>tKz)r0001zQ6lLE605HKXUt~mROW{Cc z7XW~d;H$0Y{?^Qk66oq|ZRcP`>FxuxqO|h1vjzaXmrgSET}cOVWS`Gp2}^^AUASGj zrZL?8#j2f56*0|tQhpZZ!XWc5>{ks%Lm+f$;D@8!`Ny#Mw+0@q4eu2ybK*tMqLL}v zf&xbN{2;ftPyQG2xjon8?c*l0yST0^b)DgSPg4kHK##bXGdID z6qpy{np4r#635peKkp@(Is{aqpk}#@j+! z@QwO6JPuaT&P>v!K#E{o7jTccq%US?gtjzBXa9n9UfkCw70ekv5_vRfCYSo5bgeSp zVui0+*A0*#{AoA7ug3~-=yZOTPUk6AbN3+z8h}l0)3jZgiqhWs5?jq_yRkLSy^{;9 zFG?eESTHzpY*^G9@3>epJgtfsS0F`kW&IY%e@A4YrY0nH=rn4UFfo5dR*`vwlT}8b7yYZscUO&yb9s^ z!_leuv;TaL!u;kmQ%6mJ=jZ08E0-urVWvZ3vKXO>Ki@F{`z1NI*WZE8W&FM|U1fF4+Rz$4Whd~!ZmOW9IXfp}uT}Qg3Ahn%8x<0u~^Or$TT!`Ux!z>0jI<%xKz-Ewu z<}y7M`nJ(svE)tEGIl?y{J~r%x~2m-T+YkFE3NbWR+2;s z_As6l2jnH0N}FnP>*WUTmHz0SvSMhB}|oJ71aOt%ZW=F}f#wTWxv zRd)5!HoG7exgHwQ zxoHs5dit)rrG7@_iJ5&Yz1N6ul|DBdeJ+tG!QvJ`8yU zwElq|x${!F)j#gzW-M*>TL88`LHFW%!wY3o^s;mMQ5o?--D> zE~yo5{PLzBvWA?jgpTA%8ghI>nz=&6hV3Y1sM0abMXOPDbBY$&%^U2$TC^tDks5pe z;ER99iEsv8S>|aJAkwcc-KP>aN^vnEe&FXSXxbA)8ru(FTrL{VVUm`Xy|*L8t&tJb z2=9U`zqhw#%goZ>*pIh!FcR6yDyFMKLQI&eOx)tW{rD9Ihs!Zr)caZg;KoC@EV!^O z+Fi|WmpE{6#-FO02>x4AB`mQh419XM)o$N-hf$j>e;$CanchiKFn->f_X1DU8(k-)y zg3W#ez0|4fj_Ar7{1#Q`z|X;U{L2v*-;_6D4d6Ew(Czb1@a=saa9>e=N+v>9fm2N1 z8Ed&OALH@JM8;taH8G;$S{2Q%!^8urkhXFkhsOVu=Gm|C;PGP6$2sS=t58w;h}O7D zBz;Q$MH=t-A-2|^5xVaVDY28C%=4^&w4Z`5-u;N7Z)%1$o^_>Okbn<$sY&q6ad= zK{@r9L1>VbO66d|ZlKL!0$~7chrQXs)xa?!t`LfIW-#lgR{Y9cxFyXRqlvU>(TDgM zMq%rlU(&WfVtQeN_R5~Jy3?7Zk!@F+&`{xrqL$mnD{>v8;yoVH3MJUu zd(PHWg`av8S;j+2Ws9BUw3L)ITS`}PCqiFEN{j|j3x|~o zxLGb`Y_LmIl&e{Q3caZsMn_le**>CJXWYKMiI1itx;*-$VDzfV%IXt+Q&8*(C4qW0 zX&uIp10Qyaz9#C{?<@o?-7XhJMkf1$%|0BH^p&EruinH7pgRK`80svHgOF03qD}g4 zs?B@3H%<9g$l@Q6Z2T7THQ~#OF~TGOmG^@jBLH=I3Y+k!ydV7B>An0BD<9i^K;DK+ z0!d23C8}OZG@pZH#xQEAR`obu%XKk&WV%z3G=aqNSbWTeXe2C<-&je*x+>CV5LN1@ zZ%OvhiMYXbiOGz%x)druZA33nzZ>1JPY8V^a^>5I7RMr9)FMMwcoSA~V5NG-AD9Tmw^8~Th;&+=S*Z~lA1S@fS zb`ssNE!ig*njS_Oxv()%^(Imh86p|UIkpuwLD zVROKXCfUvcd5ed=K&hla^aT@+%|hkRGhYjMcEbG+zy0^#eDIkzLLkRGh@B3BErP-D zFH9Pxsn_mAAwL#acco1&>~7u@U||7lHqq*8Gz~iyF-~*3F{sH-qFAeQ zhgK6;)DP)*D8qCBRMz&^)o+_CG*c$NiKY&BH;|43F^z8Tiv2C>2+HA;$-K02Ao<$=VQb@^mjCz(SabeN}$wy_K=S@{DG!Bgo6%3L^>Z}Kktx9zo6 ztj4D1ngrd3V}HY-zHE6Rn=V&3>y=+GcVBI(1IPpS{LTEF zcjyy#paV`V-ZEB4Pq~^OKd`(48|j)SfaT&1@q&$b?_T#H)&9R%$5NPrIs44SL zlM1thQTvUuLnKv4N{-wdMc*gZ%tJZ}pX6Os-+=b*#2}kUr8Y{djnuzp4N(c^^(zXw z`1IbNW*IAcQM7IFl*c+p?lO_!A{m&ZAt&SH+~3hT{^5a-=^ocySEG&cu!~K291Z=*HTm&!=$6IjBSD zuu;egMySTGY~v zKLkT$Ta}kJT3-*JHrPR^Px8CVoKHl%J#O91pW+BSAz{@z+4HzUQQIL}`y?EuOd8y*h5#}yjIB2d5oEIt^M-N|2oC=GUgHbuXOS#<2h&!^3&^yx8nyEc~e=X6GRK)PQK^ZEPol(i^-VqY`D%N*5~#D@>eCh zYgK#pHo8c!?#aC05iAiAHPEL;*310tlpv~E6D1`SLy+GyWcvx9^4)#02q7jKR(h@~ zV!vHn1S!?)3tI9jKR#Z&SKjlc9_H;$oyq=qOUPO{`5AfsUr&FyxLCr%;C!`k3_rUc zO4OKRjNTHukK;iaAa+5iX)bYq#aa)~7e0uc0Jg!SlbD>-`VzS}&b92m%h&08o5X1C6wX9n2YtcAP{?#?} z%to`Nni*MFJ^AG~8#vF>M~!4%-+R~JU0{ohIcqi`#?~NTnrS{7$IW4OOsm(?yT=~Q zs>b99O@k0`@<@7S`4;mSK@PIvbQ4C5rXj6TBLn4!{D_?Pcxln!jq&!eB<|WugP%U- zg=)Puk@~a{=EY`~AF^~9*=UZ^f=^$)&k^cwV|4%X8xCaC_Ej8F)#TJ;V|h+d#pE2> z?j{q_+qMkX!)``8|1%9n&fNipntU#w7)OXT4OK{0-sH$B@oi~v zjii2BeML*HO)MTZ`)ejRn`no~`cVfq|4lP?u?iVn&&TQD!kQzb?vJ-hdEX3WRm;y- zy1ENg|00RH#?k>(*VpBJ_#v01Cmv)V+k9EfDu_-;Ce8hYY%a(b>#Us3nSn<-PoXls z;DRA)e!BEt~DF1a9#CV^+N5)S~p^CCvLB?!i@U+QYYrWZ||ELq@34w=~fxH zt$k~fRFBl-o&!vHp%d}M?aZ>!W3ZLN(nX|s*(>x9=C4(bS27OprhGSSDE#!tK`mjV z-CISc`yPFUNlm5NlZ7GirDJX1jH;;Uy$jR<}5Y1kKOlazDs+x>9(mE#;*AA%VTjzV2m#EQIzL{CC_=Erg{EM zzbj#VT|TZl?f|~dH~*k9tMGFIn??hh6TdUU2(+ak?s+>*s&F}0sgD3+4{eR`aQMpC zO!V9hxfc*D;lM;A?p9{gZ9Pd0X4(O)C#0@+z8JhMr?-MA7o7`N1Dx0^2nHC-PvT7{ zb12x}h*b@7U32i?C6t`q8*Xs07ZKU3L^6LM8G!+{4948F3aAqogfXCd;s7mjq85a^ zxs|o0d%*xe-Hgs1qM#tW{F{^x@E@>-m-BOu-Sst`o4sqXU_MF-v~c~}4qBkrQ&kbR zaCT%jvvfAMV)u3gLJQacfT)Bw(9FW#%AL~O%Erz~jQX^_i<;8TQjA)cPnA;@C}U-7 zr|9cyrRA%pZQ*NgA!JD{A&x5QEevJgXytB3>Fwy?G^BUzbgVA{x81&gZjU0|4R&|QdJd}b++($ zQBO%$jQT~su%)wwou%;KM{Yhr9&SzxGd61rOEWfJeqJj!A!~k4HcoSXUQTOEZUJr{ ztAAsqulAF!kT2PRUn~Rf&Tfka? z*G%BwS*W|(K~ZVu@b6l^u(E`*;^ntC=jY?IV&mcz;Ai7C7ZPL>Tzmg|NJ{tD_loI_(_IY^*qdPBwo#UK}ngrJ*E7&CSmF-z^#rX71L|0bSxBEX$ z7MG=&1+SnPn-#wm4|KA41=!3u`MKEmxp>TkxH&C(_|5;}wtsPVbGCN(GIO<(vVmF( zwFU~Hzt&JP{&gkO|J23H*6PJioZMV&oKOhxYI6w)^9c%baj|f63v+T(bNtg_j+a&a zUlxmU{J(r6`j_C}!T@yKKiZ(-1sbh5{uQqN>9ZF%{$Kq3b1wcbN`SKdkC6YBfB)mI z|G4Xa<$?bd@qf_uA9ww)Jn+9F{tvqTKXVuAe;;_PoS<2d7xXw2C{j!aJqjV3D=WzU zJrn_MW!i(FPbfe|eK!CA4e#X(1IWxKf;J+#E2+vM?I06j38SSIYaasulmI1JDQ)OY zpH;6EW1Yw6=e_$C5iy=*;bidx4_s+nY*^UPSDNC1;%8Fbq0!XTl&~2ndB~wrgDQ+~ zv_8g1Gv=9ghnm7M!R8kVO!;M`9PnJPoj*OgM4pbLGT9_$_?g5v>J2xlc!Gs&aIWke;+hA~_)sj71n&vw7mNY&ihGteC4q=+C~Y*xkxM6o+ZbV@NY_9VNNZ@>NDl%BR5@b}b>DO$un+|v zKP`1B+3g9$K(}it@DrTZIymxueLIKO_5JFjqF4MuX;hSZAY|O_x_%{~v^_G=I~=^W zmWcel%`YS;Axd!%{@K;5tACZG<7n{!eBF9Kc!(1fB}?)!yz*$~rS3i7w7N>+cFhDP z-yi%GMQQ{&Jq33`z*foaL6fV)7w~ejn5;Kg#}VDnr;oF%>(vZQLF&_za%)02*KlB1 zad`JVm&>o9EszS2{X{bUXN>3{0g!P7cBHX`-EN9J4hZpvrdMuWG0PhOweu+th>&OB z*BnF)!diVq7h602PDPpcymBW&;GKR!@04N70>lI6X3$;qr2=GW$sUkkuwYLIA9RkrlU1!h+a=js);Q!Q`Ok;Fty=>wTXGn(R}5KgdQzY;xl!XklS-1k>vJ z2hu@4<;tVTA&Mmy2F#}ii=*d9&@;@V@X@-hVuRNDTF(!$Wp9sDwKRc~?{uk!lu^?> z3}0}RY1=0XfAPE^o+9W9e**d11ct9Y4be(udfDUhD zy)k^<*>E`7uep|IQeIqszC*MoXnmtrrYkAj=RR1rTpCV zcY+A29Y|!a-G=v7YVEo{pxk`SaD0cM35z{Avq1r{@oaeVQ_%MesQYSCVc3)Xc^FwV z_QJ~kEP*M!$lrH^DDFriHb=|)EZ|;3c~vV*7Y^zikr_lIYwPRM?@)wW8bD5GCx^rYrqY56K1aSA z-)lG2#c88RvOgdk--*W25^Q`1x`rt#)baytvKCp&xH1&bx@ir=g3xc?%yf4NrEW9W z6S^LyrAD&ez#S_#oqrZE*eWTsDML{Of(IF| zoaLr83J1f0h0tfiuC4j@W=@*}GzVu#>H=FbxDUZ*Wx`NIueM&AsN4a+3^5KH*Lg8` zRT;`!F#Ft8(?<+5kpo}iQ8Jr{Y z+!=FFwWs4|cO#n8$3%2x3|R3KFhZH;i%x@Fg*K0}O&Mx_>6>3j($4S23=hgo%Y+tLLw%Nw3#u*LniVO>B$}-J10k@dUPN9qqk+_I@%(v%rjLVrao)ACz^k z2U{qq8?(litu%4=JM&j<9IP6)uZk(bNUYYR7@t&X_I*Bg|5ylJH@bYG7y00h0#^66 zF;#!RX;<7eF~YvinTALNkF0Muw#Ji*rZ16Kx$$XOsoIF_l~rr`YcIFeAzj-O*q9DX zZHx5HaSsx^H%$}{ngPLHrA|3S5Ix!0$^8is31z@I$*2-|u_iW5<`Rq-iG=Llqvs6dC;Zb>cATgmr~vu#r@$ zFLFN$H~3dbCgKYED>?oB+@`AEX{ykxx)wAe{yaHLtuPWdr$jVSK(nteTY&9R7a>rD zQ*_8RceOTTd47aJA`Gm9ZecZ@!x+tsfarDcLl#AHy9OSLBYV(fVycqw%5y#++Cq-Q zcuN=$^$qev+8g((7m;QcR2$S&6!bKc*$#X6<-6zR=kHfnn~U+gp%{s*ynKG2NAT-& z*~r9K69=Pi8V?fg7CVx~)YNjMJa|f1!O&-oDH(}JY8Jekqd1I}Rwta@44=DvxG*&8 zdr!lH%n~S3NmvjSQ0!o~B(YI)e&%%3&wh8>pD5nr*n!E5xj-54;gJPu(-bt!e1WBi z;RehyEP0!r!0tBlT3$Tb_X>4h14gJ@JygpQUsRf^1*uBD*G8c4Nq9D_56(SZO8KL@ zl;q8>aLF2fD0~g5VlIUWWi)uU2)U1fd~=?X$ysfRh-|8&&iVaY0)C8@t(cObZn^n= z<6EeYG~k~*K?1?GnrZD0r)prM_Jk(RksCiEfvv(dxcx*t{XM%5U%+aM_&$N60LoJ< zXh3QFHhyF-O&)A?iCEq?`I{Zd!dD6f?+!io&|o>Z-}*az9(k~0@f|17A_alJI7#$} z6IW2#dJcZKM1;#5eFQi(Us;{)H|F9p~kE4KMUI8JSE67995ScV;FpenT}v6|GJHdP5v6eT zry0Y0Y~;1J@+=(o0jmj&T1*|N`RC(2*~4PXsx)egEyz|rMYhc&hzt^4Rt#MsHjPgl z0QT6r;-wT7;6U^jpGqI+IqfH{n0rWf{?;HGwMg%3NIyt)_ANA?k0C!5Cy1}m)!jy) zm_;khbNt5gYsMRn@Iyu)X4`m3)Y?zh#kQJs1UZa8L3fUW*bRyFiwSj0Lktl}^9e~y z(3Wdb4w*|iO37=!R2siD1>=ikP_B+vyF>tdS{1>Ao8tJ55Yv$BdPVitS|eHsR$LcwtZ{UxQy_!%0rkaS>gwbbOa-8tJcd;{7&!xaK{*s)LS17B`e># z{@keD?x%L#3J0kx#XrYD&9v;60H`6cNA5@LlO&^bHXnMd*{*!W?_Lj)@Vg`LbrW2R8k!wt3~R_VGO?QKm#{ z*fn)VN$(ITjq@)}qcoHa82{B92%`hMu#-d3)<=Eis#7c7);* zAX|X`#I^Be4o67v~qE3hx|VvH@S?dGyjVr0Iw%$ghnX7IPeBL$2$ zjMz739^!}x&t6yZ^5qo1Yc7c>F24sC^wUY6!-As_`%#CG59Ltjq;z)?wcwY;)~$Rw z;&<8mZbe&fo7_Acp<*hlbXsyR%(U^2=l;_N``sz*1k$(-3M3~uH7N0CHjJ5yYz5;2 zHWu(VnBugwKiyPY1uJ`dY*;W}B~8qK=g0zd3wp-=?f=}?M9|szU^Um!Y}xPsjGeBh zF|xB2m#-koaJadboO9Zx!1oTCs=U!s8fW16Tn4)0?8hTX`?I}vqR+Ly9@5>4;BPm> zd$%k1G}#Q(GBrX_TJ|Dg@s0xCpM;3WnA1IHtu5l7zZz6$ncPf@)&iU$iaTDFI4np8 z;e&X}DqkiQ@!8*$9jKkM)2ZJTv;3}0$|7A%Yer(li}RF3G|js~LH~O&1+2uhf6$B9 zU-Cy3;JXwLCqsL@Mwa*13Uy-8DMhuBS27Xj-$X_=PgLLV!)O^BasSo+7i8m0kJTZghn#4?aQxO ztv17D6+$aTv;=#*I9jEQasJ88b8*`h=K;_hm)i013!E2R*f-Ye)V5LWO8*S$;keaD zjGNp*8KJ5l)Q2w5o*V2NC}fZVcuHI=$T*BRTsARuHzV+o50~2j=3!ek@mq>JQX`>va^7os`WL&KYQLuvh!aUm%KlLjvySRN zGtyM@Pmkwf&H&^z)9%YLhP?}&Eapg$^j^ofY0A;j#P~s%H2(&gb(3bJ4s?sV+h@bq01t?u-QkDf5?>( zyf`KX-6mdJ4|omHjwuyA-YnD%m0)?nc;ntgWHgrljK&R?JqQCKNLre(cr`blE!@#n z*bc{?reMbYV%eOUoZiQK{LOwI%*-ol#+=Ki4ZbfNH zz*g%BDOb3eTp|Uyj^rjOgH6}*g_`>Yi|%o<*+knaLQrD4CIzXvVkA>526ltSs#mb> z)HKv~;4v$t8iu31=|vOb2ee?0Wb*5H+7ID^F<#Dllb?s}#*^YZPr%tL_1WsN*;B;# z4-cd_IT>`?7B9A}v0JLuhl5#Hb7Uze)TZW!iWQ>=OF4hkk`iMrxM5tJ5m?_Q3RU?%Jla-Z0=U=nw zX#n;bCNZE=rR}`_QrX*k`SqrL{R*1+RM4w|6pYWlD_x&1TApL9cgt#D=nAjG8IWb;e5B8}t%R&6p)V zdIJVI33#{lmA8&`{q4J8We0w#&KkWkJGU!Fsh#gCdu6;xtkz@Yf& zd&+}Ka_Z^qH?H?XK0l^vvQ}6ZH(Nz>dUt5z3v~m{X5=`K*m>*4d}(A+D8p3BI)oL& znPL#EE2ZiboS4N))2)B%@zA#y50RmQHmxh%uLV|4=y=jv{VcF25*(Z>P5z`hQ%vNb zg2nM$aQ1O#`5Ft8L|YCqo*HZn=ir}PhzZd%eqD5iAs3vS9@BQfl@s`V!j<&mcL0Ae zmornt(J;3bTRGUeskK(|Ao@c1bHJicDd>3lXbf{o>nTTx4ln5Q-nN6=!0IZY?kwqr zU`_iqTov3;IgiizA{j3aZzLkqkVLNZ?Hrd=se#D1=F19oROYjf1t9$nAF+!gAx3%{k{?_*uYRk)q&{z zyj%yC5RR3s23mrUNljL=h6g%X4mYqM%2Ns=(Tp(eI;oAbyWo%voCqjqL7ZbfgY?kJ z=^AsdHyCG6Rg>v}cOlPXt53E+%^}9io(;!qT=!#Y&Z6!2tsugJ3J#HFgBG`0`-%_t z)M<3*fy}Pwt)>f>cZ9Fxj4#STx}z1E&goDoR5YEQjrasbzQ0qvB`LBGKz_k?Ql>H? zL~$1Hf0-=@wAR`BbIb9pcZ zx#z{7EI(Z8xTBw@{~75i|M1Rz@m=}75@>|+XrStf0PJ(FGuOyxqYA+aj$vWWn5btx zED%T{zg{nFewzXima-aUMH530rDTMaSd5Kt;X$a#m2zJ5x!-EGKK*eF#!COAqD#Ey z6S*M~b%B{12F*bZsKy=jhn+ng$1+`>UyUgYDFDxcar(Y}J<9+%@z!_kv*FVP@52Sb z>~?fB5I;0$X`D`P^Qr|0v8>YB`7gsPc<#qrfbgX>>5YZUOrS z58}w9eDE2nXc(s*cvec}llO{av>64Q#OT)$&{Ou%Z_xXduA>Euh-y7;ooQo%-@+&@ z^h2;mONOndqw{*JQ|Wx&663IAB*KY*#O~z+MoB{KM;zLF(imY#^FFziDT_k7<8l+X zx^GQWYsPy;ob6!v0YPu*dWED+j|gw(l0`A4_?#s&y-5z= zqT17wVLAZ20}65I+uT44Ufc+xR&g}Z3o!idKlwln`NN3jA280p`{S0G3#)!t?sc;6 zuSFS#2^IlpE=B(sTes^*uP?UQn_^8t`h6V@9EVZBX| zzpi6|3%ir>*hu6i;Ak&IA~-Uhqb#$X4KDXlaVj$MBBl%ktr=_`5uCS+Ek{`mqRm9R z&F0l+8}UO?P7+)`a;y{1qzQY|T=}SC$RT7@|CA8&#^Vr)_B zZKCf!K9Ku=Sg`cnA&}K~z`db@@Qhv)LfJW8&cD-%$notmJ4K2MQ=D7u0tB*{oedV% zJJ}D-M4o_QfZRZ0*?Eoisi|MtI~=t%0P%B*DwL{CFN7%zzy3GT@QG@bmhlr8p$`IFmV zUhN2DbyVB_D5&4MNk3nyP8=ros|b%k#AnXta|r86YkK||atJdTTO=;A_aY7PQki>!(uX)xq-!5l$Rcl^;OYD?R`pr6Py=J ze7b&=B0oLUFrKgpZ~Kxxl_>=r`MD8So8;fRLRZ6dvu+0UJ5*i{KrhD>t173J(Ew<| znKT4lQK)PiJ--z=e-wHZ#v^&7q}yAMqADeMpyauZ@$IG^I^PtVJI%@p%$%paf+UHU zzy|U4+T1+2K`5kshiokGA7-Eh42Q?JyL>03nf>pTHj<*>#GMMz9@?*AzU0x2q)Kyi z!9$t)J9=j_5yk-ij^w8d1yGg#TQR=?0`V<*Iph2DSCt9o{+4b(n(JvMwgZgMZc86?|2gXScSqzw$3u zNq6~^fRa7oYzxib;LAoTQ2uJusPi1Y>;bZ*UI{o`?`Q^Vx8HZ@zkaYN97r9fEg;s; z7r}DY>*;Oh_c#nYdV7u2l4pW&O2OO4E_BI)viBG%d7p#!DpkP zuczTu*BoDUrZbDiFVf@Yf@lrJ1R+PGEVtkYD}B5NnC}E>XZiVCOrJbEgLr^skRQ_V zmhP}6Ek{dwF3Ov%*%`8;XgiLgPB){AOpW8 zigEj0qZGT3bKCOF5sWm#nm<89oCRREFTa~g`aymynm3-`g6;K=C~&c$EYorEhH|wd z<>DReRspk{vmeWKRmOP1-1mx%)Ah}<>_jae-L7s;!be145x-AztSSHxToUaQI%w(z z%Y*sb!@*;(zLawzrwCdTtygsZLpnI2PL1AbGkYZ3Xv0#=it-HelVO-SebSlHCB{8B z7o#vzvc4|xjc(O>V&k37E&|HE3i|yl73NbV=CwiWmoLU*B8Gcf>TuR>rh8=1F@=$$ z?T#1{t4;Lwp%NgRa5{f;J-YtMv1@0TPLv-dw@*olV!@Nm?-!>!J zv=y0;EM*iX&FPU%mHD91iq?1r{L5_~=-GoZ2hXZjM5(%8?>jaPaVmg*^eaBnbGnF| zkgS&IbJ(q^ef`a%4%}&UA^!2$592H!?<3}=dQ0dL{L$@9&}M;l=nU-}Ya5yO%1GdM z2(|HQ2=Ar%$yjBi&<#VdNdy1#9IN9ah5ARNc4tS&?VQ=wKhdFwUbdj3#$RPTH5YuI^au%b(D0 z_%+saUiY+grH5BOOK%`j8$cRM?Kr$DeZtzbua1?|xGk>Izh&qx2|&{cL@-Z1Ep^5O z9MNN?Ju5@vYni(+XMMuEQF6o|8R6rH=o`F(HpuYeQxc*QF|z)RSt7JKD) zC+BV|njB*k;-3n<3-2EsXvM(QGOKiMxRO?m9FL5tfsPdR z6u$ZZ01yqm+yw}`5E??VvhhRXV=*!FP`*;pgx+Q*6^yvPqKK0dSiy%40(3fBGlgRh zro(eyHR-!Z-}7>IqCH#lI9L*heTxzNh1JDYN-OccBbe~e3%B{0=vrVSc8YuKHFw+! zEG;0`Y4n+=*56sssc7d;nP*jVoN!+xd3SeZt;y0vNj&)J^H{}H@HRa z<@FG=Rs&q8d)|uO}t1m5lSc(RvL3)sYEJwYu;!%O zLTHAWB;MaU+3l}x2Wx{l&`EnQ#NnV&r`o^_M<4tJj}7mic@dio&ZD@wr(gBeQHzks z#gLp1d9oVNUuwyksNdu5srOBD^X!*BgQD96)?YcYT~VGs7^RVirF#uy)!Iq}kbP`6 z!O@#Lj+zHHMYUC-L#{LJ)4y+V#hId zAf;43T`LE7o_hL?d9pu_&(GpN8-?G9PQnoE(akt7c(LBfZ&jDx@?0LhHqMuf!M&u8k+P4mMMM})PLlO zU(mrY9|J(^v#LSQj66;+yP3*+VtZaZpjEfvc-XK4)@JATRD_>}ll*>?DQh-N(_vW^?F4inx$fp^Zo?;jz88T| zb1si$;=iV4!41y97)`JrL>N=2J(Cc+ojdeKG#al35mMdB{gC@(6vtA&0Up8=EGr>g zEiKLJ^HH}W&Lt81oNY_!R|zlfWZjNWKx>a1EYbnJ((s1s-k0bs-)ZfR1I7t4TA1sc zr${%biYy2{_f#V3%88S98x-|}nw?DSvv_Nw(^(TrixD(DLDR*!G&g!CBycuw^IfQu zKSnM>oY1T1i74_8!JwH$|3-7%B4dBW5@*pb88qKHD;TF#*D^z1H!LXEX;d6HY;~d% zH|t8`0L{C!YufH~`1@30^8H>VP9N8x3 zv{eV$=sdE6jqh-S7V5u#EC$AM-O3pWA1bO537!R85AxD2`FQu@cD9=lS4R3UXd->T z*dH9-inmbIEL4zWJw$#w$48_!L;yEY_EvKt-Q@LtgNhr7Yj=F7n?o;*E*NO?42esl z2OHhts-LXA*{9-)6|8A%{FD)svo%)4QQO?%(bXKxI5fC3-5b9#{OvmzSJ!@x6O|_U z`0oNLJYsD*TcC9NLFL_wsdC;DoKoP{t*;#@%VQ)ZI3 z^j;8|hU?jBqecyW$|J9B5;Y91Nev{(7pd?rP&Ta&bc1O zfOM-_M8LK8!N&W;)*I>dE=niR{#2*GM~{ntgMS~Dm=5cw^Te~?*<$X}GlsgNfE7n; zrN07dacu_+?AZZN4ETuSEl7K6C6$MZa)G+yHR|nkW7W$&7KXaXOOe4&pv^SIDw7A; zm)+yL?0sP44hA$hjO$p$?~;6rHwQXBQ5~SEupAHWMN&vY$FnbwKZ5PD~*j>fqJNzyg-4FlA$9~^{g`xuV;wMvVw@TYSlVL19j`%_^ zMmVw^WnDpPH5FW?pUv)d^+yEj#wDvbSgjW_!$q4c#7=O=afkS}eo$?tuapO+DCmP> z#8G}!=)T`R^#v%G*=L0y6c#I6+i^rmfj<99k%)1->RURT>V=40*;UZsf7e@GatGy4 z26yp+e}C`ifMi_`+X@BCnZTh&-)=5^Yqi`Uy4%~9Yx<&rD%kEow1-Zt&f4bkOaQH6 zneg(=vv8cncVlhnn0^5xD5ReUg!$3WY3K5}fT>osopK3j_`;Ebq<=TblIXJfBu46X zj(vwC!exdA(3$;Ge~*z#6-LHg(;!XMz2okK z@iI(dbE4pQECu#i`=`d)V(qaU4@PUWN^^?;rDljPg(-hzda?wooH)o`2)Lzu)t@=iGDeJ@ zl<0G^*zvVvPvP&{_1&#rK-1ZIuhDD(xG!1QaCMU{qJ$L#3JJ{?>>0L(hPa_8vjb;$ z{@p`<_QP;!;Knbw0$z36S;TG@3Cjm#1!o^Q&tZRvHr3s?H&9u5qMNqWzu^Tglak31 zNML@+`?S^{XZSJo*LEyopWygru z%3}SQ)m>E3ZBq0`*ruP3W;?E{bsXhx^&- zyEYWzE`CIDfs^@^gAZ*(eMcOgG7?kHE^w}wj*$nF)uZ`5;{_>D!N$#un$B1oaJ4pP z$~U$n(3bM0d%vbJg~wyNb8ar$D_#x+eidTcOOP#=h-mVtv;MM!-(b|~Oi-A!TVFt& z&5vZbbmf2Wb=8c!a`|WQ?ldRP6V_ano=!5Q160)_oj4D{4a<>%hr`!3li^BN)<;O;(VKZ7E5i;l*jjTwm&1$TY4G2@yi2o-49Y}S$+RSqAjOjw zx%^W@43177PBeXbHZdZ|KURoZTx7+aEtgYj2V*Of8nk})^#t3z!s>1zPj_gdfd1Y|k3`?aov*!#vSeZ2 zLyct0sg&Os=wh{3B>ZM^J?RaDA_LhIitbmF;XRF;S0#J2Jy&?vG|(0X429Ed9nh`9 zz8*FcHMsyNd;m+b&Et8d3KqE<-rNRhc!>~KA`BD#ThMj)ftJ&uI47&18&-S4Eg?0OFoyh2faxWm@o;s^1PIh|o) z?2X@~dH)=0>wT+fR+n^_q4SzFJai!nPC2afm~oH7X2KdK5iKFV#LWhb_0hCQ+q6)v z0v_QMHbx)fS|Fgi$Ew*`n-U}O{q(6@`SyVGAEqG7rZ67^m9mFl5v@q$O08>%}ID^by<;gt0gC z%r2UDaYy^HVRTtF1VKC7oV6j z5C`PleW+X$9qU)m;m^={A>On{PvYlnWyM@JO(i>;O1_?z0NuzrZR-gn*wl)!Y>EUO zKTpqBsj7NRVF!&i{hhB33D&6^A?&6gGE9ZO@0`SbAtYj1F?1sK!ybf-6u`n~f7l2c zIg$4y44y|q|8A!ng>D$7lqv$+k;L8Vt<}dnrWdyeVFxKOoXZd2fNL5a z(*V#rXi-0U$oA4_uR>_lHDe?SBySeyLdw991g6+?6`up5&UcO*7OTOpqexAf^ds!) z{|@{vir;-}2O39F-p3yCDc82hY;8;xe>!NJ!7c1&i>3){c9tvgXF<}FpY+;N%Nf>t zTs!Gq|AGB+xNf992INr9Ia$Tv9OYX^GL_c&OekV{dS2T1iV_bKg$F@-ZovvV%>kD^ zTn@Aq27jRCg~Cf_kz5qPZoj_U_kGNy%xZG?TT`_s?w=*mC&FOE_L4@e{&ax1%9S;h z`SU(~A6m1R`;*0W&A*+H#+2J19DAJzn{my~G!zuqx(tane=1YSlOnBM zq{Xcq;!t85Bamnn$1lxjoFDfrnvVbaQHGBv9l$Yagk<#gGxK+9!9Ff{*3>TU@czx- zw7Qs~>F@tAk{Rp3DB-vX3AYB|6$b+dbz5hyIL^y(wi@i-SIZ8%?2s~O&(vP&E$?S< zHTH#JoB>CN^M`TJW(eTuj~-^!{NsKw4kcP~INvyJf~O$LOtPTzlX?(a`cMIzK$vCR zkc3+sH#Xo}V9jVRsV{p0!I^g~lK|g~C8gx=%MGQm*o!wXRM8bpM_A>`lYpmo5AaL& z=@hy}W^7~|HAyb|DpzeuGz@bZz(l4W1*2pxpBldc035XgM`>KX*6?hI;8KZt2?i7_ z0>?F|q#kIrK&q8}dJh#&S4Mi}XWFwXn$&T^NyL6aIe*j{rzTs=5JnBCUoNQS)1%6} zYVYLv%1fO&20AWN@Zhx0{)I=vk#_~BV5DPT-xX(D_F;XF+u>@ z)wj>gXT7eJL$f~q@XFu3Lu~@}u+?oYcK?Il@#u?t1N~IrNE*-bond8?7q{IBhmY%) zD%?8^!9lZpTa?jk7xeAy-3~noa{x0|a*ZG4=N+YMWANHiVAIVWb6>RMRi|_+IUYHV zWE7kZ9rH-)-*fr3HQ7VSM!z{QRTj zaR$*T7Asf&)dP=$mwU=9v&@a0c{X*vhKgwDQXtN}o6OkFx!1sW?Y_sc8(pm`G{f@5ROLqYpX~U}V6gxZE z>kxj|8&_zKCEOOdg2hf`rXn9YJ#=|@H0_btqg$^#yg)Ee=$YZJsQURw;)PQyAvZh2 zZ}d3z{rfIWu4Og+Emfasn}kwiU(?;ck#~+=4oSZk(0YT`Z_oxLeCLhw(Biy;0&MLs zV<}X`v1jY@IN86Rpl!1n{O%4P6B3MG0XREap?abrNq?U_O{^Ssg!OTSC5fO!^u^Z= z{afcRO#sSd`G~q@*Cppzz9{75Kin8T-hG+VP!%%QS-YAbBiN-F!J4Hd(R- zZY&|wsr1&>Sks??UGAYJgufZ8dARy^Xg) zOwh$`tp>?txEOl)kPZ(2cK!nuGxkGrFoQ^P`F-nyzkh)D@wBDR_K-(R@E;~@&%o~p z))*m*1)syznv~LiB$ZCkykn3$6JwcSnieHVb5%#5N{>B&MHSrd>yBL=PjDl9K}E%GQBQxaW)f zV$LY__4!+m>fl^=Gy5Bu@3knMGF%7iv zJKIhTL&wu-sZkwQXy;Af^@SSw3k~+WR1V$*_MkXZ)ipDICw?y&b&LL~VgLClvgSLI zRw2|UJ$0k)z&TA8==0)n|lgVA~XW{g8zFuluUio8Z=jPV~jRo!+zW-!)gf+Vc?8IP% zGM79x8hdFV`M)=D9AmDXLUqJDg0mU3m#D>V5iO}%3)(FS zDr9Kak#rHZrD|jPaZw3v8AiG6uzUH8FucLF{0+e|mWrF9?U2b45YsC_Z#hL#`;tMD zk`41Y&$hpX#YT0?spFs0nk&LMMVcK`%~uNZSHv543@&B^1nJ#@cY*9cCe!^f660O^ z>&eDl-OB79PIufs_PR=xGK^o&EOxt`(cgWOQo?M)?Pv>%LyK*zc+!UrDGM?z@D2d~ z_?jppARKrOa?lO`AC4TIQ}cZJjo>q?9lE8)#P2XYjm9ohsXn|GPS?}8Z?F^6g)Zd9 wliR;umA??Gv;PE4{KwJM=>K^TL{F3cJx4CEy(^pjuO`yW*vhExrf16k01bHb1poj5 diff --git a/filcnaplo/android/app/src/main/res/mipmap-xxxhdpi/ic_splash.png b/filcnaplo/android/app/src/main/res/mipmap-xxxhdpi/ic_splash.png deleted file mode 100644 index b3def8cbf2ad4c0718a1dbfa375f5d765908a96b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11474 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 diff --git a/filcnaplo/android/app/src/main/res/values-v21/styles.xml b/filcnaplo/android/app/src/main/res/values-v21/styles.xml deleted file mode 100644 index 3a78eed..0000000 --- a/filcnaplo/android/app/src/main/res/values-v21/styles.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file From 360426d851fc75794f2969001608da21f102aea2 Mon Sep 17 00:00:00 2001 From: Kima Date: Fri, 25 Aug 2023 23:20:44 +0200 Subject: [PATCH 04/60] fixed some of the widget bugs and removed assets --- .../android/app/src/main/AndroidManifest.xml | 22 +- .../src/main/java/hu/refilc/naplo/database | 1 - .../hu/refilc/naplo}/database/DBManager.java | 236 +++--- .../refilc/naplo}/database/SQLiteHelper.java | 70 +- .../app/src/main/java/hu/refilc/naplo/utils | 1 - .../java/hu/refilc/naplo}/utils/Utils.java | 72 +- .../java/hu/refilc/naplo}/utils/Week.java | 128 +-- .../java/hu/refilc/naplo/widget_timetable | 1 - .../widget_timetable/WidgetTimetable.java | 792 +++++++++--------- .../WidgetTimetableDataProvider.java | 706 ++++++++-------- .../WidgetTimetableService.java | 24 +- .../src/main/res/layout/timetable_item.xml | 44 +- .../src/main/res/layout/widget_timetable.xml | 65 +- .../app/src/main/res/values/colors.xml | 4 +- .../flutter/generated_plugin_registrant.cc | 4 + .../linux/flutter/generated_plugins.cmake | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 2 + .../lib/controllers/timetable_controller.dart | 53 +- 18 files changed, 1142 insertions(+), 1084 deletions(-) delete mode 100644 filcnaplo/android/app/src/main/java/hu/refilc/naplo/database rename {filcnaplo_premium/android => filcnaplo/android/app/src/main/java/hu/refilc/naplo}/database/DBManager.java (97%) rename {filcnaplo_premium/android => filcnaplo/android/app/src/main/java/hu/refilc/naplo}/database/SQLiteHelper.java (97%) delete mode 100644 filcnaplo/android/app/src/main/java/hu/refilc/naplo/utils rename {filcnaplo_premium/android => filcnaplo/android/app/src/main/java/hu/refilc/naplo}/utils/Utils.java (96%) rename {filcnaplo_premium/android => filcnaplo/android/app/src/main/java/hu/refilc/naplo}/utils/Week.java (96%) delete mode 100644 filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable rename {filcnaplo_premium/android => filcnaplo/android/app/src/main/java/hu/refilc/naplo}/widget_timetable/WidgetTimetable.java (97%) rename {filcnaplo_premium/android => filcnaplo/android/app/src/main/java/hu/refilc/naplo}/widget_timetable/WidgetTimetableDataProvider.java (97%) rename {filcnaplo_premium/android => filcnaplo/android/app/src/main/java/hu/refilc/naplo}/widget_timetable/WidgetTimetableService.java (96%) diff --git a/filcnaplo/android/app/src/main/AndroidManifest.xml b/filcnaplo/android/app/src/main/AndroidManifest.xml index e7d7bbe..14d49f3 100644 --- a/filcnaplo/android/app/src/main/AndroidManifest.xml +++ b/filcnaplo/android/app/src/main/AndroidManifest.xml @@ -2,7 +2,7 @@ xmlns:tools="http://schemas.android.com/tools" package="hu.refilc.naplo"> - - + + android:host="api.refilcapp.hu" + android:pathPrefix="/v1/auth/callback" /> + + + + + + + - @@ -45,7 +55,7 @@ android:resource="@xml/home_widget_test_info" /> - = Build.VERSION_CODES.O) { - Locale loc = getLocale(context); - - if (rday == -1) - return DayOfWeek.of(1).getDisplayName(TextStyle.FULL, loc); - - dayOfWeek = DayOfWeek.of(rday + 1).getDisplayName(TextStyle.FULL, loc); - } - - return dayOfWeek.substring(0, 1).toUpperCase() + dayOfWeek.substring(1).toLowerCase(); - } - - public static void setSelectedDay(Context context, int wid, int day) { - DBManager dbManager = new DBManager(context.getApplicationContext()); - - try { - dbManager.open(); - dbManager.update(wid, day); - dbManager.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static int getToday(Context context) { - int rday = new DateTime().getDayOfWeek() - 1; - List s = genJsonDays(context); - - try { - if(checkIsAfter(s, rday)) rday += 1; - } catch (Exception e) { - e.printStackTrace(); - } - return retDay(rday, s.size()); - } - - public static int selectDay(Context context, int wid, int add, Boolean afterSubjects) { - DBManager dbManager = new DBManager(context.getApplicationContext()); - - try { - dbManager.open(); - Cursor cursor = dbManager.fetchWidget(wid); - - List s = genJsonDays(context); - int retday = new DateTime().getDayOfWeek() - 1; - - if(cursor.getCount() != 0) retday = retDay(cursor.getInt(1) + add, s.size()); - - if(afterSubjects) if(checkIsAfter(s, retday)) retday += 1; - retday = retDay(retday, s.size()); - - if(cursor.getCount() == 0) dbManager.insertSelDay(wid, retday); - else dbManager.update(wid, retday); - - dbManager.close(); - - return retday; - } catch (Exception e) { - e.printStackTrace(); - } - - return 0; - } - - public static Boolean checkIsAfter(List s, int retday) throws Exception { - retday = retDay(retday, s.size()); - - String vegIdopont = s.get(retday).getJSONObject(s.get(retday).length() - 1).getString("VegIdopont"); - - return new DateTime().isAfter(new DateTime(vegIdopont)); - } - - public static int retDay(int retday, int size) { - if (retday < 0) retday = size - 1; - else if (retday > size - 1) retday = 0; - - return retday; - } - - public static List genJsonDays(Context context) { - List gen_days = new ArrayList<>(); - - DBManager dbManager = new DBManager(context.getApplicationContext()); - try { - dbManager.open(); - Cursor ct = dbManager.fetchTimetable(); - dbManager.close(); - - if(ct.getCount() == 0) { - return gen_days; - } - - JSONObject fecthtt = new JSONObject(ct.getString(0)); - - JSONArray dayArray = new JSONArray(); - String currday = ""; - - String currweek = String.valueOf(Week.current().id()); - - JSONArray week = fecthtt.getJSONArray(currweek); - - for (int i=0; i < week.length(); i++) - { - try { - if(i == 0) currday = week.getJSONObject(0).getString("Datum"); - JSONObject oraObj = week.getJSONObject(i); - - if(!currday.equals(oraObj.getString("Datum"))) { - gen_days.add(dayArray); - currday = week.getJSONObject(i).getString("Datum"); - dayArray = new JSONArray(); - } - - dayArray.put(oraObj); - if(i == week.length() - 1) { - gen_days.add(dayArray); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - - Collections.sort(gen_days, new Comparator() { - - public int compare(JSONArray a, JSONArray b) { - long valA = 0; - long valB = 0; - - try { - valA = (long) new DateTime( a.getJSONObject(0).getString("Datum")).getMillis(); - valB = (long) new DateTime( b.getJSONObject(0).getString("Datum")).getMillis(); - } - catch (JSONException ignored) { - } - - return (int) (valA - valB); - } - }); - - return gen_days; - } - - public static String zeroPad(int value, int padding){ - StringBuilder b = new StringBuilder(); - b.append(value); - while(b.length() < padding){ - b.insert(0,"0"); - } - return b.toString(); - } - - public static Locale getLocale(Context context) { - DBManager dbManager = new DBManager(context.getApplicationContext()); - - try { - dbManager.open(); - String loc = dbManager.fetchLocale().getString(0); - dbManager.close(); - - if(loc.equals("hu") || loc.equals("de")) { - return new Locale(loc, loc.toUpperCase()); - } - } catch (Exception e) { - e.printStackTrace(); - } - - return new Locale("en", "GB"); - } - - public static boolean premiumEnabled(Context context) { - DBManager dbManager = new DBManager(context.getApplicationContext()); - - try { - dbManager.open(); - String premium_token = dbManager.fetchPremiumToken().getString(0); - String premium_scopes_raw = dbManager.fetchPremiumScopes().getString(0); - dbManager.close(); - - JSONArray arr = new JSONArray(premium_scopes_raw); - List premium_scopes = new ArrayList<>(); - for(int i = 0; i < arr.length(); i++){ - String scope = arr.getString(i); - premium_scopes.add(scope.substring(scope.lastIndexOf('.') + 1)); - } - - if(!premium_token.equals("") && (premium_scopes.contains("*") || premium_scopes.contains("TIMETALBE_WIDGET"))) { - return true; - } - } catch (Exception e) { - e.printStackTrace(); - } - - return false; - } - - public static boolean userLoggedIn(Context context) { - return !lastUserId(context).equals(""); - } - - public static String lastUserId(Context context) { - DBManager dbManager = new DBManager(context.getApplicationContext()); - try { - dbManager.open(); - Cursor cursor = dbManager.fetchLastUser(); - dbManager.close(); - - if(cursor != null && !cursor.getString(0).equals("")) { - String last_user = cursor.getString(0); - return last_user; - } - } catch (Exception e) { - e.printStackTrace(); - } - - return ""; - } - - @Override - public void onEnabled(Context context) { - } - - @Override - public void onDisabled(Context context) { - } +package hu.refilc.naplo.widget_timetable; + +import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProvider; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.net.Uri; +import android.os.Build; +import android.util.Log; +import android.view.View; +import android.widget.RemoteViews; +import android.widget.Toast; + +import org.joda.time.DateTime; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.time.DayOfWeek; +import java.time.format.TextStyle; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Locale; + +import hu.refilc.naplo.database.DBManager; +import hu.refilc.naplo.MainActivity; +import hu.refilc.naplo.R; + +import hu.refilc.naplo.utils.Week; + +import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; + +import es.antonborri.home_widget.HomeWidgetBackgroundIntent; +import es.antonborri.home_widget.HomeWidgetLaunchIntent; +import es.antonborri.home_widget.HomeWidgetProvider; + +public class WidgetTimetable extends HomeWidgetProvider { + + private static final String ACTION_WIDGET_CLICK_NAV_LEFT = "list_widget.ACTION_WIDGET_CLICK_NAV_LEFT"; + private static final String ACTION_WIDGET_CLICK_NAV_RIGHT = "list_widget.ACTION_WIDGET_CLICK_NAV_RIGHT"; + private static final String ACTION_WIDGET_CLICK_NAV_TODAY = "list_widget.ACTION_WIDGET_CLICK_NAV_TODAY"; + private static final String ACTION_WIDGET_CLICK_NAV_REFRESH = "list_widget.ACTION_WIDGET_CLICK_NAV_REFRESH"; + private static final String ACTION_WIDGET_CLICK_BUY_PREMIUM = "list_widget.ACTION_WIDGET_CLICK_BUY_PREMIUM"; + + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds, SharedPreferences widgetData) { + for (int i = 0; i < appWidgetIds.length; i++) { + RemoteViews views = generateView(context, appWidgetIds[i]); + + if(premiumEnabled(context) && userLoggedIn(context)) { + int rday = selectDay(context, appWidgetIds[i], 0, true); + views.setTextViewText(R.id.nav_current, convertDayOfWeek(context, rday)); + } + + pushUpdate(context, views, appWidgetIds[i]); + } + } + + public static void pushUpdate(Context context, RemoteViews remoteViews, int appWidgetSingleId) { + AppWidgetManager manager = AppWidgetManager.getInstance(context); + + manager.updateAppWidget(appWidgetSingleId, remoteViews); + manager.notifyAppWidgetViewDataChanged(appWidgetSingleId, R.id.widget_list); + } + + public static RemoteViews generateView(Context context, int appId) { + Intent serviceIntent = new Intent(context, WidgetTimetableService.class); + serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appId); + serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME))); + + RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_timetable); + + views.setViewVisibility(R.id.need_premium, View.GONE); + views.setViewVisibility(R.id.need_login, View.GONE); + views.setViewVisibility(R.id.tt_grid_cont, View.GONE); + + if(!userLoggedIn(context)) { + views.setViewVisibility(R.id.need_login, View.VISIBLE); + views.setOnClickPendingIntent(R.id.open_login, makePending(context, ACTION_WIDGET_CLICK_BUY_PREMIUM, appId)); + } else if(premiumEnabled(context)) { + views.setViewVisibility(R.id.tt_grid_cont, View.VISIBLE); + views.setOnClickPendingIntent(R.id.nav_to_left, makePending(context, ACTION_WIDGET_CLICK_NAV_LEFT, appId)); + views.setOnClickPendingIntent(R.id.nav_to_right, makePending(context, ACTION_WIDGET_CLICK_NAV_RIGHT, appId)); + views.setOnClickPendingIntent(R.id.nav_current, makePending(context, ACTION_WIDGET_CLICK_NAV_TODAY, appId)); + views.setOnClickPendingIntent(R.id.nav_refresh, makePending(context, ACTION_WIDGET_CLICK_NAV_REFRESH, appId)); + views.setRemoteAdapter(R.id.widget_list, serviceIntent); + views.setEmptyView(R.id.widget_list, R.id.empty_view); + } else { + views.setViewVisibility(R.id.need_premium, View.VISIBLE); + views.setOnClickPendingIntent(R.id.buy_premium, makePending(context, ACTION_WIDGET_CLICK_BUY_PREMIUM, appId)); + } + + return views; + } + + static PendingIntent makePending(Context context, String action, int appWidgetId) { + Intent activebtnnext = new Intent(context, WidgetTimetable.class); + activebtnnext.setAction(action); + activebtnnext.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); + return PendingIntent.getBroadcast(context, appWidgetId, activebtnnext , PendingIntent.FLAG_IMMUTABLE); + } + + @Override + public void onReceive(Context context, Intent intent) { + super.onReceive(context, intent); + + if(intent.hasExtra(AppWidgetManager.EXTRA_APPWIDGET_ID)) { + int appId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + RemoteViews views = generateView(context, appId); + + try { + if(premiumEnabled(context) && userLoggedIn(context)) { + if (intent.getAction().equals(ACTION_WIDGET_CLICK_NAV_LEFT)) { + int rday = selectDay(context, appId, -1, false); + views.setTextViewText(R.id.nav_current, convertDayOfWeek(context, rday)); + + pushUpdate(context, views, appId); + } else if (intent.getAction().equals(ACTION_WIDGET_CLICK_NAV_RIGHT)) { + int rday = selectDay(context, appId, 1, false); + views.setTextViewText(R.id.nav_current, convertDayOfWeek(context, rday)); + + pushUpdate(context, views, appId); + } else if (intent.getAction().equals(ACTION_WIDGET_CLICK_NAV_TODAY)) { + int rday = getToday(context); + setSelectedDay(context, appId, rday); + + views.setTextViewText(R.id.nav_current, convertDayOfWeek(context, rday)); + + pushUpdate(context, views, appId); + } else if (intent.getAction().equals(ACTION_WIDGET_CLICK_NAV_REFRESH)) { + PendingIntent pendingIntent = HomeWidgetLaunchIntent.INSTANCE.getActivity(context, MainActivity.class, Uri.parse("timetable://refresh")); + pendingIntent.send(); + } else if (intent.getAction().equals("android.appwidget.action.APPWIDGET_DELETED")) { + DBManager dbManager = new DBManager(context.getApplicationContext()); + + try { + dbManager.open(); + dbManager.deleteWidget(appId); + dbManager.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + if(intent.getAction().equals(ACTION_WIDGET_CLICK_BUY_PREMIUM)) { + PendingIntent pendingIntent = HomeWidgetLaunchIntent.INSTANCE.getActivity(context, MainActivity.class, Uri.parse("settings://premium")); + pendingIntent.send(); + } + } + catch (Exception e) { + e.printStackTrace(); + } + } + } + + public static String convertDayOfWeek(Context context, int rday) { + + /*if(rday == -1) return DayOfWeek.of(1).getDisplayName(TextStyle.FULL, new Locale("hu", "HU")); + + String dayOfWeek = DayOfWeek.of(rday + 1).getDisplayName(TextStyle.FULL, new Locale("hu", "HU"));*/ + + String dayOfWeek = "Unknown"; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + Locale loc = getLocale(context); + + if (rday == -1) + return DayOfWeek.of(1).getDisplayName(TextStyle.FULL, loc); + + dayOfWeek = DayOfWeek.of(rday + 1).getDisplayName(TextStyle.FULL, loc); + } + + return dayOfWeek.substring(0, 1).toUpperCase() + dayOfWeek.substring(1).toLowerCase(); + } + + public static void setSelectedDay(Context context, int wid, int day) { + DBManager dbManager = new DBManager(context.getApplicationContext()); + + try { + dbManager.open(); + dbManager.update(wid, day); + dbManager.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static int getToday(Context context) { + int rday = new DateTime().getDayOfWeek() - 1; + List s = genJsonDays(context); + + try { + if(checkIsAfter(s, rday)) rday += 1; + } catch (Exception e) { + e.printStackTrace(); + } + return retDay(rday, s.size()); + } + + public static int selectDay(Context context, int wid, int add, Boolean afterSubjects) { + DBManager dbManager = new DBManager(context.getApplicationContext()); + + try { + dbManager.open(); + Cursor cursor = dbManager.fetchWidget(wid); + + List s = genJsonDays(context); + int retday = new DateTime().getDayOfWeek() - 1; + + if(cursor.getCount() != 0) retday = retDay(cursor.getInt(1) + add, s.size()); + + if(afterSubjects) if(checkIsAfter(s, retday)) retday += 1; + retday = retDay(retday, s.size()); + + if(cursor.getCount() == 0) dbManager.insertSelDay(wid, retday); + else dbManager.update(wid, retday); + + dbManager.close(); + + return retday; + } catch (Exception e) { + e.printStackTrace(); + } + + return 0; + } + + public static Boolean checkIsAfter(List s, int retday) throws Exception { + retday = retDay(retday, s.size()); + + String vegIdopont = s.get(retday).getJSONObject(s.get(retday).length() - 1).getString("VegIdopont"); + + return new DateTime().isAfter(new DateTime(vegIdopont)); + } + + public static int retDay(int retday, int size) { + if (retday < 0) retday = size - 1; + else if (retday > size - 1) retday = 0; + + return retday; + } + + public static List genJsonDays(Context context) { + List gen_days = new ArrayList<>(); + + DBManager dbManager = new DBManager(context.getApplicationContext()); + try { + dbManager.open(); + Cursor ct = dbManager.fetchTimetable(); + dbManager.close(); + + if(ct.getCount() == 0) { + return gen_days; + } + + JSONObject fecthtt = new JSONObject(ct.getString(0)); + + JSONArray dayArray = new JSONArray(); + String currday = ""; + + String currweek = String.valueOf(Week.current().id()); + + JSONArray week = fecthtt.getJSONArray(currweek); + + for (int i=0; i < week.length(); i++) + { + try { + if(i == 0) currday = week.getJSONObject(0).getString("Datum"); + JSONObject oraObj = week.getJSONObject(i); + + if(!currday.equals(oraObj.getString("Datum"))) { + gen_days.add(dayArray); + currday = week.getJSONObject(i).getString("Datum"); + dayArray = new JSONArray(); + } + + dayArray.put(oraObj); + if(i == week.length() - 1) { + gen_days.add(dayArray); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + Collections.sort(gen_days, new Comparator() { + + public int compare(JSONArray a, JSONArray b) { + long valA = 0; + long valB = 0; + + try { + valA = (long) new DateTime( a.getJSONObject(0).getString("Datum")).getMillis(); + valB = (long) new DateTime( b.getJSONObject(0).getString("Datum")).getMillis(); + } + catch (JSONException ignored) { + } + + return (int) (valA - valB); + } + }); + + return gen_days; + } + + public static String zeroPad(int value, int padding){ + StringBuilder b = new StringBuilder(); + b.append(value); + while(b.length() < padding){ + b.insert(0,"0"); + } + return b.toString(); + } + + public static Locale getLocale(Context context) { + DBManager dbManager = new DBManager(context.getApplicationContext()); + + try { + dbManager.open(); + String loc = dbManager.fetchLocale().getString(0); + dbManager.close(); + + if(loc.equals("hu") || loc.equals("de")) { + return new Locale(loc, loc.toUpperCase()); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return new Locale("en", "GB"); + } + + public static boolean premiumEnabled(Context context) { + DBManager dbManager = new DBManager(context.getApplicationContext()); + + try { + dbManager.open(); + String premium_token = dbManager.fetchPremiumToken().getString(0); + String premium_scopes_raw = dbManager.fetchPremiumScopes().getString(0); + dbManager.close(); + + JSONArray arr = new JSONArray(premium_scopes_raw); + List premium_scopes = new ArrayList<>(); + for(int i = 0; i < arr.length(); i++){ + String scope = arr.getString(i); + premium_scopes.add(scope.substring(scope.lastIndexOf('.') + 1)); + } + + if(!premium_token.equals("") && (premium_scopes.contains("*") || premium_scopes.contains("TIMETALBE_WIDGET"))) { + return true; + } + } catch (Exception e) { + e.printStackTrace(); + } + + return false; + } + + public static boolean userLoggedIn(Context context) { + return !lastUserId(context).equals(""); + } + + public static String lastUserId(Context context) { + DBManager dbManager = new DBManager(context.getApplicationContext()); + try { + dbManager.open(); + Cursor cursor = dbManager.fetchLastUser(); + dbManager.close(); + + if(cursor != null && !cursor.getString(0).equals("")) { + String last_user = cursor.getString(0); + return last_user; + } + } catch (Exception e) { + e.printStackTrace(); + } + + return ""; + } + + @Override + public void onEnabled(Context context) { + } + + @Override + public void onDisabled(Context context) { + } } \ No newline at end of file diff --git a/filcnaplo_premium/android/widget_timetable/WidgetTimetableDataProvider.java b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetableDataProvider.java similarity index 97% rename from filcnaplo_premium/android/widget_timetable/WidgetTimetableDataProvider.java rename to filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetableDataProvider.java index 147157a..9ce41dd 100644 --- a/filcnaplo_premium/android/widget_timetable/WidgetTimetableDataProvider.java +++ b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetableDataProvider.java @@ -1,354 +1,354 @@ -package hu.refilc.naplo.widget_timetable; - -import android.appwidget.AppWidgetManager; -import android.content.Context; -import android.content.Intent; -import android.database.Cursor; -import android.os.Build; -import android.util.Log; -import android.view.View; -import android.widget.RemoteViews; -import android.widget.RemoteViewsService; - -import org.joda.time.DateTime; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -import hu.refilc.naplo.database.DBManager; -import hu.refilc.naplo.R; - -public class WidgetTimetableDataProvider implements RemoteViewsService.RemoteViewsFactory { - - private Context context; - private int appWidgetId; - - private int rday = 0; - - private int theme; - - private Integer[] colorValues; - - List day_subjects = new ArrayList<>(); - List lessonIndexes = new ArrayList<>(); - - Item witem; - - /* Default values */ - - static class Item { - int Layout; - - int NumVisibility; - int NameVisibility; - int NameNodescVisibility; - int DescVisibility; - int RoomVisibility; - int TimeVisibility; - - int NumColor; - int NameColor; - int NameNodescColor; - int DescColor; - - Integer[] NameNodescPadding = {0, 0, 0, 0}; - - public Item(int Layout, int NumVisibility,int NameVisibility,int NameNodescVisibility,int DescVisibility,int RoomVisibility,int TimeVisibility,int NumColor,int NameColor,int NameNodescColor,int DescColor) { - this.Layout = Layout; - this.NumVisibility = NumVisibility; - this.NameVisibility = NameVisibility; - this.NameNodescVisibility = NameNodescVisibility; - this.DescVisibility = DescVisibility; - this.RoomVisibility = RoomVisibility; - this.TimeVisibility = TimeVisibility; - - this.NumColor = NumColor; - this.NameColor = NameColor; - this.NameNodescColor = NameNodescColor; - this.DescColor = DescColor; - } - } - - static class Lesson { - String status; - String lessonIndex; - String lessonName; - String lessonTopic; - String lessonRoom; - long lessonStart; - long lessonEnd; - String substituteTeacher; - - public Lesson(String status, String lessonIndex,String lessonName,String lessonTopic, String lessonRoom,long lessonStart,long lessonEnd,String substituteTeacher) { - this.status = status; - this.lessonIndex = lessonIndex; - this.lessonName = lessonName; - this.lessonTopic = lessonTopic; - this.lessonRoom = lessonRoom; - this.lessonStart = lessonStart; - this.lessonEnd = lessonEnd; - this.substituteTeacher = substituteTeacher; - } - } - - Integer[] itemNameNodescPadding = {0, 0, 0, 0}; - - public WidgetTimetableDataProvider(Context context, Intent intent) { - this.context = context; - this.appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); - - this.theme = getThemeAccent(context); - - this.colorValues = new Integer[]{R.color.filc, - R.color.blue_shade300, - R.color.green_shade300, - R.color.lime_shade300, - R.color.yellow_shade300, - R.color.orange_shade300, - R.color.red_shade300, - R.color.pink_shade300, - R.color.purple_shade300}; - - } - - @Override - public void onCreate() { - initData(); - } - - @Override - public void onDataSetChanged() { - initData(); - } - - @Override - public void onDestroy() { - - } - - @Override - public int getCount() { - - return day_subjects.size(); - } - - public void setLayout(final RemoteViews view) { - /* Visibilities */ - view.setViewVisibility(R.id.tt_item_num, witem.NumVisibility); - view.setViewVisibility(R.id.tt_item_name, witem.NameVisibility); - view.setViewVisibility(R.id.tt_item_name_nodesc, witem.NameNodescVisibility); - view.setViewVisibility(R.id.tt_item_desc, witem.DescVisibility); - view.setViewVisibility(R.id.tt_item_room, witem.RoomVisibility); - view.setViewVisibility(R.id.tt_item_time, witem.TimeVisibility); - - /* backgroundResources */ - view.setInt(R.id.main_lay, "setBackgroundResource", witem.Layout); - - /* Paddings */ - view.setViewPadding(R.id.tt_item_name_nodesc, witem.NameNodescPadding[0], witem.NameNodescPadding[1], witem.NameNodescPadding[2], witem.NameNodescPadding[3]); - - /* Text Colors */ - view.setInt(R.id.tt_item_num, "setTextColor", getColor(context, witem.NumColor)); - view.setInt(R.id.tt_item_name, "setTextColor", getColor(context, witem.NameColor)); - view.setInt(R.id.tt_item_name_nodesc, "setTextColor", getColor(context, witem.NameNodescColor)); - view.setInt(R.id.tt_item_desc, "setTextColor", getColor(context, witem.DescColor)); - } - - public int getColor(Context context, int color) { - return context.getResources().getColor(color); - } - - @Override - public RemoteViews getViewAt(int position) { - RemoteViews view = new RemoteViews(context.getPackageName(), R.layout.timetable_item); - - witem = defaultItem(theme); - - Lesson curr_subject = day_subjects.get(position); - - if (curr_subject.status.equals("empty")) { - witem.NumColor = R.color.text_miss_num; - - witem.TimeVisibility = View.GONE; - witem.RoomVisibility = View.GONE; - - witem.NameNodescColor = R.color.text_miss; - } - - if (!curr_subject.substituteTeacher.equals("null")) { - witem.NumColor = R.color.yellow; - witem.Layout = R.drawable.card_layout_tile_helyetesitett; - } - - if (curr_subject.status.equals("Elmaradt")) { - witem.NumColor = R.color.red; - witem.Layout = R.drawable.card_layout_tile_elmarad; - } else if (curr_subject.status.equals("TanevRendjeEsemeny")) { - witem.NumVisibility = View.GONE; - witem.TimeVisibility = View.GONE; - witem.RoomVisibility = View.GONE; - - witem.NameNodescPadding[0] = 50; - witem.NameNodescPadding[2] = 50; - - witem.NameNodescColor = R.color.text_miss; - } - - if (curr_subject.lessonTopic.equals("null")) { - witem.DescVisibility = View.GONE; - witem.NameVisibility = View.GONE; - - witem.NameNodescVisibility = View.VISIBLE; - } - - setLayout(view); - - String lessonIndexTrailing = curr_subject.lessonIndex.equals("+") ? "" : "."; - - view.setTextViewText(R.id.tt_item_num, curr_subject.lessonIndex + lessonIndexTrailing); - view.setTextViewText(R.id.tt_item_name, curr_subject.lessonName); - view.setTextViewText(R.id.tt_item_name_nodesc, curr_subject.lessonName); - view.setTextViewText(R.id.tt_item_desc, curr_subject.lessonTopic); - view.setTextViewText(R.id.tt_item_room, curr_subject.lessonRoom); - if(curr_subject.lessonStart != 0 && curr_subject.lessonEnd != 0) - view.setTextViewText(R.id.tt_item_time, WidgetTimetable.zeroPad(new DateTime(curr_subject.lessonStart).getHourOfDay(), 2) + ":" + WidgetTimetable.zeroPad(new DateTime(curr_subject.lessonStart).getMinuteOfHour(), 2) + - "\n" + WidgetTimetable.zeroPad(new DateTime(curr_subject.lessonEnd).getHourOfDay(), 2) + ":" + WidgetTimetable.zeroPad(new DateTime(curr_subject.lessonEnd).getMinuteOfHour(),2)); - - return view; - } - - @Override - public RemoteViews getLoadingView() { - return null; - } - - @Override - public int getViewTypeCount() { - return 1; - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public boolean hasStableIds() { - return true; - } - - private void initData() { - - theme = getThemeAccent(context); - - rday = WidgetTimetable.selectDay(context, appWidgetId, 0, false); - - day_subjects.clear(); - lessonIndexes.clear(); - - try { - List arr = WidgetTimetable.genJsonDays(context); - - if(arr.isEmpty()) { - return; - } - JSONArray arr_lessons = WidgetTimetable.genJsonDays(context).get(rday); - - for (int i = 0; i < arr_lessons.length(); i++) { - JSONObject obj_lessons = arr_lessons.getJSONObject(i); - - day_subjects.add(jsonToLesson(obj_lessons)); - } - } catch (JSONException e) { - e.printStackTrace(); - } - - if(day_subjects.size() > 0) { - Collections.sort(day_subjects, new Comparator() { - public int compare(Lesson o1, Lesson o2) { - return new DateTime(o1.lessonStart).compareTo(new DateTime(o2.lessonStart)); - } - }); - - for (int i = 0; i < day_subjects.size(); i++) { - if(!day_subjects.get(i).lessonIndex.equals("+")) { - lessonIndexes.add(Integer.valueOf(day_subjects.get(i).lessonIndex)); - } - } - - if(lessonIndexes.size() > 0) { - - int lessonsChecked = Collections.min(lessonIndexes); - int i = 0; - - while(lessonsChecked < Collections.max(lessonIndexes)) { - if(!lessonIndexes.contains(lessonsChecked)) { - day_subjects.add(i, emptyLesson(lessonsChecked)); - } - lessonsChecked++; - i++; - } - } - } - } - - public static Integer getThemeAccent(Context context) { - DBManager dbManager = new DBManager(context.getApplicationContext()); - - try { - dbManager.open(); - Cursor cursor = dbManager.fetchTheme(); - dbManager.close(); - - return cursor.getInt(1); - } catch (Exception e) { - e.printStackTrace(); - } - - return 0; - } - - public Item defaultItem(int theme) { - return new Item( - R.drawable.card_layout_tile, - View.VISIBLE, - View.VISIBLE, - View.INVISIBLE, - View.VISIBLE, - View.VISIBLE, - View.VISIBLE, - colorValues[theme >= colorValues.length ? 0 : theme], - R.color.text, - R.color.text, - R.color.text_desc - ); - } - - public Lesson emptyLesson(int lessonIndex) { - return new Lesson("empty", String.valueOf(lessonIndex), "Lyukasóra", "null", "null", 0, 0, "null"); - } - - public Lesson jsonToLesson(JSONObject json) { - try { - return new Lesson( - json.getJSONObject("Allapot").getString("Nev"), - !json.getString("Oraszam").equals("null") ? json.getString("Oraszam") : "+", - json.getString("Nev"), - json.getString("Tema"), - json.getString("TeremNeve"), - new DateTime(json.getString("KezdetIdopont")).getMillis(), - new DateTime(json.getString("VegIdopont")).getMillis(), - json.getString("HelyettesTanarNeve") - ); - }catch (Exception e) { - Log.d("Filc", "exception: " + e); - }; - - return null; - } +package hu.refilc.naplo.widget_timetable; + +import android.appwidget.AppWidgetManager; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.os.Build; +import android.util.Log; +import android.view.View; +import android.widget.RemoteViews; +import android.widget.RemoteViewsService; + +import org.joda.time.DateTime; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import hu.refilc.naplo.database.DBManager; +import hu.refilc.naplo.R; + +public class WidgetTimetableDataProvider implements RemoteViewsService.RemoteViewsFactory { + + private Context context; + private int appWidgetId; + + private int rday = 0; + + private int theme; + + private Integer[] colorValues; + + List day_subjects = new ArrayList<>(); + List lessonIndexes = new ArrayList<>(); + + Item witem; + + /* Default values */ + + static class Item { + int Layout; + + int NumVisibility; + int NameVisibility; + int NameNodescVisibility; + int DescVisibility; + int RoomVisibility; + int TimeVisibility; + + int NumColor; + int NameColor; + int NameNodescColor; + int DescColor; + + Integer[] NameNodescPadding = {0, 0, 0, 0}; + + public Item(int Layout, int NumVisibility,int NameVisibility,int NameNodescVisibility,int DescVisibility,int RoomVisibility,int TimeVisibility,int NumColor,int NameColor,int NameNodescColor,int DescColor) { + this.Layout = Layout; + this.NumVisibility = NumVisibility; + this.NameVisibility = NameVisibility; + this.NameNodescVisibility = NameNodescVisibility; + this.DescVisibility = DescVisibility; + this.RoomVisibility = RoomVisibility; + this.TimeVisibility = TimeVisibility; + + this.NumColor = NumColor; + this.NameColor = NameColor; + this.NameNodescColor = NameNodescColor; + this.DescColor = DescColor; + } + } + + static class Lesson { + String status; + String lessonIndex; + String lessonName; + String lessonTopic; + String lessonRoom; + long lessonStart; + long lessonEnd; + String substituteTeacher; + + public Lesson(String status, String lessonIndex,String lessonName,String lessonTopic, String lessonRoom,long lessonStart,long lessonEnd,String substituteTeacher) { + this.status = status; + this.lessonIndex = lessonIndex; + this.lessonName = lessonName; + this.lessonTopic = lessonTopic; + this.lessonRoom = lessonRoom; + this.lessonStart = lessonStart; + this.lessonEnd = lessonEnd; + this.substituteTeacher = substituteTeacher; + } + } + + Integer[] itemNameNodescPadding = {0, 0, 0, 0}; + + public WidgetTimetableDataProvider(Context context, Intent intent) { + this.context = context; + this.appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + + this.theme = getThemeAccent(context); + + this.colorValues = new Integer[]{R.color.filc, + R.color.blue_shade300, + R.color.green_shade300, + R.color.lime_shade300, + R.color.yellow_shade300, + R.color.orange_shade300, + R.color.red_shade300, + R.color.pink_shade300, + R.color.purple_shade300}; + + } + + @Override + public void onCreate() { + initData(); + } + + @Override + public void onDataSetChanged() { + initData(); + } + + @Override + public void onDestroy() { + + } + + @Override + public int getCount() { + + return day_subjects.size(); + } + + public void setLayout(final RemoteViews view) { + /* Visibilities */ + view.setViewVisibility(R.id.tt_item_num, witem.NumVisibility); + view.setViewVisibility(R.id.tt_item_name, witem.NameVisibility); + view.setViewVisibility(R.id.tt_item_name_nodesc, witem.NameNodescVisibility); + view.setViewVisibility(R.id.tt_item_desc, witem.DescVisibility); + view.setViewVisibility(R.id.tt_item_room, witem.RoomVisibility); + view.setViewVisibility(R.id.tt_item_time, witem.TimeVisibility); + + /* backgroundResources */ + view.setInt(R.id.main_lay, "setBackgroundResource", witem.Layout); + + /* Paddings */ + view.setViewPadding(R.id.tt_item_name_nodesc, witem.NameNodescPadding[0], witem.NameNodescPadding[1], witem.NameNodescPadding[2], witem.NameNodescPadding[3]); + + /* Text Colors */ + view.setInt(R.id.tt_item_num, "setTextColor", getColor(context, witem.NumColor)); + view.setInt(R.id.tt_item_name, "setTextColor", getColor(context, witem.NameColor)); + view.setInt(R.id.tt_item_name_nodesc, "setTextColor", getColor(context, witem.NameNodescColor)); + view.setInt(R.id.tt_item_desc, "setTextColor", getColor(context, witem.DescColor)); + } + + public int getColor(Context context, int color) { + return context.getResources().getColor(color); + } + + @Override + public RemoteViews getViewAt(int position) { + RemoteViews view = new RemoteViews(context.getPackageName(), R.layout.timetable_item); + + witem = defaultItem(theme); + + Lesson curr_subject = day_subjects.get(position); + + if (curr_subject.status.equals("empty")) { + witem.NumColor = R.color.text_miss_num; + + witem.TimeVisibility = View.GONE; + witem.RoomVisibility = View.GONE; + + witem.NameNodescColor = R.color.text_miss; + } + + if (!curr_subject.substituteTeacher.equals("null")) { + witem.NumColor = R.color.yellow; + witem.Layout = R.drawable.card_layout_tile_helyetesitett; + } + + if (curr_subject.status.equals("Elmaradt")) { + witem.NumColor = R.color.red; + witem.Layout = R.drawable.card_layout_tile_elmarad; + } else if (curr_subject.status.equals("TanevRendjeEsemeny")) { + witem.NumVisibility = View.GONE; + witem.TimeVisibility = View.GONE; + witem.RoomVisibility = View.GONE; + + witem.NameNodescPadding[0] = 50; + witem.NameNodescPadding[2] = 50; + + witem.NameNodescColor = R.color.text_miss; + } + + if (curr_subject.lessonTopic.equals("null")) { + witem.DescVisibility = View.GONE; + witem.NameVisibility = View.GONE; + + witem.NameNodescVisibility = View.VISIBLE; + } + + setLayout(view); + + String lessonIndexTrailing = curr_subject.lessonIndex.equals("+") ? "" : "."; + + view.setTextViewText(R.id.tt_item_num, curr_subject.lessonIndex + lessonIndexTrailing); + view.setTextViewText(R.id.tt_item_name, curr_subject.lessonName); + view.setTextViewText(R.id.tt_item_name_nodesc, curr_subject.lessonName); + view.setTextViewText(R.id.tt_item_desc, curr_subject.lessonTopic); + view.setTextViewText(R.id.tt_item_room, curr_subject.lessonRoom); + if(curr_subject.lessonStart != 0 && curr_subject.lessonEnd != 0) + view.setTextViewText(R.id.tt_item_time, WidgetTimetable.zeroPad(new DateTime(curr_subject.lessonStart).getHourOfDay(), 2) + ":" + WidgetTimetable.zeroPad(new DateTime(curr_subject.lessonStart).getMinuteOfHour(), 2) + + "\n" + WidgetTimetable.zeroPad(new DateTime(curr_subject.lessonEnd).getHourOfDay(), 2) + ":" + WidgetTimetable.zeroPad(new DateTime(curr_subject.lessonEnd).getMinuteOfHour(),2)); + + return view; + } + + @Override + public RemoteViews getLoadingView() { + return null; + } + + @Override + public int getViewTypeCount() { + return 1; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public boolean hasStableIds() { + return true; + } + + private void initData() { + + theme = getThemeAccent(context); + + rday = WidgetTimetable.selectDay(context, appWidgetId, 0, false); + + day_subjects.clear(); + lessonIndexes.clear(); + + try { + List arr = WidgetTimetable.genJsonDays(context); + + if(arr.isEmpty()) { + return; + } + JSONArray arr_lessons = WidgetTimetable.genJsonDays(context).get(rday); + + for (int i = 0; i < arr_lessons.length(); i++) { + JSONObject obj_lessons = arr_lessons.getJSONObject(i); + + day_subjects.add(jsonToLesson(obj_lessons)); + } + } catch (JSONException e) { + e.printStackTrace(); + } + + if(day_subjects.size() > 0) { + Collections.sort(day_subjects, new Comparator() { + public int compare(Lesson o1, Lesson o2) { + return new DateTime(o1.lessonStart).compareTo(new DateTime(o2.lessonStart)); + } + }); + + for (int i = 0; i < day_subjects.size(); i++) { + if(!day_subjects.get(i).lessonIndex.equals("+")) { + lessonIndexes.add(Integer.valueOf(day_subjects.get(i).lessonIndex)); + } + } + + if(lessonIndexes.size() > 0) { + + int lessonsChecked = Collections.min(lessonIndexes); + int i = 0; + + while(lessonsChecked < Collections.max(lessonIndexes)) { + if(!lessonIndexes.contains(lessonsChecked)) { + day_subjects.add(i, emptyLesson(lessonsChecked)); + } + lessonsChecked++; + i++; + } + } + } + } + + public static Integer getThemeAccent(Context context) { + DBManager dbManager = new DBManager(context.getApplicationContext()); + + try { + dbManager.open(); + Cursor cursor = dbManager.fetchTheme(); + dbManager.close(); + + return cursor.getInt(1); + } catch (Exception e) { + e.printStackTrace(); + } + + return 0; + } + + public Item defaultItem(int theme) { + return new Item( + R.drawable.card_layout_tile, + View.VISIBLE, + View.VISIBLE, + View.INVISIBLE, + View.VISIBLE, + View.VISIBLE, + View.VISIBLE, + colorValues[theme >= colorValues.length ? 0 : theme], + R.color.text, + R.color.text, + R.color.text_desc + ); + } + + public Lesson emptyLesson(int lessonIndex) { + return new Lesson("empty", String.valueOf(lessonIndex), "Lyukasóra", "null", "null", 0, 0, "null"); + } + + public Lesson jsonToLesson(JSONObject json) { + try { + return new Lesson( + json.getJSONObject("Allapot").getString("Nev"), + !json.getString("Oraszam").equals("null") ? json.getString("Oraszam") : "+", + json.getString("Nev"), + json.getString("Tema"), + json.getString("TeremNeve"), + new DateTime(json.getString("KezdetIdopont")).getMillis(), + new DateTime(json.getString("VegIdopont")).getMillis(), + json.getString("HelyettesTanarNeve") + ); + }catch (Exception e) { + Log.d("Filc", "exception: " + e); + }; + + return null; + } } \ No newline at end of file diff --git a/filcnaplo_premium/android/widget_timetable/WidgetTimetableService.java b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetableService.java similarity index 96% rename from filcnaplo_premium/android/widget_timetable/WidgetTimetableService.java rename to filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetableService.java index 01a5f90..1864174 100644 --- a/filcnaplo_premium/android/widget_timetable/WidgetTimetableService.java +++ b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetableService.java @@ -1,12 +1,12 @@ -package hu.refilc.naplo.widget_timetable; - -import android.content.Intent; -import android.os.Build; -import android.widget.RemoteViewsService; - -public class WidgetTimetableService extends RemoteViewsService { - @Override - public RemoteViewsFactory onGetViewFactory(Intent intent) { - return new WidgetTimetableDataProvider(getApplicationContext(), intent); - } -} +package hu.refilc.naplo.widget_timetable; + +import android.content.Intent; +import android.os.Build; +import android.widget.RemoteViewsService; + +public class WidgetTimetableService extends RemoteViewsService { + @Override + public RemoteViewsFactory onGetViewFactory(Intent intent) { + return new WidgetTimetableDataProvider(getApplicationContext(), intent); + } +} \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/res/layout/timetable_item.xml b/filcnaplo/android/app/src/main/res/layout/timetable_item.xml index 6b2a7f8..aa23af8 100644 --- a/filcnaplo/android/app/src/main/res/layout/timetable_item.xml +++ b/filcnaplo/android/app/src/main/res/layout/timetable_item.xml @@ -1,5 +1,6 @@ + tools:ignore="HardcodedText" /> + android:layout_toEndOf="@id/tt_item_num" + android:textColor="@color/text" + tools:ignore="HardcodedText" /> + android:layout_toEndOf="@id/tt_item_num" + android:textColor="@color/text" + tools:ignore="HardcodedText" /> + android:textColor="@color/text_desc" + tools:ignore="HardcodedText" /> + android:layout_toStartOf="@id/tt_item_time" + android:textColor="@color/text_desc" + tools:ignore="HardcodedText" /> + android:layout_alignParentEnd="true" + android:textColor="@color/white" + tools:ignore="HardcodedText" /> \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/res/layout/widget_timetable.xml b/filcnaplo/android/app/src/main/res/layout/widget_timetable.xml index e10fda1..69b80b0 100644 --- a/filcnaplo/android/app/src/main/res/layout/widget_timetable.xml +++ b/filcnaplo/android/app/src/main/res/layout/widget_timetable.xml @@ -19,10 +19,12 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" - android:text="Empty" + android:text="Üres / Empty" + android:background="@drawable/widget_card_bottom_dark" android:textColor="@color/text" android:textSize="20sp" - android:textStyle="bold" /> + android:textStyle="bold" + tools:ignore="HardcodedText" /> + + android:focusable="true" /> + android:focusable="true" /> + android:focusable="true" /> + android:textSize="22sp" + android:textStyle="bold" + tools:ignore="HardcodedText" /> @@ -131,8 +139,9 @@ android:text="A widget használatához, bejelentkezés szükséges." android:textColor="@color/black" android:paddingTop="10dp" - android:textSize="17dp" - android:textStyle="bold" /> + android:textSize="17sp" + android:textStyle="bold" + tools:ignore="HardcodedText" />