Compare commits
49 Commits
3.5.1-beta
...
4.0.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d1507f5eae | ||
|
|
f5682e9137 | ||
|
|
139d8869c2 | ||
|
|
29bf0c81dd | ||
|
|
9e510bed2d | ||
|
|
ef7437979c | ||
|
|
b1e68f18b0 | ||
|
|
5e02e697d2 | ||
|
|
bfa77fcfb6 | ||
|
|
bcf9d9688f | ||
|
|
fb0de5a991 | ||
|
|
e6fb8a8a50 | ||
|
|
e93a05f795 | ||
|
|
8c7601c1bc | ||
|
|
5d18354cbb | ||
|
|
7543f946f2 | ||
|
|
e75112b043 | ||
|
|
7b28688925 | ||
|
|
348d575c62 | ||
|
|
e81490ec34 | ||
|
|
ebdac408b0 | ||
|
|
9411208f81 | ||
|
|
9a7f8c06f6 | ||
|
|
0f6e6bfb65 | ||
|
|
8f499bd050 | ||
|
|
80069719f2 | ||
|
|
48c904258a | ||
|
|
1606d9da99 | ||
|
|
87e185f6f1 | ||
|
|
80f1896752 | ||
|
|
1e5e984fe6 | ||
|
|
4f5c36db18 | ||
|
|
8090ff35ec | ||
|
|
3b6af5fe9f | ||
|
|
d10eab19fc | ||
|
|
03a779ea9c | ||
|
|
be269a4a34 | ||
|
|
0e25c68e5a | ||
|
|
364f41e3c4 | ||
|
|
de079bd6ee | ||
|
|
35524589e4 | ||
|
|
cdd8886692 | ||
|
|
4ddf99feb4 | ||
|
|
4ff065d1b4 | ||
|
|
9d355dbc00 | ||
|
|
eb9e433070 | ||
|
|
62694c4bb8 | ||
|
|
5cb4e5c82e | ||
|
|
74caba75d6 |
40
.github/workflows/android.yml
vendored
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
name: Build for Android
|
||||||
|
|
||||||
|
on: workflow_dispatch
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Download Android keystore
|
||||||
|
id: android_keystore
|
||||||
|
uses: timheuer/base64-to-file@v1.0.3
|
||||||
|
with:
|
||||||
|
fileName: upload-keystore.jks
|
||||||
|
encodedString: ${{ secrets.KEYSTORE_BASE64 }}
|
||||||
|
- name: Create key.properties
|
||||||
|
run: |
|
||||||
|
echo "storeFile=${{ steps.android_keystore.outputs.filePath }}" > filcnaplo/android/key.properties
|
||||||
|
echo "storePassword=${{ secrets.STORE_PASSWORD }}" >> filcnaplo/android/key.properties
|
||||||
|
echo "keyPassword=${{ secrets.KEY_PASSWORD }}" >> filcnaplo/android/key.properties
|
||||||
|
echo "keyAlias=${{ secrets.KEY_ALIAS }}" >> filcnaplo/android/key.properties
|
||||||
|
- uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
distribution: "zulu"
|
||||||
|
java-version: "17.x"
|
||||||
|
cache: "gradle"
|
||||||
|
- uses: subosito/flutter-action@v2
|
||||||
|
with:
|
||||||
|
flutter-version: "3.10.2"
|
||||||
|
channel: "stable"
|
||||||
|
cache: "true"
|
||||||
|
- name: Install dependencies
|
||||||
|
run: ./fix-pub.sh
|
||||||
|
- name: Build
|
||||||
|
run: cd filcnaplo && ./build.sh
|
||||||
|
- name: Upload Android Release
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: android-release
|
||||||
|
path: build/outputs/flutter-apk/app-release.apk
|
||||||
65
.github/workflows/ios.yml
vendored
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
name: "Build and Publish iOS"
|
||||||
|
on: workflow_dispatch
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: macos-latest
|
||||||
|
steps:
|
||||||
|
# Checks-out our repository under $GITHUB_WORKSPACE, so our job can access it
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
# Install the Apple certificate and provisioning profile
|
||||||
|
- name: Install the Apple certificate and provisioning profile
|
||||||
|
env:
|
||||||
|
BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
|
||||||
|
P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
|
||||||
|
BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}
|
||||||
|
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
|
||||||
|
run: |
|
||||||
|
# create variables
|
||||||
|
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
|
||||||
|
PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision
|
||||||
|
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
|
||||||
|
# import certificate and provisioning profile from secrets
|
||||||
|
echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode --output $CERTIFICATE_PATH
|
||||||
|
echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode --output $PP_PATH
|
||||||
|
# create temporary keychain
|
||||||
|
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
|
||||||
|
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
|
||||||
|
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
|
||||||
|
# import certificate to keychain
|
||||||
|
security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
|
||||||
|
security list-keychain -d user -s $KEYCHAIN_PATH
|
||||||
|
# apply provisioning profile
|
||||||
|
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
|
||||||
|
cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles
|
||||||
|
# Install flutter
|
||||||
|
- name: Flutter get
|
||||||
|
uses: subosito/flutter-action@v1
|
||||||
|
with:
|
||||||
|
flutter-version: '3.10.2'
|
||||||
|
|
||||||
|
# Install your project's dependencies
|
||||||
|
- name: Install dependencies
|
||||||
|
run: bash fix-pub.sh
|
||||||
|
|
||||||
|
# Build and sign the ipa using a single flutter command
|
||||||
|
- name: Building IPA
|
||||||
|
working-directory: filcnaplo
|
||||||
|
run: bash build-ipa.sh
|
||||||
|
|
||||||
|
# Collect the file and upload as artifact
|
||||||
|
- name: collect ipa artifacts
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: release-ipa
|
||||||
|
# Path to the release files
|
||||||
|
path: filcnaplo/build/ios/ipa/*.ipa
|
||||||
|
|
||||||
|
# Important! Cleanup: remove the certificate and provisioning profile from the runner!
|
||||||
|
- name: Clean up keychain and provisioning profile
|
||||||
|
if: ${{ always() }}
|
||||||
|
run: |
|
||||||
|
security delete-keychain $RUNNER_TEMP/app-signing.keychain-db
|
||||||
|
rm ~/Library/MobileDevice/Provisioning\ Profiles/build_pp.mobileprovision
|
||||||
24
.vscode/launch.json
vendored
@@ -1,7 +1,4 @@
|
|||||||
{
|
{
|
||||||
// Use IntelliSense to learn about possible attributes.
|
|
||||||
// Hover to view descriptions of existing attributes.
|
|
||||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
{
|
{
|
||||||
@@ -10,8 +7,27 @@
|
|||||||
"request": "launch",
|
"request": "launch",
|
||||||
"type": "dart",
|
"type": "dart",
|
||||||
"toolArgs": [
|
"toolArgs": [
|
||||||
"--dart-define=APPVER=$(cat pubspec.yaml | grep version: | cut -d' ' -f2 | cut -d+ -f1) --release"
|
"--dart-define=APPVER=$(cat pubspec.yaml | grep version: | cut -d' ' -f2 | cut -d+ -f1)"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "filcnaplo release",
|
||||||
|
"cwd": "filcnaplo release",
|
||||||
|
"request": "launch",
|
||||||
|
"type": "dart",
|
||||||
|
"flutterMode": "release",
|
||||||
|
"program": "lib/main.dart",
|
||||||
|
"toolArgs": [
|
||||||
|
"--dart-define=APPVER=$(cat pubspec.yaml | grep version: | cut -d' ' -f2 | cut -d+ -f1)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Flutter",
|
||||||
|
"program": "lib/main.dart",
|
||||||
|
"cwd": "filcnaplo",
|
||||||
|
"request": "launch",
|
||||||
|
"type": "dart",
|
||||||
|
"flutterMode": "release"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -5,17 +5,17 @@ A folytatáshoz szükséged lesz egy Linuxot vagy Windowst futtató számítóg
|
|||||||
Segít, ha nem csak kicsit tudsz programozni, és ha ismered a Gitet és a GitHubot ;)
|
Segít, ha nem csak kicsit tudsz programozni, és ha ismered a Gitet és a GitHubot ;)
|
||||||
|
|
||||||
## Miben segítsek?
|
## Miben segítsek?
|
||||||
Kérünk, **olyan dologgal járulj hozzá** a Filchez, ami valószínűleg **sok embernek hasznos lesz** majd. Szeretnénk egy minél teljeskörűbb iskolai asszisztenst létrehozni, de az iskolaspecifikus, vagy külön neked hasznos funkciók helye inkább legyen a saját forkod.
|
Kérünk, **olyan dologgal járulj hozzá** a reFilchez, ami valószínűleg **sok embernek hasznos lesz** majd. Szeretnénk egy minél teljeskörűbb iskolai asszisztenst létrehozni, de az iskolaspecifikus, vagy külön neked hasznos funkciók helye inkább legyen a saját forkod.
|
||||||
|
|
||||||
Fontos, hogy **mielőtt egy nagy volumenű projektbe belekezdesz, futtasd meg ötletedet a [Discord szerverünkön](https://filcnaplo.hu/discord),** ahol még azelőtt tudunk tanácsot adni, mielőtt sok-sok órát beleöltél volna egy esetleg felesleges dologba.
|
Fontos, hogy **mielőtt egy nagy volumenű projektbe belekezdesz, futtasd meg ötletedet a [Discord szerverünkön](https://dc.refilc.hu/),** ahol még azelőtt tudunk tanácsot adni, mielőtt sok-sok órát beleöltél volna egy esetleg felesleges dologba.
|
||||||
|
|
||||||
A legjobban annak örülünk, ha az [Issues](https://github.com/filcnaplo/filcnaplo/issues) oldalról szemezgetsz, **ha lehet, a [priority taggel megjelöltekkel kezdd](https://github.com/filcnaplo/filcnaplo/issues?q=is%3Aissue+is%3Aopen+label%3Apriority),** vagy ha új vagy a Flutterhez, ajánljuk figyelmedbe [ezeket a viszonylag könnyen javítható hibákat](https://github.com/filcnaplo/filcnaplo/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) (ha épp van ilyen).
|
A legjobban annak örülünk, ha az [Issues](https://github.com/refilc/filcnaplo/issues) oldalról szemezgetsz, **ha lehet, a [priority taggel megjelöltekkel kezdd](https://github.com/refilc/filcnaplo/issues?q=is%3Aissue+is%3Aopen+label%3Apriority),** vagy ha új vagy a Flutterhez, ajánljuk figyelmedbe [ezeket a viszonylag könnyen javítható hibákat](https://github.com/refilc/filcnaplo/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) (ha épp van ilyen).
|
||||||
|
|
||||||
## Hogyan segítsek?
|
## Hogyan segítsek?
|
||||||
|
|
||||||
Nem ígérhetünk itt sem programozás-, sem git-kurzust, de a projektspecifikus dolgokat leírjuk, és segítünk a Flutter feltelepítésében.
|
Nem ígérhetünk itt sem programozás-, sem git-kurzust, de a projektspecifikus dolgokat leírjuk, és segítünk a Flutter feltelepítésében.
|
||||||
|
|
||||||
A Filc a Google által pár éve létrehozott **[Fluttert](https://flutter.dev/)** használja, aminek nyelve a **[Dart](https://dart.dev/)**. Ha ismered a C#-ot, Javát, C++t, vagy egyéb hasonló nyelvet, **nem fog gondot okozni a használata.** A felhasználói felület létrehozásában az is segíthet, ha foglalkoztál már korábban weboldalakkal.
|
A reFilc a Google által pár éve létrehozott **[Fluttert](https://flutter.dev/)** használja, aminek nyelve a **[Dart](https://dart.dev/)**. Ha ismered a C#-ot, Javát, C++t, vagy egyéb hasonló nyelvet, **nem fog gondot okozni a használata.** A felhasználói felület létrehozásában az is segíthet, ha foglalkoztál már korábban weboldalakkal.
|
||||||
Ha még nem használtál Fluttert, mindenképp böngészd át a [YouTube csatornájukat](https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw).
|
Ha még nem használtál Fluttert, mindenképp böngészd át a [YouTube csatornájukat](https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw).
|
||||||
Könnyen tudsz kódot, vagy akár UI-t is tesztelni a [DartPad](https://dartpad.dev/) oldalon.
|
Könnyen tudsz kódot, vagy akár UI-t is tesztelni a [DartPad](https://dartpad.dev/) oldalon.
|
||||||
|
|
||||||
@@ -24,10 +24,10 @@ Fontos: **Legyél a flutter beta verzióján!** Írd be: `flutter channel beta`
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
Ha nem értesz a Githez, ajánljuk figyelmedbe [ezt a cikket](https://medium.com/envienta-magyarorsz%C3%A1g/git-%C3%A9s-github-gyorstalpal%C3%B3-f2d78a732deb). Viszont arra kérünk, a Git használatát ne a Filcen próbáld ki először, hozz létre előbb egy saját Repót, és abba tesztelgess. Ha már nagyjából kitapasztaltad, várjuk hozzájárulásodat.
|
Ha nem értesz a Githez, ajánljuk figyelmedbe [ezt a cikket](https://medium.com/envienta-magyarorsz%C3%A1g/git-%C3%A9s-github-gyorstalpal%C3%B3-f2d78a732deb). Viszont arra kérünk, a Git használatát ne a reFilcen próbáld ki először, hozz létre előbb egy saját Repót, és abba tesztelgess. Ha már nagyjából kitapasztaltad, várjuk hozzájárulásodat.
|
||||||
|
|
||||||
Készíts egy forkot a saját fiókod alá.
|
Készíts egy forkot a saját fiókod alá.
|
||||||
A Filc legfrissebb, épp fejlesztés alatt álló verzióját a [dev brancen](https://github.com/filcnaplo/filcnaplo/tree/dev) találod, kérjük ide commitolj, és ide célozd a forkodból a Pull Requested. Írd le benne, mit változtattál, és ha lehet, csatolj képernyőképet is.
|
A reFilc legfrissebb, épp fejlesztés alatt álló verzióját a [dev brancen](https://github.com/refilc/filcnaplo/tree/dev) találod, kérjük ide commitolj, és ide célozd a forkodból a Pull Requested. Írd le benne, mit változtattál, és ha lehet, csatolj képernyőképet is.
|
||||||
Minél gyakrabban készíts minél részletesebben elnevezett commitokat, hogy el tudjunk tájékozódni az általad beküldött kódon.
|
Minél gyakrabban készíts minél részletesebben elnevezett commitokat, hogy el tudjunk tájékozódni az általad beküldött kódon.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
2
LICENSE
@@ -1,6 +1,6 @@
|
|||||||
BSD 3-Clause License
|
BSD 3-Clause License
|
||||||
|
|
||||||
Copyright (c) 2021, Filc
|
Copyright (c) 2023, reFilc
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
|||||||
12
README.md
@@ -18,13 +18,7 @@ cd naplo
|
|||||||
|
|
||||||
### Install packages
|
### Install packages
|
||||||
|
|
||||||
```sh
|
Run `fix-pub.sh`
|
||||||
cd filcnaplo && flutter pub get && cd ..
|
|
||||||
cd filcnaplo_mobile_ui && flutter pub get && cd ..
|
|
||||||
cd filcnaplo_desktop_ui && flutter pub get && cd ..
|
|
||||||
cd filcnaplo_kreta_api && flutter pub get && cd ..
|
|
||||||
cd filcnaplo_premium && flutter pub get && cd ..
|
|
||||||
```
|
|
||||||
|
|
||||||
### Run the app
|
### Run the app
|
||||||
|
|
||||||
@@ -33,6 +27,10 @@ cd filcnaplo
|
|||||||
flutter run
|
flutter run
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Contribution
|
||||||
|
|
||||||
|
Az összes (ugyan azon verzióhoz tartozó) contribution meg fog jelenni a release-nél. Kérjük, írd le a Discord nevedet a Description-be, hogy adhassunk rangot.
|
||||||
|
|
||||||
-------
|
-------
|
||||||
|
|
||||||
# Kudo
|
# Kudo
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ apply plugin: 'kotlin-android'
|
|||||||
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
||||||
|
|
||||||
def keystoreProperties = new Properties()
|
def keystoreProperties = new Properties()
|
||||||
def keystorePropertiesFile = rootProject.file("filc3.properties")
|
def keystorePropertiesFile = rootProject.file("key.properties")
|
||||||
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
|
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
|
||||||
|
|
||||||
android {
|
android {
|
||||||
@@ -44,7 +44,7 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "hu.filc.naplo"
|
applicationId "hu.refilc.naplo"
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||||
versionCode flutterVersionCode.toInteger()
|
versionCode flutterVersionCode.toInteger()
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="hu.filc.naplo">
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="hu.refilc.naplo">
|
||||||
<!-- Permissions -->
|
<!-- Permissions -->
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
<uses-permission android:name="android.permission.VIBRATE" />
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools" package="hu.filc.naplo">
|
xmlns:tools="http://schemas.android.com/tools" package="hu.refilc.naplo">
|
||||||
<application android:label="reFilc" tools:replace="android:label" android:icon="@mipmap/ic_launcher"
|
<application android:label="reFilc" tools:replace="android:label" android:icon="@mipmap/ic_launcher"
|
||||||
android:requestLegacyExternalStorage="true">
|
android:requestLegacyExternalStorage="true">
|
||||||
<activity android:exported="true" android:name=".MainActivity"
|
<activity android:exported="true" android:name=".MainActivity"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package hu.filc.naplo;
|
package hu.refilc.naplo;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 844 B |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 450 B |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 8.5 KiB |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 155 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 28 KiB |
@@ -1,4 +1,4 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="hu.filc.naplo">
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="hu.refilc.naplo">
|
||||||
<!-- Permissions -->
|
<!-- Permissions -->
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
<uses-permission android:name="android.permission.VIBRATE" />
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ buildscript {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:4.2.2'
|
classpath 'com.android.tools.build:gradle:7.1.1'
|
||||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
storePassword=filc3fix
|
|
||||||
keyPassword=filc3fix
|
|
||||||
keyAlias=upload
|
|
||||||
storeFile=C:/Users/Peti/upload-keystore.jks
|
|
||||||
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 123 KiB |
|
Before Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 105 KiB |
|
Before Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 104 KiB |
|
Before Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 102 KiB |
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 67 KiB |
3
filcnaplo/build-ipa.sh
Executable file
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
flutter build ipa --release --dart-define=APPVER=$(cat pubspec.yaml | grep version: | cut -d' ' -f2 | cut -d+ -f1) --no-tree-shake-icons
|
||||||
@@ -1,13 +1,3 @@
|
|||||||
#!/usr/bin/env fish
|
#!/bin/sh
|
||||||
|
|
||||||
# With build number
|
flutter build apk --release --dart-define=APPVER=$(cat pubspec.yaml | grep version: | cut -d' ' -f2 | cut -d+ -f1) --no-tree-shake-icons
|
||||||
function get_version_bn
|
|
||||||
cat pubspec.yaml | grep version: | cut -d' ' -f2
|
|
||||||
end
|
|
||||||
|
|
||||||
function get_version
|
|
||||||
cat pubspec.yaml | grep version: | cut -d' ' -f2 | cut -d+ -f1
|
|
||||||
end
|
|
||||||
|
|
||||||
flutter build apk --release --dart-define=APPVER=(get_version) --no-tree-shake-icons && \
|
|
||||||
cp -v "build/app/outputs/flutter-apk/app-release.apk" ~/"Desktop/hu.filc.naplo_"(get_version_bn).apk
|
|
||||||
|
|||||||
15
filcnaplo/ios/Flutter/Generated 2.xcconfig
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
// This is a generated file; do not edit or check into version control.
|
||||||
|
FLUTTER_ROOT=/Users/kima/development/flutter
|
||||||
|
FLUTTER_APPLICATION_PATH=/Users/kima/Documents/refilc/app/naplo/filcnaplo
|
||||||
|
COCOAPODS_PARALLEL_CODE_SIGN=true
|
||||||
|
FLUTTER_TARGET=/Users/kima/Documents/refilc/app/naplo/filcnaplo/lib/main.dart
|
||||||
|
FLUTTER_BUILD_DIR=build
|
||||||
|
FLUTTER_BUILD_NAME=3.5.1
|
||||||
|
FLUTTER_BUILD_NUMBER=197
|
||||||
|
EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386
|
||||||
|
EXCLUDED_ARCHS[sdk=iphoneos*]=armv7
|
||||||
|
DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==,RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC9iNGZiMTEyMTRkZDJkZGE2Y2UwMTJkZDk4ZWE0OThlOWU4YjkxMjYyLw==
|
||||||
|
DART_OBFUSCATION=false
|
||||||
|
TRACK_WIDGET_CREATION=true
|
||||||
|
TREE_SHAKE_ICONS=false
|
||||||
|
PACKAGE_CONFIG=/Users/kima/Documents/refilc/app/naplo/filcnaplo/.dart_tool/package_config.json
|
||||||
@@ -77,6 +77,8 @@ PODS:
|
|||||||
- Mantle/extobjc (2.2.0)
|
- Mantle/extobjc (2.2.0)
|
||||||
- open_file (0.0.1):
|
- open_file (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
|
- package_info_plus (0.4.5):
|
||||||
|
- Flutter
|
||||||
- path_provider_foundation (0.0.1):
|
- path_provider_foundation (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
@@ -120,6 +122,7 @@ DEPENDENCIES:
|
|||||||
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
||||||
- live_activities (from `.symlinks/plugins/live_activities/ios`)
|
- live_activities (from `.symlinks/plugins/live_activities/ios`)
|
||||||
- open_file (from `.symlinks/plugins/open_file/ios`)
|
- open_file (from `.symlinks/plugins/open_file/ios`)
|
||||||
|
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
||||||
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
|
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
|
||||||
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
|
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
|
||||||
- quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`)
|
- quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`)
|
||||||
@@ -171,6 +174,8 @@ EXTERNAL SOURCES:
|
|||||||
:path: ".symlinks/plugins/live_activities/ios"
|
:path: ".symlinks/plugins/live_activities/ios"
|
||||||
open_file:
|
open_file:
|
||||||
:path: ".symlinks/plugins/open_file/ios"
|
:path: ".symlinks/plugins/open_file/ios"
|
||||||
|
package_info_plus:
|
||||||
|
:path: ".symlinks/plugins/package_info_plus/ios"
|
||||||
path_provider_foundation:
|
path_provider_foundation:
|
||||||
:path: ".symlinks/plugins/path_provider_foundation/darwin"
|
:path: ".symlinks/plugins/path_provider_foundation/darwin"
|
||||||
permission_handler_apple:
|
permission_handler_apple:
|
||||||
@@ -213,6 +218,7 @@ SPEC CHECKSUMS:
|
|||||||
live_activities: 9ff56a06a2d43ecd68f56deeed13b18a8304789c
|
live_activities: 9ff56a06a2d43ecd68f56deeed13b18a8304789c
|
||||||
Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d
|
Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d
|
||||||
open_file: 02eb5cb6b21264bd3a696876f5afbfb7ca4f4b7d
|
open_file: 02eb5cb6b21264bd3a696876f5afbfb7ca4f4b7d
|
||||||
|
package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e
|
||||||
path_provider_foundation: eaf5b3e458fc0e5fbb9940fb09980e853fe058b8
|
path_provider_foundation: eaf5b3e458fc0e5fbb9940fb09980e853fe058b8
|
||||||
permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce
|
permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce
|
||||||
quick_actions_ios: 9e80dcfadfbc5d47d9cf8f47bcf428b11cf383d4
|
quick_actions_ios: 9e80dcfadfbc5d47d9cf8f47bcf428b11cf383d4
|
||||||
|
|||||||
@@ -478,7 +478,7 @@
|
|||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||||
CURRENT_PROJECT_VERSION = 195;
|
CURRENT_PROJECT_VERSION = 195;
|
||||||
DEVELOPMENT_TEAM = JWGEQSC9U7;
|
DEVELOPMENT_TEAM = 48XS7JAZB7;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = reFilc;
|
INFOPLIST_KEY_CFBundleDisplayName = reFilc;
|
||||||
@@ -488,7 +488,7 @@
|
|||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 3.6.0;
|
MARKETING_VERSION = 3.6.0;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = hu.refilc.naplo;
|
PRODUCT_BUNDLE_IDENTIFIER = com.refilc.naplo;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
@@ -510,7 +510,7 @@
|
|||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
DEVELOPMENT_TEAM = JWGEQSC9U7;
|
DEVELOPMENT_TEAM = 48XS7JAZB7;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
INFOPLIST_FILE = livecard/Info.plist;
|
INFOPLIST_FILE = livecard/Info.plist;
|
||||||
@@ -526,7 +526,7 @@
|
|||||||
MARKETING_VERSION = 1.0;
|
MARKETING_VERSION = 1.0;
|
||||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = hu.refilc.naplo.livecardpro;
|
PRODUCT_BUNDLE_IDENTIFIER = com.refilc.naplo.livecardpro;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
@@ -552,7 +552,7 @@
|
|||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
DEVELOPMENT_TEAM = JWGEQSC9U7;
|
DEVELOPMENT_TEAM = 48XS7JAZB7;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
INFOPLIST_FILE = livecard/Info.plist;
|
INFOPLIST_FILE = livecard/Info.plist;
|
||||||
@@ -567,7 +567,7 @@
|
|||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0;
|
MARKETING_VERSION = 1.0;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = hu.refilc.naplo.livecardpro;
|
PRODUCT_BUNDLE_IDENTIFIER = com.refilc.naplo.livecardpro;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
@@ -592,7 +592,7 @@
|
|||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
DEVELOPMENT_TEAM = JWGEQSC9U7;
|
DEVELOPMENT_TEAM = 48XS7JAZB7;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
INFOPLIST_FILE = livecard/Info.plist;
|
INFOPLIST_FILE = livecard/Info.plist;
|
||||||
@@ -607,7 +607,7 @@
|
|||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0;
|
MARKETING_VERSION = 1.0;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = hu.refilc.naplo.livecardpro;
|
PRODUCT_BUNDLE_IDENTIFIER = com.refilc.naplo.livecardpro;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
@@ -736,7 +736,7 @@
|
|||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||||
CURRENT_PROJECT_VERSION = 195;
|
CURRENT_PROJECT_VERSION = 195;
|
||||||
DEVELOPMENT_TEAM = JWGEQSC9U7;
|
DEVELOPMENT_TEAM = 48XS7JAZB7;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = reFilc;
|
INFOPLIST_KEY_CFBundleDisplayName = reFilc;
|
||||||
@@ -746,7 +746,7 @@
|
|||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 3.6.0;
|
MARKETING_VERSION = 3.6.0;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = hu.refilc.naplo;
|
PRODUCT_BUNDLE_IDENTIFIER = com.refilc.naplo;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
@@ -764,7 +764,7 @@
|
|||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||||
CURRENT_PROJECT_VERSION = 195;
|
CURRENT_PROJECT_VERSION = 195;
|
||||||
DEVELOPMENT_TEAM = JWGEQSC9U7;
|
DEVELOPMENT_TEAM = 48XS7JAZB7;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = reFilc;
|
INFOPLIST_KEY_CFBundleDisplayName = reFilc;
|
||||||
@@ -774,7 +774,7 @@
|
|||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 3.6.0;
|
MARKETING_VERSION = 3.6.0;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = hu.refilc.naplo;
|
PRODUCT_BUNDLE_IDENTIFIER = com.refilc.naplo;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 610 KiB |
|
Before Width: | Height: | Size: 585 B |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 887 B |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 8.9 KiB |
|
Before Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 9.5 KiB |
|
Before Width: | Height: | Size: 11 KiB |
@@ -1,71 +1,71 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
<key>BGTaskSchedulerPermittedIdentifiers</key>
|
<key>BGTaskSchedulerPermittedIdentifiers</key>
|
||||||
<array>
|
<array>
|
||||||
<string>com.transistorsoft.fetch</string>
|
<string>com.transistorsoft.fetch</string>
|
||||||
</array>
|
</array>
|
||||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>$(EXECUTABLE_NAME)</string>
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
<string>6.0</string>
|
<string>6.0</string>
|
||||||
<key>CFBundleName</key>
|
<key>CFBundleName</key>
|
||||||
<string>Filc Napló</string>
|
<string>reFilc</string>
|
||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>$(FLUTTER_BUILD_NAME)</string>
|
<string>$(FLUTTER_BUILD_NAME)</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
||||||
<key>ITSAppUsesNonExemptEncryption</key>
|
<key>ITSAppUsesNonExemptEncryption</key>
|
||||||
<false/>
|
<false/>
|
||||||
<key>LSApplicationQueriesSchemes</key>
|
<key>LSApplicationQueriesSchemes</key>
|
||||||
<array>
|
<array>
|
||||||
<string>https</string>
|
<string>https</string>
|
||||||
<string>http</string>
|
<string>http</string>
|
||||||
</array>
|
</array>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>NSPhotoLibraryUsageDescription</key>
|
<key>NSPhotoLibraryUsageDescription</key>
|
||||||
<string>The app requires the photo library to set a custom profile picture.</string>
|
<string>The app requires the photo library to set a custom profile picture.</string>
|
||||||
<key>NSSupportsLiveActivities</key>
|
<key>NSSupportsLiveActivities</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>UIBackgroundModes</key>
|
<key>UIBackgroundModes</key>
|
||||||
<array>
|
<array>
|
||||||
<string>fetch</string>
|
<string>fetch</string>
|
||||||
<string>processing</string>
|
<string>processing</string>
|
||||||
</array>
|
</array>
|
||||||
<key>UILaunchStoryboardName</key>
|
<key>UILaunchStoryboardName</key>
|
||||||
<string>LaunchScreen</string>
|
<string>LaunchScreen</string>
|
||||||
<key>UIMainStoryboardFile</key>
|
<key>UIMainStoryboardFile</key>
|
||||||
<string>Main</string>
|
<string>Main</string>
|
||||||
<key>UIStatusBarHidden</key>
|
<key>UIStatusBarHidden</key>
|
||||||
<false/>
|
<false/>
|
||||||
<key>UISupportedInterfaceOrientations</key>
|
<key>UISupportedInterfaceOrientations</key>
|
||||||
<array>
|
<array>
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
</array>
|
</array>
|
||||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||||
<array>
|
<array>
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
</array>
|
</array>
|
||||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||||
<false/>
|
<false/>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -12,18 +12,18 @@ import 'package:connectivity_plus/connectivity_plus.dart';
|
|||||||
|
|
||||||
class FilcAPI {
|
class FilcAPI {
|
||||||
// Public API
|
// Public API
|
||||||
static const schoolList = "https://filcnaplo.hu/v2/school_list.json";
|
static const schoolList = "https://api.refilc.hu/v1/public/school-list";
|
||||||
static const news = "https://filcnaplo.hu/v2/news.json";
|
static const news = "https://api.refilc.hu/v1/public/news";
|
||||||
static const supporters = "https://api.filcnaplo.hu/sponsors";
|
static const supporters = "https://api.refilc.hu/v1/public/supporters";
|
||||||
|
|
||||||
// Private API
|
// Private API
|
||||||
static const config = "https://api.filcnaplo.hu/config";
|
static const config = "https://api.refilc.hu/v1/private/config";
|
||||||
static const reportApi = "https://api.filcnaplo.hu/report";
|
static const reportApi = "https://api.refilc.hu/v1/private/crash-report";
|
||||||
static const premiumApi = "https://api.filcnaplo.hu/premium/activate";
|
static const premiumApi = "https://api.filcnaplo.hu/premium/activate";
|
||||||
// static const premiumScopesApi = "https://api.filcnaplo.hu/premium/scopes";
|
// static const premiumScopesApi = "https://api.filcnaplo.hu/premium/scopes";
|
||||||
|
|
||||||
// Updates
|
// Updates
|
||||||
static const repo = "filc/naplo";
|
static const repo = "refilc/naplo";
|
||||||
static const releases = "https://api.github.com/repos/$repo/releases";
|
static const releases = "https://api.github.com/repos/$repo/releases";
|
||||||
|
|
||||||
static Future<bool> checkConnectivity() async =>
|
static Future<bool> checkConnectivity() async =>
|
||||||
@@ -68,6 +68,7 @@ class FilcAPI {
|
|||||||
http.Response res = await http.get(Uri.parse(config), headers: headers);
|
http.Response res = await http.get(Uri.parse(config), headers: headers);
|
||||||
|
|
||||||
if (res.statusCode == 200) {
|
if (res.statusCode == 200) {
|
||||||
|
print(jsonDecode(res.body));
|
||||||
return Config.fromJson(jsonDecode(res.body));
|
return Config.fromJson(jsonDecode(res.body));
|
||||||
} else if (res.statusCode == 429) {
|
} else if (res.statusCode == 429) {
|
||||||
res = await http.get(Uri.parse(config));
|
res = await http.get(Uri.parse(config));
|
||||||
|
|||||||
@@ -21,11 +21,20 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:filcnaplo/api/nonce.dart';
|
import 'package:filcnaplo/api/nonce.dart';
|
||||||
|
|
||||||
enum LoginState { missingFields, invalidGrant, failed, normal, inProgress, success }
|
enum LoginState {
|
||||||
|
missingFields,
|
||||||
|
invalidGrant,
|
||||||
|
failed,
|
||||||
|
normal,
|
||||||
|
inProgress,
|
||||||
|
success
|
||||||
|
}
|
||||||
|
|
||||||
Nonce getNonce(String nonce, String username, String instituteCode) {
|
Nonce getNonce(String nonce, String username, String instituteCode) {
|
||||||
Nonce nonceEncoder = Nonce(key: [98, 97, 83, 115, 120, 79, 119, 108, 85, 49, 106, 77], nonce: nonce);
|
Nonce nonceEncoder = Nonce(
|
||||||
nonceEncoder.encode(instituteCode.toUpperCase() + nonce + username.toUpperCase());
|
key: [98, 97, 83, 115, 120, 79, 119, 108, 85, 49, 106, 77], nonce: nonce);
|
||||||
|
nonceEncoder
|
||||||
|
.encode(instituteCode.toUpperCase() + nonce + username.toUpperCase());
|
||||||
|
|
||||||
return nonceEncoder;
|
return nonceEncoder;
|
||||||
}
|
}
|
||||||
@@ -38,24 +47,27 @@ Future loginApi({
|
|||||||
void Function(User)? onLogin,
|
void Function(User)? onLogin,
|
||||||
void Function()? onSuccess,
|
void Function()? onSuccess,
|
||||||
}) async {
|
}) async {
|
||||||
Provider.of<KretaClient>(context, listen: false).userAgent = Provider.of<SettingsProvider>(context, listen: false).config.userAgent;
|
Provider.of<KretaClient>(context, listen: false).userAgent =
|
||||||
|
Provider.of<SettingsProvider>(context, listen: false).config.userAgent;
|
||||||
|
|
||||||
Map<String, String> headers = {
|
Map<String, String> headers = {
|
||||||
"content-type": "application/x-www-form-urlencoded",
|
"content-type": "application/x-www-form-urlencoded",
|
||||||
};
|
};
|
||||||
|
|
||||||
String nonceStr = await Provider.of<KretaClient>(context, listen: false).getAPI(KretaAPI.nonce, json: false);
|
String nonceStr = await Provider.of<KretaClient>(context, listen: false)
|
||||||
|
.getAPI(KretaAPI.nonce, json: false);
|
||||||
|
|
||||||
Nonce nonce = getNonce(nonceStr, username, instituteCode);
|
Nonce nonce = getNonce(nonceStr, username, instituteCode);
|
||||||
headers.addAll(nonce.header());
|
headers.addAll(nonce.header());
|
||||||
|
|
||||||
Map? res = await Provider.of<KretaClient>(context, listen: false).postAPI(KretaAPI.login,
|
Map? res = await Provider.of<KretaClient>(context, listen: false)
|
||||||
headers: headers,
|
.postAPI(KretaAPI.login,
|
||||||
body: User.loginBody(
|
headers: headers,
|
||||||
username: username,
|
body: User.loginBody(
|
||||||
password: password,
|
username: username,
|
||||||
instituteCode: instituteCode,
|
password: password,
|
||||||
));
|
instituteCode: instituteCode,
|
||||||
|
));
|
||||||
if (res != null) {
|
if (res != null) {
|
||||||
if (res.containsKey("error")) {
|
if (res.containsKey("error")) {
|
||||||
if (res["error"] == "invalid_grant") {
|
if (res["error"] == "invalid_grant") {
|
||||||
@@ -64,8 +76,11 @@ Future loginApi({
|
|||||||
} else {
|
} else {
|
||||||
if (res.containsKey("access_token")) {
|
if (res.containsKey("access_token")) {
|
||||||
try {
|
try {
|
||||||
Provider.of<KretaClient>(context, listen: false).accessToken = res["access_token"];
|
Provider.of<KretaClient>(context, listen: false).accessToken =
|
||||||
Map? studentJson = await Provider.of<KretaClient>(context, listen: false).getAPI(KretaAPI.student(instituteCode));
|
res["access_token"];
|
||||||
|
Map? studentJson =
|
||||||
|
await Provider.of<KretaClient>(context, listen: false)
|
||||||
|
.getAPI(KretaAPI.student(instituteCode));
|
||||||
Student student = Student.fromJson(studentJson!);
|
Student student = Student.fromJson(studentJson!);
|
||||||
var user = User(
|
var user = User(
|
||||||
username: username,
|
username: username,
|
||||||
@@ -79,7 +94,9 @@ Future loginApi({
|
|||||||
if (onLogin != null) onLogin(user);
|
if (onLogin != null) onLogin(user);
|
||||||
|
|
||||||
// Store User in the database
|
// Store User in the database
|
||||||
await Provider.of<DatabaseProvider>(context, listen: false).store.storeUser(user);
|
await Provider.of<DatabaseProvider>(context, listen: false)
|
||||||
|
.store
|
||||||
|
.storeUser(user);
|
||||||
Provider.of<UserProvider>(context, listen: false).addUser(user);
|
Provider.of<UserProvider>(context, listen: false).addUser(user);
|
||||||
Provider.of<UserProvider>(context, listen: false).setUser(user.id);
|
Provider.of<UserProvider>(context, listen: false).setUser(user.id);
|
||||||
|
|
||||||
@@ -87,7 +104,8 @@ Future loginApi({
|
|||||||
try {
|
try {
|
||||||
await Future.wait([
|
await Future.wait([
|
||||||
Provider.of<GradeProvider>(context, listen: false).fetch(),
|
Provider.of<GradeProvider>(context, listen: false).fetch(),
|
||||||
Provider.of<TimetableProvider>(context, listen: false).fetch(week: Week.current()),
|
Provider.of<TimetableProvider>(context, listen: false)
|
||||||
|
.fetch(week: Week.current()),
|
||||||
Provider.of<ExamProvider>(context, listen: false).fetch(),
|
Provider.of<ExamProvider>(context, listen: false).fetch(),
|
||||||
Provider.of<HomeworkProvider>(context, listen: false).fetch(),
|
Provider.of<HomeworkProvider>(context, listen: false).fetch(),
|
||||||
Provider.of<MessageProvider>(context, listen: false).fetchAll(),
|
Provider.of<MessageProvider>(context, listen: false).fetchAll(),
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import 'dart:io';
|
|||||||
import 'package:filcnaplo/api/client.dart';
|
import 'package:filcnaplo/api/client.dart';
|
||||||
import 'package:filcnaplo/models/release.dart';
|
import 'package:filcnaplo/models/release.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:package_info_plus/package_info_plus.dart';
|
||||||
|
|
||||||
class UpdateProvider extends ChangeNotifier {
|
class UpdateProvider extends ChangeNotifier {
|
||||||
// Private
|
// Private
|
||||||
@@ -20,9 +21,11 @@ class UpdateProvider extends ChangeNotifier {
|
|||||||
_releases = List.castFrom(initialReleases);
|
_releases = List.castFrom(initialReleases);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const currentVersion = String.fromEnvironment("APPVER", defaultValue: "1.0");
|
|
||||||
|
|
||||||
Future<void> fetch() async {
|
Future<void> fetch() async {
|
||||||
|
late String currentVersion;
|
||||||
|
PackageInfo packageInfo = await PackageInfo.fromPlatform();
|
||||||
|
currentVersion = packageInfo.version;
|
||||||
|
|
||||||
if (!Platform.isAndroid) return;
|
if (!Platform.isAndroid) return;
|
||||||
|
|
||||||
_releases = await FilcAPI.getReleases() ?? [];
|
_releases = await FilcAPI.getReleases() ?? [];
|
||||||
@@ -30,10 +33,30 @@ class UpdateProvider extends ChangeNotifier {
|
|||||||
|
|
||||||
// Check for new releases
|
// Check for new releases
|
||||||
if (_releases.isNotEmpty) {
|
if (_releases.isNotEmpty) {
|
||||||
_available = _releases.first.version.compareTo(Version.fromString(currentVersion)) == 1;
|
_available = _releases.first.version
|
||||||
|
.compareTo(Version.fromString(currentVersion)) ==
|
||||||
|
1;
|
||||||
// ignore: avoid_print
|
// ignore: avoid_print
|
||||||
if (_available) print("INFO: New update: ${releases.first.version}");
|
if (_available) print("INFO: New update: ${releases.first.version}");
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<Map> installedVersion() async {
|
||||||
|
PackageInfo packageInfo = await PackageInfo.fromPlatform();
|
||||||
|
|
||||||
|
String appName = packageInfo.appName;
|
||||||
|
String packageName = packageInfo.packageName;
|
||||||
|
String version = packageInfo.version;
|
||||||
|
String buildNumber = packageInfo.buildNumber;
|
||||||
|
|
||||||
|
Map<String, String> release = {
|
||||||
|
"app_name": appName,
|
||||||
|
"package_name": packageName,
|
||||||
|
"version": version,
|
||||||
|
"build_number": buildNumber,
|
||||||
|
};
|
||||||
|
|
||||||
|
return release;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ class App extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
title: "Filc Napló",
|
title: "reFilc",
|
||||||
debugShowCheckedModeBanner: false,
|
debugShowCheckedModeBanner: false,
|
||||||
theme: AppTheme.lightTheme(context, palette: corePalette),
|
theme: AppTheme.lightTheme(context, palette: corePalette),
|
||||||
darkTheme: AppTheme.darkTheme(context, palette: corePalette),
|
darkTheme: AppTheme.darkTheme(context, palette: corePalette),
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ class Config {
|
|||||||
|
|
||||||
factory Config.fromJson(Map json) {
|
factory Config.fromJson(Map json) {
|
||||||
return Config(
|
return Config(
|
||||||
userAgent: json["user_agent"] ?? "hu.filc.naplo/\$0/\$1/\$2",
|
userAgent: json["user_agent"] ?? "hu.refilc.naplo/\$0/\$1/\$2",
|
||||||
json: json,
|
json: json,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -151,8 +151,9 @@ Future<List<DateWidget>> getFilterWidgets(FilterType activeData,
|
|||||||
|
|
||||||
// Updates
|
// Updates
|
||||||
case FilterType.updates:
|
case FilterType.updates:
|
||||||
if (updateProvider.available)
|
if (updateProvider.available) {
|
||||||
items = [update_filter.getWidget(updateProvider.releases.first)];
|
items = [update_filter.getWidget(updateProvider.releases.first)];
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Missed Exams
|
// Missed Exams
|
||||||
|
|||||||
@@ -311,7 +311,7 @@ Color gradeColor(
|
|||||||
|
|
||||||
switch (valueInt) {
|
switch (valueInt) {
|
||||||
case 5:
|
case 5:
|
||||||
return Color(0xff3d7bf4);
|
return settings.gradeColors[4];
|
||||||
case 4:
|
case 4:
|
||||||
return settings.gradeColors[3];
|
return settings.gradeColors[3];
|
||||||
case 3:
|
case 3:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Name=Filc Napló
|
Name=reFilc
|
||||||
Comment=Nem hivatalos e-napló alkalmazás az eKRÉTA rendszerhez
|
Comment=Nem hivatalos e-napló alkalmazás az eKRÉTA rendszerhez
|
||||||
Exec=filcnaplo
|
Exec=filcnaplo
|
||||||
Icon=icon.png
|
Icon=icon.png
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import connectivity_plus
|
|||||||
import dynamic_color
|
import dynamic_color
|
||||||
import flutter_acrylic
|
import flutter_acrylic
|
||||||
import flutter_local_notifications
|
import flutter_local_notifications
|
||||||
|
import package_info_plus
|
||||||
import path_provider_foundation
|
import path_provider_foundation
|
||||||
import share_plus_macos
|
import share_plus_macos
|
||||||
import sqflite
|
import sqflite
|
||||||
@@ -19,6 +20,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
|||||||
DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin"))
|
DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin"))
|
||||||
FlutterAcrylicPlugin.register(with: registry.registrar(forPlugin: "FlutterAcrylicPlugin"))
|
FlutterAcrylicPlugin.register(with: registry.registrar(forPlugin: "FlutterAcrylicPlugin"))
|
||||||
FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin"))
|
FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin"))
|
||||||
|
FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin"))
|
||||||
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
||||||
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
|
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
|
||||||
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
|
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
|
||||||
|
|||||||
@@ -1,40 +1,40 @@
|
|||||||
platform :osx, '10.11'
|
platform :osx, '10.14'
|
||||||
|
|
||||||
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||||
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||||
|
|
||||||
project 'Runner', {
|
project 'Runner', {
|
||||||
'Debug' => :debug,
|
'Debug' => :debug,
|
||||||
'Profile' => :release,
|
'Profile' => :release,
|
||||||
'Release' => :release,
|
'Release' => :release,
|
||||||
}
|
}
|
||||||
|
|
||||||
def flutter_root
|
def flutter_root
|
||||||
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__)
|
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__)
|
||||||
unless File.exist?(generated_xcode_build_settings_path)
|
unless File.exist?(generated_xcode_build_settings_path)
|
||||||
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first"
|
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first"
|
||||||
end
|
end
|
||||||
|
|
||||||
File.foreach(generated_xcode_build_settings_path) do |line|
|
File.foreach(generated_xcode_build_settings_path) do |line|
|
||||||
matches = line.match(/FLUTTER_ROOT\=(.*)/)
|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
|
||||||
return matches[1].strip if matches
|
return matches[1].strip if matches
|
||||||
end
|
end
|
||||||
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\""
|
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\""
|
||||||
end
|
end
|
||||||
|
|
||||||
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
|
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
|
||||||
|
|
||||||
flutter_macos_podfile_setup
|
flutter_macos_podfile_setup
|
||||||
|
|
||||||
target 'Runner' do
|
target 'Runner' do
|
||||||
use_frameworks!
|
use_frameworks!
|
||||||
use_modular_headers!
|
use_modular_headers!
|
||||||
|
|
||||||
flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))
|
flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))
|
||||||
end
|
end
|
||||||
|
|
||||||
post_install do |installer|
|
post_install do |installer|
|
||||||
installer.pods_project.targets.each do |target|
|
installer.pods_project.targets.each do |target|
|
||||||
flutter_additional_macos_build_settings(target)
|
flutter_additional_macos_build_settings(target)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,71 +1,78 @@
|
|||||||
PODS:
|
PODS:
|
||||||
- connectivity_plus (0.0.1):
|
- connectivity_plus (0.0.1):
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- ReachabilitySwift
|
- ReachabilitySwift
|
||||||
- dynamic_color (0.0.2):
|
- dynamic_color (0.0.2):
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- flutter_acrylic (0.1.0):
|
- flutter_acrylic (0.1.0):
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- FlutterMacOS (1.0.0)
|
- flutter_local_notifications (0.0.1):
|
||||||
- FMDB (2.7.5):
|
- FlutterMacOS
|
||||||
- FMDB/standard (= 2.7.5)
|
- FlutterMacOS (1.0.0)
|
||||||
- FMDB/standard (2.7.5)
|
- FMDB (2.7.5):
|
||||||
- path_provider_macos (0.0.1):
|
- FMDB/standard (= 2.7.5)
|
||||||
- FlutterMacOS
|
- FMDB/standard (2.7.5)
|
||||||
- ReachabilitySwift (5.0.0)
|
- path_provider_foundation (0.0.1):
|
||||||
- share_plus_macos (0.0.1):
|
- Flutter
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- sqflite (0.0.2):
|
- ReachabilitySwift (5.0.0)
|
||||||
- FlutterMacOS
|
- share_plus_macos (0.0.1):
|
||||||
- FMDB (>= 2.7.5)
|
- FlutterMacOS
|
||||||
- url_launcher_macos (0.0.1):
|
- sqflite (0.0.2):
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
|
- FMDB (>= 2.7.5)
|
||||||
DEPENDENCIES:
|
- url_launcher_macos (0.0.1):
|
||||||
- connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos`)
|
- FlutterMacOS
|
||||||
- dynamic_color (from `Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos`)
|
|
||||||
- flutter_acrylic (from `Flutter/ephemeral/.symlinks/plugins/flutter_acrylic/macos`)
|
DEPENDENCIES:
|
||||||
- FlutterMacOS (from `Flutter/ephemeral`)
|
- connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos`)
|
||||||
- path_provider_macos (from `Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos`)
|
- dynamic_color (from `Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos`)
|
||||||
- share_plus_macos (from `Flutter/ephemeral/.symlinks/plugins/share_plus_macos/macos`)
|
- flutter_acrylic (from `Flutter/ephemeral/.symlinks/plugins/flutter_acrylic/macos`)
|
||||||
- sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`)
|
- flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`)
|
||||||
- url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`)
|
- FlutterMacOS (from `Flutter/ephemeral`)
|
||||||
|
- path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`)
|
||||||
SPEC REPOS:
|
- share_plus_macos (from `Flutter/ephemeral/.symlinks/plugins/share_plus_macos/macos`)
|
||||||
trunk:
|
- sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`)
|
||||||
- FMDB
|
- url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`)
|
||||||
- ReachabilitySwift
|
|
||||||
|
SPEC REPOS:
|
||||||
EXTERNAL SOURCES:
|
trunk:
|
||||||
connectivity_plus:
|
- FMDB
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos
|
- ReachabilitySwift
|
||||||
dynamic_color:
|
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos
|
EXTERNAL SOURCES:
|
||||||
flutter_acrylic:
|
connectivity_plus:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/flutter_acrylic/macos
|
:path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos
|
||||||
FlutterMacOS:
|
dynamic_color:
|
||||||
:path: Flutter/ephemeral
|
:path: Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos
|
||||||
path_provider_macos:
|
flutter_acrylic:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos
|
:path: Flutter/ephemeral/.symlinks/plugins/flutter_acrylic/macos
|
||||||
share_plus_macos:
|
flutter_local_notifications:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/share_plus_macos/macos
|
:path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos
|
||||||
sqflite:
|
FlutterMacOS:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos
|
:path: Flutter/ephemeral
|
||||||
url_launcher_macos:
|
path_provider_foundation:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos
|
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin
|
||||||
|
share_plus_macos:
|
||||||
SPEC CHECKSUMS:
|
:path: Flutter/ephemeral/.symlinks/plugins/share_plus_macos/macos
|
||||||
connectivity_plus: 18d3c32514c886e046de60e9c13895109866c747
|
sqflite:
|
||||||
dynamic_color: 394d6a888650f8534e029b27d2f8bc5c64e44008
|
:path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos
|
||||||
flutter_acrylic: c3df24ae52ab6597197837ce59ef2a8542640c17
|
url_launcher_macos:
|
||||||
FlutterMacOS: ae6af50a8ea7d6103d888583d46bd8328a7e9811
|
:path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos
|
||||||
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
|
|
||||||
path_provider_macos: 3c0c3b4b0d4a76d2bf989a913c2de869c5641a19
|
SPEC CHECKSUMS:
|
||||||
ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825
|
connectivity_plus: 18d3c32514c886e046de60e9c13895109866c747
|
||||||
share_plus_macos: 853ee48e7dce06b633998ca0735d482dd671ade4
|
dynamic_color: 2eaa27267de1ca20d879fbd6e01259773fb1670f
|
||||||
sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea
|
flutter_acrylic: c3df24ae52ab6597197837ce59ef2a8542640c17
|
||||||
url_launcher_macos: 597e05b8e514239626bcf4a850fcf9ef5c856ec3
|
flutter_local_notifications: 3805ca215b2fb7f397d78b66db91f6a747af52e4
|
||||||
|
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
|
||||||
PODFILE CHECKSUM: 6eac6b3292e5142cfc23bdeb71848a40ec51c14c
|
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
|
||||||
|
path_provider_foundation: eaf5b3e458fc0e5fbb9940fb09980e853fe058b8
|
||||||
COCOAPODS: 1.11.3
|
ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825
|
||||||
|
share_plus_macos: 853ee48e7dce06b633998ca0735d482dd671ade4
|
||||||
|
sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea
|
||||||
|
url_launcher_macos: 5335912b679c073563f29d89d33d10d459f95451
|
||||||
|
|
||||||
|
PODFILE CHECKSUM: 353c8bcc5d5b0994e508d035b5431cfe18c1dea7
|
||||||
|
|
||||||
|
COCOAPODS: 1.12.1
|
||||||
|
|||||||
@@ -1,87 +1,87 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "1400"
|
LastUpgradeVersion = "1300"
|
||||||
version = "1.3">
|
version = "1.3">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
buildImplicitDependencies = "YES">
|
buildImplicitDependencies = "YES">
|
||||||
<BuildActionEntries>
|
<BuildActionEntries>
|
||||||
<BuildActionEntry
|
<BuildActionEntry
|
||||||
buildForTesting = "YES"
|
buildForTesting = "YES"
|
||||||
buildForRunning = "YES"
|
buildForRunning = "YES"
|
||||||
buildForProfiling = "YES"
|
buildForProfiling = "YES"
|
||||||
buildForArchiving = "YES"
|
buildForArchiving = "YES"
|
||||||
buildForAnalyzing = "YES">
|
buildForAnalyzing = "YES">
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
||||||
BuildableName = "Felt Diary.app"
|
BuildableName = "Felt Diary.app"
|
||||||
BlueprintName = "Runner"
|
BlueprintName = "Runner"
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildActionEntry>
|
</BuildActionEntry>
|
||||||
</BuildActionEntries>
|
</BuildActionEntries>
|
||||||
</BuildAction>
|
</BuildAction>
|
||||||
<TestAction
|
<TestAction
|
||||||
buildConfiguration = "Debug"
|
buildConfiguration = "Debug"
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||||
<MacroExpansion>
|
<MacroExpansion>
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
||||||
BuildableName = "Felt Diary.app"
|
BuildableName = "Felt Diary.app"
|
||||||
BlueprintName = "Runner"
|
BlueprintName = "Runner"
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</MacroExpansion>
|
</MacroExpansion>
|
||||||
<Testables>
|
<Testables>
|
||||||
</Testables>
|
</Testables>
|
||||||
</TestAction>
|
</TestAction>
|
||||||
<LaunchAction
|
<LaunchAction
|
||||||
buildConfiguration = "Debug"
|
buildConfiguration = "Debug"
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
launchStyle = "0"
|
launchStyle = "0"
|
||||||
useCustomWorkingDirectory = "NO"
|
useCustomWorkingDirectory = "NO"
|
||||||
ignoresPersistentStateOnLaunch = "NO"
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
debugDocumentVersioning = "YES"
|
debugDocumentVersioning = "YES"
|
||||||
debugServiceExtension = "internal"
|
debugServiceExtension = "internal"
|
||||||
allowLocationSimulation = "YES">
|
allowLocationSimulation = "YES">
|
||||||
<BuildableProductRunnable
|
<BuildableProductRunnable
|
||||||
runnableDebuggingMode = "0">
|
runnableDebuggingMode = "0">
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
||||||
BuildableName = "Felt Diary.app"
|
BuildableName = "Felt Diary.app"
|
||||||
BlueprintName = "Runner"
|
BlueprintName = "Runner"
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildableProductRunnable>
|
</BuildableProductRunnable>
|
||||||
</LaunchAction>
|
</LaunchAction>
|
||||||
<ProfileAction
|
<ProfileAction
|
||||||
buildConfiguration = "Profile"
|
buildConfiguration = "Profile"
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
savedToolIdentifier = ""
|
savedToolIdentifier = ""
|
||||||
useCustomWorkingDirectory = "NO"
|
useCustomWorkingDirectory = "NO"
|
||||||
debugDocumentVersioning = "YES">
|
debugDocumentVersioning = "YES">
|
||||||
<BuildableProductRunnable
|
<BuildableProductRunnable
|
||||||
runnableDebuggingMode = "0">
|
runnableDebuggingMode = "0">
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
||||||
BuildableName = "Felt Diary.app"
|
BuildableName = "Felt Diary.app"
|
||||||
BlueprintName = "Runner"
|
BlueprintName = "Runner"
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildableProductRunnable>
|
</BuildableProductRunnable>
|
||||||
</ProfileAction>
|
</ProfileAction>
|
||||||
<AnalyzeAction
|
<AnalyzeAction
|
||||||
buildConfiguration = "Debug">
|
buildConfiguration = "Debug">
|
||||||
</AnalyzeAction>
|
</AnalyzeAction>
|
||||||
<ArchiveAction
|
<ArchiveAction
|
||||||
buildConfiguration = "Release"
|
buildConfiguration = "Release"
|
||||||
revealArchiveInOrganizer = "YES">
|
revealArchiveInOrganizer = "YES">
|
||||||
</ArchiveAction>
|
</ArchiveAction>
|
||||||
</Scheme>
|
</Scheme>
|
||||||
|
|||||||
@@ -5,10 +5,10 @@
|
|||||||
// 'flutter create' template.
|
// 'flutter create' template.
|
||||||
|
|
||||||
// The application's name. By default this is also the title of the Flutter window.
|
// The application's name. By default this is also the title of the Flutter window.
|
||||||
PRODUCT_NAME = Filc Napló
|
PRODUCT_NAME = reFilc
|
||||||
|
|
||||||
// The application's bundle identifier
|
// The application's bundle identifier
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = hu.filc.filcnaplo
|
PRODUCT_BUNDLE_IDENTIFIER = hu.refilc.naplo
|
||||||
|
|
||||||
// The copyright displayed in application information
|
// The copyright displayed in application information
|
||||||
PRODUCT_COPYRIGHT = Deez mogyorók
|
PRODUCT_COPYRIGHT = reFilc
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ description: "Nem hivatalos e-napló alkalmazás az e-Kréta rendszerhez"
|
|||||||
homepage: https://refilc.hu
|
homepage: https://refilc.hu
|
||||||
publish_to: "none"
|
publish_to: "none"
|
||||||
|
|
||||||
version: 3.5.1+195
|
version: 4.0.1+205
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=2.17.0 <3.0.0"
|
sdk: ">=2.17.0 <3.0.0"
|
||||||
@@ -67,6 +67,7 @@ dependencies:
|
|||||||
animations: ^2.0.1
|
animations: ^2.0.1
|
||||||
background_fetch: ^1.1.5
|
background_fetch: ^1.1.5
|
||||||
flutter_local_notifications: ^14.1.0
|
flutter_local_notifications: ^14.1.0
|
||||||
|
package_info_plus: ^3.1.2
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_lints: ^2.0.1
|
flutter_lints: ^2.0.1
|
||||||
@@ -146,9 +147,11 @@ flutter:
|
|||||||
weight: 700
|
weight: 700
|
||||||
style: italic
|
style: italic
|
||||||
|
|
||||||
flutter_icons:
|
flutter_launcher_icons:
|
||||||
image_path: assets/icons/ic_launcher.png
|
image_path: assets/icons/ic_launcher.png
|
||||||
android: true
|
android: true
|
||||||
|
adaptive_icon_background: "#3D7BF4"
|
||||||
|
adaptive_icon_foreground: assets/icons/ic_launcher_foreground.png
|
||||||
ios: true
|
ios: true
|
||||||
remove_alpha_ios: true
|
remove_alpha_ios: true
|
||||||
|
|
||||||
|
|||||||
@@ -26,16 +26,18 @@ import 'package:flutter_expandable_fab/flutter_expandable_fab.dart';
|
|||||||
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'grades_page.i18n.dart';
|
import 'grades_page.i18n.dart';
|
||||||
// import 'package:filcnaplo_premium/ui/mobile/goalplanner/new_goal.dart';
|
//import 'package:filcnaplo_premium/ui/mobile/goal_planner/new_goal.dart';
|
||||||
|
|
||||||
class GradeSubjectView extends StatefulWidget {
|
class GradeSubjectView extends StatefulWidget {
|
||||||
const GradeSubjectView(this.subject, {Key? key, this.groupAverage = 0.0}) : super(key: key);
|
const GradeSubjectView(this.subject, {Key? key, this.groupAverage = 0.0})
|
||||||
|
: super(key: key);
|
||||||
|
|
||||||
final Subject subject;
|
final Subject subject;
|
||||||
final double groupAverage;
|
final double groupAverage;
|
||||||
|
|
||||||
void push(BuildContext context, {bool root = false}) {
|
void push(BuildContext context, {bool root = false}) {
|
||||||
Navigator.of(context, rootNavigator: root).push(CupertinoPageRoute(builder: (context) => this));
|
Navigator.of(context, rootNavigator: root)
|
||||||
|
.push(CupertinoPageRoute(builder: (context) => this));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -70,7 +72,9 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
|
|||||||
final gradeDates = subjectGrades.map((e) => e.date.millisecondsSinceEpoch);
|
final gradeDates = subjectGrades.map((e) => e.date.millisecondsSinceEpoch);
|
||||||
final maxGradeDate = gradeDates.fold(0, max);
|
final maxGradeDate = gradeDates.fold(0, max);
|
||||||
final minGradeDate = gradeDates.fold(0, min);
|
final minGradeDate = gradeDates.fold(0, min);
|
||||||
if (maxGradeDate - minGradeDate < const Duration(days: 5).inMilliseconds) return false; // naplo/#78
|
if (maxGradeDate - minGradeDate < const Duration(days: 5).inMilliseconds) {
|
||||||
|
return false; // naplo/#78
|
||||||
|
}
|
||||||
|
|
||||||
return subjectGrades.where((e) => e.type == GradeType.midYear).length > 1;
|
return subjectGrades.where((e) => e.type == GradeType.midYear).length > 1;
|
||||||
}
|
}
|
||||||
@@ -129,7 +133,8 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
tiles.add(Padding(padding: EdgeInsets.only(bottom: !gradeCalcMode ? 24.0 : 250.0)));
|
tiles.add(Padding(
|
||||||
|
padding: EdgeInsets.only(bottom: !gradeCalcMode ? 24.0 : 250.0)));
|
||||||
gradeTiles = List.castFrom(tiles);
|
gradeTiles = List.castFrom(tiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,7 +147,10 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
|
|||||||
average = AverageHelper.averageEvals(subjectGrades);
|
average = AverageHelper.averageEvals(subjectGrades);
|
||||||
final prevAvg = subjectGrades.isNotEmpty
|
final prevAvg = subjectGrades.isNotEmpty
|
||||||
? AverageHelper.averageEvals(subjectGrades
|
? AverageHelper.averageEvals(subjectGrades
|
||||||
.where((e) => e.date.isBefore(subjectGrades.reduce((v, e) => e.date.isAfter(v.date) ? e : v).date.subtract(const Duration(days: 30))))
|
.where((e) => e.date.isBefore(subjectGrades
|
||||||
|
.reduce((v, e) => e.date.isAfter(v.date) ? e : v)
|
||||||
|
.date
|
||||||
|
.subtract(const Duration(days: 30))))
|
||||||
.toList())
|
.toList())
|
||||||
: 0.0;
|
: 0.0;
|
||||||
|
|
||||||
@@ -153,14 +161,17 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
|
|||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
Text("annual_average".i18n),
|
Text("annual_average".i18n),
|
||||||
if (average != prevAvg) TrendDisplay(current: average, previous: prevAvg),
|
if (average != prevAvg)
|
||||||
|
TrendDisplay(current: average, previous: prevAvg),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
child: Container(
|
child: Container(
|
||||||
padding: const EdgeInsets.only(top: 12.0, right: 12.0),
|
padding: const EdgeInsets.only(top: 12.0, right: 12.0),
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Expanded(child: GradeGraph(subjectGrades, dayThreshold: 5, classAvg: widget.groupAverage)),
|
Expanded(
|
||||||
|
child: GradeGraph(subjectGrades,
|
||||||
|
dayThreshold: 5, classAvg: widget.groupAverage)),
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(bottom: 24.0),
|
padding: const EdgeInsets.only(bottom: 24.0),
|
||||||
child: GradesCount(grades: subjectGrades),
|
child: GradesCount(grades: subjectGrades),
|
||||||
@@ -174,7 +185,9 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
|
|||||||
if (!gradeCalcMode) {
|
if (!gradeCalcMode) {
|
||||||
buildTiles(subjectGrades);
|
buildTiles(subjectGrades);
|
||||||
} else {
|
} else {
|
||||||
List<Grade> ghostGrades = calculatorProvider.ghosts.where((e) => e.subject == widget.subject).toList();
|
List<Grade> ghostGrades = calculatorProvider.ghosts
|
||||||
|
.where((e) => e.subject == widget.subject)
|
||||||
|
.toList();
|
||||||
buildTiles(ghostGrades);
|
buildTiles(ghostGrades);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,7 +195,10 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
|
|||||||
key: _scaffoldKey,
|
key: _scaffoldKey,
|
||||||
floatingActionButtonLocation: ExpandableFab.location,
|
floatingActionButtonLocation: ExpandableFab.location,
|
||||||
floatingActionButton: Visibility(
|
floatingActionButton: Visibility(
|
||||||
visible: !gradeCalcMode && subjectGrades.where((e) => e.type == GradeType.midYear).isNotEmpty,
|
visible: !gradeCalcMode &&
|
||||||
|
subjectGrades
|
||||||
|
.where((e) => e.type == GradeType.midYear)
|
||||||
|
.isNotEmpty,
|
||||||
child: ExpandableFab(
|
child: ExpandableFab(
|
||||||
type: ExpandableFabType.up,
|
type: ExpandableFabType.up,
|
||||||
distance: 50,
|
distance: 50,
|
||||||
@@ -215,12 +231,17 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
|
|||||||
},
|
},
|
||||||
navBarItems: [
|
navBarItems: [
|
||||||
const SizedBox(width: 6.0),
|
const SizedBox(width: 6.0),
|
||||||
if (widget.groupAverage != 0) Center(child: AverageDisplay(average: widget.groupAverage, border: true)),
|
if (widget.groupAverage != 0)
|
||||||
|
Center(
|
||||||
|
child: AverageDisplay(
|
||||||
|
average: widget.groupAverage, border: true)),
|
||||||
const SizedBox(width: 6.0),
|
const SizedBox(width: 6.0),
|
||||||
if (average != 0) Center(child: AverageDisplay(average: average)),
|
if (average != 0)
|
||||||
|
Center(child: AverageDisplay(average: average)),
|
||||||
const SizedBox(width: 12.0),
|
const SizedBox(width: 12.0),
|
||||||
],
|
],
|
||||||
icon: SubjectIcon.resolveVariant(subject: widget.subject, context: context),
|
icon: SubjectIcon.resolveVariant(
|
||||||
|
subject: widget.subject, context: context),
|
||||||
scrollController: _scrollController,
|
scrollController: _scrollController,
|
||||||
title: widget.subject.renamedTo ?? widget.subject.name.capital(),
|
title: widget.subject.renamedTo ?? widget.subject.name.capital(),
|
||||||
italic: widget.subject.isRenamed,
|
italic: widget.subject.isRenamed,
|
||||||
@@ -240,13 +261,15 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
|
|||||||
|
|
||||||
void gradeCalc(BuildContext context) {
|
void gradeCalc(BuildContext context) {
|
||||||
// Scroll to the top of the page
|
// Scroll to the top of the page
|
||||||
_scrollController.animateTo(75, duration: const Duration(milliseconds: 500), curve: Curves.ease);
|
_scrollController.animateTo(75,
|
||||||
|
duration: const Duration(milliseconds: 500), curve: Curves.ease);
|
||||||
|
|
||||||
calculatorProvider.clear();
|
calculatorProvider.clear();
|
||||||
calculatorProvider.addAllGrades(gradeProvider.grades);
|
calculatorProvider.addAllGrades(gradeProvider.grades);
|
||||||
|
|
||||||
_sheetController = _scaffoldKey.currentState?.showBottomSheet(
|
_sheetController = _scaffoldKey.currentState?.showBottomSheet(
|
||||||
(context) => RoundedBottomSheet(child: GradeCalculator(widget.subject), borderRadius: 14.0),
|
(context) => RoundedBottomSheet(
|
||||||
|
child: GradeCalculator(widget.subject), borderRadius: 14.0),
|
||||||
backgroundColor: const Color(0x00000000),
|
backgroundColor: const Color(0x00000000),
|
||||||
elevation: 12.0,
|
elevation: 12.0,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -41,13 +41,21 @@ class _GradesPageState extends State<GradesPage> {
|
|||||||
|
|
||||||
int avgDropValue = 0;
|
int avgDropValue = 0;
|
||||||
|
|
||||||
List<Grade> getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider.grades
|
List<Grade> getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider
|
||||||
.where(
|
.grades
|
||||||
(e) => e.subject == subject && e.type == GradeType.midYear && (days == 0 || e.date.isBefore(DateTime.now().subtract(Duration(days: days)))))
|
.where((e) =>
|
||||||
|
e.subject == subject &&
|
||||||
|
e.type == GradeType.midYear &&
|
||||||
|
(days == 0 ||
|
||||||
|
e.date.isBefore(DateTime.now().subtract(Duration(days: days)))))
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
void generateTiles() {
|
void generateTiles() {
|
||||||
List<Subject> subjects = gradeProvider.grades.map((e) => e.subject).toSet().toList()..sort((a, b) => a.name.compareTo(b.name));
|
List<Subject> subjects = gradeProvider.grades
|
||||||
|
.map((e) => e.subject)
|
||||||
|
.toSet()
|
||||||
|
.toList()
|
||||||
|
..sort((a, b) => a.name.compareTo(b.name));
|
||||||
List<Widget> tiles = [];
|
List<Widget> tiles = [];
|
||||||
|
|
||||||
Map<Subject, double> subjectAvgs = {};
|
Map<Subject, double> subjectAvgs = {};
|
||||||
@@ -59,11 +67,15 @@ class _GradesPageState extends State<GradesPage> {
|
|||||||
double averageBefore = 0.0;
|
double averageBefore = 0.0;
|
||||||
|
|
||||||
if (avgDropValue != 0) {
|
if (avgDropValue != 0) {
|
||||||
List<Grade> gradesBefore = getSubjectGrades(subject, days: avgDropValue);
|
List<Grade> gradesBefore =
|
||||||
averageBefore = avgDropValue == 0 ? 0.0 : AverageHelper.averageEvals(gradesBefore);
|
getSubjectGrades(subject, days: avgDropValue);
|
||||||
|
averageBefore =
|
||||||
|
avgDropValue == 0 ? 0.0 : AverageHelper.averageEvals(gradesBefore);
|
||||||
}
|
}
|
||||||
var nullavg = GroupAverage(average: 0.0, subject: subject, uid: "0");
|
var nullavg = GroupAverage(average: 0.0, subject: subject, uid: "0");
|
||||||
double groupAverage = gradeProvider.groupAverages.firstWhere((e) => e.subject == subject, orElse: () => nullavg).average;
|
double groupAverage = gradeProvider.groupAverages
|
||||||
|
.firstWhere((e) => e.subject == subject, orElse: () => nullavg)
|
||||||
|
.average;
|
||||||
|
|
||||||
if (avg != 0) subjectAvgs[subject] = avg;
|
if (avg != 0) subjectAvgs[subject] = avg;
|
||||||
|
|
||||||
@@ -73,7 +85,8 @@ class _GradesPageState extends State<GradesPage> {
|
|||||||
average: avg,
|
average: avg,
|
||||||
groupAverage: avgDropValue == 0 ? groupAverage : 0.0,
|
groupAverage: avgDropValue == 0 ? groupAverage : 0.0,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
GradeSubjectView(subject, groupAverage: groupAverage).push(context, root: true);
|
GradeSubjectView(subject, groupAverage: groupAverage)
|
||||||
|
.push(context, root: true);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}));
|
}));
|
||||||
@@ -81,7 +94,12 @@ class _GradesPageState extends State<GradesPage> {
|
|||||||
if (tiles.isNotEmpty) {
|
if (tiles.isNotEmpty) {
|
||||||
tiles.insert(0, yearlyGraph);
|
tiles.insert(0, yearlyGraph);
|
||||||
tiles.insert(1, FailWarning(subjectAvgs: subjectAvgs));
|
tiles.insert(1, FailWarning(subjectAvgs: subjectAvgs));
|
||||||
tiles.insert(2, PanelTitle(title: Text(avgDropValue == 0 ? "Subjects".i18n : "Subjects_changes".i18n)));
|
tiles.insert(
|
||||||
|
2,
|
||||||
|
PanelTitle(
|
||||||
|
title: Text(avgDropValue == 0
|
||||||
|
? "Subjects".i18n
|
||||||
|
: "Subjects_changes".i18n)));
|
||||||
tiles.insert(3, const PanelHeader(padding: EdgeInsets.only(top: 12.0)));
|
tiles.insert(3, const PanelHeader(padding: EdgeInsets.only(top: 12.0)));
|
||||||
tiles.add(const PanelFooter(padding: EdgeInsets.only(bottom: 12.0)));
|
tiles.add(const PanelFooter(padding: EdgeInsets.only(bottom: 12.0)));
|
||||||
tiles.add(const Padding(padding: EdgeInsets.only(bottom: 24.0)));
|
tiles.add(const Padding(padding: EdgeInsets.only(bottom: 24.0)));
|
||||||
@@ -95,9 +113,15 @@ class _GradesPageState extends State<GradesPage> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
double subjectAvg = subjectAvgs.isNotEmpty ? subjectAvgs.values.fold(0.0, (double a, double b) => a + b) / subjectAvgs.length : 0.0;
|
double subjectAvg = subjectAvgs.isNotEmpty
|
||||||
|
? subjectAvgs.values.fold(0.0, (double a, double b) => a + b) /
|
||||||
|
subjectAvgs.length
|
||||||
|
: 0.0;
|
||||||
final double classAvg = gradeProvider.groupAverages.isNotEmpty
|
final double classAvg = gradeProvider.groupAverages.isNotEmpty
|
||||||
? gradeProvider.groupAverages.map((e) => e.average).fold(0.0, (double a, double b) => a + b) / gradeProvider.groupAverages.length
|
? gradeProvider.groupAverages
|
||||||
|
.map((e) => e.average)
|
||||||
|
.fold(0.0, (double a, double b) => a + b) /
|
||||||
|
gradeProvider.groupAverages.length
|
||||||
: 0.0;
|
: 0.0;
|
||||||
|
|
||||||
if (subjectAvg > 0) {
|
if (subjectAvg > 0) {
|
||||||
@@ -151,18 +175,31 @@ class _GradesPageState extends State<GradesPage> {
|
|||||||
|
|
||||||
final double totalClassAvg = gradeProvider.groupAverages.isEmpty
|
final double totalClassAvg = gradeProvider.groupAverages.isEmpty
|
||||||
? 0.0
|
? 0.0
|
||||||
: gradeProvider.groupAverages.map((e) => e.average).fold(0.0, (double a, double b) => a + b) / gradeProvider.groupAverages.length;
|
: gradeProvider.groupAverages
|
||||||
|
.map((e) => e.average)
|
||||||
|
.fold(0.0, (double a, double b) => a + b) /
|
||||||
|
gradeProvider.groupAverages.length;
|
||||||
|
|
||||||
final now = gradeProvider.grades.isNotEmpty ? gradeProvider.grades.reduce((v, e) => e.date.isAfter(v.date) ? e : v).date : DateTime.now();
|
final now = gradeProvider.grades.isNotEmpty
|
||||||
|
? gradeProvider.grades
|
||||||
|
.reduce((v, e) => e.date.isAfter(v.date) ? e : v)
|
||||||
|
.date
|
||||||
|
: DateTime.now();
|
||||||
|
|
||||||
final currentStudentAvg = AverageHelper.averageEvals(gradeProvider.grades.where((e) => e.type == GradeType.midYear).toList());
|
final currentStudentAvg = AverageHelper.averageEvals(gradeProvider.grades
|
||||||
|
.where((e) => e.type == GradeType.midYear)
|
||||||
|
.toList());
|
||||||
final prevStudentAvg = AverageHelper.averageEvals(gradeProvider.grades
|
final prevStudentAvg = AverageHelper.averageEvals(gradeProvider.grades
|
||||||
.where((e) => e.type == GradeType.midYear)
|
.where((e) => e.type == GradeType.midYear)
|
||||||
.where((e) => e.date.isBefore(now.subtract(const Duration(days: 30))))
|
.where((e) => e.date.isBefore(now.subtract(const Duration(days: 30))))
|
||||||
.toList());
|
.toList());
|
||||||
|
|
||||||
List<Grade> graphGrades = gradeProvider.grades
|
List<Grade> graphGrades = gradeProvider.grades
|
||||||
.where((e) => e.type == GradeType.midYear && (avgDropValue == 0 || e.date.isAfter(DateTime.now().subtract(Duration(days: avgDropValue)))))
|
.where((e) =>
|
||||||
|
e.type == GradeType.midYear &&
|
||||||
|
(avgDropValue == 0 ||
|
||||||
|
e.date.isAfter(
|
||||||
|
DateTime.now().subtract(Duration(days: avgDropValue)))))
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
yearlyGraph = Padding(
|
yearlyGraph = Padding(
|
||||||
@@ -183,8 +220,12 @@ class _GradesPageState extends State<GradesPage> {
|
|||||||
children: [
|
children: [
|
||||||
// if (totalClassAvg >= 1.0) AverageDisplay(average: totalClassAvg, border: true),
|
// if (totalClassAvg >= 1.0) AverageDisplay(average: totalClassAvg, border: true),
|
||||||
// const SizedBox(width: 4.0),
|
// const SizedBox(width: 4.0),
|
||||||
TrendDisplay(previous: prevStudentAvg, current: currentStudentAvg),
|
TrendDisplay(
|
||||||
if (gradeProvider.grades.where((e) => e.type == GradeType.midYear).isNotEmpty) AverageDisplay(average: currentStudentAvg),
|
previous: prevStudentAvg, current: currentStudentAvg),
|
||||||
|
if (gradeProvider.grades
|
||||||
|
.where((e) => e.type == GradeType.midYear)
|
||||||
|
.isNotEmpty)
|
||||||
|
AverageDisplay(average: currentStudentAvg),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
@@ -193,7 +234,9 @@ class _GradesPageState extends State<GradesPage> {
|
|||||||
padding: const EdgeInsets.only(top: 12.0, right: 12.0),
|
padding: const EdgeInsets.only(top: 12.0, right: 12.0),
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Expanded(child: GradeGraph(graphGrades, dayThreshold: 2, classAvg: totalClassAvg)),
|
Expanded(
|
||||||
|
child: GradeGraph(graphGrades,
|
||||||
|
dayThreshold: 2, classAvg: totalClassAvg)),
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(bottom: 24.0),
|
padding: const EdgeInsets.only(bottom: 24.0),
|
||||||
child: GradesCount(grades: graphGrades),
|
child: GradesCount(grades: graphGrades),
|
||||||
@@ -210,7 +253,8 @@ class _GradesPageState extends State<GradesPage> {
|
|||||||
body: Padding(
|
body: Padding(
|
||||||
padding: const EdgeInsets.only(top: 9.0),
|
padding: const EdgeInsets.only(top: 9.0),
|
||||||
child: NestedScrollView(
|
child: NestedScrollView(
|
||||||
physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
|
physics: const BouncingScrollPhysics(
|
||||||
|
parent: AlwaysScrollableScrollPhysics()),
|
||||||
headerSliverBuilder: (context, _) => [
|
headerSliverBuilder: (context, _) => [
|
||||||
SliverAppBar(
|
SliverAppBar(
|
||||||
centerTitle: false,
|
centerTitle: false,
|
||||||
@@ -223,7 +267,10 @@ class _GradesPageState extends State<GradesPage> {
|
|||||||
padding: const EdgeInsets.only(left: 8.0),
|
padding: const EdgeInsets.only(left: 8.0),
|
||||||
child: Text(
|
child: Text(
|
||||||
"Grades".i18n,
|
"Grades".i18n,
|
||||||
style: TextStyle(color: AppColors.of(context).text, fontSize: 32.0, fontWeight: FontWeight.bold),
|
style: TextStyle(
|
||||||
|
color: AppColors.of(context).text,
|
||||||
|
fontSize: 32.0,
|
||||||
|
fontWeight: FontWeight.bold),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
shadowColor: Theme.of(context).shadowColor,
|
shadowColor: Theme.of(context).shadowColor,
|
||||||
@@ -238,7 +285,8 @@ class _GradesPageState extends State<GradesPage> {
|
|||||||
itemCount: max(subjectTiles.length, 1),
|
itemCount: max(subjectTiles.length, 1),
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
if (subjectTiles.isNotEmpty) {
|
if (subjectTiles.isNotEmpty) {
|
||||||
EdgeInsetsGeometry panelPadding = const EdgeInsets.symmetric(horizontal: 24.0);
|
EdgeInsetsGeometry panelPadding =
|
||||||
|
const EdgeInsets.symmetric(horizontal: 24.0);
|
||||||
|
|
||||||
if (subjectTiles[index].runtimeType == GradeSubjectTile) {
|
if (subjectTiles[index].runtimeType == GradeSubjectTile) {
|
||||||
return Padding(
|
return Padding(
|
||||||
@@ -248,7 +296,8 @@ class _GradesPageState extends State<GradesPage> {
|
|||||||
padding: const EdgeInsets.symmetric(horizontal: 8.0),
|
padding: const EdgeInsets.symmetric(horizontal: 8.0),
|
||||||
));
|
));
|
||||||
} else {
|
} else {
|
||||||
return Padding(padding: panelPadding, child: subjectTiles[index]);
|
return Padding(
|
||||||
|
padding: panelPadding, child: subjectTiles[index]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return Container();
|
return Container();
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter_custom_tabs/flutter_custom_tabs.dart' as tabs;
|
import 'package:flutter_custom_tabs/flutter_custom_tabs.dart' as tabs;
|
||||||
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:filcnaplo/utils/color.dart';
|
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
import 'settings_screen.i18n.dart';
|
import 'settings_screen.i18n.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
@@ -97,9 +96,11 @@ class _SettingsScreenState extends State<SettingsScreen>
|
|||||||
Text(!settings.presentationMode ? account.username : "72469696969"),
|
Text(!settings.presentationMode ? account.username : "72469696969"),
|
||||||
profileImage: ProfileImage(
|
profileImage: ProfileImage(
|
||||||
name: _firstName,
|
name: _firstName,
|
||||||
backgroundColor: !settings.presentationMode
|
backgroundColor: Theme.of(context)
|
||||||
? ColorUtils.stringToColor(account.name)
|
.colorScheme
|
||||||
: Theme.of(context).colorScheme.secondary,
|
.primary, //!settings.presentationMode
|
||||||
|
//? ColorUtils.stringToColor(account.name)
|
||||||
|
//: Theme.of(context).colorScheme.secondary,
|
||||||
role: account.role,
|
role: account.role,
|
||||||
),
|
),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ extension SettingsLocalization on String {
|
|||||||
"goodstudent": "Good student mode",
|
"goodstudent": "Good student mode",
|
||||||
"attention": "Attention!",
|
"attention": "Attention!",
|
||||||
"goodstudent_disclaimer":
|
"goodstudent_disclaimer":
|
||||||
"Filc Napló® Informatikai Zrt. can not be held liable for the usage of this feature.\n\n(if your mother beats you up because you showed her fake grades, you can only blame yourself for it)",
|
"reFilc can not be held liable for the usage of this feature.\n\n(if your mother beats you up because you showed her fake grades, you can only blame yourself for it)",
|
||||||
"understand": "I understand",
|
"understand": "I understand",
|
||||||
"secret": "Secret Settings",
|
"secret": "Secret Settings",
|
||||||
"bell_delay": "Bell Delay",
|
"bell_delay": "Bell Delay",
|
||||||
@@ -105,7 +105,7 @@ extension SettingsLocalization on String {
|
|||||||
"goodstudent": "Jó tanuló mód",
|
"goodstudent": "Jó tanuló mód",
|
||||||
"attention": "Figyelem!",
|
"attention": "Figyelem!",
|
||||||
"goodstudent_disclaimer":
|
"goodstudent_disclaimer":
|
||||||
"A Filc Napló® Informatikai Zrt. minden felelősséget elhárít a funkció használatával kapcsolatban.\n\n(Értsd: ha az anyád megver, mert megtévesztő ábrákat mutattál neki, azért csakis magadadat hibáztathatod.)",
|
"A reFilc minden felelősséget elhárít a funkció használatával kapcsolatban.\n\n(Értsd: ha az anyád megver, mert megtévesztő ábrákat mutattál neki, azért csakis magadadat hibáztathatod.)",
|
||||||
"understand": "Értem",
|
"understand": "Értem",
|
||||||
"secret": "Titkos Beállítások",
|
"secret": "Titkos Beállítások",
|
||||||
"bell_delay": "Csengő eltolódása",
|
"bell_delay": "Csengő eltolódása",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
BSD 3-Clause License
|
BSD 3-Clause License
|
||||||
|
|
||||||
Copyright (c) 2021, Filc
|
Copyright (c) 2023, reFilc
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
BSD 3-Clause License
|
BSD 3-Clause License
|
||||||
|
|
||||||
Copyright (c) 2021, Filc
|
Copyright (c) 2023, reFilc
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
|||||||
@@ -4,30 +4,40 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:i18n_extension/i18n_widget.dart';
|
import 'package:i18n_extension/i18n_widget.dart';
|
||||||
|
|
||||||
class AverageDisplay extends StatelessWidget {
|
class AverageDisplay extends StatelessWidget {
|
||||||
const AverageDisplay({Key? key, this.average = 0.0, this.border = false}) : super(key: key);
|
const AverageDisplay({Key? key, this.average = 0.0, this.border = false})
|
||||||
|
: super(key: key);
|
||||||
|
|
||||||
final double average;
|
final double average;
|
||||||
final bool border;
|
final bool border;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
Color color = average == 0.0 ? AppColors.of(context).text.withOpacity(.8) : gradeColor(context: context, value: average);
|
Color color = average == 0.0
|
||||||
|
? AppColors.of(context).text.withOpacity(.8)
|
||||||
|
: gradeColor(context: context, value: average);
|
||||||
|
|
||||||
String averageText = average.toStringAsFixed(2);
|
String averageText = average.toStringAsFixed(2);
|
||||||
if (I18n.of(context).locale.languageCode != "en") averageText = averageText.replaceAll(".", ",");
|
if (I18n.of(context).locale.languageCode != "en") {
|
||||||
|
averageText = averageText.replaceAll(".", ",");
|
||||||
|
}
|
||||||
|
|
||||||
return Container(
|
return Container(
|
||||||
width: border ? 57.0 : 54.0,
|
width: border ? 57.0 : 54.0,
|
||||||
padding: EdgeInsets.symmetric(horizontal: 8.0 - (border ? 2 : 0), vertical: 6.0 - (border ? 2 : 0)),
|
padding: EdgeInsets.symmetric(
|
||||||
|
horizontal: 8.0 - (border ? 2 : 0), vertical: 6.0 - (border ? 2 : 0)),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius: BorderRadius.circular(45.0),
|
borderRadius: BorderRadius.circular(45.0),
|
||||||
border: border ? Border.fromBorderSide(BorderSide(color: color.withOpacity(.5), width: 3.0)) : null,
|
border: border
|
||||||
|
? Border.fromBorderSide(
|
||||||
|
BorderSide(color: color.withOpacity(.5), width: 3.0))
|
||||||
|
: null,
|
||||||
color: !border ? color.withOpacity(average == 0.0 ? .15 : .25) : null,
|
color: !border ? color.withOpacity(average == 0.0 ? .15 : .25) : null,
|
||||||
),
|
),
|
||||||
child: Text(
|
child: Text(
|
||||||
average == 0.0 ? "-" : averageText,
|
average == 0.0 ? "-" : averageText,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
style: TextStyle(color: color, fontWeight: FontWeight.w600),
|
style: TextStyle(
|
||||||
|
color: color, fontWeight: FontWeight.w600, fontSize: 14.0),
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -57,7 +57,8 @@ class _HeroScrollViewState extends State<HeroScrollView> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return NestedScrollView(
|
return NestedScrollView(
|
||||||
controller: _scrollController,
|
controller: _scrollController,
|
||||||
physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
|
physics:
|
||||||
|
const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
|
||||||
headerSliverBuilder: (context, _) => [
|
headerSliverBuilder: (context, _) => [
|
||||||
SliverAppBar(
|
SliverAppBar(
|
||||||
pinned: true,
|
pinned: true,
|
||||||
@@ -70,7 +71,8 @@ class _HeroScrollViewState extends State<HeroScrollView> {
|
|||||||
opacity: showBarTitle ? 1.0 : 0.0,
|
opacity: showBarTitle ? 1.0 : 0.0,
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Icon(widget.icon, color: AppColors.of(context).text.withOpacity(.8)),
|
Icon(widget.icon,
|
||||||
|
color: AppColors.of(context).text.withOpacity(.8)),
|
||||||
const SizedBox(width: 8.0),
|
const SizedBox(width: 8.0),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Text(
|
child: Text(
|
||||||
@@ -78,7 +80,9 @@ class _HeroScrollViewState extends State<HeroScrollView> {
|
|||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
maxLines: 2,
|
maxLines: 2,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: AppColors.of(context).text, fontWeight: FontWeight.w500, fontStyle: widget.italic ? FontStyle.italic : null),
|
color: AppColors.of(context).text,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
fontStyle: widget.italic ? FontStyle.italic : null),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@@ -94,7 +98,7 @@ class _HeroScrollViewState extends State<HeroScrollView> {
|
|||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
actions: widget.navBarItems,
|
actions: widget.navBarItems,
|
||||||
expandedHeight: 124.0,
|
expandedHeight: 145.69,
|
||||||
stretch: true,
|
stretch: true,
|
||||||
flexibleSpace: FlexibleSpaceBar(
|
flexibleSpace: FlexibleSpaceBar(
|
||||||
background: Stack(
|
background: Stack(
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ class ProfileButton extends StatelessWidget {
|
|||||||
: Theme.of(context).colorScheme.secondary,
|
: Theme.of(context).colorScheme.secondary,
|
||||||
heroTag: child.heroTag,
|
heroTag: child.heroTag,
|
||||||
key: child.key,
|
key: child.key,
|
||||||
name: !pMode ? child.name : "Béla",
|
name: !pMode ? child.name : "János",
|
||||||
radius: child.radius,
|
radius: child.radius,
|
||||||
badge: child.badge,
|
badge: child.badge,
|
||||||
role: child.role,
|
role: child.role,
|
||||||
@@ -86,7 +86,7 @@ class ProfileButton extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
onDoubleTap: () {
|
onLongPress: () {
|
||||||
if (account != null) {
|
if (account != null) {
|
||||||
user.setUser(account!.id);
|
user.setUser(account!.id);
|
||||||
restore().then((_) => user.setUser(account!.id));
|
restore().then((_) => user.setUser(account!.id));
|
||||||
|
|||||||
@@ -6,7 +6,12 @@ import 'package:filcnaplo_mobile_ui/common/average_display.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class GradeSubjectTile extends StatelessWidget {
|
class GradeSubjectTile extends StatelessWidget {
|
||||||
const GradeSubjectTile(this.subject, {Key? key, this.average = 0.0, this.groupAverage = 0.0, this.onTap, this.averageBefore = 0.0})
|
const GradeSubjectTile(this.subject,
|
||||||
|
{Key? key,
|
||||||
|
this.average = 0.0,
|
||||||
|
this.groupAverage = 0.0,
|
||||||
|
this.onTap,
|
||||||
|
this.averageBefore = 0.0})
|
||||||
: super(key: key);
|
: super(key: key);
|
||||||
|
|
||||||
final Subject subject;
|
final Subject subject;
|
||||||
@@ -25,7 +30,9 @@ class GradeSubjectTile extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final String changeIcon = average < averageBefore ? "▼" : "▲";
|
final String changeIcon = average < averageBefore ? "▼" : "▲";
|
||||||
final Color changeColor = average < averageBefore ? Colors.redAccent : Colors.lightGreenAccent.shade700;
|
final Color changeColor = average < averageBefore
|
||||||
|
? Colors.redAccent
|
||||||
|
: Colors.lightGreenAccent.shade700;
|
||||||
|
|
||||||
return Material(
|
return Material(
|
||||||
type: MaterialType.transparency,
|
type: MaterialType.transparency,
|
||||||
@@ -36,22 +43,30 @@ class GradeSubjectTile extends StatelessWidget {
|
|||||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)),
|
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)),
|
||||||
visualDensity: VisualDensity.compact,
|
visualDensity: VisualDensity.compact,
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
leading: Icon(SubjectIcon.resolveVariant(subject: subject, context: context), color: textColor.withOpacity(.75)),
|
leading: Icon(
|
||||||
|
SubjectIcon.resolveVariant(subject: subject, context: context),
|
||||||
|
color: textColor.withOpacity(.75)),
|
||||||
title: Text(
|
title: Text(
|
||||||
subject.renamedTo ?? subject.name.capital(),
|
subject.renamedTo ?? subject.name.capital(),
|
||||||
maxLines: 2,
|
maxLines: 2,
|
||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
style: TextStyle(fontWeight: FontWeight.w600, fontSize: 14.0, color: textColor, fontStyle: subject.isRenamed ? FontStyle.italic : null),
|
style: TextStyle(
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
fontSize: 14.0,
|
||||||
|
color: textColor,
|
||||||
|
fontStyle: subject.isRenamed ? FontStyle.italic : null),
|
||||||
),
|
),
|
||||||
trailing: Row(
|
trailing: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
if (groupAverage != 0 && averageBefore == 0.0) AverageDisplay(average: groupAverage, border: true),
|
if (groupAverage != 0 && averageBefore == 0.0)
|
||||||
|
AverageDisplay(average: groupAverage, border: true),
|
||||||
const SizedBox(width: 6.0),
|
const SizedBox(width: 6.0),
|
||||||
if (averageBefore != 0.0 && averageBefore != average) ...[
|
if (averageBefore != 0.0 && averageBefore != average) ...[
|
||||||
AverageDisplay(average: averageBefore),
|
AverageDisplay(average: averageBefore),
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(left: 6.0, right: 6.0, bottom: 3.5),
|
padding:
|
||||||
|
const EdgeInsets.only(left: 6.0, right: 6.0, bottom: 3.5),
|
||||||
child: Text(
|
child: Text(
|
||||||
changeIcon,
|
changeIcon,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
|
|||||||
@@ -29,16 +29,18 @@ import 'package:flutter_expandable_fab/flutter_expandable_fab.dart';
|
|||||||
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'grades_page.i18n.dart';
|
import 'grades_page.i18n.dart';
|
||||||
// import 'package:filcnaplo_premium/ui/mobile/goalplanner/new_goal.dart';
|
// import 'package:filcnaplo_premium/ui/mobile/goal_planner/new_goal.dart';
|
||||||
|
|
||||||
class GradeSubjectView extends StatefulWidget {
|
class GradeSubjectView extends StatefulWidget {
|
||||||
const GradeSubjectView(this.subject, {Key? key, this.groupAverage = 0.0}) : super(key: key);
|
const GradeSubjectView(this.subject, {Key? key, this.groupAverage = 0.0})
|
||||||
|
: super(key: key);
|
||||||
|
|
||||||
final Subject subject;
|
final Subject subject;
|
||||||
final double groupAverage;
|
final double groupAverage;
|
||||||
|
|
||||||
void push(BuildContext context, {bool root = false}) {
|
void push(BuildContext context, {bool root = false}) {
|
||||||
Navigator.of(context, rootNavigator: root).push(CupertinoPageRoute(builder: (context) => this));
|
Navigator.of(context, rootNavigator: root)
|
||||||
|
.push(CupertinoPageRoute(builder: (context) => this));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -73,7 +75,8 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
|
|||||||
final gradeDates = subjectGrades.map((e) => e.date.millisecondsSinceEpoch);
|
final gradeDates = subjectGrades.map((e) => e.date.millisecondsSinceEpoch);
|
||||||
final maxGradeDate = gradeDates.fold(0, max);
|
final maxGradeDate = gradeDates.fold(0, max);
|
||||||
final minGradeDate = gradeDates.fold(0, min);
|
final minGradeDate = gradeDates.fold(0, min);
|
||||||
if (maxGradeDate - minGradeDate < const Duration(days: 5).inMilliseconds) return false; // naplo/#78
|
if (maxGradeDate - minGradeDate < const Duration(days: 5).inMilliseconds)
|
||||||
|
return false; // naplo/#78
|
||||||
|
|
||||||
return subjectGrades.where((e) => e.type == GradeType.midYear).length > 1;
|
return subjectGrades.where((e) => e.type == GradeType.midYear).length > 1;
|
||||||
}
|
}
|
||||||
@@ -139,7 +142,8 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
tiles.add(Padding(padding: EdgeInsets.only(bottom: !gradeCalcMode ? 24.0 : 250.0)));
|
tiles.add(Padding(
|
||||||
|
padding: EdgeInsets.only(bottom: !gradeCalcMode ? 24.0 : 250.0)));
|
||||||
gradeTiles = List.castFrom(tiles);
|
gradeTiles = List.castFrom(tiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,7 +156,10 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
|
|||||||
average = AverageHelper.averageEvals(subjectGrades);
|
average = AverageHelper.averageEvals(subjectGrades);
|
||||||
final prevAvg = subjectGrades.isNotEmpty
|
final prevAvg = subjectGrades.isNotEmpty
|
||||||
? AverageHelper.averageEvals(subjectGrades
|
? AverageHelper.averageEvals(subjectGrades
|
||||||
.where((e) => e.date.isBefore(subjectGrades.reduce((v, e) => e.date.isAfter(v.date) ? e : v).date.subtract(const Duration(days: 30))))
|
.where((e) => e.date.isBefore(subjectGrades
|
||||||
|
.reduce((v, e) => e.date.isAfter(v.date) ? e : v)
|
||||||
|
.date
|
||||||
|
.subtract(const Duration(days: 30))))
|
||||||
.toList())
|
.toList())
|
||||||
: 0.0;
|
: 0.0;
|
||||||
|
|
||||||
@@ -163,12 +170,14 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
|
|||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
Text("annual_average".i18n),
|
Text("annual_average".i18n),
|
||||||
if (average != prevAvg) TrendDisplay(current: average, previous: prevAvg),
|
if (average != prevAvg)
|
||||||
|
TrendDisplay(current: average, previous: prevAvg),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
child: Container(
|
child: Container(
|
||||||
padding: const EdgeInsets.only(top: 16.0, right: 12.0),
|
padding: const EdgeInsets.only(top: 16.0, right: 12.0),
|
||||||
child: GradeGraph(subjectGrades, dayThreshold: 5, classAvg: widget.groupAverage),
|
child: GradeGraph(subjectGrades,
|
||||||
|
dayThreshold: 5, classAvg: widget.groupAverage),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -176,7 +185,9 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
|
|||||||
if (!gradeCalcMode) {
|
if (!gradeCalcMode) {
|
||||||
buildTiles(subjectGrades);
|
buildTiles(subjectGrades);
|
||||||
} else {
|
} else {
|
||||||
List<Grade> ghostGrades = calculatorProvider.ghosts.where((e) => e.subject == widget.subject).toList();
|
List<Grade> ghostGrades = calculatorProvider.ghosts
|
||||||
|
.where((e) => e.subject == widget.subject)
|
||||||
|
.toList();
|
||||||
buildTiles(ghostGrades);
|
buildTiles(ghostGrades);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,7 +195,10 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
|
|||||||
key: _scaffoldKey,
|
key: _scaffoldKey,
|
||||||
floatingActionButtonLocation: ExpandableFab.location,
|
floatingActionButtonLocation: ExpandableFab.location,
|
||||||
floatingActionButton: Visibility(
|
floatingActionButton: Visibility(
|
||||||
visible: !gradeCalcMode && subjectGrades.where((e) => e.type == GradeType.midYear).isNotEmpty,
|
visible: !gradeCalcMode &&
|
||||||
|
subjectGrades
|
||||||
|
.where((e) => e.type == GradeType.midYear)
|
||||||
|
.isNotEmpty,
|
||||||
child: ExpandableFab(
|
child: ExpandableFab(
|
||||||
backgroundColor: Theme.of(context).colorScheme.secondary,
|
backgroundColor: Theme.of(context).colorScheme.secondary,
|
||||||
type: ExpandableFabType.up,
|
type: ExpandableFabType.up,
|
||||||
@@ -204,14 +218,19 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
|
|||||||
child: const Icon(FeatherIcons.flag, size: 20.0),
|
child: const Icon(FeatherIcons.flag, size: 20.0),
|
||||||
backgroundColor: Theme.of(context).colorScheme.secondary,
|
backgroundColor: Theme.of(context).colorScheme.secondary,
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
if (!Provider.of<PremiumProvider>(context, listen: false).hasScope(PremiumScopes.goalPlanner)) {
|
if (!Provider.of<PremiumProvider>(context, listen: false)
|
||||||
PremiumLockedFeatureUpsell.show(context: context, feature: PremiumFeature.goalplanner);
|
.hasScope(PremiumScopes.goalPlanner)) {
|
||||||
|
PremiumLockedFeatureUpsell.show(
|
||||||
|
context: context, feature: PremiumFeature.goalplanner);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text("Hamarosan...")));
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
const SnackBar(content: Text("Hamarosan...")));
|
||||||
|
|
||||||
// Navigator.of(context).push(CupertinoPageRoute(builder: (context) => PremiumGoalplannerNewGoalScreen(subject: widget.subject)));
|
//Navigator.of(context).push(CupertinoPageRoute(
|
||||||
|
//builder: (context) => PremiumGoalplannerNewGoalScreen(
|
||||||
|
// subject: widget.subject)));
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@@ -230,12 +249,17 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
|
|||||||
},
|
},
|
||||||
navBarItems: [
|
navBarItems: [
|
||||||
const SizedBox(width: 6.0),
|
const SizedBox(width: 6.0),
|
||||||
if (widget.groupAverage != 0) Center(child: AverageDisplay(average: widget.groupAverage, border: true)),
|
if (widget.groupAverage != 0)
|
||||||
|
Center(
|
||||||
|
child: AverageDisplay(
|
||||||
|
average: widget.groupAverage, border: true)),
|
||||||
const SizedBox(width: 6.0),
|
const SizedBox(width: 6.0),
|
||||||
if (average != 0) Center(child: AverageDisplay(average: average)),
|
if (average != 0)
|
||||||
|
Center(child: AverageDisplay(average: average)),
|
||||||
const SizedBox(width: 12.0),
|
const SizedBox(width: 12.0),
|
||||||
],
|
],
|
||||||
icon: SubjectIcon.resolveVariant(subject: widget.subject, context: context),
|
icon: SubjectIcon.resolveVariant(
|
||||||
|
subject: widget.subject, context: context),
|
||||||
scrollController: _scrollController,
|
scrollController: _scrollController,
|
||||||
title: widget.subject.renamedTo ?? widget.subject.name.capital(),
|
title: widget.subject.renamedTo ?? widget.subject.name.capital(),
|
||||||
italic: widget.subject.isRenamed,
|
italic: widget.subject.isRenamed,
|
||||||
@@ -255,13 +279,15 @@ class _GradeSubjectViewState extends State<GradeSubjectView> {
|
|||||||
|
|
||||||
void gradeCalc(BuildContext context) {
|
void gradeCalc(BuildContext context) {
|
||||||
// Scroll to the top of the page
|
// Scroll to the top of the page
|
||||||
_scrollController.animateTo(75, duration: const Duration(milliseconds: 500), curve: Curves.ease);
|
_scrollController.animateTo(75,
|
||||||
|
duration: const Duration(milliseconds: 500), curve: Curves.ease);
|
||||||
|
|
||||||
calculatorProvider.clear();
|
calculatorProvider.clear();
|
||||||
calculatorProvider.addAllGrades(gradeProvider.grades);
|
calculatorProvider.addAllGrades(gradeProvider.grades);
|
||||||
|
|
||||||
_sheetController = _scaffoldKey.currentState?.showBottomSheet(
|
_sheetController = _scaffoldKey.currentState?.showBottomSheet(
|
||||||
(context) => RoundedBottomSheet(child: GradeCalculator(widget.subject), borderRadius: 14.0),
|
(context) => RoundedBottomSheet(
|
||||||
|
child: GradeCalculator(widget.subject), borderRadius: 14.0),
|
||||||
backgroundColor: const Color(0x00000000),
|
backgroundColor: const Color(0x00000000),
|
||||||
elevation: 12.0,
|
elevation: 12.0,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -108,6 +108,16 @@ class _HomePageState extends State<HomePage> with TickerProviderStateMixin {
|
|||||||
now.day == user.student?.birth.day) {
|
now.day == user.student?.birth.day) {
|
||||||
greeting = "happybirthday";
|
greeting = "happybirthday";
|
||||||
|
|
||||||
|
if (NavigationScreen.of(context)?.init("confetti") ?? false) {
|
||||||
|
_confettiController =
|
||||||
|
ConfettiController(duration: const Duration(seconds: 3));
|
||||||
|
Future.delayed(const Duration(seconds: 1))
|
||||||
|
.then((value) => mounted ? _confettiController?.play() : null);
|
||||||
|
}
|
||||||
|
} else if (now.isAfter(DateTime(now.year, DateTime.may, 28)) &&
|
||||||
|
now.isBefore(DateTime(now.year, DateTime.may, 30))) {
|
||||||
|
greeting = "refilcopen";
|
||||||
|
|
||||||
if (NavigationScreen.of(context)?.init("confetti") ?? false) {
|
if (NavigationScreen.of(context)?.init("confetti") ?? false) {
|
||||||
_confettiController =
|
_confettiController =
|
||||||
ConfettiController(duration: const Duration(seconds: 3));
|
ConfettiController(duration: const Duration(seconds: 3));
|
||||||
@@ -149,7 +159,7 @@ class _HomePageState extends State<HomePage> with TickerProviderStateMixin {
|
|||||||
if (!settings.presentationMode) {
|
if (!settings.presentationMode) {
|
||||||
firstName = nameParts.length > 1 ? nameParts[1] : nameParts[0];
|
firstName = nameParts.length > 1 ? nameParts[1] : nameParts[0];
|
||||||
} else {
|
} else {
|
||||||
firstName = "Béla";
|
firstName = "János";
|
||||||
}
|
}
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
@@ -285,10 +295,11 @@ class _HomePageState extends State<HomePage> with TickerProviderStateMixin {
|
|||||||
.clamp(-1.0, 1.0);
|
.clamp(-1.0, 1.0);
|
||||||
} else if (notification is ScrollEndNotification) {
|
} else if (notification is ScrollEndNotification) {
|
||||||
_tabController.index = _pageController.page!.round();
|
_tabController.index = _pageController.page!.round();
|
||||||
if (!_tabController.indexIsChanging)
|
if (!_tabController.indexIsChanging) {
|
||||||
_tabController.offset =
|
_tabController.offset =
|
||||||
(_pageController.page! - _tabController.index)
|
(_pageController.page! - _tabController.index)
|
||||||
.clamp(-1.0, 1.0);
|
.clamp(-1.0, 1.0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -11,13 +11,15 @@ extension Localization on String {
|
|||||||
"happybirthday": "🎂 Happy birthday, %s!",
|
"happybirthday": "🎂 Happy birthday, %s!",
|
||||||
"merryxmas": "🎄 Merry Christmas, %s!",
|
"merryxmas": "🎄 Merry Christmas, %s!",
|
||||||
"happynewyear": "🎉 Happy New Year, %s!",
|
"happynewyear": "🎉 Happy New Year, %s!",
|
||||||
|
"refilcopen": "🎈 Welcome in reFilc, %s!",
|
||||||
"empty": "Nothing to see here.",
|
"empty": "Nothing to see here.",
|
||||||
"All": "All",
|
"All": "All",
|
||||||
"Grades": "Grades",
|
"Grades": "Grades",
|
||||||
"Messages": "Messages",
|
"Messages": "Messages",
|
||||||
"Absences": "Absences",
|
"Absences": "Absences",
|
||||||
"update_available": "Update Available",
|
"update_available": "Update Available",
|
||||||
"missed_exams": "You missed %s exams this week.".one("You missed an exam this week."),
|
"missed_exams": "You missed %s exams this week."
|
||||||
|
.one("You missed an exam this week."),
|
||||||
"missed_exam_contact": "Contact %s, to resolve it!",
|
"missed_exam_contact": "Contact %s, to resolve it!",
|
||||||
},
|
},
|
||||||
"hu_hu": {
|
"hu_hu": {
|
||||||
@@ -28,13 +30,15 @@ extension Localization on String {
|
|||||||
"happybirthday": "🎂 Boldog születésnapot, %s!",
|
"happybirthday": "🎂 Boldog születésnapot, %s!",
|
||||||
"merryxmas": "🎄 Boldog Karácsonyt, %s!",
|
"merryxmas": "🎄 Boldog Karácsonyt, %s!",
|
||||||
"happynewyear": "🎉 Boldog új évet, %s!",
|
"happynewyear": "🎉 Boldog új évet, %s!",
|
||||||
|
"refilcopen": "🎈 Üdv a reFilc-ben, %s!",
|
||||||
"empty": "Nincs itt semmi látnivaló.",
|
"empty": "Nincs itt semmi látnivaló.",
|
||||||
"All": "Összes",
|
"All": "Összes",
|
||||||
"Grades": "Jegyek",
|
"Grades": "Jegyek",
|
||||||
"Messages": "Üzenetek",
|
"Messages": "Üzenetek",
|
||||||
"Absences": "Hiányok",
|
"Absences": "Hiányok",
|
||||||
"update_available": "Frissítés elérhető",
|
"update_available": "Frissítés elérhető",
|
||||||
"missed_exams": "Ezen a héten hiányoztál %s dolgozatról.".one("Ezen a héten hiányoztál egy dolgozatról."),
|
"missed_exams": "Ezen a héten hiányoztál %s dolgozatról."
|
||||||
|
.one("Ezen a héten hiányoztál egy dolgozatról."),
|
||||||
"missed_exam_contact": "Keresd %s-t, ha pótolni szeretnéd!",
|
"missed_exam_contact": "Keresd %s-t, ha pótolni szeretnéd!",
|
||||||
},
|
},
|
||||||
"de_de": {
|
"de_de": {
|
||||||
@@ -45,13 +49,15 @@ extension Localization on String {
|
|||||||
"happybirthday": "🎂 Alles Gute zum Geburtstag, %s!",
|
"happybirthday": "🎂 Alles Gute zum Geburtstag, %s!",
|
||||||
"merryxmas": "🎄 Frohe Weihnachten, %s!",
|
"merryxmas": "🎄 Frohe Weihnachten, %s!",
|
||||||
"happynewyear": "🎉 Frohes neues Jahr, %s!",
|
"happynewyear": "🎉 Frohes neues Jahr, %s!",
|
||||||
|
"refilcopen": "🎈 Willkommen bei reFilc, %s!",
|
||||||
"empty": "Hier gibt es nichts zu sehen.",
|
"empty": "Hier gibt es nichts zu sehen.",
|
||||||
"All": "Alles",
|
"All": "Alles",
|
||||||
"Grades": "Noten",
|
"Grades": "Noten",
|
||||||
"Messages": "Nachrichten",
|
"Messages": "Nachrichten",
|
||||||
"Absences": "Fehlen",
|
"Absences": "Fehlen",
|
||||||
"update_available": "Update verfügbar",
|
"update_available": "Update verfügbar",
|
||||||
"missed_exams": "Diese Woche haben Sie %s Prüfungen verpasst.".one("Diese Woche haben Sie eine Prüfung verpasst."),
|
"missed_exams": "Diese Woche haben Sie %s Prüfungen verpasst."
|
||||||
|
.one("Diese Woche haben Sie eine Prüfung verpasst."),
|
||||||
"missed_exam_contact": "Wenden Sie sich an %s, um sie zu erneuern!",
|
"missed_exam_contact": "Wenden Sie sich an %s, um sie zu erneuern!",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ class _PremiumButtonState extends State<PremiumButton> with TickerProviderStateM
|
|||||||
Icon(FilcIcons.premium, color: Colors.white),
|
Icon(FilcIcons.premium, color: Colors.white),
|
||||||
SizedBox(width: 12.0),
|
SizedBox(width: 12.0),
|
||||||
Text(
|
Text(
|
||||||
"Filc Napló Premium",
|
"reFilc Premium",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ class PremiumScreen extends StatelessWidget {
|
|||||||
style: TextStyle(fontWeight: FontWeight.w600, fontSize: 25.0, color: Colors.white),
|
style: TextStyle(fontWeight: FontWeight.w600, fontSize: 25.0, color: Colors.white),
|
||||||
),
|
),
|
||||||
const Text(
|
const Text(
|
||||||
"Filc Premium.",
|
"reFilc Premium.",
|
||||||
style: TextStyle(fontWeight: FontWeight.w800, fontSize: 35.0, color: Colors.white),
|
style: TextStyle(fontWeight: FontWeight.w800, fontSize: 35.0, color: Colors.white),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 15.0),
|
const SizedBox(height: 15.0),
|
||||||
@@ -221,7 +221,7 @@ class PremiumScreen extends StatelessWidget {
|
|||||||
imageKey: "premium_desktop_showcase",
|
imageKey: "premium_desktop_showcase",
|
||||||
icon: SvgPicture.asset("assets/images/desktop_icon.svg", color: Theme.of(context).iconTheme.color),
|
icon: SvgPicture.asset("assets/images/desktop_icon.svg", color: Theme.of(context).iconTheme.color),
|
||||||
title: const Text("Asztali verzió"),
|
title: const Text("Asztali verzió"),
|
||||||
description: const Text("Érd el a Filc Napló-t a gépeden is, és menekülj meg a csúnya felhasználói felületektől!"),
|
description: const Text("Érd el a reFilcet a gépeden is, és menekülj meg a csúnya felhasználói felületektől!"),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 14.0),
|
const SizedBox(height: 14.0),
|
||||||
const PremiumRewardCard(
|
const PremiumRewardCard(
|
||||||
@@ -272,7 +272,7 @@ class PremiumScreen extends StatelessWidget {
|
|||||||
const PremiumRewardCard(
|
const PremiumRewardCard(
|
||||||
title: Text("Még mindig nyílt a forráskód?"),
|
title: Text("Még mindig nyílt a forráskód?"),
|
||||||
description: Text(
|
description: Text(
|
||||||
"Igen, a Filc napló teljesen nyílt forráskódú, és ez így is fog maradni. A prémium funkciók forráskódjához hozzáférnek a támogatók."),
|
"Igen, a reFilc teljesen nyílt forráskódú, és ez így is fog maradni. A prémium funkciók forráskódjához hozzáférnek a támogatók."),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 14.0),
|
const SizedBox(height: 14.0),
|
||||||
const PremiumRewardCard(
|
const PremiumRewardCard(
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ class NavItem {
|
|||||||
final Widget icon;
|
final Widget icon;
|
||||||
final Widget activeIcon;
|
final Widget activeIcon;
|
||||||
|
|
||||||
const NavItem({required this.title, required this.icon, required this.activeIcon});
|
const NavItem(
|
||||||
|
{required this.title, required this.icon, required this.activeIcon});
|
||||||
}
|
}
|
||||||
|
|
||||||
class NavbarItem extends StatelessWidget {
|
class NavbarItem extends StatelessWidget {
|
||||||
@@ -25,14 +26,16 @@ class NavbarItem extends StatelessWidget {
|
|||||||
final Widget icon = active ? item.activeIcon : item.icon;
|
final Widget icon = active ? item.activeIcon : item.icon;
|
||||||
|
|
||||||
return SafeArea(
|
return SafeArea(
|
||||||
child: InkWell(
|
child: GestureDetector(
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 6.0),
|
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 6.0),
|
||||||
child: Container(
|
child: Container(
|
||||||
padding: const EdgeInsets.all(12.0),
|
padding: const EdgeInsets.all(12.0),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: active ? Theme.of(context).colorScheme.secondary.withOpacity(.4) : null,
|
color: active
|
||||||
|
? Theme.of(context).colorScheme.secondary.withOpacity(.4)
|
||||||
|
: null,
|
||||||
borderRadius: BorderRadius.circular(14.0),
|
borderRadius: BorderRadius.circular(14.0),
|
||||||
),
|
),
|
||||||
child: Stack(
|
child: Stack(
|
||||||
@@ -45,7 +48,9 @@ class NavbarItem extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
IconTheme(
|
IconTheme(
|
||||||
data: IconThemeData(
|
data: IconThemeData(
|
||||||
color: Theme.of(context).brightness == Brightness.light ? Colors.black.withOpacity(.5) : Colors.white.withOpacity(.3),
|
color: Theme.of(context).brightness == Brightness.light
|
||||||
|
? Colors.black.withOpacity(.5)
|
||||||
|
: Colors.white.withOpacity(.3),
|
||||||
),
|
),
|
||||||
child: icon,
|
child: icon,
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ class NavigationScreenState extends State<NavigationScreen>
|
|||||||
|
|
||||||
initPlatformState();
|
initPlatformState();
|
||||||
|
|
||||||
HomeWidget.setAppGroupId('hu.filc.naplo.group');
|
HomeWidget.setAppGroupId('hu.refilc.naplo.group');
|
||||||
|
|
||||||
_checkForWidgetLaunch();
|
_checkForWidgetLaunch();
|
||||||
HomeWidget.widgetClicked.listen(_launchedFromWidget);
|
HomeWidget.widgetClicked.listen(_launchedFromWidget);
|
||||||
|
|||||||