205 lines
7.2 KiB
Dart
205 lines
7.2 KiB
Dart
import 'dart:convert';
|
|
|
|
import 'package:SEFER/constant/colors.dart';
|
|
import 'package:SEFER/views/home/Captin/orderCaptin/order_request_page.dart';
|
|
import 'package:SEFER/views/home/Captin/orderCaptin/order_speed_request.dart';
|
|
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
|
import 'package:get/get.dart';
|
|
|
|
import '../../main.dart';
|
|
import '../../print.dart';
|
|
import '../../views/notification/notification_captain.dart';
|
|
import '../home/captin/home_captain_controller.dart';
|
|
|
|
class NotificationController extends GetxController {
|
|
final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin =
|
|
FlutterLocalNotificationsPlugin();
|
|
// Initializes the local notifications plugin
|
|
Future<void> initNotifications() async {
|
|
const AndroidInitializationSettings android =
|
|
AndroidInitializationSettings('@mipmap/launcher_icon');
|
|
|
|
const InitializationSettings initializationSettings =
|
|
InitializationSettings(android: android);
|
|
|
|
await _flutterLocalNotificationsPlugin.initialize(
|
|
initializationSettings,
|
|
onDidReceiveNotificationResponse: onDidReceiveNotificationResponse,
|
|
onDidReceiveBackgroundNotificationResponse:
|
|
onDidReceiveBackgroundNotificationResponse,
|
|
);
|
|
|
|
// Create a notification channel
|
|
const AndroidNotificationChannel channel = AndroidNotificationChannel(
|
|
'dynamic_channel', // Channel ID
|
|
'Dynamic Notifications', // Channel name
|
|
description:
|
|
'This channel is used for various types of notifications.', // Channel description
|
|
importance: Importance.max,
|
|
);
|
|
|
|
// Register the channel with the system
|
|
await _flutterLocalNotificationsPlugin
|
|
.resolvePlatformSpecificImplementation<
|
|
AndroidFlutterLocalNotificationsPlugin>()
|
|
?.createNotificationChannel(channel);
|
|
}
|
|
|
|
// Displays a notification with the given title and message
|
|
void showNotification(
|
|
String title, String message, String tone, String payLoad) async {
|
|
BigTextStyleInformation bigTextStyleInformation = BigTextStyleInformation(
|
|
message,
|
|
contentTitle: title.tr,
|
|
htmlFormatContent: true,
|
|
htmlFormatContentTitle: true,
|
|
);
|
|
|
|
AndroidNotificationDetails android =
|
|
AndroidNotificationDetails('dynamic_channel', 'Dynamic Notifications',
|
|
importance: Importance.max,
|
|
priority: Priority.high,
|
|
styleInformation: bigTextStyleInformation,
|
|
playSound: true,
|
|
sound: RawResourceAndroidNotificationSound(tone),
|
|
audioAttributesUsage: AudioAttributesUsage.alarm,
|
|
visibility: NotificationVisibility.public,
|
|
autoCancel: false,
|
|
color: AppColor.primaryColor,
|
|
showProgress: true,
|
|
showWhen: true,
|
|
timeoutAfter: title == 'Order' ? 14500 : 6000,
|
|
subText: message,
|
|
actions: [
|
|
AndroidNotificationAction(
|
|
allowGeneratedReplies: true,
|
|
'id',
|
|
title.tr,
|
|
titleColor: AppColor.bronze,
|
|
showsUserInterface: true,
|
|
)
|
|
],
|
|
category: AndroidNotificationCategory.call);
|
|
|
|
NotificationDetails details = NotificationDetails(android: android);
|
|
|
|
await _flutterLocalNotificationsPlugin.show(0, title, message, details,
|
|
payload: jsonEncode({'title': title, 'data': payLoad}));
|
|
}
|
|
|
|
// Callback when the notification is tapped
|
|
void onDidReceiveNotificationResponse(NotificationResponse response) {
|
|
_handleNotificationResponse(response);
|
|
}
|
|
|
|
// Callback when the notification is tapped while the app is in the background
|
|
void onDidReceiveBackgroundNotificationResponse(
|
|
NotificationResponse response) {
|
|
_handleNotificationResponse(response);
|
|
}
|
|
|
|
// Handle notification response for both foreground and background
|
|
void _handleNotificationResponse(NotificationResponse response) {
|
|
print('Notification tapped!');
|
|
Log.print('response.payload: ${response.payload}');
|
|
if (response.payload != null) {
|
|
print('Notification payload: ${response.payload}');
|
|
var payloadData = jsonDecode(response.payload.toString());
|
|
|
|
if (payloadData is Map<String, dynamic>) {
|
|
String title = payloadData['title'];
|
|
var data = payloadData['data'];
|
|
|
|
switch (title) {
|
|
case 'Order':
|
|
_handleOrderNotification(data);
|
|
break;
|
|
case 'OrderSpeed':
|
|
_handleOrderSpeedNotification(data);
|
|
break;
|
|
case 'ADS':
|
|
_handleADSNotification();
|
|
break;
|
|
default:
|
|
Log.print('Unknown notification type');
|
|
}
|
|
} else {
|
|
Log.print('Invalid payload format');
|
|
}
|
|
} else {
|
|
Log.print('Payload is null');
|
|
}
|
|
}
|
|
|
|
void _handleOrderNotification(dynamic data) {
|
|
if (data is String) {
|
|
var orderData = jsonDecode(data);
|
|
if (orderData is List && orderData.length == 34) {
|
|
closeOverLay();
|
|
Get.put(HomeCaptainController()).changeRideId();
|
|
Get.to(() => OrderRequestPage(), arguments: {'myListString': data});
|
|
} else {
|
|
Log.print('Invalid order data');
|
|
}
|
|
} else {
|
|
Log.print('Invalid order payload');
|
|
}
|
|
}
|
|
|
|
void _handleOrderSpeedNotification(dynamic data) {
|
|
if (data is String) {
|
|
var orderData = jsonDecode(data);
|
|
if (orderData is List && orderData.length == 34) {
|
|
closeOverLay();
|
|
Get.put(HomeCaptainController()).changeRideId();
|
|
Get.to(() => OrderSpeedRequest(), arguments: {'myListString': data});
|
|
} else {
|
|
Log.print('Invalid order data');
|
|
}
|
|
} else {
|
|
Log.print('Invalid order payload');
|
|
}
|
|
}
|
|
|
|
void _handleADSNotification() {
|
|
// var orderData = jsonDecode(data);
|
|
closeOverLay();
|
|
Get.to(
|
|
() => const NotificationCaptain(),
|
|
);
|
|
}
|
|
|
|
void onDidReceiveLocalNotification(
|
|
int id, String? title, String? body, String? payload) async {
|
|
// display a dialog with the notification details, tap ok to go to another page
|
|
}
|
|
}
|
|
|
|
// class NotificationController extends GetxController {
|
|
// final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin =
|
|
// FlutterLocalNotificationsPlugin();
|
|
|
|
// // Initializes the local notifications plugin
|
|
// Future<void> initNotifications() async {
|
|
// const AndroidInitializationSettings android =
|
|
// AndroidInitializationSettings('@mipmap/launcher_icon');
|
|
// const InitializationSettings initializationSettings =
|
|
// InitializationSettings(android: android);
|
|
// await _flutterLocalNotificationsPlugin.initialize(initializationSettings);
|
|
// }
|
|
|
|
// // Displays a notification with the given title and message
|
|
// void showNotification(
|
|
// String title, String message, String tone, String payLoad) async {
|
|
// AndroidNotificationDetails android = AndroidNotificationDetails(
|
|
// 'your channel id', 'your channel name',
|
|
// importance: Importance.max,
|
|
// priority: Priority.high,
|
|
// showWhen: false,
|
|
// sound: RawResourceAndroidNotificationSound(tone));
|
|
|
|
// NotificationDetails details = NotificationDetails(android: android);
|
|
// await _flutterLocalNotificationsPlugin.show(0, title, message, details);
|
|
// }
|
|
// }
|