chore: Better error handling for push notifications

This commit is contained in:
Christian Kußowski 2025-07-25 18:52:52 +02:00
parent ce9d21a203
commit 140d27ff7b
No known key found for this signature in database
GPG key ID: E067ECD60F1A0652
3 changed files with 43 additions and 4 deletions

View file

@ -15,6 +15,7 @@ import 'package:receive_sharing_intent/receive_sharing_intent.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pages/chat_list/chat_list_view.dart';
import 'package:fluffychat/utils/error_reporter.dart';
import 'package:fluffychat/utils/localized_exception_extension.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart';
import 'package:fluffychat/utils/platform_infos.dart';
@ -420,6 +421,8 @@ class ChatListController extends State<ChatList>
_checkTorBrowser();
ErrorReporter(context).consumeTemporaryErrorLogFile();
super.initState();
}

View file

@ -1,9 +1,13 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_highlighter/flutter_highlighter.dart';
import 'package:flutter_highlighter/themes/shades-of-purple.dart';
import 'package:matrix/matrix.dart';
import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:fluffychat/config/app_config.dart';
@ -11,16 +15,44 @@ import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart';
class ErrorReporter {
final BuildContext context;
final BuildContext? context;
final String? message;
const ErrorReporter(this.context, [this.message]);
void onErrorCallback(Object error, [StackTrace? stackTrace]) async {
Future<File> _getTemporaryErrorLogFile() async {
final tempDir = await getTemporaryDirectory();
return File(path.join(tempDir.path, 'error_log.txt'));
}
Future<void> writeToTemporaryErrorLogFile(
Object error, [
StackTrace? stackTrace,
]) async {
final file = await _getTemporaryErrorLogFile();
if (await file.exists()) await file.delete();
await file.writeAsString(
'[${DateTime.now().toIso8601String()}] $message - $error\n$stackTrace',
);
}
Future<void> consumeTemporaryErrorLogFile() async {
final file = await _getTemporaryErrorLogFile();
if (!(await file.exists())) return;
final content = await file.readAsString();
_onErrorCallback(content);
}
void onErrorCallback(Object error, [StackTrace? stackTrace]) {
Logs().e(message ?? 'Error caught', error, stackTrace);
final text = '$error\n${stackTrace ?? ''}';
return _onErrorCallback(text);
}
void _onErrorCallback(String text) async {
await showAdaptiveDialog(
context: context,
context: context!,
builder: (context) => AlertDialog.adaptive(
title: Text(L10n.of(context).reportErrorDescription),
content: SizedBox(

View file

@ -14,6 +14,7 @@ import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/utils/client_download_content_extension.dart';
import 'package:fluffychat/utils/client_manager.dart';
import 'package:fluffychat/utils/error_reporter.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart';
import 'package:fluffychat/utils/platform_infos.dart';
@ -35,7 +36,10 @@ Future<void> pushHelper(
flutterLocalNotificationsPlugin: flutterLocalNotificationsPlugin,
);
} catch (e, s) {
Logs().v('Push Helper has crashed!', e, s);
Logs().e('Push Helper has crashed! Writing into temporary file', e, s);
const ErrorReporter(null, 'Push Helper has crashed!')
.writeToTemporaryErrorLogFile(e, s);
l10n ??= await lookupL10n(const Locale('en'));
flutterLocalNotificationsPlugin.show(