import 'dart:async'; import 'dart:convert'; import 'dart:io'; 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:wakelock_plus/wakelock_plus.dart'; import 'constant/api_key.dart'; import 'constant/info.dart'; import 'controller/firebase/firbase_messge.dart'; import 'controller/firebase/local_notification.dart'; import 'controller/functions/encrypt_decrypt.dart'; import 'controller/functions/secure_storage.dart'; import 'controller/local/local_controller.dart'; import 'controller/local/translations.dart'; import 'firebase_options.dart'; import 'models/db_sql.dart'; import 'print.dart'; import 'splash_screen_page.dart'; import 'views/home/Captin/driver_map_page.dart'; import 'views/home/Captin/orderCaptin/order_over_lay.dart'; //--- Global Variables --- final box = GetStorage(); const storage = FlutterSecureStorage(); DbSql sql = DbSql.instance; final GlobalKey navigatorKey = GlobalKey(); const platform = MethodChannel('com.sefer_driver/app_control'); //--- Entry Points for Background/Terminated States --- @pragma('vm:entry-point') Future backgroundMessageHandler(RemoteMessage message) async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); await GetStorage.init(); if (!await FlutterOverlayWindow.isPermissionGranted()) { Log.print("Overlay permission not granted; showing only notification."); } if (Platform.isAndroid) { if (message.notification != null && message.notification!.title != null) { Log.print('message.notification!.title: ${message.notification!.title}'); if (message.notification?.title == 'Order' || message.notification?.title == 'OrderSpeed') { var myListString = message.data['DriverList'] ?? '[]'; Log.print('myListString: $myListString'); List myList; try { myList = jsonDecode(myListString) as List; } catch (e) { Log.print('Error decoding JSON: $e'); myList = []; } bool isOverlayActive = await FlutterOverlayWindow.isActive(); if (isOverlayActive) { await FlutterOverlayWindow.shareData(myList); } else { await FlutterOverlayWindow.showOverlay( enableDrag: true, flag: OverlayFlag.focusPointer, positionGravity: PositionGravity.auto, height: 1400, width: WindowSize.matchParent, startPosition: const OverlayPosition(0, -30), ); await FlutterOverlayWindow.shareData(myList); } // It's better to manage notifications in one place if possible // but this is fine if it works for you. NotificationController().showNotification( message.notification!.title.toString(), message.notification!.body.toString(), 'order', myListString, ); } else { // Handle other types of notifications FirebaseMessagesController().fireBaseTitles(message); } } } } @pragma('vm:entry-point') void notificationTapBackground(NotificationResponse notificationResponse) { Log.print('Notification tapped in background!'); NotificationController().handleNotificationResponse(notificationResponse); } @pragma('vm:entry-point') void overlayMain() async { WidgetsFlutterBinding.ensureInitialized(); await GetStorage.init(); await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); runApp(const MaterialApp( debugShowCheckedModeBanner: false, home: OrderOverlay(), )); } Future closeOverLay() async { bool isOverlayActive = await FlutterOverlayWindow.isActive(); if (isOverlayActive) { await FlutterOverlayWindow.closeOverlay(); } } //--- Main Application --- void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); await WakelockPlus.enable(); await GetStorage.init(); Stripe.publishableKey = AK.publishableKeyStripe; SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); runApp(const MyApp()); } class MyApp extends StatefulWidget { const MyApp({Key? key}) : super(key: key); @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State with WidgetsBindingObserver { @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); _initApp(); } @override void dispose() { super.dispose(); } Future _initApp() async { try { // await Firebase.initializeApp( // options: DefaultFirebaseOptions.currentPlatform); final AppInitializer initializer = AppInitializer(); await initializer.initializeApp(); await EncryptionHelper.initialize(); Get.put(NotificationController()); Get.put(FirebaseMessagesController()); await FirebaseMessaging.instance.requestPermission(); FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler); await FirebaseMessagesController().getToken(); await NotificationController().initNotifications(); // You can add your other initializations here // For example: // Your other startup logic... } catch (e) { Log.print("Error during _initApp: $e"); } } //--- Build Method --- @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(), ), GetPage( name: '/passenger-location-map', page: () => PassengerLocationMapPage()), ], ); } }