123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- import 'dart:convert';
- import 'dart:io';
- import 'dart:math';
- import 'package:firebase_messaging/firebase_messaging.dart';
- import 'package:flutter/cupertino.dart';
- import 'package:flutter/material.dart';
- import 'package:flutter_local_notifications/flutter_local_notifications.dart';
- import 'package:youtube/data/models/call_model.dart';
- import '../../shared/constats.dart';
- import 'notification_handler.dart';
- class FirebaseNotifications{
- late FirebaseMessaging _messaging;
- late BuildContext myContext;
- void setUpFcm({required BuildContext context,required Function onForegroundClickCallNotify})
- {
- _messaging = FirebaseMessaging.instance;
- NotificationHandler.initNotification(context: context, selectNotificationCallback: (String? payload) {
- if(payload!=null){
- onForegroundClickCallNotify(payload);
- }
- });
- firebaseCloudMessageListener(context);
- myContext = context;
- }
- void firebaseCloudMessageListener(BuildContext context) async{
- final bool? result = await NotificationHandler.flutterLocalNotificationPlugin
- .resolvePlatformSpecificImplementation<
- IOSFlutterLocalNotificationsPlugin>()
- ?.requestPermissions(
- alert: true,
- badge: true,
- sound: true,
- );
- NotificationSettings settings = await _messaging.requestPermission(
- alert: true,
- announcement: true,
- badge: true,
- carPlay: false,
- criticalAlert: false,
- provisional: false,
- sound: true,
- );
- if (settings.authorizationStatus == AuthorizationStatus.authorized) {
- debugPrint('User granted permission');
- } else if (settings.authorizationStatus == AuthorizationStatus.provisional) {
- debugPrint('User granted provisional permission');
- } else {
- debugPrint('User declined or has not accepted permission');
- }
- debugPrint('Setting ${settings.authorizationStatus} LocalPer ${result.toString()}');
- //Get Token
- //Handle message
- FirebaseMessaging.onMessage.listen((remoteMessage) { //Foreground Msg
- if(remoteMessage.data['type'] != 'call'){
- showNotification(title: remoteMessage.data['title'],body: remoteMessage.data['body'],type: remoteMessage.data['type']);
- }
- });
- FirebaseMessaging.onMessageOpenedApp.listen((remoteMessage) {
- debugPrint('Receive open app: $remoteMessage ');
- debugPrint('InOpenAppNotifyBody ${remoteMessage.data['body'].toString()}');
- if(Platform.isIOS) {
- showDialog(context: myContext, builder: (context)=> CupertinoAlertDialog(title: Text(remoteMessage.notification!.title??''),
- content: Text(remoteMessage.notification!.body??''),
- actions: [
- CupertinoDialogAction(
- isDefaultAction: true,
- child: const Text('OK'),
- onPressed: ()=> Navigator.of(context,rootNavigator: true,).pop(),
- )
- ],));
- }
- });
- }
- static AndroidNotificationDetails callChannel = const AndroidNotificationDetails(
- 'com.agora.videocall.youtube', 'call_channel',
- autoCancel: false,
- ongoing: true,
- importance: Importance.max,
- priority: Priority.max);
- static AndroidNotificationDetails normalChannel = const AndroidNotificationDetails(
- 'com.agora.videocall.youtube', 'normal_channel',
- autoCancel: true,
- ongoing: false,
- importance: Importance.low,
- priority: Priority.low);
- static void showNotification({required String title,required String body,required String type}) async{
- debugPrint('callDataFromNotify $body');
- if(type == 'call'){
- Map<String, dynamic> bodyJson = jsonDecode(body);
- int notificationId =Random().nextInt(1000);
- var ios = const IOSNotificationDetails();
- var platform = NotificationDetails(
- android: callChannel,iOS: ios);
- await NotificationHandler.flutterLocalNotificationPlugin
- .show(notificationId, '📞Ringing...', '${CallModel.fromJson(bodyJson).callerName} is calling you', platform,payload: body);
- await Future.delayed(const Duration(seconds: callDurationInSec), () {
- NotificationHandler.flutterLocalNotificationPlugin.cancel(notificationId).then((value) {
- showMissedCallNotification(senderName: bodyJson['sender']['full_name']);
- });
- });
- }
- else{
- int notificationId =Random().nextInt(1000);
- var ios = const IOSNotificationDetails();
- var platform = NotificationDetails(
- android: normalChannel,iOS: ios);
- await NotificationHandler.flutterLocalNotificationPlugin
- .show(notificationId, title, body, platform,payload: body);
- }
- }
- static void showMissedCallNotification({required String senderName}) async{
- int notificationId =Random().nextInt(1000);
- var ios = const IOSNotificationDetails();
- var platform = NotificationDetails(
- android: normalChannel,iOS: ios);
- await NotificationHandler.flutterLocalNotificationPlugin
- .show(notificationId, '📞Missed Call', 'You have missed call from $senderName', platform,payload: 'missedCall');
- }
- }
|