diff --git a/firka/lib/helpers/firka_bundle.dart b/firka/lib/helpers/firka_bundle.dart index 89e10e5..60dc48f 100644 --- a/firka/lib/helpers/firka_bundle.dart +++ b/firka/lib/helpers/firka_bundle.dart @@ -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 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]!}"; } } diff --git a/firka/lib/helpers/image_preloader.dart b/firka/lib/helpers/image_preloader.dart index bcb0158..69d77b4 100644 --- a/firka/lib/helpers/image_preloader.dart +++ b/firka/lib/helpers/image_preloader.dart @@ -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 _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); diff --git a/firka/lib/main.dart b/firka/lib/main.dart index d085372..a5ab8f9 100644 --- a/firka/lib/main.dart +++ b/firka/lib/main.dart @@ -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 navigatorKey = GlobalKey(); late AppInitialization initData; @@ -198,7 +201,7 @@ Future 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 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 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( diff --git a/firka/lib/ui/phone/pages/extras/extras.dart b/firka/lib/ui/phone/pages/extras/extras.dart index 07867ad..2f19924 100644 --- a/firka/lib/ui/phone/pages/extras/extras.dart +++ b/firka/lib/ui/phone/pages/extras/extras.dart @@ -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( diff --git a/firka/lib/ui/phone/pages/home/home_timetable_mo.dart b/firka/lib/ui/phone/pages/home/home_timetable_mo.dart index c45d2ac..190b9aa 100644 --- a/firka/lib/ui/phone/pages/home/home_timetable_mo.dart +++ b/firka/lib/ui/phone/pages/home/home_timetable_mo.dart @@ -264,7 +264,8 @@ class _HomeTimetableMonthlyScreen } break; default: - debugPrint(omissionType.studentPresence!.name); + logger.fine( + "omission: ${omissionType.studentPresence!.name}"); body = Center( child: FirkaIconWidget( FirkaIconType.majesticons, diff --git a/firka/lib/ui/phone/screens/debug/debug_screen.dart b/firka/lib/ui/phone/screens/debug/debug_screen.dart index c569630..6dfaef6 100644 --- a/firka/lib/ui/phone/screens/debug/debug_screen.dart +++ b/firka/lib/ui/phone/screens/debug/debug_screen.dart @@ -137,21 +137,21 @@ class _DebugScreen extends FirkaState { ), 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 { 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 { 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()'), diff --git a/firka/lib/ui/phone/screens/home/home_screen.dart b/firka/lib/ui/phone/screens/home/home_screen.dart index f157a68..603a1b8 100644 --- a/firka/lib/ui/phone/screens/home/home_screen.dart +++ b/firka/lib/ui/phone/screens/home/home_screen.dart @@ -272,7 +272,7 @@ class _HomeScreenState extends FirkaState { _preloadDone = true; }); } catch (e) { - debugPrint('Error preloading images: $e'); + logger.severe('Home: error preloading images: $e'); if (!mounted) return; setState(() { _preloadDone = true; diff --git a/firka/lib/ui/phone/screens/login/login_screen.dart b/firka/lib/ui/phone/screens/login/login_screen.dart index 0f45199..ea26f69 100644 --- a/firka/lib/ui/phone/screens/login/login_screen.dart +++ b/firka/lib/ui/phone/screens/login/login_screen.dart @@ -56,7 +56,7 @@ class _LoginScreenState extends FirkaState { _preloadDone = true; }); } catch (e) { - debugPrint('Error preloading images: $e'); + logger.shout('LoginScreen: Error preloading images: $e'); setState(() { _preloadDone = true; }); diff --git a/firka/lib/ui/phone/screens/settings/settings_screen.dart b/firka/lib/ui/phone/screens/settings/settings_screen.dart index 624b01e..b040c6c 100644 --- a/firka/lib/ui/phone/screens/settings/settings_screen.dart +++ b/firka/lib/ui/phone/screens/settings/settings_screen.dart @@ -254,7 +254,7 @@ class _SettingsScreenState extends FirkaState { 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 { await item .save(widget.data.isar.appSettingsModels); }); - debugPrint('Settings saved'); + logger.finest('Settings saved'); }) ], ), diff --git a/firka/lib/ui/phone/widgets/login_webview.dart b/firka/lib/ui/phone/widgets/login_webview.dart index 359ddfb..c19f375 100644 --- a/firka/lib/ui/phone/widgets/login_webview.dart +++ b/firka/lib/ui/phone/widgets/login_webview.dart @@ -48,7 +48,7 @@ class _LoginWebviewWidgetState extends FirkaState { 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 { 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 { runApp(InitializationScreen()); } catch (ex) { if (kDebugMode) { - print("oauthredirect failed: $ex"); + logger.info("oauthredirect failed: $ex"); } Navigator.push( context, diff --git a/firka/pubspec.yaml b/firka/pubspec.yaml index 623cea6..38e7fc9 100644 --- a/firka/pubspec.yaml +++ b/firka/pubspec.yaml @@ -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: