import 'dart:convert'; import 'dart:io'; import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/model/notifications/get_notifications_response_model.dart'; import 'package:diplomaticquarterapp/models/LiveCare/IncomingCallData.dart'; import 'package:diplomaticquarterapp/pages/DrawerPages/notifications/notification_details_page.dart'; import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; import 'package:diplomaticquarterapp/pages/livecare/incoming_call.dart'; import 'package:diplomaticquarterapp/uitl/app-permissions.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart' as fir; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:huawei_push/huawei_push.dart' as h_push; import 'app_shared_preferences.dart'; import 'navigation_service.dart'; // |--> Push Notification Background Future backgroundMessageHandler(dynamic message) async { print("Firebase backgroundMessageHandler!!!"); fir.RemoteMessage message_; if (message is h_push.RemoteMessage) { // if huawei remote message convert it to Firebase Remote Message message_ = toFirebaseRemoteMessage(message); h_push.Push.localNotification({h_push.HMSLocalNotificationAttr.TITLE: 'Background Message', h_push.HMSLocalNotificationAttr.MESSAGE: "By: BackgroundMessageHandler"}); } if (message.data != null && (message.data['is_call'] == 'true' || message.data['is_call'] == true)) { _incomingCall(message.data); return; } else { GetNotificationsResponseModel notification = new GetNotificationsResponseModel(); notification.createdOn = DateUtil.convertDateToString(DateTime.now()); notification.messageTypeData = message.data['picture']; notification.message = message.data['message']; await NavigationService.navigateToPage(NotificationsDetailsPage( notification: notification, )); } } // Push Notification Background <--| RemoteMessage toFirebaseRemoteMessage(h_push.RemoteMessage message) { final payload_data = jsonDecode(message.data); final fire_message = RemoteMessage( from: message.from, collapseKey: message.collapseKey, data: payload_data['data'], messageId: message.messageId, sentTime: DateTime.fromMillisecondsSinceEpoch(message.sentTime * 1000), ttl: message.ttl, category: null, messageType: message.type, notification: RemoteNotification( title: message.notification.title, titleLocArgs: (message.notification.titleLocalizationArgs ?? []).map((e) => e.toString()).toList(), titleLocKey: message.notification.titleLocalizationKey, body: message.notification.body, bodyLocArgs: (message.notification.bodyLocalizationArgs ?? []).map((e) => e.toString()).toList(), bodyLocKey: message.notification.bodyLocalizationKey, android: AndroidNotification( channelId: message.notification.channelId, clickAction: message.notification.clickAction, color: message.notification.color, count: null, imageUrl: message.notification.imageUrl.path, link: message.notification.link.path, smallIcon: message.notification.icon, sound: message.notification.sound, ticker: message.notification.ticker, tag: message.notification.tag, ), )); return fire_message; } _incomingCall(Map data) async { LandingPage.incomingCallData = IncomingCallData.fromJson(data); if (LandingPage.isOpenCallPage == false) { LandingPage.isOpenCallPage = true; final permited = await AppPermission.askVideoCallPermission(currentContext); if (permited) await NavigationService.navigateToPage(IncomingCall(incomingCallData: LandingPage.incomingCallData)); LandingPage.isOpenCallPage = false; } await Future.delayed(Duration(milliseconds: 500)); await AppSharedPreferences().remove('call_data'); } class PushNotificationHandler { final BuildContext context; static PushNotificationHandler _instance; PushNotificationHandler(this.context) { PushNotificationHandler._instance = this; } static PushNotificationHandler getInstance() => _instance; init() async { final fcmToken = await FirebaseMessaging.instance.getToken(); if (fcmToken != null) onToken(fcmToken); if (Platform.isIOS) { final permission = await FirebaseMessaging.instance.requestPermission(); if (permission.authorizationStatus == AuthorizationStatus.denied) return; } // if (Platform.isAndroid && (await FlutterHmsGmsAvailability.isHmsAvailable)) { // // 'Android HMS' (Handle Huawei Push_Kit Streams) // // h_push.Push.enableLogger(); // final result = await h_push.Push.setAutoInitEnabled(true); // // h_push.Push.onNotificationOpenedApp.listen((message) { // newMessage(toFirebaseRemoteMessage(message)); // }, onError: (e) => print(e.toString())); // // h_push.Push.onMessageReceivedStream.listen((message) { // newMessage(toFirebaseRemoteMessage(message)); // }, onError: (e) => print(e.toString())); // // h_push.Push.getTokenStream.listen((token) { // onToken(token); // }, onError: (e) => print(e.toString())); // await h_push.Push.getToken(''); // // h_push.Push.registerBackgroundMessageHandler(backgroundMessageHandler); // } else { // 'Android GMS or iOS' (Handle Firebase Messaging Streams FirebaseMessaging.instance.getInitialMessage().then((RemoteMessage message) async { print("Firebase getInitialMessage!!!"); // Utils.showPermissionConsentDialog(context, "getInitialMessage", (){}); if (Platform.isIOS) await Future.delayed(Duration(milliseconds: 3000)).then((value) { if(message != null) newMessage(message); }); else // if(message != null) newMessage(message); }); FirebaseMessaging.onMessage.listen((RemoteMessage message) async { print("Firebase onMessage!!!"); // Utils.showPermissionConsentDialog(context, "onMessage", (){}); // newMessage(message); if (Platform.isIOS) await Future.delayed(Duration(milliseconds: 3000)).then((value) { newMessage(message); }); else newMessage(message); }); FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) async { print("Firebase onMessageOpenedApp!!!"); // Utils.showPermissionConsentDialog(context, "onMessageOpenedApp", (){}); // newMessage(message); if (Platform.isIOS) await Future.delayed(Duration(milliseconds: 3000)).then((value) { newMessage(message); }); else newMessage(message); }); FirebaseMessaging.instance.onTokenRefresh.listen((fcm_token) { onToken(fcm_token); }); FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler); // } } newMessage(RemoteMessage remoteMessage) async { print("Remote Message: " + remoteMessage.data.toString()); if (remoteMessage.data['is_call'] == 'true' || remoteMessage.data['is_call'] == true) { _incomingCall(remoteMessage.data); } else { GetNotificationsResponseModel notification = new GetNotificationsResponseModel(); notification.createdOn = DateUtil.convertDateToString(DateTime.now()); notification.messageTypeData = remoteMessage.data['picture']; notification.message = remoteMessage.data['message']; await NavigationService.navigateToPage(NotificationsDetailsPage( notification: notification, )); } } onToken(String token) async { print("Push Notification Token: " + token); AppSharedPreferences().setString(PUSH_TOKEN, token); DEVICE_TOKEN = token; } onResume() async { var call_data = await AppSharedPreferences().getObject('call_data'); if (call_data != null) { _incomingCall(call_data); } } } /* todo verify all functionality */ // _firebaseMessaging.configure( // // onMessage: (Map message) async { // // // showDialog("onMessage: $message"); // // print("onMessage: $message"); // // print(message); // // print(message['name']); // // print(message['appointmentdate']); // // // // if (Platform.isIOS) { // // if (message['is_call'] == "true") { // // var route = ModalRoute.of(context); // // // // if (route != null) { // // print(route.settings.name); // // } // //s // // Map myMap = new Map.from(mesage); // // print(myMap); // // LandingPage.isOpenCallPage = true; // // LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); // // if (!isPageNavigated) { // // isPageNavigated = true; // // Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: LandingPage.incomingCallData))).then((value) { // // isPageNavigated = false; // // }); // // } // // } else { // // print("Is Call Not Found iOS"); // // } // // } else { // // print("Is Call Not Found iOS"); // // } // // // // if (Platform.isAndroid) { // // if (message['data'].containsKey("is_call")) { // // var route = ModalRoute.of(context); // // // // if (route != null) { // // print(route.settings.name); // // } // // // // Map myMap = new Map.from(message['data']); // // print(myMap); // // if (LandingPage.isOpenCallPage) { // // return; // // } // // LandingPage.isOpenCallPage = true; // // LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); // // if (!isPageNavigated) { // // isPageNavigated = true; // // Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: LandingPage.incomingCallData))).then((value) { // // Future.delayed(Duration(seconds: 5), () { // // isPageNavigated = false; // // }); // // }); // // } // // } else { // // print("Is Call Not Found Android"); // // LocalNotification.getInstance().showNow(title: message['notification']['title'], subtitle: message['notification']['body']); // // } // // } else { // // print("Is Call Not Found Android"); // // } // // }, // onBackgroundMessage: Platform.isIOS ? null : myBackgroundMessageHandler, // onLaunch: (Map message) async { // print("onLaunch: $message"); // // showDialog("onLaunch: $message"); // }, // onResume: (Map message) async { // print("onResume: $message"); // print(message); // print(message['name']); // print(message['appointmentdate']); // // // showDialog("onResume: $message"); // // if (Platform.isIOS) { // if (message['is_call'] == "true") { // var route = ModalRoute.of(context); // // if (route != null) { // print(route.settings.name); // } // // Map myMap = new Map.from(message); // print(myMap); // LandingPage.isOpenCallPage = true; // LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); // if (!isPageNavigated) { // isPageNavigated = true; // Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: LandingPage.incomingCallData))).then((value) { // isPageNavigated = false; // }); // } // } else { // print("Is Call Not Found iOS"); // } // } else { // print("Is Call Not Found iOS"); // } // }, // );