Compare commits

..

47 Commits
4.0.0 ... 4.0.3

Author SHA1 Message Date
Kima
8dbf605450 added black accent color 2023-06-08 21:28:28 +02:00
Kima
2f418a7c1a updated version string 2023-06-08 21:19:46 +02:00
Kima
5f0c82f54c added grade value translations 2023-06-08 21:18:20 +02:00
Kima
4e659308e5 fixed subject rename at homeworks 2023-06-08 20:38:10 +02:00
Kima
50e24bde17 added disable fading to all filter/tab bars 2023-06-08 20:07:17 +02:00
Márton Kiss
31f7c6a465 Merge pull request #6 from Monke14/bug-fixes
some fixes - by Monke14
2023-06-08 20:01:22 +02:00
Márton Kiss
e734579249 Merge branch 'master' into bug-fixes 2023-06-08 19:59:57 +02:00
Márton Kiss
2cff46d628 Merge pull request #5 from TMarccci/master
fixed lot of things - by TMarccci
2023-06-08 19:56:35 +02:00
Kima
87f3f93177 started creating end-year summary and stb 2023-06-08 19:53:50 +02:00
hihihaha
30733caa4a remove home screen tabbar fade 2023-06-08 16:18:39 +02:00
hihihaha
4e30a550e1 fix chart overflow 2023-06-08 16:18:08 +02:00
hihihaha
cb687d6b10 add themed icon 2023-06-08 16:17:56 +02:00
hihihaha
6c6d3a7cd8 fix english translations 2023-06-08 16:17:46 +02:00
Tihanyi Marcell
da06e400e1 Login add " ", Comment rename 2023-06-08 13:47:40 +02:00
Tihanyi Marcell
87b8cbb60f HotFix 2023-06-08 12:59:09 +02:00
Tihanyi Marcell
8bac300585 goalPlanner remove 2023-06-08 12:54:46 +02:00
Tihanyi Marcell
da7d2b9333 Fixed: Settings UI, Live Act, Class Avg 2023-06-08 12:44:47 +02:00
Kima
e1f84caf19 changed refilc bday strings 2023-06-07 21:27:56 +02:00
Kima
274da2b766 ok 2023-06-07 21:21:35 +02:00
Kima
35aba35801 Merge branch 'master' of github.com:refilc/naplo 2023-06-07 20:50:48 +02:00
Kima
964e002c46 added og filc color to accents 2023-06-07 20:50:45 +02:00
Márton Kiss
d3318e10ab fixed download counter in readme 2023-06-07 20:22:41 +02:00
Kima
4c43369d59 updated version string 2023-06-07 19:22:55 +02:00
Kima
176243b881 started uwu mode 2023-06-06 21:46:10 +02:00
Kima
ed02a340d0 ok 2023-06-06 21:11:52 +02:00
Kima
2877f4fc5c oke mostmar tenyleg fix 😭 vagy pedig mas baja 2023-06-06 21:03:30 +02:00
Kima
fceb3bf31a fixed settings screen version check 2023-06-06 20:58:33 +02:00
Kima
9883d081ff added back button to full-screen timetable 2023-06-06 20:27:37 +02:00
Kima
db5a9fb197 fixed translate bugs and subject name things 2023-06-06 19:18:56 +02:00
Kima
93438ce3df Merge branch 'master' of github.com:refilc/naplo 2023-06-05 21:21:48 +02:00
Kima
95bca64fb8 fixed quick actions colors 2023-06-05 21:21:45 +02:00
Pearoo
7821e10869 Update README.md 2023-06-01 10:58:53 +00:00
Pearoo
cede3c3129 Merge branch 'master' of https://github.com/refilc/naplo 2023-05-31 00:00:25 +02:00
Pearoo
528ee862b9 Update README.md - Squircle ikon 2023-05-30 21:28:25 +00:00
Kima
d1507f5eae fixed most reported bugs 2023-05-30 19:27:16 +02:00
Kima
f5682e9137 fixed most reported bugs 2023-05-30 19:26:41 +02:00
Pearoo
518932c260 Merge branch 'master' of https://github.com/refilc/naplo 2023-05-29 22:10:16 +02:00
ZiziHun
139d8869c2 Update date 2023-05-29 17:01:03 +02:00
Gergő Móricz
29bf0c81dd Revert "pubspec name fix"
This reverts commit ef7437979c.
2023-05-29 14:58:48 +02:00
Gergő Móricz
9e510bed2d Merge pull request #2 from Monke14/bug-fixes
Bug fixek
2023-05-29 14:56:29 +02:00
Vízhányó Balázs
ef7437979c pubspec name fix 2023-05-29 14:50:05 +02:00
Vízhányó Balázs
b1e68f18b0 Package name fix 2023-05-29 14:48:23 +02:00
hihihaha
5e02e697d2 fix grade color 2023-05-29 14:36:15 +02:00
hihihaha
bfa77fcfb6 fix android icon scaling 2023-05-29 14:31:37 +02:00
Pearoo
bcf9d9688f Update README.md 2023-05-29 11:34:32 +00:00
Pearoo
281b9cf6c4 Update .gitignore 2023-05-29 13:31:03 +02:00
Pearoo
fb0de5a991 Prémium képek törölve 2023-05-29 13:07:08 +02:00
139 changed files with 2325 additions and 1371 deletions

25
.gitignore vendored
View File

@@ -25,3 +25,28 @@ doc/api/
*.js.map *.js.map
*.txt *.txt
filcnaplo/linux/flutter/generated_plugin_registrant.cc
filcnaplo/linux/flutter/generated_plugin_registrant.h
filcnaplo/linux/flutter/generated_plugins.cmake
filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift
filcnaplo/windows/flutter/ephemeral/.plugin_symlinks/connectivity_plus
filcnaplo/windows/flutter/ephemeral/.plugin_symlinks/dynamic_color
filcnaplo/windows/flutter/ephemeral/.plugin_symlinks/flutter_acrylic
filcnaplo/windows/flutter/ephemeral/.plugin_symlinks/path_provider_windows
filcnaplo/windows/flutter/ephemeral/.plugin_symlinks/permission_handler_windows
filcnaplo/windows/flutter/ephemeral/.plugin_symlinks/share_plus_windows
filcnaplo/windows/flutter/ephemeral/.plugin_symlinks/url_launcher_windows
filcnaplo/windows/flutter/ephemeral/generated_config.cmake
filcnaplo/windows/flutter/generated_plugin_registrant.cc
filcnaplo/windows/flutter/generated_plugin_registrant.h
filcnaplo/windows/flutter/generated_plugins.cmake
filcnaplo/linux/flutter/generated_plugin_registrant.cc
filcnaplo/linux/flutter/generated_plugin_registrant.h
filcnaplo/linux/flutter/generated_plugins.cmake
filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift
filcnaplo/linux/flutter/generated_plugin_registrant.cc
filcnaplo/linux/flutter/generated_plugin_registrant.h
filcnaplo/linux/flutter/generated_plugins.cmake
filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift
.vscode/

24
.vscode/launch.json vendored
View File

@@ -1,7 +1,4 @@
{ {
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0", "version": "0.2.0",
"configurations": [ "configurations": [
{ {
@@ -10,8 +7,27 @@
"request": "launch", "request": "launch",
"type": "dart", "type": "dart",
"toolArgs": [ "toolArgs": [
"--dart-define=APPVER=$(cat pubspec.yaml | grep version: | cut -d' ' -f2 | cut -d+ -f1) --release" "--dart-define=APPVER=$(cat pubspec.yaml | grep version: | cut -d' ' -f2 | cut -d+ -f1)"
] ]
},
{
"name": "filcnaplo release",
"cwd": "filcnaplo release",
"request": "launch",
"type": "dart",
"flutterMode": "release",
"program": "lib/main.dart",
"toolArgs": [
"--dart-define=APPVER=$(cat pubspec.yaml | grep version: | cut -d' ' -f2 | cut -d+ -f1)"
]
},
{
"name": "Flutter",
"program": "lib/main.dart",
"cwd": "filcnaplo",
"request": "launch",
"type": "dart",
"flutterMode": "debug"
} }
] ]
} }

View File

@@ -1,11 +1,11 @@
<p align=center> <p align=center>
<img src="https://media.discordapp.net/attachments/1111727410677825596/1111790518964326510/reFilc_Logo2.png?width=671&height=671" width=150> <img src="https://media.discordapp.net/attachments/1111727410677825596/1113217167513624646/reFilc_Logo_Squircle.png?width=671&height=671" width=150>
<h1 align=center><b>reFilc</b></h1> <h1 align=center><b>reFilc</b></h1>
</p> </p>
#### Nem hivatalos e-napló alkalmazás az eKRÉTA rendszerhez - tanulóktól, tanulóknak. #### 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/latest/total?color=%23&label=Downloads&logo=github&sort=semver)](https://github.com/refilc/naplo/releases) &nbsp; [![discord](https://img.shields.io/discord/1111649116020285532?label=Discord)](http://dc.refilc.hu) [![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) &nbsp; [![discord](https://img.shields.io/discord/1111649116020285532?label=Discord)](http://dc.refilc.hu)
## Setup ## Setup
@@ -27,12 +27,16 @@ cd filcnaplo
flutter run flutter run
``` ```
### Contribution
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 # Kudo
**annon:** a Filc napló készítője (ez az app a Filcen alapul) **annon:** a Filc napló készítője (ez az app a Filcen alapul)
**kima, chromium, peighter, mog, WolfY:** a fejlesztői csapat **kima, mog, WolfY:** fejlesztők
**Regő, Pearoo:** weboldal design és community management **Regő, Pearoo:** weboldal design és community management

View File

@@ -44,7 +44,7 @@ android {
} }
defaultConfig { defaultConfig {
applicationId "hu.filc.naplo" applicationId "hu.refilc.naplo"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion rootProject.ext.targetSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()

View File

@@ -1,4 +1,4 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="hu.filc.naplo"> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="hu.refilc.naplo">
<!-- Permissions --> <!-- Permissions -->
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.VIBRATE" />

View File

@@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" package="hu.filc.naplo"> xmlns:tools="http://schemas.android.com/tools" package="hu.refilc.naplo">
<application android:label="reFilc" tools:replace="android:label" android:icon="@mipmap/ic_launcher" <application android:label="reFilc" tools:replace="android:label" android:icon="@mipmap/ic_launcher"
android:requestLegacyExternalStorage="true"> android:requestLegacyExternalStorage="true">
<activity android:exported="true" android:name=".MainActivity" <activity android:exported="true" android:name=".MainActivity"

View File

@@ -1,4 +1,4 @@
package hu.filc.naplo; package hu.refilc.naplo;
import android.os.Bundle; import android.os.Bundle;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@@ -2,4 +2,5 @@
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/> <background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/> <foreground android:drawable="@drawable/ic_launcher_foreground"/>
<monochrome android:drawable="@mipmap/ic_launcher_monochrome" />
</adaptive-icon> </adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 844 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 916 B

After

Width:  |  Height:  |  Size: 576 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@@ -1,4 +1,4 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="hu.filc.naplo"> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="hu.refilc.naplo">
<!-- Permissions --> <!-- Permissions -->
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.VIBRATE" />

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 735 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

View File

@@ -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=3.5.1
FLUTTER_BUILD_NUMBER=197
EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386
EXCLUDED_ARCHS[sdk=iphoneos*]=armv7
DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==,RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC9iNGZiMTEyMTRkZDJkZGE2Y2UwMTJkZDk4ZWE0OThlOWU4YjkxMjYyLw==
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

View File

@@ -77,6 +77,8 @@ PODS:
- Mantle/extobjc (2.2.0) - Mantle/extobjc (2.2.0)
- open_file (0.0.1): - open_file (0.0.1):
- Flutter - Flutter
- package_info_plus (0.4.5):
- Flutter
- path_provider_foundation (0.0.1): - path_provider_foundation (0.0.1):
- Flutter - Flutter
- FlutterMacOS - FlutterMacOS
@@ -120,6 +122,7 @@ DEPENDENCIES:
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
- live_activities (from `.symlinks/plugins/live_activities/ios`) - live_activities (from `.symlinks/plugins/live_activities/ios`)
- open_file (from `.symlinks/plugins/open_file/ios`) - open_file (from `.symlinks/plugins/open_file/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`) - quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`)
@@ -171,6 +174,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/live_activities/ios" :path: ".symlinks/plugins/live_activities/ios"
open_file: open_file:
:path: ".symlinks/plugins/open_file/ios" :path: ".symlinks/plugins/open_file/ios"
package_info_plus:
:path: ".symlinks/plugins/package_info_plus/ios"
path_provider_foundation: path_provider_foundation:
:path: ".symlinks/plugins/path_provider_foundation/darwin" :path: ".symlinks/plugins/path_provider_foundation/darwin"
permission_handler_apple: permission_handler_apple:
@@ -213,6 +218,7 @@ SPEC CHECKSUMS:
live_activities: 9ff56a06a2d43ecd68f56deeed13b18a8304789c live_activities: 9ff56a06a2d43ecd68f56deeed13b18a8304789c
Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d
open_file: 02eb5cb6b21264bd3a696876f5afbfb7ca4f4b7d open_file: 02eb5cb6b21264bd3a696876f5afbfb7ca4f4b7d
package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e
path_provider_foundation: eaf5b3e458fc0e5fbb9940fb09980e853fe058b8 path_provider_foundation: eaf5b3e458fc0e5fbb9940fb09980e853fe058b8
permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce
quick_actions_ios: 9e80dcfadfbc5d47d9cf8f47bcf428b11cf383d4 quick_actions_ios: 9e80dcfadfbc5d47d9cf8f47bcf428b11cf383d4

View File

@@ -478,7 +478,7 @@
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 195; CURRENT_PROJECT_VERSION = 195;
DEVELOPMENT_TEAM = JWGEQSC9U7; DEVELOPMENT_TEAM = 48XS7JAZB7;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = reFilc; INFOPLIST_KEY_CFBundleDisplayName = reFilc;
@@ -488,7 +488,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 3.6.0; MARKETING_VERSION = 3.6.0;
PRODUCT_BUNDLE_IDENTIFIER = hu.refilc.naplo; PRODUCT_BUNDLE_IDENTIFIER = com.refilc.naplo;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
@@ -510,7 +510,7 @@
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = JWGEQSC9U7; DEVELOPMENT_TEAM = 48XS7JAZB7;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = livecard/Info.plist; INFOPLIST_FILE = livecard/Info.plist;
@@ -526,7 +526,7 @@
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = hu.refilc.naplo.livecardpro; PRODUCT_BUNDLE_IDENTIFIER = com.refilc.naplo.livecardpro;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
@@ -552,7 +552,7 @@
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = JWGEQSC9U7; DEVELOPMENT_TEAM = 48XS7JAZB7;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = livecard/Info.plist; INFOPLIST_FILE = livecard/Info.plist;
@@ -567,7 +567,7 @@
); );
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = hu.refilc.naplo.livecardpro; PRODUCT_BUNDLE_IDENTIFIER = com.refilc.naplo.livecardpro;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
@@ -592,7 +592,7 @@
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = JWGEQSC9U7; DEVELOPMENT_TEAM = 48XS7JAZB7;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = livecard/Info.plist; INFOPLIST_FILE = livecard/Info.plist;
@@ -607,7 +607,7 @@
); );
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = hu.refilc.naplo.livecardpro; PRODUCT_BUNDLE_IDENTIFIER = com.refilc.naplo.livecardpro;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
@@ -736,7 +736,7 @@
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 195; CURRENT_PROJECT_VERSION = 195;
DEVELOPMENT_TEAM = JWGEQSC9U7; DEVELOPMENT_TEAM = 48XS7JAZB7;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = reFilc; INFOPLIST_KEY_CFBundleDisplayName = reFilc;
@@ -746,7 +746,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 3.6.0; MARKETING_VERSION = 3.6.0;
PRODUCT_BUNDLE_IDENTIFIER = hu.refilc.naplo; PRODUCT_BUNDLE_IDENTIFIER = com.refilc.naplo;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -764,7 +764,7 @@
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 195; CURRENT_PROJECT_VERSION = 195;
DEVELOPMENT_TEAM = JWGEQSC9U7; DEVELOPMENT_TEAM = 48XS7JAZB7;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = reFilc; INFOPLIST_KEY_CFBundleDisplayName = reFilc;
@@ -774,7 +774,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 3.6.0; MARKETING_VERSION = 3.6.0;
PRODUCT_BUNDLE_IDENTIFIER = hu.refilc.naplo; PRODUCT_BUNDLE_IDENTIFIER = com.refilc.naplo;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 610 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 585 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 887 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -3,6 +3,8 @@
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>com.apple.security.application-groups</key> <key>com.apple.security.application-groups</key>
<array/> <array>
<string>group.refilcnaplo.livecard</string>
</array>
</dict> </dict>
</plist> </plist>

View File

@@ -1,13 +1,14 @@
{ {
"images" : [ "images" : [
{ {
"idiom" : "universal", "filename" : "reFilc_Logo.png",
"platform" : "ios", "idiom" : "universal",
"size" : "1024x1024" "platform" : "ios",
} "size" : "1024x1024"
], }
"info" : { ],
"author" : "xcode", "info" : {
"version" : 1 "author" : "xcode",
} "version" : 1
} }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 KiB

View File

@@ -13,7 +13,7 @@ class LessonData {
var nextRoom: String var nextRoom: String
init?() { init?() {
let sharedDefault = UserDefaults(suiteName: "group.filcnaplo.livecard")! let sharedDefault = UserDefaults(suiteName: "group.refilc.livecard")!
self.icon = sharedDefault.string(forKey: "icon")! self.icon = sharedDefault.string(forKey: "icon")!
self.index = sharedDefault.string(forKey: "index")! self.index = sharedDefault.string(forKey: "index")!

View File

@@ -3,6 +3,8 @@
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>com.apple.security.application-groups</key> <key>com.apple.security.application-groups</key>
<array/> <array>
<string>group.refilcnaplo.livecard</string>
</array>
</dict> </dict>
</plist> </plist>

View File

@@ -68,8 +68,6 @@ struct LockScreenLiveActivityView: View {
.monospacedDigit() .monospacedDigit()
.padding(.trailing, CGFloat(24)) .padding(.trailing, CGFloat(24))
} }
.activitySystemActionForegroundColor(.teal)
.activityBackgroundTint(.teal)
} }
} }

View File

@@ -57,14 +57,14 @@ Future loginApi({
String nonceStr = await Provider.of<KretaClient>(context, listen: false) String nonceStr = await Provider.of<KretaClient>(context, listen: false)
.getAPI(KretaAPI.nonce, json: false); .getAPI(KretaAPI.nonce, json: false);
Nonce nonce = getNonce(nonceStr, username, instituteCode); Nonce nonce = getNonce(nonceStr, username.replaceAll(' ', '') + ' ', instituteCode);
headers.addAll(nonce.header()); headers.addAll(nonce.header());
Map? res = await Provider.of<KretaClient>(context, listen: false) Map? res = await Provider.of<KretaClient>(context, listen: false)
.postAPI(KretaAPI.login, .postAPI(KretaAPI.login,
headers: headers, headers: headers,
body: User.loginBody( body: User.loginBody(
username: username, username: username.replaceAll(' ', '') + ' ',
password: password, password: password,
instituteCode: instituteCode, instituteCode: instituteCode,
)); ));
@@ -83,7 +83,7 @@ Future loginApi({
.getAPI(KretaAPI.student(instituteCode)); .getAPI(KretaAPI.student(instituteCode));
Student student = Student.fromJson(studentJson!); Student student = Student.fromJson(studentJson!);
var user = User( var user = User(
username: username, username: username.replaceAll(' ', '') + ' ',
password: password, password: password,
instituteCode: instituteCode, instituteCode: instituteCode,
name: student.name, name: student.name,

View File

@@ -13,7 +13,14 @@ import 'package:flutter/foundation.dart';
import 'package:live_activities/live_activities.dart'; import 'package:live_activities/live_activities.dart';
import 'package:filcnaplo_mobile_ui/pages/home/live_card/live_card.i18n.dart'; import 'package:filcnaplo_mobile_ui/pages/home/live_card/live_card.i18n.dart';
enum LiveCardState { empty, duringLesson, duringBreak, morning, afternoon, night } enum LiveCardState {
empty,
duringLesson,
duringBreak,
morning,
afternoon,
night
}
class LiveCardProvider extends ChangeNotifier { class LiveCardProvider extends ChangeNotifier {
Lesson? currentLesson; Lesson? currentLesson;
@@ -37,19 +44,22 @@ class LiveCardProvider extends ChangeNotifier {
required SettingsProvider settings, required SettingsProvider settings,
}) : _timetable = timetable, }) : _timetable = timetable,
_settings = settings { _settings = settings {
_liveActivitiesPlugin.init(appGroupId: "group.filcnaplo.livecard"); _liveActivitiesPlugin.init(appGroupId: "group.refilc.livecard");
_liveActivitiesPlugin.getAllActivitiesIds().then((value) { _liveActivitiesPlugin.getAllActivitiesIds().then((value) {
_latestActivityId = value.isNotEmpty ? value.first : null; _latestActivityId = value.isNotEmpty ? value.first : null;
}); });
_timer = Timer.periodic(const Duration(seconds: 1), (timer) => update()); _timer = Timer.periodic(const Duration(seconds: 1), (timer) => update());
_delay = settings.bellDelayEnabled ? Duration(seconds: settings.bellDelay) : Duration.zero; _delay = settings.bellDelayEnabled
? Duration(seconds: settings.bellDelay)
: Duration.zero;
update(); update();
} }
@override @override
void dispose() { void dispose() {
_timer.cancel(); _timer.cancel();
if (_latestActivityId != null && Platform.isIOS) _liveActivitiesPlugin.endActivity(_latestActivityId!); if (_latestActivityId != null && Platform.isIOS)
_liveActivitiesPlugin.endActivity(_latestActivityId!);
super.dispose(); super.dispose();
} }
@@ -78,14 +88,25 @@ class LiveCardProvider extends ChangeNotifier {
switch (currentState) { switch (currentState) {
case LiveCardState.duringLesson: case LiveCardState.duringLesson:
return { return {
"icon": currentLesson != null ? SubjectIcon.resolveName(subject: currentLesson?.subject) : "book", "icon": currentLesson != null
"index": currentLesson != null ? '${currentLesson!.lessonIndex}. ' : "", ? SubjectIcon.resolveName(subject: currentLesson?.subject)
"title": currentLesson != null ? ShortSubject.resolve(subject: currentLesson?.subject).capital() : "", : "book",
"index":
currentLesson != null ? '${currentLesson!.lessonIndex}. ' : "",
"title": currentLesson != null
? ShortSubject.resolve(subject: currentLesson?.subject).capital()
: "",
"subtitle": currentLesson?.room.replaceAll("_", " ") ?? "", "subtitle": currentLesson?.room.replaceAll("_", " ") ?? "",
"description": currentLesson?.description ?? "", "description": currentLesson?.description ?? "",
"startDate": ((currentLesson?.start.millisecondsSinceEpoch ?? 0) - _delay.inMilliseconds).toString(), "startDate": ((currentLesson?.start.millisecondsSinceEpoch ?? 0) -
"endDate": ((currentLesson?.end.millisecondsSinceEpoch ?? 0) - _delay.inMilliseconds).toString(), _delay.inMilliseconds)
"nextSubject": nextLesson != null ? ShortSubject.resolve(subject: nextLesson?.subject).capital() : "", .toString(),
"endDate": ((currentLesson?.end.millisecondsSinceEpoch ?? 0) -
_delay.inMilliseconds)
.toString(),
"nextSubject": nextLesson != null
? ShortSubject.resolve(subject: nextLesson?.subject).capital()
: "",
"nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "", "nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "",
}; };
case LiveCardState.duringBreak: case LiveCardState.duringBreak:
@@ -101,10 +122,19 @@ class LiveCardProvider extends ChangeNotifier {
return { return {
"icon": iconFloorMap[diff] ?? "cup.and.saucer", "icon": iconFloorMap[diff] ?? "cup.and.saucer",
"title": "Szünet", "title": "Szünet",
"description": "go $diff".i18n.fill([diff != "to room" ? (nextLesson!.getFloor() ?? 0) : nextLesson!.room]), "description": "go $diff".i18n.fill([
"startDate": ((prevLesson?.end.millisecondsSinceEpoch ?? 0) - _delay.inMilliseconds).toString(), diff != "to room" ? (nextLesson!.getFloor() ?? 0) : nextLesson!.room
"endDate": ((nextLesson?.start.millisecondsSinceEpoch ?? 0) - _delay.inMilliseconds).toString(), ]),
"nextSubject": (nextLesson != null ? ShortSubject.resolve(subject: nextLesson?.subject) : "").capital(), "startDate": ((prevLesson?.end.millisecondsSinceEpoch ?? 0) -
_delay.inMilliseconds)
.toString(),
"endDate": ((nextLesson?.start.millisecondsSinceEpoch ?? 0) -
_delay.inMilliseconds)
.toString(),
"nextSubject": (nextLesson != null
? ShortSubject.resolve(subject: nextLesson?.subject)
: "")
.capital(),
"nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "", "nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "",
"index": "", "index": "",
"subtitle": "", "subtitle": "",
@@ -119,15 +149,25 @@ class LiveCardProvider extends ChangeNotifier {
final cmap = toMap(); final cmap = toMap();
if (!mapEquals(cmap, _lastActivity)) { if (!mapEquals(cmap, _lastActivity)) {
_lastActivity = cmap; _lastActivity = cmap;
try {
if (_lastActivity.isNotEmpty) { if (_lastActivity.isNotEmpty) {
if (_latestActivityId == null) { if (_latestActivityId == null) {
_liveActivitiesPlugin.createActivity(_lastActivity).then((value) => _latestActivityId = value); _liveActivitiesPlugin
.createActivity(_lastActivity)
.then((value) => _latestActivityId = value);
} else {
_liveActivitiesPlugin.updateActivity(
_latestActivityId!, _lastActivity);
}
} else { } else {
_liveActivitiesPlugin.updateActivity(_latestActivityId!, _lastActivity); if (_latestActivityId != null) {
_liveActivitiesPlugin.endActivity(_latestActivityId!);
}
}
} catch (e) {
if (kDebugMode) {
print('ERROR: Unable to create or update iOS LiveCard!');
} }
} else {
if (_latestActivityId != null) _liveActivitiesPlugin.endActivity(_latestActivityId!);
} }
} }
} }
@@ -139,19 +179,28 @@ class LiveCardProvider extends ChangeNotifier {
today = _today(_timetable); today = _today(_timetable);
} }
_delay = _settings.bellDelayEnabled ? Duration(seconds: _settings.bellDelay) : Duration.zero; _delay = _settings.bellDelayEnabled
? Duration(seconds: _settings.bellDelay)
: Duration.zero;
final now = _now().add(_delay); final now = _now().add(_delay);
// Filter cancelled lessons #20 // Filter cancelled lessons #20
// Filter label lessons #128 // Filter label lessons #128
today = today.where((lesson) => lesson.status?.name != "Elmaradt" && lesson.subject.id != '' && !lesson.isEmpty).toList(); today = today
.where((lesson) =>
lesson.status?.name != "Elmaradt" &&
lesson.subject.id != '' &&
!lesson.isEmpty)
.toList();
if (today.isNotEmpty) { if (today.isNotEmpty) {
// sort // sort
today.sort((a, b) => a.start.compareTo(b.start)); today.sort((a, b) => a.start.compareTo(b.start));
final _lesson = today.firstWhere((l) => l.start.isBefore(now) && l.end.isAfter(now), orElse: () => Lesson.fromJson({})); final _lesson = today.firstWhere(
(l) => l.start.isBefore(now) && l.end.isAfter(now),
orElse: () => Lesson.fromJson({}));
if (_lesson.start.year != 0) { if (_lesson.start.year != 0) {
currentLesson = _lesson; currentLesson = _lesson;
@@ -159,7 +208,8 @@ class LiveCardProvider extends ChangeNotifier {
currentLesson = null; currentLesson = null;
} }
final _next = today.firstWhere((l) => l.start.isAfter(now), orElse: () => Lesson.fromJson({})); final _next = today.firstWhere((l) => l.start.isAfter(now),
orElse: () => Lesson.fromJson({}));
nextLessons = today.where((l) => l.start.isAfter(now)).toList(); nextLessons = today.where((l) => l.start.isAfter(now)).toList();
if (_next.start.year != 0) { if (_next.start.year != 0) {
@@ -168,7 +218,8 @@ class LiveCardProvider extends ChangeNotifier {
nextLesson = null; nextLesson = null;
} }
final _prev = today.lastWhere((l) => l.end.isBefore(now), orElse: () => Lesson.fromJson({})); final _prev = today.lastWhere((l) => l.end.isBefore(now),
orElse: () => Lesson.fromJson({}));
if (_prev.start.year != 0) { if (_prev.start.year != 0) {
prevLesson = _prev; prevLesson = _prev;
@@ -198,7 +249,10 @@ class LiveCardProvider extends ChangeNotifier {
Duration get delay => _delay; Duration get delay => _delay;
bool _sameDate(DateTime a, DateTime b) => (a.year == b.year && a.month == b.month && a.day == b.day); bool _sameDate(DateTime a, DateTime b) =>
(a.year == b.year && a.month == b.month && a.day == b.day);
List<Lesson> _today(TimetableProvider p) => (p.getWeek(Week.current()) ?? []).where((l) => _sameDate(l.date, _now())).toList(); List<Lesson> _today(TimetableProvider p) => (p.getWeek(Week.current()) ?? [])
.where((l) => _sameDate(l.date, _now()))
.toList();
} }

View File

@@ -3,6 +3,7 @@ import 'dart:io';
import 'package:filcnaplo/api/client.dart'; import 'package:filcnaplo/api/client.dart';
import 'package:filcnaplo/models/release.dart'; import 'package:filcnaplo/models/release.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:package_info_plus/package_info_plus.dart';
class UpdateProvider extends ChangeNotifier { class UpdateProvider extends ChangeNotifier {
// Private // Private
@@ -20,9 +21,11 @@ class UpdateProvider extends ChangeNotifier {
_releases = List.castFrom(initialReleases); _releases = List.castFrom(initialReleases);
} }
static const currentVersion = String.fromEnvironment("APPVER", defaultValue: "1.0");
Future<void> fetch() async { Future<void> fetch() async {
late String currentVersion;
PackageInfo packageInfo = await PackageInfo.fromPlatform();
currentVersion = packageInfo.version;
if (!Platform.isAndroid) return; if (!Platform.isAndroid) return;
_releases = await FilcAPI.getReleases() ?? []; _releases = await FilcAPI.getReleases() ?? [];
@@ -30,10 +33,30 @@ class UpdateProvider extends ChangeNotifier {
// Check for new releases // Check for new releases
if (_releases.isNotEmpty) { if (_releases.isNotEmpty) {
_available = _releases.first.version.compareTo(Version.fromString(currentVersion)) == 1; _available = _releases.first.version
.compareTo(Version.fromString(currentVersion)) ==
1;
// ignore: avoid_print // ignore: avoid_print
if (_available) print("INFO: New update: ${releases.first.version}"); if (_available) print("INFO: New update: ${releases.first.version}");
notifyListeners(); notifyListeners();
} }
} }
Future<Map> installedVersion() async {
PackageInfo packageInfo = await PackageInfo.fromPlatform();
String appName = packageInfo.appName;
String packageName = packageInfo.packageName;
String version = packageInfo.version;
String buildNumber = packageInfo.buildNumber;
Map<String, String> release = {
"app_name": appName,
"package_name": packageName,
"version": version,
"build_number": buildNumber,
};
return release;
}
} }

View File

@@ -11,6 +11,7 @@ import 'package:filcnaplo/models/config.dart';
import 'package:filcnaplo/theme/observer.dart'; import 'package:filcnaplo/theme/observer.dart';
import 'package:filcnaplo/theme/theme.dart'; import 'package:filcnaplo/theme/theme.dart';
import 'package:filcnaplo_kreta_api/client/client.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/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart';
@@ -22,13 +23,18 @@ import 'package:provider/provider.dart';
import 'package:filcnaplo_mobile_ui/common/system_chrome.dart' as mobile; import 'package:filcnaplo_mobile_ui/common/system_chrome.dart' as mobile;
import 'package:filcnaplo_mobile_ui/screens/login/login_route.dart' as mobile; import 'package:filcnaplo_mobile_ui/screens/login/login_route.dart' as mobile;
import 'package:filcnaplo_mobile_ui/screens/login/login_screen.dart' as mobile; import 'package:filcnaplo_mobile_ui/screens/login/login_screen.dart' as mobile;
import 'package:filcnaplo_mobile_ui/screens/navigation/navigation_screen.dart' as mobile; import 'package:filcnaplo_mobile_ui/screens/navigation/navigation_screen.dart'
import 'package:filcnaplo_mobile_ui/screens/settings/settings_route.dart' as mobile; as mobile;
import 'package:filcnaplo_mobile_ui/screens/settings/settings_screen.dart' as mobile; import 'package:filcnaplo_mobile_ui/screens/settings/settings_route.dart'
as mobile;
import 'package:filcnaplo_mobile_ui/screens/settings/settings_screen.dart'
as mobile;
// Desktop UI // Desktop UI
import 'package:filcnaplo_desktop_ui/screens/navigation/navigation_screen.dart' as desktop; import 'package:filcnaplo_desktop_ui/screens/navigation/navigation_screen.dart'
import 'package:filcnaplo_desktop_ui/screens/login/login_screen.dart' as desktop; as desktop;
import 'package:filcnaplo_desktop_ui/screens/login/login_screen.dart'
as desktop;
import 'package:filcnaplo_desktop_ui/screens/login/login_route.dart' as desktop; import 'package:filcnaplo_desktop_ui/screens/login/login_route.dart' as desktop;
// Providers // Providers
@@ -36,7 +42,6 @@ import 'package:filcnaplo/models/settings.dart';
import 'package:filcnaplo_kreta_api/providers/absence_provider.dart'; import 'package:filcnaplo_kreta_api/providers/absence_provider.dart';
import 'package:filcnaplo_kreta_api/providers/event_provider.dart'; import 'package:filcnaplo_kreta_api/providers/event_provider.dart';
import 'package:filcnaplo_kreta_api/providers/exam_provider.dart'; import 'package:filcnaplo_kreta_api/providers/exam_provider.dart';
import 'package:filcnaplo_kreta_api/providers/grade_provider.dart';
import 'package:filcnaplo_kreta_api/providers/homework_provider.dart'; import 'package:filcnaplo_kreta_api/providers/homework_provider.dart';
import 'package:filcnaplo_kreta_api/providers/message_provider.dart'; import 'package:filcnaplo_kreta_api/providers/message_provider.dart';
import 'package:filcnaplo_kreta_api/providers/note_provider.dart'; import 'package:filcnaplo_kreta_api/providers/note_provider.dart';
@@ -52,7 +57,12 @@ class App extends StatelessWidget {
final UserProvider user; final UserProvider user;
final DatabaseProvider database; final DatabaseProvider database;
const App({Key? key, required this.database, required this.settings, required this.user}) : super(key: key); const App(
{Key? key,
required this.database,
required this.settings,
required this.user})
: super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -65,7 +75,8 @@ class App extends StatelessWidget {
final status = StatusProvider(); final status = StatusProvider();
final kreta = KretaClient(user: user, settings: settings, status: status); final kreta = KretaClient(user: user, settings: settings, status: status);
final timetable = TimetableProvider(user: user, database: database, kreta: kreta); final timetable =
TimetableProvider(user: user, database: database, kreta: kreta);
final premium = PremiumProvider(settings: settings); final premium = PremiumProvider(settings: settings);
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
@@ -83,23 +94,44 @@ class App extends StatelessWidget {
ChangeNotifierProvider<StatusProvider>(create: (_) => status), ChangeNotifierProvider<StatusProvider>(create: (_) => status),
Provider<KretaClient>(create: (_) => kreta), Provider<KretaClient>(create: (_) => kreta),
Provider<DatabaseProvider>(create: (context) => database), Provider<DatabaseProvider>(create: (context) => database),
ChangeNotifierProvider<ThemeModeObserver>(create: (context) => ThemeModeObserver(initialTheme: settings.theme)), ChangeNotifierProvider<ThemeModeObserver>(
ChangeNotifierProvider<NewsProvider>(create: (context) => NewsProvider(context: context)), create: (context) =>
ChangeNotifierProvider<UpdateProvider>(create: (context) => UpdateProvider(context: context)), ThemeModeObserver(initialTheme: settings.theme)),
ChangeNotifierProvider<NewsProvider>(
create: (context) => NewsProvider(context: context)),
ChangeNotifierProvider<UpdateProvider>(
create: (context) => UpdateProvider(context: context)),
// User data providers // User data providers
ChangeNotifierProvider<GradeProvider>(create: (_) => GradeProvider(settings: settings, user: user, database: database, kreta: kreta)), ChangeNotifierProvider<GradeProvider>(
create: (_) => GradeProvider(
settings: settings,
user: user,
database: database,
kreta: kreta)),
ChangeNotifierProvider<TimetableProvider>(create: (_) => timetable), ChangeNotifierProvider<TimetableProvider>(create: (_) => timetable),
ChangeNotifierProvider<ExamProvider>(create: (context) => ExamProvider(context: context)), ChangeNotifierProvider<ExamProvider>(
ChangeNotifierProvider<HomeworkProvider>(create: (context) => HomeworkProvider(context: context)), create: (context) => ExamProvider(context: context)),
ChangeNotifierProvider<MessageProvider>(create: (context) => MessageProvider(context: context)), ChangeNotifierProvider<HomeworkProvider>(
ChangeNotifierProvider<NoteProvider>(create: (context) => NoteProvider(context: context)), create: (context) => HomeworkProvider(context: context)),
ChangeNotifierProvider<EventProvider>(create: (context) => EventProvider(context: context)), ChangeNotifierProvider<MessageProvider>(
ChangeNotifierProvider<AbsenceProvider>(create: (context) => AbsenceProvider(context: context)), create: (context) => MessageProvider(context: context)),
ChangeNotifierProvider<NoteProvider>(
create: (context) => NoteProvider(context: context)),
ChangeNotifierProvider<EventProvider>(
create: (context) => EventProvider(context: context)),
ChangeNotifierProvider<AbsenceProvider>(
create: (context) => AbsenceProvider(context: context)),
ChangeNotifierProvider<GradeCalculatorProvider>( ChangeNotifierProvider<GradeCalculatorProvider>(
create: (_) => GradeCalculatorProvider(settings: settings, user: user, database: database, kreta: kreta)), create: (_) => GradeCalculatorProvider(
ChangeNotifierProvider<LiveCardProvider>(create: (context) => LiveCardProvider(timetable: timetable, settings: settings)) settings: settings,
user: user,
database: database,
kreta: kreta)),
ChangeNotifierProvider<LiveCardProvider>(
create: (context) =>
LiveCardProvider(timetable: timetable, settings: settings))
], ],
child: Consumer<ThemeModeObserver>( child: Consumer<ThemeModeObserver>(
builder: (context, themeMode, child) { builder: (context, themeMode, child) {
@@ -110,12 +142,15 @@ class App extends StatelessWidget {
return MaterialApp( return MaterialApp(
builder: (context, child) { builder: (context, child) {
// Limit font size scaling to 1.0 // Limit font size scaling to 1.0
double textScaleFactor = min(MediaQuery.of(context).textScaleFactor, 1.0); double textScaleFactor =
min(MediaQuery.of(context).textScaleFactor, 1.0);
return I18n( return I18n(
initialLocale: Locale(settings.language, settings.language.toUpperCase()), initialLocale: Locale(
settings.language, settings.language.toUpperCase()),
child: MediaQuery( child: MediaQuery(
data: MediaQuery.of(context).copyWith(textScaleFactor: textScaleFactor), data: MediaQuery.of(context)
.copyWith(textScaleFactor: textScaleFactor),
child: child ?? Container(), child: child ?? Container(),
), ),
); );
@@ -148,7 +183,8 @@ class App extends StatelessWidget {
return locale; return locale;
}, },
onGenerateRoute: (settings) => rootNavigator(settings), onGenerateRoute: (settings) => rootNavigator(settings),
initialRoute: user.getUsers().isNotEmpty ? "navigation" : "login", initialRoute:
user.getUsers().isNotEmpty ? "navigation" : "login",
); );
}, },
); );
@@ -162,7 +198,8 @@ class App extends StatelessWidget {
if (Platform.isAndroid || Platform.isIOS) { if (Platform.isAndroid || Platform.isIOS) {
switch (route.name) { switch (route.name) {
case "login_back": case "login_back":
return CupertinoPageRoute(builder: (context) => const mobile.LoginScreen(back: true)); return CupertinoPageRoute(
builder: (context) => const mobile.LoginScreen(back: true));
case "login": case "login":
return _rootRoute(const mobile.LoginScreen()); return _rootRoute(const mobile.LoginScreen());
case "navigation": case "navigation":
@@ -175,7 +212,8 @@ class App extends StatelessWidget {
} else if (Platform.isWindows || Platform.isMacOS || Platform.isLinux) { } else if (Platform.isWindows || Platform.isMacOS || Platform.isLinux) {
switch (route.name) { switch (route.name) {
case "login_back": case "login_back":
return CupertinoPageRoute(builder: (context) => const desktop.LoginScreen(back: true)); return CupertinoPageRoute(
builder: (context) => const desktop.LoginScreen(back: true));
case "login": case "login":
return _rootRoute(const desktop.LoginScreen()); return _rootRoute(const desktop.LoginScreen());
case "navigation": case "navigation":

View File

@@ -9,7 +9,7 @@ class Config {
factory Config.fromJson(Map json) { factory Config.fromJson(Map json) {
return Config( return Config(
userAgent: json["user_agent"] ?? "hu.filc.naplo/\$0/\$1/\$2", userAgent: json["user_agent"] ?? "hu.refilc.naplo/\$0/\$1/\$2",
json: json, json: json,
); );
} }

View File

@@ -10,6 +10,8 @@ enum AccentColor {
red, red,
pink, pink,
purple, purple,
none,
ogfilc,
adaptive, adaptive,
custom custom
} }
@@ -24,6 +26,8 @@ Map<AccentColor, Color> accentColorMap = {
AccentColor.red: Colors.red.shade300, AccentColor.red: Colors.red.shade300,
AccentColor.pink: Colors.pink.shade300, AccentColor.pink: Colors.pink.shade300,
AccentColor.purple: Colors.purple.shade300, AccentColor.purple: Colors.purple.shade300,
//AccentColor.none: Colors.black,
AccentColor.ogfilc: const Color(0xff20AC9B),
AccentColor.adaptive: const Color(0xFF3D7BF4), AccentColor.adaptive: const Color(0xFF3D7BF4),
AccentColor.custom: const Color(0xFF3D7BF4), AccentColor.custom: const Color(0xFF3D7BF4),
}; };

View File

@@ -311,7 +311,7 @@ Color gradeColor(
switch (valueInt) { switch (valueInt) {
case 5: case 5:
return Color(0xff3d7bf4); return settings.gradeColors[4];
case 4: case 4:
return settings.gradeColors[3]; return settings.gradeColors[3];
case 3: case 3:

View File

@@ -15,7 +15,8 @@ import 'package:provider/provider.dart';
import 'lesson_tile.i18n.dart'; import 'lesson_tile.i18n.dart';
class LessonTile extends StatelessWidget { class LessonTile extends StatelessWidget {
const LessonTile(this.lesson, {Key? key, this.onTap, this.swapDesc = false}) : super(key: key); const LessonTile(this.lesson, {Key? key, this.onTap, this.swapDesc = false})
: super(key: key);
final Lesson lesson; final Lesson lesson;
final bool swapDesc; final bool swapDesc;
@@ -34,7 +35,9 @@ class LessonTile extends StatelessWidget {
if (RegExp(r'\d').hasMatch(lesson.lessonIndex)) lessonIndexTrailing = "."; if (RegExp(r'\d').hasMatch(lesson.lessonIndex)) lessonIndexTrailing = ".";
var now = DateTime.now(); var now = DateTime.now();
if (lesson.start.isBefore(now) && lesson.end.isAfter(now) && lesson.status?.name != "Elmaradt") { if (lesson.start.isBefore(now) &&
lesson.end.isAfter(now) &&
lesson.status?.name != "Elmaradt") {
fillLeading = true; fillLeading = true;
} }
@@ -62,7 +65,8 @@ class LessonTile extends StatelessWidget {
if (lesson.homeworkId != "") { if (lesson.homeworkId != "") {
Homework homework = Provider.of<HomeworkProvider>(context, listen: false) Homework homework = Provider.of<HomeworkProvider>(context, listen: false)
.homework .homework
.firstWhere((h) => h.id == lesson.homeworkId, orElse: () => Homework.fromJson({})); .firstWhere((h) => h.id == lesson.homeworkId,
orElse: () => Homework.fromJson({}));
if (homework.id != "") { if (homework.id != "") {
subtiles.add(LessonSubtile( subtiles.add(LessonSubtile(
@@ -74,11 +78,16 @@ class LessonTile extends StatelessWidget {
} }
if (lesson.exam != "") { if (lesson.exam != "") {
Exam exam = Provider.of<ExamProvider>(context, listen: false).exams.firstWhere((t) => t.id == lesson.exam, orElse: () => Exam.fromJson({})); Exam exam = Provider.of<ExamProvider>(context, listen: false)
.exams
.firstWhere((t) => t.id == lesson.exam,
orElse: () => Exam.fromJson({}));
if (exam.id != "") { if (exam.id != "") {
subtiles.add(LessonSubtile( subtiles.add(LessonSubtile(
type: LessonSubtileType.exam, type: LessonSubtileType.exam,
title: exam.description != "" ? exam.description : exam.mode?.description ?? "exam".i18n, title: exam.description != ""
? exam.description
: exam.mode?.description ?? "exam".i18n,
onPressed: () => ExamView.show(exam, context: context), onPressed: () => ExamView.show(exam, context: context),
)); ));
} }
@@ -87,7 +96,10 @@ class LessonTile extends StatelessWidget {
String description = ''; String description = '';
String room = ''; String room = '';
final cleanDesc = lesson.description.specialChars().toLowerCase().replaceAll(lesson.subject.name.specialChars().toLowerCase(), ''); final cleanDesc = lesson.description
.specialChars()
.toLowerCase()
.replaceAll(lesson.subject.name.specialChars().toLowerCase(), '');
if (!swapDesc) { if (!swapDesc) {
if (cleanDesc != "") { if (cleanDesc != "") {
@@ -131,16 +143,23 @@ class LessonTile extends StatelessWidget {
// onLongPress: kDebugMode ? () => log(jsonEncode(lesson.json)) : null, // onLongPress: kDebugMode ? () => log(jsonEncode(lesson.json)) : null,
visualDensity: VisualDensity.compact, visualDensity: VisualDensity.compact,
contentPadding: const EdgeInsets.symmetric(horizontal: 4.0), contentPadding: const EdgeInsets.symmetric(horizontal: 4.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0)),
title: Text( title: Text(
!lesson.isEmpty ? lesson.subject.renamedTo ?? lesson.subject.name.capital() : "empty".i18n, !lesson.isEmpty
? lesson.subject.renamedTo ??
lesson.subject.name.capital()
: "empty".i18n,
maxLines: 2, maxLines: 2,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: 15.5, fontSize: 15.5,
color: AppColors.of(context).text.withOpacity(!lesson.isEmpty ? 1.0 : 0.5), color: AppColors.of(context)
fontStyle: lesson.subject.isRenamed ? FontStyle.italic : null), .text
.withOpacity(!lesson.isEmpty ? 1.0 : 0.5),
fontStyle:
lesson.subject.isRenamed ? FontStyle.italic : null),
), ),
subtitle: description != "" subtitle: description != ""
? Text( ? Text(
@@ -175,12 +194,20 @@ class LessonTile extends StatelessWidget {
offset: const Offset(-12.0, -2.0), offset: const Offset(-12.0, -2.0),
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: fillLeading ? Theme.of(context).colorScheme.secondary.withOpacity(.3) : const Color(0x00000000), color: fillLeading
? Theme.of(context)
.colorScheme
.secondary
.withOpacity(.3)
: const Color(0x00000000),
borderRadius: BorderRadius.circular(12.0), borderRadius: BorderRadius.circular(12.0),
boxShadow: [ boxShadow: [
if (fillLeading) if (fillLeading)
BoxShadow( BoxShadow(
color: Theme.of(context).colorScheme.secondary.withOpacity(.25), color: Theme.of(context)
.colorScheme
.secondary
.withOpacity(.25),
blurRadius: 6.0, blurRadius: 6.0,
) )
], ],
@@ -210,7 +237,9 @@ class LessonTile extends StatelessWidget {
maxLines: 2, maxLines: 2,
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
color: AppColors.of(context).text.withOpacity(.75), color: AppColors.of(context)
.text
.withOpacity(.75),
), ),
), ),
), ),
@@ -225,7 +254,9 @@ class LessonTile extends StatelessWidget {
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
color: AppColors.of(context).text.withOpacity(.9), color: AppColors.of(context)
.text
.withOpacity(.9),
), ),
), ),
], ],
@@ -249,7 +280,9 @@ class LessonTile extends StatelessWidget {
enum LessonSubtileType { homework, exam, absence } enum LessonSubtileType { homework, exam, absence }
class LessonSubtile extends StatelessWidget { class LessonSubtile extends StatelessWidget {
const LessonSubtile({Key? key, this.onPressed, required this.title, required this.type}) : super(key: key); const LessonSubtile(
{Key? key, this.onPressed, required this.title, required this.type})
: super(key: key);
final Function()? onPressed; final Function()? onPressed;
final String title; final String title;
@@ -285,7 +318,8 @@ class LessonSubtile extends StatelessWidget {
Center( Center(
child: SizedBox( child: SizedBox(
width: 30.0, width: 30.0,
child: Icon(icon, color: iconColor.withOpacity(.75), size: 20.0), child:
Icon(icon, color: iconColor.withOpacity(.75), size: 20.0),
), ),
), ),
Expanded( Expanded(
@@ -295,7 +329,9 @@ class LessonSubtile extends StatelessWidget {
title.escapeHtml(), title.escapeHtml(),
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: TextStyle(fontWeight: FontWeight.w500, color: AppColors.of(context).text.withOpacity(.65)), style: TextStyle(
fontWeight: FontWeight.w500,
color: AppColors.of(context).text.withOpacity(.65)),
), ),
), ),
), ),

View File

@@ -9,6 +9,7 @@ import connectivity_plus
import dynamic_color import dynamic_color
import flutter_acrylic import flutter_acrylic
import flutter_local_notifications import flutter_local_notifications
import package_info_plus
import path_provider_foundation import path_provider_foundation
import share_plus_macos import share_plus_macos
import sqflite import sqflite
@@ -19,6 +20,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin"))
FlutterAcrylicPlugin.register(with: registry.registrar(forPlugin: "FlutterAcrylicPlugin")) FlutterAcrylicPlugin.register(with: registry.registrar(forPlugin: "FlutterAcrylicPlugin"))
FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin"))
FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))

View File

@@ -1,40 +1,40 @@
platform :osx, '10.11' platform :osx, '10.14'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency. # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true' ENV['COCOAPODS_DISABLE_STATS'] = 'true'
project 'Runner', { project 'Runner', {
'Debug' => :debug, 'Debug' => :debug,
'Profile' => :release, 'Profile' => :release,
'Release' => :release, 'Release' => :release,
} }
def flutter_root def flutter_root
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__)
unless File.exist?(generated_xcode_build_settings_path) unless File.exist?(generated_xcode_build_settings_path)
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first"
end end
File.foreach(generated_xcode_build_settings_path) do |line| File.foreach(generated_xcode_build_settings_path) do |line|
matches = line.match(/FLUTTER_ROOT\=(.*)/) matches = line.match(/FLUTTER_ROOT\=(.*)/)
return matches[1].strip if matches return matches[1].strip if matches
end end
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\""
end end
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
flutter_macos_podfile_setup flutter_macos_podfile_setup
target 'Runner' do target 'Runner' do
use_frameworks! use_frameworks!
use_modular_headers! use_modular_headers!
flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))
end end
post_install do |installer| post_install do |installer|
installer.pods_project.targets.each do |target| installer.pods_project.targets.each do |target|
flutter_additional_macos_build_settings(target) flutter_additional_macos_build_settings(target)
end end
end end

View File

@@ -1,71 +1,78 @@
PODS: PODS:
- connectivity_plus (0.0.1): - connectivity_plus (0.0.1):
- FlutterMacOS - FlutterMacOS
- ReachabilitySwift - ReachabilitySwift
- dynamic_color (0.0.2): - dynamic_color (0.0.2):
- FlutterMacOS - FlutterMacOS
- flutter_acrylic (0.1.0): - flutter_acrylic (0.1.0):
- FlutterMacOS - FlutterMacOS
- FlutterMacOS (1.0.0) - flutter_local_notifications (0.0.1):
- FMDB (2.7.5): - FlutterMacOS
- FMDB/standard (= 2.7.5) - FlutterMacOS (1.0.0)
- FMDB/standard (2.7.5) - FMDB (2.7.5):
- path_provider_macos (0.0.1): - FMDB/standard (= 2.7.5)
- FlutterMacOS - FMDB/standard (2.7.5)
- ReachabilitySwift (5.0.0) - path_provider_foundation (0.0.1):
- share_plus_macos (0.0.1): - Flutter
- FlutterMacOS - FlutterMacOS
- sqflite (0.0.2): - ReachabilitySwift (5.0.0)
- FlutterMacOS - share_plus_macos (0.0.1):
- FMDB (>= 2.7.5) - FlutterMacOS
- url_launcher_macos (0.0.1): - sqflite (0.0.2):
- FlutterMacOS - FlutterMacOS
- FMDB (>= 2.7.5)
DEPENDENCIES: - url_launcher_macos (0.0.1):
- connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos`) - FlutterMacOS
- dynamic_color (from `Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos`)
- flutter_acrylic (from `Flutter/ephemeral/.symlinks/plugins/flutter_acrylic/macos`) DEPENDENCIES:
- FlutterMacOS (from `Flutter/ephemeral`) - connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos`)
- path_provider_macos (from `Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos`) - dynamic_color (from `Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos`)
- share_plus_macos (from `Flutter/ephemeral/.symlinks/plugins/share_plus_macos/macos`) - flutter_acrylic (from `Flutter/ephemeral/.symlinks/plugins/flutter_acrylic/macos`)
- sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`) - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`)
- url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) - FlutterMacOS (from `Flutter/ephemeral`)
- path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`)
SPEC REPOS: - share_plus_macos (from `Flutter/ephemeral/.symlinks/plugins/share_plus_macos/macos`)
trunk: - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`)
- FMDB - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`)
- ReachabilitySwift
SPEC REPOS:
EXTERNAL SOURCES: trunk:
connectivity_plus: - FMDB
:path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos - ReachabilitySwift
dynamic_color:
:path: Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos EXTERNAL SOURCES:
flutter_acrylic: connectivity_plus:
:path: Flutter/ephemeral/.symlinks/plugins/flutter_acrylic/macos :path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos
FlutterMacOS: dynamic_color:
:path: Flutter/ephemeral :path: Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos
path_provider_macos: flutter_acrylic:
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos :path: Flutter/ephemeral/.symlinks/plugins/flutter_acrylic/macos
share_plus_macos: flutter_local_notifications:
:path: Flutter/ephemeral/.symlinks/plugins/share_plus_macos/macos :path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos
sqflite: FlutterMacOS:
:path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos :path: Flutter/ephemeral
url_launcher_macos: path_provider_foundation:
:path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin
share_plus_macos:
SPEC CHECKSUMS: :path: Flutter/ephemeral/.symlinks/plugins/share_plus_macos/macos
connectivity_plus: 18d3c32514c886e046de60e9c13895109866c747 sqflite:
dynamic_color: 394d6a888650f8534e029b27d2f8bc5c64e44008 :path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos
flutter_acrylic: c3df24ae52ab6597197837ce59ef2a8542640c17 url_launcher_macos:
FlutterMacOS: ae6af50a8ea7d6103d888583d46bd8328a7e9811 :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
path_provider_macos: 3c0c3b4b0d4a76d2bf989a913c2de869c5641a19 SPEC CHECKSUMS:
ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 connectivity_plus: 18d3c32514c886e046de60e9c13895109866c747
share_plus_macos: 853ee48e7dce06b633998ca0735d482dd671ade4 dynamic_color: 2eaa27267de1ca20d879fbd6e01259773fb1670f
sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea flutter_acrylic: c3df24ae52ab6597197837ce59ef2a8542640c17
url_launcher_macos: 597e05b8e514239626bcf4a850fcf9ef5c856ec3 flutter_local_notifications: 3805ca215b2fb7f397d78b66db91f6a747af52e4
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
PODFILE CHECKSUM: 6eac6b3292e5142cfc23bdeb71848a40ec51c14c FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
path_provider_foundation: eaf5b3e458fc0e5fbb9940fb09980e853fe058b8
COCOAPODS: 1.11.3 ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825
share_plus_macos: 853ee48e7dce06b633998ca0735d482dd671ade4
sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea
url_launcher_macos: 5335912b679c073563f29d89d33d10d459f95451
PODFILE CHECKSUM: 353c8bcc5d5b0994e508d035b5431cfe18c1dea7
COCOAPODS: 1.12.1

File diff suppressed because it is too large Load Diff

View File

@@ -1,87 +1,87 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1400" LastUpgradeVersion = "1300"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"> buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForTesting = "YES" buildForTesting = "YES"
buildForRunning = "YES" buildForRunning = "YES"
buildForProfiling = "YES" buildForProfiling = "YES"
buildForArchiving = "YES" buildForArchiving = "YES"
buildForAnalyzing = "YES"> buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "33CC10EC2044A3C60003C045" BlueprintIdentifier = "33CC10EC2044A3C60003C045"
BuildableName = "Felt Diary.app" BuildableName = "Felt Diary.app"
BlueprintName = "Runner" BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj"> ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference> </BuildableReference>
</BuildActionEntry> </BuildActionEntry>
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug" buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion> <MacroExpansion>
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "33CC10EC2044A3C60003C045" BlueprintIdentifier = "33CC10EC2044A3C60003C045"
BuildableName = "Felt Diary.app" BuildableName = "Felt Diary.app"
BlueprintName = "Runner" BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj"> ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference> </BuildableReference>
</MacroExpansion> </MacroExpansion>
<Testables> <Testables>
</Testables> </Testables>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug" buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal" debugServiceExtension = "internal"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<BuildableProductRunnable <BuildableProductRunnable
runnableDebuggingMode = "0"> runnableDebuggingMode = "0">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "33CC10EC2044A3C60003C045" BlueprintIdentifier = "33CC10EC2044A3C60003C045"
BuildableName = "Felt Diary.app" BuildableName = "Felt Diary.app"
BlueprintName = "Runner" BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj"> ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference> </BuildableReference>
</BuildableProductRunnable> </BuildableProductRunnable>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Profile" buildConfiguration = "Profile"
shouldUseLaunchSchemeArgsEnv = "YES" shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES">
<BuildableProductRunnable <BuildableProductRunnable
runnableDebuggingMode = "0"> runnableDebuggingMode = "0">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "33CC10EC2044A3C60003C045" BlueprintIdentifier = "33CC10EC2044A3C60003C045"
BuildableName = "Felt Diary.app" BuildableName = "Felt Diary.app"
BlueprintName = "Runner" BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj"> ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference> </BuildableReference>
</BuildableProductRunnable> </BuildableProductRunnable>
</ProfileAction> </ProfileAction>
<AnalyzeAction <AnalyzeAction
buildConfiguration = "Debug"> buildConfiguration = "Debug">
</AnalyzeAction> </AnalyzeAction>
<ArchiveAction <ArchiveAction
buildConfiguration = "Release" buildConfiguration = "Release"
revealArchiveInOrganizer = "YES"> revealArchiveInOrganizer = "YES">
</ArchiveAction> </ArchiveAction>
</Scheme> </Scheme>

View File

@@ -3,7 +3,7 @@ description: "Nem hivatalos e-napló alkalmazás az e-Kréta rendszerhez"
homepage: https://refilc.hu homepage: https://refilc.hu
publish_to: "none" publish_to: "none"
version: 4.0.0+198 version: 4.0.3+210
environment: environment:
sdk: ">=2.17.0 <3.0.0" sdk: ">=2.17.0 <3.0.0"
@@ -67,6 +67,7 @@ dependencies:
animations: ^2.0.1 animations: ^2.0.1
background_fetch: ^1.1.5 background_fetch: ^1.1.5
flutter_local_notifications: ^14.1.0 flutter_local_notifications: ^14.1.0
package_info_plus: ^3.1.2
dev_dependencies: dev_dependencies:
flutter_lints: ^2.0.1 flutter_lints: ^2.0.1
@@ -146,11 +147,13 @@ flutter:
weight: 700 weight: 700
style: italic style: italic
flutter_icons: flutter_launcher_icons:
image_path: assets/icons/ic_launcher.png image_path: assets/icons/ic_android.png
android: true android: true
ios: true adaptive_icon_background: "#3D7BF4"
remove_alpha_ios: true adaptive_icon_foreground: assets/icons/ic_android.png
ios: false
remove_alpha_ios: false
flutter_native_splash: flutter_native_splash:
color: "#3D7BF4" color: "#3D7BF4"

View File

@@ -26,16 +26,18 @@ import 'package:flutter_expandable_fab/flutter_expandable_fab.dart';
import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:flutter_feather_icons/flutter_feather_icons.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'grades_page.i18n.dart'; import 'grades_page.i18n.dart';
// import 'package:filcnaplo_premium/ui/mobile/goalplanner/new_goal.dart'; //import 'package:filcnaplo_premium/ui/mobile/goal_planner/new_goal.dart';
class GradeSubjectView extends StatefulWidget { class GradeSubjectView extends StatefulWidget {
const GradeSubjectView(this.subject, {Key? key, this.groupAverage = 0.0}) : super(key: key); const GradeSubjectView(this.subject, {Key? key, this.groupAverage = 0.0})
: super(key: key);
final Subject subject; final Subject subject;
final double groupAverage; final double groupAverage;
void push(BuildContext context, {bool root = false}) { void push(BuildContext context, {bool root = false}) {
Navigator.of(context, rootNavigator: root).push(CupertinoPageRoute(builder: (context) => this)); Navigator.of(context, rootNavigator: root)
.push(CupertinoPageRoute(builder: (context) => this));
} }
@override @override
@@ -70,7 +72,9 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
final gradeDates = subjectGrades.map((e) => e.date.millisecondsSinceEpoch); final gradeDates = subjectGrades.map((e) => e.date.millisecondsSinceEpoch);
final maxGradeDate = gradeDates.fold(0, max); final maxGradeDate = gradeDates.fold(0, max);
final minGradeDate = gradeDates.fold(0, min); final minGradeDate = gradeDates.fold(0, min);
if (maxGradeDate - minGradeDate < const Duration(days: 5).inMilliseconds) return false; // naplo/#78 if (maxGradeDate - minGradeDate < const Duration(days: 5).inMilliseconds) {
return false; // naplo/#78
}
return subjectGrades.where((e) => e.type == GradeType.midYear).length > 1; return subjectGrades.where((e) => e.type == GradeType.midYear).length > 1;
} }
@@ -129,7 +133,8 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
), ),
); );
tiles.add(Padding(padding: EdgeInsets.only(bottom: !gradeCalcMode ? 24.0 : 250.0))); tiles.add(Padding(
padding: EdgeInsets.only(bottom: !gradeCalcMode ? 24.0 : 250.0)));
gradeTiles = List.castFrom(tiles); gradeTiles = List.castFrom(tiles);
} }
@@ -142,7 +147,10 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
average = AverageHelper.averageEvals(subjectGrades); average = AverageHelper.averageEvals(subjectGrades);
final prevAvg = subjectGrades.isNotEmpty final prevAvg = subjectGrades.isNotEmpty
? AverageHelper.averageEvals(subjectGrades ? AverageHelper.averageEvals(subjectGrades
.where((e) => e.date.isBefore(subjectGrades.reduce((v, e) => e.date.isAfter(v.date) ? e : v).date.subtract(const Duration(days: 30)))) .where((e) => e.date.isBefore(subjectGrades
.reduce((v, e) => e.date.isAfter(v.date) ? e : v)
.date
.subtract(const Duration(days: 30))))
.toList()) .toList())
: 0.0; : 0.0;
@@ -153,14 +161,17 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text("annual_average".i18n), Text("annual_average".i18n),
if (average != prevAvg) TrendDisplay(current: average, previous: prevAvg), if (average != prevAvg)
TrendDisplay(current: average, previous: prevAvg),
], ],
), ),
child: Container( child: Container(
padding: const EdgeInsets.only(top: 12.0, right: 12.0), padding: const EdgeInsets.only(top: 12.0, right: 12.0),
child: Row( child: Row(
children: [ children: [
Expanded(child: GradeGraph(subjectGrades, dayThreshold: 5, classAvg: widget.groupAverage)), Expanded(
child: GradeGraph(subjectGrades,
dayThreshold: 5, classAvg: widget.groupAverage)),
Padding( Padding(
padding: const EdgeInsets.only(bottom: 24.0), padding: const EdgeInsets.only(bottom: 24.0),
child: GradesCount(grades: subjectGrades), child: GradesCount(grades: subjectGrades),
@@ -174,7 +185,9 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
if (!gradeCalcMode) { if (!gradeCalcMode) {
buildTiles(subjectGrades); buildTiles(subjectGrades);
} else { } else {
List<Grade> ghostGrades = calculatorProvider.ghosts.where((e) => e.subject == widget.subject).toList(); List<Grade> ghostGrades = calculatorProvider.ghosts
.where((e) => e.subject == widget.subject)
.toList();
buildTiles(ghostGrades); buildTiles(ghostGrades);
} }
@@ -182,7 +195,10 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
key: _scaffoldKey, key: _scaffoldKey,
floatingActionButtonLocation: ExpandableFab.location, floatingActionButtonLocation: ExpandableFab.location,
floatingActionButton: Visibility( floatingActionButton: Visibility(
visible: !gradeCalcMode && subjectGrades.where((e) => e.type == GradeType.midYear).isNotEmpty, visible: !gradeCalcMode &&
subjectGrades
.where((e) => e.type == GradeType.midYear)
.isNotEmpty,
child: ExpandableFab( child: ExpandableFab(
type: ExpandableFabType.up, type: ExpandableFabType.up,
distance: 50, distance: 50,
@@ -215,12 +231,17 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
}, },
navBarItems: [ navBarItems: [
const SizedBox(width: 6.0), const SizedBox(width: 6.0),
if (widget.groupAverage != 0) Center(child: AverageDisplay(average: widget.groupAverage, border: true)), if (widget.groupAverage != 0)
Center(
child: AverageDisplay(
average: widget.groupAverage, border: true)),
const SizedBox(width: 6.0), const SizedBox(width: 6.0),
if (average != 0) Center(child: AverageDisplay(average: average)), if (average != 0)
Center(child: AverageDisplay(average: average)),
const SizedBox(width: 12.0), const SizedBox(width: 12.0),
], ],
icon: SubjectIcon.resolveVariant(subject: widget.subject, context: context), icon: SubjectIcon.resolveVariant(
subject: widget.subject, context: context),
scrollController: _scrollController, scrollController: _scrollController,
title: widget.subject.renamedTo ?? widget.subject.name.capital(), title: widget.subject.renamedTo ?? widget.subject.name.capital(),
italic: widget.subject.isRenamed, italic: widget.subject.isRenamed,
@@ -240,13 +261,15 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
void gradeCalc(BuildContext context) { void gradeCalc(BuildContext context) {
// Scroll to the top of the page // Scroll to the top of the page
_scrollController.animateTo(75, duration: const Duration(milliseconds: 500), curve: Curves.ease); _scrollController.animateTo(75,
duration: const Duration(milliseconds: 500), curve: Curves.ease);
calculatorProvider.clear(); calculatorProvider.clear();
calculatorProvider.addAllGrades(gradeProvider.grades); calculatorProvider.addAllGrades(gradeProvider.grades);
_sheetController = _scaffoldKey.currentState?.showBottomSheet( _sheetController = _scaffoldKey.currentState?.showBottomSheet(
(context) => RoundedBottomSheet(child: GradeCalculator(widget.subject), borderRadius: 14.0), (context) => RoundedBottomSheet(
child: GradeCalculator(widget.subject), borderRadius: 14.0),
backgroundColor: const Color(0x00000000), backgroundColor: const Color(0x00000000),
elevation: 12.0, elevation: 12.0,
); );

View File

@@ -41,13 +41,21 @@ class _GradesPageState extends State<GradesPage> {
int avgDropValue = 0; int avgDropValue = 0;
List<Grade> getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider.grades List<Grade> getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider
.where( .grades
(e) => e.subject == subject && e.type == GradeType.midYear && (days == 0 || e.date.isBefore(DateTime.now().subtract(Duration(days: days))))) .where((e) =>
e.subject == subject &&
e.type == GradeType.midYear &&
(days == 0 ||
e.date.isBefore(DateTime.now().subtract(Duration(days: days)))))
.toList(); .toList();
void generateTiles() { void generateTiles() {
List<Subject> subjects = gradeProvider.grades.map((e) => e.subject).toSet().toList()..sort((a, b) => a.name.compareTo(b.name)); List<Subject> subjects = gradeProvider.grades
.map((e) => e.subject)
.toSet()
.toList()
..sort((a, b) => a.name.compareTo(b.name));
List<Widget> tiles = []; List<Widget> tiles = [];
Map<Subject, double> subjectAvgs = {}; Map<Subject, double> subjectAvgs = {};
@@ -59,11 +67,15 @@ class _GradesPageState extends State<GradesPage> {
double averageBefore = 0.0; double averageBefore = 0.0;
if (avgDropValue != 0) { if (avgDropValue != 0) {
List<Grade> gradesBefore = getSubjectGrades(subject, days: avgDropValue); List<Grade> gradesBefore =
averageBefore = avgDropValue == 0 ? 0.0 : AverageHelper.averageEvals(gradesBefore); getSubjectGrades(subject, days: avgDropValue);
averageBefore =
avgDropValue == 0 ? 0.0 : AverageHelper.averageEvals(gradesBefore);
} }
var nullavg = GroupAverage(average: 0.0, subject: subject, uid: "0"); var nullavg = GroupAverage(average: 0.0, subject: subject, uid: "0");
double groupAverage = gradeProvider.groupAverages.firstWhere((e) => e.subject == subject, orElse: () => nullavg).average; double groupAverage = gradeProvider.groupAverages
.firstWhere((e) => e.subject == subject, orElse: () => nullavg)
.average;
if (avg != 0) subjectAvgs[subject] = avg; if (avg != 0) subjectAvgs[subject] = avg;
@@ -73,7 +85,8 @@ class _GradesPageState extends State<GradesPage> {
average: avg, average: avg,
groupAverage: avgDropValue == 0 ? groupAverage : 0.0, groupAverage: avgDropValue == 0 ? groupAverage : 0.0,
onTap: () { onTap: () {
GradeSubjectView(subject, groupAverage: groupAverage).push(context, root: true); GradeSubjectView(subject, groupAverage: groupAverage)
.push(context, root: true);
}, },
); );
})); }));
@@ -81,7 +94,12 @@ class _GradesPageState extends State<GradesPage> {
if (tiles.isNotEmpty) { if (tiles.isNotEmpty) {
tiles.insert(0, yearlyGraph); tiles.insert(0, yearlyGraph);
tiles.insert(1, FailWarning(subjectAvgs: subjectAvgs)); tiles.insert(1, FailWarning(subjectAvgs: subjectAvgs));
tiles.insert(2, PanelTitle(title: Text(avgDropValue == 0 ? "Subjects".i18n : "Subjects_changes".i18n))); tiles.insert(
2,
PanelTitle(
title: Text(avgDropValue == 0
? "Subjects".i18n
: "Subjects_changes".i18n)));
tiles.insert(3, const PanelHeader(padding: EdgeInsets.only(top: 12.0))); tiles.insert(3, const PanelHeader(padding: EdgeInsets.only(top: 12.0)));
tiles.add(const PanelFooter(padding: EdgeInsets.only(bottom: 12.0))); tiles.add(const PanelFooter(padding: EdgeInsets.only(bottom: 12.0)));
tiles.add(const Padding(padding: EdgeInsets.only(bottom: 24.0))); tiles.add(const Padding(padding: EdgeInsets.only(bottom: 24.0)));
@@ -95,9 +113,15 @@ class _GradesPageState extends State<GradesPage> {
); );
} }
double subjectAvg = subjectAvgs.isNotEmpty ? subjectAvgs.values.fold(0.0, (double a, double b) => a + b) / subjectAvgs.length : 0.0; double subjectAvg = subjectAvgs.isNotEmpty
? subjectAvgs.values.fold(0.0, (double a, double b) => a + b) /
subjectAvgs.length
: 0.0;
final double classAvg = gradeProvider.groupAverages.isNotEmpty final double classAvg = gradeProvider.groupAverages.isNotEmpty
? gradeProvider.groupAverages.map((e) => e.average).fold(0.0, (double a, double b) => a + b) / gradeProvider.groupAverages.length ? gradeProvider.groupAverages
.map((e) => e.average)
.fold(0.0, (double a, double b) => a + b) /
gradeProvider.groupAverages.length
: 0.0; : 0.0;
if (subjectAvg > 0) { if (subjectAvg > 0) {
@@ -151,18 +175,31 @@ class _GradesPageState extends State<GradesPage> {
final double totalClassAvg = gradeProvider.groupAverages.isEmpty final double totalClassAvg = gradeProvider.groupAverages.isEmpty
? 0.0 ? 0.0
: gradeProvider.groupAverages.map((e) => e.average).fold(0.0, (double a, double b) => a + b) / gradeProvider.groupAverages.length; : gradeProvider.groupAverages
.map((e) => e.average)
.fold(0.0, (double a, double b) => a + b) /
gradeProvider.groupAverages.length;
final now = gradeProvider.grades.isNotEmpty ? gradeProvider.grades.reduce((v, e) => e.date.isAfter(v.date) ? e : v).date : DateTime.now(); final now = gradeProvider.grades.isNotEmpty
? gradeProvider.grades
.reduce((v, e) => e.date.isAfter(v.date) ? e : v)
.date
: DateTime.now();
final currentStudentAvg = AverageHelper.averageEvals(gradeProvider.grades.where((e) => e.type == GradeType.midYear).toList()); final currentStudentAvg = AverageHelper.averageEvals(gradeProvider.grades
.where((e) => e.type == GradeType.midYear)
.toList());
final prevStudentAvg = AverageHelper.averageEvals(gradeProvider.grades final prevStudentAvg = AverageHelper.averageEvals(gradeProvider.grades
.where((e) => e.type == GradeType.midYear) .where((e) => e.type == GradeType.midYear)
.where((e) => e.date.isBefore(now.subtract(const Duration(days: 30)))) .where((e) => e.date.isBefore(now.subtract(const Duration(days: 30))))
.toList()); .toList());
List<Grade> graphGrades = gradeProvider.grades List<Grade> graphGrades = gradeProvider.grades
.where((e) => e.type == GradeType.midYear && (avgDropValue == 0 || e.date.isAfter(DateTime.now().subtract(Duration(days: avgDropValue))))) .where((e) =>
e.type == GradeType.midYear &&
(avgDropValue == 0 ||
e.date.isAfter(
DateTime.now().subtract(Duration(days: avgDropValue)))))
.toList(); .toList();
yearlyGraph = Padding( yearlyGraph = Padding(
@@ -183,8 +220,12 @@ class _GradesPageState extends State<GradesPage> {
children: [ children: [
// if (totalClassAvg >= 1.0) AverageDisplay(average: totalClassAvg, border: true), // if (totalClassAvg >= 1.0) AverageDisplay(average: totalClassAvg, border: true),
// const SizedBox(width: 4.0), // const SizedBox(width: 4.0),
TrendDisplay(previous: prevStudentAvg, current: currentStudentAvg), TrendDisplay(
if (gradeProvider.grades.where((e) => e.type == GradeType.midYear).isNotEmpty) AverageDisplay(average: currentStudentAvg), previous: prevStudentAvg, current: currentStudentAvg),
if (gradeProvider.grades
.where((e) => e.type == GradeType.midYear)
.isNotEmpty)
AverageDisplay(average: currentStudentAvg),
], ],
) )
], ],
@@ -193,7 +234,9 @@ class _GradesPageState extends State<GradesPage> {
padding: const EdgeInsets.only(top: 12.0, right: 12.0), padding: const EdgeInsets.only(top: 12.0, right: 12.0),
child: Row( child: Row(
children: [ children: [
Expanded(child: GradeGraph(graphGrades, dayThreshold: 2, classAvg: totalClassAvg)), Expanded(
child: GradeGraph(graphGrades,
dayThreshold: 2, classAvg: totalClassAvg)),
Padding( Padding(
padding: const EdgeInsets.only(bottom: 24.0), padding: const EdgeInsets.only(bottom: 24.0),
child: GradesCount(grades: graphGrades), child: GradesCount(grades: graphGrades),
@@ -210,7 +253,8 @@ class _GradesPageState extends State<GradesPage> {
body: Padding( body: Padding(
padding: const EdgeInsets.only(top: 9.0), padding: const EdgeInsets.only(top: 9.0),
child: NestedScrollView( child: NestedScrollView(
physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()), physics: const BouncingScrollPhysics(
parent: AlwaysScrollableScrollPhysics()),
headerSliverBuilder: (context, _) => [ headerSliverBuilder: (context, _) => [
SliverAppBar( SliverAppBar(
centerTitle: false, centerTitle: false,
@@ -223,7 +267,10 @@ class _GradesPageState extends State<GradesPage> {
padding: const EdgeInsets.only(left: 8.0), padding: const EdgeInsets.only(left: 8.0),
child: Text( child: Text(
"Grades".i18n, "Grades".i18n,
style: TextStyle(color: AppColors.of(context).text, fontSize: 32.0, fontWeight: FontWeight.bold), style: TextStyle(
color: AppColors.of(context).text,
fontSize: 32.0,
fontWeight: FontWeight.bold),
), ),
), ),
shadowColor: Theme.of(context).shadowColor, shadowColor: Theme.of(context).shadowColor,
@@ -238,7 +285,8 @@ class _GradesPageState extends State<GradesPage> {
itemCount: max(subjectTiles.length, 1), itemCount: max(subjectTiles.length, 1),
itemBuilder: (context, index) { itemBuilder: (context, index) {
if (subjectTiles.isNotEmpty) { if (subjectTiles.isNotEmpty) {
EdgeInsetsGeometry panelPadding = const EdgeInsets.symmetric(horizontal: 24.0); EdgeInsetsGeometry panelPadding =
const EdgeInsets.symmetric(horizontal: 24.0);
if (subjectTiles[index].runtimeType == GradeSubjectTile) { if (subjectTiles[index].runtimeType == GradeSubjectTile) {
return Padding( return Padding(
@@ -248,7 +296,8 @@ class _GradesPageState extends State<GradesPage> {
padding: const EdgeInsets.symmetric(horizontal: 8.0), padding: const EdgeInsets.symmetric(horizontal: 8.0),
)); ));
} else { } else {
return Padding(padding: panelPadding, child: subjectTiles[index]); return Padding(
padding: panelPadding, child: subjectTiles[index]);
} }
} else { } else {
return Container(); return Container();

Some files were not shown because too many files have changed in this diff Show More