import 'dart:convert'; import 'dart:io'; import 'package:SEFER/controller/home/captin/home_captain_controller.dart'; import 'package:SEFER/env/env.dart'; import 'package:SEFER/views/widgets/mydialoug.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:http/http.dart' as http; import 'package:SEFER/views/widgets/elevated_btn.dart'; import '../../constant/api_key.dart'; import '../../constant/box_name.dart'; import '../../constant/colors.dart'; import '../../constant/style.dart'; import '../../main.dart'; import '../../views/auth/captin/criminal_documents_page.dart'; import '../../views/home/Captin/home_captain/home_captin.dart'; import '../../views/home/Captin/orderCaptin/order_speed_request.dart'; import '../../views/home/Captin/orderCaptin/order_request_page.dart'; import '../../views/home/Captin/orderCaptin/vip_order_page.dart'; import '../auth/google_sign.dart'; import '../functions/face_detect.dart'; import 'access_token.dart'; import 'local_notification.dart'; class FirebaseMessagesController extends GetxController { final fcmToken = FirebaseMessaging.instance; List tokens = []; List dataTokens = []; late String driverID; late String driverToken; NotificationSettings? notificationSettings; Future getNotificationSettings() async { // Get the current notification settings NotificationSettings? notificationSettings = await FirebaseMessaging.instance.getNotificationSettings(); 'Notification authorization status: ${notificationSettings.authorizationStatus}'; // Call the update function if needed update(); } Future requestFirebaseMessagingPermission() async { FirebaseMessaging messaging = FirebaseMessaging.instance; // Check if the platform is Android if (Platform.isAndroid) { // Request permission for Android await messaging.requestPermission(); } else if (Platform.isIOS) { // Request permission for iOS NotificationSettings settings = await messaging.requestPermission( alert: true, announcement: true, badge: true, carPlay: true, criticalAlert: true, provisional: false, sound: true, ); messaging.setForegroundNotificationPresentationOptions( alert: true, badge: true, sound: true); } } Future getToken() async { fcmToken.getToken().then((token) { box.write(BoxName.tokenDriver, token); }); FirebaseMessaging.onMessage.listen((RemoteMessage message) { // If the app is in the background or terminated, show a system tray message RemoteNotification? notification = message.notification; AndroidNotification? android = notification?.android; // if (notification != null && android != null) { if (message.data.isNotEmpty && message.notification != null) { fireBaseTitles(message); } }); FirebaseMessaging.onBackgroundMessage((RemoteMessage message) async { // if (message.notification!.title! == 'Order'.tr) { // if (Platform.isAndroid) { // NotificationController1() // .showNotification('Order'.tr, '', 'order', 'order_page_payload'); // } // // await FirebaseMessagesController().showOverlayNotification(message); // var myListString = message.data['DriverList']; // // var points = message.data['PolylineJson']; // var myList = jsonDecode(myListString) as List; // // var myPoints = jsonDecode(points) as List; // driverToken = myList[14].toString(); // // This is for location using and uploading status // Get.put(HomeCaptainController()).changeRideId(); // update(); // Get.to(() => OrderRequestPage(), arguments: { // 'myListString': myListString, // 'DriverList': myList, // // 'PolylineJson': myPoints, // 'body': message.notification!.body // }); // } }); FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { if (message.data.isNotEmpty && message.notification != null) { fireBaseTitles(message); } }); } Future fireBaseTitles(RemoteMessage message) async { if (message.notification!.title! == 'Order'.tr) { if (Platform.isAndroid) { NotificationController().showNotification('Order'.tr, '', 'order', ''); } // await FirebaseMessagesController().showOverlayNotification(message); var myListString = message.data['DriverList']; // var points = message.data['PolylineJson']; var myList = jsonDecode(myListString) as List; // var myPoints = jsonDecode(points) as List; driverToken = myList[14].toString(); // This is for location using and uploading status Get.put(HomeCaptainController()).changeRideId(); update(); Get.to(() => OrderRequestPage(), arguments: { 'myListString': myListString, 'DriverList': myList, // 'PolylineJson': myPoints, 'body': message.notification!.body }); } else if (message.notification!.title == 'Cancel Trip') { if (Platform.isAndroid) { NotificationController1().showNotification( 'Cancel Trip'.tr, 'Passenger Cancel Trip'.tr, 'cancel', ''); } cancelTripDialog(); } else if (message.notification!.title == 'VIP Order') { var myListString = message.data['DriverList']; var driverList = jsonDecode(myListString) as List; if (Platform.isAndroid) { NotificationController1() .showNotification('VIP Order'.tr, '', 'order', ''); } MyDialog().getDialog('VIP Order'.tr, 'midTitle', () { sendNotificationToPassengerToken( 'VIP Order Accepted'.tr, 'The driver accepted your trip'.tr, driverList[0], [driverList[1]], 'order'); }); // Get.to(const VipOrderPage()); } else if (message.notification!.title! == 'message From passenger'.tr) { passengerDialog(message.notification!.body!); if (Platform.isAndroid) { NotificationController() .showNotification('message From passenger'.tr, ''.tr, 'ding', ''); } } else if (message.notification!.title == 'Cancel') { cancelTripDialog1(); if (Platform.isAndroid) { NotificationController() .showNotification('Cancel'.tr, ''.tr, 'cancel', ''); } } else if (message.notification!.title! == 'token change') { // NotificationController1() // .showNotification('token change'.tr, 'token change', 'cancel'); // GoogleSignInHelper.signOut(); GoogleSignInHelper.signOut(); } else if (message.notification!.title! == 'face detect') { if (Platform.isAndroid) { NotificationController() .showNotification('face detect'.tr, ''.tr, 'tone2', ''); } String result0 = await faceDetector(); // Handle the result here, e.g., show a dialog or update the UI var result = jsonDecode(result0); Get.defaultDialog( barrierDismissible: false, title: 'Face Detection Result'.tr, titleStyle: AppStyle.title, content: Text( result['similar'].toString() == 'true' ? 'similar'.tr : 'not similar'.tr, style: AppStyle.title, ), backgroundColor: result['similar'].toString() == 'true' ? AppColor.greenColor : AppColor.redColor, confirm: MyElevatedButton( title: 'OK'.tr, onPressed: () { Get.back(); })); update(); } else if (message.notification!.title! == 'Hi ,I will go now') { // Get.snackbar('Hi ,I will go now', '', // backgroundColor: AppColor.greenColor); if (Platform.isAndroid) { NotificationController1().showNotification( 'Passenger come to you'.tr, 'Hi ,I will go now'.tr, 'tone2', ''); } update(); } else if (message.notification!.title! == 'Call Income'.tr) { try { var myListString = message.data['passengerList']; var driverList = jsonDecode(myListString) as List; // if (Platform.isAndroid) { if (Platform.isAndroid) { NotificationController1().showNotification('Call Income'.tr, message.notification!.body!, 'iphone_ringtone', ''); } // } // Assuming GetMaterialApp is initialized and context is valid for navigation // Get.to(() => PassengerCallPage( // channelName: driverList[1].toString(), // token: driverList[0].toString(), // remoteID: driverList[2].toString(), // )); } catch (e) {} } else if (message.notification!.title! == 'Call Income from Passenger'.tr) { try { var myListString = message.data['passengerList']; var driverList = jsonDecode(myListString) as List; // if (Platform.isAndroid) { if (Platform.isAndroid) { NotificationController1().showNotification('Call Income'.tr, message.notification!.body!, 'iphone_ringtone', ''); } // } // Assuming GetMaterialApp is initialized and context is valid for navigation // Get.to(() => CallPage( // // channelName: driverList[1].toString(), // // token: driverList[0].toString(), // // remoteID: driverList[2].toString(), // )); } catch (e) {} } else if (message.notification!.title! == "Criminal Document Required".tr) { if (Platform.isAndroid) { NotificationController1().showNotification( "Criminal Document Required".tr, message.notification!.body!, 'tone2', ''); } MyDialog().getDialog( "Criminal Document Required".tr, 'You should have upload it .'.tr, () { Get.to(() => const CriminalDocumemtPage()); }); Get.to(() => const CriminalDocumemtPage()); } else if (message.notification!.title! == 'Call End'.tr) { try { var myListString = message.data['passengerList']; var driverList = jsonDecode(myListString) as List; if (Platform.isAndroid) { NotificationController1().showNotification( 'Call End'.tr, message.notification!.body!, 'tone2', ''); } // Assuming GetMaterialApp is initialized and context is valid for navigation // Get.off(const CallPage()); } catch (e) {} } else if (message.notification!.title! == 'Order Applied'.tr) { Get.snackbar( "The order has been accepted by another driver." .tr, // Corrected grammar "Be more mindful next time to avoid dropping orders." .tr, // Improved sentence structure backgroundColor: AppColor.yellowColor, snackPosition: SnackPosition.BOTTOM, ); } else if (message.notification!.title! == 'OrderSpeed') { var myListString = message.data['DriverList']; // var points = message.data['PolylineJson']; var myList = jsonDecode(myListString) as List; // var myPoints = jsonDecode(points) as List; driverToken = myList[14].toString(); update(); Get.to(() => OrderSpeedRequest(), arguments: { 'myListString': myListString, 'DriverList': myList, // 'PolylineJson': myPoints, 'body': message.notification!.body }); } else if (message.notification!.title! == 'Order Applied'.tr) { if (Platform.isAndroid) { NotificationController1().showNotification( 'The order Accepted by another Driver'.tr, 'We regret to inform you that another driver has accepted this order.' .tr, 'order', ''); } } } SnackbarController driverAppliedTripSnakBar() { return Get.snackbar( 'Driver Applied the Ride for You'.tr, '', colorText: AppColor.greenColor, duration: const Duration(seconds: 3), snackPosition: SnackPosition.TOP, titleText: Text( 'Applied'.tr, style: const TextStyle(color: AppColor.redColor), ), messageText: Text( 'Driver Applied the Ride for You'.tr, style: AppStyle.title, ), icon: const Icon(Icons.approval), shouldIconPulse: true, margin: const EdgeInsets.all(16), padding: const EdgeInsets.all(16), ); } Future cancelTripDialog() { return Get.defaultDialog( barrierDismissible: false, title: 'Passenger Cancel Trip'.tr, middleText: '', confirm: MyElevatedButton( title: 'Ok'.tr, onPressed: () { box.write(BoxName.rideStatus, 'Cancel'); Get.offAll(HomeCaptain()); })); } Future cancelTripDialog1() { return Get.defaultDialog( barrierDismissible: false, title: 'Passenger Cancel Trip'.tr, middleText: 'Trip Cancelled. The cost of the trip will be added to your wallet.' .tr, confirm: MyElevatedButton( title: 'Ok'.tr, onPressed: () { box.write(BoxName.rideStatus, 'Cancel'); Get.offAll(HomeCaptain()); })); } // Future driverArrivePassengerDialoge() { // return Get.defaultDialog( // barrierDismissible: false, // title: 'Hi ,I Arrive your site'.tr, // middleText: 'Please go to Car Driver'.tr, // confirm: MyElevatedButton( // title: 'Ok I will go now.'.tr, // onPressed: () { // FirebaseMessagesController().sendNotificationToPassengerToken( // 'Hi ,I will go now'.tr, // 'I will go now'.tr, // Get.find().driverToken, []); // Get.find() // .startTimerDriverWaitPassenger5Minute(); // Get.back(); // })); // } Future passengerDialog(String message) { return Get.defaultDialog( barrierDismissible: false, title: 'message From passenger'.tr, titleStyle: AppStyle.title, middleTextStyle: AppStyle.title, middleText: message.tr, confirm: MyElevatedButton( title: 'Ok'.tr, onPressed: () { // FirebaseMessagesController().sendNotificationToPassengerToken( // 'Hi ,I will go now'.tr, // 'I will go now'.tr, // Get.find().driverToken, []); // Get.find() // .startTimerDriverWaitPassenger5Minute(); Get.back(); })); } // Future driverFinishTripDialoge(List driverList) { // return Get.defaultDialog( // title: 'Driver Finish Trip'.tr, // content: const DriverTipWidget(), // confirm: MyElevatedButton( // title: 'Yes'.tr, // onPressed: () async { // var tip = (Get.find().totalPassenger) * // (double.parse(box.read(BoxName.tipPercentage.toString()))); // var res = await CRUD().post(link: AppLink.addTips, payload: { // 'passengerID': box.read(BoxName.passengerID), // 'driverID': driverList[0].toString(), // 'rideID': driverList[1].toString(), // 'tipAmount': tip.toString(), // }); // await CRUD().post(link: AppLink.addPassengersWallet, payload: { // 'passenger_id': box.read(BoxName.passengerID).toString(), // 'balance': ((-1) * tip).toString() // }); // await CRUD().post(link: AppLink.addDriversWalletPoints, payload: { // 'driverID': driverList[0].toString(), // 'paymentID': '${Get.find().rideId}tip', // 'amount': (tip * 100).toString(), // 'paymentMethod': 'visa-tip', // }); // if (res != 'failure') { // FirebaseMessagesController().sendNotificationToAnyWithoutData( // 'You Have Tips', // '${'${tip.toString()}\$${' tips\nTotal is'.tr}'} ${tip + (Get.find().totalPassenger)}', // driverList[2].toString(), // ); // } // Get.to(() => RateDriverFromPassenger(), arguments: { // 'driverId': driverList[0].toString(), // 'rideId': driverList[1].toString(), // 'price': driverList[3].toString() // }); // }, // kolor: AppColor.greenColor, // ), // cancel: MyElevatedButton( // title: 'No,I want'.tr, // onPressed: () { // Get.to(() => RateDriverFromPassenger(), arguments: { // 'driverId': driverList[0].toString(), // 'rideId': driverList[1].toString(), // 'price': driverList[3].toString() // }); // }, // kolor: AppColor.redColor, // )); // } void sendNotificationAll(String title, body, tone) async { // Get the token you want to subtract. String token = box.read(BoxName.tokenFCM); tokens = box.read(BoxName.tokens); // Subtract the token from the list of tokens. tokens.remove(token); // Save the list of tokens back to the box. // box.write(BoxName.tokens, tokens); tokens = box.read(BoxName.tokens); for (var i = 0; i < tokens.length; i++) { String serviceAccountKeyJson = '''{ "type": "service_account", "project_id": "ride-b1bd8", "private_key_id": "75e817c0b902db2ef35edf2c2bd159dec1f13249", "private_key": "-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD0zH9TQGDQHUv3\\na3/JAD1UKPwAp3wNKT0a6fxiIzjI3JxQWI30QvZCcfl6CdMhIcydX1ncSaYTcEeC\\n/AdPVCPkqyJx1YIGGg6P/mRzCWeaN8fsp6z250m5vcObDCZc3dbJEkepbep+6FPY\\n21m3KO+AHh1glgsTGZOTm5xiU8NGXpdk2QEh8wpiIIlR/HuKwVw9g8urNe3Sno+U\\nDm3z37iFqvZdmpqO8aWTJu6beb3hsREK9XK2I9JqC2JUwiGQRo3idOvPP6hkqrWx\\nKSX96vglQFYfakvJdDp2ZATOlpBYPMtS/IWhJ985u58TSS+Kl8qpnpaZBSxgJirf\\nhWzhnKLfAgMBAAECggEAJP785SePGhS7ZN6ltspm+l+hSjYFrPWFCxq+rlQ1YkHZ\\nC9l+RqKSFhOkiPmQI2s4wbXl3kFxLHHlFNoi/q2wKQBmGb8TQfnRJpjjNHGA61Ev\\n0Ue7/6qPvVb9B2MsLw/FxKiTFPuMG3bgKR9pbSFuJLYoaW7zqITOhVnYphGTqwAY\\nBVVcvISSLvELDmH9VZcv/9DVqVlqbbESHWh1Z4W6XGPoEqeDH/upNTyQQ/46Msgm\\nTGE6VqLHpWuSf6SqHp+r0Y0lI3vIPM1vz5FAJDJbOE/enHa0fSup0OHSMxl0HVMn\\nnO1yrGF3vsIPOej5HKr5d71bEIckzk73/yjNC1/mDQKBgQD7RtUvc9omsSsFMJ6e\\nBASAn6Dktx/QY/XNJjFzHQj69cywLDe5t5AL2gUi3phQ2oqB5XJdwnd5bTIEPEPZ\\nDOuOai2802p6FJk6kjmZAMVGx5JtXBH+vs6jrmQQSMiKbjwN1TT6xIWakvLOonUi\\nX6ZvjYYjU/E0YJU3jSiXWEr76wKBgQD5Zn4SouJ6BCDZMbausJVMBkk3qxsYooip\\np89WakC6e7AZinpkRcqjGGV9GOvc8crJs6fyXAA9ORepGP47Mc0ZrDssOkstznsM\\npr8R0S6MKwEZaT9ixOHdOcLZ47ps+JzA2Wr4KN2OvFHksUkB/46ATD1j9WZVgB8M\\namsYp/Y73QKBgHOo+PvsoZ9psVmkNX6abtAdqdtdB0HOoRea2uwXk0ig12TIFaZg\\nfedWpUKVnxqoXVTJHklV99RmlL0qWDiSH+LfsMnXro0e6iDxqZ1po2Se/CFmXcoa\\nXdctsFVmixhdATuExewfhTfPKABA+xWlXWC/jdy5CK+JPWXijaqMM4edAoGAE5Bj\\nsWiPpYyvWvpYX0nA3G7dzX0hqgQN/mkIjbnWDArp3IcNZNJIvBSM2Yxb7EAXbU0n\\njo6DAkp5Pa2VO+WDNlFZbvW/sf8xjeOCt44WPa6d7nVgIIpbQXRngZoopKW3/jTP\\n/FmQT8McFXmGxZ5belsAsdetSGW9icbLUerTGQ0CgYEAmf/G8Ag3XxmqTXvvHuv2\\n14OP7WnrVqkEMnydrftEwn4peXd/Lz+/GYX5Zc4ZoNgbN8IvZ5z0+OmRsallsbiW\\nBw0/tc68CjzxXOvReWxDluUopqWVGj5tlGqE5xUDku9SWJSxbkiQ3rqutzBdPXpr\\noqHwPyDrmK/Zgqn+uiIm4Ck=\\n-----END PRIVATE KEY-----\\n", "client_email": "firebase-adminsdk-o2wqi@ride-b1bd8.iam.gserviceaccount.com", "client_id": "111210077025005706623", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-o2wqi%40ride-b1bd8.iam.gserviceaccount.com", "universe_domain": "googleapis.com" } '''; // As defined above // Initialize AccessTokenManager final accessTokenManager = AccessTokenManager(serviceAccountKeyJson); // Obtain an OAuth 2.0 access token final accessToken = await accessTokenManager.getAccessToken(); // Send the notification final response = await http .post( Uri.parse( 'https://fcm.googleapis.com/v1/projects/ride-b1bd8/messages:send'), headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer $accessToken', }, body: jsonEncode({ 'message': { 'token': token, 'notification': { 'title': title, 'body': body, }, // 'data': { // 'DriverList': jsonEncode(data), // }, 'android': { 'priority': 'high', // Set priority to high 'notification': { 'sound': tone, }, }, 'apns': { 'headers': { 'apns-priority': '10', // Set APNs priority to 10 }, 'payload': { 'aps': { 'sound': tone, }, }, }, }, }), ) .whenComplete(() {}) .catchError((e) {}); } } // for (var i = 0; i < tokens.length; i++) { // http // .post(Uri.parse('https://fcm.googleapis.com/fcm/send'), // headers: { // 'Content-Type': 'application/json', // 'Authorization': 'key=${storage.read(key: BoxName.serverAPI}' // }, // body: jsonEncode({ // 'notification': { // 'title': title, // 'body': body, // 'sound': 'true' // }, // 'priority': 'high', // 'data': { // 'click_action': 'FLUTTER_NOTIFICATION_CLICK', // 'id': '1', // 'status': 'done' // }, // 'to': tokens[i], // })) // .whenComplete(() {}) // .catchError((e) { // }); // } // } //android/app/src/main/res/raw/iphone_ringtone.wav void sendNotificationToPassengerToken( String title, body, token, List map, String tone, {int retryCount = 2}) async { try { String serviceAccountKeyJson = '''{ "type": "service_account", "project_id": "ride-b1bd8", "private_key_id": "75e817c0b902db2ef35edf2c2bd159dec1f13249", "private_key": "-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD0zH9TQGDQHUv3\\na3/JAD1UKPwAp3wNKT0a6fxiIzjI3JxQWI30QvZCcfl6CdMhIcydX1ncSaYTcEeC\\n/AdPVCPkqyJx1YIGGg6P/mRzCWeaN8fsp6z250m5vcObDCZc3dbJEkepbep+6FPY\\n21m3KO+AHh1glgsTGZOTm5xiU8NGXpdk2QEh8wpiIIlR/HuKwVw9g8urNe3Sno+U\\nDm3z37iFqvZdmpqO8aWTJu6beb3hsREK9XK2I9JqC2JUwiGQRo3idOvPP6hkqrWx\\nKSX96vglQFYfakvJdDp2ZATOlpBYPMtS/IWhJ985u58TSS+Kl8qpnpaZBSxgJirf\\nhWzhnKLfAgMBAAECggEAJP785SePGhS7ZN6ltspm+l+hSjYFrPWFCxq+rlQ1YkHZ\\nC9l+RqKSFhOkiPmQI2s4wbXl3kFxLHHlFNoi/q2wKQBmGb8TQfnRJpjjNHGA61Ev\\n0Ue7/6qPvVb9B2MsLw/FxKiTFPuMG3bgKR9pbSFuJLYoaW7zqITOhVnYphGTqwAY\\nBVVcvISSLvELDmH9VZcv/9DVqVlqbbESHWh1Z4W6XGPoEqeDH/upNTyQQ/46Msgm\\nTGE6VqLHpWuSf6SqHp+r0Y0lI3vIPM1vz5FAJDJbOE/enHa0fSup0OHSMxl0HVMn\\nnO1yrGF3vsIPOej5HKr5d71bEIckzk73/yjNC1/mDQKBgQD7RtUvc9omsSsFMJ6e\\nBASAn6Dktx/QY/XNJjFzHQj69cywLDe5t5AL2gUi3phQ2oqB5XJdwnd5bTIEPEPZ\\nDOuOai2802p6FJk6kjmZAMVGx5JtXBH+vs6jrmQQSMiKbjwN1TT6xIWakvLOonUi\\nX6ZvjYYjU/E0YJU3jSiXWEr76wKBgQD5Zn4SouJ6BCDZMbausJVMBkk3qxsYooip\\np89WakC6e7AZinpkRcqjGGV9GOvc8crJs6fyXAA9ORepGP47Mc0ZrDssOkstznsM\\npr8R0S6MKwEZaT9ixOHdOcLZ47ps+JzA2Wr4KN2OvFHksUkB/46ATD1j9WZVgB8M\\namsYp/Y73QKBgHOo+PvsoZ9psVmkNX6abtAdqdtdB0HOoRea2uwXk0ig12TIFaZg\\nfedWpUKVnxqoXVTJHklV99RmlL0qWDiSH+LfsMnXro0e6iDxqZ1po2Se/CFmXcoa\\nXdctsFVmixhdATuExewfhTfPKABA+xWlXWC/jdy5CK+JPWXijaqMM4edAoGAE5Bj\\nsWiPpYyvWvpYX0nA3G7dzX0hqgQN/mkIjbnWDArp3IcNZNJIvBSM2Yxb7EAXbU0n\\njo6DAkp5Pa2VO+WDNlFZbvW/sf8xjeOCt44WPa6d7nVgIIpbQXRngZoopKW3/jTP\\n/FmQT8McFXmGxZ5belsAsdetSGW9icbLUerTGQ0CgYEAmf/G8Ag3XxmqTXvvHuv2\\n14OP7WnrVqkEMnydrftEwn4peXd/Lz+/GYX5Zc4ZoNgbN8IvZ5z0+OmRsallsbiW\\nBw0/tc68CjzxXOvReWxDluUopqWVGj5tlGqE5xUDku9SWJSxbkiQ3rqutzBdPXpr\\noqHwPyDrmK/Zgqn+uiIm4Ck=\\n-----END PRIVATE KEY-----\\n", "client_email": "firebase-adminsdk-o2wqi@ride-b1bd8.iam.gserviceaccount.com", "client_id": "111210077025005706623", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-o2wqi%40ride-b1bd8.iam.gserviceaccount.com", "universe_domain": "googleapis.com" } '''; // As defined above // Initialize AccessTokenManager final accessTokenManager = AccessTokenManager(serviceAccountKeyJson); // Obtain an OAuth 2.0 access token final accessToken = await accessTokenManager.getAccessToken(); // Send the notification final response = await http.post( Uri.parse( 'https://fcm.googleapis.com/v1/projects/ride-b1bd8/messages:send'), headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer $accessToken', }, body: jsonEncode({ 'message': { 'token': token, 'notification': { 'title': title, 'body': body, }, 'data': { 'passengerList': jsonEncode(map), }, 'android': { 'priority': 'high', // Set priority to high 'notification': { 'sound': tone, }, }, 'apns': { 'headers': { 'apns-priority': '10', // Set APNs priority to 10 }, 'payload': { 'aps': { 'sound': tone, }, }, }, }, }), ); if (response.statusCode == 200) { print( 'Notification sent successfully. Status code: ${response.statusCode}'); print('Response body: ${response.body}'); } else { print( 'Failed to send notification. Status code: ${response.statusCode}'); print('Response body: ${response.body}'); if (retryCount > 0) { print('Retrying... Attempts remaining: $retryCount'); await Future.delayed( const Duration(seconds: 2)); // Optional delay before retrying return sendNotificationToPassengerToken(title, body, token, map, tone, retryCount: retryCount - 1); } } } catch (e) { print('Error sending notification: $e'); if (retryCount > 0) { print('Retrying... Attempts remaining: $retryCount'); await Future.delayed( const Duration(seconds: 2)); // Optional delay before retrying return sendNotificationToPassengerToken(title, body, token, map, tone, retryCount: retryCount - 1); } } } void sendNotificationToPassengerTokenCALL( String title, body, token, List map, String tone, {int retryCount = 2}) async { try { String serviceAccountKeyJson = '''{ "type": "service_account", "project_id": "ride-b1bd8", "private_key_id": "75e817c0b902db2ef35edf2c2bd159dec1f13249", "private_key": "-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD0zH9TQGDQHUv3\\na3/JAD1UKPwAp3wNKT0a6fxiIzjI3JxQWI30QvZCcfl6CdMhIcydX1ncSaYTcEeC\\n/AdPVCPkqyJx1YIGGg6P/mRzCWeaN8fsp6z250m5vcObDCZc3dbJEkepbep+6FPY\\n21m3KO+AHh1glgsTGZOTm5xiU8NGXpdk2QEh8wpiIIlR/HuKwVw9g8urNe3Sno+U\\nDm3z37iFqvZdmpqO8aWTJu6beb3hsREK9XK2I9JqC2JUwiGQRo3idOvPP6hkqrWx\\nKSX96vglQFYfakvJdDp2ZATOlpBYPMtS/IWhJ985u58TSS+Kl8qpnpaZBSxgJirf\\nhWzhnKLfAgMBAAECggEAJP785SePGhS7ZN6ltspm+l+hSjYFrPWFCxq+rlQ1YkHZ\\nC9l+RqKSFhOkiPmQI2s4wbXl3kFxLHHlFNoi/q2wKQBmGb8TQfnRJpjjNHGA61Ev\\n0Ue7/6qPvVb9B2MsLw/FxKiTFPuMG3bgKR9pbSFuJLYoaW7zqITOhVnYphGTqwAY\\nBVVcvISSLvELDmH9VZcv/9DVqVlqbbESHWh1Z4W6XGPoEqeDH/upNTyQQ/46Msgm\\nTGE6VqLHpWuSf6SqHp+r0Y0lI3vIPM1vz5FAJDJbOE/enHa0fSup0OHSMxl0HVMn\\nnO1yrGF3vsIPOej5HKr5d71bEIckzk73/yjNC1/mDQKBgQD7RtUvc9omsSsFMJ6e\\nBASAn6Dktx/QY/XNJjFzHQj69cywLDe5t5AL2gUi3phQ2oqB5XJdwnd5bTIEPEPZ\\nDOuOai2802p6FJk6kjmZAMVGx5JtXBH+vs6jrmQQSMiKbjwN1TT6xIWakvLOonUi\\nX6ZvjYYjU/E0YJU3jSiXWEr76wKBgQD5Zn4SouJ6BCDZMbausJVMBkk3qxsYooip\\np89WakC6e7AZinpkRcqjGGV9GOvc8crJs6fyXAA9ORepGP47Mc0ZrDssOkstznsM\\npr8R0S6MKwEZaT9ixOHdOcLZ47ps+JzA2Wr4KN2OvFHksUkB/46ATD1j9WZVgB8M\\namsYp/Y73QKBgHOo+PvsoZ9psVmkNX6abtAdqdtdB0HOoRea2uwXk0ig12TIFaZg\\nfedWpUKVnxqoXVTJHklV99RmlL0qWDiSH+LfsMnXro0e6iDxqZ1po2Se/CFmXcoa\\nXdctsFVmixhdATuExewfhTfPKABA+xWlXWC/jdy5CK+JPWXijaqMM4edAoGAE5Bj\\nsWiPpYyvWvpYX0nA3G7dzX0hqgQN/mkIjbnWDArp3IcNZNJIvBSM2Yxb7EAXbU0n\\njo6DAkp5Pa2VO+WDNlFZbvW/sf8xjeOCt44WPa6d7nVgIIpbQXRngZoopKW3/jTP\\n/FmQT8McFXmGxZ5belsAsdetSGW9icbLUerTGQ0CgYEAmf/G8Ag3XxmqTXvvHuv2\\n14OP7WnrVqkEMnydrftEwn4peXd/Lz+/GYX5Zc4ZoNgbN8IvZ5z0+OmRsallsbiW\\nBw0/tc68CjzxXOvReWxDluUopqWVGj5tlGqE5xUDku9SWJSxbkiQ3rqutzBdPXpr\\noqHwPyDrmK/Zgqn+uiIm4Ck=\\n-----END PRIVATE KEY-----\\n", "client_email": "firebase-adminsdk-o2wqi@ride-b1bd8.iam.gserviceaccount.com", "client_id": "111210077025005706623", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-o2wqi%40ride-b1bd8.iam.gserviceaccount.com", "universe_domain": "googleapis.com" } '''; // As defined above // Initialize AccessTokenManager final accessTokenManager = AccessTokenManager(serviceAccountKeyJson); // Obtain an OAuth 2.0 access token final accessToken = await accessTokenManager.getAccessToken(); // Send the notification final response = await http.post( Uri.parse( 'https://fcm.googleapis.com/v1/projects/ride-b1bd8/messages:send'), headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer $accessToken', }, body: jsonEncode({ 'message': { 'token': token, 'notification': { 'title': title, 'body': body, }, 'data': { 'passengerList': jsonEncode(map), }, 'android': { 'priority': 'high', // Set priority to high 'notification': { 'sound': tone, }, }, 'apns': { 'headers': { 'apns-priority': '10', // Set APNs priority to 10 }, 'payload': { 'aps': { 'sound': tone, }, }, }, }, }), ); if (response.statusCode == 200) { print( 'Notification sent successfully. Status code: ${response.statusCode}'); print('Response body: ${response.body}'); } else { print( 'Failed to send notification. Status code: ${response.statusCode}'); print('Response body: ${response.body}'); if (retryCount > 0) { print('Retrying... Attempts remaining: $retryCount'); await Future.delayed( const Duration(seconds: 2)); // Optional delay before retrying return sendNotificationToPassengerTokenCALL( title, body, token, map, tone, retryCount: retryCount - 1); } } } catch (e) { print('Error sending notification: $e'); if (retryCount > 0) { print('Retrying... Attempts remaining: $retryCount'); await Future.delayed( const Duration(seconds: 2)); // Optional delay before retrying return sendNotificationToPassengerTokenCALL( title, body, token, map, tone, retryCount: retryCount - 1); } } } void sendNotificationToAnyWithoutData( String title, String body, String token, String tone, {int retryCount = 2}) async { try { String serviceAccountKeyJson = '''{ "type": "service_account", "project_id": "ride-b1bd8", "private_key_id": "75e817c0b902db2ef35edf2c2bd159dec1f13249", "private_key": "-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD0zH9TQGDQHUv3\\na3/JAD1UKPwAp3wNKT0a6fxiIzjI3JxQWI30QvZCcfl6CdMhIcydX1ncSaYTcEeC\\n/AdPVCPkqyJx1YIGGg6P/mRzCWeaN8fsp6z250m5vcObDCZc3dbJEkepbep+6FPY\\n21m3KO+AHh1glgsTGZOTm5xiU8NGXpdk2QEh8wpiIIlR/HuKwVw9g8urNe3Sno+U\\nDm3z37iFqvZdmpqO8aWTJu6beb3hsREK9XK2I9JqC2JUwiGQRo3idOvPP6hkqrWx\\nKSX96vglQFYfakvJdDp2ZATOlpBYPMtS/IWhJ985u58TSS+Kl8qpnpaZBSxgJirf\\nhWzhnKLfAgMBAAECggEAJP785SePGhS7ZN6ltspm+l+hSjYFrPWFCxq+rlQ1YkHZ\\nC9l+RqKSFhOkiPmQI2s4wbXl3kFxLHHlFNoi/q2wKQBmGb8TQfnRJpjjNHGA61Ev\\n0Ue7/6qPvVb9B2MsLw/FxKiTFPuMG3bgKR9pbSFuJLYoaW7zqITOhVnYphGTqwAY\\nBVVcvISSLvELDmH9VZcv/9DVqVlqbbESHWh1Z4W6XGPoEqeDH/upNTyQQ/46Msgm\\nTGE6VqLHpWuSf6SqHp+r0Y0lI3vIPM1vz5FAJDJbOE/enHa0fSup0OHSMxl0HVMn\\nnO1yrGF3vsIPOej5HKr5d71bEIckzk73/yjNC1/mDQKBgQD7RtUvc9omsSsFMJ6e\\nBASAn6Dktx/QY/XNJjFzHQj69cywLDe5t5AL2gUi3phQ2oqB5XJdwnd5bTIEPEPZ\\nDOuOai2802p6FJk6kjmZAMVGx5JtXBH+vs6jrmQQSMiKbjwN1TT6xIWakvLOonUi\\nX6ZvjYYjU/E0YJU3jSiXWEr76wKBgQD5Zn4SouJ6BCDZMbausJVMBkk3qxsYooip\\np89WakC6e7AZinpkRcqjGGV9GOvc8crJs6fyXAA9ORepGP47Mc0ZrDssOkstznsM\\npr8R0S6MKwEZaT9ixOHdOcLZ47ps+JzA2Wr4KN2OvFHksUkB/46ATD1j9WZVgB8M\\namsYp/Y73QKBgHOo+PvsoZ9psVmkNX6abtAdqdtdB0HOoRea2uwXk0ig12TIFaZg\\nfedWpUKVnxqoXVTJHklV99RmlL0qWDiSH+LfsMnXro0e6iDxqZ1po2Se/CFmXcoa\\nXdctsFVmixhdATuExewfhTfPKABA+xWlXWC/jdy5CK+JPWXijaqMM4edAoGAE5Bj\\nsWiPpYyvWvpYX0nA3G7dzX0hqgQN/mkIjbnWDArp3IcNZNJIvBSM2Yxb7EAXbU0n\\njo6DAkp5Pa2VO+WDNlFZbvW/sf8xjeOCt44WPa6d7nVgIIpbQXRngZoopKW3/jTP\\n/FmQT8McFXmGxZ5belsAsdetSGW9icbLUerTGQ0CgYEAmf/G8Ag3XxmqTXvvHuv2\\n14OP7WnrVqkEMnydrftEwn4peXd/Lz+/GYX5Zc4ZoNgbN8IvZ5z0+OmRsallsbiW\\nBw0/tc68CjzxXOvReWxDluUopqWVGj5tlGqE5xUDku9SWJSxbkiQ3rqutzBdPXpr\\noqHwPyDrmK/Zgqn+uiIm4Ck=\\n-----END PRIVATE KEY-----\\n", "client_email": "firebase-adminsdk-o2wqi@ride-b1bd8.iam.gserviceaccount.com", "client_id": "111210077025005706623", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-o2wqi%40ride-b1bd8.iam.gserviceaccount.com", "universe_domain": "googleapis.com" } '''; // As defined above // Initialize AccessTokenManager final accessTokenManager = AccessTokenManager(serviceAccountKeyJson); // Obtain an OAuth 2.0 access token final accessToken = await accessTokenManager.getAccessToken(); // Send the notification final response = await http.post( Uri.parse( 'https://fcm.googleapis.com/v1/projects/ride-b1bd8/messages:send'), headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer $accessToken', }, body: jsonEncode({ 'message': { 'token': token, 'notification': { 'title': title, 'body': body, }, // 'data': { // 'DriverList': jsonEncode([]), // }, 'android': { 'priority': 'high', // Set priority to high 'notification': { 'sound': tone, }, }, 'apns': { 'headers': { 'apns-priority': '10', // Set APNs priority to 10 }, 'payload': { 'aps': { 'sound': tone, }, }, }, }, }), ); if (response.statusCode == 200) { print( 'Notification sent successfully. Status code: ${response.statusCode}'); print('Response body: ${response.body}'); } else { print( 'Failed to send notification. Status code: ${response.statusCode}'); print('Response body: ${response.body}'); if (retryCount > 0) { print('Retrying... Attempts remaining: $retryCount'); await Future.delayed( const Duration(seconds: 2)); // Optional delay before retrying return sendNotificationToAnyWithoutData(title, body, token, tone, retryCount: retryCount - 1); } } } catch (e) { print('Error sending notification: $e'); if (retryCount > 0) { print('Retrying... Attempts remaining: $retryCount'); await Future.delayed( const Duration(seconds: 2)); // Optional delay before retrying return sendNotificationToAnyWithoutData(title, body, token, tone, retryCount: retryCount - 1); } } } void sendNotificationToDriverMAP( String title, String body, String token, List data, String tone, {int retryCount = 2}) async { try { String serviceAccountKeyJson = '''{ "type": "service_account", "project_id": "ride-b1bd8", "private_key_id": "75e817c0b902db2ef35edf2c2bd159dec1f13249", "private_key": "-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD0zH9TQGDQHUv3\\na3/JAD1UKPwAp3wNKT0a6fxiIzjI3JxQWI30QvZCcfl6CdMhIcydX1ncSaYTcEeC\\n/AdPVCPkqyJx1YIGGg6P/mRzCWeaN8fsp6z250m5vcObDCZc3dbJEkepbep+6FPY\\n21m3KO+AHh1glgsTGZOTm5xiU8NGXpdk2QEh8wpiIIlR/HuKwVw9g8urNe3Sno+U\\nDm3z37iFqvZdmpqO8aWTJu6beb3hsREK9XK2I9JqC2JUwiGQRo3idOvPP6hkqrWx\\nKSX96vglQFYfakvJdDp2ZATOlpBYPMtS/IWhJ985u58TSS+Kl8qpnpaZBSxgJirf\\nhWzhnKLfAgMBAAECggEAJP785SePGhS7ZN6ltspm+l+hSjYFrPWFCxq+rlQ1YkHZ\\nC9l+RqKSFhOkiPmQI2s4wbXl3kFxLHHlFNoi/q2wKQBmGb8TQfnRJpjjNHGA61Ev\\n0Ue7/6qPvVb9B2MsLw/FxKiTFPuMG3bgKR9pbSFuJLYoaW7zqITOhVnYphGTqwAY\\nBVVcvISSLvELDmH9VZcv/9DVqVlqbbESHWh1Z4W6XGPoEqeDH/upNTyQQ/46Msgm\\nTGE6VqLHpWuSf6SqHp+r0Y0lI3vIPM1vz5FAJDJbOE/enHa0fSup0OHSMxl0HVMn\\nnO1yrGF3vsIPOej5HKr5d71bEIckzk73/yjNC1/mDQKBgQD7RtUvc9omsSsFMJ6e\\nBASAn6Dktx/QY/XNJjFzHQj69cywLDe5t5AL2gUi3phQ2oqB5XJdwnd5bTIEPEPZ\\nDOuOai2802p6FJk6kjmZAMVGx5JtXBH+vs6jrmQQSMiKbjwN1TT6xIWakvLOonUi\\nX6ZvjYYjU/E0YJU3jSiXWEr76wKBgQD5Zn4SouJ6BCDZMbausJVMBkk3qxsYooip\\np89WakC6e7AZinpkRcqjGGV9GOvc8crJs6fyXAA9ORepGP47Mc0ZrDssOkstznsM\\npr8R0S6MKwEZaT9ixOHdOcLZ47ps+JzA2Wr4KN2OvFHksUkB/46ATD1j9WZVgB8M\\namsYp/Y73QKBgHOo+PvsoZ9psVmkNX6abtAdqdtdB0HOoRea2uwXk0ig12TIFaZg\\nfedWpUKVnxqoXVTJHklV99RmlL0qWDiSH+LfsMnXro0e6iDxqZ1po2Se/CFmXcoa\\nXdctsFVmixhdATuExewfhTfPKABA+xWlXWC/jdy5CK+JPWXijaqMM4edAoGAE5Bj\\nsWiPpYyvWvpYX0nA3G7dzX0hqgQN/mkIjbnWDArp3IcNZNJIvBSM2Yxb7EAXbU0n\\njo6DAkp5Pa2VO+WDNlFZbvW/sf8xjeOCt44WPa6d7nVgIIpbQXRngZoopKW3/jTP\\n/FmQT8McFXmGxZ5belsAsdetSGW9icbLUerTGQ0CgYEAmf/G8Ag3XxmqTXvvHuv2\\n14OP7WnrVqkEMnydrftEwn4peXd/Lz+/GYX5Zc4ZoNgbN8IvZ5z0+OmRsallsbiW\\nBw0/tc68CjzxXOvReWxDluUopqWVGj5tlGqE5xUDku9SWJSxbkiQ3rqutzBdPXpr\\noqHwPyDrmK/Zgqn+uiIm4Ck=\\n-----END PRIVATE KEY-----\\n", "client_email": "firebase-adminsdk-o2wqi@ride-b1bd8.iam.gserviceaccount.com", "client_id": "111210077025005706623", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-o2wqi%40ride-b1bd8.iam.gserviceaccount.com", "universe_domain": "googleapis.com" } '''; // As defined above // Initialize AccessTokenManager final accessTokenManager = AccessTokenManager(serviceAccountKeyJson); // Obtain an OAuth 2.0 access token final accessToken = await accessTokenManager.getAccessToken(); // Send the notification final response = await http.post( Uri.parse( 'https://fcm.googleapis.com/v1/projects/ride-b1bd8/messages:send'), headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer $accessToken', }, body: jsonEncode({ 'message': { 'token': token, 'notification': { 'title': title, 'body': body, }, 'data': { 'DriverList': jsonEncode(data), }, 'android': { 'priority': 'high', // Set priority to high 'notification': { 'sound': tone, }, }, 'apns': { 'headers': { 'apns-priority': '10', // Set APNs priority to 10 }, 'payload': { 'aps': { 'sound': tone, }, }, }, }, }), ); if (response.statusCode == 200) { print( 'Notification sent successfully. Status code: ${response.statusCode}'); print('Response body: ${response.body}'); } else { print( 'Failed to send notification. Status code: ${response.statusCode}'); print('Response body: ${response.body}'); if (retryCount > 0) { print('Retrying... Attempts remaining: $retryCount'); await Future.delayed( const Duration(seconds: 2)); // Optional delay before retrying return sendNotificationToPassengerTokenCALL( title, body, token, data, tone, retryCount: retryCount - 1); } } } catch (e) { print('Error sending notification: $e'); if (retryCount > 0) { print('Retrying... Attempts remaining: $retryCount'); await Future.delayed( const Duration(seconds: 2)); // Optional delay before retrying return sendNotificationToPassengerTokenCALL( title, body, token, data, tone, retryCount: retryCount - 1); } } } void sendNotificationToDriverMapPolyline(String title, String body, String token, List data, String polylineJson, String tone) async { try { String serviceAccountKeyJson = '''{ "type": "service_account", "project_id": "ride-b1bd8", "private_key_id": "75e817c0b902db2ef35edf2c2bd159dec1f13249", "private_key": "-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD0zH9TQGDQHUv3\\na3/JAD1UKPwAp3wNKT0a6fxiIzjI3JxQWI30QvZCcfl6CdMhIcydX1ncSaYTcEeC\\n/AdPVCPkqyJx1YIGGg6P/mRzCWeaN8fsp6z250m5vcObDCZc3dbJEkepbep+6FPY\\n21m3KO+AHh1glgsTGZOTm5xiU8NGXpdk2QEh8wpiIIlR/HuKwVw9g8urNe3Sno+U\\nDm3z37iFqvZdmpqO8aWTJu6beb3hsREK9XK2I9JqC2JUwiGQRo3idOvPP6hkqrWx\\nKSX96vglQFYfakvJdDp2ZATOlpBYPMtS/IWhJ985u58TSS+Kl8qpnpaZBSxgJirf\\nhWzhnKLfAgMBAAECggEAJP785SePGhS7ZN6ltspm+l+hSjYFrPWFCxq+rlQ1YkHZ\\nC9l+RqKSFhOkiPmQI2s4wbXl3kFxLHHlFNoi/q2wKQBmGb8TQfnRJpjjNHGA61Ev\\n0Ue7/6qPvVb9B2MsLw/FxKiTFPuMG3bgKR9pbSFuJLYoaW7zqITOhVnYphGTqwAY\\nBVVcvISSLvELDmH9VZcv/9DVqVlqbbESHWh1Z4W6XGPoEqeDH/upNTyQQ/46Msgm\\nTGE6VqLHpWuSf6SqHp+r0Y0lI3vIPM1vz5FAJDJbOE/enHa0fSup0OHSMxl0HVMn\\nnO1yrGF3vsIPOej5HKr5d71bEIckzk73/yjNC1/mDQKBgQD7RtUvc9omsSsFMJ6e\\nBASAn6Dktx/QY/XNJjFzHQj69cywLDe5t5AL2gUi3phQ2oqB5XJdwnd5bTIEPEPZ\\nDOuOai2802p6FJk6kjmZAMVGx5JtXBH+vs6jrmQQSMiKbjwN1TT6xIWakvLOonUi\\nX6ZvjYYjU/E0YJU3jSiXWEr76wKBgQD5Zn4SouJ6BCDZMbausJVMBkk3qxsYooip\\np89WakC6e7AZinpkRcqjGGV9GOvc8crJs6fyXAA9ORepGP47Mc0ZrDssOkstznsM\\npr8R0S6MKwEZaT9ixOHdOcLZ47ps+JzA2Wr4KN2OvFHksUkB/46ATD1j9WZVgB8M\\namsYp/Y73QKBgHOo+PvsoZ9psVmkNX6abtAdqdtdB0HOoRea2uwXk0ig12TIFaZg\\nfedWpUKVnxqoXVTJHklV99RmlL0qWDiSH+LfsMnXro0e6iDxqZ1po2Se/CFmXcoa\\nXdctsFVmixhdATuExewfhTfPKABA+xWlXWC/jdy5CK+JPWXijaqMM4edAoGAE5Bj\\nsWiPpYyvWvpYX0nA3G7dzX0hqgQN/mkIjbnWDArp3IcNZNJIvBSM2Yxb7EAXbU0n\\njo6DAkp5Pa2VO+WDNlFZbvW/sf8xjeOCt44WPa6d7nVgIIpbQXRngZoopKW3/jTP\\n/FmQT8McFXmGxZ5belsAsdetSGW9icbLUerTGQ0CgYEAmf/G8Ag3XxmqTXvvHuv2\\n14OP7WnrVqkEMnydrftEwn4peXd/Lz+/GYX5Zc4ZoNgbN8IvZ5z0+OmRsallsbiW\\nBw0/tc68CjzxXOvReWxDluUopqWVGj5tlGqE5xUDku9SWJSxbkiQ3rqutzBdPXpr\\noqHwPyDrmK/Zgqn+uiIm4Ck=\\n-----END PRIVATE KEY-----\\n", "client_email": "firebase-adminsdk-o2wqi@ride-b1bd8.iam.gserviceaccount.com", "client_id": "111210077025005706623", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-o2wqi%40ride-b1bd8.iam.gserviceaccount.com", "universe_domain": "googleapis.com" } '''; // As defined above // Initialize AccessTokenManager final accessTokenManager = AccessTokenManager(serviceAccountKeyJson); // Obtain an OAuth 2.0 access token final accessToken = await accessTokenManager.getAccessToken(); // Send the notification final response = await http.post( Uri.parse( 'https://fcm.googleapis.com/v1/projects/ride-b1bd8/messages:send'), headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer $accessToken', }, body: jsonEncode({ 'message': { 'token': token, 'notification': { 'title': title, 'body': body, }, 'data': { 'DriverList': jsonEncode(data), }, 'android': { 'priority': 'high', // Set priority to high 'notification': { 'sound': tone, }, }, 'apns': { 'headers': { 'apns-priority': '10', // Set APNs priority to 10 }, 'payload': { 'aps': { 'sound': tone, }, }, }, }, }), ); if (response.statusCode == 200) { // Notification sent successfully } else { // Handle error response 'Failed to send notification. Status code: ${response.statusCode}'; } } catch (e) { // Handle other exceptions } } } class OverlayContent extends StatelessWidget { final String title; final String body; OverlayContent(this.title, this.body); @override Widget build(BuildContext context) { return Material( child: Container( padding: const EdgeInsets.all(16.0), color: Colors.white, child: Column( mainAxisSize: MainAxisSize.min, children: [ Text( title, style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold), ), const SizedBox(height: 8.0), Text( body, style: const TextStyle(fontSize: 16), ), ], ), ), ); } }