forked from firka/firka
use proper logging
This commit is contained in:
@@ -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]!}";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -264,7 +264,8 @@ class _HomeTimetableMonthlyScreen
|
||||
}
|
||||
break;
|
||||
default:
|
||||
debugPrint(omissionType.studentPresence!.name);
|
||||
logger.fine(
|
||||
"omission: ${omissionType.studentPresence!.name}");
|
||||
body = Center(
|
||||
child: FirkaIconWidget(
|
||||
FirkaIconType.majesticons,
|
||||
|
||||
@@ -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()'),
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
|
||||
@@ -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');
|
||||
})
|
||||
],
|
||||
),
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user