From f5ead0343183ec4450c139ec860658080fc274f7 Mon Sep 17 00:00:00 2001 From: Dhruv1797 Date: Tue, 14 Oct 2025 09:14:47 +0530 Subject: [PATCH] feat: Added proper logging using logger package --- .../model/saved_image_model.dart | 3 +- .../provider/image_library_provider.dart | 37 ++++++++++--------- .../services/image_operations_service.dart | 3 +- .../services/image_save_handler.dart | 5 ++- .../dialogs/image_properties_dialog.dart | 3 +- .../controller/nfc_controller.dart | 1 + lib/ndef_screen/ndef_screen.dart | 3 +- lib/ndef_screen/nfc_read_screen.dart | 3 +- lib/ndef_screen/nfc_write_screen.dart | 3 +- .../services/nfc_session_manager.dart | 5 ++- lib/util/app_logger.dart | 37 +++++++++++++++++++ lib/util/nfc_settings_launcher.dart | 3 +- lib/util/protocol.dart | 9 +++-- lib/view/image_editor.dart | 5 ++- lib/view/widget/navigation_drawer.dart | 3 +- pubspec.yaml | 1 + 16 files changed, 88 insertions(+), 36 deletions(-) create mode 100644 lib/util/app_logger.dart diff --git a/lib/image_library/model/saved_image_model.dart b/lib/image_library/model/saved_image_model.dart index af06298..caf938a 100644 --- a/lib/image_library/model/saved_image_model.dart +++ b/lib/image_library/model/saved_image_model.dart @@ -1,6 +1,7 @@ import 'dart:io'; import 'dart:typed_data'; import 'package:flutter/material.dart'; +import '../../util/app_logger.dart'; class SavedImage { final String id; @@ -49,7 +50,7 @@ class SavedImage { } return null; } catch (e) { - debugPrint('Error reading image file: $e'); + AppLogger.error('Error reading image file: $e'); return null; } } diff --git a/lib/image_library/provider/image_library_provider.dart b/lib/image_library/provider/image_library_provider.dart index 0a56f65..493b326 100644 --- a/lib/image_library/provider/image_library_provider.dart +++ b/lib/image_library/provider/image_library_provider.dart @@ -4,6 +4,7 @@ import 'package:magicepaperapp/image_library/model/saved_image_model.dart'; import 'dart:convert'; import 'dart:io'; import 'package:path_provider/path_provider.dart'; +import '../../util/app_logger.dart'; class ImageLibraryProvider extends ChangeNotifier { List _savedImages = []; @@ -82,10 +83,10 @@ class ImageLibraryProvider extends ChangeNotifier { _searchQuery = ''; _selectedSource = 'all'; - debugPrint('All data cleared successfully'); + AppLogger.info('All data cleared successfully'); notifyListeners(); } catch (e) { - debugPrint('Error clearing all data: $e'); + AppLogger.error('Error clearing all data: $e'); rethrow; } } @@ -107,14 +108,14 @@ class ImageLibraryProvider extends ChangeNotifier { if (await image.fileExists()) { _savedImages.add(image); } else { - debugPrint('Image file not found: ${image.filePath}'); + AppLogger.warning('Image file not found: ${image.filePath}'); } } catch (e) { - debugPrint('Error parsing individual image metadata: $e'); + AppLogger.error('Error parsing individual image metadata: $e'); } } } catch (e) { - debugPrint('Error parsing JSON metadata file: $e'); + AppLogger.error('Error parsing JSON metadata file: $e'); } } } @@ -122,15 +123,15 @@ class ImageLibraryProvider extends ChangeNotifier { const encoder = JsonEncoder.withIndent(' '); final imageJsonList = _savedImages.map((img) => img.toJson()).toList(); final prettyJson = encoder.convert(imageJsonList); - debugPrint('Loaded image metadata (JSON):\n$prettyJson'); + AppLogger.debug('Loaded image metadata (JSON):\n$prettyJson'); } else { - debugPrint('No saved images to print.'); + AppLogger.debug('No saved images to print.'); } await _cleanupOrphanedFiles(); - debugPrint('Loaded ${_savedImages.length} images successfully'); + AppLogger.info('Loaded ${_savedImages.length} images successfully'); _isInitialized = true; } catch (e) { - debugPrint('Error loading saved images: $e'); + AppLogger.error('Error loading saved images: $e'); } finally { _isLoading = false; notifyListeners(); @@ -162,10 +163,10 @@ class ImageLibraryProvider extends ChangeNotifier { ); _savedImages.add(savedImage); await _persistMetadata(); - debugPrint('Successfully saved image: $name (${imageData.length} bytes)'); + AppLogger.info('Successfully saved image: $name (${imageData.length} bytes)'); notifyListeners(); } catch (e) { - debugPrint('Error saving image: $e'); + AppLogger.error('Error saving image: $e'); rethrow; } } @@ -184,7 +185,7 @@ class ImageLibraryProvider extends ChangeNotifier { await _persistMetadata(); notifyListeners(); } catch (e) { - debugPrint('Error deleting image: $e'); + AppLogger.error('Error deleting image: $e'); rethrow; } } @@ -206,7 +207,7 @@ class ImageLibraryProvider extends ChangeNotifier { await _persistMetadata(); notifyListeners(); } catch (e) { - debugPrint('Error renaming image: $e'); + AppLogger.error('Error renaming image: $e'); rethrow; } } @@ -229,10 +230,10 @@ class ImageLibraryProvider extends ChangeNotifier { final jsonString = jsonEncode(imageJsonList); await _metadataFile!.writeAsString(jsonString); final fileSize = await _metadataFile!.length(); - debugPrint('Metadata file size: $fileSize bytes'); - debugPrint('Metadata saved to: ${_metadataFile!.path}'); + AppLogger.debug('Metadata file size: $fileSize bytes'); + AppLogger.debug('Metadata saved to: ${_metadataFile!.path}'); } catch (e) { - debugPrint('Error persisting metadata: $e'); + AppLogger.error('Error persisting metadata: $e'); rethrow; } } @@ -244,12 +245,12 @@ class ImageLibraryProvider extends ChangeNotifier { final validFilePaths = _savedImages.map((img) => img.filePath).toSet(); for (final file in files) { if (file is File && !validFilePaths.contains(file.path)) { - debugPrint('Deleting orphaned file: ${file.path}'); + AppLogger.debug('Deleting orphaned file: ${file.path}'); await file.delete(); } } } catch (e) { - debugPrint('Error cleaning up orphaned files: $e'); + AppLogger.error('Error cleaning up orphaned files: $e'); } } } diff --git a/lib/image_library/services/image_operations_service.dart b/lib/image_library/services/image_operations_service.dart index 495bc5f..7a9615e 100644 --- a/lib/image_library/services/image_operations_service.dart +++ b/lib/image_library/services/image_operations_service.dart @@ -12,6 +12,7 @@ import 'package:image/image.dart' as img; import 'dart:typed_data'; import 'package:magicepaperapp/l10n/app_localizations.dart'; import 'package:magicepaperapp/provider/getitlocator.dart'; +import '../../util/app_logger.dart'; AppLocalizations appLocalizations = getIt.get(); @@ -234,7 +235,7 @@ class ImageOperationsService { imageFrame.dispose(); return properties; } catch (e) { - debugPrint('Error loading image properties: $e'); + AppLogger.error('Error loading image properties: $e'); return null; } } diff --git a/lib/image_library/services/image_save_handler.dart b/lib/image_library/services/image_save_handler.dart index 63cf4fe..231ba4d 100644 --- a/lib/image_library/services/image_save_handler.dart +++ b/lib/image_library/services/image_save_handler.dart @@ -8,6 +8,7 @@ import 'package:permission_handler/permission_handler.dart'; import 'package:magicepaperapp/image_library/provider/image_library_provider.dart'; import 'package:magicepaperapp/image_library/services/image_operations_service.dart'; import 'package:magicepaperapp/image_library/widgets/dialogs/image_save_dialog.dart'; +import '../../util/app_logger.dart'; class ImageSaveHandler { final BuildContext context; @@ -87,7 +88,7 @@ class ImageSaveHandler { } return _hasStoragePermission; } catch (e) { - debugPrint('Error requesting storage permission: $e'); + AppLogger.error('Error requesting storage permission: $e'); _hasStoragePermission = false; return false; } @@ -100,7 +101,7 @@ class ImageSaveHandler { await requestStoragePermission(); }, onCancel: () { - debugPrint('Storage permission dialog cancelled'); + AppLogger.debug('Storage permission dialog cancelled'); }, colorAccent: colorAccent, colorBlack: colorBlack, diff --git a/lib/image_library/widgets/dialogs/image_properties_dialog.dart b/lib/image_library/widgets/dialogs/image_properties_dialog.dart index 2ba77c6..11b889d 100644 --- a/lib/image_library/widgets/dialogs/image_properties_dialog.dart +++ b/lib/image_library/widgets/dialogs/image_properties_dialog.dart @@ -7,6 +7,7 @@ import 'package:magicepaperapp/image_library/utils/date_utils.dart' as dt; import 'package:magicepaperapp/image_library/utils/filter_utils.dart'; import 'package:magicepaperapp/image_library/utils/source_utils.dart'; import 'package:magicepaperapp/constants/color_constants.dart'; +import '../../../util/app_logger.dart'; class ImagePropertiesDialog extends StatefulWidget { final SavedImage image; @@ -41,7 +42,7 @@ class _ImagePropertiesDialogState extends State { _isLoadingProperties = false; }); } catch (e) { - debugPrint('Error in dialog loading image properties: $e'); + AppLogger.error('Error in dialog loading image properties: $e'); setState(() { _isLoadingProperties = false; }); diff --git a/lib/ndef_screen/controller/nfc_controller.dart b/lib/ndef_screen/controller/nfc_controller.dart index 1f85c80..b73544c 100644 --- a/lib/ndef_screen/controller/nfc_controller.dart +++ b/lib/ndef_screen/controller/nfc_controller.dart @@ -7,6 +7,7 @@ import 'package:magicepaperapp/ndef_screen/services/ndef_record_parser.dart'; import 'package:magicepaperapp/ndef_screen/services/nfc_availability_service.dart'; import 'package:magicepaperapp/ndef_screen/services/nfc_operations_service.dart'; import 'package:ndef/ndef.dart' as ndef; +import '../../util/app_logger.dart'; AppLocalizations appLocalizations = getIt.get(); diff --git a/lib/ndef_screen/ndef_screen.dart b/lib/ndef_screen/ndef_screen.dart index abe80f9..900079a 100644 --- a/lib/ndef_screen/ndef_screen.dart +++ b/lib/ndef_screen/ndef_screen.dart @@ -11,6 +11,7 @@ import 'package:magicepaperapp/ndef_screen/widgets/nfc_read_card.dart'; import 'package:magicepaperapp/ndef_screen/app_launcher_card.dart'; import 'package:magicepaperapp/view/widget/common_scaffold_widget.dart'; import 'dart:async'; +import '../util/app_logger.dart'; AppLocalizations appLocalizations = getIt.get(); @@ -106,7 +107,7 @@ class _NDEFScreenState extends State with WidgetsBindingObserver { previousAvailability, _nfcController.availability); } } catch (e) { - debugPrint('Error checking NFC availability: $e'); + AppLogger.error('Error checking NFC availability: $e'); } } diff --git a/lib/ndef_screen/nfc_read_screen.dart b/lib/ndef_screen/nfc_read_screen.dart index 1b73414..7ed20cc 100644 --- a/lib/ndef_screen/nfc_read_screen.dart +++ b/lib/ndef_screen/nfc_read_screen.dart @@ -7,6 +7,7 @@ import 'package:magicepaperapp/ndef_screen/widgets/nfc_status_card.dart'; import 'package:magicepaperapp/ndef_screen/widgets/nfc_read_card.dart'; import 'package:magicepaperapp/view/widget/common_scaffold_widget.dart'; import 'dart:async'; +import '../util/app_logger.dart'; AppLocalizations appLocalizations = getIt.get(); @@ -84,7 +85,7 @@ class _NFCReadScreenState extends State ); } } catch (e) { - debugPrint('Error checking NFC availability: $e'); + AppLogger.error('Error checking NFC availability: $e'); } } diff --git a/lib/ndef_screen/nfc_write_screen.dart b/lib/ndef_screen/nfc_write_screen.dart index 0e5cc4e..384c856 100644 --- a/lib/ndef_screen/nfc_write_screen.dart +++ b/lib/ndef_screen/nfc_write_screen.dart @@ -10,6 +10,7 @@ import 'package:magicepaperapp/ndef_screen/widgets/nfc_status_card.dart'; import 'package:magicepaperapp/ndef_screen/widgets/nfc_write_card.dart'; import 'package:magicepaperapp/view/widget/common_scaffold_widget.dart'; import 'dart:async'; +import '../util/app_logger.dart'; AppLocalizations appLocalizations = getIt.get(); @@ -107,7 +108,7 @@ class _NFCWriteScreenState extends State ); } } catch (e) { - debugPrint('Error checking NFC availability: $e'); + AppLogger.error('Error checking NFC availability: $e'); } } diff --git a/lib/ndef_screen/services/nfc_session_manager.dart b/lib/ndef_screen/services/nfc_session_manager.dart index ecbccc8..f39ec08 100644 --- a/lib/ndef_screen/services/nfc_session_manager.dart +++ b/lib/ndef_screen/services/nfc_session_manager.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_nfc_kit/flutter_nfc_kit.dart'; import 'package:magicepaperapp/l10n/app_localizations.dart'; import 'package:magicepaperapp/provider/getitlocator.dart'; +import '../../util/app_logger.dart'; AppLocalizations appLocalizations = getIt.get(); @@ -14,11 +15,11 @@ class NFCSessionManager { await FlutterNfcKit.finish(); } } catch (e) { - debugPrint('${appLocalizations.errorFinishingNfcSession}$e'); + AppLogger.error('${appLocalizations.errorFinishingNfcSession}$e'); try { await FlutterNfcKit.finish(); } catch (e2) { - debugPrint('${appLocalizations.secondaryCleanupAlsoFailed}$e2'); + AppLogger.error('${appLocalizations.secondaryCleanupAlsoFailed}$e2'); } } } diff --git a/lib/util/app_logger.dart b/lib/util/app_logger.dart new file mode 100644 index 0000000..009fcdd --- /dev/null +++ b/lib/util/app_logger.dart @@ -0,0 +1,37 @@ +import 'package:logger/logger.dart'; + +class AppLogger { + static final Logger _logger = Logger( + printer: PrettyPrinter( + methodCount: 2, + errorMethodCount: 8, + lineLength: 120, + colors: true, + printEmojis: true, + ), + ); + + static void debug(String message, [dynamic error, StackTrace? stackTrace]) { + _logger.d(message, error: error, stackTrace: stackTrace); + } + + static void info(String message, [dynamic error, StackTrace? stackTrace]) { + _logger.i(message, error: error, stackTrace: stackTrace); + } + + static void warning(String message, [dynamic error, StackTrace? stackTrace]) { + _logger.w(message, error: error, stackTrace: stackTrace); + } + + static void error(String message, [dynamic error, StackTrace? stackTrace]) { + _logger.e(message, error: error, stackTrace: stackTrace); + } + + static void verbose(String message, [dynamic error, StackTrace? stackTrace]) { + _logger.t(message, error: error, stackTrace: stackTrace); + } + + static void fatal(String message, [dynamic error, StackTrace? stackTrace]) { + _logger.f(message, error: error, stackTrace: stackTrace); + } +} diff --git a/lib/util/nfc_settings_launcher.dart b/lib/util/nfc_settings_launcher.dart index 439ff1e..c8645a2 100644 --- a/lib/util/nfc_settings_launcher.dart +++ b/lib/util/nfc_settings_launcher.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'app_logger.dart'; class NFCSettingsLauncher { static const platform = MethodChannel('org.fossasia.magicepaperapp/settings'); @@ -8,7 +9,7 @@ class NFCSettingsLauncher { try { await platform.invokeMethod('openNFCSettings'); } on PlatformException catch (e) { - debugPrint("Failed to open NFC settings: ${e.message}"); + AppLogger.error("Failed to open NFC settings: ${e.message}"); } } } diff --git a/lib/util/protocol.dart b/lib/util/protocol.dart index 3ec0872..581b0df 100644 --- a/lib/util/protocol.dart +++ b/lib/util/protocol.dart @@ -13,6 +13,7 @@ import 'package:magicepaperapp/util/magic_epaper_firmware.dart'; import 'package:magicepaperapp/util/nfc_settings_launcher.dart'; import 'package:magicepaperapp/l10n/app_localizations.dart'; import 'package:magicepaperapp/provider/getitlocator.dart'; +import 'app_logger.dart'; AppLocalizations appLocalizations = getIt.get(); @@ -84,7 +85,7 @@ class Protocol { await _sleep(); for (int i = 0; i < chunks.length; i++) { Uint8List chunk = chunks[i]; - debugPrint( + AppLogger.debug( "${appLocalizations.writingChunk}${i + 1}/${chunks.length} len ${chunk.lengthInBytes}: ${chunk.map((e) => e.toRadixString(16)).toList()}"); await writeMsg(chunk); @@ -95,7 +96,7 @@ class Protocol { "${appLocalizations.writingChunk}${i + 1}/${chunks.length}"); } } - debugPrint(appLocalizations.transferredSuccessfully); + AppLogger.info(appLocalizations.transferredSuccessfully); } List _split({required Uint8List data, int chunkSize = 220}) { @@ -137,10 +138,10 @@ class Protocol { onProgress?.call(0.0, appLocalizations.waitingForNfcTag); Fluttertoast.showToast( msg: appLocalizations.bringPhoneNearMagicEpaperHardware); - debugPrint(appLocalizations.bringPhoneNearMagicEpaperHardware); + AppLogger.info(appLocalizations.bringPhoneNearMagicEpaperHardware); final tag = await FlutterNfcKit.poll(timeout: timeout); - debugPrint(appLocalizations.gotTag); + AppLogger.info(appLocalizations.gotTag); onTagDetected?.call(); onProgress?.call(0.1, appLocalizations.tagDetectedInitializing); diff --git a/lib/view/image_editor.dart b/lib/view/image_editor.dart index eb4c790..310a0c7 100644 --- a/lib/view/image_editor.dart +++ b/lib/view/image_editor.dart @@ -18,6 +18,7 @@ import 'package:magicepaperapp/provider/image_loader.dart'; import 'package:magicepaperapp/util/epd/epd.dart'; import 'package:magicepaperapp/constants/color_constants.dart'; import 'package:magicepaperapp/l10n/app_localizations.dart'; +import '../util/app_logger.dart'; import 'package:magicepaperapp/provider/getitlocator.dart'; AppLocalizations appLocalizations = getIt.get(); @@ -75,7 +76,7 @@ class _ImageEditorState extends State { await loadDefaultImage(imgLoader); } } catch (e) { - debugPrint('Error loading initial image: $e'); + AppLogger.error('Error loading initial image: $e'); } } @@ -90,7 +91,7 @@ class _ImageEditorState extends State { height: widget.device.height, ); } catch (e) { - debugPrint('Error loading default image: $e'); + AppLogger.error('Error loading default image: $e'); } } diff --git a/lib/view/widget/navigation_drawer.dart b/lib/view/widget/navigation_drawer.dart index f95eebc..9d19364 100644 --- a/lib/view/widget/navigation_drawer.dart +++ b/lib/view/widget/navigation_drawer.dart @@ -9,6 +9,7 @@ import 'package:magicepaperapp/util/epd/configurable_editor.dart'; import 'package:magicepaperapp/view/image_editor.dart'; import 'package:magicepaperapp/provider/color_palette_provider.dart'; import 'package:provider/provider.dart'; +import '../../util/app_logger.dart'; AppLocalizations appLocalizations = getIt.get(); @@ -62,7 +63,7 @@ class _AppDrawerState extends State { try { context.read().updateColors(customEpd.colors); } catch (e) { - debugPrint('ColorPaletteProvider not available: $e'); + AppLogger.warning('ColorPaletteProvider not available: $e'); } Navigator.pop(context); Navigator.push( diff --git a/pubspec.yaml b/pubspec.yaml index d67fe77..add0a8d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -46,6 +46,7 @@ dependencies: path: ^1.9.1 permission_handler: ^12.0.1 ndef: ^0.3.1 + logger: ^2.4.0 dev_dependencies: flutter_test: