didvan-app/lib/services/notification/lc/local_notification_service....

134 lines
5.1 KiB
Dart

import 'dart:io';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:http/http.dart';
import 'package:path_provider/path_provider.dart';
import '../../../constants/assets.dart';
import '../../../models/notification_message.dart';
import '../../../views/widgets/notification/notification_dynamic_dialog.dart';
class LocalNotificationService {
// Instance of Flutternotification plugin
static final FlutterLocalNotificationsPlugin _notificationsPlugin =
FlutterLocalNotificationsPlugin();
static void initialize() {
// Initialization setting for android
const InitializationSettings initializationSettingsAndroid =
InitializationSettings(
android: AndroidInitializationSettings("@mipmap/ic_launcher"));
_notificationsPlugin.initialize(
initializationSettingsAndroid,
// to handle event when we receive notification
onDidReceiveNotificationResponse: (details) {
if (details.input != null) {}
},
);
}
static Future<void> display(RemoteMessage message) async {
// To display the notification in device
try {
final id = DateTime.now().millisecondsSinceEpoch ~/ 1000;
final BigPictureStyleInformation bigPictureStyleInformation =
BigPictureStyleInformation(
FilePathAndroidBitmap(
"lib/assets/aaaa.jpg"),
contentTitle: NotificationMessage.fromJson(message.data).title,
htmlFormatContentTitle: true,
summaryText: NotificationMessage.fromJson(message.data).body,
htmlFormatSummaryText: true,
htmlFormatContent: true,
largeIcon: const FilePathAndroidBitmap(
"lib/assets/aaaa.jpg"));
NotificationDetails notificationDetails = NotificationDetails(
android: AndroidNotificationDetails("Channel Id", "Main Channel",
groupKey: "gfg",
color: Colors.white,
importance: Importance.max,
playSound: true,
priority: Priority.high),
);
if (message.notification == null) {
final NotificationMessage notificationModel =
NotificationMessage.fromJson(message.data);
await _notificationsPlugin.show(id, notificationModel.title,
notificationModel.body, notificationDetails,
payload: message.data['route']);
} else {
await _notificationsPlugin.show(id, message.notification?.title,
message.notification?.body, notificationDetails,
payload: message.data['route']);
}
} catch (e) {
debugPrint(e.toString());
}
}
void messageListener(BuildContext context) {
// Either you can pass buildcontext or you
// can take a context from navigator key
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
print('Got a message in the foreground!');
print('Message data: ${message.data}');
if (message.data != null) {
print(
'Message also contained a notification: so it will pop up ${message.notification!.body}');
showDialog(
context: context,
// context: navigatorKey!.currentContext!,
builder: ((BuildContext context) {
return NotificationDynamicDialog(
title: message.notification!.title,
body: message.notification!.body);
}));
}
});
}
static Future<String> _downloadAndSaveFile(String url, String fileName) async {
final Directory directory = await getApplicationDocumentsDirectory();
final String filePath = '${directory.path}/$fileName';
final Response response = await get(Uri.parse(url));
final File file = File(filePath);
await file.writeAsBytes(response.bodyBytes);
return filePath;
}
static Future<void> showBigPictureNotification() async {
final String largeIconPath = await _downloadAndSaveFile(
'https://via.placeholder.com/48x48', 'largeIcon');
final String bigPicturePath = await _downloadAndSaveFile(
'https://via.placeholder.com/400x800', 'bigPicture');
final BigPictureStyleInformation bigPictureStyleInformation =
BigPictureStyleInformation(FilePathAndroidBitmap(bigPicturePath),
largeIcon: FilePathAndroidBitmap(largeIconPath),
contentTitle: 'overridden <b>big</b> content title',
htmlFormatContentTitle: true,
summaryText: 'summary <i>text</i>',
htmlFormatSummaryText: true);
final AndroidNotificationDetails androidPlatformChannelSpecifics =
AndroidNotificationDetails(
'big text channel id', 'big text channel name',
channelDescription: 'big text channel description',
largeIcon: FilePathAndroidBitmap(largeIconPath),
channelShowBadge: false,
styleInformation: bigPictureStyleInformation);
final NotificationDetails platformChannelSpecifics =
NotificationDetails(android: androidPlatformChannelSpecifics);
await _notificationsPlugin.show(
0, 'big text title', 'silent body', platformChannelSpecifics);
}
}