diff --git a/.gitignore b/.gitignore
index 5cbfa52..4b56298 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,7 @@
# See https://www.dartlang.org/guides/libraries/private-files
+termek.txt
+
# Files and directories created by pub
.dart_tool/
.packages
diff --git a/changelog.md b/changelog.md
index 429f8ca..e01a32c 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,10 @@
+- Újra dizájnolt jegy, stb. nézet
+- Offline tárolt osztályátlagok
+- Csengő késésének beállítása
+- Óra végén a hátralévő idő másodperc pontos kijelzése
+- Vissza gombra főoldalra ugrás
+- Eddigi hiányzott órák százalékos kijelzése
+- Hiányzások tantárgy szerinti rendezése
- Lapozás legyintéssel a tabok között
- Hiányzások jelzése az órarenben
- Fordítás javítások
diff --git a/filcnaplo/assets/fonts/FilcIcons.ttf b/filcnaplo/assets/fonts/FilcIcons.ttf
index d1e782b..9a3f33a 100644
Binary files a/filcnaplo/assets/fonts/FilcIcons.ttf and b/filcnaplo/assets/fonts/FilcIcons.ttf differ
diff --git a/filcnaplo/assets/icons/home.svg b/filcnaplo/assets/icons/home.svg
deleted file mode 100644
index a536f40..0000000
--- a/filcnaplo/assets/icons/home.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
\ No newline at end of file
diff --git a/filcnaplo/assets/icons/linux.svg b/filcnaplo/assets/icons/linux.svg
deleted file mode 100644
index 38430b8..0000000
--- a/filcnaplo/assets/icons/linux.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/filcnaplo/lib/api/providers/user_provider.dart b/filcnaplo/lib/api/providers/user_provider.dart
index fdd313f..5de7396 100644
--- a/filcnaplo/lib/api/providers/user_provider.dart
+++ b/filcnaplo/lib/api/providers/user_provider.dart
@@ -24,7 +24,7 @@ class UserProvider with ChangeNotifier {
void addUser(User user) {
_users[user.id] = user;
if (kDebugMode) {
- print("DEBUG: Added User: ${user.id} ${user.name}");
+ print("DEBUG: Added User: ${user.id}");
}
}
diff --git a/filcnaplo/lib/app.dart b/filcnaplo/lib/app.dart
index d94bd2f..3f1421e 100644
--- a/filcnaplo/lib/app.dart
+++ b/filcnaplo/lib/app.dart
@@ -1,6 +1,7 @@
import 'dart:io';
import 'dart:math';
+import 'package:dynamic_color/dynamic_color.dart';
import 'package:filcnaplo/api/client.dart';
import 'package:filcnaplo/api/providers/news_provider.dart';
import 'package:filcnaplo/api/providers/database_provider.dart';
@@ -18,6 +19,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:i18n_extension/i18n_widget.dart';
+import 'package:material_color_utilities/palettes/core_palette.dart';
import 'package:provider/provider.dart';
// Providers
@@ -51,12 +53,14 @@ class App extends StatelessWidget {
// Set high refresh mode #28
if (Platform.isAndroid) FlutterDisplayMode.setHighRefreshRate();
- WidgetsBinding.instance?.addPostFrameCallback((_) {
+ WidgetsBinding.instance.addPostFrameCallback((_) {
FilcAPI.getConfig(settings).then((Config? config) {
if (config != null) settings.update(context, database: database, config: config);
});
});
+ CorePalette? corePalette;
+
return I18n(
initialLocale: Locale(settings.language, settings.language.toUpperCase()),
child: MultiProvider(
@@ -84,45 +88,55 @@ class App extends StatelessWidget {
],
child: Consumer(
builder: (context, themeMode, child) {
- return MaterialApp(
- builder: (context, child) {
- // Limit font size scaling to 1.0
- double textScaleFactor = min(MediaQuery.of(context).textScaleFactor, 1.0);
+ return FutureBuilder(
+ future: DynamicColorPlugin.getCorePalette(),
+ builder: (context, snapshot) {
+ corePalette = snapshot.data;
+ return MaterialApp(
+ builder: (context, child) {
+ // Limit font size scaling to 1.0
+ double textScaleFactor = min(MediaQuery.of(context).textScaleFactor, 1.0);
- return MediaQuery(
- data: MediaQuery.of(context).copyWith(textScaleFactor: textScaleFactor),
- child: child ?? Container(),
- );
- },
- title: "Filc Napló",
- debugShowCheckedModeBanner: false,
- theme: AppTheme.lightTheme(context),
- darkTheme: AppTheme.darkTheme(context),
- themeMode: themeMode.themeMode,
- localizationsDelegates: const [
- GlobalMaterialLocalizations.delegate,
- GlobalWidgetsLocalizations.delegate,
- GlobalCupertinoLocalizations.delegate,
- ],
- supportedLocales: const [
- Locale('en', 'EN'),
- Locale('hu', 'HU'),
- Locale('de', 'DE'),
- ],
- localeListResolutionCallback: (locales, supported) {
- Locale locale = const Locale('hu', 'HU');
+ return MediaQuery(
+ data: MediaQuery.of(context).copyWith(textScaleFactor: textScaleFactor),
+ child: SafeArea(
+ top: false,
+ child: child ?? Container(),
+ ),
+ );
+ },
+ title: "Filc Napló",
+ debugShowCheckedModeBanner: false,
+ theme: AppTheme.lightTheme(context, palette: corePalette),
+ darkTheme: AppTheme.darkTheme(context, palette: corePalette),
+ themeMode: themeMode.themeMode,
+ localizationsDelegates: const [
+ GlobalMaterialLocalizations.delegate,
+ GlobalWidgetsLocalizations.delegate,
+ GlobalCupertinoLocalizations.delegate,
+ ],
+ supportedLocales: const [
+ Locale('en', 'EN'),
+ Locale('hu', 'HU'),
+ Locale('de', 'DE'),
+ ],
+ localeListResolutionCallback: (locales, supported) {
+ Locale locale = const Locale('hu', 'HU');
- for (var loc in locales ?? []) {
- if (supported.contains(loc)) {
- locale = loc;
- break;
+ for (var loc in locales ?? []) {
+ if (supported.contains(loc)) {
+ locale = loc;
+ break;
+ }
}
- }
- return locale;
- },
- onGenerateRoute: (settings) => rootNavigator(settings),
- initialRoute: user.getUsers().isNotEmpty ? "navigation" : "login");
+ return locale;
+ },
+ onGenerateRoute: (settings) => rootNavigator(settings),
+ initialRoute: user.getUsers().isNotEmpty ? "navigation" : "login",
+ );
+ },
+ );
},
),
),
diff --git a/filcnaplo/lib/database/init.dart b/filcnaplo/lib/database/init.dart
index 4f38412..b16c0fd 100644
--- a/filcnaplo/lib/database/init.dart
+++ b/filcnaplo/lib/database/init.dart
@@ -7,6 +7,24 @@ import 'package:filcnaplo/models/settings.dart';
import 'package:sqflite/sqflite.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
+const settingsDB = DatabaseStruct("settings", {
+ "language": String, "start_page": int, "rounding": int, "theme": int, "accent_color": int, "news": int, "news_state": int, "developer_mode": int,
+ "update_channel": int, "config": String, // general
+ "grade_color1": int, "grade_color2": int, "grade_color3": int, "grade_color4": int, "grade_color5": int, // grade colors
+ "vibration_strength": int, "ab_weeks": int, "swap_ab_weeks": int,
+ "notifications": int, "notifications_bitfield": int, "notification_poll_interval": int, // notifications
+ "x_filc_id": String, "graph_class_avg": int, "presentation_mode": int, "bell_delay": int, "bell_delay_enabled": int,
+});
+const usersDB = DatabaseStruct(
+ "users", {"id": String, "name": String, "username": String, "password": String, "institute_code": String, "student": String, "role": int});
+const userDataDB = DatabaseStruct("user_data", {
+ "id": String, "grades": String, "timetable": String, "exams": String, "homework": String, "messages": String, "notes": String,
+ "events": String, "absences": String, "group_averages": String,
+ // "subject_lesson_count": String, // non kreta data
+});
+
+Future createTable(Database db, DatabaseStruct struct) => db.execute("CREATE TABLE IF NOT EXISTS ${struct.table} ($struct)");
+
Future initDB() async {
Database db;
@@ -17,13 +35,9 @@ Future initDB() async {
db = await openDatabase("app.db");
}
- // Create table Users
- var usersDB = await createUsersTable(db);
- await db.execute("CREATE TABLE IF NOT EXISTS user_data ("
- "id TEXT NOT NULL, grades TEXT, timetable TEXT, exams TEXT, homework TEXT, messages TEXT, notes TEXT, events TEXT, absences TEXT)");
-
- // Create table Settings
- var settingsDB = await createSettingsTable(db);
+ await createTable(db, settingsDB);
+ await createTable(db, usersDB);
+ await createTable(db, userDataDB);
if ((await db.rawQuery("SELECT COUNT(*) FROM settings"))[0].values.first == 0) {
// Set default values for table Settings
@@ -32,8 +46,21 @@ Future initDB() async {
// Migrate Databases
try {
- await migrateDB(db, "settings", settingsDB.struct.keys, SettingsProvider.defaultSettings().toMap(), createSettingsTable);
- await migrateDB(db, "users", usersDB.struct.keys, {"role": 0}, createUsersTable);
+ await migrateDB(
+ db,
+ struct: settingsDB,
+ defaultValues: SettingsProvider.defaultSettings().toMap(),
+ );
+ await migrateDB(
+ db,
+ struct: usersDB,
+ defaultValues: {"role": 0},
+ );
+ await migrateDB(db, struct: userDataDB, defaultValues: {
+ "grades": "[]", "timetable": "[]", "exams": "[]", "homework": "[]", "messages": "[]", "notes": "[]", "events": "[]", "absences": "[]",
+ "group_averages": "[]",
+ // "subject_lesson_count": "{}", // non kreta data
+ });
} catch (error) {
print("ERROR: migrateDB: $error");
}
@@ -41,44 +68,16 @@ Future initDB() async {
return db;
}
-Future createSettingsTable(Database db) async {
- var settingsDB = DatabaseStruct({
- "language": String, "start_page": int, "rounding": int, "theme": int, "accent_color": int, "news": int, "news_state": int, "developer_mode": int,
- "update_channel": int, "config": String, // general
- "grade_color1": int, "grade_color2": int, "grade_color3": int, "grade_color4": int, "grade_color5": int, // grade colors
- "vibration_strength": int, "ab_weeks": int, "swap_ab_weeks": int,
- "notifications": int, "notifications_bitfield": int, "notification_poll_interval": int, // notifications
- "x_filc_id": String, "graph_class_avg": int,
- });
-
- // Create table Settings
- await db.execute("CREATE TABLE IF NOT EXISTS settings ($settingsDB)");
-
- return settingsDB;
-}
-
-Future createUsersTable(Database db) async {
- var usersDB = DatabaseStruct(
- {"id": String, "name": String, "username": String, "password": String, "institute_code": String, "student": String, "role": int});
-
- // Create table Users
- await db.execute("CREATE TABLE IF NOT EXISTS users ($usersDB)");
-
- return usersDB;
-}
-
Future migrateDB(
- Database db,
- String table,
- Iterable keys,
- Map defaultValues,
- Future Function(Database) create,
-) async {
- var originalRows = await db.query(table);
+ Database db, {
+ required DatabaseStruct struct,
+ required Map defaultValues,
+}) async {
+ var originalRows = await db.query(struct.table);
if (originalRows.isEmpty) {
- await db.execute("drop table $table");
- await create(db);
+ await db.execute("drop table ${struct.table}");
+ await createTable(db, struct);
return;
}
@@ -86,25 +85,28 @@ Future migrateDB(
// go through each row and add missing keys or delete non existing keys
await Future.forEach