import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'dart:math'; import 'package:sefer_driver/constant/box_name.dart'; import 'package:sefer_driver/controller/payment/paymob/paymob_response.dart'; import 'package:sefer_driver/views/home/Captin/orderCaptin/order_request_page.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_overlay_window/flutter_overlay_window.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:flutter/services.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:wakelock_plus/wakelock_plus.dart'; import 'constant/api_key.dart'; import 'constant/info.dart'; import 'constant/notification.dart'; import 'controller/firebase/firbase_messge.dart'; import 'controller/firebase/local_notification.dart'; import 'controller/functions/encrypt_decrypt.dart'; import 'controller/functions/location_controller.dart'; import 'controller/functions/secure_storage.dart'; import 'controller/local/local_controller.dart'; import 'controller/local/translations.dart'; import 'controller/payment/paymob/paymob_wallet.dart'; import 'firebase_options.dart'; import 'models/db_sql.dart'; import 'print.dart'; import 'splash_screen_page.dart'; import 'views/home/Captin/orderCaptin/order_over_lay.dart'; final box = GetStorage(); const storage = FlutterSecureStorage(); final PaymobPayment paymobPayment = PaymobPayment(); final PaymobPaymentWallet paymobPaymentWallet = PaymobPaymentWallet(); DbSql sql = DbSql.instance; final GlobalKey navigatorKey = GlobalKey(); @pragma('vm:entry-point') Future backgroundMessageHandler(RemoteMessage message) async { await Firebase.initializeApp(); if (Platform.isAndroid) { if (message.notification != null && message.notification!.title != null) { if (message.notification?.title == 'Order'.tr || message.notification?.title == 'OrderSpeed') { var myListString = message.data['DriverList'] ?? '[]'; Log.print('myListString: $myListString'); // Decode the JSON string to a list List myList; try { myList = jsonDecode(myListString) as List; } catch (e) { Log.print('Error decoding JSON: $e'); myList = []; } await Future.delayed(const Duration(seconds: 1)); bool isOverlayActive = await FlutterOverlayWindow.isActive(); if (isOverlayActive) { await FlutterOverlayWindow.closeOverlay(); } await FlutterOverlayWindow.shareData(myList); await FlutterOverlayWindow.showOverlay( enableDrag: true, flag: OverlayFlag.focusPointer, // visibility: NotificationVisibility.visibilityPublic, positionGravity: PositionGravity.auto, height: 700, width: WindowSize.matchParent, startPosition: const OverlayPosition(0, -150), ); NotificationController().showNotification( message.notification!.title.toString(), message.notification!.body.toString(), 'order', myListString, ); await FlutterOverlayWindow.shareData(myList); } } else { FirebaseMessagesController().fireBaseTitles(message); } } } @pragma('vm:entry-point') void notificationTapBackground(NotificationResponse notificationResponse) { // handle background notification taps here print('Notification tapped in background!'); NotificationController().handleNotificationResponse(notificationResponse); // You can add your logic here to handle the notification tap } @pragma('vm:entry-point') void overlayMain() async { WidgetsFlutterBinding.ensureInitialized(); runApp(const MaterialApp( debugShowCheckedModeBanner: false, home: OrderOverlay(), )); } Future closeOverLay() async { // FlutterOverlayWindow.closeOverlay(); bool isOverlayActive = await FlutterOverlayWindow.isActive(); if (isOverlayActive) { await FlutterOverlayWindow.closeOverlay(); } } void main() async { WidgetsFlutterBinding.ensureInitialized(); await WakelockPlus.enable(); await GetStorage.init(); Stripe.publishableKey = AK.publishableKeyStripe; SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); runApp(MyApp()); } class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State { @override void initState() { super.initState(); _initApp(); } Future _initApp() async { try { await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform); final AppInitializer initializer = AppInitializer(); await initializer.initializeApp(); await EncryptionHelper.initialize(); if (Platform.isAndroid || Platform.isIOS) { Get.put( NotificationController()); // Initialize NotificationController here await FirebaseMessaging.instance.requestPermission(); FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler); await NotificationController().initNotifications(); // Generate a random index to pick a message final random = Random(); final randomMessage = driverMessages[random.nextInt(driverMessages.length)]; // Schedule the notification with the random message NotificationController().scheduleNotificationsForSevenDays( randomMessage.split(':')[0], randomMessage.split(':')[1], "ding", ); await Future.wait([ FirebaseMessagesController().getNotificationSettings(), FirebaseMessagesController().getToken(), ]); PermissionStatus status1 = await Permission.location.status; if (status1.isGranted) { await LocationController().startLocationUpdates(); } } String? key = (await storage.read(key: BoxName.payMobApikey)); if (key != null) { String? apiKey = EncryptionHelper.instance.decryptData(key); if (apiKey != null) { PaymobPayment.instance.initialize( // Use .instance apiKey: apiKey, integrationID: int.parse(AK.integrationIdPayMob), userTokenExpiration: 200, iFrameID: 837992, ); PaymobPaymentWallet.instance.initialize( // Use .instance apiKey: apiKey, integrationID: int.parse(AK.integrationIdPayMobWallet), userTokenExpiration: 200, iFrameID: 837992, ); } } } catch (e) { print("Error initializing app: $e"); // Handle initialization errors appropriately. Maybe show an error message to the user. } } @override Widget build(BuildContext context) { LocaleController localController = Get.put(LocaleController()); return GetMaterialApp( navigatorKey: navigatorKey, title: AppInformation.appName, translations: MyTranslation(), debugShowCheckedModeBanner: false, locale: localController.language, theme: localController.appTheme, initialRoute: '/', getPages: [ GetPage(name: '/', page: () => SplashScreen()), GetPage( name: '/order-page', page: () => OrderRequestPage(), arguments: box.read(BoxName.rideArguments), ), ], ); } } // void main() async { // WidgetsFlutterBinding.ensureInitialized(); // await WakelockPlus.enable(); // // await GetStorage.init(); // // final AppInitializer initializer = AppInitializer(); // // await initializer.initializeApp(); // await Future.delayed(Duration.zero); // await EncryptionHelper.initialize(); // // Stripe.publishableKey = AK.publishableKeyStripe; // // PermissionStatus status1 = await Permission.location.status; // // if (status1.isGranted) { // await LocationController().startLocationUpdates(); // // } // // if (Platform.isAndroid || Platform.isIOS) { // NotificationController notificationController = // Get.put(NotificationController()); // await Firebase.initializeApp( // options: DefaultFirebaseOptions.currentPlatform, // ); // await FirebaseMessagesController().requestFirebaseMessagingPermission(); // // FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler); // // await notificationController.initNotifications(); // // // Generate a random index to pick a message // final random = Random(); // final randomMessage = driverMessages[random.nextInt(driverMessages.length)]; // // // Schedule the notification with the random message // notificationController.scheduleNotificationsForSevenDays( // randomMessage.split(':')[0], // randomMessage.split(':')[1], // "ding", // ); // // await Future.wait([ // FirebaseMessagesController().getNotificationSettings(), // FirebaseMessagesController().getToken(), // ]); // // await FacebookAuth.instance.init(); // SystemChrome.setPreferredOrientations([ // DeviceOrientation.portraitUp, // DeviceOrientation.portraitDown, // ]); // } // // String? key = (await storage.read(key: BoxName.payMobApikey)); // // String? apiKey = EncryptionHelper.instance.decryptData(key!); // PaymobPayment.instance.initialize( // apiKey: apiKey, // integrationID: int.parse(AK.integrationIdPayMob), // userTokenExpiration: 200, // iFrameID: 837992, // ); // // PaymobPaymentWallet.instance.initialize( // apiKey: apiKey, // integrationID: int.parse(AK.integrationIdPayMobWallet), // userTokenExpiration: 200, // iFrameID: 837992, // ); // runApp(MyApp()); // } // // class MyApp extends StatelessWidget { // @override // Widget build(BuildContext context) { // LocaleController localController = Get.put(LocaleController()); // return GetMaterialApp( // navigatorKey: navigatorKey, // title: AppInformation.appName, // translations: MyTranslation(), // debugShowCheckedModeBanner: false, // locale: localController.language, // theme: localController.appTheme, // initialRoute: '/', // getPages: [ // GetPage(name: '/', page: () => SplashScreen()), // GetPage( // name: '/order-page', // page: () => OrderRequestPage(), // arguments: box.read(BoxName.rideArguments), // ), // ], // ); // } // }