├── .github
├── ISSUE_TEMPLATE
│ ├── fout-rapporteren.md
│ └── suggestie.md
└── workflows
│ └── build-release.yml
├── .gitignore
├── .idx
└── dev.nix
├── .metadata
├── .vscode
└── launch.json
├── LICENSE
├── README.md
├── analysis_options.yaml
├── android
├── .gitignore
├── app
│ ├── build.gradle
│ ├── google-services.json
│ └── src
│ │ ├── debug
│ │ └── AndroidManifest.xml
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin
│ │ │ └── dev
│ │ │ │ └── harrydekat
│ │ │ │ └── silvio
│ │ │ │ └── MainActivity.kt
│ │ └── res
│ │ │ ├── drawable-hdpi
│ │ │ └── notification.png
│ │ │ ├── drawable-mdpi
│ │ │ └── notification.png
│ │ │ ├── drawable-xhdpi
│ │ │ └── notification.png
│ │ │ ├── drawable-xxhdpi
│ │ │ └── notification.png
│ │ │ ├── drawable-xxxhdpi
│ │ │ └── notification.png
│ │ │ ├── drawable
│ │ │ ├── ic_launcher_background.xml
│ │ │ └── launch_background.xml
│ │ │ ├── mipmap-anydpi-v26
│ │ │ └── ic_launcher.xml
│ │ │ ├── mipmap-hdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_background.png
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── ic_launcher_monochrome.png
│ │ │ ├── mipmap-mdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_background.png
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── ic_launcher_monochrome.png
│ │ │ ├── mipmap-xhdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_background.png
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── ic_launcher_monochrome.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_background.png
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── ic_launcher_monochrome.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_background.png
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── ic_launcher_monochrome.png
│ │ │ ├── play_store_512.png
│ │ │ ├── values-night
│ │ │ └── styles.xml
│ │ │ └── values
│ │ │ ├── colors.xml
│ │ │ └── styles.xml
│ │ └── profile
│ │ └── AndroidManifest.xml
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
└── settings.gradle
├── assets
└── font_package
│ └── fonts
│ └── Gemairo.ttf
├── crowdin.yml
├── ios
├── .gitignore
├── Flutter
│ ├── AppFrameworkInfo.plist
│ ├── Debug.xcconfig
│ └── Release.xcconfig
├── Podfile
├── Podfile.lock
├── PrivacyInfo.xcprivacy
├── Runner.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── WorkspaceSettings.xcsettings
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── WorkspaceSettings.xcsettings
├── Runner
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── AppIcon-20@2x.png
│ │ │ ├── AppIcon-20@2x~ipad.png
│ │ │ ├── AppIcon-20@3x.png
│ │ │ ├── AppIcon-20~ipad.png
│ │ │ ├── AppIcon-29.png
│ │ │ ├── AppIcon-29@2x.png
│ │ │ ├── AppIcon-29@2x~ipad.png
│ │ │ ├── AppIcon-29@3x.png
│ │ │ ├── AppIcon-29~ipad.png
│ │ │ ├── AppIcon-40@2x.png
│ │ │ ├── AppIcon-40@2x~ipad.png
│ │ │ ├── AppIcon-40@3x.png
│ │ │ ├── AppIcon-40~ipad.png
│ │ │ ├── AppIcon-60@2x~car.png
│ │ │ ├── AppIcon-60@3x~car.png
│ │ │ ├── AppIcon-83.5@2x~ipad.png
│ │ │ ├── AppIcon@2x.png
│ │ │ ├── AppIcon@2x~ipad.png
│ │ │ ├── AppIcon@3x.png
│ │ │ ├── AppIcon~ios-marketing.png
│ │ │ ├── AppIcon~ipad.png
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ └── LaunchImage.imageset
│ │ │ ├── Contents.json
│ │ │ ├── README.md
│ │ │ ├── ic_launcher_foreground 1.png
│ │ │ ├── ic_launcher_foreground 2.png
│ │ │ └── ic_launcher_foreground.png
│ ├── Base.lproj
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ ├── ExportOptions.plist
│ ├── GoogleService-Info.plist
│ ├── Info.plist
│ ├── Launch Screen.storyboard
│ ├── Runner-Bridging-Header.h
│ ├── Runner.entitlements
│ └── RunnerRelease.entitlements
├── build
│ ├── .last_build_id
│ └── XCBuildData
│ │ └── 276c23d118cf162e1ac0a7687825d510.xcbuilddata
│ │ ├── build-request.json
│ │ ├── description.msgpack
│ │ ├── manifest.json
│ │ ├── target-graph.txt
│ │ └── task-store.msgpack
└── firebase_app_id_file.json
├── ios_release.sh
├── l10n.yaml
├── lib
├── apis
│ ├── abstact_api.dart
│ ├── account_manager.dart
│ ├── ads.dart
│ ├── local_file.dart
│ ├── magister.dart
│ ├── magister
│ │ ├── api.dart
│ │ ├── screens
│ │ │ ├── config.dart
│ │ │ ├── login.dart
│ │ │ └── terms.dart
│ │ └── translate.dart
│ ├── random.dart
│ ├── saaf.dart
│ ├── somtoday.dart
│ └── somtoday
│ │ ├── api.dart
│ │ ├── screens
│ │ ├── config.dart
│ │ ├── login.dart
│ │ ├── school_picker.dart
│ │ └── terms.dart
│ │ └── translate.dart
├── background_tasks.dart
├── firebase_options.dart
├── hive
│ ├── adapters.dart
│ ├── adapters.g.dart
│ └── extentions.dart
├── l10n
│ ├── app_en.arb
│ └── app_nl.arb
├── main.dart
├── screens
│ ├── career.dart
│ ├── login.dart
│ ├── post_login.dart
│ ├── search.dart
│ ├── settings.dart
│ ├── subject.dart
│ ├── subjects.dart
│ └── year.dart
└── widgets
│ ├── ads.dart
│ ├── animations.dart
│ ├── announcements.dart
│ ├── appbar.dart
│ ├── avatars.dart
│ ├── bottom_sheet.dart
│ ├── card.dart
│ ├── cards
│ ├── grade_calculations.dart
│ ├── list_grade.dart
│ ├── list_schoolyear.dart
│ └── list_test.dart
│ ├── charts
│ ├── barchart_frequency.dart
│ ├── barchart_subjects_average.dart
│ ├── barchart_subjects_min_max.dart
│ ├── barchart_subjects_weight.dart
│ ├── linechart_grades.dart
│ └── linechart_monthly_average.dart
│ ├── facts_header.dart
│ ├── filter.dart
│ ├── global
│ └── skeletons.dart
│ ├── navigation.dart
│ └── ratelimit.dart
├── pubspec.lock
├── pubspec.yaml
└── test
└── widget_test.dart
/.github/ISSUE_TEMPLATE/fout-rapporteren.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Fout rapporteren
3 | about: Help Gemairo door fouten in de applicatie door te geven
4 | title: "Bug - "
5 | labels: bug
6 | assignees: ""
7 | ---
8 |
9 | **Beschrijf de fout**
10 | Een duidelijke beschijving van de fout.
11 |
12 | **Fout reproduceren**
13 | Stappen om het gedrag te reproduceren:
14 |
15 | 1. Ga naar '...'
16 | 2. Klik op '....'
17 | 3. etc.
18 |
19 | **Verwacht gedrag**
20 | Een duidelijke beschrijving van wat u verwachtte dat er zou gebeuren.
21 |
22 | **Schermafbeeldingen**
23 | Voeg indien van toepassing schermafbeeldingen toe van de fout
24 |
25 | **Smartphone (gelieve de volgende gegevens in te vullen):**
26 |
27 | - Toestel: [bijv. Iphone 6]
28 | - Besturingssysteem: [bijv. iOS8.1]
29 | - Versie [bijv. 1.0.1] (te zien bij licenties in de instellingen)
30 |
31 | **Aanvullende context**
32 | Voeg hier een andere context over het probleem toe.
33 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/suggestie.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Suggestie
3 | about: Maak een suggestie
4 | title: 'Suggestie - '
5 | labels: enhancement
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Is uw suggestie verbonden aan een probleem? zo ja, beschrijf het probleem**
11 | Een duidelijke beschrijving van wat het probleem is. b.v.b. Ik ben altijd gefrustreerd wanneer [...]
12 |
13 | **Beschrijf welke toevoeging u wilt zien**
14 | Een duidelijke beschrijving van wat u wilt dat er gaat komen.
15 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | *.jks
7 | .DS_Store
8 | .atom/
9 | .buildlog/
10 | .history
11 | .svn/
12 | migrate_working_dir/
13 |
14 | # IntelliJ related
15 | *.iml
16 | *.ipr
17 | *.iws
18 | .idea/
19 |
20 | # The .vscode folder contains launch configuration and tasks you configure in
21 | # VS Code which you may wish to be included in version control, so this line
22 | # is commented out by default.
23 | #.vscode/
24 |
25 | # Flutter/Dart/Pub related
26 | **/doc/api/
27 | **/ios/Flutter/.last_build_id
28 | .dart_tool/
29 | .flutter-plugins
30 | .flutter-plugins-dependencies
31 | .packages
32 | .pub-cache/
33 | .pub/
34 | /build/
35 |
36 | # Symbolication related
37 | app.*.symbols
38 |
39 | # Obfuscation related
40 | app.*.map.json
41 |
42 | # Android Studio will place build artifacts here
43 | /android/app/debug
44 | /android/app/profile
45 | /android/app/release
46 |
--------------------------------------------------------------------------------
/.idx/dev.nix:
--------------------------------------------------------------------------------
1 | {pkgs}: {
2 | channel = "stable-23.11";
3 | packages = [
4 | pkgs.nodePackages.firebase-tools
5 | pkgs.jdk17
6 | pkgs.unzip
7 | ];
8 | idx.extensions = [
9 | "Dart-Code.dart-code"
10 | "Dart-Code.flutter"];
11 | idx.previews = {
12 | previews = {
13 | web = {
14 | command = [
15 | "flutter"
16 | "run"
17 | "--machine"
18 | "-d"
19 | "web-server"
20 | "--web-hostname"
21 | "0.0.0.0"
22 | "--web-port"
23 | "$PORT"
24 | ];
25 | manager = "flutter";
26 | };
27 | android = {
28 | command = [
29 | "flutter"
30 | "run"
31 | "--machine"
32 | "-d"
33 | "android"
34 | "-d"
35 | "emulator-5554"
36 | ];
37 | manager = "flutter";
38 | };
39 | };
40 | };
41 | }
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled.
5 |
6 | version:
7 | revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf
8 | channel: stable
9 |
10 | project_type: app
11 |
12 | # Tracks metadata for the flutter migrate command
13 | migration:
14 | platforms:
15 | - platform: root
16 | create_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf
17 | base_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf
18 | - platform: android
19 | create_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf
20 | base_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf
21 | - platform: ios
22 | create_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf
23 | base_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf
24 |
25 | # User provided section
26 |
27 | # List of Local paths (relative to this file) that should be
28 | # ignored by the migrate tool.
29 | #
30 | # Files that are not part of the templates will be ignored by default.
31 | unmanaged_files:
32 | - 'lib/main.dart'
33 | - 'ios/Runner.xcodeproj/project.pbxproj'
34 |
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | // Use IntelliSense to learn about possible attributes.
3 | // Hover to view descriptions of existing attributes.
4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5 | "version": "0.2.0",
6 | "configurations": [
7 | {
8 | "name": "Gemairo",
9 | "request": "launch",
10 | "type": "dart"
11 | },
12 | {
13 | "name": "Gemairo (profile mode)",
14 | "request": "launch",
15 | "type": "dart",
16 | "flutterMode": "profile"
17 | },
18 | {
19 | "name": "Gemairo (release mode)",
20 | "request": "launch",
21 | "type": "dart",
22 | "flutterMode": "release"
23 | }
24 | ]
25 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
Gemairo Statistiek voor Magister
7 |
8 |
9 | Krijg beter inzicht in je cijfers
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | > **Note**
20 | > Gemairo is niet verbonden met, of onderdeel van Iddink Group.
21 |
22 | ## Wat is dit?
23 |
24 | Gemairo is een manier om je cijfers uit het [leerlingvolgsysteem Magister](https://magister.nl) te bekijken. Hun eigen app mist veel functionaliteiten, dus heb ik een poging gedaan om in ieder geval het bekijken van je cijfers te verbeteren.
25 |
26 | ## Is dit project verbonden met Magister of haar moeder bedrijf?
27 |
28 | **Nee**, Gemairo is een **privé-initiatief** en heeft geen elke connectie met Magister of haar moeder bedrijf. Alle code voor Gemairo is openbaar beschikbaar, dus het is mogelijk om zelf te controleren welke en hoe Gemairo je gegevens gebruikt.
29 |
30 | 
31 |
32 | ## Contributie
33 |
34 | Alle contributies **zijn erg welkom**, omdat ik dit project niet voor eeuwig zelf kan ondersteunen. Je kan een contributies maken door een pull-request te openen, maar probeer wel een **goede beschijving** van je veranderingen/toevoegingen te maken. Verder, mocht je een UI toevoeging maken, probeer dan waar mogelijk [material 3](https://m3.material.io/) aan te houden.
35 |
36 | ## Contact
37 |
38 |
39 |
40 | Project Link: [https://github.com/Gemairo/app](https://github.com/Gemairo/app)
41 |
42 |
45 |
46 |
--------------------------------------------------------------------------------
/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | # This file configures the analyzer, which statically analyzes Dart code to
2 | # check for errors, warnings, and lints.
3 | #
4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled
5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
6 | # invoked from the command line by running `flutter analyze`.
7 |
8 | # The following line activates a set of recommended lints for Flutter apps,
9 | # packages, and plugins designed to encourage good coding practices.
10 | include: package:flutter_lints/flutter.yaml
11 |
12 | linter:
13 | # The lint rules applied to this project can be customized in the
14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml`
15 | # included above or to enable additional rules. A list of all available lints
16 | # and their documentation is published at
17 | # https://dart-lang.github.io/linter/lints/index.html.
18 | #
19 | # Instead of disabling a lint rule for the entire project in the
20 | # section below, it can also be suppressed for a single line of code
21 | # or a specific dart file by using the `// ignore: name_of_lint` and
22 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file
23 | # producing the lint.
24 | rules:
25 | # avoid_print: false # Uncomment to disable the `avoid_print` rule
26 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
27 |
28 | # Additional information about this file can be found at
29 | # https://dart.dev/guides/language/analysis-options
30 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
9 | # Remember to never publicly share your keystore.
10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
11 | key.properties
12 | **/*.keystore
13 | **/*.jks
14 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | def localProperties = new Properties()
2 | def localPropertiesFile = rootProject.file('local.properties')
3 | if (localPropertiesFile.exists()) {
4 | localPropertiesFile.withReader('UTF-8') { reader ->
5 | localProperties.load(reader)
6 | }
7 | }
8 |
9 | def flutterRoot = localProperties.getProperty('flutter.sdk')
10 | if (flutterRoot == null) {
11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12 | }
13 |
14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
15 | if (flutterVersionCode == null) {
16 | flutterVersionCode = '1'
17 | }
18 |
19 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
20 | if (flutterVersionName == null) {
21 | flutterVersionName = '1.0'
22 | }
23 |
24 | def keystoreProperties = new Properties()
25 | def keystorePropertiesFile = rootProject.file('key.properties')
26 | if (keystorePropertiesFile.exists()) {
27 | keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
28 | }
29 |
30 |
31 | apply plugin: 'com.android.application'
32 | // START: FlutterFire Configuration
33 | apply plugin: 'com.google.gms.google-services'
34 | // END: FlutterFire Configuration
35 | apply plugin: 'kotlin-android'
36 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
37 |
38 | android {
39 | compileSdkVersion 34 //rootProject.ext.compileSdkVersion
40 | ndkVersion flutter.ndkVersion
41 |
42 | compileOptions {
43 | coreLibraryDesugaringEnabled true
44 | sourceCompatibility JavaVersion.VERSION_1_8
45 | targetCompatibility JavaVersion.VERSION_1_8
46 | }
47 |
48 | kotlinOptions {
49 | jvmTarget = '1.8'
50 | }
51 |
52 | sourceSets {
53 | main.java.srcDirs += 'src/main/kotlin'
54 | }
55 |
56 | defaultConfig {
57 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
58 | applicationId "app.netlob.magiscore"
59 | // You can update the following values to match your application needs.
60 | // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
61 | minSdkVersion 21
62 | // targetSdkVersion rootProject.ext.targetSdkVersion
63 | targetSdkVersion 34
64 | versionCode flutterVersionCode.toInteger()
65 | versionName flutterVersionName
66 | multiDexEnabled true
67 | // ndk {
68 | // abiFilters "arm64-v8a", "armeabi-v7a", "x86", "x86_64"
69 | // }
70 | }
71 |
72 | signingConfigs {
73 | release {
74 | keyAlias keystoreProperties['keyAlias']
75 | keyPassword keystoreProperties['keyPassword']
76 | storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
77 | storePassword keystoreProperties['storePassword']
78 | }
79 | }
80 | buildTypes {
81 | release {
82 | signingConfig signingConfigs.release
83 | }
84 | }
85 | }
86 |
87 | flutter {
88 | source '../..'
89 | }
90 |
91 | dependencies {
92 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
93 | implementation "androidx.activity:activity:1.6.1"
94 | implementation 'androidx.window:window:1.0.0'
95 | implementation 'androidx.window:window-java:1.0.0'
96 | coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
97 | implementation 'com.google.android.gms:play-services-ads:22.0.0'
98 | }
99 |
--------------------------------------------------------------------------------
/android/app/google-services.json:
--------------------------------------------------------------------------------
1 | {
2 | "project_info": {
3 | "project_number": "978543096660",
4 | "project_id": "gemairo-6c835",
5 | "storage_bucket": "gemairo-6c835.appspot.com"
6 | },
7 | "client": [
8 | {
9 | "client_info": {
10 | "mobilesdk_app_id": "1:978543096660:android:2c5453859e4f9f31940ec1",
11 | "android_client_info": {
12 | "package_name": "app.netlob.magiscore"
13 | }
14 | },
15 | "oauth_client": [
16 | {
17 | "client_id": "978543096660-1b7drodio3mma413rikba22oifa3t09a.apps.googleusercontent.com",
18 | "client_type": 3
19 | }
20 | ],
21 | "api_key": [
22 | {
23 | "current_key": "AIzaSyA-D4yWJYnLhI5idhJz2whEkKekI6STXqo"
24 | }
25 | ],
26 | "services": {
27 | "appinvite_service": {
28 | "other_platform_oauth_client": [
29 | {
30 | "client_id": "978543096660-1b7drodio3mma413rikba22oifa3t09a.apps.googleusercontent.com",
31 | "client_type": 3
32 | },
33 | {
34 | "client_id": "978543096660-1rg9mgl5nqa6fkn91c6cfg3a7808rqvj.apps.googleusercontent.com",
35 | "client_type": 2,
36 | "ios_info": {
37 | "bundle_id": "app.netlob.magiscore"
38 | }
39 | }
40 | ]
41 | }
42 | },
43 | "admob_app_id": "ca-app-pub-9170931639371270~4644085927"
44 | }
45 | ],
46 | "configuration_version": "1"
47 | }
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
4 |
9 |
17 |
21 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
40 |
43 |
45 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/dev/harrydekat/silvio/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package app.netlob.magiscore
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-hdpi/notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/drawable-hdpi/notification.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-mdpi/notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/drawable-mdpi/notification.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xhdpi/notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/drawable-xhdpi/notification.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xxhdpi/notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/drawable-xxhdpi/notification.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xxxhdpi/notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/drawable-xxxhdpi/notification.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
15 |
20 |
25 |
30 |
35 |
40 |
45 |
50 |
55 |
60 |
65 |
70 |
75 |
80 |
85 |
90 |
95 |
100 |
105 |
110 |
115 |
120 |
125 |
130 |
135 |
140 |
145 |
150 |
155 |
160 |
165 |
170 |
171 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | -
8 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png
--------------------------------------------------------------------------------
/android/app/src/main/res/play_store_512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/android/app/src/main/res/play_store_512.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values-night/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #4f46e5
4 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
16 |
19 |
20 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
7 |
8 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.8.22'
3 | repositories {
4 | google()
5 | mavenCentral()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:7.2.0'
10 | // START: FlutterFire Configuration
11 | classpath 'com.google.gms:google-services:4.3.10'
12 | // END: FlutterFire Configuration
13 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
14 | }
15 | ext {
16 | compileSdkVersion = 33
17 | targetSdkVersion = 33
18 | appCompatVersion = "1.4.2"
19 | }
20 | }
21 |
22 | allprojects {
23 | repositories {
24 | google()
25 | mavenCentral()
26 | maven {
27 | url "${project(':background_fetch').projectDir}/libs"
28 | }
29 | }
30 | }
31 |
32 | rootProject.buildDir = '../build'
33 | subprojects {
34 | project.buildDir = "${rootProject.buildDir}/${project.name}"
35 | }
36 | subprojects {
37 | project.evaluationDependsOn(':app')
38 | }
39 |
40 | tasks.register("clean", Delete) {
41 | delete rootProject.buildDir
42 | }
43 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | zipStoreBase=GRADLE_USER_HOME
4 | zipStorePath=wrapper/dists
5 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
6 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
4 | def properties = new Properties()
5 |
6 | assert localPropertiesFile.exists()
7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
8 |
9 | def flutterSdkPath = properties.getProperty("flutter.sdk")
10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
12 |
--------------------------------------------------------------------------------
/assets/font_package/fonts/Gemairo.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/assets/font_package/fonts/Gemairo.ttf
--------------------------------------------------------------------------------
/crowdin.yml:
--------------------------------------------------------------------------------
1 | files:
2 | - source: /lib/l10n/app_nl.arb
3 | translation: /lib/l10n/app_%two_letters_code%.arb
4 | targets:
5 | - name: Arbs
6 | sources:
7 | - /lib/l10n/app_nl.arb
8 | file: /lib/l10n/app_%two_letters_code%.arb
9 | format: arb-export
10 |
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | **/dgph
2 | *.mode1v3
3 | *.mode2v3
4 | *.moved-aside
5 | *.pbxuser
6 | *.perspectivev3
7 | **/*sync/
8 | .sconsign.dblite
9 | .tags*
10 | **/.vagrant/
11 | **/DerivedData/
12 | Icon?
13 | **/Pods/
14 | **/.symlinks/
15 | profile
16 | xcuserdata
17 | **/.generated/
18 | Flutter/App.framework
19 | Flutter/Flutter.framework
20 | Flutter/Flutter.podspec
21 | Flutter/Generated.xcconfig
22 | Flutter/ephemeral/
23 | Flutter/app.flx
24 | Flutter/app.zip
25 | Flutter/flutter_assets/
26 | Flutter/flutter_export_environment.sh
27 | ServiceDefinitions.json
28 | Runner/GeneratedPluginRegistrant.*
29 |
30 | # Exceptions to above rules.
31 | !default.mode1v3
32 | !default.mode2v3
33 | !default.pbxuser
34 | !default.perspectivev3
35 |
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 12.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/ios/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment this line to define a global platform for your project
2 | platform :ios, '15.0'
3 |
4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true'
6 |
7 | project 'Runner', {
8 | 'Debug' => :debug,
9 | 'Profile' => :release,
10 | 'Release' => :release,
11 | }
12 |
13 | def flutter_root
14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
15 | unless File.exist?(generated_xcode_build_settings_path)
16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
17 | end
18 |
19 | File.foreach(generated_xcode_build_settings_path) do |line|
20 | matches = line.match(/FLUTTER_ROOT\=(.*)/)
21 | return matches[1].strip if matches
22 | end
23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
24 | end
25 |
26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
27 |
28 | flutter_ios_podfile_setup
29 |
30 | target 'Runner' do
31 | use_frameworks!
32 | use_modular_headers!
33 |
34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
35 | end
36 |
37 | post_install do |installer|
38 | installer.pods_project.targets.each do |target|
39 | flutter_additional_ios_build_settings(target)
40 | # Start of the permission_handler configuration
41 | target.build_configurations.each do |config|
42 | xcconfig_path = config.base_configuration_reference.real_path
43 | xcconfig = File.read(xcconfig_path)
44 | xcconfig_mod = xcconfig.gsub(/DT_TOOLCHAIN_DIR/, "TOOLCHAIN_DIR")
45 | File.open(xcconfig_path, "w") { |file| file << xcconfig_mod }
46 |
47 | config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0'
48 | config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
49 | '$(inherited)',
50 |
51 | ## dart: PermissionGroup.camera
52 | 'PERMISSION_CAMERA=1',
53 |
54 | ## dart: PermissionGroup.notification
55 | 'PERMISSION_NOTIFICATIONS=1',
56 | ]
57 |
58 | config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64'
59 | config.build_settings['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'
60 |
61 | end
62 | end
63 | end
64 |
--------------------------------------------------------------------------------
/ios/PrivacyInfo.xcprivacy:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | NSPrivacyAccessedAPITypes
6 |
7 |
8 | NSPrivacyAccessedAPIType
9 | NSPrivacyAccessedAPICategoryUserDefaults
10 | NSPrivacyAccessedAPITypeReasons
11 |
12 | CA92.1
13 |
14 |
15 |
16 | NSPrivacyAccessedAPIType
17 | NSPrivacyAccessedAPICategoryFileTimestamp
18 | NSPrivacyAccessedAPITypeReasons
19 |
20 | C617.1
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
37 |
38 |
39 |
40 |
41 |
42 |
52 |
54 |
60 |
61 |
62 |
63 |
69 |
71 |
77 |
78 |
79 |
80 |
82 |
83 |
86 |
87 |
88 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import AppTrackingTransparency
3 | import flutter_local_notifications
4 | import Flutter
5 | import GoogleMobileAds
6 |
7 | @main
8 | @objc class AppDelegate: FlutterAppDelegate {
9 | override func application(
10 | _ application: UIApplication,
11 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
12 | ) -> Bool {
13 | // This is required to make any communication available in the action isolate.
14 | FlutterLocalNotificationsPlugin.setPluginRegistrantCallback { (registry) in
15 | GeneratedPluginRegistrant.register(with: registry)
16 | }
17 |
18 | if #available(iOS 10.0, *) {
19 | UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
20 | }
21 |
22 | func applicationDidBecomeActive(_ application: UIApplication) {
23 | if #available(iOS 15.0, *) {
24 | ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
25 |
26 | })
27 | }
28 | }
29 |
30 | GeneratedPluginRegistrant.register(with: self)
31 | GADMobileAds.sharedInstance().requestConfiguration.testDeviceIdentifiers = [ "bae27ae297f1ea60743b27eb5351b744" ]
32 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x~ipad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x~ipad.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20~ipad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20~ipad.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x~ipad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x~ipad.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29~ipad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29~ipad.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x~ipad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x~ipad.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40~ipad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40~ipad.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x~car.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x~car.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x~car.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x~car.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x~ipad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x~ipad.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x~ipad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x~ipad.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ios-marketing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ios-marketing.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ipad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ipad.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "filename": "AppIcon@2x.png",
5 | "idiom": "iphone",
6 | "scale": "2x",
7 | "size": "60x60"
8 | },
9 | {
10 | "filename": "AppIcon@3x.png",
11 | "idiom": "iphone",
12 | "scale": "3x",
13 | "size": "60x60"
14 | },
15 | {
16 | "filename": "AppIcon~ipad.png",
17 | "idiom": "ipad",
18 | "scale": "1x",
19 | "size": "76x76"
20 | },
21 | {
22 | "filename": "AppIcon@2x~ipad.png",
23 | "idiom": "ipad",
24 | "scale": "2x",
25 | "size": "76x76"
26 | },
27 | {
28 | "filename": "AppIcon-83.5@2x~ipad.png",
29 | "idiom": "ipad",
30 | "scale": "2x",
31 | "size": "83.5x83.5"
32 | },
33 | {
34 | "filename": "AppIcon-40@2x.png",
35 | "idiom": "iphone",
36 | "scale": "2x",
37 | "size": "40x40"
38 | },
39 | {
40 | "filename": "AppIcon-40@3x.png",
41 | "idiom": "iphone",
42 | "scale": "3x",
43 | "size": "40x40"
44 | },
45 | {
46 | "filename": "AppIcon-40~ipad.png",
47 | "idiom": "ipad",
48 | "scale": "1x",
49 | "size": "40x40"
50 | },
51 | {
52 | "filename": "AppIcon-40@2x~ipad.png",
53 | "idiom": "ipad",
54 | "scale": "2x",
55 | "size": "40x40"
56 | },
57 | {
58 | "filename": "AppIcon-20@2x.png",
59 | "idiom": "iphone",
60 | "scale": "2x",
61 | "size": "20x20"
62 | },
63 | {
64 | "filename": "AppIcon-20@3x.png",
65 | "idiom": "iphone",
66 | "scale": "3x",
67 | "size": "20x20"
68 | },
69 | {
70 | "filename": "AppIcon-20~ipad.png",
71 | "idiom": "ipad",
72 | "scale": "1x",
73 | "size": "20x20"
74 | },
75 | {
76 | "filename": "AppIcon-20@2x~ipad.png",
77 | "idiom": "ipad",
78 | "scale": "2x",
79 | "size": "20x20"
80 | },
81 | {
82 | "filename": "AppIcon-29.png",
83 | "idiom": "iphone",
84 | "scale": "1x",
85 | "size": "29x29"
86 | },
87 | {
88 | "filename": "AppIcon-29@2x.png",
89 | "idiom": "iphone",
90 | "scale": "2x",
91 | "size": "29x29"
92 | },
93 | {
94 | "filename": "AppIcon-29@3x.png",
95 | "idiom": "iphone",
96 | "scale": "3x",
97 | "size": "29x29"
98 | },
99 | {
100 | "filename": "AppIcon-29~ipad.png",
101 | "idiom": "ipad",
102 | "scale": "1x",
103 | "size": "29x29"
104 | },
105 | {
106 | "filename": "AppIcon-29@2x~ipad.png",
107 | "idiom": "ipad",
108 | "scale": "2x",
109 | "size": "29x29"
110 | },
111 | {
112 | "filename": "AppIcon-60@2x~car.png",
113 | "idiom": "car",
114 | "scale": "2x",
115 | "size": "60x60"
116 | },
117 | {
118 | "filename": "AppIcon-60@3x~car.png",
119 | "idiom": "car",
120 | "scale": "3x",
121 | "size": "60x60"
122 | },
123 | {
124 | "filename": "AppIcon~ios-marketing.png",
125 | "idiom": "ios-marketing",
126 | "scale": "1x",
127 | "size": "1024x1024"
128 | }
129 | ],
130 | "info": {
131 | "author": "iconkitchen",
132 | "version": 1
133 | }
134 | }
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_launcher_foreground.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_launcher_foreground 1.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_launcher_foreground 2.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | 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.
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/ic_launcher_foreground 1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/LaunchImage.imageset/ic_launcher_foreground 1.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/ic_launcher_foreground 2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/LaunchImage.imageset/ic_launcher_foreground 2.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/Runner/Assets.xcassets/LaunchImage.imageset/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/ios/Runner/ExportOptions.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | destination
6 | export
7 | manageAppVersionAndBuildNumber
8 |
9 | method
10 | app-store
11 | provisioningProfiles
12 |
13 | app.netlob.magiscore
14 | Gemairo
15 |
16 | signingCertificate
17 | 7F82AD4C6C02266F4743AE9FCE9B08CD7BEE285D
18 | signingStyle
19 | manual
20 | stripSwiftSymbols
21 |
22 | teamID
23 | FCB4S3W235
24 | uploadSymbols
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Runner/GoogleService-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CLIENT_ID
6 | 978543096660-1rg9mgl5nqa6fkn91c6cfg3a7808rqvj.apps.googleusercontent.com
7 | REVERSED_CLIENT_ID
8 | com.googleusercontent.apps.978543096660-1rg9mgl5nqa6fkn91c6cfg3a7808rqvj
9 | API_KEY
10 | AIzaSyDcG2eDIzbFUVk67U3hZ8uWcbr9Pr7ZI1s
11 | GCM_SENDER_ID
12 | 978543096660
13 | PLIST_VERSION
14 | 1
15 | BUNDLE_ID
16 | app.netlob.magiscore
17 | PROJECT_ID
18 | gemairo-6c835
19 | STORAGE_BUCKET
20 | gemairo-6c835.appspot.com
21 | IS_ADS_ENABLED
22 |
23 | IS_ANALYTICS_ENABLED
24 |
25 | IS_APPINVITE_ENABLED
26 |
27 | IS_GCM_ENABLED
28 |
29 | IS_SIGNIN_ENABLED
30 |
31 | GOOGLE_APP_ID
32 | 1:978543096660:ios:52724800456f3c21940ec1
33 | ADMOB_APP_ID
34 | ca-app-pub-9170931639371270~8990525040
35 |
36 |
--------------------------------------------------------------------------------
/ios/Runner/Launch Screen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/ios/Runner/Runner.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | aps-environment
6 | development
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner/RunnerRelease.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | aps-environment
6 | development
7 | com.apple.developer.aps-environment
8 | development
9 |
10 |
11 |
--------------------------------------------------------------------------------
/ios/build/.last_build_id:
--------------------------------------------------------------------------------
1 | 3c6bcbae52418748a4180941ea3e39b9
--------------------------------------------------------------------------------
/ios/build/XCBuildData/276c23d118cf162e1ac0a7687825d510.xcbuilddata/build-request.json:
--------------------------------------------------------------------------------
1 | {
2 | "buildCommand" : {
3 | "command" : "build",
4 | "skipDependencies" : false,
5 | "style" : "buildOnly"
6 | },
7 | "configuredTargets" : [
8 |
9 | ],
10 | "continueBuildingAfterErrors" : false,
11 | "dependencyScope" : "workspace",
12 | "enableIndexBuildArena" : false,
13 | "hideShellScriptEnvironment" : false,
14 | "parameters" : {
15 | "action" : "build",
16 | "overrides" : {
17 |
18 | }
19 | },
20 | "qos" : "utility",
21 | "schemeCommand" : "launch",
22 | "showNonLoggedProgress" : true,
23 | "useDryRun" : false,
24 | "useImplicitDependencies" : false,
25 | "useLegacyBuildLocations" : false,
26 | "useParallelTargets" : true
27 | }
--------------------------------------------------------------------------------
/ios/build/XCBuildData/276c23d118cf162e1ac0a7687825d510.xcbuilddata/description.msgpack:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/build/XCBuildData/276c23d118cf162e1ac0a7687825d510.xcbuilddata/description.msgpack
--------------------------------------------------------------------------------
/ios/build/XCBuildData/276c23d118cf162e1ac0a7687825d510.xcbuilddata/manifest.json:
--------------------------------------------------------------------------------
1 | {"client":{"name":"basic","version":0,"file-system":"device-agnostic","perform-ownership-analysis":"no"},"targets":{"":[""]},"commands":{"":{"tool":"phony","inputs":[""],"outputs":[""]},"P0:::Gate WorkspaceHeaderMapVFSFilesWritten":{"tool":"phony","inputs":[],"outputs":[""]}}}
--------------------------------------------------------------------------------
/ios/build/XCBuildData/276c23d118cf162e1ac0a7687825d510.xcbuilddata/target-graph.txt:
--------------------------------------------------------------------------------
1 | Target dependency graph (0 target)
--------------------------------------------------------------------------------
/ios/build/XCBuildData/276c23d118cf162e1ac0a7687825d510.xcbuilddata/task-store.msgpack:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gemairo/app/a1cef27bb3f8287ecf159a5544fdd144b9c13a23/ios/build/XCBuildData/276c23d118cf162e1ac0a7687825d510.xcbuilddata/task-store.msgpack
--------------------------------------------------------------------------------
/ios/firebase_app_id_file.json:
--------------------------------------------------------------------------------
1 | {
2 | "file_generated_by": "FlutterFire CLI",
3 | "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory",
4 | "GOOGLE_APP_ID": "1:978543096660:ios:52724800456f3c21940ec1",
5 | "FIREBASE_PROJECT_ID": "gemairo-6c835",
6 | "GCM_SENDER_ID": "978543096660"
7 | }
--------------------------------------------------------------------------------
/ios_release.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | flutter clean
3 | rm -Rf ios/Pods
4 | rm -Rf ios/.symlinks
5 | rm -Rf ios/Flutter/Flutter.framework
6 | rm -Rf ios/Flutter/Flutter.podspec
7 | rm -Rf ios/Podfile.lock
8 | flutter pub get
9 | flutter packages get
10 | flutter packages pub run build_runner build --delete-conflicting-outputs
11 | flutter pub get
12 | cd ios/
13 | # arch -x86_64 pod repo update
14 | # arch -x86_64 pod install
15 | pod repo update
16 | pod install
17 | cd ../
18 | # flutter packages pub run flutter_launcher_name:main
19 | # flutter pub pub run flutter_native_splash:create
20 | # flutter build ios --release
--------------------------------------------------------------------------------
/l10n.yaml:
--------------------------------------------------------------------------------
1 | arb-dir: lib/l10n
2 | template-arb-file: app_en.arb
3 | output-localization-file: app_localizations.dart
--------------------------------------------------------------------------------
/lib/apis/abstact_api.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:gemairo/hive/adapters.dart';
3 |
4 | abstract class Api {
5 | Account account;
6 | Api(this.account);
7 | late bool isOnline;
8 |
9 | Future refreshProfilePicture(Person person) async {}
10 | Future refreshCalendarEvents(Person person) async {}
11 | Future refreshGrade(Person person, Grade grade) async {}
12 | Future refreshSchoolYear(Person person, SchoolYear schoolYear,
13 | void Function(int completed, int total) progress) async {}
14 | Future refreshAll(Person person) async {}
15 | Future logout() async {}
16 |
17 | Widget buildLogin(BuildContext context);
18 | Widget? buildConfig(BuildContext context, {required Person person});
19 | }
20 |
--------------------------------------------------------------------------------
/lib/apis/account_manager.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:gemairo/apis/saaf.dart';
3 | import 'package:gemairo/hive/adapters.dart';
4 | import 'package:gemairo/hive/extentions.dart';
5 | import 'package:hive/hive.dart';
6 |
7 | class AccountManager {
8 | late List accountsList =
9 | Hive.box('accountList').values.toList().unique((x) => x.uuid);
10 | late List personList = accountsList
11 | .map((e) => e.profiles)
12 | .expand((x) => x)
13 | .toList()
14 | .unique((x) => x.uuid);
15 |
16 | Account getActive() {
17 | if (accountsList.isNotEmpty) {
18 | List accountListWithActiveProfile = accountsList
19 | .where((account) => account.profiles
20 | .map((profile) => profile.uuid)
21 | .contains(config.activeProfileId))
22 | .toList();
23 | if (accountListWithActiveProfile.isNotEmpty) {
24 | return accountListWithActiveProfile.first;
25 | } else {
26 | //No active account has been set, setting one...
27 | config.activeProfileId = accountsList.first.profiles.first.uuid;
28 | config.save();
29 | return accountsList.first;
30 | }
31 | } else {
32 | return Account();
33 | }
34 | }
35 |
36 | bool alreadyExists(Account account, {bool unsaved = false}) =>
37 | accountsList.map((e) => e.uuid).contains(account.uuid) ||
38 | personList.map((e) => unsaved ? e.id : e.uuid).any((uuid) =>
39 | account.profiles.map((e) => unsaved ? e.id : e.uuid).contains(uuid));
40 |
41 | void addAccount(Account account) {
42 | if (!alreadyExists(account)) {
43 | Hive.box('accountList').add(account);
44 | }
45 | }
46 | }
47 |
48 | class AccountProvider extends ChangeNotifier {
49 | Account get account => AccountManager().getActive();
50 |
51 | Person get person => AccountManager().getActive().activeProfile!;
52 |
53 | SchoolYear get schoolYear =>
54 | AccountManager().getActive().activeProfile!.activeSchoolYear;
55 |
56 | List get _activeFilters =>
57 | AccountManager().getActive().activeProfile!.activeFilters;
58 | List activeFilters({bool isGlobal = false}) => isGlobal
59 | ? _activeFilters
60 | : _activeFilters.where((f) => !f.isGlobal).toList();
61 |
62 | void changeAccount(int? newid) {
63 | config.activeProfileId = newid ?? config.activeProfileId;
64 | config.save();
65 | notifyListeners();
66 | Saaf.instance?.setAdRequest(force: true);
67 | }
68 |
69 | void changeSchoolYear(int newid) {
70 | person.config.activeSchoolYearId = newid;
71 | person.activeFilters.clear();
72 | account.save();
73 | notifyListeners();
74 | }
75 |
76 | void addToFilter(Filter filter, {bool isGlobal = false}) {
77 | _activeFilters.add(filter..isGlobal = isGlobal);
78 | notifyListeners();
79 | }
80 |
81 | void removeFromFilterWhere(bool Function(Filter) test) {
82 | _activeFilters.removeWhere(test);
83 | notifyListeners();
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/lib/apis/local_file.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 |
3 | import 'package:cr_file_saver/file_saver.dart';
4 | import 'package:file_picker/file_picker.dart';
5 | import 'package:flutter/material.dart';
6 | import 'package:gemairo/apis/abstact_api.dart';
7 | import 'package:gemairo/hive/adapters.dart';
8 | import 'package:gemairo/main.dart';
9 | import 'package:hive/hive.dart';
10 | import 'package:flutter_gen/gen_l10n/app_localizations.dart';
11 |
12 | class LocalFile implements Api {
13 | @override
14 | Account account;
15 | LocalFile(this.account);
16 |
17 | @override
18 | late bool isOnline = false;
19 |
20 | @override
21 | Widget? buildConfig(BuildContext context, {required Person person}) {
22 | return null;
23 | }
24 |
25 | @override
26 | Widget buildLogin(BuildContext context) {
27 | return Scaffold(
28 | body: FutureBuilder(
29 | future: restoreHiveBox(),
30 | builder: (context, snapshot) {
31 | if (snapshot.hasData) {
32 | WidgetsBinding.instance.addPostFrameCallback((_) {
33 | Navigator.of(context).popUntil((r) => r.isFirst);
34 | Navigator.of(context).pushReplacement(MaterialPageRoute(
35 | builder: (context) => const Start(),
36 | ));
37 | });
38 | }
39 | if (snapshot.hasError) {
40 | print(snapshot.error);
41 | return Center(
42 | child: AlertDialog(
43 | actionsAlignment: MainAxisAlignment.start,
44 | title: Text(AppLocalizations.of(context)!.somethingWentWrong),
45 | content:
46 | Text(AppLocalizations.of(context)!.localfileFailedWarning),
47 | actions: [
48 | FilledButton.icon(
49 | onPressed: () => Navigator.pop(context),
50 | icon: const Icon(Icons.navigate_before),
51 | label: Text(AppLocalizations.of(context)!.back))
52 | ],
53 | ),
54 | );
55 | }
56 | return const Center(child: CircularProgressIndicator());
57 | },
58 | ),
59 | );
60 | }
61 |
62 | @override
63 | Future refreshAll(Person person) async {}
64 |
65 | @override
66 | Future refreshCalendarEvents(Person person) async {}
67 |
68 | @override
69 | Future refreshGrade(Person person, Grade grade) async {}
70 |
71 | @override
72 | Future refreshProfilePicture(Person person) async {}
73 |
74 | @override
75 | Future refreshSchoolYear(Person person, SchoolYear schoolYear,
76 | void Function(int completed, int total) progress) async {}
77 |
78 | Future restoreHiveBox() async {
79 | FilePickerResult? result = await FilePicker.platform.pickFiles();
80 |
81 | if (result != null) {
82 | final box = await Hive.openBox('tmpAccountlistBox');
83 | final boxPath = box.path;
84 | await box.close();
85 |
86 | //Get acccounts from imported box
87 | await File(result.files.single.path!).copy(boxPath!);
88 | await Hive.openBox('tmpAccountlistBox');
89 | List importedAccounts = Hive.box('tmpAccountlistBox')
90 | .values
91 | .toList()
92 | .map((e) => e.copy)
93 | .toList();
94 | Hive.deleteBoxFromDisk('tmpAccountlistBox');
95 | //Remove accounts that already exist
96 | importedAccounts.removeWhere((element) => Hive.box('accountList')
97 | .values
98 | .map((e) => e.uuid)
99 | .contains(element.uuid));
100 | //Change the API type, add all the imported accounts & change the active account ID
101 | for (Account importedAccount in importedAccounts) {
102 | importedAccount.apiType = AccountAPITypes.localFile;
103 | }
104 | Hive.box('accountList').addAll(importedAccounts);
105 | return Future.value(true);
106 | } else {
107 | throw 'No file selected';
108 | }
109 | }
110 |
111 | @override
112 | Future logout() async {}
113 | }
114 |
115 | Future backupHiveBox(
116 | {required String boxName, BuildContext? context}) async {
117 | String? selectedDirectory =
118 | Platform.isIOS ? await FilePicker.platform.getDirectoryPath() : '';
119 |
120 | if (selectedDirectory != null) {
121 | final box = Hive.box(boxName);
122 | final boxPath = box.path;
123 | await box.close();
124 |
125 | try {
126 | if (Platform.isAndroid) {
127 | CRFileSaver.saveFileWithDialog(SaveFileDialogParams(
128 | sourceFilePath: boxPath!,
129 | destinationFileName:
130 | "Accounts-${DateTime.now().millisecondsSinceEpoch}.Gemairo"));
131 | } else {
132 | File(boxPath!).copy(
133 | "$selectedDirectory/Accounts-${DateTime.now().millisecondsSinceEpoch}.Gemairo");
134 | }
135 | } catch (e) {
136 | if (context != null) {
137 | WidgetsBinding.instance.addPostFrameCallback((_) =>
138 | ScaffoldMessenger.of(context).showSnackBar(SnackBar(
139 | content: Text(
140 | AppLocalizations.of(context)?.somethingWentWrong ?? "Error"),
141 | showCloseIcon: true,
142 | )));
143 | }
144 | } finally {
145 | await Hive.openBox(boxName);
146 | }
147 | }
148 | }
149 |
--------------------------------------------------------------------------------
/lib/apis/magister/screens/config.dart:
--------------------------------------------------------------------------------
1 | part of 'package:gemairo/apis/magister.dart';
2 |
--------------------------------------------------------------------------------
/lib/apis/magister/screens/terms.dart:
--------------------------------------------------------------------------------
1 | part of 'package:gemairo/apis/magister.dart';
2 |
3 | class Terms extends StatefulWidget {
4 | const Terms({super.key});
5 |
6 | @override
7 | State createState() => _Terms();
8 | }
9 |
10 | class _Terms extends State {
11 | bool accepted = false;
12 | @override
13 | Widget build(BuildContext context) {
14 | String company = "Iddink Group";
15 | return Scaffold(
16 | appBar: AppBar(
17 | title: Text(AppLocalizations.of(context)!.terms),
18 | ),
19 | body: Center(
20 | child: ConstrainedBox(
21 | constraints: const BoxConstraints(maxWidth: 640),
22 | child: Column(
23 | mainAxisAlignment: MainAxisAlignment.spaceAround,
24 | children: [
25 | Padding(
26 | padding: const EdgeInsets.symmetric(horizontal: 20),
27 | child: Text.rich(
28 | TextSpan(
29 | style: Theme.of(context).textTheme.headlineSmall,
30 | children: [
31 | TextSpan(
32 | text: AppLocalizations.of(context)!
33 | .termsContent(company),
34 | style: Theme.of(context).textTheme.bodyMedium)
35 | ]),
36 | )),
37 | Row(
38 | mainAxisAlignment: MainAxisAlignment.spaceEvenly,
39 | children: [
40 | InkWell(
41 | onTap: () => setState(() {
42 | accepted = !accepted;
43 | }),
44 | child: Row(
45 | mainAxisAlignment: MainAxisAlignment.center,
46 | children: [
47 | Checkbox(
48 | value: accepted,
49 | onChanged: (value) => setState(() {
50 | accepted = value!;
51 | }),
52 | ),
53 | Text(
54 | AppLocalizations.of(context)!.agree,
55 | ),
56 | ])),
57 | FilledButton.icon(
58 | icon: const Icon(Icons.navigate_next),
59 | onPressed: accepted
60 | ? () => Navigator.push(
61 | context,
62 | MaterialPageRoute(
63 | builder: (context) => const SignIn(),
64 | ))
65 | : null,
66 | label:
67 | Text(AppLocalizations.of(context)!.gContinue)),
68 | ])
69 | ]),
70 | ),
71 | ));
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/lib/apis/random.dart:
--------------------------------------------------------------------------------
1 | import 'dart:math';
2 | import 'package:flutter/material.dart';
3 | import 'package:gemairo/apis/abstact_api.dart';
4 | import 'package:gemairo/hive/adapters.dart';
5 | import 'package:gemairo/main.dart';
6 | import 'package:hive/hive.dart';
7 |
8 | Random random = Random();
9 |
10 | String _generateRandomString(length) {
11 | var r = Random.secure();
12 | var chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
13 | return Iterable.generate(length, (_) => chars[r.nextInt(chars.length)])
14 | .join();
15 | }
16 |
17 | class RandomAccount implements Api {
18 | @override
19 | Account account;
20 | RandomAccount(this.account);
21 |
22 | @override
23 | late bool isOnline = false;
24 |
25 | @override
26 | Future refreshAll(Person person) async {}
27 |
28 | @override
29 | Future refreshGrade(Person person, Grade grade) async {
30 | grade = randomGrade(grade.subject);
31 | }
32 |
33 | @override
34 | Widget? buildConfig(BuildContext context, {required Person person}) {
35 | return null;
36 | }
37 |
38 | @override
39 | Widget buildLogin(BuildContext context) {
40 | account.apiType = AccountAPITypes.random;
41 | account.accountType = AccountTypes.other;
42 | account.apiStorage = null;
43 | account.id = random.nextInt(99999);
44 | account.profiles = List.generate(2, (index) {
45 | List subjects =
46 | List.generate(random.nextInt(5) + 5, (index) => randomSubject());
47 | return Person(
48 | id: random.nextInt(99999),
49 | firstName: "Random",
50 | lastName: index.toString())
51 | ..config = (PersonConfig()..activeSchoolYearId = 0)
52 | ..rawSchoolYears = List.generate(
53 | 5,
54 | (index) => SchoolYear(
55 | start: DateTime.now().add(Duration(days: 365 * index)),
56 | end: DateTime.now().add(Duration(days: 365 * (index + 1))),
57 | groupCode: index.toString(),
58 | groupName: "Klas $index",
59 | id: index,
60 | studyCode: "studyCode")
61 | ..grades = List.generate(
62 | 100,
63 | (index) =>
64 | randomGrade(subjects[random.nextInt(subjects.length)])))
65 | ..calendarEvents = List.generate(
66 | 5,
67 | (index) => CalendarEvent(
68 | start: DateTime.now().add(Duration(
69 | days: random.nextInt(12), hours: random.nextInt(24))),
70 | locations: ["12G"],
71 | end: DateTime.now().add(Duration(
72 | days: random.nextInt(12), hours: random.nextInt(24))),
73 | endHour: 0,
74 | id: random.nextInt(999),
75 | isFinished: random.nextBool(),
76 | startHour: 0,
77 | subjectsNames: subjects
78 | .map((e) => e.name)
79 | .take(random.nextInt(2) + 1)
80 | .toList(),
81 | teacherNames: ["Wod"],
82 | type: CalendarEventTypes.values[random.nextInt(6)]));
83 | });
84 | Hive.box('accountList').add(account);
85 | WidgetsBinding.instance.addPostFrameCallback((_) {
86 | Navigator.of(context).popUntil((r) => r.isFirst);
87 | Navigator.of(context).pushReplacement(MaterialPageRoute(
88 | builder: (context) => const Start(),
89 | ));
90 | });
91 | return const Center(child: CircularProgressIndicator());
92 | }
93 |
94 | @override
95 | Future refreshCalendarEvents(Person person) async {}
96 |
97 | @override
98 | Future refreshProfilePicture(Person person) async {}
99 |
100 | @override
101 | Future refreshSchoolYear(Person person, SchoolYear schoolYear,
102 | void Function(int completed, int total) progress) async {}
103 |
104 | @override
105 | Future logout() async {}
106 | }
107 |
108 | Subject randomSubject() {
109 | return Subject(
110 | rawCode: _generateRandomString(3),
111 | rawName: _generateRandomString(6),
112 | id: random.nextInt(99999));
113 | }
114 |
115 | Grade randomGrade(Subject subject) {
116 | return Grade(
117 | gradeString: ((random.nextInt(90) + 10) / 10).toString(),
118 | weight: random.nextInt(20).toDouble() + 1,
119 | subject: subject,
120 | description: "Description for a ${subject.name} grade",
121 | addedDate: DateTime.now().subtract(Duration(days: random.nextInt(250))),
122 | counts: true,
123 | id: random.nextInt(9999),
124 | type: GradeType.grade,
125 | teacherCode: subject.name,
126 | schoolQuarter: SchoolQuarter(
127 | shortname: "SE",
128 | end: DateTime.now(),
129 | id: 0,
130 | name: "School examen",
131 | start: DateTime.now()),
132 | isPTA: random.nextBool(),
133 | sufficient: random.nextBool());
134 | }
135 |
--------------------------------------------------------------------------------
/lib/apis/somtoday.dart:
--------------------------------------------------------------------------------
1 | import 'dart:convert';
2 | import 'dart:math';
3 |
4 | import 'package:dio/dio.dart';
5 | import 'package:flutter/foundation.dart';
6 | import 'package:flutter/material.dart';
7 | import 'package:gemairo/apis/account_manager.dart';
8 | import 'package:gemairo/hive/adapters.dart';
9 | import 'package:gemairo/hive/extentions.dart';
10 | import 'package:gemairo/widgets/card.dart';
11 | import 'package:url_launcher/url_launcher.dart';
12 | import 'package:webview_flutter/webview_flutter.dart';
13 | import 'abstact_api.dart';
14 | import 'package:pointycastle/export.dart' as castle;
15 | import 'package:flutter_gen/gen_l10n/app_localizations.dart';
16 |
17 | part 'package:gemairo/apis/somtoday/api.dart';
18 | part 'package:gemairo/apis/somtoday/screens/config.dart';
19 | part 'package:gemairo/apis/somtoday/screens/login.dart';
20 | part 'package:gemairo/apis/somtoday/screens/school_picker.dart';
21 | part 'package:gemairo/apis/somtoday/screens/terms.dart';
22 | part 'package:gemairo/apis/somtoday/translate.dart';
23 |
24 | class SomToDay implements Api {
25 | @override
26 | Account account;
27 | SomToDay(this.account);
28 |
29 | late SomToDayApi api = SomToDayApi(account);
30 |
31 | @override
32 | late bool isOnline = true;
33 |
34 | @override
35 | Widget? buildConfig(BuildContext context, {required Person person}) {
36 | return null;
37 | }
38 |
39 | @override
40 | Widget buildLogin(BuildContext context) {
41 | return Terms(account);
42 | }
43 |
44 | @override
45 | Future refreshAll(Person person) async {}
46 |
47 | @override
48 | Future refreshCalendarEvents(Person person) async {
49 | // TODO: implement refreshCalendarEvents
50 | }
51 |
52 | @override
53 | Future refreshGrade(Person person, Grade grade) async {
54 | // TODO: implement refreshGrade
55 | }
56 |
57 | @override
58 | Future refreshProfilePicture(Person person) async {
59 | var img = (await api.dio.get(
60 | "/rest/v1/leerlingen?additional=pasfoto",
61 | options: Options(
62 | responseType: ResponseType.bytes,
63 | validateStatus: (status) => [200, 404].contains(status),
64 | ),
65 | ));
66 |
67 | person.profilePicture = img.data["items"].where((item) =>
68 | item["links"]
69 | .where((link) => link["type"] == "leerling.RLeerling")["id"] ==
70 | person.id)["additionalObjects"]["pasfoto"]["datauri"];
71 | if (account.isInBox) account.save();
72 | }
73 |
74 | @override
75 | Future refreshSchoolYear(Person person, SchoolYear schoolYear,
76 | void Function(int completed, int total) progress) async {
77 | // TODO: implement refreshSchoolYear
78 | }
79 |
80 | @override
81 | Future logout() async {
82 | // TODO: implement logout
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/lib/apis/somtoday/api.dart:
--------------------------------------------------------------------------------
1 | part of 'package:gemairo/apis/somtoday.dart';
2 |
3 | class SomToDayApi extends SomToDay {
4 | SomToDayApi(super.account);
5 |
6 | late Dio dio = Dio(
7 | BaseOptions(
8 | baseUrl: account.apiStorage?.baseUrl ?? "",
9 | headers: {"authorization": "Bearer ${account.apiStorage?.accessToken}"},
10 | connectTimeout: const Duration(seconds: 15)),
11 | )..interceptors.addAll([
12 | InterceptorsWrapper(
13 | onError: (e, handler) async {
14 | if (e.response?.data != null &&
15 | e.response?.data["error"] == "invalid_grant") {
16 | return handler.reject(DioException(
17 | requestOptions: e.requestOptions,
18 | error:
19 | "Dit account is uitgelogd, verwijder je account en log opnieuw in. (Spijt me zeer hier is nog geen automatische support voor)",
20 | response: e.response,
21 | ));
22 | }
23 | handler.next(e);
24 | },
25 | ),
26 | QueuedInterceptorsWrapper(onRequest: (options, handler) async {
27 | if (account.apiStorage!.accessToken == null ||
28 | DateTime.now().millisecondsSinceEpoch >
29 | account.apiStorage!.expiry!) {
30 | debugPrint("Accestoken expired");
31 | await refreshToken().onError((e, stack) {
32 | handler.reject(e as DioException);
33 | return;
34 | });
35 | }
36 |
37 | options.baseUrl = account.apiStorage!.baseUrl;
38 |
39 | options.headers["Authorization"] =
40 | "Bearer ${account.apiStorage!.accessToken}";
41 |
42 | return handler.next(options);
43 | }, onError: (e, handler) async {
44 | var options = e.requestOptions;
45 |
46 | Future retry() => dio.fetch(options).then(
47 | (r) => handler.resolve(r),
48 | onError: (e) => handler.reject(e),
49 | );
50 |
51 | if (e.response?.data == "SecurityToken Expired") {
52 | debugPrint("Request failed, token is invalid");
53 |
54 | if (options.headers["Authorization"] !=
55 | "Bearer ${account.apiStorage!.accessToken}") {
56 | options.headers["Authorization"] =
57 | "Bearer ${account.apiStorage!.accessToken}";
58 |
59 | return await retry();
60 | }
61 |
62 | return await refreshToken().then((_) => retry()).onError(
63 | (e, stack) => handler.reject(e as DioException),
64 | );
65 | }
66 | })
67 | ]);
68 |
69 | Future setAccountDetails() async {
70 | Map res = (await dio.get("/rest/v1/account/")).data;
71 | account.accountType = AccountTypes.student;
72 | account.id = res["items"]["persoon"]["links"].first["id"];
73 |
74 | Future initPerson(Person person) async {
75 | await Future.wait([
76 | refreshProfilePicture(person),
77 | refreshCalendarEvents(person),
78 | setSchoolYears(person)
79 | ]);
80 |
81 | person.config.activeSchoolYearId = person.schoolYears.first.id;
82 | account.profiles.add(person);
83 | config.save();
84 | }
85 |
86 | for (var item in res["items"]) {
87 | await initPerson(Person(
88 | id: item["persoon"]["links"].first["id"],
89 | firstName: item["persoon"]["roepnaam"] ?? "",
90 | lastName: item["persoon"]["achternaam"] ?? ""));
91 | }
92 |
93 | if (account.isInBox) account.save();
94 | }
95 |
96 | Future refreshToken() async {
97 | await Dio(BaseOptions(
98 | contentType: Headers.formUrlEncodedContentType,
99 | ))
100 | .post