From 6dc0168ec4431198886f8cbbad08ac62386545ea Mon Sep 17 00:00:00 2001 From: 55nknown Date: Mon, 23 Jan 2023 15:03:43 +0100 Subject: [PATCH] filcnaplo --- filcnaplo/lib/api/client.dart | 2 +- filcnaplo/lib/api/providers/live_card_provider.dart | 3 +-- filcnaplo/lib/database/init.dart | 3 ++- filcnaplo/lib/database/query.dart | 12 ++++++++---- filcnaplo/lib/database/store.dart | 9 +++++++-- filcnaplo/lib/helpers/update_helper.dart | 2 ++ filcnaplo/lib/models/settings.dart | 9 +++++++++ filcnaplo/lib/models/supporter.dart | 9 ++++++--- filcnaplo/lib/ui/filter/widgets.dart | 5 +++-- filcnaplo/lib/utils/reverse_search.dart | 5 +++-- filcnaplo/pubspec.yaml | 3 ++- filcnaplo_desktop_ui | 2 +- filcnaplo_kreta_api | 2 +- filcnaplo_mobile_ui | 2 +- filcnaplo_premium | 2 +- 15 files changed, 48 insertions(+), 22 deletions(-) diff --git a/filcnaplo/lib/api/client.dart b/filcnaplo/lib/api/client.dart index a45cb6c..bbb7800 100644 --- a/filcnaplo/lib/api/client.dart +++ b/filcnaplo/lib/api/client.dart @@ -20,7 +20,7 @@ class FilcAPI { static const config = "https://api.filcnaplo.hu/config"; static const reportApi = "https://api.filcnaplo.hu/report"; static const premiumApi = "https://api.filcnaplo.hu/premium/activate"; - static const premiumScopesApi = "https://api.filcnaplo.hu/premium/scopes"; + // static const premiumScopesApi = "https://api.filcnaplo.hu/premium/scopes"; // Updates static const repo = "filc/naplo"; diff --git a/filcnaplo/lib/api/providers/live_card_provider.dart b/filcnaplo/lib/api/providers/live_card_provider.dart index 2d76b2f..02b96f0 100644 --- a/filcnaplo/lib/api/providers/live_card_provider.dart +++ b/filcnaplo/lib/api/providers/live_card_provider.dart @@ -38,7 +38,6 @@ class LiveCardProvider extends ChangeNotifier { _settings = settings { _liveActivitiesPlugin.init(appGroupId: "group.filcnaplo.livecard"); _timer = Timer.periodic(const Duration(seconds: 1), (timer) => update()); - timetable.restore().then((_) => update()); _delay = settings.bellDelayEnabled ? Duration(seconds: settings.bellDelay) : Duration.zero; } @@ -196,5 +195,5 @@ class LiveCardProvider extends ChangeNotifier { bool _sameDate(DateTime a, DateTime b) => (a.year == b.year && a.month == b.month && a.day == b.day); - List _today(TimetableProvider p) => p.lessons.where((l) => _sameDate(l.date, _now())).toList(); + List _today(TimetableProvider p) => (p.getWeek(Week.current()) ?? []).where((l) => _sameDate(l.date, _now())).toList(); } diff --git a/filcnaplo/lib/database/init.dart b/filcnaplo/lib/database/init.dart index 63f8078..63f91f2 100644 --- a/filcnaplo/lib/database/init.dart +++ b/filcnaplo/lib/database/init.dart @@ -16,7 +16,8 @@ const settingsDB = DatabaseStruct("settings", { "vibration_strength": int, "ab_weeks": int, "swap_ab_weeks": int, "notifications": int, "notifications_bitfield": int, "notification_poll_interval": int, // notifications "x_filc_id": String, "graph_class_avg": int, "presentation_mode": int, "bell_delay": int, "bell_delay_enabled": int, - "grade_opening_fun": int, "icon_pack": String, "premium_scopes": String, "premium_token": String, "last_account_id": String, "renamed_subjects_enabled": int, + "grade_opening_fun": int, "icon_pack": String, "premium_scopes": String, "premium_token": String, "premium_login": String, + "last_account_id": String, "renamed_subjects_enabled": int, }); // DON'T FORGET TO UPDATE DEFAULT VALUES IN `initDB` MIGRATION OR ELSE PARENTS WILL COMPLAIN ABOUT THEIR CHILDREN MISSING // YOU'VE BEEN WARNED!!! diff --git a/filcnaplo/lib/database/query.dart b/filcnaplo/lib/database/query.dart index 20dabb9..ce7d615 100644 --- a/filcnaplo/lib/database/query.dart +++ b/filcnaplo/lib/database/query.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:filcnaplo/api/providers/database_provider.dart'; import 'package:filcnaplo/models/subject_lesson_count.dart'; import 'package:filcnaplo/models/user.dart'; +import 'package:filcnaplo_kreta_api/models/week.dart'; // ignore: depend_on_referenced_packages import 'package:sqflite_common/sqlite_api.dart'; @@ -61,12 +62,15 @@ class UserDatabaseQuery { return grades; } - Future> getLessons({required String userId}) async { + Future>> getLessons({required String userId}) async { List userData = await db.query("user_data", where: "id = ?", whereArgs: [userId]); - if (userData.isEmpty) return []; + if (userData.isEmpty) return {}; String? lessonsJson = userData.elementAt(0)["timetable"] as String?; - if (lessonsJson == null) return []; - List lessons = (jsonDecode(lessonsJson) as List).map((e) => Lesson.fromJson(e)).toList(); + if (lessonsJson == null) return {}; + if (jsonDecode(lessonsJson) is List) return {}; + Map> lessons = (jsonDecode(lessonsJson) as Map).cast().map((key, value) { + return MapEntry(Week.fromId(int.parse(key)), value.cast>().map((e) => Lesson.fromJson(e)).toList()); + }).cast(); return lessons; } diff --git a/filcnaplo/lib/database/store.dart b/filcnaplo/lib/database/store.dart index e97c369..6c57ba7 100644 --- a/filcnaplo/lib/database/store.dart +++ b/filcnaplo/lib/database/store.dart @@ -1,5 +1,7 @@ import 'dart:convert'; +import 'dart:developer'; import 'package:filcnaplo/models/subject_lesson_count.dart'; +import 'package:filcnaplo_kreta_api/models/week.dart'; // ignore: depend_on_referenced_packages import 'package:sqflite_common/sqlite_api.dart'; @@ -51,8 +53,11 @@ class UserDatabaseStore { await db.update("user_data", {"grades": gradesJson}, where: "id = ?", whereArgs: [userId]); } - Future storeLessons(List lessons, {required String userId}) async { - String lessonsJson = jsonEncode(lessons.map((e) => e.json).toList()); + Future storeLessons(Map?> lessons, {required String userId}) async { + final map = lessons.map>>( + (k, v) => MapEntry(k.id.toString(), v!.where((e) => e.json != null).map((e) => e.json!).toList().cast()), + ); + String lessonsJson = jsonEncode(map); await db.update("user_data", {"timetable": lessonsJson}, where: "id = ?", whereArgs: [userId]); } diff --git a/filcnaplo/lib/helpers/update_helper.dart b/filcnaplo/lib/helpers/update_helper.dart index 5c78a08..ef35e3a 100644 --- a/filcnaplo/lib/helpers/update_helper.dart +++ b/filcnaplo/lib/helpers/update_helper.dart @@ -8,8 +8,10 @@ import 'package:filcnaplo/models/release.dart'; import 'package:open_file/open_file.dart'; enum UpdateState { none, preparing, downloading, installing } + typedef UpdateCallback = Function(double progress, UpdateState state); +// ignore: todo // TODO: cleanup old apk files extension UpdateHelper on Release { diff --git a/filcnaplo/lib/models/settings.dart b/filcnaplo/lib/models/settings.dart index 66b8f2c..a92ea9e 100644 --- a/filcnaplo/lib/models/settings.dart +++ b/filcnaplo/lib/models/settings.dart @@ -64,6 +64,7 @@ class SettingsProvider extends ChangeNotifier { Color _customHighlightColor; List _premiumScopes; String _premiumAccessToken; + String _premiumLogin; String _lastAccountId; bool _renamedSubjectsEnabled; @@ -99,6 +100,7 @@ class SettingsProvider extends ChangeNotifier { required Color customHighlightColor, required List premiumScopes, required String premiumAccessToken, + required String premiumLogin, required String lastAccountId, required bool renameSubjectsEnabled, }) : _database = database, @@ -132,6 +134,7 @@ class SettingsProvider extends ChangeNotifier { _customHighlightColor = customHighlightColor, _premiumScopes = premiumScopes, _premiumAccessToken = premiumAccessToken, + _premiumLogin = premiumLogin, _lastAccountId = lastAccountId, _renamedSubjectsEnabled = renameSubjectsEnabled; @@ -182,6 +185,7 @@ class SettingsProvider extends ChangeNotifier { customHighlightColor: Color(map["custom_highlight_color"]), premiumScopes: jsonDecode(map["premium_scopes"]).cast(), premiumAccessToken: map["premium_token"], + premiumLogin: map["premium_login"], lastAccountId: map["last_account_id"], renameSubjectsEnabled: map["renamed_subjects_enabled"] == 1, ); @@ -222,6 +226,7 @@ class SettingsProvider extends ChangeNotifier { "custom_highlight_color": _customHighlightColor.value, "premium_scopes": jsonEncode(_premiumScopes), "premium_token": _premiumAccessToken, + "premium_login": _premiumLogin, "last_account_id": _lastAccountId, "renamed_subjects_enabled": _renamedSubjectsEnabled ? 1 : 0 }; @@ -266,6 +271,7 @@ class SettingsProvider extends ChangeNotifier { customHighlightColor: const Color(0xff222222), premiumScopes: [], premiumAccessToken: "", + premiumLogin: "", lastAccountId: "", renameSubjectsEnabled: false, ); @@ -302,6 +308,7 @@ class SettingsProvider extends ChangeNotifier { Color? get customHighlightColor => _customHighlightColor; List get premiumScopes => _premiumScopes; String get premiumAccessToken => _premiumAccessToken; + String get premiumLogin => _premiumLogin; String get lastAccountId => _lastAccountId; bool get renamedSubjectsEnabled => _renamedSubjectsEnabled; @@ -337,6 +344,7 @@ class SettingsProvider extends ChangeNotifier { Color? customHighlightColor, List? premiumScopes, String? premiumAccessToken, + String? premiumLogin, String? lastAccountId, bool? renamedSubjectsEnabled, }) async { @@ -372,6 +380,7 @@ class SettingsProvider extends ChangeNotifier { if (customHighlightColor != null && customHighlightColor != _customHighlightColor) _customHighlightColor = customHighlightColor; if (premiumScopes != null && premiumScopes != _premiumScopes) _premiumScopes = premiumScopes; if (premiumAccessToken != null && premiumAccessToken != _premiumAccessToken) _premiumAccessToken = premiumAccessToken; + if (premiumLogin != null && premiumLogin != _premiumLogin) _premiumLogin = premiumLogin; if (lastAccountId != null && lastAccountId != _lastAccountId) _lastAccountId = lastAccountId; if (renamedSubjectsEnabled != null && renamedSubjectsEnabled != _renamedSubjectsEnabled) _renamedSubjectsEnabled = renamedSubjectsEnabled; diff --git a/filcnaplo/lib/models/supporter.dart b/filcnaplo/lib/models/supporter.dart index 968313f..ef5eced 100644 --- a/filcnaplo/lib/models/supporter.dart +++ b/filcnaplo/lib/models/supporter.dart @@ -9,9 +9,9 @@ class Supporter { const Supporter({required this.avatar, required this.name, this.comment = "", this.price = 0, this.type = DonationType.once}); - factory Supporter.fromJson(Map json) { + factory Supporter.fromJson(Map json, {String? avatarPattern}) { return Supporter( - avatar: json["avatar"] ?? "", + avatar: json["avatar"] ?? avatarPattern != null ? avatarPattern!.replaceFirst("\$", json["name"]) : "", name: json["name"] ?? "Unknown", comment: json["comment"] ?? "", price: json["price"].toInt() ?? 0, @@ -40,7 +40,10 @@ class Supporters { progress: json["percentage"].toDouble() ?? 100.0, max: json["target"].toDouble() ?? 1.0, description: json["description"] ?? "", - github: json["sponsors"]["github"].map((e) => Supporter.fromJson(e)).cast().toList(), + github: json["sponsors"]["github"] + .map((e) => Supporter.fromJson(e, avatarPattern: "https://github.com/\$.png?size=200")) + .cast() + .toList(), patreon: json["sponsors"]["patreon"].map((e) => Supporter.fromJson(e)).cast().toList(), ); } diff --git a/filcnaplo/lib/ui/filter/widgets.dart b/filcnaplo/lib/ui/filter/widgets.dart index cc38f9c..75d816d 100644 --- a/filcnaplo/lib/ui/filter/widgets.dart +++ b/filcnaplo/lib/ui/filter/widgets.dart @@ -12,6 +12,7 @@ import 'package:filcnaplo/ui/filter/widgets/events.dart' as event_filter; import 'package:filcnaplo/ui/filter/widgets/lessons.dart' as lesson_filter; import 'package:filcnaplo/ui/filter/widgets/update.dart' as update_filter; import 'package:filcnaplo/ui/filter/widgets/missed_exams.dart' as missed_exam_filter; +import 'package:filcnaplo_kreta_api/models/week.dart'; import 'package:filcnaplo_kreta_api/providers/absence_provider.dart'; import 'package:filcnaplo_kreta_api/providers/event_provider.dart'; import 'package:filcnaplo_kreta_api/providers/exam_provider.dart'; @@ -117,7 +118,7 @@ Future> getFilterWidgets(FilterType activeData, {bool absencesN // Changed Lessons case FilterType.lessons: - items = lesson_filter.getWidgets(timetableProvider.lessons); + items = lesson_filter.getWidgets(timetableProvider.getWeek(Week.current()) ?? []); break; // Updates @@ -127,7 +128,7 @@ Future> getFilterWidgets(FilterType activeData, {bool absencesN // Missed Exams case FilterType.missedExams: - items = missed_exam_filter.getWidgets(timetableProvider.lessons); + items = missed_exam_filter.getWidgets(timetableProvider.getWeek(Week.current()) ?? []); break; } return items; diff --git a/filcnaplo/lib/utils/reverse_search.dart b/filcnaplo/lib/utils/reverse_search.dart index 2bdb67e..c611d55 100644 --- a/filcnaplo/lib/utils/reverse_search.dart +++ b/filcnaplo/lib/utils/reverse_search.dart @@ -12,12 +12,13 @@ class ReverseSearch { final timetableProvider = Provider.of(context, listen: false); List lessons = []; + final week = Week.fromDate(absence.date); try { - await timetableProvider.fetch(week: Week.fromDate(absence.date), db: false); + await timetableProvider.fetch(week: week); } catch (e) { log("[ERROR] getLessonByAbsence: $e"); } - lessons = timetableProvider.lessons; + lessons = timetableProvider.getWeek(week) ?? []; // Find absence lesson in timetable Lesson lesson = lessons.firstWhere( diff --git a/filcnaplo/pubspec.yaml b/filcnaplo/pubspec.yaml index 835dff5..0278746 100644 --- a/filcnaplo/pubspec.yaml +++ b/filcnaplo/pubspec.yaml @@ -3,7 +3,7 @@ description: "Nem hivatalos e-napló alkalmazás az e-Kréta rendszerhez" homepage: https://filcnaplo.hu publish_to: "none" -version: 3.5.0-beta.3+179 +version: 3.5.0-beta.4+181 environment: sdk: ">=2.17.0 <3.0.0" @@ -65,6 +65,7 @@ dependencies: flutter_svg: ^1.1.6 image_picker: ^0.8.6 image_crop: ^0.4.1 + animations: ^2.0.1 dev_dependencies: flutter_lints: ^2.0.1 diff --git a/filcnaplo_desktop_ui b/filcnaplo_desktop_ui index 2942cba..bfd4487 160000 --- a/filcnaplo_desktop_ui +++ b/filcnaplo_desktop_ui @@ -1 +1 @@ -Subproject commit 2942cba9ee001cf968dd5475121519928eb0e83f +Subproject commit bfd448792ab26d103bfd67d128652cc4261b021a diff --git a/filcnaplo_kreta_api b/filcnaplo_kreta_api index f4c669a..e6e67fd 160000 --- a/filcnaplo_kreta_api +++ b/filcnaplo_kreta_api @@ -1 +1 @@ -Subproject commit f4c669a1ec2a8f49f97aacdfafa154650d62558d +Subproject commit e6e67fdce0ec798b8bec045a9978d7b0bf5ff362 diff --git a/filcnaplo_mobile_ui b/filcnaplo_mobile_ui index ebcb60b..9f1bcbd 160000 --- a/filcnaplo_mobile_ui +++ b/filcnaplo_mobile_ui @@ -1 +1 @@ -Subproject commit ebcb60b416c57412a8339827a8cf57ff8df518fc +Subproject commit 9f1bcbdcf451018113d239d3c0444fe29d1b005a diff --git a/filcnaplo_premium b/filcnaplo_premium index d814295..f06c4c0 160000 --- a/filcnaplo_premium +++ b/filcnaplo_premium @@ -1 +1 @@ -Subproject commit d814295464ae9bbdaf9e3566b73430a7f84958d9 +Subproject commit f06c4c03fcd8aec5c83ff2d322d2185123cc2d23