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 296d39d..9638084 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 c2cec50..a098548 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 3a38554..0e2df02 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 e338f57..37bede3 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 f2b8096..96a3bf2 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 5218f52..a31c6a6 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 7032313..8cbfb9e 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 0f03f3b..7828bc3 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 ecb5348..c2c9479 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 0fcfb27..4894d34 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 c5541e6..c8808fe 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 53df988..c6b190d 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 b499a03..12a3ccd 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 cc8e6ee..11b7a43 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 b682808..fdd35d1 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 7a5ffc8..62e8f83 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 3077bb6..eb31124 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 9b7b88a..0b328cb 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 3a947e3..c710a23 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 4ceed6d..03afda9 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 7f6a325..40b56ce 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 93410a8..ca4e26a 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 98bcb65..cab1577 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 28c052f..933dd38 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 5a3fe0a..7d6448f 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 76c01d1..7de5d5e 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 c7df96a..2220ec3 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 8126d58..eb59939 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 2220ec3..80bf7c4 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 eb59939..ae7f40d 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 a260e28..a638637 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 0e2df02..9f3b2fd 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 a859479..9910d60 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 123fc6c..36e7279 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 9f62e1e..9f5c788 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 4ed678f..53b8712 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 5cf60ff..23ad74a 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 b58cd31..f447a73 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 21eaa51..0f97f62 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 8b97db2..db5e22d 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 96a3bf2..332b0da 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 4894d34..0fcfb27 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 c8808fe..c5541e6 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 c6b190d..53df988 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 eb31124..aed3234 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 78639a7..308e4e7 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 ddfc58b..fa91b41 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 8906afc..7900af4 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 62e8f83..42cfd29 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 9f3b2fd..02ec3a8 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 c1cfcb6..ff0eb05 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 9f5c788..a7ad317 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 aed3234..e2effb0 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 23ad74a..d21ace1 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 0f118fb..b38a18a 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 02ec3a8..c17bf08 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 08dfd60..4c41fc3 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 36e7279..123fc6c 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 b38a18a..0f118fb 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 332b0da..997195e 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 0fcfb27..4894d34 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 c5541e6..c8808fe 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 53df988..c6b190d 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 e2effb0..d996d56 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 308e4e7..34c6e8b 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 cab1577..cd21ae1 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 0000000..3be7928 --- /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 874daa0..b795100 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 0000000..e1e5847 --- /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 0000000..77cf62f --- /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 4894d34..0fcfb27 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 c8808fe..c5541e6 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 c6b190d..53df988 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 6b32339..ea0a06c 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 d996d56..bb8afff 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 cd21ae1..110bf11 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 b795100..98fa41b 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 bb8afff..fc8e6de 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 110bf11..c4e7a2b 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 fc8e6de..01a14ce 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 c4e7a2b..9243f77 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 0000000..d44c5e3 --- /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 98fa41b..46a4f96 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 997195e..03bb6ee 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 ff618bc..987426b 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 e9a3541..117db86 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 03bb6ee..a33946a 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 7828bc3..c0589d7 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 7de5d5e..1bad1b4 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 34c6e8b..658fcaa 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 0000000..d265bba --- /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 9243f77..9deab81 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 3be7928..5e6394a 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 d44c5e3..d91ccc7 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 46a4f96..c3cedc9 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 d265bba..c56a6e6 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 c3cedc9..6f7a82f 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 0000000..703917a --- /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 0000000..e166414 --- /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 c56a6e6..d7d03b5 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 5e6394a..f9eb459 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 933dd38..d54b69b 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 zcmeHOe^8U>9e-`LY9}z)V~Q4V*LD4)r=q772qfrS(e(yB&sGt}k9L5JCMk;{u#kjX zduFy(x?T&e0&)FCcLstA?`wb%H0_wCBx=r3c@xq!gTP`EBqRazYtQ?;k*t_7srmXKjkE|87RIL$esN$vTgfm44|`Td#Gp|4e5nP{1$ zw6$Bo3jM{clA7I8U%i)orC%=a#fZ)XOIe>{{z|<-?LDu_9aidN9aEX?8Kcx3kgjJq zOOInUja<<&#r51^((ojQrs)cK>}<<`)U1+nu~3Z~3%>oHu|h9Y%Sxl34SnlWON&Nc zo=UcLd{in>i=AR)5kMP3^p%b#-lN3mhfmc!Li8z@o*}w-AJ&u;B{30{K?()ggDMNU z1O9jIy%?vgnOI&-FUCLsZJ^{+a2*4jEIfgdoo`EvAN>)XCtgAbd=QuOhNFm4#yb-$ ziT)oeByf5nGQD3k-cPe94o=Ke5cnZ_@A&VlQs6NDL&$tM4*SM{GSK+tgcyZ_e)%?S z3bQ+rnAN%k#>&*Mp0063lf*+g&Ytz~$y)OhMF02Ibb@oWPe!KqjfVWFHk;bdp}ZJ2 z+{>pe7~I1Iw&DL`-8==QIb3ztZWJc}n^nURRxQ-F0jyF|TUq2tRKCVPYxgoKo}o%e zvhXJsA;AT%jM_3I!HOZztcI@GG~n{zPKGktaK3eXBG67-MNIpKGzu3BK6vHLY@*+g zIlYwVe;1j4cQo3}E}Q@jkvg3=vwF@av7o+1rMljR(u^hV(CSd{oZm%vh;?o#e)|Ol zw>g@#Qqrv=;jkNMPRPg&&qrtlAo;&`m319m34PbTJI!t4ekN%a3k7T}9d2R>_2Ovy zvZuJX8nW!5X*kt8n$p6oqlhMEwy5$hSsh7G)N-0v(+%JF$B4fL5P2YX^Su_Exx-HF zS!W>cL#w|WqMUjHg1>KRX0J?@!QVMP_9@D~{HIAF{EV2Ae?e{iW^stgt^YM2<3c^Ye zOB=8>I7QO}TtvG0Oc9g6F6?j=-`}nBy;psGKN1D$DJm~$j=_}?k?Qg7nc-Q`_$Ow)0dI0pQp53DgMb9dFV_0 z@#;^!hYL^?oz8(D(f_DafdWzi^#NJ+)lm{MfG-q;dJ`OQ{q)Zlkq)fIJw^Yi-5Yi2 ztmf09x}r^H4sR`iR&8e!-)e-oeGw@g0UYj^w0BkAfCB8L6ky;+swe>>96bQ*ClKSX zZ&a0tBxG603bb3LjRt#Cxlr{g}~cm^Q@2vScCCI$XU2 zio4|@pWB;{l<311;l)XAC{JZoK{%yOqkG~NI7}tgTG*2c3h+&R0JT#`DQKEct2Jf# zY`kcR#EW+YdH2}22bluf7^Fk|ZN4MvJvS>Ea1ymRoqBgLh3O*`fi}J}qOTU}Ts6pa zh2jY!fkT}`3l+-S%6C%5-BcA6$D^b-~OE*#uXvE8nh;1%Fv zi4U&=51Y8ANlTSl)SoM)l^>kh=oCGskl?&Vu&hH5oIfgtZ{MU8OOIft-jN2dl4D~j zjlLY!@S*0C*6x63qwM-yLWx!WhBD1t9NLPpZxp;Q^MQ*rp@COF@cBi#<~7G#z^xdi zNenK-l(y0W*MeIxXBoIJ { 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 0f53014..aa3919d 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 aa3919d..8a6f242 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 0000000..a207586 --- /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 8a6f242..31cd4b9 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 d54b69b..41d2bda 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 197cd6a..eaf87ed 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 d21ace1..6c1db7b 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 0000000..9df12a8 --- /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 d7d03b5..f7d9966 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 9deab81..c84a23c 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 41d2bda..8782272 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 eaf87ed..e518617 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 8782272..a7a02ad 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 e518617..ced8ee0 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 a7a02ad..14eb19d 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 c84a23c..8512b0a 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 4a8c32f..fc7ebcd 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 f7d9966..e20282d 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 8512b0a..3153ab0 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 f9eb459..7e3d872 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 14eb19d..e67f4b8 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 d91ccc7..20ff340 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 6f7a82f..76ca49d 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 fc7ebcd..9256680 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 31cd4b9..888170c 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 a207586..9c2d2b1 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 6c1db7b..3e9cbc2 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 01a14ce..94840aa 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 3153ab0..f37a887 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 7e3d872..602cb8c 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 e67f4b8..7702c7a 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 20ff340..90e807c 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 76ca49d..7798761 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 602cb8c..cd7c248 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 9256680..20ae4eb 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 e20282d..c755987 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 f37a887..5b75cbb 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 c755987..e5132c2 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 2877685..1a19772 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 2199124..5aec576 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 3e9cbc2..183792a 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 888170c..a6dec8e 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 ebe4e24..6b7daaf 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 183792a..5cd1e2d 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 0000000..a4b75df --- /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 0000000..d492d0d --- /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 0000000..51b3032 --- /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 0000000..b25e363 --- /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 0000000..6da0652 --- /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 0000000..2847838 --- /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 0000000..66a65d1 --- /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 zcmV)#K##uw00962000000096X0C8jh02TlM0EtjeM-2)Z3IG5A4M|8uQUCw}00001 z00;&E003NasAd2FWH?DgK~#9!?Y()tWo3Ei`+e5l=bW0Ws49vA3M>i`0c})7MrQ$y z>5gXVzR7L7qlr<2KyGfw3^#)&h$h`>O=!){r*CqTPqcHBj*_UY42lTIq$rWO1PZF4 z2B<2ixz0IzJ@=2b_t|@`^$yRw_9-}3?B%EA>@~jYUGMMrKJzP#wmG*g{_sCD|KtPg zd0-)`+TE+r{Zk~*P+6EOOF>rv$AGQ|jzu{JbQQ1y)n&j^g@vfj113Pnfi_ATRJ!+8 zRi=Sy&`IDRst15Qz%EpuQ`io=4cLmZ8FUNiR$x2uJgR#Y$@}e8dJWdck4H}4$n@X+ z!sz49u}wx@@ZxR@e(7rnIf$V70M=E>TAJk@76C_tu0dG`oD8}aSc9@k(W8Kcp!2%G zmNE!?e-02yZyVS*^JnjPg?I+FF^T|ZXdlN89rz5ml`67y0{8Z3asd6UhslXc0qfizU z-%JOv=mT#5ZzlohAQ^-Rp!iz@*Y0USe zkMAE1kP!hKdE5LCT*tTy)6xe^C(p>FvjkWRdKPdFs%KHm@GF4{^#H9uD-VFw1x_6} z!$bhCV~GUdxVHPpLEu?ceH6GCxEu6dlnou#T`lRqM@QO><&#W(@dKm5Ga`V)b6fDs z*P|^Z>tur<7)Lol;WeNa3cOxbPX$&0Srw!)0&q(JWdi8$YAONLQ~(bF=)i9Ovj*Cd zgKkGz58MTMEAV~LjjBxbF3hK<$l7i4FOA4xL;!PqTlAqDnONH9;Lc7LR0_fZR8Irm z0K5g&*8s;UIz~Y3)`-qtKF58JbOP`^t408o=T^x`J*4F&H3gUgo<{W^;9Cl}fIf_} zZ>EittB~<+BQh8fz}(pu{?heGt5u9)>5Xt%0D8KjZ$r5l^wq%162Kkcr~=C`mU~nH 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 KMNUMnLSTZnkCXQR literal 0 HcmV?d00001 diff --git a/filcnaplo/windows/runner/runner.exe.manifest b/filcnaplo/windows/runner/runner.exe.manifest new file mode 100644 index 0000000..a42ea76 --- /dev/null +++ b/filcnaplo/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/filcnaplo/windows/runner/utils.cpp b/filcnaplo/windows/runner/utils.cpp new file mode 100644 index 0000000..b2b0873 --- /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 0000000..3879d54 --- /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 0000000..60608d0 --- /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 0000000..e901dde --- /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 d0cc653..edfc433 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 b673689..8d6e5fb 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 0815557..1c0f5fa 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 0000000..43cfb8a --- /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 83504f6..aef41ff 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 676f882..2a1645a 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 9207f72..8ba3974 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 6b7daaf..bd1207f 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!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM 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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 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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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/filcnaplo/web/icons/Icon-maskable-512.png b/filcnaplo/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 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 MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/filcnaplo/web/index.html b/filcnaplo/web/index.html new file mode 100644 index 0000000..d806e3c --- /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 0000000..d43c553 --- /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 efc5414..581b4a0 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 a31c6a6..bce6d24 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 a7ad317..b33cc5e 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 5cd1e2d..ef1dffd 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 b33cc5e..9ceab63 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 a4b75df..1b85968 100644 --- a/filcnaplo/test/widget_test.dart +++ b/filcnaplo/test/widget_test.dart @@ -1,30 +1,30 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. +// // This is a basic Flutter widget test. +// // +// // To perform an interaction with a widget in your test, use the WidgetTester +// // utility in the flutter_test package. For example, you can send tap and scroll +// // gestures. You can also use WidgetTester to find child widgets in the widget +// // tree, read text, and verify that the values of widget properties are correct. -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; +// import 'package:flutter/material.dart'; +// import 'package:flutter_test/flutter_test.dart'; -import 'package:filcnaplo/main.dart'; +// import 'package:filcnaplo/main.dart'; -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); +// void main() { +// testWidgets('Counter increments smoke test', (WidgetTester tester) async { +// // Build our app and trigger a frame. +// await tester.pumpWidget(const MyApp()); - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); +// // Verify that our counter starts at 0. +// expect(find.text('0'), findsOneWidget); +// expect(find.text('1'), findsNothing); - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); +// // Tap the '+' icon and trigger a frame. +// await tester.tap(find.byIcon(Icons.add)); +// await tester.pump(); - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -} +// // Verify that our counter has incremented. +// expect(find.text('0'), findsNothing); +// expect(find.text('1'), findsOneWidget); +// }); +// } diff --git a/filcnaplo_kreta_api/lib/client/api.dart b/filcnaplo_kreta_api/lib/client/api.dart index 6371b17..93146d9 100644 --- a/filcnaplo_kreta_api/lib/client/api.dart +++ b/filcnaplo_kreta_api/lib/client/api.dart @@ -7,39 +7,69 @@ class KretaAPI { static const clientId = "kreta-ellenorzo-mobile-android"; // ELLENORZO API - static String notes(String iss) => BaseKreta.kreta(iss) + KretaApiEndpoints.notes; - static String events(String iss) => BaseKreta.kreta(iss) + KretaApiEndpoints.events; - static String student(String iss) => BaseKreta.kreta(iss) + KretaApiEndpoints.student; - static String grades(String iss) => BaseKreta.kreta(iss) + KretaApiEndpoints.grades; - static String absences(String iss) => BaseKreta.kreta(iss) + KretaApiEndpoints.absences; - static String groups(String iss) => BaseKreta.kreta(iss) + KretaApiEndpoints.groups; + static String notes(String iss) => + BaseKreta.kreta(iss) + KretaApiEndpoints.notes; + static String events(String iss) => + BaseKreta.kreta(iss) + KretaApiEndpoints.events; + static String student(String iss) => + BaseKreta.kreta(iss) + KretaApiEndpoints.student; + static String grades(String iss) => + BaseKreta.kreta(iss) + KretaApiEndpoints.grades; + static String absences(String iss) => + BaseKreta.kreta(iss) + KretaApiEndpoints.absences; + static String groups(String iss) => + BaseKreta.kreta(iss) + KretaApiEndpoints.groups; static String groupAverages(String iss, String uid) => - BaseKreta.kreta(iss) + KretaApiEndpoints.groupAverages + "?oktatasiNevelesiFeladatUid=" + uid; + BaseKreta.kreta(iss) + + KretaApiEndpoints.groupAverages + + "?oktatasiNevelesiFeladatUid=" + + uid; static String timetable(String iss, {DateTime? start, DateTime? end}) => BaseKreta.kreta(iss) + KretaApiEndpoints.timetable + - (start != null && end != null ? "?datumTol=" + start.toUtc().toIso8601String() + "&datumIg=" + end.toUtc().toIso8601String() : ""); - static String exams(String iss) => BaseKreta.kreta(iss) + KretaApiEndpoints.exams; + (start != null && end != null + ? "?datumTol=" + + start.toUtc().toIso8601String() + + "&datumIg=" + + end.toUtc().toIso8601String() + : ""); + static String exams(String iss) => + BaseKreta.kreta(iss) + KretaApiEndpoints.exams; static String homework(String iss, {DateTime? start, String? id}) => BaseKreta.kreta(iss) + KretaApiEndpoints.homework + (id != null ? "/$id" : "") + - (id == null && start != null ? "?datumTol=" + DateFormat('yyyy-MM-dd').format(start) : ""); - static String capabilities(String iss) => BaseKreta.kreta(iss) + KretaApiEndpoints.capabilities; - static String downloadHomeworkAttachments(String iss, String uid, String type) => - BaseKreta.kreta(iss) + KretaApiEndpoints.downloadHomeworkAttachments(uid, type); + (id == null && start != null + ? "?datumTol=" + DateFormat('yyyy-MM-dd').format(start) + : ""); + static String capabilities(String iss) => + BaseKreta.kreta(iss) + KretaApiEndpoints.capabilities; + static String downloadHomeworkAttachments( + String iss, String uid, String type) => + BaseKreta.kreta(iss) + + KretaApiEndpoints.downloadHomeworkAttachments(uid, type); // ADMIN API - static const sendMessage = BaseKreta.kretaAdmin + KretaAdminEndpoints.sendMessage; - static String messages(String endpoint) => BaseKreta.kretaAdmin + KretaAdminEndpoints.messages(endpoint); - static String message(String id) => BaseKreta.kretaAdmin + KretaAdminEndpoints.message(id); - static const recipientCategories = BaseKreta.kretaAdmin + KretaAdminEndpoints.recipientCategories; - static const availableCategories = BaseKreta.kretaAdmin + KretaAdminEndpoints.availableCategories; - static const recipientsTeacher = BaseKreta.kretaAdmin + KretaAdminEndpoints.recipientsTeacher; - static const uploadAttachment = BaseKreta.kretaAdmin + KretaAdminEndpoints.uploadAttachment; - static String downloadAttachment(String id) => BaseKreta.kretaAdmin + KretaAdminEndpoints.downloadAttachment(id); - static const trashMessage = BaseKreta.kretaAdmin + KretaAdminEndpoints.trashMessage; - static const deleteMessage = BaseKreta.kretaAdmin + KretaAdminEndpoints.deleteMessage; + static const sendMessage = + BaseKreta.kretaAdmin + KretaAdminEndpoints.sendMessage; + static String messages(String endpoint) => + BaseKreta.kretaAdmin + KretaAdminEndpoints.messages(endpoint); + static String message(String id) => + BaseKreta.kretaAdmin + KretaAdminEndpoints.message(id); + static const recipientCategories = + BaseKreta.kretaAdmin + KretaAdminEndpoints.recipientCategories; + static const availableCategories = + BaseKreta.kretaAdmin + KretaAdminEndpoints.availableCategories; + static const recipientsTeacher = + BaseKreta.kretaAdmin + KretaAdminEndpoints.recipientsTeacher; + static const uploadAttachment = + BaseKreta.kretaAdmin + KretaAdminEndpoints.uploadAttachment; + static String downloadAttachment(String id) => + BaseKreta.kretaAdmin + KretaAdminEndpoints.downloadAttachment(id); + static const trashMessage = + BaseKreta.kretaAdmin + KretaAdminEndpoints.trashMessage; + static const deleteMessage = + BaseKreta.kretaAdmin + KretaAdminEndpoints.deleteMessage; } class BaseKreta { @@ -58,25 +88,30 @@ class KretaApiEndpoints { static const grades = "/ellenorzo/V3/Sajat/Ertekelesek"; static const absences = "/ellenorzo/V3/Sajat/Mulasztasok"; static const groups = "/ellenorzo/V3/Sajat/OsztalyCsoportok"; - static const groupAverages = "/ellenorzo/V3/Sajat/Ertekelesek/Atlagok/OsztalyAtlagok"; + static const groupAverages = + "/ellenorzo/V3/Sajat/Ertekelesek/Atlagok/OsztalyAtlagok"; static const timetable = "/ellenorzo/V3/Sajat/OrarendElemek"; static const exams = "/ellenorzo/V3/Sajat/BejelentettSzamonkeresek"; static const homework = "/ellenorzo/V3/Sajat/HaziFeladatok"; // static const homeworkDone = "/ellenorzo/V3/Sajat/HaziFeladatok/Megoldva"; // Removed from the API static const capabilities = "/ellenorzo/V3/Sajat/Intezmenyek"; - static String downloadHomeworkAttachments(String uid, String type) => "/ellenorzo/V3/Sajat/Csatolmany/$uid"; + static String downloadHomeworkAttachments(String uid, String type) => + "/ellenorzo/V3/Sajat/Csatolmany/$uid"; } class KretaAdminEndpoints { //static const messages = "/api/v1/kommunikacio/postaladaelemek/sajat"; static const sendMessage = "/api/v1/kommunikacio/uzenetek"; - static String messages(String endpoint) => "/api/v1/kommunikacio/postaladaelemek/$endpoint"; - static String message(String id) => "/api/v1/kommunikacio/postaladaelemek/$id"; + static String messages(String endpoint) => + "/api/v1/kommunikacio/postaladaelemek/$endpoint"; + static String message(String id) => + "/api/v1/kommunikacio/postaladaelemek/$id"; static const recipientCategories = "/api/v1/adatszotarak/cimzetttipusok"; static const availableCategories = "/api/v1/kommunikacio/cimezhetotipusok"; static const recipientsTeacher = "/api/v1/kreta/alkalmazottak/tanar"; static const uploadAttachment = "/ideiglenesfajlok"; - static String downloadAttachment(String id) => "/api/v1/dokumentumok/uzenetek/$id"; + static String downloadAttachment(String id) => + "/api/v1/dokumentumok/uzenetek/$id"; static const trashMessage = "/api/v1/kommunikacio/postaladaelemek/kuka"; static const deleteMessage = "/api/v1/kommunikacio/postaladaelemek/torles"; } diff --git a/filcnaplo_kreta_api/lib/client/client.dart b/filcnaplo_kreta_api/lib/client/client.dart index 9910d60..d980d0f 100644 --- a/filcnaplo_kreta_api/lib/client/client.dart +++ b/filcnaplo_kreta_api/lib/client/client.dart @@ -66,8 +66,10 @@ class KretaClient { for (int i = 0; i < 3; i++) { if (autoHeader) { - if (!headerMap.containsKey("authorization") && accessToken != null) headerMap["authorization"] = "Bearer $accessToken"; - if (!headerMap.containsKey("user-agent") && userAgent != null) headerMap["user-agent"] = "$userAgent"; + if (!headerMap.containsKey("authorization") && accessToken != null) + headerMap["authorization"] = "Bearer $accessToken"; + if (!headerMap.containsKey("user-agent") && userAgent != null) + headerMap["user-agent"] = "$userAgent"; } res = await client.get(Uri.parse(url), headers: headerMap); @@ -94,7 +96,8 @@ class KretaClient { return res.body; } } on http.ClientException catch (error) { - print("ERROR: KretaClient.getAPI ($url) ClientException: ${error.message}"); + print( + "ERROR: KretaClient.getAPI ($url) ClientException: ${error.message}"); } catch (error) { print("ERROR: KretaClient.getAPI ($url) ${error.runtimeType}: $error"); } @@ -120,9 +123,12 @@ class KretaClient { for (int i = 0; i < 3; i++) { if (autoHeader) { - if (!headerMap.containsKey("authorization") && accessToken != null) headerMap["authorization"] = "Bearer $accessToken"; - if (!headerMap.containsKey("user-agent") && userAgent != null) headerMap["user-agent"] = "$userAgent"; - if (!headerMap.containsKey("content-type")) headerMap["content-type"] = "application/json"; + if (!headerMap.containsKey("authorization") && accessToken != null) + headerMap["authorization"] = "Bearer $accessToken"; + if (!headerMap.containsKey("user-agent") && userAgent != null) + headerMap["user-agent"] = "$userAgent"; + if (!headerMap.containsKey("content-type")) + headerMap["content-type"] = "application/json"; } res = await client.post(Uri.parse(url), headers: headerMap, body: body); @@ -142,9 +148,10 @@ class KretaClient { return res.body; } } on http.ClientException catch (error) { - print("ERROR: KretaClient.getAPI ($url) ClientException: ${error.message}"); + print( + "ERROR: KretaClient.postAPI ($url) ClientException: ${error.message}"); } catch (error) { - print("ERROR: KretaClient.getAPI ($url) ${error.runtimeType}: $error"); + print("ERROR: KretaClient.postAPI ($url) ${error.runtimeType}: $error"); } } @@ -157,7 +164,8 @@ class KretaClient { }; String nonceStr = await getAPI(KretaAPI.nonce, json: false); - Nonce nonce = getNonce(nonceStr, loginUser.username, loginUser.instituteCode); + Nonce nonce = + getNonce(nonceStr, loginUser.username, loginUser.instituteCode); headers.addAll(nonce.header()); if (_settings.presentationMode) { @@ -175,18 +183,25 @@ class KretaClient { )); if (loginRes != null) { - if (loginRes.containsKey("access_token")) accessToken = loginRes["access_token"]; - if (loginRes.containsKey("refresh_token")) refreshToken = loginRes["refresh_token"]; + if (loginRes.containsKey("access_token")) + accessToken = loginRes["access_token"]; + if (loginRes.containsKey("refresh_token")) + refreshToken = loginRes["refresh_token"]; // Update role - loginUser.role = JwtUtils.getRoleFromJWT(accessToken ?? "") ?? Role.student; + loginUser.role = + JwtUtils.getRoleFromJWT(accessToken ?? "") ?? Role.student; } if (refreshToken != null) { Map? refreshRes = await postAPI(KretaAPI.login, - headers: headers, body: User.refreshBody(refreshToken: refreshToken!, instituteCode: loginUser.instituteCode)); + headers: headers, + body: User.refreshBody( + refreshToken: refreshToken!, + instituteCode: loginUser.instituteCode)); if (refreshRes != null) { - if (refreshRes.containsKey("id_token")) idToken = refreshRes["id_token"]; + if (refreshRes.containsKey("id_token")) + idToken = refreshRes["id_token"]; } } } From 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 0fcfb27..4894d34 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 c5541e6..c8808fe 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 53df988..c6b190d 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 0000000..567e848 --- /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 0000000..be402a3 --- /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 0000000..567e848 --- /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 0000000..3e17764 --- /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 6371b17..cb8674b 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 0000000..ddd9b9c --- /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 0000000..567e848 --- /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 0000000..4c40e82 --- /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 0000000..567e848 --- /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 0000000..bc1819f --- /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 567e848..0000000 --- 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 be402a3..0000000 --- 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 567e848..0000000 --- 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 3e17764..0000000 --- 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 567e848..0000000 --- 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 4c40e82..0000000 --- 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 567e848..0000000 --- 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 bc1819f..0000000 --- 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 1a19772..e7d7bbe 100644 --- a/filcnaplo/android/app/src/main/AndroidManifest.xml +++ b/filcnaplo/android/app/src/main/AndroidManifest.xml @@ -8,6 +8,8 @@ android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize" android:showWhenLocked="true" android:turnScreenOn="true"> + @@ -57,6 +59,8 @@ android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true" /> + + diff --git a/filcnaplo/android/app/src/main/java/hu/filc/naplo/database b/filcnaplo/android/app/src/main/java/hu/filc/naplo/database deleted file mode 120000 index a298c9a..0000000 --- a/filcnaplo/android/app/src/main/java/hu/filc/naplo/database +++ /dev/null @@ -1 +0,0 @@ -../../../../../../../../../filcnaplo_premium/android/database \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/java/hu/filc/naplo/utils b/filcnaplo/android/app/src/main/java/hu/filc/naplo/utils deleted file mode 120000 index 0a05323..0000000 --- a/filcnaplo/android/app/src/main/java/hu/filc/naplo/utils +++ /dev/null @@ -1 +0,0 @@ -../../../../../../../../../filcnaplo_premium/android/utils \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/java/hu/filc/naplo/widget_timetable b/filcnaplo/android/app/src/main/java/hu/filc/naplo/widget_timetable deleted file mode 120000 index 0314e40..0000000 --- a/filcnaplo/android/app/src/main/java/hu/filc/naplo/widget_timetable +++ /dev/null @@ -1 +0,0 @@ -../../../../../../../../../filcnaplo_premium/android/widget_timetable \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/java/hu/filc/naplo/MainActivity.java b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/MainActivity.java similarity index 69% rename from filcnaplo/android/app/src/main/java/hu/filc/naplo/MainActivity.java rename to filcnaplo/android/app/src/main/java/hu/refilc/naplo/MainActivity.java index 2fb810e..ff22fb7 100644 --- a/filcnaplo/android/app/src/main/java/hu/filc/naplo/MainActivity.java +++ b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/MainActivity.java @@ -1,9 +1,7 @@ -package hu.refilc.naplo; - -import io.flutter.embedding.android.FlutterActivity; - -import io.flutter.embedding.engine.FlutterEngine; - -public class MainActivity extends FlutterActivity { - -} +package hu.refilc.naplo; + +import io.flutter.embedding.android.FlutterActivity; + +public class MainActivity extends FlutterActivity { + +} diff --git a/filcnaplo/android/app/src/main/java/hu/refilc/naplo/database b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/database new file mode 100644 index 0000000..a298c9a --- /dev/null +++ b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/database @@ -0,0 +1 @@ +../../../../../../../../../filcnaplo_premium/android/database \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/java/hu/refilc/naplo/utils b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/utils new file mode 100644 index 0000000..0a05323 --- /dev/null +++ b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/utils @@ -0,0 +1 @@ +../../../../../../../../../filcnaplo_premium/android/utils \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable new file mode 100644 index 0000000..0314e40 --- /dev/null +++ b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable @@ -0,0 +1 @@ +../../../../../../../../../filcnaplo_premium/android/widget_timetable \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/res/drawable-hdpi/tinta_icon.png b/filcnaplo/android/app/src/main/res/drawable-hdpi/tinta_icon.png deleted file mode 100644 index bdb67716d008494126f5f65598988c1728d3cdaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1451 zcmV;c1yuTpP)002k`1^@s6zS;;x00009a7bBm001F4 z001F40Y#QEU;qFB0drDELIAGL9O(c600d`2O+f$vv5yP&=+6B#};e750BCzs*xr%wLptZt{)Yp1+K2jJO{3OlgN2HTufc_%T;PxH4Mv@PLdwQ-; z*d6PPCKp_ztYIYxc7JhXUAPFVSOI6sBx;0>Fzw()M|^ED7kw)d-WbpVfBL z6g;pERG4SQEK^Y|%7pE}G!@^47XFEFnDRrK55KS-d^B7O&U?j>_119h!nW|qa7_qA zC|NqME5ekQjK2)mvSn12r1#i2rNt%I9H_8w{B>0nCP0Y_N#8b{F?*kNU zA$$)-C%<~`6Z&Tk zT4#mFcGJi@lb(7J)_>7y%Hkpx`(HFDeKHiNI{BG2?AS&^&<5MNj;HZU(@NM9-#a0G zYbi;wU$Fad8E-mfP}tx$d{5Y0T%n>Jtp4%Aqc?Pv?}&I~E2H2G1WkmiVY*=* z1K^k8K9}fyr=i^bs=gy`QV+P{iZfeN0m0qtrd3XGFTdKrr8d?T?!daSlsOaE(f>m5 zPZO>DfInhhq{$UA>xwRCc9!Yc^ zHQ~LK8Nq9 zl-VA(_+HY^5gPb*|2cZz6?A4H?2dU?yqL^p4#EUGVUy3r9+{6QAwC(`Fdc%Out}(x z$4^zbr^Ffe)EClW+e@}&fX`=1cvar*#W>x3PnNV{51Do6nC9OM@;%H@Bkl)-UOW6T zZn`HdA$Yhd>kBN$9{^I{x-;0V*EPs&J@sV$)qoxI{uY+jy|?H-&Zt*KM{xGdzA(?D zrZfKORL`V)_Ran=li^y&fp7@%ua>wvXwO0r(tBGCRUei*^o8_{>m-swPX76@8w{xE z8=^82@nw)_`bS?MF~1<03e`J0cj3R&`EsQ@ - - - - - - - \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_background.xml b/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_background.xml deleted file mode 100644 index 293a93c..0000000 --- a/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_background.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_gradient_background.xml b/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_gradient_background.xml deleted file mode 100644 index 67e425a..0000000 --- a/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_gradient_background.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/res/drawable/launch_gradient_background.xml b/filcnaplo/android/app/src/main/res/drawable/launch_gradient_background.xml deleted file mode 100644 index 67e425a..0000000 --- a/filcnaplo/android/app/src/main/res/drawable/launch_gradient_background.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/res/mipmap-hdpi/ic_splash.png b/filcnaplo/android/app/src/main/res/mipmap-hdpi/ic_splash.png deleted file mode 100644 index 08e9ceb7412ec034790dcc446fae716875952551..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15091 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 diff --git a/filcnaplo/android/app/src/main/res/mipmap-mdpi/ic_splash.png b/filcnaplo/android/app/src/main/res/mipmap-mdpi/ic_splash.png deleted file mode 100644 index f1bec95f472b3a4024796bdfad5d2634e43ca11d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12814 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

;{;3BK+mWrgO)b)A}5&l5nJW#?`=#S#3SVoPnM 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 diff --git a/filcnaplo/android/app/src/main/res/mipmap-xxhdpi/ic_splash.png b/filcnaplo/android/app/src/main/res/mipmap-xxhdpi/ic_splash.png deleted file mode 100644 index 982dc3deac9cda6fb54382930f5a2c38aeb0790e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23824 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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 3a78eed..0000000 --- a/filcnaplo/android/app/src/main/res/values-v21/styles.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file From 360426d851fc75794f2969001608da21f102aea2 Mon Sep 17 00:00:00 2001 From: Kima Date: Fri, 25 Aug 2023 23:20:44 +0200 Subject: [PATCH 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 e7d7bbe..14d49f3 100644 --- a/filcnaplo/android/app/src/main/AndroidManifest.xml +++ b/filcnaplo/android/app/src/main/AndroidManifest.xml @@ -2,7 +2,7 @@ xmlns:tools="http://schemas.android.com/tools" package="hu.refilc.naplo"> - - + + android:host="api.refilcapp.hu" + android:pathPrefix="/v1/auth/callback" /> + + + + + + + - @@ -45,7 +55,7 @@ android:resource="@xml/home_widget_test_info" /> - = Build.VERSION_CODES.O) { - Locale loc = getLocale(context); - - if (rday == -1) - return DayOfWeek.of(1).getDisplayName(TextStyle.FULL, loc); - - dayOfWeek = DayOfWeek.of(rday + 1).getDisplayName(TextStyle.FULL, loc); - } - - return dayOfWeek.substring(0, 1).toUpperCase() + dayOfWeek.substring(1).toLowerCase(); - } - - public static void setSelectedDay(Context context, int wid, int day) { - DBManager dbManager = new DBManager(context.getApplicationContext()); - - try { - dbManager.open(); - dbManager.update(wid, day); - dbManager.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static int getToday(Context context) { - int rday = new DateTime().getDayOfWeek() - 1; - List s = genJsonDays(context); - - try { - if(checkIsAfter(s, rday)) rday += 1; - } catch (Exception e) { - e.printStackTrace(); - } - return retDay(rday, s.size()); - } - - public static int selectDay(Context context, int wid, int add, Boolean afterSubjects) { - DBManager dbManager = new DBManager(context.getApplicationContext()); - - try { - dbManager.open(); - Cursor cursor = dbManager.fetchWidget(wid); - - List s = genJsonDays(context); - int retday = new DateTime().getDayOfWeek() - 1; - - if(cursor.getCount() != 0) retday = retDay(cursor.getInt(1) + add, s.size()); - - if(afterSubjects) if(checkIsAfter(s, retday)) retday += 1; - retday = retDay(retday, s.size()); - - if(cursor.getCount() == 0) dbManager.insertSelDay(wid, retday); - else dbManager.update(wid, retday); - - dbManager.close(); - - return retday; - } catch (Exception e) { - e.printStackTrace(); - } - - return 0; - } - - public static Boolean checkIsAfter(List s, int retday) throws Exception { - retday = retDay(retday, s.size()); - - String vegIdopont = s.get(retday).getJSONObject(s.get(retday).length() - 1).getString("VegIdopont"); - - return new DateTime().isAfter(new DateTime(vegIdopont)); - } - - public static int retDay(int retday, int size) { - if (retday < 0) retday = size - 1; - else if (retday > size - 1) retday = 0; - - return retday; - } - - public static List genJsonDays(Context context) { - List gen_days = new ArrayList<>(); - - DBManager dbManager = new DBManager(context.getApplicationContext()); - try { - dbManager.open(); - Cursor ct = dbManager.fetchTimetable(); - dbManager.close(); - - if(ct.getCount() == 0) { - return gen_days; - } - - JSONObject fecthtt = new JSONObject(ct.getString(0)); - - JSONArray dayArray = new JSONArray(); - String currday = ""; - - String currweek = String.valueOf(Week.current().id()); - - JSONArray week = fecthtt.getJSONArray(currweek); - - for (int i=0; i < week.length(); i++) - { - try { - if(i == 0) currday = week.getJSONObject(0).getString("Datum"); - JSONObject oraObj = week.getJSONObject(i); - - if(!currday.equals(oraObj.getString("Datum"))) { - gen_days.add(dayArray); - currday = week.getJSONObject(i).getString("Datum"); - dayArray = new JSONArray(); - } - - dayArray.put(oraObj); - if(i == week.length() - 1) { - gen_days.add(dayArray); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - - Collections.sort(gen_days, new Comparator() { - - public int compare(JSONArray a, JSONArray b) { - long valA = 0; - long valB = 0; - - try { - valA = (long) new DateTime( a.getJSONObject(0).getString("Datum")).getMillis(); - valB = (long) new DateTime( b.getJSONObject(0).getString("Datum")).getMillis(); - } - catch (JSONException ignored) { - } - - return (int) (valA - valB); - } - }); - - return gen_days; - } - - public static String zeroPad(int value, int padding){ - StringBuilder b = new StringBuilder(); - b.append(value); - while(b.length() < padding){ - b.insert(0,"0"); - } - return b.toString(); - } - - public static Locale getLocale(Context context) { - DBManager dbManager = new DBManager(context.getApplicationContext()); - - try { - dbManager.open(); - String loc = dbManager.fetchLocale().getString(0); - dbManager.close(); - - if(loc.equals("hu") || loc.equals("de")) { - return new Locale(loc, loc.toUpperCase()); - } - } catch (Exception e) { - e.printStackTrace(); - } - - return new Locale("en", "GB"); - } - - public static boolean premiumEnabled(Context context) { - DBManager dbManager = new DBManager(context.getApplicationContext()); - - try { - dbManager.open(); - String premium_token = dbManager.fetchPremiumToken().getString(0); - String premium_scopes_raw = dbManager.fetchPremiumScopes().getString(0); - dbManager.close(); - - JSONArray arr = new JSONArray(premium_scopes_raw); - List premium_scopes = new ArrayList<>(); - for(int i = 0; i < arr.length(); i++){ - String scope = arr.getString(i); - premium_scopes.add(scope.substring(scope.lastIndexOf('.') + 1)); - } - - if(!premium_token.equals("") && (premium_scopes.contains("*") || premium_scopes.contains("TIMETALBE_WIDGET"))) { - return true; - } - } catch (Exception e) { - e.printStackTrace(); - } - - return false; - } - - public static boolean userLoggedIn(Context context) { - return !lastUserId(context).equals(""); - } - - public static String lastUserId(Context context) { - DBManager dbManager = new DBManager(context.getApplicationContext()); - try { - dbManager.open(); - Cursor cursor = dbManager.fetchLastUser(); - dbManager.close(); - - if(cursor != null && !cursor.getString(0).equals("")) { - String last_user = cursor.getString(0); - return last_user; - } - } catch (Exception e) { - e.printStackTrace(); - } - - return ""; - } - - @Override - public void onEnabled(Context context) { - } - - @Override - public void onDisabled(Context context) { - } +package hu.refilc.naplo.widget_timetable; + +import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProvider; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.net.Uri; +import android.os.Build; +import android.util.Log; +import android.view.View; +import android.widget.RemoteViews; +import android.widget.Toast; + +import org.joda.time.DateTime; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.time.DayOfWeek; +import java.time.format.TextStyle; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Locale; + +import hu.refilc.naplo.database.DBManager; +import hu.refilc.naplo.MainActivity; +import hu.refilc.naplo.R; + +import hu.refilc.naplo.utils.Week; + +import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; + +import es.antonborri.home_widget.HomeWidgetBackgroundIntent; +import es.antonborri.home_widget.HomeWidgetLaunchIntent; +import es.antonborri.home_widget.HomeWidgetProvider; + +public class WidgetTimetable extends HomeWidgetProvider { + + private static final String ACTION_WIDGET_CLICK_NAV_LEFT = "list_widget.ACTION_WIDGET_CLICK_NAV_LEFT"; + private static final String ACTION_WIDGET_CLICK_NAV_RIGHT = "list_widget.ACTION_WIDGET_CLICK_NAV_RIGHT"; + private static final String ACTION_WIDGET_CLICK_NAV_TODAY = "list_widget.ACTION_WIDGET_CLICK_NAV_TODAY"; + private static final String ACTION_WIDGET_CLICK_NAV_REFRESH = "list_widget.ACTION_WIDGET_CLICK_NAV_REFRESH"; + private static final String ACTION_WIDGET_CLICK_BUY_PREMIUM = "list_widget.ACTION_WIDGET_CLICK_BUY_PREMIUM"; + + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds, SharedPreferences widgetData) { + for (int i = 0; i < appWidgetIds.length; i++) { + RemoteViews views = generateView(context, appWidgetIds[i]); + + if(premiumEnabled(context) && userLoggedIn(context)) { + int rday = selectDay(context, appWidgetIds[i], 0, true); + views.setTextViewText(R.id.nav_current, convertDayOfWeek(context, rday)); + } + + pushUpdate(context, views, appWidgetIds[i]); + } + } + + public static void pushUpdate(Context context, RemoteViews remoteViews, int appWidgetSingleId) { + AppWidgetManager manager = AppWidgetManager.getInstance(context); + + manager.updateAppWidget(appWidgetSingleId, remoteViews); + manager.notifyAppWidgetViewDataChanged(appWidgetSingleId, R.id.widget_list); + } + + public static RemoteViews generateView(Context context, int appId) { + Intent serviceIntent = new Intent(context, WidgetTimetableService.class); + serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appId); + serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME))); + + RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_timetable); + + views.setViewVisibility(R.id.need_premium, View.GONE); + views.setViewVisibility(R.id.need_login, View.GONE); + views.setViewVisibility(R.id.tt_grid_cont, View.GONE); + + if(!userLoggedIn(context)) { + views.setViewVisibility(R.id.need_login, View.VISIBLE); + views.setOnClickPendingIntent(R.id.open_login, makePending(context, ACTION_WIDGET_CLICK_BUY_PREMIUM, appId)); + } else if(premiumEnabled(context)) { + views.setViewVisibility(R.id.tt_grid_cont, View.VISIBLE); + views.setOnClickPendingIntent(R.id.nav_to_left, makePending(context, ACTION_WIDGET_CLICK_NAV_LEFT, appId)); + views.setOnClickPendingIntent(R.id.nav_to_right, makePending(context, ACTION_WIDGET_CLICK_NAV_RIGHT, appId)); + views.setOnClickPendingIntent(R.id.nav_current, makePending(context, ACTION_WIDGET_CLICK_NAV_TODAY, appId)); + views.setOnClickPendingIntent(R.id.nav_refresh, makePending(context, ACTION_WIDGET_CLICK_NAV_REFRESH, appId)); + views.setRemoteAdapter(R.id.widget_list, serviceIntent); + views.setEmptyView(R.id.widget_list, R.id.empty_view); + } else { + views.setViewVisibility(R.id.need_premium, View.VISIBLE); + views.setOnClickPendingIntent(R.id.buy_premium, makePending(context, ACTION_WIDGET_CLICK_BUY_PREMIUM, appId)); + } + + return views; + } + + static PendingIntent makePending(Context context, String action, int appWidgetId) { + Intent activebtnnext = new Intent(context, WidgetTimetable.class); + activebtnnext.setAction(action); + activebtnnext.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); + return PendingIntent.getBroadcast(context, appWidgetId, activebtnnext , PendingIntent.FLAG_IMMUTABLE); + } + + @Override + public void onReceive(Context context, Intent intent) { + super.onReceive(context, intent); + + if(intent.hasExtra(AppWidgetManager.EXTRA_APPWIDGET_ID)) { + int appId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + RemoteViews views = generateView(context, appId); + + try { + if(premiumEnabled(context) && userLoggedIn(context)) { + if (intent.getAction().equals(ACTION_WIDGET_CLICK_NAV_LEFT)) { + int rday = selectDay(context, appId, -1, false); + views.setTextViewText(R.id.nav_current, convertDayOfWeek(context, rday)); + + pushUpdate(context, views, appId); + } else if (intent.getAction().equals(ACTION_WIDGET_CLICK_NAV_RIGHT)) { + int rday = selectDay(context, appId, 1, false); + views.setTextViewText(R.id.nav_current, convertDayOfWeek(context, rday)); + + pushUpdate(context, views, appId); + } else if (intent.getAction().equals(ACTION_WIDGET_CLICK_NAV_TODAY)) { + int rday = getToday(context); + setSelectedDay(context, appId, rday); + + views.setTextViewText(R.id.nav_current, convertDayOfWeek(context, rday)); + + pushUpdate(context, views, appId); + } else if (intent.getAction().equals(ACTION_WIDGET_CLICK_NAV_REFRESH)) { + PendingIntent pendingIntent = HomeWidgetLaunchIntent.INSTANCE.getActivity(context, MainActivity.class, Uri.parse("timetable://refresh")); + pendingIntent.send(); + } else if (intent.getAction().equals("android.appwidget.action.APPWIDGET_DELETED")) { + DBManager dbManager = new DBManager(context.getApplicationContext()); + + try { + dbManager.open(); + dbManager.deleteWidget(appId); + dbManager.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + if(intent.getAction().equals(ACTION_WIDGET_CLICK_BUY_PREMIUM)) { + PendingIntent pendingIntent = HomeWidgetLaunchIntent.INSTANCE.getActivity(context, MainActivity.class, Uri.parse("settings://premium")); + pendingIntent.send(); + } + } + catch (Exception e) { + e.printStackTrace(); + } + } + } + + public static String convertDayOfWeek(Context context, int rday) { + + /*if(rday == -1) return DayOfWeek.of(1).getDisplayName(TextStyle.FULL, new Locale("hu", "HU")); + + String dayOfWeek = DayOfWeek.of(rday + 1).getDisplayName(TextStyle.FULL, new Locale("hu", "HU"));*/ + + String dayOfWeek = "Unknown"; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + Locale loc = getLocale(context); + + if (rday == -1) + return DayOfWeek.of(1).getDisplayName(TextStyle.FULL, loc); + + dayOfWeek = DayOfWeek.of(rday + 1).getDisplayName(TextStyle.FULL, loc); + } + + return dayOfWeek.substring(0, 1).toUpperCase() + dayOfWeek.substring(1).toLowerCase(); + } + + public static void setSelectedDay(Context context, int wid, int day) { + DBManager dbManager = new DBManager(context.getApplicationContext()); + + try { + dbManager.open(); + dbManager.update(wid, day); + dbManager.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static int getToday(Context context) { + int rday = new DateTime().getDayOfWeek() - 1; + List s = genJsonDays(context); + + try { + if(checkIsAfter(s, rday)) rday += 1; + } catch (Exception e) { + e.printStackTrace(); + } + return retDay(rday, s.size()); + } + + public static int selectDay(Context context, int wid, int add, Boolean afterSubjects) { + DBManager dbManager = new DBManager(context.getApplicationContext()); + + try { + dbManager.open(); + Cursor cursor = dbManager.fetchWidget(wid); + + List s = genJsonDays(context); + int retday = new DateTime().getDayOfWeek() - 1; + + if(cursor.getCount() != 0) retday = retDay(cursor.getInt(1) + add, s.size()); + + if(afterSubjects) if(checkIsAfter(s, retday)) retday += 1; + retday = retDay(retday, s.size()); + + if(cursor.getCount() == 0) dbManager.insertSelDay(wid, retday); + else dbManager.update(wid, retday); + + dbManager.close(); + + return retday; + } catch (Exception e) { + e.printStackTrace(); + } + + return 0; + } + + public static Boolean checkIsAfter(List s, int retday) throws Exception { + retday = retDay(retday, s.size()); + + String vegIdopont = s.get(retday).getJSONObject(s.get(retday).length() - 1).getString("VegIdopont"); + + return new DateTime().isAfter(new DateTime(vegIdopont)); + } + + public static int retDay(int retday, int size) { + if (retday < 0) retday = size - 1; + else if (retday > size - 1) retday = 0; + + return retday; + } + + public static List genJsonDays(Context context) { + List gen_days = new ArrayList<>(); + + DBManager dbManager = new DBManager(context.getApplicationContext()); + try { + dbManager.open(); + Cursor ct = dbManager.fetchTimetable(); + dbManager.close(); + + if(ct.getCount() == 0) { + return gen_days; + } + + JSONObject fecthtt = new JSONObject(ct.getString(0)); + + JSONArray dayArray = new JSONArray(); + String currday = ""; + + String currweek = String.valueOf(Week.current().id()); + + JSONArray week = fecthtt.getJSONArray(currweek); + + for (int i=0; i < week.length(); i++) + { + try { + if(i == 0) currday = week.getJSONObject(0).getString("Datum"); + JSONObject oraObj = week.getJSONObject(i); + + if(!currday.equals(oraObj.getString("Datum"))) { + gen_days.add(dayArray); + currday = week.getJSONObject(i).getString("Datum"); + dayArray = new JSONArray(); + } + + dayArray.put(oraObj); + if(i == week.length() - 1) { + gen_days.add(dayArray); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + Collections.sort(gen_days, new Comparator() { + + public int compare(JSONArray a, JSONArray b) { + long valA = 0; + long valB = 0; + + try { + valA = (long) new DateTime( a.getJSONObject(0).getString("Datum")).getMillis(); + valB = (long) new DateTime( b.getJSONObject(0).getString("Datum")).getMillis(); + } + catch (JSONException ignored) { + } + + return (int) (valA - valB); + } + }); + + return gen_days; + } + + public static String zeroPad(int value, int padding){ + StringBuilder b = new StringBuilder(); + b.append(value); + while(b.length() < padding){ + b.insert(0,"0"); + } + return b.toString(); + } + + public static Locale getLocale(Context context) { + DBManager dbManager = new DBManager(context.getApplicationContext()); + + try { + dbManager.open(); + String loc = dbManager.fetchLocale().getString(0); + dbManager.close(); + + if(loc.equals("hu") || loc.equals("de")) { + return new Locale(loc, loc.toUpperCase()); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return new Locale("en", "GB"); + } + + public static boolean premiumEnabled(Context context) { + DBManager dbManager = new DBManager(context.getApplicationContext()); + + try { + dbManager.open(); + String premium_token = dbManager.fetchPremiumToken().getString(0); + String premium_scopes_raw = dbManager.fetchPremiumScopes().getString(0); + dbManager.close(); + + JSONArray arr = new JSONArray(premium_scopes_raw); + List premium_scopes = new ArrayList<>(); + for(int i = 0; i < arr.length(); i++){ + String scope = arr.getString(i); + premium_scopes.add(scope.substring(scope.lastIndexOf('.') + 1)); + } + + if(!premium_token.equals("") && (premium_scopes.contains("*") || premium_scopes.contains("TIMETALBE_WIDGET"))) { + return true; + } + } catch (Exception e) { + e.printStackTrace(); + } + + return false; + } + + public static boolean userLoggedIn(Context context) { + return !lastUserId(context).equals(""); + } + + public static String lastUserId(Context context) { + DBManager dbManager = new DBManager(context.getApplicationContext()); + try { + dbManager.open(); + Cursor cursor = dbManager.fetchLastUser(); + dbManager.close(); + + if(cursor != null && !cursor.getString(0).equals("")) { + String last_user = cursor.getString(0); + return last_user; + } + } catch (Exception e) { + e.printStackTrace(); + } + + return ""; + } + + @Override + public void onEnabled(Context context) { + } + + @Override + public void onDisabled(Context context) { + } } \ No newline at end of file diff --git a/filcnaplo_premium/android/widget_timetable/WidgetTimetableDataProvider.java b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetableDataProvider.java similarity index 97% rename from filcnaplo_premium/android/widget_timetable/WidgetTimetableDataProvider.java rename to filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetableDataProvider.java index 147157a..9ce41dd 100644 --- a/filcnaplo_premium/android/widget_timetable/WidgetTimetableDataProvider.java +++ b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetableDataProvider.java @@ -1,354 +1,354 @@ -package hu.refilc.naplo.widget_timetable; - -import android.appwidget.AppWidgetManager; -import android.content.Context; -import android.content.Intent; -import android.database.Cursor; -import android.os.Build; -import android.util.Log; -import android.view.View; -import android.widget.RemoteViews; -import android.widget.RemoteViewsService; - -import org.joda.time.DateTime; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -import hu.refilc.naplo.database.DBManager; -import hu.refilc.naplo.R; - -public class WidgetTimetableDataProvider implements RemoteViewsService.RemoteViewsFactory { - - private Context context; - private int appWidgetId; - - private int rday = 0; - - private int theme; - - private Integer[] colorValues; - - List day_subjects = new ArrayList<>(); - List lessonIndexes = new ArrayList<>(); - - Item witem; - - /* Default values */ - - static class Item { - int Layout; - - int NumVisibility; - int NameVisibility; - int NameNodescVisibility; - int DescVisibility; - int RoomVisibility; - int TimeVisibility; - - int NumColor; - int NameColor; - int NameNodescColor; - int DescColor; - - Integer[] NameNodescPadding = {0, 0, 0, 0}; - - public Item(int Layout, int NumVisibility,int NameVisibility,int NameNodescVisibility,int DescVisibility,int RoomVisibility,int TimeVisibility,int NumColor,int NameColor,int NameNodescColor,int DescColor) { - this.Layout = Layout; - this.NumVisibility = NumVisibility; - this.NameVisibility = NameVisibility; - this.NameNodescVisibility = NameNodescVisibility; - this.DescVisibility = DescVisibility; - this.RoomVisibility = RoomVisibility; - this.TimeVisibility = TimeVisibility; - - this.NumColor = NumColor; - this.NameColor = NameColor; - this.NameNodescColor = NameNodescColor; - this.DescColor = DescColor; - } - } - - static class Lesson { - String status; - String lessonIndex; - String lessonName; - String lessonTopic; - String lessonRoom; - long lessonStart; - long lessonEnd; - String substituteTeacher; - - public Lesson(String status, String lessonIndex,String lessonName,String lessonTopic, String lessonRoom,long lessonStart,long lessonEnd,String substituteTeacher) { - this.status = status; - this.lessonIndex = lessonIndex; - this.lessonName = lessonName; - this.lessonTopic = lessonTopic; - this.lessonRoom = lessonRoom; - this.lessonStart = lessonStart; - this.lessonEnd = lessonEnd; - this.substituteTeacher = substituteTeacher; - } - } - - Integer[] itemNameNodescPadding = {0, 0, 0, 0}; - - public WidgetTimetableDataProvider(Context context, Intent intent) { - this.context = context; - this.appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); - - this.theme = getThemeAccent(context); - - this.colorValues = new Integer[]{R.color.filc, - R.color.blue_shade300, - R.color.green_shade300, - R.color.lime_shade300, - R.color.yellow_shade300, - R.color.orange_shade300, - R.color.red_shade300, - R.color.pink_shade300, - R.color.purple_shade300}; - - } - - @Override - public void onCreate() { - initData(); - } - - @Override - public void onDataSetChanged() { - initData(); - } - - @Override - public void onDestroy() { - - } - - @Override - public int getCount() { - - return day_subjects.size(); - } - - public void setLayout(final RemoteViews view) { - /* Visibilities */ - view.setViewVisibility(R.id.tt_item_num, witem.NumVisibility); - view.setViewVisibility(R.id.tt_item_name, witem.NameVisibility); - view.setViewVisibility(R.id.tt_item_name_nodesc, witem.NameNodescVisibility); - view.setViewVisibility(R.id.tt_item_desc, witem.DescVisibility); - view.setViewVisibility(R.id.tt_item_room, witem.RoomVisibility); - view.setViewVisibility(R.id.tt_item_time, witem.TimeVisibility); - - /* backgroundResources */ - view.setInt(R.id.main_lay, "setBackgroundResource", witem.Layout); - - /* Paddings */ - view.setViewPadding(R.id.tt_item_name_nodesc, witem.NameNodescPadding[0], witem.NameNodescPadding[1], witem.NameNodescPadding[2], witem.NameNodescPadding[3]); - - /* Text Colors */ - view.setInt(R.id.tt_item_num, "setTextColor", getColor(context, witem.NumColor)); - view.setInt(R.id.tt_item_name, "setTextColor", getColor(context, witem.NameColor)); - view.setInt(R.id.tt_item_name_nodesc, "setTextColor", getColor(context, witem.NameNodescColor)); - view.setInt(R.id.tt_item_desc, "setTextColor", getColor(context, witem.DescColor)); - } - - public int getColor(Context context, int color) { - return context.getResources().getColor(color); - } - - @Override - public RemoteViews getViewAt(int position) { - RemoteViews view = new RemoteViews(context.getPackageName(), R.layout.timetable_item); - - witem = defaultItem(theme); - - Lesson curr_subject = day_subjects.get(position); - - if (curr_subject.status.equals("empty")) { - witem.NumColor = R.color.text_miss_num; - - witem.TimeVisibility = View.GONE; - witem.RoomVisibility = View.GONE; - - witem.NameNodescColor = R.color.text_miss; - } - - if (!curr_subject.substituteTeacher.equals("null")) { - witem.NumColor = R.color.yellow; - witem.Layout = R.drawable.card_layout_tile_helyetesitett; - } - - if (curr_subject.status.equals("Elmaradt")) { - witem.NumColor = R.color.red; - witem.Layout = R.drawable.card_layout_tile_elmarad; - } else if (curr_subject.status.equals("TanevRendjeEsemeny")) { - witem.NumVisibility = View.GONE; - witem.TimeVisibility = View.GONE; - witem.RoomVisibility = View.GONE; - - witem.NameNodescPadding[0] = 50; - witem.NameNodescPadding[2] = 50; - - witem.NameNodescColor = R.color.text_miss; - } - - if (curr_subject.lessonTopic.equals("null")) { - witem.DescVisibility = View.GONE; - witem.NameVisibility = View.GONE; - - witem.NameNodescVisibility = View.VISIBLE; - } - - setLayout(view); - - String lessonIndexTrailing = curr_subject.lessonIndex.equals("+") ? "" : "."; - - view.setTextViewText(R.id.tt_item_num, curr_subject.lessonIndex + lessonIndexTrailing); - view.setTextViewText(R.id.tt_item_name, curr_subject.lessonName); - view.setTextViewText(R.id.tt_item_name_nodesc, curr_subject.lessonName); - view.setTextViewText(R.id.tt_item_desc, curr_subject.lessonTopic); - view.setTextViewText(R.id.tt_item_room, curr_subject.lessonRoom); - if(curr_subject.lessonStart != 0 && curr_subject.lessonEnd != 0) - view.setTextViewText(R.id.tt_item_time, WidgetTimetable.zeroPad(new DateTime(curr_subject.lessonStart).getHourOfDay(), 2) + ":" + WidgetTimetable.zeroPad(new DateTime(curr_subject.lessonStart).getMinuteOfHour(), 2) + - "\n" + WidgetTimetable.zeroPad(new DateTime(curr_subject.lessonEnd).getHourOfDay(), 2) + ":" + WidgetTimetable.zeroPad(new DateTime(curr_subject.lessonEnd).getMinuteOfHour(),2)); - - return view; - } - - @Override - public RemoteViews getLoadingView() { - return null; - } - - @Override - public int getViewTypeCount() { - return 1; - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public boolean hasStableIds() { - return true; - } - - private void initData() { - - theme = getThemeAccent(context); - - rday = WidgetTimetable.selectDay(context, appWidgetId, 0, false); - - day_subjects.clear(); - lessonIndexes.clear(); - - try { - List arr = WidgetTimetable.genJsonDays(context); - - if(arr.isEmpty()) { - return; - } - JSONArray arr_lessons = WidgetTimetable.genJsonDays(context).get(rday); - - for (int i = 0; i < arr_lessons.length(); i++) { - JSONObject obj_lessons = arr_lessons.getJSONObject(i); - - day_subjects.add(jsonToLesson(obj_lessons)); - } - } catch (JSONException e) { - e.printStackTrace(); - } - - if(day_subjects.size() > 0) { - Collections.sort(day_subjects, new Comparator() { - public int compare(Lesson o1, Lesson o2) { - return new DateTime(o1.lessonStart).compareTo(new DateTime(o2.lessonStart)); - } - }); - - for (int i = 0; i < day_subjects.size(); i++) { - if(!day_subjects.get(i).lessonIndex.equals("+")) { - lessonIndexes.add(Integer.valueOf(day_subjects.get(i).lessonIndex)); - } - } - - if(lessonIndexes.size() > 0) { - - int lessonsChecked = Collections.min(lessonIndexes); - int i = 0; - - while(lessonsChecked < Collections.max(lessonIndexes)) { - if(!lessonIndexes.contains(lessonsChecked)) { - day_subjects.add(i, emptyLesson(lessonsChecked)); - } - lessonsChecked++; - i++; - } - } - } - } - - public static Integer getThemeAccent(Context context) { - DBManager dbManager = new DBManager(context.getApplicationContext()); - - try { - dbManager.open(); - Cursor cursor = dbManager.fetchTheme(); - dbManager.close(); - - return cursor.getInt(1); - } catch (Exception e) { - e.printStackTrace(); - } - - return 0; - } - - public Item defaultItem(int theme) { - return new Item( - R.drawable.card_layout_tile, - View.VISIBLE, - View.VISIBLE, - View.INVISIBLE, - View.VISIBLE, - View.VISIBLE, - View.VISIBLE, - colorValues[theme >= colorValues.length ? 0 : theme], - R.color.text, - R.color.text, - R.color.text_desc - ); - } - - public Lesson emptyLesson(int lessonIndex) { - return new Lesson("empty", String.valueOf(lessonIndex), "Lyukasóra", "null", "null", 0, 0, "null"); - } - - public Lesson jsonToLesson(JSONObject json) { - try { - return new Lesson( - json.getJSONObject("Allapot").getString("Nev"), - !json.getString("Oraszam").equals("null") ? json.getString("Oraszam") : "+", - json.getString("Nev"), - json.getString("Tema"), - json.getString("TeremNeve"), - new DateTime(json.getString("KezdetIdopont")).getMillis(), - new DateTime(json.getString("VegIdopont")).getMillis(), - json.getString("HelyettesTanarNeve") - ); - }catch (Exception e) { - Log.d("Filc", "exception: " + e); - }; - - return null; - } +package hu.refilc.naplo.widget_timetable; + +import android.appwidget.AppWidgetManager; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.os.Build; +import android.util.Log; +import android.view.View; +import android.widget.RemoteViews; +import android.widget.RemoteViewsService; + +import org.joda.time.DateTime; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import hu.refilc.naplo.database.DBManager; +import hu.refilc.naplo.R; + +public class WidgetTimetableDataProvider implements RemoteViewsService.RemoteViewsFactory { + + private Context context; + private int appWidgetId; + + private int rday = 0; + + private int theme; + + private Integer[] colorValues; + + List day_subjects = new ArrayList<>(); + List lessonIndexes = new ArrayList<>(); + + Item witem; + + /* Default values */ + + static class Item { + int Layout; + + int NumVisibility; + int NameVisibility; + int NameNodescVisibility; + int DescVisibility; + int RoomVisibility; + int TimeVisibility; + + int NumColor; + int NameColor; + int NameNodescColor; + int DescColor; + + Integer[] NameNodescPadding = {0, 0, 0, 0}; + + public Item(int Layout, int NumVisibility,int NameVisibility,int NameNodescVisibility,int DescVisibility,int RoomVisibility,int TimeVisibility,int NumColor,int NameColor,int NameNodescColor,int DescColor) { + this.Layout = Layout; + this.NumVisibility = NumVisibility; + this.NameVisibility = NameVisibility; + this.NameNodescVisibility = NameNodescVisibility; + this.DescVisibility = DescVisibility; + this.RoomVisibility = RoomVisibility; + this.TimeVisibility = TimeVisibility; + + this.NumColor = NumColor; + this.NameColor = NameColor; + this.NameNodescColor = NameNodescColor; + this.DescColor = DescColor; + } + } + + static class Lesson { + String status; + String lessonIndex; + String lessonName; + String lessonTopic; + String lessonRoom; + long lessonStart; + long lessonEnd; + String substituteTeacher; + + public Lesson(String status, String lessonIndex,String lessonName,String lessonTopic, String lessonRoom,long lessonStart,long lessonEnd,String substituteTeacher) { + this.status = status; + this.lessonIndex = lessonIndex; + this.lessonName = lessonName; + this.lessonTopic = lessonTopic; + this.lessonRoom = lessonRoom; + this.lessonStart = lessonStart; + this.lessonEnd = lessonEnd; + this.substituteTeacher = substituteTeacher; + } + } + + Integer[] itemNameNodescPadding = {0, 0, 0, 0}; + + public WidgetTimetableDataProvider(Context context, Intent intent) { + this.context = context; + this.appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + + this.theme = getThemeAccent(context); + + this.colorValues = new Integer[]{R.color.filc, + R.color.blue_shade300, + R.color.green_shade300, + R.color.lime_shade300, + R.color.yellow_shade300, + R.color.orange_shade300, + R.color.red_shade300, + R.color.pink_shade300, + R.color.purple_shade300}; + + } + + @Override + public void onCreate() { + initData(); + } + + @Override + public void onDataSetChanged() { + initData(); + } + + @Override + public void onDestroy() { + + } + + @Override + public int getCount() { + + return day_subjects.size(); + } + + public void setLayout(final RemoteViews view) { + /* Visibilities */ + view.setViewVisibility(R.id.tt_item_num, witem.NumVisibility); + view.setViewVisibility(R.id.tt_item_name, witem.NameVisibility); + view.setViewVisibility(R.id.tt_item_name_nodesc, witem.NameNodescVisibility); + view.setViewVisibility(R.id.tt_item_desc, witem.DescVisibility); + view.setViewVisibility(R.id.tt_item_room, witem.RoomVisibility); + view.setViewVisibility(R.id.tt_item_time, witem.TimeVisibility); + + /* backgroundResources */ + view.setInt(R.id.main_lay, "setBackgroundResource", witem.Layout); + + /* Paddings */ + view.setViewPadding(R.id.tt_item_name_nodesc, witem.NameNodescPadding[0], witem.NameNodescPadding[1], witem.NameNodescPadding[2], witem.NameNodescPadding[3]); + + /* Text Colors */ + view.setInt(R.id.tt_item_num, "setTextColor", getColor(context, witem.NumColor)); + view.setInt(R.id.tt_item_name, "setTextColor", getColor(context, witem.NameColor)); + view.setInt(R.id.tt_item_name_nodesc, "setTextColor", getColor(context, witem.NameNodescColor)); + view.setInt(R.id.tt_item_desc, "setTextColor", getColor(context, witem.DescColor)); + } + + public int getColor(Context context, int color) { + return context.getResources().getColor(color); + } + + @Override + public RemoteViews getViewAt(int position) { + RemoteViews view = new RemoteViews(context.getPackageName(), R.layout.timetable_item); + + witem = defaultItem(theme); + + Lesson curr_subject = day_subjects.get(position); + + if (curr_subject.status.equals("empty")) { + witem.NumColor = R.color.text_miss_num; + + witem.TimeVisibility = View.GONE; + witem.RoomVisibility = View.GONE; + + witem.NameNodescColor = R.color.text_miss; + } + + if (!curr_subject.substituteTeacher.equals("null")) { + witem.NumColor = R.color.yellow; + witem.Layout = R.drawable.card_layout_tile_helyetesitett; + } + + if (curr_subject.status.equals("Elmaradt")) { + witem.NumColor = R.color.red; + witem.Layout = R.drawable.card_layout_tile_elmarad; + } else if (curr_subject.status.equals("TanevRendjeEsemeny")) { + witem.NumVisibility = View.GONE; + witem.TimeVisibility = View.GONE; + witem.RoomVisibility = View.GONE; + + witem.NameNodescPadding[0] = 50; + witem.NameNodescPadding[2] = 50; + + witem.NameNodescColor = R.color.text_miss; + } + + if (curr_subject.lessonTopic.equals("null")) { + witem.DescVisibility = View.GONE; + witem.NameVisibility = View.GONE; + + witem.NameNodescVisibility = View.VISIBLE; + } + + setLayout(view); + + String lessonIndexTrailing = curr_subject.lessonIndex.equals("+") ? "" : "."; + + view.setTextViewText(R.id.tt_item_num, curr_subject.lessonIndex + lessonIndexTrailing); + view.setTextViewText(R.id.tt_item_name, curr_subject.lessonName); + view.setTextViewText(R.id.tt_item_name_nodesc, curr_subject.lessonName); + view.setTextViewText(R.id.tt_item_desc, curr_subject.lessonTopic); + view.setTextViewText(R.id.tt_item_room, curr_subject.lessonRoom); + if(curr_subject.lessonStart != 0 && curr_subject.lessonEnd != 0) + view.setTextViewText(R.id.tt_item_time, WidgetTimetable.zeroPad(new DateTime(curr_subject.lessonStart).getHourOfDay(), 2) + ":" + WidgetTimetable.zeroPad(new DateTime(curr_subject.lessonStart).getMinuteOfHour(), 2) + + "\n" + WidgetTimetable.zeroPad(new DateTime(curr_subject.lessonEnd).getHourOfDay(), 2) + ":" + WidgetTimetable.zeroPad(new DateTime(curr_subject.lessonEnd).getMinuteOfHour(),2)); + + return view; + } + + @Override + public RemoteViews getLoadingView() { + return null; + } + + @Override + public int getViewTypeCount() { + return 1; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public boolean hasStableIds() { + return true; + } + + private void initData() { + + theme = getThemeAccent(context); + + rday = WidgetTimetable.selectDay(context, appWidgetId, 0, false); + + day_subjects.clear(); + lessonIndexes.clear(); + + try { + List arr = WidgetTimetable.genJsonDays(context); + + if(arr.isEmpty()) { + return; + } + JSONArray arr_lessons = WidgetTimetable.genJsonDays(context).get(rday); + + for (int i = 0; i < arr_lessons.length(); i++) { + JSONObject obj_lessons = arr_lessons.getJSONObject(i); + + day_subjects.add(jsonToLesson(obj_lessons)); + } + } catch (JSONException e) { + e.printStackTrace(); + } + + if(day_subjects.size() > 0) { + Collections.sort(day_subjects, new Comparator() { + public int compare(Lesson o1, Lesson o2) { + return new DateTime(o1.lessonStart).compareTo(new DateTime(o2.lessonStart)); + } + }); + + for (int i = 0; i < day_subjects.size(); i++) { + if(!day_subjects.get(i).lessonIndex.equals("+")) { + lessonIndexes.add(Integer.valueOf(day_subjects.get(i).lessonIndex)); + } + } + + if(lessonIndexes.size() > 0) { + + int lessonsChecked = Collections.min(lessonIndexes); + int i = 0; + + while(lessonsChecked < Collections.max(lessonIndexes)) { + if(!lessonIndexes.contains(lessonsChecked)) { + day_subjects.add(i, emptyLesson(lessonsChecked)); + } + lessonsChecked++; + i++; + } + } + } + } + + public static Integer getThemeAccent(Context context) { + DBManager dbManager = new DBManager(context.getApplicationContext()); + + try { + dbManager.open(); + Cursor cursor = dbManager.fetchTheme(); + dbManager.close(); + + return cursor.getInt(1); + } catch (Exception e) { + e.printStackTrace(); + } + + return 0; + } + + public Item defaultItem(int theme) { + return new Item( + R.drawable.card_layout_tile, + View.VISIBLE, + View.VISIBLE, + View.INVISIBLE, + View.VISIBLE, + View.VISIBLE, + View.VISIBLE, + colorValues[theme >= colorValues.length ? 0 : theme], + R.color.text, + R.color.text, + R.color.text_desc + ); + } + + public Lesson emptyLesson(int lessonIndex) { + return new Lesson("empty", String.valueOf(lessonIndex), "Lyukasóra", "null", "null", 0, 0, "null"); + } + + public Lesson jsonToLesson(JSONObject json) { + try { + return new Lesson( + json.getJSONObject("Allapot").getString("Nev"), + !json.getString("Oraszam").equals("null") ? json.getString("Oraszam") : "+", + json.getString("Nev"), + json.getString("Tema"), + json.getString("TeremNeve"), + new DateTime(json.getString("KezdetIdopont")).getMillis(), + new DateTime(json.getString("VegIdopont")).getMillis(), + json.getString("HelyettesTanarNeve") + ); + }catch (Exception e) { + Log.d("Filc", "exception: " + e); + }; + + return null; + } } \ No newline at end of file diff --git a/filcnaplo_premium/android/widget_timetable/WidgetTimetableService.java b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetableService.java similarity index 96% rename from filcnaplo_premium/android/widget_timetable/WidgetTimetableService.java rename to filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetableService.java index 01a5f90..1864174 100644 --- a/filcnaplo_premium/android/widget_timetable/WidgetTimetableService.java +++ b/filcnaplo/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetableService.java @@ -1,12 +1,12 @@ -package hu.refilc.naplo.widget_timetable; - -import android.content.Intent; -import android.os.Build; -import android.widget.RemoteViewsService; - -public class WidgetTimetableService extends RemoteViewsService { - @Override - public RemoteViewsFactory onGetViewFactory(Intent intent) { - return new WidgetTimetableDataProvider(getApplicationContext(), intent); - } -} +package hu.refilc.naplo.widget_timetable; + +import android.content.Intent; +import android.os.Build; +import android.widget.RemoteViewsService; + +public class WidgetTimetableService extends RemoteViewsService { + @Override + public RemoteViewsFactory onGetViewFactory(Intent intent) { + return new WidgetTimetableDataProvider(getApplicationContext(), intent); + } +} \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/res/layout/timetable_item.xml b/filcnaplo/android/app/src/main/res/layout/timetable_item.xml index 6b2a7f8..aa23af8 100644 --- a/filcnaplo/android/app/src/main/res/layout/timetable_item.xml +++ b/filcnaplo/android/app/src/main/res/layout/timetable_item.xml @@ -1,5 +1,6 @@ + tools:ignore="HardcodedText" /> + android:layout_toEndOf="@id/tt_item_num" + android:textColor="@color/text" + tools:ignore="HardcodedText" /> + android:layout_toEndOf="@id/tt_item_num" + android:textColor="@color/text" + tools:ignore="HardcodedText" /> + android:textColor="@color/text_desc" + tools:ignore="HardcodedText" /> + android:layout_toStartOf="@id/tt_item_time" + android:textColor="@color/text_desc" + tools:ignore="HardcodedText" /> + android:layout_alignParentEnd="true" + android:textColor="@color/white" + tools:ignore="HardcodedText" /> \ No newline at end of file diff --git a/filcnaplo/android/app/src/main/res/layout/widget_timetable.xml b/filcnaplo/android/app/src/main/res/layout/widget_timetable.xml index e10fda1..69b80b0 100644 --- a/filcnaplo/android/app/src/main/res/layout/widget_timetable.xml +++ b/filcnaplo/android/app/src/main/res/layout/widget_timetable.xml @@ -19,10 +19,12 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" - android:text="Empty" + android:text="Üres / Empty" + android:background="@drawable/widget_card_bottom_dark" android:textColor="@color/text" android:textSize="20sp" - android:textStyle="bold" /> + android:textStyle="bold" + tools:ignore="HardcodedText" /> + + android:focusable="true" /> + android:focusable="true" /> + android:focusable="true" /> + android:textSize="22sp" + android:textStyle="bold" + tools:ignore="HardcodedText" /> @@ -131,8 +139,9 @@ android:text="A widget használatához, bejelentkezés szükséges." android:textColor="@color/black" android:paddingTop="10dp" - android:textSize="17dp" - android:textStyle="bold" /> + android:textSize="17sp" + android:textStyle="bold" + tools:ignore="HardcodedText" />