@ -1,134 +1,124 @@
import ' dart:convert ' ;
import ' dart:io ' ;
import ' package:diplomaticquarterapp/config/config.dart ' ;
import ' package:diplomaticquarterapp/config/shared_pref_kay.dart ' ;
import ' package:diplomaticquarterapp/models/LiveCare/IncomingCallData.dart ' ;
import ' package:diplomaticquarterapp/pages/landing/landing_page.dart ' ;
import ' package:diplomaticquarterapp/pages/livecare/incoming_call.dart ' ;
import ' package:diplomaticquarterapp/uitl/app-permissions.dart ' ;
import ' package:flutter/cupertino.dart ' ;
import ' package:flutter/material.dart ' ;
import ' package:huawei_push/huawei_push.dart ' as h_push ;
import ' package:firebase_messaging/firebase_messaging.dart ' ;
import ' package:firebase_messaging/firebase_messaging.dart ' as fir ;
import ' package:flutter/cupertino.dart ' ;
import ' package:flutter/material.dart ' ;
import ' package:flutter_hms_gms_availability/flutter_hms_gms_availability.dart ' ;
import ' package:shared_preferences/shared_preferences.dart ' ;
import ' package: huawei_push/huawei_push.dart' as h_push ;
import ' app_shared_preferences.dart ' ;
import ' navigation_service.dart ' ;
/ / | - - > Push Notification Background
Future < dynamic > backgroundMessageHandler ( dynamic message ) async {
Future < dynamic > backgroundMessageHandler ( dynamic message ) async {
fir . RemoteMessage message_ ;
if ( message is h_push . RemoteMessage ) { / / if huawei remote message convert it to Firebase Remote Message
if ( message is h_push . RemoteMessage ) {
/ / if huawei remote message convert it to Firebase Remote Message
message_ = toFirebaseRemoteMessage ( message ) ;
}
if ( message _ . data ! = null & & message _ . data [ ' is_call ' ] = = ' true ' ) {
_incomingCall ( message _ . data ) ;
if ( message . data ! = null & & message . data [ ' is_call ' ] = = ' true ' ) {
_incomingCall ( message . data ) ;
return ;
}
h_push . Push . localNotification ( {
h_push . HMSLocalNotificationAttr . TITLE: ' Background Message ' ,
h_push . HMSLocalNotificationAttr . MESSAGE: " By: BackgroundMessageHandler "
} ) ;
h_push . Push . localNotification ( { h_push . HMSLocalNotificationAttr . TITLE: ' Background Message ' , h_push . HMSLocalNotificationAttr . MESSAGE: " By: BackgroundMessageHandler " } ) ;
}
/ / Push Notification Background < - - |
RemoteMessage toFirebaseRemoteMessage ( h_push . RemoteMessage message ) {
RemoteMessage toFirebaseRemoteMessage ( h_push . RemoteMessage message ) {
final payload_data = jsonDecode ( message . data ) ;
final fire_message = RemoteMessage (
from: message . from ,
collapseKey: message . collapseKey ,
data: payload_data [ ' data ' ] ,
messageId: message . messageId ,
sentTime: DateTime . fromMillisecondsSinceEpoch ( message . sentTime * 1000 ) ,
ttl: message . ttl ,
category: null ,
messageType: message . type ,
notification: RemoteNotification (
title: message . notification . title ,
titleLocArgs: ( message . notification . titleLocalizationArgs ? ? [ ] ) . map ( ( e ) = > e . toString ( ) ) . toList ( ) ,
titleLocKey: message . notification . titleLocalizationKey ,
body: message . notification . body ,
bodyLocArgs: ( message . notification . bodyLocalizationArgs ? ? [ ] ) . map ( ( e ) = > e . toString ( ) ) . toList ( ) ,
bodyLocKey: message . notification . bodyLocalizationKey ,
android: AndroidNotification (
channelId: message . notification . channelId ,
clickAction: message . notification . clickAction ,
color: message . notification . color ,
count: null ,
imageUrl: message . notification . imageUrl . path ,
link: message . notification . link . path ,
smallIcon: message . notification . icon ,
sound: message . notification . sound ,
ticker: message . notification . ticker ,
tag: message . notification . tag ,
) ,
)
) ;
from: message . from ,
collapseKey: message . collapseKey ,
data: payload_data [ ' data ' ] ,
messageId: message . messageId ,
sentTime: DateTime . fromMillisecondsSinceEpoch ( message . sentTime * 1000 ) ,
ttl: message . ttl ,
category: null ,
messageType: message . type ,
notification: RemoteNotification (
title: message . notification . title ,
titleLocArgs: ( message . notification . titleLocalizationArgs ? ? [ ] ) . map ( ( e ) = > e . toString ( ) ) . toList ( ) ,
titleLocKey: message . notification . titleLocalizationKey ,
body: message . notification . body ,
bodyLocArgs: ( message . notification . bodyLocalizationArgs ? ? [ ] ) . map ( ( e ) = > e . toString ( ) ) . toList ( ) ,
bodyLocKey: message . notification . bodyLocalizationKey ,
android: AndroidNotification (
channelId: message . notification . channelId ,
clickAction: message . notification . clickAction ,
color: message . notification . color ,
count: null ,
imageUrl: message . notification . imageUrl . path ,
link: message . notification . link . path ,
smallIcon: message . notification . icon ,
sound: message . notification . sound ,
ticker: message . notification . ticker ,
tag: message . notification . tag ,
) ,
) ) ;
return fire_message ;
}
_incomingCall ( Map data ) async {
_incomingCall ( Map data ) async {
print ( " _incomingCall CALLED!!!!!! $ data " ) ;
/ / print ( ModalRoute . of ( currentContext ) . settings . name ) ;
LandingPage . incomingCallData = IncomingCallData . fromJson ( data ) ;
if ( LandingPage . isOpenCallPage = = false ) {
if ( LandingPage . isOpenCallPage = = false ) {
LandingPage . isOpenCallPage = true ;
final permited = await AppPermission . askVideoCallPermission ( currentContext ) ;
if ( permited )
await NavigationService . navigateToPage ( IncomingCall ( incomingCallData: LandingPage . incomingCallData ) ) ;
LandingPage . isOpenCallPage = false ;
if ( permited ) await NavigationService . navigateToPage ( IncomingCall ( incomingCallData: LandingPage . incomingCallData ) ) ;
/ / LandingPage . isOpenCallPage = false ;
}
await Future . delayed ( Duration ( milliseconds: 500 ) ) ;
await AppSharedPreferences ( ) . remove ( ' call_data ' ) ;
}
class PushNotificationHandler {
class PushNotificationHandler {
final BuildContext context ;
static PushNotificationHandler _instance ;
PushNotificationHandler ( this . context ) {
PushNotificationHandler ( this . context ) {
PushNotificationHandler . _instance = this ;
}
static PushNotificationHandler getInstance ( ) = > _instance ;
init ( ) async {
init ( ) async {
if ( Platform . isIOS ) {
final permission = await FirebaseMessaging . instance . requestPermission ( ) ;
if ( permission . authorizationStatus = = AuthorizationStatus . denied )
return ;
if ( permission . authorizationStatus = = AuthorizationStatus . denied ) return ;
}
if ( Platform . isAndroid & & ( await FlutterHmsGmsAvailability . isHmsAvailable ) ) { / / ' Android HMS ' ( Handle Huawei Push_Kit Streams )
if ( Platform . isAndroid & & ( await FlutterHmsGmsAvailability . isHmsAvailable ) ) {
/ / ' Android HMS ' ( Handle Huawei Push_Kit Streams )
h_push . Push . enableLogger ( ) ;
final result = await h_push . Push . setAutoInitEnabled ( true ) ;
h_push . Push . onNotificationOpenedApp . listen ( ( message ) {
h_push . Push . onNotificationOpenedApp . listen ( ( message ) {
newMessage ( toFirebaseRemoteMessage ( message ) ) ;
} , onError: ( e ) = > print ( e . toString ( ) ) ) ;
h_push . Push . onMessageReceivedStream . listen ( ( message ) {
h_push . Push . onMessageReceivedStream . listen ( ( message ) {
newMessage ( toFirebaseRemoteMessage ( message ) ) ;
} , onError: ( e ) = > print ( e . toString ( ) ) ) ;
h_push . Push . getTokenStream . listen ( ( token ) {
h_push . Push . getTokenStream . listen ( ( token ) {
onToken ( token ) ;
} , onError: ( e ) = > print ( e . toString ( ) ) ) ;
await h_push . Push . getToken ( ' ' ) ;
h_push . Push . registerBackgroundMessageHandler ( backgroundMessageHandler ) ;
} else { / / ' Android GMS or iOS ' ( Handle Firebase Messaging Streams )
} else {
/ / ' Android GMS or iOS ' ( Handle Firebase Messaging Streams )
FirebaseMessaging . onMessage . listen ( ( RemoteMessage message ) async {
newMessage ( message ) ;
@ -145,19 +135,15 @@ class PushNotificationHandler{
FirebaseMessaging . onBackgroundMessage ( backgroundMessageHandler ) ;
final fcmToken = await FirebaseMessaging . instance . getToken ( ) ;
if ( fcmToken ! = null )
onToken ( fcmToken ) ;
if ( fcmToken ! = null ) onToken ( fcmToken ) ;
}
}
newMessage ( RemoteMessage remoteMessage ) {
if ( remoteMessage . data [ ' is_call ' ] = = ' true ' | | remoteMessage . data [ ' is_call ' ] = = true )
_incomingCall ( remoteMessage . data ) ;
newMessage ( RemoteMessage remoteMessage ) {
if ( remoteMessage . data [ ' is_call ' ] = = ' true ' | | remoteMessage . data [ ' is_call ' ] = = true ) _incomingCall ( remoteMessage . data ) ;
}
onToken ( String token ) async {
onToken ( String token ) async {
print ( " Push Notification Token: " + token ) ;
AppSharedPreferences ( ) . setString ( PUSH_TOKEN , token ) ;
DEVICE_TOKEN = token ;
@ -165,11 +151,10 @@ class PushNotificationHandler{
onResume ( ) async {
var call_data = await AppSharedPreferences ( ) . getObject ( ' call_data ' ) ;
if ( call_data ! = null ) {
if ( call_data ! = null ) {
_incomingCall ( call_data ) ;
}
}
}
/* todo verify all functionality */
@ -275,4 +260,4 @@ class PushNotificationHandler{
/ / print ( " Is Call Not Found iOS " ) ;
/ / }
/ / } ,
/ / ) ;
/ / ) ;