Call Decline & Fixes

merge-requests/188/head
Aamir Muhammad 2 years ago
parent d7d90f620e
commit 9e437b7ee9

@ -34,6 +34,7 @@ class ChatApiClient {
"deviceToken":AppState().getIsHuawei ? AppState().getHuaweiPushToken : AppState().getDeviceToken, "deviceToken":AppState().getIsHuawei ? AppState().getHuaweiPushToken : AppState().getDeviceToken,
"isHuaweiDevice": AppState().getIsHuawei, "isHuaweiDevice": AppState().getIsHuawei,
}, },
); );
if (!kReleaseMode) { if (!kReleaseMode) {
@ -187,6 +188,34 @@ class ChatApiClient {
return imagesData; return imagesData;
} }
// CallUser Login Token
Future<user.UserAutoLoginModel> 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 // Call Decline On App Terminated State
Future<Response> callDecline({required int cUserID, required int tUserID, required String targetUsertoken}) async { Future<Response> callDecline({required int cUserID, required int tUserID, required String targetUsertoken}) async {

@ -1,6 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'package:firebase_messaging/firebase_messaging.dart'; 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/entities/entities.dart';
import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart'; import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart';
import 'package:mohem_flutter_app/api/chat/chat_api_client.dart'; import 'package:mohem_flutter_app/api/chat/chat_api_client.dart';

@ -123,10 +123,11 @@ class AppNotifications {
Utils.saveStringFromPrefs("isAppOpendByChat", "true"); Utils.saveStringFromPrefs("isAppOpendByChat", "true");
Utils.saveStringFromPrefs("notificationData", message.data["user_chat_history_response"].toString()); Utils.saveStringFromPrefs("notificationData", message.data["user_chat_history_response"].toString());
} else if (message.data.isNotEmpty && message.data["messageType"] == 'call') { } else if (message.data.isNotEmpty && message.data["messageType"] == 'call') {
logger.d(message.toMap().toString()); if (Platform.isAndroid) {
ChatVoipCall().showCallkitIncoming(uuid: const Uuid().v4(), data: message); ChatVoipCall().showCallkitIncoming(uuid: const Uuid().v4(), data: message);
} }
} }
}
void _handleOpenApp(RemoteMessage message) { void _handleOpenApp(RemoteMessage message) {
if (message.data.isNotEmpty && message.data["type"] == 'chat') { if (message.data.isNotEmpty && message.data["type"] == 'chat') {
@ -150,6 +151,8 @@ Future<void> backgroundMessageHandler(RemoteMessage message) async {
Utils.saveStringFromPrefs("isAppOpendByChat", "false"); Utils.saveStringFromPrefs("isAppOpendByChat", "false");
Utils.saveStringFromPrefs("notificationData", message.data["user_chat_history_response"].toString()); Utils.saveStringFromPrefs("notificationData", message.data["user_chat_history_response"].toString());
} else if (message.data.isNotEmpty && message.data["messageType"] == 'call') { } else if (message.data.isNotEmpty && message.data["messageType"] == 'call') {
if (Platform.isAndroid) {
ChatVoipCall().showCallkitIncoming(uuid: const Uuid().v4(), data: message, background: true); ChatVoipCall().showCallkitIncoming(uuid: const Uuid().v4(), data: message, background: true);
} }
}
} }

@ -128,3 +128,41 @@ class Sdp {
"sdp": 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<String, dynamic> json) => IosCallPayload(
incomingCallType: json["incoming_call_type"],
incomingCallerId: json["incoming_caller_id"],
incomingCallerName: json["incoming_caller_name"],
uuid: json["uuid"],
);
Map<String, dynamic> toJson() => {
"incoming_call_type": incomingCallType,
"incoming_caller_id": incomingCallerId,
"incoming_caller_name": incomingCallerName,
"uuid": uuid,
};
}

@ -1,5 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:core'; import 'dart:core';
import 'dart:io';
import 'dart:ui'; import 'dart:ui';
import 'package:draggable_widget/draggable_widget.dart'; import 'package:draggable_widget/draggable_widget.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
@ -45,14 +46,18 @@ class _StartCallPageState extends State<StartCallPage> {
IncomingCallModel? sessionData; IncomingCallModel? sessionData;
dynamic calls = await FlutterCallkitIncoming.activeCalls(); dynamic calls = await FlutterCallkitIncoming.activeCalls();
if (calls.isNotEmpty) { 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) { if (provider.isUserOnline) {
cProv.isUserOnline = provider.isUserOnline; cProv.isUserOnline = provider.isUserOnline;
if (kDebugMode) { if (kDebugMode) {
print("====== Processing Incoming Call in Online State ========="); print("====== Processing Incoming Call in Online State =========");
} }
await cProv.startIncomingCallViaKit(inCallData: sessionData!.extra!.callerDetails!.toJson(), isVCall: sessionData.extra!.callType == "video" ? true : false); await cProv.startIncomingCallViaKit(inCallData: sessionData!.extra!.callerDetails!.toJson(), isVCall: sessionData.extra!.callType == "video" ? true : false);
cProv.init(); cProv.init();
isCallConnected = true; isCallConnected = true;
@ -73,14 +78,19 @@ class _StartCallPageState extends State<StartCallPage> {
} }
} }
} }
}
void startIosCall() {}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
cProv = context.read<ChatCallProvider>(); cProv = context.read<ChatCallProvider>();
provider = context.read<ChatProviderModel>(); provider = context.read<ChatProviderModel>();
if (Platform.isAndroid) {
startCall(); startCall();
} else if (Platform.isIOS) {
startIosCall();
}
return Scaffold( return Scaffold(
extendBody: true, extendBody: true,
body: Consumer2<ChatCallProvider, ChatProviderModel>( body: Consumer2<ChatCallProvider, ChatProviderModel>(

@ -64,7 +64,9 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
void initState() { void initState() {
WidgetsBinding.instance.addObserver(this); WidgetsBinding.instance.addObserver(this);
super.initState(); super.initState();
if (Platform.isAndroid) {
callListeners(); callListeners();
}
scheduleMicrotask(() { scheduleMicrotask(() {
data = Provider.of<DashboardProviderModel>(context, listen: false); data = Provider.of<DashboardProviderModel>(context, listen: false);
marathonProvider = Provider.of<MarathonProvider>(context, listen: false); marathonProvider = Provider.of<MarathonProvider>(context, listen: false);
@ -152,13 +154,13 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
String isAppOpendByChat = await Utils.getStringFromPrefs("isAppOpendByChat"); String isAppOpendByChat = await Utils.getStringFromPrefs("isAppOpendByChat");
if (isAppOpendByChat != "null" && isAppOpendByChat == "true") { if (isAppOpendByChat != "null" && isAppOpendByChat == "true") {
Utils.showLoading(context); Utils.showLoading(context);
cProvider.buildHubConnection(context: context, ccProvider: chatCallProvider); await cProvider.buildHubConnection(context: context, ccProvider: chatCallProvider);
Future.delayed(const Duration(seconds: 2), () async { Future.delayed(const Duration(seconds: 2), () async {
cProvider.invokeChatCounter(userId: AppState().chatDetails!.response!.id!); cProvider.invokeChatCounter(userId: AppState().chatDetails!.response!.id!);
gotoChat(context); gotoChat(context);
}); });
} else { } else {
cProvider.buildHubConnection(context: context, ccProvider: chatCallProvider); await cProvider.buildHubConnection(context: context, ccProvider: chatCallProvider);
Future.delayed(const Duration(seconds: 2), () { Future.delayed(const Duration(seconds: 2), () {
cProvider.invokeChatCounter(userId: AppState().chatDetails!.response!.id!); cProvider.invokeChatCounter(userId: AppState().chatDetails!.response!.id!);
}); });

@ -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_callkit_incoming/flutter_callkit_incoming.dart';
import 'package:flutter_ios_voip_kit/call_state_type.dart'; import 'package:flutter_ios_voip_kit/call_state_type.dart';
import 'package:flutter_ios_voip_kit/flutter_ios_voip_kit.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:huawei_hmsavailability/huawei_hmsavailability.dart';
import 'package:mohem_flutter_app/api/login_api_client.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/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_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/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/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/get_mobile_login_info_list_model.dart';
import 'package:mohem_flutter_app/models/member_information_list_model.dart'; import 'package:mohem_flutter_app/models/member_information_list_model.dart';
@ -57,6 +61,7 @@ class _LoginScreenState extends State<LoginScreen> with WidgetsBindingObserver {
MemberLoginListModel? _memberLoginList; MemberLoginListModel? _memberLoginList;
late final FirebaseMessaging _firebaseMessaging; late final FirebaseMessaging _firebaseMessaging;
IosCallPayload? _iosCallPayload;
bool _autoLogin = false; bool _autoLogin = false;
@ -114,6 +119,8 @@ class _LoginScreenState extends State<LoginScreen> with WidgetsBindingObserver {
voIPKit.onDidReceiveIncomingPush = ( voIPKit.onDidReceiveIncomingPush = (
Map<String, dynamic> payload, Map<String, dynamic> payload,
) async { ) async {
_iosCallPayload = IosCallPayload.fromJson(payload);
logger.d(_iosCallPayload!.incomingCallerId!.split("-").last);
print('🎈 example: onDidReceiveIncomingPush $payload'); print('🎈 example: onDidReceiveIncomingPush $payload');
_timeOut(); _timeOut();
}; };
@ -134,9 +141,14 @@ class _LoginScreenState extends State<LoginScreen> with WidgetsBindingObserver {
var callerID = "did accept call $callerId"; var callerID = "did accept call $callerId";
debugPrint(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.acceptIncomingCall(callerState: CallStateType.calling);
await voIPKit.callConnected(); await voIPKit.callConnected();
Future.delayed(const Duration(milliseconds: 2500), () { Future.delayed(const Duration(milliseconds: 2500), () {
voIPKit.endCall().then((value) async {}); voIPKit.endCall().then((value) async {});
}); });
@ -160,6 +172,17 @@ class _LoginScreenState extends State<LoginScreen> with WidgetsBindingObserver {
// print(error); // print(error);
// } // }
// } // }
Future<void> 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<void> callListeners() async { Future<void> callListeners() async {
try { try {
@ -200,7 +223,9 @@ class _LoginScreenState extends State<LoginScreen> with WidgetsBindingObserver {
dynamic calls = await FlutterCallkitIncoming.activeCalls(); dynamic calls = await FlutterCallkitIncoming.activeCalls();
if (calls is List) { if (calls is List) {
if (calls.isNotEmpty) { if (calls.isNotEmpty) {
if (Platform.isAndroid) {
Utils.hideLoading(context); Utils.hideLoading(context);
}
var pageRoute = MaterialPageRoute(builder: (context) => StartCallPage()); var pageRoute = MaterialPageRoute(builder: (context) => StartCallPage());
Navigator.push(context, pageRoute).whenComplete(() { Navigator.push(context, pageRoute).whenComplete(() {
checkFirebaseToken(); checkFirebaseToken();

Loading…
Cancel
Save