import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart' show TimeOfDay; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:timezone/timezone.dart' as tz; class NotificationService { static final NotificationService _instance = NotificationService._internal(); factory NotificationService() => _instance; NotificationService._internal(); final _plugin = FlutterLocalNotificationsPlugin(); Future initialize() async { const android = AndroidInitializationSettings('@mipmap/ic_launcher'); const settings = InitializationSettings(android: android); await _plugin.initialize( settings, onDidReceiveNotificationResponse: _onTap, ); } Future requestPermission() async { final android = _plugin .resolvePlatformSpecificImplementation< AndroidFlutterLocalNotificationsPlugin>(); return await android?.requestNotificationsPermission() ?? false; } Future scheduleDailyNotification({ required TimeOfDay time, required String title, required String body, }) async { await _plugin.cancelAll(); final scheduledDate = _nextInstanceOf(time); const details = NotificationDetails( android: AndroidNotificationDetails( 'daily_summary', 'Tägliche Zusammenfassung', channelDescription: 'Tägliche Aufgaben-Erinnerung', importance: Importance.defaultImportance, priority: Priority.defaultPriority, ), ); await _plugin.zonedSchedule( 0, title: title, body: body, scheduledDate: scheduledDate, details, androidScheduleMode: AndroidScheduleMode.inexactAllowWhileIdle, matchDateTimeComponents: DateTimeComponents.time, ); } Future cancelAll() => _plugin.cancelAll(); /// Computes the next occurrence of [time] as a [tz.TZDateTime]. /// Returns today if [time] is still in the future, tomorrow otherwise. @visibleForTesting tz.TZDateTime nextInstanceOf(TimeOfDay time) { final now = tz.TZDateTime.now(tz.local); var scheduled = tz.TZDateTime( tz.local, now.year, now.month, now.day, time.hour, time.minute, ); if (scheduled.isBefore(now)) { scheduled = scheduled.add(const Duration(days: 1)); } return scheduled; } static void _onTap(NotificationResponse response) { // Navigation to Home tab — wired in Plan 02 via global navigator key } }