131 lines
5.0 KiB
Dart
131 lines
5.0 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 '../../../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(
|
|
const 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 = const 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}');
|
|
|
|
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);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|