Compare commits

..

130 Commits

Author SHA1 Message Date
007e4404c1
Remove Jenkinsfile 2025-05-02 16:16:56 +02:00
BalazsManus
4bc578ef06 get out submodule
Some checks failed
Firka/student-legacy/pipeline/head There was a failure building this commit
2025-02-21 20:31:53 +01:00
8a3002ade1 remove random slashes 2025-02-20 14:07:29 +01:00
ca06073f37 update packages, remove overrides 2025-02-20 14:07:13 +01:00
52dd14d10b Merge pull request 'Hibás merge visszavonása' (#5) from balint14/student-legacy:master into master
Reviewed-on: refilc/student-legacy#5
2025-02-19 21:28:49 +01:00
dd787effbc Hibás merge visszavonása 2025-02-19 21:23:36 +01:00
BalazsManus
7eac57b94d remove sum hardcoded shit 2025-02-16 17:19:32 +01:00
BalazsManus
ee0ba71c8f do something to make apk size smaller (80mb at highest) 2025-02-16 13:51:06 +01:00
BalazsManus
ab64faeadb change ver number 2025-02-15 13:55:10 +01:00
BalazsManus
1460f2aa4e merge #144 2025-02-15 13:37:05 +01:00
BalazsManus
8925b3a5f8 move some settings to extras 2025-02-15 13:36:18 +01:00
eb0308cbed Update README.md 2025-02-15 11:30:25 +01:00
c90e01737c Merge pull request 'Merge pull request 'readme update' (#3) from master into dev' (#4) from dev into master
Reviewed-on: refilc/student-legacy#4
2025-02-15 11:29:56 +01:00
05c406657a Merge pull request 'readme update' (#3) from master into dev
Reviewed-on: refilc/student-legacy#3
2025-02-15 11:29:33 +01:00
fc402eef16 Merge branch 'dev' into master 2025-02-15 11:29:14 +01:00
BalazsManus
e9cfc7bbfc mar nem emlekszem 2025-02-14 17:57:12 +01:00
BalazsManus
7e711d64e8 idk 2025-02-14 17:18:23 +01:00
BalazsManus
80008d8f00 remove cloud + remove if true 2025-02-14 16:52:44 +01:00
81267d54e3 Update README.md
Signed-off-by: BalazsManus <balazsmanus@noreply.localhost>
2025-02-14 15:53:12 +01:00
BalazsManus
0dc921c603 push other updates 2025-02-14 15:28:18 +01:00
BalazsManus
4e23b745f3 push updates 2025-02-14 14:43:17 +01:00
BalazsManus
ce91b47ad1 oopsie 2025-02-14 14:35:58 +01:00
BalazsManus
250ed2f105 edit stuff, maybe it workie now 2025-02-14 14:30:31 +01:00
BalazsManus
4cde28cd72 utf9 bruh 2025-02-14 14:14:51 +01:00
BalazsManus
df63c258b3 fixes news? 2025-02-14 14:13:56 +01:00
BalazsManus
1b6992132e remove not working uwu mode, more 2025-02-14 08:25:23 +01:00
BalazsManus
55350b0e5d change stickermap url 2025-02-14 08:21:08 +01:00
BalazsManus
8d532a442d disable analytics by default 2025-02-14 08:04:16 +01:00
BalazsManus
cc4091e165 fuck ads 2025-02-14 08:04:01 +01:00
BalazsManus
1f05f1d091 nuke out cloud sync 2025-02-14 08:03:54 +01:00
BalazsManus
cc04293ead update sum, idk 2025-02-14 07:54:31 +01:00
e1cae2f698 Update README.md 2025-02-13 22:21:54 +01:00
84a3e46ff7 Update README.md 2025-02-13 22:17:27 +01:00
a9360c6dc8 Update README.md 2025-02-13 22:15:15 +01:00
5d9c975b98 Update README.md 2025-02-13 22:14:20 +01:00
0b47155862 Update README.md 2025-02-13 22:13:09 +01:00
8662775e21 small modifications 2025-02-13 22:11:34 +01:00
BalazsManus
2ac948539c idk what i did 2025-02-13 20:54:28 +01:00
b93ea7193d Merge pull request 'dev' (#2) from dev into master
Reviewed-on: refilc/student-legacy#2
2025-02-13 20:36:22 +01:00
b6b5c71cef Merge branch 'master' into dev 2025-02-13 20:36:15 +01:00
BalazsManus
0cf62aea86 fix 2025-02-13 20:35:59 +01:00
BalazsManus
f2f3366e2c edit 2025-02-13 20:34:36 +01:00
4b7845c31e no
Signed-off-by: BalazsManus <balazsmanus@noreply.localhost>
2025-02-13 17:40:05 +01:00
08519ebf27 Update refilc_mobile_ui/lib/screens/settings/settings_screen.dart 2025-02-13 17:02:14 +01:00
BalazsManus
894b3ac5b5 patch up stuff 2025-02-13 15:37:04 +01:00
BalazsManus
4135503a30 force push 2025-02-13 14:44:08 +01:00
Marton Kiss
7f9bd34a82 version shit 2025-02-11 13:34:52 +01:00
Marton Kiss
64dfe4a814 updated version 2025-02-11 13:24:24 +01:00
Marton Kiss
6568e3c588 fixed ios crash 2025-02-11 13:15:40 +01:00
Marton Kiss
1109c08cf5 removed unnecessary api request from login page 2025-02-07 09:55:22 +01:00
Marton Kiss
9cfbcc932b remove unused imports 2025-02-04 11:03:01 +01:00
Marton Kiss
843224f348 fixed deprecated warnings 2025-01-31 10:24:49 +01:00
Marton Kiss
b5ee1afe05 fixed deprecated warnings 2025-01-31 10:24:37 +01:00
Marton Kiss
67649cc5fd fixed live activity coloring 2025-01-31 10:20:52 +01:00
Marton Kiss
ee0e724b8a changed build 2025-01-30 12:14:48 +01:00
Marton Kiss
d6e783f375 changed jdk to version 17 (jetbrains) 2025-01-30 12:04:05 +01:00
Marton Kiss
1e89359333 changed build number 2025-01-30 11:12:29 +01:00
Marton Kiss
24f8804f60 fixed build errors and account switching token issue 2025-01-30 11:08:27 +01:00
Marton Kiss
300b951014 other things 2025-01-27 18:21:26 +01:00
Marton Kiss
8b49007cca something 2025-01-27 18:21:17 +01:00
Marton Kiss
4101dc7c17 ok 2025-01-27 12:16:46 +01:00
Marton Kiss
939cc6bbe2 removed desktop even more 2025-01-27 12:10:21 +01:00
Márton Kiss
13e00f8462
Merge pull request #149 from SMmest3r/dev
disable sleep while countdown is full screen (maybe?)
2025-01-27 09:34:06 +01:00
sms mester
7d89ea0f5d disable sleep while countdown is full screen 2025-01-24 10:50:33 +01:00
Marton Kiss
fe4d7b318e ios version number bump 2025-01-22 10:26:39 +01:00
Marton Kiss
0464624648 optimize and fix 2025-01-21 14:12:47 +01:00
Márton Kiss
d09f3772a3
Merge pull request #147 from SMmest3r/dev
fixed grade streak
2025-01-21 13:47:34 +01:00
sms mester
a7ff9e7825 fix again 2025-01-21 13:45:59 +01:00
sms mester
bc3f8cfff9 fixed grade streak 2025-01-21 13:42:59 +01:00
Marton Kiss
063cc99d1a something 2025-01-21 13:37:51 +01:00
Marton Kiss
739e75160d maybe optimized shit 2025-01-21 13:37:42 +01:00
Marton Kiss
889d0d6057 changed version number 2025-01-11 12:38:36 +01:00
Marton Kiss
f5a7820991 fixed android building 2025-01-11 12:37:55 +01:00
Marton Kiss
580f93fa6f everything should work now 2025-01-03 17:54:29 +01:00
Marton Kiss
654c12e9fb removed dynamic icon, fixed tools.py 2025-01-03 17:04:57 +01:00
Marton Kiss
7ab14756a6 ready to test 2025-01-03 16:14:32 +01:00
Marton Kiss
0a02d4e831 temporary removed notifications 2025-01-03 16:03:42 +01:00
Marton Kiss
ac3429f30f changed sdk version 2025-01-03 15:42:47 +01:00
Marton Kiss
6388650c77 removed desktop ui and optimized other things 2025-01-03 15:42:31 +01:00
Márton Kiss
728534170c
Merge pull request #145 from refilc/master
back to dev oopsie
2025-01-03 15:26:44 +01:00
Márton Kiss
f4d840462e
Merge branch 'dev' into master 2025-01-03 15:26:35 +01:00
Marton Kiss
b08b127895 yes 2025-01-03 15:22:29 +01:00
Marton Kiss
d41872e6e2 updated sdk requirement 2025-01-03 15:22:01 +01:00
Marton Kiss
0602c2ea3f optimized and updated things 2025-01-03 15:21:28 +01:00
Kima
afcff10862 some progress in cloud sync and paypal support almost done 2024-12-02 23:13:26 +01:00
Kima
9e187fc04c Merge branch 'dev' of github.com:refilc/naplo into dev 2024-11-16 22:21:26 +01:00
Kima
7d5b97fe00 started working on cloud sync (testing) 2024-11-16 22:21:22 +01:00
Márton Kiss
fd3b21b8e6
Merge pull request #142 from balint1414/dev
gradestreak probléma javítás: nem ignorálja a szöveges értékelést
2024-11-16 19:55:53 +01:00
balint1414
071f682f77 gradestreak: javítás (2) 2024-11-16 15:41:41 +01:00
balint1414
8723f75889 gradestreak probléma javítás: nem ignorálja a szöveges értékelést 2024-11-16 12:25:27 +01:00
Kima
c9666f5333 Merge branch 'dev' of github.com:refilc/naplo into dev 2024-11-15 23:55:05 +01:00
Kima
a218b62742 removed unused dependencies 2024-11-15 23:53:39 +01:00
Kima
41b1d899d0 removed unused dependencies 2024-11-15 23:52:40 +01:00
Márton Kiss
ad18efd340
Merge pull request #131 from balint1414/dev
Fektetett órarend hibás kiírás javítása
2024-11-15 21:00:46 +01:00
balint1414
cf0dc50df5 Fektetett órarend: 0. óra és utolsó óra megjelenítése 2024-11-15 20:43:18 +01:00
Márton Kiss
994d3085bb
Merge pull request #141 from refilc/dev
dev to master
2024-11-14 21:14:46 +01:00
Kima
6292708ba0 changed build number 2024-11-14 21:14:13 +01:00
Kima
a26ca67892 Merge branch 'dev' of github.com:refilc/naplo into dev 2024-11-14 21:13:11 +01:00
Kima
f2d6b6079e fixed qr scanner size on smaller phones 2024-11-14 21:13:06 +01:00
Márton Kiss
4faee05823
Merge pull request #140 from refilc/master
everything back to dev
2024-11-14 17:14:34 +01:00
Márton Kiss
864701fd1e
Merge pull request #139 from refilc/dev
dev to master
2024-11-14 17:13:45 +01:00
Kima
80d50cd82b Merge branch 'dev' of github.com:refilc/naplo into dev 2024-11-14 17:12:41 +01:00
Kima
521f609707 forgot to push lol 2024-11-14 17:12:38 +01:00
Tihanyi Marcell
96ff70d7d5
Merge pull request #138 from refilc/dev
Bitcode removal, Crash fixed caused by Live Activity
2024-11-14 15:10:46 +01:00
Tihanyi Marcell
658bfe38a3 Bitcode removal, Crash fixed caused by Live Activity 2024-11-14 15:06:38 +01:00
Márton Kiss
a74b2cd3d7
Merge pull request #137 from refilc/dev
dev to master
2024-11-13 21:08:13 +01:00
Kima
414755c777 okay that's it bye 2024-11-13 20:51:24 +01:00
Kima
3708b917c4 finished qr scanner (test) 2024-11-13 20:25:13 +01:00
Kima
986b13de68 changed version number 2024-11-13 19:12:09 +01:00
Kima
d391448870 remove prints 2024-11-13 19:11:08 +01:00
Kima
38d9b5f3b2 fixed login finally 2024-11-13 19:10:48 +01:00
Kima
2dafe5ed02 updated packages, did things and maybe finally fixed login issue 2024-11-12 23:27:14 +01:00
Kima
939761695f working error handling for theme sharing 2024-10-10 20:48:21 +02:00
Kima
f1ba5230fc added theme share error handling for ratelimit response 2024-10-10 18:11:41 +02:00
Kima
a50f449f7c added extra fields in news objects 2024-10-07 22:33:52 +02:00
Kima
fe3ed31830 added new analytics option to db 2024-10-06 23:56:56 +02:00
Kima
0ec33f8631 changed subscription document acceptance 2024-10-06 23:53:24 +02:00
Kima
6634010b97 made re-activation easier 2024-10-02 21:17:03 +02:00
Kima
816ddf58a2 changed how analytics work 2024-10-02 21:06:01 +02:00
Kima
d7741ca1c4 tried testing sync bug and fixed ads even more 2024-09-28 17:33:57 +02:00
Kima
a2cbe5d90b changed version number 2024-09-28 17:04:28 +02:00
Kima
7919d0e284 added grade delay to details and other small shit 2024-09-27 23:07:18 +02:00
Kima
92fe3b7dcd fixed yellow lines at profile image grade streak indicator 2024-09-27 22:02:31 +02:00
Kima
63fd37c31f the ads got more acceptable 2024-09-27 21:37:06 +02:00
Kima
aa10f0672e show ads only in even hours 2024-09-27 21:30:32 +02:00
Kima
a3694b59ec doing something with ads 2024-09-27 21:28:07 +02:00
Kima
9ecee0bb01 hide "ads" if user has plus 2024-09-27 20:51:01 +02:00
balint1414
b9e9bef182 Fektetett órarend hibás kiírás javítása 2024-09-03 18:49:55 +02:00
51297ddc09 Merge branch 'dev' of github.com:refilc/naplo into dev 2024-08-22 22:46:13 +02:00
4d64705e59 fix for padding 2024-08-22 22:46:11 +02:00
288 changed files with 10275 additions and 8836 deletions

9
.gitignore vendored
View File

@ -12,10 +12,10 @@ refilc/build/
refilc/android/key.properties refilc/android/key.properties
refilc/android/debug.keystore refilc/android/debug.keystore
refilc_desktop_ui/.flutter-plugins # refilc_desktop_ui/.flutter-plugins
refilc_desktop_ui/.flutter-plugins-dependencies # refilc_desktop_ui/.flutter-plugins-dependencies
refilc_desktop_ui/pubspec.lock # refilc_desktop_ui/pubspec.lock
refilc_desktop_ui/.dart_tool/ # refilc_desktop_ui/.dart_tool/
refilc_kreta_api/.flutter-plugins refilc_kreta_api/.flutter-plugins
refilc_kreta_api/.flutter-plugins-dependencies refilc_kreta_api/.flutter-plugins-dependencies
@ -37,6 +37,7 @@ refilc_mobile_ui/.dart_tool/
.idea .idea
.gitmodules .gitmodules
.gradle .gradle
.kotlin
refilc/.DS_Store refilc/.DS_Store
.DS_Store .DS_Store

3
.gitmodules vendored
View File

@ -1,3 +0,0 @@
[submodule "naplo-plus"]
path = refilc_plus
url = git@github.com:refilc/naplo-plus.git

File diff suppressed because it is too large Load Diff

View File

@ -1,25 +1,28 @@
<component name="libraryTable"> <component name="libraryTable">
<library name="Dart SDK"> <library name="Dart SDK">
<CLASSES> <CLASSES>
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/async" /> <root url="file://P:/flutter/bin/cache/dart-sdk/lib/async" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/cli" /> <root url="file://P:/flutter/bin/cache/dart-sdk/lib/cli" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/collection" /> <root url="file://P:/flutter/bin/cache/dart-sdk/lib/collection" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/convert" /> <root url="file://P:/flutter/bin/cache/dart-sdk/lib/concurrent" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/core" /> <root url="file://P:/flutter/bin/cache/dart-sdk/lib/convert" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/developer" /> <root url="file://P:/flutter/bin/cache/dart-sdk/lib/core" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/ffi" /> <root url="file://P:/flutter/bin/cache/dart-sdk/lib/developer" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/html" /> <root url="file://P:/flutter/bin/cache/dart-sdk/lib/ffi" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/indexed_db" /> <root url="file://P:/flutter/bin/cache/dart-sdk/lib/html" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/io" /> <root url="file://P:/flutter/bin/cache/dart-sdk/lib/indexed_db" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/isolate" /> <root url="file://P:/flutter/bin/cache/dart-sdk/lib/io" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/js" /> <root url="file://P:/flutter/bin/cache/dart-sdk/lib/isolate" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/js_util" /> <root url="file://P:/flutter/bin/cache/dart-sdk/lib/js" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/math" /> <root url="file://P:/flutter/bin/cache/dart-sdk/lib/js_interop" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/mirrors" /> <root url="file://P:/flutter/bin/cache/dart-sdk/lib/js_interop_unsafe" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/svg" /> <root url="file://P:/flutter/bin/cache/dart-sdk/lib/js_util" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/typed_data" /> <root url="file://P:/flutter/bin/cache/dart-sdk/lib/math" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/web_audio" /> <root url="file://P:/flutter/bin/cache/dart-sdk/lib/mirrors" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/web_gl" /> <root url="file://P:/flutter/bin/cache/dart-sdk/lib/svg" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/typed_data" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/web_audio" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/web_gl" />
</CLASSES> </CLASSES>
<JAVADOC /> <JAVADOC />
<SOURCES /> <SOURCES />

1
.idea/misc.xml generated
View File

@ -1,4 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Android API 33, extension level 3 Platform" project-jdk-type="Android SDK" /> <component name="ProjectRootManager" version="2" project-jdk-name="Android API 33, extension level 3 Platform" project-jdk-type="Android SDK" />
</project> </project>

13
.idea/naplo.iml generated
View File

@ -60,8 +60,21 @@
<excludeFolder url="file://$MODULE_DIR$/filcnaplo/linux/flutter/ephemeral/.plugin_symlinks/flutter_acrylic/build" /> <excludeFolder url="file://$MODULE_DIR$/filcnaplo/linux/flutter/ephemeral/.plugin_symlinks/flutter_acrylic/build" />
<excludeFolder url="file://$MODULE_DIR$/filcnaplo/linux/flutter/ephemeral/.plugin_symlinks/flutter_acrylic/.pub" /> <excludeFolder url="file://$MODULE_DIR$/filcnaplo/linux/flutter/ephemeral/.plugin_symlinks/flutter_acrylic/.pub" />
<excludeFolder url="file://$MODULE_DIR$/filcnaplo/linux/flutter/ephemeral/.plugin_symlinks/flutter_acrylic/.dart_tool" /> <excludeFolder url="file://$MODULE_DIR$/filcnaplo/linux/flutter/ephemeral/.plugin_symlinks/flutter_acrylic/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/refilc/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/refilc/.pub" />
<excludeFolder url="file://$MODULE_DIR$/refilc/build" />
<excludeFolder url="file://$MODULE_DIR$/refilc_kreta_api/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/refilc_kreta_api/.pub" />
<excludeFolder url="file://$MODULE_DIR$/refilc_kreta_api/build" />
<excludeFolder url="file://$MODULE_DIR$/refilc_mobile_ui/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/refilc_mobile_ui/.pub" />
<excludeFolder url="file://$MODULE_DIR$/refilc_mobile_ui/build" />
<excludeFolder url="file://$MODULE_DIR$/refilc_plus/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/refilc_plus/.pub" />
<excludeFolder url="file://$MODULE_DIR$/refilc_plus/build" />
</content> </content>
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Dart SDK" level="project" />
</component> </component>
</module> </module>

5
.idea/vcs.xml generated
View File

@ -2,9 +2,6 @@
<project version="4"> <project version="4">
<component name="VcsDirectoryMappings"> <component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" /> <mapping directory="" vcs="Git" />
<mapping directory="$PROJECT_DIR$/filcnaplo_desktop_ui" vcs="Git" /> <mapping directory="$PROJECT_DIR$/refilc_plus" vcs="Git" />
<mapping directory="$PROJECT_DIR$/filcnaplo_kreta_api" vcs="Git" />
<mapping directory="$PROJECT_DIR$/filcnaplo_mobile_ui" vcs="Git" />
<mapping directory="$PROJECT_DIR$/filcnaplo_premium" vcs="Git" />
</component> </component>
</project> </project>

56
Jenkinsfile vendored
View File

@ -1,56 +0,0 @@
pipeline {
agent any
environment {
ANDROID_SDK = '/home/jenkins/flutter_things/android-sdk'
ANDROID_PATH="$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools"
FLUTTER = '/home/jenkins/flutter_things/flutter/bin'
PATH = "$PATH:$ANDROID_PATH:$FLUTTER"
//TODO: need to fix flutter
}
stages {
stage('Copy Key Properties') {
steps {
// Copy the key.properties file
sh 'cp /home/jenkins/key.properties refilc/android/key.properties'
}
}
stage('Flutter Doctor') {
steps {
// Ensure Flutter is set up correctly
sh 'flutter doctor'
}
}
stage('Dependencies') {
steps {
// Get Flutter dependencies
sh 'cd refilc && flutter pub get'
}
}
stage('Build') {
steps {
// Build the Flutter project
sh 'cd refilc && flutter build apk --release'
}
}
stage('Archive') {
steps {
// Archive the APK
archiveArtifacts artifacts: 'build/app/outputs/flutter-apk/app-release.apk', fingerprint: true
}
}
}
post {
always {
// Clean up workspace after build
cleanWs()
}
}
}

119
README.md
View File

@ -1,52 +1,67 @@
<p align=center> <p align=center>
<img src="https://refilc.hu/image/brand/logo.png" width=150> <img src="https://raw.githubusercontent.com/Laky2k8/Refilc-2-Episode-1/refs/heads/master/refilc-2-real.png" 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 e-KRÉTA rendszerhez - tanulóktól, tanulóknak. #### Nem hivatalos e-napló alkalmazás az e-KRÉTA rendszerhez - tanulóktól, tanulóknak.
[![Downloads](https://img.shields.io/github/downloads-pre/refilc/naplo/total?&logo=github&label=Downloads)](https://github.com/refilc/naplo/releases) &nbsp; [![Discord](https://img.shields.io/discord/1111649116020285532?logo=discord&label=Discord)](https://dc.refilc.hu) [![Downloads](https://img.shields.io/github/downloads-pre/refilc/naplo/total?&logo=github&label=Downloads)](https://github.com/refilc/naplo/releases) &nbsp; [![Discord](https://img.shields.io/discord/1111649116020285532?logo=discord&label=Discord)](https://discord.gg/refilc-1111649116020285532)
## Setup ## Környezet felállítása
### Clone the project ### Source code letöltése
<em>A teljes source eléréséhez szükséged lesz a naplo-plus repo-ra is, mely biztonsági okokból privát. Írj Discord szerverünkön, hogy kaphass hozzáférést.</em> *Az építhéshez szükséged lesz a refilc_plus repora is, amit itt találsz: [student-plus](https://git.qwit.cloud/refilc/student-plus)*
```sh ```sh
git clone --branch dev https://github.com/refilc/naplo --recursive git clone https://git.qwit.cloud/refilc/student-legacy.git --recursive
cd naplo cd naplo
``` # ha ez nem töltött le refilc plus repoba értelmes dolgokat futtasd a többi parancsot is
rm -rf refilc_plus
### Install packages git clone https://git.qwit.cloud/refilc/student-plus.git refilc_plus
```
Run `fix-pub.sh`
### Csomagok telepítése
### Run the app
Menj be minden mappába és futtasd a következő parancsokat:
```sh ```sh
cd refilc flutter clean
flutter run (--release) flutter pub get
``` ```
### Contribution ### Alkalmazás építése
**Nézd meg a [Contribution guide](CONTRIBUTING.md)-ot!** ```sh
cd refilc
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. flutter build apk --release
```
-------
*Ez egy apk fájlt fog építeni*
# Team
### Contribution
**kima:** head developer / project manager
**Nézd meg a [Contribution guide](CONTRIBUTING.md)-ot!**
**Reiner, pdf, Pearoo, Zizi:** community- and project manager / developer
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.
**vrolandd, TMarccci:** head developer
-------
**dwe., xou:** designer
# Csapatunk
**Péter:** video editor
**Management**
<em>**annon:** a régi Filc Napló fejlesztője (ez az app, ha bár sokban változott, alapjaiban a Filc-re épül)</em> - Zypherift
- hayn
- Pearoo
- Zizi
- mnus
- xou
**Designerek**
- dwe
- xou
**vrolandd, TMarccci:** head developer
**Péter:** video editor
***annon:** a régi Filc Napló fejlesztője (ez az app, ha bár sokban változott, alapjaiban a Filc-re épül)*

7
check-outdated.sh Normal file
View File

@ -0,0 +1,7 @@
cd refilc && flutter pub outdated && cd ..
cd refilc_kreta_api && flutter pub outdated && cd ..
cd refilc_mobile_ui && flutter pub outdated && cd ..
# cd refilc_desktop_ui && flutter pub upgrade && cd ..
cd refilc_plus && flutter pub outdated && cd ..
echo Outdated version list above.

7
major-upgrade-pub.sh Executable file
View File

@ -0,0 +1,7 @@
cd refilc && flutter pub upgrade --major-versions && cd ..
cd refilc_kreta_api && flutter pub upgrade --major-versions && cd ..
cd refilc_mobile_ui && flutter pub upgrade --major-versions && cd ..
# cd refilc_desktop_ui && flutter pub upgrade && cd ..
cd refilc_plus && flutter pub upgrade --major-versions && cd ..
echo "Upgraded pub (major)."

2
refilc/.gitignore vendored
View File

@ -5,9 +5,11 @@
*.swp *.swp
.DS_Store .DS_Store
.atom/ .atom/
.build/
.buildlog/ .buildlog/
.history .history
.svn/ .svn/
.swiftpm/
migrate_working_dir/ migrate_working_dir/
# IntelliJ related # IntelliJ related

1
refilc/android/app/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.jks

View File

@ -39,8 +39,23 @@ def debugKeystoreProperties = new Properties()
def debugKeystorePropertiesFile = rootProject.file("debugkey.properties") def debugKeystorePropertiesFile = rootProject.file("debugkey.properties")
debugKeystoreProperties.load(new FileInputStream(debugKeystorePropertiesFile)) debugKeystoreProperties.load(new FileInputStream(debugKeystorePropertiesFile))
subprojects {
afterEvaluate { project ->
if (project.hasProperty('android')) {
project.android {
if (!hasProperty('namespace') || namespace == null || namespace.isEmpty()) {
// Assign a default namespace based on the project name or group
namespace = project.group.toString() ?: "com.example.${project.name}"
}
}
}
}
}
android { android {
ndkVersion "25.1.8937393" namespace = "hu.refilc.naplo"
ndkVersion "27.2.12479018"
// compileSdkVersion rootProject.ext.compileSdkVersion // compileSdkVersion rootProject.ext.compileSdkVersion
compileSdkVersion 34 compileSdkVersion 34
@ -67,11 +82,19 @@ android {
} }
compileOptions { compileOptions {
// Flag to enable support for the new language APIs // Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true coreLibraryDesugaringEnabled true
// Sets Java compatibility to Java 8 // Sets Java compatibility to Java 8
sourceCompatibility JavaVersion.VERSION_1_8 // sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8 // targetCompatibility JavaVersion.VERSION_1_8
// sourceCompatibility JavaVersion.VERSION_21
// targetCompatibility JavaVersion.VERSION_21
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_17
} }
signingConfigs { signingConfigs {
@ -97,7 +120,13 @@ android {
release { release {
signingConfig signingConfigs.release signingConfig signingConfigs.release
shrinkResources false shrinkResources true
minifyEnabled true
debuggable false
jniDebuggable false
renderscriptDebuggable false
pseudoLocalesEnabled false
zipAlignEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
} }
} }
@ -117,7 +146,7 @@ dependencies {
implementation 'joda-time:joda-time:2.9.4' implementation 'joda-time:joda-time:2.9.4'
androidTestImplementation 'androidx.test:runner:1.1.1' androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
implementation 'androidx.window:window:1.0.0' implementation 'androidx.window:window:1.0.0'
implementation 'androidx.window:window-java:1.0.0' implementation 'androidx.window:window-java:1.0.0'
} }

View File

@ -8,4 +8,9 @@
-dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter$Args -dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter$Args
-dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter$Error -dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter$Error
-dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter -dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter
-dontwarn com.stripe.android.pushProvisioning.PushProvisioningEphemeralKeyProvider -dontwarn com.stripe.android.pushProvisioning.PushProvisioningEphemeralKeyProvider
-dontwarn org.joda.convert.FromString
-dontwarn org.joda.convert.ToString
#-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

View File

@ -2,9 +2,6 @@
xmlns:tools="http://schemas.android.com/tools" package="hu.refilc.naplo"> xmlns:tools="http://schemas.android.com/tools" package="hu.refilc.naplo">
<application android:name="${applicationName}" android:label="reFilc" tools:replace="android:label" android:icon="@mipmap/ic_launcher" <application android:name="${applicationName}" android:label="reFilc" tools:replace="android:label" android:icon="@mipmap/ic_launcher"
android:requestLegacyExternalStorage="true" android:enableOnBackInvokedCallback="false"> android:requestLegacyExternalStorage="true" android:enableOnBackInvokedCallback="false">
<service
android:name="com.solusibejo.flutter_dynamic_icon_plus.FlutterDynamicIconPlusService"
android:stopWithTask="false"/>
<activity android:exported="true" android:name="hu.refilc.naplo.MainActivity" <activity android:exported="true" android:name="hu.refilc.naplo.MainActivity"
android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:launchMode="singleTop" android:theme="@style/LaunchTheme"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 B

After

Width:  |  Height:  |  Size: 69 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 B

After

Width:  |  Height:  |  Size: 69 B

View File

@ -1,5 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<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>
<inset
android:drawable="@drawable/ic_launcher_foreground"
android:inset="16%" />
</foreground>
</adaptive-icon> </adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 642 B

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

View File

@ -6,7 +6,7 @@
<item name="android:windowFullscreen">false</item> <item name="android:windowFullscreen">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item> <item name="android:windowDrawsSystemBarBackgrounds">false</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<item name="android:windowSplashScreenBackground">#03112D</item> <item name="android:windowSplashScreenBackground">#7CA021</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item> <item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
</style> </style>
<!-- Theme applied to the Android Window as soon as the process has started. <!-- Theme applied to the Android Window as soon as the process has started.

View File

@ -6,7 +6,7 @@
<item name="android:windowFullscreen">false</item> <item name="android:windowFullscreen">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item> <item name="android:windowDrawsSystemBarBackgrounds">false</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<item name="android:windowSplashScreenBackground">#03112D</item> <item name="android:windowSplashScreenBackground">#7CA021</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item> <item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
</style> </style>
<!-- Theme applied to the Android Window as soon as the process has started. <!-- Theme applied to the Android Window as soon as the process has started.

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<color name="ic_launcher_background">#03112D</color> <color name="ic_launcher_background">#7CA021</color>
<color name="purple_200">#FFBB86FC</color> <color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color> <color name="purple_500">#FF6200EE</color>
@ -66,4 +66,4 @@
<color name="pink_shade300">#FFF06292</color> <color name="pink_shade300">#FFF06292</color>
<color name="purple_shade300">#FFBA68C8</color> <color name="purple_shade300">#FFBA68C8</color>
<color name="teal_shade300">#FF22AC9B</color> <color name="teal_shade300">#FF22AC9B</color>
</resources> </resources>

View File

@ -1,8 +1,4 @@
org.gradle.jvmargs=-Xmx1536M \ org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError
--add-exports=java.base/sun.nio.ch=ALL-UNNAMED \
--add-opens=java.base/java.lang=ALL-UNNAMED \
--add-opens=java.base/java.lang.reflect=ALL-UNNAMED \
--add-opens=java.base/java.io=ALL-UNNAMED \
--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
# kotlin.jvm.target.validation.mode=IGNORE

View File

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-7.3.3-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip

View File

@ -24,8 +24,8 @@ pluginManagement {
plugins { plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0" id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "7.1.1" apply false id "com.android.application" version "8.7.3" apply false
id "org.jetbrains.kotlin.android" version "1.8.21" apply false id "org.jetbrains.kotlin.android" version "2.0.21" apply false
} }
include ":app" include ":app"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

2
refilc/build.sh Normal file → Executable file
View File

@ -1,3 +1,3 @@
#!/bin/sh #!/bin/sh
flutter build apk --release --dart-define=APPVER=$(cat pubspec.yaml | grep version: | cut -d' ' -f2 | cut -d+ -f1) --no-tree-shake-icons flutter build apk --release --tree-shake-icons --split-debug-info=debug-info --split-per-abi --target-platform android-arm,android-arm64 --obfuscate

View File

@ -43,4 +43,21 @@ post_install do |installer|
config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET' config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
end end
end end
bitcode_strip_path = `xcrun --find bitcode_strip`.chop!
def strip_bitcode_from_framework(bitcode_strip_path, framework_relative_path)
framework_path = File.join(Dir.pwd, framework_relative_path)
command = "#{bitcode_strip_path} #{framework_path} -r -o #{framework_path}"
puts "Stripping bitcode: #{command}"
system(command)
end
framework_paths = [
"Pods/Shake/Sources/Shake.xcframework/ios-arm64/Shake.framework/Shake",
"Pods/Shake/Sources/Shake.xcframework/ios-arm64_x86_64-simulator/Shake.framework/Shake"
]
framework_paths.each do |framework_relative_path|
strip_bitcode_from_framework(bitcode_strip_path, framework_relative_path)
end
end end

View File

@ -517,9 +517,11 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 257; CURRENT_PROJECT_VERSION = 283;
DEVELOPMENT_TEAM = 4DKAF249F3; DEVELOPMENT_TEAM = 4J97JVC2FG;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
FLUTTER_BUILD_NAME = 5.1.1;
FLUTTER_BUILD_NUMBER = 283;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = reFilc; INFOPLIST_KEY_CFBundleDisplayName = reFilc;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education";
@ -527,8 +529,8 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 5.0.0; MARKETING_VERSION = 5.1.1;
PRODUCT_BUNDLE_IDENTIFIER = com.refilc2.naplo; PRODUCT_BUNDLE_IDENTIFIER = hu.qwit.refilc;
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;
@ -549,8 +551,8 @@
CODE_SIGN_ENTITLEMENTS = livecard/livecard.entitlements; CODE_SIGN_ENTITLEMENTS = livecard/livecard.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 257; CURRENT_PROJECT_VERSION = 283;
DEVELOPMENT_TEAM = 4DKAF249F3; DEVELOPMENT_TEAM = 4J97JVC2FG;
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;
@ -563,10 +565,10 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 5.0.0; MARKETING_VERSION = 5.1.1;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.refilc2.naplo.livecardpro; PRODUCT_BUNDLE_IDENTIFIER = hu.qwit.refilc.livecard;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
@ -591,8 +593,8 @@
CODE_SIGN_ENTITLEMENTS = livecard/livecard.entitlements; CODE_SIGN_ENTITLEMENTS = livecard/livecard.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 257; CURRENT_PROJECT_VERSION = 283;
DEVELOPMENT_TEAM = 4DKAF249F3; DEVELOPMENT_TEAM = 4J97JVC2FG;
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;
@ -605,9 +607,9 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 5.0.0; MARKETING_VERSION = 5.1.1;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.refilc2.naplo.livecardpro; PRODUCT_BUNDLE_IDENTIFIER = hu.qwit.refilc.livecard;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
@ -631,8 +633,8 @@
CODE_SIGN_ENTITLEMENTS = livecard/livecard.entitlements; CODE_SIGN_ENTITLEMENTS = livecard/livecard.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 257; CURRENT_PROJECT_VERSION = 283;
DEVELOPMENT_TEAM = 4DKAF249F3; DEVELOPMENT_TEAM = 4J97JVC2FG;
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;
@ -645,9 +647,9 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 5.0.0; MARKETING_VERSION = 5.1.1;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.refilc2.naplo.livecardpro; PRODUCT_BUNDLE_IDENTIFIER = hu.qwit.refilc.livecard;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
@ -775,9 +777,11 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 257; CURRENT_PROJECT_VERSION = 283;
DEVELOPMENT_TEAM = 4DKAF249F3; DEVELOPMENT_TEAM = 4J97JVC2FG;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
FLUTTER_BUILD_NAME = 5.1.1;
FLUTTER_BUILD_NUMBER = 283;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = reFilc; INFOPLIST_KEY_CFBundleDisplayName = reFilc;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education";
@ -785,8 +789,8 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 5.0.0; MARKETING_VERSION = 5.1.1;
PRODUCT_BUNDLE_IDENTIFIER = com.refilc2.naplo; PRODUCT_BUNDLE_IDENTIFIER = hu.qwit.refilc;
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";
@ -803,9 +807,11 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 257; CURRENT_PROJECT_VERSION = 283;
DEVELOPMENT_TEAM = 4DKAF249F3; DEVELOPMENT_TEAM = 4J97JVC2FG;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
FLUTTER_BUILD_NAME = 5.1.1;
FLUTTER_BUILD_NUMBER = 283;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = reFilc; INFOPLIST_KEY_CFBundleDisplayName = reFilc;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education";
@ -813,8 +819,8 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 5.0.0; MARKETING_VERSION = 5.1.1;
PRODUCT_BUNDLE_IDENTIFIER = com.refilc2.naplo; PRODUCT_BUNDLE_IDENTIFIER = hu.qwit.refilc;
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;

View File

@ -12,7 +12,7 @@
<key>livecard.xcscheme_^#shared#^_</key> <key>livecard.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>83</integer> <integer>86</integer>
</dict> </dict>
</dict> </dict>
</dict> </dict>

View File

@ -3,7 +3,7 @@ import background_fetch
import ActivityKit import ActivityKit
import Flutter import Flutter
@UIApplicationMain @main
@objc class AppDelegate: FlutterAppDelegate { @objc class AppDelegate: FlutterAppDelegate {
private var methodChannel: FlutterMethodChannel? private var methodChannel: FlutterMethodChannel?

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 B

After

Width:  |  Height:  |  Size: 69 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 84 KiB

View File

@ -38,7 +38,7 @@
</scene> </scene>
</scenes> </scenes>
<resources> <resources>
<image name="LaunchImage" width="1700" height="1700"/> <image name="LaunchImage" width="2700" height="2700"/>
<image name="LaunchBackground" width="1" height="1"/> <image name="LaunchBackground" width="1" height="1"/>
</resources> </resources>
</document> </document>

View File

@ -1,138 +1,138 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict>
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>com.transistorsoft.refilcnotification</string>
<string>com.transistorsoft.refilcliveactivity</string>
</array>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleAlternateIcons</key>
<dict> <dict>
<key>refilc_concept</key> <key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>com.transistorsoft.refilcnotification</string>
<string>com.transistorsoft.refilcliveactivity</string>
</array>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleAlternateIcons</key>
<dict> <dict>
<key>CFBundleIconFiles</key> <key>refilc_concept</key>
<array> <dict>
<string>refilc_concept</string> <key>CFBundleIconFiles</key>
</array> <array>
<key>UIPrerenderedIcon</key> <string>refilc_concept</string>
<false/> </array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
<key>refilc_default</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>refilc_default</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
<key>refilc_overcomplicated</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>refilc_overcomplicated</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
<key>refilc_pride</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>refilc_pride</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
</dict> </dict>
<key>refilc_default</key> <key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIcons</key>
<dict> <dict>
<key>CFBundleIconFiles</key> <key>CFBundlePrimaryIcon</key>
<array> <dict>
<string>refilc_default</string> <key>CFBundleIconFiles</key>
</array> <array>
<key>UIPrerenderedIcon</key> <string></string>
<false/> </array>
</dict> <key>CFBundleIconName</key>
<key>refilc_overcomplicated</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>refilc_overcomplicated</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
<key>refilc_pride</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>refilc_pride</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
</dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIcons</key>
<dict>
<key>CFBundlePrimaryIcon</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string></string> <string></string>
</array> <key>UIPrerenderedIcon</key>
<key>CFBundleIconName</key> <false/>
<string></string> </dict>
<key>UIPrerenderedIcon</key>
<false/>
</dict> </dict>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>reFilc</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>refilcapp</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>https</string>
<string>http</string>
</array>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSCameraUsageDescription</key>
<string>The app requires the camera access to set a custom profile picture.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>The app requires the photo library to set a custom profile picture.</string>
<key>NSSupportsLiveActivities</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>processing</string>
</array>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIStatusBarHidden</key>
<false/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict> </dict>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>reFilc</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>refilcapp</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>https</string>
<string>http</string>
</array>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSCameraUsageDescription</key>
<string>The app requires the camera access to set a custom profile picture.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>The app requires the photo library to set a custom profile picture.</string>
<key>NSSupportsLiveActivities</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>processing</string>
</array>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIStatusBarHidden</key>
<false/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict>
</plist> </plist>

View File

@ -1,40 +1,44 @@
import Foundation import Foundation
import ActivityKit
public struct LessonData { public struct LessonData {
var color: String var color: String
var icon: String var icon: String
var index: String var index: String
var title: String var title: String
var subtitle: String var subtitle: String
var description: String var description: String
var startDate: Date var startDate: Date
var endDate: Date var endDate: Date
var date: ClosedRange<Date> var date: ClosedRange<Date>
var nextSubject: String var nextSubject: String
var nextRoom: String var nextRoom: String
init(from dictionary: [String: Any]) {
self.color = dictionary["color"] as? String ?? ""
self.icon = dictionary["icon"] as? String ?? ""
self.index = dictionary["index"] as? String ?? ""
self.title = dictionary["title"] as? String ?? ""
self.subtitle = dictionary["subtitle"] as? String ?? ""
self.description = dictionary["description"] as? String ?? ""
self.nextSubject = dictionary["nextSubject"] as? String ?? ""
self.nextRoom = dictionary["nextRoom"] as? String ?? ""
init(from dictionary: [String: Any]) { if let startDateStr = dictionary["startDate"] as? String, let startDateInt = Int(startDateStr) {
self.color = dictionary["color"] as? String ?? "" self.startDate = Date(timeIntervalSince1970: TimeInterval(startDateInt) / 1000)
self.icon = dictionary["icon"] as? String ?? "" } else {
self.index = dictionary["index"] as? String ?? "" self.startDate = Date()
self.title = dictionary["title"] as? String ?? ""
self.subtitle = dictionary["subtitle"] as? String ?? ""
self.description = dictionary["description"] as? String ?? ""
self.nextSubject = dictionary["nextSubject"] as? String ?? ""
self.nextRoom = dictionary["nextRoom"] as? String ?? ""
if let startDateStr = dictionary["startDate"] as? String, let startDateInt = Int(startDateStr) {
self.startDate = Date(timeIntervalSince1970: TimeInterval(startDateInt) / 1000)
} else {
self.startDate = Date()
}
if let endDateStr = dictionary["endDate"] as? String, let endDateInt = Int(endDateStr) {
self.endDate = Date(timeIntervalSince1970: TimeInterval(endDateInt) / 1000)
} else {
self.endDate = Date()
}
date = self.startDate...self.endDate
} }
if let endDateStr = dictionary["endDate"] as? String, let endDateInt = Int(endDateStr) {
self.endDate = Date(timeIntervalSince1970: TimeInterval(endDateInt) / 1000)
} else {
self.endDate = self.startDate
}
if self.startDate <= self.endDate {
self.date = self.startDate...self.endDate
} else {
self.date = self.endDate...self.endDate
}
}
} }

View File

@ -11,6 +11,17 @@ struct Widgets: WidgetBundle {
} }
} }
// text contrast background
extension Text {
func getContrastText(backgroundColor: Color) -> some View {
var r, g, b, a: CGFloat
(r, g, b, a) = (0, 0, 0, 0)
UIColor(backgroundColor).getRed(&r, green: &g, blue: &b, alpha: &a)
let luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b
return luminance < 0.6 ? self.foregroundColor(.white) : self.foregroundColor(.black)
}
}
// Color Converter // Color Converter
extension Color { extension Color {
init(hex: String, alpha: Double = 1.0) { init(hex: String, alpha: Double = 1.0) {
@ -62,21 +73,12 @@ struct LockScreenLiveActivityView: View {
.font(.body) .font(.body)
.bold() .bold()
.padding(.trailing, 90) .padding(.trailing, 90)
} else { } else {
MultilineTextView(text: "\(context.state.index) \(context.state.title)", limit: 25) MultilineTextView(text: "\(context.state.index) \(context.state.title) - \(context.state.subtitle)", limit: 25)
.font(.body) .font(.body)
.bold() .bold()
.multilineTextAlignment(.center) .multilineTextAlignment(.center)
} }
//Terem
if (!context.state.subtitle.isEmpty) {
Text(context.state.subtitle)
.italic()
.bold()
.font(.system(size: 13))
}
} }
// Leírás // Leírás
@ -92,10 +94,9 @@ struct LockScreenLiveActivityView: View {
.resizable() .resizable()
.aspectRatio(contentMode: .fit) .aspectRatio(contentMode: .fit)
.frame(width: CGFloat(8), height: CGFloat(8)) .frame(width: CGFloat(8), height: CGFloat(8))
Text(context.state.nextSubject) .foregroundStyle(.secondary)
Text("\(context.state.nextSubject) - \(context.state.nextRoom)")
.font(.caption) .font(.caption)
Text(context.state.nextRoom)
.font(.caption2)
} }
.multilineTextAlignment(.center) .multilineTextAlignment(.center)
} else { } else {
@ -117,11 +118,15 @@ struct LockScreenLiveActivityView: View {
.monospacedDigit() .monospacedDigit()
.padding(.trailing) .padding(.trailing)
} }
// .activityBackgroundTint(
// context.state.color != "#676767"
// ? Color(hex: context.state.color)
// : Color.clear
// )
.activityBackgroundTint( .activityBackgroundTint(
context.state.color != "#676767" Color.clear
? Color(hex: context.state.color)
: Color.clear
) )
.foregroundStyle(Color(hex: context.state.color))
} }
} }
@ -197,33 +202,23 @@ struct LiveCardWidget: Widget {
} else { } else {
// Amikor óra van, expanded DynamicIsland // Amikor óra van, expanded DynamicIsland
MultilineTextView(text: "\(context.state.index) \(context.state.title)", limit: 25) MultilineTextView(text: "\(context.state.index) \(context.state.title) - \(context.state.subtitle)", limit: 25)
.lineLimit(1) .lineLimit(1)
.font(.body) .font(.body)
.bold() .bold()
.padding(.trailing, -35) .padding(.trailing, -35)
Text(context.state.subtitle) Spacer(minLength: 2)
.lineLimit(1)
.italic()
.bold()
.font(.system(size: 13))
.padding(.trailing, -50)
Spacer(minLength: 5)
if(context.state.nextRoom != "" && context.state.nextSubject != "") { if(context.state.nextRoom != "" && context.state.nextSubject != "") {
Text("Következő óra és terem:") Text("Következő óra és terem:")
.font(.system(size: 14)) .font(.system(size: 14))
.padding(.trailing, -35) .padding(.trailing, -45)
Spacer(minLength: 2) Spacer(minLength: 2)
Text(context.state.nextSubject)
.modifier(DynamicFontSizeModifier(text: context.state.nextSubject)) Text("\(context.state.nextSubject) - \(context.state.nextRoom)")
.padding(.trailing, -35) .modifier(DynamicFontSizeModifier(text: "\(context.state.nextSubject) - \(context.state.nextRoom)"))
Text(context.state.nextRoom) .padding(.trailing, 35)
// ignore: based on nextSubject characters, I check that the font size of the room is the same as the next subject.
.modifier(DynamicFontSizeModifier(text: context.state.nextSubject))
.padding(.trailing, -35)
} else { } else {
Text("Ez az utolsó óra! Kitartást!") Text("Ez az utolsó óra! Kitartást!")
.font(.system(size: 14)) .font(.system(size: 14))
@ -327,3 +322,66 @@ struct DynamicFontSizeModifier: ViewModifier {
} }
} }
} }
struct LiveCardWidget_Previews: PreviewProvider {
static let attributes = LiveActivitiesAppAttributes()
static let duringLessonExmaple = LiveActivitiesAppAttributes.ContentState(
color: "#FF5733",
icon: "bell",
index: "1.",
title: "Math Class",
subtitle: "101",
description: "Algebra lesson",
startDate: Date(),
endDate: Date().addingTimeInterval(3000),
date: Date()...Date().addingTimeInterval(3000), // 50 minutes later
nextSubject: "Physics",
nextRoom: "102"
)
static let inBreak = LiveActivitiesAppAttributes.ContentState(
color: "#FF5733",
icon: "house",
index: "",
title: "Szünet",
subtitle: "Menj a(z) 122 terembe.",
description: "",
startDate: Date(),
endDate: Date().addingTimeInterval(3000),
date: Date()...Date().addingTimeInterval(3000), // 50 minutes later
nextSubject: "Physics",
nextRoom: "122"
)
static let lastLesson = LiveActivitiesAppAttributes.ContentState(
color: "#00ff00",
icon: "bell",
index: "6.",
title: "Math Class",
subtitle: "",
description: "Lorem Ipsum",
startDate: Date(),
endDate: Date().addingTimeInterval(3000),
date: Date()...Date().addingTimeInterval(3000), // 50 minutes later
nextSubject: "",
nextRoom: ""
)
static var previews: some View {
// Dynamic Island Compact
Group {
attributes
.previewContext(duringLessonExmaple, viewKind: .dynamicIsland(.compact))
.previewDisplayName("During Lesson")
attributes
.previewContext(inBreak, viewKind: .dynamicIsland(.compact))
.previewDisplayName("In Break")
attributes
.previewContext(lastLesson, viewKind: .dynamicIsland(.compact))
.previewDisplayName("During Last Lesson")
}
}
}

View File

@ -18,45 +18,51 @@ import 'package:connectivity_plus/connectivity_plus.dart';
class FilcAPI { class FilcAPI {
// API base // API base
static const baseUrl = "https://api.refilc.hu"; static const baseUrl = "https://api.refilcapp.hu";
// Public API // Public API
static const schoolList = "$baseUrl/v3/public/school-list"; static const schoolList = "https://api.refilcapp.hu/v3/public/school-list";
static const news = "$baseUrl/v3/public/news"; static const news = "https://staticrf-api.pages.dev/news/index.json";
static const supporters = "$baseUrl/v3/public/supporters"; static const supporters = "0.0.0.0";
// Private API // Private API
static const ads = "$baseUrl/v3/private/ads"; static const ads = "0.0.0.0";
static const config = "$baseUrl/v3/private/config"; static const config = "$baseUrl/v3/private/config";
static const reportApi = "$baseUrl/v3/private/crash-report"; static const reportApi = "$baseUrl/v3/private/crash-report";
static const rfPlus = "$baseUrl/v3/rf-plus"; static const rfPlus = "0.0.0.0";
static const plusAuthLogin = "$rfPlus/auth/login"; static const plusAuthLogin = "0.0.0.0";
static const plusAuthCallback = "$rfPlus/auth/callback"; static const plusAuthCallback = "0.0.0.0";
static const plusActivation = "$rfPlus/activate"; static const plusActivation = "0.0.0.0";
static const plusScopes = "$rfPlus/scopes"; static const plusScopes = "0.0.0.0/";
// Updates // Updates
static const repo = "refilc/naplo"; static const repo = "refilc/naplo";
static const releases = "https://api.github.com/repos/$repo/releases"; static const releases = "https://api.github.com/repos/$repo/releases";
// Share API // Share API
static const themeShare = "$baseUrl/v3/shared/theme/add"; static const themeShare = "https://api.refilcapp.hu/v3/shared/theme/add";
static const themeGet = "$baseUrl/v3/shared/theme/get"; static const themeGet = "https://api.refilcapp.hu/v3/shared/theme/get";
static const allThemes = "$themeGet/all"; static const allThemes = "$themeGet/all";
static const themeByID = "$themeGet/"; static const themeByID = "$themeGet/";
static const gradeColorsShare = "$baseUrl/v3/shared/grade-colors/add"; static const gradeColorsShare = "https://api.refilcapp.hu/v3/shared/grade-colors/add";
static const gradeColorsGet = "$baseUrl/v3/shared/grade-colors/get"; static const gradeColorsGet = "https://api.refilcapp.hu/v3/shared/grade-colors/get";
static const allGradeColors = "$gradeColorsGet/all"; static const allGradeColors = "$gradeColorsGet/all";
static const gradeColorsByID = "$gradeColorsGet/"; static const gradeColorsByID = "$gradeColorsGet/";
// Payment API // Payment API
static const payment = "$baseUrl/v3/payment"; static const payment = "0.0.0.0";
static const stripeSheet = "$payment/stripe-sheet"; static const stripeSheet = "0.0.0.0";
// Cloud Sync
// cloud sync? for what reason
static const cloudSyncApi = "0.0.0.0";
static Future<bool> checkConnectivity() async => static Future<bool> checkConnectivity() async =>
(await Connectivity().checkConnectivity())[0] != ConnectivityResult.none; (await Connectivity().checkConnectivity())[0] != ConnectivityResult.none;
// nem tudom nem vazar-e senkit se, de mar ertelmetlen ez
static Future<List<School>?> getSchools() async { static Future<List<School>?> getSchools() async {
try { try {
http.Response res = await http.get(Uri.parse(schoolList)); http.Response res = await http.get(Uri.parse(schoolList));
@ -66,16 +72,6 @@ class FilcAPI {
.cast<Map>() .cast<Map>()
.map((json) => School.fromJson(json)) .map((json) => School.fromJson(json))
.toList(); .toList();
schools.add(School(
city: "Stockholm",
instituteCode: "refilc-test-sweden",
name: "reFilc Test SE - Leo Ekström High School",
));
schools.add(School(
city: "Madrid",
instituteCode: "refilc-test-spain",
name: "reFilc Test ES - Emilio Obrero University",
));
return schools; return schools;
} else { } else {
throw "HTTP ${res.statusCode}: ${res.body}"; throw "HTTP ${res.statusCode}: ${res.body}";
@ -93,10 +89,12 @@ class FilcAPI {
"x-filc-id": settings.xFilcId, "x-filc-id": settings.xFilcId,
"user-agent": userAgent, "user-agent": userAgent,
// platform things // platform things
"rf-platform": Platform.operatingSystem, "rf-platform":
"rf-platform-version": Platform.operatingSystemVersion, settings.analyticsEnabled ? Platform.operatingSystem : "unknown",
"rf-app-version": "rf-platform-version": settings.analyticsEnabled
const String.fromEnvironment("APPVER", defaultValue: "?"), ? Platform.operatingSystemVersion
: "unknown",
"rf-app-version": const String.fromEnvironment("APPVER", defaultValue: "?"),
"rf-uinid": settings.xFilcId, "rf-uinid": settings.xFilcId,
}; };
@ -127,7 +125,8 @@ class FilcAPI {
http.Response res = await http.get(Uri.parse(news)); http.Response res = await http.get(Uri.parse(news));
if (res.statusCode == 200) { if (res.statusCode == 200) {
return (jsonDecode(res.body) as List) String utf8Body = utf8.decode(res.bodyBytes);
return (jsonDecode(utf8Body) as List)
.cast<Map>() .cast<Map>()
.map((e) => News.fromJson(e)) .map((e) => News.fromJson(e))
.toList(); .toList();
@ -231,7 +230,7 @@ class FilcAPI {
} }
// sharing // sharing
static Future<void> addSharedTheme(SharedTheme theme) async { static Future<int> addSharedTheme(SharedTheme theme) async {
try { try {
theme.json.remove('json'); theme.json.remove('json');
theme.json['is_public'] = theme.isPublic.toString(); theme.json['is_public'] = theme.isPublic.toString();
@ -263,13 +262,19 @@ class FilcAPI {
headers: {'Content-Type': 'application/x-www-form-urlencoded'}, headers: {'Content-Type': 'application/x-www-form-urlencoded'},
); );
if (res.statusCode != 201) { // if (res.statusCode != 201) {
throw "HTTP ${res.statusCode}: ${res.body}"; // throw "HTTP ${res.statusCode}: ${res.body}";
// }
if (res.statusCode == 201) {
log('Shared theme successfully with ID: ${theme.id}');
} }
log('Shared theme successfully with ID: ${theme.id}'); return res.statusCode;
} on Exception catch (error, stacktrace) { } on Exception catch (error, stacktrace) {
log("ERROR: FilcAPI.addSharedTheme: $error $stacktrace"); log("ERROR: FilcAPI.addSharedTheme: $error $stacktrace");
return 696;
} }
} }
@ -303,8 +308,7 @@ class FilcAPI {
return null; return null;
} }
static Future<void> addSharedGradeColors( static Future<int> addSharedGradeColors(SharedGradeColors gradeColors) async {
SharedGradeColors gradeColors) async {
try { try {
gradeColors.json.remove('json'); gradeColors.json.remove('json');
gradeColors.json['is_public'] = gradeColors.isPublic.toString(); gradeColors.json['is_public'] = gradeColors.isPublic.toString();
@ -320,13 +324,19 @@ class FilcAPI {
headers: {'Content-Type': 'application/x-www-form-urlencoded'}, headers: {'Content-Type': 'application/x-www-form-urlencoded'},
); );
if (res.statusCode != 201) { // if (res.statusCode != 201) {
throw "HTTP ${res.statusCode}: ${res.body}"; // throw "HTTP ${res.statusCode}: ${res.body}";
// }
if (res.statusCode == 201) {
log('Shared grade colors successfully with ID: ${gradeColors.id}');
} }
log('Shared grade colors successfully with ID: ${gradeColors.id}'); return res.statusCode;
} on Exception catch (error, stacktrace) { } on Exception catch (error, stacktrace) {
log("ERROR: FilcAPI.addSharedGradeColors: $error $stacktrace"); log("ERROR: FilcAPI.addSharedGradeColors: $error $stacktrace");
return 696;
} }
} }
@ -375,6 +385,11 @@ class FilcAPI {
return null; return null;
} }
// cloud sync
static Future<Map?> cloudSync(Map<String, String> data, String token) async {
return null;
}
} }
class ErrorReport { class ErrorReport {

View File

@ -65,8 +65,11 @@ Future loginAPI({
parents: ['Teszt András', 'Teszt Linda'], parents: ['Teszt András', 'Teszt Linda'],
json: {"a": "b"}, json: {"a": "b"},
address: '1117 Budapest, Gábor Dénes utca 4.', address: '1117 Budapest, Gábor Dénes utca 4.',
gradeDelay: 0,
), ),
role: Role.parent, role: Role.parent,
accessToken: '',
accessTokenExpire: DateTime.now(),
refreshToken: '', refreshToken: '',
); );
@ -153,6 +156,8 @@ Future loginAPI({
name: student.name, name: student.name,
student: student, student: student,
role: JwtUtils.getRoleFromJWT(res["access_token"])!, role: JwtUtils.getRoleFromJWT(res["access_token"])!,
accessToken: res["access_token"],
accessTokenExpire: DateTime.now(),
refreshToken: '', refreshToken: '',
); );
@ -234,6 +239,15 @@ Future newLoginAPI({
if (res != null) { if (res != null) {
if (kDebugMode) { if (kDebugMode) {
print(res); print(res);
// const splitSize = 1000;
// RegExp exp = RegExp(r"\w{" "$splitSize" "}");
// // String str = "0102031522";
// Iterable<Match> matches = exp.allMatches(res.toString());
// var list = matches.map((m) => m.group(0));
// list.forEach((e) {
// print(e);
// });
} }
if (res.containsKey("error")) { if (res.containsKey("error")) {
@ -266,6 +280,9 @@ Future newLoginAPI({
name: student.name, name: student.name,
student: student, student: student,
role: role, role: role,
accessToken: res["access_token"],
accessTokenExpire:
DateTime.now().add(Duration(seconds: (res["expires_in"] - 30))),
refreshToken: res["refresh_token"], refreshToken: res["refresh_token"],
); );

View File

@ -18,7 +18,7 @@ class AdProvider extends ChangeNotifier {
} }
Future<void> fetch() async { Future<void> fetch() async {
_ads = await FilcAPI.getAds() ?? []; _ads = [];
_ads.sort((a, b) => -a.date.compareTo(b.date)); _ads.sort((a, b) => -a.date.compareTo(b.date));
// check for new ads // check for new ads

View File

@ -1,5 +1,3 @@
import 'dart:io';
import 'package:refilc/database/query.dart'; import 'package:refilc/database/query.dart';
import 'package:refilc/database/store.dart'; import 'package:refilc/database/store.dart';
// ignore: depend_on_referenced_packages // ignore: depend_on_referenced_packages
@ -15,11 +13,7 @@ class DatabaseProvider {
Future<void> init() async { Future<void> init() async {
Database db; Database db;
if (Platform.isLinux || Platform.isWindows) { db = await openDatabase("app.db");
db = await databaseFactoryFfi.openDatabase("app.db");
} else {
db = await openDatabase("app.db");
}
query = DatabaseQuery(db: db); query = DatabaseQuery(db: db);
store = DatabaseStore(db: db); store = DatabaseStore(db: db);

View File

@ -5,6 +5,7 @@ import 'dart:async';
import 'package:refilc/api/providers/liveactivity/platform_channel.dart'; import 'package:refilc/api/providers/liveactivity/platform_channel.dart';
import 'package:refilc/helpers/subject.dart'; import 'package:refilc/helpers/subject.dart';
import 'package:refilc/models/settings.dart'; import 'package:refilc/models/settings.dart';
import 'package:refilc/ui/flutter_colorpicker/utils.dart';
import 'package:refilc_kreta_api/models/lesson.dart'; import 'package:refilc_kreta_api/models/lesson.dart';
import 'package:refilc_kreta_api/models/week.dart'; import 'package:refilc_kreta_api/models/week.dart';
import 'package:refilc/utils/format.dart'; import 'package:refilc/utils/format.dart';
@ -84,11 +85,14 @@ class LiveCardProvider extends ChangeNotifier {
} }
Map<String, String> toMap() { Map<String, String> toMap() {
// print("LIVE ACTIVITY COLOR BELOW:");
// print(_settings.liveActivityColor.toHexString().substring(2));
String color = '#${_settings.liveActivityColor.toHexString().substring(2)}';
switch (currentState) { switch (currentState) {
case LiveCardState.morning: case LiveCardState.morning:
return { return {
"color": "color": color,
'#${_settings.liveActivityColor.toString().substring(10, 16)}',
"icon": nextLesson != null "icon": nextLesson != null
? SubjectIcon.resolveName(subject: nextLesson?.subject) ? SubjectIcon.resolveName(subject: nextLesson?.subject)
: "book", : "book",
@ -97,23 +101,22 @@ class LiveCardProvider extends ChangeNotifier {
"description": "", "description": "",
"startDate": storeFirstRunDate != null "startDate": storeFirstRunDate != null
? ((storeFirstRunDate?.millisecondsSinceEpoch ?? 0) - ? ((storeFirstRunDate?.millisecondsSinceEpoch ?? 0) -
(_delay.inMilliseconds)) (_delay.inMilliseconds))
.toString() .toString()
: "", : "",
"endDate": ((nextLesson?.start.millisecondsSinceEpoch ?? 0) - "endDate": ((nextLesson?.start.millisecondsSinceEpoch ?? 0) -
_delay.inMilliseconds) _delay.inMilliseconds)
.toString(), .toString(),
"nextSubject": nextLesson != null "nextSubject": nextLesson != null
? nextLesson?.subject.renamedTo ?? ? nextLesson?.subject.renamedTo ??
ShortSubject.resolve(subject: nextLesson?.subject).capital() ShortSubject.resolve(subject: nextLesson?.subject).capital()
: "", : "",
"nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "", "nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "",
}; };
case LiveCardState.afternoon: case LiveCardState.afternoon:
return { return {
"color": "color": color,
'#${_settings.liveActivityColor.toString().substring(10, 16)}',
"icon": nextLesson != null "icon": nextLesson != null
? SubjectIcon.resolveName(subject: nextLesson?.subject) ? SubjectIcon.resolveName(subject: nextLesson?.subject)
: "book", : "book",
@ -122,23 +125,22 @@ class LiveCardProvider extends ChangeNotifier {
"description": "", "description": "",
"startDate": storeFirstRunDate != null "startDate": storeFirstRunDate != null
? ((storeFirstRunDate?.millisecondsSinceEpoch ?? 0) - ? ((storeFirstRunDate?.millisecondsSinceEpoch ?? 0) -
(_delay.inMilliseconds)) (_delay.inMilliseconds))
.toString() .toString()
: "", : "",
"endDate": ((nextLesson?.start.millisecondsSinceEpoch ?? 0) - "endDate": ((nextLesson?.start.millisecondsSinceEpoch ?? 0) -
_delay.inMilliseconds) _delay.inMilliseconds)
.toString(), .toString(),
"nextSubject": nextLesson != null "nextSubject": nextLesson != null
? nextLesson?.subject.renamedTo ?? ? nextLesson?.subject.renamedTo ??
ShortSubject.resolve(subject: nextLesson?.subject).capital() ShortSubject.resolve(subject: nextLesson?.subject).capital()
: "", : "",
"nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "", "nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "",
}; };
case LiveCardState.night: case LiveCardState.night:
return { return {
"color": "color": color,
'#${_settings.liveActivityColor.toString().substring(10, 16)}',
"icon": nextLesson != null "icon": nextLesson != null
? SubjectIcon.resolveName(subject: nextLesson?.subject) ? SubjectIcon.resolveName(subject: nextLesson?.subject)
: "book", : "book",
@ -147,44 +149,44 @@ class LiveCardProvider extends ChangeNotifier {
"description": "", "description": "",
"startDate": storeFirstRunDate != null "startDate": storeFirstRunDate != null
? ((storeFirstRunDate?.millisecondsSinceEpoch ?? 0) - ? ((storeFirstRunDate?.millisecondsSinceEpoch ?? 0) -
(_delay.inMilliseconds)) (_delay.inMilliseconds))
.toString() .toString()
: "", : "",
"endDate": ((nextLesson?.start.millisecondsSinceEpoch ?? 0) - "endDate": ((nextLesson?.start.millisecondsSinceEpoch ?? 0) -
_delay.inMilliseconds) _delay.inMilliseconds)
.toString(), .toString(),
"nextSubject": nextLesson != null "nextSubject": nextLesson != null
? nextLesson?.subject.renamedTo ?? ? nextLesson?.subject.renamedTo ??
ShortSubject.resolve(subject: nextLesson?.subject).capital() ShortSubject.resolve(subject: nextLesson?.subject).capital()
: "", : "",
"nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "", "nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "",
}; };
case LiveCardState.duringLesson: case LiveCardState.duringLesson:
return { return {
"color": "color": color,
'#${_settings.liveActivityColor.toString().substring(10, 16)}',
"icon": currentLesson != null "icon": currentLesson != null
? SubjectIcon.resolveName(subject: currentLesson?.subject) ? SubjectIcon.resolveName(subject: currentLesson?.subject)
: "book", : "book",
"index": "index":
currentLesson != null ? '${currentLesson!.lessonIndex}. ' : "", currentLesson != null ? '${currentLesson!.lessonIndex}. ' : "",
"title": currentLesson != null "title": currentLesson != null
? currentLesson?.subject.renamedTo ?? ? currentLesson?.subject.renamedTo ??
ShortSubject.resolve(subject: currentLesson?.subject) ShortSubject.resolve(subject: currentLesson?.subject)
.capital() .capital()
: "", : "",
"subtitle": "Terem: ${currentLesson?.room.replaceAll("_", " ") ?? ""}", "subtitle":
"Terem: ${currentLesson?.room.replaceAll("_", " ") ?? ""}",
"description": currentLesson?.description ?? "", "description": currentLesson?.description ?? "",
"startDate": ((currentLesson?.start.millisecondsSinceEpoch ?? 0) - "startDate": ((currentLesson?.start.millisecondsSinceEpoch ?? 0) -
_delay.inMilliseconds) _delay.inMilliseconds)
.toString(), .toString(),
"endDate": ((currentLesson?.end.millisecondsSinceEpoch ?? 0) - "endDate": ((currentLesson?.end.millisecondsSinceEpoch ?? 0) -
_delay.inMilliseconds) _delay.inMilliseconds)
.toString(), .toString(),
"nextSubject": nextLesson != null "nextSubject": nextLesson != null
? nextLesson?.subject.renamedTo ?? ? nextLesson?.subject.renamedTo ??
ShortSubject.resolve(subject: nextLesson?.subject).capital() ShortSubject.resolve(subject: nextLesson?.subject).capital()
: "", : "",
"nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "", "nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "",
}; };
@ -199,24 +201,23 @@ class LiveCardProvider extends ChangeNotifier {
final diff = getFloorDifference(); final diff = getFloorDifference();
return { return {
"color": "color": color,
'#${_settings.liveActivityColor.toString().substring(10, 16)}',
"icon": iconFloorMap[diff] ?? "cup.and.saucer", "icon": iconFloorMap[diff] ?? "cup.and.saucer",
"title": "Szünet", "title": "Szünet",
"description": "go $diff".i18n.fill([ "description": "go $diff".i18n.fill([
diff != "to room" ? (nextLesson!.getFloor() ?? 0) : nextLesson!.room diff != "to room" ? (nextLesson!.getFloor() ?? 0) : nextLesson!.room
]), ]),
"startDate": ((prevLesson?.end.millisecondsSinceEpoch ?? 0) - "startDate": ((prevLesson?.end.millisecondsSinceEpoch ?? 0) -
_delay.inMilliseconds) _delay.inMilliseconds)
.toString(), .toString(),
"endDate": ((nextLesson?.start.millisecondsSinceEpoch ?? 0) - "endDate": ((nextLesson?.start.millisecondsSinceEpoch ?? 0) -
_delay.inMilliseconds) _delay.inMilliseconds)
.toString(), .toString(),
"nextSubject": (nextLesson != null "nextSubject": (nextLesson != null
? nextLesson?.subject.renamedTo ?? ? nextLesson?.subject.renamedTo ??
ShortSubject.resolve(subject: nextLesson?.subject) ShortSubject.resolve(subject: nextLesson?.subject)
.capital() .capital()
: "") : "")
.capital(), .capital(),
"nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "", "nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "",
"index": "", "index": "",
@ -243,8 +244,8 @@ class LiveCardProvider extends ChangeNotifier {
DateTime now = _now().add(_delay); DateTime now = _now().add(_delay);
if ((currentState == LiveCardState.morning || if ((currentState == LiveCardState.morning ||
currentState == LiveCardState.afternoon || currentState == LiveCardState.afternoon ||
currentState == LiveCardState.night) && currentState == LiveCardState.night) &&
storeFirstRunDate == null) { storeFirstRunDate == null) {
storeFirstRunDate = now; storeFirstRunDate = now;
} }
@ -253,9 +254,9 @@ class LiveCardProvider extends ChangeNotifier {
// Filter label lessons #128 // Filter label lessons #128
today = today today = today
.where((lesson) => .where((lesson) =>
lesson.status?.name != "Elmaradt" && lesson.status?.name != "Elmaradt" &&
lesson.subject.id != '' && lesson.subject.id != '' &&
!lesson.isEmpty) !lesson.isEmpty)
.toList(); .toList();
if (today.isNotEmpty) { if (today.isNotEmpty) {
@ -263,7 +264,7 @@ class LiveCardProvider extends ChangeNotifier {
today.sort((a, b) => a.start.compareTo(b.start)); today.sort((a, b) => a.start.compareTo(b.start));
final _lesson = today.firstWhere( final _lesson = today.firstWhere(
(l) => l.start.isBefore(now) && l.end.isAfter(now), (l) => l.start.isBefore(now) && l.end.isAfter(now),
orElse: () => Lesson.fromJson({})); orElse: () => Lesson.fromJson({}));
if (_lesson.start.year != 0) { if (_lesson.start.year != 0) {
@ -328,7 +329,7 @@ class LiveCardProvider extends ChangeNotifier {
hasActivityStarted = true; hasActivityStarted = true;
} else if (!hasActivityStarted && } else if (!hasActivityStarted &&
((currentState == LiveCardState.duringLesson && ((currentState == LiveCardState.duringLesson &&
currentLesson != null) || currentLesson != null) ||
currentState == LiveCardState.duringBreak)) { currentState == LiveCardState.duringBreak)) {
debugPrint("Óra van, vagy szünet, de nincs LiveActivity. létrehozás..."); debugPrint("Óra van, vagy szünet, de nincs LiveActivity. létrehozás...");
PlatformChannel.createLiveActivity(toMap()); PlatformChannel.createLiveActivity(toMap());
@ -362,7 +363,11 @@ class LiveCardProvider extends ChangeNotifier {
} }
//END //END
if ((currentState == LiveCardState.afternoon || currentState == LiveCardState.morning || currentState == LiveCardState.night) && hasActivityStarted && nextLesson != null && if ((currentState == LiveCardState.afternoon ||
currentState == LiveCardState.morning ||
currentState == LiveCardState.night) &&
hasActivityStarted &&
nextLesson != null &&
nextLesson!.start.difference(now).inMinutes > 60) { nextLesson!.start.difference(now).inMinutes > 60) {
debugPrint("Több, mint 1 óra van az első óráig. Befejezés..."); debugPrint("Több, mint 1 óra van az első óráig. Befejezés...");
PlatformChannel.endLiveActivity(); PlatformChannel.endLiveActivity();
@ -389,4 +394,4 @@ class LiveCardProvider extends ChangeNotifier {
List<Lesson> _today(TimetableProvider p) => (p.getWeek(Week.current()) ?? []) List<Lesson> _today(TimetableProvider p) => (p.getWeek(Week.current()) ?? [])
.where((l) => _sameDate(l.date, _now())) .where((l) => _sameDate(l.date, _now()))
.toList(); .toList();
} }

View File

@ -2,6 +2,7 @@
import 'dart:io'; import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:refilc/api/providers/database_provider.dart'; import 'package:refilc/api/providers/database_provider.dart';
import 'package:refilc/api/providers/status_provider.dart'; import 'package:refilc/api/providers/status_provider.dart';
import 'package:refilc/api/providers/user_provider.dart'; import 'package:refilc/api/providers/user_provider.dart';
@ -28,7 +29,7 @@ import 'liveactivity/platform_channel.dart';
// Mutex // Mutex
bool lock = false; bool lock = false;
Future<void> syncAll(BuildContext context) { Future<void> syncAll(BuildContext context) async {
if (lock) return Future.value(); if (lock) return Future.value();
// Lock // Lock
lock = true; lock = true;
@ -40,6 +41,12 @@ Future<void> syncAll(BuildContext context) {
StatusProvider statusProvider = StatusProvider statusProvider =
Provider.of<StatusProvider>(context, listen: false); Provider.of<StatusProvider>(context, listen: false);
// check if access token isn't expired
// if (user.user?.accessToken == null) {
// lock = false;
// return Future.value();
// }
List<Future<void>> tasks = []; List<Future<void>> tasks = [];
int taski = 0; int taski = 0;
@ -50,6 +57,49 @@ Future<void> syncAll(BuildContext context) {
} }
tasks = [ tasks = [
// refresh login
syncStatus(() async {
// print(user.user?.accessTokenExpire);
// print('${user.user?.accessToken ?? "no token"} - ACCESS TOKEN');
// user.user!.accessToken = "";
if (user.user == null) {
Navigator.of(context).pushNamedAndRemoveUntil("login", (_) => false);
lock = false;
return Future.value();
}
if (user.user!.accessToken.replaceAll(" ", "") == "") {
String uid = user.user!.id;
user.removeUser(uid);
await Provider.of<DatabaseProvider>(context, listen: false)
.store
.removeUser(uid);
Navigator.of(context).pushNamedAndRemoveUntil("login", (_) => false);
lock = false;
return;
}
if (user.user!.accessTokenExpire.isBefore(DateTime.now())) {
String authRes = await Provider.of<KretaClient>(context, listen: false)
.refreshLogin() ??
'';
if (authRes != 'success') {
if (kDebugMode) print('ERROR: failed to refresh login');
lock = false;
return Future.value();
} else {
if (kDebugMode) print('INFO: access token refreshed');
}
} else {
if (kDebugMode) print('INFO: access token is not expired');
}
}()),
syncStatus(Provider.of<GradeProvider>(context, listen: false).fetch()), syncStatus(Provider.of<GradeProvider>(context, listen: false).fetch()),
syncStatus(Provider.of<TimetableProvider>(context, listen: false) syncStatus(Provider.of<TimetableProvider>(context, listen: false)
.fetch(week: Week.current())), .fetch(week: Week.current())),
@ -71,6 +121,8 @@ Future<void> syncAll(BuildContext context) {
if (studentJson == null) return; if (studentJson == null) return;
Student student = Student.fromJson(studentJson); Student student = Student.fromJson(studentJson);
// print(studentJson);
user.user?.name = student.name; user.user?.name = student.name;
// Store user // Store user
@ -89,13 +141,11 @@ Future<void> syncAll(BuildContext context) {
return false; return false;
} }
return Future.wait(tasks).then((value) { return Future.wait(tasks).then((value) {
// Unlock // Unlock
lock = false; lock = false;
if(Platform.isIOS && LiveCardProvider.hasActivityStarted == true){ if (Platform.isIOS && LiveCardProvider.hasActivityStarted == true) {
PlatformChannel.endLiveActivity(); PlatformChannel.endLiveActivity();
LiveCardProvider.hasActivityStarted = false; LiveCardProvider.hasActivityStarted = false;
} }

View File

@ -39,11 +39,11 @@ import 'package:refilc_mobile_ui/screens/settings/settings_route.dart'
import 'package:refilc_mobile_ui/screens/settings/settings_screen.dart' import 'package:refilc_mobile_ui/screens/settings/settings_screen.dart'
as mobile; as mobile;
// Desktop UI // Desktop UI (no more desktop ui)
import 'package:refilc_desktop_ui/screens/navigation/navigation_screen.dart' // import 'package:refilc_desktop_ui/screens/navigation/navigation_screen.dart'
as desktop; // as desktop;
import 'package:refilc_desktop_ui/screens/login/login_screen.dart' as desktop; // import 'package:refilc_desktop_ui/screens/login/login_screen.dart' as desktop;
import 'package:refilc_desktop_ui/screens/login/login_route.dart' as desktop; // import 'package:refilc_desktop_ui/screens/login/login_route.dart' as desktop;
// Providers // Providers
import 'package:refilc/models/settings.dart'; import 'package:refilc/models/settings.dart';
@ -237,7 +237,7 @@ class App extends StatelessWidget {
}, },
onGenerateRoute: (settings) => rootNavigator(settings), onGenerateRoute: (settings) => rootNavigator(settings),
initialRoute: initialRoute:
user.getUsers().isNotEmpty ? "navigation" : "login", (user.getUsers().isNotEmpty) ? "navigation" : "login",
); );
}, },
); );
@ -248,17 +248,18 @@ class App extends StatelessWidget {
Route? rootNavigator(RouteSettings route) { Route? rootNavigator(RouteSettings route) {
if (kIsWeb) { if (kIsWeb) {
switch (route.name) { return null;
case "login_back": // switch (route.name) {
return CupertinoPageRoute( // case "login_back":
builder: (context) => const desktop.LoginScreen(back: true)); // return CupertinoPageRoute(
case "login": // builder: (context) => const desktop.LoginScreen(back: true));
return _rootRoute(const desktop.LoginScreen()); // case "login":
case "navigation": // return _rootRoute(const desktop.LoginScreen());
return _rootRoute(const desktop.NavigationScreen()); // case "navigation":
case "login_to_navigation": // return _rootRoute(const desktop.NavigationScreen());
return desktop.loginRoute(const desktop.NavigationScreen()); // case "login_to_navigation":
} // return desktop.loginRoute(const desktop.NavigationScreen());
// }
} else if (Platform.isAndroid || Platform.isIOS) { } else if (Platform.isAndroid || Platform.isIOS) {
switch (route.name) { switch (route.name) {
case "login_back": case "login_back":
@ -274,17 +275,18 @@ class App extends StatelessWidget {
return mobile.settingsRoute(const mobile.SettingsScreen()); return mobile.settingsRoute(const mobile.SettingsScreen());
} }
} else if (Platform.isWindows || Platform.isMacOS || Platform.isLinux) { } else if (Platform.isWindows || Platform.isMacOS || Platform.isLinux) {
switch (route.name) { return null;
case "login_back": // switch (route.name) {
return CupertinoPageRoute( // case "login_back":
builder: (context) => const desktop.LoginScreen(back: true)); // return CupertinoPageRoute(
case "login": // builder: (context) => const desktop.LoginScreen(back: true));
return _rootRoute(const desktop.LoginScreen()); // case "login":
case "navigation": // return _rootRoute(const desktop.LoginScreen());
return _rootRoute(const desktop.NavigationScreen()); // case "navigation":
case "login_to_navigation": // return _rootRoute(const desktop.NavigationScreen());
return desktop.loginRoute(const desktop.NavigationScreen()); // case "login_to_navigation":
} // return desktop.loginRoute(const desktop.NavigationScreen());
// }
} }
return null; return null;
} }

View File

@ -8,7 +8,7 @@ import 'package:refilc/models/settings.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
// ignore: depend_on_referenced_packages // ignore: depend_on_referenced_packages
import 'package:sqflite_common_ffi/sqflite_ffi.dart'; import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'package:sqflite_common_ffi_web/sqflite_ffi_web.dart'; // import 'package:sqflite_common_ffi_web/sqflite_ffi_web.dart';
const settingsDB = DatabaseStruct("settings", { const settingsDB = DatabaseStruct("settings", {
"language": String, "start_page": int, "rounding": int, "theme": int, "language": String, "start_page": int, "rounding": int, "theme": int,
@ -27,7 +27,8 @@ const settingsDB = DatabaseStruct("settings", {
"notifications_absences": int, "notifications_absences": int,
"notifications_messages": int, "notifications_messages": int,
"notifications_lessons": int, // notifications "notifications_lessons": int, // notifications
"x_filc_id": String, "graph_class_avg": int, "presentation_mode": int, "x_filc_id": String, "graph_class_avg": int,
"analytics_enabled": int, "presentation_mode": int,
"bell_delay": int, "bell_delay_enabled": int, "bell_delay": int, "bell_delay_enabled": int,
"grade_opening_fun": int, "icon_pack": String, "premium_scopes": String, "grade_opening_fun": int, "icon_pack": String, "premium_scopes": String,
"premium_token": String, "premium_login": String, "premium_token": String, "premium_login": String,
@ -55,6 +56,9 @@ const settingsDB = DatabaseStruct("settings", {
"uwu_mode": int, "uwu_mode": int,
"new_popups": int, "new_popups": int,
"unseen_new_features": String, "unseen_new_features": String,
"cloud_sync_enabled": int,
"cloud_sync_token": String,
"local_updated_at": String,
// quick settings // quick settings
"q_timetable_lesson_num": int, "q_timetable_sub_tiles": int, "q_timetable_lesson_num": int, "q_timetable_sub_tiles": int,
"q_subjects_sub_tiles": int, "q_subjects_sub_tiles": int,
@ -66,6 +70,7 @@ const usersDB = DatabaseStruct("users", {
"institute_code": String, "student": String, "role": int, "institute_code": String, "student": String, "role": int,
"nickname": String, "picture": String, // premium only (it's now plus btw) "nickname": String, "picture": String, // premium only (it's now plus btw)
"grade_streak": int, "grade_streak": int,
"access_token": String, "access_token_expire": String,
"refresh_token": String, "refresh_token": String,
}); });
const userDataDB = DatabaseStruct("user_data", { const userDataDB = DatabaseStruct("user_data", {
@ -105,7 +110,8 @@ Future<Database> initDB(DatabaseProvider database) async {
Database db; Database db;
if (kIsWeb) { if (kIsWeb) {
db = await databaseFactoryFfiWeb.openDatabase("app.db"); // db = await databaseFactoryFfiWeb.openDatabase("app.db");
throw "web is not supported";
} else if (Platform.isLinux || Platform.isWindows) { } else if (Platform.isLinux || Platform.isWindows) {
sqfliteFfiInit(); sqfliteFfiInit();
db = await databaseFactoryFfi.openDatabase("app.db"); db = await databaseFactoryFfi.openDatabase("app.db");
@ -140,6 +146,8 @@ Future<Database> initDB(DatabaseProvider database) async {
"nickname": "", "nickname": "",
"picture": "", "picture": "",
"grade_streak": 0, "grade_streak": 0,
"access_token": "",
"access_token_expire": "",
"refresh_token": "", "refresh_token": "",
}, },
); );

File diff suppressed because it is too large Load Diff

View File

@ -5,7 +5,7 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:refilc/api/providers/user_provider.dart'; import 'package:refilc/api/providers/user_provider.dart';
import 'package:refilc/api/providers/database_provider.dart'; import 'package:refilc/api/providers/database_provider.dart';
import 'package:refilc/database/init.dart'; import 'package:refilc/database/init.dart';
import 'package:refilc/helpers/notification_helper.dart'; // import 'package:refilc/helpers/notification_helper.dart';
import 'package:refilc/models/settings.dart'; import 'package:refilc/models/settings.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -104,7 +104,7 @@ class Startup {
user = await database.query.getUsers(settings); user = await database.query.getUsers(settings);
// Set all notification categories to seen to avoid having notifications that the user has already seen in the app // Set all notification categories to seen to avoid having notifications that the user has already seen in the app
NotificationsHelper().setAllCategoriesSeen(user); // NotificationsHelper().setAllCategoriesSeen(user);
late FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin; late FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;
// Notifications setup // Notifications setup
@ -146,30 +146,30 @@ class Startup {
// Platform specific settings // Platform specific settings
if (!kIsWeb) { if (!kIsWeb) {
const DarwinInitializationSettings initializationSettingsDarwin = // const DarwinInitializationSettings initializationSettingsDarwin =
DarwinInitializationSettings( // DarwinInitializationSettings(
requestSoundPermission: true, // requestSoundPermission: true,
requestBadgePermission: true, // requestBadgePermission: true,
requestAlertPermission: false, // requestAlertPermission: false,
); // );
const AndroidInitializationSettings initializationSettingsAndroid = // const AndroidInitializationSettings initializationSettingsAndroid =
AndroidInitializationSettings('ic_notification'); // AndroidInitializationSettings('ic_notification');
const LinuxInitializationSettings initializationSettingsLinux = // const LinuxInitializationSettings initializationSettingsLinux =
LinuxInitializationSettings(defaultActionName: 'Open notification'); // LinuxInitializationSettings(defaultActionName: 'Open notification');
const InitializationSettings initializationSettings = // const InitializationSettings initializationSettings =
InitializationSettings( // InitializationSettings(
android: initializationSettingsAndroid, // android: initializationSettingsAndroid,
iOS: initializationSettingsDarwin, // iOS: initializationSettingsDarwin,
macOS: initializationSettingsDarwin, // macOS: initializationSettingsDarwin,
linux: initializationSettingsLinux, // linux: initializationSettingsLinux,
); // );
// Initialize notifications // Initialize notifications
await flutterLocalNotificationsPlugin.initialize( // await flutterLocalNotificationsPlugin.initialize(
initializationSettings, // initializationSettings,
onDidReceiveNotificationResponse: // onDidReceiveNotificationResponse:
NotificationsHelper().onDidReceiveNotificationResponse, // NotificationsHelper().onDidReceiveNotificationResponse,
); // );
} }
// if (Platform.isAndroid || Platform.isIOS) { // if (Platform.isAndroid || Platform.isIOS) {
@ -214,7 +214,7 @@ Widget errorBuilder(FlutterErrorDetails details) {
} }
}); });
return Container(); return Container();
}); });
} }
@ -239,7 +239,7 @@ Future<void> initPlatformState() async {
if (!Platform.isIOS) return; if (!Platform.isIOS) return;
LiveActivityHelper().backgroundJob(); LiveActivityHelper().backgroundJob();
} else { } else {
NotificationsHelper().backgroundJob(); // NotificationsHelper().backgroundJob();
} }
BackgroundFetch.finish(taskId); BackgroundFetch.finish(taskId);
}, (String taskId) async { }, (String taskId) async {
@ -279,7 +279,7 @@ void backgroundHeadlessTask(HeadlessTask task) {
if (!Platform.isIOS) return; if (!Platform.isIOS) return;
LiveActivityHelper().backgroundJob(); LiveActivityHelper().backgroundJob();
} else { } else {
NotificationsHelper().backgroundJob(); // NotificationsHelper().backgroundJob();
} }
BackgroundFetch.finish(task.taskId); BackgroundFetch.finish(task.taskId);
} }

View File

@ -0,0 +1,22 @@
class CloudSyncData {
Map settings;
List<String> deviceIds;
String reFilcPlusId;
Map json;
CloudSyncData({
this.settings = const {},
this.deviceIds = const [],
this.reFilcPlusId = "",
required this.json,
});
factory CloudSyncData.fromJson(Map json) {
return CloudSyncData(
settings: json['settings'] ?? {},
deviceIds: List<String>.from(json['device_ids'] ?? []),
reFilcPlusId: json['refilc_plus_id'] ?? "",
json: json,
);
}
}

View File

@ -7,6 +7,8 @@ class News {
String platform; String platform;
bool emergency; bool emergency;
DateTime expireDate; DateTime expireDate;
List<String>? appVersions;
String? specificAppId;
Map? json; Map? json;
News({ News({
@ -18,6 +20,8 @@ class News {
required this.platform, required this.platform,
required this.emergency, required this.emergency,
required this.expireDate, required this.expireDate,
this.appVersions,
this.specificAppId,
this.json, this.json,
}); });
@ -31,6 +35,10 @@ class News {
platform: json["platform"] ?? "", platform: json["platform"] ?? "",
emergency: json["emergency"] ?? false, emergency: json["emergency"] ?? false,
expireDate: DateTime.parse(json["expire_date"] ?? ''), expireDate: DateTime.parse(json["expire_date"] ?? ''),
appVersions: json["app_versions"] != null
? List<String>.from(json["app_versions"])
: null,
specificAppId: json["specific_app_id"],
json: json, json: json,
); );
} }

View File

@ -60,6 +60,7 @@ class SettingsProvider extends ChangeNotifier {
UpdateChannel _updateChannel; UpdateChannel _updateChannel;
Config _config; Config _config;
String _xFilcId; String _xFilcId;
bool _analyticsEnabled;
bool _graphClassAvg; bool _graphClassAvg;
bool _goodStudent; bool _goodStudent;
bool _presentationMode; bool _presentationMode;
@ -108,6 +109,9 @@ class SettingsProvider extends ChangeNotifier {
bool _uwuMode; bool _uwuMode;
bool _newPopups; bool _newPopups;
List<String> _unseenNewFeatures; List<String> _unseenNewFeatures;
bool _cloudSyncEnabled;
String _cloudSyncToken;
DateTime _updatedAt;
// quick settings // quick settings
bool _qTimetableLessonNum; bool _qTimetableLessonNum;
bool _qTimetableSubTiles; bool _qTimetableSubTiles;
@ -137,6 +141,7 @@ class SettingsProvider extends ChangeNotifier {
required UpdateChannel updateChannel, required UpdateChannel updateChannel,
required Config config, required Config config,
required String xFilcId, required String xFilcId,
required bool analyticsEnabled,
required bool graphClassAvg, required bool graphClassAvg,
required bool goodStudent, required bool goodStudent,
required bool presentationMode, required bool presentationMode,
@ -182,6 +187,9 @@ class SettingsProvider extends ChangeNotifier {
required bool uwuMode, required bool uwuMode,
required bool newPopups, required bool newPopups,
required List<String> unseenNewFeatures, required List<String> unseenNewFeatures,
required bool cloudSyncEnabled,
required String cloudSyncToken,
required DateTime updatedAt,
required bool qTimetableLessonNum, required bool qTimetableLessonNum,
required bool qTimetableSubTiles, required bool qTimetableSubTiles,
required bool qSubjectsSubTiles, required bool qSubjectsSubTiles,
@ -208,6 +216,7 @@ class SettingsProvider extends ChangeNotifier {
_updateChannel = updateChannel, _updateChannel = updateChannel,
_config = config, _config = config,
_xFilcId = xFilcId, _xFilcId = xFilcId,
_analyticsEnabled = analyticsEnabled,
_graphClassAvg = graphClassAvg, _graphClassAvg = graphClassAvg,
_goodStudent = goodStudent, _goodStudent = goodStudent,
_presentationMode = presentationMode, _presentationMode = presentationMode,
@ -253,6 +262,9 @@ class SettingsProvider extends ChangeNotifier {
_uwuMode = uwuMode, _uwuMode = uwuMode,
_newPopups = newPopups, _newPopups = newPopups,
_unseenNewFeatures = unseenNewFeatures, _unseenNewFeatures = unseenNewFeatures,
_cloudSyncEnabled = cloudSyncEnabled,
_cloudSyncToken = cloudSyncToken,
_updatedAt = updatedAt,
_qTimetableLessonNum = qTimetableLessonNum, _qTimetableLessonNum = qTimetableLessonNum,
_qTimetableSubTiles = qTimetableSubTiles, _qTimetableSubTiles = qTimetableSubTiles,
_qSubjectsSubTiles = qSubjectsSubTiles; _qSubjectsSubTiles = qSubjectsSubTiles;
@ -297,6 +309,7 @@ class SettingsProvider extends ChangeNotifier {
updateChannel: UpdateChannel.values[map["update_channel"]], updateChannel: UpdateChannel.values[map["update_channel"]],
config: Config.fromJson(configMap ?? {}), config: Config.fromJson(configMap ?? {}),
xFilcId: map["x_filc_id"], xFilcId: map["x_filc_id"],
analyticsEnabled: map["analytics_enabled"] == 1,
graphClassAvg: map["graph_class_avg"] == 1, graphClassAvg: map["graph_class_avg"] == 1,
goodStudent: false, goodStudent: false,
presentationMode: map["presentation_mode"] == 1, presentationMode: map["presentation_mode"] == 1,
@ -343,6 +356,9 @@ class SettingsProvider extends ChangeNotifier {
uwuMode: map['uwu_mode'] == 1, uwuMode: map['uwu_mode'] == 1,
newPopups: map['new_popups'] == 1, newPopups: map['new_popups'] == 1,
unseenNewFeatures: jsonDecode(map["unseen_new_features"]).cast<String>(), unseenNewFeatures: jsonDecode(map["unseen_new_features"]).cast<String>(),
cloudSyncEnabled: map['cloud_sync_enabled'] == 1,
cloudSyncToken: map['cloud_sync_token'],
updatedAt: DateTime.tryParse(map['local_updated_at']) ?? DateTime.now(),
qTimetableLessonNum: map['q_timetable_lesson_num'] == 1, qTimetableLessonNum: map['q_timetable_lesson_num'] == 1,
qTimetableSubTiles: map['q_timetable_sub_tiles'] == 1, qTimetableSubTiles: map['q_timetable_sub_tiles'] == 1,
qSubjectsSubTiles: map['q_subjects_sub_tiles'] == 1, qSubjectsSubTiles: map['q_subjects_sub_tiles'] == 1,
@ -377,6 +393,7 @@ class SettingsProvider extends ChangeNotifier {
"notification_poll_interval": _notificationPollInterval, "notification_poll_interval": _notificationPollInterval,
"config": jsonEncode(config.json), "config": jsonEncode(config.json),
"x_filc_id": _xFilcId, "x_filc_id": _xFilcId,
"analytics_enabled": _analyticsEnabled ? 1 : 0,
"graph_class_avg": _graphClassAvg ? 1 : 0, "graph_class_avg": _graphClassAvg ? 1 : 0,
"presentation_mode": _presentationMode ? 1 : 0, "presentation_mode": _presentationMode ? 1 : 0,
"bell_delay_enabled": _bellDelayEnabled ? 1 : 0, "bell_delay_enabled": _bellDelayEnabled ? 1 : 0,
@ -421,6 +438,9 @@ class SettingsProvider extends ChangeNotifier {
"uwu_mode": _uwuMode ? 1 : 0, "uwu_mode": _uwuMode ? 1 : 0,
"new_popups": _newPopups ? 1 : 0, "new_popups": _newPopups ? 1 : 0,
"unseen_new_features": jsonEncode(_unseenNewFeatures), "unseen_new_features": jsonEncode(_unseenNewFeatures),
"cloud_sync_enabled": _cloudSyncEnabled ? 1 : 0,
"cloud_sync_token": _cloudSyncToken,
"local_updated_at": _updatedAt.toIso8601String(),
"q_timetable_lesson_num": _qTimetableLessonNum ? 1 : 0, "q_timetable_lesson_num": _qTimetableLessonNum ? 1 : 0,
"q_timetable_sub_tiles": _qTimetableSubTiles ? 1 : 0, "q_timetable_sub_tiles": _qTimetableSubTiles ? 1 : 0,
"q_subjects_sub_tiles": _qSubjectsSubTiles ? 1 : 0, "q_subjects_sub_tiles": _qSubjectsSubTiles ? 1 : 0,
@ -450,7 +470,7 @@ class SettingsProvider extends ChangeNotifier {
notificationsMessagesEnabled: true, notificationsMessagesEnabled: true,
notificationsLessonsEnabled: true, notificationsLessonsEnabled: true,
notificationsBitfield: 255, notificationsBitfield: 255,
developerMode: false, developerMode: true,
notificationPollInterval: 1, notificationPollInterval: 1,
vibrate: VibrationStrength.medium, vibrate: VibrationStrength.medium,
abWeeks: false, abWeeks: false,
@ -458,6 +478,7 @@ class SettingsProvider extends ChangeNotifier {
updateChannel: UpdateChannel.stable, updateChannel: UpdateChannel.stable,
config: Config.fromJson({}), config: Config.fromJson({}),
xFilcId: const Uuid().v4(), xFilcId: const Uuid().v4(),
analyticsEnabled: false,
graphClassAvg: false, graphClassAvg: false,
goodStudent: false, goodStudent: false,
presentationMode: false, presentationMode: false,
@ -479,13 +500,13 @@ class SettingsProvider extends ChangeNotifier {
renameSubjectsItalics: false, renameSubjectsItalics: false,
renameTeachersEnabled: false, renameTeachersEnabled: false,
renameTeachersItalics: false, renameTeachersItalics: false,
liveActivityColor: const Color(0xFF676767), liveActivityColor: const Color(0x00000000),
welcomeMessage: '', welcomeMessage: '',
appIcon: 'refilc_default', appIcon: 'refilc_default',
currentThemeId: '', currentThemeId: '',
currentThemeDisplayName: '', currentThemeDisplayName: '',
currentThemeCreator: 'reFilc', currentThemeCreator: 'reFilc',
showBreaks: true, showBreaks: false,
pinSetGeneral: '', pinSetGeneral: '',
pinSetPersonalize: '', pinSetPersonalize: '',
pinSetNotify: '', pinSetNotify: '',
@ -503,6 +524,9 @@ class SettingsProvider extends ChangeNotifier {
uwuMode: false, uwuMode: false,
newPopups: true, newPopups: true,
unseenNewFeatures: ['grade_exporting'], unseenNewFeatures: ['grade_exporting'],
cloudSyncEnabled: false,
cloudSyncToken: '',
updatedAt: DateTime.now(),
qTimetableLessonNum: true, qTimetableLessonNum: true,
qTimetableSubTiles: true, qTimetableSubTiles: true,
qSubjectsSubTiles: true, qSubjectsSubTiles: true,
@ -532,6 +556,7 @@ class SettingsProvider extends ChangeNotifier {
UpdateChannel get updateChannel => _updateChannel; UpdateChannel get updateChannel => _updateChannel;
Config get config => _config; Config get config => _config;
String get xFilcId => _xFilcId; String get xFilcId => _xFilcId;
bool get analyticsEnabled => _analyticsEnabled;
bool get graphClassAvg => _graphClassAvg; bool get graphClassAvg => _graphClassAvg;
bool get goodStudent => _goodStudent; bool get goodStudent => _goodStudent;
bool get presentationMode => _presentationMode; bool get presentationMode => _presentationMode;
@ -576,6 +601,9 @@ class SettingsProvider extends ChangeNotifier {
bool get uwuMode => _uwuMode; bool get uwuMode => _uwuMode;
bool get newPopups => _newPopups; bool get newPopups => _newPopups;
List<String> get unseenNewFeatures => _unseenNewFeatures; List<String> get unseenNewFeatures => _unseenNewFeatures;
bool get cloudSyncEnabled => _cloudSyncEnabled;
String get cloudSyncToken => _cloudSyncToken;
DateTime get updatedAt => _updatedAt;
bool get qTimetableLessonNum => _qTimetableLessonNum; bool get qTimetableLessonNum => _qTimetableLessonNum;
bool get qTimetableSubTiles => _qTimetableSubTiles; bool get qTimetableSubTiles => _qTimetableSubTiles;
bool get qSubjectsSubTiles => _qSubjectsSubTiles; bool get qSubjectsSubTiles => _qSubjectsSubTiles;
@ -590,6 +618,7 @@ class SettingsProvider extends ChangeNotifier {
List<Color>? gradeColors, List<Color>? gradeColors,
bool? newsEnabled, bool? newsEnabled,
String? seenNewsId, String? seenNewsId,
String? seenNews, // only for restoring from map
bool? notificationsEnabled, bool? notificationsEnabled,
bool? notificationsGradesEnabled, bool? notificationsGradesEnabled,
bool? notificationsAbsencesEnabled, bool? notificationsAbsencesEnabled,
@ -604,6 +633,7 @@ class SettingsProvider extends ChangeNotifier {
UpdateChannel? updateChannel, UpdateChannel? updateChannel,
Config? config, Config? config,
String? xFilcId, String? xFilcId,
bool? analyticsEnabled,
bool? graphClassAvg, bool? graphClassAvg,
bool? goodStudent, bool? goodStudent,
bool? presentationMode, bool? presentationMode,
@ -645,6 +675,8 @@ class SettingsProvider extends ChangeNotifier {
bool? uwuMode, bool? uwuMode,
bool? newPopups, bool? newPopups,
List<String>? unseenNewFeatures, List<String>? unseenNewFeatures,
bool? cloudSyncEnabled,
String? cloudSyncToken,
bool? qTimetableLessonNum, bool? qTimetableLessonNum,
bool? qTimetableSubTiles, bool? qTimetableSubTiles,
bool? qSubjectsSubTiles, bool? qSubjectsSubTiles,
@ -667,6 +699,7 @@ class SettingsProvider extends ChangeNotifier {
tempList.add(seenNewsId); tempList.add(seenNewsId);
_seenNews = tempList.join(','); _seenNews = tempList.join(',');
} }
if (seenNews != null && seenNews != _seenNews) _seenNews = seenNews;
if (notificationsEnabled != null && if (notificationsEnabled != null &&
notificationsEnabled != _notificationsEnabled) { notificationsEnabled != _notificationsEnabled) {
_notificationsEnabled = notificationsEnabled; _notificationsEnabled = notificationsEnabled;
@ -708,6 +741,9 @@ class SettingsProvider extends ChangeNotifier {
} }
if (config != null && config != _config) _config = config; if (config != null && config != _config) _config = config;
if (xFilcId != null && xFilcId != _xFilcId) _xFilcId = xFilcId; if (xFilcId != null && xFilcId != _xFilcId) _xFilcId = xFilcId;
if (analyticsEnabled != null && analyticsEnabled != _analyticsEnabled) {
_analyticsEnabled = analyticsEnabled;
}
if (graphClassAvg != null && graphClassAvg != _graphClassAvg) { if (graphClassAvg != null && graphClassAvg != _graphClassAvg) {
_graphClassAvg = graphClassAvg; _graphClassAvg = graphClassAvg;
} }
@ -839,6 +875,12 @@ class SettingsProvider extends ChangeNotifier {
if (unseenNewFeatures != null && unseenNewFeatures != _unseenNewFeatures) { if (unseenNewFeatures != null && unseenNewFeatures != _unseenNewFeatures) {
_unseenNewFeatures = unseenNewFeatures; _unseenNewFeatures = unseenNewFeatures;
} }
if (cloudSyncEnabled != null && cloudSyncEnabled != _cloudSyncEnabled) {
_cloudSyncEnabled = cloudSyncEnabled;
}
if (cloudSyncToken != null && cloudSyncToken != _cloudSyncToken) {
_cloudSyncToken = cloudSyncToken;
}
if (qTimetableLessonNum != null && if (qTimetableLessonNum != null &&
qTimetableLessonNum != _qTimetableLessonNum) { qTimetableLessonNum != _qTimetableLessonNum) {
_qTimetableLessonNum = qTimetableLessonNum; _qTimetableLessonNum = qTimetableLessonNum;
@ -850,11 +892,115 @@ class SettingsProvider extends ChangeNotifier {
if (qSubjectsSubTiles != null && qSubjectsSubTiles != _qSubjectsSubTiles) { if (qSubjectsSubTiles != null && qSubjectsSubTiles != _qSubjectsSubTiles) {
_qSubjectsSubTiles = qSubjectsSubTiles; _qSubjectsSubTiles = qSubjectsSubTiles;
} }
// change updated at time
_updatedAt = DateTime.now();
// store or not // store or not
if (store) await _database?.store.storeSettings(this); if (store) await _database?.store.storeSettings(this);
notifyListeners(); notifyListeners();
} }
Future<void> updateFromMap({
required Map<dynamic, dynamic> map,
bool store = true,
}) async {
print(map);
await update(
store: store,
language: map["language"],
startPage: Pages.values[map["start_page"] ?? _startPage.index],
rounding: map["rounding"],
theme: ThemeMode.values[map["theme"] ?? _theme.index],
accentColor:
AccentColor.values[map["accent_color"] ?? _accentColor.index],
gradeColors: [
Color(map["grade_color1"] ?? _gradeColors[0].value),
Color(map["grade_color2"] ?? _gradeColors[1].value),
Color(map["grade_color3"] ?? _gradeColors[2].value),
Color(map["grade_color4"] ?? _gradeColors[3].value),
Color(map["grade_color5"] ?? _gradeColors[4].value),
],
newsEnabled: map["news"] == 1,
seenNews: map["seen_news"],
notificationsEnabled: map["notifications"] == 1,
notificationsGradesEnabled: map["notifications_grades"] == 1,
notificationsAbsencesEnabled: map["notifications_absences"] == 1,
notificationsMessagesEnabled: map["notifications_messages"] == 1,
notificationsLessonsEnabled: map["notifications_lessons"] == 1,
notificationsBitfield: map["notifications_bitfield"],
notificationPollInterval: map["notification_poll_interval"],
developerMode: map["developer_mode"] == 1,
vibrate:
VibrationStrength.values[map["vibration_strength"] ?? _vibrate.index],
abWeeks: map["ab_weeks"] == 1,
swapABweeks: map["swap_ab_weeks"] == 1,
updateChannel:
UpdateChannel.values[map["update_channel"] ?? _updateChannel.index],
config: Config.fromJson(jsonDecode(map["config"] ?? "{}")),
xFilcId: map["x_filc_id"],
analyticsEnabled: map["analytics_enabled"] == 1,
graphClassAvg: map["graph_class_avg"] == 1,
goodStudent: false,
presentationMode: map["presentation_mode"] == 1,
bellDelayEnabled: map["bell_delay_enabled"] == 1,
bellDelay: map["bell_delay"],
gradeOpeningFun: map["grade_opening_fun"] == 1,
iconPack: Map.fromEntries(
IconPack.values.map((e) => MapEntry(e.name, e)))[map["icon_pack"]]!,
customAccentColor:
Color(map["custom_accent_color"] ?? _customAccentColor.value),
customBackgroundColor:
Color(map["custom_background_color"] ?? _customBackgroundColor.value),
customHighlightColor:
Color(map["custom_highlight_color"] ?? _customHighlightColor.value),
customIconColor:
Color(map["custom_icon_color"] ?? _customIconColor.value),
customTextColor:
Color(map["custom_text_color"] ?? _customTextColor.value),
shadowEffect: map["shadow_effect"] == 1,
premiumScopes:
jsonDecode(map["premium_scopes"] ?? _premiumScopes).cast<String>(),
premiumAccessToken: map["premium_token"],
premiumLogin: map["premium_login"],
lastAccountId: map["last_account_id"],
renamedSubjectsEnabled: map["renamed_subjects_enabled"] == 1,
renamedSubjectsItalics: map["renamed_subjects_italics"] == 1,
renamedTeachersEnabled: map["renamed_teachers_enabled"] == 1,
renamedTeachersItalics: map["renamed_teachers_italics"] == 1,
liveActivityColor:
Color(map["live_activity_color"] ?? _liveActivityColor),
welcomeMessage: map["welcome_message"],
appIcon: map["app_icon"],
currentThemeId: map['current_theme_id'],
currentThemeDisplayName: map['current_theme_display_name'],
currentThemeCreator: map['current_theme_creator'],
showBreaks: map['show_breaks'] == 1,
// pinSetGeneral: map['general_s_pin'],
// pinSetPersonalize: map['personalize_s_pin'],
// pinSetNotify: map['notify_s_pin'],
// pinSetExtras: map['extras_s_pin'],
fontFamily: map['font_family'],
titleOnlyFont: map['title_only_font'] == 1,
plusSessionId: map['plus_session_id'],
calSyncRoomLocation: map['cal_sync_room_location'],
calSyncShowExams: map['cal_sync_show_exams'] == 1,
calSyncShowTeacher: map['cal_sync_show_teacher'] == 1,
calSyncRenamed: map['cal_sync_renamed'] == 1,
calendarId: map['calendar_id'],
navShadow: map['nav_shadow'] == 1,
newColors: map['new_colors'] == 1,
uwuMode: map['uwu_mode'] == 1,
newPopups: map['new_popups'] == 1,
unseenNewFeatures:
jsonDecode(map["unseen_new_features"] ?? "[]").cast<String>(),
cloudSyncEnabled: map['cloud_sync_enabled'] == 1,
cloudSyncToken: map['cloud_sync_token'],
qTimetableLessonNum: map['q_timetable_lesson_num'] == 1,
qTimetableSubTiles: map['q_timetable_sub_tiles'] == 1,
qSubjectsSubTiles: map['q_subjects_sub_tiles'] == 1,
);
}
void exportJson() { void exportJson() {
String sets = json.encode(toMap()); String sets = json.encode(toMap());
Clipboard.setData(ClipboardData(text: sets)); Clipboard.setData(ClipboardData(text: sets));

View File

@ -18,7 +18,13 @@ class User {
String picture; String picture;
int gradeStreak; int gradeStreak;
// new login method // new login method
String accessToken;
DateTime accessTokenExpire;
String refreshToken; String refreshToken;
// cloud sync
// String qwidAccessToken;
// DateTime? qwidAccessTokenExpire;
// String qwidRefreshToken;
String get displayName => nickname != '' ? nickname : name; String get displayName => nickname != '' ? nickname : name;
bool get hasStreak => gradeStreak > 0; bool get hasStreak => gradeStreak > 0;
@ -34,7 +40,12 @@ class User {
this.nickname = "", this.nickname = "",
this.picture = "", this.picture = "",
this.gradeStreak = 0, this.gradeStreak = 0,
required this.accessToken,
required this.accessTokenExpire,
required this.refreshToken, required this.refreshToken,
// this.qwidAccessToken = "",
// this.qwidAccessTokenExpire,
// this.qwidRefreshToken = "",
}) { }) {
if (id != null) { if (id != null) {
this.id = id; this.id = id;
@ -59,12 +70,22 @@ class User {
birth: DateTime.now(), birth: DateTime.now(),
yearId: '1', yearId: '1',
parents: [], parents: [],
gradeDelay: 0,
), ),
role: Role.values[map["role"] ?? 0], role: Role.values[map["role"] ?? 0],
nickname: map["nickname"] ?? "", nickname: map["nickname"] ?? "",
picture: map["picture"] ?? "", picture: map["picture"] ?? "",
gradeStreak: map["grade_streak"] ?? 0, gradeStreak: map["grade_streak"] ?? 0,
accessToken: map["access_token"] ?? "",
accessTokenExpire: DateTime.parse(map["access_token_expire"] != ""
? map["access_token_expire"]
: DateTime.now().toIso8601String()),
refreshToken: map["refresh_token"] ?? "", refreshToken: map["refresh_token"] ?? "",
// qwidAccessToken: map["qwid_access_token"] ?? "",
// qwidAccessTokenExpire: map["qwid_access_token_expire"] != ""
// ? DateTime.parse(map["qwid_access_token_expire"])
// : null,
// qwidRefreshToken: map["qwid_refresh_token"] ?? "",
); );
} }
@ -80,7 +101,14 @@ class User {
"nickname": nickname, "nickname": nickname,
"picture": picture, "picture": picture,
"grade_streak": gradeStreak, "grade_streak": gradeStreak,
"access_token": accessToken,
"access_token_expire": accessTokenExpire.toIso8601String(),
"refresh_token": refreshToken, "refresh_token": refreshToken,
// "qwid_access_token": qwidAccessToken,
// "qwid_access_token_expire": qwidAccessTokenExpire != null
// ? qwidAccessTokenExpire!.toIso8601String()
// : "",
// "qwid_refresh_token": qwidRefreshToken,
}; };
} }

View File

@ -1,8 +1,8 @@
import 'dart:io'; import 'dart:io';
import 'package:refilc/theme/colors/dark_desktop.dart'; // import 'package:refilc/theme/colors/dark_desktop.dart';
import 'package:refilc/theme/colors/dark_mobile.dart'; import 'package:refilc/theme/colors/dark_mobile.dart';
import 'package:refilc/theme/colors/light_desktop.dart'; // import 'package:refilc/theme/colors/light_desktop.dart';
import 'package:refilc/theme/colors/light_mobile.dart'; import 'package:refilc/theme/colors/light_mobile.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -21,10 +21,16 @@ class AppColors {
} else { } else {
switch (brightness) { switch (brightness) {
case Brightness.light: case Brightness.light:
return LightDesktopAppColors(); return LightMobileAppColors();
case Brightness.dark: case Brightness.dark:
return DarkDesktopAppColors(); return DarkMobileAppColors();
} }
// switch (brightness) {
// case Brightness.light:
// return LightDesktopAppColors();
// case Brightness.dark:
// return DarkDesktopAppColors();
// }
} }
} }
} }

View File

@ -115,42 +115,42 @@ class AppTheme {
primary: accent, primary: accent,
onPrimary: onPrimary:
(accent.computeLuminance() > 0.5 ? Colors.black : Colors.white) (accent.computeLuminance() > 0.5 ? Colors.black : Colors.white)
.withOpacity(.9), .withValues(alpha: .9),
secondary: newSecondary, secondary: newSecondary,
onSecondary: (newSecondary.computeLuminance() > 0.5 onSecondary: (newSecondary.computeLuminance() > 0.5
? Colors.black ? Colors.black
: Colors.white) : Colors.white)
.withOpacity(.9), .withValues(alpha: .9),
tertiary: newTertiary, tertiary: newTertiary,
onTertiary: onTertiary:
(newTertiary.computeLuminance() > 0.5 ? Colors.black : Colors.white) (newTertiary.computeLuminance() > 0.5 ? Colors.black : Colors.white)
.withOpacity(.9), .withValues(alpha: .9),
brightness: Brightness.light, brightness: Brightness.light,
error: lightColors.red, error: lightColors.red,
onError: Colors.white.withOpacity(.9), onError: Colors.white.withValues(alpha: .9),
surface: highlightColor, surface: highlightColor,
onSurface: Colors.black.withOpacity(.9), onSurface: Colors.black.withValues(alpha: .9),
), ),
shadowColor: lightColors.shadow.withOpacity(.5), shadowColor: lightColors.shadow.withValues(alpha: .5),
appBarTheme: AppBarTheme(backgroundColor: backgroundColor), appBarTheme: AppBarTheme(backgroundColor: backgroundColor),
indicatorColor: accent, indicatorColor: accent,
iconTheme: IconThemeData(color: lightColors.text.withOpacity(.75)), iconTheme: IconThemeData(color: lightColors.text.withValues(alpha: .75)),
navigationBarTheme: NavigationBarThemeData( navigationBarTheme: NavigationBarThemeData(
indicatorColor: indicatorColor: accent.withValues(
accent.withOpacity(accentColor == AccentColor.adaptive ? 0.4 : 0.8), alpha: accentColor == AccentColor.adaptive ? 0.4 : 0.8),
iconTheme: iconTheme:
WidgetStateProperty.all(IconThemeData(color: lightColors.text)), WidgetStateProperty.all(IconThemeData(color: lightColors.text)),
backgroundColor: highlightColor, backgroundColor: highlightColor,
labelTextStyle: WidgetStateProperty.all(TextStyle( labelTextStyle: WidgetStateProperty.all(TextStyle(
fontSize: 13.0, fontSize: 13.0,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
color: lightColors.text.withOpacity(0.8), color: lightColors.text.withValues(alpha: 0.8),
)), )),
labelBehavior: NavigationDestinationLabelBehavior.alwaysShow, labelBehavior: NavigationDestinationLabelBehavior.alwaysShow,
height: 76.0, height: 76.0,
), ),
sliderTheme: SliderThemeData( sliderTheme: SliderThemeData(
inactiveTrackColor: accent.withOpacity(.3), inactiveTrackColor: accent.withValues(alpha: .3),
), ),
progressIndicatorTheme: ProgressIndicatorThemeData(color: accent), progressIndicatorTheme: ProgressIndicatorThemeData(color: accent),
expansionTileTheme: ExpansionTileThemeData(iconColor: accent), expansionTileTheme: ExpansionTileThemeData(iconColor: accent),
@ -238,48 +238,48 @@ class AppTheme {
primary: accent, primary: accent,
onPrimary: onPrimary:
(accent.computeLuminance() > 0.5 ? Colors.black : Colors.white) (accent.computeLuminance() > 0.5 ? Colors.black : Colors.white)
.withOpacity(.9), .withValues(alpha: .9),
secondary: newSecondary, secondary: newSecondary,
onSecondary: (newSecondary.computeLuminance() > 0.5 onSecondary: (newSecondary.computeLuminance() > 0.5
? Colors.black ? Colors.black
: Colors.white) : Colors.white)
.withOpacity(.9), .withValues(alpha: .9),
tertiary: newTertiary, tertiary: newTertiary,
onTertiary: onTertiary:
(newTertiary.computeLuminance() > 0.5 ? Colors.black : Colors.white) (newTertiary.computeLuminance() > 0.5 ? Colors.black : Colors.white)
.withOpacity(.9), .withValues(alpha: .9),
brightness: Brightness.dark, brightness: Brightness.dark,
error: darkColors.red, error: darkColors.red,
onError: Colors.black.withOpacity(.9), onError: Colors.black.withValues(alpha: .9),
surface: highlightColor, surface: highlightColor,
onSurface: Colors.white.withOpacity(.9), onSurface: Colors.white.withValues(alpha: .9),
), ),
shadowColor: highlightColor.withOpacity(.5), //darkColors.shadow, shadowColor: highlightColor.withValues(alpha: .5), //darkColors.shadow,
appBarTheme: AppBarTheme(backgroundColor: backgroundColor), appBarTheme: AppBarTheme(backgroundColor: backgroundColor),
indicatorColor: accent, indicatorColor: accent,
iconTheme: IconThemeData(color: darkColors.text.withOpacity(.75)), iconTheme: IconThemeData(color: darkColors.text.withValues(alpha: .75)),
navigationBarTheme: NavigationBarThemeData( navigationBarTheme: NavigationBarThemeData(
indicatorColor: indicatorColor: accent.withValues(
accent.withOpacity(accentColor == AccentColor.adaptive ? 0.4 : 0.8), alpha: accentColor == AccentColor.adaptive ? 0.4 : 0.8),
iconTheme: iconTheme:
WidgetStateProperty.all(IconThemeData(color: darkColors.text)), WidgetStateProperty.all(IconThemeData(color: darkColors.text)),
backgroundColor: highlightColor, backgroundColor: highlightColor,
labelTextStyle: WidgetStateProperty.all(TextStyle( labelTextStyle: WidgetStateProperty.all(TextStyle(
fontSize: 13.0, fontSize: 13.0,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
color: darkColors.text.withOpacity(0.8), color: darkColors.text.withValues(alpha: 0.8),
)), )),
labelBehavior: NavigationDestinationLabelBehavior.alwaysShow, labelBehavior: NavigationDestinationLabelBehavior.alwaysShow,
height: 76.0, height: 76.0,
), ),
sliderTheme: SliderThemeData( sliderTheme: SliderThemeData(
inactiveTrackColor: accent.withOpacity(.3), inactiveTrackColor: accent.withValues(alpha: .3),
), ),
progressIndicatorTheme: ProgressIndicatorThemeData(color: accent), progressIndicatorTheme: ProgressIndicatorThemeData(color: accent),
expansionTileTheme: ExpansionTileThemeData(iconColor: accent), expansionTileTheme: ExpansionTileThemeData(iconColor: accent),
cardColor: highlightColor, cardColor: highlightColor,
chipTheme: ChipThemeData( chipTheme: ChipThemeData(
backgroundColor: accent.withOpacity(.2), backgroundColor: accent.withValues(alpha: .2),
elevation: 1, elevation: 1,
), ),
bottomNavigationBarTheme: BottomNavigationBarThemeData( bottomNavigationBarTheme: BottomNavigationBarThemeData(

View File

@ -191,7 +191,7 @@ List<Widget> sortDateWidgets(
width: 150.0, width: 150.0,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0), borderRadius: BorderRadius.circular(12.0),
color: AppColors.of(context).text.withOpacity(.25), color: AppColors.of(context).text.withValues(alpha: .25),
), ),
), ),
), ),

View File

@ -178,7 +178,7 @@ Future<List<DateWidget>> getFilterWidgets(FilterType activeData,
// Ads // Ads
case FilterType.ads: case FilterType.ads:
if (adProvider.available) { if (adProvider.available) {
items = ad_filter.getWidgets(adProvider.ads); items = ad_filter.getWidgets(adProvider.ads, context);
} }
break; break;
} }
@ -232,8 +232,8 @@ Widget filterItemBuilder(
BoxShadow( BoxShadow(
offset: const Offset(0, 21), offset: const Offset(0, 21),
blurRadius: 23.0, blurRadius: 23.0,
color: Theme.of(context).shadowColor.withOpacity( color: Theme.of(context).shadowColor.withValues(
Theme.of(context).shadowColor.opacity * alpha: Theme.of(context).shadowColor.opacity *
CurvedAnimation( CurvedAnimation(
parent: CurvedAnimation( parent: CurvedAnimation(
parent: animation, parent: animation,

View File

@ -1,23 +1,70 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:refilc/models/ad.dart'; import 'package:refilc/models/ad.dart';
import 'package:refilc/ui/date_widget.dart'; import 'package:refilc/ui/date_widget.dart';
import 'package:refilc_mobile_ui/common/widgets/ad/ad_tile.dart';
import 'package:refilc_mobile_ui/common/widgets/ad/ad_viewable.dart' as mobile; import 'package:refilc_mobile_ui/common/widgets/ad/ad_viewable.dart' as mobile;
import 'package:refilc_mobile_ui/plus/plus_screen.dart';
import 'package:refilc_plus/providers/plus_provider.dart';
import 'package:uuid/uuid.dart';
List<DateWidget> getWidgets(List<Ad> providerAds) { List<DateWidget> getWidgets(List<Ad> providerAds, BuildContext context) {
List<DateWidget> items = []; List<DateWidget> items = [];
bool hasPlus = Provider.of<PlusProvider>(context).hasPremium;
DateWidget plusWidget = DateWidget(
key: const Uuid().v4(),
date: DateTime.now(),
widget: AdTile(
Ad(
title: 'reFilc+',
description:
'Fizess elő reFilc+-ra, rejtsd el a hirdetéseket és támogasd az app működését!',
author: '',
logoUrl: Uri.parse('https://refilc.hu/image/brand/logo.png'),
overridePremium: false,
date: DateTime(2007, 6, 29, 9, 41),
expireDate: DateTime.now().add(const Duration(days: 11)),
launchUrl: Uri.parse('https://refilc.hu/plus'),
),
onTap: () => Navigator.of(context, rootNavigator: true)
.push(MaterialPageRoute(builder: (context) {
return const PlusScreen();
})),
padding: const EdgeInsets.symmetric(horizontal: 5.0),
showExternalIcon: false,
),
);
if (providerAds.isNotEmpty) { if (providerAds.isNotEmpty) {
for (var ad in providerAds) { for (var ad in providerAds) {
if (ad.date.isBefore(DateTime.now()) && if (ad.date.isBefore(DateTime.now()) &&
ad.expireDate.isAfter(DateTime.now())) { ad.expireDate.isAfter(DateTime.now()) &&
providerAds.sort((a, b) => -a.date.compareTo(b.date)); DateTime.now().hour.isOdd) {
if (!hasPlus || ad.overridePremium) {
providerAds.sort((a, b) => -a.date.compareTo(b.date));
items.add(DateWidget( items.add(DateWidget(
key: ad.description, key: ad.description,
date: ad.date, date: ad.date,
widget: mobile.AdViewable(ad), widget: mobile.AdViewable(ad),
)); ));
}
} else {
if (DateTime.now().weekday == DateTime.saturday &&
items.isEmpty &&
!hasPlus) {
items.add(plusWidget);
}
} }
} }
} else {
if (DateTime.now().weekday == DateTime.saturday &&
items.isEmpty &&
!hasPlus) {
items.add(plusWidget);
}
} }
return items; return items;

View File

@ -8,7 +8,9 @@ List<DateWidget> getWidgets(List<Grade> providerGrades) {
List<DateWidget> items = []; List<DateWidget> items = [];
for (var gradeType in GradeType.values) { for (var gradeType in GradeType.values) {
if ([GradeType.midYear, GradeType.unknown, GradeType.levelExam] if ([GradeType.midYear, GradeType.unknown, GradeType.levelExam]
.contains(gradeType)) continue; .contains(gradeType)) {
continue;
}
List<Grade> grades = List<Grade> grades =
providerGrades.where((grade) => grade.type == gradeType).toList(); providerGrades.where((grade) => grade.type == gradeType).toList();

View File

@ -1,12 +1,9 @@
import 'package:refilc/ui/date_widget.dart'; import 'package:refilc/ui/date_widget.dart';
import 'package:refilc/utils/platform.dart';
import 'package:refilc_kreta_api/models/grade.dart'; import 'package:refilc_kreta_api/models/grade.dart';
import 'package:refilc_mobile_ui/common/widgets/grade/grade_viewable.dart' import 'package:refilc_mobile_ui/common/widgets/grade/grade_viewable.dart'
as mobile; as mobile;
import 'package:refilc_mobile_ui/common/widgets/grade/new_grades.dart' import 'package:refilc_mobile_ui/common/widgets/grade/new_grades.dart'
as mobile; as mobile;
import 'package:refilc_desktop_ui/common/widgets/grade/grade_viewable.dart'
as desktop;
List<DateWidget> getWidgets( List<DateWidget> getWidgets(
List<Grade> providerGrades, DateTime? lastSeenDate) { List<Grade> providerGrades, DateTime? lastSeenDate) {
@ -19,9 +16,7 @@ List<DateWidget> getWidgets(
items.add(DateWidget( items.add(DateWidget(
key: grade.id, key: grade.id,
date: grade.date, date: grade.date,
widget: PlatformUtils.isMobile widget: mobile.GradeViewable(grade),
? mobile.GradeViewable(grade)
: desktop.GradeViewable(grade),
)); ));
} }
} }

View File

@ -5,7 +5,7 @@
/// Blocky Color Picker /// Blocky Color Picker
library block_colorpicker; library;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:refilc/theme/colors/accent.dart'; import 'package:refilc/theme/colors/accent.dart';
@ -73,7 +73,7 @@ Widget _defaultItemBuilder(
color: color, color: color,
boxShadow: [ boxShadow: [
BoxShadow( BoxShadow(
color: color.withOpacity(0.8), color: color.withValues(alpha: 0.8),
offset: const Offset(1, 2), offset: const Offset(1, 2),
blurRadius: 5) blurRadius: 5)
], ],

View File

@ -9,7 +9,7 @@
// ignore_for_file: use_build_context_synchronously // ignore_for_file: use_build_context_synchronously
library hsv_picker; library;
import 'package:refilc/models/shared_theme.dart'; import 'package:refilc/models/shared_theme.dart';
import 'package:refilc_mobile_ui/common/custom_snack_bar.dart'; import 'package:refilc_mobile_ui/common/custom_snack_bar.dart';
@ -380,7 +380,7 @@ class FilcColorPickerState extends State<FilcColorPicker> {
fontSize: 16.0, fontSize: 16.0,
color: AppColors.of(context) color: AppColors.of(context)
.text .text
.withOpacity(isAdvancedView ? 1.0 : .5), .withValues(alpha: isAdvancedView ? 1.0 : .5),
), ),
), ),
], ],

View File

@ -210,32 +210,32 @@ class TrackPainter extends CustomPainter {
break; break;
case TrackType.red: case TrackType.red:
final List<Color> colors = [ final List<Color> colors = [
hsvColor.toColor().withRed(0).withOpacity(1.0), hsvColor.toColor().withRed(0).withValues(alpha: 1.0),
hsvColor.toColor().withRed(255).withOpacity(1.0), hsvColor.toColor().withRed(255).withValues(alpha: 1.0),
]; ];
Gradient gradient = LinearGradient(colors: colors); Gradient gradient = LinearGradient(colors: colors);
canvas.drawRect(rect, Paint()..shader = gradient.createShader(rect)); canvas.drawRect(rect, Paint()..shader = gradient.createShader(rect));
break; break;
case TrackType.green: case TrackType.green:
final List<Color> colors = [ final List<Color> colors = [
hsvColor.toColor().withGreen(0).withOpacity(1.0), hsvColor.toColor().withGreen(0).withValues(alpha: 1.0),
hsvColor.toColor().withGreen(255).withOpacity(1.0), hsvColor.toColor().withGreen(255).withValues(alpha: 1.0),
]; ];
Gradient gradient = LinearGradient(colors: colors); Gradient gradient = LinearGradient(colors: colors);
canvas.drawRect(rect, Paint()..shader = gradient.createShader(rect)); canvas.drawRect(rect, Paint()..shader = gradient.createShader(rect));
break; break;
case TrackType.blue: case TrackType.blue:
final List<Color> colors = [ final List<Color> colors = [
hsvColor.toColor().withBlue(0).withOpacity(1.0), hsvColor.toColor().withBlue(0).withValues(alpha: 1.0),
hsvColor.toColor().withBlue(255).withOpacity(1.0), hsvColor.toColor().withBlue(255).withValues(alpha: 1.0),
]; ];
Gradient gradient = LinearGradient(colors: colors); Gradient gradient = LinearGradient(colors: colors);
canvas.drawRect(rect, Paint()..shader = gradient.createShader(rect)); canvas.drawRect(rect, Paint()..shader = gradient.createShader(rect));
break; break;
case TrackType.alpha: case TrackType.alpha:
final List<Color> colors = [ final List<Color> colors = [
hsvColor.toColor().withOpacity(0.0), hsvColor.toColor().withValues(alpha: 0.0),
hsvColor.toColor().withOpacity(1.0), hsvColor.toColor().withValues(alpha: 1.0),
]; ];
Gradient gradient = LinearGradient(colors: colors); Gradient gradient = LinearGradient(colors: colors);
canvas.drawRect(rect, Paint()..shader = gradient.createShader(rect)); canvas.drawRect(rect, Paint()..shader = gradient.createShader(rect));
@ -390,7 +390,7 @@ class ColorPickerInputState extends State<ColorPickerInput> {
), ),
contentPadding: contentPadding:
const EdgeInsets.symmetric(vertical: 8.0, horizontal: 8.0), const EdgeInsets.symmetric(vertical: 8.0, horizontal: 8.0),
fillColor: AppColors.of(context).text.withOpacity(.1), fillColor: AppColors.of(context).text.withValues(alpha: .1),
), ),
onChanged: (String value) { onChanged: (String value) {
String input = value; String input = value;
@ -603,20 +603,20 @@ class ColorPickerSlider extends StatelessWidget {
break; break;
case TrackType.red: case TrackType.red:
thumbOffset += (box.maxWidth - 30.0) * hsvColor.toColor().red / 0xff; thumbOffset += (box.maxWidth - 30.0) * hsvColor.toColor().red / 0xff;
thumbColor = hsvColor.toColor().withOpacity(1.0); thumbColor = hsvColor.toColor().withValues(alpha: 1.0);
break; break;
case TrackType.green: case TrackType.green:
thumbOffset += thumbOffset +=
(box.maxWidth - 30.0) * hsvColor.toColor().green / 0xff; (box.maxWidth - 30.0) * hsvColor.toColor().green / 0xff;
thumbColor = hsvColor.toColor().withOpacity(1.0); thumbColor = hsvColor.toColor().withValues(alpha: 1.0);
break; break;
case TrackType.blue: case TrackType.blue:
thumbOffset += (box.maxWidth - 30.0) * hsvColor.toColor().blue / 0xff; thumbOffset += (box.maxWidth - 30.0) * hsvColor.toColor().blue / 0xff;
thumbColor = hsvColor.toColor().withOpacity(1.0); thumbColor = hsvColor.toColor().withValues(alpha: 1.0);
break; break;
case TrackType.alpha: case TrackType.alpha:
thumbOffset += (box.maxWidth - 30.0) * hsvColor.toColor().opacity; thumbOffset += (box.maxWidth - 30.0) * hsvColor.toColor().opacity;
thumbColor = hsvColor.toColor().withOpacity(hsvColor.alpha); thumbColor = hsvColor.toColor().withValues(alpha: hsvColor.alpha);
break; break;
} }
@ -709,8 +709,8 @@ class ColorIndicator extends StatelessWidget {
boxShadow: [ boxShadow: [
BoxShadow( BoxShadow(
color: useWhiteForeground(color) color: useWhiteForeground(color)
? Colors.white.withOpacity(.5) ? Colors.white.withValues(alpha: .5)
: Colors.black.withOpacity(.5), : Colors.black.withValues(alpha: .5),
offset: const Offset(0, 0), offset: const Offset(0, 0),
blurRadius: 5) blurRadius: 5)
], ],

View File

@ -199,7 +199,7 @@ class GradeTile extends StatelessWidget {
: Icon( : Icon(
SubjectIcon.resolveVariant( SubjectIcon.resolveVariant(
context: context, subject: grade.subject), context: context, subject: grade.subject),
color: AppColors.of(context).text.withOpacity(.5), color: AppColors.of(context).text.withValues(alpha: .5),
), ),
minLeadingWidth: isSubjectView ? 32.0 : 0, minLeadingWidth: isSubjectView ? 32.0 : 0,
), ),
@ -288,7 +288,8 @@ class GradeValueWidget extends StatelessWidget {
shadows: [ shadows: [
if (value.weight >= 200) if (value.weight >= 200)
Shadow( Shadow(
color: (contrast ? Colors.white : color).withOpacity(.4), color:
(contrast ? Colors.white : color).withValues(alpha: .4),
offset: const Offset(-4, -3), offset: const Offset(-4, -3),
) )
], ],
@ -312,7 +313,7 @@ class GradeValueWidget extends StatelessWidget {
width: size * 1.4, width: size * 1.4,
height: size * 1.4, height: size * 1.4,
decoration: BoxDecoration( decoration: BoxDecoration(
color: color.withOpacity(contrast ? 1.0 : .25), color: color.withValues(alpha: contrast ? 1.0 : .25),
shape: BoxShape.circle, shape: BoxShape.circle,
boxShadow: [ boxShadow: [
if (shadow && if (shadow &&

View File

@ -75,7 +75,7 @@ class LessonTile extends StatelessWidget {
} }
if (lesson.isEmpty) { if (lesson.isEmpty) {
accent = AppColors.of(context).text.withOpacity(0.6); accent = AppColors.of(context).text.withValues(alpha: 0.6);
} }
if (!lesson.studentPresence) { if (!lesson.studentPresence) {
@ -182,9 +182,8 @@ class LessonTile extends StatelessWidget {
fontSize: 16.5, fontSize: 16.5,
color: fill color: fill
? accent ? accent
: AppColors.of(context) : AppColors.of(context).text.withValues(
.text alpha: !lesson.isEmpty ? 1.0 : 0.5),
.withOpacity(!lesson.isEmpty ? 1.0 : 0.5),
fontStyle: lesson.subject.isRenamed && fontStyle: lesson.subject.isRenamed &&
settingsProvider.renamedSubjectsItalics settingsProvider.renamedSubjectsItalics
? FontStyle.italic ? FontStyle.italic
@ -199,8 +198,10 @@ class LessonTile extends StatelessWidget {
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: 14.0, fontSize: 14.0,
color: fill color: fill
? accent.withOpacity(.9) ? accent.withValues(alpha: .9)
: AppColors.of(context).text.withOpacity(.9), : AppColors.of(context)
.text
.withValues(alpha: .9),
), ),
), ),
), ),
@ -217,7 +218,7 @@ class LessonTile extends StatelessWidget {
// color: Theme.of(context) // color: Theme.of(context)
// .colorScheme // .colorScheme
// .secondary // .secondary
// .withOpacity(.15), // .withValues(alpha: .15),
// borderRadius: BorderRadius.circular(10.0), // borderRadius: BorderRadius.circular(10.0),
// ), // ),
// child: Text( // child: Text(
@ -229,7 +230,7 @@ class LessonTile extends StatelessWidget {
// color: Theme.of(context) // color: Theme.of(context)
// .colorScheme // .colorScheme
// .secondary // .secondary
// .withOpacity(.9), // .withValues(alpha: .9),
// ), // ),
// ), // ),
// ) // )
@ -246,11 +247,11 @@ class LessonTile extends StatelessWidget {
horizontal: 5.5, vertical: 3.0), horizontal: 5.5, vertical: 3.0),
decoration: BoxDecoration( decoration: BoxDecoration(
color: fill color: fill
? accent.withOpacity(.15) ? accent.withValues(alpha: .15)
: Theme.of(context) : Theme.of(context)
.colorScheme .colorScheme
.tertiary .tertiary
.withOpacity(.15), .withValues(alpha: .15),
borderRadius: BorderRadius.circular(10.0), borderRadius: BorderRadius.circular(10.0),
), ),
child: Text( child: Text(
@ -261,11 +262,11 @@ class LessonTile extends StatelessWidget {
fontSize: 12.0, fontSize: 12.0,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
color: fill color: fill
? accent.withOpacity(0.9) ? accent.withValues(alpha: 0.9)
: Theme.of(context) : Theme.of(context)
.colorScheme .colorScheme
.secondary .secondary
.withOpacity(.9), .withValues(alpha: .9),
), ),
), ),
), ),
@ -277,7 +278,9 @@ class LessonTile extends StatelessWidget {
textAlign: TextAlign.start, textAlign: TextAlign.start,
style: TextStyle( style: TextStyle(
fontSize: 14.0, fontSize: 14.0,
color: fill ? accent.withOpacity(0.5) : null, color: fill
? accent.withValues(alpha: 0.5)
: null,
), ),
), ),
], ],
@ -344,7 +347,7 @@ class LessonTile extends StatelessWidget {
? Theme.of(context) ? Theme.of(context)
.colorScheme .colorScheme
.secondary .secondary
.withOpacity(.3) .withValues(alpha: .3)
: const Color(0x00000000), : const Color(0x00000000),
borderRadius: BorderRadius.circular(12.0), borderRadius: BorderRadius.circular(12.0),
boxShadow: [ boxShadow: [
@ -353,7 +356,7 @@ class LessonTile extends StatelessWidget {
color: Theme.of(context) color: Theme.of(context)
.colorScheme .colorScheme
.secondary .secondary
.withOpacity(.25), .withValues(alpha: .25),
blurRadius: 6.0, blurRadius: 6.0,
) )
], ],
@ -386,7 +389,7 @@ class LessonTile extends StatelessWidget {
// fontWeight: FontWeight.w500, // fontWeight: FontWeight.w500,
// color: AppColors.of(context) // color: AppColors.of(context)
// .text // .text
// .withOpacity(.75), // .withValues(alpha: .75),
// ), // ),
// ), // ),
// ), // ),
@ -398,11 +401,11 @@ class LessonTile extends StatelessWidget {
horizontal: 6.0, vertical: 3.5), horizontal: 6.0, vertical: 3.5),
decoration: BoxDecoration( decoration: BoxDecoration(
color: fill color: fill
? accent.withOpacity(.15) ? accent.withValues(alpha: .15)
: Theme.of(context) : Theme.of(context)
.colorScheme .colorScheme
.tertiary .tertiary
.withOpacity(.15), .withValues(alpha: .15),
borderRadius: BorderRadius.circular(10.0), borderRadius: BorderRadius.circular(10.0),
), ),
child: Text( child: Text(
@ -413,11 +416,11 @@ class LessonTile extends StatelessWidget {
fontSize: 12.5, fontSize: 12.5,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
color: fill color: fill
? accent.withOpacity(0.9) ? accent.withValues(alpha: 0.9)
: Theme.of(context) : Theme.of(context)
.colorScheme .colorScheme
.secondary .secondary
.withOpacity(.9), .withValues(alpha: .9),
), ),
), ),
), ),
@ -438,10 +441,10 @@ class LessonTile extends StatelessWidget {
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
color: fill color: fill
? accent.withOpacity(.9) ? accent.withValues(alpha: .9)
: AppColors.of(context) : AppColors.of(context)
.text .text
.withOpacity(.9), .withValues(alpha: .9),
), ),
), ),
], ],
@ -502,8 +505,8 @@ class LessonSubtile extends StatelessWidget {
Center( Center(
child: SizedBox( child: SizedBox(
width: 30.0, width: 30.0,
child: child: Icon(icon,
Icon(icon, color: iconColor.withOpacity(.75), size: 20.0), color: iconColor.withValues(alpha: .75), size: 20.0),
), ),
), ),
Expanded( Expanded(
@ -515,7 +518,8 @@ class LessonSubtile extends StatelessWidget {
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
color: AppColors.of(context).text.withOpacity(.65)), color:
AppColors.of(context).text.withValues(alpha: .65)),
), ),
), ),
), ),

View File

@ -58,7 +58,8 @@ class MessageTile extends StatelessWidget {
width: 105, width: 105,
height: 15, height: 15,
decoration: BoxDecoration( decoration: BoxDecoration(
color: AppColors.of(context).text.withOpacity(.85), color:
AppColors.of(context).text.withValues(alpha: .85),
borderRadius: BorderRadius.circular(8.0), borderRadius: BorderRadius.circular(8.0),
), ),
), ),
@ -89,7 +90,8 @@ class MessageTile extends StatelessWidget {
width: 150, width: 150,
height: 10, height: 10,
decoration: BoxDecoration( decoration: BoxDecoration(
color: AppColors.of(context).text.withOpacity(.45), color:
AppColors.of(context).text.withValues(alpha: .45),
borderRadius: BorderRadius.circular(8.0), borderRadius: BorderRadius.circular(8.0),
), ),
), ),
@ -109,7 +111,8 @@ class MessageTile extends StatelessWidget {
width: 35, width: 35,
height: 15, height: 15,
decoration: BoxDecoration( decoration: BoxDecoration(
color: AppColors.of(context).text.withOpacity(.45), color:
AppColors.of(context).text.withValues(alpha: .45),
borderRadius: BorderRadius.circular(8.0), borderRadius: BorderRadius.circular(8.0),
), ),
), ),
@ -120,7 +123,7 @@ class MessageTile extends StatelessWidget {
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
fontSize: 14.0, fontSize: 14.0,
color: AppColors.of(context).text.withOpacity(.75), color: AppColors.of(context).text.withValues(alpha: .75),
), ),
), ),
), ),

View File

@ -58,7 +58,9 @@ extension DateFormatUtils on DateTime {
} }
if (now.year == year && if (now.year == year &&
now.month == month && now.month == month &&
now.add(const Duration(days: 1)).day == day) return "Tomorrow".i18n; now.add(const Duration(days: 1)).day == day) {
return "Tomorrow".i18n;
}
String formatString; String formatString;

View File

@ -3,21 +3,21 @@ description: "Egy nem hivatalos e-KRÉTA kliens, diákoktól diákoknak."
homepage: https://refilc.hu homepage: https://refilc.hu
publish_to: "none" publish_to: "none"
version: 5.0.4+274 version: 5.1.3+287
environment: environment:
sdk: ">=3.3.2 <=3.4.3" sdk: ^3.6.0
dependencies: dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
cupertino_icons: ^1.0.2 cupertino_icons: ^1.0.8
# reFilc packages # reFilc packages
refilc_mobile_ui: refilc_mobile_ui:
path: "../refilc_mobile_ui/" path: "../refilc_mobile_ui/"
refilc_desktop_ui: # refilc_desktop_ui:
path: "../refilc_desktop_ui/" # path: "../refilc_desktop_ui/"
refilc_kreta_api: refilc_kreta_api:
path: "../refilc_kreta_api/" path: "../refilc_kreta_api/"
refilc_plus: refilc_plus:
@ -26,75 +26,59 @@ dependencies:
flutter_localizations: flutter_localizations:
sdk: flutter sdk: flutter
i18n_extension: ^12.0.1 i18n_extension: ^12.0.1
sqflite: ^2.2.0+2 sqflite: ^2.4.1
intl: ^0.19.0 intl: ^0.19.0
provider: ^6.1.1 provider: ^6.1.2
http: ^1.1.2 http: ^1.3.0
uuid: ^4.2.1 uuid: ^4.5.1
html: ^0.15.0 html: ^0.15.5
open_filex: ^4.3.4 open_filex: ^4.6.0
# open_file: path_provider: ^2.1.5
# git: permission_handler: ^11.3.1
# url: https://github.com/crazecoder/open_file share_plus: ^10.1.4
# ref: master connectivity_plus: ^6.1.3
path_provider: ^2.0.2
permission_handler: ^11.0.1
share_plus: ^9.0.0
connectivity_plus: ^6.0.3
flutter_displaymode: ^0.6.0 flutter_displaymode: ^0.6.0
quick_actions: ^1.0.1 quick_actions: ^1.1.0
animated_list_plus: ^0.5.0 animated_list_plus: ^0.5.2
dynamic_color: ^1.2.2 dynamic_color: ^1.7.0
material_color_utilities: ^0.8.0 material_color_utilities: ^0.11.1
crypto: ^3.0.2 crypto: ^3.0.6
elegant_notification: ^2.2.0 elegant_notification: ^2.4.1
flutter_feather_icons: ^2.0.0+1 flutter_feather_icons: ^2.0.0+1
live_activities: ^1.7.4
animated_flip_counter: ^0.3.4 animated_flip_counter: ^0.3.4
lottie: ^3.1.0 lottie: ^3.3.1
rive: ^0.12.4 rive: ^0.12.4
animated_background: ^2.0.0 animated_background: ^2.0.0
dropdown_button2: ^2.3.9 dropdown_button2: ^2.3.9
home_widget: home_widget: ^0.7.0+1
git: flutter_expandable_fab: ^2.3.0
url: https://github.com/refilc/home_widget.git url_launcher: ^6.3.1
ref: flutter-beta flutter_svg: ^2.0.17
flutter_expandable_fab: ^2.0.0 image_picker: ^1.1.2
uni_links: ^0.5.1 animations: ^2.0.11
url_launcher: ^6.1.6 background_fetch: ^1.3.7
workmanager: flutter_local_notifications: ^18.0.1
git: package_info_plus: ^8.2.1
url: https://github.com/refilc/flutter_workmanager.git
ref: v0.5.1
flutter_svg: ^2.0.10+1
image_picker: ^1.0.7
animations: ^2.0.1
background_fetch: ^1.1.5
flutter_local_notifications: ^17.1.2
package_info_plus: ^8.0.0
screenshot: ^3.0.0 screenshot: ^3.0.0
flutter_staggered_grid_view: ^0.7.0 flutter_staggered_grid_view: ^0.7.0
sqflite_common_ffi_web: ^0.4.0 image_crop_plus: ^1.0.0
image_crop:
git:
url: https://github.com/kimaah/image_crop.git
googleapis: ^13.2.0 googleapis: ^13.2.0
google_sign_in: ^6.2.1 google_sign_in: ^6.2.2
extension_google_sign_in_as_googleapis_auth: ^2.0.12 extension_google_sign_in_as_googleapis_auth: ^2.0.12
maps_launcher: ^2.2.0 maps_launcher: ^3.0.0+1
google_fonts: ^6.1.0 google_fonts: ^6.2.1
flutter_stripe: ^10.0.0 get_it: ^7.7.0
get_it: ^7.6.7
xml: ^6.5.0 xml: ^6.5.0
carousel_slider: ^4.2.1 carousel_slider: ^5.0.0
flutter_portal: ^1.1.4 flutter_portal: ^1.1.4
shake_flutter: ^17.0.0 shake_flutter: ^17.1.0
dev_dependencies: dev_dependencies:
flutter_lints: ^4.0.0 flutter_lints: ^5.0.0
flutter_launcher_icons: "^0.13.1" flutter_launcher_icons: ^0.14.3
flutter_native_splash: "^2.3.10" flutter_native_splash: ^2.4.4
sqflite_common_ffi: ^2.0.0+3 sqflite_common_ffi: ^2.3.4+4
dependency_validator: ^5.0.2
flutter: flutter:
uses-material-design: true uses-material-design: true
@ -188,13 +172,13 @@ flutter:
flutter_launcher_icons: flutter_launcher_icons:
image_path: assets/icons/ic_android.png image_path: assets/icons/ic_android.png
android: true android: true
adaptive_icon_background: "#03112D" adaptive_icon_background: "#7CA021"
adaptive_icon_foreground: assets/icons/ic_android.png adaptive_icon_foreground: assets/icons/ic_launcher_foreground.png
ios: false ios: false
remove_alpha_ios: false remove_alpha_ios: false
flutter_native_splash: flutter_native_splash:
color: "#03112D" color: "#7CA021"
image: assets/icons/ic_splash.png image: assets/icons/ic_splash.png
android_12: android_12:
image: assets/icons/ic_splash.png image: assets/icons/ic_splash.png

View File

@ -1,91 +0,0 @@
import 'package:refilc/theme/colors/colors.dart';
import 'package:flutter/material.dart';
class FilterBar extends StatelessWidget implements PreferredSizeWidget {
const FilterBar({
super.key,
required this.items,
required this.controller,
this.onTap,
this.padding = const EdgeInsets.symmetric(horizontal: 24.0),
this.disableFading = false,
this.scrollable = true,
}) : assert(items.length == controller.length);
final List<Widget> items;
final TabController controller;
final EdgeInsetsGeometry padding;
final Function(int)? onTap;
@override
final Size preferredSize = const Size.fromHeight(42.0);
final bool disableFading;
final bool scrollable;
@override
Widget build(BuildContext context) {
final tabbar = TabBar(
controller: controller,
isScrollable: scrollable,
physics: const BouncingScrollPhysics(),
// Label
labelStyle: Theme.of(context).textTheme.titleMedium!.copyWith(
fontWeight: FontWeight.w600,
fontSize: 15.0,
),
labelPadding: const EdgeInsets.symmetric(horizontal: 12, vertical: 3),
labelColor: Theme.of(context).colorScheme.secondary,
unselectedLabelColor: AppColors.of(context).text.withOpacity(0.65),
// Indicator
indicatorPadding: const EdgeInsets.symmetric(vertical: 8),
indicator: BoxDecoration(
color: Theme.of(context).colorScheme.secondary.withOpacity(0.25),
borderRadius: BorderRadius.circular(45.0),
),
overlayColor: WidgetStateProperty.all(const Color(0x00000000)),
// Tabs
padding: EdgeInsets.zero,
tabs: items,
onTap: onTap,
);
return Container(
width: MediaQuery.of(context).size.width,
height: 48.0,
padding: padding,
child: disableFading
? tabbar
: AnimatedBuilder(
animation: controller.animation!,
builder: (ctx, child) {
// avoid fading over selected tab
return ShaderMask(
shaderCallback: (Rect bounds) {
final Color bg =
Theme.of(context).scaffoldBackgroundColor;
final double index = controller.animation!.value;
return LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
index < 0.2 ? Colors.transparent : bg,
Colors.transparent,
Colors.transparent,
index > controller.length - 1.2
? Colors.transparent
: bg
],
stops: const [
0,
0.1,
0.9,
1
]).createShader(bounds);
},
blendMode: BlendMode.dstOut,
child: child);
},
child: tabbar,
),
);
}
}

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