firebase_notification_handler.dart 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import 'dart:convert';
  2. import 'dart:io';
  3. import 'dart:math';
  4. import 'package:firebase_messaging/firebase_messaging.dart';
  5. import 'package:flutter/cupertino.dart';
  6. import 'package:flutter/material.dart';
  7. import 'package:flutter_local_notifications/flutter_local_notifications.dart';
  8. import 'package:youtube/data/models/call_model.dart';
  9. import '../../shared/constats.dart';
  10. import 'notification_handler.dart';
  11. class FirebaseNotifications{
  12. late FirebaseMessaging _messaging;
  13. late BuildContext myContext;
  14. void setUpFcm({required BuildContext context,required Function onForegroundClickCallNotify})
  15. {
  16. _messaging = FirebaseMessaging.instance;
  17. NotificationHandler.initNotification(context: context, selectNotificationCallback: (String? payload) {
  18. if(payload!=null){
  19. onForegroundClickCallNotify(payload);
  20. }
  21. });
  22. firebaseCloudMessageListener(context);
  23. myContext = context;
  24. }
  25. void firebaseCloudMessageListener(BuildContext context) async{
  26. final bool? result = await NotificationHandler.flutterLocalNotificationPlugin
  27. .resolvePlatformSpecificImplementation<
  28. IOSFlutterLocalNotificationsPlugin>()
  29. ?.requestPermissions(
  30. alert: true,
  31. badge: true,
  32. sound: true,
  33. );
  34. NotificationSettings settings = await _messaging.requestPermission(
  35. alert: true,
  36. announcement: true,
  37. badge: true,
  38. carPlay: false,
  39. criticalAlert: false,
  40. provisional: false,
  41. sound: true,
  42. );
  43. if (settings.authorizationStatus == AuthorizationStatus.authorized) {
  44. debugPrint('User granted permission');
  45. } else if (settings.authorizationStatus == AuthorizationStatus.provisional) {
  46. debugPrint('User granted provisional permission');
  47. } else {
  48. debugPrint('User declined or has not accepted permission');
  49. }
  50. debugPrint('Setting ${settings.authorizationStatus} LocalPer ${result.toString()}');
  51. //Get Token
  52. //Handle message
  53. FirebaseMessaging.onMessage.listen((remoteMessage) { //Foreground Msg
  54. if(remoteMessage.data['type'] != 'call'){
  55. showNotification(title: remoteMessage.data['title'],body: remoteMessage.data['body'],type: remoteMessage.data['type']);
  56. }
  57. });
  58. FirebaseMessaging.onMessageOpenedApp.listen((remoteMessage) {
  59. debugPrint('Receive open app: $remoteMessage ');
  60. debugPrint('InOpenAppNotifyBody ${remoteMessage.data['body'].toString()}');
  61. if(Platform.isIOS) {
  62. showDialog(context: myContext, builder: (context)=> CupertinoAlertDialog(title: Text(remoteMessage.notification!.title??''),
  63. content: Text(remoteMessage.notification!.body??''),
  64. actions: [
  65. CupertinoDialogAction(
  66. isDefaultAction: true,
  67. child: const Text('OK'),
  68. onPressed: ()=> Navigator.of(context,rootNavigator: true,).pop(),
  69. )
  70. ],));
  71. }
  72. });
  73. }
  74. static AndroidNotificationDetails callChannel = const AndroidNotificationDetails(
  75. 'com.agora.videocall.youtube', 'call_channel',
  76. autoCancel: false,
  77. ongoing: true,
  78. importance: Importance.max,
  79. priority: Priority.max);
  80. static AndroidNotificationDetails normalChannel = const AndroidNotificationDetails(
  81. 'com.agora.videocall.youtube', 'normal_channel',
  82. autoCancel: true,
  83. ongoing: false,
  84. importance: Importance.low,
  85. priority: Priority.low);
  86. static void showNotification({required String title,required String body,required String type}) async{
  87. debugPrint('callDataFromNotify $body');
  88. if(type == 'call'){
  89. Map<String, dynamic> bodyJson = jsonDecode(body);
  90. int notificationId =Random().nextInt(1000);
  91. var ios = const IOSNotificationDetails();
  92. var platform = NotificationDetails(
  93. android: callChannel,iOS: ios);
  94. await NotificationHandler.flutterLocalNotificationPlugin
  95. .show(notificationId, '📞Ringing...', '${CallModel.fromJson(bodyJson).callerName} is calling you', platform,payload: body);
  96. await Future.delayed(const Duration(seconds: callDurationInSec), () {
  97. NotificationHandler.flutterLocalNotificationPlugin.cancel(notificationId).then((value) {
  98. showMissedCallNotification(senderName: bodyJson['sender']['full_name']);
  99. });
  100. });
  101. }
  102. else{
  103. int notificationId =Random().nextInt(1000);
  104. var ios = const IOSNotificationDetails();
  105. var platform = NotificationDetails(
  106. android: normalChannel,iOS: ios);
  107. await NotificationHandler.flutterLocalNotificationPlugin
  108. .show(notificationId, title, body, platform,payload: body);
  109. }
  110. }
  111. static void showMissedCallNotification({required String senderName}) async{
  112. int notificationId =Random().nextInt(1000);
  113. var ios = const IOSNotificationDetails();
  114. var platform = NotificationDetails(
  115. android: normalChannel,iOS: ios);
  116. await NotificationHandler.flutterLocalNotificationPlugin
  117. .show(notificationId, '📞Missed Call', 'You have missed call from $senderName', platform,payload: 'missedCall');
  118. }
  119. }