From 9cfa8296b8c3871eb591923cb7a9dc5c687ce405 Mon Sep 17 00:00:00 2001 From: Kima Date: Sat, 10 Jun 2023 22:38:01 +0200 Subject: [PATCH 01/99] fixed some bugs --- filcnaplo/ios/Podfile.lock | 6 +- filcnaplo/lib/api/client.dart | 5 +- filcnaplo/lib/api/login.dart | 7 +- .../lib/api/providers/database_provider.dart | 1 - .../lib/api/providers/live_card_provider.dart | 4 +- filcnaplo/lib/database/init.dart | 46 +++-- filcnaplo/lib/main.dart | 4 +- filcnaplo/lib/models/settings.dart | 66 +++++--- filcnaplo/lib/theme/colors/dark_mobile.dart | 1 + .../flutter/generated_plugin_registrant.cc | 4 - .../linux/flutter/generated_plugins.cmake | 1 - .../Flutter/GeneratedPluginRegistrant.swift | 2 - .../screens/navigation/navigation_screen.dart | 34 +++- .../lib/providers/grade_provider.dart | 12 +- .../lib/providers/timetable_provider.dart | 13 +- .../widgets/message/message_view_tile.dart | 15 +- .../lib/pages/home/live_card/live_card.dart | 102 ++++++++--- .../lib/premium/premium_button.dart | 31 ++-- .../lib/premium/premium_screen.dart | 159 ++++++++++++------ .../screens/navigation/navigation_screen.dart | 17 +- .../lib/screens/settings/settings_helper.dart | 3 +- .../lib/screens/settings/settings_screen.dart | 49 +++--- .../screens/summary/pages/grades_page.dart | 2 +- .../summary/pages/personality_page.dart | 2 +- .../activation_view/activation_dashboard.dart | 61 ++++--- .../mobile/settings/modify_subject_names.dart | 122 ++++++++++---- 26 files changed, 517 insertions(+), 252 deletions(-) diff --git a/filcnaplo/ios/Podfile.lock b/filcnaplo/ios/Podfile.lock index 296d39d1..96380846 100644 --- a/filcnaplo/ios/Podfile.lock +++ b/filcnaplo/ios/Podfile.lock @@ -204,7 +204,7 @@ SPEC CHECKSUMS: connectivity_plus: 07c49e96d7fc92bc9920617b83238c4d178b446a DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 - file_picker: 817ab1d8cd2da9d2da412a417162deee3500fc95 + file_picker: ce3938a0df3cc1ef404671531facef740d03f920 Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 flutter_custom_tabs: 7a10a08686955cb748e5d26e0ae586d30689bf89 flutter_image_compress: 5a5e9aee05b6553048b8df1c3bc456d0afaac433 @@ -218,14 +218,14 @@ SPEC CHECKSUMS: live_activities: 9ff56a06a2d43ecd68f56deeed13b18a8304789c Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d open_file: 02eb5cb6b21264bd3a696876f5afbfb7ca4f4b7d - package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e + package_info_plus: fd030dabf36271f146f1f3beacd48f564b0f17f7 path_provider_foundation: eaf5b3e458fc0e5fbb9940fb09980e853fe058b8 permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce quick_actions_ios: 9e80dcfadfbc5d47d9cf8f47bcf428b11cf383d4 ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 SDWebImage: 72f86271a6f3139cc7e4a89220946489d4b9a866 SDWebImageWebPCoder: 18503de6621dd2c420d680e33d46bf8e1d5169b0 - share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68 + share_plus: 599aa54e4ea31d4b4c0e9c911bcc26c55e791028 sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a SwiftyGif: 6c3eafd0ce693cad58bb63d2b2fb9bacb8552780 uni_links: d97da20c7701486ba192624d99bffaaffcfc298a diff --git a/filcnaplo/lib/api/client.dart b/filcnaplo/lib/api/client.dart index c2cec50b..a0985487 100644 --- a/filcnaplo/lib/api/client.dart +++ b/filcnaplo/lib/api/client.dart @@ -7,6 +7,7 @@ import 'package:filcnaplo/models/release.dart'; import 'package:filcnaplo/models/settings.dart'; import 'package:filcnaplo/models/supporter.dart'; import 'package:filcnaplo_kreta_api/models/school.dart'; +import 'package:flutter/foundation.dart'; import 'package:http/http.dart' as http; import 'package:connectivity_plus/connectivity_plus.dart'; @@ -68,7 +69,9 @@ class FilcAPI { http.Response res = await http.get(Uri.parse(config), headers: headers); if (res.statusCode == 200) { - print(jsonDecode(res.body)); + if (kDebugMode) { + print(jsonDecode(res.body)); + } return Config.fromJson(jsonDecode(res.body)); } else if (res.statusCode == 429) { res = await http.get(Uri.parse(config)); diff --git a/filcnaplo/lib/api/login.dart b/filcnaplo/lib/api/login.dart index 3a385542..0e2df02a 100644 --- a/filcnaplo/lib/api/login.dart +++ b/filcnaplo/lib/api/login.dart @@ -57,14 +57,15 @@ Future loginApi({ String nonceStr = await Provider.of(context, listen: false) .getAPI(KretaAPI.nonce, json: false); - Nonce nonce = getNonce(nonceStr, username.replaceAll(' ', '') + ' ', instituteCode); + Nonce nonce = + getNonce(nonceStr, '${username.replaceAll(' ', '')} ', instituteCode); headers.addAll(nonce.header()); Map? res = await Provider.of(context, listen: false) .postAPI(KretaAPI.login, headers: headers, body: User.loginBody( - username: username.replaceAll(' ', '') + ' ', + username: '${username.replaceAll(' ', '')} ', password: password, instituteCode: instituteCode, )); @@ -83,7 +84,7 @@ Future loginApi({ .getAPI(KretaAPI.student(instituteCode)); Student student = Student.fromJson(studentJson!); var user = User( - username: username.replaceAll(' ', '') + ' ', + username: '${username.replaceAll(' ', '')} ', password: password, instituteCode: instituteCode, name: student.name, diff --git a/filcnaplo/lib/api/providers/database_provider.dart b/filcnaplo/lib/api/providers/database_provider.dart index e338f576..37bede35 100644 --- a/filcnaplo/lib/api/providers/database_provider.dart +++ b/filcnaplo/lib/api/providers/database_provider.dart @@ -2,7 +2,6 @@ import 'dart:io'; import 'package:filcnaplo/database/query.dart'; import 'package:filcnaplo/database/store.dart'; -import 'package:sqflite/sqflite.dart'; // ignore: depend_on_referenced_packages import 'package:sqflite_common_ffi/sqflite_ffi.dart'; diff --git a/filcnaplo/lib/api/providers/live_card_provider.dart b/filcnaplo/lib/api/providers/live_card_provider.dart index f2b80969..96a3bf2d 100644 --- a/filcnaplo/lib/api/providers/live_card_provider.dart +++ b/filcnaplo/lib/api/providers/live_card_provider.dart @@ -47,7 +47,9 @@ class LiveCardProvider extends ChangeNotifier { // Check if live card is enabled .areActivitiesEnabled() _liveActivitiesPlugin.areActivitiesEnabled().then((value) { // Console log - print("Live card enabled: $value"); + if (kDebugMode) { + print("Live card enabled: $value"); + } if (value) { _liveActivitiesPlugin.init(appGroupId: "group.refilc.livecard"); diff --git a/filcnaplo/lib/database/init.dart b/filcnaplo/lib/database/init.dart index 5218f521..a31c6a66 100644 --- a/filcnaplo/lib/database/init.dart +++ b/filcnaplo/lib/database/init.dart @@ -5,28 +5,36 @@ import 'dart:io'; import 'package:filcnaplo/api/providers/database_provider.dart'; import 'package:filcnaplo/database/struct.dart'; import 'package:filcnaplo/models/settings.dart'; -import 'package:sqflite/sqflite.dart'; // ignore: depend_on_referenced_packages import 'package:sqflite_common_ffi/sqflite_ffi.dart'; const settingsDB = DatabaseStruct("settings", { - "language": String, "start_page": int, "rounding": int, "theme": int, "accent_color": int, "news": int, "news_state": int, "developer_mode": int, - "update_channel": int, "config": String, "custom_accent_color": int, "custom_background_color": int, "custom_highlight_color": int, // general - "grade_color1": int, "grade_color2": int, "grade_color3": int, "grade_color4": int, "grade_color5": int, // grade colors + "language": String, "start_page": int, "rounding": int, "theme": int, + "accent_color": int, "news": int, "news_state": int, "developer_mode": int, + "update_channel": int, "config": String, "custom_accent_color": int, + "custom_background_color": int, "custom_highlight_color": int, // general + "grade_color1": int, "grade_color2": int, "grade_color3": int, + "grade_color4": int, "grade_color5": int, // grade colors "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, "premium_login": String, - "last_account_id": String, "renamed_subjects_enabled": int, "renamed_subjects_italics":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, "premium_login": String, + "last_account_id": String, "renamed_subjects_enabled": int, + "renamed_subjects_italics": int, }); // DON'T FORGET TO UPDATE DEFAULT VALUES IN `initDB` MIGRATION OR ELSE PARENTS WILL COMPLAIN ABOUT THEIR CHILDREN MISSING // YOU'VE BEEN WARNED!!! const usersDB = DatabaseStruct("users", { - "id": String, "name": String, "username": String, "password": String, "institute_code": String, "student": String, "role": int, + "id": String, "name": String, "username": String, "password": String, + "institute_code": String, "student": String, "role": int, "nickname": String, "picture": String // premium only }); const userDataDB = DatabaseStruct("user_data", { - "id": String, "grades": String, "timetable": String, "exams": String, "homework": String, "messages": String, "notes": String, + "id": String, "grades": String, "timetable": String, "exams": String, + "homework": String, "messages": String, "notes": String, "events": String, "absences": String, "group_averages": String, // renamed subjects // non kreta data "renamed_subjects": String, @@ -34,7 +42,8 @@ const userDataDB = DatabaseStruct("user_data", { "last_seen_grade": int, }); -Future createTable(Database db, DatabaseStruct struct) => db.execute("CREATE TABLE IF NOT EXISTS ${struct.table} ($struct)"); +Future createTable(Database db, DatabaseStruct struct) => + db.execute("CREATE TABLE IF NOT EXISTS ${struct.table} ($struct)"); Future initDB(DatabaseProvider database) async { Database db; @@ -50,9 +59,11 @@ Future initDB(DatabaseProvider database) async { await createTable(db, usersDB); await createTable(db, userDataDB); - if ((await db.rawQuery("SELECT COUNT(*) FROM settings"))[0].values.first == 0) { + if ((await db.rawQuery("SELECT COUNT(*) FROM settings"))[0].values.first == + 0) { // Set default values for table Settings - await db.insert("settings", SettingsProvider.defaultSettings(database: database).toMap()); + await db.insert("settings", + SettingsProvider.defaultSettings(database: database).toMap()); } // Migrate Databases @@ -60,7 +71,8 @@ Future initDB(DatabaseProvider database) async { await migrateDB( db, struct: settingsDB, - defaultValues: SettingsProvider.defaultSettings(database: database).toMap(), + defaultValues: + SettingsProvider.defaultSettings(database: database).toMap(), ); await migrateDB( db, @@ -68,7 +80,8 @@ Future initDB(DatabaseProvider database) async { defaultValues: {"role": 0, "nickname": "", "picture": ""}, ); await migrateDB(db, struct: userDataDB, defaultValues: { - "grades": "[]", "timetable": "[]", "exams": "[]", "homework": "[]", "messages": "[]", "notes": "[]", "events": "[]", "absences": "[]", + "grades": "[]", "timetable": "[]", "exams": "[]", "homework": "[]", + "messages": "[]", "notes": "[]", "events": "[]", "absences": "[]", "group_averages": "[]", // renamed subjects // non kreta data "renamed_subjects": "{}", @@ -99,7 +112,8 @@ Future migrateDB( // go through each row and add missing keys or delete non existing keys await Future.forEach>(originalRows, (original) async { - bool migrationRequired = struct.struct.keys.any((key) => !original.containsKey(key) || original[key] == null) || + bool migrationRequired = struct.struct.keys.any( + (key) => !original.containsKey(key) || original[key] == null) || original.keys.any((key) => !struct.struct.containsKey(key)); if (migrationRequired) { diff --git a/filcnaplo/lib/main.dart b/filcnaplo/lib/main.dart index 70323131..8cbfb9e5 100644 --- a/filcnaplo/lib/main.dart +++ b/filcnaplo/lib/main.dart @@ -74,6 +74,8 @@ Widget errorBuilder(FlutterErrorDetails details) { @pragma('vm:entry-point') void backgroundHeadlessTask(HeadlessTask task) { - print('[BackgroundFetch] Headless event received.'); + if (kDebugMode) { + print('[BackgroundFetch] Headless event received.'); + } BackgroundFetch.finish(task.taskId); } diff --git a/filcnaplo/lib/models/settings.dart b/filcnaplo/lib/models/settings.dart index 0f03f3b6..7828bc35 100644 --- a/filcnaplo/lib/models/settings.dart +++ b/filcnaplo/lib/models/settings.dart @@ -366,66 +366,88 @@ class SettingsProvider extends ChangeNotifier { if (startPage != null && startPage != _startPage) _startPage = startPage; if (rounding != null && rounding != _rounding) _rounding = rounding; if (theme != null && theme != _theme) _theme = theme; - if (accentColor != null && accentColor != _accentColor) + if (accentColor != null && accentColor != _accentColor) { _accentColor = accentColor; - if (gradeColors != null && gradeColors != _gradeColors) + } + if (gradeColors != null && gradeColors != _gradeColors) { _gradeColors = gradeColors; - if (newsEnabled != null && newsEnabled != _newsEnabled) + } + if (newsEnabled != null && newsEnabled != _newsEnabled) { _newsEnabled = newsEnabled; + } if (newsState != null && newsState != _newsState) _newsState = newsState; if (notificationsEnabled != null && - notificationsEnabled != _notificationsEnabled) + notificationsEnabled != _notificationsEnabled) { _notificationsEnabled = notificationsEnabled; + } if (notificationsBitfield != null && - notificationsBitfield != _notificationsBitfield) + notificationsBitfield != _notificationsBitfield) { _notificationsBitfield = notificationsBitfield; - if (developerMode != null && developerMode != _developerMode) + } + if (developerMode != null && developerMode != _developerMode) { _developerMode = developerMode; + } if (notificationPollInterval != null && notificationPollInterval != _notificationPollInterval) { _notificationPollInterval = notificationPollInterval; } if (vibrate != null && vibrate != _vibrate) _vibrate = vibrate; if (abWeeks != null && abWeeks != _abWeeks) _abWeeks = abWeeks; - if (swapABweeks != null && swapABweeks != _swapABweeks) + if (swapABweeks != null && swapABweeks != _swapABweeks) { _swapABweeks = swapABweeks; - if (updateChannel != null && updateChannel != _updateChannel) + } + if (updateChannel != null && updateChannel != _updateChannel) { _updateChannel = updateChannel; + } if (config != null && config != _config) _config = config; if (xFilcId != null && xFilcId != _xFilcId) _xFilcId = xFilcId; - if (graphClassAvg != null && graphClassAvg != _graphClassAvg) + if (graphClassAvg != null && graphClassAvg != _graphClassAvg) { _graphClassAvg = graphClassAvg; + } if (goodStudent != null) _goodStudent = goodStudent; - if (presentationMode != null && presentationMode != _presentationMode) + if (presentationMode != null && presentationMode != _presentationMode) { _presentationMode = presentationMode; + } if (bellDelay != null && bellDelay != _bellDelay) _bellDelay = bellDelay; - if (bellDelayEnabled != null && bellDelayEnabled != _bellDelayEnabled) + if (bellDelayEnabled != null && bellDelayEnabled != _bellDelayEnabled) { _bellDelayEnabled = bellDelayEnabled; - if (gradeOpeningFun != null && gradeOpeningFun != _gradeOpeningFun) + } + if (gradeOpeningFun != null && gradeOpeningFun != _gradeOpeningFun) { _gradeOpeningFun = gradeOpeningFun; + } if (iconPack != null && iconPack != _iconPack) _iconPack = iconPack; - if (customAccentColor != null && customAccentColor != _customAccentColor) + if (customAccentColor != null && customAccentColor != _customAccentColor) { _customAccentColor = customAccentColor; + } if (customBackgroundColor != null && - customBackgroundColor != _customBackgroundColor) + customBackgroundColor != _customBackgroundColor) { _customBackgroundColor = customBackgroundColor; + } if (customHighlightColor != null && - customHighlightColor != _customHighlightColor) + customHighlightColor != _customHighlightColor) { _customHighlightColor = customHighlightColor; - if (premiumScopes != null && premiumScopes != _premiumScopes) + } + if (premiumScopes != null && premiumScopes != _premiumScopes) { _premiumScopes = premiumScopes; - if (premiumAccessToken != null && premiumAccessToken != _premiumAccessToken) + } + if (premiumAccessToken != null && + premiumAccessToken != _premiumAccessToken) { _premiumAccessToken = premiumAccessToken; - if (premiumLogin != null && premiumLogin != _premiumLogin) + } + if (premiumLogin != null && premiumLogin != _premiumLogin) { _premiumLogin = premiumLogin; - if (lastAccountId != null && lastAccountId != _lastAccountId) + } + if (lastAccountId != null && lastAccountId != _lastAccountId) { _lastAccountId = lastAccountId; + } if (renamedSubjectsEnabled != null && - renamedSubjectsEnabled != _renamedSubjectsEnabled) + renamedSubjectsEnabled != _renamedSubjectsEnabled) { _renamedSubjectsEnabled = renamedSubjectsEnabled; - if (renamedSubjectsItalics != null && - renamedSubjectsItalics != _renamedSubjectsItalics) + } + if (renamedSubjectsItalics != null && + renamedSubjectsItalics != _renamedSubjectsItalics) { _renamedSubjectsItalics = renamedSubjectsItalics; + } if (store) await _database?.store.storeSettings(this); notifyListeners(); } diff --git a/filcnaplo/lib/theme/colors/dark_mobile.dart b/filcnaplo/lib/theme/colors/dark_mobile.dart index ecb53488..c2c94794 100644 --- a/filcnaplo/lib/theme/colors/dark_mobile.dart +++ b/filcnaplo/lib/theme/colors/dark_mobile.dart @@ -38,6 +38,7 @@ class DarkMobileAppColors implements ThemeAppColors { final gradeTwo = const Color(0xFFAE3DF4); @override final gradeOne = const Color(0xFFF43DAB); + @override final purple = const Color(0xffBF5AF2); @override final pink = const Color(0xffFF375F); diff --git a/filcnaplo/linux/flutter/generated_plugin_registrant.cc b/filcnaplo/linux/flutter/generated_plugin_registrant.cc index 0fcfb275..4894d346 100644 --- a/filcnaplo/linux/flutter/generated_plugin_registrant.cc +++ b/filcnaplo/linux/flutter/generated_plugin_registrant.cc @@ -7,7 +7,6 @@ #include "generated_plugin_registrant.h" #include -#include #include #include @@ -15,9 +14,6 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) dynamic_color_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin"); dynamic_color_plugin_register_with_registrar(dynamic_color_registrar); - g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); - file_selector_plugin_register_with_registrar(file_selector_linux_registrar); g_autoptr(FlPluginRegistrar) flutter_acrylic_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterAcrylicPlugin"); flutter_acrylic_plugin_register_with_registrar(flutter_acrylic_registrar); diff --git a/filcnaplo/linux/flutter/generated_plugins.cmake b/filcnaplo/linux/flutter/generated_plugins.cmake index c5541e6e..c8808fea 100644 --- a/filcnaplo/linux/flutter/generated_plugins.cmake +++ b/filcnaplo/linux/flutter/generated_plugins.cmake @@ -4,7 +4,6 @@ list(APPEND FLUTTER_PLUGIN_LIST dynamic_color - file_selector_linux flutter_acrylic url_launcher_linux ) diff --git a/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift b/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift index 53df988b..c6b190d7 100644 --- a/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,7 +7,6 @@ import Foundation import connectivity_plus import dynamic_color -import file_selector_macos import flutter_local_notifications import macos_window_utils import package_info_plus @@ -19,7 +18,6 @@ import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin")) DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) - FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) MacOSWindowUtilsPlugin.register(with: registry.registrar(forPlugin: "MacOSWindowUtilsPlugin")) FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) diff --git a/filcnaplo_desktop_ui/lib/screens/navigation/navigation_screen.dart b/filcnaplo_desktop_ui/lib/screens/navigation/navigation_screen.dart index b499a034..12a3ccd5 100644 --- a/filcnaplo_desktop_ui/lib/screens/navigation/navigation_screen.dart +++ b/filcnaplo_desktop_ui/lib/screens/navigation/navigation_screen.dart @@ -16,13 +16,15 @@ import 'package:filcnaplo_kreta_api/client/client.dart'; class NavigationScreen extends StatefulWidget { const NavigationScreen({Key? key}) : super(key: key); - static NavigationScreenState? of(BuildContext context) => context.findAncestorStateOfType(); + static NavigationScreenState? of(BuildContext context) => + context.findAncestorStateOfType(); @override State createState() => NavigationScreenState(); } -class NavigationScreenState extends State with WidgetsBindingObserver { +class NavigationScreenState extends State + with WidgetsBindingObserver { final _navigatorState = GlobalKey(); late NavigationRoute selected; late SettingsProvider settings; @@ -40,7 +42,8 @@ class NavigationScreenState extends State with WidgetsBindingO WidgetsBinding.instance.addObserver(this); // set client User-Agent - Provider.of(context, listen: false).userAgent = settings.config.userAgent; + Provider.of(context, listen: false).userAgent = + settings.config.userAgent; // Get news newsProvider = Provider.of(context, listen: false); @@ -54,7 +57,11 @@ class NavigationScreenState extends State with WidgetsBindingO await Window.initialize(); } catch (_) {} // Transparent sidebar - await Window.setEffect(effect: WindowEffect.acrylic, color: Platform.isMacOS ? Colors.transparent : const Color.fromARGB(27, 27, 27, 27)); + await Window.setEffect( + effect: WindowEffect.acrylic, + color: Platform.isMacOS + ? Colors.transparent + : const Color.fromARGB(27, 27, 27, 27)); // todo: do for windows if (Platform.isMacOS) { @@ -75,8 +82,12 @@ class NavigationScreenState extends State with WidgetsBindingO @override void didChangePlatformBrightness() { if (settings.theme == ThemeMode.system) { - Brightness? brightness = WidgetsBinding.instance.window.platformBrightness; - Provider.of(context, listen: false).changeTheme(brightness == Brightness.light ? ThemeMode.light : ThemeMode.dark); + // ignore: deprecated_member_use + Brightness? brightness = + // ignore: deprecated_member_use + WidgetsBinding.instance.window.platformBrightness; + Provider.of(context, listen: false).changeTheme( + brightness == Brightness.light ? ThemeMode.light : ThemeMode.dark); } super.didChangePlatformBrightness(); } @@ -103,8 +114,12 @@ class NavigationScreenState extends State with WidgetsBindingO if (_navigatorState.currentState != null) Container( decoration: BoxDecoration( - color: Theme.of(context).scaffoldBackgroundColor.withOpacity(.5), - border: Border(right: BorderSide(color: AppColors.of(context).shadow.withOpacity(.7), width: 1.0)), + color: + Theme.of(context).scaffoldBackgroundColor.withOpacity(.5), + border: Border( + right: BorderSide( + color: AppColors.of(context).shadow.withOpacity(.7), + width: 1.0)), ), child: Padding( padding: EdgeInsets.only(top: topInset), @@ -125,7 +140,8 @@ class NavigationScreenState extends State with WidgetsBindingO child: Navigator( key: _navigatorState, initialRoute: selected.name, - onGenerateRoute: (settings) => navigationRouteHandler(settings), + onGenerateRoute: (settings) => + navigationRouteHandler(settings), ), ), ), diff --git a/filcnaplo_kreta_api/lib/providers/grade_provider.dart b/filcnaplo_kreta_api/lib/providers/grade_provider.dart index cc8e6ee3..11b7a437 100644 --- a/filcnaplo_kreta_api/lib/providers/grade_provider.dart +++ b/filcnaplo_kreta_api/lib/providers/grade_provider.dart @@ -98,7 +98,11 @@ class GradeProvider with ChangeNotifier { .i18n; grade.value.shortName = _settings.goodStudent ? "Jeles".i18n - : '${grade.json!["SzovegesErtekelesRovidNev"]}' != "null" && '${grade.json!["SzovegesErtekelesRovidNev"]}' != "-" && '${grade.json!["SzovegesErtekelesRovidNev"]}'.replaceAll(RegExp(r'[0123456789]+[%]?'), '') != "" + : '${grade.json!["SzovegesErtekelesRovidNev"]}' != "null" && + '${grade.json!["SzovegesErtekelesRovidNev"]}' != "-" && + '${grade.json!["SzovegesErtekelesRovidNev"]}' + .replaceAll(RegExp(r'[0123456789]+[%]?'), '') != + "" ? '${grade.json!["SzovegesErtekelesRovidNev"]}'.i18n : grade.value.valueName; } @@ -119,14 +123,16 @@ class GradeProvider with ChangeNotifier { if (grades.isNotEmpty || _grades.isNotEmpty) await store(grades); List? groupsJson = await _kreta.getAPI(KretaAPI.groups(iss)); - if (groupsJson == null || groupsJson.isEmpty) + if (groupsJson == null || groupsJson.isEmpty) { throw "Cannot fetch Groups for User ${user.id}"; + } _groups = (groupsJson[0]["OktatasNevelesiFeladat"] ?? {})["Uid"] ?? ""; List? groupAvgJson = await _kreta.getAPI(KretaAPI.groupAverages(iss, _groups)); - if (groupAvgJson == null) + if (groupAvgJson == null) { throw "Cannot fetch Class Averages for User ${user.id}"; + } final groupAvgs = groupAvgJson.map((e) => GroupAverage.fromJson(e)).toList(); await storeGroupAvg(groupAvgs); diff --git a/filcnaplo_kreta_api/lib/providers/timetable_provider.dart b/filcnaplo_kreta_api/lib/providers/timetable_provider.dart index b6828086..fdd35d1d 100644 --- a/filcnaplo_kreta_api/lib/providers/timetable_provider.dart +++ b/filcnaplo_kreta_api/lib/providers/timetable_provider.dart @@ -37,10 +37,14 @@ class TimetableProvider with ChangeNotifier { // for renamed subjects Future convertBySettings() async { Map renamedSubjects = - (await _database.query.getSettings(_database)).renamedSubjectsEnabled ? await _database.userQuery.renamedSubjects(userId: _user.id!) : {}; + (await _database.query.getSettings(_database)).renamedSubjectsEnabled + ? await _database.userQuery.renamedSubjects(userId: _user.id!) + : {}; for (Lesson lesson in _lessons.values.expand((e) => e)) { - lesson.subject.renamedTo = renamedSubjects.isNotEmpty ? renamedSubjects[lesson.subject.id] : null; + lesson.subject.renamedTo = renamedSubjects.isNotEmpty + ? renamedSubjects[lesson.subject.id] + : null; } notifyListeners(); @@ -54,7 +58,8 @@ class TimetableProvider with ChangeNotifier { User? user = _user.user; if (user == null) throw "Cannot fetch Lessons for User null"; String iss = user.instituteCode; - List? lessonsJson = await _kreta.getAPI(KretaAPI.timetable(iss, start: week.start, end: week.end)); + List? lessonsJson = await _kreta + .getAPI(KretaAPI.timetable(iss, start: week.start, end: week.end)); if (lessonsJson == null) throw "Cannot fetch Lessons for User ${user.id}"; List lessons = lessonsJson.map((e) => Lesson.fromJson(e)).toList(); @@ -72,7 +77,7 @@ class TimetableProvider with ChangeNotifier { if (user == null) throw "Cannot store Lessons for User null"; String userId = user.id; - // TODO: clear indexes with weeks outside of the current school year + // -TODO: clear indexes with weeks outside of the current school year await _database.userStore.storeLessons(_lessons, userId: userId); } diff --git a/filcnaplo_mobile_ui/lib/common/widgets/message/message_view_tile.dart b/filcnaplo_mobile_ui/lib/common/widgets/message/message_view_tile.dart index 7a5ffc8f..62e8f83e 100755 --- a/filcnaplo_mobile_ui/lib/common/widgets/message/message_view_tile.dart +++ b/filcnaplo_mobile_ui/lib/common/widgets/message/message_view_tile.dart @@ -22,16 +22,21 @@ class MessageViewTile extends StatelessWidget { UserProvider user = Provider.of(context, listen: false); String recipientLabel = ""; - if (message.recipients.any((r) => r.name == user.student?.name)) recipientLabel = "me".i18n; + if (message.recipients.any((r) => r.name == user.student?.name)) + recipientLabel = "me".i18n; if (recipientLabel != "" && message.recipients.length > 1) { recipientLabel += " +"; - recipientLabel += message.recipients.where((r) => r.name != user.student?.name).length.toString(); + recipientLabel += message.recipients + .where((r) => r.name != user.student?.name) + .length + .toString(); } if (recipientLabel == "") { // note: convertint to set to remove duplicates - recipientLabel += message.recipients.map((r) => r.name).toSet().join(", "); + recipientLabel += + message.recipients.map((r) => r.name).toSet().join(", "); } List attachments = []; @@ -75,9 +80,9 @@ class MessageViewTile extends StatelessWidget { overflow: TextOverflow.ellipsis, maxLines: 1, ), - trailing: Row( + trailing: const Row( mainAxisSize: MainAxisSize.min, - children: const [ + children: [ // IconButton( // onPressed: () {}, // icon: Icon(FeatherIcons.cornerUpLeft, color: AppColors.of(context).text), diff --git a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart index 3077bb6f..eb311241 100755 --- a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart +++ b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart @@ -55,7 +55,9 @@ class _LiveCardState extends State { case LiveCardState.morning: child = LiveCardWidget( key: const Key('livecard.morning'), - title: DateFormat("EEEE", I18n.of(context).locale.toString()).format(DateTime.now()).capital(), + title: DateFormat("EEEE", I18n.of(context).locale.toString()) + .format(DateTime.now()) + .capital(), icon: FeatherIcons.sun, description: liveCard.nextLesson != null ? Text.rich( @@ -63,26 +65,40 @@ class _LiveCardState extends State { children: [ TextSpan(text: "first_lesson_1".i18n), TextSpan( - text: liveCard.nextLesson!.subject.renamedTo ?? liveCard.nextLesson!.subject.name.capital(), + text: liveCard.nextLesson!.subject.renamedTo ?? + liveCard.nextLesson!.subject.name.capital(), style: TextStyle( fontWeight: FontWeight.w600, - color: Theme.of(context).colorScheme.secondary.withOpacity(.85), - fontStyle: liveCard.nextLesson!.subject.isRenamed && settingsProvider.renamedSubjectsItalics ? FontStyle.italic : null), + color: Theme.of(context) + .colorScheme + .secondary + .withOpacity(.85), + fontStyle: liveCard.nextLesson!.subject.isRenamed && + settingsProvider.renamedSubjectsItalics + ? FontStyle.italic + : null), ), TextSpan(text: "first_lesson_2".i18n), TextSpan( text: liveCard.nextLesson!.room.capital(), style: TextStyle( fontWeight: FontWeight.w600, - color: Theme.of(context).colorScheme.secondary.withOpacity(.85), + color: Theme.of(context) + .colorScheme + .secondary + .withOpacity(.85), ), ), TextSpan(text: "first_lesson_3".i18n), TextSpan( - text: DateFormat('H:mm').format(liveCard.nextLesson!.start), + text: DateFormat('H:mm') + .format(liveCard.nextLesson!.start), style: TextStyle( fontWeight: FontWeight.w600, - color: Theme.of(context).colorScheme.secondary.withOpacity(.85), + color: Theme.of(context) + .colorScheme + .secondary + .withOpacity(.85), ), ), TextSpan(text: "first_lesson_4".i18n), @@ -93,30 +109,48 @@ class _LiveCardState extends State { ); break; case LiveCardState.duringLesson: - final elapsedTime = DateTime.now().difference(liveCard.currentLesson!.start).inSeconds.toDouble() + bellDelay.inSeconds; - final maxTime = liveCard.currentLesson!.end.difference(liveCard.currentLesson!.start).inSeconds.toDouble(); + final elapsedTime = DateTime.now() + .difference(liveCard.currentLesson!.start) + .inSeconds + .toDouble() + + bellDelay.inSeconds; + final maxTime = liveCard.currentLesson!.end + .difference(liveCard.currentLesson!.start) + .inSeconds + .toDouble(); final showMinutes = maxTime - elapsedTime > 60; child = LiveCardWidget( key: const Key('livecard.duringLesson'), - leading: liveCard.currentLesson!.lessonIndex + (RegExp(r'\d').hasMatch(liveCard.currentLesson!.lessonIndex) ? "." : ""), - title: liveCard.currentLesson!.subject.renamedTo ?? liveCard.currentLesson!.subject.name.capital(), + leading: liveCard.currentLesson!.lessonIndex + + (RegExp(r'\d').hasMatch(liveCard.currentLesson!.lessonIndex) + ? "." + : ""), + title: liveCard.currentLesson!.subject.renamedTo ?? + liveCard.currentLesson!.subject.name.capital(), titleItalic: liveCard.currentLesson!.subject.isRenamed, subtitle: liveCard.currentLesson!.room, - icon: SubjectIcon.resolveVariant(subject: liveCard.currentLesson!.subject, context: context), - description: liveCard.currentLesson!.description != "" ? Text(liveCard.currentLesson!.description) : null, - nextSubject: liveCard.nextLesson?.subject.renamedTo ?? liveCard.nextLesson?.subject.name.capital(), - nextSubjectItalic: liveCard.nextLesson?.subject.isRenamed == true && settingsProvider.renamedSubjectsItalics ?? false, + icon: SubjectIcon.resolveVariant( + subject: liveCard.currentLesson!.subject, context: context), + description: liveCard.currentLesson!.description != "" + ? Text(liveCard.currentLesson!.description) + : null, + nextSubject: liveCard.nextLesson?.subject.renamedTo ?? + liveCard.nextLesson?.subject.name.capital(), + nextSubjectItalic: liveCard.nextLesson?.subject.isRenamed == true && + settingsProvider.renamedSubjectsItalics, nextRoom: liveCard.nextLesson?.room, progressMax: showMinutes ? maxTime / 60 : maxTime, progressCurrent: showMinutes ? elapsedTime / 60 : elapsedTime, - progressAccuracy: showMinutes ? ProgressAccuracy.minutes : ProgressAccuracy.seconds, + progressAccuracy: + showMinutes ? ProgressAccuracy.minutes : ProgressAccuracy.seconds, onProgressTap: () { showDialog( barrierColor: Colors.black, context: context, - builder: (context) => HeadsUpCountdown(maxTime: maxTime, elapsedTime: elapsedTime), + builder: (context) => + HeadsUpCountdown(maxTime: maxTime, elapsedTime: elapsedTime), ); }, ); @@ -131,8 +165,15 @@ class _LiveCardState extends State { final diff = liveCard.getFloorDifference(); - final maxTime = liveCard.nextLesson!.start.difference(liveCard.prevLesson!.end).inSeconds.toDouble(); - final elapsedTime = DateTime.now().difference(liveCard.prevLesson!.end).inSeconds.toDouble() + bellDelay.inSeconds.toDouble(); + final maxTime = liveCard.nextLesson!.start + .difference(liveCard.prevLesson!.end) + .inSeconds + .toDouble(); + final elapsedTime = DateTime.now() + .difference(liveCard.prevLesson!.end) + .inSeconds + .toDouble() + + bellDelay.inSeconds.toDouble(); final showMinutes = maxTime - elapsedTime > 60; @@ -141,14 +182,21 @@ class _LiveCardState extends State { title: "break".i18n, icon: iconFloorMap[diff], description: liveCard.nextLesson!.room != liveCard.prevLesson!.room - ? Text("go $diff".i18n.fill([diff != "to room" ? (liveCard.nextLesson!.getFloor() ?? 0) : liveCard.nextLesson!.room])) + ? Text("go $diff".i18n.fill([ + diff != "to room" + ? (liveCard.nextLesson!.getFloor() ?? 0) + : liveCard.nextLesson!.room + ])) : Text("stay".i18n), - nextSubject: liveCard.nextLesson?.subject.renamedTo ?? liveCard.nextLesson?.subject.name.capital(), - nextSubjectItalic: liveCard.nextLesson?.subject.isRenamed == true && settingsProvider.renamedSubjectsItalics ?? false, + nextSubject: liveCard.nextLesson?.subject.renamedTo ?? + liveCard.nextLesson?.subject.name.capital(), + nextSubjectItalic: liveCard.nextLesson?.subject.isRenamed == true && + settingsProvider.renamedSubjectsItalics, nextRoom: diff != "to room" ? liveCard.nextLesson?.room : null, progressMax: showMinutes ? maxTime / 60 : maxTime, progressCurrent: showMinutes ? elapsedTime / 60 : elapsedTime, - progressAccuracy: showMinutes ? ProgressAccuracy.minutes : ProgressAccuracy.seconds, + progressAccuracy: + showMinutes ? ProgressAccuracy.minutes : ProgressAccuracy.seconds, onProgressTap: () { showDialog( barrierColor: Colors.black, @@ -164,14 +212,18 @@ class _LiveCardState extends State { case LiveCardState.afternoon: child = LiveCardWidget( key: const Key('livecard.afternoon'), - title: DateFormat("EEEE", I18n.of(context).locale.toString()).format(DateTime.now()).capital(), + title: DateFormat("EEEE", I18n.of(context).locale.toString()) + .format(DateTime.now()) + .capital(), icon: FeatherIcons.coffee, ); break; case LiveCardState.night: child = LiveCardWidget( key: const Key('livecard.night'), - title: DateFormat("EEEE", I18n.of(context).locale.toString()).format(DateTime.now()).capital(), + title: DateFormat("EEEE", I18n.of(context).locale.toString()) + .format(DateTime.now()) + .capital(), icon: FeatherIcons.moon, ); break; diff --git a/filcnaplo_mobile_ui/lib/premium/premium_button.dart b/filcnaplo_mobile_ui/lib/premium/premium_button.dart index 9b7b88ac..0b328cb6 100755 --- a/filcnaplo_mobile_ui/lib/premium/premium_button.dart +++ b/filcnaplo_mobile_ui/lib/premium/premium_button.dart @@ -12,14 +12,16 @@ class PremiumButton extends StatefulWidget { State createState() => _PremiumButtonState(); } -class _PremiumButtonState extends State with TickerProviderStateMixin { +class _PremiumButtonState extends State + with TickerProviderStateMixin { late final AnimationController _animation; bool _heldDown = false; @override void initState() { super.initState(); - _animation = AnimationController(vsync: this, duration: const Duration(seconds: 3)); + _animation = + AnimationController(vsync: this, duration: const Duration(seconds: 3)); _animation.repeat(); } @@ -38,7 +40,8 @@ class _PremiumButtonState extends State with TickerProviderStateM transitionType: ContainerTransitionType.fadeThrough, openElevation: 0, closedElevation: 0, - closedShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(14.0)), + closedShape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(14.0)), openBuilder: (context, _) => const PremiumScreen(), closedBuilder: (context, action) => GestureDetector( onTapDown: (_) => setState(() => _heldDown = true), @@ -57,16 +60,20 @@ class _PremiumButtonState extends State with TickerProviderStateM child: ClipRRect( borderRadius: BorderRadius.circular(14.0), child: ImageFiltered( - imageFilter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), + imageFilter: + ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), child: Container( height: 70, decoration: BoxDecoration( - gradient: SweepGradient(colors: const [ - Colors.blue, - Colors.orange, - Colors.purple, - Colors.blue, - ], transform: GradientRotation(_animation.value * 6.283185)), + gradient: SweepGradient( + colors: const [ + Colors.blue, + Colors.orange, + Colors.purple, + Colors.blue, + ], + transform: GradientRotation( + _animation.value * 6.283185)), ), ), ), @@ -92,9 +99,9 @@ class _PremiumButtonState extends State with TickerProviderStateM Color(0xff1EA18F), ]), ), - child: Row( + child: const Row( mainAxisAlignment: MainAxisAlignment.center, - children: const [ + children: [ Icon(FilcIcons.premium, color: Colors.white), SizedBox(width: 12.0), Text( diff --git a/filcnaplo_mobile_ui/lib/premium/premium_screen.dart b/filcnaplo_mobile_ui/lib/premium/premium_screen.dart index 3a947e3f..c710a232 100755 --- a/filcnaplo_mobile_ui/lib/premium/premium_screen.dart +++ b/filcnaplo_mobile_ui/lib/premium/premium_screen.dart @@ -21,8 +21,9 @@ class PremiumScreen extends StatelessWidget { @override Widget build(BuildContext context) { - final middleColor = - Theme.of(context).brightness == Brightness.dark ? const Color.fromARGB(255, 20, 57, 46) : const Color.fromARGB(255, 10, 140, 123); + final middleColor = Theme.of(context).brightness == Brightness.dark + ? const Color.fromARGB(255, 20, 57, 46) + : const Color.fromARGB(255, 10, 140, 123); final future = FilcAPI.getSupporters(); @@ -78,7 +79,8 @@ class PremiumScreen extends StatelessWidget { children: [ Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 24.0), + padding: + const EdgeInsets.symmetric(horizontal: 24.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -87,16 +89,25 @@ class PremiumScreen extends StatelessWidget { const SizedBox(height: 12.0), const Text( "Még több filc.", - style: TextStyle(fontWeight: FontWeight.w600, fontSize: 25.0, color: Colors.white), + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 25.0, + color: Colors.white), ), const Text( "reFilc Premium.", - style: TextStyle(fontWeight: FontWeight.w800, fontSize: 35.0, color: Colors.white), + style: TextStyle( + fontWeight: FontWeight.w800, + fontSize: 35.0, + color: Colors.white), ), const SizedBox(height: 15.0), Text( "Támogasd a filcet, és szerezz cserébe pár kényelmes jutalmat!", - style: TextStyle(fontWeight: FontWeight.w500, fontSize: 20, color: Colors.white.withOpacity(.8)), + style: TextStyle( + fontWeight: FontWeight.w500, + fontSize: 20, + color: Colors.white.withOpacity(.8)), ), const SizedBox(height: 25.0), SupportersButton(supporters: future), @@ -110,43 +121,61 @@ class PremiumScreen extends StatelessWidget { ), ), SliverPadding( - padding: const EdgeInsets.symmetric(horizontal: 24.0).add(const EdgeInsets.only(bottom: 100)), + padding: const EdgeInsets.symmetric(horizontal: 24.0) + .add(const EdgeInsets.only(bottom: 100)), sliver: SliverToBoxAdapter( child: Column( children: [ PremiumPlanCard( icon: const Icon(FilcIcons.kupak), - title: Text("Kupak", style: TextStyle(foreground: GradientStyles.kupakPaint)), + title: Text("Kupak", + style: TextStyle( + foreground: GradientStyles.kupakPaint)), gradient: GradientStyles.kupak, price: 2, - description: const Text("Szabd személyre a filcet és láss részletesebb statisztikákat."), - url: "https://github.com/sponsors/filc/sponsorships?tier_id=238453&preview=true", - active: ActiveSponsorCard.estimateLevel(context.watch().scopes) == PremiumFeatureLevel.kupak, + description: const Text( + "Szabd személyre a filcet és láss részletesebb statisztikákat."), + url: + "https://github.com/sponsors/filc/sponsorships?tier_id=238453&preview=true", + active: ActiveSponsorCard.estimateLevel( + context.watch().scopes) == + PremiumFeatureLevel.kupak, ), const SizedBox(height: 8.0), PremiumPlanCard( icon: const Icon(FilcIcons.tinta), - title: Text("Tinta", style: TextStyle(foreground: GradientStyles.tintaPaint)), + title: Text("Tinta", + style: TextStyle( + foreground: GradientStyles.tintaPaint)), gradient: GradientStyles.tinta, price: 5, - description: const Text("Kényelmesebb órarend, asztali alkalmazás és célok kitűzése."), - url: "https://github.com/sponsors/filc/sponsorships?tier_id=238454&preview=true", - active: ActiveSponsorCard.estimateLevel(context.watch().scopes) == PremiumFeatureLevel.tinta, + description: const Text( + "Kényelmesebb órarend, asztali alkalmazás és célok kitűzése."), + url: + "https://github.com/sponsors/filc/sponsorships?tier_id=238454&preview=true", + active: ActiveSponsorCard.estimateLevel( + context.watch().scopes) == + PremiumFeatureLevel.tinta, ), const SizedBox(height: 12.0), - PremiumGoalCard(progress: snapshot.data?.progress ?? 0, target: snapshot.data?.max ?? 1), + PremiumGoalCard( + progress: snapshot.data?.progress ?? 0, + target: snapshot.data?.max ?? 1), const SizedBox(height: 12.0), const GithubConnectButton(), Padding( - padding: const EdgeInsets.symmetric(vertical: 14.0).add(const EdgeInsets.only(top: 12.0)), - child: Row( - children: const [ + padding: const EdgeInsets.symmetric(vertical: 14.0) + .add(const EdgeInsets.only(top: 12.0)), + child: const Row( + children: [ Icon(FilcIcons.kupak), SizedBox(width: 12.0), Expanded( child: Text( "Kupak jutalmak", - style: TextStyle(fontWeight: FontWeight.w500, fontSize: 20), + style: TextStyle( + fontWeight: FontWeight.w500, + fontSize: 20), ), ), ], @@ -154,40 +183,50 @@ class PremiumScreen extends StatelessWidget { ), PremiumRewardCard( imageKey: "premium_nickname_showcase", - icon: SvgPicture.asset("assets/images/nickname_icon.svg", color: Theme.of(context).iconTheme.color), + icon: SvgPicture.asset( + "assets/images/nickname_icon.svg", + color: Theme.of(context).iconTheme.color), title: const Text("Profil személyre szabás"), - description: const Text("Állíts be egy saját becenevet és egy profilképet (akár animáltat is!)"), + description: const Text( + "Állíts be egy saját becenevet és egy profilképet (akár animáltat is!)"), ), const SizedBox(height: 14.0), PremiumRewardCard( imageKey: "premium_theme_showcase", - icon: SvgPicture.asset("assets/images/theme_icon.svg", color: Theme.of(context).iconTheme.color), + icon: SvgPicture.asset("assets/images/theme_icon.svg", + color: Theme.of(context).iconTheme.color), title: const Text("Téma+"), - description: const Text("Válassz saját háttérszínt és kártyaszínt is, akár saját HEX-kóddal!"), + description: const Text( + "Válassz saját háttérszínt és kártyaszínt is, akár saját HEX-kóddal!"), ), const SizedBox(height: 14.0), PremiumRewardCard( imageKey: "premium_stats_showcase", - icon: SvgPicture.asset("assets/images/stats_icon.svg", color: Theme.of(context).iconTheme.color), + icon: SvgPicture.asset("assets/images/stats_icon.svg", + color: Theme.of(context).iconTheme.color), title: const Text("Részletes jegy statisztika"), - description: const Text("Válassz heti, havi és háromhavi időtartam közül, és pontosan lásd, mennyi jegyed van."), + description: const Text( + "Válassz heti, havi és háromhavi időtartam közül, és pontosan lásd, mennyi jegyed van."), ), const SizedBox(height: 14.0), const PremiumRewardCard( title: Text("Még pár dolog..."), - description: - Text("🔣\tVálassz ikon témát\n✨\tPrémium rang és csevegő a discord szerverünkön\n📬\tElsőbbségi segítségnyújtás"), + description: Text( + "🔣\tVálassz ikon témát\n✨\tPrémium rang és csevegő a discord szerverünkön\n📬\tElsőbbségi segítségnyújtás"), ), Padding( - padding: const EdgeInsets.symmetric(vertical: 14.0).add(const EdgeInsets.only(top: 12.0)), - child: Row( - children: const [ + padding: const EdgeInsets.symmetric(vertical: 14.0) + .add(const EdgeInsets.only(top: 12.0)), + child: const Row( + children: [ Icon(FilcIcons.tinta), SizedBox(width: 12.0), Expanded( child: Text( "Tinta jutalmak", - style: TextStyle(fontWeight: FontWeight.w500, fontSize: 20), + style: TextStyle( + fontWeight: FontWeight.w500, + fontSize: 20), ), ), ], @@ -195,48 +234,62 @@ class PremiumScreen extends StatelessWidget { ), PremiumRewardCard( imageKey: "premium_timetable_showcase", - icon: SvgPicture.asset("assets/images/timetable_icon.svg", color: Theme.of(context).iconTheme.color), + icon: SvgPicture.asset( + "assets/images/timetable_icon.svg", + color: Theme.of(context).iconTheme.color), title: const Text("Heti órarend nézet"), - description: - const Text("Egy órarend, ami a teljes képernyődet kihasználja, csak nem olyan idegesítő, mint az eKRÉTA féle."), + description: const Text( + "Egy órarend, ami a teljes képernyődet kihasználja, csak nem olyan idegesítő, mint az eKRÉTA féle."), ), const SizedBox(height: 14.0), PremiumRewardCard( imageKey: "premium_widget_showcase", - icon: SvgPicture.asset("assets/images/widget_icon.svg", color: Theme.of(context).iconTheme.color), + icon: SvgPicture.asset( + "assets/images/widget_icon.svg", + color: Theme.of(context).iconTheme.color), title: const Text("Widget"), - description: const Text("Mindig lásd, milyen órád lesz, a kezdőképernyőd kényelméből."), + description: const Text( + "Mindig lásd, milyen órád lesz, a kezdőképernyőd kényelméből."), ), const SizedBox(height: 14.0), PremiumRewardCard( soon: true, imageKey: "premium_goal_showcase", - icon: SvgPicture.asset("assets/images/goal_icon.svg", color: Theme.of(context).iconTheme.color), + icon: SvgPicture.asset("assets/images/goal_icon.svg", + color: Theme.of(context).iconTheme.color), title: const Text("Cél követés"), - description: const Text("Add meg, mi a célod, és mi majd kiszámoljuk, hogyan juthatsz oda!"), + description: const Text( + "Add meg, mi a célod, és mi majd kiszámoljuk, hogyan juthatsz oda!"), ), const SizedBox(height: 14.0), PremiumRewardCard( soon: true, imageKey: "premium_desktop_showcase", - icon: SvgPicture.asset("assets/images/desktop_icon.svg", color: Theme.of(context).iconTheme.color), + icon: SvgPicture.asset( + "assets/images/desktop_icon.svg", + color: Theme.of(context).iconTheme.color), title: const Text("Asztali verzió"), - description: const Text("Érd el a reFilcet a gépeden is, és menekülj meg a csúnya felhasználói felületektől!"), + description: const Text( + "Érd el a reFilcet a gépeden is, és menekülj meg a csúnya felhasználói felületektől!"), ), const SizedBox(height: 14.0), const PremiumRewardCard( title: Text("Még pár dolog..."), - description: Text("🖋️\tMinden kupak jutalom\n✨\tKorai hozzáférés új verziókhoz"), + description: Text( + "🖋️\tMinden kupak jutalom\n✨\tKorai hozzáférés új verziókhoz"), ), Padding( - padding: const EdgeInsets.symmetric(vertical: 14.0).add(const EdgeInsets.only(top: 12.0)), - child: Row( - children: const [ + padding: const EdgeInsets.symmetric(vertical: 14.0) + .add(const EdgeInsets.only(top: 12.0)), + child: const Row( + children: [ SizedBox(width: 12.0), Expanded( child: Text( "Mire vársz még?", - style: TextStyle(fontWeight: FontWeight.w500, fontSize: 20), + style: TextStyle( + fontWeight: FontWeight.w500, + fontSize: 20), ), ), ], @@ -244,20 +297,24 @@ class PremiumScreen extends StatelessWidget { ), GithubCard( onPressed: () { - Navigator.of(context).push(MaterialPageRoute(builder: (context) { + Navigator.of(context) + .push(MaterialPageRoute(builder: (context) { return const PremiumActivationView(); })); }, ), Padding( - padding: const EdgeInsets.symmetric(vertical: 14.0).add(const EdgeInsets.only(top: 12.0)), - child: Row( - children: const [ + padding: const EdgeInsets.symmetric(vertical: 14.0) + .add(const EdgeInsets.only(top: 12.0)), + child: const Row( + children: [ SizedBox(width: 12.0), Expanded( child: Text( "Gyakori kérdések", - style: TextStyle(fontWeight: FontWeight.w500, fontSize: 20), + style: TextStyle( + fontWeight: FontWeight.w500, + fontSize: 20), ), ), ], diff --git a/filcnaplo_mobile_ui/lib/screens/navigation/navigation_screen.dart b/filcnaplo_mobile_ui/lib/screens/navigation/navigation_screen.dart index 4ceed6d9..03afda94 100755 --- a/filcnaplo_mobile_ui/lib/screens/navigation/navigation_screen.dart +++ b/filcnaplo_mobile_ui/lib/screens/navigation/navigation_screen.dart @@ -110,7 +110,9 @@ class NavigationScreenState extends State requiredNetworkType: NetworkType.ANY), (String taskId) async { // <-- Event handler // This is the fetch-event callback. - print("[BackgroundFetch] Event received $taskId"); + if (kDebugMode) { + print("[BackgroundFetch] Event received $taskId"); + } // IMPORTANT: You must signal completion of your task or the OS can punish your app // for taking too long in the background. @@ -118,10 +120,14 @@ class NavigationScreenState extends State }, (String taskId) async { // <-- Task timeout handler. // This task has exceeded its allowed running-time. You must stop what you're doing and immediately .finish(taskId) - print("[BackgroundFetch] TASK TIMEOUT taskId: $taskId"); + if (kDebugMode) { + print("[BackgroundFetch] TASK TIMEOUT taskId: $taskId"); + } BackgroundFetch.finish(taskId); }); - print('[BackgroundFetch] configure success: $status'); + if (kDebugMode) { + print('[BackgroundFetch] configure success: $status'); + } // If the widget was removed from the tree while the asynchronous platform // message was in flight, we want to discard the reply rather than calling @@ -173,7 +179,10 @@ class NavigationScreenState extends State @override void didChangePlatformBrightness() { if (settings.theme == ThemeMode.system) { - Brightness? brightness = WidgetsBinding.instance.window.platformBrightness; + // ignore: deprecated_member_use + Brightness? brightness = + // ignore: deprecated_member_use + WidgetsBinding.instance.window.platformBrightness; Provider.of(context, listen: false).changeTheme( brightness == Brightness.light ? ThemeMode.light : ThemeMode.dark); } diff --git a/filcnaplo_mobile_ui/lib/screens/settings/settings_helper.dart b/filcnaplo_mobile_ui/lib/screens/settings/settings_helper.dart index 7f6a3252..40b56ce0 100755 --- a/filcnaplo_mobile_ui/lib/screens/settings/settings_helper.dart +++ b/filcnaplo_mobile_ui/lib/screens/settings/settings_helper.dart @@ -484,8 +484,9 @@ class _BellDelaySettingState extends State Duration sdiff = lesson.start.difference(now); Duration ediff = lesson.end.difference(now); - if (closest == null || sdiff.abs() < closest.abs()) + if (closest == null || sdiff.abs() < closest.abs()) { closest = sdiff; + } if (ediff.abs() < closest.abs()) closest = ediff; } if (closest != null) { diff --git a/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart b/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart index 93410a80..ca4e26a5 100755 --- a/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart +++ b/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart @@ -84,34 +84,37 @@ class _SettingsScreenState extends State String _firstName; - List _nameParts = user.displayName?.split(" ") ?? ["?"]; + List _nameParts = account.displayName.split(" "); if (!settings.presentationMode) { _firstName = _nameParts.length > 1 ? _nameParts[1] : _nameParts[0]; } else { _firstName = "János"; } - accountTiles.add(AccountTile( - name: Text(!settings.presentationMode ? account.name : "János", - style: const TextStyle(fontWeight: FontWeight.w500)), - username: - Text(!settings.presentationMode ? account.username : "01234567890"), - profileImage: ProfileImage( - name: _firstName, - backgroundColor: Theme.of(context) - .colorScheme - .primary, //!settings.presentationMode - //? ColorUtils.stringToColor(account.name) - //: Theme.of(context).colorScheme.secondary, - role: account.role, + accountTiles.add( + AccountTile( + name: Text(!settings.presentationMode ? account.name : "János", + style: const TextStyle(fontWeight: FontWeight.w500)), + username: Text( + !settings.presentationMode ? account.username : "01234567890"), + profileImage: ProfileImage( + name: _firstName, + role: account.role, + profilePictureString: account.picture, + backgroundColor: Theme.of(context) + .colorScheme + .primary, //!settings.presentationMode + //? ColorUtils.stringToColor(account.name) + //: Theme.of(context).colorScheme.secondary, + ), + onTap: () { + user.setUser(account.id); + restore().then((_) => user.setUser(account.id)); + Navigator.of(context).pop(); + }, + onTapMenu: () => _showBottomSheet(account), ), - onTap: () { - user.setUser(account.id); - restore().then((_) => user.setUser(account.id)); - Navigator.of(context).pop(); - }, - onTapMenu: () => _showBottomSheet(account), - )); + ); }); } @@ -918,7 +921,9 @@ class _SettingsScreenState extends State child: Text("v${release.data!['version']}"), ); } else { - String envAppVer = const String.fromEnvironment("APPVER", defaultValue: "?"); + String envAppVer = const String.fromEnvironment( + "APPVER", + defaultValue: "?"); return DefaultTextStyle( style: Theme.of(context) .textTheme diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart index 98bcb656..cab1577e 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart @@ -5,6 +5,6 @@ class GradesBody extends StatelessWidget { @override Widget build(BuildContext context) { - return Column(); + return const Column(); } } diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart index 28c052f2..933dd38e 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart @@ -5,6 +5,6 @@ class PersonalityBody extends StatelessWidget { @override Widget build(BuildContext context) { - return Column(); + return const Column(); } } diff --git a/filcnaplo_premium/lib/ui/mobile/premium/activation_view/activation_dashboard.dart b/filcnaplo_premium/lib/ui/mobile/premium/activation_view/activation_dashboard.dart index 5a3fe0a5..7d6448fe 100644 --- a/filcnaplo_premium/lib/ui/mobile/premium/activation_view/activation_dashboard.dart +++ b/filcnaplo_premium/lib/ui/mobile/premium/activation_view/activation_dashboard.dart @@ -24,7 +24,8 @@ class _ActivationDashboardState extends State { setState(() { manualActivationLoading = true; }); - final result = await context.read().auth.finishAuth(data.text!); + final result = + await context.read().auth.finishAuth(data.text!); setState(() { manualActivationLoading = false; }); @@ -63,24 +64,27 @@ class _ActivationDashboardState extends State { ), const SizedBox(height: 12.0), Card( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(14.0)), - child: Padding( - padding: const EdgeInsets.all(20.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(14.0)), + child: const Padding( + padding: EdgeInsets.all(20.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( - children: const [ - Icon(FeatherIcons.alertTriangle, size: 20.0, color: Colors.orange), + children: [ + Icon(FeatherIcons.alertTriangle, + size: 20.0, color: Colors.orange), SizedBox(width: 12.0), Text( "Figyelem!", - style: TextStyle(fontSize: 18.0, fontWeight: FontWeight.bold), + style: TextStyle( + fontSize: 18.0, fontWeight: FontWeight.bold), ), ], ), - const SizedBox(height: 6.0), - const Text( + SizedBox(height: 6.0), + Text( "Csak akkor érzékeli a Filc a támogatói státuszod, ha nem állítod privátra!", style: TextStyle(fontSize: 16.0), ), @@ -90,24 +94,27 @@ class _ActivationDashboardState extends State { ), const SizedBox(height: 12.0), Card( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(14.0)), - child: Padding( - padding: const EdgeInsets.all(20.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(14.0)), + child: const Padding( + padding: EdgeInsets.all(20.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( - children: const [ - Icon(FeatherIcons.alertTriangle, size: 20.0, color: Colors.orange), + children: [ + Icon(FeatherIcons.alertTriangle, + size: 20.0, color: Colors.orange), SizedBox(width: 12.0), Text( "Figyelem!", - style: TextStyle(fontSize: 18.0, fontWeight: FontWeight.bold), + style: TextStyle( + fontSize: 18.0, fontWeight: FontWeight.bold), ), ], ), - const SizedBox(height: 6.0), - const Text( + SizedBox(height: 6.0), + Text( "Ha friss támogató vagy, 5-10 percbe telhet az aktiválás. Kérlek gyere vissza később, és próbáld újra!", style: TextStyle(fontSize: 16.0), ), @@ -117,7 +124,8 @@ class _ActivationDashboardState extends State { ), const SizedBox(height: 12.0), Card( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(14.0)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(14.0)), child: Padding( padding: const EdgeInsets.all(20.0), child: Column( @@ -125,15 +133,20 @@ class _ActivationDashboardState extends State { children: [ const Text( "Ha bejelentkezés után nem lép vissza az alkalmazásba automatikusan, aktiváld a támogatásod manuálisan", - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.w500), + style: + TextStyle(fontSize: 15.0, fontWeight: FontWeight.w500), ), const SizedBox(height: 6.0), Center( child: TextButton.icon( onPressed: onManualActivation, style: ButtonStyle( - foregroundColor: MaterialStatePropertyAll(Theme.of(context).colorScheme.secondary), - overlayColor: MaterialStatePropertyAll(Theme.of(context).colorScheme.secondary.withOpacity(.1)), + foregroundColor: MaterialStatePropertyAll( + Theme.of(context).colorScheme.secondary), + overlayColor: MaterialStatePropertyAll(Theme.of(context) + .colorScheme + .secondary + .withOpacity(.1)), ), icon: manualActivationLoading ? const SizedBox( @@ -164,8 +177,10 @@ class _ActivationDashboardState extends State { Navigator.of(context).pop(); }, style: ButtonStyle( - foregroundColor: MaterialStatePropertyAll(AppColors.of(context).text), - overlayColor: MaterialStatePropertyAll(AppColors.of(context).text.withOpacity(.1)), + foregroundColor: + MaterialStatePropertyAll(AppColors.of(context).text), + overlayColor: MaterialStatePropertyAll( + AppColors.of(context).text.withOpacity(.1)), ), icon: const Icon(FeatherIcons.arrowLeft, size: 20.0), label: const Text( diff --git a/filcnaplo_premium/lib/ui/mobile/settings/modify_subject_names.dart b/filcnaplo_premium/lib/ui/mobile/settings/modify_subject_names.dart index 76c01d1d..7de5d5e9 100644 --- a/filcnaplo_premium/lib/ui/mobile/settings/modify_subject_names.dart +++ b/filcnaplo_premium/lib/ui/mobile/settings/modify_subject_names.dart @@ -22,7 +22,8 @@ import 'package:provider/provider.dart'; import 'modify_subject_names.i18n.dart'; class MenuRenamedSubjects extends StatelessWidget { - const MenuRenamedSubjects({Key? key, required this.settings}) : super(key: key); + const MenuRenamedSubjects({Key? key, required this.settings}) + : super(key: key); final SettingsProvider settings; @@ -31,8 +32,10 @@ class MenuRenamedSubjects extends StatelessWidget { return PanelButton( padding: const EdgeInsets.only(left: 14.0), onPressed: () { - if (!Provider.of(context, listen: false).hasScope(PremiumScopes.renameSubjects)) { - PremiumLockedFeatureUpsell.show(context: context, feature: PremiumFeature.subjectrename); + if (!Provider.of(context, listen: false) + .hasScope(PremiumScopes.renameSubjects)) { + PremiumLockedFeatureUpsell.show( + context: context, feature: PremiumFeature.subjectrename); return; } @@ -42,23 +45,32 @@ class MenuRenamedSubjects extends StatelessWidget { }, title: Text( "rename_subjects".i18n, - style: TextStyle(color: AppColors.of(context).text.withOpacity(settings.renamedSubjectsEnabled ? 1.0 : .5)), + style: TextStyle( + color: AppColors.of(context) + .text + .withOpacity(settings.renamedSubjectsEnabled ? 1.0 : .5)), ), leading: settings.renamedSubjectsEnabled ? const Icon(FeatherIcons.penTool) - : Icon(FeatherIcons.penTool, color: AppColors.of(context).text.withOpacity(.25)), + : Icon(FeatherIcons.penTool, + color: AppColors.of(context).text.withOpacity(.25)), trailingDivider: true, trailing: Switch( onChanged: (v) async { - if (!Provider.of(context, listen: false).hasScope(PremiumScopes.renameSubjects)) { - PremiumLockedFeatureUpsell.show(context: context, feature: PremiumFeature.subjectrename); + if (!Provider.of(context, listen: false) + .hasScope(PremiumScopes.renameSubjects)) { + PremiumLockedFeatureUpsell.show( + context: context, feature: PremiumFeature.subjectrename); return; } settings.update(renamedSubjectsEnabled: v); - await Provider.of(context, listen: false).convertBySettings(); - await Provider.of(context, listen: false).convertBySettings(); - await Provider.of(context, listen: false).convertBySettings(); + await Provider.of(context, listen: false) + .convertBySettings(); + await Provider.of(context, listen: false) + .convertBySettings(); + await Provider.of(context, listen: false) + .convertBySettings(); }, value: settings.renamedSubjectsEnabled, activeColor: Theme.of(context).colorScheme.secondary, @@ -87,7 +99,11 @@ class _ModifySubjectNamesState extends State { @override void initState() { super.initState(); - subjects = Provider.of(context, listen: false).grades.map((e) => e.subject).toSet().toList() + subjects = Provider.of(context, listen: false) + .grades + .map((e) => e.subject) + .toSet() + .toList() ..sort((a, b) => a.name.compareTo(b.name)); user = Provider.of(context, listen: false); dbProvider = Provider.of(context, listen: false); @@ -102,7 +118,8 @@ class _ModifySubjectNamesState extends State { context: context, builder: (context) => StatefulBuilder(builder: (context, setS) { return AlertDialog( - shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(14.0))), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(14.0))), title: Text("rename_subject".i18n), content: Column( mainAxisSize: MainAxisSize.min, @@ -162,13 +179,18 @@ class _ModifySubjectNamesState extends State { border: Border.all(color: Colors.grey, width: 2), borderRadius: BorderRadius.circular(12.0), ), - padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 8.0), + padding: const EdgeInsets.symmetric( + vertical: 12.0, horizontal: 8.0), child: Text( - selectedSubjectId == null ? "select_subject".i18n : subjects.firstWhere((element) => element.id == selectedSubjectId).name, - style: Theme.of(context) - .textTheme - .titleSmall! - .copyWith(fontWeight: FontWeight.w700, color: AppColors.of(context).text.withOpacity(0.75)), + selectedSubjectId == null + ? "select_subject".i18n + : subjects + .firstWhere( + (element) => element.id == selectedSubjectId) + .name, + style: Theme.of(context).textTheme.titleSmall!.copyWith( + fontWeight: FontWeight.w700, + color: AppColors.of(context).text.withOpacity(0.75)), overflow: TextOverflow.ellipsis, maxLines: 2, textAlign: TextAlign.center, @@ -183,11 +205,13 @@ class _ModifySubjectNamesState extends State { controller: _subjectName, decoration: InputDecoration( border: OutlineInputBorder( - borderSide: const BorderSide(color: Colors.grey, width: 1.5), + borderSide: + const BorderSide(color: Colors.grey, width: 1.5), borderRadius: BorderRadius.circular(12.0), ), focusedBorder: OutlineInputBorder( - borderSide: const BorderSide(color: Colors.grey, width: 1.5), + borderSide: + const BorderSide(color: Colors.grey, width: 1.5), borderRadius: BorderRadius.circular(12.0), ), contentPadding: const EdgeInsets.symmetric(horizontal: 12.0), @@ -227,10 +251,14 @@ class _ModifySubjectNamesState extends State { final renamedSubs = await fetchRenamedSubjects(); renamedSubs[selectedSubjectId!] = _subjectName.text; - await dbProvider.userStore.storeRenamedSubjects(renamedSubs, userId: user.id!); - await Provider.of(context, listen: false).convertBySettings(); - await Provider.of(context, listen: false).convertBySettings(); - await Provider.of(context, listen: false).convertBySettings(); + await dbProvider.userStore + .storeRenamedSubjects(renamedSubs, userId: user.id!); + await Provider.of(context, listen: false) + .convertBySettings(); + await Provider.of(context, listen: false) + .convertBySettings(); + await Provider.of(context, listen: false) + .convertBySettings(); } Navigator.of(context).pop(true); setState(() {}); @@ -265,9 +293,17 @@ class _ModifySubjectNamesState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Panel( - child: PanelButton(title: Text("italics_toggle".i18n), trailing: Switch(value: settings.renamedSubjectsItalics, onChanged: (value) => settings.update(renamedSubjectsItalics: value),) - ),), - SizedBox(height: 20,), + child: PanelButton( + title: Text("italics_toggle".i18n), + trailing: Switch( + value: settings.renamedSubjectsItalics, + onChanged: (value) => + settings.update(renamedSubjectsItalics: value), + )), + ), + const SizedBox( + height: 20, + ), InkWell( onTap: showRenameDialog, borderRadius: BorderRadius.circular(12.0), @@ -277,7 +313,8 @@ class _ModifySubjectNamesState extends State { border: Border.all(color: Colors.grey, width: 2), borderRadius: BorderRadius.circular(12.0), ), - padding: const EdgeInsets.symmetric(vertical: 18.0, horizontal: 12.0), + padding: const EdgeInsets.symmetric( + vertical: 18.0, horizontal: 12.0), child: Center( child: Text( "rename_new_subject".i18n, @@ -296,14 +333,17 @@ class _ModifySubjectNamesState extends State { FutureBuilder>( future: fetchRenamedSubjects(), builder: (context, snapshot) { - if (!snapshot.hasData || snapshot.data!.isEmpty) return Container(); + if (!snapshot.hasData || snapshot.data!.isEmpty) { + return Container(); + } return Panel( title: Text("renamed_subjects".i18n), child: Column( children: snapshot.data!.keys.map( (key) { - Subject? subject = subjects.firstWhere((element) => key == element.id); + Subject? subject = subjects + .firstWhere((element) => key == element.id); String renameTo = snapshot.data![key]!; return RenamedSubjectItem( subject: subject, @@ -317,9 +357,12 @@ class _ModifySubjectNamesState extends State { }, removeCallback: () { setState(() { - Map subs = Map.from(snapshot.data!); + Map subs = + Map.from(snapshot.data!); subs.remove(key); - dbProvider.userStore.storeRenamedSubjects(subs, userId: user.id!); + dbProvider.userStore.storeRenamedSubjects( + subs, + userId: user.id!); }); }, ); @@ -355,11 +398,14 @@ class RenamedSubjectItem extends StatelessWidget { return ListTile( minLeadingWidth: 32.0, dense: true, - contentPadding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 6.0), + contentPadding: + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 6.0), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)), visualDensity: VisualDensity.compact, onTap: () {}, - leading: Icon(SubjectIcon.resolveVariant(subject: subject, context: context), color: AppColors.of(context).text.withOpacity(.75)), + leading: Icon( + SubjectIcon.resolveVariant(subject: subject, context: context), + color: AppColors.of(context).text.withOpacity(.75)), title: InkWell( onTap: modifyCallback, child: Column( @@ -367,7 +413,10 @@ class RenamedSubjectItem extends StatelessWidget { children: [ Text( subject.name.capital(), - style: TextStyle(fontWeight: FontWeight.w500, fontSize: 14, color: AppColors.of(context).text.withOpacity(.75)), + style: TextStyle( + fontWeight: FontWeight.w500, + fontSize: 14, + color: AppColors.of(context).text.withOpacity(.75)), maxLines: 1, overflow: TextOverflow.ellipsis, ), @@ -382,7 +431,8 @@ class RenamedSubjectItem extends StatelessWidget { ), trailing: InkWell( onTap: removeCallback, - child: Icon(FeatherIcons.trash, color: AppColors.of(context).red.withOpacity(.75)), + child: Icon(FeatherIcons.trash, + color: AppColors.of(context).red.withOpacity(.75)), ), ); } From 751cd04ce2516d0258afb99cf21ebb9c6fe0a89b Mon Sep 17 00:00:00 2001 From: CroatianHusky <90392654+CroatianHusky@users.noreply.github.com> Date: Mon, 12 Jun 2023 17:14:42 +0200 Subject: [PATCH 02/99] developer settings i18n --- .../lib/screens/settings/settings_screen.dart | 14 +++++++------- .../screens/settings/settings_screen.i18n.dart | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart b/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart index c7df96a4..2220ec39 100755 --- a/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart +++ b/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart @@ -912,7 +912,7 @@ class _SettingsScreenState extends State padding: const EdgeInsets.symmetric( vertical: 12.0, horizontal: 24.0), child: Panel( - title: const Text("Developer Settings"), + title: Text("devsettings".i18n), child: Column( children: [ Material( @@ -921,8 +921,8 @@ class _SettingsScreenState extends State contentPadding: const EdgeInsets.only(left: 12.0), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12.0)), - title: const Text("Developer Mode", - style: TextStyle(fontWeight: FontWeight.w500)), + title: Text("devmode".i18n, + style: const TextStyle(fontWeight: FontWeight.w500)), onChanged: (v) => settings.update(developerMode: false), value: settings.developerMode, @@ -931,7 +931,7 @@ class _SettingsScreenState extends State ), PanelButton( leading: const Icon(FeatherIcons.copy), - title: const Text("Copy JWT"), + title: Text("copy_jwt".i18n), onPressed: () => Clipboard.setData(ClipboardData( text: Provider.of(context, listen: false) @@ -998,13 +998,13 @@ class _SettingsScreenState extends State ScaffoldMessenger.of(context).showSnackBar(SnackBar( duration: const Duration(milliseconds: 200), content: Text( - "You are $devmodeCountdown taps away from Developer Mode."), + "devmoretaps".i18n.fill([devmodeCountdown])), )); setState(() => devmodeCountdown--); } else if (devmodeCountdown == 0) { - ScaffoldMessenger.of(context).showSnackBar(const SnackBar( - content: Text("Developer Mode successfully activated."), + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text("devactivated".i18n), )); settings.update(developerMode: true); diff --git a/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.i18n.dart b/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.i18n.dart index 8126d58e..eb599398 100755 --- a/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.i18n.dart +++ b/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.i18n.dart @@ -66,6 +66,11 @@ extension SettingsLocalization on String { "Adaptive Theme": "Adaptive Theme", "presentation": "Presentation mode", "uwufymode": "UwU-fied mode (hungarian)", + "devmoretaps": "You are %s taps away from Developer Mode.", + "devactivated": "Developer Mode successfully activated.", + "devsettings": "Developer Settings", + "devmode": "Developer Mode", + "copy_jwt": "Copy JWT", }, "hu_hu": { "personal_details": "Személyes információk", @@ -130,6 +135,11 @@ extension SettingsLocalization on String { "Adaptive Theme": "Adaptív téma", "presentation": "Bemutató mód", "uwufymode": "UwU mód (magyar)", + "devmoretaps": "Még %s érintésre vagy a Fejlesztői módtól.", + "devactivated": "Fejlesztői mód sikeresen aktiválva.", + "devsettings": "Fejlesztői Beállítások", + "devmode": "Fejlesztői mód", + "copy_jwt": "JWT másolása", }, "de_de": { "personal_details": "Persönliche Angaben", @@ -193,6 +203,11 @@ extension SettingsLocalization on String { "Adaptive Theme": "Adaptive Theme", "presentation": "Präsentationsmodus", "uwufymode": "UwU-Modus (ungarisch)", + "devmoretaps": "Sie sind %s Taps vom Entwicklermodus entfernt.", + "devactivated": "Entwicklermodus erfolgreich aktiviert.", + "devsettings": "Entwickleroptionen", + "devmode": "Entwicklermodus", + "copy_jwt": "JWT kopieren", }, }; From ae7c724f6571bb55f37bd9f9025e86040847fd1d Mon Sep 17 00:00:00 2001 From: CroatianHusky <90392654+CroatianHusky@users.noreply.github.com> Date: Mon, 12 Jun 2023 17:33:00 +0200 Subject: [PATCH 03/99] notification toggle color fix --- .../lib/screens/settings/settings_screen.dart | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart b/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart index 2220ec39..80bf7c42 100755 --- a/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart +++ b/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart @@ -458,13 +458,13 @@ class _SettingsScreenState extends State fontSize: 16.0, ), ), - SizedBox( + const SizedBox( width: 5, ), SizedBox( height: 30, child: AnimatedContainer( - duration: Duration(milliseconds: 200), + duration: const Duration(milliseconds: 200), child: Padding( padding: const EdgeInsets.only(left: 10, right: 10), @@ -482,8 +482,9 @@ class _SettingsScreenState extends State overflow: TextOverflow.ellipsis))), ), decoration: BoxDecoration( - color: AppColors.of(context).filc.withOpacity( - settings.notificationsEnabled ? 1.0 : .5), + color: settings.notificationsEnabled + ? Theme.of(context).colorScheme.secondary + : AppColors.of(context).text.withOpacity(.25), borderRadius: BorderRadius.circular(40)), ), ) From 301e8cb638c203d56455eca233a27260b0ffe873 Mon Sep 17 00:00:00 2001 From: CroatianHusky <90392654+CroatianHusky@users.noreply.github.com> Date: Mon, 12 Jun 2023 17:35:13 +0200 Subject: [PATCH 04/99] Updated settings_screen.i18n.dart --- .../lib/screens/settings/settings_screen.i18n.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.i18n.dart b/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.i18n.dart index eb599398..ae7f40d1 100755 --- a/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.i18n.dart +++ b/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.i18n.dart @@ -135,7 +135,7 @@ extension SettingsLocalization on String { "Adaptive Theme": "Adaptív téma", "presentation": "Bemutató mód", "uwufymode": "UwU mód (magyar)", - "devmoretaps": "Még %s érintésre vagy a Fejlesztői módtól.", + "devmoretaps": "Még %s koppintásra vagy a Fejlesztői módtól.", "devactivated": "Fejlesztői mód sikeresen aktiválva.", "devsettings": "Fejlesztői Beállítások", "devmode": "Fejlesztői mód", From 3857896d6c1ebd608f46b89766eadc52e57229f6 Mon Sep 17 00:00:00 2001 From: Tihanyi Marcell Date: Mon, 12 Jun 2023 20:08:53 +0200 Subject: [PATCH 05/99] Ghost Grade title overflow fix --- filcnaplo_mobile_ui/lib/pages/grades/grade_subject_view.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filcnaplo_mobile_ui/lib/pages/grades/grade_subject_view.dart b/filcnaplo_mobile_ui/lib/pages/grades/grade_subject_view.dart index a260e280..a638637a 100755 --- a/filcnaplo_mobile_ui/lib/pages/grades/grade_subject_view.dart +++ b/filcnaplo_mobile_ui/lib/pages/grades/grade_subject_view.dart @@ -280,7 +280,7 @@ class _GradeSubjectViewState extends State { void gradeCalc(BuildContext context) { // Scroll to the top of the page - _scrollController.animateTo(75, + _scrollController.animateTo(100, duration: const Duration(milliseconds: 500), curve: Curves.ease); calculatorProvider.clear(); From e255182b935226c7ab105eea1fba89414d3613c7 Mon Sep 17 00:00:00 2001 From: Tihanyi Marcell Date: Mon, 12 Jun 2023 20:09:11 +0200 Subject: [PATCH 06/99] Removed " " from login --- filcnaplo/lib/api/login.dart | 8 +++----- filcnaplo_kreta_api/lib/client/client.dart | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/filcnaplo/lib/api/login.dart b/filcnaplo/lib/api/login.dart index 0e2df02a..9f3b2fd0 100644 --- a/filcnaplo/lib/api/login.dart +++ b/filcnaplo/lib/api/login.dart @@ -57,15 +57,13 @@ Future loginApi({ String nonceStr = await Provider.of(context, listen: false) .getAPI(KretaAPI.nonce, json: false); - Nonce nonce = - getNonce(nonceStr, '${username.replaceAll(' ', '')} ', instituteCode); - headers.addAll(nonce.header()); + Nonce nonce = getNonce(nonceStr, username, instituteCode); Map? res = await Provider.of(context, listen: false) .postAPI(KretaAPI.login, headers: headers, body: User.loginBody( - username: '${username.replaceAll(' ', '')} ', + username: username, password: password, instituteCode: instituteCode, )); @@ -84,7 +82,7 @@ Future loginApi({ .getAPI(KretaAPI.student(instituteCode)); Student student = Student.fromJson(studentJson!); var user = User( - username: '${username.replaceAll(' ', '')} ', + username: username, password: password, instituteCode: instituteCode, name: student.name, diff --git a/filcnaplo_kreta_api/lib/client/client.dart b/filcnaplo_kreta_api/lib/client/client.dart index a8594799..9910d607 100644 --- a/filcnaplo_kreta_api/lib/client/client.dart +++ b/filcnaplo_kreta_api/lib/client/client.dart @@ -169,7 +169,7 @@ class KretaClient { Map? loginRes = await postAPI(KretaAPI.login, headers: headers, body: User.loginBody( - username: loginUser.username.replaceAll(' ', '') + ' ', + username: loginUser.username, password: loginUser.password, instituteCode: loginUser.instituteCode, )); From 131454b99d07f3e39554131c3a7c662d13eefcc2 Mon Sep 17 00:00:00 2001 From: Tihanyi Marcell Date: Mon, 12 Jun 2023 20:09:27 +0200 Subject: [PATCH 07/99] Notification Capabilitie --- filcnaplo/ios/Runner/Runner.entitlements | 2 ++ 1 file changed, 2 insertions(+) diff --git a/filcnaplo/ios/Runner/Runner.entitlements b/filcnaplo/ios/Runner/Runner.entitlements index 123fc6ca..36e7279a 100644 --- a/filcnaplo/ios/Runner/Runner.entitlements +++ b/filcnaplo/ios/Runner/Runner.entitlements @@ -2,6 +2,8 @@ + aps-environment + development com.apple.security.application-groups group.refilcnaplo.livecard From f78a542be216ad6c00fda491a69630a9e8a814fc Mon Sep 17 00:00:00 2001 From: Tihanyi Marcell Date: Mon, 12 Jun 2023 20:09:48 +0200 Subject: [PATCH 08/99] iOS notification permission fix --- filcnaplo/lib/main.dart | 46 ++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/filcnaplo/lib/main.dart b/filcnaplo/lib/main.dart index 9f62e1e2..9f5c788f 100644 --- a/filcnaplo/lib/main.dart +++ b/filcnaplo/lib/main.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:background_fetch/background_fetch.dart'; import 'package:filcnaplo/api/providers/user_provider.dart'; import 'package:filcnaplo/api/providers/database_provider.dart'; @@ -53,26 +55,32 @@ class Startup { FlutterLocalNotificationsPlugin(); // Get permission to show notifications - flutterLocalNotificationsPlugin - .resolvePlatformSpecificImplementation< + if (Platform.isAndroid) { + await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< AndroidFlutterLocalNotificationsPlugin>()! - .requestPermission(); - await flutterLocalNotificationsPlugin - .resolvePlatformSpecificImplementation< - IOSFlutterLocalNotificationsPlugin>() - ?.requestPermissions( - alert: false, - badge: true, - sound: true, - ); - await flutterLocalNotificationsPlugin - .resolvePlatformSpecificImplementation< - MacOSFlutterLocalNotificationsPlugin>() - ?.requestPermissions( - alert: false, - badge: true, - sound: true, - ); + .requestPermission(); + } + else if (Platform.isIOS) { + await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + IOSFlutterLocalNotificationsPlugin>() + ?.requestPermissions( + alert: false, + badge: true, + sound: true, + ); + } + else if (Platform.isMacOS) { + await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + MacOSFlutterLocalNotificationsPlugin>() + ?.requestPermissions( + alert: false, + badge: true, + sound: true, + ); + } // Platform specific settings final DarwinInitializationSettings initializationSettingsDarwin = From c474512088e45b18a7126455390c40385741dafa Mon Sep 17 00:00:00 2001 From: Tihanyi Marcell Date: Mon, 12 Jun 2023 20:11:15 +0200 Subject: [PATCH 09/99] Live Activity version update, build-ipa.sh --- filcnaplo/build-ipa.sh | 4 ++++ filcnaplo/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/filcnaplo/build-ipa.sh b/filcnaplo/build-ipa.sh index 4ed678f3..53b8712f 100755 --- a/filcnaplo/build-ipa.sh +++ b/filcnaplo/build-ipa.sh @@ -1,3 +1,7 @@ #!/bin/sh +flutter clean +dart pub get +flutter doctor -v + flutter build ipa --release --dart-define=APPVER=$(cat pubspec.yaml | grep version: | cut -d' ' -f2 | cut -d+ -f1) --no-tree-shake-icons diff --git a/filcnaplo/pubspec.yaml b/filcnaplo/pubspec.yaml index 5cf60ff6..23ad74a8 100644 --- a/filcnaplo/pubspec.yaml +++ b/filcnaplo/pubspec.yaml @@ -48,7 +48,7 @@ dependencies: crypto: ^3.0.2 elegant_notification: ^1.6.1 flutter_feather_icons: ^2.0.0+1 - live_activities: ^1.0.0 + live_activities: ^1.7.4 animated_flip_counter: ^0.2.5 lottie: ^1.4.3 rive: ^0.9.1 From ded7c51f44e945966c43244c681d7f4956504833 Mon Sep 17 00:00:00 2001 From: Tihanyi Marcell Date: Mon, 12 Jun 2023 21:54:13 +0200 Subject: [PATCH 10/99] Block empty fullscreen timetable --- .../lib/pages/timetable/timetable_page.dart | 2 +- .../pages/timetable/timetable_page.i18n.dart | 3 +++ .../mobile/timetable/fs_timetable_button.dart | 27 +++++++++++++++---- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/filcnaplo_mobile_ui/lib/pages/timetable/timetable_page.dart b/filcnaplo_mobile_ui/lib/pages/timetable/timetable_page.dart index b58cd315..f447a731 100755 --- a/filcnaplo_mobile_ui/lib/pages/timetable/timetable_page.dart +++ b/filcnaplo_mobile_ui/lib/pages/timetable/timetable_page.dart @@ -199,7 +199,7 @@ class _TimetablePageState extends State snap: false, surfaceTintColor: Theme.of(context).scaffoldBackgroundColor, actions: [ - PremiumFSTimetableButton(controller: _controller), + PremiumFSTimetableButton(controller: _controller, tabcontroller: _tabController), // Profile Icon Padding( diff --git a/filcnaplo_mobile_ui/lib/pages/timetable/timetable_page.i18n.dart b/filcnaplo_mobile_ui/lib/pages/timetable/timetable_page.i18n.dart index 21eaa513..0f97f629 100755 --- a/filcnaplo_mobile_ui/lib/pages/timetable/timetable_page.i18n.dart +++ b/filcnaplo_mobile_ui/lib/pages/timetable/timetable_page.i18n.dart @@ -8,18 +8,21 @@ extension Localization on String { "empty": "No school this week!", "week": "Week", "error": "Failed to fetch timetable!", + "empty_timetable": "Timetable is empty!", }, "hu_hu": { "timetable": "Órarend", "empty": "Ezen a héten nincs iskola.", "week": "Hét", "error": "Nem sikerült lekérni az órarendet!", + "empty_timetable": "Az órarend üres!", }, "de_de": { "timetable": "Zeitplan", "empty": "Keine Schule diese Woche.", "week": "Woche", "error": "Der Fahrplan konnte nicht abgerufen werden!", + "empty_timetable": "Der Zeitplan ist blank!", }, }; diff --git a/filcnaplo_premium/lib/ui/mobile/timetable/fs_timetable_button.dart b/filcnaplo_premium/lib/ui/mobile/timetable/fs_timetable_button.dart index 8b97db2f..db5e22df 100644 --- a/filcnaplo_premium/lib/ui/mobile/timetable/fs_timetable_button.dart +++ b/filcnaplo_premium/lib/ui/mobile/timetable/fs_timetable_button.dart @@ -9,11 +9,15 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:provider/provider.dart'; +import 'package:filcnaplo_mobile_ui/pages/timetable/timetable_page.i18n.dart'; class PremiumFSTimetableButton extends StatelessWidget { - const PremiumFSTimetableButton({Key? key, required this.controller}) : super(key: key); + const PremiumFSTimetableButton( + {Key? key, required this.controller, required this.tabcontroller}) + : super(key: key); final TimetableController controller; + final TabController tabcontroller; @override Widget build(BuildContext context) { @@ -22,19 +26,32 @@ class PremiumFSTimetableButton extends StatelessWidget { child: IconButton( splashRadius: 24.0, onPressed: () { - if (!Provider.of(context, listen: false).hasScope(PremiumScopes.fsTimetable)) { - PremiumLockedFeatureUpsell.show(context: context, feature: PremiumFeature.weeklytimetable); + if (!Provider.of(context, listen: false) + .hasScope(PremiumScopes.fsTimetable)) { + PremiumLockedFeatureUpsell.show( + context: context, feature: PremiumFeature.weeklytimetable); + return; + } + + // If timetable empty, show empty + if (tabcontroller.length == 0) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text("empty_timetable".i18n), + duration: const Duration(seconds: 2), + )); return; } Navigator.of(context, rootNavigator: true) .push(PageRouteBuilder( - pageBuilder: (context, animation, secondaryAnimation) => PremiumFSTimetable( + pageBuilder: (context, animation, secondaryAnimation) => + PremiumFSTimetable( controller: controller, ), )) .then((_) { - SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + SystemChrome.setPreferredOrientations( + [DeviceOrientation.portraitUp]); setSystemChrome(context); }); }, From 1a9080dcc26617b4e066612c7266e88822d72388 Mon Sep 17 00:00:00 2001 From: kima Date: Tue, 13 Jun 2023 23:27:40 +0200 Subject: [PATCH 11/99] added event functionality and summary to livecard --- .../lib/api/providers/live_card_provider.dart | 3 +- .../flutter/generated_plugin_registrant.cc | 4 + .../linux/flutter/generated_plugins.cmake | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 2 + .../lib/pages/home/live_card/live_card.dart | 16 + .../home/live_card/live_card_widget.dart | 430 +++++++++++------- 6 files changed, 303 insertions(+), 153 deletions(-) diff --git a/filcnaplo/lib/api/providers/live_card_provider.dart b/filcnaplo/lib/api/providers/live_card_provider.dart index 96a3bf2d..332b0dab 100644 --- a/filcnaplo/lib/api/providers/live_card_provider.dart +++ b/filcnaplo/lib/api/providers/live_card_provider.dart @@ -19,7 +19,8 @@ enum LiveCardState { duringBreak, morning, afternoon, - night + night, + summary } class LiveCardProvider extends ChangeNotifier { diff --git a/filcnaplo/linux/flutter/generated_plugin_registrant.cc b/filcnaplo/linux/flutter/generated_plugin_registrant.cc index 4894d346..0fcfb275 100644 --- a/filcnaplo/linux/flutter/generated_plugin_registrant.cc +++ b/filcnaplo/linux/flutter/generated_plugin_registrant.cc @@ -7,6 +7,7 @@ #include "generated_plugin_registrant.h" #include +#include #include #include @@ -14,6 +15,9 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) dynamic_color_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin"); dynamic_color_plugin_register_with_registrar(dynamic_color_registrar); + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); g_autoptr(FlPluginRegistrar) flutter_acrylic_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterAcrylicPlugin"); flutter_acrylic_plugin_register_with_registrar(flutter_acrylic_registrar); diff --git a/filcnaplo/linux/flutter/generated_plugins.cmake b/filcnaplo/linux/flutter/generated_plugins.cmake index c8808fea..c5541e6e 100644 --- a/filcnaplo/linux/flutter/generated_plugins.cmake +++ b/filcnaplo/linux/flutter/generated_plugins.cmake @@ -4,6 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST dynamic_color + file_selector_linux flutter_acrylic url_launcher_linux ) diff --git a/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift b/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift index c6b190d7..53df988b 100644 --- a/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,6 +7,7 @@ import Foundation import connectivity_plus import dynamic_color +import file_selector_macos import flutter_local_notifications import macos_window_utils import package_info_plus @@ -18,6 +19,7 @@ import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin")) DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) MacOSWindowUtilsPlugin.register(with: registry.registrar(forPlugin: "MacOSWindowUtilsPlugin")) FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) diff --git a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart index eb311241..aed32346 100755 --- a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart +++ b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart @@ -4,6 +4,7 @@ import 'package:filcnaplo/helpers/subject.dart'; import 'package:filcnaplo/icons/filc_icons.dart'; import 'package:filcnaplo/models/settings.dart'; import 'package:filcnaplo_mobile_ui/pages/home/live_card/heads_up_countdown.dart'; +import 'package:filcnaplo_mobile_ui/screens/summary/summary_screen.dart'; import 'package:flutter/material.dart'; import 'package:filcnaplo/utils/format.dart'; import 'package:filcnaplo/api/providers/live_card_provider.dart'; @@ -52,6 +53,21 @@ class _LiveCardState extends State { Duration bellDelay = liveCard.delay; switch (liveCard.currentState) { + case LiveCardState.summary: + child = LiveCardWidget( + key: const Key('livecard.summary'), + title: '', + icon: FeatherIcons.arrowRight, + description: Text(''), + onTap: () => Navigator.of(context).push( + MaterialPageRoute( + builder: (BuildContext context) => const SummaryScreen( + currentPage: 'grades', + ), + ), + ), + ); + break; case LiveCardState.morning: child = LiveCardWidget( key: const Key('livecard.morning'), diff --git a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card_widget.dart b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card_widget.dart index 78639a78..308e4e7c 100755 --- a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card_widget.dart +++ b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card_widget.dart @@ -9,6 +9,7 @@ enum ProgressAccuracy { minutes, seconds } class LiveCardWidget extends StatefulWidget { const LiveCardWidget({ Key? key, + this.isEvent = false, this.leading, this.title, this.titleItalic = false, @@ -22,8 +23,10 @@ class LiveCardWidget extends StatefulWidget { this.progressMax, this.progressAccuracy = ProgressAccuracy.minutes, this.onProgressTap, + this.onTap, }) : super(key: key); + final bool isEvent; final String? leading; final String? title; final bool titleItalic; @@ -37,6 +40,7 @@ class LiveCardWidget extends StatefulWidget { final double? progressMax; final ProgressAccuracy? progressAccuracy; final Function()? onProgressTap; + final Function()? onTap; @override State createState() => _LiveCardWidgetState(); @@ -51,6 +55,7 @@ class _LiveCardWidgetState extends State { onLongPressDown: (_) => setState(() => hold = true), onLongPressEnd: (_) => setState(() => hold = false), onLongPressCancel: () => setState(() => hold = false), + onTap: widget.onTap, child: AnimatedScale( scale: hold ? 1.03 : 1.0, curve: Curves.easeInOutBack, @@ -73,171 +78,292 @@ class _LiveCardWidgetState extends State { padding: const EdgeInsets.symmetric(horizontal: 6.0), child: OverflowBox( maxHeight: 96.0, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Expanded( - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, + child: widget.isEvent + ? Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - if (widget.leading != null) - Padding( - padding: const EdgeInsets.only(right: 12.0, top: 8.0), - child: Text( - widget.leading!, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 32.0, - fontWeight: FontWeight.w600, - color: Theme.of(context).colorScheme.secondary, - ), - ), - ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Row( - children: [ - if (widget.title != null) - Expanded( - child: Text.rich( - TextSpan( - children: [ - TextSpan(text: widget.title!, style: TextStyle(fontStyle: widget.titleItalic ? FontStyle.italic : null)), - if (widget.subtitle != null) - WidgetSpan( - child: Container( - margin: const EdgeInsets.only(left: 6.0, bottom: 3.0), - padding: const EdgeInsets.symmetric(horizontal: 4.0, vertical: 2.0), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondary.withOpacity(.3), - borderRadius: BorderRadius.circular(4.0), - ), - child: Text( - widget.subtitle!, - style: TextStyle( - height: 1.2, - fontSize: 14.0, - fontWeight: FontWeight.w600, - color: Theme.of(context).colorScheme.secondary, - ), - ), - ), - ), - ], - ), - style: const TextStyle(fontWeight: FontWeight.w600, fontSize: 22.0), - maxLines: 1, - softWrap: false, - overflow: TextOverflow.ellipsis, - ), - ), - if (widget.title != null) const SizedBox(width: 6.0), - if (widget.icon != null) - Padding( - padding: const EdgeInsets.symmetric(vertical: 4.0), - child: Icon( - widget.icon, - size: 26.0, - color: AppColors.of(context).text.withOpacity(.75), - ), - ), - ], - ), - if (widget.description != null) - DefaultTextStyle( - style: Theme.of(context).textTheme.bodyMedium!.copyWith( - fontWeight: FontWeight.w500, - fontSize: 16.0, - height: 1.0, - color: AppColors.of(context).text.withOpacity(.75), - ), - maxLines: !(widget.nextSubject == null && widget.progressCurrent == null && widget.progressMax == null) ? 1 : 2, - softWrap: false, - overflow: TextOverflow.ellipsis, - child: widget.description!, - ), - ], + Text( + widget.title ?? 'Esemény', + style: TextStyle( + fontSize: 32, + fontStyle: + widget.titleItalic ? FontStyle.italic : null, ), ), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + widget.description ?? + const Text('Nincs leírás megadva.'), + SizedBox( + height: 15, + child: Container( + decoration: BoxDecoration( + color: Theme.of(context) + .colorScheme + .secondary + .withOpacity(0.5), + borderRadius: const BorderRadius.all( + Radius.circular(10), + ), + ), + child: Padding( + padding: const EdgeInsets.all(4), + child: Icon(widget.icon), + ), + ), + ), + ], + ), ], - ), - ), - if (!(widget.nextSubject == null && widget.progressCurrent == null && widget.progressMax == null)) - Padding( - padding: const EdgeInsets.only(top: 8.0), - child: Row( - children: [ - if (widget.nextSubject != null) const Icon(FeatherIcons.arrowRight, size: 12.0), - if (widget.nextSubject != null) const SizedBox(width: 4.0), - if (widget.nextSubject != null) - Expanded( - child: Text.rich( - TextSpan( + ) + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Expanded( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (widget.leading != null) + Padding( + padding: const EdgeInsets.only( + right: 12.0, top: 8.0), + child: Text( + widget.leading!, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 32.0, + fontWeight: FontWeight.w600, + color: Theme.of(context) + .colorScheme + .secondary, + ), + ), + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.spaceAround, children: [ - TextSpan( - text: widget.nextSubject!, style: TextStyle(fontStyle: widget.nextSubjectItalic ? FontStyle.italic : null)), - if (widget.nextRoom != null) - WidgetSpan( - child: Container( - margin: const EdgeInsets.only(left: 4.0), - padding: const EdgeInsets.symmetric(horizontal: 3.0, vertical: 1.5), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondary.withOpacity(.25), - borderRadius: BorderRadius.circular(4.0), - ), - child: Text( - widget.nextRoom!, - style: TextStyle( - height: 1.1, - fontSize: 11.0, - fontWeight: FontWeight.w600, - color: Theme.of(context).colorScheme.secondary.withOpacity(.9), + Row( + children: [ + if (widget.title != null) + Expanded( + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: widget.title!, + style: TextStyle( + fontStyle: widget + .titleItalic + ? FontStyle.italic + : null)), + if (widget.subtitle != null) + WidgetSpan( + child: Container( + margin: const EdgeInsets + .only( + left: 6.0, + bottom: 3.0), + padding: + const EdgeInsets + .symmetric( + horizontal: 4.0, + vertical: 2.0), + decoration: + BoxDecoration( + color: Theme.of( + context) + .colorScheme + .secondary + .withOpacity(.3), + borderRadius: + BorderRadius + .circular( + 4.0), + ), + child: Text( + widget.subtitle!, + style: TextStyle( + height: 1.2, + fontSize: 14.0, + fontWeight: + FontWeight.w600, + color: Theme.of( + context) + .colorScheme + .secondary, + ), + ), + ), + ), + ], + ), + style: const TextStyle( + fontWeight: FontWeight.w600, + fontSize: 22.0), + maxLines: 1, + softWrap: false, + overflow: TextOverflow.ellipsis, ), ), - ), + if (widget.title != null) + const SizedBox(width: 6.0), + if (widget.icon != null) + Padding( + padding: const EdgeInsets.symmetric( + vertical: 4.0), + child: Icon( + widget.icon, + size: 26.0, + color: AppColors.of(context) + .text + .withOpacity(.75), + ), + ), + ], + ), + if (widget.description != null) + DefaultTextStyle( + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith( + fontWeight: FontWeight.w500, + fontSize: 16.0, + height: 1.0, + color: AppColors.of(context) + .text + .withOpacity(.75), + ), + maxLines: + !(widget.nextSubject == null && + widget.progressCurrent == + null && + widget.progressMax == null) + ? 1 + : 2, + softWrap: false, + overflow: TextOverflow.ellipsis, + child: widget.description!, ), ], ), - style: TextStyle( - color: AppColors.of(context).text.withOpacity(.8), - fontWeight: FontWeight.w600, - ), - maxLines: 1, - overflow: TextOverflow.ellipsis, - softWrap: false, ), - ), - if (widget.nextRoom == null && widget.nextSubject == null) const Spacer(), - if (widget.progressCurrent != null && widget.progressMax != null) - GestureDetector( - onTap: widget.onProgressTap, - child: Container( - color: Colors.transparent, - child: Text( - "remaining ${widget.progressAccuracy == ProgressAccuracy.minutes ? 'min' : 'sec'}" - .plural((widget.progressMax! - widget.progressCurrent!).round()), - maxLines: 1, - style: TextStyle( - fontWeight: FontWeight.w500, - color: AppColors.of(context).text.withOpacity(.75), + ], + ), + ), + if (!(widget.nextSubject == null && + widget.progressCurrent == null && + widget.progressMax == null)) + Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Row( + children: [ + if (widget.nextSubject != null) + const Icon(FeatherIcons.arrowRight, + size: 12.0), + if (widget.nextSubject != null) + const SizedBox(width: 4.0), + if (widget.nextSubject != null) + Expanded( + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: widget.nextSubject!, + style: TextStyle( + fontStyle: + widget.nextSubjectItalic + ? FontStyle.italic + : null)), + if (widget.nextRoom != null) + WidgetSpan( + child: Container( + margin: const EdgeInsets.only( + left: 4.0), + padding: + const EdgeInsets.symmetric( + horizontal: 3.0, + vertical: 1.5), + decoration: BoxDecoration( + color: Theme.of(context) + .colorScheme + .secondary + .withOpacity(.25), + borderRadius: + BorderRadius.circular( + 4.0), + ), + child: Text( + widget.nextRoom!, + style: TextStyle( + height: 1.1, + fontSize: 11.0, + fontWeight: FontWeight.w600, + color: Theme.of(context) + .colorScheme + .secondary + .withOpacity(.9), + ), + ), + ), + ), + ], + ), + style: TextStyle( + color: AppColors.of(context) + .text + .withOpacity(.8), + fontWeight: FontWeight.w600, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + softWrap: false, + ), ), - ), - ), - ) - ], - ), + if (widget.nextRoom == null && + widget.nextSubject == null) + const Spacer(), + if (widget.progressCurrent != null && + widget.progressMax != null) + GestureDetector( + onTap: widget.onProgressTap, + child: Container( + color: Colors.transparent, + child: Text( + "remaining ${widget.progressAccuracy == ProgressAccuracy.minutes ? 'min' : 'sec'}" + .plural((widget.progressMax! - + widget.progressCurrent!) + .round()), + maxLines: 1, + style: TextStyle( + fontWeight: FontWeight.w500, + color: AppColors.of(context) + .text + .withOpacity(.75), + ), + ), + ), + ) + ], + ), + ), + if (widget.progressCurrent != null && + widget.progressMax != null) + Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: ProgressBar( + value: widget.progressCurrent! / + widget.progressMax!), + ) + ], ), - if (widget.progressCurrent != null && widget.progressMax != null) - Padding( - padding: const EdgeInsets.symmetric(vertical: 4.0), - child: ProgressBar(value: widget.progressCurrent! / widget.progressMax!), - ) - ], - ), ), ), ), From 2687cb146ba7a8e6a9642f841c652d83b4c961af Mon Sep 17 00:00:00 2001 From: kima Date: Tue, 13 Jun 2023 23:35:11 +0200 Subject: [PATCH 12/99] gitignore changes --- .gitignore | 2 +- filcnaplo/.gitignore | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ddfc58b2..fa91b41f 100644 --- a/.gitignore +++ b/.gitignore @@ -49,4 +49,4 @@ filcnaplo/linux/flutter/generated_plugin_registrant.h filcnaplo/linux/flutter/generated_plugins.cmake filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift .vscode/ - \ No newline at end of file +key.properties \ No newline at end of file diff --git a/filcnaplo/.gitignore b/filcnaplo/.gitignore index 8906afc6..7900af44 100644 --- a/filcnaplo/.gitignore +++ b/filcnaplo/.gitignore @@ -44,3 +44,4 @@ app.*.map.json /android/app/debug /android/app/profile /android/app/release +key.properties From 1c517a99f23adda6f34ab68e4e3a43eaf11c32c0 Mon Sep 17 00:00:00 2001 From: kima Date: Tue, 13 Jun 2023 23:37:25 +0200 Subject: [PATCH 13/99] fixed project problems --- .../lib/common/widgets/message/message_view_tile.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/filcnaplo_mobile_ui/lib/common/widgets/message/message_view_tile.dart b/filcnaplo_mobile_ui/lib/common/widgets/message/message_view_tile.dart index 62e8f83e..42cfd299 100755 --- a/filcnaplo_mobile_ui/lib/common/widgets/message/message_view_tile.dart +++ b/filcnaplo_mobile_ui/lib/common/widgets/message/message_view_tile.dart @@ -22,8 +22,9 @@ class MessageViewTile extends StatelessWidget { UserProvider user = Provider.of(context, listen: false); String recipientLabel = ""; - if (message.recipients.any((r) => r.name == user.student?.name)) + if (message.recipients.any((r) => r.name == user.student?.name)) { recipientLabel = "me".i18n; + } if (recipientLabel != "" && message.recipients.length > 1) { recipientLabel += " +"; From ea812e0b6702c91f11fda4627eaf2c24ba6de13c Mon Sep 17 00:00:00 2001 From: kima Date: Tue, 13 Jun 2023 23:37:35 +0200 Subject: [PATCH 14/99] fixed project problems --- filcnaplo/lib/api/login.dart | 5 - .../lib/helpers/notification_helper.dart | 7 +- filcnaplo/lib/main.dart | 135 +++++++++--------- .../lib/pages/home/live_card/live_card.dart | 2 +- 4 files changed, 74 insertions(+), 75 deletions(-) diff --git a/filcnaplo/lib/api/login.dart b/filcnaplo/lib/api/login.dart index 9f3b2fd0..02ec3a83 100644 --- a/filcnaplo/lib/api/login.dart +++ b/filcnaplo/lib/api/login.dart @@ -54,11 +54,6 @@ Future loginApi({ "content-type": "application/x-www-form-urlencoded", }; - String nonceStr = await Provider.of(context, listen: false) - .getAPI(KretaAPI.nonce, json: false); - - Nonce nonce = getNonce(nonceStr, username, instituteCode); - Map? res = await Provider.of(context, listen: false) .postAPI(KretaAPI.login, headers: headers, diff --git a/filcnaplo/lib/helpers/notification_helper.dart b/filcnaplo/lib/helpers/notification_helper.dart index c1cfcb62..ff0eb05b 100644 --- a/filcnaplo/lib/helpers/notification_helper.dart +++ b/filcnaplo/lib/helpers/notification_helper.dart @@ -4,7 +4,6 @@ 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/client.dart'; @@ -19,7 +18,6 @@ class NotificationsHelper { FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); DatabaseProvider database = DatabaseProvider(); - var db = await initDB(database); await database.init(); SettingsProvider settingsProvider = await database.query.getSettings(database); @@ -45,14 +43,15 @@ class NotificationsHelper { // loop through grades and see which hasn't been seen yet for (Grade grade in grades) { // if the grade was added over a week ago, don't show it to avoid notification spam - if (grade.seenDate.isAfter(lastSeenGrade) && grade.date.difference(DateTime.now()).inDays * -1 < 7) { + if (grade.seenDate.isAfter(lastSeenGrade) && + grade.date.difference(DateTime.now()).inDays * -1 < 7) { // send notificiation about new grade const AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails('GRADES', 'Jegyek', channelDescription: 'Értesítés jegyek beírásakor', importance: Importance.max, priority: Priority.max, - color: const Color(0xFF3D7BF4), + color: Color(0xFF3D7BF4), ticker: 'Jegyek'); const NotificationDetails notificationDetails = NotificationDetails(android: androidNotificationDetails); diff --git a/filcnaplo/lib/main.dart b/filcnaplo/lib/main.dart index 9f5c788f..a7ad3170 100644 --- a/filcnaplo/lib/main.dart +++ b/filcnaplo/lib/main.dart @@ -6,7 +6,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'; @@ -57,50 +56,48 @@ class Startup { // Get permission to show notifications if (Platform.isAndroid) { await flutterLocalNotificationsPlugin - .resolvePlatformSpecificImplementation< - AndroidFlutterLocalNotificationsPlugin>()! - .requestPermission(); - } - else if (Platform.isIOS) { + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin>()! + .requestPermission(); + } else if (Platform.isIOS) { await flutterLocalNotificationsPlugin - .resolvePlatformSpecificImplementation< - IOSFlutterLocalNotificationsPlugin>() - ?.requestPermissions( - alert: false, - badge: true, - sound: true, - ); - } - else if (Platform.isMacOS) { + .resolvePlatformSpecificImplementation< + IOSFlutterLocalNotificationsPlugin>() + ?.requestPermissions( + alert: false, + badge: true, + sound: true, + ); + } else if (Platform.isMacOS) { await flutterLocalNotificationsPlugin - .resolvePlatformSpecificImplementation< - MacOSFlutterLocalNotificationsPlugin>() - ?.requestPermissions( - alert: false, - badge: true, - sound: true, - ); + .resolvePlatformSpecificImplementation< + MacOSFlutterLocalNotificationsPlugin>() + ?.requestPermissions( + alert: false, + badge: true, + sound: true, + ); } // Platform specific settings - final DarwinInitializationSettings initializationSettingsDarwin = - DarwinInitializationSettings( - requestSoundPermission: true, - requestBadgePermission: true, - requestAlertPermission: false, - ); + const DarwinInitializationSettings initializationSettingsDarwin = + DarwinInitializationSettings( + requestSoundPermission: true, + requestBadgePermission: true, + requestAlertPermission: false, + ); const AndroidInitializationSettings initializationSettingsAndroid = - AndroidInitializationSettings('ic_notification'); - final InitializationSettings initializationSettings = InitializationSettings( - android: initializationSettingsAndroid, - iOS: initializationSettingsDarwin, - macOS: initializationSettingsDarwin - ); + AndroidInitializationSettings('ic_notification'); + const InitializationSettings initializationSettings = + InitializationSettings( + android: initializationSettingsAndroid, + iOS: initializationSettingsDarwin, + macOS: initializationSettingsDarwin); - // Initialize notifications - await flutterLocalNotificationsPlugin.initialize( - initializationSettings, - ); + // Initialize notifications + await flutterLocalNotificationsPlugin.initialize( + initializationSettings, + ); } } @@ -129,36 +126,44 @@ Widget errorBuilder(FlutterErrorDetails details) { return Container(); }); } - Future initPlatformState() async { - // Configure BackgroundFetch. - int status = await BackgroundFetch.configure(BackgroundFetchConfig( - minimumFetchInterval: 15, - stopOnTerminate: false, - enableHeadless: true, - requiresBatteryNotLow: false, - requiresCharging: false, - requiresStorageNotLow: false, - requiresDeviceIdle: false, - requiredNetworkType: NetworkType.ANY, - startOnBoot: true - ), (String taskId) async { // <-- Event handler + +Future initPlatformState() async { + // Configure BackgroundFetch. + int status = await BackgroundFetch.configure( + BackgroundFetchConfig( + minimumFetchInterval: 15, + stopOnTerminate: false, + enableHeadless: true, + requiresBatteryNotLow: false, + requiresCharging: false, + requiresStorageNotLow: false, + requiresDeviceIdle: false, + requiredNetworkType: NetworkType.ANY, + startOnBoot: true), (String taskId) async { + // <-- Event handler + if (kDebugMode) { print("[BackgroundFetch] Event received $taskId"); - NotificationsHelper().backgroundJob(); - BackgroundFetch.finish(taskId); - }, (String taskId) async { // <-- Task timeout handler. + } + NotificationsHelper().backgroundJob(); + BackgroundFetch.finish(taskId); + }, (String taskId) async { + // <-- Task timeout handler. + if (kDebugMode) { print("[BackgroundFetch] TASK TIMEOUT taskId: $taskId"); - BackgroundFetch.finish(taskId); - }); + } + BackgroundFetch.finish(taskId); + }); + if (kDebugMode) { print('[BackgroundFetch] configure success: $status'); - BackgroundFetch.scheduleTask(TaskConfig( - taskId: "com.transistorsoft.refilcnotification", - delay: 900000, // 15 minutes - periodic: true, - forceAlarmManager: true, - stopOnTerminate: false, - enableHeadless: true - )); } + BackgroundFetch.scheduleTask(TaskConfig( + taskId: "com.transistorsoft.refilcnotification", + delay: 900000, // 15 minutes + periodic: true, + forceAlarmManager: true, + stopOnTerminate: false, + enableHeadless: true)); +} @pragma('vm:entry-point') void backgroundHeadlessTask(HeadlessTask task) { @@ -170,7 +175,7 @@ void backgroundHeadlessTask(HeadlessTask task) { } BackgroundFetch.finish(taskId); return; - } + } if (kDebugMode) { print('[BackgroundFetch] Headless event received.'); } diff --git a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart index aed32346..e2effb03 100755 --- a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart +++ b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart @@ -58,7 +58,7 @@ class _LiveCardState extends State { key: const Key('livecard.summary'), title: '', icon: FeatherIcons.arrowRight, - description: Text(''), + description: const Text(''), onTap: () => Navigator.of(context).push( MaterialPageRoute( builder: (BuildContext context) => const SummaryScreen( From 57cf764804321e6cd03b03d3e40130411cbd9eb1 Mon Sep 17 00:00:00 2001 From: kima Date: Wed, 14 Jun 2023 23:08:54 +0200 Subject: [PATCH 15/99] updated version string --- filcnaplo/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filcnaplo/pubspec.yaml b/filcnaplo/pubspec.yaml index 23ad74a8..d21ace1d 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://refilc.hu publish_to: "none" -version: 4.0.4+212 +version: 4.1.0+213 environment: sdk: ">=2.17.0 <3.0.0" From 19c128eecddbca8faf6daa6c6c2b6ab7147acebd Mon Sep 17 00:00:00 2001 From: Tihanyi Marcell Date: Wed, 14 Jun 2023 23:46:21 +0200 Subject: [PATCH 16/99] LiveActivity --- filcnaplo/ios/livecard/Info.plist | 2 ++ 1 file changed, 2 insertions(+) diff --git a/filcnaplo/ios/livecard/Info.plist b/filcnaplo/ios/livecard/Info.plist index 0f118fb7..b38a18aa 100644 --- a/filcnaplo/ios/livecard/Info.plist +++ b/filcnaplo/ios/livecard/Info.plist @@ -7,5 +7,7 @@ NSExtensionPointIdentifier com.apple.widgetkit-extension + NSSupportsLiveActivities + From ce1c5eb0d8c6a3738678c0862c0079351ad5dd48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kiss?= <70794496+kimaah@users.noreply.github.com> Date: Thu, 15 Jun 2023 09:33:36 +0200 Subject: [PATCH 17/99] fixed nonce login error --- filcnaplo/lib/api/login.dart | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/filcnaplo/lib/api/login.dart b/filcnaplo/lib/api/login.dart index 02ec3a83..c17bf08f 100644 --- a/filcnaplo/lib/api/login.dart +++ b/filcnaplo/lib/api/login.dart @@ -49,10 +49,16 @@ Future loginApi({ }) async { Provider.of(context, listen: false).userAgent = Provider.of(context, listen: false).config.userAgent; - + Map headers = { "content-type": "application/x-www-form-urlencoded", }; + + String nonceStr = await Provider.of(context, listen: false) + .getAPI(KretaAPI.nonce, json: false); + + Nonce nonce = getNonce(nonceStr, username, instituteCode); + headers.addAll(nonce.header()); Map? res = await Provider.of(context, listen: false) .postAPI(KretaAPI.login, From 551b2849fe9ea0d4ef25643fb01addb56446be00 Mon Sep 17 00:00:00 2001 From: Kima Date: Fri, 16 Jun 2023 01:30:17 +0200 Subject: [PATCH 18/99] grade page done in summary --- .../ios/Runner.xcodeproj/project.pbxproj | 12 +- filcnaplo/ios/Runner/Runner.entitlements | 2 - filcnaplo/ios/livecard/Info.plist | 2 - .../lib/api/providers/live_card_provider.dart | 5 +- .../flutter/generated_plugin_registrant.cc | 4 - .../linux/flutter/generated_plugins.cmake | 1 - .../Flutter/GeneratedPluginRegistrant.swift | 2 - .../lib/pages/home/live_card/live_card.dart | 11 +- .../home/live_card/live_card_widget.dart | 17 +- .../screens/summary/pages/grades_page.dart | 284 +++++++++++++++++- .../screens/summary/pages/lessons_page.dart | 10 + .../lib/screens/summary/summary_screen.dart | 17 +- 12 files changed, 340 insertions(+), 27 deletions(-) create mode 100644 filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart diff --git a/filcnaplo/ios/Runner.xcodeproj/project.pbxproj b/filcnaplo/ios/Runner.xcodeproj/project.pbxproj index 08dfd609..4c41fc37 100644 --- a/filcnaplo/ios/Runner.xcodeproj/project.pbxproj +++ b/filcnaplo/ios/Runner.xcodeproj/project.pbxproj @@ -488,7 +488,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 3.6.0; - PRODUCT_BUNDLE_IDENTIFIER = com.refilc.naplo; + PRODUCT_BUNDLE_IDENTIFIER = com.refilctest.naplo; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -526,7 +526,7 @@ MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.refilc.naplo.livecardpro; + PRODUCT_BUNDLE_IDENTIFIER = com.refilctest.naplo.livecardpro; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; @@ -567,7 +567,7 @@ ); MARKETING_VERSION = 1.0; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.refilc.naplo.livecardpro; + PRODUCT_BUNDLE_IDENTIFIER = com.refilctest.naplo.livecardpro; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; @@ -607,7 +607,7 @@ ); MARKETING_VERSION = 1.0; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.refilc.naplo.livecardpro; + PRODUCT_BUNDLE_IDENTIFIER = com.refilctest.naplo.livecardpro; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; @@ -746,7 +746,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 3.6.0; - PRODUCT_BUNDLE_IDENTIFIER = com.refilc.naplo; + PRODUCT_BUNDLE_IDENTIFIER = com.refilctest.naplo; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -774,7 +774,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 3.6.0; - PRODUCT_BUNDLE_IDENTIFIER = com.refilc.naplo; + PRODUCT_BUNDLE_IDENTIFIER = com.refilctest.naplo; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/filcnaplo/ios/Runner/Runner.entitlements b/filcnaplo/ios/Runner/Runner.entitlements index 36e7279a..123fc6ca 100644 --- a/filcnaplo/ios/Runner/Runner.entitlements +++ b/filcnaplo/ios/Runner/Runner.entitlements @@ -2,8 +2,6 @@ - aps-environment - development com.apple.security.application-groups group.refilcnaplo.livecard diff --git a/filcnaplo/ios/livecard/Info.plist b/filcnaplo/ios/livecard/Info.plist index b38a18aa..0f118fb7 100644 --- a/filcnaplo/ios/livecard/Info.plist +++ b/filcnaplo/ios/livecard/Info.plist @@ -7,7 +7,5 @@ NSExtensionPointIdentifier com.apple.widgetkit-extension - NSSupportsLiveActivities - diff --git a/filcnaplo/lib/api/providers/live_card_provider.dart b/filcnaplo/lib/api/providers/live_card_provider.dart index 332b0dab..997195e5 100644 --- a/filcnaplo/lib/api/providers/live_card_provider.dart +++ b/filcnaplo/lib/api/providers/live_card_provider.dart @@ -252,7 +252,10 @@ class LiveCardProvider extends ChangeNotifier { } } - if (currentLesson != null) { + if (now.isBefore(DateTime(now.year, DateTime.august, 31)) && + now.isAfter(DateTime(now.year, DateTime.june, 14))) { + currentState = LiveCardState.summary; + } else if (currentLesson != null) { currentState = LiveCardState.duringLesson; } else if (nextLesson != null && prevLesson != null) { currentState = LiveCardState.duringBreak; diff --git a/filcnaplo/linux/flutter/generated_plugin_registrant.cc b/filcnaplo/linux/flutter/generated_plugin_registrant.cc index 0fcfb275..4894d346 100644 --- a/filcnaplo/linux/flutter/generated_plugin_registrant.cc +++ b/filcnaplo/linux/flutter/generated_plugin_registrant.cc @@ -7,7 +7,6 @@ #include "generated_plugin_registrant.h" #include -#include #include #include @@ -15,9 +14,6 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) dynamic_color_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin"); dynamic_color_plugin_register_with_registrar(dynamic_color_registrar); - g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); - file_selector_plugin_register_with_registrar(file_selector_linux_registrar); g_autoptr(FlPluginRegistrar) flutter_acrylic_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterAcrylicPlugin"); flutter_acrylic_plugin_register_with_registrar(flutter_acrylic_registrar); diff --git a/filcnaplo/linux/flutter/generated_plugins.cmake b/filcnaplo/linux/flutter/generated_plugins.cmake index c5541e6e..c8808fea 100644 --- a/filcnaplo/linux/flutter/generated_plugins.cmake +++ b/filcnaplo/linux/flutter/generated_plugins.cmake @@ -4,7 +4,6 @@ list(APPEND FLUTTER_PLUGIN_LIST dynamic_color - file_selector_linux flutter_acrylic url_launcher_linux ) diff --git a/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift b/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift index 53df988b..c6b190d7 100644 --- a/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,7 +7,6 @@ import Foundation import connectivity_plus import dynamic_color -import file_selector_macos import flutter_local_notifications import macos_window_utils import package_info_plus @@ -19,7 +18,6 @@ import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin")) DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) - FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) MacOSWindowUtilsPlugin.register(with: registry.registrar(forPlugin: "MacOSWindowUtilsPlugin")) FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) diff --git a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart index e2effb03..d996d569 100755 --- a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart +++ b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart @@ -56,9 +56,16 @@ class _LiveCardState extends State { case LiveCardState.summary: child = LiveCardWidget( key: const Key('livecard.summary'), - title: '', + title: 'Vége a tanévnek! 🥳', icon: FeatherIcons.arrowRight, - description: const Text(''), + description: Text( + 'Irány az összefoglaláshoz', + style: TextStyle( + fontWeight: FontWeight.w500, + fontSize: 18.0, + color: Theme.of(context).textTheme.bodyMedium?.color, + ), + ), onTap: () => Navigator.of(context).push( MaterialPageRoute( builder: (BuildContext context) => const SummaryScreen( diff --git a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card_widget.dart b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card_widget.dart index 308e4e7c..34c6e8b1 100755 --- a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card_widget.dart +++ b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card_widget.dart @@ -86,7 +86,10 @@ class _LiveCardWidgetState extends State { Text( widget.title ?? 'Esemény', style: TextStyle( - fontSize: 32, + fontWeight: FontWeight.bold, + fontSize: 24.0, + color: + Theme.of(context).textTheme.bodyMedium?.color, fontStyle: widget.titleItalic ? FontStyle.italic : null, ), @@ -96,7 +99,17 @@ class _LiveCardWidgetState extends State { mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ widget.description ?? - const Text('Nincs leírás megadva.'), + Text( + 'Nincs leírás megadva.', + style: TextStyle( + fontWeight: FontWeight.w500, + fontSize: 18.0, + color: Theme.of(context) + .textTheme + .bodyMedium + ?.color, + ), + ), SizedBox( height: 15, child: Container( diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart index cab1577e..cd21ae10 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart @@ -1,10 +1,288 @@ -import 'package:flutter/material.dart'; +import 'dart:math'; -class GradesBody extends StatelessWidget { +import 'package:filcnaplo/api/providers/user_provider.dart'; +import 'package:filcnaplo/helpers/average_helper.dart'; +import 'package:filcnaplo/models/settings.dart'; +import 'package:filcnaplo/theme/colors/colors.dart'; +import 'package:filcnaplo/ui/widgets/grade/grade_tile.dart'; +import 'package:filcnaplo/utils/format.dart'; +import 'package:filcnaplo_kreta_api/models/grade.dart'; +import 'package:filcnaplo_kreta_api/models/subject.dart'; +import 'package:filcnaplo_kreta_api/providers/grade_provider.dart'; +import 'package:filcnaplo_mobile_ui/common/empty.dart'; +import 'package:filcnaplo_mobile_ui/pages/grades/grades_page.i18n.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:auto_size_text/auto_size_text.dart'; + +class GradesBody extends StatefulWidget { const GradesBody({Key? key}) : super(key: key); + @override + _GradesBodyState createState() => _GradesBodyState(); +} + +class _GradesBodyState extends State { + late UserProvider user; + late GradeProvider gradeProvider; + late SettingsProvider settings; + + late String firstName; + late double subjectAvg; + + List subjectTiles5 = []; + List subjectTiles3 = []; + List subjectTiles1 = []; + + int avgDropValue = 0; + + List getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider + .grades + .where((e) => + e.subject == subject && + e.type == GradeType.midYear && + (days == 0 || + e.date.isBefore(DateTime.now().subtract(Duration(days: days))))) + .toList(); + + @override + void initState() { + super.initState(); + + settings = Provider.of(context, listen: false); + } + + void generateTiles({required int filter}) { + List subjects = gradeProvider.grades + .map((e) => e.subject) + .toSet() + .toList() + ..sort((a, b) => a.name.compareTo(b.name)); + List tiles = []; + + Map subjectAvgs = {}; + + tiles.addAll(subjects.map((subject) { + List subjectGrades = getSubjectGrades(subject); + + double avg = AverageHelper.averageEvals(subjectGrades); + if (avg != 0) subjectAvgs[subject] = avg; + + if (avg.round() == filter) { + return Row( + children: [ + GradeValueWidget( + GradeValue(avg.round(), '', '', 100), + fill: true, + size: 22.0, + ), + Text( + subject.renamedTo ?? subject.name.capital(), + maxLines: 2, + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 18.0, + color: AppColors.of(context).text, + fontStyle: settings.renamedSubjectsItalics && subject.isRenamed + ? FontStyle.italic + : null, + ), + ) + ], + ); + } else { + return Container(); + } + })); + + if (tiles.isEmpty) { + tiles.insert(0, Empty(subtitle: "empty".i18n)); + } + + subjectAvg = subjectAvgs.isNotEmpty + ? subjectAvgs.values.fold(0.0, (double a, double b) => a + b) / + subjectAvgs.length + : 0.0; + + if (filter == 5) { + subjectTiles5 = List.castFrom(tiles); + if (subjectTiles5.length > 5) { + subjectTiles5.length = 5; + } + } + if (filter == 3) { + subjectTiles3 = List.castFrom(tiles); + if (subjectTiles3.length > 3) { + subjectTiles3.length = 3; + } + } + if (filter == 1) { + subjectTiles1 = List.castFrom(tiles); + if (subjectTiles1.length > 2) { + subjectTiles1.length = 2; + } + } + } + @override Widget build(BuildContext context) { - return const Column(); + user = Provider.of(context); + settings = Provider.of(context); + + List nameParts = user.displayName?.split(" ") ?? ["?"]; + if (!settings.presentationMode) { + firstName = nameParts.length > 1 ? nameParts[1] : nameParts[0]; + } else { + firstName = "János"; + } + + generateTiles(filter: 5); + generateTiles(filter: 3); + generateTiles(filter: 1); + + return Column( + children: [ + Text( + 'Jó éved volt, $firstName!', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 24.0, + color: Theme.of(context).textTheme.bodyMedium?.color, + ), + ), + Text( + 'Nézzük a jegyeidet... 📖', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20.0, + color: Theme.of(context).textTheme.bodyMedium?.color, + ), + ), + const SizedBox(height: 20.0), + ListView.builder( + padding: EdgeInsets.zero, + physics: const BouncingScrollPhysics(), + itemCount: max(subjectTiles5.length, 1), + itemBuilder: (context, index) { + if (subjectTiles5.isNotEmpty) { + EdgeInsetsGeometry panelPadding = + const EdgeInsets.symmetric(horizontal: 24.0); + + if (subjectTiles5[index].runtimeType == Row) { + return subjectTiles5[index]; + } else { + return Padding( + padding: panelPadding, child: subjectTiles5[index]); + } + } else { + return Container(); + } + }, + ), + const SizedBox(height: 20.0), + Text( + 'Próba teszi a mestert! 🔃', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20.0, + color: Theme.of(context).textTheme.bodyMedium?.color, + ), + ), + const SizedBox(height: 20.0), + ListView.builder( + padding: EdgeInsets.zero, + physics: const BouncingScrollPhysics(), + itemCount: max(subjectTiles3.length, 1), + itemBuilder: (context, index) { + if (subjectTiles3.isNotEmpty) { + EdgeInsetsGeometry panelPadding = + const EdgeInsets.symmetric(horizontal: 24.0); + + if (subjectTiles3[index].runtimeType == Row) { + return subjectTiles3[index]; + } else { + return Padding( + padding: panelPadding, child: subjectTiles3[index]); + } + } else { + return Container(); + } + }, + ), + const SizedBox(height: 20.0), + Text( + 'Ajajj... 🥴', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20.0, + color: Theme.of(context).textTheme.bodyMedium?.color, + ), + ), + const SizedBox(height: 20.0), + ListView.builder( + padding: EdgeInsets.zero, + physics: const BouncingScrollPhysics(), + itemCount: max(subjectTiles1.length, 1), + itemBuilder: (context, index) { + if (subjectTiles1.isNotEmpty) { + EdgeInsetsGeometry panelPadding = + const EdgeInsets.symmetric(horizontal: 24.0); + + if (subjectTiles1[index].runtimeType == Row) { + return subjectTiles1[index]; + } else { + return Padding( + padding: panelPadding, child: subjectTiles1[index]); + } + } else { + return Container(); + } + }, + ), + const SizedBox(height: 40.0), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'Év végi átlagod', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20.0, + color: Theme.of(context).textTheme.bodyMedium?.color, + ), + ), + Container( + margin: const EdgeInsets.only(top: 4.0), + padding: + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 4.0), + decoration: BoxDecoration( + color: gradeColor(context: context, value: subjectAvg) + .withOpacity(.2), + border: Border.all( + color: (gradeColor(context: context, value: subjectAvg)) + .withOpacity(0.0), + width: 2.0, + ), + borderRadius: BorderRadius.circular(45.0), + ), + child: AutoSizeText.rich( + TextSpan( + text: subjectAvg.toString(), + ), + maxLines: 1, + minFontSize: 5, + textAlign: TextAlign.center, + style: TextStyle( + color: gradeColor(context: context, value: subjectAvg), + fontWeight: FontWeight.w800, + fontSize: 32.0, + ), + ), + ), + ], + ) + ], + ); } } diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart new file mode 100644 index 00000000..3be79283 --- /dev/null +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class LessonsBody extends StatelessWidget { + const LessonsBody({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const Column(); + } +} diff --git a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart index 874daa04..b7951008 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart @@ -1,5 +1,9 @@ +import 'package:confetti/confetti.dart'; import 'package:flutter/material.dart'; + import 'pages/grades_page.dart'; +import 'pages/lessons_page.dart'; +import 'pages/personality_page.dart'; class SummaryScreen extends StatefulWidget { final String currentPage; @@ -12,6 +16,8 @@ class SummaryScreen extends StatefulWidget { } class _SummaryScreenState extends State { + ConfettiController? _confettiController; + final LinearGradient _backgroundGradient = const LinearGradient( colors: [ Color(0xff1d56ac), @@ -22,6 +28,13 @@ class _SummaryScreenState extends State { stops: [-1.0, 1.0], ); + @override + void dispose() { + _confettiController?.dispose(); + + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -42,10 +55,10 @@ class _SummaryScreenState extends State { child: widget.currentPage == 'grades' ? const GradesBody() : widget.currentPage == 'lessons' - ? const GradesBody() + ? const LessonsBody() : widget.currentPage == 'allsum' ? const GradesBody() - : const GradesBody(), + : const PersonalityBody(), ), ), ), From 5c39865d409e460bc4d437b866568239827b513d Mon Sep 17 00:00:00 2001 From: Kima Date: Sat, 17 Jun 2023 16:37:24 +0200 Subject: [PATCH 19/99] commit --- filcnaplo/ios/Flutter/Generated 3.xcconfig | 15 +++++++++++++++ .../ios/Flutter/flutter_export_environment 2.sh | 14 ++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 filcnaplo/ios/Flutter/Generated 3.xcconfig create mode 100755 filcnaplo/ios/Flutter/flutter_export_environment 2.sh diff --git a/filcnaplo/ios/Flutter/Generated 3.xcconfig b/filcnaplo/ios/Flutter/Generated 3.xcconfig new file mode 100644 index 00000000..e1e58478 --- /dev/null +++ b/filcnaplo/ios/Flutter/Generated 3.xcconfig @@ -0,0 +1,15 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=/Users/kima/development/flutter +FLUTTER_APPLICATION_PATH=/Users/kima/Documents/refilc/app/naplo/filcnaplo +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_TARGET=/Users/kima/Documents/refilc/app/naplo/filcnaplo/lib/main.dart +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=4.1.0 +FLUTTER_BUILD_NUMBER=213 +EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386 +EXCLUDED_ARCHS[sdk=iphoneos*]=armv7 +DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==,RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC8yYTM0MDFjOWJiYjVhOWE5YWVjNzRkNGY3MzVkMThhOWRkM2ViZjJkLw== +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=/Users/kima/Documents/refilc/app/naplo/filcnaplo/.dart_tool/package_config.json diff --git a/filcnaplo/ios/Flutter/flutter_export_environment 2.sh b/filcnaplo/ios/Flutter/flutter_export_environment 2.sh new file mode 100755 index 00000000..77cf62f0 --- /dev/null +++ b/filcnaplo/ios/Flutter/flutter_export_environment 2.sh @@ -0,0 +1,14 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/Users/kima/development/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/kima/Documents/refilc/app/naplo/filcnaplo" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_TARGET=/Users/kima/Documents/refilc/app/naplo/filcnaplo/lib/main.dart" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=4.1.0" +export "FLUTTER_BUILD_NUMBER=213" +export "DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==,RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC8yYTM0MDFjOWJiYjVhOWE5YWVjNzRkNGY3MzVkMThhOWRkM2ViZjJkLw==" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=/Users/kima/Documents/refilc/app/naplo/filcnaplo/.dart_tool/package_config.json" From 3579c4e821b1806d9a72ecc24f2938a287cfae64 Mon Sep 17 00:00:00 2001 From: kima Date: Sat, 17 Jun 2023 20:04:11 +0200 Subject: [PATCH 20/99] fixed grades page ui in summary --- .../flutter/generated_plugin_registrant.cc | 4 + .../linux/flutter/generated_plugins.cmake | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 2 + filcnaplo_mobile_ui/lib/common/empty.dart | 15 +- .../lib/pages/home/live_card/live_card.dart | 30 +- .../screens/summary/pages/grades_page.dart | 348 +++++++++++------- .../lib/screens/summary/summary_screen.dart | 54 ++- 7 files changed, 283 insertions(+), 171 deletions(-) diff --git a/filcnaplo/linux/flutter/generated_plugin_registrant.cc b/filcnaplo/linux/flutter/generated_plugin_registrant.cc index 4894d346..0fcfb275 100644 --- a/filcnaplo/linux/flutter/generated_plugin_registrant.cc +++ b/filcnaplo/linux/flutter/generated_plugin_registrant.cc @@ -7,6 +7,7 @@ #include "generated_plugin_registrant.h" #include +#include #include #include @@ -14,6 +15,9 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) dynamic_color_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin"); dynamic_color_plugin_register_with_registrar(dynamic_color_registrar); + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); g_autoptr(FlPluginRegistrar) flutter_acrylic_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterAcrylicPlugin"); flutter_acrylic_plugin_register_with_registrar(flutter_acrylic_registrar); diff --git a/filcnaplo/linux/flutter/generated_plugins.cmake b/filcnaplo/linux/flutter/generated_plugins.cmake index c8808fea..c5541e6e 100644 --- a/filcnaplo/linux/flutter/generated_plugins.cmake +++ b/filcnaplo/linux/flutter/generated_plugins.cmake @@ -4,6 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST dynamic_color + file_selector_linux flutter_acrylic url_launcher_linux ) diff --git a/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift b/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift index c6b190d7..53df988b 100644 --- a/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,6 +7,7 @@ import Foundation import connectivity_plus import dynamic_color +import file_selector_macos import flutter_local_notifications import macos_window_utils import package_info_plus @@ -18,6 +19,7 @@ import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin")) DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) MacOSWindowUtilsPlugin.register(with: registry.registrar(forPlugin: "MacOSWindowUtilsPlugin")) FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) diff --git a/filcnaplo_mobile_ui/lib/common/empty.dart b/filcnaplo_mobile_ui/lib/common/empty.dart index 6b323390..ea0a06cb 100755 --- a/filcnaplo_mobile_ui/lib/common/empty.dart +++ b/filcnaplo_mobile_ui/lib/common/empty.dart @@ -23,7 +23,6 @@ class Empty extends StatelessWidget { @override Widget build(BuildContext context) { - // make the face randomness a bit more constant (to avoid strokes) int index = Random(DateTime.now().minute).nextInt(faces.length); return Center( @@ -32,9 +31,19 @@ class Empty extends StatelessWidget { child: Text.rich( TextSpan( text: faces[index], - style: TextStyle(fontSize: 32.0, fontWeight: FontWeight.w500, color: AppColors.of(context).text.withOpacity(.75)), + style: TextStyle( + fontSize: 32.0, + fontWeight: FontWeight.w500, + color: AppColors.of(context).text.withOpacity(.75)), children: subtitle != null - ? [TextSpan(text: "\n" + subtitle!, style: TextStyle(fontSize: 18.0, height: 2.0, color: AppColors.of(context).text.withOpacity(.5)))] + ? [ + TextSpan( + text: "\n" + subtitle!, + style: TextStyle( + fontSize: 18.0, + height: 2.0, + color: AppColors.of(context).text.withOpacity(.5))) + ] : [], ), textAlign: TextAlign.center, diff --git a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart index d996d569..bb8afffd 100755 --- a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart +++ b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart @@ -13,6 +13,7 @@ import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:i18n_extension/i18n_widget.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; +import 'package:wtf_sliding_sheet/wtf_sliding_sheet.dart'; import 'live_card.i18n.dart'; class LiveCard extends StatefulWidget { @@ -66,13 +67,30 @@ class _LiveCardState extends State { color: Theme.of(context).textTheme.bodyMedium?.color, ), ), - onTap: () => Navigator.of(context).push( - MaterialPageRoute( - builder: (BuildContext context) => const SummaryScreen( - currentPage: 'grades', + onTap: () { + showSlidingBottomSheet( + context, + useRootNavigator: true, + builder: (context) => SlidingSheetDialog( + color: Theme.of(context).scaffoldBackgroundColor, + duration: const Duration(milliseconds: 400), + scrollSpec: const ScrollSpec.bouncingScroll(), + snapSpec: const SnapSpec( + snap: true, + snappings: [1.0], + positioning: SnapPositioning.relativeToSheetHeight, + ), + cornerRadius: 16, + cornerRadiusOnFullscreen: 0, + builder: (context, state) => Material( + color: Theme.of(context).scaffoldBackgroundColor, + child: const SummaryScreen( + currentPage: 'grades', + ), + ), ), - ), - ), + ); + }, ); break; case LiveCardState.morning: diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart index cd21ae10..110bf117 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart @@ -3,18 +3,29 @@ import 'dart:math'; import 'package:filcnaplo/api/providers/user_provider.dart'; import 'package:filcnaplo/helpers/average_helper.dart'; import 'package:filcnaplo/models/settings.dart'; -import 'package:filcnaplo/theme/colors/colors.dart'; import 'package:filcnaplo/ui/widgets/grade/grade_tile.dart'; import 'package:filcnaplo/utils/format.dart'; import 'package:filcnaplo_kreta_api/models/grade.dart'; import 'package:filcnaplo_kreta_api/models/subject.dart'; import 'package:filcnaplo_kreta_api/providers/grade_provider.dart'; -import 'package:filcnaplo_mobile_ui/common/empty.dart'; -import 'package:filcnaplo_mobile_ui/pages/grades/grades_page.i18n.dart'; +import 'package:filcnaplo_mobile_ui/screens/summary/summary_screen.i18n.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:auto_size_text/auto_size_text.dart'; +List faces = [ + "(·.·)", + "(≥o≤)", + "(·_·)", + "(˚Δ˚)b", + "(^-^*)", + "(='X'=)", + "(>_<)", + "(;-;)", + "\\(^Д^)/", + "\\(o_o)/", +]; + class GradesBody extends StatefulWidget { const GradesBody({Key? key}) : super(key: key); @@ -49,6 +60,7 @@ class _GradesBodyState extends State { void initState() { super.initState(); + gradeProvider = Provider.of(context, listen: false); settings = Provider.of(context, listen: false); } @@ -62,41 +74,65 @@ class _GradesBodyState extends State { Map subjectAvgs = {}; - tiles.addAll(subjects.map((subject) { + for (Subject subject in subjects) { List subjectGrades = getSubjectGrades(subject); double avg = AverageHelper.averageEvals(subjectGrades); if (avg != 0) subjectAvgs[subject] = avg; - if (avg.round() == filter) { - return Row( - children: [ - GradeValueWidget( - GradeValue(avg.round(), '', '', 100), - fill: true, - size: 22.0, + Widget widget = Row( + children: [ + GradeValueWidget( + GradeValue(avg.round(), '', '', 100), + fill: true, + size: 28.0, + ), + const SizedBox(width: 8), + Text( + subject.renamedTo ?? subject.name.capital(), + maxLines: 2, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20.0, + color: Colors.white.withOpacity(0.98), + fontStyle: settings.renamedSubjectsItalics && subject.isRenamed + ? FontStyle.italic + : null, ), - Text( - subject.renamedTo ?? subject.name.capital(), - maxLines: 2, - style: TextStyle( - fontWeight: FontWeight.w600, - fontSize: 18.0, - color: AppColors.of(context).text, - fontStyle: settings.renamedSubjectsItalics && subject.isRenamed - ? FontStyle.italic - : null, - ), - ) - ], - ); - } else { - return Container(); + ) + ], + ); + + if (avg.round() == filter) { + tiles.add(widget); } - })); + } if (tiles.isEmpty) { - tiles.insert(0, Empty(subtitle: "empty".i18n)); + int index = Random(DateTime.now().minute).nextInt(faces.length); + Widget faceWidget = Center( + child: Text.rich( + TextSpan( + text: faces[index], + style: const TextStyle( + fontSize: 32.0, + fontWeight: FontWeight.w500, + color: Colors.white, + ), + children: [ + TextSpan( + text: "\nno_grades".i18n, + style: TextStyle( + fontSize: 18.0, + height: 2.0, + color: Colors.white.withOpacity(0.5)), + ), + ], + ), + textAlign: TextAlign.center, + ), + ); + tiles.insert(0, faceWidget); } subjectAvg = subjectAvgs.isNotEmpty @@ -106,17 +142,15 @@ class _GradesBodyState extends State { if (filter == 5) { subjectTiles5 = List.castFrom(tiles); - if (subjectTiles5.length > 5) { - subjectTiles5.length = 5; + if (subjectTiles5.length > 4) { + subjectTiles5.length = 4; } - } - if (filter == 3) { + } else if (filter == 3) { subjectTiles3 = List.castFrom(tiles); if (subjectTiles3.length > 3) { subjectTiles3.length = 3; } - } - if (filter == 1) { + } else if (filter == 1) { subjectTiles1 = List.castFrom(tiles); if (subjectTiles1.length > 2) { subjectTiles1.length = 2; @@ -124,6 +158,12 @@ class _GradesBodyState extends State { } } + void getGrades() { + generateTiles(filter: 5); + generateTiles(filter: 3); + generateTiles(filter: 1); + } + @override Widget build(BuildContext context) { user = Provider.of(context); @@ -136,152 +176,176 @@ class _GradesBodyState extends State { firstName = "János"; } - generateTiles(filter: 5); - generateTiles(filter: 3); - generateTiles(filter: 1); + getGrades(); return Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Jó éved volt, $firstName!', - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 24.0, - color: Theme.of(context).textTheme.bodyMedium?.color, + textAlign: TextAlign.left, + style: const TextStyle( + fontWeight: FontWeight.w900, + fontSize: 26.0, + color: Colors.white, ), ), - Text( + const Text( 'Nézzük a jegyeidet... 📖', style: TextStyle( fontWeight: FontWeight.bold, - fontSize: 20.0, - color: Theme.of(context).textTheme.bodyMedium?.color, + fontSize: 22.0, + color: Colors.white, ), ), - const SizedBox(height: 20.0), - ListView.builder( - padding: EdgeInsets.zero, - physics: const BouncingScrollPhysics(), - itemCount: max(subjectTiles5.length, 1), - itemBuilder: (context, index) { - if (subjectTiles5.isNotEmpty) { - EdgeInsetsGeometry panelPadding = - const EdgeInsets.symmetric(horizontal: 24.0); + const SizedBox(height: 12.0), + SizedBox( + height: ((100 * subjectTiles5.length) / + (subjectTiles5[0].runtimeType == Row ? 1.95 : 1.2)) + .toDouble(), + child: ListView.builder( + padding: const EdgeInsets.only(left: 5), + physics: const BouncingScrollPhysics(), + itemCount: max(subjectTiles5.length, 1), + itemBuilder: (context, index) { + if (subjectTiles5.isNotEmpty) { + EdgeInsetsGeometry panelPadding = + const EdgeInsets.symmetric(horizontal: 24.0); - if (subjectTiles5[index].runtimeType == Row) { - return subjectTiles5[index]; + if (subjectTiles5[index].runtimeType == Row) { + return Padding( + padding: const EdgeInsets.only(top: 8), + child: subjectTiles5[index]); + } else { + return Padding( + padding: panelPadding, child: subjectTiles5[index]); + } } else { - return Padding( - padding: panelPadding, child: subjectTiles5[index]); + return Container(); } - } else { - return Container(); - } - }, + }, + ), ), - const SizedBox(height: 20.0), - Text( + const SizedBox(height: 12.0), + const Text( 'Próba teszi a mestert! 🔃', style: TextStyle( fontWeight: FontWeight.bold, - fontSize: 20.0, - color: Theme.of(context).textTheme.bodyMedium?.color, + fontSize: 22.0, + color: Colors.white, ), ), - const SizedBox(height: 20.0), - ListView.builder( - padding: EdgeInsets.zero, - physics: const BouncingScrollPhysics(), - itemCount: max(subjectTiles3.length, 1), - itemBuilder: (context, index) { - if (subjectTiles3.isNotEmpty) { - EdgeInsetsGeometry panelPadding = - const EdgeInsets.symmetric(horizontal: 24.0); + const SizedBox(height: 12.0), + SizedBox( + height: ((100 * subjectTiles3.length) / + (subjectTiles3[0].runtimeType == Row ? 1.95 : 1.2)) + .toDouble(), + child: ListView.builder( + padding: const EdgeInsets.only(left: 5), + physics: const BouncingScrollPhysics(), + itemCount: max(subjectTiles3.length, 1), + itemBuilder: (context, index) { + if (subjectTiles3.isNotEmpty) { + EdgeInsetsGeometry panelPadding = + const EdgeInsets.symmetric(horizontal: 24.0); - if (subjectTiles3[index].runtimeType == Row) { - return subjectTiles3[index]; + if (subjectTiles3[index].runtimeType == Row) { + return Padding( + padding: const EdgeInsets.only(top: 8), + child: subjectTiles3[index]); + } else { + return Padding( + padding: panelPadding, child: subjectTiles3[index]); + } } else { - return Padding( - padding: panelPadding, child: subjectTiles3[index]); + return Container(); } - } else { - return Container(); - } - }, + }, + ), ), - const SizedBox(height: 20.0), - Text( + const SizedBox(height: 12.0), + const Text( 'Ajajj... 🥴', style: TextStyle( fontWeight: FontWeight.bold, - fontSize: 20.0, - color: Theme.of(context).textTheme.bodyMedium?.color, + fontSize: 22.0, + color: Colors.white, ), ), - const SizedBox(height: 20.0), - ListView.builder( - padding: EdgeInsets.zero, - physics: const BouncingScrollPhysics(), - itemCount: max(subjectTiles1.length, 1), - itemBuilder: (context, index) { - if (subjectTiles1.isNotEmpty) { - EdgeInsetsGeometry panelPadding = - const EdgeInsets.symmetric(horizontal: 24.0); + const SizedBox(height: 12.0), + SizedBox( + height: ((100 * subjectTiles1.length) / + (subjectTiles1[0].runtimeType == Row ? 1.95 : 1.2)) + .toDouble(), + child: ListView.builder( + padding: const EdgeInsets.only(left: 5), + physics: const BouncingScrollPhysics(), + itemCount: max(subjectTiles1.length, 1), + itemBuilder: (context, index) { + if (subjectTiles1.isNotEmpty) { + EdgeInsetsGeometry panelPadding = + const EdgeInsets.symmetric(horizontal: 24.0); - if (subjectTiles1[index].runtimeType == Row) { - return subjectTiles1[index]; + if (subjectTiles1[index].runtimeType == Row) { + return Padding( + padding: const EdgeInsets.only(top: 8), + child: subjectTiles1[index]); + } else { + return Padding( + padding: panelPadding, child: subjectTiles1[index]); + } } else { - return Padding( - padding: panelPadding, child: subjectTiles1[index]); + return Container(); } - } else { - return Container(); - } - }, + }, + ), ), const SizedBox(height: 40.0), - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'Év végi átlagod', - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 20.0, - color: Theme.of(context).textTheme.bodyMedium?.color, - ), - ), - Container( - margin: const EdgeInsets.only(top: 4.0), - padding: - const EdgeInsets.symmetric(horizontal: 16.0, vertical: 4.0), - decoration: BoxDecoration( - color: gradeColor(context: context, value: subjectAvg) - .withOpacity(.2), - border: Border.all( - color: (gradeColor(context: context, value: subjectAvg)) - .withOpacity(0.0), - width: 2.0, - ), - borderRadius: BorderRadius.circular(45.0), - ), - child: AutoSizeText.rich( - TextSpan( - text: subjectAvg.toString(), - ), - maxLines: 1, - minFontSize: 5, + Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Text( + 'Év végi átlagod', textAlign: TextAlign.center, style: TextStyle( - color: gradeColor(context: context, value: subjectAvg), - fontWeight: FontWeight.w800, - fontSize: 32.0, + fontWeight: FontWeight.bold, + fontSize: 22.0, + color: Colors.white, ), ), - ), - ], - ) + Container( + margin: const EdgeInsets.only(top: 10.0), + padding: + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 4.0), + decoration: BoxDecoration( + color: gradeColor(context: context, value: subjectAvg) + .withOpacity(.2), + border: Border.all( + color: (gradeColor(context: context, value: subjectAvg)) + .withOpacity(0.0), + width: 2.0, + ), + borderRadius: BorderRadius.circular(45.0), + ), + child: AutoSizeText.rich( + TextSpan( + text: subjectAvg.toStringAsFixed(2), + ), + maxLines: 1, + minFontSize: 5, + textAlign: TextAlign.center, + style: TextStyle( + color: gradeColor(context: context, value: subjectAvg), + fontWeight: FontWeight.w800, + fontSize: 32.0, + ), + ), + ), + ], + ), + ), ], ); } diff --git a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart index b7951008..98fa41b2 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart @@ -15,7 +15,9 @@ class SummaryScreen extends StatefulWidget { _SummaryScreenState createState() => _SummaryScreenState(); } -class _SummaryScreenState extends State { +class _SummaryScreenState extends State + with SingleTickerProviderStateMixin { + late AnimationController _hideContainersController; ConfettiController? _confettiController; final LinearGradient _backgroundGradient = const LinearGradient( @@ -28,6 +30,14 @@ class _SummaryScreenState extends State { stops: [-1.0, 1.0], ); + @override + void initState() { + super.initState(); + + _hideContainersController = AnimationController( + vsync: this, duration: const Duration(milliseconds: 200)); + } + @override void dispose() { _confettiController?.dispose(); @@ -37,28 +47,32 @@ class _SummaryScreenState extends State { @override Widget build(BuildContext context) { - return Scaffold( - body: Container( - decoration: BoxDecoration(gradient: _backgroundGradient), + return AnimatedBuilder( + animation: _hideContainersController, + builder: (context, child) => Opacity( + opacity: 1 - _hideContainersController.value, child: Container( decoration: BoxDecoration(gradient: _backgroundGradient), - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height, - child: SafeArea( - child: Padding( - padding: EdgeInsets.only( - left: 24.0, - right: 24.0, - top: 26.0 + MediaQuery.of(context).padding.top, - bottom: 52.0, + child: Container( + decoration: BoxDecoration(gradient: _backgroundGradient), + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height, + child: SafeArea( + child: Padding( + padding: EdgeInsets.only( + left: 24.0, + right: 24.0, + top: MediaQuery.of(context).padding.top, + bottom: 52.0, + ), + child: widget.currentPage == 'grades' + ? const GradesBody() + : widget.currentPage == 'lessons' + ? const LessonsBody() + : widget.currentPage == 'allsum' + ? const GradesBody() + : const PersonalityBody(), ), - child: widget.currentPage == 'grades' - ? const GradesBody() - : widget.currentPage == 'lessons' - ? const LessonsBody() - : widget.currentPage == 'allsum' - ? const GradesBody() - : const PersonalityBody(), ), ), ), From 62d38953736f6c7e9a5c2c0694689bc6f23150e4 Mon Sep 17 00:00:00 2001 From: kima Date: Sat, 17 Jun 2023 20:41:30 +0200 Subject: [PATCH 21/99] added next page button to summary --- .../lib/pages/home/live_card/live_card.dart | 12 ++-- .../screens/summary/pages/grades_page.dart | 60 ++++++++++++++----- 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart index bb8afffd..fc8e6de4 100755 --- a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart +++ b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart @@ -72,19 +72,21 @@ class _LiveCardState extends State { context, useRootNavigator: true, builder: (context) => SlidingSheetDialog( - color: Theme.of(context).scaffoldBackgroundColor, + color: Colors.black.withOpacity(0.99), duration: const Duration(milliseconds: 400), scrollSpec: const ScrollSpec.bouncingScroll(), snapSpec: const SnapSpec( snap: true, snappings: [1.0], - positioning: SnapPositioning.relativeToSheetHeight, + initialSnap: 1.0, + positioning: SnapPositioning.relativeToAvailableSpace, ), + minHeight: MediaQuery.of(context).size.height, cornerRadius: 16, cornerRadiusOnFullscreen: 0, - builder: (context, state) => Material( - color: Theme.of(context).scaffoldBackgroundColor, - child: const SummaryScreen( + builder: (context, state) => const Material( + color: Colors.black, + child: SummaryScreen( currentPage: 'grades', ), ), diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart index 110bf117..c4e7a2b1 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart @@ -8,8 +8,10 @@ import 'package:filcnaplo/utils/format.dart'; import 'package:filcnaplo_kreta_api/models/grade.dart'; import 'package:filcnaplo_kreta_api/models/subject.dart'; import 'package:filcnaplo_kreta_api/providers/grade_provider.dart'; +import 'package:filcnaplo_mobile_ui/screens/summary/summary_screen.dart'; import 'package:filcnaplo_mobile_ui/screens/summary/summary_screen.i18n.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:provider/provider.dart'; import 'package:auto_size_text/auto_size_text.dart'; @@ -181,22 +183,48 @@ class _GradesBodyState extends State { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - 'Jó éved volt, $firstName!', - textAlign: TextAlign.left, - style: const TextStyle( - fontWeight: FontWeight.w900, - fontSize: 26.0, - color: Colors.white, - ), - ), - const Text( - 'Nézzük a jegyeidet... 📖', - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 22.0, - color: Colors.white, - ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Jó éved volt, $firstName!', + textAlign: TextAlign.left, + style: const TextStyle( + fontWeight: FontWeight.w900, + fontSize: 26.0, + color: Colors.white, + ), + ), + const Text( + 'Nézzük a jegyeidet... 📖', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 22.0, + color: Colors.white, + ), + ), + ], + ), + IconButton( + onPressed: () { + Navigator.of(context).maybePop(); + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => + const SummaryScreen(currentPage: 'lessons'), + ), + ); + }, + icon: const Icon( + FeatherIcons.arrowRight, + color: Colors.white, + ), + ) + ], ), const SizedBox(height: 12.0), SizedBox( From 1366984c158867e689b1842f2003f321642ea713 Mon Sep 17 00:00:00 2001 From: kima Date: Sat, 17 Jun 2023 21:30:48 +0200 Subject: [PATCH 22/99] added start page to summary --- .../lib/pages/home/live_card/live_card.dart | 2 +- .../screens/summary/pages/grades_page.dart | 4 +- .../lib/screens/summary/pages/start_page.dart | 129 ++++++++++++++++++ .../lib/screens/summary/summary_screen.dart | 19 +-- 4 files changed, 143 insertions(+), 11 deletions(-) create mode 100644 filcnaplo_mobile_ui/lib/screens/summary/pages/start_page.dart diff --git a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart index fc8e6de4..01a14ce5 100755 --- a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart +++ b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart @@ -87,7 +87,7 @@ class _LiveCardState extends State { builder: (context, state) => const Material( color: Colors.black, child: SummaryScreen( - currentPage: 'grades', + currentPage: 'start', ), ), ), diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart index c4e7a2b1..9243f77f 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart @@ -211,8 +211,8 @@ class _GradesBodyState extends State { ), IconButton( onPressed: () { - Navigator.of(context).maybePop(); - Navigator.of(context).push( + Navigator.pushReplacement( + context, MaterialPageRoute( builder: (context) => const SummaryScreen(currentPage: 'lessons'), diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/start_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/start_page.dart new file mode 100644 index 00000000..d44c5e33 --- /dev/null +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/start_page.dart @@ -0,0 +1,129 @@ +import 'package:filcnaplo/api/providers/user_provider.dart'; +import 'package:filcnaplo/models/settings.dart'; +import 'package:filcnaplo_kreta_api/providers/grade_provider.dart'; +import 'package:filcnaplo_mobile_ui/screens/summary/summary_screen.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_feather_icons/flutter_feather_icons.dart'; +import 'package:provider/provider.dart'; + +class StartBody extends StatefulWidget { + const StartBody({Key? key}) : super(key: key); + + @override + _StartBodyState createState() => _StartBodyState(); +} + +class _StartBodyState extends State { + late UserProvider user; + late GradeProvider gradeProvider; + late SettingsProvider settings; + + late String firstName; + + @override + void initState() { + super.initState(); + + gradeProvider = Provider.of(context, listen: false); + settings = Provider.of(context, listen: false); + } + + @override + Widget build(BuildContext context) { + user = Provider.of(context); + settings = Provider.of(context); + + List nameParts = user.displayName?.split(" ") ?? ["?"]; + if (!settings.presentationMode) { + firstName = nameParts.length > 1 ? nameParts[1] : nameParts[0]; + } else { + firstName = "János"; + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Jó éved volt, $firstName!', + textAlign: TextAlign.left, + style: const TextStyle( + fontWeight: FontWeight.w900, + fontSize: 26.0, + color: Colors.white, + ), + ), + const Text( + 'Összegezzünk hát...', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 22.0, + color: Colors.white, + ), + ), + ], + ), + // IconButton( + // onPressed: () { + // Navigator.of(context).maybePop(); + // Navigator.of(context).push( + // MaterialPageRoute( + // builder: (context) => + // const SummaryScreen(currentPage: 'lessons'), + // ), + // ); + // }, + // icon: const Icon( + // FeatherIcons.arrowRight, + // color: Colors.white, + // ), + // ) + ], + ), + const SizedBox(height: 40.0), + GestureDetector( + onTap: () { + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) => + const SummaryScreen(currentPage: 'grades'), + ), + ); + }, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Icon( + FeatherIcons.arrowRight, + size: 145, + color: Colors.white, + grade: 0.001, + weight: 0.001, + ), + Text( + 'Kezdés', + textAlign: TextAlign.center, + style: TextStyle( + fontWeight: FontWeight.w500, + fontSize: 16.0, + color: Colors.white.withOpacity(0.7), + ), + ), + ], + ), + ), + const SizedBox(height: 50.69), + ], + ); + } +} diff --git a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart index 98fa41b2..46a4f96f 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart @@ -1,6 +1,7 @@ import 'package:confetti/confetti.dart'; -import 'package:flutter/material.dart'; +import 'package:flutter/cupertino.dart'; +import 'pages/start_page.dart'; import 'pages/grades_page.dart'; import 'pages/lessons_page.dart'; import 'pages/personality_page.dart'; @@ -65,13 +66,15 @@ class _SummaryScreenState extends State top: MediaQuery.of(context).padding.top, bottom: 52.0, ), - child: widget.currentPage == 'grades' - ? const GradesBody() - : widget.currentPage == 'lessons' - ? const LessonsBody() - : widget.currentPage == 'allsum' - ? const GradesBody() - : const PersonalityBody(), + child: widget.currentPage == 'start' + ? const StartBody() + : widget.currentPage == 'grades' + ? const GradesBody() + : widget.currentPage == 'lessons' + ? const LessonsBody() + : widget.currentPage == 'allsum' + ? const GradesBody() + : const PersonalityBody(), ), ), ), From 0ad663beb38f093bcc0c247618593900e00fec45 Mon Sep 17 00:00:00 2001 From: hihihaha Date: Sun, 18 Jun 2023 17:32:12 +0200 Subject: [PATCH 23/99] fix network activity --- filcnaplo/lib/api/providers/live_card_provider.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/filcnaplo/lib/api/providers/live_card_provider.dart b/filcnaplo/lib/api/providers/live_card_provider.dart index 997195e5..03bb6ee6 100644 --- a/filcnaplo/lib/api/providers/live_card_provider.dart +++ b/filcnaplo/lib/api/providers/live_card_provider.dart @@ -40,6 +40,8 @@ class LiveCardProvider extends ChangeNotifier { String? _latestActivityId; Map _lastActivity = {}; + bool hasCheckedTimetable = false; + LiveCardProvider({ required TimetableProvider timetable, required SettingsProvider settings, @@ -198,7 +200,8 @@ class LiveCardProvider extends ChangeNotifier { List today = _today(_timetable); - if (today.isEmpty) { + if (today.isEmpty && !hasCheckedTimetable) { + hasCheckedTimetable = true; await _timetable.fetch(week: Week.current()); today = _today(_timetable); } From 7ad0ea26e2e8fb2ff7ca1110245c714118b3938c Mon Sep 17 00:00:00 2001 From: PredatorPotatoX Date: Mon, 19 Jun 2023 21:04:32 +0200 Subject: [PATCH 24/99] Contributing guide update --- CONTRIBUTING.md | 43 ++++++++++++++++++++----------------------- README.md | 6 ++++-- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ff618bc3..987426be 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,39 +1,36 @@ -# Hozzájárulási útmutató +# Contribution guide Köszönjük, ha programozással segíted a munkánkat! -A folytatáshoz szükséged lesz egy Linuxot vagy Windowst futtató számítógépre, minimális programozási tapasztalatra és egy kis angoltudásra. -Segít, ha nem csak kicsit tudsz programozni, és ha ismered a Gitet és a GitHubot ;) +A folytatáshoz szükséged lesz egy Linux-ot vagy Windows-t futtató számítógépre, minimális programozási tapasztalatra és egy kis angoltudásra. +Segít, ha már gyakorlottabb vagy a programozásban, és ha ismered a [Git](https://git-scm.com/) és a [GitHub](https://github.com/) működését. ;) ## Miben segítsek? -Kérünk, **olyan dologgal járulj hozzá** a reFilchez, ami valószínűleg **sok embernek hasznos lesz** majd. Szeretnénk egy minél teljeskörűbb iskolai asszisztenst létrehozni, de az iskolaspecifikus, vagy külön neked hasznos funkciók helye inkább legyen a saját forkod. +Kérünk, **olyan dologgal járulj hozzá** a **reFilc**hez, ami valószínűleg **sok embernek hasznos lehet**. Szeretnénk egy minél teljeskörűbb iskolai asszisztenst létrehozni, de az iskolaspecifikus, vagy külön neked hasznos funkciók helye inkább legyen a saját Fork-od. -Fontos, hogy **mielőtt egy nagy volumenű projektbe belekezdesz, futtasd meg ötletedet a [Discord szerverünkön](https://dc.refilc.hu/),** ahol még azelőtt tudunk tanácsot adni, mielőtt sok-sok órát beleöltél volna egy esetleg felesleges dologba. +Fontos, hogy **mielőtt egy nagyobb méretű projektbe belekezdenél, futtasd meg ötletedet a [Discord szerverünkön](https://dc.refilc.hu/)**, ahol még azelőtt tudunk tanácsot adni, hogy sok-sok órát beleöltél volna egy esetleg felesleges dologba. -A legjobban annak örülünk, ha az [Issues](https://github.com/refilc/naplo/issues) oldalról szemezgetsz, **ha lehet, a [help wanted taggel megjelöltekkel kezdd](https://github.com/refilc/naplo/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22),** vagy ha új vagy a Flutterhez, ajánljuk figyelmedbe [ezeket a viszonylag könnyen javítható hibákat](https://github.com/refilc/naplo/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) (ha épp van ilyen). +A legjobban annak örülünk, ha az [Issues](https://github.com/refilc/naplo/issues) oldalról szemezgetsz. Ha még új vagy a Flutterben, ajánljuk figyelmedbe ezeket a [viszonylag könnyen javítható hibákat](https://github.com/refilc/naplo/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22), ha éppen van ilyen. ## Hogyan segítsek? +Nem ígérhetünk itt sem programozás-, sem Git-kurzust, de a projektspecifikus dolgokat leírjuk, és segítünk a Flutter telepítésében. -Nem ígérhetünk itt sem programozás-, sem git-kurzust, de a projektspecifikus dolgokat leírjuk, és segítünk a Flutter feltelepítésében. +A **reFilc** a Google által pár éve létrehozott **[Flutter](https://flutter.dev/)** keretrendszert használja, aminek nyelve a **[Dart](https://dart.dev/)**. Ha ismered a C#, Java, C++, vagy egyéb hasonló programnyelvek működését, **nem fog nagy gondot okozni a használata.** A felhasználói felület létrehozásában az is segíthet, ha foglalkoztál már korábban weboldalakkal vagy alkalmazásfejlesztéssel. +Ha még nem használtad a Flutter-t, mindenképp böngészd át a [YouTube csatornájukat](https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw). +Kód vagy UI teszteléséhez Flutter telepítése nélkül is használhatod a [DartPad](https://dartpad.dev/)-et. -A reFilc a Google által pár éve létrehozott **[Fluttert](https://flutter.dev/)** használja, aminek nyelve a **[Dart](https://dart.dev/)**. Ha ismered a C#-ot, Javát, C++t, vagy egyéb hasonló nyelvet, **nem fog gondot okozni a használata.** A felhasználói felület létrehozásában az is segíthet, ha foglalkoztál már korábban weboldalakkal. -Ha még nem használtál Fluttert, mindenképp böngészd át a [YouTube csatornájukat](https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw). -Könnyen tudsz kódot, vagy akár UI-t is tesztelni a [DartPad](https://dartpad.dev/) oldalon. +#### [Segítség a Flutter telepítéséhez](https://docs.flutter.dev/get-started/install) +**Használd a Flutter stable verzióját!** Írd be a terminálba: `flutter channel stable` -#### [Segítség a Flutter telepítéséhez és a forráskód futtatásához](https://docs.flutter.dev/get-started/install) -Fontos: **Legyél a flutter beta verzióján!** Írd be: `flutter channel beta` +Ha nem értessz a Git-hez vagy a GitHub-hoz, ajánljuk figyelmedbe [ezt a cikket](https://medium.com/envienta-magyarorsz%C3%A1g/git-%C3%A9s-github-gyorstalpal%C3%B3-f2d78a732deb), viszont arra kérünk, hogy a használatukat ne a **reFilc**en próbáld ki először. Hozz létre egy saját Repo-t és abban tesztelgess. Ha már nagyjából kitapasztaltad, várjuk hozzájárulásodat. - - -Ha nem értesz a Githez, ajánljuk figyelmedbe [ezt a cikket](https://medium.com/envienta-magyarorsz%C3%A1g/git-%C3%A9s-github-gyorstalpal%C3%B3-f2d78a732deb). Viszont arra kérünk, a Git használatát ne a reFilcen próbáld ki először, hozz létre előbb egy saját Repót, és abba tesztelgess. Ha már nagyjából kitapasztaltad, várjuk hozzájárulásodat. - -Készíts egy forkot a saját fiókod alá. -A reFilc legfrissebb, épp fejlesztés alatt álló verzióját a [master branch](https://github.com/refilc/naplo/tree/master)-en találod, kérjük ide commitolj, és ide célozd a forkodból a Pull Requested. Írd le benne, mit változtattál, és ha lehet, csatolj képernyőképet is. -Minél gyakrabban készíts minél részletesebben elnevezett commitokat, hogy el tudjunk tájékozódni az általad beküldött kódon. +Készíts egy Fork-ot a saját GitHub fiókod alá. +A **reFilc** legfrissebb, **épp fejlesztés alatt álló verzióját a [master branch](https://github.com/refilc/naplo/tree/master)-en találod**. Kérjük ide Commit-olj és ide célozd a Fork-odból a Pull Request-edet. Írd le benne, hogy mit változtattál és ha lehet, csatolj képernyőképet is. +Minél gyakrabban készíts minél részletesebben elnevezett Commit-okat, hogy mások is el tudjanak igazodni az általad beküldött kódban. --- -Az általad fejlesztett funkciók mellé a changelogban odakerül GitHub felhasználóneved. -Ha jelentős és rendszeres hozzájáruló vagy, Discordon megkapod a `DEV` rangot. +Az általad fejlesztett funkciók mellé a Changelog-ba odakerül a GitHub felhasználóneved. +Ha jelentős és rendszeres hozzájáruló vagy, Discord-on megkaphatod a `DEV` rangot. -Ha bárhol elakadtál, keress minket Discordon. -Jó fejlesztést kívánunk! +Ha bárhol elakadtál vagy kérdésed van, keress bátran Discordon! +**Jó fejlesztést kívánunk!** diff --git a/README.md b/README.md index e9a35416..117db862 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ #### Nem hivatalos e-napló alkalmazás az eKRÉTA rendszerhez - tanulóktól, tanulóknak. -[![Downloads](https://img.shields.io/github/downloads-pre/refilc/naplo/total?color=%23&label=Downloads&logo=github&sort=semver)](https://github.com/refilc/naplo/releases)   [![discord](https://img.shields.io/discord/1111649116020285532?label=Discord)](http://dc.refilc.hu) +[![Downloads](https://img.shields.io/github/downloads-pre/refilc/naplo/total?&logo=github&label=Downloads)](https://github.com/refilc/naplo/releases)   [![Discord](https://img.shields.io/discord/1111649116020285532?logo=discord&label=Discord)](https://dc.refilc.hu) ## Setup @@ -29,11 +29,13 @@ flutter run ### Contribution +**Nézd meg a [Contribution guide](CONTRIBUTING.md)-ot!** + Az összes (ugyan azon verzióhoz tartozó) contribution meg fog jelenni a release-nél. Kérjük, írd le a Discord nevedet a Description-be, hogy adhassunk rangot. ------- -# Kudo +# Developers **annon:** a Filc napló készítője (ez az app a Filcen alapul) From c615a33bd271633b3c74168cf8e5f8c92880af1b Mon Sep 17 00:00:00 2001 From: hihihaha Date: Mon, 19 Jun 2023 22:34:53 +0200 Subject: [PATCH 25/99] make variable private --- filcnaplo/lib/api/providers/live_card_provider.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/filcnaplo/lib/api/providers/live_card_provider.dart b/filcnaplo/lib/api/providers/live_card_provider.dart index 03bb6ee6..a33946a1 100644 --- a/filcnaplo/lib/api/providers/live_card_provider.dart +++ b/filcnaplo/lib/api/providers/live_card_provider.dart @@ -40,7 +40,7 @@ class LiveCardProvider extends ChangeNotifier { String? _latestActivityId; Map _lastActivity = {}; - bool hasCheckedTimetable = false; + bool _hasCheckedTimetable = false; LiveCardProvider({ required TimetableProvider timetable, @@ -200,8 +200,8 @@ class LiveCardProvider extends ChangeNotifier { List today = _today(_timetable); - if (today.isEmpty && !hasCheckedTimetable) { - hasCheckedTimetable = true; + if (today.isEmpty && !_hasCheckedTimetable) { + _hasCheckedTimetable = true; await _timetable.fetch(week: Week.current()); today = _today(_timetable); } From ba8d26d2505caa238e7d7b41217eefd862e6e351 Mon Sep 17 00:00:00 2001 From: hihihaha Date: Tue, 20 Jun 2023 16:18:45 +0200 Subject: [PATCH 26/99] fix italics toggle bugs --- filcnaplo/lib/models/settings.dart | 2 +- .../lib/ui/mobile/settings/modify_subject_names.dart | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/filcnaplo/lib/models/settings.dart b/filcnaplo/lib/models/settings.dart index 7828bc35..c0589d72 100644 --- a/filcnaplo/lib/models/settings.dart +++ b/filcnaplo/lib/models/settings.dart @@ -194,7 +194,7 @@ class SettingsProvider extends ChangeNotifier { premiumLogin: map["premium_login"], lastAccountId: map["last_account_id"], renameSubjectsEnabled: map["renamed_subjects_enabled"] == 1, - renameSubjectsItalics: map["renamed_subjects_italics"] == 0, + renameSubjectsItalics: map["renamed_subjects_italics"] == 1, ); } diff --git a/filcnaplo_premium/lib/ui/mobile/settings/modify_subject_names.dart b/filcnaplo_premium/lib/ui/mobile/settings/modify_subject_names.dart index 7de5d5e9..1bad1b48 100644 --- a/filcnaplo_premium/lib/ui/mobile/settings/modify_subject_names.dart +++ b/filcnaplo_premium/lib/ui/mobile/settings/modify_subject_names.dart @@ -293,13 +293,10 @@ class _ModifySubjectNamesState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Panel( - child: PanelButton( + child: SwitchListTile( title: Text("italics_toggle".i18n), - trailing: Switch( - value: settings.renamedSubjectsItalics, - onChanged: (value) => - settings.update(renamedSubjectsItalics: value), - )), + onChanged: (value) => settings.update(renamedSubjectsItalics: value), + value: settings.renamedSubjectsItalics,), ), const SizedBox( height: 20, From 9314c613bc59ba2c57e902177a6c7b218041976d Mon Sep 17 00:00:00 2001 From: kima Date: Thu, 22 Jun 2023 15:59:57 +0200 Subject: [PATCH 27/99] added lessons/misses page and final summary page --- .../home/live_card/live_card_widget.dart | 4 +- .../screens/summary/pages/allsum_page.dart | 171 ++++++++++++ .../screens/summary/pages/grades_page.dart | 54 ---- .../screens/summary/pages/lessons_page.dart | 256 +++++++++++++++++- .../lib/screens/summary/pages/start_page.dart | 126 ++++----- .../lib/screens/summary/summary_screen.dart | 135 ++++++++- 6 files changed, 599 insertions(+), 147 deletions(-) create mode 100644 filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart diff --git a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card_widget.dart b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card_widget.dart index 34c6e8b1..658fcaa9 100755 --- a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card_widget.dart +++ b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card_widget.dart @@ -81,7 +81,7 @@ class _LiveCardWidgetState extends State { child: widget.isEvent ? Column( crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceAround, + mainAxisAlignment: MainAxisAlignment.center, children: [ Text( widget.title ?? 'Esemény', @@ -96,7 +96,7 @@ class _LiveCardWidgetState extends State { ), Row( crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceAround, + mainAxisAlignment: MainAxisAlignment.center, children: [ widget.description ?? Text( diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart new file mode 100644 index 00000000..d265bbac --- /dev/null +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart @@ -0,0 +1,171 @@ +import 'package:filcnaplo/api/providers/user_provider.dart'; +import 'package:filcnaplo_kreta_api/models/absence.dart'; +import 'package:filcnaplo_kreta_api/models/grade.dart'; +import 'package:filcnaplo_kreta_api/models/subject.dart'; +import 'package:filcnaplo_kreta_api/providers/absence_provider.dart'; +import 'package:filcnaplo_kreta_api/providers/grade_provider.dart'; +import 'package:filcnaplo_kreta_api/providers/homework_provider.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class AllSumBody extends StatefulWidget { + const AllSumBody({Key? key}) : super(key: key); + + @override + _AllSumBodyState createState() => _AllSumBodyState(); +} + +class _AllSumBodyState extends State { + late UserProvider user; + late GradeProvider gradeProvider; + late HomeworkProvider homeworkProvider; + late AbsenceProvider absenceProvider; + //late TimetableProvider timetableProvider; + late Map> things = {}; + late List firstSixTiles = []; + late List lastSixTiles = []; + + int avgDropValue = 0; + + List getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider + .grades + .where((e) => + e.subject == subject && + e.type == GradeType.midYear && + (days == 0 || + e.date.isBefore(DateTime.now().subtract(Duration(days: days))))) + .toList(); + + @override + void initState() { + super.initState(); + + gradeProvider = Provider.of(context, listen: false); + homeworkProvider = Provider.of(context, listen: false); + absenceProvider = Provider.of(context, listen: false); + //timetableProvider = Provider.of(context, listen: false); + } + + void getGrades() { + var allGrades = gradeProvider.grades; + var testsGrades = gradeProvider.grades.where((a) => a.value.weight == 100); + var closingTestsGrades = + gradeProvider.grades.where((a) => a.value.weight >= 200); + + things.addAll({ + 'tests': {'name': 'dolgozat', 'value': testsGrades.length}, + 'closingTests': {'name': 'témazáró', 'value': closingTestsGrades.length}, + 'grades': {'name': 'jegy', 'value': allGrades.length} + }); + } + + void getHomework() { + var allHomework = homeworkProvider.homework; + + things.addAll({ + 'homework': {'name': 'házi', 'value': allHomework.length} + }); + } + + void getSubjects() { + var allSubjects = gradeProvider.grades + .map((e) => e.subject) + .toSet() + .toList() + ..sort((a, b) => a.name.compareTo(b.name)); + //var totalLessons; + var totalLessons = 0; + + things.addAll({ + 'subjects': {'name': 'tantárgy', 'value': allSubjects.length}, + 'lessons': {'name': 'óra', 'value': totalLessons} + }); + } + + void getAbsences() { + var allAbsences = absenceProvider.absences.where((a) => a.delay == 0); + var excusedAbsences = absenceProvider.absences + .where((a) => a.state == Justification.excused && a.delay == 0); + var unexcusedAbsences = absenceProvider.absences.where((a) => + (a.state == Justification.unexcused || + a.state == Justification.pending) && + a.delay == 0); + + things.addAll({ + 'absences': {'name': 'hiányzás', 'value': allAbsences.length}, + 'excusedAbsences': {'name': 'igazolt', 'value': excusedAbsences.length}, + 'unexcusedAbsences': { + 'name': 'igazolatlan', + 'value': unexcusedAbsences.length + } + }); + } + + void getDelays() { + var allDelays = absenceProvider.absences.where((a) => a.delay > 0); + var totalDelayTime = (allDelays.map((a) { + return a.delay; + }).toList()) + .reduce((a, b) => a + b); + var unexcusedDelays = absenceProvider.absences + .where((a) => a.state == Justification.unexcused && a.delay > 0); + + things.addAll({ + 'delays': {'name': 'késés', 'value': allDelays.length}, + 'totalDelay': {'name': 'perc', 'value': totalDelayTime}, + 'unexcusedDelays': { + 'name': 'igazolatlan', + 'value': unexcusedDelays.length + } + }); + } + + void generateTiles() { + for (var i in things.values) { + Widget w = Center( + child: Column( + children: [ + Text(i.values.toList()[1]), + Text(i.values.toList()[0]), + ], + ), + ); + + if (i.values.toList()[0] == 'óra') { + return; // amig nincs megoldva az osszes ora szamanak lekerese + } + if (firstSixTiles.length < 6) { + firstSixTiles.add(w); + } else { + lastSixTiles.add(w); + } + } + } + + @override + Widget build(BuildContext context) { + generateTiles(); + + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GridView.count( + crossAxisCount: 3, + mainAxisSpacing: 10, + crossAxisSpacing: 10, + children: firstSixTiles, + ), + const SizedBox( + height: 40, + ), + GridView.count( + crossAxisCount: 3, + mainAxisSpacing: 10, + crossAxisSpacing: 10, + children: lastSixTiles, + ), + ], + ); + } +} diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart index 9243f77f..9deab817 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart @@ -8,10 +8,8 @@ import 'package:filcnaplo/utils/format.dart'; import 'package:filcnaplo_kreta_api/models/grade.dart'; import 'package:filcnaplo_kreta_api/models/subject.dart'; import 'package:filcnaplo_kreta_api/providers/grade_provider.dart'; -import 'package:filcnaplo_mobile_ui/screens/summary/summary_screen.dart'; import 'package:filcnaplo_mobile_ui/screens/summary/summary_screen.i18n.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:provider/provider.dart'; import 'package:auto_size_text/auto_size_text.dart'; @@ -40,7 +38,6 @@ class _GradesBodyState extends State { late GradeProvider gradeProvider; late SettingsProvider settings; - late String firstName; late double subjectAvg; List subjectTiles5 = []; @@ -171,62 +168,11 @@ class _GradesBodyState extends State { user = Provider.of(context); settings = Provider.of(context); - List nameParts = user.displayName?.split(" ") ?? ["?"]; - if (!settings.presentationMode) { - firstName = nameParts.length > 1 ? nameParts[1] : nameParts[0]; - } else { - firstName = "János"; - } - getGrades(); return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Jó éved volt, $firstName!', - textAlign: TextAlign.left, - style: const TextStyle( - fontWeight: FontWeight.w900, - fontSize: 26.0, - color: Colors.white, - ), - ), - const Text( - 'Nézzük a jegyeidet... 📖', - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 22.0, - color: Colors.white, - ), - ), - ], - ), - IconButton( - onPressed: () { - Navigator.pushReplacement( - context, - MaterialPageRoute( - builder: (context) => - const SummaryScreen(currentPage: 'lessons'), - ), - ); - }, - icon: const Icon( - FeatherIcons.arrowRight, - color: Colors.white, - ), - ) - ], - ), - const SizedBox(height: 12.0), SizedBox( height: ((100 * subjectTiles5.length) / (subjectTiles5[0].runtimeType == Row ? 1.95 : 1.2)) diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart index 3be79283..5e6394a6 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart @@ -1,10 +1,262 @@ +import 'package:filcnaplo/api/providers/user_provider.dart'; +import 'package:filcnaplo/helpers/subject.dart'; +import 'package:filcnaplo/models/settings.dart'; +import 'package:filcnaplo/utils/format.dart'; +import 'package:filcnaplo_kreta_api/models/absence.dart'; +import 'package:filcnaplo_kreta_api/models/lesson.dart'; +import 'package:filcnaplo_kreta_api/models/subject.dart'; +import 'package:filcnaplo_kreta_api/models/week.dart'; +import 'package:filcnaplo_kreta_api/providers/absence_provider.dart'; +import 'package:filcnaplo_kreta_api/providers/timetable_provider.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; -class LessonsBody extends StatelessWidget { +class SubjectAbsence { + Subject subject; + List absences; + double percentage; + + SubjectAbsence( + {required this.subject, this.absences = const [], this.percentage = 0.0}); +} + +class LessonsBody extends StatefulWidget { const LessonsBody({Key? key}) : super(key: key); + @override + _LessonsBodyState createState() => _LessonsBodyState(); +} + +class _LessonsBodyState extends State { + late UserProvider user; + late AbsenceProvider absenceProvider; + late SettingsProvider settingsProvider; + late TimetableProvider timetableProvider; + late List absences = []; + late List lessons = []; + late List delays = []; + + final Map _lessonCount = {}; + + @override + void initState() { + super.initState(); + + absenceProvider = Provider.of(context, listen: false); + settingsProvider = Provider.of(context, listen: false); + timetableProvider = Provider.of(context, listen: false); + + WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { + for (final lesson in timetableProvider.getWeek(Week.current()) ?? []) { + if (!lesson.isEmpty && + lesson.subject.id != '' && + lesson.lessonYearIndex != null) { + _lessonCount.update( + lesson.subject, + (value) { + if (lesson.lessonYearIndex! > value.lessonYearIndex!) { + return lesson; + } else { + return value; + } + }, + ifAbsent: () => lesson, + ); + } + } + setState(() {}); + }); + } + + void buildSubjectAbsences() { + Map _absences = {}; + + for (final absence in absenceProvider.absences) { + if (absence.delay != 0) continue; + + if (!_absences.containsKey(absence.subject)) { + _absences[absence.subject] = + SubjectAbsence(subject: absence.subject, absences: [absence]); + } else { + _absences[absence.subject]?.absences.add(absence); + } + } + + _absences.forEach((subject, absence) { + final absentLessonsOfSubject = absenceProvider.absences + .where((e) => e.subject == subject && e.delay == 0) + .length; + final totalLessonsOfSubject = _lessonCount[subject]?.lessonYearIndex ?? 0; + + double absentLessonsOfSubjectPercentage; + + if (absentLessonsOfSubject <= totalLessonsOfSubject) { + absentLessonsOfSubjectPercentage = + absentLessonsOfSubject / totalLessonsOfSubject * 100; + } else { + absentLessonsOfSubjectPercentage = -1; + } + + _absences[subject]?.percentage = + absentLessonsOfSubjectPercentage.clamp(-1, 100.0); + }); + + absences = _absences.values.toList(); + absences.sort((a, b) => -a.percentage.compareTo(b.percentage)); + } + + void getAndSortDelays() { + delays = absenceProvider.absences; + delays.sort((a, b) => -a.delay.compareTo(b.delay)); + } + + void generateTiles() { + Widget leastAbsent = Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Icon( + SubjectIcon.resolveVariant( + subject: absences.last.subject, context: context), + color: Colors.white, + size: 64, + ), + Text( + absences.last.subject.renamedTo ?? + absences.last.subject.name.capital(), + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontWeight: FontWeight.w800, + fontSize: 36.0, + fontStyle: absences.last.subject.isRenamed && + settingsProvider.renamedSubjectsItalics + ? FontStyle.italic + : null, + color: Colors.white, + ), + ), + Text( + '${absences.last.absences.length} hiányzás', + style: const TextStyle( + fontSize: 18.0, + color: Colors.white, + ), + ) + ], + ), + ); + Widget mostAbsent = Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Icon( + SubjectIcon.resolveVariant( + subject: absences.first.subject, context: context), + color: Colors.white, + size: 64, + ), + Text( + absences.first.subject.renamedTo ?? + absences.first.subject.name.capital(), + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontWeight: FontWeight.w800, + fontSize: 36.0, + fontStyle: absences.first.subject.isRenamed && + settingsProvider.renamedSubjectsItalics + ? FontStyle.italic + : null, + color: Colors.white, + ), + ), + Text( + '${absences.first.absences.length} hiányzás', + style: const TextStyle( + fontSize: 18.0, + color: Colors.white, + ), + ) + ], + ), + ); + Widget mostDelays = Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Icon( + SubjectIcon.resolveVariant( + subject: delays.first.subject, context: context), + color: Colors.white, + size: 64, + ), + Text( + delays.first.subject.renamedTo ?? + delays.first.subject.name.capital(), + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontWeight: FontWeight.w800, + fontSize: 36.0, + fontStyle: delays.first.subject.isRenamed && + settingsProvider.renamedSubjectsItalics + ? FontStyle.italic + : null, + color: Colors.white, + ), + ), + Text( + 'Összesen ${delays.first.delay} perc késés', + style: const TextStyle( + fontSize: 18.0, + color: Colors.white, + ), + ) + ], + ), + ); + + lessons.addAll([leastAbsent, mostAbsent, mostDelays]); + } + @override Widget build(BuildContext context) { - return const Column(); + buildSubjectAbsences(); + getAndSortDelays(); + generateTiles(); + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + lessons[0], + const SizedBox(height: 18.0), + const Text( + 'Nem volt kedved hozzá...', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 22.0, + color: Colors.white, + ), + ), + const SizedBox(height: 18.0), + lessons[1], + const SizedBox(height: 18.0), + const Text( + 'Késtél!', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 22.0, + color: Colors.white, + ), + ), + const SizedBox(height: 18.0), + lessons[2], + ], + ); } } diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/start_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/start_page.dart index d44c5e33..d91ccc73 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/start_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/start_page.dart @@ -6,6 +6,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:provider/provider.dart'; +import 'package:wtf_sliding_sheet/wtf_sliding_sheet.dart'; class StartBody extends StatefulWidget { const StartBody({Key? key}) : super(key: key); @@ -31,98 +32,65 @@ class _StartBodyState extends State { @override Widget build(BuildContext context) { - user = Provider.of(context); - settings = Provider.of(context); - - List nameParts = user.displayName?.split(" ") ?? ["?"]; - if (!settings.presentationMode) { - firstName = nameParts.length > 1 ? nameParts[1] : nameParts[0]; - } else { - firstName = "János"; - } - return Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Jó éved volt, $firstName!', - textAlign: TextAlign.left, - style: const TextStyle( - fontWeight: FontWeight.w900, - fontSize: 26.0, - color: Colors.white, + const SizedBox(height: 40.0), + GestureDetector( + onTap: () { + Navigator.of(context).pop(); + showSlidingBottomSheet( + context, + useRootNavigator: true, + builder: (context) => SlidingSheetDialog( + color: Colors.black.withOpacity(0.99), + duration: const Duration(milliseconds: 400), + scrollSpec: const ScrollSpec.bouncingScroll(), + snapSpec: const SnapSpec( + snap: true, + snappings: [1.0], + initialSnap: 1.0, + positioning: SnapPositioning.relativeToAvailableSpace, + ), + minHeight: MediaQuery.of(context).size.height, + cornerRadius: 16, + cornerRadiusOnFullscreen: 0, + builder: (context, state) => const Material( + color: Colors.black, + child: SummaryScreen( + currentPage: 'grades', ), ), - const Text( - 'Összegezzünk hát...', + ), + ); + }, + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Icon( + FeatherIcons.arrowRight, + size: 145, + color: Colors.white, + grade: 0.001, + weight: 0.001, + ), + Text( + 'Kezdés', + textAlign: TextAlign.center, style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 22.0, - color: Colors.white, + fontWeight: FontWeight.w500, + fontSize: 16.0, + color: Colors.white.withOpacity(0.7), ), ), ], ), - // IconButton( - // onPressed: () { - // Navigator.of(context).maybePop(); - // Navigator.of(context).push( - // MaterialPageRoute( - // builder: (context) => - // const SummaryScreen(currentPage: 'lessons'), - // ), - // ); - // }, - // icon: const Icon( - // FeatherIcons.arrowRight, - // color: Colors.white, - // ), - // ) - ], - ), - const SizedBox(height: 40.0), - GestureDetector( - onTap: () { - Navigator.pushReplacement( - context, - MaterialPageRoute( - builder: (context) => - const SummaryScreen(currentPage: 'grades'), - ), - ); - }, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - const Icon( - FeatherIcons.arrowRight, - size: 145, - color: Colors.white, - grade: 0.001, - weight: 0.001, - ), - Text( - 'Kezdés', - textAlign: TextAlign.center, - style: TextStyle( - fontWeight: FontWeight.w500, - fontSize: 16.0, - color: Colors.white.withOpacity(0.7), - ), - ), - ], ), ), - const SizedBox(height: 50.69), + const SizedBox(height: 169.69), ], ); } diff --git a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart index 46a4f96f..c3cedc98 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart @@ -1,6 +1,12 @@ import 'package:confetti/confetti.dart'; -import 'package:flutter/cupertino.dart'; +import 'package:filcnaplo/api/providers/user_provider.dart'; +import 'package:filcnaplo/models/settings.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_feather_icons/flutter_feather_icons.dart'; +import 'package:provider/provider.dart'; +import 'package:wtf_sliding_sheet/wtf_sliding_sheet.dart'; +import 'pages/allsum_page.dart'; import 'pages/start_page.dart'; import 'pages/grades_page.dart'; import 'pages/lessons_page.dart'; @@ -18,9 +24,14 @@ class SummaryScreen extends StatefulWidget { class _SummaryScreenState extends State with SingleTickerProviderStateMixin { + late UserProvider user; + late SettingsProvider settings; + late AnimationController _hideContainersController; ConfettiController? _confettiController; + late String firstName; + final LinearGradient _backgroundGradient = const LinearGradient( colors: [ Color(0xff1d56ac), @@ -48,6 +59,16 @@ class _SummaryScreenState extends State @override Widget build(BuildContext context) { + user = Provider.of(context); + settings = Provider.of(context); + + List nameParts = user.displayName?.split(" ") ?? ["?"]; + if (!settings.presentationMode) { + firstName = nameParts.length > 1 ? nameParts[1] : nameParts[0]; + } else { + firstName = "János"; + } + return AnimatedBuilder( animation: _hideContainersController, builder: (context, child) => Opacity( @@ -66,15 +87,82 @@ class _SummaryScreenState extends State top: MediaQuery.of(context).padding.top, bottom: 52.0, ), - child: widget.currentPage == 'start' - ? const StartBody() - : widget.currentPage == 'grades' - ? const GradesBody() - : widget.currentPage == 'lessons' - ? const LessonsBody() - : widget.currentPage == 'allsum' - ? const GradesBody() - : const PersonalityBody(), + child: Column( + crossAxisAlignment: widget.currentPage == 'start' + ? CrossAxisAlignment.center + : CrossAxisAlignment.start, + mainAxisAlignment: widget.currentPage == 'start' + ? MainAxisAlignment.spaceBetween + : MainAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Jó éved volt, $firstName!', + textAlign: TextAlign.left, + style: const TextStyle( + fontWeight: FontWeight.w900, + fontSize: 26.0, + color: Colors.white, + ), + ), + Text( + widget.currentPage == 'start' + ? 'Összegezzünk hát...' + : widget.currentPage == 'grades' + ? 'Nézzük a jegyeidet... 📖' + : widget.currentPage == 'lessons' + ? 'A kedvenced órád 💓' + : '', + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 22.0, + color: Colors.white, + ), + ), + ], + ), + widget.currentPage != 'start' + ? IconButton( + onPressed: () async { + Navigator.of(context).pop(); + if (widget.currentPage == 'grades') { + openNewPage(page: 'lessons'); + } else if (widget.currentPage == 'lessons') { + openNewPage(page: 'allsum'); + } else if (widget.currentPage == 'allsum') { + openNewPage(page: 'personality'); + } else { + Navigator.of(context).maybePop(); + } + }, + icon: Icon( + widget.currentPage == 'personality' + ? FeatherIcons.x + : FeatherIcons.arrowRight, + color: Colors.white, + ), + ) + : Container() + ], + ), + const SizedBox(height: 12.0), + widget.currentPage == 'start' + ? const StartBody() + : widget.currentPage == 'grades' + ? const GradesBody() + : widget.currentPage == 'lessons' + ? const LessonsBody() + : widget.currentPage == 'allsum' + ? const AllSumBody() + : const PersonalityBody(), + ], + ), ), ), ), @@ -82,4 +170,31 @@ class _SummaryScreenState extends State ), ); } + + void openNewPage({String page = 'personality'}) { + showSlidingBottomSheet( + context, + useRootNavigator: true, + builder: (context) => SlidingSheetDialog( + color: Colors.black.withOpacity(0.99), + duration: const Duration(milliseconds: 400), + scrollSpec: const ScrollSpec.bouncingScroll(), + snapSpec: const SnapSpec( + snap: true, + snappings: [1.0], + initialSnap: 1.0, + positioning: SnapPositioning.relativeToAvailableSpace, + ), + minHeight: MediaQuery.of(context).size.height, + cornerRadius: 16, + cornerRadiusOnFullscreen: 0, + builder: (context, state) => Material( + color: Colors.black, + child: SummaryScreen( + currentPage: page, + ), + ), + ), + ); + } } From 4068abdb9583a6148ecd4f70fa116d64702c99b3 Mon Sep 17 00:00:00 2001 From: kima Date: Thu, 22 Jun 2023 16:45:57 +0200 Subject: [PATCH 28/99] finished final summary style and fixed thingies --- .../screens/summary/pages/allsum_page.dart | 75 +++++++++++++------ .../lib/screens/summary/summary_screen.dart | 7 +- 2 files changed, 59 insertions(+), 23 deletions(-) diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart index d265bbac..c56a6e60 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart @@ -120,50 +120,81 @@ class _AllSumBodyState extends State { }); } + void getEverything() { + getGrades(); + getHomework(); + getSubjects(); + getAbsences(); + getDelays(); + } + void generateTiles() { for (var i in things.values) { - Widget w = Center( - child: Column( - children: [ - Text(i.values.toList()[1]), - Text(i.values.toList()[0]), - ], - ), + Widget w = Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + i.values.toList()[1].toString(), + style: const TextStyle( + fontWeight: FontWeight.w800, + fontSize: 36.0, + color: Colors.white, + ), + ), + Text( + i.values.toList()[0], + style: const TextStyle( + fontSize: 18.0, + color: Colors.white, + ), + ), + ], ); - if (i.values.toList()[0] == 'óra') { - return; // amig nincs megoldva az osszes ora szamanak lekerese - } + // TODO: az orakat es a hazikat szarul keri le, de majd meg lesz csinalva if (firstSixTiles.length < 6) { firstSixTiles.add(w); - } else { + } else if (lastSixTiles.length < 6) { lastSixTiles.add(w); + } else { + break; } } } @override Widget build(BuildContext context) { + getEverything(); generateTiles(); return Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ - GridView.count( - crossAxisCount: 3, - mainAxisSpacing: 10, - crossAxisSpacing: 10, - children: firstSixTiles, + const SizedBox( + height: 45, + ), + SizedBox( + height: 250, + child: GridView.count( + crossAxisCount: 3, + mainAxisSpacing: 0, + crossAxisSpacing: 5, + children: firstSixTiles, + ), ), const SizedBox( - height: 40, + height: 30, ), - GridView.count( - crossAxisCount: 3, - mainAxisSpacing: 10, - crossAxisSpacing: 10, - children: lastSixTiles, + SizedBox( + height: 250, + child: GridView.count( + crossAxisCount: 3, + mainAxisSpacing: 0, + crossAxisSpacing: 5, + children: lastSixTiles, + ), ), ], ); diff --git a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart index c3cedc98..6f7a82f1 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart @@ -105,6 +105,8 @@ class _SummaryScreenState extends State Text( 'Jó éved volt, $firstName!', textAlign: TextAlign.left, + maxLines: 2, + overflow: TextOverflow.fade, style: const TextStyle( fontWeight: FontWeight.w900, fontSize: 26.0, @@ -118,7 +120,10 @@ class _SummaryScreenState extends State ? 'Nézzük a jegyeidet... 📖' : widget.currentPage == 'lessons' ? 'A kedvenced órád 💓' - : '', + : widget.currentPage == 'personality' + ? 'A te személyiséged...' + : '', + overflow: TextOverflow.fade, style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 22.0, From a1f087758f0194445cb5b1f4b833c9c25bbe994d Mon Sep 17 00:00:00 2001 From: kima Date: Thu, 22 Jun 2023 19:15:02 +0200 Subject: [PATCH 29/99] started summary personality page --- filcnaplo/lib/models/personality.dart | 21 ++ .../personality_card/personality_card.dart | 192 ++++++++++++++++++ .../screens/summary/pages/allsum_page.dart | 1 + .../screens/summary/pages/lessons_page.dart | 2 +- .../summary/pages/personality_page.dart | 25 ++- 5 files changed, 238 insertions(+), 3 deletions(-) create mode 100644 filcnaplo/lib/models/personality.dart create mode 100644 filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart diff --git a/filcnaplo/lib/models/personality.dart b/filcnaplo/lib/models/personality.dart new file mode 100644 index 00000000..703917ab --- /dev/null +++ b/filcnaplo/lib/models/personality.dart @@ -0,0 +1,21 @@ +class Personality { + PersonalityType type; + + Personality({ + this.type = PersonalityType.npc, + }); +} + +enum PersonalityType { + geek, + sick, + late, + quitter, + healthy, + acceptable, + fallible, + average, + diligent, + cheater, + npc +} diff --git a/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart new file mode 100644 index 00000000..e1664140 --- /dev/null +++ b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart @@ -0,0 +1,192 @@ +import 'package:filcnaplo/api/providers/user_provider.dart'; +import 'package:filcnaplo/helpers/average_helper.dart'; +import 'package:filcnaplo/models/settings.dart'; +import 'package:filcnaplo/models/personality.dart'; +import 'package:filcnaplo_kreta_api/models/absence.dart'; +import 'package:filcnaplo_kreta_api/models/grade.dart'; +import 'package:filcnaplo_kreta_api/models/lesson.dart'; +import 'package:filcnaplo_kreta_api/models/subject.dart'; +import 'package:filcnaplo_kreta_api/models/week.dart'; +import 'package:filcnaplo_kreta_api/providers/absence_provider.dart'; +import 'package:filcnaplo_kreta_api/providers/grade_provider.dart'; +import 'package:filcnaplo_kreta_api/providers/timetable_provider.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class PersonalityCard extends StatefulWidget { + const PersonalityCard({ + Key? key, + required this.user, + }) : super(key: key); + + final UserProvider user; + + @override + State createState() => _PersonalityCardState(); +} + +class _PersonalityCardState extends State { + late GradeProvider gradeProvider; + late AbsenceProvider absenceProvider; + late TimetableProvider timetableProvider; + late SettingsProvider settings; + + late List subjectAvgsList = []; + late Map subjectAvgs = {}; + late double subjectAvg; + late List classWorkGrades; + late int mostCommonGrade; + late int onesCount; + late List absences = []; + late List delays = []; + final Map _lessonCount = {}; + + late PersonalityType finalPersonality; + + List getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider + .grades + .where((e) => + e.subject == subject && + e.type == GradeType.midYear && + (days == 0 || + e.date.isBefore(DateTime.now().subtract(Duration(days: days))))) + .toList(); + + @override + void initState() { + super.initState(); + + gradeProvider = Provider.of(context, listen: false); + absenceProvider = Provider.of(context, listen: false); + timetableProvider = Provider.of(context, listen: false); + settings = Provider.of(context, listen: false); + + WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { + for (final lesson in timetableProvider.getWeek(Week.current()) ?? []) { + if (!lesson.isEmpty && + lesson.subject.id != '' && + lesson.lessonYearIndex != null) { + _lessonCount.update( + lesson.subject, + (value) { + if (lesson.lessonYearIndex! > value.lessonYearIndex!) { + return lesson; + } else { + return value; + } + }, + ifAbsent: () => lesson, + ); + } + } + setState(() {}); + }); + } + + void getGrades() { + List subjects = gradeProvider.grades + .map((e) => e.subject) + .toSet() + .toList() + ..sort((a, b) => a.name.compareTo(b.name)); + + for (Subject subject in subjects) { + List subjectGrades = getSubjectGrades(subject); + + double avg = AverageHelper.averageEvals(subjectGrades); + if (avg != 0) subjectAvgs[subject] = avg; + + subjectAvgsList.add(avg.round()); + } + + subjectAvg = subjectAvgs.isNotEmpty + ? subjectAvgs.values.fold(0.0, (double a, double b) => a + b) / + subjectAvgs.length + : 0.0; + + classWorkGrades = + gradeProvider.grades.where((a) => a.value.weight <= 75).toList(); + } + + void getMostCommonGrade() { + Map counts = {}; + + subjectAvgsList.map((e) { + if (counts.containsKey(e)) { + counts.update(e, (value) => value++); + } else { + counts[e] = 1; + } + }); + + var maxValue = 0; + var maxKey = 0; + + counts.forEach((k, v) { + if (v > maxValue) { + maxValue = v; + maxKey = k; + } + }); + + mostCommonGrade = maxKey; + onesCount = counts.values.toList()[0]; + } + + void getAbsences() { + absences = absenceProvider.absences.where((a) => a.delay == 0).toList(); + } + + void getAndSortDelays() { + delays = absenceProvider.absences; + delays.sort((a, b) => -a.delay.compareTo(b.delay)); + } + + void doEverything() { + getGrades(); + getMostCommonGrade(); + getAbsences(); + getAndSortDelays(); + } + + void getPersonality() { + if (settings.goodStudent) { + finalPersonality = PersonalityType.cheater; + } else if (subjectAvg > 4.7) { + finalPersonality = PersonalityType.geek; + } else if (onesCount > 1) { + finalPersonality = PersonalityType.fallible; + } else if (absences.length < 10) { + finalPersonality = PersonalityType.healthy; + } else if ((absences.where( + (a) => a.state == Justification.unexcused && a.delay == 0)) + .length >= + 10) { + finalPersonality = PersonalityType.quitter; + } else if ((absences.where( + (a) => a.state == Justification.unexcused && a.delay > 0)) + .map((e) => e.delay) + .reduce((a, b) => a + b) > + 50) { + finalPersonality = PersonalityType.late; + } else if (absences.length >= 100) { + finalPersonality = PersonalityType.sick; + } else if (mostCommonGrade == 2) { + finalPersonality = PersonalityType.acceptable; + } else if (mostCommonGrade == 3) { + finalPersonality = PersonalityType.average; + } else if (classWorkGrades.length >= 5) { + finalPersonality = PersonalityType.diligent; + } else { + finalPersonality = PersonalityType.npc; + } + } + + @override + Widget build(BuildContext context) { + doEverything(); + getPersonality(); + + return Container(); + } +} diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart index c56a6e60..d7d03b57 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart @@ -21,6 +21,7 @@ class _AllSumBodyState extends State { late HomeworkProvider homeworkProvider; late AbsenceProvider absenceProvider; //late TimetableProvider timetableProvider; + late Map> things = {}; late List firstSixTiles = []; late List lastSixTiles = []; diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart index 5e6394a6..f9eb4593 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart @@ -32,10 +32,10 @@ class _LessonsBodyState extends State { late AbsenceProvider absenceProvider; late SettingsProvider settingsProvider; late TimetableProvider timetableProvider; + late List absences = []; late List lessons = []; late List delays = []; - final Map _lessonCount = {}; @override diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart index 933dd38e..d54b69ba 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart @@ -1,10 +1,31 @@ +import 'package:filcnaplo/api/providers/user_provider.dart'; +import 'package:filcnaplo_mobile_ui/common/personality_card/personality_card.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; -class PersonalityBody extends StatelessWidget { +class PersonalityBody extends StatefulWidget { const PersonalityBody({Key? key}) : super(key: key); + @override + _PersonalityBodyState createState() => _PersonalityBodyState(); +} + +class _PersonalityBodyState extends State { + late UserProvider user; + @override Widget build(BuildContext context) { - return const Column(); + user = Provider.of(context); + + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + const SizedBox(height: 40), + PersonalityCard( + user: user, + ), + const SizedBox(height: 40), + ]); } } From fe0a7d81ae4b70cded8ac8a3a31ac6c0262aa183 Mon Sep 17 00:00:00 2001 From: kima Date: Thu, 22 Jun 2023 20:52:45 +0200 Subject: [PATCH 30/99] finished personalities map --- filcnaplo/assets/images/card_border.png | Bin 0 -> 13473 bytes .../personality_card/personality_card.dart | 138 +++++++++++++++++- 2 files changed, 130 insertions(+), 8 deletions(-) create mode 100644 filcnaplo/assets/images/card_border.png diff --git a/filcnaplo/assets/images/card_border.png b/filcnaplo/assets/images/card_border.png new file mode 100644 index 0000000000000000000000000000000000000000..5df72bec96a9ffe0cf8abd52477b369583a8c349 GIT binary patch literal 13473 zcmeAS@N?(olHy`uVBq!ia0y~yV6|glV7K95V_;zD`Z>Fqfq{Xuz$3Dlfk8|agc&`9 zR6Z~;FfbMexjQkeJ16s!fq{V~-O<;Pfnj4m_n$;o1_l!|PZ!6K3dT1#59WqMO0_-Q ze}{9z!4Qs=3n>>;7$hCs86-_47j!n9JaAX=g5(UIH&5SWy<5A;Om|vx$n&e8J>p+( zaJ+VL;=%RlX@2MT+<*41cJA~2?a%N0y|Zuo=4*5RW$ZuqwtCLicO^%+|H-?y>$3b? zi|zSexBscki+`xQf5z=?^|h<_Ked1M?QQ&Huku~5qT^oL)o||LJt(Yrpy}qEQ$Bt|?vq|IYQDwdF=A*Mc>ZTdoM-*Gr0Gu*!tYA|KHx`KR&zW z;o&u<+yB>`-u|z9(%r&qb*I;-^J@Qp^#1gk#HV3jEM9L}lwNzf{eAo0L2vwycu zhx%`C>ASPVez)bIey@IQBl}FquDqQQ;hcA2>nu6OQ>H%As$R%fP@u zQfN%Ec`JYY!_Puc_%U4j{<5mV63mpH1y1>3_K+v;Y_s1c%MS8JLhbRLCg&}4cgur# z4PR^TmRX%qt$D`>NqF0e-|vwI%Sb#F2GJ)3?LcX+L1vW8z`#ISXzXk|?+*#qeg9+l z^TBy}!Q<_q@B{_zFu-{?XM=r{QL*vu-8u_Is=7Ctsz3oli)^#A?fiadR<3_1zdxsX z!cC^26T^ z);u8Yfm`SHe$E527?N82L9~MV4;BzzG|FXQU?4Iy);;`u8x&{^Yu>+q{qQurP4al# zZ%~>BOAUP@?`AjHH!m#A&tKm59a>KBEwy{se)%iddmDD_EuF_#%sGGeVK9Hq+dJ0p z!6{O~Z8TXiFffpntDZ~Q?FYAA5B!?9uKjo}q*_d<&EIYd&cxuL9v;L2|1YJtPlHog z#Ql3#-=A47&+UgMwD#QPhhq*se`f&pYPR+FbGyL`J4V}E3=9ku)ti%+zkayoEi})* z{~I&w`JZfXC|mV`10T#D^2D7@=Wj#&vti%km|4%~Y`e=3^3;J}a@*#PmRiJDcO*3p z);;`u85GJ4Yu?|#et11NJze++sV>3dL!Q|F=Il0cu)j9!+grNtHvjTmSmmgH+pm3R z%lSb&STsjmKzqtgK2xgzG>(S z|9w33wmdYg`Hv&9r7s) z;Q{-LhqqmamRPVcdPpf0>*_y?u zp_4(4>AOpU(E&*V$p+;YCl{P#Fj`@`{8Xyqk(h0v)h{cTe9wsAwr$&wNRX`zIA*Gf zdFRJNBk1|HO5XX94tzrG|9x`rz~T#>hfx{WaQj;#a_K(j@-|q>cX`|8M7@W_Z-RlOW2TpRe#g6B^_?4ghIZm)-T zHh<^x|9-gT?PIX7*5v2U9UaI31qEqSLqv`8%*p=o=RC-4hBfamfBlel`!9r(pFej! zxa99TN` z+9{x@5=2{i0_qe%D#EX|d*$S|?}fBGzP?@i8PfX%hyCy%{<-8@Tla$wSw^Z+TlX!~4e_S@5)ELhkc>mF8gY8V>NfJ!%Yz4y+df zK9&BDIs6CgkCs=oT321nJO95d zC?Pd`t-WP$pS%11xAnQuv9H|vVYIfQ;B_3>Hx9>lR?gc7Sv7Ltm)x^UHs|N-LmT*e z%jfac%ax4|^HX=2A6)e{e68IlXO~xP2uf@WuWv^`hcr&W+~Gm|>D`x8Z3_0w>uT%i z&n%a}2KSB=3J3c%<>%ZVHnxZBW}EK0@hx@UbG~`i{`LR9#@>MKOS9YogML0_kBIv-ubu7 z=ak<6ba`9&=C*dQa=rcSYf84?-}iL-=C=08*LnNz{*F9+FKS-e+TDM@>8`)jRX6|n z&gT6#-&6k^ZO^|NKV|)Ii|zUU&n8d({iiwoKd0A}F1Nq6dS|UX$lSXA;@|W3ivH#QTqnM1@zx;l=$WUh KpUXO@geCwKQ!#-6 literal 0 HcmV?d00001 diff --git a/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart index e1664140..0f530140 100644 --- a/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart +++ b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart @@ -35,8 +35,7 @@ class _PersonalityCardState extends State { late Map subjectAvgs = {}; late double subjectAvg; late List classWorkGrades; - late int mostCommonGrade; - late int onesCount; + late Map mostCommonGrade; late List absences = []; late List delays = []; final Map _lessonCount = {}; @@ -129,8 +128,7 @@ class _PersonalityCardState extends State { } }); - mostCommonGrade = maxKey; - onesCount = counts.values.toList()[0]; + mostCommonGrade = {maxKey: maxValue}; } void getAbsences() { @@ -154,7 +152,8 @@ class _PersonalityCardState extends State { finalPersonality = PersonalityType.cheater; } else if (subjectAvg > 4.7) { finalPersonality = PersonalityType.geek; - } else if (onesCount > 1) { + } else if (mostCommonGrade.keys.toList()[0] == 1 && + mostCommonGrade.values.toList()[0] > 1) { finalPersonality = PersonalityType.fallible; } else if (absences.length < 10) { finalPersonality = PersonalityType.healthy; @@ -171,9 +170,9 @@ class _PersonalityCardState extends State { finalPersonality = PersonalityType.late; } else if (absences.length >= 100) { finalPersonality = PersonalityType.sick; - } else if (mostCommonGrade == 2) { + } else if (mostCommonGrade.keys.toList()[0] == 2) { finalPersonality = PersonalityType.acceptable; - } else if (mostCommonGrade == 3) { + } else if (mostCommonGrade.keys.toList()[0] == 3) { finalPersonality = PersonalityType.average; } else if (classWorkGrades.length >= 5) { finalPersonality = PersonalityType.diligent; @@ -182,11 +181,134 @@ class _PersonalityCardState extends State { } } + Widget cardInnerBuilder() { + Map emoji = {PersonalityType.geek: '🤓'}; + Map> personality = { + PersonalityType.geek: { + 'emoji': '🤓', + 'title': 'Stréber', + 'description': + 'Sokat tanulsz, de ezzel semmi baj! Ez egyben áldás és átok, de legalább az életben sikeres leszel.', + 'subtitle': 'Év végi átlagod', + 'subvalue': subjectAvg.toStringAsFixed(2), + }, + PersonalityType.sick: { + 'emoji': '🤒', + 'title': 'Beteges', + 'description': + 'Jobbulást, tesó. Még akkor is, ha hazudtál arról, hogy beteg vagy, hogy ne kelljen suliba menned.', + 'subtitle': 'Hiányzásaid', + 'subvalue': absences.length.toString(), + }, + PersonalityType.late: { + 'emoji': '⌛', + 'title': 'Késős', + 'description': + 'Kilukadt a villamos kereke. Kisiklott a repülő. A kutyád megette a cipőd. Elhisszük.', + 'subtitle': 'Késésed (perc)', + 'subvalue': (absences.where( + (a) => a.state == Justification.unexcused && a.delay > 0)) + .map((e) => e.delay) + .reduce((a, b) => a + b) + .toString(), + }, + PersonalityType.quitter: { + 'emoji': '❓', + 'title': 'Lógós', + 'description': 'Osztályzóvizsga incoming.', + 'subtitle': 'Igazolatlan hiányzások', + 'subvalue': (absences.where( + (a) => a.state == Justification.unexcused && a.delay == 0)) + .length + .toString(), + }, + PersonalityType.healthy: { + 'emoji': '😷', + 'title': 'Makk', + 'description': + '...egészséges vagy! Egész évben alig hiányoztál az iskolából.', + 'subtitle': 'Hiányzásaid', + 'subvalue': absences.length.toString(), + }, + PersonalityType.acceptable: { + 'emoji': '🤏', + 'title': 'Elmegy', + 'description': + 'A kettes érettségi is érettségi. Nem egy jó érettségi, de biztos, hogy egy érettségi.', + 'subtitle': 'Kettesek', + 'subvalue': mostCommonGrade.values.toList()[0].toString(), + }, + PersonalityType.fallible: { + 'emoji': '📉', + 'title': 'Bukós', + 'description': 'Jövőre több sikerrel jársz.', + 'subtitle': 'Karók', + 'subvalue': mostCommonGrade.values.toList()[0].toString(), + }, + PersonalityType.average: { + 'emoji': '👌', + 'title': 'Közepes', + 'description': 'Se jó, se rossz. Az arany középút, if you will.', + 'subtitle': 'Hármasok', + 'subvalue': mostCommonGrade.values.toList()[0].toString(), + }, + PersonalityType.diligent: { + 'emoji': '💫', + 'title': 'Szorgalmas', + 'description': + 'Leírtad a jegyzetet, megcsináltad a prezentációt, és te vezetted a projektmunkát.', + 'subtitle': 'Órai munka ötösök', + 'subvalue': classWorkGrades.length.toString(), + }, + PersonalityType.cheater: { + 'emoji': '‍🧑‍💻', + 'title': 'Csaló', + 'description': + 'Bekapcsoltad a “Jó Tanuló” módot. Wow. Azt hitted, outsmartolhatsz, de outsmartingoltam az outsmartingolásod.', + 'subtitle': 'Bitches', + 'subvalue': '0', + }, + PersonalityType.npc: { + 'emoji': '⛰️', + 'title': 'NPC', + 'description': + 'Egy akkora nagy non-player character vagy, hogy neked semmilyen személyiség nem jutott ezen kívül.', + 'subtitle': 'In-game playtime (óra)', + 'subvalue': '69420', + } + }; + + for (var i in personality.keys) { + Widget w = Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + personality[i.name]?['emoji'] ?? '⛰️', + style: const TextStyle(fontSize: 128), + ) + ], + ); + } + return Container(); + } + @override Widget build(BuildContext context) { doEverything(); getPersonality(); - return Container(); + return Container( + decoration: const BoxDecoration(color: Color(0x600008FF)), + child: Container( + padding: const EdgeInsets.all(5), + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage('images/card_border.png'), + ), + ), + child: cardInnerBuilder(), + ), + ); } } From 8e9713e4360d01ef050756be8f0217bc74459477 Mon Sep 17 00:00:00 2001 From: kima Date: Thu, 22 Jun 2023 21:12:34 +0200 Subject: [PATCH 31/99] almost finished personality page --- .../personality_card/personality_card.dart | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart index 0f530140..aa3919d6 100644 --- a/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart +++ b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart @@ -182,7 +182,6 @@ class _PersonalityCardState extends State { } Widget cardInnerBuilder() { - Map emoji = {PersonalityType.geek: '🤓'}; Map> personality = { PersonalityType.geek: { 'emoji': '🤓', @@ -278,19 +277,48 @@ class _PersonalityCardState extends State { } }; + Map personalityWidgets = {}; + for (var i in personality.keys) { Widget w = Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - personality[i.name]?['emoji'] ?? '⛰️', - style: const TextStyle(fontSize: 128), - ) + personality[i]?['emoji'] ?? '❓', + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 128.0), + ), + Text( + personality[i]?['title'] ?? '???', + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 38.0, color: Colors.white), + ), + Text( + personality[i]?['description'] ?? 'Ismeretlen személyiség...', + textAlign: TextAlign.start, + style: TextStyle( + fontSize: 16, + color: Colors.white.withOpacity(0.8), + ), + ), + Text( + personality[i]?['subtitle'] ?? '???', + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 20.0, color: Colors.white), + ), + Text( + personality[i]?['subvalue'] ?? '0', + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 76.0, color: Colors.white), + ), ], ); + + personalityWidgets.addAll({i: w}); } - return Container(); + + return personalityWidgets[finalPersonality] ?? Container(); } @override From 1f46a0509f03b76db55dcc4532733147d070233a Mon Sep 17 00:00:00 2001 From: kima Date: Thu, 22 Jun 2023 21:55:57 +0200 Subject: [PATCH 32/99] fixed summary crash error --- .../personality_card/personality_card.dart | 37 ++++++++----------- .../personality_card.i18n.dart | 11 ++++++ 2 files changed, 27 insertions(+), 21 deletions(-) create mode 100644 filcnaplo_mobile_ui/lib/common/personality_card/personality_card.i18n.dart diff --git a/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart index aa3919d6..8a6f2424 100644 --- a/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart +++ b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart @@ -37,8 +37,9 @@ class _PersonalityCardState extends State { late List classWorkGrades; late Map mostCommonGrade; late List absences = []; - late List delays = []; final Map _lessonCount = {}; + late int totalDelays; + late int unexcusedAbsences; late PersonalityType finalPersonality; @@ -133,11 +134,19 @@ class _PersonalityCardState extends State { void getAbsences() { absences = absenceProvider.absences.where((a) => a.delay == 0).toList(); + + unexcusedAbsences = absences + .where((a) => a.state == Justification.unexcused && a.delay == 0) + .length; } void getAndSortDelays() { - delays = absenceProvider.absences; - delays.sort((a, b) => -a.delay.compareTo(b.delay)); + Iterable unexcusedDelays = absences + .where((a) => a.state == Justification.unexcused && a.delay > 0) + .map((e) => e.delay); + totalDelays = unexcusedDelays.isNotEmpty + ? unexcusedDelays.reduce((a, b) => a + b) + : 0; } void doEverything() { @@ -157,16 +166,9 @@ class _PersonalityCardState extends State { finalPersonality = PersonalityType.fallible; } else if (absences.length < 10) { finalPersonality = PersonalityType.healthy; - } else if ((absences.where( - (a) => a.state == Justification.unexcused && a.delay == 0)) - .length >= - 10) { + } else if (unexcusedAbsences >= 10) { finalPersonality = PersonalityType.quitter; - } else if ((absences.where( - (a) => a.state == Justification.unexcused && a.delay > 0)) - .map((e) => e.delay) - .reduce((a, b) => a + b) > - 50) { + } else if (totalDelays > 50) { finalPersonality = PersonalityType.late; } else if (absences.length >= 100) { finalPersonality = PersonalityType.sick; @@ -205,21 +207,14 @@ class _PersonalityCardState extends State { 'description': 'Kilukadt a villamos kereke. Kisiklott a repülő. A kutyád megette a cipőd. Elhisszük.', 'subtitle': 'Késésed (perc)', - 'subvalue': (absences.where( - (a) => a.state == Justification.unexcused && a.delay > 0)) - .map((e) => e.delay) - .reduce((a, b) => a + b) - .toString(), + 'subvalue': totalDelays.toString(), }, PersonalityType.quitter: { 'emoji': '❓', 'title': 'Lógós', 'description': 'Osztályzóvizsga incoming.', 'subtitle': 'Igazolatlan hiányzások', - 'subvalue': (absences.where( - (a) => a.state == Justification.unexcused && a.delay == 0)) - .length - .toString(), + 'subvalue': unexcusedAbsences.toString(), }, PersonalityType.healthy: { 'emoji': '😷', diff --git a/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.i18n.dart b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.i18n.dart new file mode 100644 index 00000000..a2075862 --- /dev/null +++ b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.i18n.dart @@ -0,0 +1,11 @@ +import 'package:i18n_extension/i18n_extension.dart'; + +extension Localization on String { + static final _t = + Translations.byLocale("hu_hu") + {"en_en": {}, "hu_hu": {}, "de_de": {}}; + + String get i18n => localize(this, _t); + String fill(List params) => localizeFill(this, params); + String plural(int value) => localizePlural(value, this, _t); + String version(Object modifier) => localizeVersion(modifier, this, _t); +} From 87842de4218f76fd0c5ba4fbb8f4c2330f8162cd Mon Sep 17 00:00:00 2001 From: kima Date: Thu, 22 Jun 2023 23:33:28 +0200 Subject: [PATCH 33/99] finished personality card style --- .../personality_card/personality_card.dart | 67 +++++++++++++++---- .../summary/pages/personality_page.dart | 4 +- filcnaplo_mobile_ui/pubspec.yaml | 1 + 3 files changed, 58 insertions(+), 14 deletions(-) diff --git a/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart index 8a6f2424..31cd4b9b 100644 --- a/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart +++ b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart @@ -1,3 +1,4 @@ +import 'package:dotted_border/dotted_border.dart'; import 'package:filcnaplo/api/providers/user_provider.dart'; import 'package:filcnaplo/helpers/average_helper.dart'; import 'package:filcnaplo/models/settings.dart'; @@ -43,6 +44,8 @@ class _PersonalityCardState extends State { late PersonalityType finalPersonality; + bool hold = false; + List getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider .grades .where((e) => @@ -282,30 +285,49 @@ class _PersonalityCardState extends State { Text( personality[i]?['emoji'] ?? '❓', textAlign: TextAlign.center, - style: const TextStyle(fontSize: 128.0), + style: const TextStyle( + fontSize: 128.0, + height: 1.2, + ), ), Text( personality[i]?['title'] ?? '???', textAlign: TextAlign.center, - style: const TextStyle(fontSize: 38.0, color: Colors.white), + style: const TextStyle( + fontSize: 38.0, + color: Colors.white, + fontWeight: FontWeight.w800, + ), ), + const SizedBox(height: 5), Text( personality[i]?['description'] ?? 'Ismeretlen személyiség...', textAlign: TextAlign.start, style: TextStyle( fontSize: 16, + height: 1.2, color: Colors.white.withOpacity(0.8), ), ), + const SizedBox(height: 25), Text( personality[i]?['subtitle'] ?? '???', textAlign: TextAlign.center, - style: const TextStyle(fontSize: 20.0, color: Colors.white), + style: const TextStyle( + fontSize: 20.0, + color: Colors.white, + fontWeight: FontWeight.bold, + ), ), Text( personality[i]?['subvalue'] ?? '0', textAlign: TextAlign.center, - style: const TextStyle(fontSize: 76.0, color: Colors.white), + style: const TextStyle( + fontSize: 69.0, + height: 1.15, + color: Colors.white, + fontWeight: FontWeight.w800, + ), ), ], ); @@ -321,16 +343,37 @@ class _PersonalityCardState extends State { doEverything(); getPersonality(); - return Container( - decoration: const BoxDecoration(color: Color(0x600008FF)), - child: Container( - padding: const EdgeInsets.all(5), - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage('images/card_border.png'), + return GestureDetector( + onLongPressDown: (_) => setState(() => hold = true), + onLongPressEnd: (_) => setState(() => hold = false), + onLongPressCancel: () => setState(() => hold = false), + child: AnimatedScale( + scale: hold ? 1.018 : 1.0, + curve: Curves.easeInOutBack, + duration: const Duration(milliseconds: 300), + child: Container( + padding: + const EdgeInsets.only(top: 12, bottom: 12, left: 12, right: 12), + decoration: BoxDecoration( + color: const Color(0x280008FF), + borderRadius: const BorderRadius.all(Radius.circular(5)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.08), + offset: const Offset(0, 5), + blurRadius: 20, + spreadRadius: 10, + ), + ], + ), + child: DottedBorder( + color: Colors.black.withOpacity(0.9), + dashPattern: const [12, 12], + padding: + const EdgeInsets.only(top: 20, bottom: 20, left: 20, right: 20), + child: cardInnerBuilder(), ), ), - child: cardInnerBuilder(), ), ); } diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart index d54b69ba..41d2bda0 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart @@ -21,11 +21,11 @@ class _PersonalityBodyState extends State { crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - const SizedBox(height: 40), + const SizedBox(height: 60), PersonalityCard( user: user, ), - const SizedBox(height: 40), + const SizedBox(height: 60), ]); } } diff --git a/filcnaplo_mobile_ui/pubspec.yaml b/filcnaplo_mobile_ui/pubspec.yaml index 197cd6a9..eaf87edb 100755 --- a/filcnaplo_mobile_ui/pubspec.yaml +++ b/filcnaplo_mobile_ui/pubspec.yaml @@ -40,6 +40,7 @@ dependencies: background_fetch: ^1.1.5 wtf_sliding_sheet: ^1.0.0 package_info_plus: ^4.0.2 + dotted_border: ^2.0.0+3 dev_dependencies: flutter_lints: ^1.0.0 From 5034af2fb404b244ecf579be0f3ce1ad4c35fd0a Mon Sep 17 00:00:00 2001 From: kima Date: Fri, 23 Jun 2023 00:54:56 +0200 Subject: [PATCH 34/99] finished animations and started reveal/share --- filcnaplo/pubspec.yaml | 1 + .../common/personality_card/empty_card.dart | 68 +++++++++++++++++ .../screens/summary/pages/allsum_page.dart | 19 ++++- .../screens/summary/pages/grades_page.dart | 74 ++++++++++++------- .../summary/pages/personality_page.dart | 61 ++++++++++++++- filcnaplo_mobile_ui/pubspec.yaml | 1 + 6 files changed, 194 insertions(+), 30 deletions(-) create mode 100644 filcnaplo_mobile_ui/lib/common/personality_card/empty_card.dart diff --git a/filcnaplo/pubspec.yaml b/filcnaplo/pubspec.yaml index d21ace1d..6c1db7b7 100644 --- a/filcnaplo/pubspec.yaml +++ b/filcnaplo/pubspec.yaml @@ -65,6 +65,7 @@ dependencies: background_fetch: ^1.1.5 flutter_local_notifications: ^14.1.0 package_info_plus: ^4.0.2 + screenshot: ^2.1.0 dev_dependencies: flutter_lints: ^2.0.1 diff --git a/filcnaplo_mobile_ui/lib/common/personality_card/empty_card.dart b/filcnaplo_mobile_ui/lib/common/personality_card/empty_card.dart new file mode 100644 index 00000000..9df12a8a --- /dev/null +++ b/filcnaplo_mobile_ui/lib/common/personality_card/empty_card.dart @@ -0,0 +1,68 @@ +import 'package:dotted_border/dotted_border.dart'; +import 'package:flutter/material.dart'; + +class EmptyCard extends StatefulWidget { + const EmptyCard({ + Key? key, + required this.text, + }) : super(key: key); + + final String text; + + @override + State createState() => _EmptyCardState(); +} + +class _EmptyCardState extends State { + bool hold = false; + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onLongPressDown: (_) => setState(() => hold = true), + onLongPressEnd: (_) => setState(() => hold = false), + onLongPressCancel: () => setState(() => hold = false), + child: AnimatedScale( + scale: hold ? 1.018 : 1.0, + curve: Curves.easeInOutBack, + duration: const Duration(milliseconds: 300), + child: Container( + height: 444, + padding: + const EdgeInsets.only(top: 12, bottom: 12, left: 12, right: 12), + decoration: BoxDecoration( + color: const Color(0x280008FF), + borderRadius: const BorderRadius.all(Radius.circular(5)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.08), + offset: const Offset(0, 5), + blurRadius: 20, + spreadRadius: 10, + ), + ], + ), + child: DottedBorder( + color: Colors.black.withOpacity(0.9), + dashPattern: const [12, 12], + padding: + const EdgeInsets.only(top: 20, bottom: 20, left: 20, right: 20), + child: Center( + child: Text( + widget.text, + style: TextStyle( + color: Colors.white.withOpacity(0.9), + ), + ), + ), + ), + ), + ), + ); + } +} diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart index d7d03b57..f7d99664 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart @@ -27,6 +27,7 @@ class _AllSumBodyState extends State { late List lastSixTiles = []; int avgDropValue = 0; + bool animation = false; List getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider .grades @@ -45,6 +46,12 @@ class _AllSumBodyState extends State { homeworkProvider = Provider.of(context, listen: false); absenceProvider = Provider.of(context, listen: false); //timetableProvider = Provider.of(context, listen: false); + + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + setState(() { + animation = true; + }); + }); } void getGrades() { @@ -176,7 +183,11 @@ class _AllSumBodyState extends State { const SizedBox( height: 45, ), - SizedBox( + AnimatedContainer( + curve: Curves.easeInOut, + duration: const Duration(milliseconds: 420), + transform: Matrix4.translationValues( + animation ? 0 : MediaQuery.of(context).size.width, 0, 0), height: 250, child: GridView.count( crossAxisCount: 3, @@ -188,7 +199,11 @@ class _AllSumBodyState extends State { const SizedBox( height: 30, ), - SizedBox( + AnimatedContainer( + curve: Curves.easeInOut, + duration: const Duration(milliseconds: 420), + transform: Matrix4.translationValues( + animation ? 0 : -MediaQuery.of(context).size.width, 0, 0), height: 250, child: GridView.count( crossAxisCount: 3, diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart index 9deab817..c84a23cc 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart @@ -45,6 +45,7 @@ class _GradesBodyState extends State { List subjectTiles1 = []; int avgDropValue = 0; + bool animation = false; List getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider .grades @@ -61,6 +62,12 @@ class _GradesBodyState extends State { gradeProvider = Provider.of(context, listen: false); settings = Provider.of(context, listen: false); + + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + setState(() { + animation = true; + }); + }); } void generateTiles({required int filter}) { @@ -73,37 +80,46 @@ class _GradesBodyState extends State { Map subjectAvgs = {}; + var count = 1; + for (Subject subject in subjects) { List subjectGrades = getSubjectGrades(subject); double avg = AverageHelper.averageEvals(subjectGrades); if (avg != 0) subjectAvgs[subject] = avg; - Widget widget = Row( - children: [ - GradeValueWidget( - GradeValue(avg.round(), '', '', 100), - fill: true, - size: 28.0, - ), - const SizedBox(width: 8), - Text( - subject.renamedTo ?? subject.name.capital(), - maxLines: 2, - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 20.0, - color: Colors.white.withOpacity(0.98), - fontStyle: settings.renamedSubjectsItalics && subject.isRenamed - ? FontStyle.italic - : null, + Widget widget = AnimatedContainer( + curve: Curves.easeInOut, + duration: Duration(milliseconds: 300 + (count * 120)), + transform: Matrix4.translationValues( + animation ? 0 : MediaQuery.of(context).size.width, 0, 0), + child: Row( + children: [ + GradeValueWidget( + GradeValue(avg.round(), '', '', 100), + fill: true, + size: 28.0, ), - ) - ], + const SizedBox(width: 8), + Text( + subject.renamedTo ?? subject.name.capital(), + maxLines: 2, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20.0, + color: Colors.white.withOpacity(0.98), + fontStyle: settings.renamedSubjectsItalics && subject.isRenamed + ? FontStyle.italic + : null, + ), + ) + ], + ), ); if (avg.round() == filter) { tiles.add(widget); + count++; } } @@ -175,7 +191,9 @@ class _GradesBodyState extends State { children: [ SizedBox( height: ((100 * subjectTiles5.length) / - (subjectTiles5[0].runtimeType == Row ? 1.95 : 1.2)) + (subjectTiles5[0].runtimeType == AnimatedContainer + ? 1.95 + : 1.2)) .toDouble(), child: ListView.builder( padding: const EdgeInsets.only(left: 5), @@ -186,7 +204,7 @@ class _GradesBodyState extends State { EdgeInsetsGeometry panelPadding = const EdgeInsets.symmetric(horizontal: 24.0); - if (subjectTiles5[index].runtimeType == Row) { + if (subjectTiles5[index].runtimeType == AnimatedContainer) { return Padding( padding: const EdgeInsets.only(top: 8), child: subjectTiles5[index]); @@ -212,7 +230,9 @@ class _GradesBodyState extends State { const SizedBox(height: 12.0), SizedBox( height: ((100 * subjectTiles3.length) / - (subjectTiles3[0].runtimeType == Row ? 1.95 : 1.2)) + (subjectTiles3[0].runtimeType == AnimatedContainer + ? 1.95 + : 1.2)) .toDouble(), child: ListView.builder( padding: const EdgeInsets.only(left: 5), @@ -223,7 +243,7 @@ class _GradesBodyState extends State { EdgeInsetsGeometry panelPadding = const EdgeInsets.symmetric(horizontal: 24.0); - if (subjectTiles3[index].runtimeType == Row) { + if (subjectTiles3[index].runtimeType == AnimatedContainer) { return Padding( padding: const EdgeInsets.only(top: 8), child: subjectTiles3[index]); @@ -249,7 +269,9 @@ class _GradesBodyState extends State { const SizedBox(height: 12.0), SizedBox( height: ((100 * subjectTiles1.length) / - (subjectTiles1[0].runtimeType == Row ? 1.95 : 1.2)) + (subjectTiles1[0].runtimeType == AnimatedContainer + ? 1.95 + : 1.2)) .toDouble(), child: ListView.builder( padding: const EdgeInsets.only(left: 5), @@ -260,7 +282,7 @@ class _GradesBodyState extends State { EdgeInsetsGeometry panelPadding = const EdgeInsets.symmetric(horizontal: 24.0); - if (subjectTiles1[index].runtimeType == Row) { + if (subjectTiles1[index].runtimeType == AnimatedContainer) { return Padding( padding: const EdgeInsets.only(top: 8), child: subjectTiles1[index]); diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart index 41d2bda0..87822725 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart @@ -1,7 +1,14 @@ +import 'dart:io'; + import 'package:filcnaplo/api/providers/user_provider.dart'; +import 'package:filcnaplo_mobile_ui/common/personality_card/empty_card.dart'; import 'package:filcnaplo_mobile_ui/common/personality_card/personality_card.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:provider/provider.dart'; +import 'package:screenshot/screenshot.dart'; +import 'package:share_plus/share_plus.dart'; +import 'package:path_provider/path_provider.dart'; class PersonalityBody extends StatefulWidget { const PersonalityBody({Key? key}) : super(key: key); @@ -13,6 +20,25 @@ class PersonalityBody extends StatefulWidget { class _PersonalityBodyState extends State { late UserProvider user; + bool isRevealed = false; + + ScreenshotController screenshotController = ScreenshotController(); + + sharePersonality() async { + await screenshotController.capture().then((image) async { + if (image != null) { + final directory = await getApplicationDocumentsDirectory(); + final imagePath = + await File('${directory.path}/refilc_personality.png').create(); + await imagePath.writeAsBytes(image); + + await Share.shareXFiles([XFile(imagePath.path)]); + } + }).catchError((err) { + throw err; + }); + } + @override Widget build(BuildContext context) { user = Provider.of(context); @@ -22,8 +48,39 @@ class _PersonalityBodyState extends State { mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ const SizedBox(height: 60), - PersonalityCard( - user: user, + AnimatedCrossFade( + duration: const Duration(milliseconds: 1000), + sizeCurve: Curves.easeInToLinear, + firstChild: Screenshot( + controller: screenshotController, + child: PersonalityCard(user: user), + ), + secondChild: GestureDetector( + onTap: () => setState(() { + isRevealed = true; + }), + child: const EmptyCard(text: 'Kattints a felfedéshez...'), + ), + crossFadeState: isRevealed + ? CrossFadeState.showFirst + : CrossFadeState.showSecond, + ), + const SizedBox(height: 40), + Center( + child: IconButton( + onPressed: () async { + await sharePersonality(); + }, + icon: const Icon( + FeatherIcons.share2, + color: Colors.white, + size: 20, + ), + style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all(Colors.white.withOpacity(0.5)), + ), + ), ), const SizedBox(height: 60), ]); diff --git a/filcnaplo_mobile_ui/pubspec.yaml b/filcnaplo_mobile_ui/pubspec.yaml index eaf87edb..e5186176 100755 --- a/filcnaplo_mobile_ui/pubspec.yaml +++ b/filcnaplo_mobile_ui/pubspec.yaml @@ -41,6 +41,7 @@ dependencies: wtf_sliding_sheet: ^1.0.0 package_info_plus: ^4.0.2 dotted_border: ^2.0.0+3 + screenshot: ^2.1.0 dev_dependencies: flutter_lints: ^1.0.0 From fa8be89aaffc6bde2894ad95c50b9ddd15fb02d1 Mon Sep 17 00:00:00 2001 From: kima Date: Fri, 23 Jun 2023 01:06:48 +0200 Subject: [PATCH 35/99] fixed some issues and added gallery save feature --- .../summary/pages/personality_page.dart | 61 +++++++++++++++---- filcnaplo_mobile_ui/pubspec.yaml | 1 + 2 files changed, 49 insertions(+), 13 deletions(-) diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart index 87822725..a7a02ad2 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart @@ -9,6 +9,7 @@ import 'package:provider/provider.dart'; import 'package:screenshot/screenshot.dart'; import 'package:share_plus/share_plus.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:image_gallery_saver/image_gallery_saver.dart'; class PersonalityBody extends StatefulWidget { const PersonalityBody({Key? key}) : super(key: key); @@ -28,6 +29,9 @@ class _PersonalityBodyState extends State { await screenshotController.capture().then((image) async { if (image != null) { final directory = await getApplicationDocumentsDirectory(); + if (await File('${directory.path}/refilc_personality.png').exists()) { + await File('${directory.path}/refilc_personality.png').delete(); + } final imagePath = await File('${directory.path}/refilc_personality.png').create(); await imagePath.writeAsBytes(image); @@ -39,6 +43,16 @@ class _PersonalityBodyState extends State { }); } + savePersonality() async { + await screenshotController.capture().then((image) async { + if (image != null) { + await ImageGallerySaver.saveImage(image, name: 'refilc_personality'); + } + }).catchError((err) { + throw err; + }); + } + @override Widget build(BuildContext context) { user = Provider.of(context); @@ -67,19 +81,40 @@ class _PersonalityBodyState extends State { ), const SizedBox(height: 40), Center( - child: IconButton( - onPressed: () async { - await sharePersonality(); - }, - icon: const Icon( - FeatherIcons.share2, - color: Colors.white, - size: 20, - ), - style: ButtonStyle( - backgroundColor: - MaterialStateProperty.all(Colors.white.withOpacity(0.5)), - ), + child: Row( + children: [ + IconButton( + onPressed: () async { + await sharePersonality(); + }, + icon: const Icon( + FeatherIcons.share, + color: Colors.white, + size: 30, + ), + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + Colors.white.withOpacity(0.2)), + ), + ), + const SizedBox( + width: 10, + ), + IconButton( + onPressed: () async { + await savePersonality(); + }, + icon: const Icon( + FeatherIcons.bookmark, + color: Colors.white, + size: 30, + ), + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + Colors.white.withOpacity(0.2)), + ), + ), + ], ), ), const SizedBox(height: 60), diff --git a/filcnaplo_mobile_ui/pubspec.yaml b/filcnaplo_mobile_ui/pubspec.yaml index e5186176..ced8ee0c 100755 --- a/filcnaplo_mobile_ui/pubspec.yaml +++ b/filcnaplo_mobile_ui/pubspec.yaml @@ -42,6 +42,7 @@ dependencies: package_info_plus: ^4.0.2 dotted_border: ^2.0.0+3 screenshot: ^2.1.0 + image_gallery_saver: ^2.0.2 dev_dependencies: flutter_lints: ^1.0.0 From acdd47a49a9b12405de06a8663997bfafa878860 Mon Sep 17 00:00:00 2001 From: kima Date: Fri, 23 Jun 2023 01:17:26 +0200 Subject: [PATCH 36/99] fixed style bug and added reveal check to buttons --- .../summary/pages/personality_page.dart | 69 ++++++++++--------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart index a7a02ad2..14eb19db 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart @@ -80,43 +80,46 @@ class _PersonalityBodyState extends State { : CrossFadeState.showSecond, ), const SizedBox(height: 40), - Center( - child: Row( - children: [ - IconButton( - onPressed: () async { - await sharePersonality(); - }, - icon: const Icon( - FeatherIcons.share, - color: Colors.white, - size: 30, + if (isRevealed) + Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + IconButton( + onPressed: () async { + await sharePersonality(); + }, + icon: const Icon( + FeatherIcons.share, + color: Colors.white, + size: 30, + ), + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + Colors.white.withOpacity(0.2)), + ), ), - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( - Colors.white.withOpacity(0.2)), + const SizedBox( + width: 10, ), - ), - const SizedBox( - width: 10, - ), - IconButton( - onPressed: () async { - await savePersonality(); - }, - icon: const Icon( - FeatherIcons.bookmark, - color: Colors.white, - size: 30, + IconButton( + onPressed: () async { + await savePersonality(); + }, + icon: const Icon( + FeatherIcons.bookmark, + color: Colors.white, + size: 30, + ), + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + Colors.white.withOpacity(0.2)), + ), ), - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( - Colors.white.withOpacity(0.2)), - ), - ), - ], + ], + ), ), - ), const SizedBox(height: 60), ]); } From 33174727737b129432f575dc3fb491ea07fb360c Mon Sep 17 00:00:00 2001 From: kima Date: Fri, 23 Jun 2023 11:20:18 +0200 Subject: [PATCH 37/99] fixed end-year average --- .../screens/summary/pages/grades_page.dart | 22 ++++++++++++++----- .../screens/summary/summary_screen.i18n.dart | 12 +++++++--- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart index c84a23cc..8512b0ad 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart @@ -12,6 +12,7 @@ import 'package:filcnaplo_mobile_ui/screens/summary/summary_screen.i18n.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:auto_size_text/auto_size_text.dart'; +import 'package:i18n_extension/i18n_widget.dart'; List faces = [ "(·.·)", @@ -39,6 +40,8 @@ class _GradesBodyState extends State { late SettingsProvider settings; late double subjectAvg; + late double endYearAvg; + late String endYearAvgText; List subjectTiles5 = []; List subjectTiles3 = []; @@ -136,7 +139,7 @@ class _GradesBodyState extends State { ), children: [ TextSpan( - text: "\nno_grades".i18n, + text: "\n${'no_grades'.i18n}", style: TextStyle( fontSize: 18.0, height: 2.0, @@ -155,6 +158,15 @@ class _GradesBodyState extends State { subjectAvgs.length : 0.0; + List endYearGrades = gradeProvider.grades + .where((grade) => grade.type == GradeType.endYear) + .toList(); + endYearAvg = AverageHelper.averageEvals(endYearGrades, finalAvg: true); + endYearAvgText = endYearAvg.toStringAsFixed(1); + if (I18n.of(context).locale.languageCode != "en") { + endYearAvgText = endYearAvgText.replaceAll(".", ","); + } + if (filter == 5) { subjectTiles5 = List.castFrom(tiles); if (subjectTiles5.length > 4) { @@ -316,10 +328,10 @@ class _GradesBodyState extends State { padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 4.0), decoration: BoxDecoration( - color: gradeColor(context: context, value: subjectAvg) + color: gradeColor(context: context, value: endYearAvg) .withOpacity(.2), border: Border.all( - color: (gradeColor(context: context, value: subjectAvg)) + color: (gradeColor(context: context, value: endYearAvg)) .withOpacity(0.0), width: 2.0, ), @@ -327,13 +339,13 @@ class _GradesBodyState extends State { ), child: AutoSizeText.rich( TextSpan( - text: subjectAvg.toStringAsFixed(2), + text: endYearAvgText, ), maxLines: 1, minFontSize: 5, textAlign: TextAlign.center, style: TextStyle( - color: gradeColor(context: context, value: subjectAvg), + color: gradeColor(context: context, value: endYearAvg), fontWeight: FontWeight.w800, fontSize: 32.0, ), diff --git a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.i18n.dart b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.i18n.dart index 4a8c32f0..fc7ebcd1 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.i18n.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.i18n.dart @@ -3,9 +3,15 @@ import 'package:i18n_extension/i18n_extension.dart'; extension SettingsLocalization on String { static final _t = Translations.byLocale("hu_hu") + { - "en_en": {}, - "hu_hu": {}, - "de_de": {}, + "en_en": { + "no_grades": "No grades found", + }, + "hu_hu": { + "no_grades": "Nincsenek jegyek", + }, + "de_de": { + "no_grades": "No grades found", + }, }; String get i18n => localize(this, _t); From f4501ce251106fd1e7ea4fa342015f2aaf460c77 Mon Sep 17 00:00:00 2001 From: kima Date: Sat, 24 Jun 2023 21:41:18 +0200 Subject: [PATCH 38/99] finished translation for summary --- .../screens/summary/pages/allsum_page.dart | 31 +++--- .../screens/summary/pages/grades_page.dart | 18 ++-- .../screens/summary/pages/lessons_page.dart | 19 ++-- .../summary/pages/personality_page.dart | 3 +- .../lib/screens/summary/pages/start_page.dart | 3 +- .../lib/screens/summary/summary_screen.dart | 11 ++- .../screens/summary/summary_screen.i18n.dart | 95 ++++++++++++++++++- 7 files changed, 142 insertions(+), 38 deletions(-) diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart index f7d99664..e20282d9 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart @@ -5,6 +5,7 @@ import 'package:filcnaplo_kreta_api/models/subject.dart'; import 'package:filcnaplo_kreta_api/providers/absence_provider.dart'; import 'package:filcnaplo_kreta_api/providers/grade_provider.dart'; import 'package:filcnaplo_kreta_api/providers/homework_provider.dart'; +import 'package:filcnaplo_mobile_ui/screens/summary/summary_screen.i18n.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -61,9 +62,12 @@ class _AllSumBodyState extends State { gradeProvider.grades.where((a) => a.value.weight >= 200); things.addAll({ - 'tests': {'name': 'dolgozat', 'value': testsGrades.length}, - 'closingTests': {'name': 'témazáró', 'value': closingTestsGrades.length}, - 'grades': {'name': 'jegy', 'value': allGrades.length} + 'tests': {'name': 'test'.i18n, 'value': testsGrades.length}, + 'closingTests': { + 'name': 'closingtest'.i18n, + 'value': closingTestsGrades.length + }, + 'grades': {'name': 'grade'.i18n, 'value': allGrades.length} }); } @@ -71,7 +75,7 @@ class _AllSumBodyState extends State { var allHomework = homeworkProvider.homework; things.addAll({ - 'homework': {'name': 'házi', 'value': allHomework.length} + 'homework': {'name': 'hw'.i18n, 'value': allHomework.length} }); } @@ -85,8 +89,8 @@ class _AllSumBodyState extends State { var totalLessons = 0; things.addAll({ - 'subjects': {'name': 'tantárgy', 'value': allSubjects.length}, - 'lessons': {'name': 'óra', 'value': totalLessons} + 'subjects': {'name': 'subject'.i18n, 'value': allSubjects.length}, + 'lessons': {'name': 'lesson'.i18n, 'value': totalLessons} }); } @@ -100,10 +104,13 @@ class _AllSumBodyState extends State { a.delay == 0); things.addAll({ - 'absences': {'name': 'hiányzás', 'value': allAbsences.length}, - 'excusedAbsences': {'name': 'igazolt', 'value': excusedAbsences.length}, + 'absences': {'name': 'absence_sum'.i18n, 'value': allAbsences.length}, + 'excusedAbsences': { + 'name': 'excused'.i18n, + 'value': excusedAbsences.length + }, 'unexcusedAbsences': { - 'name': 'igazolatlan', + 'name': 'unexcused'.i18n, 'value': unexcusedAbsences.length } }); @@ -119,10 +126,10 @@ class _AllSumBodyState extends State { .where((a) => a.state == Justification.unexcused && a.delay > 0); things.addAll({ - 'delays': {'name': 'késés', 'value': allDelays.length}, - 'totalDelay': {'name': 'perc', 'value': totalDelayTime}, + 'delays': {'name': 'delay_sum'.i18n, 'value': allDelays.length}, + 'totalDelay': {'name': 'min'.i18n, 'value': totalDelayTime}, 'unexcusedDelays': { - 'name': 'igazolatlan', + 'name': 'unexcused'.i18n, 'value': unexcusedDelays.length } }); diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart index 8512b0ad..3153ab06 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart @@ -231,9 +231,9 @@ class _GradesBodyState extends State { ), ), const SizedBox(height: 12.0), - const Text( - 'Próba teszi a mestert! 🔃', - style: TextStyle( + Text( + 'tryagain'.i18n, + style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 22.0, color: Colors.white, @@ -270,9 +270,9 @@ class _GradesBodyState extends State { ), ), const SizedBox(height: 12.0), - const Text( - 'Ajajj... 🥴', - style: TextStyle( + Text( + 'oops'.i18n, + style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 22.0, color: Colors.white, @@ -314,10 +314,10 @@ class _GradesBodyState extends State { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - const Text( - 'Év végi átlagod', + Text( + 'endyear_avg'.i18n, textAlign: TextAlign.center, - style: TextStyle( + style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 22.0, color: Colors.white, diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart index f9eb4593..7e3d872b 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart @@ -8,6 +8,7 @@ import 'package:filcnaplo_kreta_api/models/subject.dart'; import 'package:filcnaplo_kreta_api/models/week.dart'; import 'package:filcnaplo_kreta_api/providers/absence_provider.dart'; import 'package:filcnaplo_kreta_api/providers/timetable_provider.dart'; +import 'package:filcnaplo_mobile_ui/screens/summary/summary_screen.i18n.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -138,7 +139,7 @@ class _LessonsBodyState extends State { ), ), Text( - '${absences.last.absences.length} hiányzás', + 'absence'.i18n.fill([absences.last.absences.length]), style: const TextStyle( fontSize: 18.0, color: Colors.white, @@ -174,7 +175,7 @@ class _LessonsBodyState extends State { ), ), Text( - '${absences.first.absences.length} hiányzás', + 'absence'.i18n.fill([absences.first.absences.length]), style: const TextStyle( fontSize: 18.0, color: Colors.white, @@ -210,7 +211,7 @@ class _LessonsBodyState extends State { ), ), Text( - 'Összesen ${delays.first.delay} perc késés', + 'delay'.i18n.fill([delays.first.delay]), style: const TextStyle( fontSize: 18.0, color: Colors.white, @@ -235,9 +236,9 @@ class _LessonsBodyState extends State { children: [ lessons[0], const SizedBox(height: 18.0), - const Text( - 'Nem volt kedved hozzá...', - style: TextStyle( + Text( + 'dontfelt'.i18n, + style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 22.0, color: Colors.white, @@ -246,9 +247,9 @@ class _LessonsBodyState extends State { const SizedBox(height: 18.0), lessons[1], const SizedBox(height: 18.0), - const Text( - 'Késtél!', - style: TextStyle( + Text( + 'youlate'.i18n, + style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 22.0, color: Colors.white, diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart index 14eb19db..e67f4b8b 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:filcnaplo/api/providers/user_provider.dart'; import 'package:filcnaplo_mobile_ui/common/personality_card/empty_card.dart'; import 'package:filcnaplo_mobile_ui/common/personality_card/personality_card.dart'; +import 'package:filcnaplo_mobile_ui/screens/summary/summary_screen.i18n.dart'; import 'package:flutter/material.dart'; import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:provider/provider.dart'; @@ -73,7 +74,7 @@ class _PersonalityBodyState extends State { onTap: () => setState(() { isRevealed = true; }), - child: const EmptyCard(text: 'Kattints a felfedéshez...'), + child: EmptyCard(text: 'click_reveal'.i18n), ), crossFadeState: isRevealed ? CrossFadeState.showFirst diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/start_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/start_page.dart index d91ccc73..20ff340b 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/start_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/start_page.dart @@ -2,6 +2,7 @@ import 'package:filcnaplo/api/providers/user_provider.dart'; import 'package:filcnaplo/models/settings.dart'; import 'package:filcnaplo_kreta_api/providers/grade_provider.dart'; import 'package:filcnaplo_mobile_ui/screens/summary/summary_screen.dart'; +import 'package:filcnaplo_mobile_ui/screens/summary/summary_screen.i18n.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_feather_icons/flutter_feather_icons.dart'; @@ -78,7 +79,7 @@ class _StartBodyState extends State { weight: 0.001, ), Text( - 'Kezdés', + 'start'.i18n, textAlign: TextAlign.center, style: TextStyle( fontWeight: FontWeight.w500, diff --git a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart index 6f7a82f1..76ca49d3 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:provider/provider.dart'; import 'package:wtf_sliding_sheet/wtf_sliding_sheet.dart'; +import 'summary_screen.i18n.dart'; import 'pages/allsum_page.dart'; import 'pages/start_page.dart'; @@ -103,7 +104,7 @@ class _SummaryScreenState extends State crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'Jó éved volt, $firstName!', + 'greeting'.i18n.fill([firstName]), textAlign: TextAlign.left, maxLines: 2, overflow: TextOverflow.fade, @@ -115,13 +116,13 @@ class _SummaryScreenState extends State ), Text( widget.currentPage == 'start' - ? 'Összegezzünk hát...' + ? 'title_start'.i18n : widget.currentPage == 'grades' - ? 'Nézzük a jegyeidet... 📖' + ? 'title_grades'.i18n : widget.currentPage == 'lessons' - ? 'A kedvenced órád 💓' + ? 'title_lessons'.i18n : widget.currentPage == 'personality' - ? 'A te személyiséged...' + ? 'title_personality'.i18n : '', overflow: TextOverflow.fade, style: const TextStyle( diff --git a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.i18n.dart b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.i18n.dart index fc7ebcd1..9256680c 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.i18n.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.i18n.dart @@ -4,13 +4,106 @@ extension SettingsLocalization on String { static final _t = Translations.byLocale("hu_hu") + { "en_en": { + // main thingies "no_grades": "No grades found", + "greeting": "You had a good year, %s!", + "title_start": "So let's summarize...", + "title_grades": "Let's look at your marks... 📖", + "title_lessons": "Your favorite lesson 💓", + "title_personality": "Your personality is...", + // start page + "start": "Start", + // grades page + "tryagain": "He puts the master to the test! 🔃", + "oops": "Ouch... 🥴", + "endyear_avg": "Year-end average", + // lessons page + "absence": "%s absence(s)", + "delay": "A total of %s minute(s) late", + "dontfelt": "You didn't like it...", + "youlate": "You're late!", + // allsum page + "test": "test(s)", + "closingtest": "module test(s)", + "grade": "grades", + "hw": "homework", + "subject": "subjects", + "lesson": "lessons", + "absence_sum": "absence(s)", + "excused": "excused", + "unexcused": "unexcused", + "delay_sum": "delay(s)", + "min": "minute(s)", + // personality page + "click_reveal": "Click to reveal...", }, "hu_hu": { + // main thingies "no_grades": "Nincsenek jegyek", + "greeting": "Jó éved volt, %s!", + "title_start": "Összegezzünk hát...", + "title_grades": "Nézzük a jegyeidet... 📖", + "title_lessons": "A kedvenc órád 💓", + "title_personality": "A te személyiséged...", + // start page + "start": "Kezdés", + // grades page + "tryagain": "Próba teszi a mestert! 🔃", + "oops": "Ajjaj... 🥴", + "endyear_avg": "Év végi átlagod", + // lessons page + "absence": "%s hiányzás", + "delay": "Összesen %s perc késés", + "dontfelt": "Nem volt kedved hozzá...", + "youlate": "Késtél!", + // allsum page + "test": "dolgozat", + "closingtest": "témazáró", + "grade": "jegy", + "hw": "házi", + "subject": "tantárgy", + "lesson": "óra", + "absence_sum": "hiányzás", + "excused": "igazolt", + "unexcused": "igazolatlan", + "delay_sum": "késés", + "min": "perc", + // personality page + "click_reveal": "Kattints a felfedéshez...", }, "de_de": { - "no_grades": "No grades found", + // main thingies + "no_grades": "keine Grade gefunden", + "greeting": "Du hattest ein gutes Jahr, %s!", + "title_start": "Fassen wir also zusammen...", + "title_grades": "Schauen wir uns eure Tickets an... 📖", + "title_lessons": "Deine Lieblingsuhr 💓", + "title_personality": "Deine Persönlichkeit...", + // start page + "start": "Anfang", + // grades page + "tryagain": "Er stellt den Meister auf die Probe! 🔃", + "oops": "Autsch... 🥴", + "endyear_avg": "Ihr Jahresenddurchschnitt", + // lessons page + "absence": "%s Abwesenheit(en)", + "delay": "Insgesamt %s Minute(n) zu spät", + "dontfelt": "Es hat dir nicht gefallen...", + "youlate": "Du bist spät!", + // allsum page + "test": "These(n)", + "closingtest": "Modultest", + "grade": "Grad", + "hw": "Hausaufgaben", + "subject": "Themen", + "lesson": "Lektionen", + "absence_sum": "Abwesenheit(en)", + "excused": "bescheinigte", + "unexcused": "unentschuldigte", + "delay_sum": "Verzögerung(en)", + "min": "Minute(n)", + // personality page + "click_reveal": "Klicken Sie hier, um es anzuzeigen...", }, }; From f5bc16ba42ae4b4f7253486156b149ff84da0619 Mon Sep 17 00:00:00 2001 From: kima Date: Sat, 24 Jun 2023 23:58:06 +0200 Subject: [PATCH 39/99] created translation for personality card --- .../personality_card/personality_card.dart | 82 +++++----- .../personality_card.i18n.dart | 147 +++++++++++++++++- 2 files changed, 183 insertions(+), 46 deletions(-) diff --git a/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart index 31cd4b9b..888170c5 100644 --- a/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart +++ b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart @@ -14,6 +14,8 @@ import 'package:filcnaplo_kreta_api/providers/timetable_provider.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'personality_card.i18n.dart'; + class PersonalityCard extends StatefulWidget { const PersonalityCard({ Key? key, @@ -190,87 +192,79 @@ class _PersonalityCardState extends State { Map> personality = { PersonalityType.geek: { 'emoji': '🤓', - 'title': 'Stréber', - 'description': - 'Sokat tanulsz, de ezzel semmi baj! Ez egyben áldás és átok, de legalább az életben sikeres leszel.', - 'subtitle': 'Év végi átlagod', + 'title': 't_geek', + 'description': 'd_geek', + 'subtitle': 's_geek', 'subvalue': subjectAvg.toStringAsFixed(2), }, PersonalityType.sick: { 'emoji': '🤒', - 'title': 'Beteges', - 'description': - 'Jobbulást, tesó. Még akkor is, ha hazudtál arról, hogy beteg vagy, hogy ne kelljen suliba menned.', - 'subtitle': 'Hiányzásaid', + 'title': 't_sick', + 'description': 'd_sick', + 'subtitle': 's_sick', 'subvalue': absences.length.toString(), }, PersonalityType.late: { 'emoji': '⌛', - 'title': 'Késős', - 'description': - 'Kilukadt a villamos kereke. Kisiklott a repülő. A kutyád megette a cipőd. Elhisszük.', - 'subtitle': 'Késésed (perc)', + 'title': 't_late', + 'description': 'd_late', + 'subtitle': 's_late', 'subvalue': totalDelays.toString(), }, PersonalityType.quitter: { 'emoji': '❓', - 'title': 'Lógós', - 'description': 'Osztályzóvizsga incoming.', - 'subtitle': 'Igazolatlan hiányzások', + 'title': 't_quitter', + 'description': 'd_quitter', + 'subtitle': 's_quitter', 'subvalue': unexcusedAbsences.toString(), }, PersonalityType.healthy: { 'emoji': '😷', - 'title': 'Makk', - 'description': - '...egészséges vagy! Egész évben alig hiányoztál az iskolából.', - 'subtitle': 'Hiányzásaid', + 'title': 't_healthy', + 'description': 'd_healthy', + 'subtitle': 's_healthy', 'subvalue': absences.length.toString(), }, PersonalityType.acceptable: { 'emoji': '🤏', - 'title': 'Elmegy', - 'description': - 'A kettes érettségi is érettségi. Nem egy jó érettségi, de biztos, hogy egy érettségi.', - 'subtitle': 'Kettesek', + 'title': 't_acceptable', + 'description': 'd_acceptable', + 'subtitle': 's_acceptable', 'subvalue': mostCommonGrade.values.toList()[0].toString(), }, PersonalityType.fallible: { 'emoji': '📉', - 'title': 'Bukós', - 'description': 'Jövőre több sikerrel jársz.', - 'subtitle': 'Karók', + 'title': 't_fallible', + 'description': 'd_fallible', + 'subtitle': 's_fallible', 'subvalue': mostCommonGrade.values.toList()[0].toString(), }, PersonalityType.average: { 'emoji': '👌', - 'title': 'Közepes', - 'description': 'Se jó, se rossz. Az arany középút, if you will.', - 'subtitle': 'Hármasok', + 'title': 't_average', + 'description': 'd_average', + 'subtitle': 's_average', 'subvalue': mostCommonGrade.values.toList()[0].toString(), }, PersonalityType.diligent: { 'emoji': '💫', - 'title': 'Szorgalmas', - 'description': - 'Leírtad a jegyzetet, megcsináltad a prezentációt, és te vezetted a projektmunkát.', - 'subtitle': 'Órai munka ötösök', + 'title': 't_diligent', + 'description': 'd_diligent', + 'subtitle': 's_diligent', 'subvalue': classWorkGrades.length.toString(), }, PersonalityType.cheater: { 'emoji': '‍🧑‍💻', - 'title': 'Csaló', - 'description': - 'Bekapcsoltad a “Jó Tanuló” módot. Wow. Azt hitted, outsmartolhatsz, de outsmartingoltam az outsmartingolásod.', - 'subtitle': 'Bitches', + 'title': 't_cheater', + 'description': 'd_cheater', + 'subtitle': 's_cheater', 'subvalue': '0', }, PersonalityType.npc: { 'emoji': '⛰️', - 'title': 'NPC', - 'description': - 'Egy akkora nagy non-player character vagy, hogy neked semmilyen személyiség nem jutott ezen kívül.', - 'subtitle': 'In-game playtime (óra)', + 'title': 't_npc', + 'description': 'd_npc', + 'subtitle': 's_npc', 'subvalue': '69420', } }; @@ -291,7 +285,7 @@ class _PersonalityCardState extends State { ), ), Text( - personality[i]?['title'] ?? '???', + (personality[i]?['title'] ?? 'unknown').i18n, textAlign: TextAlign.center, style: const TextStyle( fontSize: 38.0, @@ -301,7 +295,7 @@ class _PersonalityCardState extends State { ), const SizedBox(height: 5), Text( - personality[i]?['description'] ?? 'Ismeretlen személyiség...', + (personality[i]?['description'] ?? 'unknown_personality').i18n, textAlign: TextAlign.start, style: TextStyle( fontSize: 16, @@ -311,7 +305,7 @@ class _PersonalityCardState extends State { ), const SizedBox(height: 25), Text( - personality[i]?['subtitle'] ?? '???', + (personality[i]?['subtitle'] ?? 'unknown').i18n, textAlign: TextAlign.center, style: const TextStyle( fontSize: 20.0, diff --git a/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.i18n.dart b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.i18n.dart index a2075862..9c2d2b1f 100644 --- a/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.i18n.dart +++ b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.i18n.dart @@ -1,8 +1,151 @@ import 'package:i18n_extension/i18n_extension.dart'; extension Localization on String { - static final _t = - Translations.byLocale("hu_hu") + {"en_en": {}, "hu_hu": {}, "de_de": {}}; + static final _t = Translations.byLocale("hu_hu") + + { + "en_en": { + // main + "unknown": "???", + "unknown_personality": "Unknown personality...", + // personalities + "t_geek": "Know-It-All", + "d_geek": + "You learn a lot, but don't worry - Being a know-it-all is a blessing in disguise. You'll be successful in life.", + "s_geek": "Year-end average", + "t_sick": "Sick", + "d_sick": + "Get well soon, bro. Even if you lied about being sick to skip school.", + "s_sick": "Absences", + "t_late": "Late", + "d_late": + "The tram's wheel got punctured. The airplane was derailed. Your dog ate your shoe. We believe you.", + "s_late": "Delays (minutes)", + "t_quitter": "Skipper", + "d_quitter": "Supplementary exam incoming.", + "s_quitter": "Igazolatlan hiányzások", + "t_healthy": "Healthy", + "d_healthy": + "As cool as a cucumber! You almost never missed a class.", + "s_healthy": "Absences", + "t_acceptable": "Acceptable", + "d_acceptable": + "Final exams are D. But who cares? It's still a grade. Not a good one, but it's definitely a grade.", + "s_acceptable": "D's", + "t_fallible": "Failed", + "d_fallible": "Good luck next year.", + "s_fallible": "F's", + "t_average": "It's okay", + "d_average": "Not good, not bad. The golden mean, if you will...", + "s_average": "C's", + "t_diligent": "Hard-worker", + "d_diligent": + "You noted everything, you made that presentation, and you lead the group project.", + "s_diligent": "Class work A's", + "t_cheater": "Cheater", + "d_cheater": + "You enabled the \"Good Student\" mode. Wow. You may have outsmarted me, but I have outsmarted your outsmarting.", + "s_cheater": "Bitches", + "t_npc": "NPC", + "d_npc": + "You're such a non-player character, we couldn't give you a personality.", + "s_npc": "In-game playtime (hours)", + }, + "hu_hu": { + // main + "unknown": "???", + "unknown_personality": "Ismeretlen személyiség...", + // personalities + "t_geek": "Stréber", + "d_geek": + "Sokat tanulsz, de ezzel semmi baj! Ez egyben áldás és átok, de legalább az életben sikeres leszel.", + "s_geek": "Év végi átlagod", + "t_sick": "Beteges", + "d_sick": + "Jobbulást, tesó. Még akkor is, ha hazudtál arról, hogy beteg vagy, hogy ne kelljen suliba menned.", + "s_sick": "Hiányzásaid", + "t_late": "Késős", + "d_late": + "Kilyukadt a villamos kereke. Kisiklott a repülő. A kutyád megette a cipőd. Elhisszük.", + "s_late": "Késések (perc)", + "t_quitter": "Lógós", + "d_quitter": "Osztályzóvizsga incoming.", + "s_quitter": "Igazolatlan hiányzások", + "t_healthy": "Makk", + "d_healthy": + "...egészséges vagy! Egész évben alig hiányoztál az iskolából.", + "s_healthy": "Hiányzásaid", + "t_acceptable": "Elmegy", + "d_acceptable": + "A kettes érettségi is érettségi. Nem egy jó érettségi, de biztos, hogy egy érettségi.", + "s_acceptable": "Kettesek", + "t_fallible": "Bukós", + "d_fallible": "Jövőre több sikerrel jársz.", + "s_fallible": "Karók", + "t_average": "Közepes", + "d_average": "Se jó, se rossz. Az arany középút, ha akarsz...", + "s_average": "Hármasok", + "t_diligent": "Szorgalmas", + "d_diligent": + "Leírtad a jegyzetet, megcsináltad a prezentációt, és te vezetted a projektmunkát.", + "s_diligent": "Órai munka ötösök", + "t_cheater": "Csaló", + "d_cheater": + "Bekapcsoltad a “Jó Tanuló” módot. Wow. Azt hitted, túl járhatsz az eszemen, de kijátszottam a kijátszásod.", + "s_cheater": "Bitches", + "t_npc": "NPC", + "d_npc": + "Egy akkora nagy non-player character vagy, hogy neked semmilyen személyiség nem jutott ezen kívül.", + "s_npc": "In-game playtime (óra)", + }, + "de_de": { + // main + "unknown": "???", + "unknown_personality": "Unbekannte Persönlichkeit...", + // personalities + "t_geek": "Besserwisser", + "d_geek": + "Du lernst eine Menge, aber sorge dich nicht - ein Besserwisser zu sein wird sich letzten Endes doch als Segen erweisen. Du wirst erfolgreich sein im Leben.", + "s_geek": "Durchschnittsschüler", + "t_sick": "Krank", + "d_sick": + "Werd schnell wieder gesund, Brudi. Selbst wenn du gelogen hast, nur um Schule zu schwänzen zu können.", + "s_sick": "Abwesenheiten", + "t_late": "Verspätet", + "d_late": + "Die Straßenbahn hat eine Reifenpanne. Das Flugzeug ist entgleist. Dein Hund hat deinen Schuh gefressen. Klar, wir glauben dir.", + "s_late": "Verspätung (Minuten)", + "t_quitter": "Schulschwänzer", + "d_quitter": "Ein zusätzlicher Test wird anstehen.", + "s_quitter": "Unentschuldigte Abwesenheiten", + "t_healthy": "Gesund", + "d_healthy": + "Du bist die Ruhe selbst! Du hast fast nie eine Unterrichtsstunde verpasst.", + "s_healthy": "Abwesenheiten", + "t_acceptable": "Akzeptabel", + "d_acceptable": + "Die Abschlussprüfungen waren gerade einmal eine 4. Aber wen juckt's? Es ist immer noch positiv. Nicht allzu gut, aber definitiv positiv.", + "s_acceptable": "4er", + "t_fallible": "Durchgefallen", + "d_fallible": "Viel Glück im nächsten Jahr.", + "s_fallible": "5er", + "t_average": "Es ist in Ordnung", + "d_average": + "Nicht gut, nicht schlecht. Der goldene Durchschnitt, wenn du so willst...", + "s_average": "3er", + "t_diligent": "Ein Fleißiger", + "d_diligent": + "Du hast bei allem mitgeschrieben, du hast den Vortrag gehalten, und du hast die Gruppenarbeit geleitet.", + "s_diligent": "1er Schüler", + "t_cheater": "Geschummelt", + "d_cheater": + "Du hast den „Guter Schüler“ Modus aktiviert. Wow. Du magst mich zwar vielleicht überlistet haben, aber ich habe deine Überlistung überlistet.", + "s_cheater": "Bitches", + "t_npc": "COM", + "d_npc": + "Du bist einfach so sehr wie ein Computer, dass wir dir nicht einmal eine Persönlichkeit geben konnten.", + "s_npc": "Spielzeit (Stunden)", + } + }; String get i18n => localize(this, _t); String fill(List params) => localizeFill(this, params); From 50bc03f4038bd2196dffdde603dce34d1c18284a Mon Sep 17 00:00:00 2001 From: kima Date: Sun, 25 Jun 2023 00:11:44 +0200 Subject: [PATCH 40/99] updated version string --- filcnaplo/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filcnaplo/pubspec.yaml b/filcnaplo/pubspec.yaml index 6c1db7b7..3e9cbc23 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://refilc.hu publish_to: "none" -version: 4.1.0+213 +version: 4.1.1+215 environment: sdk: ">=2.17.0 <3.0.0" From 51e2c63134d4f5534ccd21fead9e73ada465022d Mon Sep 17 00:00:00 2001 From: kima Date: Sun, 25 Jun 2023 14:36:18 +0200 Subject: [PATCH 41/99] fixed navigation and ui bugs in summary --- .../lib/pages/home/live_card/live_card.dart | 50 ++-- .../screens/summary/pages/grades_page.dart | 279 +++++++++--------- .../screens/summary/pages/lessons_page.dart | 52 ++-- .../summary/pages/personality_page.dart | 13 +- .../lib/screens/summary/pages/start_page.dart | 2 +- .../lib/screens/summary/summary_screen.dart | 216 +++++++------- 6 files changed, 315 insertions(+), 297 deletions(-) diff --git a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart index 01a14ce5..94840aa7 100755 --- a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart +++ b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart @@ -13,7 +13,6 @@ import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:i18n_extension/i18n_widget.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; -import 'package:wtf_sliding_sheet/wtf_sliding_sheet.dart'; import 'live_card.i18n.dart'; class LiveCard extends StatefulWidget { @@ -68,30 +67,31 @@ class _LiveCardState extends State { ), ), onTap: () { - showSlidingBottomSheet( - context, - useRootNavigator: true, - builder: (context) => SlidingSheetDialog( - color: Colors.black.withOpacity(0.99), - duration: const Duration(milliseconds: 400), - scrollSpec: const ScrollSpec.bouncingScroll(), - snapSpec: const SnapSpec( - snap: true, - snappings: [1.0], - initialSnap: 1.0, - positioning: SnapPositioning.relativeToAvailableSpace, - ), - minHeight: MediaQuery.of(context).size.height, - cornerRadius: 16, - cornerRadiusOnFullscreen: 0, - builder: (context, state) => const Material( - color: Colors.black, - child: SummaryScreen( - currentPage: 'start', - ), - ), - ), - ); + // showSlidingBottomSheet( + // context, + // useRootNavigator: true, + // builder: (context) => SlidingSheetDialog( + // color: Colors.black.withOpacity(0.99), + // duration: const Duration(milliseconds: 400), + // scrollSpec: const ScrollSpec.bouncingScroll(), + // snapSpec: const SnapSpec( + // snap: true, + // snappings: [1.0], + // initialSnap: 1.0, + // positioning: SnapPositioning.relativeToAvailableSpace, + // ), + // minHeight: MediaQuery.of(context).size.height, + // cornerRadius: 16, + // cornerRadiusOnFullscreen: 0, + // builder: (context, state) => const Material( + // color: Colors.black, + // child: SummaryScreen( + // currentPage: 'start', + // ), + // ), + // ), + // ); + SummaryScreen.show(context: context, currentPage: 'start'); }, ); break; diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart index 3153ab06..f37a8878 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart @@ -198,163 +198,164 @@ class _GradesBodyState extends State { getGrades(); - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: ((100 * subjectTiles5.length) / - (subjectTiles5[0].runtimeType == AnimatedContainer - ? 1.95 - : 1.2)) - .toDouble(), - child: ListView.builder( - padding: const EdgeInsets.only(left: 5), - physics: const BouncingScrollPhysics(), - itemCount: max(subjectTiles5.length, 1), - itemBuilder: (context, index) { - if (subjectTiles5.isNotEmpty) { - EdgeInsetsGeometry panelPadding = - const EdgeInsets.symmetric(horizontal: 24.0); + return Expanded( + child: ListView( + children: [ + SizedBox( + height: ((100 * subjectTiles5.length) / + (subjectTiles5[0].runtimeType == AnimatedContainer + ? 1.95 + : 1.2)) + .toDouble(), + child: ListView.builder( + padding: const EdgeInsets.only(left: 5), + physics: const BouncingScrollPhysics(), + itemCount: max(subjectTiles5.length, 1), + itemBuilder: (context, index) { + if (subjectTiles5.isNotEmpty) { + EdgeInsetsGeometry panelPadding = + const EdgeInsets.symmetric(horizontal: 24.0); - if (subjectTiles5[index].runtimeType == AnimatedContainer) { - return Padding( - padding: const EdgeInsets.only(top: 8), - child: subjectTiles5[index]); + if (subjectTiles5[index].runtimeType == AnimatedContainer) { + return Padding( + padding: const EdgeInsets.only(top: 8), + child: subjectTiles5[index]); + } else { + return Padding( + padding: panelPadding, child: subjectTiles5[index]); + } } else { - return Padding( - padding: panelPadding, child: subjectTiles5[index]); + return Container(); } - } else { - return Container(); - } - }, + }, + ), ), - ), - const SizedBox(height: 12.0), - Text( - 'tryagain'.i18n, - style: const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 22.0, - color: Colors.white, + const SizedBox(height: 12.0), + Text( + 'tryagain'.i18n, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 22.0, + color: Colors.white, + ), ), - ), - const SizedBox(height: 12.0), - SizedBox( - height: ((100 * subjectTiles3.length) / - (subjectTiles3[0].runtimeType == AnimatedContainer - ? 1.95 - : 1.2)) - .toDouble(), - child: ListView.builder( - padding: const EdgeInsets.only(left: 5), - physics: const BouncingScrollPhysics(), - itemCount: max(subjectTiles3.length, 1), - itemBuilder: (context, index) { - if (subjectTiles3.isNotEmpty) { - EdgeInsetsGeometry panelPadding = - const EdgeInsets.symmetric(horizontal: 24.0); + const SizedBox(height: 12.0), + SizedBox( + height: ((100 * subjectTiles3.length) / + (subjectTiles3[0].runtimeType == AnimatedContainer + ? 1.95 + : 1.2)) + .toDouble(), + child: ListView.builder( + padding: const EdgeInsets.only(left: 5), + physics: const BouncingScrollPhysics(), + itemCount: max(subjectTiles3.length, 1), + itemBuilder: (context, index) { + if (subjectTiles3.isNotEmpty) { + EdgeInsetsGeometry panelPadding = + const EdgeInsets.symmetric(horizontal: 24.0); - if (subjectTiles3[index].runtimeType == AnimatedContainer) { - return Padding( - padding: const EdgeInsets.only(top: 8), - child: subjectTiles3[index]); + if (subjectTiles3[index].runtimeType == AnimatedContainer) { + return Padding( + padding: const EdgeInsets.only(top: 8), + child: subjectTiles3[index]); + } else { + return Padding( + padding: panelPadding, child: subjectTiles3[index]); + } } else { - return Padding( - padding: panelPadding, child: subjectTiles3[index]); + return Container(); } - } else { - return Container(); - } - }, + }, + ), ), - ), - const SizedBox(height: 12.0), - Text( - 'oops'.i18n, - style: const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 22.0, - color: Colors.white, + const SizedBox(height: 12.0), + Text( + 'oops'.i18n, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 22.0, + color: Colors.white, + ), ), - ), - const SizedBox(height: 12.0), - SizedBox( - height: ((100 * subjectTiles1.length) / - (subjectTiles1[0].runtimeType == AnimatedContainer - ? 1.95 - : 1.2)) - .toDouble(), - child: ListView.builder( - padding: const EdgeInsets.only(left: 5), - physics: const BouncingScrollPhysics(), - itemCount: max(subjectTiles1.length, 1), - itemBuilder: (context, index) { - if (subjectTiles1.isNotEmpty) { - EdgeInsetsGeometry panelPadding = - const EdgeInsets.symmetric(horizontal: 24.0); + const SizedBox(height: 12.0), + SizedBox( + height: ((100 * subjectTiles1.length) / + (subjectTiles1[0].runtimeType == AnimatedContainer + ? 1.95 + : 1.2)) + .toDouble(), + child: ListView.builder( + padding: const EdgeInsets.only(left: 5), + physics: const BouncingScrollPhysics(), + itemCount: max(subjectTiles1.length, 1), + itemBuilder: (context, index) { + if (subjectTiles1.isNotEmpty) { + EdgeInsetsGeometry panelPadding = + const EdgeInsets.symmetric(horizontal: 24.0); - if (subjectTiles1[index].runtimeType == AnimatedContainer) { - return Padding( - padding: const EdgeInsets.only(top: 8), - child: subjectTiles1[index]); + if (subjectTiles1[index].runtimeType == AnimatedContainer) { + return Padding( + padding: const EdgeInsets.only(top: 8), + child: subjectTiles1[index]); + } else { + return Padding( + padding: panelPadding, child: subjectTiles1[index]); + } } else { - return Padding( - padding: panelPadding, child: subjectTiles1[index]); + return Container(); } - } else { - return Container(); - } - }, + }, + ), ), - ), - const SizedBox(height: 40.0), - Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'endyear_avg'.i18n, - textAlign: TextAlign.center, - style: const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 22.0, - color: Colors.white, - ), - ), - Container( - margin: const EdgeInsets.only(top: 10.0), - padding: - const EdgeInsets.symmetric(horizontal: 16.0, vertical: 4.0), - decoration: BoxDecoration( - color: gradeColor(context: context, value: endYearAvg) - .withOpacity(.2), - border: Border.all( - color: (gradeColor(context: context, value: endYearAvg)) - .withOpacity(0.0), - width: 2.0, - ), - borderRadius: BorderRadius.circular(45.0), - ), - child: AutoSizeText.rich( - TextSpan( - text: endYearAvgText, - ), - maxLines: 1, - minFontSize: 5, + const SizedBox(height: 30.0), + Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'endyear_avg'.i18n, textAlign: TextAlign.center, - style: TextStyle( - color: gradeColor(context: context, value: endYearAvg), - fontWeight: FontWeight.w800, - fontSize: 32.0, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 22.0, + color: Colors.white, ), ), - ), - ], + Container( + margin: const EdgeInsets.only(top: 10.0), + padding: const EdgeInsets.symmetric( + horizontal: 16.0, vertical: 4.0), + decoration: BoxDecoration( + color: gradeColor(context: context, value: endYearAvg) + .withOpacity(.2), + border: Border.all( + color: (gradeColor(context: context, value: endYearAvg)) + .withOpacity(0.0), + width: 2.0, + ), + borderRadius: BorderRadius.circular(45.0), + ), + child: AutoSizeText.rich( + TextSpan( + text: endYearAvgText, + ), + maxLines: 1, + minFontSize: 5, + textAlign: TextAlign.center, + style: TextStyle( + color: gradeColor(context: context, value: endYearAvg), + fontWeight: FontWeight.w800, + fontSize: 32.0, + ), + ), + ), + ], + ), ), - ), - ], + ], + ), ); } } diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart index 7e3d872b..602cb8c3 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart @@ -230,34 +230,34 @@ class _LessonsBodyState extends State { getAndSortDelays(); generateTiles(); - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - lessons[0], - const SizedBox(height: 18.0), - Text( - 'dontfelt'.i18n, - style: const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 22.0, - color: Colors.white, + return Expanded( + child: ListView( + children: [ + lessons[0], + const SizedBox(height: 18.0), + Text( + 'dontfelt'.i18n, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 22.0, + color: Colors.white, + ), ), - ), - const SizedBox(height: 18.0), - lessons[1], - const SizedBox(height: 18.0), - Text( - 'youlate'.i18n, - style: const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 22.0, - color: Colors.white, + const SizedBox(height: 18.0), + lessons[1], + const SizedBox(height: 18.0), + Text( + 'youlate'.i18n, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 22.0, + color: Colors.white, + ), ), - ), - const SizedBox(height: 18.0), - lessons[2], - ], + const SizedBox(height: 18.0), + lessons[2], + ], + ), ); } } diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart index e67f4b8b..7702c7a8 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/personality_page.dart @@ -58,11 +58,10 @@ class _PersonalityBodyState extends State { Widget build(BuildContext context) { user = Provider.of(context); - return Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceAround, + return Expanded( + child: ListView( children: [ - const SizedBox(height: 60), + const SizedBox(height: 30), AnimatedCrossFade( duration: const Duration(milliseconds: 1000), sizeCurve: Curves.easeInToLinear, @@ -80,7 +79,7 @@ class _PersonalityBodyState extends State { ? CrossFadeState.showFirst : CrossFadeState.showSecond, ), - const SizedBox(height: 40), + const SizedBox(height: 30), if (isRevealed) Center( child: Row( @@ -122,6 +121,8 @@ class _PersonalityBodyState extends State { ), ), const SizedBox(height: 60), - ]); + ], + ), + ); } } diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/start_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/start_page.dart index 20ff340b..90e807cf 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/start_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/start_page.dart @@ -3,7 +3,6 @@ import 'package:filcnaplo/models/settings.dart'; import 'package:filcnaplo_kreta_api/providers/grade_provider.dart'; import 'package:filcnaplo_mobile_ui/screens/summary/summary_screen.dart'; import 'package:filcnaplo_mobile_ui/screens/summary/summary_screen.i18n.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:provider/provider.dart'; @@ -61,6 +60,7 @@ class _StartBodyState extends State { color: Colors.black, child: SummaryScreen( currentPage: 'grades', + isBottomSheet: true, ), ), ), diff --git a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart index 76ca49d3..7798761b 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.dart @@ -1,6 +1,7 @@ import 'package:confetti/confetti.dart'; import 'package:filcnaplo/api/providers/user_provider.dart'; import 'package:filcnaplo/models/settings.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:provider/provider.dart'; @@ -15,12 +16,22 @@ import 'pages/personality_page.dart'; class SummaryScreen extends StatefulWidget { final String currentPage; + final bool isBottomSheet; - const SummaryScreen({Key? key, this.currentPage = 'personality'}) - : super(key: key); + const SummaryScreen({ + Key? key, + this.currentPage = 'personality', + this.isBottomSheet = false, + }) : super(key: key); @override _SummaryScreenState createState() => _SummaryScreenState(); + + static show( + {required BuildContext context, + String currentPage = 'personality'}) => + Navigator.of(context, rootNavigator: true).push(CupertinoPageRoute( + builder: (context) => SummaryScreen(currentPage: currentPage))); } class _SummaryScreenState extends State @@ -28,7 +39,6 @@ class _SummaryScreenState extends State late UserProvider user; late SettingsProvider settings; - late AnimationController _hideContainersController; ConfettiController? _confettiController; late String firstName; @@ -46,9 +56,6 @@ class _SummaryScreenState extends State @override void initState() { super.initState(); - - _hideContainersController = AnimationController( - vsync: this, duration: const Duration(milliseconds: 200)); } @override @@ -70,106 +77,113 @@ class _SummaryScreenState extends State firstName = "János"; } - return AnimatedBuilder( - animation: _hideContainersController, - builder: (context, child) => Opacity( - opacity: 1 - _hideContainersController.value, - child: Container( - decoration: BoxDecoration(gradient: _backgroundGradient), - child: Container( - decoration: BoxDecoration(gradient: _backgroundGradient), - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height, - child: SafeArea( - child: Padding( - padding: EdgeInsets.only( - left: 24.0, - right: 24.0, - top: MediaQuery.of(context).padding.top, - bottom: 52.0, - ), - child: Column( - crossAxisAlignment: widget.currentPage == 'start' - ? CrossAxisAlignment.center - : CrossAxisAlignment.start, - mainAxisAlignment: widget.currentPage == 'start' - ? MainAxisAlignment.spaceBetween - : MainAxisAlignment.start, + return widget.isBottomSheet + ? buildContainer() + : Scaffold( + body: buildContainer(), + ); + } + + Widget buildContainer() { + return Container( + decoration: BoxDecoration(gradient: _backgroundGradient), + child: Container( + decoration: BoxDecoration(gradient: _backgroundGradient), + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height, + child: SafeArea( + child: Padding( + padding: const EdgeInsets.only( + left: 24.0, + right: 24.0, + top: 15.0, + bottom: 40.0, + ), + child: Column( + crossAxisAlignment: widget.currentPage == 'start' + ? CrossAxisAlignment.center + : CrossAxisAlignment.start, + mainAxisAlignment: widget.currentPage == 'start' + ? MainAxisAlignment.spaceBetween + : MainAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'greeting'.i18n.fill([firstName]), - textAlign: TextAlign.left, - maxLines: 2, - overflow: TextOverflow.fade, - style: const TextStyle( - fontWeight: FontWeight.w900, - fontSize: 26.0, - color: Colors.white, - ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'greeting'.i18n.fill([firstName]), + textAlign: TextAlign.left, + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: true, + style: const TextStyle( + fontWeight: FontWeight.w900, + fontSize: 26.0, + color: Colors.white, ), - Text( - widget.currentPage == 'start' - ? 'title_start'.i18n - : widget.currentPage == 'grades' - ? 'title_grades'.i18n - : widget.currentPage == 'lessons' - ? 'title_lessons'.i18n - : widget.currentPage == 'personality' - ? 'title_personality'.i18n - : '', - overflow: TextOverflow.fade, - style: const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 22.0, - color: Colors.white, - ), + ), + Text( + widget.currentPage == 'start' + ? 'title_start'.i18n + : widget.currentPage == 'grades' + ? 'title_grades'.i18n + : widget.currentPage == 'lessons' + ? 'title_lessons'.i18n + : widget.currentPage == 'personality' + ? 'title_personality'.i18n + : '', + maxLines: 1, + overflow: TextOverflow.fade, + softWrap: false, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 22.0, + color: Colors.white, ), - ], - ), - widget.currentPage != 'start' - ? IconButton( - onPressed: () async { - Navigator.of(context).pop(); - if (widget.currentPage == 'grades') { - openNewPage(page: 'lessons'); - } else if (widget.currentPage == 'lessons') { - openNewPage(page: 'allsum'); - } else if (widget.currentPage == 'allsum') { - openNewPage(page: 'personality'); - } else { - Navigator.of(context).maybePop(); - } - }, - icon: Icon( - widget.currentPage == 'personality' - ? FeatherIcons.x - : FeatherIcons.arrowRight, - color: Colors.white, - ), - ) - : Container() - ], + ), + ], + ), ), - const SizedBox(height: 12.0), - widget.currentPage == 'start' - ? const StartBody() - : widget.currentPage == 'grades' - ? const GradesBody() - : widget.currentPage == 'lessons' - ? const LessonsBody() - : widget.currentPage == 'allsum' - ? const AllSumBody() - : const PersonalityBody(), + widget.currentPage != 'start' + ? IconButton( + onPressed: () async { + Navigator.of(context).pop(); + if (widget.currentPage == 'grades') { + openNewPage(page: 'lessons'); + } else if (widget.currentPage == 'lessons') { + openNewPage(page: 'allsum'); + } else if (widget.currentPage == 'allsum') { + openNewPage(page: 'personality'); + } else { + Navigator.of(context).maybePop(); + } + }, + icon: Icon( + widget.currentPage == 'personality' + ? FeatherIcons.x + : FeatherIcons.arrowRight, + color: Colors.white, + ), + ) + : Container() ], ), - ), + const SizedBox(height: 12.0), + widget.currentPage == 'start' + ? const StartBody() + : widget.currentPage == 'grades' + ? const GradesBody() + : widget.currentPage == 'lessons' + ? const LessonsBody() + : widget.currentPage == 'allsum' + ? const AllSumBody() + : const PersonalityBody(), + ], ), ), ), @@ -198,9 +212,11 @@ class _SummaryScreenState extends State color: Colors.black, child: SummaryScreen( currentPage: page, + isBottomSheet: true, ), ), ), ); + //SummaryScreen.show(context: context, currentPage: page); } } From 95ed503e535098d9e22ee90b7553ecab1bc66acb Mon Sep 17 00:00:00 2001 From: kima Date: Sun, 25 Jun 2023 14:47:06 +0200 Subject: [PATCH 42/99] fixed 0 min delay thingies --- .../screens/summary/pages/lessons_page.dart | 60 ++++++++++++++++++- .../screens/summary/summary_screen.i18n.dart | 5 +- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart index 602cb8c3..cd7c2482 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:filcnaplo/api/providers/user_provider.dart'; import 'package:filcnaplo/helpers/subject.dart'; import 'package:filcnaplo/models/settings.dart'; @@ -12,6 +14,19 @@ import 'package:filcnaplo_mobile_ui/screens/summary/summary_screen.i18n.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +List faces = [ + "(·.·)", + "(≥o≤)", + "(·_·)", + "(˚Δ˚)b", + "(^-^*)", + "(='X'=)", + "(>_<)", + "(;-;)", + "\\(^Д^)/", + "\\(o_o)/", +]; + class SubjectAbsence { Subject subject; List absences; @@ -148,6 +163,12 @@ class _LessonsBodyState extends State { ], ), ); + if (absences.last.absences.isNotEmpty) { + lessons.add(leastAbsent); + } else { + lessons.add(buildFaceWidget()); + } + Widget mostAbsent = Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -184,6 +205,12 @@ class _LessonsBodyState extends State { ], ), ); + if (absences.first.absences.isNotEmpty) { + lessons.add(mostAbsent); + } else { + lessons.add(buildFaceWidget()); + } + Widget mostDelays = Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -220,8 +247,11 @@ class _LessonsBodyState extends State { ], ), ); - - lessons.addAll([leastAbsent, mostAbsent, mostDelays]); + if (delays.first.delay != 0) { + lessons.add(mostDelays); + } else { + lessons.add(buildFaceWidget()); + } } @override @@ -260,4 +290,30 @@ class _LessonsBodyState extends State { ), ); } + + Widget buildFaceWidget() { + int index = Random(DateTime.now().minute).nextInt(faces.length); + return Center( + child: Text.rich( + TextSpan( + text: faces[index], + style: const TextStyle( + fontSize: 32.0, + fontWeight: FontWeight.w500, + color: Colors.white, + ), + children: [ + TextSpan( + text: "\n${'no_lesson'.i18n}", + style: TextStyle( + fontSize: 18.0, + height: 2.0, + color: Colors.white.withOpacity(0.5)), + ), + ], + ), + textAlign: TextAlign.center, + ), + ); + } } diff --git a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.i18n.dart b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.i18n.dart index 9256680c..20ae4eb5 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.i18n.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/summary_screen.i18n.dart @@ -6,6 +6,7 @@ extension SettingsLocalization on String { "en_en": { // main thingies "no_grades": "No grades found", + "no_lesson": "No lessons found", "greeting": "You had a good year, %s!", "title_start": "So let's summarize...", "title_grades": "Let's look at your marks... 📖", @@ -40,6 +41,7 @@ extension SettingsLocalization on String { "hu_hu": { // main thingies "no_grades": "Nincsenek jegyek", + "no_lesson": "Nincsenek tanórák", "greeting": "Jó éved volt, %s!", "title_start": "Összegezzünk hát...", "title_grades": "Nézzük a jegyeidet... 📖", @@ -73,7 +75,8 @@ extension SettingsLocalization on String { }, "de_de": { // main thingies - "no_grades": "keine Grade gefunden", + "no_grades": "Keine Grade gefunden", + "no_lesson": "Keine Lektionen gefunden", "greeting": "Du hattest ein gutes Jahr, %s!", "title_start": "Fassen wir also zusammen...", "title_grades": "Schauen wir uns eure Tickets an... 📖", From 2c5939fab40463b7f933d4272dd7f2ab3069e659 Mon Sep 17 00:00:00 2001 From: kima Date: Sun, 25 Jun 2023 14:50:54 +0200 Subject: [PATCH 43/99] fixed misaligned text on final sum page --- filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart index e20282d9..c7559871 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart @@ -151,6 +151,7 @@ class _AllSumBodyState extends State { children: [ Text( i.values.toList()[1].toString(), + textAlign: TextAlign.center, style: const TextStyle( fontWeight: FontWeight.w800, fontSize: 36.0, @@ -159,6 +160,7 @@ class _AllSumBodyState extends State { ), Text( i.values.toList()[0], + textAlign: TextAlign.center, style: const TextStyle( fontSize: 18.0, color: Colors.white, From 9d9f99a9550f1cd7937d2aa1172f776634cd12be Mon Sep 17 00:00:00 2001 From: kima Date: Sun, 25 Jun 2023 14:55:01 +0200 Subject: [PATCH 44/99] fixed long subject names in grades summary --- filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart index f37a8878..5b75cbbd 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart @@ -107,6 +107,7 @@ class _GradesBodyState extends State { Text( subject.renamedTo ?? subject.name.capital(), maxLines: 2, + overflow: TextOverflow.ellipsis, style: TextStyle( fontWeight: FontWeight.bold, fontSize: 20.0, From d2c762d29ae99bc8452a79fcfbed94fb96b613b5 Mon Sep 17 00:00:00 2001 From: kima Date: Mon, 26 Jun 2023 21:15:25 +0200 Subject: [PATCH 45/99] fixed error screen bug in summary maybe --- .../lib/screens/summary/pages/allsum_page.dart | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart index c7559871..e5132c26 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart @@ -118,10 +118,13 @@ class _AllSumBodyState extends State { void getDelays() { var allDelays = absenceProvider.absences.where((a) => a.delay > 0); - var totalDelayTime = (allDelays.map((a) { + var delayTimeList = (allDelays.map((a) { return a.delay; - }).toList()) - .reduce((a, b) => a + b); + }).toList()); + var totalDelayTime = 0; + if (delayTimeList.isNotEmpty) { + totalDelayTime = delayTimeList.reduce((a, b) => a + b); + } var unexcusedDelays = absenceProvider.absences .where((a) => a.state == Justification.unexcused && a.delay > 0); From cffd93bfe6d5eed1024a8d553cda870557e2d278 Mon Sep 17 00:00:00 2001 From: kima Date: Tue, 27 Jun 2023 18:22:00 +0200 Subject: [PATCH 46/99] fixed auto update and changed build number --- .../android/app/src/main/AndroidManifest.xml | 1 + filcnaplo/lib/helpers/update_helper.dart | 16 +++++++++++----- filcnaplo/pubspec.yaml | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/filcnaplo/android/app/src/main/AndroidManifest.xml b/filcnaplo/android/app/src/main/AndroidManifest.xml index 28776859..1a197721 100644 --- a/filcnaplo/android/app/src/main/AndroidManifest.xml +++ b/filcnaplo/android/app/src/main/AndroidManifest.xml @@ -62,6 +62,7 @@ + diff --git a/filcnaplo/lib/helpers/update_helper.dart b/filcnaplo/lib/helpers/update_helper.dart index 2199124c..5aec5767 100644 --- a/filcnaplo/lib/helpers/update_helper.dart +++ b/filcnaplo/lib/helpers/update_helper.dart @@ -6,6 +6,7 @@ import 'package:filcnaplo/api/client.dart'; import 'package:filcnaplo/helpers/storage_helper.dart'; import 'package:filcnaplo/models/release.dart'; import 'package:open_file/open_file.dart'; +import 'package:permission_handler/permission_handler.dart'; enum UpdateState { none, preparing, downloading, installing } @@ -32,12 +33,17 @@ extension UpdateHelper on Release { updateCallback(-1, UpdateState.installing); - var result = await OpenFile.open(apk.path); + var permStatus = + (await Permission.manageExternalStorage.request().isGranted && + await Permission.requestInstallPackages.request().isGranted); + if (permStatus) { + var result = await OpenFile.open(apk.path); - if (result.type != ResultType.done) { - // ignore: avoid_print - print("ERROR: installUpdate.openFile: ${result.message}"); - throw result.message; + if (result.type != ResultType.done) { + // ignore: avoid_print + print("ERROR: installUpdate.openFile: ${result.message}"); + throw result.message; + } } updateCallback(-1, UpdateState.none); diff --git a/filcnaplo/pubspec.yaml b/filcnaplo/pubspec.yaml index 3e9cbc23..183792a8 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://refilc.hu publish_to: "none" -version: 4.1.1+215 +version: 4.1.1+216 environment: sdk: ">=2.17.0 <3.0.0" From d79045e47f3a036265a628f41f078cfe2c90efdd Mon Sep 17 00:00:00 2001 From: kima Date: Tue, 27 Jun 2023 20:38:52 +0200 Subject: [PATCH 47/99] modified personality requirements --- .../lib/common/personality_card/personality_card.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart index 888170c5..a6dec8e8 100644 --- a/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart +++ b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart @@ -169,13 +169,13 @@ class _PersonalityCardState extends State { } else if (mostCommonGrade.keys.toList()[0] == 1 && mostCommonGrade.values.toList()[0] > 1) { finalPersonality = PersonalityType.fallible; - } else if (absences.length < 10) { + } else if (absences.length <= 12) { finalPersonality = PersonalityType.healthy; - } else if (unexcusedAbsences >= 10) { + } else if (unexcusedAbsences >= 8) { finalPersonality = PersonalityType.quitter; } else if (totalDelays > 50) { finalPersonality = PersonalityType.late; - } else if (absences.length >= 100) { + } else if (absences.length >= 120) { finalPersonality = PersonalityType.sick; } else if (mostCommonGrade.keys.toList()[0] == 2) { finalPersonality = PersonalityType.acceptable; From 5523a2a919dfc17a31e0ab575c2d9b79d5fc918b Mon Sep 17 00:00:00 2001 From: Kima Date: Mon, 31 Jul 2023 23:20:30 +0200 Subject: [PATCH 48/99] fixed lot of ui things --- filcnaplo/.metadata | 63 +- filcnaplo/pubspec.yaml | 1 + filcnaplo/test/widget_test.dart | 30 + filcnaplo/windows/.gitignore | 17 + filcnaplo/windows/runner/Runner.rc | 121 ++ filcnaplo/windows/runner/flutter_window.cpp | 66 + filcnaplo/windows/runner/flutter_window.h | 33 + filcnaplo/windows/runner/main.cpp | 43 + filcnaplo/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 25735 bytes filcnaplo/windows/runner/runner.exe.manifest | 20 + filcnaplo/windows/runner/utils.cpp | 65 + filcnaplo/windows/runner/utils.h | 19 + filcnaplo/windows/runner/win32_window.cpp | 288 ++++ filcnaplo/windows/runner/win32_window.h | 102 ++ .../lib/pages/home/home_page.dart | 45 +- .../lib/pages/timetable/timetable_page.dart | 115 +- .../lib/screens/navigation/sidebar.dart | 158 +- .../lib/screens/navigation/sidebar.i18n.dart | 42 + .../lib/screens/settings/settings_screen.dart | 1280 +++++++++-------- filcnaplo_desktop_ui/pubspec.yaml | 1 + .../absence_group/absence_group_tile.dart | 37 +- 22 files changed, 1812 insertions(+), 750 deletions(-) create mode 100644 filcnaplo/test/widget_test.dart create mode 100644 filcnaplo/windows/.gitignore create mode 100644 filcnaplo/windows/runner/Runner.rc create mode 100644 filcnaplo/windows/runner/flutter_window.cpp create mode 100644 filcnaplo/windows/runner/flutter_window.h create mode 100644 filcnaplo/windows/runner/main.cpp create mode 100644 filcnaplo/windows/runner/resource.h create mode 100644 filcnaplo/windows/runner/resources/app_icon.ico create mode 100644 filcnaplo/windows/runner/runner.exe.manifest create mode 100644 filcnaplo/windows/runner/utils.cpp create mode 100644 filcnaplo/windows/runner/utils.h create mode 100644 filcnaplo/windows/runner/win32_window.cpp create mode 100644 filcnaplo/windows/runner/win32_window.h create mode 100644 filcnaplo_desktop_ui/lib/screens/navigation/sidebar.i18n.dart diff --git a/filcnaplo/.metadata b/filcnaplo/.metadata index ebe4e247..6b7daaff 100644 --- a/filcnaplo/.metadata +++ b/filcnaplo/.metadata @@ -1,30 +1,33 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled. - -version: - revision: 3c0bee85b8e43b860877922bdc411a7333db4d32 - channel: beta - -project_type: app - -# Tracks metadata for the flutter migrate command -migration: - platforms: - - platform: root - create_revision: 3c0bee85b8e43b860877922bdc411a7333db4d32 - base_revision: 3c0bee85b8e43b860877922bdc411a7333db4d32 - - platform: macos - create_revision: 3c0bee85b8e43b860877922bdc411a7333db4d32 - base_revision: 3c0bee85b8e43b860877922bdc411a7333db4d32 - - # User provided section - - # List of Local paths (relative to this file) that should be - # ignored by the migrate tool. - # - # Files that are not part of the templates will be ignored by default. - unmanaged_files: - - 'lib/main.dart' - - 'ios/Runner.xcodeproj/project.pbxproj' +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled. + +version: + revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 + channel: stable + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 + base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 + - platform: linux + create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 + base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 + - platform: windows + create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 + base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/filcnaplo/pubspec.yaml b/filcnaplo/pubspec.yaml index 183792a8..5cd1e2d4 100644 --- a/filcnaplo/pubspec.yaml +++ b/filcnaplo/pubspec.yaml @@ -66,6 +66,7 @@ dependencies: flutter_local_notifications: ^14.1.0 package_info_plus: ^4.0.2 screenshot: ^2.1.0 + flutter_staggered_grid_view: ^0.7.0 dev_dependencies: flutter_lints: ^2.0.1 diff --git a/filcnaplo/test/widget_test.dart b/filcnaplo/test/widget_test.dart new file mode 100644 index 00000000..a4b75df2 --- /dev/null +++ b/filcnaplo/test/widget_test.dart @@ -0,0 +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. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.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()); + + // 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(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/filcnaplo/windows/.gitignore b/filcnaplo/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/filcnaplo/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/filcnaplo/windows/runner/Runner.rc b/filcnaplo/windows/runner/Runner.rc new file mode 100644 index 00000000..51b3032b --- /dev/null +++ b/filcnaplo/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "hu.refilc" "\0" + VALUE "FileDescription", "filcnaplo" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "filcnaplo" "\0" + VALUE "LegalCopyright", "Copyright (C) 2023 hu.refilc. All rights reserved." "\0" + VALUE "OriginalFilename", "filcnaplo.exe" "\0" + VALUE "ProductName", "filcnaplo" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/filcnaplo/windows/runner/flutter_window.cpp b/filcnaplo/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b25e363e --- /dev/null +++ b/filcnaplo/windows/runner/flutter_window.cpp @@ -0,0 +1,66 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/filcnaplo/windows/runner/flutter_window.h b/filcnaplo/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/filcnaplo/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/filcnaplo/windows/runner/main.cpp b/filcnaplo/windows/runner/main.cpp new file mode 100644 index 00000000..28478389 --- /dev/null +++ b/filcnaplo/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(800, 720); + if (!window.Create(L"reFilc", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/filcnaplo/windows/runner/resource.h b/filcnaplo/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/filcnaplo/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/filcnaplo/windows/runner/resources/app_icon.ico b/filcnaplo/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..49c0c16b1a866dacc4af8c0864b25b0a60ad6998 GIT binary patch literal 25735 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ⅈ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 x?DJXZc?sw92hFm_{PH%wop|w$-Sut% + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/filcnaplo/windows/runner/utils.cpp b/filcnaplo/windows/runner/utils.cpp new file mode 100644 index 00000000..b2b08734 --- /dev/null +++ b/filcnaplo/windows/runner/utils.cpp @@ -0,0 +1,65 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length <= 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/filcnaplo/windows/runner/utils.h b/filcnaplo/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/filcnaplo/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/filcnaplo/windows/runner/win32_window.cpp b/filcnaplo/windows/runner/win32_window.cpp new file mode 100644 index 00000000..60608d0f --- /dev/null +++ b/filcnaplo/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/filcnaplo/windows/runner/win32_window.h b/filcnaplo/windows/runner/win32_window.h new file mode 100644 index 00000000..e901dde6 --- /dev/null +++ b/filcnaplo/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/filcnaplo_desktop_ui/lib/pages/home/home_page.dart b/filcnaplo_desktop_ui/lib/pages/home/home_page.dart index d0cc653f..edfc4333 100644 --- a/filcnaplo_desktop_ui/lib/pages/home/home_page.dart +++ b/filcnaplo_desktop_ui/lib/pages/home/home_page.dart @@ -1,7 +1,7 @@ import 'package:filcnaplo/api/providers/user_provider.dart'; import 'package:filcnaplo/models/settings.dart'; import 'package:filcnaplo/ui/date_widget.dart'; -import 'package:filcnaplo_desktop_ui/common/filter_bar.dart'; +import 'package:filcnaplo_mobile_ui/common/filter_bar.dart'; import 'package:flutter/material.dart'; import 'package:animated_list_plus/animated_list_plus.dart'; import 'package:provider/provider.dart'; @@ -16,7 +16,8 @@ class HomePage extends StatefulWidget { State createState() => _HomePageState(); } -class _HomePageState extends State with SingleTickerProviderStateMixin { +class _HomePageState extends State + with SingleTickerProviderStateMixin { late UserProvider user; late SettingsProvider settings; @@ -41,11 +42,15 @@ class _HomePageState extends State with SingleTickerProviderStateMixin user = Provider.of(context, listen: false); DateTime now = DateTime.now(); - if (now.isBefore(DateTime(now.year, DateTime.august, 31)) && now.isAfter(DateTime(now.year, DateTime.june, 14))) { + if (now.isBefore(DateTime(now.year, DateTime.august, 31)) && + now.isAfter(DateTime(now.year, DateTime.june, 14))) { greeting = "goodrest"; - } else if (now.month == user.student?.birth.month && now.day == user.student?.birth.day) { + } else if (now.month == user.student?.birth.month && + now.day == user.student?.birth.day) { greeting = "happybirthday"; - } else if (now.month == DateTime.december && now.day >= 24 && now.day <= 26) { + } else if (now.month == DateTime.december && + now.day >= 24 && + now.day <= 26) { greeting = "merryxmas"; } else if (now.month == DateTime.january && now.day == 1) { greeting = "happynewyear"; @@ -81,7 +86,8 @@ class _HomePageState extends State with SingleTickerProviderStateMixin children: [ // Greeting Padding( - padding: const EdgeInsets.only(left: 32.0, top: 24.0, bottom: 12.0), + padding: const EdgeInsets.only( + left: 32.0, top: 24.0, bottom: 12.0), child: Text( greeting.i18n.fill([firstName]), overflow: TextOverflow.fade, @@ -107,8 +113,10 @@ class _HomePageState extends State with SingleTickerProviderStateMixin int selectedPage = _pageController.page!.round(); if (i == selectedPage) return; - if (_pageController.page?.roundToDouble() != _pageController.page) { - _pageController.animateToPage(i, curve: Curves.easeIn, duration: kTabScrollDuration); + if (_pageController.page?.roundToDouble() != + _pageController.page) { + _pageController.animateToPage(i, + curve: Curves.easeIn, duration: kTabScrollDuration); return; } @@ -132,27 +140,34 @@ class _HomePageState extends State with SingleTickerProviderStateMixin (BuildContext context, int index) { return FutureBuilder>( key: ValueKey(listOrder[index]), - future: getFilterWidgets(homeFilters[index], context: context), - builder: (context, dateWidgets) => dateWidgets.data != null + future: getFilterWidgets(homeFilters[index], + context: context), + builder: (context, dateWidgets) => dateWidgets.data != + null ? ImplicitlyAnimatedList( - items: sortDateWidgets(context, dateWidgets: dateWidgets.data!), + items: sortDateWidgets(context, + dateWidgets: dateWidgets.data!), itemBuilder: filterItemBuilder, spawnIsolate: false, areItemsTheSame: (a, b) => a.key == b.key, - physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()), - padding: const EdgeInsets.symmetric(horizontal: 24.0), + physics: const BouncingScrollPhysics( + parent: AlwaysScrollableScrollPhysics()), + padding: const EdgeInsets.symmetric( + horizontal: 24.0), ) : Container(), ); }, childCount: 4, findChildIndexCallback: (Key key) { - final ValueKey valueKey = key as ValueKey; + final ValueKey valueKey = + key as ValueKey; final String data = valueKey.value; return listOrder.indexOf(data); }, ), - physics: const PageScrollPhysics().applyTo(const BouncingScrollPhysics()), + physics: const PageScrollPhysics() + .applyTo(const BouncingScrollPhysics()), ), ), ], diff --git a/filcnaplo_desktop_ui/lib/pages/timetable/timetable_page.dart b/filcnaplo_desktop_ui/lib/pages/timetable/timetable_page.dart index b673689f..8d6e5fb6 100644 --- a/filcnaplo_desktop_ui/lib/pages/timetable/timetable_page.dart +++ b/filcnaplo_desktop_ui/lib/pages/timetable/timetable_page.dart @@ -23,12 +23,14 @@ import 'timetable_page.i18n.dart'; // todo: "fix" overflow (priority: -1) class TimetablePage extends StatefulWidget { - const TimetablePage({Key? key, this.initialDay, this.initialWeek}) : super(key: key); + const TimetablePage({Key? key, this.initialDay, this.initialWeek}) + : super(key: key); final DateTime? initialDay; final Week? initialWeek; - static void jump(BuildContext context, {Week? week, DateTime? day, Lesson? lesson}) { + static void jump(BuildContext context, + {Week? week, DateTime? day, Lesson? lesson}) { // Go to timetable page with arguments // NavigationScreen.of(context)?.customRoute(navigationPageRoute((context) => TimetablePage( // initialDay: lesson?.date ?? day, @@ -49,7 +51,8 @@ class TimetablePage extends StatefulWidget { _TimetablePageState createState() => _TimetablePageState(); } -class _TimetablePageState extends State with TickerProviderStateMixin { +class _TimetablePageState extends State + with TickerProviderStateMixin { late UserProvider user; late TimetableProvider timetableProvider; late UpdateProvider updateProvider; @@ -60,7 +63,9 @@ class _TimetablePageState extends State with TickerProviderStateM int _getDayIndex(DateTime date) { int index = 0; - if (_controller.days == null || (_controller.days?.isEmpty ?? true)) return index; + if (_controller.days == null || (_controller.days?.isEmpty ?? true)) { + return index; + } // find the first day with upcoming lessons index = _controller.days!.indexWhere((day) => day.last.end.isAfter(date)); @@ -94,11 +99,14 @@ class _TimetablePageState extends State with TickerProviderStateM _tabController = TabController( length: _controller.days!.length, vsync: this, - initialIndex: min(_tabController.index, max(_controller.days!.length - 1, 0)), + initialIndex: + min(_tabController.index, max(_controller.days!.length - 1, 0)), ); - if (initial || _controller.previousWeekId != _controller.currentWeekId) { - _tabController.animateTo(_getDayIndex(widget.initialDay ?? DateTime.now())); + if (initial || + _controller.previousWeekId != _controller.currentWeekId) { + _tabController + .animateTo(_getDayIndex(widget.initialDay ?? DateTime.now())); } initial = false; @@ -111,7 +119,8 @@ class _TimetablePageState extends State with TickerProviderStateM if (widget.initialWeek != null) { _controller.jump(widget.initialWeek!, context: context, initial: true); } else { - _controller.jump(_controller.currentWeek, context: context, initial: true, skip: true); + _controller.jump(_controller.currentWeek, + context: context, initial: true, skip: true); } } // Listen for user changes @@ -131,7 +140,8 @@ class _TimetablePageState extends State with TickerProviderStateM // Sometimes when changing weeks really fast, // controller.days might be null or won't include index try { - return DateFormat("EEEE", I18n.of(context).locale.languageCode).format(_controller.days![index].first.date); + return DateFormat("EEEE", I18n.of(context).locale.languageCode) + .format(_controller.days![index].first.date); } catch (e) { return "timetable".i18n; } @@ -181,9 +191,14 @@ class _TimetablePageState extends State with TickerProviderStateM children: [ // Day Title Padding( - padding: const EdgeInsets.only(left: 24.0, right: 28.0, top: 18.0, bottom: 8.0), + padding: const EdgeInsets.only( + left: 24.0, + right: 28.0, + top: 18.0, + bottom: 8.0), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ Text( dayTitle(tab).capital(), @@ -193,9 +208,13 @@ class _TimetablePageState extends State with TickerProviderStateM ), ), Text( - "${_controller.days![tab].first.date.day}".padLeft(2, '0') + ".", + "${_controller.days![tab].first.date.day}" + .padLeft(2, '0') + + ".", style: TextStyle( - color: AppColors.of(context).text.withOpacity(.5), + color: AppColors.of(context) + .text + .withOpacity(.5), fontWeight: FontWeight.w500, ), ), @@ -208,35 +227,59 @@ class _TimetablePageState extends State with TickerProviderStateM child: ListView.builder( padding: EdgeInsets.zero, physics: const BouncingScrollPhysics(), - itemCount: _controller.days![tab].length + 2, + itemCount: + _controller.days![tab].length + 2, itemBuilder: (context, index) { - if (_controller.days == null) return Container(); + if (_controller.days == null) { + return Container(); + } // Header if (index == 0) { return const Padding( - padding: EdgeInsets.only(top: 8.0, left: 24.0, right: 24.0), - child: PanelHeader(padding: EdgeInsets.only(top: 12.0)), + padding: EdgeInsets.only( + top: 8.0, + left: 24.0, + right: 24.0), + child: PanelHeader( + padding: EdgeInsets.only( + top: 12.0)), ); } // Footer - if (index == _controller.days![tab].length + 1) { + if (index == + _controller.days![tab].length + + 1) { return const Padding( - padding: EdgeInsets.only(bottom: 8.0, left: 24.0, right: 24.0), - child: PanelFooter(padding: EdgeInsets.only(top: 12.0)), + padding: EdgeInsets.only( + bottom: 8.0, + left: 24.0, + right: 24.0), + child: PanelFooter( + padding: EdgeInsets.only( + top: 12.0)), ); } // Body - final Lesson lesson = _controller.days![tab][index - 1]; - final bool swapDescDay = _controller.days![tab].map((l) => l.swapDesc ? 1 : 0).reduce((a, b) => a + b) >= - _controller.days![tab].length * .5; + final Lesson lesson = + _controller.days![tab][index - 1]; + final bool swapDescDay = _controller + .days![tab] + .map( + (l) => l.swapDesc ? 1 : 0) + .reduce((a, b) => a + b) >= + _controller.days![tab].length * + .5; return Padding( - padding: const EdgeInsets.symmetric(horizontal: 24.0), + padding: const EdgeInsets.symmetric( + horizontal: 24.0), child: PanelBody( - padding: const EdgeInsets.symmetric(horizontal: 10.0), + padding: + const EdgeInsets.symmetric( + horizontal: 10.0), child: LessonViewable( lesson, swapDesc: swapDescDay, @@ -264,7 +307,8 @@ class _TimetablePageState extends State with TickerProviderStateM ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0), + padding: + const EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -285,7 +329,10 @@ class _TimetablePageState extends State with TickerProviderStateM onTap: () => setState(() { _controller.current(); if (mounted) { - _controller.jump(_controller.currentWeek, context: context, loader: _controller.currentWeekId != _controller.previousWeekId); + _controller.jump(_controller.currentWeek, + context: context, + loader: _controller.currentWeekId != + _controller.previousWeekId); } }), child: Padding( @@ -295,12 +342,22 @@ class _TimetablePageState extends State with TickerProviderStateM "week".i18n + " (" + // Week start - DateFormat((_controller.currentWeek.start.year != DateTime.now().year ? "yy. " : "") + "MMM d.", + DateFormat( + (_controller.currentWeek.start.year != + DateTime.now().year + ? "yy. " + : "") + + "MMM d.", I18n.of(context).locale.languageCode) .format(_controller.currentWeek.start) + " - " + // Week end - DateFormat((_controller.currentWeek.start.year != DateTime.now().year ? "yy. " : "") + "MMM d.", + DateFormat( + (_controller.currentWeek.start.year != + DateTime.now().year + ? "yy. " + : "") + + "MMM d.", I18n.of(context).locale.languageCode) .format(_controller.currentWeek.end) + ")", diff --git a/filcnaplo_desktop_ui/lib/screens/navigation/sidebar.dart b/filcnaplo_desktop_ui/lib/screens/navigation/sidebar.dart index 0815557a..1c0f5fa5 100644 --- a/filcnaplo_desktop_ui/lib/screens/navigation/sidebar.dart +++ b/filcnaplo_desktop_ui/lib/screens/navigation/sidebar.dart @@ -6,6 +6,7 @@ import 'package:filcnaplo/models/settings.dart'; import 'package:filcnaplo/utils/color.dart'; import 'package:filcnaplo_desktop_ui/common/panel_button.dart'; import 'package:filcnaplo_desktop_ui/common/profile_image.dart'; +import 'package:filcnaplo_desktop_ui/screens/navigation/sidebar.i18n.dart'; import 'package:filcnaplo_desktop_ui/screens/navigation/sidebar_action.dart'; import 'package:filcnaplo_desktop_ui/screens/settings/settings_screen.dart'; import 'package:filcnaplo_mobile_ui/screens/settings/accounts/account_tile.dart'; @@ -25,7 +26,12 @@ import 'package:provider/provider.dart'; import 'package:filcnaplo/theme/colors/colors.dart'; class Sidebar extends StatefulWidget { - const Sidebar({Key? key, required this.navigator, required this.onRouteChange, this.selected = "home"}) : super(key: key); + const Sidebar( + {Key? key, + required this.navigator, + required this.onRouteChange, + this.selected = "home"}) + : super(key: key); final NavigatorState navigator; final String selected; @@ -71,12 +77,12 @@ class _SidebarState extends State { if (!settings.presentationMode) { firstName = nameParts.length > 1 ? nameParts[1] : nameParts[0]; } else { - firstName = "Béla"; + firstName = "János"; } List pageWidgets = [ SidebarAction( - title: const Text("Home"), + title: Text("Home".i18n), icon: const Icon(FilcIcons.home), selected: widget.selected == "home", onTap: () { @@ -87,7 +93,7 @@ class _SidebarState extends State { }, ), SidebarAction( - title: const Text("Grades"), + title: Text("Grades".i18n), icon: const Icon(FeatherIcons.bookmark), selected: widget.selected == "grades", onTap: () { @@ -98,7 +104,7 @@ class _SidebarState extends State { }, ), SidebarAction( - title: const Text("Timetable"), + title: Text("Timetable".i18n), icon: const Icon(FeatherIcons.calendar), selected: widget.selected == "timetable", onTap: () { @@ -109,7 +115,7 @@ class _SidebarState extends State { }, ), SidebarAction( - title: const Text("Messages"), + title: Text("Messages".i18n), icon: const Icon(FeatherIcons.messageSquare), selected: widget.selected == "messages", onTap: () { @@ -120,7 +126,7 @@ class _SidebarState extends State { }, ), SidebarAction( - title: const Text("Absences"), + title: Text("Absences".i18n), icon: const Icon(FeatherIcons.clock), selected: widget.selected == "absences", onTap: () { @@ -134,12 +140,15 @@ class _SidebarState extends State { List bottomActions = [ SidebarAction( - title: const Text("Settings"), + title: Text("Settings".i18n), selected: true, icon: const Icon(FeatherIcons.settings), onTap: () { if (topNav != "settings") { - widget.navigator.push(CupertinoPageRoute(builder: (context) => const SettingsScreen())).then((value) => topNav = ""); + widget.navigator + .push(CupertinoPageRoute( + builder: (context) => const SettingsScreen())) + .then((value) => topNav = ""); topNav = "settings"; } }, @@ -159,7 +168,7 @@ class _SidebarState extends State { onPressed: () { Navigator.of(context).pushNamed("login_back"); }, - title: const Text("Add User"), + title: Text("adduser".i18n), leading: const Icon(FeatherIcons.userPlus), ), PanelButton( @@ -169,17 +178,20 @@ class _SidebarState extends State { // Delete User user.removeUser(userId); - await Provider.of(context, listen: false).store.removeUser(userId); + await Provider.of(context, listen: false) + .store + .removeUser(userId); // If no other Users left, go back to LoginScreen if (user.getUsers().isNotEmpty) { user.setUser(user.getUsers().first.id); restore().then((_) => user.setUser(user.getUsers().first.id)); } else { - Navigator.of(context).pushNamedAndRemoveUntil("login", (_) => false); + Navigator.of(context) + .pushNamedAndRemoveUntil("login", (_) => false); } }, - title: const Text("Log Out"), + title: Text("logout".i18n), leading: Icon(FeatherIcons.logOut, color: AppColors.of(context).red), ), ]; @@ -190,49 +202,77 @@ class _SidebarState extends State { child: Column( children: [ Padding( - padding: const EdgeInsets.only(left: 18.0, top: 18.0, bottom: 24.0, right: 8.0), - child: Row( - children: [ - Padding( - padding: const EdgeInsets.only(right: 12.0), - child: ProfileImage( - name: firstName, - radius: 18.0, - backgroundColor: - !settings.presentationMode ? ColorUtils.stringToColor(user.name ?? "?") : Theme.of(context).colorScheme.secondary, - ), - ), - Expanded( - child: Text( - firstName, - style: const TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.w600, + padding: const EdgeInsets.only( + left: 12.0, + top: 18.0, + bottom: 24.0, + right: 12.0, + ), + child: InkWell( + customBorder: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10)), + onTap: () { + setState(() { + expandAccount = !expandAccount; + }); + }, + child: Row( + children: [ + Padding( + padding: const EdgeInsets.only( + right: 12.0, + left: 5.0, + top: 5.0, + bottom: 5.0, + ), + child: ProfileImage( + name: firstName, + radius: 18.0, + backgroundColor: Theme.of(context) + .colorScheme + .primary, //!settings.presentationMode + // ? ColorUtils.stringToColor(user.name ?? "?") + // : Theme.of(context).colorScheme.secondary, ), ), - ), - PageTransitionSwitcher( - transitionBuilder: (child, primaryAnimation, secondaryAnimation) { - return FadeThroughTransition( - fillColor: Colors.transparent, - animation: primaryAnimation, - secondaryAnimation: secondaryAnimation, - child: child, - ); - }, - child: IconButton( - key: Key(expandAccount ? "accounts" : "pages"), - icon: Icon(expandAccount ? FeatherIcons.chevronDown : FeatherIcons.chevronRight), - padding: EdgeInsets.zero, - splashRadius: 20.0, - onPressed: () { - setState(() { - expandAccount = !expandAccount; - }); - }, + Expanded( + child: Text( + firstName, + style: const TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w600, + ), + ), ), - ), - ], + PageTransitionSwitcher( + transitionBuilder: + (child, primaryAnimation, secondaryAnimation) { + return FadeThroughTransition( + fillColor: Colors.transparent, + animation: primaryAnimation, + secondaryAnimation: secondaryAnimation, + child: child, + ); + }, + child: IconButton( + key: Key(expandAccount ? "accounts" : "pages"), + icon: Icon(expandAccount + ? FeatherIcons.chevronDown + : FeatherIcons.chevronRight), + padding: EdgeInsets.zero, + onPressed: () { + setState(() { + expandAccount = !expandAccount; + }); + }, + splashColor: const Color(0x00000000), + focusColor: const Color(0x00000000), + hoverColor: const Color(0x00000000), + highlightColor: const Color(0x00000000), + ), + ), + ], + ), ), ), @@ -282,15 +322,19 @@ class _SidebarState extends State { if (!settings.presentationMode) { _firstName = _nameParts.length > 1 ? _nameParts[1] : _nameParts[0]; } else { - _firstName = "Béla"; + _firstName = "János"; } accountTiles.add(AccountTile( - name: Text(!settings.presentationMode ? account.name : "Béla", style: const TextStyle(fontWeight: FontWeight.w500)), - username: Text(!settings.presentationMode ? account.username : "72469696969"), + name: Text(!settings.presentationMode ? account.name : "János", + style: const TextStyle(fontWeight: FontWeight.w500)), + username: + Text(!settings.presentationMode ? account.username : "72469696969"), profileImage: ProfileImage( name: _firstName, - backgroundColor: !settings.presentationMode ? ColorUtils.stringToColor(account.name) : Theme.of(context).colorScheme.secondary, + backgroundColor: !settings.presentationMode + ? ColorUtils.stringToColor(account.name) + : Theme.of(context).colorScheme.secondary, role: account.role, ), onTap: () { diff --git a/filcnaplo_desktop_ui/lib/screens/navigation/sidebar.i18n.dart b/filcnaplo_desktop_ui/lib/screens/navigation/sidebar.i18n.dart new file mode 100644 index 00000000..43cfb8ab --- /dev/null +++ b/filcnaplo_desktop_ui/lib/screens/navigation/sidebar.i18n.dart @@ -0,0 +1,42 @@ +import 'package:i18n_extension/i18n_extension.dart'; + +extension SettingsLocalization on String { + static final _t = Translations.byLocale("hu_hu") + + { + "en_en": { + "Home": "Home", + "Grades": "Grades", + "Timetable": "Timetable", + "Messages": "Messages", + "Absences": "Absences", + "Settings": "Settings", + "adduser": "Add User", + "logout": "Log Out", + }, + "hu_hu": { + "Home": "Kezdőlap", + "Grades": "Jegyek", + "Timetable": "Órarend", + "Messages": "Üzenetek", + "Absences": "Hiányzások", + "Settings": "Beállítások", + "adduser": "Fiók hozzáadása", + "logout": "Kilépés", + }, + "de_de": { + "Home": "Zuhause", + "Grades": "Noten", + "Timetable": "Zeitplan", + "Messages": "Mitteilungen", + "Absences": "Fehlen", + "Settings": "Einstellungen", + "adduser": "Benutzer hinzufügen", + "logout": "Abmelden", + }, + }; + + String get i18n => localize(this, _t); + String fill(List params) => localizeFill(this, params); + String plural(int value) => localizePlural(value, this, _t); + String version(Object modifier) => localizeVersion(modifier, this, _t); +} diff --git a/filcnaplo_desktop_ui/lib/screens/settings/settings_screen.dart b/filcnaplo_desktop_ui/lib/screens/settings/settings_screen.dart index 83504f66..aef41ff5 100644 --- a/filcnaplo_desktop_ui/lib/screens/settings/settings_screen.dart +++ b/filcnaplo_desktop_ui/lib/screens/settings/settings_screen.dart @@ -35,6 +35,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_custom_tabs/flutter_custom_tabs.dart' as tabs; import 'package:flutter_feather_icons/flutter_feather_icons.dart'; +import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; import 'settings_screen.i18n.dart'; @@ -86,11 +87,11 @@ class _SettingsScreenState extends State if (!settings.presentationMode) { _firstName = _nameParts.length > 1 ? _nameParts[1] : _nameParts[0]; } else { - _firstName = "Béla"; + _firstName = "János"; } accountTiles.add(AccountTile( - name: Text(!settings.presentationMode ? account.name : "Béla", + name: Text(!settings.presentationMode ? account.name : "János", style: const TextStyle(fontWeight: FontWeight.w500)), username: Text(!settings.presentationMode ? account.username : "72469696969"), @@ -164,7 +165,7 @@ class _SettingsScreenState extends State if (!settings.presentationMode) { firstName = nameParts.length > 1 ? nameParts[1] : nameParts[0]; } else { - firstName = "Béla"; + firstName = "János"; } String startPageTitle = @@ -206,307 +207,403 @@ class _SettingsScreenState extends State animation: _hideContainersController, builder: (context, child) => Opacity( opacity: 1 - _hideContainersController.value, - child: SingleChildScrollView( - child: Column( - children: [ - const SizedBox(height: 32.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + StaggeredGrid.extent( + // direction: Axis.horizontal, + // crossAxisCount: 3, + maxCrossAxisExtent: 600, + children: [ + const SizedBox(height: 32.0), - // Updates - if (updateProvider.available) - Padding( - padding: const EdgeInsets.symmetric( - vertical: 12.0, horizontal: 24.0), - child: Panel( - child: PanelButton( - onPressed: () => _openUpdates(context), - title: Text("update_available".i18n), - leading: const Icon(FeatherIcons.download), - trailing: Text( - updateProvider.releases.first.tag, - style: TextStyle( - fontWeight: FontWeight.w500, - color: - Theme.of(context).colorScheme.secondary, - ), - ), - ), - ), - ), - - // const Padding( - // padding: EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), - // child: PremiumBannerButton(), - // ), - if (!Provider.of(context).hasPremium) - const ClipRect( - child: Padding( - padding: EdgeInsets.symmetric(vertical: 12.0), - child: PremiumButton(), - ), - ), - - // General Settings - Padding( - padding: const EdgeInsets.symmetric( - vertical: 12.0, horizontal: 24.0), - child: Panel( - title: Text("general".i18n), - child: Column( - children: [ - PanelButton( - onPressed: () { - SettingsHelper.language(context); - setState(() {}); - }, - title: Text("language".i18n), - leading: const Icon(FeatherIcons.globe), - trailing: Text(languageText), - ), - PanelButton( - onPressed: () { - SettingsHelper.startPage(context); - setState(() {}); - }, - title: Text("startpage".i18n), - leading: const Icon(FeatherIcons.play), - trailing: Text(startPageTitle.capital()), - ), - PanelButton( - onPressed: () { - SettingsHelper.rounding(context); - setState(() {}); - }, - title: Text("rounding".i18n), - leading: const Icon(FeatherIcons.gitCommit), - trailing: Text((settings.rounding / 10) - .toStringAsFixed(1)), - ), - PanelButton( - onPressed: () { - SettingsHelper.vibrate(context); - setState(() {}); - }, - title: Text("vibrate".i18n), - leading: const Icon(FeatherIcons.radio), - trailing: Text(vibrateTitle), - ), - PanelButton( - padding: const EdgeInsets.only(left: 14.0), - onPressed: () { - SettingsHelper.bellDelay(context); - setState(() {}); - }, - title: Text( - "bell_delay".i18n, - style: TextStyle( - color: AppColors.of(context) - .text - .withOpacity( - settings.bellDelayEnabled - ? 1.0 - : .5)), - ), - leading: settings.bellDelayEnabled - ? const Icon(FeatherIcons.bell) - : Icon(FeatherIcons.bellOff, - color: AppColors.of(context) - .text - .withOpacity(.25)), - trailingDivider: true, - trailing: Switch( - onChanged: (v) => - settings.update(bellDelayEnabled: v), - value: settings.bellDelayEnabled, - activeColor: - Theme.of(context).colorScheme.secondary, - ), - ), - ], - ), - ), - ), - - if (kDebugMode) - Padding( - padding: const EdgeInsets.symmetric( - vertical: 12.0, horizontal: 24.0), - child: Panel( - title: const Text("Debug"), - child: Column( - children: [ - PanelButton( - title: const Text("Subject Icon Gallery"), - leading: const Icon(CupertinoIcons - .rectangle_3_offgrid_fill), - trailing: const Icon(Icons.arrow_forward), - onPressed: () { - Navigator.of(context, rootNavigator: true) - .push( - CupertinoPageRoute( - builder: (context) => - const SubjectIconGallery()), - ); - }, - ) - ], - ), - ), - ), - - // Secret Settings - if (__ss) - Padding( - padding: const EdgeInsets.symmetric( - vertical: 12.0, horizontal: 24.0), - child: Panel( - title: Text("secret".i18n), - child: Column( - children: [ - // Good student mode - Material( - type: MaterialType.transparency, - child: SwitchListTile( - contentPadding: - const EdgeInsets.only(left: 12.0), - shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(12.0)), - title: Text("goodstudent".i18n, - style: const TextStyle( - fontWeight: FontWeight.w500)), - onChanged: (v) { - if (v) { - showDialog( - context: context, - builder: (context) => WillPopScope( - onWillPop: () async => false, - child: AlertDialog( - shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular( - 12.0)), - title: Text("attention".i18n), - content: Text( - "goodstudent_disclaimer" - .i18n), - actions: [ - ActionButton( - label: "understand".i18n, - onTap: () { - Navigator.of(context) - .pop(); - settings.update( - goodStudent: v); - Provider.of( - context, - listen: false) - .fetch(); - }) - ], - ), - ), - ); - } else { - settings.update(goodStudent: v); - Provider.of(context, - listen: false) - .fetch(); - } - }, - value: settings.goodStudent, - activeColor: Theme.of(context) - .colorScheme - .secondary, - ), - ), - - // Presentation mode - Material( - type: MaterialType.transparency, - child: SwitchListTile( - contentPadding: - const EdgeInsets.only(left: 12.0), - shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(12.0)), - title: const Text("Presentation Mode", - style: TextStyle( - fontWeight: FontWeight.w500)), - onChanged: (v) => - settings.update(presentationMode: v), - value: settings.presentationMode, - activeColor: Theme.of(context) - .colorScheme - .secondary, - ), - ), - ], - ), - ), - ), - - // Theme Settings - Padding( - padding: const EdgeInsets.symmetric( - vertical: 12.0, horizontal: 24.0), - child: Panel( - title: Text("appearance".i18n), - child: Column( - children: [ - PanelButton( - onPressed: () { - SettingsHelper.theme(context); - setState(() {}); - }, - title: Text("theme".i18n), - leading: const Icon(FeatherIcons.sun), - trailing: Text(themeModeText), - ), - PanelButton( - onPressed: () async { - await _hideContainersController.forward(); - SettingsHelper.accentColor(context); - setState(() {}); - _hideContainersController.reset(); - }, - title: Text("color".i18n), - leading: const Icon(FeatherIcons.droplet), - trailing: Container( - width: 12.0, - height: 12.0, - decoration: BoxDecoration( - color: Theme.of(context) - .colorScheme - .secondary, - shape: BoxShape.circle, - ), - ), - ), - PanelButton( - onPressed: () { - SettingsHelper.gradeColors(context); - setState(() {}); - }, - title: Text("grade_colors".i18n), - leading: const Icon(FeatherIcons.star), - trailing: Row( - mainAxisSize: MainAxisSize.min, - children: List.generate( - 5, - (i) => Container( - margin: - const EdgeInsets.only(left: 2.0), - width: 12.0, - height: 12.0, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: settings.gradeColors[i], - ), + // Updates + if (updateProvider.available) + Container( + constraints: const BoxConstraints(maxWidth: 500), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 12.0, horizontal: 24.0), + child: Panel( + child: PanelButton( + onPressed: () => _openUpdates(context), + title: Text("update_available".i18n), + leading: const Icon(FeatherIcons.download), + trailing: Text( + updateProvider.releases.first.tag, + style: TextStyle( + fontWeight: FontWeight.w500, + color: Theme.of(context) + .colorScheme + .secondary, ), ), ), ), - Material( + ), + ), + + // const Padding( + // padding: EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), + // child: PremiumBannerButton(), + // ), + if (!Provider.of(context).hasPremium) + const ClipRect( + child: Padding( + padding: EdgeInsets.symmetric(vertical: 12.0), + child: PremiumButton(), + ), + ), + + // General Settings + Container( + constraints: const BoxConstraints(maxWidth: 500), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 12.0, horizontal: 24.0), + child: Panel( + title: Text("general".i18n), + child: Column( + children: [ + PanelButton( + onPressed: () { + SettingsHelper.language(context); + setState(() {}); + }, + title: Text("language".i18n), + leading: const Icon(FeatherIcons.globe), + trailing: Text(languageText), + ), + PanelButton( + onPressed: () { + SettingsHelper.startPage(context); + setState(() {}); + }, + title: Text("startpage".i18n), + leading: const Icon(FeatherIcons.play), + trailing: Text(startPageTitle.capital()), + ), + PanelButton( + onPressed: () { + SettingsHelper.rounding(context); + setState(() {}); + }, + title: Text("rounding".i18n), + leading: + const Icon(FeatherIcons.gitCommit), + trailing: Text((settings.rounding / 10) + .toStringAsFixed(1)), + ), + PanelButton( + onPressed: () { + SettingsHelper.vibrate(context); + setState(() {}); + }, + title: Text("vibrate".i18n), + leading: const Icon(FeatherIcons.radio), + trailing: Text(vibrateTitle), + ), + PanelButton( + padding: + const EdgeInsets.only(left: 14.0), + onPressed: () { + SettingsHelper.bellDelay(context); + setState(() {}); + }, + title: Text( + "bell_delay".i18n, + style: TextStyle( + color: AppColors.of(context) + .text + .withOpacity( + settings.bellDelayEnabled + ? 1.0 + : .5)), + ), + leading: settings.bellDelayEnabled + ? const Icon(FeatherIcons.bell) + : Icon(FeatherIcons.bellOff, + color: AppColors.of(context) + .text + .withOpacity(.25)), + trailingDivider: true, + trailing: Switch( + onChanged: (v) => settings.update( + bellDelayEnabled: v), + value: settings.bellDelayEnabled, + activeColor: Theme.of(context) + .colorScheme + .secondary, + ), + ), + ], + ), + ), + ), + ), + + if (kDebugMode) + Container( + constraints: const BoxConstraints(maxWidth: 500), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 12.0, horizontal: 24.0), + child: Panel( + title: const Text("Debug"), + child: Column( + children: [ + PanelButton( + title: + const Text("Subject Icon Gallery"), + leading: const Icon(CupertinoIcons + .rectangle_3_offgrid_fill), + trailing: + const Icon(Icons.arrow_forward), + onPressed: () { + Navigator.of(context, + rootNavigator: true) + .push( + CupertinoPageRoute( + builder: (context) => + const SubjectIconGallery()), + ); + }, + ) + ], + ), + ), + ), + ), + + // Secret Settings + if (__ss) + Container( + constraints: const BoxConstraints(maxWidth: 500), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 12.0, horizontal: 24.0), + child: Panel( + title: Text("secret".i18n), + child: Column( + children: [ + // Good student mode + Material( + type: MaterialType.transparency, + child: SwitchListTile( + contentPadding: + const EdgeInsets.only(left: 12.0), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(12.0)), + title: Text("goodstudent".i18n, + style: const TextStyle( + fontWeight: FontWeight.w500)), + onChanged: (v) { + if (v) { + showDialog( + context: context, + builder: (context) => + WillPopScope( + onWillPop: () async => false, + child: AlertDialog( + shape: + RoundedRectangleBorder( + borderRadius: + BorderRadius + .circular( + 12.0)), + title: + Text("attention".i18n), + content: Text( + "goodstudent_disclaimer" + .i18n), + actions: [ + ActionButton( + label: + "understand".i18n, + onTap: () { + Navigator.of( + context) + .pop(); + settings.update( + goodStudent: v); + Provider.of( + context, + listen: + false) + .fetch(); + }) + ], + ), + ), + ); + } else { + settings.update(goodStudent: v); + Provider.of( + context, + listen: false) + .fetch(); + } + }, + value: settings.goodStudent, + activeColor: Theme.of(context) + .colorScheme + .secondary, + ), + ), + + // Presentation mode + Material( + type: MaterialType.transparency, + child: SwitchListTile( + contentPadding: + const EdgeInsets.only(left: 12.0), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(12.0)), + title: const Text("Presentation Mode", + style: TextStyle( + fontWeight: FontWeight.w500)), + onChanged: (v) => settings.update( + presentationMode: v), + value: settings.presentationMode, + activeColor: Theme.of(context) + .colorScheme + .secondary, + ), + ), + ], + ), + ), + ), + ), + + // Theme Settings + Container( + constraints: const BoxConstraints(maxWidth: 500), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 12.0, horizontal: 24.0), + child: Panel( + title: Text("appearance".i18n), + child: Column( + children: [ + PanelButton( + onPressed: () { + SettingsHelper.theme(context); + setState(() {}); + }, + title: Text("theme".i18n), + leading: const Icon(FeatherIcons.sun), + trailing: Text(themeModeText), + ), + PanelButton( + onPressed: () async { + await _hideContainersController + .forward(); + SettingsHelper.accentColor(context); + setState(() {}); + _hideContainersController.reset(); + }, + title: Text("color".i18n), + leading: const Icon(FeatherIcons.droplet), + trailing: Container( + width: 12.0, + height: 12.0, + decoration: BoxDecoration( + color: Theme.of(context) + .colorScheme + .secondary, + shape: BoxShape.circle, + ), + ), + ), + PanelButton( + onPressed: () { + SettingsHelper.gradeColors(context); + setState(() {}); + }, + title: Text("grade_colors".i18n), + leading: const Icon(FeatherIcons.star), + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: List.generate( + 5, + (i) => Container( + margin: const EdgeInsets.only( + left: 2.0), + width: 12.0, + height: 12.0, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: settings.gradeColors[i], + ), + ), + ), + ), + ), + Material( + type: MaterialType.transparency, + child: SwitchListTile( + contentPadding: + const EdgeInsets.only(left: 12.0), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(12.0)), + title: Row( + children: [ + Icon( + FeatherIcons.barChart, + color: settings.graphClassAvg + ? Theme.of(context) + .colorScheme + .secondary + : AppColors.of(context) + .text + .withOpacity(.25), + ), + const SizedBox(width: 24.0), + Expanded( + child: Text( + "graph_class_avg".i18n, + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 16.0, + color: AppColors.of(context) + .text + .withOpacity( + settings.graphClassAvg + ? 1.0 + : .5), + ), + ), + ), + ], + ), + onChanged: (v) => + settings.update(graphClassAvg: v), + value: settings.graphClassAvg, + activeColor: Theme.of(context) + .colorScheme + .secondary, + ), + ), + const PremiumIconPackSelector(), + ], + ), + ), + ), + ), + + // Notifications + Container( + constraints: const BoxConstraints(maxWidth: 500), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 12.0, horizontal: 24.0), + child: Panel( + title: Text("notifications".i18n), + child: Material( type: MaterialType.transparency, child: SwitchListTile( contentPadding: @@ -517,8 +614,8 @@ class _SettingsScreenState extends State title: Row( children: [ Icon( - FeatherIcons.barChart, - color: settings.graphClassAvg + Icons.newspaper_outlined, + color: settings.newsEnabled ? Theme.of(context) .colorScheme .secondary @@ -529,14 +626,14 @@ class _SettingsScreenState extends State const SizedBox(width: 24.0), Expanded( child: Text( - "graph_class_avg".i18n, + "news".i18n, style: TextStyle( fontWeight: FontWeight.w600, fontSize: 16.0, color: AppColors.of(context) .text .withOpacity( - settings.graphClassAvg + settings.newsEnabled ? 1.0 : .5), ), @@ -545,252 +642,25 @@ class _SettingsScreenState extends State ], ), onChanged: (v) => - settings.update(graphClassAvg: v), - value: settings.graphClassAvg, - activeColor: - Theme.of(context).colorScheme.secondary, - ), - ), - const PremiumIconPackSelector(), - ], - ), - ), - ), - - // Notifications - Padding( - padding: const EdgeInsets.symmetric( - vertical: 12.0, horizontal: 24.0), - child: Panel( - title: Text("notifications".i18n), - child: Material( - type: MaterialType.transparency, - child: SwitchListTile( - contentPadding: - const EdgeInsets.only(left: 12.0), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0)), - title: Row( - children: [ - Icon( - Icons.newspaper_outlined, - color: settings.newsEnabled - ? Theme.of(context) - .colorScheme - .secondary - : AppColors.of(context) - .text - .withOpacity(.25), - ), - const SizedBox(width: 24.0), - Expanded( - child: Text( - "news".i18n, - style: TextStyle( - fontWeight: FontWeight.w600, - fontSize: 16.0, - color: AppColors.of(context) - .text - .withOpacity(settings.newsEnabled - ? 1.0 - : .5), - ), - ), - ), - ], - ), - onChanged: (v) => - settings.update(newsEnabled: v), - value: settings.newsEnabled, - activeColor: - Theme.of(context).colorScheme.secondary, - ), - ), - ), - ), - - // Extras - Padding( - padding: const EdgeInsets.symmetric( - vertical: 12.0, horizontal: 24.0), - child: Panel( - title: Text("extras".i18n), - child: Column(children: [ - Material( - type: MaterialType.transparency, - child: SwitchListTile( - contentPadding: - const EdgeInsets.only(left: 12.0), - shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(12.0)), - title: Row( - children: [ - Icon( - FeatherIcons.gift, - color: settings.gradeOpeningFun - ? Theme.of(context) - .colorScheme - .secondary - : AppColors.of(context) - .text - .withOpacity(.25), - ), - const SizedBox(width: 24.0), - Expanded( - child: Text( - "surprise_grades".i18n, - style: TextStyle( - fontWeight: FontWeight.w600, - fontSize: 16.0, - color: AppColors.of(context) - .text - .withOpacity( - settings.gradeOpeningFun - ? 1.0 - : .5), - ), - ), - ), - ], - ), - onChanged: (v) => - settings.update(gradeOpeningFun: v), - value: settings.gradeOpeningFun, - activeColor: - Theme.of(context).colorScheme.secondary, - ), - ), - ]), - ), - ), - - // About - Padding( - padding: const EdgeInsets.symmetric( - vertical: 12.0, horizontal: 24.0), - child: Panel( - title: Text("about".i18n), - child: Column(children: [ - PanelButton( - leading: const Icon(FeatherIcons.atSign), - title: const Text("Discord"), - onPressed: () => launchUrl( - Uri.parse("https://filcnaplo.hu/discord"), - mode: LaunchMode.externalApplication), - ), - PanelButton( - leading: const Icon(FeatherIcons.globe), - title: const Text("www.filcnaplo.hu"), - onPressed: () => launchUrl( - Uri.parse("https://filcnaplo.hu"), - mode: LaunchMode.externalApplication), - ), - PanelButton( - leading: const Icon(FeatherIcons.github), - title: const Text("Github"), - onPressed: () => launchUrl( - Uri.parse("https://github.com/filc"), - mode: LaunchMode.externalApplication), - ), - PanelButton( - leading: const Icon(FeatherIcons.mail), - title: Text("news".i18n), - onPressed: () => _openNews(context), - ), - PanelButton( - leading: const Icon(FeatherIcons.lock), - title: Text("privacy".i18n), - onPressed: () => _openPrivacy(context), - ), - PanelButton( - leading: const Icon(FeatherIcons.award), - title: Text("licenses".i18n), - onPressed: () => - showLicensePage(context: context), - ), - Tooltip( - message: "data_collected".i18n, - padding: const EdgeInsets.all(4.0), - textStyle: TextStyle( - fontWeight: FontWeight.w500, - color: AppColors.of(context).text), - decoration: BoxDecoration( - color: Theme.of(context) - .colorScheme - .background), - child: Material( - type: MaterialType.transparency, - child: SwitchListTile( - contentPadding: - const EdgeInsets.only(left: 12.0), - shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(12.0)), - secondary: Icon( - FeatherIcons.barChart2, - color: settings.xFilcId != "none" - ? Theme.of(context) - .colorScheme - .secondary - : AppColors.of(context) - .text - .withOpacity(.25), - ), - title: Text( - "Analytics".i18n, - style: TextStyle( - fontWeight: FontWeight.w600, - fontSize: 16.0, - color: AppColors.of(context) - .text - .withOpacity( - settings.xFilcId != "none" - ? 1.0 - : .5), - ), - ), - subtitle: Text( - "Anonymous Usage Analytics".i18n, - style: TextStyle( - color: AppColors.of(context) - .text - .withOpacity( - settings.xFilcId != "none" - ? .5 - : .2), - ), - ), - onChanged: (v) { - String newId; - if (v == false) { - newId = "none"; - } else if (settings.xFilcId == "none") { - newId = - SettingsProvider.defaultSettings() - .xFilcId; - } else { - newId = settings.xFilcId; - } - settings.update(xFilcId: newId); - }, - value: settings.xFilcId != "none", + settings.update(newsEnabled: v), + value: settings.newsEnabled, activeColor: Theme.of(context).colorScheme.secondary, ), ), ), - ]), + ), ), - ), - if (settings.developerMode) - Padding( - padding: const EdgeInsets.symmetric( - vertical: 12.0, horizontal: 24.0), - child: Panel( - title: const Text("Developer Settings"), - child: Column( - children: [ + + // Extras + Container( + constraints: const BoxConstraints(maxWidth: 500), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 12.0, horizontal: 24.0), + child: Panel( + title: Text("extras".i18n), + child: Column(children: [ Material( type: MaterialType.transparency, child: SwitchListTile( @@ -799,88 +669,280 @@ class _SettingsScreenState extends State shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12.0)), - title: const Text("Developer Mode", - style: TextStyle( - fontWeight: FontWeight.w500)), + title: Row( + children: [ + Icon( + FeatherIcons.gift, + color: settings.gradeOpeningFun + ? Theme.of(context) + .colorScheme + .secondary + : AppColors.of(context) + .text + .withOpacity(.25), + ), + const SizedBox(width: 24.0), + Expanded( + child: Text( + "surprise_grades".i18n, + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 16.0, + color: AppColors.of(context) + .text + .withOpacity( + settings.gradeOpeningFun + ? 1.0 + : .5), + ), + ), + ), + ], + ), onChanged: (v) => - settings.update(developerMode: false), - value: settings.developerMode, + settings.update(gradeOpeningFun: v), + value: settings.gradeOpeningFun, activeColor: Theme.of(context) .colorScheme .secondary, ), ), - PanelButton( - leading: const Icon(FeatherIcons.copy), - title: const Text("Copy JWT"), - onPressed: () => Clipboard.setData( - ClipboardData( - text: Provider.of( - context, - listen: false) - .accessToken!)), - ), - if (Provider.of(context, - listen: false) - .hasPremium) - PanelButton( - leading: const Icon(FeatherIcons.key), - title: const Text("Remove Premium"), - onPressed: () { - Provider.of(context, - listen: false) - .activate(removePremium: true); - settings.update( - accentColor: AccentColor.filc, - store: true); - Provider.of(context, - listen: false) - .changeTheme(settings.theme); - }, - ), - ], + ]), ), ), ), - SafeArea( - top: false, - child: Center( - child: GestureDetector( - child: const Panel( - title: Text("v" + - String.fromEnvironment("APPVER", - defaultValue: "?"))), - onTap: () { - if (devmodeCountdown > 0) { - ScaffoldMessenger.of(context) - .showSnackBar(SnackBar( - duration: const Duration(milliseconds: 200), - content: Text( - "You are $devmodeCountdown taps away from Developer Mode."), - )); - setState(() => devmodeCountdown--); - } else if (devmodeCountdown == 0) { - ScaffoldMessenger.of(context) - .showSnackBar(const SnackBar( - content: Text( - "Developer Mode successfully activated."), - )); - - settings.update(developerMode: true); - - setState(() => devmodeCountdown--); - } - }, + // About + Container( + constraints: const BoxConstraints(maxWidth: 500), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 12.0, horizontal: 24.0), + child: Panel( + title: Text("about".i18n), + child: Column(children: [ + PanelButton( + leading: const Icon(FeatherIcons.atSign), + title: const Text("Discord"), + onPressed: () => launchUrl( + Uri.parse( + "https://filcnaplo.hu/discord"), + mode: LaunchMode.externalApplication), + ), + PanelButton( + leading: const Icon(FeatherIcons.globe), + title: const Text("www.filcnaplo.hu"), + onPressed: () => launchUrl( + Uri.parse("https://filcnaplo.hu"), + mode: LaunchMode.externalApplication), + ), + PanelButton( + leading: const Icon(FeatherIcons.github), + title: const Text("Github"), + onPressed: () => launchUrl( + Uri.parse("https://github.com/filc"), + mode: LaunchMode.externalApplication), + ), + PanelButton( + leading: const Icon(FeatherIcons.mail), + title: Text("news".i18n), + onPressed: () => _openNews(context), + ), + PanelButton( + leading: const Icon(FeatherIcons.lock), + title: Text("privacy".i18n), + onPressed: () => _openPrivacy(context), + ), + PanelButton( + leading: const Icon(FeatherIcons.award), + title: Text("licenses".i18n), + onPressed: () => + showLicensePage(context: context), + ), + Tooltip( + message: "data_collected".i18n, + padding: const EdgeInsets.all(4.0), + textStyle: TextStyle( + fontWeight: FontWeight.w500, + color: AppColors.of(context).text), + decoration: BoxDecoration( + color: Theme.of(context) + .colorScheme + .background), + child: Material( + type: MaterialType.transparency, + child: SwitchListTile( + contentPadding: + const EdgeInsets.only(left: 12.0), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(12.0)), + secondary: Icon( + FeatherIcons.barChart2, + color: settings.xFilcId != "none" + ? Theme.of(context) + .colorScheme + .secondary + : AppColors.of(context) + .text + .withOpacity(.25), + ), + title: Text( + "Analytics".i18n, + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 16.0, + color: AppColors.of(context) + .text + .withOpacity( + settings.xFilcId != "none" + ? 1.0 + : .5), + ), + ), + subtitle: Text( + "Anonymous Usage Analytics".i18n, + style: TextStyle( + color: AppColors.of(context) + .text + .withOpacity( + settings.xFilcId != "none" + ? .5 + : .2), + ), + ), + onChanged: (v) { + String newId; + if (v == false) { + newId = "none"; + } else if (settings.xFilcId == + "none") { + newId = SettingsProvider + .defaultSettings() + .xFilcId; + } else { + newId = settings.xFilcId; + } + settings.update(xFilcId: newId); + }, + value: settings.xFilcId != "none", + activeColor: Theme.of(context) + .colorScheme + .secondary, + ), + ), + ), + ]), + ), ), ), + if (settings.developerMode) + Container( + constraints: const BoxConstraints(maxWidth: 500), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 12.0, horizontal: 24.0), + child: Panel( + title: const Text("Developer Settings"), + child: Column( + children: [ + Material( + type: MaterialType.transparency, + child: SwitchListTile( + contentPadding: + const EdgeInsets.only(left: 12.0), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(12.0)), + title: const Text("Developer Mode", + style: TextStyle( + fontWeight: FontWeight.w500)), + onChanged: (v) => settings.update( + developerMode: false), + value: settings.developerMode, + activeColor: Theme.of(context) + .colorScheme + .secondary, + ), + ), + PanelButton( + leading: const Icon(FeatherIcons.copy), + title: const Text("Copy JWT"), + onPressed: () => Clipboard.setData( + ClipboardData( + text: Provider.of( + context, + listen: false) + .accessToken!)), + ), + // if (Provider.of(context, + // listen: false) + // .hasPremium) + // PanelButton( + // leading: const Icon(FeatherIcons.key), + // title: const Text("Remove Premium"), + // onPressed: () { + // Provider.of( + // context, + // listen: false) + // .activate(removePremium: true); + // settings.update( + // accentColor: AccentColor.filc, + // store: true); + // Provider.of( + // context, + // listen: false) + // .changeTheme(settings.theme); + // }, + // ), + ], + ), + ), + ), + ), + ], + ), + const SizedBox( + height: 40, + ), + SafeArea( + top: false, + child: Center( + child: GestureDetector( + child: const Panel( + title: Text("v" + + String.fromEnvironment("APPVER", + defaultValue: "?"))), + onTap: () { + if (devmodeCountdown > 0) { + ScaffoldMessenger.of(context) + .showSnackBar(SnackBar( + duration: const Duration(milliseconds: 200), + content: Text( + "You are $devmodeCountdown taps away from Developer Mode."), + )); + + setState(() => devmodeCountdown--); + } else if (devmodeCountdown == 0) { + ScaffoldMessenger.of(context) + .showSnackBar(const SnackBar( + content: Text( + "Developer Mode successfully activated."), + )); + + settings.update(developerMode: true); + + setState(() => devmodeCountdown--); + } + }, + ), ), - ], - ), + ), + ], ), ), ), - ) + ), ], ), ), diff --git a/filcnaplo_desktop_ui/pubspec.yaml b/filcnaplo_desktop_ui/pubspec.yaml index 676f882a..2a1645a1 100644 --- a/filcnaplo_desktop_ui/pubspec.yaml +++ b/filcnaplo_desktop_ui/pubspec.yaml @@ -25,6 +25,7 @@ dependencies: auto_size_text: ^3.0.0 flutter_acrylic: ^1.1.3 elegant_notification: ^1.6.1 + flutter_staggered_grid_view: ^0.7.0 dev_dependencies: flutter_lints: ^1.0.0 diff --git a/filcnaplo_mobile_ui/lib/common/widgets/absence_group/absence_group_tile.dart b/filcnaplo_mobile_ui/lib/common/widgets/absence_group/absence_group_tile.dart index 9207f729..8ba39740 100755 --- a/filcnaplo_mobile_ui/lib/common/widgets/absence_group/absence_group_tile.dart +++ b/filcnaplo_mobile_ui/lib/common/widgets/absence_group/absence_group_tile.dart @@ -8,7 +8,9 @@ import 'package:flutter/material.dart'; import 'absence_group_tile.i18n.dart'; class AbsenceGroupTile extends StatelessWidget { - const AbsenceGroupTile(this.absences, {Key? key, this.showDate = false, this.padding}) : super(key: key); + const AbsenceGroupTile(this.absences, + {Key? key, this.showDate = false, this.padding}) + : super(key: key); final List absences; final bool showDate; @@ -16,10 +18,12 @@ class AbsenceGroupTile extends StatelessWidget { @override Widget build(BuildContext context) { - Justification state = getState(absences.map((e) => e.absence.state).toList()); + Justification state = + getState(absences.map((e) => e.absence.state).toList()); Color color = AbsenceTile.justificationColor(state, context: context); - absences.sort((a, b) => a.absence.lessonIndex?.compareTo(b.absence.lessonIndex ?? 0) ?? -1); + absences.sort((a, b) => + a.absence.lessonIndex?.compareTo(b.absence.lessonIndex ?? 0) ?? -1); return ClipRRect( borderRadius: BorderRadius.circular(14.0), @@ -29,6 +33,8 @@ class AbsenceGroupTile extends StatelessWidget { padding: padding ?? const EdgeInsets.symmetric(horizontal: 8.0), child: AbsenceGroupContainer( child: ExpansionTile( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10)), tilePadding: const EdgeInsets.symmetric(horizontal: 8.0), backgroundColor: Colors.transparent, leading: Container( @@ -38,22 +44,33 @@ class AbsenceGroupTile extends StatelessWidget { shape: BoxShape.circle, color: color.withOpacity(.25), ), - child: Center(child: Icon(AbsenceTile.justificationIcon(state), color: color)), + child: Center( + child: Icon(AbsenceTile.justificationIcon(state), + color: color)), ), title: Text.rich(TextSpan( - text: "${absences.where((a) => a.absence.state == state).length} ", - style: TextStyle(fontWeight: FontWeight.w700, color: AppColors.of(context).text), + text: + "${absences.where((a) => a.absence.state == state).length} ", + style: TextStyle( + fontWeight: FontWeight.w700, + color: AppColors.of(context).text), children: [ TextSpan( - text: AbsenceTile.justificationName(state).fill(["absence".i18n]), - style: TextStyle(fontWeight: FontWeight.w600, color: AppColors.of(context).text), + text: AbsenceTile.justificationName(state) + .fill(["absence".i18n]), + style: TextStyle( + fontWeight: FontWeight.w600, + color: AppColors.of(context).text), ), ], )), subtitle: showDate ? Text( - absences.first.absence.date.format(context, weekday: true), - style: TextStyle(fontWeight: FontWeight.w500, color: AppColors.of(context).text.withOpacity(0.8)), + absences.first.absence.date + .format(context, weekday: true), + style: TextStyle( + fontWeight: FontWeight.w500, + color: AppColors.of(context).text.withOpacity(0.8)), ) : null, children: absences, From 93fab8196d4587736f4ab78f219c5f0d6601e6d9 Mon Sep 17 00:00:00 2001 From: Kima Date: Tue, 1 Aug 2023 18:47:10 +0200 Subject: [PATCH 49/99] added web support --- filcnaplo/.metadata | 5 +- filcnaplo/web/favicon.png | Bin 0 -> 917 bytes filcnaplo/web/icons/Icon-192.png | Bin 0 -> 5292 bytes filcnaplo/web/icons/Icon-512.png | Bin 0 -> 8252 bytes filcnaplo/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes filcnaplo/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes filcnaplo/web/index.html | 59 ++++++++++++++++++++++ filcnaplo/web/manifest.json | 35 +++++++++++++ 8 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 filcnaplo/web/favicon.png create mode 100644 filcnaplo/web/icons/Icon-192.png create mode 100644 filcnaplo/web/icons/Icon-512.png create mode 100644 filcnaplo/web/icons/Icon-maskable-192.png create mode 100644 filcnaplo/web/icons/Icon-maskable-512.png create mode 100644 filcnaplo/web/index.html create mode 100644 filcnaplo/web/manifest.json diff --git a/filcnaplo/.metadata b/filcnaplo/.metadata index 6b7daaff..bd1207f9 100644 --- a/filcnaplo/.metadata +++ b/filcnaplo/.metadata @@ -15,10 +15,7 @@ migration: - platform: root create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 - - platform: linux - create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 - base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 - - platform: windows + - platform: web create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 diff --git a/filcnaplo/web/favicon.png b/filcnaplo/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s77>k44ofy`glX=O&z`$AH z5n0T@pr;JNj1^1m%NQ6KBQrxHN+NuHtdjF{^%7I^lT!66atjzhz^1~gBDWwnwIorY zA~z?m*s8)-39P~@uhG~7qCqZhc3d|4;4lG&j~$oK zA@xWG2F9zNE{-7;ld7wO#(qnZWJZzI2E3_xA*Lsx!2?73+ET^w%+}I@67GR zPL~gKB+lnDthp%7_f?t4uW8c8|3WP+WgZ_FE&TA=jOG3EO9#GP7O}Aw)>E_$k#Ij{ zy7GD-^V?e9l7~+mufGc|5hy!fsr=)zztlt_?dh+%eqZG?+EVFvYJGT3%B4l+c?Nxv zA961J%WD)5K5(#z=Uq!-q}j6RjfU+9tC!e#p8CvEH~sU+6WhDDJxnp0o^W94eWCU1 zQd#DyR^MO$Yr>MKOsyrcjGjlI&9nHBnS0EEGw0Y$CX2WHmGZe!`~O@#c5SN5zDu26 zDI4BKt!FtLvCi9OcFDt_gv}BORd*bZl^1SM*A_yFxrSX8ds2x$lS21HT;^ zTCIz7I(nCKmV|Unv7TVUR`#dH$H;AN(TuMbbG%<%3CMZUe|J|QuJuIw1-!H;WNWB?$;ib zdFQ+9g^uhz>as0SX1QKp$Jx0PS=bUhTs~c2!d=hEU?gX@B64~UD6e?B`njxgN@xNA DfL3B_ literal 0 HcmV?d00001 diff --git a/filcnaplo/web/icons/Icon-192.png b/filcnaplo/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 L>gTe~DWM4f2kRIC literal 0 HcmV?d00001 diff --git a/filcnaplo/web/icons/Icon-512.png b/filcnaplo/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/filcnaplo/web/icons/Icon-maskable-192.png b/filcnaplo/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 F695xY89M*~ literal 0 HcmV?d00001 diff --git a/filcnaplo/web/index.html b/filcnaplo/web/index.html new file mode 100644 index 00000000..d806e3ce --- /dev/null +++ b/filcnaplo/web/index.html @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + filcnaplo + + + + + + + + + + diff --git a/filcnaplo/web/manifest.json b/filcnaplo/web/manifest.json new file mode 100644 index 00000000..d43c5532 --- /dev/null +++ b/filcnaplo/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "filcnaplo", + "short_name": "filcnaplo", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} From 1f62a71cd5cc5c1fa5b8e7e24185762a9f49ec18 Mon Sep 17 00:00:00 2001 From: Kima Date: Tue, 1 Aug 2023 21:13:40 +0200 Subject: [PATCH 50/99] i'll never make this shit work on web lol, go nuxt --- filcnaplo/lib/app.dart | 16 +++++++++-- filcnaplo/lib/database/init.dart | 6 +++- filcnaplo/lib/main.dart | 48 ++++++++++++++++++-------------- filcnaplo/pubspec.yaml | 1 + 4 files changed, 47 insertions(+), 24 deletions(-) diff --git a/filcnaplo/lib/app.dart b/filcnaplo/lib/app.dart index efc54148..581b4a0d 100644 --- a/filcnaplo/lib/app.dart +++ b/filcnaplo/lib/app.dart @@ -13,6 +13,7 @@ import 'package:filcnaplo/theme/theme.dart'; import 'package:filcnaplo_kreta_api/client/client.dart'; import 'package:filcnaplo_kreta_api/providers/grade_provider.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:i18n_extension/i18n_widget.dart'; @@ -194,8 +195,19 @@ class App extends StatelessWidget { } Route? rootNavigator(RouteSettings route) { - // if platform == android || platform == ios - if (Platform.isAndroid || Platform.isIOS) { + if (kIsWeb) { + switch (route.name) { + case "login_back": + return CupertinoPageRoute( + builder: (context) => const desktop.LoginScreen(back: true)); + case "login": + return _rootRoute(const desktop.LoginScreen()); + case "navigation": + return _rootRoute(const desktop.NavigationScreen()); + case "login_to_navigation": + return desktop.loginRoute(const desktop.NavigationScreen()); + } + } else if (Platform.isAndroid || Platform.isIOS) { switch (route.name) { case "login_back": return CupertinoPageRoute( diff --git a/filcnaplo/lib/database/init.dart b/filcnaplo/lib/database/init.dart index a31c6a66..bce6d249 100644 --- a/filcnaplo/lib/database/init.dart +++ b/filcnaplo/lib/database/init.dart @@ -5,8 +5,10 @@ import 'dart:io'; import 'package:filcnaplo/api/providers/database_provider.dart'; import 'package:filcnaplo/database/struct.dart'; import 'package:filcnaplo/models/settings.dart'; +import 'package:flutter/foundation.dart'; // ignore: depend_on_referenced_packages import 'package:sqflite_common_ffi/sqflite_ffi.dart'; +import 'package:sqflite_common_ffi_web/sqflite_ffi_web.dart'; const settingsDB = DatabaseStruct("settings", { "language": String, "start_page": int, "rounding": int, "theme": int, @@ -48,7 +50,9 @@ Future createTable(Database db, DatabaseStruct struct) => Future initDB(DatabaseProvider database) async { Database db; - if (Platform.isLinux || Platform.isWindows) { + if (kIsWeb) { + db = await databaseFactoryFfiWeb.openDatabase("app.db"); + } else if (Platform.isLinux || Platform.isWindows) { sqfliteFfiInit(); db = await databaseFactoryFfi.openDatabase("app.db"); } else { diff --git a/filcnaplo/lib/main.dart b/filcnaplo/lib/main.dart index a7ad3170..b33cc5e9 100644 --- a/filcnaplo/lib/main.dart +++ b/filcnaplo/lib/main.dart @@ -48,13 +48,17 @@ class Startup { settings = await database.query.getSettings(database); user = await database.query.getUsers(settings); + late FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin; // Notifications setup - initPlatformState(); - FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = - FlutterLocalNotificationsPlugin(); + if (!kIsWeb) { + initPlatformState(); + flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); + } // Get permission to show notifications - if (Platform.isAndroid) { + if (kIsWeb) { + // do nothing + } else if (Platform.isAndroid) { await flutterLocalNotificationsPlugin .resolvePlatformSpecificImplementation< AndroidFlutterLocalNotificationsPlugin>()! @@ -80,24 +84,26 @@ class Startup { } // Platform specific settings - const DarwinInitializationSettings initializationSettingsDarwin = - DarwinInitializationSettings( - requestSoundPermission: true, - requestBadgePermission: true, - requestAlertPermission: false, - ); - const AndroidInitializationSettings initializationSettingsAndroid = - AndroidInitializationSettings('ic_notification'); - const InitializationSettings initializationSettings = - InitializationSettings( - android: initializationSettingsAndroid, - iOS: initializationSettingsDarwin, - macOS: initializationSettingsDarwin); + if (!kIsWeb) { + const DarwinInitializationSettings initializationSettingsDarwin = + DarwinInitializationSettings( + requestSoundPermission: true, + requestBadgePermission: true, + requestAlertPermission: false, + ); + const AndroidInitializationSettings initializationSettingsAndroid = + AndroidInitializationSettings('ic_notification'); + const InitializationSettings initializationSettings = + InitializationSettings( + android: initializationSettingsAndroid, + iOS: initializationSettingsDarwin, + macOS: initializationSettingsDarwin); - // Initialize notifications - await flutterLocalNotificationsPlugin.initialize( - initializationSettings, - ); + // Initialize notifications + await flutterLocalNotificationsPlugin.initialize( + initializationSettings, + ); + } } } diff --git a/filcnaplo/pubspec.yaml b/filcnaplo/pubspec.yaml index 5cd1e2d4..ef1dffdc 100644 --- a/filcnaplo/pubspec.yaml +++ b/filcnaplo/pubspec.yaml @@ -67,6 +67,7 @@ dependencies: package_info_plus: ^4.0.2 screenshot: ^2.1.0 flutter_staggered_grid_view: ^0.7.0 + sqflite_common_ffi_web: ^0.4.0 dev_dependencies: flutter_lints: ^2.0.1 From 22cd08165bc126aedf414ff2767210c76fe39929 Mon Sep 17 00:00:00 2001 From: Kima Date: Fri, 4 Aug 2023 13:48:36 +0200 Subject: [PATCH 51/99] added notification support on linux --- filcnaplo/lib/main.dart | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/filcnaplo/lib/main.dart b/filcnaplo/lib/main.dart index b33cc5e9..9ceab630 100644 --- a/filcnaplo/lib/main.dart +++ b/filcnaplo/lib/main.dart @@ -30,9 +30,10 @@ void main() async { // Run App runApp(App( - database: startup.database, - settings: startup.settings, - user: startup.user)); + database: startup.database, + settings: startup.settings, + user: startup.user, + )); } class Startup { @@ -81,6 +82,8 @@ class Startup { badge: true, sound: true, ); + } else if (Platform.isLinux) { + // no permissions are needed on linux } // Platform specific settings @@ -93,11 +96,15 @@ class Startup { ); const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('ic_notification'); + const LinuxInitializationSettings initializationSettingsLinux = + LinuxInitializationSettings(defaultActionName: 'Open notification'); const InitializationSettings initializationSettings = InitializationSettings( - android: initializationSettingsAndroid, - iOS: initializationSettingsDarwin, - macOS: initializationSettingsDarwin); + android: initializationSettingsAndroid, + iOS: initializationSettingsDarwin, + macOS: initializationSettingsDarwin, + linux: initializationSettingsLinux, + ); // Initialize notifications await flutterLocalNotificationsPlugin.initialize( From d2003893e84cb585592181f84d4481f9bda59161 Mon Sep 17 00:00:00 2001 From: Kima Date: Wed, 16 Aug 2023 02:11:41 +0200 Subject: [PATCH 52/99] 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 a4b75df2..1b859686 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 6371b175..93146d9e 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 9910d607..d980d0f7 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 e183c17c9f99edd7d5b5c165dd3002a20191b2ed Mon Sep 17 00:00:00 2001 From: Kima Date: Wed, 23 Aug 2023 00:04:33 +0200 Subject: [PATCH 53/99] look at the changes :smirk: --- .../flutter/generated_plugin_registrant.cc | 4 - .../linux/flutter/generated_plugins.cmake | 1 - .../Flutter/GeneratedPluginRegistrant.swift | 2 - filcnaplo_desktop_ui/.flutter-plugins 2 | 47 ++++++++++ .../.flutter-plugins-dependencies 2 | 1 + filcnaplo_kreta_api/.flutter-plugins 2 | 47 ++++++++++ .../.flutter-plugins-dependencies 2 | 1 + filcnaplo_kreta_api/lib/client/api.dart | 93 +++++++++++++------ .../lib/controllers/profile_controller.dart | 5 + filcnaplo_mobile_ui/.flutter-plugins 2 | 47 ++++++++++ .../.flutter-plugins-dependencies 2 | 1 + filcnaplo_premium/.flutter-plugins 2 | 47 ++++++++++ .../.flutter-plugins-dependencies 2 | 1 + 13 files changed, 262 insertions(+), 35 deletions(-) create mode 100644 filcnaplo_desktop_ui/.flutter-plugins 2 create mode 100644 filcnaplo_desktop_ui/.flutter-plugins-dependencies 2 create mode 100644 filcnaplo_kreta_api/.flutter-plugins 2 create mode 100644 filcnaplo_kreta_api/.flutter-plugins-dependencies 2 create mode 100644 filcnaplo_kreta_api/lib/controllers/profile_controller.dart create mode 100644 filcnaplo_mobile_ui/.flutter-plugins 2 create mode 100644 filcnaplo_mobile_ui/.flutter-plugins-dependencies 2 create mode 100644 filcnaplo_premium/.flutter-plugins 2 create mode 100644 filcnaplo_premium/.flutter-plugins-dependencies 2 diff --git a/filcnaplo/linux/flutter/generated_plugin_registrant.cc b/filcnaplo/linux/flutter/generated_plugin_registrant.cc index 0fcfb275..4894d346 100644 --- a/filcnaplo/linux/flutter/generated_plugin_registrant.cc +++ b/filcnaplo/linux/flutter/generated_plugin_registrant.cc @@ -7,7 +7,6 @@ #include "generated_plugin_registrant.h" #include -#include #include #include @@ -15,9 +14,6 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) dynamic_color_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin"); dynamic_color_plugin_register_with_registrar(dynamic_color_registrar); - g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); - file_selector_plugin_register_with_registrar(file_selector_linux_registrar); g_autoptr(FlPluginRegistrar) flutter_acrylic_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterAcrylicPlugin"); flutter_acrylic_plugin_register_with_registrar(flutter_acrylic_registrar); diff --git a/filcnaplo/linux/flutter/generated_plugins.cmake b/filcnaplo/linux/flutter/generated_plugins.cmake index c5541e6e..c8808fea 100644 --- a/filcnaplo/linux/flutter/generated_plugins.cmake +++ b/filcnaplo/linux/flutter/generated_plugins.cmake @@ -4,7 +4,6 @@ list(APPEND FLUTTER_PLUGIN_LIST dynamic_color - file_selector_linux flutter_acrylic url_launcher_linux ) diff --git a/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift b/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift index 53df988b..c6b190d7 100644 --- a/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,7 +7,6 @@ import Foundation import connectivity_plus import dynamic_color -import file_selector_macos import flutter_local_notifications import macos_window_utils import package_info_plus @@ -19,7 +18,6 @@ import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin")) DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) - FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) MacOSWindowUtilsPlugin.register(with: registry.registrar(forPlugin: "MacOSWindowUtilsPlugin")) FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) diff --git a/filcnaplo_desktop_ui/.flutter-plugins 2 b/filcnaplo_desktop_ui/.flutter-plugins 2 new file mode 100644 index 00000000..567e848c --- /dev/null +++ b/filcnaplo_desktop_ui/.flutter-plugins 2 @@ -0,0 +1,47 @@ +# This is a generated file; do not edit or check into version control. +app_group_directory=/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/ +background_fetch=/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/ +connectivity_plus=/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/ +dynamic_color=/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/ +file_picker=/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/ +flutter_acrylic=/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/ +flutter_custom_tabs=/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/ +flutter_custom_tabs_web=/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs_web-1.0.0/ +flutter_displaymode=/Users/kima/.pub-cache/hosted/pub.dev/flutter_displaymode-0.6.0/ +flutter_image_compress=/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/ +flutter_local_notifications=/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/ +flutter_native_image=/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/ +flutter_plugin_android_lifecycle=/Users/kima/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/ +home_widget=/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/ +image_picker=/Users/kima/.pub-cache/hosted/pub.dev/image_picker-0.8.7+5/ +image_picker_android=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_android-0.8.6+16/ +image_picker_for_web=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_for_web-2.1.12/ +image_picker_ios=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.7+4/ +live_activities=/Users/kima/.pub-cache/hosted/pub.dev/live_activities-1.7.4/ +macos_window_utils=/Users/kima/.pub-cache/hosted/pub.dev/macos_window_utils-1.1.3/ +open_file=/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/ +package_info_plus=/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/ +path_provider=/Users/kima/.pub-cache/hosted/pub.dev/path_provider-2.0.15/ +path_provider_android=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/ +path_provider_foundation=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/ +path_provider_linux=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11/ +path_provider_windows=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.7/ +permission_handler=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler-10.2.0/ +permission_handler_android=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_android-10.2.1/ +permission_handler_apple=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_apple-9.0.8/ +permission_handler_windows=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.2/ +quick_actions=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions-1.0.5/ +quick_actions_android=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_android-1.0.6/ +quick_actions_ios=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_ios-1.0.6/ +share_plus=/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/ +sqflite=/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/ +uni_links=/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/ +uni_links_web=/Users/kima/.pub-cache/hosted/pub.dev/uni_links_web-0.1.0/ +url_launcher=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher-6.1.11/ +url_launcher_android=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.35/ +url_launcher_ios=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.4/ +url_launcher_linux=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.5/ +url_launcher_macos=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.5/ +url_launcher_web=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.17/ +url_launcher_windows=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.6/ +workmanager=/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/ diff --git a/filcnaplo_desktop_ui/.flutter-plugins-dependencies 2 b/filcnaplo_desktop_ui/.flutter-plugins-dependencies 2 new file mode 100644 index 00000000..be402a3d --- /dev/null +++ b/filcnaplo_desktop_ui/.flutter-plugins-dependencies 2 @@ -0,0 +1 @@ +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"app_group_directory","path":"/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/","native_build":true,"dependencies":[]},{"name":"background_fetch","path":"/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/","native_build":true,"dependencies":[]},{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","native_build":true,"dependencies":[]},{"name":"flutter_custom_tabs","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/","native_build":true,"dependencies":[]},{"name":"flutter_image_compress","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"flutter_native_image","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/","native_build":true,"dependencies":[]},{"name":"home_widget","path":"/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/","native_build":true,"dependencies":[]},{"name":"image_picker_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.7+4/","native_build":true,"dependencies":[]},{"name":"live_activities","path":"/Users/kima/.pub-cache/hosted/pub.dev/live_activities-1.7.4/","native_build":true,"dependencies":["app_group_directory","flutter_image_compress","flutter_native_image"]},{"name":"open_file","path":"/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"permission_handler_apple","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_apple-9.0.8/","native_build":true,"dependencies":[]},{"name":"quick_actions_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_ios-1.0.6/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"uni_links","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/","native_build":true,"dependencies":[]},{"name":"url_launcher_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.4/","native_build":true,"dependencies":[]},{"name":"workmanager","path":"/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/","native_build":true,"dependencies":[]}],"android":[{"name":"app_group_directory","path":"/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/","native_build":true,"dependencies":[]},{"name":"background_fetch","path":"/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/","native_build":true,"dependencies":[]},{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_custom_tabs","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/","native_build":true,"dependencies":[]},{"name":"flutter_displaymode","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_displaymode-0.6.0/","native_build":true,"dependencies":[]},{"name":"flutter_image_compress","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"flutter_native_image","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/","native_build":true,"dependencies":[]},{"name":"flutter_plugin_android_lifecycle","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/","native_build":true,"dependencies":[]},{"name":"home_widget","path":"/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/","native_build":true,"dependencies":[]},{"name":"image_picker_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_android-0.8.6+16/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"open_file","path":"/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/","native_build":true,"dependencies":[]},{"name":"permission_handler_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_android-10.2.1/","native_build":true,"dependencies":[]},{"name":"quick_actions_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_android-1.0.6/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"uni_links","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/","native_build":true,"dependencies":[]},{"name":"url_launcher_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.35/","native_build":true,"dependencies":[]},{"name":"workmanager","path":"/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/","native_build":true,"dependencies":[]}],"macos":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"macos_window_utils","path":"/Users/kima/.pub-cache/hosted/pub.dev/macos_window_utils-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"url_launcher_macos","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.5/","native_build":true,"dependencies":[]}],"linux":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":false,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_acrylic","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":false,"dependencies":[]},{"name":"path_provider_linux","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11/","native_build":false,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":false,"dependencies":["url_launcher_linux"]},{"name":"url_launcher_linux","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.5/","native_build":true,"dependencies":[]}],"windows":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_acrylic","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":false,"dependencies":[]},{"name":"path_provider_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.7/","native_build":false,"dependencies":[]},{"name":"permission_handler_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.2/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":["url_launcher_windows"]},{"name":"url_launcher_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.6/","native_build":true,"dependencies":[]}],"web":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","dependencies":[]},{"name":"flutter_custom_tabs_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs_web-1.0.0/","dependencies":["url_launcher_web"]},{"name":"image_picker_for_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_for_web-2.1.12/","dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","dependencies":["url_launcher_web"]},{"name":"uni_links_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links_web-0.1.0/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.17/","dependencies":[]}]},"dependencyGraph":[{"name":"app_group_directory","dependencies":[]},{"name":"background_fetch","dependencies":[]},{"name":"connectivity_plus","dependencies":[]},{"name":"dynamic_color","dependencies":[]},{"name":"file_picker","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_acrylic","dependencies":["macos_window_utils"]},{"name":"flutter_custom_tabs","dependencies":["flutter_custom_tabs_web"]},{"name":"flutter_custom_tabs_web","dependencies":["url_launcher_web"]},{"name":"flutter_displaymode","dependencies":[]},{"name":"flutter_image_compress","dependencies":[]},{"name":"flutter_local_notifications","dependencies":[]},{"name":"flutter_native_image","dependencies":[]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"home_widget","dependencies":[]},{"name":"image_picker","dependencies":["image_picker_android","image_picker_for_web","image_picker_ios"]},{"name":"image_picker_android","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"image_picker_for_web","dependencies":[]},{"name":"image_picker_ios","dependencies":[]},{"name":"live_activities","dependencies":["app_group_directory","flutter_image_compress","path_provider","flutter_native_image"]},{"name":"macos_window_utils","dependencies":[]},{"name":"open_file","dependencies":[]},{"name":"package_info_plus","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"permission_handler","dependencies":["permission_handler_android","permission_handler_apple","permission_handler_windows"]},{"name":"permission_handler_android","dependencies":[]},{"name":"permission_handler_apple","dependencies":[]},{"name":"permission_handler_windows","dependencies":[]},{"name":"quick_actions","dependencies":["quick_actions_android","quick_actions_ios"]},{"name":"quick_actions_android","dependencies":[]},{"name":"quick_actions_ios","dependencies":[]},{"name":"share_plus","dependencies":["url_launcher_web","url_launcher_windows","url_launcher_linux"]},{"name":"sqflite","dependencies":[]},{"name":"uni_links","dependencies":["uni_links_web"]},{"name":"uni_links_web","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_android","url_launcher_ios","url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_android","dependencies":[]},{"name":"url_launcher_ios","dependencies":[]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]},{"name":"workmanager","dependencies":[]}],"date_created":"2023-06-16 01:40:46.264387","version":"3.10.4"} \ No newline at end of file diff --git a/filcnaplo_kreta_api/.flutter-plugins 2 b/filcnaplo_kreta_api/.flutter-plugins 2 new file mode 100644 index 00000000..567e848c --- /dev/null +++ b/filcnaplo_kreta_api/.flutter-plugins 2 @@ -0,0 +1,47 @@ +# This is a generated file; do not edit or check into version control. +app_group_directory=/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/ +background_fetch=/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/ +connectivity_plus=/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/ +dynamic_color=/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/ +file_picker=/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/ +flutter_acrylic=/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/ +flutter_custom_tabs=/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/ +flutter_custom_tabs_web=/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs_web-1.0.0/ +flutter_displaymode=/Users/kima/.pub-cache/hosted/pub.dev/flutter_displaymode-0.6.0/ +flutter_image_compress=/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/ +flutter_local_notifications=/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/ +flutter_native_image=/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/ +flutter_plugin_android_lifecycle=/Users/kima/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/ +home_widget=/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/ +image_picker=/Users/kima/.pub-cache/hosted/pub.dev/image_picker-0.8.7+5/ +image_picker_android=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_android-0.8.6+16/ +image_picker_for_web=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_for_web-2.1.12/ +image_picker_ios=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.7+4/ +live_activities=/Users/kima/.pub-cache/hosted/pub.dev/live_activities-1.7.4/ +macos_window_utils=/Users/kima/.pub-cache/hosted/pub.dev/macos_window_utils-1.1.3/ +open_file=/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/ +package_info_plus=/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/ +path_provider=/Users/kima/.pub-cache/hosted/pub.dev/path_provider-2.0.15/ +path_provider_android=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/ +path_provider_foundation=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/ +path_provider_linux=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11/ +path_provider_windows=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.7/ +permission_handler=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler-10.2.0/ +permission_handler_android=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_android-10.2.1/ +permission_handler_apple=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_apple-9.0.8/ +permission_handler_windows=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.2/ +quick_actions=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions-1.0.5/ +quick_actions_android=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_android-1.0.6/ +quick_actions_ios=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_ios-1.0.6/ +share_plus=/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/ +sqflite=/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/ +uni_links=/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/ +uni_links_web=/Users/kima/.pub-cache/hosted/pub.dev/uni_links_web-0.1.0/ +url_launcher=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher-6.1.11/ +url_launcher_android=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.35/ +url_launcher_ios=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.4/ +url_launcher_linux=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.5/ +url_launcher_macos=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.5/ +url_launcher_web=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.17/ +url_launcher_windows=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.6/ +workmanager=/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/ diff --git a/filcnaplo_kreta_api/.flutter-plugins-dependencies 2 b/filcnaplo_kreta_api/.flutter-plugins-dependencies 2 new file mode 100644 index 00000000..3e177648 --- /dev/null +++ b/filcnaplo_kreta_api/.flutter-plugins-dependencies 2 @@ -0,0 +1 @@ +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"app_group_directory","path":"/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/","native_build":true,"dependencies":[]},{"name":"background_fetch","path":"/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/","native_build":true,"dependencies":[]},{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","native_build":true,"dependencies":[]},{"name":"flutter_custom_tabs","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/","native_build":true,"dependencies":[]},{"name":"flutter_image_compress","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"flutter_native_image","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/","native_build":true,"dependencies":[]},{"name":"home_widget","path":"/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/","native_build":true,"dependencies":[]},{"name":"image_picker_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.7+4/","native_build":true,"dependencies":[]},{"name":"live_activities","path":"/Users/kima/.pub-cache/hosted/pub.dev/live_activities-1.7.4/","native_build":true,"dependencies":["app_group_directory","flutter_image_compress","flutter_native_image"]},{"name":"open_file","path":"/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"permission_handler_apple","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_apple-9.0.8/","native_build":true,"dependencies":[]},{"name":"quick_actions_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_ios-1.0.6/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"uni_links","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/","native_build":true,"dependencies":[]},{"name":"url_launcher_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.4/","native_build":true,"dependencies":[]},{"name":"workmanager","path":"/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/","native_build":true,"dependencies":[]}],"android":[{"name":"app_group_directory","path":"/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/","native_build":true,"dependencies":[]},{"name":"background_fetch","path":"/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/","native_build":true,"dependencies":[]},{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_custom_tabs","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/","native_build":true,"dependencies":[]},{"name":"flutter_displaymode","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_displaymode-0.6.0/","native_build":true,"dependencies":[]},{"name":"flutter_image_compress","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"flutter_native_image","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/","native_build":true,"dependencies":[]},{"name":"flutter_plugin_android_lifecycle","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/","native_build":true,"dependencies":[]},{"name":"home_widget","path":"/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/","native_build":true,"dependencies":[]},{"name":"image_picker_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_android-0.8.6+16/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"open_file","path":"/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/","native_build":true,"dependencies":[]},{"name":"permission_handler_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_android-10.2.1/","native_build":true,"dependencies":[]},{"name":"quick_actions_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_android-1.0.6/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"uni_links","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/","native_build":true,"dependencies":[]},{"name":"url_launcher_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.35/","native_build":true,"dependencies":[]},{"name":"workmanager","path":"/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/","native_build":true,"dependencies":[]}],"macos":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"macos_window_utils","path":"/Users/kima/.pub-cache/hosted/pub.dev/macos_window_utils-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"url_launcher_macos","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.5/","native_build":true,"dependencies":[]}],"linux":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":false,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_acrylic","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":false,"dependencies":[]},{"name":"path_provider_linux","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11/","native_build":false,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":false,"dependencies":["url_launcher_linux"]},{"name":"url_launcher_linux","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.5/","native_build":true,"dependencies":[]}],"windows":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_acrylic","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":false,"dependencies":[]},{"name":"path_provider_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.7/","native_build":false,"dependencies":[]},{"name":"permission_handler_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.2/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":["url_launcher_windows"]},{"name":"url_launcher_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.6/","native_build":true,"dependencies":[]}],"web":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","dependencies":[]},{"name":"flutter_custom_tabs_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs_web-1.0.0/","dependencies":["url_launcher_web"]},{"name":"image_picker_for_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_for_web-2.1.12/","dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","dependencies":["url_launcher_web"]},{"name":"uni_links_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links_web-0.1.0/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.17/","dependencies":[]}]},"dependencyGraph":[{"name":"app_group_directory","dependencies":[]},{"name":"background_fetch","dependencies":[]},{"name":"connectivity_plus","dependencies":[]},{"name":"dynamic_color","dependencies":[]},{"name":"file_picker","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_acrylic","dependencies":["macos_window_utils"]},{"name":"flutter_custom_tabs","dependencies":["flutter_custom_tabs_web"]},{"name":"flutter_custom_tabs_web","dependencies":["url_launcher_web"]},{"name":"flutter_displaymode","dependencies":[]},{"name":"flutter_image_compress","dependencies":[]},{"name":"flutter_local_notifications","dependencies":[]},{"name":"flutter_native_image","dependencies":[]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"home_widget","dependencies":[]},{"name":"image_picker","dependencies":["image_picker_android","image_picker_for_web","image_picker_ios"]},{"name":"image_picker_android","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"image_picker_for_web","dependencies":[]},{"name":"image_picker_ios","dependencies":[]},{"name":"live_activities","dependencies":["app_group_directory","flutter_image_compress","path_provider","flutter_native_image"]},{"name":"macos_window_utils","dependencies":[]},{"name":"open_file","dependencies":[]},{"name":"package_info_plus","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"permission_handler","dependencies":["permission_handler_android","permission_handler_apple","permission_handler_windows"]},{"name":"permission_handler_android","dependencies":[]},{"name":"permission_handler_apple","dependencies":[]},{"name":"permission_handler_windows","dependencies":[]},{"name":"quick_actions","dependencies":["quick_actions_android","quick_actions_ios"]},{"name":"quick_actions_android","dependencies":[]},{"name":"quick_actions_ios","dependencies":[]},{"name":"share_plus","dependencies":["url_launcher_web","url_launcher_windows","url_launcher_linux"]},{"name":"sqflite","dependencies":[]},{"name":"uni_links","dependencies":["uni_links_web"]},{"name":"uni_links_web","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_android","url_launcher_ios","url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_android","dependencies":[]},{"name":"url_launcher_ios","dependencies":[]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]},{"name":"workmanager","dependencies":[]}],"date_created":"2023-06-16 01:40:39.265210","version":"3.10.4"} \ No newline at end of file diff --git a/filcnaplo_kreta_api/lib/client/api.dart b/filcnaplo_kreta_api/lib/client/api.dart index 6371b175..cb8674b3 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,32 @@ 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"; + // profile management + static const editProfile = "/api/profilapi/saveprofildata"; } diff --git a/filcnaplo_kreta_api/lib/controllers/profile_controller.dart b/filcnaplo_kreta_api/lib/controllers/profile_controller.dart new file mode 100644 index 00000000..ddd9b9ca --- /dev/null +++ b/filcnaplo_kreta_api/lib/controllers/profile_controller.dart @@ -0,0 +1,5 @@ +import 'package:flutter/foundation.dart'; + +class ProfileController extends ChangeNotifier { + //todo: profile controller (pw change, etc) +} diff --git a/filcnaplo_mobile_ui/.flutter-plugins 2 b/filcnaplo_mobile_ui/.flutter-plugins 2 new file mode 100644 index 00000000..567e848c --- /dev/null +++ b/filcnaplo_mobile_ui/.flutter-plugins 2 @@ -0,0 +1,47 @@ +# This is a generated file; do not edit or check into version control. +app_group_directory=/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/ +background_fetch=/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/ +connectivity_plus=/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/ +dynamic_color=/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/ +file_picker=/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/ +flutter_acrylic=/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/ +flutter_custom_tabs=/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/ +flutter_custom_tabs_web=/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs_web-1.0.0/ +flutter_displaymode=/Users/kima/.pub-cache/hosted/pub.dev/flutter_displaymode-0.6.0/ +flutter_image_compress=/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/ +flutter_local_notifications=/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/ +flutter_native_image=/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/ +flutter_plugin_android_lifecycle=/Users/kima/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/ +home_widget=/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/ +image_picker=/Users/kima/.pub-cache/hosted/pub.dev/image_picker-0.8.7+5/ +image_picker_android=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_android-0.8.6+16/ +image_picker_for_web=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_for_web-2.1.12/ +image_picker_ios=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.7+4/ +live_activities=/Users/kima/.pub-cache/hosted/pub.dev/live_activities-1.7.4/ +macos_window_utils=/Users/kima/.pub-cache/hosted/pub.dev/macos_window_utils-1.1.3/ +open_file=/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/ +package_info_plus=/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/ +path_provider=/Users/kima/.pub-cache/hosted/pub.dev/path_provider-2.0.15/ +path_provider_android=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/ +path_provider_foundation=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/ +path_provider_linux=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11/ +path_provider_windows=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.7/ +permission_handler=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler-10.2.0/ +permission_handler_android=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_android-10.2.1/ +permission_handler_apple=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_apple-9.0.8/ +permission_handler_windows=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.2/ +quick_actions=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions-1.0.5/ +quick_actions_android=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_android-1.0.6/ +quick_actions_ios=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_ios-1.0.6/ +share_plus=/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/ +sqflite=/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/ +uni_links=/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/ +uni_links_web=/Users/kima/.pub-cache/hosted/pub.dev/uni_links_web-0.1.0/ +url_launcher=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher-6.1.11/ +url_launcher_android=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.35/ +url_launcher_ios=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.4/ +url_launcher_linux=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.5/ +url_launcher_macos=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.5/ +url_launcher_web=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.17/ +url_launcher_windows=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.6/ +workmanager=/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/ diff --git a/filcnaplo_mobile_ui/.flutter-plugins-dependencies 2 b/filcnaplo_mobile_ui/.flutter-plugins-dependencies 2 new file mode 100644 index 00000000..4c40e824 --- /dev/null +++ b/filcnaplo_mobile_ui/.flutter-plugins-dependencies 2 @@ -0,0 +1 @@ +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"app_group_directory","path":"/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/","native_build":true,"dependencies":[]},{"name":"background_fetch","path":"/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/","native_build":true,"dependencies":[]},{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","native_build":true,"dependencies":[]},{"name":"flutter_custom_tabs","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/","native_build":true,"dependencies":[]},{"name":"flutter_image_compress","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"flutter_native_image","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/","native_build":true,"dependencies":[]},{"name":"home_widget","path":"/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/","native_build":true,"dependencies":[]},{"name":"image_picker_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.7+4/","native_build":true,"dependencies":[]},{"name":"live_activities","path":"/Users/kima/.pub-cache/hosted/pub.dev/live_activities-1.7.4/","native_build":true,"dependencies":["app_group_directory","flutter_image_compress","flutter_native_image"]},{"name":"open_file","path":"/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"permission_handler_apple","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_apple-9.0.8/","native_build":true,"dependencies":[]},{"name":"quick_actions_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_ios-1.0.6/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"uni_links","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/","native_build":true,"dependencies":[]},{"name":"url_launcher_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.4/","native_build":true,"dependencies":[]},{"name":"workmanager","path":"/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/","native_build":true,"dependencies":[]}],"android":[{"name":"app_group_directory","path":"/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/","native_build":true,"dependencies":[]},{"name":"background_fetch","path":"/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/","native_build":true,"dependencies":[]},{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_custom_tabs","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/","native_build":true,"dependencies":[]},{"name":"flutter_displaymode","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_displaymode-0.6.0/","native_build":true,"dependencies":[]},{"name":"flutter_image_compress","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"flutter_native_image","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/","native_build":true,"dependencies":[]},{"name":"flutter_plugin_android_lifecycle","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/","native_build":true,"dependencies":[]},{"name":"home_widget","path":"/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/","native_build":true,"dependencies":[]},{"name":"image_picker_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_android-0.8.6+16/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"open_file","path":"/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/","native_build":true,"dependencies":[]},{"name":"permission_handler_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_android-10.2.1/","native_build":true,"dependencies":[]},{"name":"quick_actions_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_android-1.0.6/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"uni_links","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/","native_build":true,"dependencies":[]},{"name":"url_launcher_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.35/","native_build":true,"dependencies":[]},{"name":"workmanager","path":"/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/","native_build":true,"dependencies":[]}],"macos":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"macos_window_utils","path":"/Users/kima/.pub-cache/hosted/pub.dev/macos_window_utils-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"url_launcher_macos","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.5/","native_build":true,"dependencies":[]}],"linux":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":false,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_acrylic","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":false,"dependencies":[]},{"name":"path_provider_linux","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11/","native_build":false,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":false,"dependencies":["url_launcher_linux"]},{"name":"url_launcher_linux","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.5/","native_build":true,"dependencies":[]}],"windows":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_acrylic","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":false,"dependencies":[]},{"name":"path_provider_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.7/","native_build":false,"dependencies":[]},{"name":"permission_handler_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.2/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":["url_launcher_windows"]},{"name":"url_launcher_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.6/","native_build":true,"dependencies":[]}],"web":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","dependencies":[]},{"name":"flutter_custom_tabs_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs_web-1.0.0/","dependencies":["url_launcher_web"]},{"name":"image_picker_for_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_for_web-2.1.12/","dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","dependencies":["url_launcher_web"]},{"name":"uni_links_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links_web-0.1.0/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.17/","dependencies":[]}]},"dependencyGraph":[{"name":"app_group_directory","dependencies":[]},{"name":"background_fetch","dependencies":[]},{"name":"connectivity_plus","dependencies":[]},{"name":"dynamic_color","dependencies":[]},{"name":"file_picker","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_acrylic","dependencies":["macos_window_utils"]},{"name":"flutter_custom_tabs","dependencies":["flutter_custom_tabs_web"]},{"name":"flutter_custom_tabs_web","dependencies":["url_launcher_web"]},{"name":"flutter_displaymode","dependencies":[]},{"name":"flutter_image_compress","dependencies":[]},{"name":"flutter_local_notifications","dependencies":[]},{"name":"flutter_native_image","dependencies":[]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"home_widget","dependencies":[]},{"name":"image_picker","dependencies":["image_picker_android","image_picker_for_web","image_picker_ios"]},{"name":"image_picker_android","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"image_picker_for_web","dependencies":[]},{"name":"image_picker_ios","dependencies":[]},{"name":"live_activities","dependencies":["app_group_directory","flutter_image_compress","path_provider","flutter_native_image"]},{"name":"macos_window_utils","dependencies":[]},{"name":"open_file","dependencies":[]},{"name":"package_info_plus","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"permission_handler","dependencies":["permission_handler_android","permission_handler_apple","permission_handler_windows"]},{"name":"permission_handler_android","dependencies":[]},{"name":"permission_handler_apple","dependencies":[]},{"name":"permission_handler_windows","dependencies":[]},{"name":"quick_actions","dependencies":["quick_actions_android","quick_actions_ios"]},{"name":"quick_actions_android","dependencies":[]},{"name":"quick_actions_ios","dependencies":[]},{"name":"share_plus","dependencies":["url_launcher_web","url_launcher_windows","url_launcher_linux"]},{"name":"sqflite","dependencies":[]},{"name":"uni_links","dependencies":["uni_links_web"]},{"name":"uni_links_web","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_android","url_launcher_ios","url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_android","dependencies":[]},{"name":"url_launcher_ios","dependencies":[]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]},{"name":"workmanager","dependencies":[]}],"date_created":"2023-06-16 01:40:42.923839","version":"3.10.4"} \ No newline at end of file diff --git a/filcnaplo_premium/.flutter-plugins 2 b/filcnaplo_premium/.flutter-plugins 2 new file mode 100644 index 00000000..567e848c --- /dev/null +++ b/filcnaplo_premium/.flutter-plugins 2 @@ -0,0 +1,47 @@ +# This is a generated file; do not edit or check into version control. +app_group_directory=/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/ +background_fetch=/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/ +connectivity_plus=/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/ +dynamic_color=/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/ +file_picker=/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/ +flutter_acrylic=/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/ +flutter_custom_tabs=/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/ +flutter_custom_tabs_web=/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs_web-1.0.0/ +flutter_displaymode=/Users/kima/.pub-cache/hosted/pub.dev/flutter_displaymode-0.6.0/ +flutter_image_compress=/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/ +flutter_local_notifications=/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/ +flutter_native_image=/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/ +flutter_plugin_android_lifecycle=/Users/kima/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/ +home_widget=/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/ +image_picker=/Users/kima/.pub-cache/hosted/pub.dev/image_picker-0.8.7+5/ +image_picker_android=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_android-0.8.6+16/ +image_picker_for_web=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_for_web-2.1.12/ +image_picker_ios=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.7+4/ +live_activities=/Users/kima/.pub-cache/hosted/pub.dev/live_activities-1.7.4/ +macos_window_utils=/Users/kima/.pub-cache/hosted/pub.dev/macos_window_utils-1.1.3/ +open_file=/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/ +package_info_plus=/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/ +path_provider=/Users/kima/.pub-cache/hosted/pub.dev/path_provider-2.0.15/ +path_provider_android=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/ +path_provider_foundation=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/ +path_provider_linux=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11/ +path_provider_windows=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.7/ +permission_handler=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler-10.2.0/ +permission_handler_android=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_android-10.2.1/ +permission_handler_apple=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_apple-9.0.8/ +permission_handler_windows=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.2/ +quick_actions=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions-1.0.5/ +quick_actions_android=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_android-1.0.6/ +quick_actions_ios=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_ios-1.0.6/ +share_plus=/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/ +sqflite=/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/ +uni_links=/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/ +uni_links_web=/Users/kima/.pub-cache/hosted/pub.dev/uni_links_web-0.1.0/ +url_launcher=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher-6.1.11/ +url_launcher_android=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.35/ +url_launcher_ios=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.4/ +url_launcher_linux=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.5/ +url_launcher_macos=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.5/ +url_launcher_web=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.17/ +url_launcher_windows=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.6/ +workmanager=/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/ diff --git a/filcnaplo_premium/.flutter-plugins-dependencies 2 b/filcnaplo_premium/.flutter-plugins-dependencies 2 new file mode 100644 index 00000000..bc1819f4 --- /dev/null +++ b/filcnaplo_premium/.flutter-plugins-dependencies 2 @@ -0,0 +1 @@ +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"app_group_directory","path":"/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/","native_build":true,"dependencies":[]},{"name":"background_fetch","path":"/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/","native_build":true,"dependencies":[]},{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","native_build":true,"dependencies":[]},{"name":"flutter_custom_tabs","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/","native_build":true,"dependencies":[]},{"name":"flutter_image_compress","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"flutter_native_image","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/","native_build":true,"dependencies":[]},{"name":"home_widget","path":"/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/","native_build":true,"dependencies":[]},{"name":"image_picker_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.7+4/","native_build":true,"dependencies":[]},{"name":"live_activities","path":"/Users/kima/.pub-cache/hosted/pub.dev/live_activities-1.7.4/","native_build":true,"dependencies":["app_group_directory","flutter_image_compress","flutter_native_image"]},{"name":"open_file","path":"/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"permission_handler_apple","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_apple-9.0.8/","native_build":true,"dependencies":[]},{"name":"quick_actions_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_ios-1.0.6/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"uni_links","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/","native_build":true,"dependencies":[]},{"name":"url_launcher_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.4/","native_build":true,"dependencies":[]},{"name":"workmanager","path":"/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/","native_build":true,"dependencies":[]}],"android":[{"name":"app_group_directory","path":"/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/","native_build":true,"dependencies":[]},{"name":"background_fetch","path":"/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/","native_build":true,"dependencies":[]},{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_custom_tabs","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/","native_build":true,"dependencies":[]},{"name":"flutter_displaymode","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_displaymode-0.6.0/","native_build":true,"dependencies":[]},{"name":"flutter_image_compress","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"flutter_native_image","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/","native_build":true,"dependencies":[]},{"name":"flutter_plugin_android_lifecycle","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/","native_build":true,"dependencies":[]},{"name":"home_widget","path":"/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/","native_build":true,"dependencies":[]},{"name":"image_picker_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_android-0.8.6+16/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"open_file","path":"/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/","native_build":true,"dependencies":[]},{"name":"permission_handler_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_android-10.2.1/","native_build":true,"dependencies":[]},{"name":"quick_actions_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_android-1.0.6/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"uni_links","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/","native_build":true,"dependencies":[]},{"name":"url_launcher_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.35/","native_build":true,"dependencies":[]},{"name":"workmanager","path":"/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/","native_build":true,"dependencies":[]}],"macos":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"macos_window_utils","path":"/Users/kima/.pub-cache/hosted/pub.dev/macos_window_utils-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"url_launcher_macos","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.5/","native_build":true,"dependencies":[]}],"linux":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":false,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_acrylic","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":false,"dependencies":[]},{"name":"path_provider_linux","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11/","native_build":false,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":false,"dependencies":["url_launcher_linux"]},{"name":"url_launcher_linux","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.5/","native_build":true,"dependencies":[]}],"windows":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_acrylic","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":false,"dependencies":[]},{"name":"path_provider_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.7/","native_build":false,"dependencies":[]},{"name":"permission_handler_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.2/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":["url_launcher_windows"]},{"name":"url_launcher_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.6/","native_build":true,"dependencies":[]}],"web":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","dependencies":[]},{"name":"flutter_custom_tabs_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs_web-1.0.0/","dependencies":["url_launcher_web"]},{"name":"image_picker_for_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_for_web-2.1.12/","dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","dependencies":["url_launcher_web"]},{"name":"uni_links_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links_web-0.1.0/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.17/","dependencies":[]}]},"dependencyGraph":[{"name":"app_group_directory","dependencies":[]},{"name":"background_fetch","dependencies":[]},{"name":"connectivity_plus","dependencies":[]},{"name":"dynamic_color","dependencies":[]},{"name":"file_picker","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_acrylic","dependencies":["macos_window_utils"]},{"name":"flutter_custom_tabs","dependencies":["flutter_custom_tabs_web"]},{"name":"flutter_custom_tabs_web","dependencies":["url_launcher_web"]},{"name":"flutter_displaymode","dependencies":[]},{"name":"flutter_image_compress","dependencies":[]},{"name":"flutter_local_notifications","dependencies":[]},{"name":"flutter_native_image","dependencies":[]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"home_widget","dependencies":[]},{"name":"image_picker","dependencies":["image_picker_android","image_picker_for_web","image_picker_ios"]},{"name":"image_picker_android","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"image_picker_for_web","dependencies":[]},{"name":"image_picker_ios","dependencies":[]},{"name":"live_activities","dependencies":["app_group_directory","flutter_image_compress","path_provider","flutter_native_image"]},{"name":"macos_window_utils","dependencies":[]},{"name":"open_file","dependencies":[]},{"name":"package_info_plus","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"permission_handler","dependencies":["permission_handler_android","permission_handler_apple","permission_handler_windows"]},{"name":"permission_handler_android","dependencies":[]},{"name":"permission_handler_apple","dependencies":[]},{"name":"permission_handler_windows","dependencies":[]},{"name":"quick_actions","dependencies":["quick_actions_android","quick_actions_ios"]},{"name":"quick_actions_android","dependencies":[]},{"name":"quick_actions_ios","dependencies":[]},{"name":"share_plus","dependencies":["url_launcher_web","url_launcher_windows","url_launcher_linux"]},{"name":"sqflite","dependencies":[]},{"name":"uni_links","dependencies":["uni_links_web"]},{"name":"uni_links_web","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_android","url_launcher_ios","url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_android","dependencies":[]},{"name":"url_launcher_ios","dependencies":[]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]},{"name":"workmanager","dependencies":[]}],"date_created":"2023-06-16 01:40:49.613049","version":"3.10.4"} \ No newline at end of file From b9b79fdde26bd88a260d38ee152a595833d1f819 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kiss?= <70794496+kimaah@users.noreply.github.com> Date: Wed, 23 Aug 2023 00:29:15 +0200 Subject: [PATCH 54/99] Delete .flutter-plugins 2 --- filcnaplo_desktop_ui/.flutter-plugins 2 | 47 ------------------------- 1 file changed, 47 deletions(-) delete mode 100644 filcnaplo_desktop_ui/.flutter-plugins 2 diff --git a/filcnaplo_desktop_ui/.flutter-plugins 2 b/filcnaplo_desktop_ui/.flutter-plugins 2 deleted file mode 100644 index 567e848c..00000000 --- a/filcnaplo_desktop_ui/.flutter-plugins 2 +++ /dev/null @@ -1,47 +0,0 @@ -# This is a generated file; do not edit or check into version control. -app_group_directory=/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/ -background_fetch=/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/ -connectivity_plus=/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/ -dynamic_color=/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/ -file_picker=/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/ -flutter_acrylic=/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/ -flutter_custom_tabs=/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/ -flutter_custom_tabs_web=/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs_web-1.0.0/ -flutter_displaymode=/Users/kima/.pub-cache/hosted/pub.dev/flutter_displaymode-0.6.0/ -flutter_image_compress=/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/ -flutter_local_notifications=/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/ -flutter_native_image=/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/ -flutter_plugin_android_lifecycle=/Users/kima/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/ -home_widget=/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/ -image_picker=/Users/kima/.pub-cache/hosted/pub.dev/image_picker-0.8.7+5/ -image_picker_android=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_android-0.8.6+16/ -image_picker_for_web=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_for_web-2.1.12/ -image_picker_ios=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.7+4/ -live_activities=/Users/kima/.pub-cache/hosted/pub.dev/live_activities-1.7.4/ -macos_window_utils=/Users/kima/.pub-cache/hosted/pub.dev/macos_window_utils-1.1.3/ -open_file=/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/ -package_info_plus=/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/ -path_provider=/Users/kima/.pub-cache/hosted/pub.dev/path_provider-2.0.15/ -path_provider_android=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/ -path_provider_foundation=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/ -path_provider_linux=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11/ -path_provider_windows=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.7/ -permission_handler=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler-10.2.0/ -permission_handler_android=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_android-10.2.1/ -permission_handler_apple=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_apple-9.0.8/ -permission_handler_windows=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.2/ -quick_actions=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions-1.0.5/ -quick_actions_android=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_android-1.0.6/ -quick_actions_ios=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_ios-1.0.6/ -share_plus=/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/ -sqflite=/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/ -uni_links=/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/ -uni_links_web=/Users/kima/.pub-cache/hosted/pub.dev/uni_links_web-0.1.0/ -url_launcher=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher-6.1.11/ -url_launcher_android=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.35/ -url_launcher_ios=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.4/ -url_launcher_linux=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.5/ -url_launcher_macos=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.5/ -url_launcher_web=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.17/ -url_launcher_windows=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.6/ -workmanager=/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/ From 6b8eb120f003b476a3df6b07cc17cb8488b28dba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kiss?= <70794496+kimaah@users.noreply.github.com> Date: Wed, 23 Aug 2023 00:29:26 +0200 Subject: [PATCH 55/99] Delete .flutter-plugins-dependencies 2 --- filcnaplo_desktop_ui/.flutter-plugins-dependencies 2 | 1 - 1 file changed, 1 deletion(-) delete mode 100644 filcnaplo_desktop_ui/.flutter-plugins-dependencies 2 diff --git a/filcnaplo_desktop_ui/.flutter-plugins-dependencies 2 b/filcnaplo_desktop_ui/.flutter-plugins-dependencies 2 deleted file mode 100644 index be402a3d..00000000 --- a/filcnaplo_desktop_ui/.flutter-plugins-dependencies 2 +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"app_group_directory","path":"/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/","native_build":true,"dependencies":[]},{"name":"background_fetch","path":"/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/","native_build":true,"dependencies":[]},{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","native_build":true,"dependencies":[]},{"name":"flutter_custom_tabs","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/","native_build":true,"dependencies":[]},{"name":"flutter_image_compress","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"flutter_native_image","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/","native_build":true,"dependencies":[]},{"name":"home_widget","path":"/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/","native_build":true,"dependencies":[]},{"name":"image_picker_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.7+4/","native_build":true,"dependencies":[]},{"name":"live_activities","path":"/Users/kima/.pub-cache/hosted/pub.dev/live_activities-1.7.4/","native_build":true,"dependencies":["app_group_directory","flutter_image_compress","flutter_native_image"]},{"name":"open_file","path":"/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"permission_handler_apple","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_apple-9.0.8/","native_build":true,"dependencies":[]},{"name":"quick_actions_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_ios-1.0.6/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"uni_links","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/","native_build":true,"dependencies":[]},{"name":"url_launcher_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.4/","native_build":true,"dependencies":[]},{"name":"workmanager","path":"/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/","native_build":true,"dependencies":[]}],"android":[{"name":"app_group_directory","path":"/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/","native_build":true,"dependencies":[]},{"name":"background_fetch","path":"/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/","native_build":true,"dependencies":[]},{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_custom_tabs","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/","native_build":true,"dependencies":[]},{"name":"flutter_displaymode","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_displaymode-0.6.0/","native_build":true,"dependencies":[]},{"name":"flutter_image_compress","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"flutter_native_image","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/","native_build":true,"dependencies":[]},{"name":"flutter_plugin_android_lifecycle","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/","native_build":true,"dependencies":[]},{"name":"home_widget","path":"/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/","native_build":true,"dependencies":[]},{"name":"image_picker_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_android-0.8.6+16/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"open_file","path":"/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/","native_build":true,"dependencies":[]},{"name":"permission_handler_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_android-10.2.1/","native_build":true,"dependencies":[]},{"name":"quick_actions_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_android-1.0.6/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"uni_links","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/","native_build":true,"dependencies":[]},{"name":"url_launcher_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.35/","native_build":true,"dependencies":[]},{"name":"workmanager","path":"/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/","native_build":true,"dependencies":[]}],"macos":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"macos_window_utils","path":"/Users/kima/.pub-cache/hosted/pub.dev/macos_window_utils-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"url_launcher_macos","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.5/","native_build":true,"dependencies":[]}],"linux":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":false,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_acrylic","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":false,"dependencies":[]},{"name":"path_provider_linux","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11/","native_build":false,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":false,"dependencies":["url_launcher_linux"]},{"name":"url_launcher_linux","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.5/","native_build":true,"dependencies":[]}],"windows":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_acrylic","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":false,"dependencies":[]},{"name":"path_provider_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.7/","native_build":false,"dependencies":[]},{"name":"permission_handler_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.2/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":["url_launcher_windows"]},{"name":"url_launcher_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.6/","native_build":true,"dependencies":[]}],"web":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","dependencies":[]},{"name":"flutter_custom_tabs_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs_web-1.0.0/","dependencies":["url_launcher_web"]},{"name":"image_picker_for_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_for_web-2.1.12/","dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","dependencies":["url_launcher_web"]},{"name":"uni_links_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links_web-0.1.0/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.17/","dependencies":[]}]},"dependencyGraph":[{"name":"app_group_directory","dependencies":[]},{"name":"background_fetch","dependencies":[]},{"name":"connectivity_plus","dependencies":[]},{"name":"dynamic_color","dependencies":[]},{"name":"file_picker","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_acrylic","dependencies":["macos_window_utils"]},{"name":"flutter_custom_tabs","dependencies":["flutter_custom_tabs_web"]},{"name":"flutter_custom_tabs_web","dependencies":["url_launcher_web"]},{"name":"flutter_displaymode","dependencies":[]},{"name":"flutter_image_compress","dependencies":[]},{"name":"flutter_local_notifications","dependencies":[]},{"name":"flutter_native_image","dependencies":[]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"home_widget","dependencies":[]},{"name":"image_picker","dependencies":["image_picker_android","image_picker_for_web","image_picker_ios"]},{"name":"image_picker_android","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"image_picker_for_web","dependencies":[]},{"name":"image_picker_ios","dependencies":[]},{"name":"live_activities","dependencies":["app_group_directory","flutter_image_compress","path_provider","flutter_native_image"]},{"name":"macos_window_utils","dependencies":[]},{"name":"open_file","dependencies":[]},{"name":"package_info_plus","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"permission_handler","dependencies":["permission_handler_android","permission_handler_apple","permission_handler_windows"]},{"name":"permission_handler_android","dependencies":[]},{"name":"permission_handler_apple","dependencies":[]},{"name":"permission_handler_windows","dependencies":[]},{"name":"quick_actions","dependencies":["quick_actions_android","quick_actions_ios"]},{"name":"quick_actions_android","dependencies":[]},{"name":"quick_actions_ios","dependencies":[]},{"name":"share_plus","dependencies":["url_launcher_web","url_launcher_windows","url_launcher_linux"]},{"name":"sqflite","dependencies":[]},{"name":"uni_links","dependencies":["uni_links_web"]},{"name":"uni_links_web","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_android","url_launcher_ios","url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_android","dependencies":[]},{"name":"url_launcher_ios","dependencies":[]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]},{"name":"workmanager","dependencies":[]}],"date_created":"2023-06-16 01:40:46.264387","version":"3.10.4"} \ No newline at end of file From c100a032d6525da876230e4ac6921b9396f3d20a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kiss?= <70794496+kimaah@users.noreply.github.com> Date: Wed, 23 Aug 2023 00:29:52 +0200 Subject: [PATCH 56/99] Delete .flutter-plugins 2 --- filcnaplo_kreta_api/.flutter-plugins 2 | 47 -------------------------- 1 file changed, 47 deletions(-) delete mode 100644 filcnaplo_kreta_api/.flutter-plugins 2 diff --git a/filcnaplo_kreta_api/.flutter-plugins 2 b/filcnaplo_kreta_api/.flutter-plugins 2 deleted file mode 100644 index 567e848c..00000000 --- a/filcnaplo_kreta_api/.flutter-plugins 2 +++ /dev/null @@ -1,47 +0,0 @@ -# This is a generated file; do not edit or check into version control. -app_group_directory=/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/ -background_fetch=/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/ -connectivity_plus=/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/ -dynamic_color=/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/ -file_picker=/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/ -flutter_acrylic=/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/ -flutter_custom_tabs=/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/ -flutter_custom_tabs_web=/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs_web-1.0.0/ -flutter_displaymode=/Users/kima/.pub-cache/hosted/pub.dev/flutter_displaymode-0.6.0/ -flutter_image_compress=/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/ -flutter_local_notifications=/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/ -flutter_native_image=/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/ -flutter_plugin_android_lifecycle=/Users/kima/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/ -home_widget=/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/ -image_picker=/Users/kima/.pub-cache/hosted/pub.dev/image_picker-0.8.7+5/ -image_picker_android=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_android-0.8.6+16/ -image_picker_for_web=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_for_web-2.1.12/ -image_picker_ios=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.7+4/ -live_activities=/Users/kima/.pub-cache/hosted/pub.dev/live_activities-1.7.4/ -macos_window_utils=/Users/kima/.pub-cache/hosted/pub.dev/macos_window_utils-1.1.3/ -open_file=/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/ -package_info_plus=/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/ -path_provider=/Users/kima/.pub-cache/hosted/pub.dev/path_provider-2.0.15/ -path_provider_android=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/ -path_provider_foundation=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/ -path_provider_linux=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11/ -path_provider_windows=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.7/ -permission_handler=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler-10.2.0/ -permission_handler_android=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_android-10.2.1/ -permission_handler_apple=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_apple-9.0.8/ -permission_handler_windows=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.2/ -quick_actions=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions-1.0.5/ -quick_actions_android=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_android-1.0.6/ -quick_actions_ios=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_ios-1.0.6/ -share_plus=/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/ -sqflite=/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/ -uni_links=/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/ -uni_links_web=/Users/kima/.pub-cache/hosted/pub.dev/uni_links_web-0.1.0/ -url_launcher=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher-6.1.11/ -url_launcher_android=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.35/ -url_launcher_ios=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.4/ -url_launcher_linux=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.5/ -url_launcher_macos=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.5/ -url_launcher_web=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.17/ -url_launcher_windows=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.6/ -workmanager=/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/ From de6ddb42ae63b152ca32081358ade0c69a854182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kiss?= <70794496+kimaah@users.noreply.github.com> Date: Wed, 23 Aug 2023 00:30:03 +0200 Subject: [PATCH 57/99] Delete .flutter-plugins-dependencies 2 --- filcnaplo_kreta_api/.flutter-plugins-dependencies 2 | 1 - 1 file changed, 1 deletion(-) delete mode 100644 filcnaplo_kreta_api/.flutter-plugins-dependencies 2 diff --git a/filcnaplo_kreta_api/.flutter-plugins-dependencies 2 b/filcnaplo_kreta_api/.flutter-plugins-dependencies 2 deleted file mode 100644 index 3e177648..00000000 --- a/filcnaplo_kreta_api/.flutter-plugins-dependencies 2 +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"app_group_directory","path":"/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/","native_build":true,"dependencies":[]},{"name":"background_fetch","path":"/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/","native_build":true,"dependencies":[]},{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","native_build":true,"dependencies":[]},{"name":"flutter_custom_tabs","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/","native_build":true,"dependencies":[]},{"name":"flutter_image_compress","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"flutter_native_image","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/","native_build":true,"dependencies":[]},{"name":"home_widget","path":"/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/","native_build":true,"dependencies":[]},{"name":"image_picker_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.7+4/","native_build":true,"dependencies":[]},{"name":"live_activities","path":"/Users/kima/.pub-cache/hosted/pub.dev/live_activities-1.7.4/","native_build":true,"dependencies":["app_group_directory","flutter_image_compress","flutter_native_image"]},{"name":"open_file","path":"/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"permission_handler_apple","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_apple-9.0.8/","native_build":true,"dependencies":[]},{"name":"quick_actions_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_ios-1.0.6/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"uni_links","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/","native_build":true,"dependencies":[]},{"name":"url_launcher_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.4/","native_build":true,"dependencies":[]},{"name":"workmanager","path":"/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/","native_build":true,"dependencies":[]}],"android":[{"name":"app_group_directory","path":"/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/","native_build":true,"dependencies":[]},{"name":"background_fetch","path":"/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/","native_build":true,"dependencies":[]},{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_custom_tabs","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/","native_build":true,"dependencies":[]},{"name":"flutter_displaymode","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_displaymode-0.6.0/","native_build":true,"dependencies":[]},{"name":"flutter_image_compress","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"flutter_native_image","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/","native_build":true,"dependencies":[]},{"name":"flutter_plugin_android_lifecycle","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/","native_build":true,"dependencies":[]},{"name":"home_widget","path":"/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/","native_build":true,"dependencies":[]},{"name":"image_picker_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_android-0.8.6+16/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"open_file","path":"/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/","native_build":true,"dependencies":[]},{"name":"permission_handler_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_android-10.2.1/","native_build":true,"dependencies":[]},{"name":"quick_actions_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_android-1.0.6/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"uni_links","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/","native_build":true,"dependencies":[]},{"name":"url_launcher_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.35/","native_build":true,"dependencies":[]},{"name":"workmanager","path":"/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/","native_build":true,"dependencies":[]}],"macos":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"macos_window_utils","path":"/Users/kima/.pub-cache/hosted/pub.dev/macos_window_utils-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"url_launcher_macos","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.5/","native_build":true,"dependencies":[]}],"linux":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":false,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_acrylic","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":false,"dependencies":[]},{"name":"path_provider_linux","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11/","native_build":false,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":false,"dependencies":["url_launcher_linux"]},{"name":"url_launcher_linux","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.5/","native_build":true,"dependencies":[]}],"windows":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_acrylic","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":false,"dependencies":[]},{"name":"path_provider_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.7/","native_build":false,"dependencies":[]},{"name":"permission_handler_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.2/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":["url_launcher_windows"]},{"name":"url_launcher_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.6/","native_build":true,"dependencies":[]}],"web":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","dependencies":[]},{"name":"flutter_custom_tabs_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs_web-1.0.0/","dependencies":["url_launcher_web"]},{"name":"image_picker_for_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_for_web-2.1.12/","dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","dependencies":["url_launcher_web"]},{"name":"uni_links_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links_web-0.1.0/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.17/","dependencies":[]}]},"dependencyGraph":[{"name":"app_group_directory","dependencies":[]},{"name":"background_fetch","dependencies":[]},{"name":"connectivity_plus","dependencies":[]},{"name":"dynamic_color","dependencies":[]},{"name":"file_picker","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_acrylic","dependencies":["macos_window_utils"]},{"name":"flutter_custom_tabs","dependencies":["flutter_custom_tabs_web"]},{"name":"flutter_custom_tabs_web","dependencies":["url_launcher_web"]},{"name":"flutter_displaymode","dependencies":[]},{"name":"flutter_image_compress","dependencies":[]},{"name":"flutter_local_notifications","dependencies":[]},{"name":"flutter_native_image","dependencies":[]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"home_widget","dependencies":[]},{"name":"image_picker","dependencies":["image_picker_android","image_picker_for_web","image_picker_ios"]},{"name":"image_picker_android","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"image_picker_for_web","dependencies":[]},{"name":"image_picker_ios","dependencies":[]},{"name":"live_activities","dependencies":["app_group_directory","flutter_image_compress","path_provider","flutter_native_image"]},{"name":"macos_window_utils","dependencies":[]},{"name":"open_file","dependencies":[]},{"name":"package_info_plus","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"permission_handler","dependencies":["permission_handler_android","permission_handler_apple","permission_handler_windows"]},{"name":"permission_handler_android","dependencies":[]},{"name":"permission_handler_apple","dependencies":[]},{"name":"permission_handler_windows","dependencies":[]},{"name":"quick_actions","dependencies":["quick_actions_android","quick_actions_ios"]},{"name":"quick_actions_android","dependencies":[]},{"name":"quick_actions_ios","dependencies":[]},{"name":"share_plus","dependencies":["url_launcher_web","url_launcher_windows","url_launcher_linux"]},{"name":"sqflite","dependencies":[]},{"name":"uni_links","dependencies":["uni_links_web"]},{"name":"uni_links_web","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_android","url_launcher_ios","url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_android","dependencies":[]},{"name":"url_launcher_ios","dependencies":[]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]},{"name":"workmanager","dependencies":[]}],"date_created":"2023-06-16 01:40:39.265210","version":"3.10.4"} \ No newline at end of file From 11ae42cb03c4bc06c6287e787512baeef3a8e1a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kiss?= <70794496+kimaah@users.noreply.github.com> Date: Wed, 23 Aug 2023 00:30:24 +0200 Subject: [PATCH 58/99] Delete .flutter-plugins 2 --- filcnaplo_mobile_ui/.flutter-plugins 2 | 47 -------------------------- 1 file changed, 47 deletions(-) delete mode 100644 filcnaplo_mobile_ui/.flutter-plugins 2 diff --git a/filcnaplo_mobile_ui/.flutter-plugins 2 b/filcnaplo_mobile_ui/.flutter-plugins 2 deleted file mode 100644 index 567e848c..00000000 --- a/filcnaplo_mobile_ui/.flutter-plugins 2 +++ /dev/null @@ -1,47 +0,0 @@ -# This is a generated file; do not edit or check into version control. -app_group_directory=/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/ -background_fetch=/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/ -connectivity_plus=/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/ -dynamic_color=/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/ -file_picker=/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/ -flutter_acrylic=/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/ -flutter_custom_tabs=/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/ -flutter_custom_tabs_web=/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs_web-1.0.0/ -flutter_displaymode=/Users/kima/.pub-cache/hosted/pub.dev/flutter_displaymode-0.6.0/ -flutter_image_compress=/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/ -flutter_local_notifications=/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/ -flutter_native_image=/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/ -flutter_plugin_android_lifecycle=/Users/kima/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/ -home_widget=/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/ -image_picker=/Users/kima/.pub-cache/hosted/pub.dev/image_picker-0.8.7+5/ -image_picker_android=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_android-0.8.6+16/ -image_picker_for_web=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_for_web-2.1.12/ -image_picker_ios=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.7+4/ -live_activities=/Users/kima/.pub-cache/hosted/pub.dev/live_activities-1.7.4/ -macos_window_utils=/Users/kima/.pub-cache/hosted/pub.dev/macos_window_utils-1.1.3/ -open_file=/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/ -package_info_plus=/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/ -path_provider=/Users/kima/.pub-cache/hosted/pub.dev/path_provider-2.0.15/ -path_provider_android=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/ -path_provider_foundation=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/ -path_provider_linux=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11/ -path_provider_windows=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.7/ -permission_handler=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler-10.2.0/ -permission_handler_android=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_android-10.2.1/ -permission_handler_apple=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_apple-9.0.8/ -permission_handler_windows=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.2/ -quick_actions=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions-1.0.5/ -quick_actions_android=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_android-1.0.6/ -quick_actions_ios=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_ios-1.0.6/ -share_plus=/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/ -sqflite=/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/ -uni_links=/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/ -uni_links_web=/Users/kima/.pub-cache/hosted/pub.dev/uni_links_web-0.1.0/ -url_launcher=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher-6.1.11/ -url_launcher_android=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.35/ -url_launcher_ios=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.4/ -url_launcher_linux=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.5/ -url_launcher_macos=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.5/ -url_launcher_web=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.17/ -url_launcher_windows=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.6/ -workmanager=/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/ From 7766832d5f022126b6e65eacef90819b5d65f825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kiss?= <70794496+kimaah@users.noreply.github.com> Date: Wed, 23 Aug 2023 00:30:35 +0200 Subject: [PATCH 59/99] Delete .flutter-plugins-dependencies 2 --- filcnaplo_mobile_ui/.flutter-plugins-dependencies 2 | 1 - 1 file changed, 1 deletion(-) delete mode 100644 filcnaplo_mobile_ui/.flutter-plugins-dependencies 2 diff --git a/filcnaplo_mobile_ui/.flutter-plugins-dependencies 2 b/filcnaplo_mobile_ui/.flutter-plugins-dependencies 2 deleted file mode 100644 index 4c40e824..00000000 --- a/filcnaplo_mobile_ui/.flutter-plugins-dependencies 2 +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"app_group_directory","path":"/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/","native_build":true,"dependencies":[]},{"name":"background_fetch","path":"/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/","native_build":true,"dependencies":[]},{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","native_build":true,"dependencies":[]},{"name":"flutter_custom_tabs","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/","native_build":true,"dependencies":[]},{"name":"flutter_image_compress","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"flutter_native_image","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/","native_build":true,"dependencies":[]},{"name":"home_widget","path":"/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/","native_build":true,"dependencies":[]},{"name":"image_picker_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.7+4/","native_build":true,"dependencies":[]},{"name":"live_activities","path":"/Users/kima/.pub-cache/hosted/pub.dev/live_activities-1.7.4/","native_build":true,"dependencies":["app_group_directory","flutter_image_compress","flutter_native_image"]},{"name":"open_file","path":"/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"permission_handler_apple","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_apple-9.0.8/","native_build":true,"dependencies":[]},{"name":"quick_actions_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_ios-1.0.6/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"uni_links","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/","native_build":true,"dependencies":[]},{"name":"url_launcher_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.4/","native_build":true,"dependencies":[]},{"name":"workmanager","path":"/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/","native_build":true,"dependencies":[]}],"android":[{"name":"app_group_directory","path":"/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/","native_build":true,"dependencies":[]},{"name":"background_fetch","path":"/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/","native_build":true,"dependencies":[]},{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_custom_tabs","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/","native_build":true,"dependencies":[]},{"name":"flutter_displaymode","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_displaymode-0.6.0/","native_build":true,"dependencies":[]},{"name":"flutter_image_compress","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"flutter_native_image","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/","native_build":true,"dependencies":[]},{"name":"flutter_plugin_android_lifecycle","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/","native_build":true,"dependencies":[]},{"name":"home_widget","path":"/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/","native_build":true,"dependencies":[]},{"name":"image_picker_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_android-0.8.6+16/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"open_file","path":"/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/","native_build":true,"dependencies":[]},{"name":"permission_handler_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_android-10.2.1/","native_build":true,"dependencies":[]},{"name":"quick_actions_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_android-1.0.6/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"uni_links","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/","native_build":true,"dependencies":[]},{"name":"url_launcher_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.35/","native_build":true,"dependencies":[]},{"name":"workmanager","path":"/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/","native_build":true,"dependencies":[]}],"macos":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"macos_window_utils","path":"/Users/kima/.pub-cache/hosted/pub.dev/macos_window_utils-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"url_launcher_macos","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.5/","native_build":true,"dependencies":[]}],"linux":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":false,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_acrylic","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":false,"dependencies":[]},{"name":"path_provider_linux","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11/","native_build":false,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":false,"dependencies":["url_launcher_linux"]},{"name":"url_launcher_linux","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.5/","native_build":true,"dependencies":[]}],"windows":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_acrylic","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":false,"dependencies":[]},{"name":"path_provider_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.7/","native_build":false,"dependencies":[]},{"name":"permission_handler_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.2/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":["url_launcher_windows"]},{"name":"url_launcher_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.6/","native_build":true,"dependencies":[]}],"web":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","dependencies":[]},{"name":"flutter_custom_tabs_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs_web-1.0.0/","dependencies":["url_launcher_web"]},{"name":"image_picker_for_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_for_web-2.1.12/","dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","dependencies":["url_launcher_web"]},{"name":"uni_links_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links_web-0.1.0/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.17/","dependencies":[]}]},"dependencyGraph":[{"name":"app_group_directory","dependencies":[]},{"name":"background_fetch","dependencies":[]},{"name":"connectivity_plus","dependencies":[]},{"name":"dynamic_color","dependencies":[]},{"name":"file_picker","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_acrylic","dependencies":["macos_window_utils"]},{"name":"flutter_custom_tabs","dependencies":["flutter_custom_tabs_web"]},{"name":"flutter_custom_tabs_web","dependencies":["url_launcher_web"]},{"name":"flutter_displaymode","dependencies":[]},{"name":"flutter_image_compress","dependencies":[]},{"name":"flutter_local_notifications","dependencies":[]},{"name":"flutter_native_image","dependencies":[]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"home_widget","dependencies":[]},{"name":"image_picker","dependencies":["image_picker_android","image_picker_for_web","image_picker_ios"]},{"name":"image_picker_android","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"image_picker_for_web","dependencies":[]},{"name":"image_picker_ios","dependencies":[]},{"name":"live_activities","dependencies":["app_group_directory","flutter_image_compress","path_provider","flutter_native_image"]},{"name":"macos_window_utils","dependencies":[]},{"name":"open_file","dependencies":[]},{"name":"package_info_plus","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"permission_handler","dependencies":["permission_handler_android","permission_handler_apple","permission_handler_windows"]},{"name":"permission_handler_android","dependencies":[]},{"name":"permission_handler_apple","dependencies":[]},{"name":"permission_handler_windows","dependencies":[]},{"name":"quick_actions","dependencies":["quick_actions_android","quick_actions_ios"]},{"name":"quick_actions_android","dependencies":[]},{"name":"quick_actions_ios","dependencies":[]},{"name":"share_plus","dependencies":["url_launcher_web","url_launcher_windows","url_launcher_linux"]},{"name":"sqflite","dependencies":[]},{"name":"uni_links","dependencies":["uni_links_web"]},{"name":"uni_links_web","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_android","url_launcher_ios","url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_android","dependencies":[]},{"name":"url_launcher_ios","dependencies":[]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]},{"name":"workmanager","dependencies":[]}],"date_created":"2023-06-16 01:40:42.923839","version":"3.10.4"} \ No newline at end of file From fb4e0f644a0bee7d1ffc6107948f9a53810e10c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kiss?= <70794496+kimaah@users.noreply.github.com> Date: Wed, 23 Aug 2023 00:30:48 +0200 Subject: [PATCH 60/99] Delete .flutter-plugins 2 --- filcnaplo_premium/.flutter-plugins 2 | 47 ---------------------------- 1 file changed, 47 deletions(-) delete mode 100644 filcnaplo_premium/.flutter-plugins 2 diff --git a/filcnaplo_premium/.flutter-plugins 2 b/filcnaplo_premium/.flutter-plugins 2 deleted file mode 100644 index 567e848c..00000000 --- a/filcnaplo_premium/.flutter-plugins 2 +++ /dev/null @@ -1,47 +0,0 @@ -# This is a generated file; do not edit or check into version control. -app_group_directory=/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/ -background_fetch=/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/ -connectivity_plus=/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/ -dynamic_color=/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/ -file_picker=/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/ -flutter_acrylic=/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/ -flutter_custom_tabs=/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/ -flutter_custom_tabs_web=/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs_web-1.0.0/ -flutter_displaymode=/Users/kima/.pub-cache/hosted/pub.dev/flutter_displaymode-0.6.0/ -flutter_image_compress=/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/ -flutter_local_notifications=/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/ -flutter_native_image=/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/ -flutter_plugin_android_lifecycle=/Users/kima/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/ -home_widget=/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/ -image_picker=/Users/kima/.pub-cache/hosted/pub.dev/image_picker-0.8.7+5/ -image_picker_android=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_android-0.8.6+16/ -image_picker_for_web=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_for_web-2.1.12/ -image_picker_ios=/Users/kima/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.7+4/ -live_activities=/Users/kima/.pub-cache/hosted/pub.dev/live_activities-1.7.4/ -macos_window_utils=/Users/kima/.pub-cache/hosted/pub.dev/macos_window_utils-1.1.3/ -open_file=/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/ -package_info_plus=/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/ -path_provider=/Users/kima/.pub-cache/hosted/pub.dev/path_provider-2.0.15/ -path_provider_android=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/ -path_provider_foundation=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/ -path_provider_linux=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11/ -path_provider_windows=/Users/kima/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.7/ -permission_handler=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler-10.2.0/ -permission_handler_android=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_android-10.2.1/ -permission_handler_apple=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_apple-9.0.8/ -permission_handler_windows=/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.2/ -quick_actions=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions-1.0.5/ -quick_actions_android=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_android-1.0.6/ -quick_actions_ios=/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_ios-1.0.6/ -share_plus=/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/ -sqflite=/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/ -uni_links=/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/ -uni_links_web=/Users/kima/.pub-cache/hosted/pub.dev/uni_links_web-0.1.0/ -url_launcher=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher-6.1.11/ -url_launcher_android=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.35/ -url_launcher_ios=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.4/ -url_launcher_linux=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.5/ -url_launcher_macos=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.5/ -url_launcher_web=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.17/ -url_launcher_windows=/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.6/ -workmanager=/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/ From 7bd5653a5fce563ee92b63f01d4c6c72a0710351 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kiss?= <70794496+kimaah@users.noreply.github.com> Date: Wed, 23 Aug 2023 00:30:55 +0200 Subject: [PATCH 61/99] Delete .flutter-plugins-dependencies 2 --- filcnaplo_premium/.flutter-plugins-dependencies 2 | 1 - 1 file changed, 1 deletion(-) delete mode 100644 filcnaplo_premium/.flutter-plugins-dependencies 2 diff --git a/filcnaplo_premium/.flutter-plugins-dependencies 2 b/filcnaplo_premium/.flutter-plugins-dependencies 2 deleted file mode 100644 index bc1819f4..00000000 --- a/filcnaplo_premium/.flutter-plugins-dependencies 2 +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"app_group_directory","path":"/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/","native_build":true,"dependencies":[]},{"name":"background_fetch","path":"/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/","native_build":true,"dependencies":[]},{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","native_build":true,"dependencies":[]},{"name":"flutter_custom_tabs","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/","native_build":true,"dependencies":[]},{"name":"flutter_image_compress","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"flutter_native_image","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/","native_build":true,"dependencies":[]},{"name":"home_widget","path":"/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/","native_build":true,"dependencies":[]},{"name":"image_picker_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.7+4/","native_build":true,"dependencies":[]},{"name":"live_activities","path":"/Users/kima/.pub-cache/hosted/pub.dev/live_activities-1.7.4/","native_build":true,"dependencies":["app_group_directory","flutter_image_compress","flutter_native_image"]},{"name":"open_file","path":"/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"permission_handler_apple","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_apple-9.0.8/","native_build":true,"dependencies":[]},{"name":"quick_actions_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_ios-1.0.6/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"uni_links","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/","native_build":true,"dependencies":[]},{"name":"url_launcher_ios","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.4/","native_build":true,"dependencies":[]},{"name":"workmanager","path":"/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/","native_build":true,"dependencies":[]}],"android":[{"name":"app_group_directory","path":"/Users/kima/.pub-cache/hosted/pub.dev/app_group_directory-2.0.0/","native_build":true,"dependencies":[]},{"name":"background_fetch","path":"/Users/kima/.pub-cache/hosted/pub.dev/background_fetch-1.1.6/","native_build":true,"dependencies":[]},{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_custom_tabs","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs-1.0.4/","native_build":true,"dependencies":[]},{"name":"flutter_displaymode","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_displaymode-0.6.0/","native_build":true,"dependencies":[]},{"name":"flutter_image_compress","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_image_compress-1.1.3/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"flutter_native_image","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_native_image-0.0.6+1/","native_build":true,"dependencies":[]},{"name":"flutter_plugin_android_lifecycle","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/","native_build":true,"dependencies":[]},{"name":"home_widget","path":"/Users/kima/.pub-cache/hosted/pub.dev/home_widget-0.1.6/","native_build":true,"dependencies":[]},{"name":"image_picker_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_android-0.8.6+16/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"open_file","path":"/Users/kima/.pub-cache/git/open_file-0ee6d69b5810e066ceb23776cea3716749038669/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/","native_build":true,"dependencies":[]},{"name":"permission_handler_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_android-10.2.1/","native_build":true,"dependencies":[]},{"name":"quick_actions_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/quick_actions_android-1.0.6/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"uni_links","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links-0.5.1/","native_build":true,"dependencies":[]},{"name":"url_launcher_android","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.35/","native_build":true,"dependencies":[]},{"name":"workmanager","path":"/Users/kima/.pub-cache/hosted/pub.dev/workmanager-0.5.1/","native_build":true,"dependencies":[]}],"macos":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_local_notifications","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_local_notifications-14.1.0/","native_build":true,"dependencies":[]},{"name":"macos_window_utils","path":"/Users/kima/.pub-cache/hosted/pub.dev/macos_window_utils-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/kima/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/","native_build":true,"dependencies":[]},{"name":"url_launcher_macos","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.5/","native_build":true,"dependencies":[]}],"linux":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":false,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_acrylic","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":false,"dependencies":[]},{"name":"path_provider_linux","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11/","native_build":false,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":false,"dependencies":["url_launcher_linux"]},{"name":"url_launcher_linux","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.5/","native_build":true,"dependencies":[]}],"windows":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"/Users/kima/.pub-cache/hosted/pub.dev/dynamic_color-1.6.5/","native_build":true,"dependencies":[]},{"name":"flutter_acrylic","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_acrylic-1.1.3/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","native_build":false,"dependencies":[]},{"name":"path_provider_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.7/","native_build":false,"dependencies":[]},{"name":"permission_handler_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.2/","native_build":true,"dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","native_build":true,"dependencies":["url_launcher_windows"]},{"name":"url_launcher_windows","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.6/","native_build":true,"dependencies":[]}],"web":[{"name":"connectivity_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/connectivity_plus-4.0.1/","dependencies":[]},{"name":"file_picker","path":"/Users/kima/.pub-cache/hosted/pub.dev/file_picker-5.3.2/","dependencies":[]},{"name":"flutter_custom_tabs_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/flutter_custom_tabs_web-1.0.0/","dependencies":["url_launcher_web"]},{"name":"image_picker_for_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/image_picker_for_web-2.1.12/","dependencies":[]},{"name":"package_info_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/package_info_plus-4.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/kima/.pub-cache/hosted/pub.dev/share_plus-7.0.2/","dependencies":["url_launcher_web"]},{"name":"uni_links_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/uni_links_web-0.1.0/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/kima/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.17/","dependencies":[]}]},"dependencyGraph":[{"name":"app_group_directory","dependencies":[]},{"name":"background_fetch","dependencies":[]},{"name":"connectivity_plus","dependencies":[]},{"name":"dynamic_color","dependencies":[]},{"name":"file_picker","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_acrylic","dependencies":["macos_window_utils"]},{"name":"flutter_custom_tabs","dependencies":["flutter_custom_tabs_web"]},{"name":"flutter_custom_tabs_web","dependencies":["url_launcher_web"]},{"name":"flutter_displaymode","dependencies":[]},{"name":"flutter_image_compress","dependencies":[]},{"name":"flutter_local_notifications","dependencies":[]},{"name":"flutter_native_image","dependencies":[]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"home_widget","dependencies":[]},{"name":"image_picker","dependencies":["image_picker_android","image_picker_for_web","image_picker_ios"]},{"name":"image_picker_android","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"image_picker_for_web","dependencies":[]},{"name":"image_picker_ios","dependencies":[]},{"name":"live_activities","dependencies":["app_group_directory","flutter_image_compress","path_provider","flutter_native_image"]},{"name":"macos_window_utils","dependencies":[]},{"name":"open_file","dependencies":[]},{"name":"package_info_plus","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"permission_handler","dependencies":["permission_handler_android","permission_handler_apple","permission_handler_windows"]},{"name":"permission_handler_android","dependencies":[]},{"name":"permission_handler_apple","dependencies":[]},{"name":"permission_handler_windows","dependencies":[]},{"name":"quick_actions","dependencies":["quick_actions_android","quick_actions_ios"]},{"name":"quick_actions_android","dependencies":[]},{"name":"quick_actions_ios","dependencies":[]},{"name":"share_plus","dependencies":["url_launcher_web","url_launcher_windows","url_launcher_linux"]},{"name":"sqflite","dependencies":[]},{"name":"uni_links","dependencies":["uni_links_web"]},{"name":"uni_links_web","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_android","url_launcher_ios","url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_android","dependencies":[]},{"name":"url_launcher_ios","dependencies":[]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]},{"name":"workmanager","dependencies":[]}],"date_created":"2023-06-16 01:40:49.613049","version":"3.10.4"} \ No newline at end of file From bad9ed000b049561cc6facb3f0178b13432116fb Mon Sep 17 00:00:00 2001 From: Kima Date: Fri, 25 Aug 2023 23:20:22 +0200 Subject: [PATCH 62/99] 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 1a197721..e7d7bbe0 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 a298c9a4..00000000 --- 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 0a05323a..00000000 --- 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 0314e405..00000000 --- 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 2fb810e9..ff22fb76 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 00000000..a298c9a4 --- /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 00000000..0a05323a --- /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 00000000..0314e405 --- /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 zcmeAS@N?(olHy`uVBq!ia0y~yVDM&OVDR8zV_;y|cZVwF;yxw{Z!k@`m=Vsw9f3^vOGsab6M^UTjNJZ zzPVlHn7n!Z)w0VXHXC?DW~3k02@cdb)$;a$iRk@Sv45QfGd?-b;@`hPw#Foe`&{+W z316=jygjt-!^r|)4i}9`tM%H4rcCeI&vSiKYRJ?j-*1>NJ*s+5X2pj5Kc%4}Y7U)T zp7+hB^h?!SPw`L`e9tVBqgW$w==Q})44nZ6d9q$dJ9li0aORxd++SK{m71?9ELyl@ zb8VvXYu%3mr&Y8o(ry{4BI?W+RXNHLNt5X86MEs|8&$3|GS6RTd zX3x?;XTQwcuuW!WgVgt%tbf=2V3zo@dTaj%PnTYSJLz0`H~D;I*Q>mn$*6WH&G&4Y zOY6?f&6Dd5HKkfLcYWq-O1~<0zBO@9(JfXjiKmT5ibu9CR$}}<(aSD4ZqL%Z#j5LMud$wf`ryCX zy$$?RN`rPJF63L&@p@vQ-;~BSli!n@-dxyH)Y)RX`nH4Qn@~*+FJLW z7Mm?{u-3S`zX*??f9`SU&e;e52^T)un%~B67W3kJ^DNsxvj6R} z%uO6@zW2W8wY!`iq2F?~*80!YzbnoQX4m?v@2`3%{41R=D!ui1+2s>fljl_lUaP;D zdFqjp*zb4~janm-6;?lIn!LH;=5&GW_RhZLAH6So-4MEOtyq_>>A5j}!|wvge5yzi(;esVN%iuU3M+$_E=s}px6$}&Hg{?Kmvi`wN2 z@BCY}PdP7$f5*cv>$Lu7^xG{=c8m_VR<^GAsU+ruP@i`4+|O{M7bxMdA7> zH|4hdh`V%7Q0hn7f6JhQThTN8BTr}b-b~Fj^+)OpJw%?^-Ird zl}S#1|9)H4fiX| - - - - - - - \ 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 293a93c4..00000000 --- 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 67e425a4..00000000 --- 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 67e425a4..00000000 --- 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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 KelF{r5}E*mD*s;q 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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 VOI9v?uM1k6;pyt_*@!Sw(D 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 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 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 3a78eed5..00000000 --- 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 63/99] 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 e7d7bbe0..14d49f3b 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 147157ae..9ce41ddc 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 01a5f909..18641745 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 6b2a7f8f..aa23af88 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 e10fda18..69b80b06 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" />