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
[![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
### Clone the project
```sh
git clone --recursive https://github.com/refilc/naplo
git clone --recursive https://github.com/filc/naplo
cd naplo
```

View File

@ -1,6 +1,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
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">
<activity android:exported="true" android:name=".MainActivity"
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"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/launch_gradient_background" />
<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>
</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"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/launch_gradient_background" />
<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>
</layer-list>

View File

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/ic_launcher_background" />
<foreground android:drawable="@mipmap/ic_launcher_foreground" />
<monochrome android:drawable="@mipmap/ic_launcher_monochrome" />
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</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"?>
<resources>
<color name="ic_launcher_background">#1F5B50</color>
<color name="ic_launcher_background">#3D7BF4</color>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>

View File

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

View File

@ -48,6 +48,6 @@ subprojects {
project.evaluationDependsOn(':app')
}
task clean(type: Delete) {
tasks.register("clean", Delete) {
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
android.useAndroidX=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 */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
@ -537,8 +537,8 @@
3127F7A128EAEDE300C2EFB3 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
@ -577,8 +577,8 @@
3127F7A228EAEDE300C2EFB3 /* Profile */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;

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>
</scenes>
<resources>
<image name="LaunchImage" width="512" height="512"/>
<image name="LaunchBackground" width="1080" height="1920"/>
<image name="LaunchImage" width="500" height="500"/>
<image name="LaunchBackground" width="1" height="1"/>
</resources>
</document>

View File

@ -1,9 +1,21 @@
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 = {
AccentColor.filc: const Color(0xff20AC9B),
AccentColor.filc: Color.fromARGB(255, 61, 123, 244),
AccentColor.blue: Colors.blue.shade300,
AccentColor.green: Colors.green.shade400,
AccentColor.lime: Colors.lightGreen.shade400,
@ -12,6 +24,6 @@ Map<AccentColor, Color> accentColorMap = {
AccentColor.red: Colors.red.shade300,
AccentColor.pink: Colors.pink.shade300,
AccentColor.purple: Colors.purple.shade300,
AccentColor.adaptive: const Color(0xff20AC9B),
AccentColor.custom: const Color(0xff20AC9B),
AccentColor.adaptive: const Color(0x003d7bf4),
AccentColor.custom: const Color(0x003d7bf4),
};

View File

@ -7,7 +7,8 @@ import 'package:filcnaplo/theme/colors/light_mobile.dart';
import 'package:flutter/material.dart';
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) {
if (Platform.isAndroid || Platform.isIOS) {

View File

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

View File

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

View File

@ -3,7 +3,7 @@ description: "Nem hivatalos e-napló alkalmazás az e-Kréta rendszerhez"
homepage: https://filcnaplo.hu
publish_to: "none"
version: 3.5.0+193
version: 3.5.1+194
environment:
sdk: ">=2.17.0 <3.0.0"
@ -25,9 +25,9 @@ dependencies:
flutter_localizations:
sdk: flutter
i18n_extension: ^6.0.0
i18n_extension: ^9.0.0
sqflite: ^2.2.0+2
intl: ^0.17.0
intl: ^0.18.0
provider: ^5.0.0
http: ^0.13.3
uuid: ^3.0.4
@ -39,8 +39,8 @@ dependencies:
path_provider: ^2.0.2
permission_handler: ^10.2.0
share_plus: ^5.0.0
connectivity_plus: ^3.0.2
flutter_displaymode: ^0.4.0
connectivity_plus: ^4.0.1
flutter_displaymode: ^0.6.0
quick_actions: ^1.0.1
animated_list_plus: ^0.5.0
dynamic_color: ^1.2.2
@ -67,12 +67,12 @@ dependencies:
image_crop: ^0.4.1
animations: ^2.0.1
background_fetch: ^1.1.5
flutter_local_notifications: ^13.0.0
flutter_local_notifications: ^14.1.0
dev_dependencies:
flutter_lints: ^2.0.1
# flutter_launcher_icons: ^0.9.0
# flutter_native_splash: ^1.2.0
flutter_launcher_icons: "^0.13.1"
#flutter_native_splash: "^2.3.0"
sqflite_common_ffi: ^2.0.0+3
flutter:
@ -149,14 +149,14 @@ flutter:
flutter_icons:
image_path: "assets/icons/ic_launcher.png"
adaptive_icon_background: "#1F5B50"
adaptive_icon_background: "#3D7BF4"
adaptive_icon_foreground: "assets/icons/ic_launcher_foreground.png"
android: true
ios: true
remove_alpha_ios: true
flutter_native_splash:
color: "#1F5B50"
color: "#3D7BF4"
image: "assets/icons/ic_splash.png"
android: true
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();
}
class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProviderStateMixin {
class _SettingsScreenState extends State<SettingsScreen>
with SingleTickerProviderStateMixin {
int devmodeCountdown = 3;
final bool __ss = false; // secret settings
@ -90,11 +91,15 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
}
accountTiles.add(AccountTile(
name: Text(!settings.presentationMode ? account.name : "Béla", style: const TextStyle(fontWeight: FontWeight.w500)),
username: Text(!settings.presentationMode ? account.username : "72469696969"),
name: Text(!settings.presentationMode ? account.name : "Béla",
style: const TextStyle(fontWeight: FontWeight.w500)),
username:
Text(!settings.presentationMode ? account.username : "72469696969"),
profileImage: ProfileImage(
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,
),
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(
toolbarColor: Theme.of(context).scaffoldBackgroundColor,
showPageTitle: true,
@ -142,7 +148,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
@override
void initState() {
super.initState();
_hideContainersController = AnimationController(vsync: this, duration: const Duration(milliseconds: 200));
_hideContainersController = AnimationController(
vsync: this, duration: const Duration(milliseconds: 200));
}
@override
@ -159,8 +166,14 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
firstName = "Béla";
}
String startPageTitle = SettingsHelper.localizedPageTitles()[settings.startPage] ?? "?";
String themeModeText = {ThemeMode.light: "light".i18n, ThemeMode.dark: "dark".i18n, ThemeMode.system: "system".i18n}[settings.theme] ?? "?";
String startPageTitle =
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 vibrateTitle = {
VibrationStrength.off: "voff".i18n,
@ -200,7 +213,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// Updates
if (updateProvider.available)
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
child: PanelButton(
onPressed: () => _openUpdates(context),
@ -210,7 +224,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
updateProvider.releases.first.tag,
style: TextStyle(
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
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
title: Text("general".i18n),
child: Column(
@ -261,7 +277,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
},
title: Text("rounding".i18n),
leading: const Icon(FeatherIcons.gitCommit),
trailing: Text((settings.rounding / 10).toStringAsFixed(1)),
trailing: Text((settings.rounding / 10)
.toStringAsFixed(1)),
),
PanelButton(
onPressed: () {
@ -280,16 +297,27 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
},
title: Text(
"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
? 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,
trailing: Switch(
onChanged: (v) => settings.update(bellDelayEnabled: v),
onChanged: (v) =>
settings.update(bellDelayEnabled: v),
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)
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
title: const Text("Debug"),
child: Column(
children: [
PanelButton(
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),
onPressed: () {
Navigator.of(context, rootNavigator: true).push(
CupertinoPageRoute(builder: (context) => const SubjectIconGallery()),
Navigator.of(context, rootNavigator: true)
.push(
CupertinoPageRoute(
builder: (context) =>
const SubjectIconGallery()),
);
},
)
@ -322,7 +355,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// Secret Settings
if (__ss)
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
title: Text("secret".i18n),
child: Column(
@ -331,9 +365,14 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
Material(
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
title: Text("goodstudent".i18n, style: const TextStyle(fontWeight: FontWeight.w500)),
contentPadding:
const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
title: Text("goodstudent".i18n,
style: const TextStyle(
fontWeight: FontWeight.w500)),
onChanged: (v) {
if (v) {
showDialog(
@ -341,16 +380,26 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
builder: (context) => WillPopScope(
onWillPop: () async => false,
child: AlertDialog(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(
12.0)),
title: Text("attention".i18n),
content: Text("goodstudent_disclaimer".i18n),
content: Text(
"goodstudent_disclaimer"
.i18n),
actions: [
ActionButton(
label: "understand".i18n,
onTap: () {
Navigator.of(context).pop();
settings.update(goodStudent: v);
Provider.of<GradeProvider>(context, listen: false).fetch();
Navigator.of(context)
.pop();
settings.update(
goodStudent: v);
Provider.of<GradeProvider>(
context,
listen: false)
.fetch();
})
],
),
@ -358,11 +407,15 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
);
} else {
settings.update(goodStudent: v);
Provider.of<GradeProvider>(context, listen: false).fetch();
Provider.of<GradeProvider>(context,
listen: false)
.fetch();
}
},
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(
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
title: const Text("Presentation Mode", style: TextStyle(fontWeight: FontWeight.w500)),
onChanged: (v) => settings.update(presentationMode: v),
contentPadding:
const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
title: const Text("Presentation Mode",
style: TextStyle(
fontWeight: FontWeight.w500)),
onChanged: (v) =>
settings.update(presentationMode: v),
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
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
title: Text("appearance".i18n),
child: Column(
@ -412,7 +474,9 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
width: 12.0,
height: 12.0,
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.secondary,
color: Theme.of(context)
.colorScheme
.secondary,
shape: BoxShape.circle,
),
),
@ -429,7 +493,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
children: List.generate(
5,
(i) => Container(
margin: const EdgeInsets.only(left: 2.0),
margin:
const EdgeInsets.only(left: 2.0),
width: 12.0,
height: 12.0,
decoration: BoxDecoration(
@ -443,15 +508,22 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
Material(
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
contentPadding:
const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
title: Row(
children: [
Icon(
FeatherIcons.barChart,
color: settings.graphClassAvg
? Theme.of(context).colorScheme.secondary
: AppColors.of(context).text.withOpacity(.25),
? Theme.of(context)
.colorScheme
.secondary
: AppColors.of(context)
.text
.withOpacity(.25),
),
const SizedBox(width: 24.0),
Expanded(
@ -460,15 +532,22 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
style: TextStyle(
fontWeight: FontWeight.w600,
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,
activeColor: Theme.of(context).colorScheme.secondary,
activeColor:
Theme.of(context).colorScheme.secondary,
),
),
const PremiumIconPackSelector(),
@ -479,21 +558,28 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// Notifications
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
title: Text("notifications".i18n),
child: Material(
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
contentPadding:
const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0)),
title: Row(
children: [
Icon(
Icons.newspaper_outlined,
color: settings.newsEnabled
? Theme.of(context).colorScheme.secondary
: AppColors.of(context).text.withOpacity(.25),
? Theme.of(context)
.colorScheme
.secondary
: AppColors.of(context)
.text
.withOpacity(.25),
),
const SizedBox(width: 24.0),
Expanded(
@ -502,15 +588,21 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
style: TextStyle(
fontWeight: FontWeight.w600,
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,
activeColor: Theme.of(context).colorScheme.secondary,
activeColor:
Theme.of(context).colorScheme.secondary,
),
),
),
@ -518,22 +610,30 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// Extras
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
title: Text("extras".i18n),
child: Column(children: [
Material(
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
contentPadding:
const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
title: Row(
children: [
Icon(
FeatherIcons.gift,
color: settings.gradeOpeningFun
? Theme.of(context).colorScheme.secondary
: AppColors.of(context).text.withOpacity(.25),
? Theme.of(context)
.colorScheme
.secondary
: AppColors.of(context)
.text
.withOpacity(.25),
),
const SizedBox(width: 24.0),
Expanded(
@ -542,15 +642,22 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
style: TextStyle(
fontWeight: FontWeight.w600,
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,
activeColor: Theme.of(context).colorScheme.secondary,
activeColor:
Theme.of(context).colorScheme.secondary,
),
),
]),
@ -559,24 +666,31 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// About
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
title: Text("about".i18n),
child: Column(children: [
PanelButton(
leading: const Icon(FeatherIcons.atSign),
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(
leading: const Icon(FeatherIcons.globe),
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(
leading: const Icon(FeatherIcons.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(
leading: const Icon(FeatherIcons.mail),
@ -591,36 +705,59 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
PanelButton(
leading: const Icon(FeatherIcons.award),
title: Text("licenses".i18n),
onPressed: () => showLicensePage(context: context),
onPressed: () =>
showLicensePage(context: context),
),
Tooltip(
message: "data_collected".i18n,
padding: const EdgeInsets.all(4.0),
textStyle: TextStyle(fontWeight: FontWeight.w500, color: AppColors.of(context).text),
decoration: BoxDecoration(color: Theme.of(context).colorScheme.background),
textStyle: TextStyle(
fontWeight: FontWeight.w500,
color: AppColors.of(context).text),
decoration: BoxDecoration(
color: Theme.of(context)
.colorScheme
.background),
child: Material(
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
contentPadding:
const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
secondary: Icon(
FeatherIcons.barChart2,
color: settings.xFilcId != "none"
? Theme.of(context).colorScheme.secondary
: AppColors.of(context).text.withOpacity(.25),
? Theme.of(context)
.colorScheme
.secondary
: AppColors.of(context)
.text
.withOpacity(.25),
),
title: Text(
"Analytics".i18n,
style: TextStyle(
fontWeight: FontWeight.w600,
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(
"Anonymous Usage Analytics".i18n,
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) {
@ -628,14 +765,17 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
if (v == false) {
newId = "none";
} else if (settings.xFilcId == "none") {
newId = SettingsProvider.defaultSettings().xFilcId;
newId =
SettingsProvider.defaultSettings()
.xFilcId;
} else {
newId = settings.xFilcId;
}
settings.update(xFilcId: newId);
},
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)
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
title: const Text("Developer Settings"),
child: Column(
@ -652,28 +793,48 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
Material(
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
title: const Text("Developer Mode", style: TextStyle(fontWeight: FontWeight.w500)),
onChanged: (v) => settings.update(developerMode: false),
contentPadding:
const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
title: const Text("Developer Mode",
style: TextStyle(
fontWeight: FontWeight.w500)),
onChanged: (v) =>
settings.update(developerMode: false),
value: settings.developerMode,
activeColor: Theme.of(context).colorScheme.secondary,
activeColor: Theme.of(context)
.colorScheme
.secondary,
),
),
PanelButton(
leading: const Icon(FeatherIcons.copy),
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(
leading: const Icon(FeatherIcons.key),
title: const Text("Remove Premium"),
onPressed: () {
Provider.of<PremiumProvider>(context, listen: false).activate(removePremium: true);
settings.update(accentColor: AccentColor.filc, store: true);
Provider.of<ThemeModeObserver>(context, listen: false).changeTheme(settings.theme);
Provider.of<PremiumProvider>(context,
listen: false)
.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,
child: Center(
child: GestureDetector(
child: const Panel(title: Text("v" + String.fromEnvironment("APPVER", defaultValue: "?"))),
child: const Panel(
title: Text("v" +
String.fromEnvironment("APPVER",
defaultValue: "?"))),
onTap: () {
if (devmodeCountdown > 0) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(
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--);
} else if (devmodeCountdown == 0) {
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
content: Text("Developer Mode successfully activated."),
ScaffoldMessenger.of(context)
.showSnackBar(const SnackBar(
content: Text(
"Developer Mode successfully activated."),
));
settings.update(developerMode: true);
@ -719,7 +887,9 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
}
void _openNews(BuildContext context) =>
Navigator.of(context, rootNavigator: true).push(CupertinoPageRoute(builder: (context) => const NewsScreen()));
void _openUpdates(BuildContext context) => UpdateView.show(updateProvider.releases.first, context: context);
Navigator.of(context, rootNavigator: true)
.push(CupertinoPageRoute(builder: (context) => const NewsScreen()));
void _openUpdates(BuildContext context) =>
UpdateView.show(updateProvider.releases.first, context: 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();
}
class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProviderStateMixin {
class _SettingsScreenState extends State<SettingsScreen>
with SingleTickerProviderStateMixin {
int devmodeCountdown = 3;
bool __ss = false; // secret settings
@ -95,11 +96,15 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
}
accountTiles.add(AccountTile(
name: Text(!settings.presentationMode ? account.name : "Béla", style: const TextStyle(fontWeight: FontWeight.w500)),
username: Text(!settings.presentationMode ? account.username : "72469696969"),
name: Text(!settings.presentationMode ? account.name : "Béla",
style: const TextStyle(fontWeight: FontWeight.w500)),
username:
Text(!settings.presentationMode ? account.username : "72469696969"),
profileImage: ProfileImage(
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,
),
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(
toolbarColor: Theme.of(context).scaffoldBackgroundColor,
showPageTitle: true,
@ -148,7 +154,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
@override
void initState() {
super.initState();
_hideContainersController = AnimationController(vsync: this, duration: const Duration(milliseconds: 200));
_hideContainersController = AnimationController(
vsync: this, duration: const Duration(milliseconds: 200));
}
@override
@ -165,8 +172,14 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
firstName = "Béla";
}
String startPageTitle = SettingsHelper.localizedPageTitles()[settings.startPage] ?? "?";
String themeModeText = {ThemeMode.light: "light".i18n, ThemeMode.dark: "dark".i18n, ThemeMode.system: "system".i18n}[settings.theme] ?? "?";
String startPageTitle =
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 vibrateTitle = {
VibrationStrength.off: "voff".i18n,
@ -193,15 +206,18 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
children: [
IconButton(
splashRadius: 32.0,
onPressed: () => _showBottomSheet(user.getUser(user.id ?? "")),
icon: Icon(FeatherIcons.moreVertical, color: AppColors.of(context).text.withOpacity(0.8)),
onPressed: () =>
_showBottomSheet(user.getUser(user.id ?? "")),
icon: Icon(FeatherIcons.moreVertical,
color: AppColors.of(context).text.withOpacity(0.8)),
),
IconButton(
splashRadius: 26.0,
onPressed: () {
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,
role: user.role,
profilePictureString: user.picture,
backgroundColor:
!settings.presentationMode ? ColorUtils.stringToColor(user.displayName ?? "?") : Theme.of(context).colorScheme.secondary,
backgroundColor: !settings.presentationMode
? 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 ?? "")),
onDoubleTap: () => setState(() => __ss = true),
child: Text(
!settings.presentationMode ? (user.displayName ?? "?") : "Béla",
!settings.presentationMode
? (user.displayName ?? "?")
: "Béla",
maxLines: 1,
softWrap: false,
overflow: TextOverflow.ellipsis,
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: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
padding:
const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
child: Panel(
child: Column(
children: [
@ -261,7 +284,9 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// Account settings
PanelButton(
onPressed: () {
Navigator.of(context).pushNamed("login_back").then((value) {
Navigator.of(context)
.pushNamed("login_back")
.then((value) {
setSystemChrome(context);
});
},
@ -275,18 +300,24 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// Delete User
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 (user.getUsers().isNotEmpty) {
user.setUser(user.getUsers().first.id);
restore().then((_) => user.setUser(user.getUsers().first.id));
restore().then(
(_) => user.setUser(user.getUsers().first.id));
} else {
Navigator.of(context).pushNamedAndRemoveUntil("login", (_) => false);
Navigator.of(context)
.pushNamedAndRemoveUntil("login", (_) => false);
}
},
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
if (updateProvider.available)
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
child: PanelButton(
onPressed: () => _openUpdates(context),
@ -332,7 +364,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// General Settings
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
padding:
const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
child: Panel(
title: Text("general".i18n),
child: Column(
@ -362,7 +395,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
},
title: Text("rounding".i18n),
leading: const Icon(FeatherIcons.gitCommit),
trailing: Text((settings.rounding / 10).toStringAsFixed(1)),
trailing:
Text((settings.rounding / 10).toStringAsFixed(1)),
),
PanelButton(
onPressed: () {
@ -381,11 +415,15 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
},
title: Text(
"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
? 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,
trailing: Switch(
onChanged: (v) => settings.update(bellDelayEnabled: v),
@ -400,18 +438,22 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
if (kDebugMode)
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
title: const Text("Debug"),
child: Column(
children: [
PanelButton(
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),
onPressed: () {
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
if (__ss)
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
title: Text("secret".i18n),
child: Column(
@ -433,8 +476,11 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(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) {
if (v) {
showDialog(
@ -442,16 +488,21 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
builder: (context) => WillPopScope(
onWillPop: () async => false,
child: AlertDialog(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
title: Text("attention".i18n),
content: Text("goodstudent_disclaimer".i18n),
content:
Text("goodstudent_disclaimer".i18n),
actions: [
ActionButton(
label: "understand".i18n,
onTap: () {
Navigator.of(context).pop();
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 {
settings.update(goodStudent: v);
Provider.of<GradeProvider>(context, listen: false).convertBySettings();
Provider.of<GradeProvider>(context, listen: false)
.convertBySettings();
}
},
value: settings.goodStudent,
@ -472,9 +524,12 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
title: const Text("Presentation Mode", style: TextStyle(fontWeight: FontWeight.w500)),
onChanged: (v) => settings.update(presentationMode: v),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0)),
title: const Text("Presentation Mode",
style: TextStyle(fontWeight: FontWeight.w500)),
onChanged: (v) =>
settings.update(presentationMode: v),
value: settings.presentationMode,
activeColor: Theme.of(context).colorScheme.secondary,
),
@ -486,7 +541,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
// Theme Settings
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
padding:
const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
child: Panel(
title: Text("appearance".i18n),
child: Column(
@ -545,12 +601,15 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0)),
title: Row(
children: [
Icon(
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),
Expanded(
@ -559,7 +618,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
style: TextStyle(
fontWeight: FontWeight.w600,
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
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
padding:
const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
child: Panel(
title: Text("notifications".i18n),
child: Material(
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0)),
title: Row(
children: [
Icon(
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),
Expanded(
@ -599,7 +663,9 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
style: TextStyle(
fontWeight: FontWeight.w600,
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
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
padding:
const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
child: Panel(
title: Text("extras".i18n),
child: Column(
@ -624,12 +691,15 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0)),
title: Row(
children: [
Icon(
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),
Expanded(
@ -638,7 +708,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
style: TextStyle(
fontWeight: FontWeight.w600,
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
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
padding:
const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
child: Panel(
title: Text("about".i18n),
child: Column(children: [
PanelButton(
leading: const Icon(FeatherIcons.atSign),
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(
leading: const Icon(FeatherIcons.globe),
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(
leading: const Icon(FeatherIcons.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(
leading: const Icon(FeatherIcons.mail),
@ -696,29 +774,37 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
Tooltip(
message: "data_collected".i18n,
padding: const EdgeInsets.all(4.0),
textStyle: TextStyle(fontWeight: FontWeight.w500, color: AppColors.of(context).text),
decoration: BoxDecoration(color: Theme.of(context).colorScheme.background),
textStyle: TextStyle(
fontWeight: FontWeight.w500,
color: AppColors.of(context).text),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.background),
child: Material(
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0)),
secondary: Icon(
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(
"Analytics".i18n,
style: TextStyle(
fontWeight: FontWeight.w600,
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(
"Anonymous Usage Analytics".i18n,
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) {
@ -742,7 +828,8 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
),
if (settings.developerMode)
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
title: const Text("Developer Settings"),
child: Column(
@ -751,9 +838,12 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
title: const Text("Developer Mode", style: TextStyle(fontWeight: FontWeight.w500)),
onChanged: (v) => settings.update(developerMode: false),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0)),
title: const Text("Developer Mode",
style: TextStyle(fontWeight: FontWeight.w500)),
onChanged: (v) =>
settings.update(developerMode: false),
value: settings.developerMode,
activeColor: Theme.of(context).colorScheme.secondary,
),
@ -761,16 +851,24 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
PanelButton(
leading: const Icon(FeatherIcons.copy),
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(
leading: const Icon(FeatherIcons.key),
title: const Text("Remove Premium"),
onPressed: () {
Provider.of<PremiumProvider>(context, listen: false).activate(removePremium: true);
settings.update(accentColor: AccentColor.filc, store: true);
Provider.of<ThemeModeObserver>(context, listen: false).changeTheme(settings.theme);
Provider.of<PremiumProvider>(context, listen: false)
.activate(removePremium: true);
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,
child: Center(
child: GestureDetector(
child: const Panel(title: Text("v" + String.fromEnvironment("APPVER", defaultValue: "?"))),
child: const Panel(
title: Text("v" +
String.fromEnvironment("APPVER", defaultValue: "?"))),
onTap: () {
if (devmodeCountdown > 0) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
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--);
@ -810,7 +911,9 @@ class _SettingsScreenState extends State<SettingsScreen> with SingleTickerProvid
}
void _openNews(BuildContext context) =>
Navigator.of(context, rootNavigator: true).push(CupertinoPageRoute(builder: (context) => const NewsScreen()));
void _openUpdates(BuildContext context) => UpdateView.show(updateProvider.releases.first, context: context);
Navigator.of(context, rootNavigator: true)
.push(CupertinoPageRoute(builder: (context) => const NewsScreen()));
void _openUpdates(BuildContext context) =>
UpdateView.show(updateProvider.releases.first, context: context);
void _openPrivacy(BuildContext context) => PrivacyView.show(context);
}

View File

@ -22,7 +22,7 @@ dependencies:
fl_chart: ^0.45.1
url_launcher: ^6.0.9
flutter_material_color_picker: ^1.1.0+2
photo_view: ^0.13.0
photo_view: ^0.14.0
flutter_linkify: ^5.0.2
flutter_custom_tabs: ^1.0.3
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
flutter.sdk=/Users/unknown/flutter
sdk.dir=C:\\Users\\Peti\\AppData\\Local\\Android\\sdk
flutter.sdk=/Users/kima/development/flutter

View File

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