Compare commits

..

38 Commits

Author SHA1 Message Date
Móricz Gergő
e6fb8a8a50 fix(ios): fix bundle and team 2023-05-29 12:05:10 +02:00
Móricz Gergő
e93a05f795 fix permissions of build-ipa.sh 2023-05-29 12:03:30 +02:00
Móricz Gergő
8c7601c1bc bump version 2023-05-29 12:02:59 +02:00
Kima
5d18354cbb added release confetti and welcome message 2023-05-29 10:05:25 +02:00
Kima
7543f946f2 Merge branch 'master' of github.com:refilc/naplo 2023-05-28 17:32:41 +02:00
Kima
e75112b043 changed api endpoints to refilc api 2023-05-28 17:32:38 +02:00
kima
7b28688925 webhook teszt 2 2023-05-28 15:40:20 +02:00
kima
348d575c62 dc webhook teszt 2023-05-28 15:39:11 +02:00
kima
e81490ec34 Update README.md 2023-05-28 15:01:13 +02:00
Kima
ebdac408b0 fixed grade font size 2023-05-28 12:51:45 +02:00
Kima
9411208f81 commented "remove premium" button 2023-05-28 09:45:32 +02:00
Kima
9a7f8c06f6 Merge branch 'master' of github.com:refilc/naplo 2023-05-27 22:37:07 +02:00
Kima
0f6e6bfb65 fixed account edit bugs 2023-05-27 22:37:04 +02:00
chromium
8f499bd050 Delete release.yml 2023-05-27 18:24:13 +02:00
chromium
80069719f2 Create release.yml 2023-05-27 18:22:02 +02:00
chromium
48c904258a remove broken script from build action 2023-05-27 16:38:24 +02:00
chromium
1606d9da99 maybe fix actions build 2023-05-27 16:33:06 +02:00
Vízhányó Balázs
87e185f6f1 Contributing.md fix 2023-05-27 16:25:28 +02:00
chromium
80f1896752 fix end of line sequence for fix-d8dx.sh 2023-05-27 16:09:52 +02:00
chromium
1e5e984fe6 Update android.yml 2023-05-27 16:07:03 +02:00
Gergő Móricz
4f5c36db18 fix secret names 2023-05-27 16:06:33 +02:00
chromium
8090ff35ec Update and rename build.yml to android.yml 2023-05-27 15:55:51 +02:00
Gergő Móricz
3b6af5fe9f add iOS github action 2023-05-27 15:49:09 +02:00
chromium
d10eab19fc Update build.yml 2023-05-27 15:47:28 +02:00
Móricz Gergő
03a779ea9c fix(build): scripts shouldn't need fish 2023-05-27 15:46:18 +02:00
Vízhányó Balázs
be269a4a34 Merge branch 'master' of https://github.com/refilc/naplo 2023-05-27 15:44:28 +02:00
Vízhányó Balázs
0e25c68e5a Settings - about 2023-05-27 15:44:21 +02:00
chromium
364f41e3c4 fix build script 2023-05-27 15:43:47 +02:00
chromium
de079bd6ee fix fucky end of line sequence on build script 2023-05-27 15:39:37 +02:00
chromium
35524589e4 Update build.gradle 2023-05-27 15:28:20 +02:00
chromium
cdd8886692 Delete filc3.properties 2023-05-27 15:26:29 +02:00
chromium
4ddf99feb4 Update build.yml 2023-05-27 15:25:06 +02:00
chromium
4ff065d1b4 actions 2023-05-27 15:22:24 +02:00
Móricz Gergő
9d355dbc00 bump 2023-05-27 15:15:52 +02:00
Móricz Gergő
eb9e433070 add build-ipa.sh 2023-05-27 15:15:22 +02:00
Móricz Gergő
62694c4bb8 rename 2023-05-27 15:14:48 +02:00
chromium
5cb4e5c82e don't copy built apk file to the desktop 2023-05-27 15:02:45 +02:00
Móricz Gergő
74caba75d6 bump version 2023-05-27 14:56:36 +02:00
38 changed files with 356 additions and 208 deletions

40
.github/workflows/android.yml vendored Normal file
View 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
View 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

View File

@@ -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.
--- ---

View File

@@ -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

View File

@@ -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

View File

@@ -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 {

View File

@@ -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"
} }
} }

View File

@@ -1,4 +0,0 @@
storePassword=filc3fix
keyPassword=filc3fix
keyAlias=upload
storeFile=C:/Users/Peti/upload-keystore.jks

3
filcnaplo/build-ipa.sh Executable file
View 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

View File

@@ -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

View File

@@ -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>

View File

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

View File

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

View File

@@ -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),

View File

@@ -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

View File

@@ -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

View File

@@ -425,7 +425,7 @@
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = MYUTW2GF6J; DEVELOPMENT_TEAM = MYUTW2GF6J;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "Filc Napló"; INFOPLIST_KEY_CFBundleDisplayName = "reFilc";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education";
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
@@ -565,7 +565,7 @@
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = MYUTW2GF6J; DEVELOPMENT_TEAM = MYUTW2GF6J;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "Filc Napló"; INFOPLIST_KEY_CFBundleDisplayName = "reFilc";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education";
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
@@ -595,7 +595,7 @@
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = MYUTW2GF6J; DEVELOPMENT_TEAM = MYUTW2GF6J;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "Filc Napló"; INFOPLIST_KEY_CFBundleDisplayName = "reFilc";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education";
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",

View File

@@ -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

View File

@@ -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.0+198
environment: environment:
sdk: ">=2.17.0 <3.0.0" sdk: ">=2.17.0 <3.0.0"

View File

@@ -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: () {

View File

@@ -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",

View File

@@ -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

View File

@@ -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

View File

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

View File

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

View File

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

View File

@@ -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;
}, },

View File

@@ -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!",
}, },
}; };

View File

@@ -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,

View File

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

View File

@@ -25,10 +25,10 @@ class PrivacyView extends StatelessWidget {
), ),
SelectableLinkify( SelectableLinkify(
text: """ text: """
A Filc Napló egy kliensalkalmazás, segítségével az e-Kréta rendszeréből letöltheted és felhasználóbarát módon megjelenítheted az adataidat. A reFilc egy kliensalkalmazás, segítségével az e-Kréta rendszeréből letöltheted és felhasználóbarát módon megjelenítheted az adataidat.
Tanulmányi adataid csak közvetlenül az alkalmazás és a Kréta-szerverek között közlekednek, titkosított kapcsolaton keresztül. Tanulmányi adataid csak közvetlenül az alkalmazás és a Kréta-szerverek között közlekednek, titkosított kapcsolaton keresztül.
A Filc fejlesztői és üzemeltetői a tanulmányi adataidat semmilyen célból nem másolják, nem tárolják és harmadik félnek nem továbbítják. Ezeket így az e-Kréta Informatikai Zrt. kezeli, az ő tájékoztatójukat itt találod: https://tudasbazis.ekreta.hu/pages/viewpage.action?pageId=4065038. A reFilc fejlesztői és üzemeltetői a tanulmányi adataidat semmilyen célból nem másolják, nem tárolják és harmadik félnek nem továbbítják. Ezeket így az e-Kréta Informatikai Zrt. kezeli, az ő tájékoztatójukat itt találod: https://tudasbazis.ekreta.hu/pages/viewpage.action?pageId=4065038.
Azok törlésével vagy módosítával kapcsolatban keresd az osztályfőnöködet vagy az iskolád rendszergazdáját. Azok törlésével vagy módosítával kapcsolatban keresd az osztályfőnöködet vagy az iskolád rendszergazdáját.
Az alkalmazás névtelen használati statisztikákat gyűjt, ezek alapján tudjuk meghatározni a felhasználók és a telepítések számát. Ezt a beállításokban kikapcsolhatod. Az alkalmazás névtelen használati statisztikákat gyűjt, ezek alapján tudjuk meghatározni a felhasználók és a telepítések számát. Ezt a beállításokban kikapcsolhatod.
@@ -37,7 +37,7 @@ Kérünk, hogy ha csak teheted, hagyd ezt a funkciót bekapcsolva.
Amikor az alkalmazás hibába ütközik, lehetőség van hibajelentés küldésére. Amikor az alkalmazás hibába ütközik, lehetőség van hibajelentés küldésére.
Ez személyes- vagy tanulmányi adatokat nem tartalmaz, viszont részletes információval szolgál a hibáról és eszközödről. Ez személyes- vagy tanulmányi adatokat nem tartalmaz, viszont részletes információval szolgál a hibáról és eszközödről.
A küldés előtt megjelenő képernyőn a te felelősséged átnézni a továbbításra kerülő adatsort. A küldés előtt megjelenő képernyőn a te felelősséged átnézni a továbbításra kerülő adatsort.
A hibajelentéseket a Filc fejlesztői felületén és egy privát Discord szobában tároljuk, ezekhez csak az app fejlesztői férnek hozzá. A hibajelentéseket a reFilc fejlesztői felületén és egy privát Discord szobában tároljuk, ezekhez csak az app fejlesztői férnek hozzá.
Az alkalmazás belépéskor a GitHub API segítségével ellenőrzi, hogy elérhető-e új verzió, és kérésre innen is tölti le a telepítőt. Az alkalmazás belépéskor a GitHub API segítségével ellenőrzi, hogy elérhető-e új verzió, és kérésre innen is tölti le a telepítőt.
Ha az adataiddal kapcsolatban bármilyen kérdésed van (törlés, módosítás, adathordozás), keress minket a filcnaplo@filcnaplo.hu címen. Ha az adataiddal kapcsolatban bármilyen kérdésed van (törlés, módosítás, adathordozás), keress minket a filcnaplo@filcnaplo.hu címen.

View File

@@ -1,6 +1,4 @@
import 'package:filcnaplo/api/providers/update_provider.dart'; import 'package:filcnaplo/api/providers/update_provider.dart';
import 'package:filcnaplo/theme/colors/accent.dart';
import 'package:filcnaplo/theme/observer.dart';
import 'package:filcnaplo_kreta_api/providers/absence_provider.dart'; import 'package:filcnaplo_kreta_api/providers/absence_provider.dart';
import 'package:filcnaplo_kreta_api/providers/event_provider.dart'; import 'package:filcnaplo_kreta_api/providers/event_provider.dart';
import 'package:filcnaplo_kreta_api/providers/exam_provider.dart'; import 'package:filcnaplo_kreta_api/providers/exam_provider.dart';
@@ -30,7 +28,6 @@ import 'package:filcnaplo_mobile_ui/screens/settings/accounts/account_view.dart'
import 'package:filcnaplo_mobile_ui/screens/settings/debug/subject_icon_gallery.dart'; import 'package:filcnaplo_mobile_ui/screens/settings/debug/subject_icon_gallery.dart';
import 'package:filcnaplo_mobile_ui/screens/settings/privacy_view.dart'; import 'package:filcnaplo_mobile_ui/screens/settings/privacy_view.dart';
import 'package:filcnaplo_mobile_ui/screens/settings/settings_helper.dart'; import 'package:filcnaplo_mobile_ui/screens/settings/settings_helper.dart';
import 'package:filcnaplo_premium/providers/premium_provider.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -740,21 +737,21 @@ class _SettingsScreenState extends State<SettingsScreen>
leading: const Icon(FeatherIcons.atSign), leading: const Icon(FeatherIcons.atSign),
title: const Text("Discord"), title: const Text("Discord"),
onPressed: () => launchUrl( onPressed: () => launchUrl(
Uri.parse("https://filcnaplo.hu/discord"), Uri.parse("https://dc.refilc.hu"),
mode: LaunchMode.externalApplication), mode: LaunchMode.externalApplication),
), ),
PanelButton( PanelButton(
leading: const Icon(FeatherIcons.globe), leading: const Icon(FeatherIcons.globe),
title: const Text("www.filcnaplo.hu"), title: const Text("www.refilc.hu"),
onPressed: () => launchUrl( onPressed: () => launchUrl(
Uri.parse("https://filcnaplo.hu"), Uri.parse("https://www.refilc.hu"),
mode: LaunchMode.externalApplication), mode: LaunchMode.externalApplication),
), ),
PanelButton( PanelButton(
leading: const Icon(FeatherIcons.github), leading: const Icon(FeatherIcons.github),
title: const Text("Github"), title: const Text("Github"),
onPressed: () => launchUrl( onPressed: () => launchUrl(
Uri.parse("https://github.com/filc"), Uri.parse("https://github.com/refilc"),
mode: LaunchMode.externalApplication), mode: LaunchMode.externalApplication),
), ),
PanelButton( PanelButton(
@@ -857,21 +854,21 @@ class _SettingsScreenState extends State<SettingsScreen>
Provider.of<KretaClient>(context, listen: false) Provider.of<KretaClient>(context, listen: false)
.accessToken!)), .accessToken!)),
), ),
if (Provider.of<PremiumProvider>(context, listen: false) // if (Provider.of<PremiumProvider>(context, listen: false)
.hasPremium) // .hasPremium)
PanelButton( // PanelButton(
leading: const Icon(FeatherIcons.key), // leading: const Icon(FeatherIcons.key),
title: const Text("Remove Premium"), // title: const Text("Remove Premium"),
onPressed: () { // onPressed: () {
Provider.of<PremiumProvider>(context, listen: false) // Provider.of<PremiumProvider>(context, listen: false)
.activate(removePremium: true); // .activate(removePremium: true);
settings.update( // settings.update(
accentColor: AccentColor.filc, store: true); // accentColor: AccentColor.filc, store: true);
Provider.of<ThemeModeObserver>(context, // Provider.of<ThemeModeObserver>(context,
listen: false) // listen: false)
.changeTheme(settings.theme); // .changeTheme(settings.theme);
}, // },
), // ),
], ],
), ),
), ),

View File

@@ -48,7 +48,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",
@@ -109,7 +109,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",

View File

@@ -1,2 +1,2 @@
sdk.dir=C:\\Users\\Peti\\AppData\\Local\\Android\\sdk sdk.dir=E:\\__asdks\\Android\\Sdk
flutter.sdk=D:\\flutter flutter.sdk=E:\\__asdks\\flutter

View File

@@ -14,7 +14,7 @@ import 'package:provider/provider.dart';
class UserMenuNickname extends StatelessWidget { class UserMenuNickname extends StatelessWidget {
late User u; late User u;
UserMenuNickname(User u, {Key? key}) : super(key: key); UserMenuNickname(this.u, {Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -39,7 +39,7 @@ class UserMenuNickname extends StatelessWidget {
class UserNicknameEditor extends StatefulWidget { class UserNicknameEditor extends StatefulWidget {
late User u; late User u;
UserNicknameEditor(User u, {Key? key}) : super(key: key); UserNicknameEditor(this.u, {Key? key}) : super(key: key);
@override @override
State<UserNicknameEditor> createState() => _UserNicknameEditorState(); State<UserNicknameEditor> createState() => _UserNicknameEditorState();

View File

@@ -19,7 +19,7 @@ import 'package:image_picker/image_picker.dart';
class UserMenuProfilePic extends StatelessWidget { class UserMenuProfilePic extends StatelessWidget {
late User u; late User u;
UserMenuProfilePic(User u, {Key? key}) : super(key: key); UserMenuProfilePic(this.u, {Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -43,7 +43,7 @@ class UserMenuProfilePic extends StatelessWidget {
class UserProfilePicEditor extends StatefulWidget { class UserProfilePicEditor extends StatefulWidget {
late User u; late User u;
UserProfilePicEditor(User u, {Key? key}) : super(key: key); UserProfilePicEditor(this.u, {Key? key}) : super(key: key);
@override @override
State<UserProfilePicEditor> createState() => _UserProfilePicEditorState(); State<UserProfilePicEditor> createState() => _UserProfilePicEditorState();

View File

@@ -267,7 +267,7 @@ class _PremiumCustomAccentColorSettingState extends State<PremiumCustomAccentCol
"LattamozasDatuma": null, "LattamozasDatuma": null,
"Tantargy": { "Tantargy": {
"Uid": "0", "Uid": "0",
"Nev": "Filc szakirodalom", "Nev": "reFilc szakirodalom",
"Kategoria": {"Uid": "0,_", "Nev": "_", "Leiras": "Nem mondom meg"}, "Kategoria": {"Uid": "0,_", "Nev": "_", "Leiras": "Nem mondom meg"},
"SortIndex": 2 "SortIndex": 2
}, },
@@ -313,7 +313,7 @@ class _PremiumCustomAccentColorSettingState extends State<PremiumCustomAccentCol
"LattamozasDatuma": null, "LattamozasDatuma": null,
"Tantargy": { "Tantargy": {
"Uid": "0", "Uid": "0",
"Nev": "Filc szakosztály", "Nev": "reFilc szakosztály",
"Kategoria": {"Uid": "0,_", "Nev": "_", "Leiras": "Nem mondom meg"}, "Kategoria": {"Uid": "0,_", "Nev": "_", "Leiras": "Nem mondom meg"},
"SortIndex": 2 "SortIndex": 2
}, },
@@ -357,15 +357,15 @@ class _PremiumCustomAccentColorSettingState extends State<PremiumCustomAccentCol
"Uid": "0", "Uid": "0",
"Tantargy": { "Tantargy": {
"Uid": "0", "Uid": "0",
"Nev": "Filc premium előnyei", "Nev": "reFilc premium előnyei",
"Kategoria": { "Kategoria": {
"Uid": "0,_", "Uid": "0,_",
"Nev": "_", "Nev": "_",
"Leiras": "Filc premium előnyei", "Leiras": "reFilc premium előnyei",
}, },
"SortIndex": 0 "SortIndex": 0
}, },
"TantargyNeve": "Filc premium előnyei", "TantargyNeve": "reFilc premium előnyei",
"RogzitoTanarNeve": "Kupak János", "RogzitoTanarNeve": "Kupak János",
"Szoveg": "45 perc filctollal való rajzolás", "Szoveg": "45 perc filctollal való rajzolás",
"FeladasDatuma": "2022-01-01T23:00:00Z", "FeladasDatuma": "2022-01-01T23:00:00Z",
@@ -403,7 +403,7 @@ class _PremiumCustomAccentColorSettingState extends State<PremiumCustomAccentCol
"uzenet": { "uzenet": {
"azonosito": 0, "azonosito": 0,
"kuldesDatum": "2022-01-01T23:00:00", "kuldesDatum": "2022-01-01T23:00:00",
"feladoNev": "Filc Napló", "feladoNev": "reFilc",
"feladoTitulus": "Nagyon magas szintű személy", "feladoTitulus": "Nagyon magas szintű személy",
"szoveg": "szoveg":
"<p>Kedves Felhasználó!</p><p><br></p><p>A prémium vásárlásakor kapott filctollal 90%-al több esély van jó jegyek szerzésére.</p>", "<p>Kedves Felhasználó!</p><p><br></p><p>A prémium vásárlásakor kapott filctollal 90%-al több esély van jó jegyek szerzésére.</p>",

View File

@@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
cd $ANDROID_SDK/build-tools/31.0.0 && cd $ANDROID_SDK/build-tools/31.0.0 &&
mv -v d8 dx && mv -v d8 dx &&
cd lib && cd lib &&
mv -v d8.jar dx.jar mv -v d8.jar dx.jar