From d54b83358a944e8d1828feec5631361ad6200bd7 Mon Sep 17 00:00:00 2001 From: Zohaib Iqbal Kambrani <> Date: Tue, 2 Aug 2022 12:20:30 +0300 Subject: [PATCH] no message --- android/FlutterFirebaseMessagingReceiver.java | 2 +- ios/Podfile.lock | 22 +++ lib/config/config.dart | 2 +- .../webrtc/signaling.dart | 139 ++++++++++++++---- lib/pages/webRTC/signaling.dart | 2 +- lib/uitl/SignalRUtil.dart | 15 +- 6 files changed, 145 insertions(+), 37 deletions(-) diff --git a/android/FlutterFirebaseMessagingReceiver.java b/android/FlutterFirebaseMessagingReceiver.java index 35b19b37..bfe150bf 100644 --- a/android/FlutterFirebaseMessagingReceiver.java +++ b/android/FlutterFirebaseMessagingReceiver.java @@ -1,4 +1,4 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. + // Copyright 2020 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 2d3d257b..473ce746 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -111,6 +111,8 @@ PODS: - GoogleUtilities/UserDefaults (~> 7.6) - nanopb (~> 2.30908.0) - Flutter (1.0.0) + - flutter_app_icon_badge (0.0.1): + - Flutter - flutter_hms_gms_availability (0.0.1): - Flutter - flutter_inappwebview (0.0.1): @@ -120,6 +122,8 @@ PODS: - flutter_inappwebview/Core (0.0.1): - Flutter - OrderedSet (~> 5.0) + - flutter_ios_voip_kit (0.0.1): + - Flutter - flutter_local_notifications (0.0.1): - Flutter - flutter_native_timezone (0.0.1): @@ -229,6 +233,10 @@ PODS: - Flutter - pay_ios (0.0.1): - Flutter + - payfort_plugin (0.3.0): + - Flutter + - PayFortSDK + - PayFortSDK (3.1.0) - "permission_handler (5.1.0+2)": - Flutter - PromisesObjC (2.0.0) @@ -279,8 +287,10 @@ DEPENDENCIES: - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - Flutter (from `Flutter`) + - flutter_app_icon_badge (from `.symlinks/plugins/flutter_app_icon_badge/ios`) - flutter_hms_gms_availability (from `.symlinks/plugins/flutter_hms_gms_availability/ios`) - flutter_inappwebview (from `.symlinks/plugins/flutter_inappwebview/ios`) + - flutter_ios_voip_kit (from `.symlinks/plugins/flutter_ios_voip_kit/ios`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - flutter_native_timezone (from `.symlinks/plugins/flutter_native_timezone/ios`) - flutter_nfc_kit (from `.symlinks/plugins/flutter_nfc_kit/ios`) @@ -304,6 +314,7 @@ DEPENDENCIES: - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) - pay_ios (from `.symlinks/plugins/pay_ios/ios`) + - payfort_plugin (from `.symlinks/plugins/payfort_plugin/ios`) - permission_handler (from `.symlinks/plugins/permission_handler/ios`) - screen_brightness_ios (from `.symlinks/plugins/screen_brightness_ios/ios`) - searchable_dropdown (from `.symlinks/plugins/searchable_dropdown/ios`) @@ -337,6 +348,7 @@ SPEC REPOS: - nanopb - OpenTok - OrderedSet + - PayFortSDK - PromisesObjC - Reachability - SDWebImage @@ -370,10 +382,14 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/firebase_messaging/ios" Flutter: :path: Flutter + flutter_app_icon_badge: + :path: ".symlinks/plugins/flutter_app_icon_badge/ios" flutter_hms_gms_availability: :path: ".symlinks/plugins/flutter_hms_gms_availability/ios" flutter_inappwebview: :path: ".symlinks/plugins/flutter_inappwebview/ios" + flutter_ios_voip_kit: + :path: ".symlinks/plugins/flutter_ios_voip_kit/ios" flutter_local_notifications: :path: ".symlinks/plugins/flutter_local_notifications/ios" flutter_native_timezone: @@ -418,6 +434,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/path_provider_ios/ios" pay_ios: :path: ".symlinks/plugins/pay_ios/ios" + payfort_plugin: + :path: ".symlinks/plugins/payfort_plugin/ios" permission_handler: :path: ".symlinks/plugins/permission_handler/ios" screen_brightness_ios: @@ -463,8 +481,10 @@ SPEC CHECKSUMS: FirebaseInstallations: 830327b45345ffc859eaa9c17bcd5ae893fd5425 FirebaseMessaging: 82c4a48638f53f7b184f3cc9f6cd2cbe533ab316 Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a + flutter_app_icon_badge: 844847adbd7a1c6f325d6b41b942428981b839cc flutter_hms_gms_availability: babc50b18670e99780270bc18d9b17d0a07cd77e flutter_inappwebview: bfd58618f49dc62f2676de690fc6dcda1d6c3721 + flutter_ios_voip_kit: a3b4c5bd0cfda5069b5605a6d1dc60ecf99c6299 flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 flutter_native_timezone: 5f05b2de06c9776b4cc70e1839f03de178394d22 flutter_nfc_kit: 965c98c3fa68f5609f1cc89abb968fe1b8ffdbaa @@ -497,6 +517,8 @@ SPEC CHECKSUMS: package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e path_provider_ios: 7d7ce634493af4477d156294792024ec3485acd5 pay_ios: 8c7beb9c61d885f3f51b61f75f8793023fc8843a + payfort_plugin: 6216a51564e4987204cd36947a6adccf49db3536 + PayFortSDK: a33a8488859d7666b3709f347ebb990697e1d110 permission_handler: ccb20a9fad0ee9b1314a52b70b76b473c5f8dab0 PromisesObjC: 68159ce6952d93e17b2dfe273b8c40907db5ba58 Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 diff --git a/lib/config/config.dart b/lib/config/config.dart index ac610ee9..4efd0690 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -399,7 +399,7 @@ var UPDATE_COVID_QUESTIONNAIRE = 'Services/Doctors.svc/REST/COVID19_Questionnar var CHANNEL = 3; var GENERAL_ID = 'Cs2020@2016\$2958'; var IP_ADDRESS = '10.20.10.20'; -var VERSION_ID = 8.3; +var VERSION_ID = 8.6; var SETUP_ID = '91877'; var LANGUAGE = 2; var PATIENT_OUT_SA = 0; diff --git a/lib/pages/videocall-webrtc-rnd/webrtc/signaling.dart b/lib/pages/videocall-webrtc-rnd/webrtc/signaling.dart index 438b42de..d9d2c658 100644 --- a/lib/pages/videocall-webrtc-rnd/webrtc/signaling.dart +++ b/lib/pages/videocall-webrtc-rnd/webrtc/signaling.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'dart:async'; +import 'package:diplomaticquarterapp/uitl/SignalRUtil.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart'; @@ -50,6 +51,8 @@ class SocketUser{ } class Signaling { + SignalRUtil signalrUtil; + var connectToSignalR = true; var _host; var _turnCredential; @@ -76,15 +79,14 @@ class Signaling { Map _iceServers = { 'iceServers': [ - {'url': 'stun:stun.l.google.com:19302'}, - /* - * turn server configuration example. + // {'url': 'stun:stun.l.google.com:19302'}, + // {'url': 'stun:15.185.116.59:3478'}, + // {'url': 'stun:34.135.78.17:19302'}, { - 'url': 'turn:123.45.67.89:3478', - 'username': 'change_to_real_user', - 'credential': 'change_to_real_secret' + 'url': "turn:34.135.78.17:19302?transport=udp", + 'username': "1659428372:flutter-webrtc", + 'credential': "/fPfuS6Nf6hpl5LypJniRoAx9CI" }, - */ ] }; @@ -247,28 +249,93 @@ class Signaling { } Future connect() async { + + if(connectToSignalR){ + final hub = "https://VCallApi.hmg.com/WebRTCHub?source=web&username=s1"; + signalrUtil = SignalRUtil(hubName: hub); + signalrUtil.setContributors(caller: "zik", receiver: "s1"); + + final connected = await signalrUtil.openConnection(); + if(connected){ + signalrUtil.listen( + onIncomingCall: (user) async{ + await Future.delayed(Duration(seconds: 1)); + signalrUtil.acceptCall("s1", "zik"); + }, + onAcceptCall: (user){ + print(user.toString()); + }, + onDeclineCall: (str, user){ + print(str); + }, + onHangupCall: (user){ + + }, + onCandidate: (candidate_str) async{ + print(candidate_str); + + final candidateMap = jsonDecode(candidate_str)["candidate"]; + RTCIceCandidate candidate = RTCIceCandidate(candidateMap['candidate'], + candidateMap['sdpMid'], candidateMap['sdpMLineIndex']); + + if (session != null) { + if (session.pc != null) { + await session.pc?.addCandidate(candidate); + } else { + session.remoteCandidates.add(candidate); + } + } else { + // _sessions[sessionId] = SessionOneToOne(pid: peerId, sid: sessionId) + // ..remoteCandidates.add(candidate); + } + }, + onOffer: (offer_str,user) async{ + print(offer_str); + + final offer = jsonDecode(offer_str); + final caller = offer['caller']; + final receiver = offer['target']; + final offerSdp = offer['sdp']; + await _initPeerConnection(session, media: "video", screenSharing: false); + await session.pc?.setRemoteDescription(RTCSessionDescription(offerSdp['sdp'], offerSdp['type'])); + await _createAnswer(session, "video"); + + if (session.remoteCandidates.isNotEmpty) { + session.remoteCandidates.forEach((candidate) async { + await session.pc?.addCandidate(candidate); + }); + session.remoteCandidates.clear(); + } + onCallStateChange?.call(session, CallState.Calling); + } + ); + } + + return; + } + _socket = SimpleWebSocket('$_host/ws'); if (_turnCredential == null) { try { - _turnCredential = await getTurnCredential(_host); - /* - { - "username": "1584195784:mbzrxpgjys", - "password": "isyl6FF6nqMTB9/ig5MrMRUXqZg", - "ttl": 86400, - "uris": ["turn:127.0.0.1:19302?transport=udp"] - } - */ - _iceServers = { - 'iceServers': [ - { - 'urls': _turnCredential['uris'][0], - 'username': _turnCredential['username'], - 'credential': _turnCredential['password'] - }, - ] - }; + // _turnCredential = await getTurnCredential(_host); + // /* + // { + // "username": "1584195784:mbzrxpgjys", + // "password": "isyl6FF6nqMTB9/ig5MrMRUXqZg", + // "ttl": 86400, + // "uris": ["turn:127.0.0.1:19302?transport=udp"] + // } + // */ + // _iceServers = { + // 'iceServers': [ + // { + // 'urls': _turnCredential['uris'][0], + // 'username': _turnCredential['username'], + // 'credential': _turnCredential['password'] + // }, + // ] + // }; } catch (e) {} } @@ -394,6 +461,18 @@ class Signaling { print('onIceCandidate: complete!'); return; } + + if(connectToSignalR){ + // This delay is needed to allow enough time to try an ICE candidate + // before skipping to the next one. 1 second is just an heuristic value + // and should be thoroughly tested in your own environment. + await Future.delayed(const Duration(seconds: 1), () { + final candidateMap = {"candidate":candidate.toMap()}; + signalrUtil.addIceCandidate(jsonEncode(candidateMap)); + }); + return; + } + // This delay is needed to allow enough time to try an ICE candidate // before skipping to the next one. 1 second is just an heuristic value // and should be thoroughly tested in your own environment. @@ -464,9 +543,14 @@ class Signaling { Future _createAnswer(SessionOneToOne session, String media) async { try { - RTCSessionDescription s = - await session.pc .createAnswer(media == 'data' ? _dcConstraints : {}); + RTCSessionDescription s = await session.pc.createAnswer(media == 'data' ? _dcConstraints : {}); await session.pc .setLocalDescription(s); + + if(connectToSignalR){ + signalrUtil.answerOffer(s); + return; + } + _send('answer', { 'to': session.remote_user?.id, 'from': session.local_user.id, @@ -487,6 +571,7 @@ class Signaling { Future finishSessions() async { _closeSessionById(session.id); + signalrUtil?.closeConnection(); } void _closeSessionById(String sessionId) { diff --git a/lib/pages/webRTC/signaling.dart b/lib/pages/webRTC/signaling.dart index 9a4d1c48..424069bd 100644 --- a/lib/pages/webRTC/signaling.dart +++ b/lib/pages/webRTC/signaling.dart @@ -197,7 +197,7 @@ class Signaling { print(e); }); }).then((answer) { - return signalR.answerOffer(answer, caller, receiver).catchError((e){ + return signalR.answerOffer(answer).catchError((e){ print(e); }); }).catchError((e) { diff --git a/lib/uitl/SignalRUtil.dart b/lib/uitl/SignalRUtil.dart index d9a73a14..2d4444a0 100644 --- a/lib/uitl/SignalRUtil.dart +++ b/lib/uitl/SignalRUtil.dart @@ -62,10 +62,11 @@ class SignalRUtil { await connectionHub.invoke('SendMessage', args: args); //['Bob', 'Says hi!'] } - listen({Function(CallUser) onAcceptCall, Function(CallUser) onHangupCall, Function(String, CallUser) onDeclineCall, Function(String, CallUser) onOffer, Function(String) onCandidate}){ + listen({Function(CallUser) onAcceptCall, Function(CallUser) onHangupCall, Function(String, CallUser) onDeclineCall, Function(CallUser) onIncomingCall, Function(String, CallUser) onOffer, Function(String) onCandidate}){ connectionHub.on('OnIncomingCallAsync', (arguments) { print('OnIncomingCallAsync: ${arguments.toString()}'); + onIncomingCall(CallUser.from(arguments.last)); }); connectionHub.on('OnCallDeclinedAsync', (arguments) { @@ -121,13 +122,13 @@ class SignalRUtil { } // AnswerOfferAsync(string targetUserId, string CallerOffer) - Future answerOffer(RTCSessionDescription answerSdp, caller, receiver) async{ + Future answerOffer(RTCSessionDescription answerSdp) async{ final payload = { - 'target': receiver, - 'caller': caller, + 'target': destinationUser, + 'caller': sourceUser, 'sdp': answerSdp.toMap(), }; - return await connectionHub.invoke('AnswerOfferAsync', args: [caller, jsonEncode(payload)]); + return await connectionHub.invoke('AnswerOfferAsync', args: [sourceUser, jsonEncode(payload)]); } // HangUpAsync(string currentUserId, string targetUserId) @@ -138,7 +139,7 @@ class SignalRUtil { // CallAccepted(string currentUserId,string targetUserId) Future acceptCall(String from, to) async{ // return await connectionHub.send(methodName: 'CallAccepted', args: [from, to]); - return await connectionHub.invoke("CallAccepted", args: [ from, to]); + return await connectionHub.invoke("CallAccepted", args: [from, to]); } @@ -162,7 +163,7 @@ class CallUser{ CallUser.from(Map map){ Id = map['Id']; - UserName = map['UserName']; + UserName = map['UserName'] ?? map['userName']; Email = map['Email']; Phone = map['Phone']; Title = map['Title'];