446 lines
17 KiB
Dart
446 lines
17 KiB
Dart
import 'dart:convert';
|
|
import 'dart:io';
|
|
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:ride/constant/colors.dart';
|
|
import 'package:ride/constant/style.dart';
|
|
import 'package:ride/controller/functions/crud.dart';
|
|
import 'package:ride/controller/functions/launch.dart';
|
|
import 'package:ride/controller/functions/toast.dart';
|
|
import 'package:ride/views/home/profile/promos_passenger_page.dart';
|
|
import 'package:ride/views/widgets/elevated_btn.dart';
|
|
|
|
import '../../constant/box_name.dart';
|
|
import '../../constant/credential.dart';
|
|
import '../../constant/links.dart';
|
|
import '../../main.dart';
|
|
import '../../views/orderCaptin/order_request_page.dart';
|
|
|
|
class FirebasMessagesController extends GetxController {
|
|
final fcmToken = FirebaseMessaging.instance;
|
|
|
|
List<String> tokens = [];
|
|
List dataTokens = [];
|
|
NotificationSettings? notificationSettings;
|
|
@override
|
|
void onInit() async {
|
|
super.onInit();
|
|
// getNotificationSettings();
|
|
getToken();
|
|
await getTokens();
|
|
}
|
|
|
|
Future<void> getNotificationSettings() async {
|
|
// Get the current notification settings
|
|
NotificationSettings? notificationSettings =
|
|
await FirebaseMessaging.instance.getNotificationSettings();
|
|
print(
|
|
'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,
|
|
);
|
|
print('User granted permission: ${settings.authorizationStatus}');
|
|
messaging.setForegroundNotificationPresentationOptions(
|
|
alert: true, badge: true, sound: true);
|
|
}
|
|
}
|
|
|
|
Future getTokens() async {
|
|
var res = await http.post(
|
|
Uri.parse(AppLink.getTokens),
|
|
headers: {
|
|
'Authorization':
|
|
'Basic ${base64Encode(utf8.encode(AppCredintials.basicAuthCredentials))}',
|
|
},
|
|
body: {},
|
|
);
|
|
// print(res.body);
|
|
var jsonResponse = jsonDecode(res.body);
|
|
// print(jsonResponse);
|
|
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);
|
|
print(box.read(BoxName.tokens));
|
|
} else {
|
|
Get.defaultDialog(title: "Warning", middleText: "Server Error");
|
|
}
|
|
}
|
|
|
|
Future getToken() async {
|
|
fcmToken.getToken().then((token) {
|
|
box.write(BoxName.tokenFCM, token);
|
|
box.write(BoxName.tokenDriver, token);
|
|
print(token);
|
|
});
|
|
|
|
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
|
|
if (message.data.isNotEmpty) {
|
|
if (message.notification!.title!.contains('Order')) {
|
|
var myListString = message.data['myList'];
|
|
var myList = jsonDecode(myListString) as List<dynamic>;
|
|
Get.to(() => const OrderRequestPage(), arguments: {
|
|
'myListString': myListString,
|
|
'myList': myList,
|
|
'body': message.notification!.body
|
|
});
|
|
// Get.defaultDialog(
|
|
// barrierDismissible: false,
|
|
// title: message.notification!.title.toString(),
|
|
// content: Column(
|
|
// crossAxisAlignment: CrossAxisAlignment.start,
|
|
// children: [
|
|
// // Text(message.notification!.body.toString()),
|
|
// Padding(
|
|
// padding: const EdgeInsets.all(8.0),
|
|
// child: TextButton.icon(
|
|
// onPressed: () {
|
|
// String mapUrl =
|
|
// 'https://www.google.com/maps/dir/${myList[0]}/${myList[1]}/';
|
|
// print(mapUrl);
|
|
// launchUrl1(mapUrl);
|
|
// },
|
|
// icon: const Icon(Icons.map),
|
|
// label: Text('Rouats of Trip'.tr)),
|
|
// ),
|
|
|
|
// Padding(
|
|
// padding: const EdgeInsets.all(8.0),
|
|
// child: Text(
|
|
// 'Tatal From Passenger is '.tr +
|
|
// double.parse(myList[2]).toStringAsFixed(2),
|
|
// style: AppStyle.title,
|
|
// ),
|
|
// ),
|
|
// Padding(
|
|
// padding: const EdgeInsets.all(8.0),
|
|
// child: Text(
|
|
// 'Tatal For You is '.tr +
|
|
// double.parse(myList[3]).toStringAsFixed(2),
|
|
// style: AppStyle.title,
|
|
// ),
|
|
// ),
|
|
// Padding(
|
|
// padding: const EdgeInsets.all(8.0),
|
|
// child: Text(
|
|
// 'Distance is '.tr + myList[5].toString() + ' KM'.tr,
|
|
// style: AppStyle.title,
|
|
// ),
|
|
// ),
|
|
// Padding(
|
|
// padding: const EdgeInsets.all(8.0),
|
|
// child: Text(
|
|
// 'Duration of Trip is '.tr +
|
|
// myList[4].toString() +
|
|
// ' Minutes'.tr,
|
|
// style: AppStyle.title,
|
|
// ),
|
|
// ),
|
|
// Padding(
|
|
// padding: const EdgeInsets.all(8.0),
|
|
// child: Row(
|
|
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
// children: [
|
|
// MyElevatedButton(
|
|
// title: 'Apply Order'.tr,
|
|
// onPressed: () async {
|
|
// await CRUD().postFromDialogue(
|
|
// link: AppLink.addDriverOrder,
|
|
// payload: {
|
|
// 'driver_id': myList[6].toString(),
|
|
// // box.read(BoxName.driverID).toString(),
|
|
// 'order_id':
|
|
// message.notification!.body.toString(),
|
|
// 'status': 'Apply'
|
|
// });
|
|
// },
|
|
// ),
|
|
// MyElevatedButton(
|
|
// title: 'Refuse Order'.tr,
|
|
// onPressed: () async {
|
|
// await CRUD().postFromDialogue(
|
|
// link: AppLink.addDriverOrder,
|
|
// payload: {
|
|
// 'driver_id': myList[6].toString(),
|
|
// // box.read(BoxName.driverID).toString(),
|
|
// 'order_id':
|
|
// message.notification!.body.toString(),
|
|
// 'status': 'Refused'
|
|
// });
|
|
// },
|
|
// kolor: AppColor.redColor,
|
|
// ),
|
|
// ],
|
|
// ),
|
|
// )
|
|
// ],
|
|
// ));
|
|
} else if (message.notification!.title!.contains('Promo')) {
|
|
Get.to(const PromosPassengerPage());
|
|
}
|
|
}
|
|
});
|
|
|
|
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
|
|
print(
|
|
'onMessageOpenedApp: ${message.notification!.title} ${message.notification!.body}');
|
|
RemoteNotification? notification = message.notification;
|
|
if (message.data.isNotEmpty) {
|
|
if (message.notification!.title!.contains('Order')) {
|
|
var myListString = message.data['myList'];
|
|
var myList = jsonDecode(myListString) as List<dynamic>;
|
|
Get.defaultDialog(
|
|
barrierDismissible: true,
|
|
title: message.notification!.title.toString(),
|
|
content: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
// Text(message.notification!.body.toString()),
|
|
Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: TextButton.icon(
|
|
onPressed: () {
|
|
String mapUrl =
|
|
'https://www.google.com/maps/dir/${myList[0]}/${myList[1]}/';
|
|
print(mapUrl);
|
|
launchUrl1(mapUrl);
|
|
},
|
|
icon: const Icon(Icons.map),
|
|
label: Text('Rouats of Trip'.tr)),
|
|
),
|
|
|
|
Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: Text(
|
|
'Tatal From Passenger is '.tr +
|
|
double.parse(myList[2]).toStringAsFixed(2),
|
|
style: AppStyle.title,
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: Text(
|
|
'Tatal For You is '.tr +
|
|
double.parse(myList[3]).toStringAsFixed(2),
|
|
style: AppStyle.title,
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: Text(
|
|
'Distance is '.tr + myList[5].toString() + ' KM'.tr,
|
|
style: AppStyle.title,
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: Text(
|
|
'Duration of Trip is '.tr +
|
|
myList[4].toString() +
|
|
' Minutes'.tr,
|
|
style: AppStyle.title,
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
MyElevatedButton(
|
|
title: 'Apply Order'.tr,
|
|
onPressed: () async {
|
|
await CRUD().postFromDialogue(
|
|
link: AppLink.addDriverOrder,
|
|
payload: {
|
|
'driver_id': myList[6].toString(),
|
|
// box.read(BoxName.driverID).toString(),
|
|
'order_id':
|
|
message.notification!.body.toString(),
|
|
'status': 'Apply'
|
|
});
|
|
},
|
|
),
|
|
MyElevatedButton(
|
|
title: 'Refuse Order'.tr,
|
|
onPressed: () async {
|
|
await CRUD().postFromDialogue(
|
|
link: AppLink.addDriverOrder,
|
|
payload: {
|
|
'driver_id': myList[6].toString(),
|
|
// box.read(BoxName.driverID).toString(),
|
|
'order_id':
|
|
message.notification!.body.toString(),
|
|
'status': 'Refused'
|
|
});
|
|
},
|
|
kolor: AppColor.redColor,
|
|
),
|
|
],
|
|
),
|
|
)
|
|
],
|
|
));
|
|
} else if (message.notification!.title!.contains('Promo')) {
|
|
Get.to(const PromosPassengerPage());
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
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);
|
|
// print(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=${AppCredintials.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) {
|
|
print('sendNotification() error: $e');
|
|
});
|
|
}
|
|
}
|
|
|
|
// void sendNotificationToManager(String title, body) async {
|
|
// // tokens = box.read(BoxName.tokenManager);
|
|
|
|
// 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=${AppCredintials.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) {
|
|
// print('sendNotification() error: $e');
|
|
// });
|
|
// }
|
|
// }
|
|
|
|
// void sendNotificationDriverId(String title, body, token) async {
|
|
// http
|
|
// .post(Uri.parse('https://fcm.googleapis.com/fcm/send'),
|
|
// headers: <String, String>{
|
|
// 'Content-Type': 'application/json',
|
|
// 'Authorization': 'key=${AppCredintials.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': token,
|
|
// }))
|
|
// .whenComplete(() {})
|
|
// .catchError((e) {
|
|
// print('sendNotification() error: $e');
|
|
// });
|
|
// }
|
|
|
|
void sendNotificationDriverId(String title, body, strin1, strin2, strin3,
|
|
strin4, strin5, strin6, string7, string8, token) async {
|
|
http
|
|
.post(Uri.parse('https://fcm.googleapis.com/fcm/send'),
|
|
headers: <String, String>{
|
|
'Content-Type': 'application/json',
|
|
'Authorization': 'key=${AppCredintials.serverAPI}'
|
|
},
|
|
body: jsonEncode({
|
|
'notification': <String, dynamic>{
|
|
'title': title,
|
|
'body': body,
|
|
'sound': 'true'
|
|
},
|
|
'data': {
|
|
'myList': jsonEncode([
|
|
strin1,
|
|
strin2,
|
|
strin3,
|
|
strin4,
|
|
strin5,
|
|
strin6,
|
|
string7,
|
|
string8
|
|
]),
|
|
},
|
|
'priority': 'high',
|
|
'to': token,
|
|
}))
|
|
.whenComplete(() {})
|
|
.catchError((e) {
|
|
print('sendNotification() error: $e');
|
|
});
|
|
}
|
|
}
|