use proper logging

This commit is contained in:
2025-09-12 22:44:02 +02:00
parent 191ee62be9
commit 6e2eeea8f0
11 changed files with 50 additions and 33 deletions

View File

@@ -1,9 +1,9 @@
import 'dart:async';
import 'dart:io';
import 'dart:convert';
import 'dart:io';
import 'package:brotli/brotli.dart';
import 'package:flutter/foundation.dart';
import 'package:firka/main.dart';
import 'package:flutter/services.dart';
class FirkaBundle extends CachingAssetBundle {
@@ -34,13 +34,16 @@ class FirkaBundle extends CachingAssetBundle {
@override
Future<ByteData> load(String key) async {
if (!_compressedBundle) {
logger
.finest("Loading asset from root bundle: assets/flutter_assets/$key");
return rootBundle.load(key);
} else {
index ??= await loadIndex();
final gzip = GZipCodec();
debugPrint("assets/flutter_assets/$key");
logger.finest(
"Loading asset from firka bundle: assets/flutter_assets/$key");
switch (index!["assets/flutter_assets/$key"]!) {
case "b": // brotli
return decode(brotli, await rootBundle.load(key));
@@ -49,6 +52,7 @@ class FirkaBundle extends CachingAssetBundle {
case "r": // raw
return rootBundle.load(key);
default:
logger.shout("Unknown file format: ${index![key]!}");
throw "Unknown file format: ${index![key]!}";
}
}

View File

@@ -1,5 +1,6 @@
import 'dart:ui' as ui;
import 'package:firka/main.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
@@ -91,7 +92,7 @@ class ImagePreloader {
static Future<ui.Image> _loadAssetImage(
AssetBundle bundle, String assetPath) async {
debugPrint("Caching: $assetPath");
logger.finest("Caching: $assetPath");
final ByteData data = await bundle.load(assetPath);
final Uint8List bytes = data.buffer.asUint8List();
return await _decodeImageFromBytes(bytes);

View File

@@ -24,6 +24,7 @@ import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:isar/isar.dart';
import 'package:logging/logging.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
@@ -35,6 +36,8 @@ import 'l10n/app_localizations.dart';
import 'l10n/app_localizations_de.dart';
import 'l10n/app_localizations_en.dart';
late final Logger logger;
Isar? isarInit;
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
late AppInitialization initData;
@@ -198,7 +201,7 @@ Future<AppInitialization> initializeApp() async {
final tokens = await isar.tokenModels.where().findAll();
if (kDebugMode) {
print('Token count: ${tokens.length}');
logger.finest('Token count: ${tokens.length}');
}
var devInfoFetched = false;
@@ -215,14 +218,14 @@ Future<AppInitialization> initializeApp() async {
}
} catch (e) {
if (e is Error) {
debugPrintStack(stackTrace: e.stackTrace, label: e.toString());
logger.shout("Error in initializeApp()", e.toString(), e.stackTrace);
} else {
debugPrint(e.toString());
logger.shout("Error in initializeApp()", e.toString());
}
}
debugPrint("Fetched device info: ${devInfoFetched ? "yes" : "no"}");
debugPrint("Using device info: ${devInfo.toString()}");
logger.fine("Fetched device info: ${devInfoFetched ? "yes" : "no"}");
logger.fine("Using device info: ${devInfo.toString()}");
var init = AppInitialization(
isar: isar,
@@ -236,25 +239,33 @@ Future<AppInitialization> initializeApp() async {
await _initData(init);
init.settingsUpdateNotifier.addListener(() {
debugPrint("Settings updated");
logger.finest("Settings updated");
});
return init;
}
void main() async {
logger = Logger("Firka");
dio.options.connectTimeout = Duration(seconds: 5);
dio.options.receiveTimeout = Duration(seconds: 3);
dio.options.validateStatus = (status) => status != null && status < 500;
hierarchicalLoggingEnabled = true;
logger.level = Level.ALL;
logger.onRecord.listen((record) {
debugPrint('[Firka] [${record.level.name}] ${record.message}');
});
runZonedGuarded(() async {
logger.finest("Initializing app");
WidgetsFlutterBinding.ensureInitialized();
// Run App Initialization
runApp(InitializationScreen());
}, (error, stackTrace) {
debugPrint('Caught error: $error');
debugPrint('Stack trace: $stackTrace');
logger.shout('Caught error: $error');
logger.shout('Stack trace: $stackTrace');
navigatorKey.currentState?.push(
MaterialPageRoute(
@@ -281,9 +292,8 @@ class InitializationScreen extends StatelessWidget {
// Check if initialization is complete
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
debugPrintStack(
stackTrace: snapshot.stackTrace,
label: snapshot.error.toString());
logger.shout("Error in InitializationScreen",
snapshot.error.toString(), snapshot.stackTrace);
// Handle initialization error
return MaterialApp(
@@ -315,12 +325,12 @@ class InitializationScreen extends StatelessWidget {
watch.messageStream.listen((e) {
var msg = e.entries.toMap();
debugPrint("[Watch -> Phone]: ${msg["id"]}");
logger.finest("WatchOS IPC [Watch -> Phone]: ${msg["id"]}");
switch (msg["id"]) {
case "ping":
if (initData.tokens.isNotEmpty) {
debugPrint("[Phone -> Watch]: pong");
logger.finest("WatchOS IPC [Phone -> Watch]: pong");
watch.sendMessage({"id": "pong"});
navigatorKey.currentState?.push(
MaterialPageRoute(

View File

@@ -13,7 +13,7 @@ import '../../screens/home/home_screen.dart';
void showExtrasBottomSheet(BuildContext context, AppInitialization data) {
Widget debugBtn = SizedBox();
debugPrint("Developer mode: ${isDeveloper()}");
logger.finest("showExtrasBottomSheet() developer mode: ${isDeveloper()}");
if (isDeveloper()) {
debugBtn = GestureDetector(

View File

@@ -264,7 +264,8 @@ class _HomeTimetableMonthlyScreen
}
break;
default:
debugPrint(omissionType.studentPresence!.name);
logger.fine(
"omission: ${omissionType.studentPresence!.name}");
body = Center(
child: FirkaIconWidget(
FirkaIconType.majesticons,

View File

@@ -137,21 +137,21 @@ class _DebugScreen extends FirkaState<DebugScreen> {
),
ElevatedButton(
onPressed: () async {
print(
logger.finest(
"getStudent(): ${await widget.data.client.getStudent(forceCache: useCache)}");
},
child: const Text('getStudent()'),
),
ElevatedButton(
onPressed: () async {
print(
logger.finest(
"getNoticeBoard(): ${await widget.data.client.getNoticeBoard(forceCache: useCache)}");
},
child: const Text('getNoticeBoard()'),
),
ElevatedButton(
onPressed: () async {
print(
logger.finest(
"getGrades(): ${await widget.data.client.getGrades(forceCache: useCache)}");
},
child: const Text('getGrades()'),
@@ -163,7 +163,7 @@ class _DebugScreen extends FirkaState<DebugScreen> {
var start = now.subtract(Duration(days: 14));
var end = now.add(Duration(days: 7));
print(
logger.finest(
"getLessons(): ${await widget.data.client.getTimeTable(start, end, forceCache: useCache)}");
},
child: const Text('getLessons()'),
@@ -175,21 +175,21 @@ class _DebugScreen extends FirkaState<DebugScreen> {
var start = now.subtract(Duration(days: 7));
var end = now.add(Duration(days: 14));
print(
logger.finest(
"getHomework(): ${await widget.data.client.getHomework(start, end, forceCache: useCache)}");
},
child: const Text('getHomework()'),
),
ElevatedButton(
onPressed: () async {
print(
logger.finest(
"getTests(): ${await widget.data.client.getTests(forceCache: useCache)}");
},
child: const Text('getTests()'),
),
ElevatedButton(
onPressed: () async {
print(
logger.finest(
"getOmissions(): ${await widget.data.client.getOmissions(forceCache: useCache)}");
},
child: const Text('getOmissions()'),

View File

@@ -272,7 +272,7 @@ class _HomeScreenState extends FirkaState<HomeScreen> {
_preloadDone = true;
});
} catch (e) {
debugPrint('Error preloading images: $e');
logger.severe('Home: error preloading images: $e');
if (!mounted) return;
setState(() {
_preloadDone = true;

View File

@@ -56,7 +56,7 @@ class _LoginScreenState extends FirkaState<LoginScreen> {
_preloadDone = true;
});
} catch (e) {
debugPrint('Error preloading images: $e');
logger.shout('LoginScreen: Error preloading images: $e');
setState(() {
_preloadDone = true;
});

View File

@@ -254,7 +254,7 @@ class _SettingsScreenState extends FirkaState<SettingsScreen> {
await widget.data.isar.writeTxn(() async {
await item.save(widget.data.isar.appSettingsModels);
});
debugPrint('Settings saved');
logger.finest('Settings saved');
}),
),
SizedBox(width: 8),
@@ -536,7 +536,7 @@ class _SettingsScreenState extends FirkaState<SettingsScreen> {
await item
.save(widget.data.isar.appSettingsModels);
});
debugPrint('Settings saved');
logger.finest('Settings saved');
})
],
),

View File

@@ -48,7 +48,7 @@ class _LoginWebviewWidgetState extends FirkaState<LoginWebviewWidget> {
if (uri.path == "/ellenorzo-student/prod/oauthredirect") {
if (kDebugMode) {
print("query params: ${uri.queryParameters}");
logger.info("query params: ${uri.queryParameters}");
}
var code = uri.queryParameters["code"]!;
@@ -58,7 +58,7 @@ class _LoginWebviewWidgetState extends FirkaState<LoginWebviewWidget> {
var resp = await getAccessToken(code);
if (kDebugMode) {
print("getAccessToken(): $resp");
logger.info("getAccessToken(): $resp");
}
var tokenModel = TokenModel.fromResp(resp);
@@ -91,7 +91,7 @@ class _LoginWebviewWidgetState extends FirkaState<LoginWebviewWidget> {
runApp(InitializationScreen());
} catch (ex) {
if (kDebugMode) {
print("oauthredirect failed: $ex");
logger.info("oauthredirect failed: $ex");
}
Navigator.push(
context,

View File

@@ -66,6 +66,7 @@ dependencies:
package_info_plus: ^8.3.1
smart_scroll: ^1.0.0
live_activities: ^2.4.1
logging: ^1.3.0
dev_dependencies:
flutter_test: