This commit is contained in:
Márton Kiss 2023-05-26 21:25:00 +02:00
parent 9e3b805fdd
commit 1558794e93
528 changed files with 38239 additions and 37732 deletions

View File

@ -5,12 +5,14 @@
#### Nem hivatalos e-napló alkalmazás az eKRÉTA rendszerhez #### Nem hivatalos e-napló alkalmazás az eKRÉTA rendszerhez
[![Downloads](https://img.shields.io/github/downloads-pre/filc/naplo/latest/total?color=%23&label=Downloads&logo=github&sort=semver)](https://github.com/filc/naplo/releases)   [![discord](https://img.shields.io/discord/712698455193157643?label=Discord)](http://filcnaplo.hu/discord)
## Setup ## Setup
### Clone the project ### Clone the project
```sh ```sh
git clone --recursive https://github.com/refilc/naplo git clone --recursive https://github.com/filc/naplo
cd naplo cd naplo
``` ```

View File

@ -1,6 +1,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" package="hu.filc.naplo"> xmlns:tools="http://schemas.android.com/tools" package="hu.filc.naplo">
<application android:label="Filc Napló" tools:replace="android:label" android:icon="@mipmap/ic_launcher" <application android:label="reFilc" tools:replace="android:label" android:icon="@mipmap/ic_launcher"
android:requestLegacyExternalStorage="true"> android:requestLegacyExternalStorage="true">
<activity android:exported="true" android:name=".MainActivity" <activity android:exported="true" android:name=".MainActivity"
android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:launchMode="singleTop" android:theme="@style/LaunchTheme"

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 B

View File

@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/launch_gradient_background" />
<item> <item>
<bitmap android:gravity="center" android:src="@mipmap/ic_splash"/> <bitmap android:gravity="fill" android:src="@drawable/background"/>
</item>
<item>
<bitmap android:gravity="center" android:src="@drawable/splash"/>
</item> </item>
</layer-list> </layer-list>

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 B

View File

@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/launch_gradient_background" />
<item> <item>
<bitmap android:gravity="center" android:src="@mipmap/ic_splash"/> <bitmap android:gravity="fill" android:src="@drawable/background"/>
</item>
<item>
<bitmap android:gravity="center" android:src="@drawable/splash"/>
</item> </item>
</layer-list> </layer-list>

View File

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/ic_launcher_background" /> <background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground" /> <foreground android:drawable="@drawable/ic_launcher_foreground"/>
<monochrome android:drawable="@mipmap/ic_launcher_monochrome" />
</adaptive-icon> </adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<color name="ic_launcher_background">#1F5B50</color> <color name="ic_launcher_background">#3D7BF4</color>
<color name="purple_200">#FFBB86FC</color> <color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color> <color name="purple_500">#FF6200EE</color>

View File

@ -5,7 +5,10 @@
<!-- Show a splash screen on the activity. Automatically removed when <!-- Show a splash screen on the activity. Automatically removed when
Flutter draws its first frame --> Flutter draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item> <item name="android:windowBackground">@drawable/launch_background</item>
<item name="android:forceDarkAllowed">false</item>
<item name="android:windowFullscreen">false</item> <item name="android:windowFullscreen">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
</style> </style>
<!-- Theme applied to the Android Window as soon as the process has started. <!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your This theme determines the color of the Android Window while your
@ -16,12 +19,10 @@
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar"> <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item> <item name="android:windowBackground">?android:colorBackground</item>
</style> </style>
<style name="Widget.Android.AppWidget.Container" parent="android:Widget"> <style name="Widget.Android.AppWidget.Container" parent="android:Widget">
<item name="android:id">@android:id/background</item> <item name="android:id">@android:id/background</item>
<item name="android:background">?android:attr/colorBackground</item> <item name="android:background">?android:attr/colorBackground</item>
</style> </style>
<style name="Widget.Android.AppWidget.InnerView" parent="android:Widget"> <style name="Widget.Android.AppWidget.InnerView" parent="android:Widget">
<item name="android:background">?android:attr/colorBackground</item> <item name="android:background">?android:attr/colorBackground</item>
<item name="android:textColor">?android:attr/textColorPrimary</item> <item name="android:textColor">?android:attr/textColorPrimary</item>

View File

@ -48,6 +48,6 @@ subprojects {
project.evaluationDependsOn(':app') project.evaluationDependsOn(':app')
} }
task clean(type: Delete) { tasks.register("clean", Delete) {
delete rootProject.buildDir delete rootProject.buildDir
} }

View File

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

View File

@ -1,4 +1,4 @@
org.gradle.jvmargs=-Xmx1536M org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
org.gradle.java.home=C:\Program Files\\Java\\jdk-14.0.2 org.gradle.java.home=C:\\Program Files\\Java\\jdk-14.0.2

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View File

@ -495,8 +495,8 @@
3127F7A028EAEDE300C2EFB3 /* Debug */ = { 3127F7A028EAEDE300C2EFB3 /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES; CLANG_ENABLE_OBJC_WEAK = YES;
@ -537,8 +537,8 @@
3127F7A128EAEDE300C2EFB3 /* Release */ = { 3127F7A128EAEDE300C2EFB3 /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES; CLANG_ENABLE_OBJC_WEAK = YES;
@ -577,8 +577,8 @@
3127F7A228EAEDE300C2EFB3 /* Profile */ = { 3127F7A228EAEDE300C2EFB3 /* Profile */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES; CLANG_ENABLE_OBJC_WEAK = YES;

Binary file not shown.

After

Width:  |  Height:  |  Size: 593 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 590 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 931 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 69 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -38,7 +38,7 @@
</scene> </scene>
</scenes> </scenes>
<resources> <resources>
<image name="LaunchImage" width="512" height="512"/> <image name="LaunchImage" width="500" height="500"/>
<image name="LaunchBackground" width="1080" height="1920"/> <image name="LaunchBackground" width="1" height="1"/>
</resources> </resources>
</document> </document>

View File

@ -1,9 +1,21 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
enum AccentColor { filc, blue, green, lime, yellow, orange, red, pink, purple, adaptive, custom } enum AccentColor {
filc,
blue,
green,
lime,
yellow,
orange,
red,
pink,
purple,
adaptive,
custom
}
Map<AccentColor, Color> accentColorMap = { Map<AccentColor, Color> accentColorMap = {
AccentColor.filc: const Color(0xff20AC9B), AccentColor.filc: Color.fromARGB(255, 61, 123, 244),
AccentColor.blue: Colors.blue.shade300, AccentColor.blue: Colors.blue.shade300,
AccentColor.green: Colors.green.shade400, AccentColor.green: Colors.green.shade400,
AccentColor.lime: Colors.lightGreen.shade400, AccentColor.lime: Colors.lightGreen.shade400,
@ -12,6 +24,6 @@ Map<AccentColor, Color> accentColorMap = {
AccentColor.red: Colors.red.shade300, AccentColor.red: Colors.red.shade300,
AccentColor.pink: Colors.pink.shade300, AccentColor.pink: Colors.pink.shade300,
AccentColor.purple: Colors.purple.shade300, AccentColor.purple: Colors.purple.shade300,
AccentColor.adaptive: const Color(0xff20AC9B), AccentColor.adaptive: const Color(0x003d7bf4),
AccentColor.custom: const Color(0xff20AC9B), AccentColor.custom: const Color(0x003d7bf4),
}; };

View File

@ -7,7 +7,8 @@ import 'package:filcnaplo/theme/colors/light_mobile.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class AppColors { class AppColors {
static ThemeAppColors of(BuildContext context) => fromBrightness(Theme.of(context).brightness); static ThemeAppColors of(BuildContext context) =>
fromBrightness(Theme.of(context).brightness);
static ThemeAppColors fromBrightness(Brightness brightness) { static ThemeAppColors fromBrightness(Brightness brightness) {
if (Platform.isAndroid || Platform.isIOS) { if (Platform.isAndroid || Platform.isIOS) {

View File

@ -19,11 +19,11 @@ class DarkMobileAppColors implements ThemeAppColors {
@override @override
final green = const Color(0xff32D74B); final green = const Color(0xff32D74B);
@override @override
final filc = const Color(0xff29826F); final filc = const Color(0x003d7bf4);
@override @override
final teal = const Color(0xff64D2FF); final teal = const Color(0xff64D2FF);
@override @override
final blue = const Color(0xff0A84FF); final blue = Color.fromARGB(255, 255, 10, 10);
@override @override
final indigo = const Color(0xff5E5CE6); final indigo = const Color(0xff5E5CE6);
@override @override

View File

@ -19,7 +19,7 @@ class LightMobileAppColors implements ThemeAppColors {
@override @override
final green = const Color(0xff34C759); final green = const Color(0xff34C759);
@override @override
final filc = const Color(0xff247665); final filc = const Color(0x003d7bf4);
@override @override
final teal = const Color(0xff5AC8FA); final teal = const Color(0xff5AC8FA);
@override @override

View File

@ -3,7 +3,7 @@ description: "Nem hivatalos e-napló alkalmazás az e-Kréta rendszerhez"
homepage: https://filcnaplo.hu homepage: https://filcnaplo.hu
publish_to: "none" publish_to: "none"
version: 3.5.0+193 version: 3.5.1+194
environment: environment:
sdk: ">=2.17.0 <3.0.0" sdk: ">=2.17.0 <3.0.0"
@ -25,9 +25,9 @@ dependencies:
flutter_localizations: flutter_localizations:
sdk: flutter sdk: flutter
i18n_extension: ^6.0.0 i18n_extension: ^9.0.0
sqflite: ^2.2.0+2 sqflite: ^2.2.0+2
intl: ^0.17.0 intl: ^0.18.0
provider: ^5.0.0 provider: ^5.0.0
http: ^0.13.3 http: ^0.13.3
uuid: ^3.0.4 uuid: ^3.0.4
@ -39,8 +39,8 @@ dependencies:
path_provider: ^2.0.2 path_provider: ^2.0.2
permission_handler: ^10.2.0 permission_handler: ^10.2.0
share_plus: ^5.0.0 share_plus: ^5.0.0
connectivity_plus: ^3.0.2 connectivity_plus: ^4.0.1
flutter_displaymode: ^0.4.0 flutter_displaymode: ^0.6.0
quick_actions: ^1.0.1 quick_actions: ^1.0.1
animated_list_plus: ^0.5.0 animated_list_plus: ^0.5.0
dynamic_color: ^1.2.2 dynamic_color: ^1.2.2
@ -67,12 +67,12 @@ dependencies:
image_crop: ^0.4.1 image_crop: ^0.4.1
animations: ^2.0.1 animations: ^2.0.1
background_fetch: ^1.1.5 background_fetch: ^1.1.5
flutter_local_notifications: ^13.0.0 flutter_local_notifications: ^14.1.0
dev_dependencies: dev_dependencies:
flutter_lints: ^2.0.1 flutter_lints: ^2.0.1
# flutter_launcher_icons: ^0.9.0 flutter_launcher_icons: "^0.13.1"
# flutter_native_splash: ^1.2.0 #flutter_native_splash: "^2.3.0"
sqflite_common_ffi: ^2.0.0+3 sqflite_common_ffi: ^2.0.0+3
flutter: flutter:
@ -149,14 +149,14 @@ flutter:
flutter_icons: flutter_icons:
image_path: "assets/icons/ic_launcher.png" image_path: "assets/icons/ic_launcher.png"
adaptive_icon_background: "#1F5B50" adaptive_icon_background: "#3D7BF4"
adaptive_icon_foreground: "assets/icons/ic_launcher_foreground.png" adaptive_icon_foreground: "assets/icons/ic_launcher_foreground.png"
android: true android: true
ios: true ios: true
remove_alpha_ios: true remove_alpha_ios: true
flutter_native_splash: flutter_native_splash:
color: "#1F5B50" color: "#3D7BF4"
image: "assets/icons/ic_splash.png" image: "assets/icons/ic_splash.png"
android: true android: true
android_gravity: center android_gravity: center

47
filcnaplo_desktop_ui/.gitignore vendored Normal file
View File

@ -0,0 +1,47 @@
# 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
pubspec.lock

View File

@ -50,7 +50,8 @@ class SettingsScreen extends StatefulWidget {
_SettingsScreenState createState() => _SettingsScreenState(); _SettingsScreenState createState() => _SettingsScreenState();
} }
class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProviderStateMixin { class _SettingsScreenState extends State<SettingsScreen>
with SingleTickerProviderStateMixin {
int devmodeCountdown = 3; int devmodeCountdown = 3;
final bool __ss = false; // secret settings final bool __ss = false; // secret settings
@ -90,11 +91,15 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
} }
accountTiles.add(AccountTile( accountTiles.add(AccountTile(
name: Text(!settings.presentationMode ? account.name : "Béla", style: const TextStyle(fontWeight: FontWeight.w500)), name: Text(!settings.presentationMode ? account.name : "Béla",
username: Text(!settings.presentationMode ? account.username : "72469696969"), style: const TextStyle(fontWeight: FontWeight.w500)),
username:
Text(!settings.presentationMode ? account.username : "72469696969"),
profileImage: ProfileImage( profileImage: ProfileImage(
name: _firstName, name: _firstName,
backgroundColor: !settings.presentationMode ? ColorUtils.stringToColor(account.name) : Theme.of(context).colorScheme.secondary, backgroundColor: !settings.presentationMode
? ColorUtils.stringToColor(account.name)
: Theme.of(context).colorScheme.secondary,
role: account.role, role: account.role,
), ),
onTap: () { onTap: () {
@ -133,7 +138,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
]); ]);
} }
void _openDKT(User u) => tabs.launch("https://dkttanulo.e-kreta.hu/sso?id_token=${kretaClient.idToken}", void _openDKT(User u) => tabs.launch(
"https://dkttanulo.e-kreta.hu/sso?id_token=${kretaClient.idToken}",
customTabsOption: tabs.CustomTabsOption( customTabsOption: tabs.CustomTabsOption(
toolbarColor: Theme.of(context).scaffoldBackgroundColor, toolbarColor: Theme.of(context).scaffoldBackgroundColor,
showPageTitle: true, showPageTitle: true,
@ -142,7 +148,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_hideContainersController = AnimationController(vsync: this, duration: const Duration(milliseconds: 200)); _hideContainersController = AnimationController(
vsync: this, duration: const Duration(milliseconds: 200));
} }
@override @override
@ -159,8 +166,14 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
firstName = "Béla"; firstName = "Béla";
} }
String startPageTitle = SettingsHelper.localizedPageTitles()[settings.startPage] ?? "?"; String startPageTitle =
String themeModeText = {ThemeMode.light: "light".i18n, ThemeMode.dark: "dark".i18n, ThemeMode.system: "system".i18n}[settings.theme] ?? "?"; SettingsHelper.localizedPageTitles()[settings.startPage] ?? "?";
String themeModeText = {
ThemeMode.light: "light".i18n,
ThemeMode.dark: "dark".i18n,
ThemeMode.system: "system".i18n
}[settings.theme] ??
"?";
String languageText = SettingsHelper.langMap[settings.language] ?? "?"; String languageText = SettingsHelper.langMap[settings.language] ?? "?";
String vibrateTitle = { String vibrateTitle = {
VibrationStrength.off: "voff".i18n, VibrationStrength.off: "voff".i18n,
@ -200,7 +213,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// Updates // Updates
if (updateProvider.available) if (updateProvider.available)
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel( child: Panel(
child: PanelButton( child: PanelButton(
onPressed: () => _openUpdates(context), onPressed: () => _openUpdates(context),
@ -210,7 +224,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
updateProvider.releases.first.tag, updateProvider.releases.first.tag,
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
color: Theme.of(context).colorScheme.secondary, color:
Theme.of(context).colorScheme.secondary,
), ),
), ),
), ),
@ -231,7 +246,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// General Settings // General Settings
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel( child: Panel(
title: Text("general".i18n), title: Text("general".i18n),
child: Column( child: Column(
@ -261,7 +277,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
}, },
title: Text("rounding".i18n), title: Text("rounding".i18n),
leading: const Icon(FeatherIcons.gitCommit), leading: const Icon(FeatherIcons.gitCommit),
trailing: Text((settings.rounding / 10).toStringAsFixed(1)), trailing: Text((settings.rounding / 10)
.toStringAsFixed(1)),
), ),
PanelButton( PanelButton(
onPressed: () { onPressed: () {
@ -280,16 +297,27 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
}, },
title: Text( title: Text(
"bell_delay".i18n, "bell_delay".i18n,
style: TextStyle(color: AppColors.of(context).text.withOpacity(settings.bellDelayEnabled ? 1.0 : .5)), style: TextStyle(
color: AppColors.of(context)
.text
.withOpacity(
settings.bellDelayEnabled
? 1.0
: .5)),
), ),
leading: settings.bellDelayEnabled leading: settings.bellDelayEnabled
? const Icon(FeatherIcons.bell) ? const Icon(FeatherIcons.bell)
: Icon(FeatherIcons.bellOff, color: AppColors.of(context).text.withOpacity(.25)), : Icon(FeatherIcons.bellOff,
color: AppColors.of(context)
.text
.withOpacity(.25)),
trailingDivider: true, trailingDivider: true,
trailing: Switch( trailing: Switch(
onChanged: (v) => settings.update(bellDelayEnabled: v), onChanged: (v) =>
settings.update(bellDelayEnabled: v),
value: settings.bellDelayEnabled, value: settings.bellDelayEnabled,
activeColor: Theme.of(context).colorScheme.secondary, activeColor:
Theme.of(context).colorScheme.secondary,
), ),
), ),
], ],
@ -299,18 +327,23 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
if (kDebugMode) if (kDebugMode)
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel( child: Panel(
title: const Text("Debug"), title: const Text("Debug"),
child: Column( child: Column(
children: [ children: [
PanelButton( PanelButton(
title: const Text("Subject Icon Gallery"), title: const Text("Subject Icon Gallery"),
leading: const Icon(CupertinoIcons.rectangle_3_offgrid_fill), leading: const Icon(CupertinoIcons
.rectangle_3_offgrid_fill),
trailing: const Icon(Icons.arrow_forward), trailing: const Icon(Icons.arrow_forward),
onPressed: () { onPressed: () {
Navigator.of(context, rootNavigator: true).push( Navigator.of(context, rootNavigator: true)
CupertinoPageRoute(builder: (context) => const SubjectIconGallery()), .push(
CupertinoPageRoute(
builder: (context) =>
const SubjectIconGallery()),
); );
}, },
) )
@ -322,7 +355,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// Secret Settings // Secret Settings
if (__ss) if (__ss)
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel( child: Panel(
title: Text("secret".i18n), title: Text("secret".i18n),
child: Column( child: Column(
@ -331,9 +365,14 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
Material( Material(
type: MaterialType.transparency, type: MaterialType.transparency,
child: SwitchListTile( child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0), contentPadding:
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), const EdgeInsets.only(left: 12.0),
title: Text("goodstudent".i18n, style: const TextStyle(fontWeight: FontWeight.w500)), shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
title: Text("goodstudent".i18n,
style: const TextStyle(
fontWeight: FontWeight.w500)),
onChanged: (v) { onChanged: (v) {
if (v) { if (v) {
showDialog( showDialog(
@ -341,16 +380,26 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
builder: (context) => WillPopScope( builder: (context) => WillPopScope(
onWillPop: () async => false, onWillPop: () async => false,
child: AlertDialog( child: AlertDialog(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(
12.0)),
title: Text("attention".i18n), title: Text("attention".i18n),
content: Text("goodstudent_disclaimer".i18n), content: Text(
"goodstudent_disclaimer"
.i18n),
actions: [ actions: [
ActionButton( ActionButton(
label: "understand".i18n, label: "understand".i18n,
onTap: () { onTap: () {
Navigator.of(context).pop(); Navigator.of(context)
settings.update(goodStudent: v); .pop();
Provider.of<GradeProvider>(context, listen: false).fetch(); settings.update(
goodStudent: v);
Provider.of<GradeProvider>(
context,
listen: false)
.fetch();
}) })
], ],
), ),
@ -358,11 +407,15 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
); );
} else { } else {
settings.update(goodStudent: v); settings.update(goodStudent: v);
Provider.of<GradeProvider>(context, listen: false).fetch(); Provider.of<GradeProvider>(context,
listen: false)
.fetch();
} }
}, },
value: settings.goodStudent, value: settings.goodStudent,
activeColor: Theme.of(context).colorScheme.secondary, activeColor: Theme.of(context)
.colorScheme
.secondary,
), ),
), ),
@ -370,12 +423,20 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
Material( Material(
type: MaterialType.transparency, type: MaterialType.transparency,
child: SwitchListTile( child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0), contentPadding:
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), const EdgeInsets.only(left: 12.0),
title: const Text("Presentation Mode", style: TextStyle(fontWeight: FontWeight.w500)), shape: RoundedRectangleBorder(
onChanged: (v) => settings.update(presentationMode: v), borderRadius:
BorderRadius.circular(12.0)),
title: const Text("Presentation Mode",
style: TextStyle(
fontWeight: FontWeight.w500)),
onChanged: (v) =>
settings.update(presentationMode: v),
value: settings.presentationMode, value: settings.presentationMode,
activeColor: Theme.of(context).colorScheme.secondary, activeColor: Theme.of(context)
.colorScheme
.secondary,
), ),
), ),
], ],
@ -385,7 +446,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// Theme Settings // Theme Settings
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel( child: Panel(
title: Text("appearance".i18n), title: Text("appearance".i18n),
child: Column( child: Column(
@ -412,7 +474,9 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
width: 12.0, width: 12.0,
height: 12.0, height: 12.0,
decoration: BoxDecoration( decoration: BoxDecoration(
color: Theme.of(context).colorScheme.secondary, color: Theme.of(context)
.colorScheme
.secondary,
shape: BoxShape.circle, shape: BoxShape.circle,
), ),
), ),
@ -429,7 +493,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
children: List.generate( children: List.generate(
5, 5,
(i) => Container( (i) => Container(
margin: const EdgeInsets.only(left: 2.0), margin:
const EdgeInsets.only(left: 2.0),
width: 12.0, width: 12.0,
height: 12.0, height: 12.0,
decoration: BoxDecoration( decoration: BoxDecoration(
@ -443,15 +508,22 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
Material( Material(
type: MaterialType.transparency, type: MaterialType.transparency,
child: SwitchListTile( child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0), contentPadding:
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
title: Row( title: Row(
children: [ children: [
Icon( Icon(
FeatherIcons.barChart, FeatherIcons.barChart,
color: settings.graphClassAvg color: settings.graphClassAvg
? Theme.of(context).colorScheme.secondary ? Theme.of(context)
: AppColors.of(context).text.withOpacity(.25), .colorScheme
.secondary
: AppColors.of(context)
.text
.withOpacity(.25),
), ),
const SizedBox(width: 24.0), const SizedBox(width: 24.0),
Expanded( Expanded(
@ -460,15 +532,22 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: 16.0, fontSize: 16.0,
color: AppColors.of(context).text.withOpacity(settings.graphClassAvg ? 1.0 : .5), color: AppColors.of(context)
.text
.withOpacity(
settings.graphClassAvg
? 1.0
: .5),
), ),
), ),
), ),
], ],
), ),
onChanged: (v) => settings.update(graphClassAvg: v), onChanged: (v) =>
settings.update(graphClassAvg: v),
value: settings.graphClassAvg, value: settings.graphClassAvg,
activeColor: Theme.of(context).colorScheme.secondary, activeColor:
Theme.of(context).colorScheme.secondary,
), ),
), ),
const PremiumIconPackSelector(), const PremiumIconPackSelector(),
@ -479,21 +558,28 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// Notifications // Notifications
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel( child: Panel(
title: Text("notifications".i18n), title: Text("notifications".i18n),
child: Material( child: Material(
type: MaterialType.transparency, type: MaterialType.transparency,
child: SwitchListTile( child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0), contentPadding:
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0)),
title: Row( title: Row(
children: [ children: [
Icon( Icon(
Icons.newspaper_outlined, Icons.newspaper_outlined,
color: settings.newsEnabled color: settings.newsEnabled
? Theme.of(context).colorScheme.secondary ? Theme.of(context)
: AppColors.of(context).text.withOpacity(.25), .colorScheme
.secondary
: AppColors.of(context)
.text
.withOpacity(.25),
), ),
const SizedBox(width: 24.0), const SizedBox(width: 24.0),
Expanded( Expanded(
@ -502,15 +588,21 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: 16.0, fontSize: 16.0,
color: AppColors.of(context).text.withOpacity(settings.newsEnabled ? 1.0 : .5), color: AppColors.of(context)
.text
.withOpacity(settings.newsEnabled
? 1.0
: .5),
), ),
), ),
), ),
], ],
), ),
onChanged: (v) => settings.update(newsEnabled: v), onChanged: (v) =>
settings.update(newsEnabled: v),
value: settings.newsEnabled, value: settings.newsEnabled,
activeColor: Theme.of(context).colorScheme.secondary, activeColor:
Theme.of(context).colorScheme.secondary,
), ),
), ),
), ),
@ -518,22 +610,30 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// Extras // Extras
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel( child: Panel(
title: Text("extras".i18n), title: Text("extras".i18n),
child: Column(children: [ child: Column(children: [
Material( Material(
type: MaterialType.transparency, type: MaterialType.transparency,
child: SwitchListTile( child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0), contentPadding:
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
title: Row( title: Row(
children: [ children: [
Icon( Icon(
FeatherIcons.gift, FeatherIcons.gift,
color: settings.gradeOpeningFun color: settings.gradeOpeningFun
? Theme.of(context).colorScheme.secondary ? Theme.of(context)
: AppColors.of(context).text.withOpacity(.25), .colorScheme
.secondary
: AppColors.of(context)
.text
.withOpacity(.25),
), ),
const SizedBox(width: 24.0), const SizedBox(width: 24.0),
Expanded( Expanded(
@ -542,15 +642,22 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: 16.0, fontSize: 16.0,
color: AppColors.of(context).text.withOpacity(settings.gradeOpeningFun ? 1.0 : .5), color: AppColors.of(context)
.text
.withOpacity(
settings.gradeOpeningFun
? 1.0
: .5),
), ),
), ),
), ),
], ],
), ),
onChanged: (v) => settings.update(gradeOpeningFun: v), onChanged: (v) =>
settings.update(gradeOpeningFun: v),
value: settings.gradeOpeningFun, value: settings.gradeOpeningFun,
activeColor: Theme.of(context).colorScheme.secondary, activeColor:
Theme.of(context).colorScheme.secondary,
), ),
), ),
]), ]),
@ -559,24 +666,31 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// About // About
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel( child: Panel(
title: Text("about".i18n), title: Text("about".i18n),
child: Column(children: [ child: Column(children: [
PanelButton( PanelButton(
leading: const Icon(FeatherIcons.atSign), leading: const Icon(FeatherIcons.atSign),
title: const Text("Discord"), title: const Text("Discord"),
onPressed: () => launchUrl(Uri.parse("https://filcnaplo.hu/discord"), mode: LaunchMode.externalApplication), onPressed: () => launchUrl(
Uri.parse("https://filcnaplo.hu/discord"),
mode: LaunchMode.externalApplication),
), ),
PanelButton( PanelButton(
leading: const Icon(FeatherIcons.globe), leading: const Icon(FeatherIcons.globe),
title: const Text("www.filcnaplo.hu"), title: const Text("www.filcnaplo.hu"),
onPressed: () => launchUrl(Uri.parse("https://filcnaplo.hu"), mode: LaunchMode.externalApplication), onPressed: () => launchUrl(
Uri.parse("https://filcnaplo.hu"),
mode: LaunchMode.externalApplication),
), ),
PanelButton( PanelButton(
leading: const Icon(FeatherIcons.github), leading: const Icon(FeatherIcons.github),
title: const Text("Github"), title: const Text("Github"),
onPressed: () => launchUrl(Uri.parse("https://github.com/filc"), mode: LaunchMode.externalApplication), onPressed: () => launchUrl(
Uri.parse("https://github.com/filc"),
mode: LaunchMode.externalApplication),
), ),
PanelButton( PanelButton(
leading: const Icon(FeatherIcons.mail), leading: const Icon(FeatherIcons.mail),
@ -591,36 +705,59 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
PanelButton( PanelButton(
leading: const Icon(FeatherIcons.award), leading: const Icon(FeatherIcons.award),
title: Text("licenses".i18n), title: Text("licenses".i18n),
onPressed: () => showLicensePage(context: context), onPressed: () =>
showLicensePage(context: context),
), ),
Tooltip( Tooltip(
message: "data_collected".i18n, message: "data_collected".i18n,
padding: const EdgeInsets.all(4.0), padding: const EdgeInsets.all(4.0),
textStyle: TextStyle(fontWeight: FontWeight.w500, color: AppColors.of(context).text), textStyle: TextStyle(
decoration: BoxDecoration(color: Theme.of(context).colorScheme.background), fontWeight: FontWeight.w500,
color: AppColors.of(context).text),
decoration: BoxDecoration(
color: Theme.of(context)
.colorScheme
.background),
child: Material( child: Material(
type: MaterialType.transparency, type: MaterialType.transparency,
child: SwitchListTile( child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0), contentPadding:
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
secondary: Icon( secondary: Icon(
FeatherIcons.barChart2, FeatherIcons.barChart2,
color: settings.xFilcId != "none" color: settings.xFilcId != "none"
? Theme.of(context).colorScheme.secondary ? Theme.of(context)
: AppColors.of(context).text.withOpacity(.25), .colorScheme
.secondary
: AppColors.of(context)
.text
.withOpacity(.25),
), ),
title: Text( title: Text(
"Analytics".i18n, "Analytics".i18n,
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: 16.0, fontSize: 16.0,
color: AppColors.of(context).text.withOpacity(settings.xFilcId != "none" ? 1.0 : .5), color: AppColors.of(context)
.text
.withOpacity(
settings.xFilcId != "none"
? 1.0
: .5),
), ),
), ),
subtitle: Text( subtitle: Text(
"Anonymous Usage Analytics".i18n, "Anonymous Usage Analytics".i18n,
style: TextStyle( style: TextStyle(
color: AppColors.of(context).text.withOpacity(settings.xFilcId != "none" ? .5 : .2), color: AppColors.of(context)
.text
.withOpacity(
settings.xFilcId != "none"
? .5
: .2),
), ),
), ),
onChanged: (v) { onChanged: (v) {
@ -628,14 +765,17 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
if (v == false) { if (v == false) {
newId = "none"; newId = "none";
} else if (settings.xFilcId == "none") { } else if (settings.xFilcId == "none") {
newId = SettingsProvider.defaultSettings().xFilcId; newId =
SettingsProvider.defaultSettings()
.xFilcId;
} else { } else {
newId = settings.xFilcId; newId = settings.xFilcId;
} }
settings.update(xFilcId: newId); settings.update(xFilcId: newId);
}, },
value: settings.xFilcId != "none", value: settings.xFilcId != "none",
activeColor: Theme.of(context).colorScheme.secondary, activeColor:
Theme.of(context).colorScheme.secondary,
), ),
), ),
), ),
@ -644,7 +784,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
), ),
if (settings.developerMode) if (settings.developerMode)
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel( child: Panel(
title: const Text("Developer Settings"), title: const Text("Developer Settings"),
child: Column( child: Column(
@ -652,28 +793,48 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
Material( Material(
type: MaterialType.transparency, type: MaterialType.transparency,
child: SwitchListTile( child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0), contentPadding:
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), const EdgeInsets.only(left: 12.0),
title: const Text("Developer Mode", style: TextStyle(fontWeight: FontWeight.w500)), shape: RoundedRectangleBorder(
onChanged: (v) => settings.update(developerMode: false), borderRadius:
BorderRadius.circular(12.0)),
title: const Text("Developer Mode",
style: TextStyle(
fontWeight: FontWeight.w500)),
onChanged: (v) =>
settings.update(developerMode: false),
value: settings.developerMode, value: settings.developerMode,
activeColor: Theme.of(context).colorScheme.secondary, activeColor: Theme.of(context)
.colorScheme
.secondary,
), ),
), ),
PanelButton( PanelButton(
leading: const Icon(FeatherIcons.copy), leading: const Icon(FeatherIcons.copy),
title: const Text("Copy JWT"), title: const Text("Copy JWT"),
onPressed: () => onPressed: () => Clipboard.setData(
Clipboard.setData(ClipboardData(text: Provider.of<KretaClient>(context, listen: false).accessToken)), ClipboardData(
text: Provider.of<KretaClient>(
context,
listen: false)
.accessToken!)),
), ),
if (Provider.of<PremiumProvider>(context, listen: false).hasPremium) if (Provider.of<PremiumProvider>(context,
listen: false)
.hasPremium)
PanelButton( PanelButton(
leading: const Icon(FeatherIcons.key), leading: const Icon(FeatherIcons.key),
title: const Text("Remove Premium"), title: const Text("Remove Premium"),
onPressed: () { onPressed: () {
Provider.of<PremiumProvider>(context, listen: false).activate(removePremium: true); Provider.of<PremiumProvider>(context,
settings.update(accentColor: AccentColor.filc, store: true); listen: false)
Provider.of<ThemeModeObserver>(context, listen: false).changeTheme(settings.theme); .activate(removePremium: true);
settings.update(
accentColor: AccentColor.filc,
store: true);
Provider.of<ThemeModeObserver>(context,
listen: false)
.changeTheme(settings.theme);
}, },
), ),
], ],
@ -684,18 +845,25 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
top: false, top: false,
child: Center( child: Center(
child: GestureDetector( child: GestureDetector(
child: const Panel(title: Text("v" + String.fromEnvironment("APPVER", defaultValue: "?"))), child: const Panel(
title: Text("v" +
String.fromEnvironment("APPVER",
defaultValue: "?"))),
onTap: () { onTap: () {
if (devmodeCountdown > 0) { if (devmodeCountdown > 0) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar( ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(
duration: const Duration(milliseconds: 200), duration: const Duration(milliseconds: 200),
content: Text("You are $devmodeCountdown taps away from Developer Mode."), content: Text(
"You are $devmodeCountdown taps away from Developer Mode."),
)); ));
setState(() => devmodeCountdown--); setState(() => devmodeCountdown--);
} else if (devmodeCountdown == 0) { } else if (devmodeCountdown == 0) {
ScaffoldMessenger.of(context).showSnackBar(const SnackBar( ScaffoldMessenger.of(context)
content: Text("Developer Mode successfully activated."), .showSnackBar(const SnackBar(
content: Text(
"Developer Mode successfully activated."),
)); ));
settings.update(developerMode: true); settings.update(developerMode: true);
@ -719,7 +887,9 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
} }
void _openNews(BuildContext context) => void _openNews(BuildContext context) =>
Navigator.of(context, rootNavigator: true).push(CupertinoPageRoute(builder: (context) => const NewsScreen())); Navigator.of(context, rootNavigator: true)
void _openUpdates(BuildContext context) => UpdateView.show(updateProvider.releases.first, context: context); .push(CupertinoPageRoute(builder: (context) => const NewsScreen()));
void _openUpdates(BuildContext context) =>
UpdateView.show(updateProvider.releases.first, context: context);
void _openPrivacy(BuildContext context) => PrivacyView.show(context); void _openPrivacy(BuildContext context) => PrivacyView.show(context);
} }

View File

@ -0,0 +1,11 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "pub" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "daily"

47
filcnaplo_kreta_api/.gitignore vendored Normal file
View File

@ -0,0 +1,47 @@
# 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
pubspec.lock

View File

@ -0,0 +1,11 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "pub" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "daily"

47
filcnaplo_mobile_ui/.gitignore vendored Normal file
View File

@ -0,0 +1,47 @@
# 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
pubspec.lock

View File

@ -55,7 +55,8 @@ class SettingsScreen extends StatefulWidget {
_SettingsScreenState createState() => _SettingsScreenState(); _SettingsScreenState createState() => _SettingsScreenState();
} }
class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProviderStateMixin { class _SettingsScreenState extends State<SettingsScreen>
with SingleTickerProviderStateMixin {
int devmodeCountdown = 3; int devmodeCountdown = 3;
bool __ss = false; // secret settings bool __ss = false; // secret settings
@ -95,11 +96,15 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
} }
accountTiles.add(AccountTile( accountTiles.add(AccountTile(
name: Text(!settings.presentationMode ? account.name : "Béla", style: const TextStyle(fontWeight: FontWeight.w500)), name: Text(!settings.presentationMode ? account.name : "Béla",
username: Text(!settings.presentationMode ? account.username : "72469696969"), style: const TextStyle(fontWeight: FontWeight.w500)),
username:
Text(!settings.presentationMode ? account.username : "72469696969"),
profileImage: ProfileImage( profileImage: ProfileImage(
name: _firstName, name: _firstName,
backgroundColor: !settings.presentationMode ? ColorUtils.stringToColor(account.name) : Theme.of(context).colorScheme.secondary, backgroundColor: !settings.presentationMode
? ColorUtils.stringToColor(account.name)
: Theme.of(context).colorScheme.secondary,
role: account.role, role: account.role,
), ),
onTap: () { onTap: () {
@ -139,7 +144,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
]); ]);
} }
void _openDKT(User u) => tabs.launch("https://dkttanulo.e-kreta.hu/sso?id_token=${kretaClient.idToken}", void _openDKT(User u) => tabs.launch(
"https://dkttanulo.e-kreta.hu/sso?id_token=${kretaClient.idToken}",
customTabsOption: tabs.CustomTabsOption( customTabsOption: tabs.CustomTabsOption(
toolbarColor: Theme.of(context).scaffoldBackgroundColor, toolbarColor: Theme.of(context).scaffoldBackgroundColor,
showPageTitle: true, showPageTitle: true,
@ -148,7 +154,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_hideContainersController = AnimationController(vsync: this, duration: const Duration(milliseconds: 200)); _hideContainersController = AnimationController(
vsync: this, duration: const Duration(milliseconds: 200));
} }
@override @override
@ -165,8 +172,14 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
firstName = "Béla"; firstName = "Béla";
} }
String startPageTitle = SettingsHelper.localizedPageTitles()[settings.startPage] ?? "?"; String startPageTitle =
String themeModeText = {ThemeMode.light: "light".i18n, ThemeMode.dark: "dark".i18n, ThemeMode.system: "system".i18n}[settings.theme] ?? "?"; SettingsHelper.localizedPageTitles()[settings.startPage] ?? "?";
String themeModeText = {
ThemeMode.light: "light".i18n,
ThemeMode.dark: "dark".i18n,
ThemeMode.system: "system".i18n
}[settings.theme] ??
"?";
String languageText = SettingsHelper.langMap[settings.language] ?? "?"; String languageText = SettingsHelper.langMap[settings.language] ?? "?";
String vibrateTitle = { String vibrateTitle = {
VibrationStrength.off: "voff".i18n, VibrationStrength.off: "voff".i18n,
@ -193,15 +206,18 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
children: [ children: [
IconButton( IconButton(
splashRadius: 32.0, splashRadius: 32.0,
onPressed: () => _showBottomSheet(user.getUser(user.id ?? "")), onPressed: () =>
icon: Icon(FeatherIcons.moreVertical, color: AppColors.of(context).text.withOpacity(0.8)), _showBottomSheet(user.getUser(user.id ?? "")),
icon: Icon(FeatherIcons.moreVertical,
color: AppColors.of(context).text.withOpacity(0.8)),
), ),
IconButton( IconButton(
splashRadius: 26.0, splashRadius: 26.0,
onPressed: () { onPressed: () {
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },
icon: Icon(FeatherIcons.x, color: AppColors.of(context).text.withOpacity(0.8)), icon: Icon(FeatherIcons.x,
color: AppColors.of(context).text.withOpacity(0.8)),
), ),
], ],
), ),
@ -216,8 +232,9 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
badge: updateProvider.available, badge: updateProvider.available,
role: user.role, role: user.role,
profilePictureString: user.picture, profilePictureString: user.picture,
backgroundColor: backgroundColor: !settings.presentationMode
!settings.presentationMode ? ColorUtils.stringToColor(user.displayName ?? "?") : Theme.of(context).colorScheme.secondary, ? ColorUtils.stringToColor(user.displayName ?? "?")
: Theme.of(context).colorScheme.secondary,
), ),
), ),
@ -227,18 +244,24 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
onTap: () => _showBottomSheet(user.getUser(user.id ?? "")), onTap: () => _showBottomSheet(user.getUser(user.id ?? "")),
onDoubleTap: () => setState(() => __ss = true), onDoubleTap: () => setState(() => __ss = true),
child: Text( child: Text(
!settings.presentationMode ? (user.displayName ?? "?") : "Béla", !settings.presentationMode
? (user.displayName ?? "?")
: "Béla",
maxLines: 1, maxLines: 1,
softWrap: false, softWrap: false,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.w600, color: AppColors.of(context).text), style: TextStyle(
fontSize: 20.0,
fontWeight: FontWeight.w600,
color: AppColors.of(context).text),
), ),
), ),
), ),
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), padding:
const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
child: Panel( child: Panel(
child: Column( child: Column(
children: [ children: [
@ -261,7 +284,9 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// Account settings // Account settings
PanelButton( PanelButton(
onPressed: () { onPressed: () {
Navigator.of(context).pushNamed("login_back").then((value) { Navigator.of(context)
.pushNamed("login_back")
.then((value) {
setSystemChrome(context); setSystemChrome(context);
}); });
}, },
@ -275,18 +300,24 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// Delete User // Delete User
user.removeUser(userId); user.removeUser(userId);
await Provider.of<DatabaseProvider>(context, listen: false).store.removeUser(userId); await Provider.of<DatabaseProvider>(context,
listen: false)
.store
.removeUser(userId);
// If no other Users left, go back to LoginScreen // If no other Users left, go back to LoginScreen
if (user.getUsers().isNotEmpty) { if (user.getUsers().isNotEmpty) {
user.setUser(user.getUsers().first.id); user.setUser(user.getUsers().first.id);
restore().then((_) => user.setUser(user.getUsers().first.id)); restore().then(
(_) => user.setUser(user.getUsers().first.id));
} else { } else {
Navigator.of(context).pushNamedAndRemoveUntil("login", (_) => false); Navigator.of(context)
.pushNamedAndRemoveUntil("login", (_) => false);
} }
}, },
title: Text("log_out".i18n), title: Text("log_out".i18n),
leading: Icon(FeatherIcons.logOut, color: AppColors.of(context).red), leading: Icon(FeatherIcons.logOut,
color: AppColors.of(context).red),
), ),
], ],
), ),
@ -296,7 +327,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// Updates // Updates
if (updateProvider.available) if (updateProvider.available)
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel( child: Panel(
child: PanelButton( child: PanelButton(
onPressed: () => _openUpdates(context), onPressed: () => _openUpdates(context),
@ -332,7 +364,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// General Settings // General Settings
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), padding:
const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
child: Panel( child: Panel(
title: Text("general".i18n), title: Text("general".i18n),
child: Column( child: Column(
@ -362,7 +395,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
}, },
title: Text("rounding".i18n), title: Text("rounding".i18n),
leading: const Icon(FeatherIcons.gitCommit), leading: const Icon(FeatherIcons.gitCommit),
trailing: Text((settings.rounding / 10).toStringAsFixed(1)), trailing:
Text((settings.rounding / 10).toStringAsFixed(1)),
), ),
PanelButton( PanelButton(
onPressed: () { onPressed: () {
@ -381,11 +415,15 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
}, },
title: Text( title: Text(
"bell_delay".i18n, "bell_delay".i18n,
style: TextStyle(color: AppColors.of(context).text.withOpacity(settings.bellDelayEnabled ? 1.0 : .5)), style: TextStyle(
color: AppColors.of(context).text.withOpacity(
settings.bellDelayEnabled ? 1.0 : .5)),
), ),
leading: settings.bellDelayEnabled leading: settings.bellDelayEnabled
? const Icon(FeatherIcons.bell) ? const Icon(FeatherIcons.bell)
: Icon(FeatherIcons.bellOff, color: AppColors.of(context).text.withOpacity(.25)), : Icon(FeatherIcons.bellOff,
color:
AppColors.of(context).text.withOpacity(.25)),
trailingDivider: true, trailingDivider: true,
trailing: Switch( trailing: Switch(
onChanged: (v) => settings.update(bellDelayEnabled: v), onChanged: (v) => settings.update(bellDelayEnabled: v),
@ -400,18 +438,22 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
if (kDebugMode) if (kDebugMode)
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel( child: Panel(
title: const Text("Debug"), title: const Text("Debug"),
child: Column( child: Column(
children: [ children: [
PanelButton( PanelButton(
title: const Text("Subject Icon Gallery"), title: const Text("Subject Icon Gallery"),
leading: const Icon(CupertinoIcons.rectangle_3_offgrid_fill), leading:
const Icon(CupertinoIcons.rectangle_3_offgrid_fill),
trailing: const Icon(Icons.arrow_forward), trailing: const Icon(Icons.arrow_forward),
onPressed: () { onPressed: () {
Navigator.of(context, rootNavigator: true).push( Navigator.of(context, rootNavigator: true).push(
CupertinoPageRoute(builder: (context) => const SubjectIconGallery()), CupertinoPageRoute(
builder: (context) =>
const SubjectIconGallery()),
); );
}, },
) )
@ -423,7 +465,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// Secret Settings // Secret Settings
if (__ss) if (__ss)
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel( child: Panel(
title: Text("secret".i18n), title: Text("secret".i18n),
child: Column( child: Column(
@ -433,8 +476,11 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
type: MaterialType.transparency, type: MaterialType.transparency,
child: SwitchListTile( child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0), contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), shape: RoundedRectangleBorder(
title: Text("goodstudent".i18n, style: const TextStyle(fontWeight: FontWeight.w500)), borderRadius: BorderRadius.circular(12.0)),
title: Text("goodstudent".i18n,
style:
const TextStyle(fontWeight: FontWeight.w500)),
onChanged: (v) { onChanged: (v) {
if (v) { if (v) {
showDialog( showDialog(
@ -442,16 +488,21 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
builder: (context) => WillPopScope( builder: (context) => WillPopScope(
onWillPop: () async => false, onWillPop: () async => false,
child: AlertDialog( child: AlertDialog(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
title: Text("attention".i18n), title: Text("attention".i18n),
content: Text("goodstudent_disclaimer".i18n), content:
Text("goodstudent_disclaimer".i18n),
actions: [ actions: [
ActionButton( ActionButton(
label: "understand".i18n, label: "understand".i18n,
onTap: () { onTap: () {
Navigator.of(context).pop(); Navigator.of(context).pop();
settings.update(goodStudent: v); settings.update(goodStudent: v);
Provider.of<GradeProvider>(context, listen: false).convertBySettings(); Provider.of<GradeProvider>(context,
listen: false)
.convertBySettings();
}) })
], ],
), ),
@ -459,7 +510,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
); );
} else { } else {
settings.update(goodStudent: v); settings.update(goodStudent: v);
Provider.of<GradeProvider>(context, listen: false).convertBySettings(); Provider.of<GradeProvider>(context, listen: false)
.convertBySettings();
} }
}, },
value: settings.goodStudent, value: settings.goodStudent,
@ -472,9 +524,12 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
type: MaterialType.transparency, type: MaterialType.transparency,
child: SwitchListTile( child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0), contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), shape: RoundedRectangleBorder(
title: const Text("Presentation Mode", style: TextStyle(fontWeight: FontWeight.w500)), borderRadius: BorderRadius.circular(12.0)),
onChanged: (v) => settings.update(presentationMode: v), title: const Text("Presentation Mode",
style: TextStyle(fontWeight: FontWeight.w500)),
onChanged: (v) =>
settings.update(presentationMode: v),
value: settings.presentationMode, value: settings.presentationMode,
activeColor: Theme.of(context).colorScheme.secondary, activeColor: Theme.of(context).colorScheme.secondary,
), ),
@ -486,7 +541,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// Theme Settings // Theme Settings
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), padding:
const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
child: Panel( child: Panel(
title: Text("appearance".i18n), title: Text("appearance".i18n),
child: Column( child: Column(
@ -545,12 +601,15 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
type: MaterialType.transparency, type: MaterialType.transparency,
child: SwitchListTile( child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0), contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0)),
title: Row( title: Row(
children: [ children: [
Icon( Icon(
FeatherIcons.barChart, FeatherIcons.barChart,
color: settings.graphClassAvg ? Theme.of(context).colorScheme.secondary : AppColors.of(context).text.withOpacity(.25), color: settings.graphClassAvg
? Theme.of(context).colorScheme.secondary
: AppColors.of(context).text.withOpacity(.25),
), ),
const SizedBox(width: 24.0), const SizedBox(width: 24.0),
Expanded( Expanded(
@ -559,7 +618,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: 16.0, fontSize: 16.0,
color: AppColors.of(context).text.withOpacity(settings.graphClassAvg ? 1.0 : .5), color: AppColors.of(context).text.withOpacity(
settings.graphClassAvg ? 1.0 : .5),
), ),
), ),
), ),
@ -578,19 +638,23 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// Notifications // Notifications
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), padding:
const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
child: Panel( child: Panel(
title: Text("notifications".i18n), title: Text("notifications".i18n),
child: Material( child: Material(
type: MaterialType.transparency, type: MaterialType.transparency,
child: SwitchListTile( child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0), contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0)),
title: Row( title: Row(
children: [ children: [
Icon( Icon(
Icons.newspaper_outlined, Icons.newspaper_outlined,
color: settings.newsEnabled ? Theme.of(context).colorScheme.secondary : AppColors.of(context).text.withOpacity(.25), color: settings.newsEnabled
? Theme.of(context).colorScheme.secondary
: AppColors.of(context).text.withOpacity(.25),
), ),
const SizedBox(width: 24.0), const SizedBox(width: 24.0),
Expanded( Expanded(
@ -599,7 +663,9 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: 16.0, fontSize: 16.0,
color: AppColors.of(context).text.withOpacity(settings.newsEnabled ? 1.0 : .5), color: AppColors.of(context)
.text
.withOpacity(settings.newsEnabled ? 1.0 : .5),
), ),
), ),
), ),
@ -615,7 +681,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// Extras // Extras
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), padding:
const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
child: Panel( child: Panel(
title: Text("extras".i18n), title: Text("extras".i18n),
child: Column( child: Column(
@ -624,12 +691,15 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
type: MaterialType.transparency, type: MaterialType.transparency,
child: SwitchListTile( child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0), contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0)),
title: Row( title: Row(
children: [ children: [
Icon( Icon(
FeatherIcons.gift, FeatherIcons.gift,
color: settings.gradeOpeningFun ? Theme.of(context).colorScheme.secondary : AppColors.of(context).text.withOpacity(.25), color: settings.gradeOpeningFun
? Theme.of(context).colorScheme.secondary
: AppColors.of(context).text.withOpacity(.25),
), ),
const SizedBox(width: 24.0), const SizedBox(width: 24.0),
Expanded( Expanded(
@ -638,7 +708,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: 16.0, fontSize: 16.0,
color: AppColors.of(context).text.withOpacity(settings.gradeOpeningFun ? 1.0 : .5), color: AppColors.of(context).text.withOpacity(
settings.gradeOpeningFun ? 1.0 : .5),
), ),
), ),
), ),
@ -659,24 +730,31 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// About // About
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), padding:
const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
child: Panel( child: Panel(
title: Text("about".i18n), title: Text("about".i18n),
child: Column(children: [ child: Column(children: [
PanelButton( PanelButton(
leading: const Icon(FeatherIcons.atSign), leading: const Icon(FeatherIcons.atSign),
title: const Text("Discord"), title: const Text("Discord"),
onPressed: () => launchUrl(Uri.parse("https://filcnaplo.hu/discord"), mode: LaunchMode.externalApplication), onPressed: () => launchUrl(
Uri.parse("https://filcnaplo.hu/discord"),
mode: LaunchMode.externalApplication),
), ),
PanelButton( PanelButton(
leading: const Icon(FeatherIcons.globe), leading: const Icon(FeatherIcons.globe),
title: const Text("www.filcnaplo.hu"), title: const Text("www.filcnaplo.hu"),
onPressed: () => launchUrl(Uri.parse("https://filcnaplo.hu"), mode: LaunchMode.externalApplication), onPressed: () => launchUrl(
Uri.parse("https://filcnaplo.hu"),
mode: LaunchMode.externalApplication),
), ),
PanelButton( PanelButton(
leading: const Icon(FeatherIcons.github), leading: const Icon(FeatherIcons.github),
title: const Text("Github"), title: const Text("Github"),
onPressed: () => launchUrl(Uri.parse("https://github.com/filc"), mode: LaunchMode.externalApplication), onPressed: () => launchUrl(
Uri.parse("https://github.com/filc"),
mode: LaunchMode.externalApplication),
), ),
PanelButton( PanelButton(
leading: const Icon(FeatherIcons.mail), leading: const Icon(FeatherIcons.mail),
@ -696,29 +774,37 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
Tooltip( Tooltip(
message: "data_collected".i18n, message: "data_collected".i18n,
padding: const EdgeInsets.all(4.0), padding: const EdgeInsets.all(4.0),
textStyle: TextStyle(fontWeight: FontWeight.w500, color: AppColors.of(context).text), textStyle: TextStyle(
decoration: BoxDecoration(color: Theme.of(context).colorScheme.background), fontWeight: FontWeight.w500,
color: AppColors.of(context).text),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.background),
child: Material( child: Material(
type: MaterialType.transparency, type: MaterialType.transparency,
child: SwitchListTile( child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0), contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0)),
secondary: Icon( secondary: Icon(
FeatherIcons.barChart2, FeatherIcons.barChart2,
color: settings.xFilcId != "none" ? Theme.of(context).colorScheme.secondary : AppColors.of(context).text.withOpacity(.25), color: settings.xFilcId != "none"
? Theme.of(context).colorScheme.secondary
: AppColors.of(context).text.withOpacity(.25),
), ),
title: Text( title: Text(
"Analytics".i18n, "Analytics".i18n,
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: 16.0, fontSize: 16.0,
color: AppColors.of(context).text.withOpacity(settings.xFilcId != "none" ? 1.0 : .5), color: AppColors.of(context).text.withOpacity(
settings.xFilcId != "none" ? 1.0 : .5),
), ),
), ),
subtitle: Text( subtitle: Text(
"Anonymous Usage Analytics".i18n, "Anonymous Usage Analytics".i18n,
style: TextStyle( style: TextStyle(
color: AppColors.of(context).text.withOpacity(settings.xFilcId != "none" ? .5 : .2), color: AppColors.of(context).text.withOpacity(
settings.xFilcId != "none" ? .5 : .2),
), ),
), ),
onChanged: (v) { onChanged: (v) {
@ -742,7 +828,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
), ),
if (settings.developerMode) if (settings.developerMode)
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel( child: Panel(
title: const Text("Developer Settings"), title: const Text("Developer Settings"),
child: Column( child: Column(
@ -751,9 +838,12 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
type: MaterialType.transparency, type: MaterialType.transparency,
child: SwitchListTile( child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0), contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), shape: RoundedRectangleBorder(
title: const Text("Developer Mode", style: TextStyle(fontWeight: FontWeight.w500)), borderRadius: BorderRadius.circular(12.0)),
onChanged: (v) => settings.update(developerMode: false), title: const Text("Developer Mode",
style: TextStyle(fontWeight: FontWeight.w500)),
onChanged: (v) =>
settings.update(developerMode: false),
value: settings.developerMode, value: settings.developerMode,
activeColor: Theme.of(context).colorScheme.secondary, activeColor: Theme.of(context).colorScheme.secondary,
), ),
@ -761,16 +851,24 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
PanelButton( PanelButton(
leading: const Icon(FeatherIcons.copy), leading: const Icon(FeatherIcons.copy),
title: const Text("Copy JWT"), title: const Text("Copy JWT"),
onPressed: () => Clipboard.setData(ClipboardData(text: Provider.of<KretaClient>(context, listen: false).accessToken)), onPressed: () => Clipboard.setData(ClipboardData(
text:
Provider.of<KretaClient>(context, listen: false)
.accessToken!)),
), ),
if (Provider.of<PremiumProvider>(context, listen: false).hasPremium) if (Provider.of<PremiumProvider>(context, listen: false)
.hasPremium)
PanelButton( PanelButton(
leading: const Icon(FeatherIcons.key), leading: const Icon(FeatherIcons.key),
title: const Text("Remove Premium"), title: const Text("Remove Premium"),
onPressed: () { onPressed: () {
Provider.of<PremiumProvider>(context, listen: false).activate(removePremium: true); Provider.of<PremiumProvider>(context, listen: false)
settings.update(accentColor: AccentColor.filc, store: true); .activate(removePremium: true);
Provider.of<ThemeModeObserver>(context, listen: false).changeTheme(settings.theme); settings.update(
accentColor: AccentColor.filc, store: true);
Provider.of<ThemeModeObserver>(context,
listen: false)
.changeTheme(settings.theme);
}, },
), ),
], ],
@ -781,12 +879,15 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
top: false, top: false,
child: Center( child: Center(
child: GestureDetector( child: GestureDetector(
child: const Panel(title: Text("v" + String.fromEnvironment("APPVER", defaultValue: "?"))), child: const Panel(
title: Text("v" +
String.fromEnvironment("APPVER", defaultValue: "?"))),
onTap: () { onTap: () {
if (devmodeCountdown > 0) { if (devmodeCountdown > 0) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar( ScaffoldMessenger.of(context).showSnackBar(SnackBar(
duration: const Duration(milliseconds: 200), duration: const Duration(milliseconds: 200),
content: Text("You are $devmodeCountdown taps away from Developer Mode."), content: Text(
"You are $devmodeCountdown taps away from Developer Mode."),
)); ));
setState(() => devmodeCountdown--); setState(() => devmodeCountdown--);
@ -810,7 +911,9 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
} }
void _openNews(BuildContext context) => void _openNews(BuildContext context) =>
Navigator.of(context, rootNavigator: true).push(CupertinoPageRoute(builder: (context) => const NewsScreen())); Navigator.of(context, rootNavigator: true)
void _openUpdates(BuildContext context) => UpdateView.show(updateProvider.releases.first, context: context); .push(CupertinoPageRoute(builder: (context) => const NewsScreen()));
void _openUpdates(BuildContext context) =>
UpdateView.show(updateProvider.releases.first, context: context);
void _openPrivacy(BuildContext context) => PrivacyView.show(context); void _openPrivacy(BuildContext context) => PrivacyView.show(context);
} }

View File

@ -22,7 +22,7 @@ dependencies:
fl_chart: ^0.45.1 fl_chart: ^0.45.1
url_launcher: ^6.0.9 url_launcher: ^6.0.9
flutter_material_color_picker: ^1.1.0+2 flutter_material_color_picker: ^1.1.0+2
photo_view: ^0.13.0 photo_view: ^0.14.0
flutter_linkify: ^5.0.2 flutter_linkify: ^5.0.2
flutter_custom_tabs: ^1.0.3 flutter_custom_tabs: ^1.0.3
flutter_markdown: ^0.6.5 flutter_markdown: ^0.6.5

48
filcnaplo_premium/.gitignore vendored Normal file
View File

@ -0,0 +1,48 @@
# 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
pubspec.lock
android/local.properties

View File

@ -1,2 +1,2 @@
sdk.dir=/Users/unknown/Library/Android/sdk sdk.dir=C:\\Users\\Peti\\AppData\\Local\\Android\\sdk
flutter.sdk=/Users/unknown/flutter flutter.sdk=/Users/kima/development/flutter

View File

@ -1,8 +1,8 @@
#!/bin/sh #!/bin/sh
cd filcnaplo && pwd && flutter clean && flutter pub get && cd .. cd filcnaplo && flutter clean && flutter pub get && cd ..
cd filcnaplo_kreta_api && pwd && flutter clean && flutter pub get && cd .. cd filcnaplo_kreta_api && flutter clean && flutter pub get && cd ..
cd filcnaplo_mobile_ui && pwd && flutter clean && flutter pub get && cd .. cd filcnaplo_mobile_ui && flutter clean && flutter pub get && cd ..
cd filcnaplo_desktop_ui && pwd && flutter clean && flutter pub get && cd .. cd filcnaplo_desktop_ui && flutter clean && flutter pub get && cd ..
echo Fixed pub. echo Fixed pub.