import 'dart:convert'; import 'dart:io'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/main.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:firebase_core/firebase_core.dart'; final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); class AppNotifications { static final AppNotifications _instance = AppNotifications._internal(); AppNotifications._internal(); factory AppNotifications() => _instance; Future requestPermissions() async { if (Platform.isIOS) { await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation()?.requestPermissions(alert: true, badge: true, sound: true); } else if (Platform.isAndroid) { AndroidFlutterLocalNotificationsPlugin? androidImplementation = flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation(); bool? granted = await androidImplementation?.requestPermission(); if (granted == false) { if (kDebugMode) { print("-------------------- Permission Granted ------------------------"); print(granted); } await Permission.notification.request(); } } } void init(String? firebaseToken) async { await requestPermissions(); AppState().setDeviceToken = firebaseToken; await Permission.notification.isDenied.then((bool value) { if (value) { Permission.notification.request(); } }); RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage(); if (initialMessage != null) _handleMessage(initialMessage); FirebaseMessaging.onMessage.listen((RemoteMessage message) { if (message.notification != null) _handleMessage(message); }); FirebaseMessaging.onMessageOpenedApp.listen(_handleOpenApp); FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler); FirebaseMessaging.instance.onTokenRefresh.listen((String token) { AppState().setDeviceToken = token; }); } void _handleMessage(RemoteMessage message) { Utils.saveStringFromPrefs("isAppOpendByChat", "true"); } void _handleOpenApp(RemoteMessage message) { Utils.saveStringFromPrefs("isAppOpendByChat", "true"); Utils.saveStringFromPrefs("notificationData", message.data["user_chat_history_response"].toString()); } } AndroidNotificationChannel channel = const AndroidNotificationChannel( "high_importance_channel", "High Importance Notifications", importance: Importance.high, ); Future backgroundMessageHandler(RemoteMessage message) async { await Firebase.initializeApp(); Utils.saveStringFromPrefs("isAppOpendByChat", "true"); logger.w(message.data["user_chat_history_response"]); Utils.saveStringFromPrefs("notificationData", message.data["user_chat_history_response"].toString()); }