import 'package:flutter/foundation.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; class NotificationService { static final NotificationService _instance = NotificationService._internal(); factory NotificationService() => _instance; NotificationService._internal(); final FlutterLocalNotificationsPlugin _notificationsPlugin = FlutterLocalNotificationsPlugin(); Future init() async { const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('@mipmap/ic_launcher'); // Request permissions for iOS final DarwinInitializationSettings initializationSettingsIOS = DarwinInitializationSettings( requestAlertPermission: true, requestBadgePermission: true, requestSoundPermission: true, defaultPresentAlert: true, defaultPresentBadge: true, defaultPresentSound: true, ); final InitializationSettings initializationSettings = InitializationSettings( android: initializationSettingsAndroid, iOS: initializationSettingsIOS, ); await _notificationsPlugin.initialize( settings: initializationSettings, onDidReceiveNotificationResponse: (details) { // Handle notification tap }, ); // Request permissions after initialization await _requestIOSPermissions(); await _requestAndroidPermissions(); } Future _requestIOSPermissions() async { try { await _notificationsPlugin .resolvePlatformSpecificImplementation< IOSFlutterLocalNotificationsPlugin >() ?.requestPermissions(alert: true, badge: true, sound: true); } catch (e) { debugPrint('iOS permission request error: $e'); } } Future _requestAndroidPermissions() async { try { await _notificationsPlugin .resolvePlatformSpecificImplementation< AndroidFlutterLocalNotificationsPlugin >() ?.requestNotificationsPermission(); } catch (e) { debugPrint('Android permission request error: $e'); } } Future showNotification({ required int id, required String title, required String body, }) async { const AndroidNotificationDetails androidDetails = AndroidNotificationDetails( 'focusgram_channel', 'FocusGram Notifications', channelDescription: 'Notifications for FocusGram sessions and alerts', importance: Importance.max, priority: Priority.high, showWhen: true, ); const DarwinNotificationDetails iosDetails = DarwinNotificationDetails( presentAlert: true, presentBadge: true, presentSound: true, ); const NotificationDetails platformDetails = NotificationDetails( android: androidDetails, iOS: iosDetails, ); try { await _notificationsPlugin.show( id: id, title: title, body: body, notificationDetails: platformDetails, ); } catch (e) { debugPrint('Notification error: $e'); } } /// Shows a persistent (ongoing) notification that cannot be dismissed by the user Future showPersistentNotification({ required int id, required String title, required String body, }) async { const AndroidNotificationDetails androidDetails = AndroidNotificationDetails( 'focusgram_persistent_channel', 'FocusGram Persistent', channelDescription: 'Persistent notification while using FocusGram', importance: Importance.max, priority: Priority.high, ongoing: true, autoCancel: false, showWhen: true, playSound: false, enableVibration: false, category: AndroidNotificationCategory.service, ); const DarwinNotificationDetails iosDetails = DarwinNotificationDetails( presentAlert: false, presentBadge: false, presentSound: false, ); const NotificationDetails platformDetails = NotificationDetails( android: androidDetails, iOS: iosDetails, ); try { await _notificationsPlugin.show( id: id, title: title, body: body, notificationDetails: platformDetails, ); } catch (e) { debugPrint('Persistent notification error: $e'); } } /// Cancels a persistent notification Future cancelPersistentNotification({required int id}) async { try { await _notificationsPlugin.cancel(id: id); } catch (e) { debugPrint('Cancel persistent notification error: $e'); } } /// Cancels all notifications Future cancelAllNotifications() async { try { await _notificationsPlugin.cancelAll(); } catch (e) { debugPrint('Cancel all notifications error: $e'); } } }