898 lines
37 KiB
Dart
898 lines
37 KiB
Dart
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<String> tokens = [];
|
|
List dataTokens = [];
|
|
late String driverID;
|
|
late String driverToken;
|
|
NotificationSettings? notificationSettings;
|
|
|
|
Future<void> 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<void> 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<dynamic>;
|
|
driverID = myList[0].toString();
|
|
Get.find<MapPassengerController>().driverToken = myList[2].toString();
|
|
Get.find<MapPassengerController>().statusRide == 'Apply';
|
|
Get.find<MapPassengerController>().isSearchingWindow == false;
|
|
Get.find<MapPassengerController>().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<dynamic>;
|
|
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<MapPassengerController>().isDriverInPassengerWay = true;
|
|
Get.find<MapPassengerController>().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<MapPassengerController>().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<MapPassengerController>()
|
|
.reSearchAfterCanceledFromDriver();
|
|
},
|
|
),
|
|
cancel: MyElevatedButton(
|
|
title: 'Cancel'.tr,
|
|
onPressed: () {
|
|
Get.offAll(const MapPagePassenger());
|
|
},
|
|
)
|
|
// Get.find<MapPassengerController>()
|
|
// .searchNewDriverAfterRejectingFromDriver();
|
|
);
|
|
} else if (message.notification!.title! == 'Driver Finish Trip'.tr) {
|
|
var myListString = message.data['passengerList'];
|
|
var driverList = jsonDecode(myListString) as List<dynamic>;
|
|
NotificationController().showNotification(
|
|
'Driver Finish Trip'.tr,
|
|
'you will pay to Driver'.tr + ' ${driverList[3].toString()} \$'.tr,
|
|
'tone1');
|
|
Get.find<AudioRecorderController>().stopRecording();
|
|
if (double.parse(box.read(BoxName.passengerWalletTotal)) < 0) {
|
|
box.write(BoxName.passengerWalletTotal, 0);
|
|
}
|
|
Get.find<MapPassengerController>().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<dynamic>;
|
|
// 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<dynamic>;
|
|
// 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<dynamic>;
|
|
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<MapPassengerController>().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<dynamic> 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<MapPassengerController>().driverToken,
|
|
[],
|
|
'ding.wav');
|
|
Get.find<MapPassengerController>()
|
|
.startTimerDriverWaitPassenger5Minute();
|
|
|
|
Get.back();
|
|
Get.find<MapPassengerController>().remainingTime = 0;
|
|
Get.find<MapPassengerController>().update();
|
|
}));
|
|
}
|
|
|
|
Future<dynamic> 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<MapPassengerController>().driverToken, []);
|
|
// Get.find<MapPassengerController>()
|
|
// .startTimerDriverWaitPassenger5Minute();
|
|
|
|
Get.back();
|
|
}));
|
|
}
|
|
|
|
Future<dynamic> driverFinishTripDialoge(List<dynamic> 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: <String, String>{
|
|
'Content-Type': 'application/json',
|
|
'Authorization': 'key=${AK.serverAPI}'
|
|
},
|
|
body: jsonEncode({
|
|
'notification': <String, dynamic>{
|
|
'title': title,
|
|
'body': body,
|
|
'sound': 'ding.wav'
|
|
},
|
|
'priority': 'high',
|
|
'data': <String, dynamic>{
|
|
'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: <String, String>{
|
|
// 'Content-Type': 'application/json',
|
|
// 'Authorization': 'key=${storage.read(key: BoxName.serverAPI}'
|
|
// },
|
|
// body: jsonEncode({
|
|
// 'notification': <String, dynamic>{
|
|
// 'title': title,
|
|
// 'body': body,
|
|
// 'sound': 'true'
|
|
// },
|
|
// 'priority': 'high',
|
|
// 'data': <String, dynamic>{
|
|
// 'click_action': 'FLUTTER_NOTIFICATION_CLICK',
|
|
// 'id': '1',
|
|
// 'status': 'done'
|
|
// },
|
|
// 'to': tokens[i],
|
|
// }))
|
|
// .whenComplete(() {})
|
|
// .catchError((e) {
|
|
// });
|
|
// }
|
|
// }
|
|
|
|
void sendNotificationToPassengerToken(
|
|
String title, body, token, List<String> map, String tone) async {
|
|
try {
|
|
final response = await http.post(
|
|
Uri.parse('https://fcm.googleapis.com/fcm/send'),
|
|
headers: <String, String>{
|
|
'Content-Type': 'application/json',
|
|
'Authorization': 'key=${AK.serverAPI}'
|
|
},
|
|
body: jsonEncode({
|
|
'notification': <String, dynamic>{
|
|
'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: <String, String>{
|
|
'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<String> 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: <String, String>{
|
|
// 'Content-Type': 'application/json',
|
|
// // 'Authorization': 'Bearer 104815009508844392546'
|
|
// 'Authorization': 'key=${AK.serverAPI}'
|
|
// },
|
|
// body: jsonEncode({
|
|
// 'notification': <String, dynamic>{
|
|
// '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<void> sendNotificationToDriverMAP(String title, String body,
|
|
String token, List<String> 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: <String, String>{
|
|
'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<String> 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: <String, String>{
|
|
'Content-Type': 'application/json',
|
|
'Authorization': 'Bearer $accessToken',
|
|
},
|
|
body: jsonEncode({
|
|
'notification': <String, dynamic>{
|
|
'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<MapPassengerController>(builder: (controller) {
|
|
return Column(
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
children: [
|
|
// Text(
|
|
// '${'Your fee is '.tr}${Get.find<MapPassengerController>().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,
|
|
),
|
|
),
|
|
),
|
|
],
|
|
)
|
|
],
|
|
);
|
|
});
|
|
}
|
|
}
|