diff --git a/lib/api/chat/chat_api_client.dart b/lib/api/chat/chat_api_client.dart index 77dcb34..ecd69b0 100644 --- a/lib/api/chat/chat_api_client.dart +++ b/lib/api/chat/chat_api_client.dart @@ -34,6 +34,7 @@ class ChatApiClient { "deviceToken":AppState().getIsHuawei ? AppState().getHuaweiPushToken : AppState().getDeviceToken, "isHuaweiDevice": AppState().getIsHuawei, }, + ); if (!kReleaseMode) { @@ -186,6 +187,34 @@ class ChatApiClient { } return imagesData; } + + + // CallUser Login Token + + + Future getUserCallToken({required String userid}) async { + user.UserAutoLoginModel userLoginResponse = user.UserAutoLoginModel(); + Response response = await ApiClient().postJsonForResponse( + "${ApiConsts.chatLoginTokenUrl}externaluserlogin", + { + "employeeNumber": userid, + "password": "FxIu26rWIKoF8n6mpbOmAjDLphzFGmpG", + }, + ); + + if (!kReleaseMode) { + logger.i("login-res: " + response.body); + } + if (response.statusCode == 200) { + userLoginResponse = user.userAutoLoginModelFromJson(response.body); + } else if (response.statusCode == 501 || response.statusCode == 502 || response.statusCode == 503 || response.statusCode == 504) { + getUserCallToken(userid: userid); + } else { + userLoginResponse = user.userAutoLoginModelFromJson(response.body); + Utils.showToast(userLoginResponse.errorResponses!.first.message!); + } + return userLoginResponse; + } // Call Decline On App Terminated State diff --git a/lib/classes/chat_call_kit.dart b/lib/classes/chat_call_kit.dart index 65da5c1..99b738e 100644 --- a/lib/classes/chat_call_kit.dart +++ b/lib/classes/chat_call_kit.dart @@ -1,6 +1,5 @@ import 'dart:convert'; import 'package:firebase_messaging/firebase_messaging.dart'; -import 'package:flutter/services.dart'; import 'package:flutter_callkit_incoming/entities/entities.dart'; import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart'; import 'package:mohem_flutter_app/api/chat/chat_api_client.dart'; diff --git a/lib/classes/notifications.dart b/lib/classes/notifications.dart index 9de4e91..c130130 100644 --- a/lib/classes/notifications.dart +++ b/lib/classes/notifications.dart @@ -123,8 +123,9 @@ class AppNotifications { Utils.saveStringFromPrefs("isAppOpendByChat", "true"); Utils.saveStringFromPrefs("notificationData", message.data["user_chat_history_response"].toString()); } else if (message.data.isNotEmpty && message.data["messageType"] == 'call') { - logger.d(message.toMap().toString()); - ChatVoipCall().showCallkitIncoming(uuid: const Uuid().v4(), data: message); + if (Platform.isAndroid) { + ChatVoipCall().showCallkitIncoming(uuid: const Uuid().v4(), data: message); + } } } @@ -150,6 +151,8 @@ Future backgroundMessageHandler(RemoteMessage message) async { Utils.saveStringFromPrefs("isAppOpendByChat", "false"); Utils.saveStringFromPrefs("notificationData", message.data["user_chat_history_response"].toString()); } else if (message.data.isNotEmpty && message.data["messageType"] == 'call') { - ChatVoipCall().showCallkitIncoming(uuid: const Uuid().v4(), data: message, background: true); + if (Platform.isAndroid) { + ChatVoipCall().showCallkitIncoming(uuid: const Uuid().v4(), data: message, background: true); + } } } diff --git a/lib/models/chat/call.dart b/lib/models/chat/call.dart index 0f0e5a6..9b6c36d 100644 --- a/lib/models/chat/call.dart +++ b/lib/models/chat/call.dart @@ -128,3 +128,41 @@ class Sdp { "sdp": sdp, }; } + + + + + +// final iosCallPayload = iosCallPayloadFromJson(jsonString); + +class IosCallPayload { + String? incomingCallType; + String? incomingCallerId; + String? incomingCallerName; + String? uuid; + + IosCallPayload({ + this.incomingCallType, + this.incomingCallerId, + this.incomingCallerName, + this.uuid, + }); + + factory IosCallPayload.fromRawJson(String str) => IosCallPayload.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory IosCallPayload.fromJson(Map json) => IosCallPayload( + incomingCallType: json["incoming_call_type"], + incomingCallerId: json["incoming_caller_id"], + incomingCallerName: json["incoming_caller_name"], + uuid: json["uuid"], + ); + + Map toJson() => { + "incoming_call_type": incomingCallType, + "incoming_caller_id": incomingCallerId, + "incoming_caller_name": incomingCallerName, + "uuid": uuid, + }; +} diff --git a/lib/ui/chat/call/chat_incoming_call_screen.dart b/lib/ui/chat/call/chat_incoming_call_screen.dart index 32ac3df..48981de 100644 --- a/lib/ui/chat/call/chat_incoming_call_screen.dart +++ b/lib/ui/chat/call/chat_incoming_call_screen.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'dart:core'; +import 'dart:io'; import 'dart:ui'; import 'package:draggable_widget/draggable_widget.dart'; import 'package:flutter/foundation.dart'; @@ -45,14 +46,18 @@ class _StartCallPageState extends State { IncomingCallModel? sessionData; dynamic calls = await FlutterCallkitIncoming.activeCalls(); if (calls.isNotEmpty) { - sessionData = IncomingCallModel.fromRawJson(jsonEncode(calls[0])); - } + dynamic values = calls[0]; + logger.d(calls); + print("------- We are Here ---------"); + print(calls[0]); + sessionData = await IncomingCallModel.fromRawJson(jsonEncode(values)); + + print(sessionData.toRawJson()); if (provider.isUserOnline) { cProv.isUserOnline = provider.isUserOnline; if (kDebugMode) { print("====== Processing Incoming Call in Online State ========="); } - await cProv.startIncomingCallViaKit(inCallData: sessionData!.extra!.callerDetails!.toJson(), isVCall: sessionData.extra!.callType == "video" ? true : false); cProv.init(); isCallConnected = true; @@ -72,15 +77,20 @@ class _StartCallPageState extends State { logger.w(e); } } + } } - + void startIosCall() {} @override Widget build(BuildContext context) { cProv = context.read(); provider = context.read(); - startCall(); + if (Platform.isAndroid) { + startCall(); + } else if (Platform.isIOS) { + startIosCall(); + } return Scaffold( extendBody: true, body: Consumer2( diff --git a/lib/ui/landing/dashboard_screen.dart b/lib/ui/landing/dashboard_screen.dart index 898b316..28575cd 100644 --- a/lib/ui/landing/dashboard_screen.dart +++ b/lib/ui/landing/dashboard_screen.dart @@ -64,17 +64,19 @@ class _DashboardScreenState extends State with WidgetsBindingOb void initState() { WidgetsBinding.instance.addObserver(this); super.initState(); - callListeners(); - scheduleMicrotask(() { - data = Provider.of(context, listen: false); - marathonProvider = Provider.of(context, listen: false); - cProvider = Provider.of(context, listen: false); - chatCallProvider = Provider.of(context, listen: false); - if (checkIfPrivilegedForChat()) { - _bHubCon(); - } - _onRefresh(true); - }); + if (Platform.isAndroid) { + callListeners(); + } + scheduleMicrotask(() { + data = Provider.of(context, listen: false); + marathonProvider = Provider.of(context, listen: false); + cProvider = Provider.of(context, listen: false); + chatCallProvider = Provider.of(context, listen: false); + if (checkIfPrivilegedForChat()) { + _bHubCon(); + } + _onRefresh(true); + }); } Future callListeners() async { @@ -152,13 +154,13 @@ class _DashboardScreenState extends State with WidgetsBindingOb String isAppOpendByChat = await Utils.getStringFromPrefs("isAppOpendByChat"); if (isAppOpendByChat != "null" && isAppOpendByChat == "true") { Utils.showLoading(context); - cProvider.buildHubConnection(context: context, ccProvider: chatCallProvider); + await cProvider.buildHubConnection(context: context, ccProvider: chatCallProvider); Future.delayed(const Duration(seconds: 2), () async { cProvider.invokeChatCounter(userId: AppState().chatDetails!.response!.id!); gotoChat(context); }); } else { - cProvider.buildHubConnection(context: context, ccProvider: chatCallProvider); + await cProvider.buildHubConnection(context: context, ccProvider: chatCallProvider); Future.delayed(const Duration(seconds: 2), () { cProvider.invokeChatCounter(userId: AppState().chatDetails!.response!.id!); }); diff --git a/lib/ui/login/login_screen.dart b/lib/ui/login/login_screen.dart index bbfc60d..b716052 100644 --- a/lib/ui/login/login_screen.dart +++ b/lib/ui/login/login_screen.dart @@ -14,6 +14,7 @@ import 'package:flutter_callkit_incoming/entities/call_event.dart'; import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart'; import 'package:flutter_ios_voip_kit/call_state_type.dart'; import 'package:flutter_ios_voip_kit/flutter_ios_voip_kit.dart'; +import 'package:mohem_flutter_app/api/chat/chat_api_client.dart'; // import 'package:huawei_hmsavailability/huawei_hmsavailability.dart'; import 'package:mohem_flutter_app/api/login_api_client.dart'; @@ -28,6 +29,9 @@ import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/main.dart'; +import 'package:mohem_flutter_app/models/chat/call.dart'; +import 'package:mohem_flutter_app/models/chat/get_user_login_token_model.dart'; import 'package:mohem_flutter_app/models/check_mobile_app_version_model.dart'; import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart'; import 'package:mohem_flutter_app/models/member_information_list_model.dart'; @@ -57,6 +61,7 @@ class _LoginScreenState extends State with WidgetsBindingObserver { MemberLoginListModel? _memberLoginList; late final FirebaseMessaging _firebaseMessaging; + IosCallPayload? _iosCallPayload; bool _autoLogin = false; @@ -114,6 +119,8 @@ class _LoginScreenState extends State with WidgetsBindingObserver { voIPKit.onDidReceiveIncomingPush = ( Map payload, ) async { + _iosCallPayload = IosCallPayload.fromJson(payload); + logger.d(_iosCallPayload!.incomingCallerId!.split("-").last); print('🎈 example: onDidReceiveIncomingPush $payload'); _timeOut(); }; @@ -134,9 +141,14 @@ class _LoginScreenState extends State with WidgetsBindingObserver { var callerID = "did accept call $callerId"; debugPrint(callerID); - + logger.d(_iosCallPayload!.incomingCallerId!.split("-").last); + debugPrint(_iosCallPayload!.incomingCallerId); + debugPrint(_iosCallPayload!.incomingCallerName); + debugPrint(_iosCallPayload!.incomingCallType); + await connectCall(); await voIPKit.acceptIncomingCall(callerState: CallStateType.calling); await voIPKit.callConnected(); + Future.delayed(const Duration(milliseconds: 2500), () { voIPKit.endCall().then((value) async {}); }); @@ -160,6 +172,17 @@ class _LoginScreenState extends State with WidgetsBindingObserver { // print(error); // } // } + Future connectCall() async { + try { + UserAutoLoginModel userLoginResponse = await ChatApiClient().getUserCallToken(userid: _iosCallPayload!.incomingCallerId!.split("-").last); + if (userLoginResponse.response != null) { + AppState().setchatUserDetails = userLoginResponse; + Utils.saveStringFromPrefs("userLoginChatDetails", jsonEncode(userLoginResponse.response)); + } + } catch (e) { + logger.d(e); + } + } Future callListeners() async { try { @@ -200,7 +223,9 @@ class _LoginScreenState extends State with WidgetsBindingObserver { dynamic calls = await FlutterCallkitIncoming.activeCalls(); if (calls is List) { if (calls.isNotEmpty) { - Utils.hideLoading(context); + if (Platform.isAndroid) { + Utils.hideLoading(context); + } var pageRoute = MaterialPageRoute(builder: (context) => StartCallPage()); Navigator.push(context, pageRoute).whenComplete(() { checkFirebaseToken();