220 lines
8.0 KiB
Dart
220 lines
8.0 KiB
Dart
// 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<void> 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;
|
|
|
|
class NotificationController extends GetxController {
|
|
final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin =
|
|
FlutterLocalNotificationsPlugin();
|
|
|
|
@override
|
|
void onInit() {
|
|
super.onInit();
|
|
initNotifications();
|
|
}
|
|
|
|
// Initializes the local notifications plugin
|
|
Future<void> 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<void> _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 {} // todo get for location country
|
|
// Set Cairo timezone
|
|
|
|
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');
|
|
}
|
|
}
|