mirror of
https://github.com/Ujwal223/FocusGram.git
synced 2026-04-01 17:10:23 +02:00
- Reordered Settings Page. - Added "Click to Unblur" for posts. - Added Persistent Notification - Improved Grayscale Scheduling. and more.
169 lines
4.8 KiB
Dart
169 lines
4.8 KiB
Dart
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<void> 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<void> _requestIOSPermissions() async {
|
|
try {
|
|
await _notificationsPlugin
|
|
.resolvePlatformSpecificImplementation<
|
|
IOSFlutterLocalNotificationsPlugin
|
|
>()
|
|
?.requestPermissions(alert: true, badge: true, sound: true);
|
|
} catch (e) {
|
|
debugPrint('iOS permission request error: $e');
|
|
}
|
|
}
|
|
|
|
Future<void> _requestAndroidPermissions() async {
|
|
try {
|
|
await _notificationsPlugin
|
|
.resolvePlatformSpecificImplementation<
|
|
AndroidFlutterLocalNotificationsPlugin
|
|
>()
|
|
?.requestNotificationsPermission();
|
|
} catch (e) {
|
|
debugPrint('Android permission request error: $e');
|
|
}
|
|
}
|
|
|
|
Future<void> 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<void> 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<void> cancelPersistentNotification({required int id}) async {
|
|
try {
|
|
await _notificationsPlugin.cancel(id: id);
|
|
} catch (e) {
|
|
debugPrint('Cancel persistent notification error: $e');
|
|
}
|
|
}
|
|
|
|
/// Cancels all notifications
|
|
Future<void> cancelAllNotifications() async {
|
|
try {
|
|
await _notificationsPlugin.cancelAll();
|
|
} catch (e) {
|
|
debugPrint('Cancel all notifications error: $e');
|
|
}
|
|
}
|
|
}
|