Initial commit
This commit is contained in:
146
lib/service/notification_service.dart
Normal file
146
lib/service/notification_service.dart
Normal file
@@ -0,0 +1,146 @@
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user