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.

186 lines
6.1KB

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