You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			190 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			190 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Dart
		
	
import 'dart:io';
 | 
						|
 | 
						|
import 'package:firebase_core/firebase_core.dart';
 | 
						|
import 'package:firebase_messaging/firebase_messaging.dart';
 | 
						|
import 'package:flutter/foundation.dart';
 | 
						|
import 'package:flutter/material.dart';
 | 
						|
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
 | 
						|
 | 
						|
// import 'package:huawei_hmsavailability/huawei_hmsavailability.dart';
 | 
						|
import 'package:huawei_push/huawei_push.dart' as huawei_push;
 | 
						|
import 'package:mohem_flutter_app/app_state/app_state.dart';
 | 
						|
import 'package:mohem_flutter_app/classes/date_uitl.dart';
 | 
						|
import 'package:mohem_flutter_app/classes/utils.dart';
 | 
						|
import 'package:mohem_flutter_app/models/get_notifications_response_model.dart';
 | 
						|
import 'package:mohem_flutter_app/ui/notifications/notification_details_page.dart';
 | 
						|
import 'package:permission_handler/permission_handler.dart';
 | 
						|
 | 
						|
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
 | 
						|
 | 
						|
class AppNotifications {
 | 
						|
  static final AppNotifications _instance = AppNotifications._internal();
 | 
						|
 | 
						|
  AppNotifications._internal();
 | 
						|
 | 
						|
  factory AppNotifications() => _instance;
 | 
						|
 | 
						|
  // late HmsApiAvailability hmsApiAvailability;
 | 
						|
 | 
						|
  String _huaweiToken = '';
 | 
						|
 | 
						|
  late BuildContext context;
 | 
						|
 | 
						|
  Future<void> requestPermissions() async {
 | 
						|
    if (Platform.isIOS) {
 | 
						|
      await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<IOSFlutterLocalNotificationsPlugin>()?.requestPermissions(alert: true, badge: true, sound: true);
 | 
						|
    } else if (Platform.isAndroid) {
 | 
						|
      AndroidFlutterLocalNotificationsPlugin? androidImplementation = flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>();
 | 
						|
      bool? granted = await androidImplementation?.requestPermission();
 | 
						|
      if (granted == false) {
 | 
						|
        if (kDebugMode) {
 | 
						|
          print("-------------------- Permission Granted ------------------------");
 | 
						|
          print(granted);
 | 
						|
        }
 | 
						|
        await Permission.notification.request();
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  void init(String? firebaseToken, BuildContext context) async {
 | 
						|
    // if (Platform.isAndroid) {
 | 
						|
    //   hmsApiAvailability = HmsApiAvailability();
 | 
						|
    // }
 | 
						|
 | 
						|
    this.context = context;
 | 
						|
 | 
						|
    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;
 | 
						|
    });
 | 
						|
 | 
						|
    if (Platform.isAndroid) {
 | 
						|
      // await hmsApiAvailability.isHMSAvailable().then((value) async {
 | 
						|
      if (!(await Utils.isGoogleServicesAvailable())) {
 | 
						|
        huawei_push.Push.enableLogger();
 | 
						|
        var result = await huawei_push.Push.setAutoInitEnabled(true);
 | 
						|
 | 
						|
        huawei_push.Push.onNotificationOpenedApp.listen((message) {
 | 
						|
          // newMessage(toFirebaseRemoteMessage(message));
 | 
						|
        }, onError: (e) => print(e.toString()));
 | 
						|
 | 
						|
        huawei_push.Push.onMessageReceivedStream.listen((message) {
 | 
						|
          // newMessage(toFirebaseRemoteMessage(message));
 | 
						|
        }, onError: (e) => print(e.toString()));
 | 
						|
      }
 | 
						|
      // }).catchError((err) {
 | 
						|
      //   print(err);
 | 
						|
      // });
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  void initHuaweiPush(Function loginCallback) {
 | 
						|
    AppState().setIsHuawei = true;
 | 
						|
    initTokenStream(loginCallback);
 | 
						|
    huawei_push.Push.getToken("");
 | 
						|
  }
 | 
						|
 | 
						|
  // HUAWEI PUSH TOKEN IMPLEMENTATION
 | 
						|
  void _onTokenEvent(String event) {
 | 
						|
    _huaweiToken = event;
 | 
						|
    AppState().setHuaweiPushToken = _huaweiToken;
 | 
						|
    debugPrint("HUAWEI PUSH TOKEN: $_huaweiToken");
 | 
						|
  }
 | 
						|
 | 
						|
  void _onTokenError(Object error) {
 | 
						|
    debugPrint("HUAWEI PUSH TOKEN ERROR: $error");
 | 
						|
    Utils.hideLoading(context);
 | 
						|
  }
 | 
						|
 | 
						|
  Future<void> initTokenStream(Function loginCallback) async {
 | 
						|
    huawei_push.Push.getTokenStream.listen(_onTokenEvent, onError: _onTokenError).onData((data) {
 | 
						|
      AppState().setHuaweiPushToken = data;
 | 
						|
      debugPrint("HUAWEI PUSH TOKEN: $data");
 | 
						|
      loginCallback();
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  void _handleMessage(RemoteMessage message) {
 | 
						|
    Utils.saveStringFromPrefs("isAppOpendByChat", "false");
 | 
						|
    GetNotificationsResponseModel notification = GetNotificationsResponseModel();
 | 
						|
 | 
						|
    notification.createdOn = DateUtil.getMonthDayYearDateFormatted(DateTime.now());
 | 
						|
    notification.messageTypeData = message.data['picture'];
 | 
						|
    notification.message = message.data['message'];
 | 
						|
    notification.notificationType = message.data["NotificationType"].toString();
 | 
						|
    if (message.data["NotificationType"] == "2") {
 | 
						|
      notification.videoURL = message.data["VideoUrl"];
 | 
						|
    }
 | 
						|
 | 
						|
    Future.delayed(Duration(seconds: 5), () {
 | 
						|
      Navigator.of(context).push(
 | 
						|
        MaterialPageRoute(
 | 
						|
          builder: (BuildContext context) => NotificationsDetailsPage(
 | 
						|
            notification: notification,
 | 
						|
          ),
 | 
						|
        ),
 | 
						|
      );
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  void _handleOpenApp(RemoteMessage message) {
 | 
						|
    if (message.data.isNotEmpty && message.data["type"] == 'chat') {
 | 
						|
      Utils.saveStringFromPrefs("isAppOpendByChat", "true");
 | 
						|
      Utils.saveStringFromPrefs("notificationData", message.data["user_chat_history_response"].toString());
 | 
						|
    } else {
 | 
						|
      GetNotificationsResponseModel notification = GetNotificationsResponseModel();
 | 
						|
 | 
						|
      notification.createdOn = DateUtil.getMonthDayYearDateFormatted(DateTime.now());
 | 
						|
      notification.messageTypeData = message.data['picture'];
 | 
						|
      notification.message = message.data['message'];
 | 
						|
      notification.notificationType = message.data["NotificationType"].toString();
 | 
						|
      if (message.data["NotificationType"] == "2") {
 | 
						|
        notification.videoURL = message.data["VideoUrl"];
 | 
						|
      }
 | 
						|
 | 
						|
      Future.delayed(Duration(seconds: 5), () {
 | 
						|
        Navigator.of(context).push(
 | 
						|
          MaterialPageRoute(
 | 
						|
            builder: (BuildContext context) => NotificationsDetailsPage(
 | 
						|
              notification: notification,
 | 
						|
            ),
 | 
						|
          ),
 | 
						|
        );
 | 
						|
      });
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
AndroidNotificationChannel channel = const AndroidNotificationChannel(
 | 
						|
  "high_importance_channel",
 | 
						|
  "High Importance Notifications",
 | 
						|
  importance: Importance.high,
 | 
						|
);
 | 
						|
 | 
						|
Future<dynamic> backgroundMessageHandler(RemoteMessage message) async {
 | 
						|
  await Firebase.initializeApp();
 | 
						|
  Utils.saveStringFromPrefs("isAppOpendByChat", "false");
 | 
						|
  Utils.saveStringFromPrefs("notificationData", message.data["user_chat_history_response"].toString());
 | 
						|
  if (message.data.isNotEmpty && message.data["type"] == 'call') {
 | 
						|
    // ChatVoipCall().showCallkitIncoming(uuid: const Uuid().v4(), data: message);
 | 
						|
  }
 | 
						|
}
 |