You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

179 lines
5.9KB

  1. import 'dart:convert';
  2. import 'package:farm_tpf/presentation/screens/task/task_detail_page.dart';
  3. import 'package:flutter_bloc/flutter_bloc.dart';
  4. import 'package:get/get.dart';
  5. import '../presentation/screens/plot_detail/sc_plot_detail.dart';
  6. import '../utils/pref.dart';
  7. import 'package:firebase_messaging/firebase_messaging.dart';
  8. import 'package:flutter_local_notifications/flutter_local_notifications.dart';
  9. class FirebaseNotificationService {
  10. static FirebaseMessaging messaging = FirebaseMessaging.instance;
  11. static final _pref = LocalPref();
  12. static void initService() async {
  13. var token = await messaging.getToken() ?? '';
  14. await _pref.saveString(PrefKey.push_key, token);
  15. print('pushKey: $token');
  16. //config Android channel
  17. const channel = AndroidNotificationChannel(
  18. 'high_importance_channel',
  19. 'High Importance Notifications',
  20. importance: Importance.max,
  21. );
  22. final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
  23. await flutterLocalNotificationsPlugin
  24. .resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()
  25. ?.createNotificationChannel(channel);
  26. await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<IOSFlutterLocalNotificationsPlugin>()?.requestPermissions(
  27. alert: true,
  28. badge: true,
  29. sound: true,
  30. );
  31. //handle message on background android
  32. FirebaseMessaging.onBackgroundMessage(
  33. _firebaseMessagingBackgroundHandler,
  34. );
  35. //Message foreground
  36. FirebaseMessaging.onMessage.listen(
  37. (RemoteMessage message) {
  38. print('Got a message whilst in the foreground!');
  39. print('Message data: ${messaging.toString()}');
  40. // increase count unread notification
  41. // countNotificationUnRead.value = countNotificationUnRead.value + 1;
  42. var remoteNotification = message.notification;
  43. var androidNotification = message.notification?.android;
  44. var flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
  45. const initializationSettingsAndroid = AndroidInitializationSettings(
  46. 'app_icon',
  47. );
  48. const initializationSettingsIOS = DarwinInitializationSettings(
  49. requestSoundPermission: false,
  50. requestBadgePermission: false,
  51. requestAlertPermission: false,
  52. onDidReceiveLocalNotification: onDidReceiveLocalNotification,
  53. );
  54. const initializationSettings = InitializationSettings(
  55. android: initializationSettingsAndroid,
  56. iOS: initializationSettingsIOS,
  57. );
  58. flutterLocalNotificationsPlugin.initialize(
  59. initializationSettings,
  60. // onDidReceiveNotificationResponse: selectNotification,
  61. onDidReceiveNotificationResponse: (NotificationResponse notificationResponse) async {
  62. await selectNotification(notificationResponse.payload);
  63. },
  64. );
  65. var androidDetails = const AndroidNotificationDetails(
  66. 'default_notification_channel_id',
  67. 'Notification',
  68. importance: Importance.max,
  69. priority: Priority.high,
  70. icon: '@mipmap/ic_stat_ic_notification',
  71. );
  72. var platformChannelSpecifics = NotificationDetails(
  73. android: androidDetails,
  74. );
  75. try {
  76. var dataPayload = json.encode(message.data);
  77. // var entityType = message.data['entity_type'];
  78. // var entityData = message.data['entity_data'];
  79. // var systemMessage = message.data['system_message'];
  80. print('normal message');
  81. flutterLocalNotificationsPlugin.show(
  82. 0,
  83. message.notification?.title,
  84. message.notification?.body,
  85. platformChannelSpecifics,
  86. payload: dataPayload,
  87. );
  88. } catch (e) {
  89. print(e);
  90. }
  91. },
  92. );
  93. //Interaction Message from background
  94. FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
  95. print('message from background: ${message}');
  96. _handleMessage(message);
  97. });
  98. //Interaction Message from terminal
  99. var initialMessage = await FirebaseMessaging.instance.getInitialMessage();
  100. print('initialMessage: $initialMessage');
  101. if (initialMessage != null) {
  102. _handleMessage(initialMessage);
  103. }
  104. }
  105. static Future onDidReceiveLocalNotification(int? id, String? title, String? body, String? payload) async {
  106. // display a dialog with the notification details, tap ok to go to another page
  107. print('handle touch on foreground');
  108. }
  109. static Future selectNotification(String? payload) async {
  110. try {
  111. var data = json.decode(payload ?? '');
  112. handleNavigateScreen(data);
  113. } catch (e) {
  114. print(e);
  115. }
  116. }
  117. static void _handleMessage(RemoteMessage message) {
  118. try {
  119. var data = message.data;
  120. handleNavigateScreen(data);
  121. } catch (e) {
  122. print(e);
  123. }
  124. }
  125. static void handleNavigateScreen(dynamic data) {
  126. try {
  127. if (data['contents'] == 'TODO_LIST_CREATE' || data['contents'] == 'TODO_LIST_UPDATE') {
  128. Get.to(() => TaskDetailPage(taskId: int.tryParse(data['externalId']) ?? -1));
  129. } else if (data['contents'] == 'ENV_UPDATE') {
  130. Get.to(
  131. () => PlotDetailScreen(
  132. cropType: int.tryParse(data['tbCropType']) ?? -1,
  133. cropId: int.tryParse(data['tbCropId']) ?? -1,
  134. initialIndex: 0,
  135. ),
  136. );
  137. } else if (data['contents'] == 'PIC_UPDATE') {
  138. Get.to(
  139. () => PlotDetailScreen(
  140. cropType: int.tryParse(data['tbCropType']) ?? -1,
  141. cropId: int.tryParse(data['tbCropId']) ?? -1,
  142. initialIndex: 1,
  143. ),
  144. );
  145. } else {
  146. print(data['contents']);
  147. }
  148. print(data);
  149. } catch (e) {
  150. print(e);
  151. }
  152. }
  153. static Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  154. print('Handling a background message: ${message}');
  155. _handleMessage(message);
  156. }
  157. }