Compare commits

...

2 Commits

Author SHA1 Message Date
Zohaib Iqbal Kambrani 7b5a699b69 no message 4 years ago
Zohaib Iqbal Kambrani d54b83358a no message 4 years ago

@ -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 // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.

@ -111,6 +111,8 @@ PODS:
- GoogleUtilities/UserDefaults (~> 7.6) - GoogleUtilities/UserDefaults (~> 7.6)
- nanopb (~> 2.30908.0) - nanopb (~> 2.30908.0)
- Flutter (1.0.0) - Flutter (1.0.0)
- flutter_app_icon_badge (0.0.1):
- Flutter
- flutter_hms_gms_availability (0.0.1): - flutter_hms_gms_availability (0.0.1):
- Flutter - Flutter
- flutter_inappwebview (0.0.1): - flutter_inappwebview (0.0.1):
@ -120,6 +122,8 @@ PODS:
- flutter_inappwebview/Core (0.0.1): - flutter_inappwebview/Core (0.0.1):
- Flutter - Flutter
- OrderedSet (~> 5.0) - OrderedSet (~> 5.0)
- flutter_ios_voip_kit (0.0.1):
- Flutter
- flutter_local_notifications (0.0.1): - flutter_local_notifications (0.0.1):
- Flutter - Flutter
- flutter_native_timezone (0.0.1): - flutter_native_timezone (0.0.1):
@ -229,6 +233,10 @@ PODS:
- Flutter - Flutter
- pay_ios (0.0.1): - pay_ios (0.0.1):
- Flutter - Flutter
- payfort_plugin (0.3.0):
- Flutter
- PayFortSDK
- PayFortSDK (3.1.0)
- "permission_handler (5.1.0+2)": - "permission_handler (5.1.0+2)":
- Flutter - Flutter
- PromisesObjC (2.0.0) - PromisesObjC (2.0.0)
@ -279,8 +287,10 @@ DEPENDENCIES:
- firebase_core (from `.symlinks/plugins/firebase_core/ios`) - firebase_core (from `.symlinks/plugins/firebase_core/ios`)
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
- Flutter (from `Flutter`) - 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_hms_gms_availability (from `.symlinks/plugins/flutter_hms_gms_availability/ios`)
- flutter_inappwebview (from `.symlinks/plugins/flutter_inappwebview/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_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
- flutter_native_timezone (from `.symlinks/plugins/flutter_native_timezone/ios`) - flutter_native_timezone (from `.symlinks/plugins/flutter_native_timezone/ios`)
- flutter_nfc_kit (from `.symlinks/plugins/flutter_nfc_kit/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`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`)
- pay_ios (from `.symlinks/plugins/pay_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`) - permission_handler (from `.symlinks/plugins/permission_handler/ios`)
- screen_brightness_ios (from `.symlinks/plugins/screen_brightness_ios/ios`) - screen_brightness_ios (from `.symlinks/plugins/screen_brightness_ios/ios`)
- searchable_dropdown (from `.symlinks/plugins/searchable_dropdown/ios`) - searchable_dropdown (from `.symlinks/plugins/searchable_dropdown/ios`)
@ -337,6 +348,7 @@ SPEC REPOS:
- nanopb - nanopb
- OpenTok - OpenTok
- OrderedSet - OrderedSet
- PayFortSDK
- PromisesObjC - PromisesObjC
- Reachability - Reachability
- SDWebImage - SDWebImage
@ -370,10 +382,14 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/firebase_messaging/ios" :path: ".symlinks/plugins/firebase_messaging/ios"
Flutter: Flutter:
:path: Flutter :path: Flutter
flutter_app_icon_badge:
:path: ".symlinks/plugins/flutter_app_icon_badge/ios"
flutter_hms_gms_availability: flutter_hms_gms_availability:
:path: ".symlinks/plugins/flutter_hms_gms_availability/ios" :path: ".symlinks/plugins/flutter_hms_gms_availability/ios"
flutter_inappwebview: flutter_inappwebview:
:path: ".symlinks/plugins/flutter_inappwebview/ios" :path: ".symlinks/plugins/flutter_inappwebview/ios"
flutter_ios_voip_kit:
:path: ".symlinks/plugins/flutter_ios_voip_kit/ios"
flutter_local_notifications: flutter_local_notifications:
:path: ".symlinks/plugins/flutter_local_notifications/ios" :path: ".symlinks/plugins/flutter_local_notifications/ios"
flutter_native_timezone: flutter_native_timezone:
@ -418,6 +434,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/path_provider_ios/ios" :path: ".symlinks/plugins/path_provider_ios/ios"
pay_ios: pay_ios:
:path: ".symlinks/plugins/pay_ios/ios" :path: ".symlinks/plugins/pay_ios/ios"
payfort_plugin:
:path: ".symlinks/plugins/payfort_plugin/ios"
permission_handler: permission_handler:
:path: ".symlinks/plugins/permission_handler/ios" :path: ".symlinks/plugins/permission_handler/ios"
screen_brightness_ios: screen_brightness_ios:
@ -463,8 +481,10 @@ SPEC CHECKSUMS:
FirebaseInstallations: 830327b45345ffc859eaa9c17bcd5ae893fd5425 FirebaseInstallations: 830327b45345ffc859eaa9c17bcd5ae893fd5425
FirebaseMessaging: 82c4a48638f53f7b184f3cc9f6cd2cbe533ab316 FirebaseMessaging: 82c4a48638f53f7b184f3cc9f6cd2cbe533ab316
Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a
flutter_app_icon_badge: 844847adbd7a1c6f325d6b41b942428981b839cc
flutter_hms_gms_availability: babc50b18670e99780270bc18d9b17d0a07cd77e flutter_hms_gms_availability: babc50b18670e99780270bc18d9b17d0a07cd77e
flutter_inappwebview: bfd58618f49dc62f2676de690fc6dcda1d6c3721 flutter_inappwebview: bfd58618f49dc62f2676de690fc6dcda1d6c3721
flutter_ios_voip_kit: a3b4c5bd0cfda5069b5605a6d1dc60ecf99c6299
flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743
flutter_native_timezone: 5f05b2de06c9776b4cc70e1839f03de178394d22 flutter_native_timezone: 5f05b2de06c9776b4cc70e1839f03de178394d22
flutter_nfc_kit: 965c98c3fa68f5609f1cc89abb968fe1b8ffdbaa flutter_nfc_kit: 965c98c3fa68f5609f1cc89abb968fe1b8ffdbaa
@ -497,6 +517,8 @@ SPEC CHECKSUMS:
package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e
path_provider_ios: 7d7ce634493af4477d156294792024ec3485acd5 path_provider_ios: 7d7ce634493af4477d156294792024ec3485acd5
pay_ios: 8c7beb9c61d885f3f51b61f75f8793023fc8843a pay_ios: 8c7beb9c61d885f3f51b61f75f8793023fc8843a
payfort_plugin: 6216a51564e4987204cd36947a6adccf49db3536
PayFortSDK: a33a8488859d7666b3709f347ebb990697e1d110
permission_handler: ccb20a9fad0ee9b1314a52b70b76b473c5f8dab0 permission_handler: ccb20a9fad0ee9b1314a52b70b76b473c5f8dab0
PromisesObjC: 68159ce6952d93e17b2dfe273b8c40907db5ba58 PromisesObjC: 68159ce6952d93e17b2dfe273b8c40907db5ba58
Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96

@ -399,7 +399,7 @@ var UPDATE_COVID_QUESTIONNAIRE = 'Services/Doctors.svc/REST/COVID19_Questionnar
var CHANNEL = 3; var CHANNEL = 3;
var GENERAL_ID = 'Cs2020@2016\$2958'; var GENERAL_ID = 'Cs2020@2016\$2958';
var IP_ADDRESS = '10.20.10.20'; var IP_ADDRESS = '10.20.10.20';
var VERSION_ID = 8.3; var VERSION_ID = 8.6;
var SETUP_ID = '91877'; var SETUP_ID = '91877';
var LANGUAGE = 2; var LANGUAGE = 2;
var PATIENT_OUT_SA = 0; var PATIENT_OUT_SA = 0;

@ -1,5 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:async'; import 'dart:async';
import 'package:diplomaticquarterapp/uitl/SignalRUtil.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter_webrtc/flutter_webrtc.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart';
@ -50,6 +51,8 @@ class SocketUser{
} }
class Signaling { class Signaling {
SignalRUtil signalrUtil;
var connectToSignalR = true;
var _host; var _host;
var _turnCredential; var _turnCredential;
@ -76,15 +79,14 @@ class Signaling {
Map<String, dynamic> _iceServers = { Map<String, dynamic> _iceServers = {
'iceServers': [ 'iceServers': [
{'url': 'stun:stun.l.google.com:19302'}, // {'url': 'stun:stun.l.google.com:19302'},
/* // {'url': 'stun:15.185.116.59:3478'},
* turn server configuration example. // {'url': 'stun:34.135.78.17:19302'},
{ {
'url': 'turn:123.45.67.89:3478', 'url': "turn:34.135.78.17:19302?transport=udp",
'username': 'change_to_real_user', 'username': "1659428372:flutter-webrtc",
'credential': 'change_to_real_secret' 'credential': "/fPfuS6Nf6hpl5LypJniRoAx9CI"
}, },
*/
] ]
}; };
@ -247,28 +249,105 @@ class Signaling {
} }
Future<void> connect() async { Future<void> connect() async {
if(connectToSignalR){
final hub = "https://VCallApi.hmg.com/WebRTCHub?source=web&username=zik";
signalrUtil = SignalRUtil(hubName: hub);
signalrUtil.setContributors(caller: "zik", receiver: "s1");
final connected = await signalrUtil.openConnection();
if(connected){
signalrUtil.callUser("zik", "s1");
signalrUtil.listen(
onIncomingCall: (user) async{
await Future.delayed(Duration(seconds: 1));
signalrUtil.acceptCall("zik", "s1");
},
onAcceptCall: (user){
_initPeerConnection(session, media: "video", screenSharing: false);
},
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);
},
onAnswer: (answer_str) async{
final answer = jsonDecode(answer_str);
await session.pc?.setRemoteDescription(RTCSessionDescription(answer['sdp'], answer['type']));
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'); _socket = SimpleWebSocket('$_host/ws');
if (_turnCredential == null) { if (_turnCredential == null) {
try { try {
_turnCredential = await getTurnCredential(_host); // _turnCredential = await getTurnCredential(_host);
/* // /*
{ // {
"username": "1584195784:mbzrxpgjys", // "username": "1584195784:mbzrxpgjys",
"password": "isyl6FF6nqMTB9/ig5MrMRUXqZg", // "password": "isyl6FF6nqMTB9/ig5MrMRUXqZg",
"ttl": 86400, // "ttl": 86400,
"uris": ["turn:127.0.0.1:19302?transport=udp"] // "uris": ["turn:127.0.0.1:19302?transport=udp"]
} // }
*/ // */
_iceServers = { // _iceServers = {
'iceServers': [ // 'iceServers': [
{ // {
'urls': _turnCredential['uris'][0], // 'urls': _turnCredential['uris'][0],
'username': _turnCredential['username'], // 'username': _turnCredential['username'],
'credential': _turnCredential['password'] // 'credential': _turnCredential['password']
}, // },
] // ]
}; // };
} catch (e) {} } catch (e) {}
} }
@ -323,6 +402,7 @@ class Signaling {
..._iceServers, ..._iceServers,
...{'sdpSemantics': sdpSemantics} ...{'sdpSemantics': sdpSemantics}
}, _config); }, _config);
if (media != 'data') { if (media != 'data') {
switch (sdpSemantics) { switch (sdpSemantics) {
case 'plan-b': case 'plan-b':
@ -389,11 +469,28 @@ class Signaling {
sender.setParameters(parameters); sender.setParameters(parameters);
*/ */
} }
pc.onRenegotiationNeeded = (){
offer("video", false);
};
pc.onIceCandidate = (candidate) async { pc.onIceCandidate = (candidate) async {
if (candidate == null) { if (candidate == null) {
print('onIceCandidate: complete!'); print('onIceCandidate: complete!');
return; 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 // 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 // before skipping to the next one. 1 second is just an heuristic value
// and should be thoroughly tested in your own environment. // and should be thoroughly tested in your own environment.
@ -447,9 +544,16 @@ class Signaling {
Future<void> _createOffer(SessionOneToOne session, String media) async { Future<void> _createOffer(SessionOneToOne session, String media) async {
try { try {
RTCSessionDescription s = RTCSessionDescription s =
await session.pc .createOffer(media == 'data' ? _dcConstraints : {}); await session.pc.createOffer(media == 'data' ? _dcConstraints : {});
await session.pc .setLocalDescription(s); await session.pc .setLocalDescription(s);
if(connectToSignalR){
final offer = jsonEncode(s.toMap());
signalrUtil.offer(signalrUtil.sourceUser, signalrUtil.destinationUser, offer);
return;
}
_send('offer', { _send('offer', {
'to': session.remote_user?.id, 'to': session.remote_user?.id,
'from': session.local_user.id, 'from': session.local_user.id,
@ -464,9 +568,14 @@ class Signaling {
Future<void> _createAnswer(SessionOneToOne session, String media) async { Future<void> _createAnswer(SessionOneToOne session, String media) async {
try { try {
RTCSessionDescription s = RTCSessionDescription s = await session.pc.createAnswer(media == 'data' ? _dcConstraints : {});
await session.pc .createAnswer(media == 'data' ? _dcConstraints : {});
await session.pc .setLocalDescription(s); await session.pc .setLocalDescription(s);
if(connectToSignalR){
signalrUtil.answerOffer(s);
return;
}
_send('answer', { _send('answer', {
'to': session.remote_user?.id, 'to': session.remote_user?.id,
'from': session.local_user.id, 'from': session.local_user.id,
@ -487,6 +596,7 @@ class Signaling {
Future<void> finishSessions() async { Future<void> finishSessions() async {
_closeSessionById(session.id); _closeSessionById(session.id);
signalrUtil?.closeConnection();
} }
void _closeSessionById(String sessionId) { void _closeSessionById(String sessionId) {

@ -197,7 +197,7 @@ class Signaling {
print(e); print(e);
}); });
}).then((answer) { }).then((answer) {
return signalR.answerOffer(answer, caller, receiver).catchError((e){ return signalR.answerOffer(answer).catchError((e){
print(e); print(e);
}); });
}).catchError((e) { }).catchError((e) {

@ -62,10 +62,11 @@ class SignalRUtil {
await connectionHub.invoke('SendMessage', args: args); //['Bob', 'Says hi!'] 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) onAnswer, Function(String) onCandidate}){
connectionHub.on('OnIncomingCallAsync', (arguments) { connectionHub.on('OnIncomingCallAsync', (arguments) {
print('OnIncomingCallAsync: ${arguments.toString()}'); print('OnIncomingCallAsync: ${arguments.toString()}');
onIncomingCall(CallUser.from(arguments.last));
}); });
connectionHub.on('OnCallDeclinedAsync', (arguments) { connectionHub.on('OnCallDeclinedAsync', (arguments) {
@ -92,6 +93,11 @@ class SignalRUtil {
onOffer(arguments.first, CallUser.from(arguments.last)); onOffer(arguments.first, CallUser.from(arguments.last));
}); });
connectionHub.on('OnAnswerOffer', (arguments) {
print('OnAnswerOffer: ${arguments.toString()}');
onAnswer(arguments.first);
});
} }
// CallUserAsync(string currentUserId, string targerUserId) // CallUserAsync(string currentUserId, string targerUserId)
@ -121,13 +127,13 @@ class SignalRUtil {
} }
// AnswerOfferAsync(string targetUserId, string CallerOffer) // AnswerOfferAsync(string targetUserId, string CallerOffer)
Future<dynamic> answerOffer(RTCSessionDescription answerSdp, caller, receiver) async{ Future<dynamic> answerOffer(RTCSessionDescription answerSdp) async{
final payload = { final payload = {
'target': receiver, 'target': destinationUser,
'caller': caller, 'caller': sourceUser,
'sdp': answerSdp.toMap(), '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) // HangUpAsync(string currentUserId, string targetUserId)
@ -138,7 +144,7 @@ class SignalRUtil {
// CallAccepted(string currentUserId,string targetUserId) // CallAccepted(string currentUserId,string targetUserId)
Future<dynamic> acceptCall(String from, to) async{ Future<dynamic> acceptCall(String from, to) async{
// return await connectionHub.send(methodName: 'CallAccepted', args: [from, to]); // 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 +168,7 @@ class CallUser{
CallUser.from(Map map){ CallUser.from(Map map){
Id = map['Id']; Id = map['Id'];
UserName = map['UserName']; UserName = map['UserName'] ?? map['userName'];
Email = map['Email']; Email = map['Email'];
Phone = map['Phone']; Phone = map['Phone'];
Title = map['Title']; Title = map['Title'];

Loading…
Cancel
Save