147 lines
4.6 KiB
Dart
147 lines
4.6 KiB
Dart
import 'dart:async';
|
|
import 'dart:io';
|
|
import 'package:firebase_core/firebase_core.dart';
|
|
import 'package:firebase_messaging/firebase_messaging.dart';
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
|
import '../constants/constants.dart';
|
|
|
|
late AndroidNotificationChannel channel;
|
|
late FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;
|
|
InitializationSettings initializationSettings = const InitializationSettings(
|
|
android: AndroidInitializationSettings('@mipmap/ic_launcher'),
|
|
iOS: DarwinInitializationSettings(
|
|
defaultPresentAlert: true,
|
|
defaultPresentBadge: true,
|
|
defaultPresentSound: true,
|
|
requestAlertPermission: true,
|
|
requestBadgePermission: true,
|
|
requestSoundPermission: true,
|
|
),
|
|
);
|
|
|
|
class NotificationService {
|
|
static Future<void> initialize() async {
|
|
await Firebase.initializeApp();
|
|
await setupFlutterNotifications();
|
|
foregroundNotification();
|
|
backgroundNotification();
|
|
flutterLocalNotificationsPlugin
|
|
.resolvePlatformSpecificImplementation<
|
|
AndroidFlutterLocalNotificationsPlugin
|
|
>()
|
|
?.requestNotificationsPermission();
|
|
}
|
|
|
|
static Future<void> clearNotificationBadge() async {
|
|
await flutterLocalNotificationsPlugin
|
|
.cancelAll(); // Cancels all notifications// Clears badge count
|
|
}
|
|
|
|
static Future<String> getFcmToken() async {
|
|
try {
|
|
final fcmToken = await FirebaseMessaging.instance.getToken();
|
|
return fcmToken ?? "";
|
|
} catch (e) {
|
|
debugPrint("ERROR: Cannot get FCM token");
|
|
return "";
|
|
}
|
|
}
|
|
|
|
static Future<void> setupFlutterNotifications() async {
|
|
if (Platform.isIOS) {
|
|
await FirebaseMessaging.instance.requestPermission(
|
|
announcement: true,
|
|
provisional: true,
|
|
alert: true,
|
|
badge: true,
|
|
criticalAlert: true,
|
|
sound: true,
|
|
);
|
|
}
|
|
channel = const AndroidNotificationChannel(
|
|
'high_importance_channel', // id
|
|
'High Importance Notifications', // title
|
|
description:
|
|
'This channel is used for important notifications.', // description
|
|
importance: Importance.max,
|
|
playSound: true,
|
|
);
|
|
|
|
flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
|
|
await flutterLocalNotificationsPlugin
|
|
.resolvePlatformSpecificImplementation<
|
|
AndroidFlutterLocalNotificationsPlugin
|
|
>()
|
|
?.createNotificationChannel(channel);
|
|
await FirebaseMessaging.instance
|
|
.setForegroundNotificationPresentationOptions(
|
|
alert: true,
|
|
badge: true,
|
|
sound: true,
|
|
);
|
|
}
|
|
|
|
static void showFlutterNotification(RemoteMessage message) {
|
|
if (message.notification != null &&
|
|
!kIsWeb &&
|
|
message.notification?.android != null) {
|
|
final bigTextStyleInformation = BigTextStyleInformation(
|
|
message.notification?.body ?? "",
|
|
);
|
|
flutterLocalNotificationsPlugin.show(
|
|
message.hashCode,
|
|
message.notification?.title,
|
|
message.notification?.body,
|
|
NotificationDetails(
|
|
android: AndroidNotificationDetails(
|
|
channel.id,
|
|
channel.name,
|
|
channelDescription: channel.description,
|
|
icon: '@mipmap/ic_launcher',
|
|
priority: Priority.high,
|
|
importance: Importance.high,
|
|
visibility: NotificationVisibility.public,
|
|
playSound: true,
|
|
styleInformation: bigTextStyleInformation,
|
|
),
|
|
iOS: const DarwinNotificationDetails(
|
|
presentAlert: true,
|
|
presentBadge: true,
|
|
presentSound: true,
|
|
sound: 'default',
|
|
),
|
|
),
|
|
payload: message.data[AppConst.clickAction] ?? "",
|
|
);
|
|
}
|
|
}
|
|
|
|
static void foregroundNotification() {
|
|
FirebaseMessaging.onMessage.listen(showFlutterNotification);
|
|
|
|
///When tapped
|
|
flutterLocalNotificationsPlugin.initialize(
|
|
initializationSettings,
|
|
onDidReceiveNotificationResponse: (response) async {
|
|
debugPrint('foreground notification tapped');
|
|
debugPrint("$response");
|
|
},
|
|
);
|
|
}
|
|
|
|
static void backgroundNotification() {
|
|
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
|
|
debugPrint('A new onMessageOpenedApp event was published! noootttt');
|
|
debugPrint("$message");
|
|
});
|
|
}
|
|
}
|
|
|
|
@pragma('vm:entry-point')
|
|
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
|
|
await Firebase.initializeApp();
|
|
await NotificationService.setupFlutterNotifications();
|
|
//NotificationService.showFlutterNotification(message);
|
|
}
|