Two fixes: 1. notification_service.dart: initNotifications() now catches MissingPluginException (and any other init failure) so the app no longer crashes when flutter_local_notifications is unavailable on some Android devices. _initialized tracks success; showNewMailNotification skips the plugin call when it never initialised. 2. crash_screen.dart: "Report Issue on Codeberg" no longer puts the full report in the URL query string. Long stack traces exceeded browser URL-length limits and caused "create issue failed". The URL now carries only the pre-filled title; the user copies the full report via "Copy to Clipboard" and pastes it in the issue body. Tests added: - test/unit/notification_service_test.dart: verifies initNotifications() completes without throwing when the plugin channel is unavailable. - test/widget/crash_screen_test.dart: verifies the Codeberg URL contains the title but no &body= parameter. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
48 lines
1.4 KiB
Dart
48 lines
1.4 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:flutter/services.dart';
|
|
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
|
|
|
const _kChannelId = 'new_mail';
|
|
const _kChannelName = 'New mail';
|
|
|
|
final _plugin = FlutterLocalNotificationsPlugin();
|
|
bool _initialized = false;
|
|
|
|
Future<void> initNotifications() async {
|
|
try {
|
|
const android = AndroidInitializationSettings('@mipmap/ic_launcher');
|
|
await _plugin.initialize(
|
|
const InitializationSettings(android: android),
|
|
onDidReceiveNotificationResponse: (_) {},
|
|
);
|
|
await _plugin
|
|
.resolvePlatformSpecificImplementation<
|
|
AndroidFlutterLocalNotificationsPlugin>()
|
|
?.requestNotificationsPermission();
|
|
_initialized = true;
|
|
} on MissingPluginException {
|
|
// Plugin not registered on this device; notifications silently disabled.
|
|
} catch (_) {
|
|
// Unexpected initialization failure; notifications silently disabled.
|
|
}
|
|
}
|
|
|
|
Future<void> showNewMailNotification(String accountEmail) async {
|
|
if (!Platform.isAndroid || !_initialized) return;
|
|
await _plugin.show(
|
|
accountEmail.hashCode & 0x7FFFFFFF,
|
|
'New mail',
|
|
accountEmail,
|
|
const NotificationDetails(
|
|
android: AndroidNotificationDetails(
|
|
_kChannelId,
|
|
_kChannelName,
|
|
channelDescription: 'Notifications for new incoming mail',
|
|
importance: Importance.high,
|
|
priority: Priority.high,
|
|
),
|
|
),
|
|
);
|
|
}
|