import 'dart:convert'; import 'dart:io'; import 'package:SEFER/env/env.dart'; import 'package:SEFER/views/widgets/my_dialog.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:googleapis_auth/auth_io.dart'; import 'package:googleapis_auth/googleapis_auth.dart'; import 'package:http/http.dart' as http; import 'package:SEFER/controller/functions/toast.dart'; import 'package:SEFER/views/widgets/elevated_btn.dart'; import '../../constant/api_key.dart'; import '../../constant/box_name.dart'; import '../../constant/colors.dart'; import '../../constant/links.dart'; import '../../constant/style.dart'; import '../../main.dart'; import '../../print.dart'; import '../../views/Rate/rate_captain.dart'; import '../../views/home/map_page_passenger.dart'; import '../../views/home/profile/promos_passenger_page.dart'; import '../auth/google_sign.dart'; import '../functions/audio_record1.dart'; import '../home/map_passenger_controller.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 getTokens() async { String? basicAuthCredentials = await storage.read(key: BoxName.basicAuthCredentials); var res = await http.post( Uri.parse(AppLink.getTokens), headers: { 'Authorization': 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', }, body: {}, ); var jsonResponse = jsonDecode(res.body); if (jsonResponse['status'] == 'success') { dataTokens = jsonResponse['data']; for (var i = 0; i < dataTokens.length; i++) { tokens.add(jsonResponse['data'][i]['token']); } box.write(BoxName.tokens, tokens); } else { Get.defaultDialog(title: "Warning", middleText: "Server Error"); } } Future getToken() async { fcmToken.getToken().then((token) { box.write(BoxName.tokenFCM, 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 { // Handle background message if (message.data.isNotEmpty && message.notification != null) { fireBaseTitles(message); } }); FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { if (message.data.isNotEmpty && message.notification != null) { fireBaseTitles(message); } }); } void fireBaseTitles(RemoteMessage message) { if (message.notification!.title! == 'Order'.tr) { } else if (message.notification!.title! == 'Apply Ride'.tr) { var passengerList = message.data['passengerList']; var myList = jsonDecode(passengerList) as List; driverID = myList[0].toString(); Get.find().driverToken = myList[2].toString(); Get.find().statusRide == 'Apply'; Get.find().isSearchingWindow == false; Get.find().update(); NotificationController().showNotification( 'Apply Order'.tr, 'Driver Applied the Ride for You'.tr, 'order1'); // driverAppliedTripSnakBar(); } else if (message.notification!.title! == 'Promo'.tr) { NotificationController() .showNotification('Promo', 'Show latest promo'.tr, 'promo'); Get.to(const PromosPassengerPage()); } else if (message.notification!.title! == 'Trip Monitoring'.tr) { NotificationController() .showNotification('Trip Monitoring'.tr, '', 'iphone_ringtone'); var myListString = message.data['passengerList']; var myList = jsonDecode(myListString) as List; Get.toNamed('/tripmonitor', arguments: { 'rideId': myList[0].toString(), 'driverId': myList[1].toString(), }); } else if (message.notification!.title! == 'token change'.tr) { NotificationController() .showNotification('token change'.tr, 'token change'.tr, 'cancel'); GoogleSignInHelper.signOut(); } else if (message.notification!.title! == 'DriverIsGoingToPassenger'.tr) { Get.find().isDriverInPassengerWay = true; Get.find().update(); NotificationController().showNotification('Driver is Going To You'.tr, 'Please stay on the picked point.'.tr, 'tone1'); // Get.snackbar('Driver is Going To Passenger', '', // backgroundColor: AppColor.greenColor); } else if (message.notification!.title! == 'message From passenger') { NotificationController() .showNotification('message From passenger'.tr, ''.tr, 'tone2'); passengerDialog(message.notification!.body!); update(); } else if (message.notification!.title! == 'message From Driver') { NotificationController() .showNotification('message From passenger'.tr, ''.tr, 'tone2'); passengerDialog(message.notification!.body!); update(); } else if (message.notification!.title! == 'RideIsBegin'.tr) { Get.find().getBeginRideFromDriver(); // Get.snackbar('RideIsBegin', '', backgroundColor: AppColor.greenColor); box.write(BoxName.passengerWalletTotal, '0'); NotificationController() .showNotification('Trip is Begin'.tr, ''.tr, 'start'); update(); } else if (message.notification!.title! == 'Hi ,I will go now'.tr) { // Get.snackbar('Hi ,I will go now', '', // backgroundColor: AppColor.greenColor); NotificationController().showNotification( 'Passenger come to you'.tr, 'Hi ,I will go now'.tr, 'tone2'); update(); } else if (message.notification!.title! == 'Hi ,I Arrive your site'.tr) { NotificationController() .showNotification('Hi ,I Arrive your site'.tr, ''.tr, 'tone2'); driverArrivePassengerDialoge(); update(); } else if (message.notification!.title! == "Cancel Trip from driver".tr) { Get.back(); Get.defaultDialog( title: "The driver canceled your ride.".tr, middleText: "We will look for a new driver.\\nPlease wait.".tr, confirm: MyElevatedButton( title: 'Ok'.tr, onPressed: () async { Get.back(); await Get.find() .reSearchAfterCanceledFromDriver(); }, ), cancel: MyElevatedButton( title: 'Cancel'.tr, onPressed: () { Get.offAll(const MapPagePassenger()); }, ) // Get.find() // .searchNewDriverAfterRejectingFromDriver(); ); } else if (message.notification!.title! == 'Driver Finish Trip'.tr) { var myListString = message.data['passengerList']; var driverList = jsonDecode(myListString) as List; NotificationController().showNotification( 'Driver Finish Trip'.tr, 'you will pay to Driver'.tr + ' ${driverList[3].toString()} \$'.tr, 'tone1'); Get.find().stopRecording(); if (double.parse(box.read(BoxName.passengerWalletTotal)) < 0) { box.write(BoxName.passengerWalletTotal, 0); } Get.find().tripFinishedFromDriver(); Get.to(() => RateDriverFromPassenger(), arguments: { 'driverId': driverList[0].toString(), 'rideId': driverList[1].toString(), 'price': driverList[3].toString() }); // } } else if (message.notification!.title! == "Finish Monitor".tr) { Get.defaultDialog( titleStyle: AppStyle.title, title: 'Trip finished '.tr, middleText: '', confirm: MyElevatedButton( title: 'Ok'.tr, onPressed: () { Get.offAll(() => const MapPagePassenger()); })); } // else if (message.notification!.title! == "Trip Monitoring".tr) { // Get.to(() => const TripMonitor()); // } else if (message.notification!.title! == 'Call Income') { try { var myListString = message.data['passengerList']; var driverList = jsonDecode(myListString) as List; // if (Platform.isAndroid) { NotificationController().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 Driver'.tr) { try { var myListString = message.data['passengerList']; var driverList = jsonDecode(myListString) as List; // if (Platform.isAndroid) { NotificationController().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 End'.tr) { try { var myListString = message.data['passengerList']; var driverList = jsonDecode(myListString) as List; if (Platform.isAndroid) { NotificationController().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! == 'Driver Cancel Your Trip'.tr) { // Get.snackbar( // 'You will be pay the cost to driver or we will get it from you on next trip' // .tr, // 'message', // backgroundColor: AppColor.redColor); if (Platform.isAndroid) { NotificationController().showNotification( 'Driver Cancel Your Trip'.tr, 'you will pay to Driver you will be pay the cost of driver time look to your SEFER Wallet' .tr, 'cancel'); } box.write(BoxName.parentTripSelected, false); box.remove(BoxName.tokenParent); Get.find().restCounter(); Get.offAll(const MapPagePassenger()); } // else if (message.notification!.title! == 'Order Applied') { // 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! == 'Order Applied'.tr) { NotificationController().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 driverArrivePassengerDialoge() { return Get.defaultDialog( barrierDismissible: false, title: 'Hi ,I Arrive your site'.tr, titleStyle: AppStyle.title, middleText: 'Please go to Car Driver'.tr, middleTextStyle: AppStyle.title, 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, [], 'ding.wav'); Get.find() .startTimerDriverWaitPassenger5Minute(); Get.back(); Get.find().remainingTime = 0; Get.find().update(); })); } 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 { 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) 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++) { http .post(Uri.parse('https://fcm.googleapis.com/fcm/send'), headers: { 'Content-Type': 'application/json', 'Authorization': 'key=${AK.serverAPI}' }, body: jsonEncode({ 'notification': { 'title': title, 'body': body, 'sound': 'ding.wav' }, 'priority': 'high', 'data': { 'click_action': 'FLUTTER_NOTIFICATION_CLICK', 'id': '1', 'status': 'done' }, 'to': tokens[i], })) .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) { // }); // } // } void sendNotificationToPassengerToken( String title, body, token, List map, String tone) async { try { final response = await http.post( Uri.parse('https://fcm.googleapis.com/fcm/send'), headers: { 'Content-Type': 'application/json', 'Authorization': 'key=${AK.serverAPI}' }, body: jsonEncode({ 'notification': { 'title': title, 'body': body, 'sound': tone }, 'data': { 'passengerList': map, }, 'priority': 'high', 'to': token, }), ); if (response.statusCode == 200) { // Notification sent successfully } else { // Handle error response 'Failed to send notification. Status code: ${response.statusCode}'; } } catch (e) { // Handle other exceptions } } void sendNotificationToAnyWithoutData( String title, String body, String token, 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(); // Log.print('accessToken: ${accessToken}'); // 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, }, 'android': { 'notification': { 'sound': tone, }, }, 'apns': { '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}'); } } catch (e) { print('Error sending notification: $e'); } } // void sendNotificationToDriverMAP(String title, String body, String token, // List data, String tone) async { // try { // final response = await http.post( // // Uri.parse( // // 'https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send'), // Uri.parse('https://fcm.googleapis.com/fcm/send'), // headers: { // 'Content-Type': 'application/json', // // 'Authorization': 'Bearer 104815009508844392546' // 'Authorization': 'key=${AK.serverAPI}' // }, // body: jsonEncode({ // 'notification': { // 'title': title, // 'body': body, // 'sound': tone // }, // 'data': { // 'DriverList': data, // }, // 'priority': 'high', // 'to': token, // }), // ); // if (response.statusCode == 200) { // Log.print( // 'Notification sent successfully. Status code: ${response.statusCode}'); // Log.print('Response body: ${response.body}'); // } else { // Log.print( // 'Failed to send notification. Status code: ${response.statusCode}'); // Log.print('Response body: ${response.body}'); // } // } catch (e) { // Log.print('Error sending notification: $e'); // } // } Future sendNotificationToDriverMAP(String title, String body, String token, List data, 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(); Log.print('accessToken: ${accessToken}'); // 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': { 'notification': { 'sound': tone, }, }, 'apns': { '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}'); } } catch (e) { print('Error sending notification: $e'); } } void sendNotificationToDriverMapPolyline(String title, String body, String token, List data, String polylineJson) 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({ 'notification': { 'title': title, 'body': body, // 'sound': 'tone2.wav', 'sound': 'order.wav' }, 'data': { 'DriverList': data, 'PolylineJson': polylineJson, }, 'priority': 'high', 'to': token, }), ); 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 DriverTipWidget extends StatelessWidget { const DriverTipWidget({ super.key, }); @override Widget build(BuildContext context) { return GetBuilder(builder: (controller) { return Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ // Text( // '${'Your fee is '.tr}${Get.find().totalPassenger.toStringAsFixed(2)}'), Text( 'Do you want to pay Tips for this Driver'.tr, textAlign: TextAlign.center, ), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ InkWell( onTap: () { box.write(BoxName.tipPercentage, '0.05'); Toast.show( context, '${'Tip is '.tr}${(controller.totalPassenger) * (double.parse(box.read(BoxName.tipPercentage.toString())))}', AppColor.blueColor); controller.update(); }, child: Container( decoration: BoxDecoration(border: Border.all()), child: const Padding( padding: EdgeInsets.all(4), child: Center( child: Text('5%'), ), ), ), ), InkWell( onTap: () { box.write(BoxName.tipPercentage, '0.10'); Toast.show( context, '${'Tip is'.tr} ${(controller.totalPassenger) * (double.parse(box.read(BoxName.tipPercentage.toString())))}', AppColor.blueColor); controller.update(); }, child: Container( decoration: BoxDecoration(border: Border.all()), child: const Center( child: Padding( padding: EdgeInsets.all(5), child: Text('10%'), ), ), ), ), InkWell( onTap: () { box.write(BoxName.tipPercentage, '0.15'); Toast.show( context, '${'Tip is'.tr} ${(controller.totalPassenger) * (double.parse(box.read(BoxName.tipPercentage.toString())))}', AppColor.blueColor); controller.update(); }, child: Container( decoration: BoxDecoration(border: Border.all()), child: const Center( child: Padding( padding: EdgeInsets.all(5), child: Text('15%'), ), ), ), ), InkWell( onTap: () { box.write(BoxName.tipPercentage, '0.20'); Toast.show( context, '${'Tip is'.tr} ${(controller.totalPassenger) * (double.parse(box.read(BoxName.tipPercentage.toString())))}', AppColor.blueColor); controller.update(); }, child: Container( decoration: BoxDecoration(border: Border.all()), child: const Center( child: Padding( padding: EdgeInsets.all(5), child: Text('20%'), ), ), ), ), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ MyElevatedButton( kolor: AppColor.redColor, title: 'No i want'.tr, onPressed: () { box.write(BoxName.tipPercentage, '0'); controller.update(); }), Container( decoration: AppStyle.boxDecoration1, child: Padding( padding: const EdgeInsets.all(6), child: Text( '${(controller.totalPassenger) * (double.parse(box.read(BoxName.tipPercentage.toString())))} ${box.read(BoxName.countryCode) == 'Egypt' ? 'LE'.tr : 'JOD'.tr}', style: AppStyle.title, ), ), ), ], ) ], ); }); } }