Compare commits

...

26 Commits

Author SHA1 Message Date
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
BalazsManus
eb0308cbed Update README.md 2025-02-15 11:30:25 +01:00
BalazsManus
c90e01737c Merge pull request 'Merge pull request 'readme update' (#3) from master into dev' (#4) from dev into master
Reviewed-on: https://git.qwit.cloud/refilc/student-legacy/pulls/4
2025-02-15 11:29:56 +01:00
BalazsManus
05c406657a Merge pull request 'readme update' (#3) from master into dev
Reviewed-on: https://git.qwit.cloud/refilc/student-legacy/pulls/3
2025-02-15 11:29:33 +01:00
BalazsManus
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
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
BalazsManus
2ac948539c idk what i did 2025-02-13 20:54:28 +01:00
71 changed files with 487 additions and 1867 deletions

2
.gitmodules vendored
View File

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

File diff suppressed because it is too large Load Diff

View File

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

1
.idea/misc.xml generated
View File

@@ -1,4 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Android API 33, extension level 3 Platform" project-jdk-type="Android SDK" />
</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/.pub" />
<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>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Dart SDK" level="project" />
</component>
</module>

5
.idea/vcs.xml generated
View File

@@ -2,9 +2,6 @@
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
<mapping directory="$PROJECT_DIR$/filcnaplo_desktop_ui" 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" />
<mapping directory="$PROJECT_DIR$/refilc_plus" vcs="Git" />
</component>
</project>

View File

@@ -14,7 +14,7 @@
*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
git clone --branch dev https://git.qwit.cloud/refilc/student-legacy.git --recursive
git clone https://git.qwit.cloud/refilc/student-legacy.git --recursive
cd naplo
# ha ez nem töltött le refilc plus repoba értelmes dolgokat futtasd a többi parancsot is
rm -rf refilc_plus

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

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

View File

@@ -120,7 +120,13 @@ android {
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'
}
}

View File

@@ -11,4 +11,6 @@
-dontwarn com.stripe.android.pushProvisioning.PushProvisioningEphemeralKeyProvider
-dontwarn org.joda.convert.FromString
-dontwarn org.joda.convert.ToString
-dontwarn org.joda.convert.ToString
#-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

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"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<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>

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:windowDrawsSystemBarBackgrounds">false</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>
</style>
<!-- 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:windowDrawsSystemBarBackgrounds">false</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>
</style>
<!-- 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"?>
<resources>
<color name="ic_launcher_background">#03112D</color>
<color name="ic_launcher_background">#7CA021</color>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
@@ -66,4 +66,4 @@
<color name="pink_shade300">#FFF06292</color>
<color name="purple_shade300">#FFBA68C8</color>
<color name="teal_shade300">#FF22AC9B</color>
</resources>
</resources>

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

View File

@@ -1,3 +1,3 @@
#!/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

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>
</scenes>
<resources>
<image name="LaunchImage" width="1700" height="1700"/>
<image name="LaunchImage" width="2700" height="2700"/>
<image name="LaunchBackground" width="1" height="1"/>
</resources>
</document>

View File

@@ -1,138 +1,138 @@
<?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">
<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>
<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>
<key>CFBundleIconFiles</key>
<array>
<string>refilc_concept</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
<key>refilc_concept</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>refilc_concept</string>
</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>
<key>refilc_default</key>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIcons</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>
<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>
<key>CFBundlePrimaryIcon</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string></string>
</array>
<key>CFBundleIconName</key>
<string></string>
</array>
<key>CFBundleIconName</key>
<string></string>
<key>UIPrerenderedIcon</key>
<false/>
<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>
<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>

View File

@@ -21,46 +21,48 @@ class FilcAPI {
static const baseUrl = "https://api.refilcapp.hu";
// Public API
static const schoolList = "$baseUrl/v3/public/school-list";
static const news = "0.0.0.0/v4/public/news";
static const supporters = "$baseUrl/v3/public/supporters";
static const schoolList = "https://api.refilcapp.hu/v3/public/school-list";
static const news = "https://staticrf-api.pages.dev/news/index.json";
static const supporters = "0.0.0.0";
// Private API
static const ads = "0.0.0.0/v3/private/ads";
static const ads = "0.0.0.0";
static const config = "$baseUrl/v3/private/config";
static const reportApi = "$baseUrl/v3/private/crash-report";
static const rfPlus = "0.0.0.0/v3/rf-plus";
static const plusAuthLogin = "0.0.0.0/auth/login";
static const plusAuthCallback = "0.0.0.0/auth/callback";
static const plusActivation = "0.0.0.0/activate";
static const plusScopes = "0.0.0.0/scopes";
static const rfPlus = "0.0.0.0";
static const plusAuthLogin = "0.0.0.0";
static const plusAuthCallback = "0.0.0.0";
static const plusActivation = "0.0.0.0";
static const plusScopes = "0.0.0.0/";
// Updates
static const repo = "refilc/naplo";
static const releases = "https://api.github.com/repos/$repo/releases";
// Share API
static const themeShare = "$baseUrl/v3/shared/theme/add";
static const themeGet = "$baseUrl/v3/shared/theme/get";
static const themeShare = "https://api.refilcapp.hu/v3/shared/theme/add";
static const themeGet = "https://api.refilcapp.hu/v3/shared/theme/get";
static const allThemes = "$themeGet/all";
static const themeByID = "$themeGet/";
static const gradeColorsShare = "$baseUrl/v3/shared/grade-colors/add";
static const gradeColorsGet = "$baseUrl/v3/shared/grade-colors/get";
static const gradeColorsShare = "https://api.refilcapp.hu/v3/shared/grade-colors/add";
static const gradeColorsGet = "https://api.refilcapp.hu/v3/shared/grade-colors/get";
static const allGradeColors = "$gradeColorsGet/all";
static const gradeColorsByID = "$gradeColorsGet/";
// Payment API
static const payment = "0.0.0.0/v4/payment";
static const stripeSheet = "0.0.0.0/stripe-sheet";
static const payment = "0.0.0.0";
static const stripeSheet = "0.0.0.0";
// Cloud Sync
// cloud sync? for what reason
static const cloudSyncApi = "0.0.0.0/v4/me/cloud-sync";
static const cloudSyncApi = "0.0.0.0";
static Future<bool> checkConnectivity() async =>
(await Connectivity().checkConnectivity())[0] != ConnectivityResult.none;
// nem tudom nem vazar-e senkit se, de mar ertelmetlen ez
static Future<List<School>?> getSchools() async {
try {
http.Response res = await http.get(Uri.parse(schoolList));
@@ -70,16 +72,6 @@ class FilcAPI {
.cast<Map>()
.map((json) => School.fromJson(json))
.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;
} else {
throw "HTTP ${res.statusCode}: ${res.body}";
@@ -102,9 +94,7 @@ class FilcAPI {
"rf-platform-version": settings.analyticsEnabled
? Platform.operatingSystemVersion
: "unknown",
"rf-app-version": settings.analyticsEnabled
? const String.fromEnvironment("APPVER", defaultValue: "?")
: "unknown",
"rf-app-version": const String.fromEnvironment("APPVER", defaultValue: "?"),
"rf-uinid": settings.xFilcId,
};
@@ -135,7 +125,8 @@ class FilcAPI {
http.Response res = await http.get(Uri.parse(news));
if (res.statusCode == 200) {
return (jsonDecode(res.body) as List)
String utf8Body = utf8.decode(res.bodyBytes);
return (jsonDecode(utf8Body) as List)
.cast<Map>()
.map((e) => News.fromJson(e))
.toList();
@@ -397,27 +388,6 @@ class FilcAPI {
// cloud sync
static Future<Map?> cloudSync(Map<String, String> data, String token) async {
try {
var client = http.Client();
http.Response res = await client.post(
Uri.parse(cloudSyncApi),
body: data,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': 'Bearer $token',
},
);
if (res.statusCode != 200) {
throw "HTTP ${res.statusCode}: ${res.body}";
}
return jsonDecode(res.body);
} on Exception catch (error, stacktrace) {
log("ERROR: FilcAPI.cloudSync: $error $stacktrace");
}
return null;
}
}

View File

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

View File

@@ -90,11 +90,11 @@ Future<void> syncAll(BuildContext context) async {
'';
if (authRes != 'success') {
if (kDebugMode) print('ERROR: failed to refresh login');
lock = false;
return Future.value();
} else {
if (kDebugMode) print('INFO: access token refreshed');
}
/ lock = false;
/ return Future.value();
/ } else {
/ if (kDebugMode) print('INFO: access token refreshed');
/ }
} else {
if (kDebugMode) print('INFO: access token is not expired');
}

View File

@@ -470,7 +470,7 @@ class SettingsProvider extends ChangeNotifier {
notificationsMessagesEnabled: true,
notificationsLessonsEnabled: true,
notificationsBitfield: 255,
developerMode: false,
developerMode: true,
notificationPollInterval: 1,
vibrate: VibrationStrength.medium,
abWeeks: false,
@@ -478,7 +478,7 @@ class SettingsProvider extends ChangeNotifier {
updateChannel: UpdateChannel.stable,
config: Config.fromJson({}),
xFilcId: const Uuid().v4(),
analyticsEnabled: true,
analyticsEnabled: false,
graphClassAvg: false,
goodStudent: false,
presentationMode: false,
@@ -506,7 +506,7 @@ class SettingsProvider extends ChangeNotifier {
currentThemeId: '',
currentThemeDisplayName: '',
currentThemeCreator: 'reFilc',
showBreaks: true,
showBreaks: false,
pinSetGeneral: '',
pinSetPersonalize: '',
pinSetNotify: '',

View File

@@ -3,7 +3,7 @@ description: "Egy nem hivatalos e-KRÉTA kliens, diákoktól diákoknak."
homepage: https://refilc.hu
publish_to: "none"
version: 5.1.1+283
version: 5.1.2+286
environment:
sdk: ^3.6.0
@@ -29,11 +29,11 @@ dependencies:
sqflite: ^2.2.0+2
intl: ^0.19.0
provider: ^6.1.1
http: ^1.1.2
http: ^1.2.0
uuid: ^4.2.1
html: ^0.15.0
open_filex: ^4.3.4
path_provider: ^2.0.2
path_provider: ^2.1.3
permission_handler: ^11.0.1
share_plus: ^10.0.3
connectivity_plus: ^6.0.3
@@ -45,7 +45,6 @@ dependencies:
crypto: ^3.0.2
elegant_notification: ^2.2.0
flutter_feather_icons: ^2.0.0+1
# live_activities: ^1.7.4
animated_flip_counter: ^0.3.4
lottie: ^3.1.0
rive: ^0.12.4
@@ -53,7 +52,7 @@ dependencies:
dropdown_button2: ^2.3.9
home_widget: ^0.7.0+1
flutter_expandable_fab: ^2.0.0
url_launcher: ^6.1.6
url_launcher: ^6.2.5
flutter_svg: ^2.0.10+1
image_picker: ^1.0.7
animations: ^2.0.1
@@ -79,6 +78,7 @@ dev_dependencies:
flutter_launcher_icons: ^0.14.2
flutter_native_splash: "^2.3.10"
sqflite_common_ffi: ^2.0.0+3
dependency_validator: ^5.0.2
dependency_overrides:
webview_flutter_wkwebview: 3.17.0
@@ -175,13 +175,13 @@ flutter:
flutter_launcher_icons:
image_path: assets/icons/ic_android.png
android: true
adaptive_icon_background: "#03112D"
adaptive_icon_foreground: assets/icons/ic_android.png
adaptive_icon_background: "#7CA021"
adaptive_icon_foreground: assets/icons/ic_launcher_foreground.png
ios: false
remove_alpha_ios: false
flutter_native_splash:
color: "#03112D"
color: "#7CA021"
image: assets/icons/ic_splash.png
android_12:
image: assets/icons/ic_splash.png

View File

@@ -91,7 +91,7 @@ class KretaClient {
headerMap.remove("authorization");
print("DEBUG: 401 error, refreshing login");
print("DEBUG: 401 error, URL: $url");
// await refreshLogin();
//await refreshLogin();
} else {
break;
}
@@ -160,7 +160,7 @@ class KretaClient {
res = await client.post(Uri.parse(url), headers: headerMap, body: body);
if (res.statusCode == 401) {
// await refreshLogin();
//await refreshLogin();
headerMap.remove("authorization");
} else {
break;
@@ -234,7 +234,7 @@ class KretaClient {
if (res.statusCode == 401) {
headerMap.remove("authorization");
// await refreshLogin();
//await refreshLogin();
} else {
break;
}
@@ -277,6 +277,13 @@ class KretaClient {
print("REFRESH TOKEN BELOW");
print(refreshToken);
print(loginUser.accessTokenExpire);
print(DateTime.now().toIso8601String());
if (!DateTime.now().isAfter(loginUser.accessTokenExpire)) {
return 'success';
}
if (refreshToken != null) {
// print("REFRESHING LOGIN");
Map? res = await postAPI(KretaAPI.login,

View File

@@ -98,8 +98,6 @@ class LessonViewableState extends State<LessonViewable> {
if (!Provider.of<PlusProvider>(context, listen: false)
.hasScope(PremiumScopes.timetableNotes)) {
PlusLockedFeaturePopup.show(
context: context, feature: PremiumFeature.timetableNotes);
return;
}

View File

@@ -746,8 +746,6 @@ class GradesPageState extends State<GradesPage> {
if (!Provider.of<PlusProvider>(context, listen: false)
.hasScope(PremiumScopes.gradeExporting)) {
PlusLockedFeaturePopup.show(
context: context, feature: PremiumFeature.gradeExporting);
return;
}

View File

@@ -308,9 +308,7 @@ class NotesPageState extends State<NotesPage> with TickerProviderStateMixin {
if (!Provider.of<PlusProvider>(context, listen: false)
.hasScope(PremiumScopes.unlimitedSelfNotes) &&
noteTiles.length > 10) {
return PlusLockedFeaturePopup.show(
context: context,
feature: PremiumFeature.selfNotes);
return;
}
showCreationModal(context);

View File

@@ -219,8 +219,7 @@ class NotesScreenState extends State<NotesScreen> {
if (!Provider.of<PlusProvider>(context, listen: false)
.hasScope(PremiumScopes.unlimitedSelfNotes) &&
noteTiles.length > 10) {
return PlusLockedFeaturePopup.show(
context: context, feature: PremiumFeature.selfNotes);
return;
}
Navigator.of(context, rootNavigator: true).push(

View File

@@ -925,10 +925,6 @@ class _LiveActivityColorSettingState extends State<LiveActivityColorSetting> {
onMainColorChange: (k) {
if (!Provider.of<PlusProvider>(context, listen: false)
.hasScope(PremiumScopes.liveActivityColor)) {
PlusLockedFeaturePopup.show(
context: context,
feature: PremiumFeature.liveActivity,
);
return;
}

View File

@@ -16,6 +16,7 @@ import 'package:refilc_kreta_api/providers/note_provider.dart';
import 'package:refilc_kreta_api/providers/timetable_provider.dart';
import 'package:refilc/api/providers/user_provider.dart';
import 'package:refilc/api/providers/database_provider.dart';
// import 'package:refilc/utils/format.dart';
import 'package:refilc/models/settings.dart';
import 'package:refilc/models/user.dart';
@@ -23,20 +24,25 @@ import 'package:refilc/theme/colors/colors.dart';
import 'package:refilc_kreta_api/client/client.dart';
import 'package:refilc_mobile_ui/common/action_button.dart';
import 'package:refilc_mobile_ui/common/bottom_sheet_menu/bottom_sheet_menu.dart';
// import 'package:refilc_mobile_ui/common/bottom_sheet_menu/bottom_sheet_menu_item.dart';
import 'package:refilc_mobile_ui/common/panel/panel.dart';
import 'package:refilc_mobile_ui/common/panel/panel_button.dart';
import 'package:refilc_mobile_ui/common/profile_image/profile_image.dart';
import 'package:refilc_mobile_ui/common/soon_alert/soon_alert.dart';
// import 'package:refilc_mobile_ui/common/soon_alert/soon_alert.dart';
import 'package:refilc_mobile_ui/common/splitted_panel/splitted_panel.dart';
import 'package:refilc_mobile_ui/common/system_chrome.dart';
// import 'package:refilc_mobile_ui/common/system_chrome.dart';
import 'package:refilc_mobile_ui/common/widgets/update/updates_view.dart';
import 'package:refilc_mobile_ui/screens/news/news_screen.dart';
// import 'package:refilc_mobile_ui/screens/notes/notes_screen.dart';
import 'package:refilc_mobile_ui/screens/settings/accounts/account_tile.dart';
import 'package:refilc_mobile_ui/screens/settings/accounts/account_view.dart';
// import 'package:refilc_mobile_ui/screens/settings/debug/subject_icon_gallery.dart';
// import 'package:refilc_mobile_ui/screens/settings/modify_subject_names.dart';
import 'package:refilc_mobile_ui/screens/settings/notifications_screen.dart';
@@ -46,11 +52,14 @@ import 'package:refilc_mobile_ui/screens/settings/submenu/code_scanner.dart';
import 'package:refilc_mobile_ui/screens/settings/submenu/extras_screen.dart';
import 'package:refilc_mobile_ui/screens/settings/submenu/personalize_screen.dart';
import 'package:flutter/foundation.dart';
// import 'package:refilc_plus/models/premium_scopes.dart';
import 'package:refilc_plus/providers/plus_provider.dart';
// import 'package:refilc_plus/ui/mobile/plus/upsell.dart';
// import 'package:refilc_plus/ui/mobile/settings/app_icon_screen.dart';
import 'package:flutter/cupertino.dart';
// import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_custom_tabs/flutter_custom_tabs.dart' as tabs;
@@ -64,6 +73,7 @@ import 'settings_screen.i18n.dart';
import 'package:flutter/services.dart';
import 'package:refilc_mobile_ui/screens/settings/user/nickname.dart';
import 'package:refilc_mobile_ui/screens/settings/user/profile_pic.dart';
// import 'package:refilc_plus/ui/mobile/settings/modify_teacher_names.dart';
// import 'package:refilc_plus/ui/mobile/settings/welcome_message.dart';
// import 'package:refilc_mobile_ui/screens/error_screen.dart';
@@ -82,7 +92,6 @@ class SettingsScreen extends StatefulWidget {
class SettingsScreenState extends State<SettingsScreen>
with SingleTickerProviderStateMixin {
int devmodeCountdown = 5;
bool __ss = false; // secret settings
Future<Map>? futureRelease;
@@ -391,7 +400,6 @@ class SettingsScreenState extends State<SettingsScreen>
padding: const EdgeInsets.only(top: 4.0, bottom: 12.0),
child: GestureDetector(
onTap: () => _showBottomSheet(user.getUser(user.id ?? "")),
onDoubleTap: () => setState(() => __ss = true),
child: Text(
!settings.presentationMode
? (user.displayName ?? "?")
@@ -429,13 +437,6 @@ class SettingsScreenState extends State<SettingsScreen>
borderRadius: const BorderRadius.vertical(
top: Radius.circular(12.0), bottom: Radius.circular(4.0)),
),
// cloud-sync
const MenuCloudSyncSettings(
borderRadius: BorderRadius.vertical(
top: Radius.circular(4.0),
bottom: Radius.circular(4.0),
),
),
// open dcs (digital collaboration space)
PanelButton(
onPressed: () => _openDKT(user.user!),
@@ -638,257 +639,56 @@ class SettingsScreenState extends State<SettingsScreen>
// child: ActiveSponsorCard(),
// ),
// secret settings
if (__ss)
SplittedPanel(
isSeparated: true,
isTransparent: true,
hasShadow: false,
children: [
SplittedPanel(
title: Text("secret".i18n),
cardPadding: const EdgeInsets.all(4.0),
padding: EdgeInsets.zero,
children: [
// good student mode
Material(
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding:
const EdgeInsets.only(left: 12.0, right: 6.0),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0)),
title: Text("goodstudent".i18n,
style:
const TextStyle(fontWeight: FontWeight.w500)),
onChanged: (v) {
if (v) {
showDialog(
context: context,
builder: (context) => WillPopScope(
onWillPop: () async => false,
child: AlertDialog(
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
title: Text("attention".i18n),
content:
Text("goodstudent_disclaimer".i18n),
actions: [
ActionButton(
label: "understand".i18n,
onTap: () {
Navigator.of(context).pop();
settings.update(goodStudent: v);
Provider.of<GradeProvider>(context,
listen: false)
.convertBySettings();
})
],
),
),
);
} else {
settings.update(goodStudent: v);
Provider.of<GradeProvider>(context, listen: false)
.convertBySettings();
}
},
value: settings.goodStudent,
activeColor: Theme.of(context).colorScheme.secondary,
),
),
],
),
SplittedPanel(
cardPadding: const EdgeInsets.all(4.0),
padding: EdgeInsets.zero,
children: [
// presentation mode
Material(
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding:
const EdgeInsets.only(left: 12.0, right: 6.0),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0)),
title: Text("presentation".i18n,
style:
const TextStyle(fontWeight: FontWeight.w500)),
onChanged: (v) =>
settings.update(presentationMode: v),
value: settings.presentationMode,
activeColor: Theme.of(context).colorScheme.secondary,
),
),
// UwU-fied mode (why????)
// Material(
// type: MaterialType.transparency,
// child: SwitchListTile(
// contentPadding: const EdgeInsets.only(left: 12.0),
// shape: RoundedRectangleBorder(
// borderRadius: BorderRadius.circular(12.0)),
// title: Text("uwufymode".i18n,
// style:
// const TextStyle(fontWeight: FontWeight.w500)),
// onChanged: (v) {
// SettingsHelper.uwuMode(context, v);
// setState(() {});
// },
// value: settings.presentationMode,
// activeColor: Theme.of(context).colorScheme.secondary,
// ),
// ),
],
),
// uwu mode
SplittedPanel(
cardPadding: const EdgeInsets.all(4.0),
padding: EdgeInsets.zero,
children: [
// uwu mode
Material(
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding:
const EdgeInsets.only(left: 12.0, right: 6.0),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0)),
title: Text("uwufymode".i18n,
style:
const TextStyle(fontWeight: FontWeight.w500)),
onChanged: (v) => settings.update(uwuMode: v),
value: settings.uwuMode,
activeColor: Theme.of(context).colorScheme.secondary,
),
),
],
),
],
),
if ((user.gradeStreak ?? 0) > 1)
SplittedPanel(
padding: const EdgeInsets.only(
bottom: 12.0, left: 24.0, right: 24.0),
children: [
GestureDetector(
onTap: () {
SoonAlert.show(context: context);
},
child: ListTile(
title: Text(
"grade_streak".i18n,
style: TextStyle(
color: AppColors.of(context).text.withOpacity(0.95),
fontWeight: FontWeight.w500,
),
ListTile(
title: Text(
"grade_streak".i18n,
style: TextStyle(
color: AppColors.of(context).text.withOpacity(0.95),
fontWeight: FontWeight.w500,
),
subtitle: Text(
"grade_streak_subtitle".i18n,
style: TextStyle(
color: AppColors.of(context).text.withOpacity(0.75),
),
),
subtitle: Text(
"grade_streak_subtitle".i18n,
style: TextStyle(
color: AppColors.of(context).text.withOpacity(0.75),
),
leading: Image.asset(
'assets/images/apple_fire_emoji.png',
width: 24.0,
),
// leading: const Text(
// "🔥",
// style: TextStyle(fontSize: 22.0),
// ),
trailing: Text(
"${user.gradeStreak}",
style: TextStyle(
color: AppColors.of(context).text.withOpacity(0.95),
fontWeight: FontWeight.w500,
fontSize: 18.0,
),
),
leading: Image.asset(
'assets/images/apple_fire_emoji.png',
width: 24.0,
),
// leading: const Text(
// "🔥",
// style: TextStyle(fontSize: 22.0),
// ),
trailing: Text(
"${user.gradeStreak}",
style: TextStyle(
color: AppColors.of(context).text.withOpacity(0.95),
fontWeight: FontWeight.w500,
fontSize: 18.0,
),
),
),
],
),
// plus subscribe inline
const PlusSettingsInline(),
// const SizedBox(
// height: 16.0,
// ),
// Panel(
// hasShadow: false,
// padding: const EdgeInsets.only(left: 24.0, right: 24.0),
// title: Padding(
// padding: const EdgeInsets.only(left: 24.0),
// child: Text('account_link'.i18n),
// ),
// isTransparent: true,
// child: Column(
// children: [
// // QwID account linking
// PanelButton(
// onPressed: () {
// launchUrl(
// Uri.parse(
// 'https://qwid.qwit.dev/oauth2/authorize?client_id=refilc&response_type=code&scope=*'),
// mode: LaunchMode.externalApplication,
// );
// },
// title: Text("QwID fiók-összekapcsolás".i18n),
// leading: Icon(
// FeatherIcons.link,
// size: 22.0,
// color: AppColors.of(context).text.withOpacity(0.95),
// ),
// trailing: GestureDetector(
// onTap: () {
// showDialog(
// context: context,
// builder: (BuildContext context) {
// return AlertDialog(
// title: const Text("QwID?!"),
// content: const Text(
// "A QwID egy olyan fiók, mellyel az összes QwIT szolgáltatásba beléphetsz és minden adatod egy helyen kezelheted. \"Miért jó ez nekem?\" A QwID fiókba való bejelentkezéssel rengeteg új funkcióhoz férhetsz hozzá, ami sajnos korábban lehetetlen volt egy szimpla e-KRÉTA fiókkal. Fiókhoz kötve megoszthatsz bármilyen adatot a barátaiddal, vagy ha szeretnéd nyilvánosságra is hozhatod jegyeid, reFilc témáid, és még rengeteg dolgot. A QwID fiók abban is segít, hogy egyszerűbben kezelhesd előfizetéseid, valamint fiókodnak köszönhetően rengeteg ajándékot kaphatsz reFilc+ előfizetésed mellé egyéb QwIT és reFilc szolgáltatásokban. \"Miért QwID?\" A név a reFilc mögött álló fejlesztői csapat, a QwIT nevéből, valamint az angol Identity szó rövidítéséből ered. \"Egyéb hasznos tudnivalók?\" A QwID fiókodat bármikor törölheted, ha úgy érzed, hogy nem szeretnéd tovább használni. Bővebb információt az adatkezelésről és az általános feltételekről megtalálsz a regisztrációs oldalon. Fiókod kezeléséhez látogass el a qwid.qwit.dev weboldalra.",
// ),
// actions: [
// TextButton(
// onPressed: () {
// Navigator.of(context).pop();
// },
// child: const Text("Szuper!"),
// ),
// ],
// );
// },
// );
// },
// child: Icon(
// FeatherIcons.helpCircle,
// size: 20.0,
// color: AppColors.of(context).text.withOpacity(0.95),
// ),
// ),
// borderRadius: const BorderRadius.vertical(
// top: Radius.circular(12.0),
// bottom: Radius.circular(4.0),
// ),
// ),
// ],
// ),
// ),
// settings submenus
const SizedBox(
height: 16.0,
),
Panel(
hasShadow: false,
padding:
const EdgeInsets.only(bottom: 20.0, left: 24.0, right: 24.0),
padding: const EdgeInsets.only(bottom: 20.0, left: 24.0, right: 24.0),
title: Padding(
padding: const EdgeInsets.only(left: 24.0),
child: Text('settings'.i18n),
@@ -898,13 +698,13 @@ class SettingsScreenState extends State<SettingsScreen>
children: [
// general settings
const SplittedPanel(
padding: EdgeInsets.zero,
padding: const EdgeInsets.only(top: 8.0),
cardPadding: EdgeInsets.all(4.0),
children: [
MenuGeneralSettings(
borderRadius: BorderRadius.vertical(
top: Radius.circular(12.0),
bottom: Radius.circular(12.0),
bottom: Radius.circular(4.0),
),
),
],
@@ -917,7 +717,7 @@ class SettingsScreenState extends State<SettingsScreen>
children: [
const MenuPersonalizeSettings(
borderRadius: BorderRadius.vertical(
top: Radius.circular(12.0),
top: Radius.circular(4.0),
bottom: Radius.circular(4.0),
),
),
@@ -938,25 +738,25 @@ class SettingsScreenState extends State<SettingsScreen>
),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(4.0),
bottom: Radius.circular(12.0),
bottom: Radius.circular(4.0),
),
),
],
),
// notifications
const SplittedPanel(
padding: EdgeInsets.only(top: 8.0),
cardPadding: EdgeInsets.all(4.0),
children: [
MenuNotifications(
borderRadius: BorderRadius.vertical(
top: Radius.circular(12.0),
bottom: Radius.circular(12.0),
),
),
],
),
//const SplittedPanel(
// padding: EdgeInsets.only(top: 8.0),
// cardPadding: EdgeInsets.all(4.0),
// children: [
// /*MenuNotifications(
// borderRadius: BorderRadius.vertical(
// top: Radius.circular(12.0),
// bottom: Radius.circular(12.0),
// ),
// ),*/
// ],
//),
// extras
const SplittedPanel(
@@ -965,7 +765,7 @@ class SettingsScreenState extends State<SettingsScreen>
children: [
MenuExtrasSettings(
borderRadius: BorderRadius.vertical(
top: Radius.circular(12.0),
top: Radius.circular(4.0),
bottom: Radius.circular(12.0),
),
),
@@ -1019,23 +819,6 @@ class SettingsScreenState extends State<SettingsScreen>
title: Text("other".i18n),
cardPadding: const EdgeInsets.all(4.0),
children: [
PanelButton(
leading: Icon(
Icons.qr_code,
size: 22.0,
color: AppColors.of(context).text.withOpacity(0.95),
),
title: Text("qr_scanner".i18n),
onPressed: () => Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => const CodeScannerScreen(),
),
),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(12.0),
bottom: Radius.circular(4.0),
),
),
PanelButton(
leading: Icon(
FeatherIcons.mail,
@@ -1057,7 +840,7 @@ class SettingsScreenState extends State<SettingsScreen>
),
title: Text("stickermap".i18n),
onPressed: () => launchUrl(
Uri.parse("https://stickermap.refilc.hu"),
Uri.parse("https://map.qwit.cloud"),
mode: LaunchMode.inAppBrowserView,
),
borderRadius: const BorderRadius.vertical(
@@ -1107,9 +890,6 @@ class SettingsScreenState extends State<SettingsScreen>
color: AppColors.of(context).text.withOpacity(0.95),
),
title: Text("privacy".i18n),
// onPressed: () => launchUrl(
// Uri.parse("https://refilc.hu/privacy-policy"),
// mode: LaunchMode.inAppWebView),
onPressed: () => _openPrivacy(context),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(12.0),
@@ -1123,14 +903,15 @@ class SettingsScreenState extends State<SettingsScreen>
color: AppColors.of(context).text.withOpacity(0.95),
),
title: const Text("Discord"),
onPressed: () => launchUrl(Uri.parse("https://dc.refilc.hu"),
onPressed: () => launchUrl(
Uri.parse("https://discord.gg/6DvjyPAw2T"),
mode: LaunchMode.externalApplication),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(4.0),
bottom: Radius.circular(4.0),
),
),
PanelButton(
/*PanelButton(
leading: Icon(
FeatherIcons.globe,
size: 22.0,
@@ -1143,16 +924,16 @@ class SettingsScreenState extends State<SettingsScreen>
top: Radius.circular(4.0),
bottom: Radius.circular(4.0),
),
),
),*/
PanelButton(
leading: Icon(
FeatherIcons.github,
size: 22.0,
color: AppColors.of(context).text.withOpacity(0.95),
),
title: const Text("Github"),
title: const Text("Gitea"),
onPressed: () => launchUrl(
Uri.parse("https://github.com/refilc"),
Uri.parse("https://git.qwit.cloud/refilc/student-legacy"),
mode: LaunchMode.externalApplication),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(4.0),
@@ -1291,7 +1072,7 @@ class SettingsScreenState extends State<SettingsScreen>
],
),
// developer options
if (settings.developerMode)
if (true)
SplittedPanel(
title: Text("devsettings".i18n),
cardPadding: const EdgeInsets.all(4.0),
@@ -1378,34 +1159,24 @@ class SettingsScreenState extends State<SettingsScreen>
child: FutureBuilder<Map>(
future: futureRelease,
builder: (context, release) {
if (release.hasData) {
return DefaultTextStyle(
style: Theme.of(context)
.textTheme
.titleMedium!
.copyWith(
fontWeight: FontWeight.w600,
color: AppColors.of(context)
.text
.withOpacity(0.65)),
child: Text("v${release.data!['version']}, módosítva a Filc csapat által"),
);
String versionText;
if (release.hasData && release.data != null) {
versionText =
"v${release.data!['version']}, modosítva a Filc csapat által";
} else {
String envAppVer = const String.fromEnvironment(
"APPVER",
defaultValue: "?");
return DefaultTextStyle(
style: Theme.of(context)
.textTheme
.titleMedium!
.copyWith(
fontWeight: FontWeight.w600,
color: AppColors.of(context)
.text
.withOpacity(0.65)),
child: Text("v$envAppVer"),
);
versionText = "reFilc, modosítva a Filc csapat által";
}
return DefaultTextStyle(
style: Theme.of(context)
.textTheme
.titleMedium!
.copyWith(
fontWeight: FontWeight.w600,
color: AppColors.of(context)
.text
.withOpacity(0.65)),
child: Text(versionText),
);
},
),
onTap: () {
@@ -1439,9 +1210,12 @@ class SettingsScreenState extends State<SettingsScreen>
void _openNews(BuildContext context) =>
Navigator.of(context, rootNavigator: true)
.push(CupertinoPageRoute(builder: (context) => const NewsScreen()));
void _openUpdates(BuildContext context) =>
UpdateView.show(updateProvider.releases.first, context: context);
void _openPrivacy(BuildContext context) => PrivacyView.show(context);
// void _openNotes(BuildContext context, Map<String, bool> doneItems) async =>
// Navigator.of(context, rootNavigator: true).push(CupertinoPageRoute(
// builder: (context) => NotesScreen(
@@ -1452,4 +1226,4 @@ class SettingsScreenState extends State<SettingsScreen>
void openSubMenu(BuildContext context, StatefulWidget screen) =>
Navigator.of(context)
.push(CupertinoPageRoute(builder: (context) => screen));
}
}

View File

@@ -51,12 +51,8 @@ extension SettingsLocalization on String {
"Analytics": "Analytics",
"Anonymous Usage Analytics": "Anonymous Usage Analytics",
"graph_class_avg": "Class average on graph",
"goodstudent": "Good student mode",
"attention": "Attention!",
"goodstudent_disclaimer":
"reFilc can not be held liable for the usage of this feature.\n\n(if your mother beats you up because you showed her fake grades, you can only blame yourself for it)",
"understand": "I understand",
"secret": "Secret Settings",
"bell_delay": "Bell Delay",
"delay": "Delay",
"hurry": "Hurry",
@@ -69,7 +65,7 @@ extension SettingsLocalization on String {
"Background Color": "Background Color",
"Highlight Color": "Highlight Color",
"Adaptive Theme": "Adaptive Theme",
"presentation": "Presentation Mode",
"uwufymode": "UwU-fied Mode",
"devmoretaps": "You are %s taps away from Developer Mode.",
"devactivated": "Developer Mode successfully activated.",
@@ -185,12 +181,8 @@ extension SettingsLocalization on String {
"Analytics": "Analitika",
"Anonymous Usage Analytics": "Névtelen használati analitika",
"graph_class_avg": "Osztályátlag a grafikonon",
"goodstudent": "Jó tanuló mód",
"attention": "Figyelem!",
"goodstudent_disclaimer":
"A reFilc minden felelősséget elhárít a funkció használatával kapcsolatban.\n\n(Értsd: ha az anyád megver, mert megtévesztő ábrákat mutattál neki, azért csakis magadat hibáztathatod.)",
"understand": "Értem",
"secret": "Titkos Beállítások",
"bell_delay": "Csengő eltolódása",
"delay": "Késleltetés",
"hurry": "Siettetés",
@@ -203,7 +195,7 @@ extension SettingsLocalization on String {
"Background Color": "Háttér színe",
"Highlight Color": "Panelek színe",
"Adaptive Theme": "Adaptív téma",
"presentation": "Bemutató mód",
"uwufymode": "UwU mód",
"devmoretaps": "Még %s koppintásra vagy a Fejlesztői módtól.",
"devactivated": "Fejlesztői mód sikeresen aktiválva.",
@@ -319,12 +311,8 @@ extension SettingsLocalization on String {
"Analytics": "Analytik",
"Anonymous Usage Analytics": "Anonyme Nutzungsanalyse",
"graph_class_avg": "Klassendurchschnitt in der Grafik",
"goodstudent": "Guter Student Modus",
"attention": "Achtung!",
"goodstudent_disclaimer":
"reFilc kann nicht für die Nutzung dieser Funktion haftbar gemacht werden.\n\n(Wenn deine Mutter dich verprügelt, weil du ihr falsche Noten gezeigt hast, kannst du dir nur die Schuld dafür geben)",
"understand": "Ich verstehe",
"secret": "Geheime Einstellungen",
"bell_delay": "Klingelverzögerung",
"delay": "Verzögern",
"hurry": "Eile",
@@ -337,7 +325,7 @@ extension SettingsLocalization on String {
"Background Color": "Background Color",
"Highlight Color": "Highlight Color",
"Adaptive Theme": "Adaptive Theme",
"presentation": "Präsentationsmodus",
"uwufymode": "UwU-Modus",
"devmoretaps": "Sie sind %s Taps vom Entwicklermodus entfernt.",
"devactivated": "Entwicklermodus erfolgreich aktiviert.",

View File

@@ -1,4 +1,6 @@
// import 'package:refilc/models/settings.dart';
import 'dart:ffi';
import 'package:refilc/api/providers/user_provider.dart';
import 'package:refilc/models/settings.dart';
import 'package:refilc/theme/colors/colors.dart';
@@ -16,6 +18,10 @@ import 'package:refilc_plus/models/premium_scopes.dart';
import 'package:refilc_plus/providers/plus_provider.dart';
import 'package:refilc_plus/ui/mobile/plus/upsell.dart';
import 'package:refilc_plus/ui/mobile/settings/welcome_message.dart';
import 'package:refilc_kreta_api/providers/grade_provider.dart';
import 'package:refilc_mobile_ui/common/action_button.dart';
// import 'package:provider/provider.dart';
import 'submenu_screen.i18n.dart';
@@ -23,7 +29,7 @@ class MenuExtrasSettings extends StatelessWidget {
const MenuExtrasSettings({
super.key,
this.borderRadius = const BorderRadius.vertical(
top: Radius.circular(4.0), bottom: Radius.circular(4.0)),
top: Radius.circular(4.0), bottom: Radius.circular(12.0)),
});
final BorderRadius borderRadius;
@@ -100,9 +106,7 @@ class ExtrasSettingsScreenState extends State<ExtrasSettingsScreen> {
onPressed: () async {
if (!Provider.of<PlusProvider>(context, listen: false)
.hasScope(PremiumScopes.customGradeRarities)) {
return PlusLockedFeaturePopup.show(
context: context,
feature: PremiumFeature.gradeRarities);
return;
}
// settingsProvider.update(
@@ -181,6 +185,146 @@ class ExtrasSettingsScreenState extends State<ExtrasSettingsScreen> {
),
],
),
SplittedPanel(
padding: const EdgeInsets.only(top: 9.0),
cardPadding: const EdgeInsets.all(4.0),
isSeparated: true,
children: [
PanelButton(
padding: const EdgeInsets.only(left: 14.0, right: 6.0),
onPressed: () async {
if (!settingsProvider.goodStudent) {
showDialog(
context: context,
builder: (context) => WillPopScope(
onWillPop: () async => false,
child: AlertDialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0)),
title: Text("attention".i18n),
content: Text("goodstudent_disclaimer".i18n),
actions: [
ActionButton(
label: "understand".i18n,
onTap: () {
Navigator.of(context).pop();
settingsProvider.update(
goodStudent: true);
Provider.of<GradeProvider>(context,
listen: false)
.convertBySettings();
setState(() {});
})
],
),
),
);
} else {
settingsProvider.update(goodStudent: false);
Provider.of<GradeProvider>(context, listen: false)
.convertBySettings();
setState(() {});
}
},
title: Text(
"goodstudent".i18n,
style: TextStyle(
color: AppColors.of(context).text.withValues(
alpha: settingsProvider.goodStudent ? .95 : .25),
),
),
leading: Icon(
FeatherIcons.userCheck,
size: 22.0,
color: AppColors.of(context).text.withValues(
alpha: settingsProvider.goodStudent ? .95 : .25),
),
trailing: Switch(
onChanged: (v) async {
if (v) {
showDialog(
context: context,
builder: (context) => WillPopScope(
onWillPop: () async => false,
child: AlertDialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0)),
title: Text("attention".i18n),
content: Text("goodstudent_disclaimer".i18n),
actions: [
ActionButton(
label: "understand".i18n,
onTap: () {
Navigator.of(context).pop();
settingsProvider.update(
goodStudent: true);
Provider.of<GradeProvider>(context,
listen: false)
.convertBySettings();
setState(() {});
})
],
),
),
);
} else {
settingsProvider.update(goodStudent: false);
Provider.of<GradeProvider>(context, listen: false)
.convertBySettings();
setState(() {});
}
},
value: settingsProvider.goodStudent,
activeColor: Theme.of(context).colorScheme.secondary,
),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(12.0),
bottom: Radius.circular(12.0),
),
),
],
),
SplittedPanel(
padding: const EdgeInsets.only(top: 9.0),
cardPadding: const EdgeInsets.all(4.0),
isSeparated: true,
children: [
PanelButton(
padding: const EdgeInsets.only(left: 14.0, right: 6.0),
onPressed: () async {
settingsProvider.update(
presentationMode: !settingsProvider.presentationMode);
setState(() {});
},
title: Text(
"presentation".i18n,
style: TextStyle(
color: AppColors.of(context).text.withValues(
alpha:
settingsProvider.presentationMode ? .95 : .25),
),
),
leading: Icon(
FeatherIcons.tv,
size: 22.0,
color: AppColors.of(context).text.withValues(
alpha: settingsProvider.presentationMode ? .95 : .25),
),
trailing: Switch(
onChanged: (v) async {
settingsProvider.update(presentationMode: v);
setState(() {});
},
value: settingsProvider.presentationMode,
activeColor: Theme.of(context).colorScheme.secondary,
),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(12.0),
bottom: Radius.circular(12.0),
),
),
],
),
],
),
),

View File

@@ -15,7 +15,7 @@ class MenuGeneralSettings extends StatelessWidget {
const MenuGeneralSettings({
super.key,
this.borderRadius = const BorderRadius.vertical(
top: Radius.circular(4.0), bottom: Radius.circular(4.0)),
top: Radius.circular(12.0), bottom: Radius.circular(4.0)),
});
final BorderRadius borderRadius;

View File

@@ -1065,9 +1065,6 @@ class PersonalizeSettingsScreenState extends State<PersonalizeSettingsScreen>
onPressed: () async {
if (!Provider.of<PlusProvider>(context, listen: false)
.hasScope(PremiumScopes.customFont)) {
PlusLockedFeaturePopup.show(
context: context,
feature: PremiumFeature.fontChange);
return;
}
@@ -1098,9 +1095,6 @@ class PersonalizeSettingsScreenState extends State<PersonalizeSettingsScreen>
if (!Provider.of<PlusProvider>(context,
listen: false)
.hasScope(PremiumScopes.customFont)) {
PlusLockedFeaturePopup.show(
context: context,
feature: PremiumFeature.fontChange);
return;
}

View File

@@ -34,6 +34,11 @@ extension SettingsLocalization on String {
"theme_share_ratelimit": "You can only share 1 theme per minute.",
// cloud sync
"cloud_sync": "Cloud Sync",
"secret": "Secret Settings",
"goodstudent": "Good student mode",
"presentation": "Presentation Mode",
"goodstudent_disclaimer":
"reFilc can not be held liable for the usage of this feature.\n\n(if your mother beats you up because you showed her fake grades, you can only blame yourself for it)",
},
"hu_hu": {
"general": "Általános",
@@ -66,6 +71,11 @@ extension SettingsLocalization on String {
"theme_share_ratelimit": "Csak 1 témát oszthatsz meg percenként.",
// cloud sync
"cloud_sync": "Felhő szinkronizálás",
"secret": "Titkos Beállítások",
"goodstudent": "Jó tanuló mód",
"presentation": "Bemutató mód",
"goodstudent_disclaimer":
"A reFilc minden felelősséget elhárít a funkció használatával kapcsolatban.\n\n(Értsd: ha az anyád megver, mert megtévesztő ábrákat mutattál neki, azért csakis magadat hibáztathatod.)",
},
"de_de": {
"general": "Allgemeine",
@@ -99,6 +109,11 @@ extension SettingsLocalization on String {
"theme_share_ratelimit": "Sie können nur 1 Thema pro Minute teilen.",
// cloud sync
"cloud_sync": "Cloud-Synchronisierung",
"secret": "Geheime Einstellungen",
"presentation": "Präsentationsmodus",
"goodstudent": "Guter Student Modus",
"goodstudent_disclaimer":
"reFilc kann nicht für die Nutzung dieser Funktion haftbar gemacht werden.\n\n(Wenn deine Mutter dich verprügelt, weil du ihr falsche Noten gezeigt hast, kannst du dir nur die Schuld dafür geben)",
},
};