diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 57b6d6f..329d2c1 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,39 +1,39 @@
-
-# Contributing Guide
-Köszönjük, ha programozással segíted a munkánkat!
-A folytatáshoz szükséged lesz egy Linuxot vagy Windowst futtató számítógépre, minimális programozási tapasztalatra és egy kis angoltudásra.
-Segít, ha nem csak kicsit tudsz programozni, és ha ismered a Gitet és a GitHubot ;)
-
-## 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.
-
-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.
-
-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).
-
-## 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.
-
-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.
-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.
-
-#### [Segítség a Flutter telepítéséhez és a forráskód futtatásához](/.github/SETUP.md)
-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.
-
-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.
-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.
-
----
-
-Az általad fejlesztett funkciók mellé a changelogban odakerül GitHub felhasználóneved.
-Ha jelentős és rendszeres hozzájáruló vagy, Discordon megkapod a `DEV` rangot.
-
-Ha bárhol elakadtál, keress minket Discordon.
-Jó fejlesztést kívánunk!
+
+# Contributing Guide
+Köszönjük, ha programozással segíted a munkánkat!
+A folytatáshoz szükséged lesz egy Linuxot vagy Windowst futtató számítógépre, minimális programozási tapasztalatra és egy kis angoltudásra.
+Segít, ha nem csak kicsit tudsz programozni, és ha ismered a Gitet és a GitHubot ;)
+
+## 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.
+
+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.
+
+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).
+
+## 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.
+
+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.
+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.
+
+#### [Segítség a Flutter telepítéséhez és a forráskód futtatásához](/.github/SETUP.md)
+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.
+
+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.
+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.
+
+---
+
+Az általad fejlesztett funkciók mellé a changelogban odakerül GitHub felhasználóneved.
+Ha jelentős és rendszeres hozzájáruló vagy, Discordon megkapod a `DEV` rangot.
+
+Ha bárhol elakadtál, keress minket Discordon.
+Jó fejlesztést kívánunk!
diff --git a/LICENSE b/LICENSE
index a23e6cd..f730060 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,29 +1,29 @@
-BSD 3-Clause License
-
-Copyright (c) 2021, Filc
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-3. Neither the name of the copyright holder nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+BSD 3-Clause License
+
+Copyright (c) 2021, Filc
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
index 09296b1..a9ac202 100644
--- a/README.md
+++ b/README.md
@@ -1,22 +1,24 @@
-
-
-
Filc Napló
-
-
-#### Nem hivatalos e-napló alkalmazás az eKRÉTA rendszerhez
-
-## Setup
-
-### Clone the project
-
-```sh
-git clone --recursive https://github.com/refilc/naplo
-cd naplo
-```
-
-### Run the app
-
-```sh
-cd filcnaplo
-flutter run
-```
+
+
+
Filc Napló
+
+
+#### Nem hivatalos e-napló alkalmazás az eKRÉTA rendszerhez
+
+[](https://github.com/filc/naplo/releases) [](http://filcnaplo.hu/discord)
+
+## Setup
+
+### Clone the project
+
+```sh
+git clone --recursive https://github.com/filc/naplo
+cd naplo
+```
+
+### Run the app
+
+```sh
+cd filcnaplo
+flutter run
+```
diff --git a/changelog.md b/changelog.md
index b1c705a..f01585f 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,13 +1,13 @@
-What's new:
-
-- design tweak
-- new premium ui
-- premium fix
-- rounding fix
-- graph percentage fix
-- fail warning
-- Widget
-- fix sent messages
-- fix ios live activities
-- Hibajavítások 🐛
-- **Megérkezett a Filc Premium!** ✨
+What's new:
+
+- design tweak
+- new premium ui
+- premium fix
+- rounding fix
+- graph percentage fix
+- fail warning
+- Widget
+- fix sent messages
+- fix ios live activities
+- Hibajavítások 🐛
+- **Megérkezett a Filc Premium!** ✨
diff --git a/filcnaplo/.gitignore b/filcnaplo/.gitignore
index 0fa6b67..8906afc 100644
--- a/filcnaplo/.gitignore
+++ b/filcnaplo/.gitignore
@@ -1,46 +1,46 @@
-# Miscellaneous
-*.class
-*.log
-*.pyc
-*.swp
-.DS_Store
-.atom/
-.buildlog/
-.history
-.svn/
-
-# IntelliJ related
-*.iml
-*.ipr
-*.iws
-.idea/
-
-# The .vscode folder contains launch configuration and tasks you configure in
-# VS Code which you may wish to be included in version control, so this line
-# is commented out by default.
-#.vscode/
-
-# Flutter/Dart/Pub related
-**/doc/api/
-**/ios/Flutter/.last_build_id
-.dart_tool/
-.flutter-plugins
-.flutter-plugins-dependencies
-.packages
-.pub-cache/
-.pub/
-/build/
-
-# Web related
-lib/generated_plugin_registrant.dart
-
-# Symbolication related
-app.*.symbols
-
-# Obfuscation related
-app.*.map.json
-
-# Android Studio will place build artifacts here
-/android/app/debug
-/android/app/profile
-/android/app/release
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+/build/
+
+# Web related
+lib/generated_plugin_registrant.dart
+
+# Symbolication related
+app.*.symbols
+
+# Obfuscation related
+app.*.map.json
+
+# Android Studio will place build artifacts here
+/android/app/debug
+/android/app/profile
+/android/app/release
diff --git a/filcnaplo/.metadata b/filcnaplo/.metadata
index 2d65d0e..ebe4e24 100644
--- a/filcnaplo/.metadata
+++ b/filcnaplo/.metadata
@@ -1,30 +1,30 @@
-# This file tracks properties of this Flutter project.
-# Used by Flutter tool to assess capabilities and perform upgrades etc.
-#
-# This file should be version controlled.
-
-version:
- revision: 3c0bee85b8e43b860877922bdc411a7333db4d32
- channel: beta
-
-project_type: app
-
-# Tracks metadata for the flutter migrate command
-migration:
- platforms:
- - platform: root
- create_revision: 3c0bee85b8e43b860877922bdc411a7333db4d32
- base_revision: 3c0bee85b8e43b860877922bdc411a7333db4d32
- - platform: macos
- create_revision: 3c0bee85b8e43b860877922bdc411a7333db4d32
- base_revision: 3c0bee85b8e43b860877922bdc411a7333db4d32
-
- # User provided section
-
- # List of Local paths (relative to this file) that should be
- # ignored by the migrate tool.
- #
- # Files that are not part of the templates will be ignored by default.
- unmanaged_files:
- - 'lib/main.dart'
- - 'ios/Runner.xcodeproj/project.pbxproj'
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled.
+
+version:
+ revision: 3c0bee85b8e43b860877922bdc411a7333db4d32
+ channel: beta
+
+project_type: app
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: 3c0bee85b8e43b860877922bdc411a7333db4d32
+ base_revision: 3c0bee85b8e43b860877922bdc411a7333db4d32
+ - platform: macos
+ create_revision: 3c0bee85b8e43b860877922bdc411a7333db4d32
+ base_revision: 3c0bee85b8e43b860877922bdc411a7333db4d32
+
+ # User provided section
+
+ # List of Local paths (relative to this file) that should be
+ # ignored by the migrate tool.
+ #
+ # Files that are not part of the templates will be ignored by default.
+ unmanaged_files:
+ - 'lib/main.dart'
+ - 'ios/Runner.xcodeproj/project.pbxproj'
diff --git a/filcnaplo/README.md b/filcnaplo/README.md
index 6464f55..fc8676c 100644
--- a/filcnaplo/README.md
+++ b/filcnaplo/README.md
@@ -1,3 +1,3 @@
-# filcnaplo
-
+# filcnaplo
+
Main lib
\ No newline at end of file
diff --git a/filcnaplo/analysis_options.yaml b/filcnaplo/analysis_options.yaml
index 61b6c4d..a7acf24 100644
--- a/filcnaplo/analysis_options.yaml
+++ b/filcnaplo/analysis_options.yaml
@@ -1,29 +1,29 @@
-# This file configures the analyzer, which statically analyzes Dart code to
-# check for errors, warnings, and lints.
-#
-# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
-# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
-# invoked from the command line by running `flutter analyze`.
-
-# The following line activates a set of recommended lints for Flutter apps,
-# packages, and plugins designed to encourage good coding practices.
-include: package:flutter_lints/flutter.yaml
-
-linter:
- # The lint rules applied to this project can be customized in the
- # section below to disable rules from the `package:flutter_lints/flutter.yaml`
- # included above or to enable additional rules. A list of all available lints
- # and their documentation is published at
- # https://dart-lang.github.io/linter/lints/index.html.
- #
- # Instead of disabling a lint rule for the entire project in the
- # section below, it can also be suppressed for a single line of code
- # or a specific dart file by using the `// ignore: name_of_lint` and
- # `// ignore_for_file: name_of_lint` syntax on the line or in the file
- # producing the lint.
- rules:
- # avoid_print: false # Uncomment to disable the `avoid_print` rule
- # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
-
-# Additional information about this file can be found at
-# https://dart.dev/guides/language/analysis-options
+# This file configures the analyzer, which statically analyzes Dart code to
+# check for errors, warnings, and lints.
+#
+# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
+# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
+# invoked from the command line by running `flutter analyze`.
+
+# The following line activates a set of recommended lints for Flutter apps,
+# packages, and plugins designed to encourage good coding practices.
+include: package:flutter_lints/flutter.yaml
+
+linter:
+ # The lint rules applied to this project can be customized in the
+ # section below to disable rules from the `package:flutter_lints/flutter.yaml`
+ # included above or to enable additional rules. A list of all available lints
+ # and their documentation is published at
+ # https://dart-lang.github.io/linter/lints/index.html.
+ #
+ # Instead of disabling a lint rule for the entire project in the
+ # section below, it can also be suppressed for a single line of code
+ # or a specific dart file by using the `// ignore: name_of_lint` and
+ # `// ignore_for_file: name_of_lint` syntax on the line or in the file
+ # producing the lint.
+ rules:
+ # avoid_print: false # Uncomment to disable the `avoid_print` rule
+ # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
diff --git a/filcnaplo/android/.gitignore b/filcnaplo/android/.gitignore
index deb764a..a2ea94a 100644
--- a/filcnaplo/android/.gitignore
+++ b/filcnaplo/android/.gitignore
@@ -1,12 +1,12 @@
-gradle-wrapper.jar
-/.gradle
-/captures/
-/gradlew
-/gradlew.bat
-/local.properties
-GeneratedPluginRegistrant.java
-
-# Remember to never publicly share your keystore.
-# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
-key.properties
+gradle-wrapper.jar
+/.gradle
+/captures/
+/gradlew
+/gradlew.bat
+/local.properties
+GeneratedPluginRegistrant.java
+
+# Remember to never publicly share your keystore.
+# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
+key.properties
.project
\ No newline at end of file
diff --git a/filcnaplo/android/app/build.gradle b/filcnaplo/android/app/build.gradle
index f41fff5..b7cf519 100644
--- a/filcnaplo/android/app/build.gradle
+++ b/filcnaplo/android/app/build.gradle
@@ -1,99 +1,99 @@
-def localProperties = new Properties()
-def localPropertiesFile = rootProject.file('local.properties')
-if (localPropertiesFile.exists()) {
- localPropertiesFile.withReader('UTF-8') { reader ->
- localProperties.load(reader)
- }
-}
-
-def flutterRoot = localProperties.getProperty('flutter.sdk')
-if (flutterRoot == null) {
- throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
-}
-
-def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
-if (flutterVersionCode == null) {
- throw new GradleException("Undefined VersionCode")
-}
-
-def flutterVersionName = localProperties.getProperty('flutter.versionName')
-if (flutterVersionName == null) {
- throw new GradleException("Undefined VersionName")
-}
-
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
-
-def keystoreProperties = new Properties()
-def keystorePropertiesFile = rootProject.file("filc3.properties")
-keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
-
-android {
- compileSdkVersion rootProject.ext.compileSdkVersion
-
- sourceSets {
- main.java.srcDirs += 'src/main/kotlin'
- }
-
- lintOptions {
- disable 'InvalidPackage'
- disable "Instantiatable"
- checkReleaseBuilds false
- abortOnError false
- }
-
- defaultConfig {
- applicationId "hu.filc.naplo"
- minSdkVersion 21
- targetSdkVersion rootProject.ext.targetSdkVersion
- versionCode flutterVersionCode.toInteger()
- versionName flutterVersionName
- testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
- multiDexEnabled true
- }
-
- compileOptions {
- // Flag to enable support for the new language APIs
- coreLibraryDesugaringEnabled true
- // Sets Java compatibility to Java 8
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
- }
-
- signingConfigs {
- release {
- keyAlias keystoreProperties['keyAlias']
- keyPassword keystoreProperties['keyPassword']
- storeFile file(keystoreProperties['storeFile'])
- storePassword keystoreProperties['storePassword']
- }
- }
-
- buildTypes {
- release {
- signingConfig signingConfigs.release
- shrinkResources false
- proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
- }
- }
-
- buildFeatures {
- viewBinding true
- }
-}
-
-flutter {
- source '../..'
-}
-
-dependencies {
- implementation 'com.android.support:multidex:2.0.1'
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
- implementation 'joda-time:joda-time:2.9.4'
- androidTestImplementation 'androidx.test:runner:1.1.1'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
- coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
- implementation 'androidx.window:window:1.0.0'
- implementation 'androidx.window:window-java:1.0.0'
-}
+def localProperties = new Properties()
+def localPropertiesFile = rootProject.file('local.properties')
+if (localPropertiesFile.exists()) {
+ localPropertiesFile.withReader('UTF-8') { reader ->
+ localProperties.load(reader)
+ }
+}
+
+def flutterRoot = localProperties.getProperty('flutter.sdk')
+if (flutterRoot == null) {
+ throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
+}
+
+def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
+if (flutterVersionCode == null) {
+ throw new GradleException("Undefined VersionCode")
+}
+
+def flutterVersionName = localProperties.getProperty('flutter.versionName')
+if (flutterVersionName == null) {
+ throw new GradleException("Undefined VersionName")
+}
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
+
+def keystoreProperties = new Properties()
+def keystorePropertiesFile = rootProject.file("filc3.properties")
+keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
+
+android {
+ compileSdkVersion rootProject.ext.compileSdkVersion
+
+ sourceSets {
+ main.java.srcDirs += 'src/main/kotlin'
+ }
+
+ lintOptions {
+ disable 'InvalidPackage'
+ disable "Instantiatable"
+ checkReleaseBuilds false
+ abortOnError false
+ }
+
+ defaultConfig {
+ applicationId "hu.filc.naplo"
+ minSdkVersion 21
+ targetSdkVersion rootProject.ext.targetSdkVersion
+ versionCode flutterVersionCode.toInteger()
+ versionName flutterVersionName
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ multiDexEnabled true
+ }
+
+ compileOptions {
+ // Flag to enable support for the new language APIs
+ coreLibraryDesugaringEnabled true
+ // Sets Java compatibility to Java 8
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ signingConfigs {
+ release {
+ keyAlias keystoreProperties['keyAlias']
+ keyPassword keystoreProperties['keyPassword']
+ storeFile file(keystoreProperties['storeFile'])
+ storePassword keystoreProperties['storePassword']
+ }
+ }
+
+ buildTypes {
+ release {
+ signingConfig signingConfigs.release
+ shrinkResources false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+
+ buildFeatures {
+ viewBinding true
+ }
+}
+
+flutter {
+ source '../..'
+}
+
+dependencies {
+ implementation 'com.android.support:multidex:2.0.1'
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+ implementation 'joda-time:joda-time:2.9.4'
+ androidTestImplementation 'androidx.test:runner:1.1.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
+ coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
+ implementation 'androidx.window:window:1.0.0'
+ implementation 'androidx.window:window-java:1.0.0'
+}
diff --git a/filcnaplo/android/app/proguard-rules.pro b/filcnaplo/android/app/proguard-rules.pro
index 0940b69..56fe627 100644
--- a/filcnaplo/android/app/proguard-rules.pro
+++ b/filcnaplo/android/app/proguard-rules.pro
@@ -1,5 +1,5 @@
--keep class io.flutter.plugin.editing.** { *; }
--keep class androidx.lifecycle.DefaultLifecycleObserver
--keep class com.pauldemarco.flutter_blue.** { *; }
--keep class com.mr.flutter.plugin.filepicker.** { *; }
+-keep class io.flutter.plugin.editing.** { *; }
+-keep class androidx.lifecycle.DefaultLifecycleObserver
+-keep class com.pauldemarco.flutter_blue.** { *; }
+-keep class com.mr.flutter.plugin.filepicker.** { *; }
-keep class com.shockwave.**
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/debug/AndroidManifest.xml b/filcnaplo/android/app/src/debug/AndroidManifest.xml
index f4f2d81..5888d0a 100644
--- a/filcnaplo/android/app/src/debug/AndroidManifest.xml
+++ b/filcnaplo/android/app/src/debug/AndroidManifest.xml
@@ -1,8 +1,8 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/filcnaplo/android/app/src/main/AndroidManifest.xml b/filcnaplo/android/app/src/main/AndroidManifest.xml
index e37928c..297f8ff 100644
--- a/filcnaplo/android/app/src/main/AndroidManifest.xml
+++ b/filcnaplo/android/app/src/main/AndroidManifest.xml
@@ -1,70 +1,70 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/java/hu/filc/naplo/MainActivity.java b/filcnaplo/android/app/src/main/java/hu/filc/naplo/MainActivity.java
index bab435e..9006cd5 100644
--- a/filcnaplo/android/app/src/main/java/hu/filc/naplo/MainActivity.java
+++ b/filcnaplo/android/app/src/main/java/hu/filc/naplo/MainActivity.java
@@ -1,18 +1,18 @@
-package hu.filc.naplo;
-
-import android.os.Bundle;
-
-import io.flutter.embedding.android.FlutterActivity;
-import io.flutter.plugins.GeneratedPluginRegistrant;
-
-import io.flutter.embedding.engine.FlutterEngine;
-
-public class MainActivity extends FlutterActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- GeneratedPluginRegistrant.registerWith(new FlutterEngine(this));
- }
-}
+package hu.filc.naplo;
+
+import android.os.Bundle;
+
+import io.flutter.embedding.android.FlutterActivity;
+import io.flutter.plugins.GeneratedPluginRegistrant;
+
+import io.flutter.embedding.engine.FlutterEngine;
+
+public class MainActivity extends FlutterActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ GeneratedPluginRegistrant.registerWith(new FlutterEngine(this));
+ }
+}
diff --git a/filcnaplo/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png b/filcnaplo/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..f6c3767
Binary files /dev/null and b/filcnaplo/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png differ
diff --git a/filcnaplo/android/app/src/main/res/drawable-hdpi/splash.png b/filcnaplo/android/app/src/main/res/drawable-hdpi/splash.png
new file mode 100644
index 0000000..6b9e74b
Binary files /dev/null and b/filcnaplo/android/app/src/main/res/drawable-hdpi/splash.png differ
diff --git a/filcnaplo/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png b/filcnaplo/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..10fc564
Binary files /dev/null and b/filcnaplo/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png differ
diff --git a/filcnaplo/android/app/src/main/res/drawable-mdpi/splash.png b/filcnaplo/android/app/src/main/res/drawable-mdpi/splash.png
new file mode 100644
index 0000000..b4566e0
Binary files /dev/null and b/filcnaplo/android/app/src/main/res/drawable-mdpi/splash.png differ
diff --git a/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_check.xml b/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_check.xml
index 62d6723..4545224 100644
--- a/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_check.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_check.xml
@@ -1,13 +1,13 @@
-
-
-
+
+
+
diff --git a/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_chevron_left.xml b/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_chevron_left.xml
index 01e9d40..a7f5dd6 100644
--- a/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_chevron_left.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_chevron_left.xml
@@ -1,13 +1,13 @@
-
-
-
+
+
+
diff --git a/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_chevron_right.xml b/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_chevron_right.xml
index c1e9015..93ad67e 100644
--- a/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_chevron_right.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_chevron_right.xml
@@ -1,13 +1,13 @@
-
-
-
+
+
+
diff --git a/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_droplet.xml b/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_droplet.xml
index cc3690b..865d06c 100644
--- a/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_droplet.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_droplet.xml
@@ -1,13 +1,13 @@
-
-
-
+
+
+
diff --git a/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_launcher_background.xml b/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_launcher_background.xml
index 07d5da9..a4f78de 100644
--- a/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_launcher_background.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_launcher_background.xml
@@ -1,170 +1,170 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_launcher_foreground.xml b/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_launcher_foreground.xml
index 2b068d1..cc14f03 100644
--- a/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_launcher_foreground.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_launcher_foreground.xml
@@ -1,30 +1,30 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_navigation_2.xml b/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_navigation_2.xml
index 273720c..90b35d8 100644
--- a/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_navigation_2.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_navigation_2.xml
@@ -1,13 +1,13 @@
-
-
-
+
+
+
diff --git a/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_refresh_cw.xml b/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_refresh_cw.xml
index f2365a8..289cd49 100644
--- a/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_refresh_cw.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-nodpi/ic_refresh_cw.xml
@@ -1,27 +1,27 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/filcnaplo/android/app/src/main/res/drawable-v21/app_widget_background.xml b/filcnaplo/android/app/src/main/res/drawable-v21/app_widget_background.xml
index 785445c..6721d42 100644
--- a/filcnaplo/android/app/src/main/res/drawable-v21/app_widget_background.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-v21/app_widget_background.xml
@@ -1,10 +1,10 @@
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/drawable-v21/app_widget_inner_view_background.xml b/filcnaplo/android/app/src/main/res/drawable-v21/app_widget_inner_view_background.xml
index 007e287..5ae60cf 100644
--- a/filcnaplo/android/app/src/main/res/drawable-v21/app_widget_inner_view_background.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-v21/app_widget_inner_view_background.xml
@@ -1,10 +1,10 @@
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/drawable-v21/background.png b/filcnaplo/android/app/src/main/res/drawable-v21/background.png
new file mode 100644
index 0000000..d90316e
Binary files /dev/null and b/filcnaplo/android/app/src/main/res/drawable-v21/background.png differ
diff --git a/filcnaplo/android/app/src/main/res/drawable-v21/launch_background.xml b/filcnaplo/android/app/src/main/res/drawable-v21/launch_background.xml
index 86aa265..51cb1b4 100644
--- a/filcnaplo/android/app/src/main/res/drawable-v21/launch_background.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-v21/launch_background.xml
@@ -1,7 +1,9 @@
-
-
-
- -
-
-
-
\ No newline at end of file
+
+
+ -
+
+
+ -
+
+
+
diff --git a/filcnaplo/android/app/src/main/res/drawable-xhdpi/card_layout_bg.xml b/filcnaplo/android/app/src/main/res/drawable-xhdpi/card_layout_bg.xml
index 860b811..0def536 100644
--- a/filcnaplo/android/app/src/main/res/drawable-xhdpi/card_layout_bg.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-xhdpi/card_layout_bg.xml
@@ -1,7 +1,7 @@
-
-
-
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/drawable-xhdpi/card_layout_tile.xml b/filcnaplo/android/app/src/main/res/drawable-xhdpi/card_layout_tile.xml
index 6466eba..f12f731 100644
--- a/filcnaplo/android/app/src/main/res/drawable-xhdpi/card_layout_tile.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-xhdpi/card_layout_tile.xml
@@ -1,6 +1,6 @@
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/drawable-xhdpi/card_layout_tile_elmarad.xml b/filcnaplo/android/app/src/main/res/drawable-xhdpi/card_layout_tile_elmarad.xml
index 426d5c1..ee09eea 100644
--- a/filcnaplo/android/app/src/main/res/drawable-xhdpi/card_layout_tile_elmarad.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-xhdpi/card_layout_tile_elmarad.xml
@@ -1,6 +1,6 @@
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/drawable-xhdpi/card_layout_tile_helyetesitett.xml b/filcnaplo/android/app/src/main/res/drawable-xhdpi/card_layout_tile_helyetesitett.xml
index 6e5cbff..030aaf2 100644
--- a/filcnaplo/android/app/src/main/res/drawable-xhdpi/card_layout_tile_helyetesitett.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-xhdpi/card_layout_tile_helyetesitett.xml
@@ -1,6 +1,6 @@
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png b/filcnaplo/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..d86d9d5
Binary files /dev/null and b/filcnaplo/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png differ
diff --git a/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_background.xml b/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_background.xml
index 86aa265..293a93c 100644
--- a/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_background.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_background.xml
@@ -1,7 +1,7 @@
-
-
-
- -
-
-
+
+
+
+ -
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_gradient_background.xml b/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_gradient_background.xml
index a69ce1e..67e425a 100644
--- a/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_gradient_background.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-xhdpi/launch_gradient_background.xml
@@ -1,11 +1,11 @@
-
-
- -
-
-
-
-
+
+
+ -
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/drawable-xhdpi/splash.png b/filcnaplo/android/app/src/main/res/drawable-xhdpi/splash.png
new file mode 100644
index 0000000..7fb243f
Binary files /dev/null and b/filcnaplo/android/app/src/main/res/drawable-xhdpi/splash.png differ
diff --git a/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_card_bottom.xml b/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_card_bottom.xml
index 8a99162..80b52be 100644
--- a/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_card_bottom.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_card_bottom.xml
@@ -1,7 +1,7 @@
-
-
-
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_card_bottom_dark.xml b/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_card_bottom_dark.xml
index 2551ee3..f2d52b0 100644
--- a/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_card_bottom_dark.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_card_bottom_dark.xml
@@ -1,7 +1,7 @@
-
-
-
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_card_top.xml b/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_card_top.xml
index e0e9376..a37fed6 100644
--- a/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_card_top.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_card_top.xml
@@ -1,7 +1,7 @@
-
-
-
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_card_top_dark.xml b/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_card_top_dark.xml
index 4bbd0bb..c41e2b5 100644
--- a/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_card_top_dark.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_card_top_dark.xml
@@ -1,7 +1,7 @@
-
-
-
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_scroll_style.xml b/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_scroll_style.xml
index a8f281e..a4eab7e 100644
--- a/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_scroll_style.xml
+++ b/filcnaplo/android/app/src/main/res/drawable-xhdpi/widget_scroll_style.xml
@@ -1,17 +1,17 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png b/filcnaplo/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..656bdce
Binary files /dev/null and b/filcnaplo/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png differ
diff --git a/filcnaplo/android/app/src/main/res/drawable-xxhdpi/splash.png b/filcnaplo/android/app/src/main/res/drawable-xxhdpi/splash.png
new file mode 100644
index 0000000..25992cd
Binary files /dev/null and b/filcnaplo/android/app/src/main/res/drawable-xxhdpi/splash.png differ
diff --git a/filcnaplo/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png b/filcnaplo/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..76b9abd
Binary files /dev/null and b/filcnaplo/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/filcnaplo/android/app/src/main/res/drawable-xxxhdpi/splash.png b/filcnaplo/android/app/src/main/res/drawable-xxxhdpi/splash.png
new file mode 100644
index 0000000..529aa20
Binary files /dev/null and b/filcnaplo/android/app/src/main/res/drawable-xxxhdpi/splash.png differ
diff --git a/filcnaplo/android/app/src/main/res/drawable/background.png b/filcnaplo/android/app/src/main/res/drawable/background.png
new file mode 100644
index 0000000..d90316e
Binary files /dev/null and b/filcnaplo/android/app/src/main/res/drawable/background.png differ
diff --git a/filcnaplo/android/app/src/main/res/drawable/btn_shape.xml b/filcnaplo/android/app/src/main/res/drawable/btn_shape.xml
index d91b3b2..b820ec8 100644
--- a/filcnaplo/android/app/src/main/res/drawable/btn_shape.xml
+++ b/filcnaplo/android/app/src/main/res/drawable/btn_shape.xml
@@ -1,18 +1,18 @@
-
-
-
- -
-
-
-
-
-
-
- -
-
-
-
-
-
-
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/drawable/btn_shape_login.xml b/filcnaplo/android/app/src/main/res/drawable/btn_shape_login.xml
index 22c1d8f..84bb6fe 100644
--- a/filcnaplo/android/app/src/main/res/drawable/btn_shape_login.xml
+++ b/filcnaplo/android/app/src/main/res/drawable/btn_shape_login.xml
@@ -1,18 +1,18 @@
-
-
-
- -
-
-
-
-
-
-
- -
-
-
-
-
-
-
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/drawable/launch_background.xml b/filcnaplo/android/app/src/main/res/drawable/launch_background.xml
index 86aa265..51cb1b4 100644
--- a/filcnaplo/android/app/src/main/res/drawable/launch_background.xml
+++ b/filcnaplo/android/app/src/main/res/drawable/launch_background.xml
@@ -1,7 +1,9 @@
-
-
-
- -
-
-
-
\ No newline at end of file
+
+
+ -
+
+
+ -
+
+
+
diff --git a/filcnaplo/android/app/src/main/res/layout/home_widget_test.xml b/filcnaplo/android/app/src/main/res/layout/home_widget_test.xml
index f0a315a..b12af8d 100644
--- a/filcnaplo/android/app/src/main/res/layout/home_widget_test.xml
+++ b/filcnaplo/android/app/src/main/res/layout/home_widget_test.xml
@@ -1,26 +1,26 @@
-
-
-
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/layout/timetable_item.xml b/filcnaplo/android/app/src/main/res/layout/timetable_item.xml
index 8d107fe..6b2a7f8 100644
--- a/filcnaplo/android/app/src/main/res/layout/timetable_item.xml
+++ b/filcnaplo/android/app/src/main/res/layout/timetable_item.xml
@@ -1,105 +1,105 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/layout/widget_timetable.xml b/filcnaplo/android/app/src/main/res/layout/widget_timetable.xml
index 0e69a8a..e10fda1 100644
--- a/filcnaplo/android/app/src/main/res/layout/widget_timetable.xml
+++ b/filcnaplo/android/app/src/main/res/layout/widget_timetable.xml
@@ -1,219 +1,219 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/filcnaplo/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
index cf79c3d..5f349f7 100644
--- a/filcnaplo/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
+++ b/filcnaplo/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -1,6 +1,5 @@
-
-
-
+
+
diff --git a/filcnaplo/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/filcnaplo/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
index 1d098b9..019aba6 100644
Binary files a/filcnaplo/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/filcnaplo/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/filcnaplo/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/filcnaplo/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
index 343f52b..f4392fa 100644
Binary files a/filcnaplo/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/filcnaplo/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/filcnaplo/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/filcnaplo/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index ae678c1..4a0ea0f 100644
Binary files a/filcnaplo/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/filcnaplo/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/filcnaplo/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/filcnaplo/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index 7cce925..6f6b262 100644
Binary files a/filcnaplo/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/filcnaplo/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/filcnaplo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/filcnaplo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index 2b510a9..541bec1 100644
Binary files a/filcnaplo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/filcnaplo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/filcnaplo/android/app/src/main/res/values-night-v31/themes.xml b/filcnaplo/android/app/src/main/res/values-night-v31/themes.xml
index f253c9d..beed9ab 100644
--- a/filcnaplo/android/app/src/main/res/values-night-v31/themes.xml
+++ b/filcnaplo/android/app/src/main/res/values-night-v31/themes.xml
@@ -1,10 +1,10 @@
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/values-night/styles.xml b/filcnaplo/android/app/src/main/res/values-night/styles.xml
index 4de7564..9b14563 100644
--- a/filcnaplo/android/app/src/main/res/values-night/styles.xml
+++ b/filcnaplo/android/app/src/main/res/values-night/styles.xml
@@ -1,19 +1,19 @@
-
-
-
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/values-v21/styles.xml b/filcnaplo/android/app/src/main/res/values-v21/styles.xml
index 82ee08b..3a78eed 100644
--- a/filcnaplo/android/app/src/main/res/values-v21/styles.xml
+++ b/filcnaplo/android/app/src/main/res/values-v21/styles.xml
@@ -1,12 +1,12 @@
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/values-v31/themes.xml b/filcnaplo/android/app/src/main/res/values-v31/themes.xml
index badd306..52d24ca 100644
--- a/filcnaplo/android/app/src/main/res/values-v31/themes.xml
+++ b/filcnaplo/android/app/src/main/res/values-v31/themes.xml
@@ -1,11 +1,11 @@
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/values/attrs.xml b/filcnaplo/android/app/src/main/res/values/attrs.xml
index 7781ac8..f8430c2 100644
--- a/filcnaplo/android/app/src/main/res/values/attrs.xml
+++ b/filcnaplo/android/app/src/main/res/values/attrs.xml
@@ -1,7 +1,7 @@
-
-
-
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/values/colors.xml b/filcnaplo/android/app/src/main/res/values/colors.xml
index f8c4ff9..0aaf69a 100644
--- a/filcnaplo/android/app/src/main/res/values/colors.xml
+++ b/filcnaplo/android/app/src/main/res/values/colors.xml
@@ -1,6 +1,6 @@
- #1F5B50
+ #3D7BF4
#FFBB86FC
#FF6200EE
diff --git a/filcnaplo/android/app/src/main/res/values/dimens.xml b/filcnaplo/android/app/src/main/res/values/dimens.xml
index 4db8c59..50a85e6 100644
--- a/filcnaplo/android/app/src/main/res/values/dimens.xml
+++ b/filcnaplo/android/app/src/main/res/values/dimens.xml
@@ -1,10 +1,10 @@
-
-
-
-
- 0dp
-
+
+
+
+
+ 0dp
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/values/strings.xml b/filcnaplo/android/app/src/main/res/values/strings.xml
index 3a76198..4e16b58 100644
--- a/filcnaplo/android/app/src/main/res/values/strings.xml
+++ b/filcnaplo/android/app/src/main/res/values/strings.xml
@@ -1,6 +1,6 @@
-
-
- Órarend Widget
- Add widget
- Mindig lásd, milyen órád lesz, a kezdőképernyőd kényelméből.
+
+
+ Órarend Widget
+ Add widget
+ Mindig lásd, milyen órád lesz, a kezdőképernyőd kényelméből.
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/values/styles.xml b/filcnaplo/android/app/src/main/res/values/styles.xml
index 034b277..7992e45 100644
--- a/filcnaplo/android/app/src/main/res/values/styles.xml
+++ b/filcnaplo/android/app/src/main/res/values/styles.xml
@@ -1,29 +1,30 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
diff --git a/filcnaplo/android/app/src/main/res/values/themes.xml b/filcnaplo/android/app/src/main/res/values/themes.xml
index f6846b8..5e2e5e0 100644
--- a/filcnaplo/android/app/src/main/res/values/themes.xml
+++ b/filcnaplo/android/app/src/main/res/values/themes.xml
@@ -1,16 +1,16 @@
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/main/res/xml/home_widget_test_info.xml b/filcnaplo/android/app/src/main/res/xml/home_widget_test_info.xml
index bd311e0..9beb272 100644
--- a/filcnaplo/android/app/src/main/res/xml/home_widget_test_info.xml
+++ b/filcnaplo/android/app/src/main/res/xml/home_widget_test_info.xml
@@ -1,13 +1,13 @@
-
-
+
\ No newline at end of file
diff --git a/filcnaplo/android/app/src/profile/AndroidManifest.xml b/filcnaplo/android/app/src/profile/AndroidManifest.xml
index f4f2d81..5888d0a 100644
--- a/filcnaplo/android/app/src/profile/AndroidManifest.xml
+++ b/filcnaplo/android/app/src/profile/AndroidManifest.xml
@@ -1,8 +1,8 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/filcnaplo/android/build.gradle b/filcnaplo/android/build.gradle
index 49daf53..ecbea63 100644
--- a/filcnaplo/android/build.gradle
+++ b/filcnaplo/android/build.gradle
@@ -1,53 +1,53 @@
-buildscript {
- ext.kotlin_version = '1.6.10'
-
- ext {
- compileSdkVersion = 33
- targetSdkVersion = 33
- appCompatVersion = "1.1.0"
- }
-
- repositories {
- google()
- jcenter()
- }
-
- dependencies {
- classpath 'com.android.tools.build:gradle:4.2.2'
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
- }
-}
-
-allprojects {
- repositories {
- google()
- jcenter()
- maven {
- // [required] background_fetch
- url "${project(':background_fetch').projectDir}/libs"
- }
- }
-}
-
-subprojects {
- afterEvaluate {project ->
- if (project.plugins.hasPlugin('android') || project.plugins.hasPlugin('android-library')) {
- android {
- compileSdkVersion 33
- buildToolsVersion '31.0.0'
- }
- }
- }
-}
-
-rootProject.buildDir = '../build'
-subprojects {
- project.buildDir = "${rootProject.buildDir}/${project.name}"
-}
-subprojects {
- project.evaluationDependsOn(':app')
-}
-
-task clean(type: Delete) {
- delete rootProject.buildDir
-}
\ No newline at end of file
+buildscript {
+ ext.kotlin_version = '1.6.10'
+
+ ext {
+ compileSdkVersion = 33
+ targetSdkVersion = 33
+ appCompatVersion = "1.1.0"
+ }
+
+ repositories {
+ google()
+ jcenter()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:4.2.2'
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+ maven {
+ // [required] background_fetch
+ url "${project(':background_fetch').projectDir}/libs"
+ }
+ }
+}
+
+subprojects {
+ afterEvaluate {project ->
+ if (project.plugins.hasPlugin('android') || project.plugins.hasPlugin('android-library')) {
+ android {
+ compileSdkVersion 33
+ buildToolsVersion '31.0.0'
+ }
+ }
+ }
+}
+
+rootProject.buildDir = '../build'
+subprojects {
+ project.buildDir = "${rootProject.buildDir}/${project.name}"
+}
+subprojects {
+ project.evaluationDependsOn(':app')
+}
+
+tasks.register("clean", Delete) {
+ delete rootProject.buildDir
+}
diff --git a/filcnaplo/android/filc3.properties b/filcnaplo/android/filc3.properties
new file mode 100644
index 0000000..712ce0f
--- /dev/null
+++ b/filcnaplo/android/filc3.properties
@@ -0,0 +1,4 @@
+storePassword=filc3fix
+keyPassword=filc3fix
+keyAlias=upload
+storeFile=C:/Users/Peti/upload-keystore.jks
\ No newline at end of file
diff --git a/filcnaplo/android/gradle.properties b/filcnaplo/android/gradle.properties
index c5cc3d1..7f55add 100644
--- a/filcnaplo/android/gradle.properties
+++ b/filcnaplo/android/gradle.properties
@@ -1,4 +1,4 @@
-org.gradle.jvmargs=-Xmx1536M
-android.useAndroidX=true
-android.enableJetifier=true
-org.gradle.java.home=C:\Program Files\\Java\\jdk-14.0.2
+org.gradle.jvmargs=-Xmx1536M
+android.useAndroidX=true
+android.enableJetifier=true
+org.gradle.java.home=C:\\Program Files\\Java\\jdk-14.0.2
diff --git a/filcnaplo/android/gradle/wrapper/gradle-wrapper.properties b/filcnaplo/android/gradle/wrapper/gradle-wrapper.properties
index 939efa2..b9f4649 100644
--- a/filcnaplo/android/gradle/wrapper/gradle-wrapper.properties
+++ b/filcnaplo/android/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Fri Jun 23 08:50:38 CEST 2017
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip
+#Fri Jun 23 08:50:38 CEST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip
diff --git a/filcnaplo/android/settings.gradle b/filcnaplo/android/settings.gradle
index 44e62bc..33f0745 100644
--- a/filcnaplo/android/settings.gradle
+++ b/filcnaplo/android/settings.gradle
@@ -1,11 +1,11 @@
-include ':app'
-
-def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
-def properties = new Properties()
-
-assert localPropertiesFile.exists()
-localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
-
-def flutterSdkPath = properties.getProperty("flutter.sdk")
-assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
-apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
+include ':app'
+
+def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
+def properties = new Properties()
+
+assert localPropertiesFile.exists()
+localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
+
+def flutterSdkPath = properties.getProperty("flutter.sdk")
+assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
+apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
diff --git a/filcnaplo/android/settings_aar.gradle b/filcnaplo/android/settings_aar.gradle
index e7b4def..d3db109 100644
--- a/filcnaplo/android/settings_aar.gradle
+++ b/filcnaplo/android/settings_aar.gradle
@@ -1 +1 @@
-include ':app'
+include ':app'
diff --git a/filcnaplo/assets/icons/ic_launcher.png b/filcnaplo/assets/icons/ic_launcher.png
index 90d1850..58a4d95 100644
Binary files a/filcnaplo/assets/icons/ic_launcher.png and b/filcnaplo/assets/icons/ic_launcher.png differ
diff --git a/filcnaplo/assets/icons/ic_launcher_foreground.png b/filcnaplo/assets/icons/ic_launcher_foreground.png
index 6d46232..c7b42c2 100644
Binary files a/filcnaplo/assets/icons/ic_launcher_foreground.png and b/filcnaplo/assets/icons/ic_launcher_foreground.png differ
diff --git a/filcnaplo/assets/icons/ic_splash.png b/filcnaplo/assets/icons/ic_splash.png
index b0e4edc..c7b42c2 100644
Binary files a/filcnaplo/assets/icons/ic_splash.png and b/filcnaplo/assets/icons/ic_splash.png differ
diff --git a/filcnaplo/assets/images/desktop_icon.svg b/filcnaplo/assets/images/desktop_icon.svg
index 547426f..b0abc6a 100644
--- a/filcnaplo/assets/images/desktop_icon.svg
+++ b/filcnaplo/assets/images/desktop_icon.svg
@@ -1,3 +1,3 @@
-
-
-
+
+
+
diff --git a/filcnaplo/assets/images/github.svg b/filcnaplo/assets/images/github.svg
index 849d5c6..2b3a4e3 100644
--- a/filcnaplo/assets/images/github.svg
+++ b/filcnaplo/assets/images/github.svg
@@ -1,3 +1,3 @@
-
-
-
+
+
+
diff --git a/filcnaplo/assets/images/goal_icon.svg b/filcnaplo/assets/images/goal_icon.svg
index a4bd0e5..cb3aeff 100644
--- a/filcnaplo/assets/images/goal_icon.svg
+++ b/filcnaplo/assets/images/goal_icon.svg
@@ -1,3 +1,3 @@
-
-
-
+
+
+
diff --git a/filcnaplo/assets/images/kupak.svg b/filcnaplo/assets/images/kupak.svg
index 9a7c0df..5cedfa9 100644
--- a/filcnaplo/assets/images/kupak.svg
+++ b/filcnaplo/assets/images/kupak.svg
@@ -1,3 +1,3 @@
-
-
-
+
+
+
diff --git a/filcnaplo/assets/images/nickname_icon.svg b/filcnaplo/assets/images/nickname_icon.svg
index 90269de..cf0ded3 100644
--- a/filcnaplo/assets/images/nickname_icon.svg
+++ b/filcnaplo/assets/images/nickname_icon.svg
@@ -1,3 +1,3 @@
-
-
-
+
+
+
diff --git a/filcnaplo/assets/images/stats_icon.svg b/filcnaplo/assets/images/stats_icon.svg
index 8bb9e56..43be2f6 100644
--- a/filcnaplo/assets/images/stats_icon.svg
+++ b/filcnaplo/assets/images/stats_icon.svg
@@ -1,3 +1,3 @@
-
-
-
+
+
+
diff --git a/filcnaplo/assets/images/theme_icon.svg b/filcnaplo/assets/images/theme_icon.svg
index 0cb9a51..33f2db5 100644
--- a/filcnaplo/assets/images/theme_icon.svg
+++ b/filcnaplo/assets/images/theme_icon.svg
@@ -1,3 +1,3 @@
-
-
-
+
+
+
diff --git a/filcnaplo/assets/images/timetable_icon.svg b/filcnaplo/assets/images/timetable_icon.svg
index f77b745..212098d 100644
--- a/filcnaplo/assets/images/timetable_icon.svg
+++ b/filcnaplo/assets/images/timetable_icon.svg
@@ -1,5 +1,5 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/filcnaplo/assets/images/tinta.svg b/filcnaplo/assets/images/tinta.svg
index 29fbd76..a9dfd9e 100644
--- a/filcnaplo/assets/images/tinta.svg
+++ b/filcnaplo/assets/images/tinta.svg
@@ -1,3 +1,3 @@
-
-
-
+
+
+
diff --git a/filcnaplo/assets/images/widget_icon.svg b/filcnaplo/assets/images/widget_icon.svg
index 73e4782..4b6be9f 100644
--- a/filcnaplo/assets/images/widget_icon.svg
+++ b/filcnaplo/assets/images/widget_icon.svg
@@ -1,3 +1,3 @@
-
-
-
+
+
+
diff --git a/filcnaplo/build.sh b/filcnaplo/build.sh
index 8e6cb8a..c7acf16 100755
--- a/filcnaplo/build.sh
+++ b/filcnaplo/build.sh
@@ -1,13 +1,13 @@
-#!/usr/bin/env fish
-
-# With build number
-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
+#!/usr/bin/env fish
+
+# With build number
+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
diff --git a/filcnaplo/ios/.gitignore b/filcnaplo/ios/.gitignore
index 151026b..8adea5a 100644
--- a/filcnaplo/ios/.gitignore
+++ b/filcnaplo/ios/.gitignore
@@ -1,33 +1,33 @@
-*.mode1v3
-*.mode2v3
-*.moved-aside
-*.pbxuser
-*.perspectivev3
-**/*sync/
-.sconsign.dblite
-.tags*
-**/.vagrant/
-**/DerivedData/
-Icon?
-**/Pods/
-**/.symlinks/
-profile
-xcuserdata
-**/.generated/
-Flutter/App.framework
-Flutter/Flutter.framework
-Flutter/Flutter.podspec
-Flutter/Generated.xcconfig
-Flutter/ephemeral/
-Flutter/app.flx
-Flutter/app.zip
-Flutter/flutter_assets/
-Flutter/flutter_export_environment.sh
-ServiceDefinitions.json
-Runner/GeneratedPluginRegistrant.*
-
-# Exceptions to above rules.
-!default.mode1v3
-!default.mode2v3
-!default.pbxuser
-!default.perspectivev3
+*.mode1v3
+*.mode2v3
+*.moved-aside
+*.pbxuser
+*.perspectivev3
+**/*sync/
+.sconsign.dblite
+.tags*
+**/.vagrant/
+**/DerivedData/
+Icon?
+**/Pods/
+**/.symlinks/
+profile
+xcuserdata
+**/.generated/
+Flutter/App.framework
+Flutter/Flutter.framework
+Flutter/Flutter.podspec
+Flutter/Generated.xcconfig
+Flutter/ephemeral/
+Flutter/app.flx
+Flutter/app.zip
+Flutter/flutter_assets/
+Flutter/flutter_export_environment.sh
+ServiceDefinitions.json
+Runner/GeneratedPluginRegistrant.*
+
+# Exceptions to above rules.
+!default.mode1v3
+!default.mode2v3
+!default.pbxuser
+!default.perspectivev3
diff --git a/filcnaplo/ios/Flutter/AppFrameworkInfo.plist b/filcnaplo/ios/Flutter/AppFrameworkInfo.plist
index 9625e10..0d9747f 100644
--- a/filcnaplo/ios/Flutter/AppFrameworkInfo.plist
+++ b/filcnaplo/ios/Flutter/AppFrameworkInfo.plist
@@ -1,26 +1,26 @@
-
-
-
-
- CFBundleDevelopmentRegion
- en
- CFBundleExecutable
- App
- CFBundleIdentifier
- io.flutter.flutter.app
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- App
- CFBundlePackageType
- FMWK
- CFBundleShortVersionString
- 1.0
- CFBundleSignature
- ????
- CFBundleVersion
- 1.0
- MinimumOSVersion
- 11.0
-
-
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ App
+ CFBundleIdentifier
+ io.flutter.flutter.app
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ App
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ MinimumOSVersion
+ 11.0
+
+
diff --git a/filcnaplo/ios/Flutter/Debug.xcconfig b/filcnaplo/ios/Flutter/Debug.xcconfig
index ec97fc6..553cfac 100644
--- a/filcnaplo/ios/Flutter/Debug.xcconfig
+++ b/filcnaplo/ios/Flutter/Debug.xcconfig
@@ -1,2 +1,2 @@
-#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
-#include "Generated.xcconfig"
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
+#include "Generated.xcconfig"
diff --git a/filcnaplo/ios/Flutter/Release.xcconfig b/filcnaplo/ios/Flutter/Release.xcconfig
index c4855bf..4b6e1f6 100644
--- a/filcnaplo/ios/Flutter/Release.xcconfig
+++ b/filcnaplo/ios/Flutter/Release.xcconfig
@@ -1,2 +1,2 @@
-#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
-#include "Generated.xcconfig"
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
+#include "Generated.xcconfig"
diff --git a/filcnaplo/ios/Podfile b/filcnaplo/ios/Podfile
index d805285..4cbad0e 100644
--- a/filcnaplo/ios/Podfile
+++ b/filcnaplo/ios/Podfile
@@ -1,43 +1,43 @@
-# Uncomment this line to define a global platform for your project
-# platform :ios, '11.0'
-
-# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
-ENV['COCOAPODS_DISABLE_STATS'] = 'true'
-
-project 'Runner', {
- 'Debug' => :debug,
- 'Profile' => :release,
- 'Release' => :release,
-}
-
-def flutter_root
- generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
- 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"
- end
-
- File.foreach(generated_xcode_build_settings_path) do |line|
- matches = line.match(/FLUTTER_ROOT\=(.*)/)
- return matches[1].strip if matches
- end
- raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
-end
-
-require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
-
-flutter_ios_podfile_setup
-
-target 'Runner' do
- use_frameworks!
- use_modular_headers!
-
- flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
-
- pod 'DKImagePickerController/PhotoGallery', :git => 'https://github.com/zhangao0086/DKImagePickerController.git'
-end
-
-post_install do |installer|
- installer.pods_project.targets.each do |target|
- flutter_additional_ios_build_settings(target)
- end
-end
+# Uncomment this line to define a global platform for your project
+# platform :ios, '11.0'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+ 'Debug' => :debug,
+ 'Profile' => :release,
+ 'Release' => :release,
+}
+
+def flutter_root
+ generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
+ 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"
+ end
+
+ File.foreach(generated_xcode_build_settings_path) do |line|
+ matches = line.match(/FLUTTER_ROOT\=(.*)/)
+ return matches[1].strip if matches
+ end
+ raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_ios_podfile_setup
+
+target 'Runner' do
+ use_frameworks!
+ use_modular_headers!
+
+ flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
+
+ pod 'DKImagePickerController/PhotoGallery', :git => 'https://github.com/zhangao0086/DKImagePickerController.git'
+end
+
+post_install do |installer|
+ installer.pods_project.targets.each do |target|
+ flutter_additional_ios_build_settings(target)
+ end
+end
diff --git a/filcnaplo/ios/Podfile.lock b/filcnaplo/ios/Podfile.lock
index 19dfdd1..f9d6263 100644
--- a/filcnaplo/ios/Podfile.lock
+++ b/filcnaplo/ios/Podfile.lock
@@ -1,230 +1,230 @@
-PODS:
- - app_group_directory (1.0.0):
- - Flutter
- - background_fetch (1.1.5):
- - Flutter
- - connectivity_plus (0.0.1):
- - Flutter
- - ReachabilitySwift
- - DKImagePickerController/Core (4.3.4):
- - DKImagePickerController/ImageDataManager
- - DKImagePickerController/Resource
- - DKImagePickerController/ImageDataManager (4.3.4)
- - DKImagePickerController/PhotoGallery (4.3.4):
- - DKImagePickerController/Core
- - DKPhotoGallery
- - DKImagePickerController/Resource (4.3.4)
- - DKPhotoGallery (0.0.17):
- - DKPhotoGallery/Core (= 0.0.17)
- - DKPhotoGallery/Model (= 0.0.17)
- - DKPhotoGallery/Preview (= 0.0.17)
- - DKPhotoGallery/Resource (= 0.0.17)
- - SDWebImage
- - SwiftyGif
- - DKPhotoGallery/Core (0.0.17):
- - DKPhotoGallery/Model
- - DKPhotoGallery/Preview
- - SDWebImage
- - SwiftyGif
- - DKPhotoGallery/Model (0.0.17):
- - SDWebImage
- - SwiftyGif
- - DKPhotoGallery/Preview (0.0.17):
- - DKPhotoGallery/Model
- - DKPhotoGallery/Resource
- - SDWebImage
- - SwiftyGif
- - DKPhotoGallery/Resource (0.0.17):
- - SDWebImage
- - SwiftyGif
- - file_picker (0.0.1):
- - DKImagePickerController/PhotoGallery
- - Flutter
- - Flutter (1.0.0)
- - flutter_custom_tabs (0.0.1):
- - Flutter
- - flutter_image_compress (1.0.0):
- - Flutter
- - Mantle
- - SDWebImage
- - SDWebImageWebPCoder
- - flutter_local_notifications (0.0.1):
- - Flutter
- - flutter_native_image (0.0.1):
- - Flutter
- - FMDB (2.7.5):
- - FMDB/standard (= 2.7.5)
- - FMDB/standard (2.7.5)
- - home_widget (0.0.1):
- - Flutter
- - image_crop (0.0.1):
- - Flutter
- - image_picker_ios (0.0.1):
- - Flutter
- - libwebp (1.2.4):
- - libwebp/demux (= 1.2.4)
- - libwebp/mux (= 1.2.4)
- - libwebp/webp (= 1.2.4)
- - libwebp/demux (1.2.4):
- - libwebp/webp
- - libwebp/mux (1.2.4):
- - libwebp/demux
- - libwebp/webp (1.2.4)
- - live_activities (0.0.1):
- - Flutter
- - Mantle (2.2.0):
- - Mantle/extobjc (= 2.2.0)
- - Mantle/extobjc (2.2.0)
- - open_file (0.0.1):
- - Flutter
- - path_provider_ios (0.0.1):
- - Flutter
- - permission_handler_apple (9.0.4):
- - Flutter
- - quick_actions_ios (0.0.1):
- - Flutter
- - ReachabilitySwift (5.0.0)
- - SDWebImage (5.13.2):
- - SDWebImage/Core (= 5.13.2)
- - SDWebImage/Core (5.13.2)
- - SDWebImageWebPCoder (0.9.1):
- - libwebp (~> 1.0)
- - SDWebImage/Core (~> 5.13)
- - share_plus (0.0.1):
- - Flutter
- - sqflite (0.0.2):
- - Flutter
- - FMDB (>= 2.7.5)
- - SwiftyGif (5.4.3)
- - uni_links (0.0.1):
- - Flutter
- - url_launcher_ios (0.0.1):
- - Flutter
- - workmanager (0.0.1):
- - Flutter
-
-DEPENDENCIES:
- - app_group_directory (from `.symlinks/plugins/app_group_directory/ios`)
- - background_fetch (from `.symlinks/plugins/background_fetch/ios`)
- - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
- - DKImagePickerController/PhotoGallery (from `https://github.com/zhangao0086/DKImagePickerController.git`)
- - file_picker (from `.symlinks/plugins/file_picker/ios`)
- - Flutter (from `Flutter`)
- - flutter_custom_tabs (from `.symlinks/plugins/flutter_custom_tabs/ios`)
- - flutter_image_compress (from `.symlinks/plugins/flutter_image_compress/ios`)
- - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
- - flutter_native_image (from `.symlinks/plugins/flutter_native_image/ios`)
- - home_widget (from `.symlinks/plugins/home_widget/ios`)
- - image_crop (from `.symlinks/plugins/image_crop/ios`)
- - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
- - live_activities (from `.symlinks/plugins/live_activities/ios`)
- - open_file (from `.symlinks/plugins/open_file/ios`)
- - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`)
- - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- - quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`)
- - share_plus (from `.symlinks/plugins/share_plus/ios`)
- - sqflite (from `.symlinks/plugins/sqflite/ios`)
- - uni_links (from `.symlinks/plugins/uni_links/ios`)
- - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
- - workmanager (from `.symlinks/plugins/workmanager/ios`)
-
-SPEC REPOS:
- trunk:
- - DKPhotoGallery
- - FMDB
- - libwebp
- - Mantle
- - ReachabilitySwift
- - SDWebImage
- - SDWebImageWebPCoder
- - SwiftyGif
-
-EXTERNAL SOURCES:
- app_group_directory:
- :path: ".symlinks/plugins/app_group_directory/ios"
- background_fetch:
- :path: ".symlinks/plugins/background_fetch/ios"
- connectivity_plus:
- :path: ".symlinks/plugins/connectivity_plus/ios"
- DKImagePickerController:
- :git: https://github.com/zhangao0086/DKImagePickerController.git
- file_picker:
- :path: ".symlinks/plugins/file_picker/ios"
- Flutter:
- :path: Flutter
- flutter_custom_tabs:
- :path: ".symlinks/plugins/flutter_custom_tabs/ios"
- flutter_image_compress:
- :path: ".symlinks/plugins/flutter_image_compress/ios"
- flutter_local_notifications:
- :path: ".symlinks/plugins/flutter_local_notifications/ios"
- flutter_native_image:
- :path: ".symlinks/plugins/flutter_native_image/ios"
- home_widget:
- :path: ".symlinks/plugins/home_widget/ios"
- image_crop:
- :path: ".symlinks/plugins/image_crop/ios"
- image_picker_ios:
- :path: ".symlinks/plugins/image_picker_ios/ios"
- live_activities:
- :path: ".symlinks/plugins/live_activities/ios"
- open_file:
- :path: ".symlinks/plugins/open_file/ios"
- path_provider_ios:
- :path: ".symlinks/plugins/path_provider_ios/ios"
- permission_handler_apple:
- :path: ".symlinks/plugins/permission_handler_apple/ios"
- quick_actions_ios:
- :path: ".symlinks/plugins/quick_actions_ios/ios"
- share_plus:
- :path: ".symlinks/plugins/share_plus/ios"
- sqflite:
- :path: ".symlinks/plugins/sqflite/ios"
- uni_links:
- :path: ".symlinks/plugins/uni_links/ios"
- url_launcher_ios:
- :path: ".symlinks/plugins/url_launcher_ios/ios"
- workmanager:
- :path: ".symlinks/plugins/workmanager/ios"
-
-CHECKOUT OPTIONS:
- DKImagePickerController:
- :commit: a727e44718a67e300089174e5591166045815ba4
- :git: https://github.com/zhangao0086/DKImagePickerController.git
-
-SPEC CHECKSUMS:
- app_group_directory: 7bf9f8f9819ead554de29da7c25fb7a680d6a9a0
- background_fetch: 9a9963128952bfdd197e21786983c7c7a30e1478
- connectivity_plus: 413a8857dd5d9f1c399a39130850d02fe0feaf7e
- DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac
- DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179
- file_picker: 817ab1d8cd2da9d2da412a417162deee3500fc95
- Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
- flutter_custom_tabs: 7a10a08686955cb748e5d26e0ae586d30689bf89
- flutter_image_compress: 5a5e9aee05b6553048b8df1c3bc456d0afaac433
- flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743
- flutter_native_image: 9c0b7451838484458e5b0fae007b86a4c2d4bdfe
- FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
- home_widget: 2829415127ee92e876f816cbbe44c0b6601b8a37
- image_crop: e0a67085d3ebf3cf46ca46d61c53a082507b0bc3
- image_picker_ios: 58b9c4269cb176f89acea5e5d043c9358f2d25f8
- libwebp: f62cb61d0a484ba548448a4bd52aabf150ff6eef
- live_activities: 9ff56a06a2d43ecd68f56deeed13b18a8304789c
- Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d
- open_file: 02eb5cb6b21264bd3a696876f5afbfb7ca4f4b7d
- path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02
- permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce
- quick_actions_ios: d211ffc5d7619ace7e9fb1800540b14a1aafe940
- ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825
- SDWebImage: 72f86271a6f3139cc7e4a89220946489d4b9a866
- SDWebImageWebPCoder: 18503de6621dd2c420d680e33d46bf8e1d5169b0
- share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68
- sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
- SwiftyGif: 6c3eafd0ce693cad58bb63d2b2fb9bacb8552780
- uni_links: d97da20c7701486ba192624d99bffaaffcfc298a
- url_launcher_ios: 839c58cdb4279282219f5e248c3321761ff3c4de
- workmanager: 0afdcf5628bbde6924c21af7836fed07b42e30e6
-
-PODFILE CHECKSUM: 862f939bb7e5390bdb8b2534eb81a9457ea9fbdc
-
-COCOAPODS: 1.12.0
+PODS:
+ - app_group_directory (1.0.0):
+ - Flutter
+ - background_fetch (1.1.5):
+ - Flutter
+ - connectivity_plus (0.0.1):
+ - Flutter
+ - ReachabilitySwift
+ - DKImagePickerController/Core (4.3.4):
+ - DKImagePickerController/ImageDataManager
+ - DKImagePickerController/Resource
+ - DKImagePickerController/ImageDataManager (4.3.4)
+ - DKImagePickerController/PhotoGallery (4.3.4):
+ - DKImagePickerController/Core
+ - DKPhotoGallery
+ - DKImagePickerController/Resource (4.3.4)
+ - DKPhotoGallery (0.0.17):
+ - DKPhotoGallery/Core (= 0.0.17)
+ - DKPhotoGallery/Model (= 0.0.17)
+ - DKPhotoGallery/Preview (= 0.0.17)
+ - DKPhotoGallery/Resource (= 0.0.17)
+ - SDWebImage
+ - SwiftyGif
+ - DKPhotoGallery/Core (0.0.17):
+ - DKPhotoGallery/Model
+ - DKPhotoGallery/Preview
+ - SDWebImage
+ - SwiftyGif
+ - DKPhotoGallery/Model (0.0.17):
+ - SDWebImage
+ - SwiftyGif
+ - DKPhotoGallery/Preview (0.0.17):
+ - DKPhotoGallery/Model
+ - DKPhotoGallery/Resource
+ - SDWebImage
+ - SwiftyGif
+ - DKPhotoGallery/Resource (0.0.17):
+ - SDWebImage
+ - SwiftyGif
+ - file_picker (0.0.1):
+ - DKImagePickerController/PhotoGallery
+ - Flutter
+ - Flutter (1.0.0)
+ - flutter_custom_tabs (0.0.1):
+ - Flutter
+ - flutter_image_compress (1.0.0):
+ - Flutter
+ - Mantle
+ - SDWebImage
+ - SDWebImageWebPCoder
+ - flutter_local_notifications (0.0.1):
+ - Flutter
+ - flutter_native_image (0.0.1):
+ - Flutter
+ - FMDB (2.7.5):
+ - FMDB/standard (= 2.7.5)
+ - FMDB/standard (2.7.5)
+ - home_widget (0.0.1):
+ - Flutter
+ - image_crop (0.0.1):
+ - Flutter
+ - image_picker_ios (0.0.1):
+ - Flutter
+ - libwebp (1.2.4):
+ - libwebp/demux (= 1.2.4)
+ - libwebp/mux (= 1.2.4)
+ - libwebp/webp (= 1.2.4)
+ - libwebp/demux (1.2.4):
+ - libwebp/webp
+ - libwebp/mux (1.2.4):
+ - libwebp/demux
+ - libwebp/webp (1.2.4)
+ - live_activities (0.0.1):
+ - Flutter
+ - Mantle (2.2.0):
+ - Mantle/extobjc (= 2.2.0)
+ - Mantle/extobjc (2.2.0)
+ - open_file (0.0.1):
+ - Flutter
+ - path_provider_ios (0.0.1):
+ - Flutter
+ - permission_handler_apple (9.0.4):
+ - Flutter
+ - quick_actions_ios (0.0.1):
+ - Flutter
+ - ReachabilitySwift (5.0.0)
+ - SDWebImage (5.13.2):
+ - SDWebImage/Core (= 5.13.2)
+ - SDWebImage/Core (5.13.2)
+ - SDWebImageWebPCoder (0.9.1):
+ - libwebp (~> 1.0)
+ - SDWebImage/Core (~> 5.13)
+ - share_plus (0.0.1):
+ - Flutter
+ - sqflite (0.0.2):
+ - Flutter
+ - FMDB (>= 2.7.5)
+ - SwiftyGif (5.4.3)
+ - uni_links (0.0.1):
+ - Flutter
+ - url_launcher_ios (0.0.1):
+ - Flutter
+ - workmanager (0.0.1):
+ - Flutter
+
+DEPENDENCIES:
+ - app_group_directory (from `.symlinks/plugins/app_group_directory/ios`)
+ - background_fetch (from `.symlinks/plugins/background_fetch/ios`)
+ - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
+ - DKImagePickerController/PhotoGallery (from `https://github.com/zhangao0086/DKImagePickerController.git`)
+ - file_picker (from `.symlinks/plugins/file_picker/ios`)
+ - Flutter (from `Flutter`)
+ - flutter_custom_tabs (from `.symlinks/plugins/flutter_custom_tabs/ios`)
+ - flutter_image_compress (from `.symlinks/plugins/flutter_image_compress/ios`)
+ - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
+ - flutter_native_image (from `.symlinks/plugins/flutter_native_image/ios`)
+ - home_widget (from `.symlinks/plugins/home_widget/ios`)
+ - image_crop (from `.symlinks/plugins/image_crop/ios`)
+ - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
+ - live_activities (from `.symlinks/plugins/live_activities/ios`)
+ - open_file (from `.symlinks/plugins/open_file/ios`)
+ - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`)
+ - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
+ - quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`)
+ - share_plus (from `.symlinks/plugins/share_plus/ios`)
+ - sqflite (from `.symlinks/plugins/sqflite/ios`)
+ - uni_links (from `.symlinks/plugins/uni_links/ios`)
+ - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
+ - workmanager (from `.symlinks/plugins/workmanager/ios`)
+
+SPEC REPOS:
+ trunk:
+ - DKPhotoGallery
+ - FMDB
+ - libwebp
+ - Mantle
+ - ReachabilitySwift
+ - SDWebImage
+ - SDWebImageWebPCoder
+ - SwiftyGif
+
+EXTERNAL SOURCES:
+ app_group_directory:
+ :path: ".symlinks/plugins/app_group_directory/ios"
+ background_fetch:
+ :path: ".symlinks/plugins/background_fetch/ios"
+ connectivity_plus:
+ :path: ".symlinks/plugins/connectivity_plus/ios"
+ DKImagePickerController:
+ :git: https://github.com/zhangao0086/DKImagePickerController.git
+ file_picker:
+ :path: ".symlinks/plugins/file_picker/ios"
+ Flutter:
+ :path: Flutter
+ flutter_custom_tabs:
+ :path: ".symlinks/plugins/flutter_custom_tabs/ios"
+ flutter_image_compress:
+ :path: ".symlinks/plugins/flutter_image_compress/ios"
+ flutter_local_notifications:
+ :path: ".symlinks/plugins/flutter_local_notifications/ios"
+ flutter_native_image:
+ :path: ".symlinks/plugins/flutter_native_image/ios"
+ home_widget:
+ :path: ".symlinks/plugins/home_widget/ios"
+ image_crop:
+ :path: ".symlinks/plugins/image_crop/ios"
+ image_picker_ios:
+ :path: ".symlinks/plugins/image_picker_ios/ios"
+ live_activities:
+ :path: ".symlinks/plugins/live_activities/ios"
+ open_file:
+ :path: ".symlinks/plugins/open_file/ios"
+ path_provider_ios:
+ :path: ".symlinks/plugins/path_provider_ios/ios"
+ permission_handler_apple:
+ :path: ".symlinks/plugins/permission_handler_apple/ios"
+ quick_actions_ios:
+ :path: ".symlinks/plugins/quick_actions_ios/ios"
+ share_plus:
+ :path: ".symlinks/plugins/share_plus/ios"
+ sqflite:
+ :path: ".symlinks/plugins/sqflite/ios"
+ uni_links:
+ :path: ".symlinks/plugins/uni_links/ios"
+ url_launcher_ios:
+ :path: ".symlinks/plugins/url_launcher_ios/ios"
+ workmanager:
+ :path: ".symlinks/plugins/workmanager/ios"
+
+CHECKOUT OPTIONS:
+ DKImagePickerController:
+ :commit: a727e44718a67e300089174e5591166045815ba4
+ :git: https://github.com/zhangao0086/DKImagePickerController.git
+
+SPEC CHECKSUMS:
+ app_group_directory: 7bf9f8f9819ead554de29da7c25fb7a680d6a9a0
+ background_fetch: 9a9963128952bfdd197e21786983c7c7a30e1478
+ connectivity_plus: 413a8857dd5d9f1c399a39130850d02fe0feaf7e
+ DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac
+ DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179
+ file_picker: 817ab1d8cd2da9d2da412a417162deee3500fc95
+ Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
+ flutter_custom_tabs: 7a10a08686955cb748e5d26e0ae586d30689bf89
+ flutter_image_compress: 5a5e9aee05b6553048b8df1c3bc456d0afaac433
+ flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743
+ flutter_native_image: 9c0b7451838484458e5b0fae007b86a4c2d4bdfe
+ FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
+ home_widget: 2829415127ee92e876f816cbbe44c0b6601b8a37
+ image_crop: e0a67085d3ebf3cf46ca46d61c53a082507b0bc3
+ image_picker_ios: 58b9c4269cb176f89acea5e5d043c9358f2d25f8
+ libwebp: f62cb61d0a484ba548448a4bd52aabf150ff6eef
+ live_activities: 9ff56a06a2d43ecd68f56deeed13b18a8304789c
+ Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d
+ open_file: 02eb5cb6b21264bd3a696876f5afbfb7ca4f4b7d
+ path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02
+ permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce
+ quick_actions_ios: d211ffc5d7619ace7e9fb1800540b14a1aafe940
+ ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825
+ SDWebImage: 72f86271a6f3139cc7e4a89220946489d4b9a866
+ SDWebImageWebPCoder: 18503de6621dd2c420d680e33d46bf8e1d5169b0
+ share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68
+ sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
+ SwiftyGif: 6c3eafd0ce693cad58bb63d2b2fb9bacb8552780
+ uni_links: d97da20c7701486ba192624d99bffaaffcfc298a
+ url_launcher_ios: 839c58cdb4279282219f5e248c3321761ff3c4de
+ workmanager: 0afdcf5628bbde6924c21af7836fed07b42e30e6
+
+PODFILE CHECKSUM: 862f939bb7e5390bdb8b2534eb81a9457ea9fbdc
+
+COCOAPODS: 1.12.0
diff --git a/filcnaplo/ios/Runner.xcodeproj/project.pbxproj b/filcnaplo/ios/Runner.xcodeproj/project.pbxproj
index 279de27..8633790 100644
--- a/filcnaplo/ios/Runner.xcodeproj/project.pbxproj
+++ b/filcnaplo/ios/Runner.xcodeproj/project.pbxproj
@@ -495,8 +495,8 @@
3127F7A028EAEDE300C2EFB3 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
@@ -537,8 +537,8 @@
3127F7A128EAEDE300C2EFB3 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
@@ -577,8 +577,8 @@
3127F7A228EAEDE300C2EFB3 /* Profile */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
diff --git a/filcnaplo/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/filcnaplo/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 919434a..c4b79bd 100644
--- a/filcnaplo/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/filcnaplo/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -1,7 +1,7 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/filcnaplo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/filcnaplo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
index 18d9810..fc6bf80 100644
--- a/filcnaplo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
+++ b/filcnaplo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -1,8 +1,8 @@
-
-
-
-
- IDEDidComputeMac32BitWarning
-
-
-
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/filcnaplo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/filcnaplo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
index f9b0d7c..af0309c 100644
--- a/filcnaplo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
+++ b/filcnaplo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -1,8 +1,8 @@
-
-
-
-
- PreviewsEnabled
-
-
-
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/filcnaplo/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/filcnaplo/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index c87d15a..f9cbb25 100644
--- a/filcnaplo/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/filcnaplo/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -1,87 +1,87 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/filcnaplo/ios/Runner.xcworkspace/contents.xcworkspacedata b/filcnaplo/ios/Runner.xcworkspace/contents.xcworkspacedata
index 21a3cc1..17ccc03 100644
--- a/filcnaplo/ios/Runner.xcworkspace/contents.xcworkspacedata
+++ b/filcnaplo/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -1,10 +1,10 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/filcnaplo/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/filcnaplo/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
index 18d9810..fc6bf80 100644
--- a/filcnaplo/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
+++ b/filcnaplo/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -1,8 +1,8 @@
-
-
-
-
- IDEDidComputeMac32BitWarning
-
-
-
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/filcnaplo/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/filcnaplo/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
index f9b0d7c..af0309c 100644
--- a/filcnaplo/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
+++ b/filcnaplo/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -1,8 +1,8 @@
-
-
-
-
- PreviewsEnabled
-
-
-
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/filcnaplo/ios/Runner/AppDelegate.swift b/filcnaplo/ios/Runner/AppDelegate.swift
index 2c4c46e..028b1bd 100644
--- a/filcnaplo/ios/Runner/AppDelegate.swift
+++ b/filcnaplo/ios/Runner/AppDelegate.swift
@@ -1,25 +1,25 @@
-import UIKit
-import Flutter
-
-@UIApplicationMain
-@objc class AppDelegate: FlutterAppDelegate {
- override func application(
- _ application: UIApplication,
- didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
- ) -> Bool {
- GeneratedPluginRegistrant.register(with: self)
-
- // here, Without this code the task will not work.
- //SwiftFlutterForegroundTaskPlugin.setPluginRegistrantCallback(registerPlugins)
- if #available(iOS 10.0, *) {
- UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
- }
-
- return super.application(application, didFinishLaunchingWithOptions: launchOptions)
- }
-}
-
-// here
-func registerPlugins(registry: FlutterPluginRegistry) {
- GeneratedPluginRegistrant.register(with: registry)
-}
+import UIKit
+import Flutter
+
+@UIApplicationMain
+@objc class AppDelegate: FlutterAppDelegate {
+ override func application(
+ _ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+ ) -> Bool {
+ GeneratedPluginRegistrant.register(with: self)
+
+ // here, Without this code the task will not work.
+ //SwiftFlutterForegroundTaskPlugin.setPluginRegistrantCallback(registerPlugins)
+ if #available(iOS 10.0, *) {
+ UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
+ }
+
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+ }
+}
+
+// here
+func registerPlugins(registry: FlutterPluginRegistry) {
+ GeneratedPluginRegistrant.register(with: registry)
+}
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
index 5633c79..7e31264 100644
--- a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -1,208 +1,208 @@
-{
- "images": [
- {
- "size": "60x60",
- "expected-size": "180",
- "filename": "180.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "3x"
- },
- {
- "size": "40x40",
- "expected-size": "80",
- "filename": "80.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "2x"
- },
- {
- "size": "40x40",
- "expected-size": "120",
- "filename": "120.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "3x"
- },
- {
- "size": "60x60",
- "expected-size": "120",
- "filename": "120.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "2x"
- },
- {
- "size": "57x57",
- "expected-size": "57",
- "filename": "57.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "1x"
- },
- {
- "size": "29x29",
- "expected-size": "58",
- "filename": "58.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "2x"
- },
- {
- "size": "29x29",
- "expected-size": "29",
- "filename": "29.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "1x"
- },
- {
- "size": "29x29",
- "expected-size": "87",
- "filename": "87.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "3x"
- },
- {
- "size": "57x57",
- "expected-size": "114",
- "filename": "114.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "2x"
- },
- {
- "size": "20x20",
- "expected-size": "40",
- "filename": "40.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "2x"
- },
- {
- "size": "20x20",
- "expected-size": "60",
- "filename": "60.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "3x"
- },
- {
- "size": "1024x1024",
- "filename": "1024.png",
- "expected-size": "1024",
- "idiom": "ios-marketing",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "scale": "1x"
- },
- {
- "size": "40x40",
- "expected-size": "80",
- "filename": "80.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "2x"
- },
- {
- "size": "72x72",
- "expected-size": "72",
- "filename": "72.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "1x"
- },
- {
- "size": "76x76",
- "expected-size": "152",
- "filename": "152.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "2x"
- },
- {
- "size": "50x50",
- "expected-size": "100",
- "filename": "100.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "2x"
- },
- {
- "size": "29x29",
- "expected-size": "58",
- "filename": "58.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "2x"
- },
- {
- "size": "76x76",
- "expected-size": "76",
- "filename": "76.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "1x"
- },
- {
- "size": "29x29",
- "expected-size": "29",
- "filename": "29.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "1x"
- },
- {
- "size": "50x50",
- "expected-size": "50",
- "filename": "50.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "1x"
- },
- {
- "size": "72x72",
- "expected-size": "144",
- "filename": "144.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "2x"
- },
- {
- "size": "40x40",
- "expected-size": "40",
- "filename": "40.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "1x"
- },
- {
- "size": "83.5x83.5",
- "expected-size": "167",
- "filename": "167.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "2x"
- },
- {
- "size": "20x20",
- "expected-size": "20",
- "filename": "20.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "1x"
- },
- {
- "size": "20x20",
- "expected-size": "40",
- "filename": "40.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "2x"
- }
- ],
- "info": {
- "version": 1,
- "author": "xcode"
- }
-}
+{
+ "images": [
+ {
+ "size": "60x60",
+ "expected-size": "180",
+ "filename": "180.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "iphone",
+ "scale": "3x"
+ },
+ {
+ "size": "40x40",
+ "expected-size": "80",
+ "filename": "80.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "iphone",
+ "scale": "2x"
+ },
+ {
+ "size": "40x40",
+ "expected-size": "120",
+ "filename": "120.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "iphone",
+ "scale": "3x"
+ },
+ {
+ "size": "60x60",
+ "expected-size": "120",
+ "filename": "120.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "iphone",
+ "scale": "2x"
+ },
+ {
+ "size": "57x57",
+ "expected-size": "57",
+ "filename": "57.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "iphone",
+ "scale": "1x"
+ },
+ {
+ "size": "29x29",
+ "expected-size": "58",
+ "filename": "58.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "iphone",
+ "scale": "2x"
+ },
+ {
+ "size": "29x29",
+ "expected-size": "29",
+ "filename": "29.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "iphone",
+ "scale": "1x"
+ },
+ {
+ "size": "29x29",
+ "expected-size": "87",
+ "filename": "87.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "iphone",
+ "scale": "3x"
+ },
+ {
+ "size": "57x57",
+ "expected-size": "114",
+ "filename": "114.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "iphone",
+ "scale": "2x"
+ },
+ {
+ "size": "20x20",
+ "expected-size": "40",
+ "filename": "40.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "iphone",
+ "scale": "2x"
+ },
+ {
+ "size": "20x20",
+ "expected-size": "60",
+ "filename": "60.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "iphone",
+ "scale": "3x"
+ },
+ {
+ "size": "1024x1024",
+ "filename": "1024.png",
+ "expected-size": "1024",
+ "idiom": "ios-marketing",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "scale": "1x"
+ },
+ {
+ "size": "40x40",
+ "expected-size": "80",
+ "filename": "80.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "ipad",
+ "scale": "2x"
+ },
+ {
+ "size": "72x72",
+ "expected-size": "72",
+ "filename": "72.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "ipad",
+ "scale": "1x"
+ },
+ {
+ "size": "76x76",
+ "expected-size": "152",
+ "filename": "152.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "ipad",
+ "scale": "2x"
+ },
+ {
+ "size": "50x50",
+ "expected-size": "100",
+ "filename": "100.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "ipad",
+ "scale": "2x"
+ },
+ {
+ "size": "29x29",
+ "expected-size": "58",
+ "filename": "58.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "ipad",
+ "scale": "2x"
+ },
+ {
+ "size": "76x76",
+ "expected-size": "76",
+ "filename": "76.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "ipad",
+ "scale": "1x"
+ },
+ {
+ "size": "29x29",
+ "expected-size": "29",
+ "filename": "29.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "ipad",
+ "scale": "1x"
+ },
+ {
+ "size": "50x50",
+ "expected-size": "50",
+ "filename": "50.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "ipad",
+ "scale": "1x"
+ },
+ {
+ "size": "72x72",
+ "expected-size": "144",
+ "filename": "144.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "ipad",
+ "scale": "2x"
+ },
+ {
+ "size": "40x40",
+ "expected-size": "40",
+ "filename": "40.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "ipad",
+ "scale": "1x"
+ },
+ {
+ "size": "83.5x83.5",
+ "expected-size": "167",
+ "filename": "167.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "ipad",
+ "scale": "2x"
+ },
+ {
+ "size": "20x20",
+ "expected-size": "20",
+ "filename": "20.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "ipad",
+ "scale": "1x"
+ },
+ {
+ "size": "20x20",
+ "expected-size": "40",
+ "filename": "40.png",
+ "folder": "Assets.xcassets/AppIcon.appiconset/",
+ "idiom": "ipad",
+ "scale": "2x"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
new file mode 100644
index 0000000..231b667
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
new file mode 100644
index 0000000..eb47e4b
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
new file mode 100644
index 0000000..06f3af7
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
new file mode 100644
index 0000000..1db60c8
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
new file mode 100644
index 0000000..676021d
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
new file mode 100644
index 0000000..e550ab1
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
new file mode 100644
index 0000000..ed2d034
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
new file mode 100644
index 0000000..06f3af7
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
new file mode 100644
index 0000000..e389840
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
new file mode 100644
index 0000000..467e057
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png
new file mode 100644
index 0000000..a725498
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png
new file mode 100644
index 0000000..055ab1b
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png
new file mode 100644
index 0000000..4d55666
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png
new file mode 100644
index 0000000..68f40bf
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
new file mode 100644
index 0000000..467e057
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
new file mode 100644
index 0000000..5aad948
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png
new file mode 100644
index 0000000..e47b88f
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png
new file mode 100644
index 0000000..88c1c90
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
new file mode 100644
index 0000000..c60fec0
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
new file mode 100644
index 0000000..cc68271
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 0000000..680ef2f
Binary files /dev/null and b/filcnaplo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/Contents.json b/filcnaplo/ios/Runner/Assets.xcassets/Contents.json
index 73c0059..b2cf395 100644
--- a/filcnaplo/ios/Runner/Assets.xcassets/Contents.json
+++ b/filcnaplo/ios/Runner/Assets.xcassets/Contents.json
@@ -1,6 +1,6 @@
-{
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json b/filcnaplo/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json
index 9f447e1..98c5509 100644
--- a/filcnaplo/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json
+++ b/filcnaplo/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json
@@ -1,21 +1,21 @@
-{
- "images" : [
- {
- "filename" : "background.png",
- "idiom" : "universal",
- "scale" : "1x"
- },
- {
- "idiom" : "universal",
- "scale" : "2x"
- },
- {
- "idiom" : "universal",
- "scale" : "3x"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
+{
+ "images" : [
+ {
+ "filename" : "background.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png b/filcnaplo/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png
index 003a07f..d90316e 100644
Binary files a/filcnaplo/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png and b/filcnaplo/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
index 00cabce..97a1d4b 100644
--- a/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
+++ b/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -1,23 +1,23 @@
-{
- "images" : [
- {
- "filename" : "LaunchImage.png",
- "idiom" : "universal",
- "scale" : "1x"
- },
- {
- "filename" : "LaunchImage@2x.png",
- "idiom" : "universal",
- "scale" : "2x"
- },
- {
- "filename" : "LaunchImage@3x.png",
- "idiom" : "universal",
- "scale" : "3x"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
+{
+ "images" : [
+ {
+ "filename" : "LaunchImage.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "LaunchImage@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "LaunchImage@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
index 5d1ef37..b4566e0 100644
Binary files a/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and b/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
index dfa175f..7fb243f 100644
Binary files a/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and b/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
index 09d1c66..25992cd 100644
Binary files a/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and b/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
index 89c2725..65a94b5 100644
--- a/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
+++ b/filcnaplo/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
@@ -1,5 +1,5 @@
-# Launch Screen Assets
-
-You can customize the launch screen with your own desired assets by replacing the image files in this directory.
-
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/ic_absences.imageset/Contents.json b/filcnaplo/ios/Runner/Assets.xcassets/ic_absences.imageset/Contents.json
index 2945b36..49eded8 100644
--- a/filcnaplo/ios/Runner/Assets.xcassets/ic_absences.imageset/Contents.json
+++ b/filcnaplo/ios/Runner/Assets.xcassets/ic_absences.imageset/Contents.json
@@ -1,21 +1,21 @@
-{
- "images" : [
- {
- "filename" : "icon.png",
- "idiom" : "universal",
- "scale" : "1x"
- },
- {
- "idiom" : "universal",
- "scale" : "2x"
- },
- {
- "idiom" : "universal",
- "scale" : "3x"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
+{
+ "images" : [
+ {
+ "filename" : "icon.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/ic_grades.imageset/Contents.json b/filcnaplo/ios/Runner/Assets.xcassets/ic_grades.imageset/Contents.json
index 2945b36..49eded8 100644
--- a/filcnaplo/ios/Runner/Assets.xcassets/ic_grades.imageset/Contents.json
+++ b/filcnaplo/ios/Runner/Assets.xcassets/ic_grades.imageset/Contents.json
@@ -1,21 +1,21 @@
-{
- "images" : [
- {
- "filename" : "icon.png",
- "idiom" : "universal",
- "scale" : "1x"
- },
- {
- "idiom" : "universal",
- "scale" : "2x"
- },
- {
- "idiom" : "universal",
- "scale" : "3x"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
+{
+ "images" : [
+ {
+ "filename" : "icon.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/ic_messages.imageset/Contents.json b/filcnaplo/ios/Runner/Assets.xcassets/ic_messages.imageset/Contents.json
index 2945b36..49eded8 100644
--- a/filcnaplo/ios/Runner/Assets.xcassets/ic_messages.imageset/Contents.json
+++ b/filcnaplo/ios/Runner/Assets.xcassets/ic_messages.imageset/Contents.json
@@ -1,21 +1,21 @@
-{
- "images" : [
- {
- "filename" : "icon.png",
- "idiom" : "universal",
- "scale" : "1x"
- },
- {
- "idiom" : "universal",
- "scale" : "2x"
- },
- {
- "idiom" : "universal",
- "scale" : "3x"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
+{
+ "images" : [
+ {
+ "filename" : "icon.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/filcnaplo/ios/Runner/Assets.xcassets/ic_timetable.imageset/Contents.json b/filcnaplo/ios/Runner/Assets.xcassets/ic_timetable.imageset/Contents.json
index 2945b36..49eded8 100644
--- a/filcnaplo/ios/Runner/Assets.xcassets/ic_timetable.imageset/Contents.json
+++ b/filcnaplo/ios/Runner/Assets.xcassets/ic_timetable.imageset/Contents.json
@@ -1,21 +1,21 @@
-{
- "images" : [
- {
- "filename" : "icon.png",
- "idiom" : "universal",
- "scale" : "1x"
- },
- {
- "idiom" : "universal",
- "scale" : "2x"
- },
- {
- "idiom" : "universal",
- "scale" : "3x"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
+{
+ "images" : [
+ {
+ "filename" : "icon.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/filcnaplo/ios/Runner/Base.lproj/LaunchScreen.storyboard b/filcnaplo/ios/Runner/Base.lproj/LaunchScreen.storyboard
index fc4335b..9322003 100644
--- a/filcnaplo/ios/Runner/Base.lproj/LaunchScreen.storyboard
+++ b/filcnaplo/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -1,44 +1,44 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/filcnaplo/ios/Runner/Base.lproj/Main.storyboard b/filcnaplo/ios/Runner/Base.lproj/Main.storyboard
index f3c2851..bbb83ca 100644
--- a/filcnaplo/ios/Runner/Base.lproj/Main.storyboard
+++ b/filcnaplo/ios/Runner/Base.lproj/Main.storyboard
@@ -1,26 +1,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/filcnaplo/ios/Runner/Info.plist b/filcnaplo/ios/Runner/Info.plist
index 35e1a8d..9a3de20 100644
--- a/filcnaplo/ios/Runner/Info.plist
+++ b/filcnaplo/ios/Runner/Info.plist
@@ -1,71 +1,71 @@
-
-
-
-
- CADisableMinimumFrameDurationOnPhone
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- Filc Napló
- CFBundlePackageType
- APPL
- CFBundleShortVersionString
- $(FLUTTER_BUILD_NAME)
- CFBundleSignature
- ????
- CFBundleVersion
- $(FLUTTER_BUILD_NUMBER)
- ITSAppUsesNonExemptEncryption
-
- LSApplicationQueriesSchemes
-
- https
- http
-
- LSRequiresIPhoneOS
-
- NSPhotoLibraryUsageDescription
- The app requires the photo library to set a custom profile picture.
- NSSupportsLiveActivities
-
- UIApplicationSupportsIndirectInputEvents
-
- UIBackgroundModes
-
- fetch
- processing
-
- UILaunchStoryboardName
- LaunchScreen
- UIMainStoryboardFile
- Main
- UIStatusBarHidden
-
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UISupportedInterfaceOrientations~ipad
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- BGTaskSchedulerPermittedIdentifiers
-
- com.transistorsoft.fetch
-
- UIViewControllerBasedStatusBarAppearance
-
-
-
+
+
+
+
+ CADisableMinimumFrameDurationOnPhone
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ Filc Napló
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ ITSAppUsesNonExemptEncryption
+
+ LSApplicationQueriesSchemes
+
+ https
+ http
+
+ LSRequiresIPhoneOS
+
+ NSPhotoLibraryUsageDescription
+ The app requires the photo library to set a custom profile picture.
+ NSSupportsLiveActivities
+
+ UIApplicationSupportsIndirectInputEvents
+
+ UIBackgroundModes
+
+ fetch
+ processing
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UIStatusBarHidden
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ BGTaskSchedulerPermittedIdentifiers
+
+ com.transistorsoft.fetch
+
+ UIViewControllerBasedStatusBarAppearance
+
+
+
diff --git a/filcnaplo/ios/Runner/Runner-Bridging-Header.h b/filcnaplo/ios/Runner/Runner-Bridging-Header.h
index 308a2a5..fae207f 100644
--- a/filcnaplo/ios/Runner/Runner-Bridging-Header.h
+++ b/filcnaplo/ios/Runner/Runner-Bridging-Header.h
@@ -1 +1 @@
-#import "GeneratedPluginRegistrant.h"
+#import "GeneratedPluginRegistrant.h"
diff --git a/filcnaplo/ios/Runner/Runner.entitlements b/filcnaplo/ios/Runner/Runner.entitlements
index cfbd1dd..3ac64de 100644
--- a/filcnaplo/ios/Runner/Runner.entitlements
+++ b/filcnaplo/ios/Runner/Runner.entitlements
@@ -1,16 +1,16 @@
-
-
-
-
- aps-environment
- development
- com.apple.developer.associated-domains
-
- applinks:api.filcnaplo.hu
-
- com.apple.security.application-groups
-
- group.filcnaplo.livecard
-
-
-
+
+
+
+
+ aps-environment
+ development
+ com.apple.developer.associated-domains
+
+ applinks:api.filcnaplo.hu
+
+ com.apple.security.application-groups
+
+ group.filcnaplo.livecard
+
+
+
diff --git a/filcnaplo/ios/livecard/Assets.xcassets/AccentColor.colorset/Contents.json b/filcnaplo/ios/livecard/Assets.xcassets/AccentColor.colorset/Contents.json
index eb87897..78e16c0 100644
--- a/filcnaplo/ios/livecard/Assets.xcassets/AccentColor.colorset/Contents.json
+++ b/filcnaplo/ios/livecard/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -1,11 +1,11 @@
-{
- "colors" : [
- {
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
+{
+ "colors" : [
+ {
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/filcnaplo/ios/livecard/Assets.xcassets/AppIcon.appiconset/Contents.json b/filcnaplo/ios/livecard/Assets.xcassets/AppIcon.appiconset/Contents.json
index 13613e3..0417004 100644
--- a/filcnaplo/ios/livecard/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ b/filcnaplo/ios/livecard/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -1,13 +1,13 @@
-{
- "images" : [
- {
- "idiom" : "universal",
- "platform" : "ios",
- "size" : "1024x1024"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/filcnaplo/ios/livecard/Assets.xcassets/Contents.json b/filcnaplo/ios/livecard/Assets.xcassets/Contents.json
index 73c0059..b2cf395 100644
--- a/filcnaplo/ios/livecard/Assets.xcassets/Contents.json
+++ b/filcnaplo/ios/livecard/Assets.xcassets/Contents.json
@@ -1,6 +1,6 @@
-{
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/filcnaplo/ios/livecard/Assets.xcassets/WidgetBackground.colorset/Contents.json b/filcnaplo/ios/livecard/Assets.xcassets/WidgetBackground.colorset/Contents.json
index eb87897..78e16c0 100644
--- a/filcnaplo/ios/livecard/Assets.xcassets/WidgetBackground.colorset/Contents.json
+++ b/filcnaplo/ios/livecard/Assets.xcassets/WidgetBackground.colorset/Contents.json
@@ -1,11 +1,11 @@
-{
- "colors" : [
- {
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
+{
+ "colors" : [
+ {
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/filcnaplo/ios/livecard/Info.plist b/filcnaplo/ios/livecard/Info.plist
index 3aa7c09..56f1815 100644
--- a/filcnaplo/ios/livecard/Info.plist
+++ b/filcnaplo/ios/livecard/Info.plist
@@ -1,13 +1,13 @@
-
-
-
-
- NSExtension
-
- NSExtensionPointIdentifier
- com.apple.widgetkit-extension
-
- NSSupportsLiveActivities
-
-
-
+
+
+
+
+ NSExtension
+
+ NSExtensionPointIdentifier
+ com.apple.widgetkit-extension
+
+ NSSupportsLiveActivities
+
+
+
diff --git a/filcnaplo/ios/livecard/lesson_model.swift b/filcnaplo/ios/livecard/lesson_model.swift
index 7eddba8..b5fecb3 100644
--- a/filcnaplo/ios/livecard/lesson_model.swift
+++ b/filcnaplo/ios/livecard/lesson_model.swift
@@ -1,29 +1,29 @@
-import Foundation
-
-class LessonData {
- var icon: String
- var index: String
- var title: String
- var subtitle: String
- var description: String
- var startDate: Date
- var endDate: Date
- var date: ClosedRange
- var nextSubject: String
- var nextRoom: String
-
- init?() {
- let sharedDefault = UserDefaults(suiteName: "group.filcnaplo.livecard")!
-
- self.icon = sharedDefault.string(forKey: "icon")!
- self.index = sharedDefault.string(forKey: "index")!
- self.title = sharedDefault.string(forKey: "title")!
- self.subtitle = sharedDefault.string(forKey: "subtitle")!
- self.description = sharedDefault.string(forKey: "description")!
- self.startDate = Date(timeIntervalSince1970: Double(sharedDefault.string(forKey: "startDate")!)! / 1000)
- self.endDate = Date(timeIntervalSince1970: Double(sharedDefault.string(forKey: "endDate")!)! / 1000)
- date = self.startDate...self.endDate
- self.nextSubject = sharedDefault.string(forKey: "nextSubject")!
- self.nextRoom = sharedDefault.string(forKey: "nextRoom")!
- }
-}
+import Foundation
+
+class LessonData {
+ var icon: String
+ var index: String
+ var title: String
+ var subtitle: String
+ var description: String
+ var startDate: Date
+ var endDate: Date
+ var date: ClosedRange
+ var nextSubject: String
+ var nextRoom: String
+
+ init?() {
+ let sharedDefault = UserDefaults(suiteName: "group.filcnaplo.livecard")!
+
+ self.icon = sharedDefault.string(forKey: "icon")!
+ self.index = sharedDefault.string(forKey: "index")!
+ self.title = sharedDefault.string(forKey: "title")!
+ self.subtitle = sharedDefault.string(forKey: "subtitle")!
+ self.description = sharedDefault.string(forKey: "description")!
+ self.startDate = Date(timeIntervalSince1970: Double(sharedDefault.string(forKey: "startDate")!)! / 1000)
+ self.endDate = Date(timeIntervalSince1970: Double(sharedDefault.string(forKey: "endDate")!)! / 1000)
+ date = self.startDate...self.endDate
+ self.nextSubject = sharedDefault.string(forKey: "nextSubject")!
+ self.nextRoom = sharedDefault.string(forKey: "nextRoom")!
+ }
+}
diff --git a/filcnaplo/ios/livecard/livecard.entitlements b/filcnaplo/ios/livecard/livecard.entitlements
index 36a4458..9355d62 100644
--- a/filcnaplo/ios/livecard/livecard.entitlements
+++ b/filcnaplo/ios/livecard/livecard.entitlements
@@ -1,10 +1,10 @@
-
-
-
-
- com.apple.security.application-groups
-
- group.filcnaplo.livecard
-
-
-
+
+
+
+
+ com.apple.security.application-groups
+
+ group.filcnaplo.livecard
+
+
+
diff --git a/filcnaplo/ios/livecard/livecard.intentdefinition b/filcnaplo/ios/livecard/livecard.intentdefinition
index bdb4045..b3d4023 100644
--- a/filcnaplo/ios/livecard/livecard.intentdefinition
+++ b/filcnaplo/ios/livecard/livecard.intentdefinition
@@ -1,59 +1,59 @@
-
-
-
-
- INEnums
-
- INIntentDefinitionModelVersion
- 1.2
- INIntentDefinitionNamespace
- 88xZPY
- INIntentDefinitionSystemVersion
- 20A294
- INIntentDefinitionToolsBuildVersion
- 12A6144
- INIntentDefinitionToolsVersion
- 12.0
- INIntents
-
-
- INIntentCategory
- information
- INIntentDescriptionID
- tVvJ9c
- INIntentEligibleForWidgets
-
- INIntentIneligibleForSuggestions
-
- INIntentName
- Configuration
- INIntentResponse
-
- INIntentResponseCodes
-
-
- INIntentResponseCodeName
- success
- INIntentResponseCodeSuccess
-
-
-
- INIntentResponseCodeName
- failure
-
-
-
- INIntentTitle
- Configuration
- INIntentTitleID
- gpCwrM
- INIntentType
- Custom
- INIntentVerb
- View
-
-
- INTypes
-
-
-
+
+
+
+
+ INEnums
+
+ INIntentDefinitionModelVersion
+ 1.2
+ INIntentDefinitionNamespace
+ 88xZPY
+ INIntentDefinitionSystemVersion
+ 20A294
+ INIntentDefinitionToolsBuildVersion
+ 12A6144
+ INIntentDefinitionToolsVersion
+ 12.0
+ INIntents
+
+
+ INIntentCategory
+ information
+ INIntentDescriptionID
+ tVvJ9c
+ INIntentEligibleForWidgets
+
+ INIntentIneligibleForSuggestions
+
+ INIntentName
+ Configuration
+ INIntentResponse
+
+ INIntentResponseCodes
+
+
+ INIntentResponseCodeName
+ success
+ INIntentResponseCodeSuccess
+
+
+
+ INIntentResponseCodeName
+ failure
+
+
+
+ INIntentTitle
+ Configuration
+ INIntentTitleID
+ gpCwrM
+ INIntentType
+ Custom
+ INIntentVerb
+ View
+
+
+ INTypes
+
+
+
diff --git a/filcnaplo/ios/livecard/livecard.swift b/filcnaplo/ios/livecard/livecard.swift
index 1af4622..cbccc8c 100644
--- a/filcnaplo/ios/livecard/livecard.swift
+++ b/filcnaplo/ios/livecard/livecard.swift
@@ -1,152 +1,152 @@
-import ActivityKit
-import WidgetKit
-import SwiftUI
-
-@main
-struct Widgets: WidgetBundle {
- var body: some Widget {
- if #available(iOS 16.1, *) {
- LiveCardWidget()
- }
- }
-}
-
-// We need to redefined live activities pipe
-struct LiveActivitiesAppAttributes: ActivityAttributes, Identifiable {
- public struct ContentState: Codable, Hashable { }
-
- var id = UUID()
-}
-
-struct LockScreenLiveActivityView: View {
- let context: ActivityViewContext
-
- let lesson = LessonData()
-
- var body: some View {
- HStack(alignment: .center) {
- Image(systemName: lesson!.icon)
- .resizable()
- .aspectRatio(contentMode: .fit)
- .frame(width: CGFloat(30), height: CGFloat(30))
- .padding(.leading, CGFloat(24))
-
- VStack(alignment: .leading) {
- HStack(alignment: .center) {
- Text(lesson!.index + lesson!.title)
- .font(.title3)
- .bold()
-
- Text(lesson!.subtitle)
- .font(.subheadline)
- .padding(.trailing, 12)
- }
-
- if (lesson!.description != "") {
- Text(lesson!.description)
- .font(.subheadline)
- }
-
- HStack {
- Image(systemName: "arrow.right")
- .resizable()
- .aspectRatio(contentMode: .fit)
- .frame(width: CGFloat(8), height: CGFloat(8))
- Text(lesson!.nextSubject)
- .font(.caption)
- Text(lesson!.nextRoom)
- .font(.caption2)
- }
- }.padding(15)
-
- Spacer()
-
- Text(timerInterval: lesson!.date, countsDown: true)
- .multilineTextAlignment(.center)
- .frame(width: 85)
- .font(.title)
- .monospacedDigit()
- .padding(.trailing, CGFloat(24))
- }
- .activitySystemActionForegroundColor(.teal)
- .activityBackgroundTint(.teal)
- }
-}
-
-@available(iOSApplicationExtension 16.1, *)
-struct LiveCardWidget: Widget {
- var body: some WidgetConfiguration {
- /// Live Activity Notification
- ActivityConfiguration(for: LiveActivitiesAppAttributes.self) { context in
- LockScreenLiveActivityView(context: context)
- /// Dynamic Island
- } dynamicIsland: { context in
- let lesson = LessonData()
-
- /// Expanded
- return DynamicIsland {
- DynamicIslandExpandedRegion(.leading) {
- VStack {
- Spacer()
- Image(systemName: lesson!.icon)
- .resizable()
- .aspectRatio(contentMode: .fit)
- .frame(width: CGFloat(30), height: CGFloat(30))
- .padding(.leading, CGFloat(6))
- .padding(.bottom, CGFloat(6))
- }
- }
- DynamicIslandExpandedRegion(.center) {
- VStack(alignment: .leading) {
- Text(lesson!.index + lesson!.title)
- .lineLimit(1)
- .font(.title3)
- .bold()
-
- Text(lesson!.description)
- .lineLimit(2)
- .font(.caption)
- }
- }
- DynamicIslandExpandedRegion(.trailing) {
- VStack {
- Spacer()
- Text(lesson!.subtitle)
- .lineLimit(1)
- .font(.subheadline)
- Spacer()
- }
- }
-
- /// Compact
- } compactLeading: {
- Label {
- Text(lesson!.title)
- } icon: {
- Image(systemName: lesson!.icon)
- }
- .font(.caption2)
- } compactTrailing: {
- Text(timerInterval: lesson!.date, countsDown: true)
- .multilineTextAlignment(.center)
- .frame(width: 40)
- .font(.caption2)
-
- /// Collapsed
- } minimal: {
- VStack(alignment: .center) {
- Image(systemName: lesson!.icon)
- .resizable()
- .aspectRatio(contentMode: .fit)
- .frame(width: CGFloat(12), height: CGFloat(12))
-
- Text(timerInterval: lesson!.date, countsDown: true)
- .multilineTextAlignment(.center)
- .monospacedDigit()
- .font(.system(size: CGFloat(10)))
- }
- }
- .keylineTint(.accentColor)
- }
- }
-}
+import ActivityKit
+import WidgetKit
+import SwiftUI
+
+@main
+struct Widgets: WidgetBundle {
+ var body: some Widget {
+ if #available(iOS 16.1, *) {
+ LiveCardWidget()
+ }
+ }
+}
+
+// We need to redefined live activities pipe
+struct LiveActivitiesAppAttributes: ActivityAttributes, Identifiable {
+ public struct ContentState: Codable, Hashable { }
+
+ var id = UUID()
+}
+
+struct LockScreenLiveActivityView: View {
+ let context: ActivityViewContext
+
+ let lesson = LessonData()
+
+ var body: some View {
+ HStack(alignment: .center) {
+ Image(systemName: lesson!.icon)
+ .resizable()
+ .aspectRatio(contentMode: .fit)
+ .frame(width: CGFloat(30), height: CGFloat(30))
+ .padding(.leading, CGFloat(24))
+
+ VStack(alignment: .leading) {
+ HStack(alignment: .center) {
+ Text(lesson!.index + lesson!.title)
+ .font(.title3)
+ .bold()
+
+ Text(lesson!.subtitle)
+ .font(.subheadline)
+ .padding(.trailing, 12)
+ }
+
+ if (lesson!.description != "") {
+ Text(lesson!.description)
+ .font(.subheadline)
+ }
+
+ HStack {
+ Image(systemName: "arrow.right")
+ .resizable()
+ .aspectRatio(contentMode: .fit)
+ .frame(width: CGFloat(8), height: CGFloat(8))
+ Text(lesson!.nextSubject)
+ .font(.caption)
+ Text(lesson!.nextRoom)
+ .font(.caption2)
+ }
+ }.padding(15)
+
+ Spacer()
+
+ Text(timerInterval: lesson!.date, countsDown: true)
+ .multilineTextAlignment(.center)
+ .frame(width: 85)
+ .font(.title)
+ .monospacedDigit()
+ .padding(.trailing, CGFloat(24))
+ }
+ .activitySystemActionForegroundColor(.teal)
+ .activityBackgroundTint(.teal)
+ }
+}
+
+@available(iOSApplicationExtension 16.1, *)
+struct LiveCardWidget: Widget {
+ var body: some WidgetConfiguration {
+ /// Live Activity Notification
+ ActivityConfiguration(for: LiveActivitiesAppAttributes.self) { context in
+ LockScreenLiveActivityView(context: context)
+ /// Dynamic Island
+ } dynamicIsland: { context in
+ let lesson = LessonData()
+
+ /// Expanded
+ return DynamicIsland {
+ DynamicIslandExpandedRegion(.leading) {
+ VStack {
+ Spacer()
+ Image(systemName: lesson!.icon)
+ .resizable()
+ .aspectRatio(contentMode: .fit)
+ .frame(width: CGFloat(30), height: CGFloat(30))
+ .padding(.leading, CGFloat(6))
+ .padding(.bottom, CGFloat(6))
+ }
+ }
+ DynamicIslandExpandedRegion(.center) {
+ VStack(alignment: .leading) {
+ Text(lesson!.index + lesson!.title)
+ .lineLimit(1)
+ .font(.title3)
+ .bold()
+
+ Text(lesson!.description)
+ .lineLimit(2)
+ .font(.caption)
+ }
+ }
+ DynamicIslandExpandedRegion(.trailing) {
+ VStack {
+ Spacer()
+ Text(lesson!.subtitle)
+ .lineLimit(1)
+ .font(.subheadline)
+ Spacer()
+ }
+ }
+
+ /// Compact
+ } compactLeading: {
+ Label {
+ Text(lesson!.title)
+ } icon: {
+ Image(systemName: lesson!.icon)
+ }
+ .font(.caption2)
+ } compactTrailing: {
+ Text(timerInterval: lesson!.date, countsDown: true)
+ .multilineTextAlignment(.center)
+ .frame(width: 40)
+ .font(.caption2)
+
+ /// Collapsed
+ } minimal: {
+ VStack(alignment: .center) {
+ Image(systemName: lesson!.icon)
+ .resizable()
+ .aspectRatio(contentMode: .fit)
+ .frame(width: CGFloat(12), height: CGFloat(12))
+
+ Text(timerInterval: lesson!.date, countsDown: true)
+ .multilineTextAlignment(.center)
+ .monospacedDigit()
+ .font(.system(size: CGFloat(10)))
+ }
+ }
+ .keylineTint(.accentColor)
+ }
+ }
+}
diff --git a/filcnaplo/lib/api/client.dart b/filcnaplo/lib/api/client.dart
index bbb7800..67671bd 100644
--- a/filcnaplo/lib/api/client.dart
+++ b/filcnaplo/lib/api/client.dart
@@ -1,165 +1,165 @@
-import 'dart:convert';
-import 'dart:developer';
-
-import 'package:filcnaplo/models/config.dart';
-import 'package:filcnaplo/models/news.dart';
-import 'package:filcnaplo/models/release.dart';
-import 'package:filcnaplo/models/settings.dart';
-import 'package:filcnaplo/models/supporter.dart';
-import 'package:filcnaplo_kreta_api/models/school.dart';
-import 'package:http/http.dart' as http;
-import 'package:connectivity_plus/connectivity_plus.dart';
-
-class FilcAPI {
- // Public API
- static const schoolList = "https://filcnaplo.hu/v2/school_list.json";
- static const news = "https://filcnaplo.hu/v2/news.json";
- static const supporters = "https://api.filcnaplo.hu/sponsors";
-
- // Private API
- static const config = "https://api.filcnaplo.hu/config";
- static const reportApi = "https://api.filcnaplo.hu/report";
- static const premiumApi = "https://api.filcnaplo.hu/premium/activate";
- // static const premiumScopesApi = "https://api.filcnaplo.hu/premium/scopes";
-
- // Updates
- static const repo = "filc/naplo";
- static const releases = "https://api.github.com/repos/$repo/releases";
-
- static Future checkConnectivity() async => (await Connectivity().checkConnectivity()) != ConnectivityResult.none;
-
- static Future?> getSchools() async {
- try {
- http.Response res = await http.get(Uri.parse(schoolList));
-
- if (res.statusCode == 200) {
- List schools = (jsonDecode(res.body) as List).cast().map((json) => School.fromJson(json)).toList();
- schools.add(School(
- city: "Tiszabura",
- instituteCode: "supporttest-reni-tiszabura-teszt01",
- name: "FILC Éles Reni tiszabura-teszt",
- ));
- return schools;
- } else {
- throw "HTTP ${res.statusCode}: ${res.body}";
- }
- } on Exception catch (error, stacktrace) {
- log("ERROR: FilcAPI.getSchools: $error $stacktrace");
- }
- return null;
- }
-
- static Future getConfig(SettingsProvider settings) async {
- final userAgent = SettingsProvider.defaultSettings().config.userAgent;
-
- Map headers = {
- "x-filc-id": settings.xFilcId,
- "user-agent": userAgent,
- };
-
- log("[CONFIG] x-filc-id: \"${settings.xFilcId}\"");
- log("[CONFIG] user-agent: \"$userAgent\"");
-
- try {
- http.Response res = await http.get(Uri.parse(config), headers: headers);
-
- if (res.statusCode == 200) {
- return Config.fromJson(jsonDecode(res.body));
- } else if (res.statusCode == 429) {
- res = await http.get(Uri.parse(config));
- if (res.statusCode == 200) return Config.fromJson(jsonDecode(res.body));
- }
- throw "HTTP ${res.statusCode}: ${res.body}";
- } on Exception catch (error, stacktrace) {
- log("ERROR: FilcAPI.getConfig: $error $stacktrace");
- }
- return null;
- }
-
- static Future?> getNews() async {
- try {
- http.Response res = await http.get(Uri.parse(news));
-
- if (res.statusCode == 200) {
- return (jsonDecode(res.body) as List).cast().map((e) => News.fromJson(e)).toList();
- } else {
- throw "HTTP ${res.statusCode}: ${res.body}";
- }
- } on Exception catch (error, stacktrace) {
- log("ERROR: FilcAPI.getNews: $error $stacktrace");
- }
- return null;
- }
-
- static Future getSupporters() async {
- try {
- http.Response res = await http.get(Uri.parse(supporters));
-
- if (res.statusCode == 200) {
- return Supporters.fromJson(jsonDecode(res.body));
- } else {
- throw "HTTP ${res.statusCode}: ${res.body}";
- }
- } on Exception catch (error, stacktrace) {
- log("ERROR: FilcAPI.getSupporters: $error $stacktrace");
- }
- return null;
- }
-
- static Future?> getReleases() async {
- try {
- http.Response res = await http.get(Uri.parse(releases));
-
- if (res.statusCode == 200) {
- return (jsonDecode(res.body) as List).cast().map((e) => Release.fromJson(e)).toList();
- } else {
- throw "HTTP ${res.statusCode}: ${res.body}";
- }
- } on Exception catch (error, stacktrace) {
- log("ERROR: FilcAPI.getReleases: $error $stacktrace");
- }
- return null;
- }
-
- static Future downloadRelease(ReleaseDownload release) {
- try {
- var client = http.Client();
- var request = http.Request('GET', Uri.parse(release.url));
- return client.send(request);
- } on Exception catch (error, stacktrace) {
- log("ERROR: FilcAPI.downloadRelease: $error $stacktrace");
- return Future.value(null);
- }
- }
-
- static Future sendReport(ErrorReport report) async {
- try {
- http.Response res = await http.post(Uri.parse(reportApi), body: {
- "os": report.os,
- "version": report.version,
- "error": report.error,
- "stack_trace": report.stack,
- });
-
- if (res.statusCode != 200) {
- throw "HTTP ${res.statusCode}: ${res.body}";
- }
- } on Exception catch (error, stacktrace) {
- log("ERROR: FilcAPI.sendReport: $error $stacktrace");
- }
- }
-}
-
-class ErrorReport {
- String stack;
- String os;
- String version;
- String error;
-
- ErrorReport({
- required this.stack,
- required this.os,
- required this.version,
- required this.error,
- });
-}
+import 'dart:convert';
+import 'dart:developer';
+
+import 'package:filcnaplo/models/config.dart';
+import 'package:filcnaplo/models/news.dart';
+import 'package:filcnaplo/models/release.dart';
+import 'package:filcnaplo/models/settings.dart';
+import 'package:filcnaplo/models/supporter.dart';
+import 'package:filcnaplo_kreta_api/models/school.dart';
+import 'package:http/http.dart' as http;
+import 'package:connectivity_plus/connectivity_plus.dart';
+
+class FilcAPI {
+ // Public API
+ static const schoolList = "https://filcnaplo.hu/v2/school_list.json";
+ static const news = "https://filcnaplo.hu/v2/news.json";
+ static const supporters = "https://api.filcnaplo.hu/sponsors";
+
+ // Private API
+ static const config = "https://api.filcnaplo.hu/config";
+ static const reportApi = "https://api.filcnaplo.hu/report";
+ static const premiumApi = "https://api.filcnaplo.hu/premium/activate";
+ // static const premiumScopesApi = "https://api.filcnaplo.hu/premium/scopes";
+
+ // Updates
+ static const repo = "filc/naplo";
+ static const releases = "https://api.github.com/repos/$repo/releases";
+
+ static Future checkConnectivity() async => (await Connectivity().checkConnectivity()) != ConnectivityResult.none;
+
+ static Future?> getSchools() async {
+ try {
+ http.Response res = await http.get(Uri.parse(schoolList));
+
+ if (res.statusCode == 200) {
+ List schools = (jsonDecode(res.body) as List).cast().map((json) => School.fromJson(json)).toList();
+ schools.add(School(
+ city: "Tiszabura",
+ instituteCode: "supporttest-reni-tiszabura-teszt01",
+ name: "FILC Éles Reni tiszabura-teszt",
+ ));
+ return schools;
+ } else {
+ throw "HTTP ${res.statusCode}: ${res.body}";
+ }
+ } on Exception catch (error, stacktrace) {
+ log("ERROR: FilcAPI.getSchools: $error $stacktrace");
+ }
+ return null;
+ }
+
+ static Future getConfig(SettingsProvider settings) async {
+ final userAgent = SettingsProvider.defaultSettings().config.userAgent;
+
+ Map headers = {
+ "x-filc-id": settings.xFilcId,
+ "user-agent": userAgent,
+ };
+
+ log("[CONFIG] x-filc-id: \"${settings.xFilcId}\"");
+ log("[CONFIG] user-agent: \"$userAgent\"");
+
+ try {
+ http.Response res = await http.get(Uri.parse(config), headers: headers);
+
+ if (res.statusCode == 200) {
+ return Config.fromJson(jsonDecode(res.body));
+ } else if (res.statusCode == 429) {
+ res = await http.get(Uri.parse(config));
+ if (res.statusCode == 200) return Config.fromJson(jsonDecode(res.body));
+ }
+ throw "HTTP ${res.statusCode}: ${res.body}";
+ } on Exception catch (error, stacktrace) {
+ log("ERROR: FilcAPI.getConfig: $error $stacktrace");
+ }
+ return null;
+ }
+
+ static Future?> getNews() async {
+ try {
+ http.Response res = await http.get(Uri.parse(news));
+
+ if (res.statusCode == 200) {
+ return (jsonDecode(res.body) as List).cast().map((e) => News.fromJson(e)).toList();
+ } else {
+ throw "HTTP ${res.statusCode}: ${res.body}";
+ }
+ } on Exception catch (error, stacktrace) {
+ log("ERROR: FilcAPI.getNews: $error $stacktrace");
+ }
+ return null;
+ }
+
+ static Future getSupporters() async {
+ try {
+ http.Response res = await http.get(Uri.parse(supporters));
+
+ if (res.statusCode == 200) {
+ return Supporters.fromJson(jsonDecode(res.body));
+ } else {
+ throw "HTTP ${res.statusCode}: ${res.body}";
+ }
+ } on Exception catch (error, stacktrace) {
+ log("ERROR: FilcAPI.getSupporters: $error $stacktrace");
+ }
+ return null;
+ }
+
+ static Future?> getReleases() async {
+ try {
+ http.Response res = await http.get(Uri.parse(releases));
+
+ if (res.statusCode == 200) {
+ return (jsonDecode(res.body) as List).cast().map((e) => Release.fromJson(e)).toList();
+ } else {
+ throw "HTTP ${res.statusCode}: ${res.body}";
+ }
+ } on Exception catch (error, stacktrace) {
+ log("ERROR: FilcAPI.getReleases: $error $stacktrace");
+ }
+ return null;
+ }
+
+ static Future downloadRelease(ReleaseDownload release) {
+ try {
+ var client = http.Client();
+ var request = http.Request('GET', Uri.parse(release.url));
+ return client.send(request);
+ } on Exception catch (error, stacktrace) {
+ log("ERROR: FilcAPI.downloadRelease: $error $stacktrace");
+ return Future.value(null);
+ }
+ }
+
+ static Future sendReport(ErrorReport report) async {
+ try {
+ http.Response res = await http.post(Uri.parse(reportApi), body: {
+ "os": report.os,
+ "version": report.version,
+ "error": report.error,
+ "stack_trace": report.stack,
+ });
+
+ if (res.statusCode != 200) {
+ throw "HTTP ${res.statusCode}: ${res.body}";
+ }
+ } on Exception catch (error, stacktrace) {
+ log("ERROR: FilcAPI.sendReport: $error $stacktrace");
+ }
+ }
+}
+
+class ErrorReport {
+ String stack;
+ String os;
+ String version;
+ String error;
+
+ ErrorReport({
+ required this.stack,
+ required this.os,
+ required this.version,
+ required this.error,
+ });
+}
diff --git a/filcnaplo/lib/api/login.dart b/filcnaplo/lib/api/login.dart
index ee55339..7d98789 100644
--- a/filcnaplo/lib/api/login.dart
+++ b/filcnaplo/lib/api/login.dart
@@ -1,115 +1,115 @@
-// ignore_for_file: avoid_print, use_build_context_synchronously
-
-import 'package:filcnaplo/utils/jwt.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/exam_provider.dart';
-import 'package:filcnaplo_kreta_api/providers/grade_provider.dart';
-import 'package:filcnaplo_kreta_api/providers/homework_provider.dart';
-import 'package:filcnaplo_kreta_api/providers/message_provider.dart';
-import 'package:filcnaplo_kreta_api/providers/note_provider.dart';
-import 'package:filcnaplo_kreta_api/providers/timetable_provider.dart';
-import 'package:filcnaplo/api/providers/user_provider.dart';
-import 'package:filcnaplo/api/providers/database_provider.dart';
-import 'package:filcnaplo/models/settings.dart';
-import 'package:filcnaplo/models/user.dart';
-import 'package:filcnaplo_kreta_api/client/api.dart';
-import 'package:filcnaplo_kreta_api/client/client.dart';
-import 'package:filcnaplo_kreta_api/models/student.dart';
-import 'package:filcnaplo_kreta_api/models/week.dart';
-import 'package:flutter/material.dart';
-import 'package:provider/provider.dart';
-import 'package:filcnaplo/api/nonce.dart';
-
-enum LoginState { missingFields, invalidGrant, failed, normal, inProgress, success }
-
-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);
- nonceEncoder.encode(instituteCode.toUpperCase() + nonce + username.toUpperCase());
-
- return nonceEncoder;
-}
-
-Future loginApi({
- required String username,
- required String password,
- required String instituteCode,
- required BuildContext context,
- void Function(User)? onLogin,
- void Function()? onSuccess,
-}) async {
- Provider.of(context, listen: false).userAgent = Provider.of(context, listen: false).config.userAgent;
-
- Map headers = {
- "content-type": "application/x-www-form-urlencoded",
- };
-
- String nonceStr = await Provider.of(context, listen: false).getAPI(KretaAPI.nonce, json: false);
-
- Nonce nonce = getNonce(nonceStr, username, instituteCode);
- headers.addAll(nonce.header());
-
- Map? res = await Provider.of(context, listen: false).postAPI(KretaAPI.login,
- headers: headers,
- body: User.loginBody(
- username: username,
- password: password,
- instituteCode: instituteCode,
- ));
- if (res != null) {
- if (res.containsKey("error")) {
- if (res["error"] == "invalid_grant") {
- return LoginState.invalidGrant;
- }
- } else {
- if (res.containsKey("access_token")) {
- try {
- Provider.of(context, listen: false).accessToken = res["access_token"];
- Map? studentJson = await Provider.of(context, listen: false).getAPI(KretaAPI.student(instituteCode));
- Student student = Student.fromJson(studentJson!);
- var user = User(
- username: username,
- password: password,
- instituteCode: instituteCode,
- name: student.name,
- student: student,
- role: JwtUtils.getRoleFromJWT(res["access_token"])!,
- );
-
- if (onLogin != null) onLogin(user);
-
- // Store User in the database
- await Provider.of(context, listen: false).store.storeUser(user);
- Provider.of(context, listen: false).addUser(user);
- Provider.of(context, listen: false).setUser(user.id);
-
- // Get user data
- try {
- await Future.wait([
- Provider.of(context, listen: false).fetch(),
- Provider.of(context, listen: false).fetch(week: Week.current()),
- Provider.of(context, listen: false).fetch(),
- Provider.of(context, listen: false).fetch(),
- Provider.of(context, listen: false).fetchAll(),
- Provider.of(context, listen: false).fetch(),
- Provider.of(context, listen: false).fetch(),
- Provider.of(context, listen: false).fetch(),
- ]);
- } catch (error) {
- print("WARNING: failed to fetch user data: $error");
- }
-
- if (onSuccess != null) onSuccess();
-
- return LoginState.success;
- } catch (error) {
- print("ERROR: loginApi: $error");
- // maybe check debug mode
- // ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("ERROR: $error")));
- return LoginState.failed;
- }
- }
- }
- }
- return LoginState.failed;
-}
+// ignore_for_file: avoid_print, use_build_context_synchronously
+
+import 'package:filcnaplo/utils/jwt.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/exam_provider.dart';
+import 'package:filcnaplo_kreta_api/providers/grade_provider.dart';
+import 'package:filcnaplo_kreta_api/providers/homework_provider.dart';
+import 'package:filcnaplo_kreta_api/providers/message_provider.dart';
+import 'package:filcnaplo_kreta_api/providers/note_provider.dart';
+import 'package:filcnaplo_kreta_api/providers/timetable_provider.dart';
+import 'package:filcnaplo/api/providers/user_provider.dart';
+import 'package:filcnaplo/api/providers/database_provider.dart';
+import 'package:filcnaplo/models/settings.dart';
+import 'package:filcnaplo/models/user.dart';
+import 'package:filcnaplo_kreta_api/client/api.dart';
+import 'package:filcnaplo_kreta_api/client/client.dart';
+import 'package:filcnaplo_kreta_api/models/student.dart';
+import 'package:filcnaplo_kreta_api/models/week.dart';
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+import 'package:filcnaplo/api/nonce.dart';
+
+enum LoginState { missingFields, invalidGrant, failed, normal, inProgress, success }
+
+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);
+ nonceEncoder.encode(instituteCode.toUpperCase() + nonce + username.toUpperCase());
+
+ return nonceEncoder;
+}
+
+Future loginApi({
+ required String username,
+ required String password,
+ required String instituteCode,
+ required BuildContext context,
+ void Function(User)? onLogin,
+ void Function()? onSuccess,
+}) async {
+ Provider.of(context, listen: false).userAgent = Provider.of(context, listen: false).config.userAgent;
+
+ Map headers = {
+ "content-type": "application/x-www-form-urlencoded",
+ };
+
+ String nonceStr = await Provider.of(context, listen: false).getAPI(KretaAPI.nonce, json: false);
+
+ Nonce nonce = getNonce(nonceStr, username, instituteCode);
+ headers.addAll(nonce.header());
+
+ Map? res = await Provider.of(context, listen: false).postAPI(KretaAPI.login,
+ headers: headers,
+ body: User.loginBody(
+ username: username,
+ password: password,
+ instituteCode: instituteCode,
+ ));
+ if (res != null) {
+ if (res.containsKey("error")) {
+ if (res["error"] == "invalid_grant") {
+ return LoginState.invalidGrant;
+ }
+ } else {
+ if (res.containsKey("access_token")) {
+ try {
+ Provider.of(context, listen: false).accessToken = res["access_token"];
+ Map? studentJson = await Provider.of(context, listen: false).getAPI(KretaAPI.student(instituteCode));
+ Student student = Student.fromJson(studentJson!);
+ var user = User(
+ username: username,
+ password: password,
+ instituteCode: instituteCode,
+ name: student.name,
+ student: student,
+ role: JwtUtils.getRoleFromJWT(res["access_token"])!,
+ );
+
+ if (onLogin != null) onLogin(user);
+
+ // Store User in the database
+ await Provider.of(context, listen: false).store.storeUser(user);
+ Provider.of(context, listen: false).addUser(user);
+ Provider.of(context, listen: false).setUser(user.id);
+
+ // Get user data
+ try {
+ await Future.wait([
+ Provider.of(context, listen: false).fetch(),
+ Provider.of(context, listen: false).fetch(week: Week.current()),
+ Provider.of(context, listen: false).fetch(),
+ Provider.of(context, listen: false).fetch(),
+ Provider.of(context, listen: false).fetchAll(),
+ Provider.of(context, listen: false).fetch(),
+ Provider.of(context, listen: false).fetch(),
+ Provider.of(context, listen: false).fetch(),
+ ]);
+ } catch (error) {
+ print("WARNING: failed to fetch user data: $error");
+ }
+
+ if (onSuccess != null) onSuccess();
+
+ return LoginState.success;
+ } catch (error) {
+ print("ERROR: loginApi: $error");
+ // maybe check debug mode
+ // ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("ERROR: $error")));
+ return LoginState.failed;
+ }
+ }
+ }
+ }
+ return LoginState.failed;
+}
diff --git a/filcnaplo/lib/api/nonce.dart b/filcnaplo/lib/api/nonce.dart
index 2a1195b..0cc13e6 100644
--- a/filcnaplo/lib/api/nonce.dart
+++ b/filcnaplo/lib/api/nonce.dart
@@ -1,25 +1,25 @@
-import 'dart:convert';
-import 'package:crypto/crypto.dart';
-
-class Nonce {
- String nonce;
- List key;
- String? encoded;
-
- Nonce({required this.nonce, required this.key});
-
- Future encode(String message) async {
- List messageBytes = utf8.encode(message);
- Hmac hmac = Hmac(sha512, key);
- Digest digest = hmac.convert(messageBytes);
- encoded = base64.encode(digest.bytes);
- }
-
- Map header() {
- return {
- "X-Authorizationpolicy-Nonce": nonce,
- "X-Authorizationpolicy-Key": encoded ?? "",
- "X-Authorizationpolicy-Version": "v2",
- };
- }
-}
+import 'dart:convert';
+import 'package:crypto/crypto.dart';
+
+class Nonce {
+ String nonce;
+ List key;
+ String? encoded;
+
+ Nonce({required this.nonce, required this.key});
+
+ Future encode(String message) async {
+ List messageBytes = utf8.encode(message);
+ Hmac hmac = Hmac(sha512, key);
+ Digest digest = hmac.convert(messageBytes);
+ encoded = base64.encode(digest.bytes);
+ }
+
+ Map header() {
+ return {
+ "X-Authorizationpolicy-Nonce": nonce,
+ "X-Authorizationpolicy-Key": encoded ?? "",
+ "X-Authorizationpolicy-Version": "v2",
+ };
+ }
+}
diff --git a/filcnaplo/lib/api/providers/database_provider.dart b/filcnaplo/lib/api/providers/database_provider.dart
index 1b4edcf..e338f57 100644
--- a/filcnaplo/lib/api/providers/database_provider.dart
+++ b/filcnaplo/lib/api/providers/database_provider.dart
@@ -1,30 +1,30 @@
-import 'dart:io';
-
-import 'package:filcnaplo/database/query.dart';
-import 'package:filcnaplo/database/store.dart';
-import 'package:sqflite/sqflite.dart';
-// ignore: depend_on_referenced_packages
-import 'package:sqflite_common_ffi/sqflite_ffi.dart';
-
-class DatabaseProvider {
- // late Database _database;
- late DatabaseQuery query;
- late UserDatabaseQuery userQuery;
- late DatabaseStore store;
- late UserDatabaseStore userStore;
-
- Future init() async {
- Database db;
-
- if (Platform.isLinux || Platform.isWindows) {
- db = await databaseFactoryFfi.openDatabase("app.db");
- } else {
- db = await openDatabase("app.db");
- }
-
- query = DatabaseQuery(db: db);
- store = DatabaseStore(db: db);
- userQuery = UserDatabaseQuery(db: db);
- userStore = UserDatabaseStore(db: db);
- }
-}
+import 'dart:io';
+
+import 'package:filcnaplo/database/query.dart';
+import 'package:filcnaplo/database/store.dart';
+import 'package:sqflite/sqflite.dart';
+// ignore: depend_on_referenced_packages
+import 'package:sqflite_common_ffi/sqflite_ffi.dart';
+
+class DatabaseProvider {
+ // late Database _database;
+ late DatabaseQuery query;
+ late UserDatabaseQuery userQuery;
+ late DatabaseStore store;
+ late UserDatabaseStore userStore;
+
+ Future init() async {
+ Database db;
+
+ if (Platform.isLinux || Platform.isWindows) {
+ db = await databaseFactoryFfi.openDatabase("app.db");
+ } else {
+ db = await openDatabase("app.db");
+ }
+
+ query = DatabaseQuery(db: db);
+ store = DatabaseStore(db: db);
+ userQuery = UserDatabaseQuery(db: db);
+ userStore = UserDatabaseStore(db: db);
+ }
+}
diff --git a/filcnaplo/lib/api/providers/live_card_provider.dart b/filcnaplo/lib/api/providers/live_card_provider.dart
index ad191a6..56fc76a 100644
--- a/filcnaplo/lib/api/providers/live_card_provider.dart
+++ b/filcnaplo/lib/api/providers/live_card_provider.dart
@@ -1,204 +1,204 @@
-// ignore_for_file: no_leading_underscores_for_local_identifiers
-
-import 'dart:async';
-import 'dart:io';
-
-import 'package:filcnaplo/helpers/subject.dart';
-import 'package:filcnaplo/models/settings.dart';
-import 'package:filcnaplo_kreta_api/models/lesson.dart';
-import 'package:filcnaplo_kreta_api/models/week.dart';
-import 'package:filcnaplo/utils/format.dart';
-import 'package:filcnaplo_kreta_api/providers/timetable_provider.dart';
-import 'package:flutter/foundation.dart';
-import 'package:live_activities/live_activities.dart';
-import 'package:filcnaplo_mobile_ui/pages/home/live_card/live_card.i18n.dart';
-
-enum LiveCardState { empty, duringLesson, duringBreak, morning, afternoon, night }
-
-class LiveCardProvider extends ChangeNotifier {
- Lesson? currentLesson;
- Lesson? nextLesson;
- Lesson? prevLesson;
- List? nextLessons;
-
- LiveCardState currentState = LiveCardState.empty;
- late Timer _timer;
- late final TimetableProvider _timetable;
- late final SettingsProvider _settings;
-
- late Duration _delay;
-
- final _liveActivitiesPlugin = LiveActivities();
- String? _latestActivityId;
- Map _lastActivity = {};
-
- LiveCardProvider({
- required TimetableProvider timetable,
- required SettingsProvider settings,
- }) : _timetable = timetable,
- _settings = settings {
- _liveActivitiesPlugin.init(appGroupId: "group.filcnaplo.livecard");
- _liveActivitiesPlugin.getAllActivitiesIds().then((value) {
- _latestActivityId = value.isNotEmpty ? value.first : null;
- });
- _timer = Timer.periodic(const Duration(seconds: 1), (timer) => update());
- _delay = settings.bellDelayEnabled ? Duration(seconds: settings.bellDelay) : Duration.zero;
- update();
- }
-
- @override
- void dispose() {
- _timer.cancel();
- if (_latestActivityId != null && Platform.isIOS) _liveActivitiesPlugin.endActivity(_latestActivityId!);
- super.dispose();
- }
-
- // Debugging
- static DateTime _now() {
- return DateTime.now();
- }
-
- String getFloorDifference() {
- final prevFloor = prevLesson!.getFloor();
- final nextFloor = nextLesson!.getFloor();
- if (prevFloor == null || nextFloor == null || prevFloor == nextFloor) {
- return "to room";
- }
- if (nextFloor == 0) {
- return "ground floor";
- }
- if (nextFloor > prevFloor) {
- return "up floor";
- } else {
- return "down floor";
- }
- }
-
- Map toMap() {
- switch (currentState) {
- case LiveCardState.duringLesson:
- return {
- "icon": currentLesson != null ? SubjectIcon.resolveName(subject: currentLesson?.subject) : "book",
- "index": currentLesson != null ? '${currentLesson!.lessonIndex}. ' : "",
- "title": currentLesson != null ? ShortSubject.resolve(subject: currentLesson?.subject).capital() : "",
- "subtitle": currentLesson?.room.replaceAll("_", " ") ?? "",
- "description": currentLesson?.description ?? "",
- "startDate": ((currentLesson?.start.millisecondsSinceEpoch ?? 0) - _delay.inMilliseconds).toString(),
- "endDate": ((currentLesson?.end.millisecondsSinceEpoch ?? 0) - _delay.inMilliseconds).toString(),
- "nextSubject": nextLesson != null ? ShortSubject.resolve(subject: nextLesson?.subject).capital() : "",
- "nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "",
- };
- case LiveCardState.duringBreak:
- final iconFloorMap = {
- "to room": "chevron.right.2",
- "up floor": "arrow.up.right",
- "down floor": "arrow.down.left",
- "ground floor": "arrow.down.left",
- };
-
- final diff = getFloorDifference();
-
- return {
- "icon": iconFloorMap[diff] ?? "cup.and.saucer",
- "title": "Szünet",
- "description": "go $diff".i18n.fill([diff != "to room" ? (nextLesson!.getFloor() ?? 0) : nextLesson!.room]),
- "startDate": ((prevLesson?.end.millisecondsSinceEpoch ?? 0) - _delay.inMilliseconds).toString(),
- "endDate": ((nextLesson?.start.millisecondsSinceEpoch ?? 0) - _delay.inMilliseconds).toString(),
- "nextSubject": (nextLesson != null ? ShortSubject.resolve(subject: nextLesson?.subject) : "").capital(),
- "nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "",
- "index": "",
- "subtitle": "",
- };
- default:
- return {};
- }
- }
-
- void update() async {
- if (Platform.isIOS) {
- final cmap = toMap();
- if (!mapEquals(cmap, _lastActivity)) {
- _lastActivity = cmap;
-
- if (_lastActivity.isNotEmpty) {
- if (_latestActivityId == null) {
- _liveActivitiesPlugin.createActivity(_lastActivity).then((value) => _latestActivityId = value);
- } else {
- _liveActivitiesPlugin.updateActivity(_latestActivityId!, _lastActivity);
- }
- } else {
- if (_latestActivityId != null) _liveActivitiesPlugin.endActivity(_latestActivityId!);
- }
- }
- }
-
- List today = _today(_timetable);
-
- if (today.isEmpty) {
- await _timetable.fetch(week: Week.current());
- today = _today(_timetable);
- }
-
- _delay = _settings.bellDelayEnabled ? Duration(seconds: _settings.bellDelay) : Duration.zero;
-
- final now = _now().add(_delay);
-
- // Filter cancelled lessons #20
- // Filter label lessons #128
- today = today.where((lesson) => lesson.status?.name != "Elmaradt" && lesson.subject.id != '' && !lesson.isEmpty).toList();
-
- if (today.isNotEmpty) {
- // sort
- today.sort((a, b) => a.start.compareTo(b.start));
-
- final _lesson = today.firstWhere((l) => l.start.isBefore(now) && l.end.isAfter(now), orElse: () => Lesson.fromJson({}));
-
- if (_lesson.start.year != 0) {
- currentLesson = _lesson;
- } else {
- currentLesson = null;
- }
-
- final _next = today.firstWhere((l) => l.start.isAfter(now), orElse: () => Lesson.fromJson({}));
- nextLessons = today.where((l) => l.start.isAfter(now)).toList();
-
- if (_next.start.year != 0) {
- nextLesson = _next;
- } else {
- nextLesson = null;
- }
-
- final _prev = today.lastWhere((l) => l.end.isBefore(now), orElse: () => Lesson.fromJson({}));
-
- if (_prev.start.year != 0) {
- prevLesson = _prev;
- } else {
- prevLesson = null;
- }
- }
-
- if (currentLesson != null) {
- currentState = LiveCardState.duringLesson;
- } else if (nextLesson != null && prevLesson != null) {
- currentState = LiveCardState.duringBreak;
- } else if (now.hour >= 12 && now.hour < 20) {
- currentState = LiveCardState.afternoon;
- } else if (now.hour >= 20) {
- currentState = LiveCardState.night;
- } else if (now.hour >= 5 && now.hour <= 10) {
- currentState = LiveCardState.morning;
- } else {
- currentState = LiveCardState.empty;
- }
-
- notifyListeners();
- }
-
- bool get show => currentState != LiveCardState.empty;
-
- Duration get delay => _delay;
-
- bool _sameDate(DateTime a, DateTime b) => (a.year == b.year && a.month == b.month && a.day == b.day);
-
- List _today(TimetableProvider p) => (p.getWeek(Week.current()) ?? []).where((l) => _sameDate(l.date, _now())).toList();
-}
+// ignore_for_file: no_leading_underscores_for_local_identifiers
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:filcnaplo/helpers/subject.dart';
+import 'package:filcnaplo/models/settings.dart';
+import 'package:filcnaplo_kreta_api/models/lesson.dart';
+import 'package:filcnaplo_kreta_api/models/week.dart';
+import 'package:filcnaplo/utils/format.dart';
+import 'package:filcnaplo_kreta_api/providers/timetable_provider.dart';
+import 'package:flutter/foundation.dart';
+import 'package:live_activities/live_activities.dart';
+import 'package:filcnaplo_mobile_ui/pages/home/live_card/live_card.i18n.dart';
+
+enum LiveCardState { empty, duringLesson, duringBreak, morning, afternoon, night }
+
+class LiveCardProvider extends ChangeNotifier {
+ Lesson? currentLesson;
+ Lesson? nextLesson;
+ Lesson? prevLesson;
+ List? nextLessons;
+
+ LiveCardState currentState = LiveCardState.empty;
+ late Timer _timer;
+ late final TimetableProvider _timetable;
+ late final SettingsProvider _settings;
+
+ late Duration _delay;
+
+ final _liveActivitiesPlugin = LiveActivities();
+ String? _latestActivityId;
+ Map _lastActivity = {};
+
+ LiveCardProvider({
+ required TimetableProvider timetable,
+ required SettingsProvider settings,
+ }) : _timetable = timetable,
+ _settings = settings {
+ _liveActivitiesPlugin.init(appGroupId: "group.filcnaplo.livecard");
+ _liveActivitiesPlugin.getAllActivitiesIds().then((value) {
+ _latestActivityId = value.isNotEmpty ? value.first : null;
+ });
+ _timer = Timer.periodic(const Duration(seconds: 1), (timer) => update());
+ _delay = settings.bellDelayEnabled ? Duration(seconds: settings.bellDelay) : Duration.zero;
+ update();
+ }
+
+ @override
+ void dispose() {
+ _timer.cancel();
+ if (_latestActivityId != null && Platform.isIOS) _liveActivitiesPlugin.endActivity(_latestActivityId!);
+ super.dispose();
+ }
+
+ // Debugging
+ static DateTime _now() {
+ return DateTime.now();
+ }
+
+ String getFloorDifference() {
+ final prevFloor = prevLesson!.getFloor();
+ final nextFloor = nextLesson!.getFloor();
+ if (prevFloor == null || nextFloor == null || prevFloor == nextFloor) {
+ return "to room";
+ }
+ if (nextFloor == 0) {
+ return "ground floor";
+ }
+ if (nextFloor > prevFloor) {
+ return "up floor";
+ } else {
+ return "down floor";
+ }
+ }
+
+ Map toMap() {
+ switch (currentState) {
+ case LiveCardState.duringLesson:
+ return {
+ "icon": currentLesson != null ? SubjectIcon.resolveName(subject: currentLesson?.subject) : "book",
+ "index": currentLesson != null ? '${currentLesson!.lessonIndex}. ' : "",
+ "title": currentLesson != null ? ShortSubject.resolve(subject: currentLesson?.subject).capital() : "",
+ "subtitle": currentLesson?.room.replaceAll("_", " ") ?? "",
+ "description": currentLesson?.description ?? "",
+ "startDate": ((currentLesson?.start.millisecondsSinceEpoch ?? 0) - _delay.inMilliseconds).toString(),
+ "endDate": ((currentLesson?.end.millisecondsSinceEpoch ?? 0) - _delay.inMilliseconds).toString(),
+ "nextSubject": nextLesson != null ? ShortSubject.resolve(subject: nextLesson?.subject).capital() : "",
+ "nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "",
+ };
+ case LiveCardState.duringBreak:
+ final iconFloorMap = {
+ "to room": "chevron.right.2",
+ "up floor": "arrow.up.right",
+ "down floor": "arrow.down.left",
+ "ground floor": "arrow.down.left",
+ };
+
+ final diff = getFloorDifference();
+
+ return {
+ "icon": iconFloorMap[diff] ?? "cup.and.saucer",
+ "title": "Szünet",
+ "description": "go $diff".i18n.fill([diff != "to room" ? (nextLesson!.getFloor() ?? 0) : nextLesson!.room]),
+ "startDate": ((prevLesson?.end.millisecondsSinceEpoch ?? 0) - _delay.inMilliseconds).toString(),
+ "endDate": ((nextLesson?.start.millisecondsSinceEpoch ?? 0) - _delay.inMilliseconds).toString(),
+ "nextSubject": (nextLesson != null ? ShortSubject.resolve(subject: nextLesson?.subject) : "").capital(),
+ "nextRoom": nextLesson?.room.replaceAll("_", " ") ?? "",
+ "index": "",
+ "subtitle": "",
+ };
+ default:
+ return {};
+ }
+ }
+
+ void update() async {
+ if (Platform.isIOS) {
+ final cmap = toMap();
+ if (!mapEquals(cmap, _lastActivity)) {
+ _lastActivity = cmap;
+
+ if (_lastActivity.isNotEmpty) {
+ if (_latestActivityId == null) {
+ _liveActivitiesPlugin.createActivity(_lastActivity).then((value) => _latestActivityId = value);
+ } else {
+ _liveActivitiesPlugin.updateActivity(_latestActivityId!, _lastActivity);
+ }
+ } else {
+ if (_latestActivityId != null) _liveActivitiesPlugin.endActivity(_latestActivityId!);
+ }
+ }
+ }
+
+ List today = _today(_timetable);
+
+ if (today.isEmpty) {
+ await _timetable.fetch(week: Week.current());
+ today = _today(_timetable);
+ }
+
+ _delay = _settings.bellDelayEnabled ? Duration(seconds: _settings.bellDelay) : Duration.zero;
+
+ final now = _now().add(_delay);
+
+ // Filter cancelled lessons #20
+ // Filter label lessons #128
+ today = today.where((lesson) => lesson.status?.name != "Elmaradt" && lesson.subject.id != '' && !lesson.isEmpty).toList();
+
+ if (today.isNotEmpty) {
+ // sort
+ today.sort((a, b) => a.start.compareTo(b.start));
+
+ final _lesson = today.firstWhere((l) => l.start.isBefore(now) && l.end.isAfter(now), orElse: () => Lesson.fromJson({}));
+
+ if (_lesson.start.year != 0) {
+ currentLesson = _lesson;
+ } else {
+ currentLesson = null;
+ }
+
+ final _next = today.firstWhere((l) => l.start.isAfter(now), orElse: () => Lesson.fromJson({}));
+ nextLessons = today.where((l) => l.start.isAfter(now)).toList();
+
+ if (_next.start.year != 0) {
+ nextLesson = _next;
+ } else {
+ nextLesson = null;
+ }
+
+ final _prev = today.lastWhere((l) => l.end.isBefore(now), orElse: () => Lesson.fromJson({}));
+
+ if (_prev.start.year != 0) {
+ prevLesson = _prev;
+ } else {
+ prevLesson = null;
+ }
+ }
+
+ if (currentLesson != null) {
+ currentState = LiveCardState.duringLesson;
+ } else if (nextLesson != null && prevLesson != null) {
+ currentState = LiveCardState.duringBreak;
+ } else if (now.hour >= 12 && now.hour < 20) {
+ currentState = LiveCardState.afternoon;
+ } else if (now.hour >= 20) {
+ currentState = LiveCardState.night;
+ } else if (now.hour >= 5 && now.hour <= 10) {
+ currentState = LiveCardState.morning;
+ } else {
+ currentState = LiveCardState.empty;
+ }
+
+ notifyListeners();
+ }
+
+ bool get show => currentState != LiveCardState.empty;
+
+ Duration get delay => _delay;
+
+ bool _sameDate(DateTime a, DateTime b) => (a.year == b.year && a.month == b.month && a.day == b.day);
+
+ List _today(TimetableProvider p) => (p.getWeek(Week.current()) ?? []).where((l) => _sameDate(l.date, _now())).toList();
+}
diff --git a/filcnaplo/lib/api/providers/news_provider.dart b/filcnaplo/lib/api/providers/news_provider.dart
index e1eba3b..6f0f05d 100644
--- a/filcnaplo/lib/api/providers/news_provider.dart
+++ b/filcnaplo/lib/api/providers/news_provider.dart
@@ -1,85 +1,85 @@
-// ignore_for_file: use_build_context_synchronously
-
-import 'dart:math';
-
-import 'package:filcnaplo/api/client.dart';
-import 'package:filcnaplo/models/news.dart';
-import 'package:filcnaplo/models/settings.dart';
-import 'package:flutter/material.dart';
-import 'package:provider/provider.dart';
-
-class NewsProvider extends ChangeNotifier {
- // Private
- late List _news;
- late int _state;
- late int _fresh;
- bool show = false;
- late BuildContext _context;
-
- // Public
- List get news => _news;
- int get state => _fresh - 1;
-
- NewsProvider({
- List initialNews = const [],
- required BuildContext context,
- }) {
- _news = List.castFrom(initialNews);
- _context = context;
- }
-
- Future restore() async {
- // Load news state from the database
- var state_ = Provider.of(_context, listen: false).newsState;
-
- if (state_ == -1) {
- var news_ = await FilcAPI.getNews();
- if (news_ != null) {
- state_ = news_.length;
- _news = news_;
- }
- }
-
- _state = state_;
- Provider.of(_context, listen: false).update(newsState: _state);
- }
-
- Future fetch() async {
- var news_ = await FilcAPI.getNews();
- if (news_ == null) return;
-
- _news = news_;
- _fresh = news_.length - _state;
-
- if (_fresh < 0) {
- _state = news_.length;
- Provider.of(_context, listen: false).update(newsState: _state);
- }
-
- _fresh = max(_fresh, 0);
-
- if (_fresh > 0) {
- show = true;
- notifyListeners();
- }
- }
-
- void lock() => show = false;
-
- void release() {
- if (_fresh == 0) return;
-
- _fresh--;
- _state++;
-
- Provider.of(_context, listen: false).update(newsState: _state);
-
- if (_fresh > 0) {
- show = true;
- } else {
- show = false;
- }
-
- notifyListeners();
- }
-}
+// ignore_for_file: use_build_context_synchronously
+
+import 'dart:math';
+
+import 'package:filcnaplo/api/client.dart';
+import 'package:filcnaplo/models/news.dart';
+import 'package:filcnaplo/models/settings.dart';
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+
+class NewsProvider extends ChangeNotifier {
+ // Private
+ late List _news;
+ late int _state;
+ late int _fresh;
+ bool show = false;
+ late BuildContext _context;
+
+ // Public
+ List get news => _news;
+ int get state => _fresh - 1;
+
+ NewsProvider({
+ List initialNews = const [],
+ required BuildContext context,
+ }) {
+ _news = List.castFrom(initialNews);
+ _context = context;
+ }
+
+ Future restore() async {
+ // Load news state from the database
+ var state_ = Provider.of(_context, listen: false).newsState;
+
+ if (state_ == -1) {
+ var news_ = await FilcAPI.getNews();
+ if (news_ != null) {
+ state_ = news_.length;
+ _news = news_;
+ }
+ }
+
+ _state = state_;
+ Provider.of(_context, listen: false).update(newsState: _state);
+ }
+
+ Future fetch() async {
+ var news_ = await FilcAPI.getNews();
+ if (news_ == null) return;
+
+ _news = news_;
+ _fresh = news_.length - _state;
+
+ if (_fresh < 0) {
+ _state = news_.length;
+ Provider.of(_context, listen: false).update(newsState: _state);
+ }
+
+ _fresh = max(_fresh, 0);
+
+ if (_fresh > 0) {
+ show = true;
+ notifyListeners();
+ }
+ }
+
+ void lock() => show = false;
+
+ void release() {
+ if (_fresh == 0) return;
+
+ _fresh--;
+ _state++;
+
+ Provider.of(_context, listen: false).update(newsState: _state);
+
+ if (_fresh > 0) {
+ show = true;
+ } else {
+ show = false;
+ }
+
+ notifyListeners();
+ }
+}
diff --git a/filcnaplo/lib/api/providers/status_provider.dart b/filcnaplo/lib/api/providers/status_provider.dart
index 274a942..ca4cd5a 100644
--- a/filcnaplo/lib/api/providers/status_provider.dart
+++ b/filcnaplo/lib/api/providers/status_provider.dart
@@ -1,79 +1,79 @@
-import 'package:connectivity_plus/connectivity_plus.dart';
-import 'package:flutter/widgets.dart';
-import 'package:http/http.dart' as http;
-
-enum Status { network, maintenance, syncing }
-
-class StatusProvider extends ChangeNotifier {
- final List _stack = [];
- double _progress = 0.0;
- ConnectivityResult _networkType = ConnectivityResult.none;
- ConnectivityResult get networkType => _networkType;
-
- StatusProvider() {
- _handleNetworkChanges();
- Connectivity().checkConnectivity().then((value) => _networkType = value);
- }
-
- Status? getStatus() => _stack.isNotEmpty ? _stack[0] : null;
- // Status progress from 0.0 to 1.0
- double get progress => _progress;
-
- void _handleNetworkChanges() {
- Connectivity().onConnectivityChanged.listen((event) {
- _networkType = event;
- if (event == ConnectivityResult.none) {
- if (!_stack.contains(Status.network)) {
- _stack.insert(0, Status.network);
- notifyListeners();
- }
- } else {
- if (_stack.contains(Status.network)) {
- _stack.remove(Status.network);
- notifyListeners();
- }
- }
- });
- }
-
- void triggerRequest(http.Response res) {
- if (res.headers.containsKey("x-maintenance-mode") || res.statusCode == 503) {
- if (!_stack.contains(Status.maintenance)) {
- _stack.insert(0, Status.maintenance);
- notifyListeners();
- }
- } else {
- if (_stack.contains(Status.maintenance)) {
- _stack.remove(Status.maintenance);
- notifyListeners();
- }
- }
- }
-
- void triggerSync({required int current, required int max}) {
- double prev = _progress;
-
- if (!_stack.contains(Status.syncing)) {
- _stack.add(Status.syncing);
- _progress = 0.0;
- notifyListeners();
- }
-
- if (max == 0) {
- _progress = 0.0;
- } else {
- _progress = current / max;
- }
-
- if (_progress == 1.0) {
- notifyListeners();
- // Wait for animation
- Future.delayed(const Duration(milliseconds: 250), () {
- _stack.remove(Status.syncing);
- notifyListeners();
- });
- } else if (progress != prev) {
- notifyListeners();
- }
- }
-}
+import 'package:connectivity_plus/connectivity_plus.dart';
+import 'package:flutter/widgets.dart';
+import 'package:http/http.dart' as http;
+
+enum Status { network, maintenance, syncing }
+
+class StatusProvider extends ChangeNotifier {
+ final List _stack = [];
+ double _progress = 0.0;
+ ConnectivityResult _networkType = ConnectivityResult.none;
+ ConnectivityResult get networkType => _networkType;
+
+ StatusProvider() {
+ _handleNetworkChanges();
+ Connectivity().checkConnectivity().then((value) => _networkType = value);
+ }
+
+ Status? getStatus() => _stack.isNotEmpty ? _stack[0] : null;
+ // Status progress from 0.0 to 1.0
+ double get progress => _progress;
+
+ void _handleNetworkChanges() {
+ Connectivity().onConnectivityChanged.listen((event) {
+ _networkType = event;
+ if (event == ConnectivityResult.none) {
+ if (!_stack.contains(Status.network)) {
+ _stack.insert(0, Status.network);
+ notifyListeners();
+ }
+ } else {
+ if (_stack.contains(Status.network)) {
+ _stack.remove(Status.network);
+ notifyListeners();
+ }
+ }
+ });
+ }
+
+ void triggerRequest(http.Response res) {
+ if (res.headers.containsKey("x-maintenance-mode") || res.statusCode == 503) {
+ if (!_stack.contains(Status.maintenance)) {
+ _stack.insert(0, Status.maintenance);
+ notifyListeners();
+ }
+ } else {
+ if (_stack.contains(Status.maintenance)) {
+ _stack.remove(Status.maintenance);
+ notifyListeners();
+ }
+ }
+ }
+
+ void triggerSync({required int current, required int max}) {
+ double prev = _progress;
+
+ if (!_stack.contains(Status.syncing)) {
+ _stack.add(Status.syncing);
+ _progress = 0.0;
+ notifyListeners();
+ }
+
+ if (max == 0) {
+ _progress = 0.0;
+ } else {
+ _progress = current / max;
+ }
+
+ if (_progress == 1.0) {
+ notifyListeners();
+ // Wait for animation
+ Future.delayed(const Duration(milliseconds: 250), () {
+ _stack.remove(Status.syncing);
+ notifyListeners();
+ });
+ } else if (progress != prev) {
+ notifyListeners();
+ }
+ }
+}
diff --git a/filcnaplo/lib/api/providers/sync.dart b/filcnaplo/lib/api/providers/sync.dart
index 0636e0e..42f6277 100644
--- a/filcnaplo/lib/api/providers/sync.dart
+++ b/filcnaplo/lib/api/providers/sync.dart
@@ -1,88 +1,88 @@
-// ignore_for_file: use_build_context_synchronously
-
-import 'dart:io';
-
-import 'package:filcnaplo/api/providers/database_provider.dart';
-import 'package:filcnaplo/api/providers/status_provider.dart';
-import 'package:filcnaplo/api/providers/user_provider.dart';
-import 'package:filcnaplo_kreta_api/client/api.dart';
-import 'package:filcnaplo_kreta_api/client/client.dart';
-import 'package:filcnaplo_kreta_api/models/student.dart';
-import 'package:filcnaplo_kreta_api/models/week.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/exam_provider.dart';
-import 'package:filcnaplo_kreta_api/providers/grade_provider.dart';
-import 'package:filcnaplo_kreta_api/providers/homework_provider.dart';
-import 'package:filcnaplo_kreta_api/providers/message_provider.dart';
-import 'package:filcnaplo_kreta_api/providers/note_provider.dart';
-import 'package:filcnaplo_kreta_api/providers/timetable_provider.dart';
-import 'package:flutter/services.dart';
-import 'package:flutter/widgets.dart';
-import 'package:provider/provider.dart';
-import 'package:home_widget/home_widget.dart';
-
-// Mutex
-bool lock = false;
-
-Future syncAll(BuildContext context) {
- if (lock) return Future.value();
- // Lock
- lock = true;
-
- // ignore: avoid_print
- print("INFO Syncing all");
-
- UserProvider user = Provider.of(context, listen: false);
- StatusProvider statusProvider = Provider.of(context, listen: false);
-
- List> tasks = [];
- int taski = 0;
-
- Future syncStatus(Future future) async {
- await future.onError((error, stackTrace) => null);
- taski++;
- statusProvider.triggerSync(current: taski, max: tasks.length);
- }
-
- tasks = [
- syncStatus(Provider.of(context, listen: false).fetch()),
- syncStatus(Provider.of(context, listen: false).fetch(week: Week.current())),
- syncStatus(Provider.of(context, listen: false).fetch()),
- syncStatus(Provider.of(context, listen: false).fetch(from: DateTime.now().subtract(const Duration(days: 30)))),
- syncStatus(Provider.of(context, listen: false).fetchAll()),
- syncStatus(Provider.of(context, listen: false).fetch()),
- syncStatus(Provider.of(context, listen: false).fetch()),
- syncStatus(Provider.of(context, listen: false).fetch()),
-
- // Sync student
- syncStatus(() async {
- if (user.user == null) return;
- Map? studentJson = await Provider.of(context, listen: false).getAPI(KretaAPI.student(user.instituteCode!));
- if (studentJson == null) return;
- Student student = Student.fromJson(studentJson);
-
- user.user?.name = student.name;
-
- // Store user
- await Provider.of(context, listen: false).store.storeUser(user.user!);
- }()),
- ];
-
- Future updateWidget() async {
- try {
- return HomeWidget.updateWidget(name: 'widget_timetable.WidgetTimetable');
- } on PlatformException catch (exception) {
- debugPrint('Error Updating Widget. $exception');
- }
- return false;
- }
-
- return Future.wait(tasks).then((value) {
- // Unlock
- lock = false;
-
- // Update Widget
- if (Platform.isAndroid) updateWidget();
- });
-}
+// ignore_for_file: use_build_context_synchronously
+
+import 'dart:io';
+
+import 'package:filcnaplo/api/providers/database_provider.dart';
+import 'package:filcnaplo/api/providers/status_provider.dart';
+import 'package:filcnaplo/api/providers/user_provider.dart';
+import 'package:filcnaplo_kreta_api/client/api.dart';
+import 'package:filcnaplo_kreta_api/client/client.dart';
+import 'package:filcnaplo_kreta_api/models/student.dart';
+import 'package:filcnaplo_kreta_api/models/week.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/exam_provider.dart';
+import 'package:filcnaplo_kreta_api/providers/grade_provider.dart';
+import 'package:filcnaplo_kreta_api/providers/homework_provider.dart';
+import 'package:filcnaplo_kreta_api/providers/message_provider.dart';
+import 'package:filcnaplo_kreta_api/providers/note_provider.dart';
+import 'package:filcnaplo_kreta_api/providers/timetable_provider.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter/widgets.dart';
+import 'package:provider/provider.dart';
+import 'package:home_widget/home_widget.dart';
+
+// Mutex
+bool lock = false;
+
+Future syncAll(BuildContext context) {
+ if (lock) return Future.value();
+ // Lock
+ lock = true;
+
+ // ignore: avoid_print
+ print("INFO Syncing all");
+
+ UserProvider user = Provider.of(context, listen: false);
+ StatusProvider statusProvider = Provider.of(context, listen: false);
+
+ List> tasks = [];
+ int taski = 0;
+
+ Future syncStatus(Future future) async {
+ await future.onError((error, stackTrace) => null);
+ taski++;
+ statusProvider.triggerSync(current: taski, max: tasks.length);
+ }
+
+ tasks = [
+ syncStatus(Provider.of(context, listen: false).fetch()),
+ syncStatus(Provider.of(context, listen: false).fetch(week: Week.current())),
+ syncStatus(Provider.of(context, listen: false).fetch()),
+ syncStatus(Provider.of(context, listen: false).fetch(from: DateTime.now().subtract(const Duration(days: 30)))),
+ syncStatus(Provider.of(context, listen: false).fetchAll()),
+ syncStatus(Provider.of(context, listen: false).fetch()),
+ syncStatus(Provider.of(context, listen: false).fetch()),
+ syncStatus(Provider.of(context, listen: false).fetch()),
+
+ // Sync student
+ syncStatus(() async {
+ if (user.user == null) return;
+ Map? studentJson = await Provider.of(context, listen: false).getAPI(KretaAPI.student(user.instituteCode!));
+ if (studentJson == null) return;
+ Student student = Student.fromJson(studentJson);
+
+ user.user?.name = student.name;
+
+ // Store user
+ await Provider.of(context, listen: false).store.storeUser(user.user!);
+ }()),
+ ];
+
+ Future updateWidget() async {
+ try {
+ return HomeWidget.updateWidget(name: 'widget_timetable.WidgetTimetable');
+ } on PlatformException catch (exception) {
+ debugPrint('Error Updating Widget. $exception');
+ }
+ return false;
+ }
+
+ return Future.wait(tasks).then((value) {
+ // Unlock
+ lock = false;
+
+ // Update Widget
+ if (Platform.isAndroid) updateWidget();
+ });
+}
diff --git a/filcnaplo/lib/api/providers/update_provider.dart b/filcnaplo/lib/api/providers/update_provider.dart
index f23f23f..3013d06 100644
--- a/filcnaplo/lib/api/providers/update_provider.dart
+++ b/filcnaplo/lib/api/providers/update_provider.dart
@@ -1,39 +1,39 @@
-import 'dart:io';
-
-import 'package:filcnaplo/api/client.dart';
-import 'package:filcnaplo/models/release.dart';
-import 'package:flutter/material.dart';
-
-class UpdateProvider extends ChangeNotifier {
- // Private
- late List _releases;
- bool _available = false;
- bool get available => _available && _releases.isNotEmpty;
-
- // Public
- List get releases => _releases;
-
- UpdateProvider({
- List initialReleases = const [],
- required BuildContext context,
- }) {
- _releases = List.castFrom(initialReleases);
- }
-
- static const currentVersion = String.fromEnvironment("APPVER", defaultValue: "1.0");
-
- Future fetch() async {
- if (!Platform.isAndroid) return;
-
- _releases = await FilcAPI.getReleases() ?? [];
- _releases.sort((a, b) => -a.version.compareTo(b.version));
-
- // Check for new releases
- if (_releases.isNotEmpty) {
- _available = _releases.first.version.compareTo(Version.fromString(currentVersion)) == 1;
- // ignore: avoid_print
- if (_available) print("INFO: New update: ${releases.first.version}");
- notifyListeners();
- }
- }
-}
+import 'dart:io';
+
+import 'package:filcnaplo/api/client.dart';
+import 'package:filcnaplo/models/release.dart';
+import 'package:flutter/material.dart';
+
+class UpdateProvider extends ChangeNotifier {
+ // Private
+ late List _releases;
+ bool _available = false;
+ bool get available => _available && _releases.isNotEmpty;
+
+ // Public
+ List get releases => _releases;
+
+ UpdateProvider({
+ List initialReleases = const [],
+ required BuildContext context,
+ }) {
+ _releases = List.castFrom(initialReleases);
+ }
+
+ static const currentVersion = String.fromEnvironment("APPVER", defaultValue: "1.0");
+
+ Future fetch() async {
+ if (!Platform.isAndroid) return;
+
+ _releases = await FilcAPI.getReleases() ?? [];
+ _releases.sort((a, b) => -a.version.compareTo(b.version));
+
+ // Check for new releases
+ if (_releases.isNotEmpty) {
+ _available = _releases.first.version.compareTo(Version.fromString(currentVersion)) == 1;
+ // ignore: avoid_print
+ if (_available) print("INFO: New update: ${releases.first.version}");
+ notifyListeners();
+ }
+ }
+}
diff --git a/filcnaplo/lib/api/providers/user_provider.dart b/filcnaplo/lib/api/providers/user_provider.dart
index ccbbe19..776586f 100644
--- a/filcnaplo/lib/api/providers/user_provider.dart
+++ b/filcnaplo/lib/api/providers/user_provider.dart
@@ -1,78 +1,78 @@
-import 'dart:io';
-
-import 'package:filcnaplo/models/settings.dart';
-import 'package:filcnaplo/models/user.dart';
-import 'package:filcnaplo_kreta_api/models/student.dart';
-import 'package:flutter/foundation.dart';
-import 'package:home_widget/home_widget.dart';
-import 'package:flutter/services.dart';
-
-class UserProvider with ChangeNotifier {
- final Map _users = {};
- String? _selectedUserId;
- User? get user => _users[_selectedUserId];
-
- // _user properties
- String? get instituteCode => user?.instituteCode;
- String? get id => user?.id;
- String? get name => user?.name;
- String? get username => user?.username;
- String? get password => user?.password;
- Role? get role => user?.role;
- Student? get student => user?.student;
- String? get nickname => user?.nickname;
- String get picture => user?.picture ?? "";
- String? get displayName => user?.displayName;
-
- final SettingsProvider _settings;
-
- UserProvider({required SettingsProvider settings}) : _settings = settings;
-
- void setUser(String userId) async {
- _selectedUserId = userId;
- await _settings.update(lastAccountId: userId);
- if (Platform.isAndroid) updateWidget();
- notifyListeners();
- }
-
- Future updateWidget() async {
- try {
- return HomeWidget.updateWidget(name: 'widget_timetable.WidgetTimetable');
- } on PlatformException catch (exception) {
- if (kDebugMode) {
- print('Error Updating Widget After setUser. $exception');
- }
- }
- return false;
- }
-
- void addUser(User user) {
- _users[user.id] = user;
- if (kDebugMode) {
- print("DEBUG: Added User: ${user.id}");
- }
- }
-
- void removeUser(String userId) async {
- _users.removeWhere((key, value) => key == userId);
- if (_users.isNotEmpty) {
- setUser(_users.keys.first);
- } else {
- await _settings.update(lastAccountId: "");
- }
- if (Platform.isAndroid) updateWidget();
- notifyListeners();
- }
-
- User getUser(String userId) {
- return _users[userId]!;
- }
-
- List getUsers() {
- return _users.values.toList();
- }
-
- void refresh() {
- notifyListeners();
- }
-}
+import 'dart:io';
+
+import 'package:filcnaplo/models/settings.dart';
+import 'package:filcnaplo/models/user.dart';
+import 'package:filcnaplo_kreta_api/models/student.dart';
+import 'package:flutter/foundation.dart';
+import 'package:home_widget/home_widget.dart';
+import 'package:flutter/services.dart';
+
+class UserProvider with ChangeNotifier {
+ final Map _users = {};
+ String? _selectedUserId;
+ User? get user => _users[_selectedUserId];
+
+ // _user properties
+ String? get instituteCode => user?.instituteCode;
+ String? get id => user?.id;
+ String? get name => user?.name;
+ String? get username => user?.username;
+ String? get password => user?.password;
+ Role? get role => user?.role;
+ Student? get student => user?.student;
+ String? get nickname => user?.nickname;
+ String get picture => user?.picture ?? "";
+ String? get displayName => user?.displayName;
+
+ final SettingsProvider _settings;
+
+ UserProvider({required SettingsProvider settings}) : _settings = settings;
+
+ void setUser(String userId) async {
+ _selectedUserId = userId;
+ await _settings.update(lastAccountId: userId);
+ if (Platform.isAndroid) updateWidget();
+ notifyListeners();
+ }
+
+ Future updateWidget() async {
+ try {
+ return HomeWidget.updateWidget(name: 'widget_timetable.WidgetTimetable');
+ } on PlatformException catch (exception) {
+ if (kDebugMode) {
+ print('Error Updating Widget After setUser. $exception');
+ }
+ }
+ return false;
+ }
+
+ void addUser(User user) {
+ _users[user.id] = user;
+ if (kDebugMode) {
+ print("DEBUG: Added User: ${user.id}");
+ }
+ }
+
+ void removeUser(String userId) async {
+ _users.removeWhere((key, value) => key == userId);
+ if (_users.isNotEmpty) {
+ setUser(_users.keys.first);
+ } else {
+ await _settings.update(lastAccountId: "");
+ }
+ if (Platform.isAndroid) updateWidget();
+ notifyListeners();
+ }
+
+ User getUser(String userId) {
+ return _users[userId]!;
+ }
+
+ List getUsers() {
+ return _users.values.toList();
+ }
+
+ void refresh() {
+ notifyListeners();
+ }
+}
diff --git a/filcnaplo/lib/app.dart b/filcnaplo/lib/app.dart
index 3b4f15f..b52c9b5 100644
--- a/filcnaplo/lib/app.dart
+++ b/filcnaplo/lib/app.dart
@@ -1,193 +1,193 @@
-import 'dart:io';
-import 'dart:math';
-
-import 'package:dynamic_color/dynamic_color.dart';
-import 'package:filcnaplo/api/client.dart';
-import 'package:filcnaplo/api/providers/live_card_provider.dart';
-import 'package:filcnaplo/api/providers/news_provider.dart';
-import 'package:filcnaplo/api/providers/database_provider.dart';
-import 'package:filcnaplo/api/providers/status_provider.dart';
-import 'package:filcnaplo/models/config.dart';
-import 'package:filcnaplo/theme/observer.dart';
-import 'package:filcnaplo/theme/theme.dart';
-import 'package:filcnaplo_kreta_api/client/client.dart';
-import 'package:flutter/cupertino.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter_localizations/flutter_localizations.dart';
-import 'package:i18n_extension/i18n_widget.dart';
-import 'package:material_color_utilities/palettes/core_palette.dart';
-import 'package:provider/provider.dart';
-
-// Mobile UI
-import 'package:filcnaplo_mobile_ui/common/system_chrome.dart' as mobile;
-import 'package:filcnaplo_mobile_ui/screens/login/login_route.dart' as mobile;
-import 'package:filcnaplo_mobile_ui/screens/login/login_screen.dart' as mobile;
-import 'package:filcnaplo_mobile_ui/screens/navigation/navigation_screen.dart' as mobile;
-import 'package:filcnaplo_mobile_ui/screens/settings/settings_route.dart' as mobile;
-import 'package:filcnaplo_mobile_ui/screens/settings/settings_screen.dart' as mobile;
-
-// Desktop UI
-import 'package:filcnaplo_desktop_ui/screens/navigation/navigation_screen.dart' as desktop;
-import 'package:filcnaplo_desktop_ui/screens/login/login_screen.dart' as desktop;
-import 'package:filcnaplo_desktop_ui/screens/login/login_route.dart' as desktop;
-
-// Providers
-import 'package:filcnaplo/models/settings.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/exam_provider.dart';
-import 'package:filcnaplo_kreta_api/providers/grade_provider.dart';
-import 'package:filcnaplo_kreta_api/providers/homework_provider.dart';
-import 'package:filcnaplo_kreta_api/providers/message_provider.dart';
-import 'package:filcnaplo_kreta_api/providers/note_provider.dart';
-import 'package:filcnaplo_kreta_api/providers/timetable_provider.dart';
-import 'package:filcnaplo/api/providers/user_provider.dart';
-import 'package:filcnaplo/api/providers/update_provider.dart';
-import 'package:filcnaplo_mobile_ui/pages/grades/calculator/grade_calculator_provider.dart';
-import 'package:flutter_displaymode/flutter_displaymode.dart';
-import 'package:filcnaplo_premium/providers/premium_provider.dart';
-
-class App extends StatelessWidget {
- final SettingsProvider settings;
- final UserProvider user;
- final DatabaseProvider database;
-
- const App({Key? key, required this.database, required this.settings, required this.user}) : super(key: key);
-
- @override
- Widget build(BuildContext context) {
- mobile.setSystemChrome(context);
-
- // Set high refresh mode #28
- if (Platform.isAndroid) FlutterDisplayMode.setHighRefreshRate();
-
- CorePalette? corePalette;
-
- final status = StatusProvider();
- final kreta = KretaClient(user: user, settings: settings, status: status);
- final timetable = TimetableProvider(user: user, database: database, kreta: kreta);
- final premium = PremiumProvider(settings: settings);
-
- WidgetsBinding.instance.addPostFrameCallback((_) {
- FilcAPI.getConfig(settings).then((Config? config) {
- if (config != null) settings.update(config: config);
- });
- premium.activate();
- });
-
- return MultiProvider(
- providers: [
- ChangeNotifierProvider(create: (_) => premium),
- ChangeNotifierProvider(create: (_) => settings),
- ChangeNotifierProvider(create: (_) => user),
- ChangeNotifierProvider(create: (_) => status),
- Provider(create: (_) => kreta),
- Provider(create: (context) => database),
- ChangeNotifierProvider(create: (context) => ThemeModeObserver(initialTheme: settings.theme)),
- ChangeNotifierProvider(create: (context) => NewsProvider(context: context)),
- ChangeNotifierProvider(create: (context) => UpdateProvider(context: context)),
-
- // User data providers
- ChangeNotifierProvider(create: (_) => GradeProvider(settings: settings, user: user, database: database, kreta: kreta)),
- ChangeNotifierProvider(create: (_) => timetable),
- ChangeNotifierProvider(create: (context) => ExamProvider(context: context)),
- ChangeNotifierProvider(create: (context) => HomeworkProvider(context: context)),
- ChangeNotifierProvider(create: (context) => MessageProvider(context: context)),
- ChangeNotifierProvider(create: (context) => NoteProvider(context: context)),
- ChangeNotifierProvider(create: (context) => EventProvider(context: context)),
- ChangeNotifierProvider(create: (context) => AbsenceProvider(context: context)),
-
- ChangeNotifierProvider(
- create: (_) => GradeCalculatorProvider(settings: settings, user: user, database: database, kreta: kreta)),
- ChangeNotifierProvider(create: (context) => LiveCardProvider(timetable: timetable, settings: settings))
- ],
- child: Consumer(
- builder: (context, themeMode, child) {
- return FutureBuilder(
- future: DynamicColorPlugin.getCorePalette(),
- builder: (context, snapshot) {
- corePalette = snapshot.data;
- return MaterialApp(
- builder: (context, child) {
- // Limit font size scaling to 1.0
- double textScaleFactor = min(MediaQuery.of(context).textScaleFactor, 1.0);
-
- return I18n(
- initialLocale: Locale(settings.language, settings.language.toUpperCase()),
- child: MediaQuery(
- data: MediaQuery.of(context).copyWith(textScaleFactor: textScaleFactor),
- child: child ?? Container(),
- ),
- );
- },
- title: "Filc Napló",
- debugShowCheckedModeBanner: false,
- theme: AppTheme.lightTheme(context, palette: corePalette),
- darkTheme: AppTheme.darkTheme(context, palette: corePalette),
- themeMode: themeMode.themeMode,
- localizationsDelegates: const [
- GlobalMaterialLocalizations.delegate,
- GlobalWidgetsLocalizations.delegate,
- GlobalCupertinoLocalizations.delegate,
- ],
- supportedLocales: const [
- Locale('en', 'EN'),
- Locale('hu', 'HU'),
- Locale('de', 'DE'),
- ],
- localeListResolutionCallback: (locales, supported) {
- Locale locale = const Locale('hu', 'HU');
-
- for (var loc in locales ?? []) {
- if (supported.contains(loc)) {
- locale = loc;
- break;
- }
- }
-
- return locale;
- },
- onGenerateRoute: (settings) => rootNavigator(settings),
- initialRoute: user.getUsers().isNotEmpty ? "navigation" : "login",
- );
- },
- );
- },
- ),
- );
- }
-
- Route? rootNavigator(RouteSettings route) {
- // if platform == android || platform == ios
- if (Platform.isAndroid || Platform.isIOS) {
- switch (route.name) {
- case "login_back":
- return CupertinoPageRoute(builder: (context) => const mobile.LoginScreen(back: true));
- case "login":
- return _rootRoute(const mobile.LoginScreen());
- case "navigation":
- return _rootRoute(const mobile.NavigationScreen());
- case "login_to_navigation":
- return mobile.loginRoute(const mobile.NavigationScreen());
- case "settings":
- return mobile.settingsRoute(const mobile.SettingsScreen());
- }
- } else if (Platform.isWindows || Platform.isMacOS || Platform.isLinux) {
- switch (route.name) {
- case "login_back":
- return CupertinoPageRoute(builder: (context) => const desktop.LoginScreen(back: true));
- case "login":
- return _rootRoute(const desktop.LoginScreen());
- case "navigation":
- return _rootRoute(const desktop.NavigationScreen());
- case "login_to_navigation":
- return desktop.loginRoute(const desktop.NavigationScreen());
- }
- }
- return null;
- }
-
- Route _rootRoute(Widget widget) {
- return PageRouteBuilder(pageBuilder: (context, _, __) => widget);
- }
-}
+import 'dart:io';
+import 'dart:math';
+
+import 'package:dynamic_color/dynamic_color.dart';
+import 'package:filcnaplo/api/client.dart';
+import 'package:filcnaplo/api/providers/live_card_provider.dart';
+import 'package:filcnaplo/api/providers/news_provider.dart';
+import 'package:filcnaplo/api/providers/database_provider.dart';
+import 'package:filcnaplo/api/providers/status_provider.dart';
+import 'package:filcnaplo/models/config.dart';
+import 'package:filcnaplo/theme/observer.dart';
+import 'package:filcnaplo/theme/theme.dart';
+import 'package:filcnaplo_kreta_api/client/client.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_localizations/flutter_localizations.dart';
+import 'package:i18n_extension/i18n_widget.dart';
+import 'package:material_color_utilities/palettes/core_palette.dart';
+import 'package:provider/provider.dart';
+
+// Mobile UI
+import 'package:filcnaplo_mobile_ui/common/system_chrome.dart' as mobile;
+import 'package:filcnaplo_mobile_ui/screens/login/login_route.dart' as mobile;
+import 'package:filcnaplo_mobile_ui/screens/login/login_screen.dart' as mobile;
+import 'package:filcnaplo_mobile_ui/screens/navigation/navigation_screen.dart' as mobile;
+import 'package:filcnaplo_mobile_ui/screens/settings/settings_route.dart' as mobile;
+import 'package:filcnaplo_mobile_ui/screens/settings/settings_screen.dart' as mobile;
+
+// Desktop UI
+import 'package:filcnaplo_desktop_ui/screens/navigation/navigation_screen.dart' as desktop;
+import 'package:filcnaplo_desktop_ui/screens/login/login_screen.dart' as desktop;
+import 'package:filcnaplo_desktop_ui/screens/login/login_route.dart' as desktop;
+
+// Providers
+import 'package:filcnaplo/models/settings.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/exam_provider.dart';
+import 'package:filcnaplo_kreta_api/providers/grade_provider.dart';
+import 'package:filcnaplo_kreta_api/providers/homework_provider.dart';
+import 'package:filcnaplo_kreta_api/providers/message_provider.dart';
+import 'package:filcnaplo_kreta_api/providers/note_provider.dart';
+import 'package:filcnaplo_kreta_api/providers/timetable_provider.dart';
+import 'package:filcnaplo/api/providers/user_provider.dart';
+import 'package:filcnaplo/api/providers/update_provider.dart';
+import 'package:filcnaplo_mobile_ui/pages/grades/calculator/grade_calculator_provider.dart';
+import 'package:flutter_displaymode/flutter_displaymode.dart';
+import 'package:filcnaplo_premium/providers/premium_provider.dart';
+
+class App extends StatelessWidget {
+ final SettingsProvider settings;
+ final UserProvider user;
+ final DatabaseProvider database;
+
+ const App({Key? key, required this.database, required this.settings, required this.user}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ mobile.setSystemChrome(context);
+
+ // Set high refresh mode #28
+ if (Platform.isAndroid) FlutterDisplayMode.setHighRefreshRate();
+
+ CorePalette? corePalette;
+
+ final status = StatusProvider();
+ final kreta = KretaClient(user: user, settings: settings, status: status);
+ final timetable = TimetableProvider(user: user, database: database, kreta: kreta);
+ final premium = PremiumProvider(settings: settings);
+
+ WidgetsBinding.instance.addPostFrameCallback((_) {
+ FilcAPI.getConfig(settings).then((Config? config) {
+ if (config != null) settings.update(config: config);
+ });
+ premium.activate();
+ });
+
+ return MultiProvider(
+ providers: [
+ ChangeNotifierProvider(create: (_) => premium),
+ ChangeNotifierProvider(create: (_) => settings),
+ ChangeNotifierProvider(create: (_) => user),
+ ChangeNotifierProvider(create: (_) => status),
+ Provider(create: (_) => kreta),
+ Provider(create: (context) => database),
+ ChangeNotifierProvider(create: (context) => ThemeModeObserver(initialTheme: settings.theme)),
+ ChangeNotifierProvider(create: (context) => NewsProvider(context: context)),
+ ChangeNotifierProvider(create: (context) => UpdateProvider(context: context)),
+
+ // User data providers
+ ChangeNotifierProvider(create: (_) => GradeProvider(settings: settings, user: user, database: database, kreta: kreta)),
+ ChangeNotifierProvider(create: (_) => timetable),
+ ChangeNotifierProvider(create: (context) => ExamProvider(context: context)),
+ ChangeNotifierProvider(create: (context) => HomeworkProvider(context: context)),
+ ChangeNotifierProvider(create: (context) => MessageProvider(context: context)),
+ ChangeNotifierProvider(create: (context) => NoteProvider(context: context)),
+ ChangeNotifierProvider(create: (context) => EventProvider(context: context)),
+ ChangeNotifierProvider(create: (context) => AbsenceProvider(context: context)),
+
+ ChangeNotifierProvider(
+ create: (_) => GradeCalculatorProvider(settings: settings, user: user, database: database, kreta: kreta)),
+ ChangeNotifierProvider(create: (context) => LiveCardProvider(timetable: timetable, settings: settings))
+ ],
+ child: Consumer(
+ builder: (context, themeMode, child) {
+ return FutureBuilder(
+ future: DynamicColorPlugin.getCorePalette(),
+ builder: (context, snapshot) {
+ corePalette = snapshot.data;
+ return MaterialApp(
+ builder: (context, child) {
+ // Limit font size scaling to 1.0
+ double textScaleFactor = min(MediaQuery.of(context).textScaleFactor, 1.0);
+
+ return I18n(
+ initialLocale: Locale(settings.language, settings.language.toUpperCase()),
+ child: MediaQuery(
+ data: MediaQuery.of(context).copyWith(textScaleFactor: textScaleFactor),
+ child: child ?? Container(),
+ ),
+ );
+ },
+ title: "Filc Napló",
+ debugShowCheckedModeBanner: false,
+ theme: AppTheme.lightTheme(context, palette: corePalette),
+ darkTheme: AppTheme.darkTheme(context, palette: corePalette),
+ themeMode: themeMode.themeMode,
+ localizationsDelegates: const [
+ GlobalMaterialLocalizations.delegate,
+ GlobalWidgetsLocalizations.delegate,
+ GlobalCupertinoLocalizations.delegate,
+ ],
+ supportedLocales: const [
+ Locale('en', 'EN'),
+ Locale('hu', 'HU'),
+ Locale('de', 'DE'),
+ ],
+ localeListResolutionCallback: (locales, supported) {
+ Locale locale = const Locale('hu', 'HU');
+
+ for (var loc in locales ?? []) {
+ if (supported.contains(loc)) {
+ locale = loc;
+ break;
+ }
+ }
+
+ return locale;
+ },
+ onGenerateRoute: (settings) => rootNavigator(settings),
+ initialRoute: user.getUsers().isNotEmpty ? "navigation" : "login",
+ );
+ },
+ );
+ },
+ ),
+ );
+ }
+
+ Route? rootNavigator(RouteSettings route) {
+ // if platform == android || platform == ios
+ if (Platform.isAndroid || Platform.isIOS) {
+ switch (route.name) {
+ case "login_back":
+ return CupertinoPageRoute(builder: (context) => const mobile.LoginScreen(back: true));
+ case "login":
+ return _rootRoute(const mobile.LoginScreen());
+ case "navigation":
+ return _rootRoute(const mobile.NavigationScreen());
+ case "login_to_navigation":
+ return mobile.loginRoute(const mobile.NavigationScreen());
+ case "settings":
+ return mobile.settingsRoute(const mobile.SettingsScreen());
+ }
+ } else if (Platform.isWindows || Platform.isMacOS || Platform.isLinux) {
+ switch (route.name) {
+ case "login_back":
+ return CupertinoPageRoute(builder: (context) => const desktop.LoginScreen(back: true));
+ case "login":
+ return _rootRoute(const desktop.LoginScreen());
+ case "navigation":
+ return _rootRoute(const desktop.NavigationScreen());
+ case "login_to_navigation":
+ return desktop.loginRoute(const desktop.NavigationScreen());
+ }
+ }
+ return null;
+ }
+
+ Route _rootRoute(Widget widget) {
+ return PageRouteBuilder(pageBuilder: (context, _, __) => widget);
+ }
+}
diff --git a/filcnaplo/lib/database/init.dart b/filcnaplo/lib/database/init.dart
index 63f91f2..b006555 100644
--- a/filcnaplo/lib/database/init.dart
+++ b/filcnaplo/lib/database/init.dart
@@ -1,141 +1,141 @@
-// ignore_for_file: avoid_print
-
-import 'dart:io';
-
-import 'package:filcnaplo/api/providers/database_provider.dart';
-import 'package:filcnaplo/database/struct.dart';
-import 'package:filcnaplo/models/settings.dart';
-import 'package:sqflite/sqflite.dart';
-// ignore: depend_on_referenced_packages
-import 'package:sqflite_common_ffi/sqflite_ffi.dart';
-
-const settingsDB = DatabaseStruct("settings", {
- "language": String, "start_page": int, "rounding": int, "theme": int, "accent_color": int, "news": int, "news_state": int, "developer_mode": int,
- "update_channel": int, "config": String, "custom_accent_color": int, "custom_background_color": int, "custom_highlight_color": int, // general
- "grade_color1": int, "grade_color2": int, "grade_color3": int, "grade_color4": int, "grade_color5": int, // grade colors
- "vibration_strength": int, "ab_weeks": int, "swap_ab_weeks": int,
- "notifications": int, "notifications_bitfield": int, "notification_poll_interval": int, // notifications
- "x_filc_id": String, "graph_class_avg": int, "presentation_mode": int, "bell_delay": int, "bell_delay_enabled": int,
- "grade_opening_fun": int, "icon_pack": String, "premium_scopes": String, "premium_token": String, "premium_login": String,
- "last_account_id": String, "renamed_subjects_enabled": int,
-});
-// DON'T FORGET TO UPDATE DEFAULT VALUES IN `initDB` MIGRATION OR ELSE PARENTS WILL COMPLAIN ABOUT THEIR CHILDREN MISSING
-// YOU'VE BEEN WARNED!!!
-const usersDB = DatabaseStruct("users", {
- "id": String, "name": String, "username": String, "password": String, "institute_code": String, "student": String, "role": int,
- "nickname": String, "picture": String // premium only
-});
-const userDataDB = DatabaseStruct("user_data", {
- "id": String, "grades": String, "timetable": String, "exams": String, "homework": String, "messages": String, "notes": String,
- "events": String, "absences": String, "group_averages": String,
- // renamed subjects // non kreta data
- "renamed_subjects": String,
- // "subject_lesson_count": String, // non kreta data
- "last_seen_grade": int,
-});
-
-Future createTable(Database db, DatabaseStruct struct) => db.execute("CREATE TABLE IF NOT EXISTS ${struct.table} ($struct)");
-
-Future initDB(DatabaseProvider database) async {
- Database db;
-
- if (Platform.isLinux || Platform.isWindows) {
- sqfliteFfiInit();
- db = await databaseFactoryFfi.openDatabase("app.db");
- } else {
- db = await openDatabase("app.db");
- }
-
- await createTable(db, settingsDB);
- await createTable(db, usersDB);
- await createTable(db, userDataDB);
-
- if ((await db.rawQuery("SELECT COUNT(*) FROM settings"))[0].values.first == 0) {
- // Set default values for table Settings
- await db.insert("settings", SettingsProvider.defaultSettings(database: database).toMap());
- }
-
- // Migrate Databases
- try {
- await migrateDB(
- db,
- struct: settingsDB,
- defaultValues: SettingsProvider.defaultSettings(database: database).toMap(),
- );
- await migrateDB(
- db,
- struct: usersDB,
- defaultValues: {"role": 0, "nickname": "", "picture": ""},
- );
- await migrateDB(db, struct: userDataDB, defaultValues: {
- "grades": "[]", "timetable": "[]", "exams": "[]", "homework": "[]", "messages": "[]", "notes": "[]", "events": "[]", "absences": "[]",
- "group_averages": "[]",
- // renamed subjects // non kreta data
- "renamed_subjects": "{}",
- // "subject_lesson_count": "{}", // non kreta data
- "last_seen_grade": 0,
- });
- } catch (error) {
- print("ERROR: migrateDB: $error");
- }
-
- return db;
-}
-
-Future migrateDB(
- Database db, {
- required DatabaseStruct struct,
- required Map defaultValues,
-}) async {
- var originalRows = await db.query(struct.table);
-
- if (originalRows.isEmpty) {
- await db.execute("drop table ${struct.table}");
- await createTable(db, struct);
- return;
- }
-
- List> migrated = [];
-
- // go through each row and add missing keys or delete non existing keys
- await Future.forEach>(originalRows, (original) async {
- bool migrationRequired = struct.struct.keys.any((key) => !original.containsKey(key) || original[key] == null) ||
- original.keys.any((key) => !struct.struct.containsKey(key));
-
- if (migrationRequired) {
- print("INFO: Migrating ${struct.table}");
- var copy = Map.from(original);
-
- // Fill missing columns
- for (var key in struct.struct.keys) {
- if (!original.containsKey(key) || original[key] == null) {
- print("DEBUG: migrating $key");
- copy[key] = defaultValues[key];
- }
- }
-
- for (var key in original.keys) {
- if (!struct.struct.keys.contains(key)) {
- print("DEBUG: dropping $key");
- copy.remove(key);
- }
- }
-
- migrated.add(copy);
- }
- });
-
- // replace the old table with the migrated one
- if (migrated.isNotEmpty) {
- // Delete table
- await db.execute("drop table ${struct.table}");
-
- // Recreate table
- await createTable(db, struct);
- await Future.forEach(migrated, (Map copy) async {
- await db.insert(struct.table, copy);
- });
-
- print("INFO: Database migrated");
- }
-}
+// ignore_for_file: avoid_print
+
+import 'dart:io';
+
+import 'package:filcnaplo/api/providers/database_provider.dart';
+import 'package:filcnaplo/database/struct.dart';
+import 'package:filcnaplo/models/settings.dart';
+import 'package:sqflite/sqflite.dart';
+// ignore: depend_on_referenced_packages
+import 'package:sqflite_common_ffi/sqflite_ffi.dart';
+
+const settingsDB = DatabaseStruct("settings", {
+ "language": String, "start_page": int, "rounding": int, "theme": int, "accent_color": int, "news": int, "news_state": int, "developer_mode": int,
+ "update_channel": int, "config": String, "custom_accent_color": int, "custom_background_color": int, "custom_highlight_color": int, // general
+ "grade_color1": int, "grade_color2": int, "grade_color3": int, "grade_color4": int, "grade_color5": int, // grade colors
+ "vibration_strength": int, "ab_weeks": int, "swap_ab_weeks": int,
+ "notifications": int, "notifications_bitfield": int, "notification_poll_interval": int, // notifications
+ "x_filc_id": String, "graph_class_avg": int, "presentation_mode": int, "bell_delay": int, "bell_delay_enabled": int,
+ "grade_opening_fun": int, "icon_pack": String, "premium_scopes": String, "premium_token": String, "premium_login": String,
+ "last_account_id": String, "renamed_subjects_enabled": int,
+});
+// DON'T FORGET TO UPDATE DEFAULT VALUES IN `initDB` MIGRATION OR ELSE PARENTS WILL COMPLAIN ABOUT THEIR CHILDREN MISSING
+// YOU'VE BEEN WARNED!!!
+const usersDB = DatabaseStruct("users", {
+ "id": String, "name": String, "username": String, "password": String, "institute_code": String, "student": String, "role": int,
+ "nickname": String, "picture": String // premium only
+});
+const userDataDB = DatabaseStruct("user_data", {
+ "id": String, "grades": String, "timetable": String, "exams": String, "homework": String, "messages": String, "notes": String,
+ "events": String, "absences": String, "group_averages": String,
+ // renamed subjects // non kreta data
+ "renamed_subjects": String,
+ // "subject_lesson_count": String, // non kreta data
+ "last_seen_grade": int,
+});
+
+Future createTable(Database db, DatabaseStruct struct) => db.execute("CREATE TABLE IF NOT EXISTS ${struct.table} ($struct)");
+
+Future initDB(DatabaseProvider database) async {
+ Database db;
+
+ if (Platform.isLinux || Platform.isWindows) {
+ sqfliteFfiInit();
+ db = await databaseFactoryFfi.openDatabase("app.db");
+ } else {
+ db = await openDatabase("app.db");
+ }
+
+ await createTable(db, settingsDB);
+ await createTable(db, usersDB);
+ await createTable(db, userDataDB);
+
+ if ((await db.rawQuery("SELECT COUNT(*) FROM settings"))[0].values.first == 0) {
+ // Set default values for table Settings
+ await db.insert("settings", SettingsProvider.defaultSettings(database: database).toMap());
+ }
+
+ // Migrate Databases
+ try {
+ await migrateDB(
+ db,
+ struct: settingsDB,
+ defaultValues: SettingsProvider.defaultSettings(database: database).toMap(),
+ );
+ await migrateDB(
+ db,
+ struct: usersDB,
+ defaultValues: {"role": 0, "nickname": "", "picture": ""},
+ );
+ await migrateDB(db, struct: userDataDB, defaultValues: {
+ "grades": "[]", "timetable": "[]", "exams": "[]", "homework": "[]", "messages": "[]", "notes": "[]", "events": "[]", "absences": "[]",
+ "group_averages": "[]",
+ // renamed subjects // non kreta data
+ "renamed_subjects": "{}",
+ // "subject_lesson_count": "{}", // non kreta data
+ "last_seen_grade": 0,
+ });
+ } catch (error) {
+ print("ERROR: migrateDB: $error");
+ }
+
+ return db;
+}
+
+Future migrateDB(
+ Database db, {
+ required DatabaseStruct struct,
+ required Map defaultValues,
+}) async {
+ var originalRows = await db.query(struct.table);
+
+ if (originalRows.isEmpty) {
+ await db.execute("drop table ${struct.table}");
+ await createTable(db, struct);
+ return;
+ }
+
+ List> migrated = [];
+
+ // go through each row and add missing keys or delete non existing keys
+ await Future.forEach>(originalRows, (original) async {
+ bool migrationRequired = struct.struct.keys.any((key) => !original.containsKey(key) || original[key] == null) ||
+ original.keys.any((key) => !struct.struct.containsKey(key));
+
+ if (migrationRequired) {
+ print("INFO: Migrating ${struct.table}");
+ var copy = Map.from(original);
+
+ // Fill missing columns
+ for (var key in struct.struct.keys) {
+ if (!original.containsKey(key) || original[key] == null) {
+ print("DEBUG: migrating $key");
+ copy[key] = defaultValues[key];
+ }
+ }
+
+ for (var key in original.keys) {
+ if (!struct.struct.keys.contains(key)) {
+ print("DEBUG: dropping $key");
+ copy.remove(key);
+ }
+ }
+
+ migrated.add(copy);
+ }
+ });
+
+ // replace the old table with the migrated one
+ if (migrated.isNotEmpty) {
+ // Delete table
+ await db.execute("drop table ${struct.table}");
+
+ // Recreate table
+ await createTable(db, struct);
+ await Future.forEach(migrated, (Map copy) async {
+ await db.insert(struct.table, copy);
+ });
+
+ print("INFO: Database migrated");
+ }
+}
diff --git a/filcnaplo/lib/database/query.dart b/filcnaplo/lib/database/query.dart
index ce7d615..ab37bc1 100644
--- a/filcnaplo/lib/database/query.dart
+++ b/filcnaplo/lib/database/query.dart
@@ -1,165 +1,165 @@
-import 'dart:convert';
-import 'package:filcnaplo/api/providers/database_provider.dart';
-import 'package:filcnaplo/models/subject_lesson_count.dart';
-import 'package:filcnaplo/models/user.dart';
-import 'package:filcnaplo_kreta_api/models/week.dart';
-// ignore: depend_on_referenced_packages
-import 'package:sqflite_common/sqlite_api.dart';
-
-// Models
-import 'package:filcnaplo/models/settings.dart';
-import 'package:filcnaplo/api/providers/user_provider.dart';
-import 'package:filcnaplo_kreta_api/models/grade.dart';
-import 'package:filcnaplo_kreta_api/models/lesson.dart';
-import 'package:filcnaplo_kreta_api/models/exam.dart';
-import 'package:filcnaplo_kreta_api/models/homework.dart';
-import 'package:filcnaplo_kreta_api/models/message.dart';
-import 'package:filcnaplo_kreta_api/models/note.dart';
-import 'package:filcnaplo_kreta_api/models/event.dart';
-import 'package:filcnaplo_kreta_api/models/absence.dart';
-import 'package:filcnaplo_kreta_api/models/group_average.dart';
-
-class DatabaseQuery {
- DatabaseQuery({required this.db});
-
- final Database db;
-
- Future getSettings(DatabaseProvider database) async {
- Map settingsMap = (await db.query("settings")).elementAt(0);
- SettingsProvider settings = SettingsProvider.fromMap(settingsMap, database: database);
- return settings;
- }
-
- Future getUsers(SettingsProvider settings) async {
- var userProvider = UserProvider(settings: settings);
- List usersMap = await db.query("users");
- for (var user in usersMap) {
- userProvider.addUser(User.fromMap(user));
- }
- if (userProvider.getUsers().map((e) => e.id).contains(settings.lastAccountId)) {
- userProvider.setUser(settings.lastAccountId);
- } else {
- if (usersMap.isNotEmpty) {
- userProvider.setUser(userProvider.getUsers().first.id);
- settings.update(lastAccountId: userProvider.id);
- }
- }
- return userProvider;
- }
-}
-
-class UserDatabaseQuery {
- UserDatabaseQuery({required this.db});
-
- final Database db;
-
- Future> getGrades({required String userId}) async {
- List userData = await db.query("user_data", where: "id = ?", whereArgs: [userId]);
- if (userData.isEmpty) return [];
- String? gradesJson = userData.elementAt(0)["grades"] as String?;
- if (gradesJson == null) return [];
- List grades = (jsonDecode(gradesJson) as List).map((e) => Grade.fromJson(e)).toList();
- return grades;
- }
-
- Future>> getLessons({required String userId}) async {
- List userData = await db.query("user_data", where: "id = ?", whereArgs: [userId]);
- if (userData.isEmpty) return {};
- String? lessonsJson = userData.elementAt(0)["timetable"] as String?;
- if (lessonsJson == null) return {};
- if (jsonDecode(lessonsJson) is List) return {};
- Map> lessons = (jsonDecode(lessonsJson) as Map).cast().map((key, value) {
- return MapEntry(Week.fromId(int.parse(key)), value.cast>().map((e) => Lesson.fromJson(e)).toList());
- }).cast();
- return lessons;
- }
-
- Future> getExams({required String userId}) async {
- List userData = await db.query("user_data", where: "id = ?", whereArgs: [userId]);
- if (userData.isEmpty) return [];
- String? examsJson = userData.elementAt(0)["exams"] as String?;
- if (examsJson == null) return [];
- List