Compare commits
No commits in common. "master" and "5.0.4-pre" have entirely different histories.
9
.gitignore
vendored
@ -12,10 +12,10 @@ refilc/build/
|
||||
refilc/android/key.properties
|
||||
refilc/android/debug.keystore
|
||||
|
||||
# refilc_desktop_ui/.flutter-plugins
|
||||
# refilc_desktop_ui/.flutter-plugins-dependencies
|
||||
# refilc_desktop_ui/pubspec.lock
|
||||
# refilc_desktop_ui/.dart_tool/
|
||||
refilc_desktop_ui/.flutter-plugins
|
||||
refilc_desktop_ui/.flutter-plugins-dependencies
|
||||
refilc_desktop_ui/pubspec.lock
|
||||
refilc_desktop_ui/.dart_tool/
|
||||
|
||||
refilc_kreta_api/.flutter-plugins
|
||||
refilc_kreta_api/.flutter-plugins-dependencies
|
||||
@ -37,7 +37,6 @@ refilc_mobile_ui/.dart_tool/
|
||||
.idea
|
||||
.gitmodules
|
||||
.gradle
|
||||
.kotlin
|
||||
|
||||
refilc/.DS_Store
|
||||
.DS_Store
|
||||
|
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[submodule "naplo-plus"]
|
||||
path = refilc_plus
|
||||
url = git@github.com:refilc/naplo-plus.git
|
1286
.idea/libraries/Dart_Packages.xml
generated
Normal file
41
.idea/libraries/Dart_SDK.xml
generated
@ -1,28 +1,25 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Dart SDK">
|
||||
<CLASSES>
|
||||
<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" />
|
||||
<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" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
|
1
.idea/misc.xml
generated
@ -1,3 +1,4 @@
|
||||
<?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
@ -60,21 +60,8 @@
|
||||
<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
@ -2,6 +2,9 @@
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
<mapping directory="$PROJECT_DIR$/refilc_plus" 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" />
|
||||
</component>
|
||||
</project>
|
56
Jenkinsfile
vendored
Normal file
@ -0,0 +1,56 @@
|
||||
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()
|
||||
}
|
||||
}
|
||||
}
|
47
README.md
@ -1,43 +1,34 @@
|
||||
<p align=center>
|
||||
<img src="https://raw.githubusercontent.com/Laky2k8/Refilc-2-Episode-1/refs/heads/master/refilc-2-real.png" width=150>
|
||||
<img src="https://refilc.hu/image/brand/logo.png" width=150>
|
||||
<h1 align=center><b>reFilc</b></h1>
|
||||
</p>
|
||||
|
||||
#### Nem hivatalos e-napló alkalmazás az e-KRÉTA rendszerhez - tanulóktól, tanulóknak.
|
||||
|
||||
[](https://github.com/refilc/naplo/releases) [](https://discord.gg/refilc-1111649116020285532)
|
||||
[](https://github.com/refilc/naplo/releases) [](https://dc.refilc.hu)
|
||||
|
||||
## Környezet felállítása
|
||||
## Setup
|
||||
|
||||
### Source code letöltése
|
||||
### Clone the project
|
||||
|
||||
*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)*
|
||||
<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>
|
||||
|
||||
```sh
|
||||
git clone https://git.qwit.cloud/refilc/student-legacy.git --recursive
|
||||
git clone --branch dev https://github.com/refilc/naplo --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
|
||||
git clone https://git.qwit.cloud/refilc/student-plus.git refilc_plus
|
||||
```
|
||||
|
||||
### Csomagok telepítése
|
||||
### Install packages
|
||||
|
||||
Menj be minden mappába és futtasd a következő parancsokat:
|
||||
```sh
|
||||
flutter clean
|
||||
flutter pub get
|
||||
```
|
||||
Run `fix-pub.sh`
|
||||
|
||||
### Alkalmazás építése
|
||||
### Run the app
|
||||
|
||||
```sh
|
||||
cd refilc
|
||||
flutter build apk --release
|
||||
flutter run (--release)
|
||||
```
|
||||
|
||||
*Ez egy apk fájlt fog építeni*
|
||||
|
||||
### Contribution
|
||||
|
||||
**Nézd meg a [Contribution guide](CONTRIBUTING.md)-ot!**
|
||||
@ -46,22 +37,16 @@ Az összes (ugyan azon verzióhoz tartozó) contribution meg fog jelenni a relea
|
||||
|
||||
-------
|
||||
|
||||
# Csapatunk
|
||||
# Team
|
||||
|
||||
**Management**
|
||||
- Zypherift
|
||||
- hayn
|
||||
- Pearoo
|
||||
- Zizi
|
||||
- mnus
|
||||
- xou
|
||||
**kima:** head developer / project manager
|
||||
|
||||
**Designerek**
|
||||
- dwe
|
||||
- xou
|
||||
**Reiner, pdf, Pearoo, Zizi:** community- and project manager / developer
|
||||
|
||||
**vrolandd, TMarccci:** head developer
|
||||
|
||||
**dwe., xou:** designer
|
||||
|
||||
**Péter:** video editor
|
||||
|
||||
***annon:** a régi Filc Napló fejlesztője (ez az app, ha bár sokban változott, alapjaiban a Filc-re épül)*
|
||||
<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>
|
||||
|
@ -1,7 +0,0 @@
|
||||
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.
|
@ -1,7 +0,0 @@
|
||||
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
@ -5,11 +5,9 @@
|
||||
*.swp
|
||||
.DS_Store
|
||||
.atom/
|
||||
.build/
|
||||
.buildlog/
|
||||
.history
|
||||
.svn/
|
||||
.swiftpm/
|
||||
migrate_working_dir/
|
||||
|
||||
# IntelliJ related
|
||||
|
1
refilc/android/app/.gitignore
vendored
@ -1 +0,0 @@
|
||||
*.jks
|
@ -39,23 +39,8 @@ def debugKeystoreProperties = new Properties()
|
||||
def debugKeystorePropertiesFile = rootProject.file("debugkey.properties")
|
||||
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 {
|
||||
namespace = "hu.refilc.naplo"
|
||||
|
||||
ndkVersion "27.2.12479018"
|
||||
ndkVersion "25.1.8937393"
|
||||
|
||||
// compileSdkVersion rootProject.ext.compileSdkVersion
|
||||
compileSdkVersion 34
|
||||
@ -82,19 +67,11 @@ android {
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
// Flag to enable support for the new language APIs
|
||||
coreLibraryDesugaringEnabled true
|
||||
// Sets Java compatibility to Java 8
|
||||
// sourceCompatibility 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
|
||||
// Flag to enable support for the new language APIs
|
||||
coreLibraryDesugaringEnabled true
|
||||
// Sets Java compatibility to Java 8
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
signingConfigs {
|
||||
@ -120,13 +97,7 @@ android {
|
||||
|
||||
release {
|
||||
signingConfig signingConfigs.release
|
||||
shrinkResources true
|
||||
minifyEnabled true
|
||||
debuggable false
|
||||
jniDebuggable false
|
||||
renderscriptDebuggable false
|
||||
pseudoLocalesEnabled false
|
||||
zipAlignEnabled true
|
||||
shrinkResources false
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
@ -146,7 +117,7 @@ dependencies {
|
||||
implementation 'joda-time:joda-time:2.9.4'
|
||||
androidTestImplementation 'androidx.test:runner:1.1.1'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
|
||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
|
||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
|
||||
implementation 'androidx.window:window:1.0.0'
|
||||
implementation 'androidx.window:window-java:1.0.0'
|
||||
}
|
||||
|
5
refilc/android/app/proguard-rules.pro
vendored
@ -9,8 +9,3 @@
|
||||
-dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter$Error
|
||||
-dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter
|
||||
-dontwarn com.stripe.android.pushProvisioning.PushProvisioningEphemeralKeyProvider
|
||||
|
||||
-dontwarn org.joda.convert.FromString
|
||||
-dontwarn org.joda.convert.ToString
|
||||
|
||||
#-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
|
@ -2,6 +2,9 @@
|
||||
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"
|
||||
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"
|
||||
android:launchMode="singleTop" android:theme="@style/LaunchTheme"
|
||||
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 114 KiB |
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 190 KiB |
Before Width: | Height: | Size: 69 B After Width: | Height: | Size: 69 B |
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 114 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 114 KiB |
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 190 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 190 KiB |
Before Width: | Height: | Size: 69 B After Width: | Height: | Size: 69 B |
@ -1,9 +1,5 @@
|
||||
<?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>
|
||||
<inset
|
||||
android:drawable="@drawable/ic_launcher_foreground"
|
||||
android:inset="16%" />
|
||||
</foreground>
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
|
||||
</adaptive-icon>
|
||||
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 642 B |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 3.6 KiB |
@ -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">#7CA021</item>
|
||||
<item name="android:windowSplashScreenBackground">#03112D</item>
|
||||
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
|
||||
</style>
|
||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||
|
@ -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">#7CA021</item>
|
||||
<item name="android:windowSplashScreenBackground">#03112D</item>
|
||||
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
|
||||
</style>
|
||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="ic_launcher_background">#7CA021</color>
|
||||
<color name="ic_launcher_background">#03112D</color>
|
||||
|
||||
<color name="purple_200">#FFBB86FC</color>
|
||||
<color name="purple_500">#FF6200EE</color>
|
||||
|
@ -1,4 +1,8 @@
|
||||
org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError
|
||||
org.gradle.jvmargs=-Xmx1536M \
|
||||
--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.enableJetifier=true
|
||||
# kotlin.jvm.target.validation.mode=IGNORE
|
@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
|
||||
distributionUrl=https://services.gradle.org/distributions/gradle-7.3.3-all.zip
|
||||
|
@ -24,8 +24,8 @@ pluginManagement {
|
||||
|
||||
plugins {
|
||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
||||
id "com.android.application" version "8.7.3" apply false
|
||||
id "org.jetbrains.kotlin.android" version "2.0.21" apply false
|
||||
id "com.android.application" version "7.1.1" apply false
|
||||
id "org.jetbrains.kotlin.android" version "1.8.21" apply false
|
||||
}
|
||||
|
||||
include ":app"
|
||||
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 21 KiB |
2
refilc/build.sh
Executable file → Normal file
@ -1,3 +1,3 @@
|
||||
#!/bin/sh
|
||||
|
||||
flutter build apk --release --tree-shake-icons --split-debug-info=debug-info --split-per-abi --target-platform android-arm,android-arm64 --obfuscate
|
||||
flutter build apk --release --dart-define=APPVER=$(cat pubspec.yaml | grep version: | cut -d' ' -f2 | cut -d+ -f1) --no-tree-shake-icons
|
||||
|
@ -43,21 +43,4 @@ post_install do |installer|
|
||||
config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
|
||||
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
|
||||
|
@ -517,11 +517,9 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||
CURRENT_PROJECT_VERSION = 283;
|
||||
DEVELOPMENT_TEAM = 4J97JVC2FG;
|
||||
CURRENT_PROJECT_VERSION = 257;
|
||||
DEVELOPMENT_TEAM = 4DKAF249F3;
|
||||
ENABLE_BITCODE = NO;
|
||||
FLUTTER_BUILD_NAME = 5.1.1;
|
||||
FLUTTER_BUILD_NUMBER = 283;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = reFilc;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education";
|
||||
@ -529,8 +527,8 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 5.1.1;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = hu.qwit.refilc;
|
||||
MARKETING_VERSION = 5.0.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.refilc2.naplo;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
@ -551,8 +549,8 @@
|
||||
CODE_SIGN_ENTITLEMENTS = livecard/livecard.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 283;
|
||||
DEVELOPMENT_TEAM = 4J97JVC2FG;
|
||||
CURRENT_PROJECT_VERSION = 257;
|
||||
DEVELOPMENT_TEAM = 4DKAF249F3;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = livecard/Info.plist;
|
||||
@ -565,10 +563,10 @@
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 5.1.1;
|
||||
MARKETING_VERSION = 5.0.0;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = hu.qwit.refilc.livecard;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.refilc2.naplo.livecardpro;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
@ -593,8 +591,8 @@
|
||||
CODE_SIGN_ENTITLEMENTS = livecard/livecard.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 283;
|
||||
DEVELOPMENT_TEAM = 4J97JVC2FG;
|
||||
CURRENT_PROJECT_VERSION = 257;
|
||||
DEVELOPMENT_TEAM = 4DKAF249F3;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = livecard/Info.plist;
|
||||
@ -607,9 +605,9 @@
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 5.1.1;
|
||||
MARKETING_VERSION = 5.0.0;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = hu.qwit.refilc.livecard;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.refilc2.naplo.livecardpro;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
@ -633,8 +631,8 @@
|
||||
CODE_SIGN_ENTITLEMENTS = livecard/livecard.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 283;
|
||||
DEVELOPMENT_TEAM = 4J97JVC2FG;
|
||||
CURRENT_PROJECT_VERSION = 257;
|
||||
DEVELOPMENT_TEAM = 4DKAF249F3;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = livecard/Info.plist;
|
||||
@ -647,9 +645,9 @@
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 5.1.1;
|
||||
MARKETING_VERSION = 5.0.0;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = hu.qwit.refilc.livecard;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.refilc2.naplo.livecardpro;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
@ -777,11 +775,9 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||
CURRENT_PROJECT_VERSION = 283;
|
||||
DEVELOPMENT_TEAM = 4J97JVC2FG;
|
||||
CURRENT_PROJECT_VERSION = 257;
|
||||
DEVELOPMENT_TEAM = 4DKAF249F3;
|
||||
ENABLE_BITCODE = NO;
|
||||
FLUTTER_BUILD_NAME = 5.1.1;
|
||||
FLUTTER_BUILD_NUMBER = 283;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = reFilc;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education";
|
||||
@ -789,8 +785,8 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 5.1.1;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = hu.qwit.refilc;
|
||||
MARKETING_VERSION = 5.0.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.refilc2.naplo;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
@ -807,11 +803,9 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||
CURRENT_PROJECT_VERSION = 283;
|
||||
DEVELOPMENT_TEAM = 4J97JVC2FG;
|
||||
CURRENT_PROJECT_VERSION = 257;
|
||||
DEVELOPMENT_TEAM = 4DKAF249F3;
|
||||
ENABLE_BITCODE = NO;
|
||||
FLUTTER_BUILD_NAME = 5.1.1;
|
||||
FLUTTER_BUILD_NUMBER = 283;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = reFilc;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education";
|
||||
@ -819,8 +813,8 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 5.1.1;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = hu.qwit.refilc;
|
||||
MARKETING_VERSION = 5.0.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.refilc2.naplo;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
|
@ -12,7 +12,7 @@
|
||||
<key>livecard.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>86</integer>
|
||||
<integer>83</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
|
@ -3,7 +3,7 @@ import background_fetch
|
||||
import ActivityKit
|
||||
import Flutter
|
||||
|
||||
@main
|
||||
@UIApplicationMain
|
||||
@objc class AppDelegate: FlutterAppDelegate {
|
||||
private var methodChannel: FlutterMethodChannel?
|
||||
|
||||
|
Before Width: | Height: | Size: 69 B After Width: | Height: | Size: 69 B |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 114 KiB |
@ -38,7 +38,7 @@
|
||||
</scene>
|
||||
</scenes>
|
||||
<resources>
|
||||
<image name="LaunchImage" width="2700" height="2700"/>
|
||||
<image name="LaunchImage" width="1700" height="1700"/>
|
||||
<image name="LaunchBackground" width="1" height="1"/>
|
||||
</resources>
|
||||
</document>
|
||||
|
@ -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>BGTaskSchedulerPermittedIdentifiers</key>
|
||||
<array>
|
||||
<string>com.transistorsoft.refilcnotification</string>
|
||||
<string>com.transistorsoft.refilcliveactivity</string>
|
||||
</array>
|
||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||
<true/>
|
||||
<key>CFBundleAlternateIcons</key>
|
||||
<key>refilc_concept</key>
|
||||
<dict>
|
||||
<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>
|
||||
<key>CFBundleIconFiles</key>
|
||||
<array>
|
||||
<string>refilc_concept</string>
|
||||
</array>
|
||||
<key>UIPrerenderedIcon</key>
|
||||
<false/>
|
||||
</dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIcons</key>
|
||||
<key>refilc_default</key>
|
||||
<dict>
|
||||
<key>CFBundlePrimaryIcon</key>
|
||||
<dict>
|
||||
<key>CFBundleIconFiles</key>
|
||||
<array>
|
||||
<string></string>
|
||||
</array>
|
||||
<key>CFBundleIconName</key>
|
||||
<string></string>
|
||||
<key>UIPrerenderedIcon</key>
|
||||
<false/>
|
||||
</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>
|
||||
<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>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>
|
||||
</array>
|
||||
<key>CFBundleIconName</key>
|
||||
<string></string>
|
||||
<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>
|
||||
</plist>
|
||||
|
@ -1,44 +1,40 @@
|
||||
import Foundation
|
||||
import ActivityKit
|
||||
|
||||
public struct LessonData {
|
||||
var color: String
|
||||
var icon: String
|
||||
var index: String
|
||||
var title: String
|
||||
var subtitle: String
|
||||
var description: String
|
||||
var startDate: Date
|
||||
var endDate: Date
|
||||
var date: ClosedRange<Date>
|
||||
var nextSubject: String
|
||||
var nextRoom: String
|
||||
var color: String
|
||||
var icon: String
|
||||
var index: String
|
||||
var title: String
|
||||
var subtitle: String
|
||||
var description: String
|
||||
var startDate: Date
|
||||
var endDate: Date
|
||||
var date: ClosedRange<Date>
|
||||
var nextSubject: String
|
||||
var nextRoom: String
|
||||
|
||||
init(from dictionary: [String: Any]) {
|
||||
self.color = dictionary["color"] as? String ?? ""
|
||||
self.icon = dictionary["icon"] as? String ?? ""
|
||||
self.index = dictionary["index"] as? String ?? ""
|
||||
self.title = dictionary["title"] as? String ?? ""
|
||||
self.subtitle = dictionary["subtitle"] as? String ?? ""
|
||||
self.description = dictionary["description"] as? String ?? ""
|
||||
self.nextSubject = dictionary["nextSubject"] as? String ?? ""
|
||||
self.nextRoom = dictionary["nextRoom"] as? String ?? ""
|
||||
init(from dictionary: [String: Any]) {
|
||||
self.color = dictionary["color"] as? String ?? ""
|
||||
self.icon = dictionary["icon"] as? String ?? ""
|
||||
self.index = dictionary["index"] as? String ?? ""
|
||||
self.title = dictionary["title"] as? String ?? ""
|
||||
self.subtitle = dictionary["subtitle"] as? String ?? ""
|
||||
self.description = dictionary["description"] as? String ?? ""
|
||||
self.nextSubject = dictionary["nextSubject"] as? String ?? ""
|
||||
self.nextRoom = dictionary["nextRoom"] as? String ?? ""
|
||||
|
||||
if let startDateStr = dictionary["startDate"] as? String, let startDateInt = Int(startDateStr) {
|
||||
self.startDate = Date(timeIntervalSince1970: TimeInterval(startDateInt) / 1000)
|
||||
} else {
|
||||
self.startDate = Date()
|
||||
if let startDateStr = dictionary["startDate"] as? String, let startDateInt = Int(startDateStr) {
|
||||
self.startDate = Date(timeIntervalSince1970: TimeInterval(startDateInt) / 1000)
|
||||
} else {
|
||||
self.startDate = Date()
|
||||
}
|
||||
|
||||
if let endDateStr = dictionary["endDate"] as? String, let endDateInt = Int(endDateStr) {
|
||||
self.endDate = Date(timeIntervalSince1970: TimeInterval(endDateInt) / 1000)
|
||||
} else {
|
||||
self.endDate = Date()
|
||||
}
|
||||
date = self.startDate...self.endDate
|
||||
}
|
||||
|
||||
if let endDateStr = dictionary["endDate"] as? String, let endDateInt = Int(endDateStr) {
|
||||
self.endDate = Date(timeIntervalSince1970: TimeInterval(endDateInt) / 1000)
|
||||
} else {
|
||||
self.endDate = self.startDate
|
||||
}
|
||||
|
||||
if self.startDate <= self.endDate {
|
||||
self.date = self.startDate...self.endDate
|
||||
} else {
|
||||
self.date = self.endDate...self.endDate
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -11,17 +11,6 @@ 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
|
||||
extension Color {
|
||||
init(hex: String, alpha: Double = 1.0) {
|
||||
@ -73,12 +62,21 @@ struct LockScreenLiveActivityView: View {
|
||||
.font(.body)
|
||||
.bold()
|
||||
.padding(.trailing, 90)
|
||||
|
||||
} else {
|
||||
MultilineTextView(text: "\(context.state.index) \(context.state.title) - \(context.state.subtitle)", limit: 25)
|
||||
MultilineTextView(text: "\(context.state.index) \(context.state.title)", limit: 25)
|
||||
.font(.body)
|
||||
.bold()
|
||||
.multilineTextAlignment(.center)
|
||||
}
|
||||
|
||||
//Terem
|
||||
if (!context.state.subtitle.isEmpty) {
|
||||
Text(context.state.subtitle)
|
||||
.italic()
|
||||
.bold()
|
||||
.font(.system(size: 13))
|
||||
}
|
||||
}
|
||||
|
||||
// Leírás
|
||||
@ -94,9 +92,10 @@ struct LockScreenLiveActivityView: View {
|
||||
.resizable()
|
||||
.aspectRatio(contentMode: .fit)
|
||||
.frame(width: CGFloat(8), height: CGFloat(8))
|
||||
.foregroundStyle(.secondary)
|
||||
Text("\(context.state.nextSubject) - \(context.state.nextRoom)")
|
||||
Text(context.state.nextSubject)
|
||||
.font(.caption)
|
||||
Text(context.state.nextRoom)
|
||||
.font(.caption2)
|
||||
}
|
||||
.multilineTextAlignment(.center)
|
||||
} else {
|
||||
@ -118,15 +117,11 @@ struct LockScreenLiveActivityView: View {
|
||||
.monospacedDigit()
|
||||
.padding(.trailing)
|
||||
}
|
||||
// .activityBackgroundTint(
|
||||
// context.state.color != "#676767"
|
||||
// ? Color(hex: context.state.color)
|
||||
// : Color.clear
|
||||
// )
|
||||
.activityBackgroundTint(
|
||||
Color.clear
|
||||
context.state.color != "#676767"
|
||||
? Color(hex: context.state.color)
|
||||
: Color.clear
|
||||
)
|
||||
.foregroundStyle(Color(hex: context.state.color))
|
||||
}
|
||||
}
|
||||
|
||||
@ -202,23 +197,33 @@ struct LiveCardWidget: Widget {
|
||||
|
||||
} else {
|
||||
// Amikor óra van, expanded DynamicIsland
|
||||
MultilineTextView(text: "\(context.state.index) \(context.state.title) - \(context.state.subtitle)", limit: 25)
|
||||
MultilineTextView(text: "\(context.state.index) \(context.state.title)", limit: 25)
|
||||
.lineLimit(1)
|
||||
.font(.body)
|
||||
.bold()
|
||||
.padding(.trailing, -35)
|
||||
|
||||
Spacer(minLength: 2)
|
||||
Text(context.state.subtitle)
|
||||
.lineLimit(1)
|
||||
.italic()
|
||||
.bold()
|
||||
.font(.system(size: 13))
|
||||
.padding(.trailing, -50)
|
||||
|
||||
Spacer(minLength: 5)
|
||||
|
||||
if(context.state.nextRoom != "" && context.state.nextSubject != "") {
|
||||
Text("Következő óra és terem:")
|
||||
.font(.system(size: 14))
|
||||
.padding(.trailing, -45)
|
||||
.padding(.trailing, -35)
|
||||
Spacer(minLength: 2)
|
||||
|
||||
Text("\(context.state.nextSubject) - \(context.state.nextRoom)")
|
||||
.modifier(DynamicFontSizeModifier(text: "\(context.state.nextSubject) - \(context.state.nextRoom)"))
|
||||
.padding(.trailing, 35)
|
||||
Text(context.state.nextSubject)
|
||||
.modifier(DynamicFontSizeModifier(text: context.state.nextSubject))
|
||||
.padding(.trailing, -35)
|
||||
Text(context.state.nextRoom)
|
||||
// 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 {
|
||||
Text("Ez az utolsó óra! Kitartást!")
|
||||
.font(.system(size: 14))
|
||||
@ -322,66 +327,3 @@ 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")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -18,51 +18,45 @@ import 'package:connectivity_plus/connectivity_plus.dart';
|
||||
|
||||
class FilcAPI {
|
||||
// API base
|
||||
static const baseUrl = "https://api.refilcapp.hu";
|
||||
static const baseUrl = "https://api.refilc.hu";
|
||||
|
||||
// Public API
|
||||
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";
|
||||
static const schoolList = "$baseUrl/v3/public/school-list";
|
||||
static const news = "$baseUrl/v3/public/news";
|
||||
static const supporters = "$baseUrl/v3/public/supporters";
|
||||
|
||||
// Private API
|
||||
static const ads = "0.0.0.0";
|
||||
static const ads = "$baseUrl/v3/private/ads";
|
||||
static const config = "$baseUrl/v3/private/config";
|
||||
static const reportApi = "$baseUrl/v3/private/crash-report";
|
||||
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/";
|
||||
static const rfPlus = "$baseUrl/v3/rf-plus";
|
||||
static const plusAuthLogin = "$rfPlus/auth/login";
|
||||
static const plusAuthCallback = "$rfPlus/auth/callback";
|
||||
static const plusActivation = "$rfPlus/activate";
|
||||
static const plusScopes = "$rfPlus/scopes";
|
||||
|
||||
// Updates
|
||||
static const repo = "refilc/naplo";
|
||||
static const releases = "https://api.github.com/repos/$repo/releases";
|
||||
|
||||
// Share API
|
||||
static const themeShare = "https://api.refilcapp.hu/v3/shared/theme/add";
|
||||
static const themeGet = "https://api.refilcapp.hu/v3/shared/theme/get";
|
||||
static const themeShare = "$baseUrl/v3/shared/theme/add";
|
||||
static const themeGet = "$baseUrl/v3/shared/theme/get";
|
||||
static const allThemes = "$themeGet/all";
|
||||
static const themeByID = "$themeGet/";
|
||||
|
||||
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 gradeColorsShare = "$baseUrl/v3/shared/grade-colors/add";
|
||||
static const gradeColorsGet = "$baseUrl/v3/shared/grade-colors/get";
|
||||
static const allGradeColors = "$gradeColorsGet/all";
|
||||
static const gradeColorsByID = "$gradeColorsGet/";
|
||||
|
||||
// Payment API
|
||||
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";
|
||||
static const payment = "$baseUrl/v3/payment";
|
||||
static const stripeSheet = "$payment/stripe-sheet";
|
||||
|
||||
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));
|
||||
@ -72,6 +66,16 @@ 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}";
|
||||
@ -89,12 +93,10 @@ class FilcAPI {
|
||||
"x-filc-id": settings.xFilcId,
|
||||
"user-agent": userAgent,
|
||||
// platform things
|
||||
"rf-platform":
|
||||
settings.analyticsEnabled ? Platform.operatingSystem : "unknown",
|
||||
"rf-platform-version": settings.analyticsEnabled
|
||||
? Platform.operatingSystemVersion
|
||||
: "unknown",
|
||||
"rf-app-version": const String.fromEnvironment("APPVER", defaultValue: "?"),
|
||||
"rf-platform": Platform.operatingSystem,
|
||||
"rf-platform-version": Platform.operatingSystemVersion,
|
||||
"rf-app-version":
|
||||
const String.fromEnvironment("APPVER", defaultValue: "?"),
|
||||
"rf-uinid": settings.xFilcId,
|
||||
};
|
||||
|
||||
@ -125,8 +127,7 @@ class FilcAPI {
|
||||
http.Response res = await http.get(Uri.parse(news));
|
||||
|
||||
if (res.statusCode == 200) {
|
||||
String utf8Body = utf8.decode(res.bodyBytes);
|
||||
return (jsonDecode(utf8Body) as List)
|
||||
return (jsonDecode(res.body) as List)
|
||||
.cast<Map>()
|
||||
.map((e) => News.fromJson(e))
|
||||
.toList();
|
||||
@ -230,7 +231,7 @@ class FilcAPI {
|
||||
}
|
||||
|
||||
// sharing
|
||||
static Future<int> addSharedTheme(SharedTheme theme) async {
|
||||
static Future<void> addSharedTheme(SharedTheme theme) async {
|
||||
try {
|
||||
theme.json.remove('json');
|
||||
theme.json['is_public'] = theme.isPublic.toString();
|
||||
@ -262,19 +263,13 @@ class FilcAPI {
|
||||
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
|
||||
);
|
||||
|
||||
// if (res.statusCode != 201) {
|
||||
// throw "HTTP ${res.statusCode}: ${res.body}";
|
||||
// }
|
||||
|
||||
if (res.statusCode == 201) {
|
||||
log('Shared theme successfully with ID: ${theme.id}');
|
||||
if (res.statusCode != 201) {
|
||||
throw "HTTP ${res.statusCode}: ${res.body}";
|
||||
}
|
||||
|
||||
return res.statusCode;
|
||||
log('Shared theme successfully with ID: ${theme.id}');
|
||||
} on Exception catch (error, stacktrace) {
|
||||
log("ERROR: FilcAPI.addSharedTheme: $error $stacktrace");
|
||||
|
||||
return 696;
|
||||
}
|
||||
}
|
||||
|
||||
@ -308,7 +303,8 @@ class FilcAPI {
|
||||
return null;
|
||||
}
|
||||
|
||||
static Future<int> addSharedGradeColors(SharedGradeColors gradeColors) async {
|
||||
static Future<void> addSharedGradeColors(
|
||||
SharedGradeColors gradeColors) async {
|
||||
try {
|
||||
gradeColors.json.remove('json');
|
||||
gradeColors.json['is_public'] = gradeColors.isPublic.toString();
|
||||
@ -324,19 +320,13 @@ class FilcAPI {
|
||||
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
|
||||
);
|
||||
|
||||
// if (res.statusCode != 201) {
|
||||
// throw "HTTP ${res.statusCode}: ${res.body}";
|
||||
// }
|
||||
|
||||
if (res.statusCode == 201) {
|
||||
log('Shared grade colors successfully with ID: ${gradeColors.id}');
|
||||
if (res.statusCode != 201) {
|
||||
throw "HTTP ${res.statusCode}: ${res.body}";
|
||||
}
|
||||
|
||||
return res.statusCode;
|
||||
log('Shared grade colors successfully with ID: ${gradeColors.id}');
|
||||
} on Exception catch (error, stacktrace) {
|
||||
log("ERROR: FilcAPI.addSharedGradeColors: $error $stacktrace");
|
||||
|
||||
return 696;
|
||||
}
|
||||
}
|
||||
|
||||
@ -385,11 +375,6 @@ class FilcAPI {
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// cloud sync
|
||||
static Future<Map?> cloudSync(Map<String, String> data, String token) async {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
class ErrorReport {
|
||||
|
@ -65,11 +65,8 @@ Future loginAPI({
|
||||
parents: ['Teszt András', 'Teszt Linda'],
|
||||
json: {"a": "b"},
|
||||
address: '1117 Budapest, Gábor Dénes utca 4.',
|
||||
gradeDelay: 0,
|
||||
),
|
||||
role: Role.parent,
|
||||
accessToken: '',
|
||||
accessTokenExpire: DateTime.now(),
|
||||
refreshToken: '',
|
||||
);
|
||||
|
||||
@ -156,8 +153,6 @@ Future loginAPI({
|
||||
name: student.name,
|
||||
student: student,
|
||||
role: JwtUtils.getRoleFromJWT(res["access_token"])!,
|
||||
accessToken: res["access_token"],
|
||||
accessTokenExpire: DateTime.now(),
|
||||
refreshToken: '',
|
||||
);
|
||||
|
||||
@ -239,15 +234,6 @@ Future newLoginAPI({
|
||||
if (res != null) {
|
||||
if (kDebugMode) {
|
||||
print(res);
|
||||
|
||||
// const splitSize = 1000;
|
||||
// RegExp exp = RegExp(r"\w{" "$splitSize" "}");
|
||||
// // String str = "0102031522";
|
||||
// Iterable<Match> matches = exp.allMatches(res.toString());
|
||||
// var list = matches.map((m) => m.group(0));
|
||||
// list.forEach((e) {
|
||||
// print(e);
|
||||
// });
|
||||
}
|
||||
|
||||
if (res.containsKey("error")) {
|
||||
@ -280,9 +266,6 @@ Future newLoginAPI({
|
||||
name: student.name,
|
||||
student: student,
|
||||
role: role,
|
||||
accessToken: res["access_token"],
|
||||
accessTokenExpire:
|
||||
DateTime.now().add(Duration(seconds: (res["expires_in"] - 30))),
|
||||
refreshToken: res["refresh_token"],
|
||||
);
|
||||
|
||||
|
@ -18,7 +18,7 @@ class AdProvider extends ChangeNotifier {
|
||||
}
|
||||
|
||||
Future<void> fetch() async {
|
||||
_ads = [];
|
||||
_ads = await FilcAPI.getAds() ?? [];
|
||||
_ads.sort((a, b) => -a.date.compareTo(b.date));
|
||||
|
||||
// check for new ads
|
||||
|
@ -1,3 +1,5 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:refilc/database/query.dart';
|
||||
import 'package:refilc/database/store.dart';
|
||||
// ignore: depend_on_referenced_packages
|
||||
@ -13,7 +15,11 @@ class DatabaseProvider {
|
||||
Future<void> init() async {
|
||||
Database db;
|
||||
|
||||
db = await openDatabase("app.db");
|
||||
if (Platform.isLinux || Platform.isWindows) {
|
||||
db = await databaseFactoryFfi.openDatabase("app.db");
|
||||
} else {
|
||||
db = await openDatabase("app.db");
|
||||
}
|
||||
|
||||
query = DatabaseQuery(db: db);
|
||||
store = DatabaseStore(db: db);
|
||||
|
@ -5,7 +5,6 @@ import 'dart:async';
|
||||
import 'package:refilc/api/providers/liveactivity/platform_channel.dart';
|
||||
import 'package:refilc/helpers/subject.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/week.dart';
|
||||
import 'package:refilc/utils/format.dart';
|
||||
@ -85,14 +84,11 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
}
|
||||
|
||||
Map<String, String> toMap() {
|
||||
// print("LIVE ACTIVITY COLOR BELOW:");
|
||||
// print(_settings.liveActivityColor.toHexString().substring(2));
|
||||
String color = '#${_settings.liveActivityColor.toHexString().substring(2)}';
|
||||
|
||||
switch (currentState) {
|
||||
case LiveCardState.morning:
|
||||
return {
|
||||
"color": color,
|
||||
"color":
|
||||
'#${_settings.liveActivityColor.toString().substring(10, 16)}',
|
||||
"icon": nextLesson != null
|
||||
? SubjectIcon.resolveName(subject: nextLesson?.subject)
|
||||
: "book",
|
||||
@ -101,22 +97,23 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
"description": "",
|
||||
"startDate": storeFirstRunDate != null
|
||||
? ((storeFirstRunDate?.millisecondsSinceEpoch ?? 0) -
|
||||
(_delay.inMilliseconds))
|
||||
.toString()
|
||||
(_delay.inMilliseconds))
|
||||
.toString()
|
||||
: "",
|
||||
"endDate": ((nextLesson?.start.millisecondsSinceEpoch ?? 0) -
|
||||
_delay.inMilliseconds)
|
||||
_delay.inMilliseconds)
|
||||
.toString(),
|
||||
"nextSubject": nextLesson != null
|
||||
? nextLesson?.subject.renamedTo ??
|
||||
ShortSubject.resolve(subject: nextLesson?.subject).capital()
|
||||
ShortSubject.resolve(subject: nextLesson?.subject).capital()
|
||||
: "",
|
||||
"nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "",
|
||||
};
|
||||
|
||||
case LiveCardState.afternoon:
|
||||
return {
|
||||
"color": color,
|
||||
"color":
|
||||
'#${_settings.liveActivityColor.toString().substring(10, 16)}',
|
||||
"icon": nextLesson != null
|
||||
? SubjectIcon.resolveName(subject: nextLesson?.subject)
|
||||
: "book",
|
||||
@ -125,22 +122,23 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
"description": "",
|
||||
"startDate": storeFirstRunDate != null
|
||||
? ((storeFirstRunDate?.millisecondsSinceEpoch ?? 0) -
|
||||
(_delay.inMilliseconds))
|
||||
.toString()
|
||||
(_delay.inMilliseconds))
|
||||
.toString()
|
||||
: "",
|
||||
"endDate": ((nextLesson?.start.millisecondsSinceEpoch ?? 0) -
|
||||
_delay.inMilliseconds)
|
||||
_delay.inMilliseconds)
|
||||
.toString(),
|
||||
"nextSubject": nextLesson != null
|
||||
? nextLesson?.subject.renamedTo ??
|
||||
ShortSubject.resolve(subject: nextLesson?.subject).capital()
|
||||
ShortSubject.resolve(subject: nextLesson?.subject).capital()
|
||||
: "",
|
||||
"nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "",
|
||||
};
|
||||
|
||||
case LiveCardState.night:
|
||||
return {
|
||||
"color": color,
|
||||
"color":
|
||||
'#${_settings.liveActivityColor.toString().substring(10, 16)}',
|
||||
"icon": nextLesson != null
|
||||
? SubjectIcon.resolveName(subject: nextLesson?.subject)
|
||||
: "book",
|
||||
@ -149,44 +147,44 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
"description": "",
|
||||
"startDate": storeFirstRunDate != null
|
||||
? ((storeFirstRunDate?.millisecondsSinceEpoch ?? 0) -
|
||||
(_delay.inMilliseconds))
|
||||
.toString()
|
||||
(_delay.inMilliseconds))
|
||||
.toString()
|
||||
: "",
|
||||
"endDate": ((nextLesson?.start.millisecondsSinceEpoch ?? 0) -
|
||||
_delay.inMilliseconds)
|
||||
_delay.inMilliseconds)
|
||||
.toString(),
|
||||
"nextSubject": nextLesson != null
|
||||
? nextLesson?.subject.renamedTo ??
|
||||
ShortSubject.resolve(subject: nextLesson?.subject).capital()
|
||||
ShortSubject.resolve(subject: nextLesson?.subject).capital()
|
||||
: "",
|
||||
"nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "",
|
||||
};
|
||||
|
||||
case LiveCardState.duringLesson:
|
||||
return {
|
||||
"color": color,
|
||||
"color":
|
||||
'#${_settings.liveActivityColor.toString().substring(10, 16)}',
|
||||
"icon": currentLesson != null
|
||||
? SubjectIcon.resolveName(subject: currentLesson?.subject)
|
||||
: "book",
|
||||
"index":
|
||||
currentLesson != null ? '${currentLesson!.lessonIndex}. ' : "",
|
||||
currentLesson != null ? '${currentLesson!.lessonIndex}. ' : "",
|
||||
"title": currentLesson != null
|
||||
? currentLesson?.subject.renamedTo ??
|
||||
ShortSubject.resolve(subject: currentLesson?.subject)
|
||||
.capital()
|
||||
ShortSubject.resolve(subject: currentLesson?.subject)
|
||||
.capital()
|
||||
: "",
|
||||
"subtitle":
|
||||
"Terem: ${currentLesson?.room.replaceAll("_", " ") ?? ""}",
|
||||
"subtitle": "Terem: ${currentLesson?.room.replaceAll("_", " ") ?? ""}",
|
||||
"description": currentLesson?.description ?? "",
|
||||
"startDate": ((currentLesson?.start.millisecondsSinceEpoch ?? 0) -
|
||||
_delay.inMilliseconds)
|
||||
_delay.inMilliseconds)
|
||||
.toString(),
|
||||
"endDate": ((currentLesson?.end.millisecondsSinceEpoch ?? 0) -
|
||||
_delay.inMilliseconds)
|
||||
_delay.inMilliseconds)
|
||||
.toString(),
|
||||
"nextSubject": nextLesson != null
|
||||
? nextLesson?.subject.renamedTo ??
|
||||
ShortSubject.resolve(subject: nextLesson?.subject).capital()
|
||||
ShortSubject.resolve(subject: nextLesson?.subject).capital()
|
||||
: "",
|
||||
"nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "",
|
||||
};
|
||||
@ -201,23 +199,24 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
final diff = getFloorDifference();
|
||||
|
||||
return {
|
||||
"color": color,
|
||||
"color":
|
||||
'#${_settings.liveActivityColor.toString().substring(10, 16)}',
|
||||
"icon": iconFloorMap[diff] ?? "cup.and.saucer",
|
||||
"title": "Szünet",
|
||||
"description": "go $diff".i18n.fill([
|
||||
diff != "to room" ? (nextLesson!.getFloor() ?? 0) : nextLesson!.room
|
||||
]),
|
||||
"startDate": ((prevLesson?.end.millisecondsSinceEpoch ?? 0) -
|
||||
_delay.inMilliseconds)
|
||||
_delay.inMilliseconds)
|
||||
.toString(),
|
||||
"endDate": ((nextLesson?.start.millisecondsSinceEpoch ?? 0) -
|
||||
_delay.inMilliseconds)
|
||||
_delay.inMilliseconds)
|
||||
.toString(),
|
||||
"nextSubject": (nextLesson != null
|
||||
? nextLesson?.subject.renamedTo ??
|
||||
ShortSubject.resolve(subject: nextLesson?.subject)
|
||||
.capital()
|
||||
: "")
|
||||
? nextLesson?.subject.renamedTo ??
|
||||
ShortSubject.resolve(subject: nextLesson?.subject)
|
||||
.capital()
|
||||
: "")
|
||||
.capital(),
|
||||
"nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "",
|
||||
"index": "",
|
||||
@ -244,8 +243,8 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
DateTime now = _now().add(_delay);
|
||||
|
||||
if ((currentState == LiveCardState.morning ||
|
||||
currentState == LiveCardState.afternoon ||
|
||||
currentState == LiveCardState.night) &&
|
||||
currentState == LiveCardState.afternoon ||
|
||||
currentState == LiveCardState.night) &&
|
||||
storeFirstRunDate == null) {
|
||||
storeFirstRunDate = now;
|
||||
}
|
||||
@ -254,9 +253,9 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
// Filter label lessons #128
|
||||
today = today
|
||||
.where((lesson) =>
|
||||
lesson.status?.name != "Elmaradt" &&
|
||||
lesson.subject.id != '' &&
|
||||
!lesson.isEmpty)
|
||||
lesson.status?.name != "Elmaradt" &&
|
||||
lesson.subject.id != '' &&
|
||||
!lesson.isEmpty)
|
||||
.toList();
|
||||
|
||||
if (today.isNotEmpty) {
|
||||
@ -264,7 +263,7 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
today.sort((a, b) => a.start.compareTo(b.start));
|
||||
|
||||
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({}));
|
||||
|
||||
if (_lesson.start.year != 0) {
|
||||
@ -329,7 +328,7 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
hasActivityStarted = true;
|
||||
} else if (!hasActivityStarted &&
|
||||
((currentState == LiveCardState.duringLesson &&
|
||||
currentLesson != null) ||
|
||||
currentLesson != null) ||
|
||||
currentState == LiveCardState.duringBreak)) {
|
||||
debugPrint("Óra van, vagy szünet, de nincs LiveActivity. létrehozás...");
|
||||
PlatformChannel.createLiveActivity(toMap());
|
||||
@ -363,11 +362,7 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
}
|
||||
|
||||
//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) {
|
||||
debugPrint("Több, mint 1 óra van az első óráig. Befejezés...");
|
||||
PlatformChannel.endLiveActivity();
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:refilc/api/providers/database_provider.dart';
|
||||
import 'package:refilc/api/providers/status_provider.dart';
|
||||
import 'package:refilc/api/providers/user_provider.dart';
|
||||
@ -29,7 +28,7 @@ import 'liveactivity/platform_channel.dart';
|
||||
// Mutex
|
||||
bool lock = false;
|
||||
|
||||
Future<void> syncAll(BuildContext context) async {
|
||||
Future<void> syncAll(BuildContext context) {
|
||||
if (lock) return Future.value();
|
||||
// Lock
|
||||
lock = true;
|
||||
@ -41,12 +40,6 @@ Future<void> syncAll(BuildContext context) async {
|
||||
StatusProvider statusProvider =
|
||||
Provider.of<StatusProvider>(context, listen: false);
|
||||
|
||||
// check if access token isn't expired
|
||||
// if (user.user?.accessToken == null) {
|
||||
// lock = false;
|
||||
// return Future.value();
|
||||
// }
|
||||
|
||||
List<Future<void>> tasks = [];
|
||||
int taski = 0;
|
||||
|
||||
@ -57,49 +50,6 @@ Future<void> syncAll(BuildContext context) async {
|
||||
}
|
||||
|
||||
tasks = [
|
||||
// refresh login
|
||||
syncStatus(() async {
|
||||
// print(user.user?.accessTokenExpire);
|
||||
// print('${user.user?.accessToken ?? "no token"} - ACCESS TOKEN');
|
||||
|
||||
// user.user!.accessToken = "";
|
||||
if (user.user == null) {
|
||||
Navigator.of(context).pushNamedAndRemoveUntil("login", (_) => false);
|
||||
|
||||
lock = false;
|
||||
return Future.value();
|
||||
}
|
||||
|
||||
if (user.user!.accessToken.replaceAll(" ", "") == "") {
|
||||
String uid = user.user!.id;
|
||||
|
||||
user.removeUser(uid);
|
||||
await Provider.of<DatabaseProvider>(context, listen: false)
|
||||
.store
|
||||
.removeUser(uid);
|
||||
|
||||
Navigator.of(context).pushNamedAndRemoveUntil("login", (_) => false);
|
||||
|
||||
lock = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (user.user!.accessTokenExpire.isBefore(DateTime.now())) {
|
||||
String authRes = await Provider.of<KretaClient>(context, listen: false)
|
||||
.refreshLogin() ??
|
||||
'';
|
||||
if (authRes != 'success') {
|
||||
if (kDebugMode) print('ERROR: failed to refresh login');
|
||||
lock = false;
|
||||
return Future.value();
|
||||
} else {
|
||||
if (kDebugMode) print('INFO: access token refreshed');
|
||||
}
|
||||
} else {
|
||||
if (kDebugMode) print('INFO: access token is not expired');
|
||||
}
|
||||
}()),
|
||||
|
||||
syncStatus(Provider.of<GradeProvider>(context, listen: false).fetch()),
|
||||
syncStatus(Provider.of<TimetableProvider>(context, listen: false)
|
||||
.fetch(week: Week.current())),
|
||||
@ -121,8 +71,6 @@ Future<void> syncAll(BuildContext context) async {
|
||||
if (studentJson == null) return;
|
||||
Student student = Student.fromJson(studentJson);
|
||||
|
||||
// print(studentJson);
|
||||
|
||||
user.user?.name = student.name;
|
||||
|
||||
// Store user
|
||||
@ -141,11 +89,13 @@ Future<void> syncAll(BuildContext context) async {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
return Future.wait(tasks).then((value) {
|
||||
// Unlock
|
||||
lock = false;
|
||||
|
||||
if (Platform.isIOS && LiveCardProvider.hasActivityStarted == true) {
|
||||
if(Platform.isIOS && LiveCardProvider.hasActivityStarted == true){
|
||||
PlatformChannel.endLiveActivity();
|
||||
LiveCardProvider.hasActivityStarted = false;
|
||||
}
|
||||
|
@ -39,11 +39,11 @@ import 'package:refilc_mobile_ui/screens/settings/settings_route.dart'
|
||||
import 'package:refilc_mobile_ui/screens/settings/settings_screen.dart'
|
||||
as mobile;
|
||||
|
||||
// Desktop UI (no more desktop ui)
|
||||
// import 'package:refilc_desktop_ui/screens/navigation/navigation_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;
|
||||
// Desktop UI
|
||||
import 'package:refilc_desktop_ui/screens/navigation/navigation_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;
|
||||
|
||||
// Providers
|
||||
import 'package:refilc/models/settings.dart';
|
||||
@ -237,7 +237,7 @@ class App extends StatelessWidget {
|
||||
},
|
||||
onGenerateRoute: (settings) => rootNavigator(settings),
|
||||
initialRoute:
|
||||
(user.getUsers().isNotEmpty) ? "navigation" : "login",
|
||||
user.getUsers().isNotEmpty ? "navigation" : "login",
|
||||
);
|
||||
},
|
||||
);
|
||||
@ -248,18 +248,17 @@ class App extends StatelessWidget {
|
||||
|
||||
Route? rootNavigator(RouteSettings route) {
|
||||
if (kIsWeb) {
|
||||
return null;
|
||||
// switch (route.name) {
|
||||
// case "login_back":
|
||||
// return CupertinoPageRoute(
|
||||
// builder: (context) => const desktop.LoginScreen(back: true));
|
||||
// case "login":
|
||||
// return _rootRoute(const desktop.LoginScreen());
|
||||
// case "navigation":
|
||||
// return _rootRoute(const desktop.NavigationScreen());
|
||||
// case "login_to_navigation":
|
||||
// return desktop.loginRoute(const desktop.NavigationScreen());
|
||||
// }
|
||||
switch (route.name) {
|
||||
case "login_back":
|
||||
return CupertinoPageRoute(
|
||||
builder: (context) => const desktop.LoginScreen(back: true));
|
||||
case "login":
|
||||
return _rootRoute(const desktop.LoginScreen());
|
||||
case "navigation":
|
||||
return _rootRoute(const desktop.NavigationScreen());
|
||||
case "login_to_navigation":
|
||||
return desktop.loginRoute(const desktop.NavigationScreen());
|
||||
}
|
||||
} else if (Platform.isAndroid || Platform.isIOS) {
|
||||
switch (route.name) {
|
||||
case "login_back":
|
||||
@ -275,18 +274,17 @@ class App extends StatelessWidget {
|
||||
return mobile.settingsRoute(const mobile.SettingsScreen());
|
||||
}
|
||||
} else if (Platform.isWindows || Platform.isMacOS || Platform.isLinux) {
|
||||
return null;
|
||||
// switch (route.name) {
|
||||
// case "login_back":
|
||||
// return CupertinoPageRoute(
|
||||
// builder: (context) => const desktop.LoginScreen(back: true));
|
||||
// case "login":
|
||||
// return _rootRoute(const desktop.LoginScreen());
|
||||
// case "navigation":
|
||||
// return _rootRoute(const desktop.NavigationScreen());
|
||||
// case "login_to_navigation":
|
||||
// return desktop.loginRoute(const desktop.NavigationScreen());
|
||||
// }
|
||||
switch (route.name) {
|
||||
case "login_back":
|
||||
return CupertinoPageRoute(
|
||||
builder: (context) => const desktop.LoginScreen(back: true));
|
||||
case "login":
|
||||
return _rootRoute(const desktop.LoginScreen());
|
||||
case "navigation":
|
||||
return _rootRoute(const desktop.NavigationScreen());
|
||||
case "login_to_navigation":
|
||||
return desktop.loginRoute(const desktop.NavigationScreen());
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
@ -8,7 +8,7 @@ import 'package:refilc/models/settings.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
// ignore: depend_on_referenced_packages
|
||||
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
|
||||
// import 'package:sqflite_common_ffi_web/sqflite_ffi_web.dart';
|
||||
import 'package:sqflite_common_ffi_web/sqflite_ffi_web.dart';
|
||||
|
||||
const settingsDB = DatabaseStruct("settings", {
|
||||
"language": String, "start_page": int, "rounding": int, "theme": int,
|
||||
@ -27,8 +27,7 @@ const settingsDB = DatabaseStruct("settings", {
|
||||
"notifications_absences": int,
|
||||
"notifications_messages": int,
|
||||
"notifications_lessons": int, // notifications
|
||||
"x_filc_id": String, "graph_class_avg": int,
|
||||
"analytics_enabled": int, "presentation_mode": int,
|
||||
"x_filc_id": String, "graph_class_avg": int, "presentation_mode": int,
|
||||
"bell_delay": int, "bell_delay_enabled": int,
|
||||
"grade_opening_fun": int, "icon_pack": String, "premium_scopes": String,
|
||||
"premium_token": String, "premium_login": String,
|
||||
@ -56,9 +55,6 @@ const settingsDB = DatabaseStruct("settings", {
|
||||
"uwu_mode": int,
|
||||
"new_popups": int,
|
||||
"unseen_new_features": String,
|
||||
"cloud_sync_enabled": int,
|
||||
"cloud_sync_token": String,
|
||||
"local_updated_at": String,
|
||||
// quick settings
|
||||
"q_timetable_lesson_num": int, "q_timetable_sub_tiles": int,
|
||||
"q_subjects_sub_tiles": int,
|
||||
@ -70,7 +66,6 @@ const usersDB = DatabaseStruct("users", {
|
||||
"institute_code": String, "student": String, "role": int,
|
||||
"nickname": String, "picture": String, // premium only (it's now plus btw)
|
||||
"grade_streak": int,
|
||||
"access_token": String, "access_token_expire": String,
|
||||
"refresh_token": String,
|
||||
});
|
||||
const userDataDB = DatabaseStruct("user_data", {
|
||||
@ -110,8 +105,7 @@ Future<Database> initDB(DatabaseProvider database) async {
|
||||
Database db;
|
||||
|
||||
if (kIsWeb) {
|
||||
// db = await databaseFactoryFfiWeb.openDatabase("app.db");
|
||||
throw "web is not supported";
|
||||
db = await databaseFactoryFfiWeb.openDatabase("app.db");
|
||||
} else if (Platform.isLinux || Platform.isWindows) {
|
||||
sqfliteFfiInit();
|
||||
db = await databaseFactoryFfi.openDatabase("app.db");
|
||||
@ -146,8 +140,6 @@ Future<Database> initDB(DatabaseProvider database) async {
|
||||
"nickname": "",
|
||||
"picture": "",
|
||||
"grade_streak": 0,
|
||||
"access_token": "",
|
||||
"access_token_expire": "",
|
||||
"refresh_token": "",
|
||||
},
|
||||
);
|
||||
|
@ -5,7 +5,7 @@ import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:refilc/api/providers/user_provider.dart';
|
||||
import 'package:refilc/api/providers/database_provider.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:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
@ -104,7 +104,7 @@ class Startup {
|
||||
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
|
||||
// NotificationsHelper().setAllCategoriesSeen(user);
|
||||
NotificationsHelper().setAllCategoriesSeen(user);
|
||||
|
||||
late FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;
|
||||
// Notifications setup
|
||||
@ -146,30 +146,30 @@ class Startup {
|
||||
|
||||
// Platform specific settings
|
||||
if (!kIsWeb) {
|
||||
// const DarwinInitializationSettings initializationSettingsDarwin =
|
||||
// DarwinInitializationSettings(
|
||||
// requestSoundPermission: true,
|
||||
// requestBadgePermission: true,
|
||||
// requestAlertPermission: false,
|
||||
// );
|
||||
// const AndroidInitializationSettings initializationSettingsAndroid =
|
||||
// AndroidInitializationSettings('ic_notification');
|
||||
// const LinuxInitializationSettings initializationSettingsLinux =
|
||||
// LinuxInitializationSettings(defaultActionName: 'Open notification');
|
||||
// const InitializationSettings initializationSettings =
|
||||
// InitializationSettings(
|
||||
// android: initializationSettingsAndroid,
|
||||
// iOS: initializationSettingsDarwin,
|
||||
// macOS: initializationSettingsDarwin,
|
||||
// linux: initializationSettingsLinux,
|
||||
// );
|
||||
const DarwinInitializationSettings initializationSettingsDarwin =
|
||||
DarwinInitializationSettings(
|
||||
requestSoundPermission: true,
|
||||
requestBadgePermission: true,
|
||||
requestAlertPermission: false,
|
||||
);
|
||||
const AndroidInitializationSettings initializationSettingsAndroid =
|
||||
AndroidInitializationSettings('ic_notification');
|
||||
const LinuxInitializationSettings initializationSettingsLinux =
|
||||
LinuxInitializationSettings(defaultActionName: 'Open notification');
|
||||
const InitializationSettings initializationSettings =
|
||||
InitializationSettings(
|
||||
android: initializationSettingsAndroid,
|
||||
iOS: initializationSettingsDarwin,
|
||||
macOS: initializationSettingsDarwin,
|
||||
linux: initializationSettingsLinux,
|
||||
);
|
||||
|
||||
// Initialize notifications
|
||||
// await flutterLocalNotificationsPlugin.initialize(
|
||||
// initializationSettings,
|
||||
// onDidReceiveNotificationResponse:
|
||||
// NotificationsHelper().onDidReceiveNotificationResponse,
|
||||
// );
|
||||
await flutterLocalNotificationsPlugin.initialize(
|
||||
initializationSettings,
|
||||
onDidReceiveNotificationResponse:
|
||||
NotificationsHelper().onDidReceiveNotificationResponse,
|
||||
);
|
||||
}
|
||||
|
||||
// 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;
|
||||
LiveActivityHelper().backgroundJob();
|
||||
} else {
|
||||
// NotificationsHelper().backgroundJob();
|
||||
NotificationsHelper().backgroundJob();
|
||||
}
|
||||
BackgroundFetch.finish(taskId);
|
||||
}, (String taskId) async {
|
||||
@ -279,7 +279,7 @@ void backgroundHeadlessTask(HeadlessTask task) {
|
||||
if (!Platform.isIOS) return;
|
||||
LiveActivityHelper().backgroundJob();
|
||||
} else {
|
||||
// NotificationsHelper().backgroundJob();
|
||||
NotificationsHelper().backgroundJob();
|
||||
}
|
||||
BackgroundFetch.finish(task.taskId);
|
||||
}
|
||||
|
@ -1,22 +0,0 @@
|
||||
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,
|
||||
);
|
||||
}
|
||||
}
|
@ -7,8 +7,6 @@ class News {
|
||||
String platform;
|
||||
bool emergency;
|
||||
DateTime expireDate;
|
||||
List<String>? appVersions;
|
||||
String? specificAppId;
|
||||
Map? json;
|
||||
|
||||
News({
|
||||
@ -20,8 +18,6 @@ class News {
|
||||
required this.platform,
|
||||
required this.emergency,
|
||||
required this.expireDate,
|
||||
this.appVersions,
|
||||
this.specificAppId,
|
||||
this.json,
|
||||
});
|
||||
|
||||
@ -35,10 +31,6 @@ class News {
|
||||
platform: json["platform"] ?? "",
|
||||
emergency: json["emergency"] ?? false,
|
||||
expireDate: DateTime.parse(json["expire_date"] ?? ''),
|
||||
appVersions: json["app_versions"] != null
|
||||
? List<String>.from(json["app_versions"])
|
||||
: null,
|
||||
specificAppId: json["specific_app_id"],
|
||||
json: json,
|
||||
);
|
||||
}
|
||||
|
@ -60,7 +60,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
UpdateChannel _updateChannel;
|
||||
Config _config;
|
||||
String _xFilcId;
|
||||
bool _analyticsEnabled;
|
||||
bool _graphClassAvg;
|
||||
bool _goodStudent;
|
||||
bool _presentationMode;
|
||||
@ -109,9 +108,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
bool _uwuMode;
|
||||
bool _newPopups;
|
||||
List<String> _unseenNewFeatures;
|
||||
bool _cloudSyncEnabled;
|
||||
String _cloudSyncToken;
|
||||
DateTime _updatedAt;
|
||||
// quick settings
|
||||
bool _qTimetableLessonNum;
|
||||
bool _qTimetableSubTiles;
|
||||
@ -141,7 +137,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
required UpdateChannel updateChannel,
|
||||
required Config config,
|
||||
required String xFilcId,
|
||||
required bool analyticsEnabled,
|
||||
required bool graphClassAvg,
|
||||
required bool goodStudent,
|
||||
required bool presentationMode,
|
||||
@ -187,9 +182,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
required bool uwuMode,
|
||||
required bool newPopups,
|
||||
required List<String> unseenNewFeatures,
|
||||
required bool cloudSyncEnabled,
|
||||
required String cloudSyncToken,
|
||||
required DateTime updatedAt,
|
||||
required bool qTimetableLessonNum,
|
||||
required bool qTimetableSubTiles,
|
||||
required bool qSubjectsSubTiles,
|
||||
@ -216,7 +208,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
_updateChannel = updateChannel,
|
||||
_config = config,
|
||||
_xFilcId = xFilcId,
|
||||
_analyticsEnabled = analyticsEnabled,
|
||||
_graphClassAvg = graphClassAvg,
|
||||
_goodStudent = goodStudent,
|
||||
_presentationMode = presentationMode,
|
||||
@ -262,9 +253,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
_uwuMode = uwuMode,
|
||||
_newPopups = newPopups,
|
||||
_unseenNewFeatures = unseenNewFeatures,
|
||||
_cloudSyncEnabled = cloudSyncEnabled,
|
||||
_cloudSyncToken = cloudSyncToken,
|
||||
_updatedAt = updatedAt,
|
||||
_qTimetableLessonNum = qTimetableLessonNum,
|
||||
_qTimetableSubTiles = qTimetableSubTiles,
|
||||
_qSubjectsSubTiles = qSubjectsSubTiles;
|
||||
@ -309,7 +297,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
updateChannel: UpdateChannel.values[map["update_channel"]],
|
||||
config: Config.fromJson(configMap ?? {}),
|
||||
xFilcId: map["x_filc_id"],
|
||||
analyticsEnabled: map["analytics_enabled"] == 1,
|
||||
graphClassAvg: map["graph_class_avg"] == 1,
|
||||
goodStudent: false,
|
||||
presentationMode: map["presentation_mode"] == 1,
|
||||
@ -356,9 +343,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
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'],
|
||||
updatedAt: DateTime.tryParse(map['local_updated_at']) ?? DateTime.now(),
|
||||
qTimetableLessonNum: map['q_timetable_lesson_num'] == 1,
|
||||
qTimetableSubTiles: map['q_timetable_sub_tiles'] == 1,
|
||||
qSubjectsSubTiles: map['q_subjects_sub_tiles'] == 1,
|
||||
@ -393,7 +377,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
"notification_poll_interval": _notificationPollInterval,
|
||||
"config": jsonEncode(config.json),
|
||||
"x_filc_id": _xFilcId,
|
||||
"analytics_enabled": _analyticsEnabled ? 1 : 0,
|
||||
"graph_class_avg": _graphClassAvg ? 1 : 0,
|
||||
"presentation_mode": _presentationMode ? 1 : 0,
|
||||
"bell_delay_enabled": _bellDelayEnabled ? 1 : 0,
|
||||
@ -438,9 +421,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
"uwu_mode": _uwuMode ? 1 : 0,
|
||||
"new_popups": _newPopups ? 1 : 0,
|
||||
"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_sub_tiles": _qTimetableSubTiles ? 1 : 0,
|
||||
"q_subjects_sub_tiles": _qSubjectsSubTiles ? 1 : 0,
|
||||
@ -470,7 +450,7 @@ class SettingsProvider extends ChangeNotifier {
|
||||
notificationsMessagesEnabled: true,
|
||||
notificationsLessonsEnabled: true,
|
||||
notificationsBitfield: 255,
|
||||
developerMode: true,
|
||||
developerMode: false,
|
||||
notificationPollInterval: 1,
|
||||
vibrate: VibrationStrength.medium,
|
||||
abWeeks: false,
|
||||
@ -478,7 +458,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
updateChannel: UpdateChannel.stable,
|
||||
config: Config.fromJson({}),
|
||||
xFilcId: const Uuid().v4(),
|
||||
analyticsEnabled: false,
|
||||
graphClassAvg: false,
|
||||
goodStudent: false,
|
||||
presentationMode: false,
|
||||
@ -500,13 +479,13 @@ class SettingsProvider extends ChangeNotifier {
|
||||
renameSubjectsItalics: false,
|
||||
renameTeachersEnabled: false,
|
||||
renameTeachersItalics: false,
|
||||
liveActivityColor: const Color(0x00000000),
|
||||
liveActivityColor: const Color(0xFF676767),
|
||||
welcomeMessage: '',
|
||||
appIcon: 'refilc_default',
|
||||
currentThemeId: '',
|
||||
currentThemeDisplayName: '',
|
||||
currentThemeCreator: 'reFilc',
|
||||
showBreaks: false,
|
||||
showBreaks: true,
|
||||
pinSetGeneral: '',
|
||||
pinSetPersonalize: '',
|
||||
pinSetNotify: '',
|
||||
@ -524,9 +503,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
uwuMode: false,
|
||||
newPopups: true,
|
||||
unseenNewFeatures: ['grade_exporting'],
|
||||
cloudSyncEnabled: false,
|
||||
cloudSyncToken: '',
|
||||
updatedAt: DateTime.now(),
|
||||
qTimetableLessonNum: true,
|
||||
qTimetableSubTiles: true,
|
||||
qSubjectsSubTiles: true,
|
||||
@ -556,7 +532,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
UpdateChannel get updateChannel => _updateChannel;
|
||||
Config get config => _config;
|
||||
String get xFilcId => _xFilcId;
|
||||
bool get analyticsEnabled => _analyticsEnabled;
|
||||
bool get graphClassAvg => _graphClassAvg;
|
||||
bool get goodStudent => _goodStudent;
|
||||
bool get presentationMode => _presentationMode;
|
||||
@ -601,9 +576,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
bool get uwuMode => _uwuMode;
|
||||
bool get newPopups => _newPopups;
|
||||
List<String> get unseenNewFeatures => _unseenNewFeatures;
|
||||
bool get cloudSyncEnabled => _cloudSyncEnabled;
|
||||
String get cloudSyncToken => _cloudSyncToken;
|
||||
DateTime get updatedAt => _updatedAt;
|
||||
bool get qTimetableLessonNum => _qTimetableLessonNum;
|
||||
bool get qTimetableSubTiles => _qTimetableSubTiles;
|
||||
bool get qSubjectsSubTiles => _qSubjectsSubTiles;
|
||||
@ -618,7 +590,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
List<Color>? gradeColors,
|
||||
bool? newsEnabled,
|
||||
String? seenNewsId,
|
||||
String? seenNews, // only for restoring from map
|
||||
bool? notificationsEnabled,
|
||||
bool? notificationsGradesEnabled,
|
||||
bool? notificationsAbsencesEnabled,
|
||||
@ -633,7 +604,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
UpdateChannel? updateChannel,
|
||||
Config? config,
|
||||
String? xFilcId,
|
||||
bool? analyticsEnabled,
|
||||
bool? graphClassAvg,
|
||||
bool? goodStudent,
|
||||
bool? presentationMode,
|
||||
@ -675,8 +645,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
bool? uwuMode,
|
||||
bool? newPopups,
|
||||
List<String>? unseenNewFeatures,
|
||||
bool? cloudSyncEnabled,
|
||||
String? cloudSyncToken,
|
||||
bool? qTimetableLessonNum,
|
||||
bool? qTimetableSubTiles,
|
||||
bool? qSubjectsSubTiles,
|
||||
@ -699,7 +667,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
tempList.add(seenNewsId);
|
||||
_seenNews = tempList.join(',');
|
||||
}
|
||||
if (seenNews != null && seenNews != _seenNews) _seenNews = seenNews;
|
||||
if (notificationsEnabled != null &&
|
||||
notificationsEnabled != _notificationsEnabled) {
|
||||
_notificationsEnabled = notificationsEnabled;
|
||||
@ -741,9 +708,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
}
|
||||
if (config != null && config != _config) _config = config;
|
||||
if (xFilcId != null && xFilcId != _xFilcId) _xFilcId = xFilcId;
|
||||
if (analyticsEnabled != null && analyticsEnabled != _analyticsEnabled) {
|
||||
_analyticsEnabled = analyticsEnabled;
|
||||
}
|
||||
if (graphClassAvg != null && graphClassAvg != _graphClassAvg) {
|
||||
_graphClassAvg = graphClassAvg;
|
||||
}
|
||||
@ -875,12 +839,6 @@ class SettingsProvider extends ChangeNotifier {
|
||||
if (unseenNewFeatures != null && unseenNewFeatures != _unseenNewFeatures) {
|
||||
_unseenNewFeatures = unseenNewFeatures;
|
||||
}
|
||||
if (cloudSyncEnabled != null && cloudSyncEnabled != _cloudSyncEnabled) {
|
||||
_cloudSyncEnabled = cloudSyncEnabled;
|
||||
}
|
||||
if (cloudSyncToken != null && cloudSyncToken != _cloudSyncToken) {
|
||||
_cloudSyncToken = cloudSyncToken;
|
||||
}
|
||||
if (qTimetableLessonNum != null &&
|
||||
qTimetableLessonNum != _qTimetableLessonNum) {
|
||||
_qTimetableLessonNum = qTimetableLessonNum;
|
||||
@ -892,115 +850,11 @@ class SettingsProvider extends ChangeNotifier {
|
||||
if (qSubjectsSubTiles != null && qSubjectsSubTiles != _qSubjectsSubTiles) {
|
||||
_qSubjectsSubTiles = qSubjectsSubTiles;
|
||||
}
|
||||
// change updated at time
|
||||
_updatedAt = DateTime.now();
|
||||
// store or not
|
||||
if (store) await _database?.store.storeSettings(this);
|
||||
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() {
|
||||
String sets = json.encode(toMap());
|
||||
Clipboard.setData(ClipboardData(text: sets));
|
||||
|
@ -18,13 +18,7 @@ class User {
|
||||
String picture;
|
||||
int gradeStreak;
|
||||
// new login method
|
||||
String accessToken;
|
||||
DateTime accessTokenExpire;
|
||||
String refreshToken;
|
||||
// cloud sync
|
||||
// String qwidAccessToken;
|
||||
// DateTime? qwidAccessTokenExpire;
|
||||
// String qwidRefreshToken;
|
||||
|
||||
String get displayName => nickname != '' ? nickname : name;
|
||||
bool get hasStreak => gradeStreak > 0;
|
||||
@ -40,12 +34,7 @@ class User {
|
||||
this.nickname = "",
|
||||
this.picture = "",
|
||||
this.gradeStreak = 0,
|
||||
required this.accessToken,
|
||||
required this.accessTokenExpire,
|
||||
required this.refreshToken,
|
||||
// this.qwidAccessToken = "",
|
||||
// this.qwidAccessTokenExpire,
|
||||
// this.qwidRefreshToken = "",
|
||||
}) {
|
||||
if (id != null) {
|
||||
this.id = id;
|
||||
@ -70,22 +59,12 @@ class User {
|
||||
birth: DateTime.now(),
|
||||
yearId: '1',
|
||||
parents: [],
|
||||
gradeDelay: 0,
|
||||
),
|
||||
role: Role.values[map["role"] ?? 0],
|
||||
nickname: map["nickname"] ?? "",
|
||||
picture: map["picture"] ?? "",
|
||||
gradeStreak: map["grade_streak"] ?? 0,
|
||||
accessToken: map["access_token"] ?? "",
|
||||
accessTokenExpire: DateTime.parse(map["access_token_expire"] != ""
|
||||
? map["access_token_expire"]
|
||||
: DateTime.now().toIso8601String()),
|
||||
refreshToken: map["refresh_token"] ?? "",
|
||||
// qwidAccessToken: map["qwid_access_token"] ?? "",
|
||||
// qwidAccessTokenExpire: map["qwid_access_token_expire"] != ""
|
||||
// ? DateTime.parse(map["qwid_access_token_expire"])
|
||||
// : null,
|
||||
// qwidRefreshToken: map["qwid_refresh_token"] ?? "",
|
||||
);
|
||||
}
|
||||
|
||||
@ -101,14 +80,7 @@ class User {
|
||||
"nickname": nickname,
|
||||
"picture": picture,
|
||||
"grade_streak": gradeStreak,
|
||||
"access_token": accessToken,
|
||||
"access_token_expire": accessTokenExpire.toIso8601String(),
|
||||
"refresh_token": refreshToken,
|
||||
// "qwid_access_token": qwidAccessToken,
|
||||
// "qwid_access_token_expire": qwidAccessTokenExpire != null
|
||||
// ? qwidAccessTokenExpire!.toIso8601String()
|
||||
// : "",
|
||||
// "qwid_refresh_token": qwidRefreshToken,
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
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/light_desktop.dart';
|
||||
import 'package:refilc/theme/colors/light_desktop.dart';
|
||||
import 'package:refilc/theme/colors/light_mobile.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
@ -21,16 +21,10 @@ class AppColors {
|
||||
} else {
|
||||
switch (brightness) {
|
||||
case Brightness.light:
|
||||
return LightMobileAppColors();
|
||||
return LightDesktopAppColors();
|
||||
case Brightness.dark:
|
||||
return DarkMobileAppColors();
|
||||
return DarkDesktopAppColors();
|
||||
}
|
||||
// switch (brightness) {
|
||||
// case Brightness.light:
|
||||
// return LightDesktopAppColors();
|
||||
// case Brightness.dark:
|
||||
// return DarkDesktopAppColors();
|
||||
// }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -115,42 +115,42 @@ class AppTheme {
|
||||
primary: accent,
|
||||
onPrimary:
|
||||
(accent.computeLuminance() > 0.5 ? Colors.black : Colors.white)
|
||||
.withValues(alpha: .9),
|
||||
.withOpacity(.9),
|
||||
secondary: newSecondary,
|
||||
onSecondary: (newSecondary.computeLuminance() > 0.5
|
||||
? Colors.black
|
||||
: Colors.white)
|
||||
.withValues(alpha: .9),
|
||||
.withOpacity(.9),
|
||||
tertiary: newTertiary,
|
||||
onTertiary:
|
||||
(newTertiary.computeLuminance() > 0.5 ? Colors.black : Colors.white)
|
||||
.withValues(alpha: .9),
|
||||
.withOpacity(.9),
|
||||
brightness: Brightness.light,
|
||||
error: lightColors.red,
|
||||
onError: Colors.white.withValues(alpha: .9),
|
||||
onError: Colors.white.withOpacity(.9),
|
||||
surface: highlightColor,
|
||||
onSurface: Colors.black.withValues(alpha: .9),
|
||||
onSurface: Colors.black.withOpacity(.9),
|
||||
),
|
||||
shadowColor: lightColors.shadow.withValues(alpha: .5),
|
||||
shadowColor: lightColors.shadow.withOpacity(.5),
|
||||
appBarTheme: AppBarTheme(backgroundColor: backgroundColor),
|
||||
indicatorColor: accent,
|
||||
iconTheme: IconThemeData(color: lightColors.text.withValues(alpha: .75)),
|
||||
iconTheme: IconThemeData(color: lightColors.text.withOpacity(.75)),
|
||||
navigationBarTheme: NavigationBarThemeData(
|
||||
indicatorColor: accent.withValues(
|
||||
alpha: accentColor == AccentColor.adaptive ? 0.4 : 0.8),
|
||||
indicatorColor:
|
||||
accent.withOpacity(accentColor == AccentColor.adaptive ? 0.4 : 0.8),
|
||||
iconTheme:
|
||||
WidgetStateProperty.all(IconThemeData(color: lightColors.text)),
|
||||
backgroundColor: highlightColor,
|
||||
labelTextStyle: WidgetStateProperty.all(TextStyle(
|
||||
fontSize: 13.0,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: lightColors.text.withValues(alpha: 0.8),
|
||||
color: lightColors.text.withOpacity(0.8),
|
||||
)),
|
||||
labelBehavior: NavigationDestinationLabelBehavior.alwaysShow,
|
||||
height: 76.0,
|
||||
),
|
||||
sliderTheme: SliderThemeData(
|
||||
inactiveTrackColor: accent.withValues(alpha: .3),
|
||||
inactiveTrackColor: accent.withOpacity(.3),
|
||||
),
|
||||
progressIndicatorTheme: ProgressIndicatorThemeData(color: accent),
|
||||
expansionTileTheme: ExpansionTileThemeData(iconColor: accent),
|
||||
@ -238,48 +238,48 @@ class AppTheme {
|
||||
primary: accent,
|
||||
onPrimary:
|
||||
(accent.computeLuminance() > 0.5 ? Colors.black : Colors.white)
|
||||
.withValues(alpha: .9),
|
||||
.withOpacity(.9),
|
||||
secondary: newSecondary,
|
||||
onSecondary: (newSecondary.computeLuminance() > 0.5
|
||||
? Colors.black
|
||||
: Colors.white)
|
||||
.withValues(alpha: .9),
|
||||
.withOpacity(.9),
|
||||
tertiary: newTertiary,
|
||||
onTertiary:
|
||||
(newTertiary.computeLuminance() > 0.5 ? Colors.black : Colors.white)
|
||||
.withValues(alpha: .9),
|
||||
.withOpacity(.9),
|
||||
brightness: Brightness.dark,
|
||||
error: darkColors.red,
|
||||
onError: Colors.black.withValues(alpha: .9),
|
||||
onError: Colors.black.withOpacity(.9),
|
||||
surface: highlightColor,
|
||||
onSurface: Colors.white.withValues(alpha: .9),
|
||||
onSurface: Colors.white.withOpacity(.9),
|
||||
),
|
||||
shadowColor: highlightColor.withValues(alpha: .5), //darkColors.shadow,
|
||||
shadowColor: highlightColor.withOpacity(.5), //darkColors.shadow,
|
||||
appBarTheme: AppBarTheme(backgroundColor: backgroundColor),
|
||||
indicatorColor: accent,
|
||||
iconTheme: IconThemeData(color: darkColors.text.withValues(alpha: .75)),
|
||||
iconTheme: IconThemeData(color: darkColors.text.withOpacity(.75)),
|
||||
navigationBarTheme: NavigationBarThemeData(
|
||||
indicatorColor: accent.withValues(
|
||||
alpha: accentColor == AccentColor.adaptive ? 0.4 : 0.8),
|
||||
indicatorColor:
|
||||
accent.withOpacity(accentColor == AccentColor.adaptive ? 0.4 : 0.8),
|
||||
iconTheme:
|
||||
WidgetStateProperty.all(IconThemeData(color: darkColors.text)),
|
||||
backgroundColor: highlightColor,
|
||||
labelTextStyle: WidgetStateProperty.all(TextStyle(
|
||||
fontSize: 13.0,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: darkColors.text.withValues(alpha: 0.8),
|
||||
color: darkColors.text.withOpacity(0.8),
|
||||
)),
|
||||
labelBehavior: NavigationDestinationLabelBehavior.alwaysShow,
|
||||
height: 76.0,
|
||||
),
|
||||
sliderTheme: SliderThemeData(
|
||||
inactiveTrackColor: accent.withValues(alpha: .3),
|
||||
inactiveTrackColor: accent.withOpacity(.3),
|
||||
),
|
||||
progressIndicatorTheme: ProgressIndicatorThemeData(color: accent),
|
||||
expansionTileTheme: ExpansionTileThemeData(iconColor: accent),
|
||||
cardColor: highlightColor,
|
||||
chipTheme: ChipThemeData(
|
||||
backgroundColor: accent.withValues(alpha: .2),
|
||||
backgroundColor: accent.withOpacity(.2),
|
||||
elevation: 1,
|
||||
),
|
||||
bottomNavigationBarTheme: BottomNavigationBarThemeData(
|
||||
|
@ -191,7 +191,7 @@ List<Widget> sortDateWidgets(
|
||||
width: 150.0,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(12.0),
|
||||
color: AppColors.of(context).text.withValues(alpha: .25),
|
||||
color: AppColors.of(context).text.withOpacity(.25),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
@ -178,7 +178,7 @@ Future<List<DateWidget>> getFilterWidgets(FilterType activeData,
|
||||
// Ads
|
||||
case FilterType.ads:
|
||||
if (adProvider.available) {
|
||||
items = ad_filter.getWidgets(adProvider.ads, context);
|
||||
items = ad_filter.getWidgets(adProvider.ads);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -232,8 +232,8 @@ Widget filterItemBuilder(
|
||||
BoxShadow(
|
||||
offset: const Offset(0, 21),
|
||||
blurRadius: 23.0,
|
||||
color: Theme.of(context).shadowColor.withValues(
|
||||
alpha: Theme.of(context).shadowColor.opacity *
|
||||
color: Theme.of(context).shadowColor.withOpacity(
|
||||
Theme.of(context).shadowColor.opacity *
|
||||
CurvedAnimation(
|
||||
parent: CurvedAnimation(
|
||||
parent: animation,
|
||||
|
@ -1,70 +1,23 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:refilc/models/ad.dart';
|
||||
import 'package:refilc/ui/date_widget.dart';
|
||||
import 'package:refilc_mobile_ui/common/widgets/ad/ad_tile.dart';
|
||||
import 'package:refilc_mobile_ui/common/widgets/ad/ad_viewable.dart' as mobile;
|
||||
import 'package:refilc_mobile_ui/plus/plus_screen.dart';
|
||||
import 'package:refilc_plus/providers/plus_provider.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
|
||||
List<DateWidget> getWidgets(List<Ad> providerAds, BuildContext context) {
|
||||
List<DateWidget> getWidgets(List<Ad> providerAds) {
|
||||
List<DateWidget> items = [];
|
||||
|
||||
bool hasPlus = Provider.of<PlusProvider>(context).hasPremium;
|
||||
|
||||
DateWidget plusWidget = DateWidget(
|
||||
key: const Uuid().v4(),
|
||||
date: DateTime.now(),
|
||||
widget: AdTile(
|
||||
Ad(
|
||||
title: 'reFilc+',
|
||||
description:
|
||||
'Fizess elő reFilc+-ra, rejtsd el a hirdetéseket és támogasd az app működését!',
|
||||
author: '',
|
||||
logoUrl: Uri.parse('https://refilc.hu/image/brand/logo.png'),
|
||||
overridePremium: false,
|
||||
date: DateTime(2007, 6, 29, 9, 41),
|
||||
expireDate: DateTime.now().add(const Duration(days: 11)),
|
||||
launchUrl: Uri.parse('https://refilc.hu/plus'),
|
||||
),
|
||||
onTap: () => Navigator.of(context, rootNavigator: true)
|
||||
.push(MaterialPageRoute(builder: (context) {
|
||||
return const PlusScreen();
|
||||
})),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 5.0),
|
||||
showExternalIcon: false,
|
||||
),
|
||||
);
|
||||
|
||||
if (providerAds.isNotEmpty) {
|
||||
for (var ad in providerAds) {
|
||||
if (ad.date.isBefore(DateTime.now()) &&
|
||||
ad.expireDate.isAfter(DateTime.now()) &&
|
||||
DateTime.now().hour.isOdd) {
|
||||
if (!hasPlus || ad.overridePremium) {
|
||||
providerAds.sort((a, b) => -a.date.compareTo(b.date));
|
||||
ad.expireDate.isAfter(DateTime.now())) {
|
||||
providerAds.sort((a, b) => -a.date.compareTo(b.date));
|
||||
|
||||
items.add(DateWidget(
|
||||
key: ad.description,
|
||||
date: ad.date,
|
||||
widget: mobile.AdViewable(ad),
|
||||
));
|
||||
}
|
||||
} else {
|
||||
if (DateTime.now().weekday == DateTime.saturday &&
|
||||
items.isEmpty &&
|
||||
!hasPlus) {
|
||||
items.add(plusWidget);
|
||||
}
|
||||
items.add(DateWidget(
|
||||
key: ad.description,
|
||||
date: ad.date,
|
||||
widget: mobile.AdViewable(ad),
|
||||
));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (DateTime.now().weekday == DateTime.saturday &&
|
||||
items.isEmpty &&
|
||||
!hasPlus) {
|
||||
items.add(plusWidget);
|
||||
}
|
||||
}
|
||||
|
||||
return items;
|
||||
|
@ -8,9 +8,7 @@ List<DateWidget> getWidgets(List<Grade> providerGrades) {
|
||||
List<DateWidget> items = [];
|
||||
for (var gradeType in GradeType.values) {
|
||||
if ([GradeType.midYear, GradeType.unknown, GradeType.levelExam]
|
||||
.contains(gradeType)) {
|
||||
continue;
|
||||
}
|
||||
.contains(gradeType)) continue;
|
||||
|
||||
List<Grade> grades =
|
||||
providerGrades.where((grade) => grade.type == gradeType).toList();
|
||||
|
@ -1,9 +1,12 @@
|
||||
import 'package:refilc/ui/date_widget.dart';
|
||||
import 'package:refilc/utils/platform.dart';
|
||||
import 'package:refilc_kreta_api/models/grade.dart';
|
||||
import 'package:refilc_mobile_ui/common/widgets/grade/grade_viewable.dart'
|
||||
as mobile;
|
||||
import 'package:refilc_mobile_ui/common/widgets/grade/new_grades.dart'
|
||||
as mobile;
|
||||
import 'package:refilc_desktop_ui/common/widgets/grade/grade_viewable.dart'
|
||||
as desktop;
|
||||
|
||||
List<DateWidget> getWidgets(
|
||||
List<Grade> providerGrades, DateTime? lastSeenDate) {
|
||||
@ -16,7 +19,9 @@ List<DateWidget> getWidgets(
|
||||
items.add(DateWidget(
|
||||
key: grade.id,
|
||||
date: grade.date,
|
||||
widget: mobile.GradeViewable(grade),
|
||||
widget: PlatformUtils.isMobile
|
||||
? mobile.GradeViewable(grade)
|
||||
: desktop.GradeViewable(grade),
|
||||
));
|
||||
}
|
||||
}
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
/// Blocky Color Picker
|
||||
|
||||
library;
|
||||
library block_colorpicker;
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:refilc/theme/colors/accent.dart';
|
||||
@ -73,7 +73,7 @@ Widget _defaultItemBuilder(
|
||||
color: color,
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: color.withValues(alpha: 0.8),
|
||||
color: color.withOpacity(0.8),
|
||||
offset: const Offset(1, 2),
|
||||
blurRadius: 5)
|
||||
],
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
// ignore_for_file: use_build_context_synchronously
|
||||
|
||||
library;
|
||||
library hsv_picker;
|
||||
|
||||
import 'package:refilc/models/shared_theme.dart';
|
||||
import 'package:refilc_mobile_ui/common/custom_snack_bar.dart';
|
||||
@ -380,7 +380,7 @@ class FilcColorPickerState extends State<FilcColorPicker> {
|
||||
fontSize: 16.0,
|
||||
color: AppColors.of(context)
|
||||
.text
|
||||
.withValues(alpha: isAdvancedView ? 1.0 : .5),
|
||||
.withOpacity(isAdvancedView ? 1.0 : .5),
|
||||
),
|
||||
),
|
||||
],
|
||||
|
@ -210,32 +210,32 @@ class TrackPainter extends CustomPainter {
|
||||
break;
|
||||
case TrackType.red:
|
||||
final List<Color> colors = [
|
||||
hsvColor.toColor().withRed(0).withValues(alpha: 1.0),
|
||||
hsvColor.toColor().withRed(255).withValues(alpha: 1.0),
|
||||
hsvColor.toColor().withRed(0).withOpacity(1.0),
|
||||
hsvColor.toColor().withRed(255).withOpacity(1.0),
|
||||
];
|
||||
Gradient gradient = LinearGradient(colors: colors);
|
||||
canvas.drawRect(rect, Paint()..shader = gradient.createShader(rect));
|
||||
break;
|
||||
case TrackType.green:
|
||||
final List<Color> colors = [
|
||||
hsvColor.toColor().withGreen(0).withValues(alpha: 1.0),
|
||||
hsvColor.toColor().withGreen(255).withValues(alpha: 1.0),
|
||||
hsvColor.toColor().withGreen(0).withOpacity(1.0),
|
||||
hsvColor.toColor().withGreen(255).withOpacity(1.0),
|
||||
];
|
||||
Gradient gradient = LinearGradient(colors: colors);
|
||||
canvas.drawRect(rect, Paint()..shader = gradient.createShader(rect));
|
||||
break;
|
||||
case TrackType.blue:
|
||||
final List<Color> colors = [
|
||||
hsvColor.toColor().withBlue(0).withValues(alpha: 1.0),
|
||||
hsvColor.toColor().withBlue(255).withValues(alpha: 1.0),
|
||||
hsvColor.toColor().withBlue(0).withOpacity(1.0),
|
||||
hsvColor.toColor().withBlue(255).withOpacity(1.0),
|
||||
];
|
||||
Gradient gradient = LinearGradient(colors: colors);
|
||||
canvas.drawRect(rect, Paint()..shader = gradient.createShader(rect));
|
||||
break;
|
||||
case TrackType.alpha:
|
||||
final List<Color> colors = [
|
||||
hsvColor.toColor().withValues(alpha: 0.0),
|
||||
hsvColor.toColor().withValues(alpha: 1.0),
|
||||
hsvColor.toColor().withOpacity(0.0),
|
||||
hsvColor.toColor().withOpacity(1.0),
|
||||
];
|
||||
Gradient gradient = LinearGradient(colors: colors);
|
||||
canvas.drawRect(rect, Paint()..shader = gradient.createShader(rect));
|
||||
@ -390,7 +390,7 @@ class ColorPickerInputState extends State<ColorPickerInput> {
|
||||
),
|
||||
contentPadding:
|
||||
const EdgeInsets.symmetric(vertical: 8.0, horizontal: 8.0),
|
||||
fillColor: AppColors.of(context).text.withValues(alpha: .1),
|
||||
fillColor: AppColors.of(context).text.withOpacity(.1),
|
||||
),
|
||||
onChanged: (String value) {
|
||||
String input = value;
|
||||
@ -603,20 +603,20 @@ class ColorPickerSlider extends StatelessWidget {
|
||||
break;
|
||||
case TrackType.red:
|
||||
thumbOffset += (box.maxWidth - 30.0) * hsvColor.toColor().red / 0xff;
|
||||
thumbColor = hsvColor.toColor().withValues(alpha: 1.0);
|
||||
thumbColor = hsvColor.toColor().withOpacity(1.0);
|
||||
break;
|
||||
case TrackType.green:
|
||||
thumbOffset +=
|
||||
(box.maxWidth - 30.0) * hsvColor.toColor().green / 0xff;
|
||||
thumbColor = hsvColor.toColor().withValues(alpha: 1.0);
|
||||
thumbColor = hsvColor.toColor().withOpacity(1.0);
|
||||
break;
|
||||
case TrackType.blue:
|
||||
thumbOffset += (box.maxWidth - 30.0) * hsvColor.toColor().blue / 0xff;
|
||||
thumbColor = hsvColor.toColor().withValues(alpha: 1.0);
|
||||
thumbColor = hsvColor.toColor().withOpacity(1.0);
|
||||
break;
|
||||
case TrackType.alpha:
|
||||
thumbOffset += (box.maxWidth - 30.0) * hsvColor.toColor().opacity;
|
||||
thumbColor = hsvColor.toColor().withValues(alpha: hsvColor.alpha);
|
||||
thumbColor = hsvColor.toColor().withOpacity(hsvColor.alpha);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -709,8 +709,8 @@ class ColorIndicator extends StatelessWidget {
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: useWhiteForeground(color)
|
||||
? Colors.white.withValues(alpha: .5)
|
||||
: Colors.black.withValues(alpha: .5),
|
||||
? Colors.white.withOpacity(.5)
|
||||
: Colors.black.withOpacity(.5),
|
||||
offset: const Offset(0, 0),
|
||||
blurRadius: 5)
|
||||
],
|
||||
|
@ -199,7 +199,7 @@ class GradeTile extends StatelessWidget {
|
||||
: Icon(
|
||||
SubjectIcon.resolveVariant(
|
||||
context: context, subject: grade.subject),
|
||||
color: AppColors.of(context).text.withValues(alpha: .5),
|
||||
color: AppColors.of(context).text.withOpacity(.5),
|
||||
),
|
||||
minLeadingWidth: isSubjectView ? 32.0 : 0,
|
||||
),
|
||||
@ -288,8 +288,7 @@ class GradeValueWidget extends StatelessWidget {
|
||||
shadows: [
|
||||
if (value.weight >= 200)
|
||||
Shadow(
|
||||
color:
|
||||
(contrast ? Colors.white : color).withValues(alpha: .4),
|
||||
color: (contrast ? Colors.white : color).withOpacity(.4),
|
||||
offset: const Offset(-4, -3),
|
||||
)
|
||||
],
|
||||
@ -313,7 +312,7 @@ class GradeValueWidget extends StatelessWidget {
|
||||
width: size * 1.4,
|
||||
height: size * 1.4,
|
||||
decoration: BoxDecoration(
|
||||
color: color.withValues(alpha: contrast ? 1.0 : .25),
|
||||
color: color.withOpacity(contrast ? 1.0 : .25),
|
||||
shape: BoxShape.circle,
|
||||
boxShadow: [
|
||||
if (shadow &&
|
||||
|
@ -75,7 +75,7 @@ class LessonTile extends StatelessWidget {
|
||||
}
|
||||
|
||||
if (lesson.isEmpty) {
|
||||
accent = AppColors.of(context).text.withValues(alpha: 0.6);
|
||||
accent = AppColors.of(context).text.withOpacity(0.6);
|
||||
}
|
||||
|
||||
if (!lesson.studentPresence) {
|
||||
@ -182,8 +182,9 @@ class LessonTile extends StatelessWidget {
|
||||
fontSize: 16.5,
|
||||
color: fill
|
||||
? accent
|
||||
: AppColors.of(context).text.withValues(
|
||||
alpha: !lesson.isEmpty ? 1.0 : 0.5),
|
||||
: AppColors.of(context)
|
||||
.text
|
||||
.withOpacity(!lesson.isEmpty ? 1.0 : 0.5),
|
||||
fontStyle: lesson.subject.isRenamed &&
|
||||
settingsProvider.renamedSubjectsItalics
|
||||
? FontStyle.italic
|
||||
@ -198,10 +199,8 @@ class LessonTile extends StatelessWidget {
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 14.0,
|
||||
color: fill
|
||||
? accent.withValues(alpha: .9)
|
||||
: AppColors.of(context)
|
||||
.text
|
||||
.withValues(alpha: .9),
|
||||
? accent.withOpacity(.9)
|
||||
: AppColors.of(context).text.withOpacity(.9),
|
||||
),
|
||||
),
|
||||
),
|
||||
@ -218,7 +217,7 @@ class LessonTile extends StatelessWidget {
|
||||
// color: Theme.of(context)
|
||||
// .colorScheme
|
||||
// .secondary
|
||||
// .withValues(alpha: .15),
|
||||
// .withOpacity(.15),
|
||||
// borderRadius: BorderRadius.circular(10.0),
|
||||
// ),
|
||||
// child: Text(
|
||||
@ -230,7 +229,7 @@ class LessonTile extends StatelessWidget {
|
||||
// color: Theme.of(context)
|
||||
// .colorScheme
|
||||
// .secondary
|
||||
// .withValues(alpha: .9),
|
||||
// .withOpacity(.9),
|
||||
// ),
|
||||
// ),
|
||||
// )
|
||||
@ -247,11 +246,11 @@ class LessonTile extends StatelessWidget {
|
||||
horizontal: 5.5, vertical: 3.0),
|
||||
decoration: BoxDecoration(
|
||||
color: fill
|
||||
? accent.withValues(alpha: .15)
|
||||
? accent.withOpacity(.15)
|
||||
: Theme.of(context)
|
||||
.colorScheme
|
||||
.tertiary
|
||||
.withValues(alpha: .15),
|
||||
.withOpacity(.15),
|
||||
borderRadius: BorderRadius.circular(10.0),
|
||||
),
|
||||
child: Text(
|
||||
@ -262,11 +261,11 @@ class LessonTile extends StatelessWidget {
|
||||
fontSize: 12.0,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: fill
|
||||
? accent.withValues(alpha: 0.9)
|
||||
? accent.withOpacity(0.9)
|
||||
: Theme.of(context)
|
||||
.colorScheme
|
||||
.secondary
|
||||
.withValues(alpha: .9),
|
||||
.withOpacity(.9),
|
||||
),
|
||||
),
|
||||
),
|
||||
@ -278,9 +277,7 @@ class LessonTile extends StatelessWidget {
|
||||
textAlign: TextAlign.start,
|
||||
style: TextStyle(
|
||||
fontSize: 14.0,
|
||||
color: fill
|
||||
? accent.withValues(alpha: 0.5)
|
||||
: null,
|
||||
color: fill ? accent.withOpacity(0.5) : null,
|
||||
),
|
||||
),
|
||||
],
|
||||
@ -347,7 +344,7 @@ class LessonTile extends StatelessWidget {
|
||||
? Theme.of(context)
|
||||
.colorScheme
|
||||
.secondary
|
||||
.withValues(alpha: .3)
|
||||
.withOpacity(.3)
|
||||
: const Color(0x00000000),
|
||||
borderRadius: BorderRadius.circular(12.0),
|
||||
boxShadow: [
|
||||
@ -356,7 +353,7 @@ class LessonTile extends StatelessWidget {
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.secondary
|
||||
.withValues(alpha: .25),
|
||||
.withOpacity(.25),
|
||||
blurRadius: 6.0,
|
||||
)
|
||||
],
|
||||
@ -389,7 +386,7 @@ class LessonTile extends StatelessWidget {
|
||||
// fontWeight: FontWeight.w500,
|
||||
// color: AppColors.of(context)
|
||||
// .text
|
||||
// .withValues(alpha: .75),
|
||||
// .withOpacity(.75),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
@ -401,11 +398,11 @@ class LessonTile extends StatelessWidget {
|
||||
horizontal: 6.0, vertical: 3.5),
|
||||
decoration: BoxDecoration(
|
||||
color: fill
|
||||
? accent.withValues(alpha: .15)
|
||||
? accent.withOpacity(.15)
|
||||
: Theme.of(context)
|
||||
.colorScheme
|
||||
.tertiary
|
||||
.withValues(alpha: .15),
|
||||
.withOpacity(.15),
|
||||
borderRadius: BorderRadius.circular(10.0),
|
||||
),
|
||||
child: Text(
|
||||
@ -416,11 +413,11 @@ class LessonTile extends StatelessWidget {
|
||||
fontSize: 12.5,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: fill
|
||||
? accent.withValues(alpha: 0.9)
|
||||
? accent.withOpacity(0.9)
|
||||
: Theme.of(context)
|
||||
.colorScheme
|
||||
.secondary
|
||||
.withValues(alpha: .9),
|
||||
.withOpacity(.9),
|
||||
),
|
||||
),
|
||||
),
|
||||
@ -441,10 +438,10 @@ class LessonTile extends StatelessWidget {
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w500,
|
||||
color: fill
|
||||
? accent.withValues(alpha: .9)
|
||||
? accent.withOpacity(.9)
|
||||
: AppColors.of(context)
|
||||
.text
|
||||
.withValues(alpha: .9),
|
||||
.withOpacity(.9),
|
||||
),
|
||||
),
|
||||
],
|
||||
@ -505,8 +502,8 @@ class LessonSubtile extends StatelessWidget {
|
||||
Center(
|
||||
child: SizedBox(
|
||||
width: 30.0,
|
||||
child: Icon(icon,
|
||||
color: iconColor.withValues(alpha: .75), size: 20.0),
|
||||
child:
|
||||
Icon(icon, color: iconColor.withOpacity(.75), size: 20.0),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
@ -518,8 +515,7 @@ class LessonSubtile extends StatelessWidget {
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w500,
|
||||
color:
|
||||
AppColors.of(context).text.withValues(alpha: .65)),
|
||||
color: AppColors.of(context).text.withOpacity(.65)),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
@ -58,8 +58,7 @@ class MessageTile extends StatelessWidget {
|
||||
width: 105,
|
||||
height: 15,
|
||||
decoration: BoxDecoration(
|
||||
color:
|
||||
AppColors.of(context).text.withValues(alpha: .85),
|
||||
color: AppColors.of(context).text.withOpacity(.85),
|
||||
borderRadius: BorderRadius.circular(8.0),
|
||||
),
|
||||
),
|
||||
@ -90,8 +89,7 @@ class MessageTile extends StatelessWidget {
|
||||
width: 150,
|
||||
height: 10,
|
||||
decoration: BoxDecoration(
|
||||
color:
|
||||
AppColors.of(context).text.withValues(alpha: .45),
|
||||
color: AppColors.of(context).text.withOpacity(.45),
|
||||
borderRadius: BorderRadius.circular(8.0),
|
||||
),
|
||||
),
|
||||
@ -111,8 +109,7 @@ class MessageTile extends StatelessWidget {
|
||||
width: 35,
|
||||
height: 15,
|
||||
decoration: BoxDecoration(
|
||||
color:
|
||||
AppColors.of(context).text.withValues(alpha: .45),
|
||||
color: AppColors.of(context).text.withOpacity(.45),
|
||||
borderRadius: BorderRadius.circular(8.0),
|
||||
),
|
||||
),
|
||||
@ -123,7 +120,7 @@ class MessageTile extends StatelessWidget {
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 14.0,
|
||||
color: AppColors.of(context).text.withValues(alpha: .75),
|
||||
color: AppColors.of(context).text.withOpacity(.75),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
@ -58,9 +58,7 @@ extension DateFormatUtils on DateTime {
|
||||
}
|
||||
if (now.year == year &&
|
||||
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;
|
||||
|
||||
|
@ -3,21 +3,21 @@ description: "Egy nem hivatalos e-KRÉTA kliens, diákoktól diákoknak."
|
||||
homepage: https://refilc.hu
|
||||
publish_to: "none"
|
||||
|
||||
version: 5.1.3+287
|
||||
version: 5.0.4+274
|
||||
|
||||
environment:
|
||||
sdk: ^3.6.0
|
||||
sdk: ">=3.3.2 <=3.4.3"
|
||||
|
||||
dependencies:
|
||||
flutter:
|
||||
sdk: flutter
|
||||
cupertino_icons: ^1.0.8
|
||||
cupertino_icons: ^1.0.2
|
||||
|
||||
# reFilc packages
|
||||
refilc_mobile_ui:
|
||||
path: "../refilc_mobile_ui/"
|
||||
# refilc_desktop_ui:
|
||||
# path: "../refilc_desktop_ui/"
|
||||
refilc_desktop_ui:
|
||||
path: "../refilc_desktop_ui/"
|
||||
refilc_kreta_api:
|
||||
path: "../refilc_kreta_api/"
|
||||
refilc_plus:
|
||||
@ -26,59 +26,75 @@ dependencies:
|
||||
flutter_localizations:
|
||||
sdk: flutter
|
||||
i18n_extension: ^12.0.1
|
||||
sqflite: ^2.4.1
|
||||
sqflite: ^2.2.0+2
|
||||
intl: ^0.19.0
|
||||
provider: ^6.1.2
|
||||
http: ^1.3.0
|
||||
uuid: ^4.5.1
|
||||
html: ^0.15.5
|
||||
open_filex: ^4.6.0
|
||||
path_provider: ^2.1.5
|
||||
permission_handler: ^11.3.1
|
||||
share_plus: ^10.1.4
|
||||
connectivity_plus: ^6.1.3
|
||||
provider: ^6.1.1
|
||||
http: ^1.1.2
|
||||
uuid: ^4.2.1
|
||||
html: ^0.15.0
|
||||
open_filex: ^4.3.4
|
||||
# open_file:
|
||||
# git:
|
||||
# url: https://github.com/crazecoder/open_file
|
||||
# ref: master
|
||||
path_provider: ^2.0.2
|
||||
permission_handler: ^11.0.1
|
||||
share_plus: ^9.0.0
|
||||
connectivity_plus: ^6.0.3
|
||||
flutter_displaymode: ^0.6.0
|
||||
quick_actions: ^1.1.0
|
||||
animated_list_plus: ^0.5.2
|
||||
dynamic_color: ^1.7.0
|
||||
material_color_utilities: ^0.11.1
|
||||
crypto: ^3.0.6
|
||||
elegant_notification: ^2.4.1
|
||||
quick_actions: ^1.0.1
|
||||
animated_list_plus: ^0.5.0
|
||||
dynamic_color: ^1.2.2
|
||||
material_color_utilities: ^0.8.0
|
||||
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.3.1
|
||||
lottie: ^3.1.0
|
||||
rive: ^0.12.4
|
||||
animated_background: ^2.0.0
|
||||
dropdown_button2: ^2.3.9
|
||||
home_widget: ^0.7.0+1
|
||||
flutter_expandable_fab: ^2.3.0
|
||||
url_launcher: ^6.3.1
|
||||
flutter_svg: ^2.0.17
|
||||
image_picker: ^1.1.2
|
||||
animations: ^2.0.11
|
||||
background_fetch: ^1.3.7
|
||||
flutter_local_notifications: ^18.0.1
|
||||
package_info_plus: ^8.2.1
|
||||
home_widget:
|
||||
git:
|
||||
url: https://github.com/refilc/home_widget.git
|
||||
ref: flutter-beta
|
||||
flutter_expandable_fab: ^2.0.0
|
||||
uni_links: ^0.5.1
|
||||
url_launcher: ^6.1.6
|
||||
workmanager:
|
||||
git:
|
||||
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
|
||||
flutter_staggered_grid_view: ^0.7.0
|
||||
image_crop_plus: ^1.0.0
|
||||
sqflite_common_ffi_web: ^0.4.0
|
||||
image_crop:
|
||||
git:
|
||||
url: https://github.com/kimaah/image_crop.git
|
||||
googleapis: ^13.2.0
|
||||
google_sign_in: ^6.2.2
|
||||
google_sign_in: ^6.2.1
|
||||
extension_google_sign_in_as_googleapis_auth: ^2.0.12
|
||||
maps_launcher: ^3.0.0+1
|
||||
google_fonts: ^6.2.1
|
||||
get_it: ^7.7.0
|
||||
maps_launcher: ^2.2.0
|
||||
google_fonts: ^6.1.0
|
||||
flutter_stripe: ^10.0.0
|
||||
get_it: ^7.6.7
|
||||
xml: ^6.5.0
|
||||
carousel_slider: ^5.0.0
|
||||
carousel_slider: ^4.2.1
|
||||
flutter_portal: ^1.1.4
|
||||
shake_flutter: ^17.1.0
|
||||
shake_flutter: ^17.0.0
|
||||
|
||||
dev_dependencies:
|
||||
flutter_lints: ^5.0.0
|
||||
flutter_launcher_icons: ^0.14.3
|
||||
flutter_native_splash: ^2.4.4
|
||||
sqflite_common_ffi: ^2.3.4+4
|
||||
dependency_validator: ^5.0.2
|
||||
flutter_lints: ^4.0.0
|
||||
flutter_launcher_icons: "^0.13.1"
|
||||
flutter_native_splash: "^2.3.10"
|
||||
sqflite_common_ffi: ^2.0.0+3
|
||||
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
@ -172,13 +188,13 @@ flutter:
|
||||
flutter_launcher_icons:
|
||||
image_path: assets/icons/ic_android.png
|
||||
android: true
|
||||
adaptive_icon_background: "#7CA021"
|
||||
adaptive_icon_foreground: assets/icons/ic_launcher_foreground.png
|
||||
adaptive_icon_background: "#03112D"
|
||||
adaptive_icon_foreground: assets/icons/ic_android.png
|
||||
ios: false
|
||||
remove_alpha_ios: false
|
||||
|
||||
flutter_native_splash:
|
||||
color: "#7CA021"
|
||||
color: "#03112D"
|
||||
image: assets/icons/ic_splash.png
|
||||
android_12:
|
||||
image: assets/icons/ic_splash.png
|
||||
|
@ -1,5 +1,5 @@
|
||||
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
Version 3, 19 November 2007
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
@ -7,15 +7,17 @@
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU Affero General Public License is a free, copyleft license for
|
||||
software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
our General Public Licenses are intended to guarantee your freedom to
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users.
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
@ -24,34 +26,44 @@ them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing under
|
||||
this license.
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
@ -60,7 +72,7 @@ modification follow.
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
@ -537,45 +549,35 @@ to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your version
|
||||
supports such interaction) an opportunity to receive the Corresponding
|
||||
Source of your version by providing access to the Corresponding Source
|
||||
from a network server at no charge, through some standard or customary
|
||||
means of facilitating copying of software. This Corresponding Source
|
||||
shall include the Corresponding Source for any work covered by version 3
|
||||
of the GNU General Public License that is incorporated pursuant to the
|
||||
following paragraph.
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU General Public License into a single
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the work with which it is combined will remain governed by version
|
||||
3 of the GNU General Public License.
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU Affero General Public License from time to time. Such new versions
|
||||
will be similar in spirit to the present version, but may differ in detail to
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU Affero General
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU Affero General Public License, you may choose any version ever published
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU Affero General Public License can be used, that proxy's
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
@ -633,29 +635,40 @@ the "copyright" line and a pointer to where the full notice is found.
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published
|
||||
by the Free Software Foundation, either version 3 of the License, or
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for the
|
||||
specific requirements.
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|