// import 'package:flutter_local_notifications/flutter_local_notifications.dart'; // import 'package:get/get.dart'; // import 'package:timezone/data/latest.dart' as tz; // import 'package:timezone/timezone.dart' as tz; // class NotificationController extends GetxController { // final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = // FlutterLocalNotificationsPlugin(); // // Initializes the local notifications plugin // Future initNotifications() async { // const AndroidInitializationSettings android = // AndroidInitializationSettings('@mipmap/launcher_icon'); // const InitializationSettings initializationSettings = // InitializationSettings(android: android); // await _flutterLocalNotificationsPlugin.initialize(initializationSettings); // } // // Displays a notification with the given title and message // void showNotification(String title, String message, String tone) async { // AndroidNotificationDetails android = AndroidNotificationDetails( // 'high_importance_channel', // 'High Importance Notifications', // importance: Importance.max, // priority: Priority.high, // showWhen: false, // sound: RawResourceAndroidNotificationSound(tone), // ); // DarwinNotificationDetails ios = const DarwinNotificationDetails( // sound: 'default', // presentAlert: true, // presentBadge: true, // presentSound: true, // ); // NotificationDetails details = // NotificationDetails(android: android, iOS: ios); // await _flutterLocalNotificationsPlugin.show(0, title, message, details); // } // // Schedules a notification after 1 minute // void scheduleNotificationAfter1Minute( // String title, String message, String tone) async { // AndroidNotificationDetails android = AndroidNotificationDetails( // 'high_importance_channel', 'High Importance Notifications', // importance: Importance.max, // priority: Priority.high, // showWhen: false, // sound: RawResourceAndroidNotificationSound(tone)); // DarwinNotificationDetails ios = const DarwinNotificationDetails( // sound: 'default', // presentAlert: true, // presentBadge: true, // presentSound: true, // ); // NotificationDetails details = // NotificationDetails(android: android, iOS: ios); // // Schedule the notification to be shown after 1 minute // final now = tz.TZDateTime.now(tz.local); // final scheduledTime = now.add(const Duration(minutes: 1)); // await _flutterLocalNotificationsPlugin.zonedSchedule( // 0, // title, // message, // scheduledTime, // details, // androidAllowWhileIdle: true, // uiLocalNotificationDateInterpretation: // UILocalNotificationDateInterpretation.absoluteTime, // matchDateTimeComponents: DateTimeComponents.time, // ); // } // } import 'dart:async'; import 'dart:io'; import 'package:SEFER/constant/box_name.dart'; import 'package:SEFER/main.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:get/get.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:timezone/data/latest.dart' as tz; import 'package:timezone/timezone.dart' as tz; import '../../print.dart'; class NotificationController extends GetxController { final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); @override void onInit() { super.onInit(); initNotifications(); } // Initializes the local notifications plugin Future initNotifications() async { const AndroidInitializationSettings android = AndroidInitializationSettings('@mipmap/launcher_icon'); DarwinInitializationSettings ios = DarwinInitializationSettings( requestAlertPermission: true, requestBadgePermission: true, requestSoundPermission: true, onDidReceiveLocalNotification: (int id, String? title, String? body, String? payload) async {}, ); InitializationSettings initializationSettings = InitializationSettings(android: android, iOS: ios); await _flutterLocalNotificationsPlugin.initialize(initializationSettings); tz.initializeTimeZones(); print('Notifications initialized'); } // Displays a notification with the given title and message void showNotification(String title, String message, String tone) async { final AndroidNotificationDetails android = AndroidNotificationDetails( 'high_importance_channel', 'High Importance Notifications', importance: Importance.max, priority: Priority.high, showWhen: false, sound: RawResourceAndroidNotificationSound(tone), ); const DarwinNotificationDetails ios = DarwinNotificationDetails( sound: 'default', presentAlert: true, presentBadge: true, presentSound: true, ); final NotificationDetails details = NotificationDetails(android: android, iOS: ios); await _flutterLocalNotificationsPlugin.show(0, title, message, details); print('Notification shown: $title - $message'); } void scheduleDailyNotifications( String title, String message, String tone) async { final AndroidNotificationDetails android = AndroidNotificationDetails( 'high_importance_channel', 'High Importance Notifications', importance: Importance.max, priority: Priority.high, sound: RawResourceAndroidNotificationSound(tone), ); const DarwinNotificationDetails ios = DarwinNotificationDetails( sound: 'default', presentAlert: true, presentBadge: true, presentSound: true, ); final NotificationDetails details = NotificationDetails(android: android, iOS: ios); // Check for the exact alarm permission on Android 12 and above if (Platform.isAndroid) { if (await Permission.scheduleExactAlarm.isDenied) { if (await Permission.scheduleExactAlarm.request().isGranted) { print('SCHEDULE_EXACT_ALARM permission granted'); } else { print('SCHEDULE_EXACT_ALARM permission denied'); return; } } } // Schedule notifications for 10:00 AM and 3:00 PM daily await _scheduleNotificationForTime(8, 0, title, message, details); await _scheduleNotificationForTime(15, 0, title, message, details); await _scheduleNotificationForTime(20, 0, title, message, details); // await _scheduleNotificationForTime(0, 22, title, message, details); print('Daily notifications scheduled successfully'); } // Helper function to get the next instance of a specific hour and minute Future _scheduleNotificationForTime(int hour, int minute, String title, String message, NotificationDetails details) async { // Initialize and set Cairo timezone tz.initializeTimeZones(); var cairoLocation; // if (box.read(BoxName.countryCode).toString() == 'Egypt') { cairoLocation = tz.getLocation('Africa/Cairo'); // } else { // cairoLocation = tz.getLocation('UTC'); // } // todo get for location country // Set Cairo timezone Log.print('cairoLocation: ${cairoLocation}'); final now = tz.TZDateTime.now( cairoLocation); // Use Cairo timezone for the current time tz.TZDateTime scheduledDate = tz.TZDateTime( cairoLocation, now.year, now.month, now.day, hour, minute); // If scheduled time is already past today, schedule it for the next day if (scheduledDate.isBefore(now)) { scheduledDate = scheduledDate.add(const Duration(days: 1)); } print('Current time (Cairo): $now'); print('Scheduling notification for: $scheduledDate'); await _flutterLocalNotificationsPlugin.zonedSchedule( 0, // Use unique IDs if you want to manage each notification separately title, message, scheduledDate, details, androidAllowWhileIdle: true, uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime, matchDateTimeComponents: DateTimeComponents.time, ); print('Notification scheduled successfully for Cairo timezone'); } }