Compare commits

...

106 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
balint1414
b9e9bef182 Fektetett órarend hibás kiírás javítása 2024-09-03 18:49:55 +02:00
278 changed files with 9597 additions and 8725 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()
}
}
}

View File

@ -1,34 +1,43 @@
<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
git clone https://git.qwit.cloud/refilc/student-plus.git refilc_plus
``` ```
### Install packages ### Csomagok telepítése
Run `fix-pub.sh` Menj be minden mappába és futtasd a következő parancsokat:
```sh
flutter clean
flutter pub get
```
### Run the app ### Alkalmazás építése
```sh ```sh
cd refilc cd refilc
flutter run (--release) flutter build apk --release
``` ```
*Ez egy apk fájlt fog építeni*
### Contribution ### Contribution
**Nézd meg a [Contribution guide](CONTRIBUTING.md)-ot!** **Nézd meg a [Contribution guide](CONTRIBUTING.md)-ot!**
@ -37,16 +46,22 @@ Az összes (ugyan azon verzióhoz tartozó) contribution meg fog jelenni a relea
------- -------
# Team # Csapatunk
**kima:** head developer / project manager **Management**
- Zypherift
- hayn
- Pearoo
- Zizi
- mnus
- xou
**Reiner, pdf, Pearoo, Zizi:** community- and project manager / developer **Designerek**
- dwe
- xou
**vrolandd, TMarccci:** head developer **vrolandd, TMarccci:** head developer
**dwe., xou:** designer
**Péter:** video editor **Péter:** video editor
<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> ***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

@ -9,3 +9,8 @@
-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>

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

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]) { init(from dictionary: [String: Any]) {
self.color = dictionary["color"] as? String ?? "" self.color = dictionary["color"] as? String ?? ""
self.icon = dictionary["icon"] as? String ?? "" self.icon = dictionary["icon"] as? String ?? ""
self.index = dictionary["index"] as? String ?? "" self.index = dictionary["index"] as? String ?? ""
self.title = dictionary["title"] as? String ?? "" self.title = dictionary["title"] as? String ?? ""
self.subtitle = dictionary["subtitle"] as? String ?? "" self.subtitle = dictionary["subtitle"] as? String ?? ""
self.description = dictionary["description"] as? String ?? "" self.description = dictionary["description"] as? String ?? ""
self.nextSubject = dictionary["nextSubject"] as? String ?? "" self.nextSubject = dictionary["nextSubject"] as? String ?? ""
self.nextRoom = dictionary["nextRoom"] as? String ?? "" self.nextRoom = dictionary["nextRoom"] as? String ?? ""
if let startDateStr = dictionary["startDate"] as? String, let startDateInt = Int(startDateStr) { if let startDateStr = dictionary["startDate"] as? String, let startDateInt = Int(startDateStr) {
self.startDate = Date(timeIntervalSince1970: TimeInterval(startDateInt) / 1000) self.startDate = Date(timeIntervalSince1970: TimeInterval(startDateInt) / 1000)
} else { } else {
self.startDate = Date() 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

@ -21,42 +21,48 @@ class FilcAPI {
static const baseUrl = "https://api.refilcapp.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/v4/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/v4/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}";
@ -98,9 +94,7 @@ class FilcAPI {
"rf-platform-version": settings.analyticsEnabled "rf-platform-version": settings.analyticsEnabled
? Platform.operatingSystemVersion ? Platform.operatingSystemVersion
: "unknown", : "unknown",
"rf-app-version": settings.analyticsEnabled "rf-app-version": const String.fromEnvironment("APPVER", defaultValue: "?"),
? const String.fromEnvironment("APPVER", defaultValue: "?")
: "unknown",
"rf-uinid": settings.xFilcId, "rf-uinid": settings.xFilcId,
}; };
@ -131,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();
@ -390,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

@ -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();

View File

@ -29,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;
@ -62,18 +62,39 @@ Future<void> syncAll(BuildContext context) {
// print(user.user?.accessTokenExpire); // print(user.user?.accessTokenExpire);
// print('${user.user?.accessToken ?? "no token"} - ACCESS TOKEN'); // print('${user.user?.accessToken ?? "no token"} - ACCESS TOKEN');
if (user.user == null) return; // 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())) { if (user.user!.accessTokenExpire.isBefore(DateTime.now())) {
String authRes = await Provider.of<KretaClient>(context, listen: false) String authRes = await Provider.of<KretaClient>(context, listen: false)
.refreshLogin() ?? .refreshLogin() ??
''; '';
if (authRes != 'success') { if (authRes != 'success') {
if (kDebugMode) print('ERROR: failed to refresh login'); if (kDebugMode) print('ERROR: failed to refresh login');
lock = false; lock = false;
return Future.value(); return Future.value();
} else { } else {
if (kDebugMode) print('INFO: access token refreshed'); if (kDebugMode) print('INFO: access token refreshed');
} }
} else { } else {
if (kDebugMode) print('INFO: access token is not expired'); if (kDebugMode) print('INFO: access token is not expired');
} }

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,
@ -56,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,
@ -107,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");

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

@ -109,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;
@ -184,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,
@ -256,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;
@ -347,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,
@ -426,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,
@ -455,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,
@ -463,7 +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: true, analyticsEnabled: false,
graphClassAvg: false, graphClassAvg: false,
goodStudent: false, goodStudent: false,
presentationMode: false, presentationMode: false,
@ -485,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: '',
@ -509,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,
@ -583,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;
@ -597,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,
@ -653,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,
@ -675,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;
@ -850,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;
@ -861,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

@ -21,6 +21,10 @@ class User {
String accessToken; String accessToken;
DateTime accessTokenExpire; 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;
@ -39,6 +43,9 @@ class User {
required this.accessToken, required this.accessToken,
required this.accessTokenExpire, 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;
@ -70,9 +77,15 @@ class User {
picture: map["picture"] ?? "", picture: map["picture"] ?? "",
gradeStreak: map["grade_streak"] ?? 0, gradeStreak: map["grade_streak"] ?? 0,
accessToken: map["access_token"] ?? "", accessToken: map["access_token"] ?? "",
accessTokenExpire: DateTime.parse( accessTokenExpire: DateTime.parse(map["access_token_expire"] != ""
map["access_token_expire"] ?? DateTime.now().toIso8601String()), ? 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"] ?? "",
); );
} }
@ -91,6 +104,11 @@ class User {
"access_token": accessToken, "access_token": accessToken,
"access_token_expire": accessTokenExpire.toIso8601String(), "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,8 +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( items = ad_filter.getWidgets(adProvider.ads, context);
adProvider.ads, context);
} }
break; break;
} }
@ -233,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

@ -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.6+276 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: ^10.0.3
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,
),
);
}
}

View File

@ -1,72 +0,0 @@
import 'package:refilc/theme/colors/colors.dart';
import 'package:flutter/material.dart';
class PanelButton extends StatelessWidget {
const PanelButton({
super.key,
this.onPressed,
this.padding = const EdgeInsets.symmetric(horizontal: 14.0),
this.leading,
this.title,
this.trailing,
this.trailingDivider = false,
});
final void Function()? onPressed;
final EdgeInsetsGeometry padding;
final Widget? leading;
final Widget? title;
final Widget? trailing;
final bool trailingDivider;
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 12.0),
child: RawMaterialButton(
onPressed: onPressed,
padding: padding,
shape:
RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
child: ListTile(
leading: leading != null
? Theme(
data: Theme.of(context).copyWith(
iconTheme: IconThemeData(
color: Theme.of(context).colorScheme.secondary)),
child: leading!,
)
: null,
trailing: trailingDivider
? Row(
mainAxisSize: MainAxisSize.min,
children: [
Container(
margin: const EdgeInsets.only(right: 6.0),
width: 2.0,
height: 32.0,
decoration: BoxDecoration(
color: AppColors.of(context).text.withOpacity(.15),
borderRadius: BorderRadius.circular(45.0),
),
),
if (trailing != null) trailing!,
],
)
: trailing,
title: title != null
? DefaultTextStyle(
style: Theme.of(context)
.textTheme
.titleMedium!
.copyWith(fontWeight: FontWeight.w600, fontSize: 14.0),
child: title!,
)
: null,
contentPadding: EdgeInsets.zero,
visualDensity: VisualDensity.compact,
),
),
);
}
}

View File

@ -1,78 +0,0 @@
import 'package:refilc/models/user.dart';
import 'package:refilc/utils/color.dart';
import 'package:flutter/material.dart';
import 'package:refilc/theme/colors/colors.dart';
class ProfileImage extends StatelessWidget {
const ProfileImage({
super.key,
this.name,
this.radius = 20.0,
this.role = Role.student,
this.backgroundColor,
});
final String? name;
final double radius;
final Role? role;
final Color? backgroundColor;
@override
Widget build(BuildContext context) {
Color color = ColorUtils.foregroundColor(
backgroundColor ?? Theme.of(context).scaffoldBackgroundColor);
Color roleColor;
if (Theme.of(context).brightness == Brightness.light) {
roleColor = const Color(0xFF444444);
} else {
roleColor = const Color(0xFF555555);
}
return Stack(
alignment: Alignment.center,
children: [
Material(
clipBehavior: Clip.hardEdge,
shape: const CircleBorder(),
color: backgroundColor ?? AppColors.of(context).text.withOpacity(.15),
child: InkWell(
child: AnimatedContainer(
duration: const Duration(milliseconds: 200),
height: radius * 2,
width: radius * 2,
decoration: const BoxDecoration(
shape: BoxShape.circle,
),
child: name != null && (name?.trim().length ?? 0) > 0
? Center(
child: Text(
(name?.trim().length ?? 0) > 0
? (name ?? "?").trim()[0]
: "?",
style: TextStyle(
color: color,
fontWeight: FontWeight.w600,
fontSize: 18.0 * (radius / 20.0),
),
),
)
: Container(),
),
),
),
// Role indicator
if (role == Role.parent)
SizedBox(
height: radius * 2,
width: radius * 2,
child: Container(
alignment: Alignment.bottomRight,
child: Icon(Icons.shield, color: roleColor, size: radius / 1.3),
),
),
],
);
}
}

View File

@ -1,14 +0,0 @@
import 'package:flutter/material.dart';
import 'package:refilc_kreta_api/models/grade.dart';
import 'package:refilc/ui/widgets/grade/grade_tile.dart';
class GradeViewable extends StatelessWidget {
const GradeViewable(this.grade, {super.key});
final Grade grade;
@override
Widget build(BuildContext context) {
return GradeTile(grade);
}
}

View File

@ -1,19 +0,0 @@
import 'package:refilc_kreta_api/models/lesson.dart';
import 'package:refilc/ui/widgets/lesson/lesson_tile.dart';
import 'package:flutter/material.dart';
class LessonViewable extends StatelessWidget {
const LessonViewable(this.lesson, {super.key, this.swapDesc = false});
final Lesson lesson;
final bool swapDesc;
@override
Widget build(BuildContext context) {
final tile = LessonTile(lesson, swapDesc: swapDesc);
if (lesson.subject.id == '' || tile.lesson.isEmpty) return tile;
return tile;
}
}

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