Merge branch 'zik_webrtc_dev_v2.5' into 'development_v2.5'

WebRTC or OpenTok

See merge request Cloud_Solution/diplomatic-quarter!605
development_v2.5
haroon amjad 3 years ago
commit 721abb3156

@ -26,6 +26,7 @@ class IncomingCallData {
String isCall; String isCall;
String sound; String sound;
String server; String server;
String isWebRTC;
IncomingCallData( IncomingCallData(
{this.msgID, {this.msgID,
@ -80,6 +81,7 @@ class IncomingCallData {
isCall = json['is_call']; isCall = json['is_call'];
sound = json['sound']; sound = json['sound'];
server = json['server']; server = json['server'];
isWebRTC = json['isWebRTC'] ?? "false";
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@ -109,6 +111,7 @@ class IncomingCallData {
data['is_call'] = this.isCall; data['is_call'] = this.isCall;
data['sound'] = this.sound; data['sound'] = this.sound;
data['server'] = this.server; data['server'] = this.server;
data['isWebRTC'] = this.isWebRTC;
return data; return data;
} }
} }

@ -613,6 +613,7 @@ class _AppointmentDetailsState extends State<AppointmentDetails> with SingleTick
getToDoCount(); getToDoCount();
AppToast.showSuccessToast(message: res['ErrorEndUserMessage']); AppToast.showSuccessToast(message: res['ErrorEndUserMessage']);
Navigator.of(context).pop(); Navigator.of(context).pop();
projectViewModel.analytics.appointment.appointment_details_cancel(appointment: widget.appo);
} else { } else {
AppToast.showErrorToast(message: res['ErrorEndUserMessage']); AppToast.showErrorToast(message: res['ErrorEndUserMessage']);
} }

@ -34,6 +34,7 @@ import 'package:diplomaticquarterapp/uitl/push-notification-handler.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/bottom_navigation/bottom_nav_bar.dart'; import 'package:diplomaticquarterapp/widgets/bottom_navigation/bottom_nav_bar.dart';
import 'package:diplomaticquarterapp/widgets/buttons/floatingActionButton.dart'; import 'package:diplomaticquarterapp/widgets/buttons/floatingActionButton.dart';
import 'package:diplomaticquarterapp/widgets/dialogs/selection-dailog.dart';
import 'package:diplomaticquarterapp/widgets/drawer/app_drawer_widget.dart'; import 'package:diplomaticquarterapp/widgets/drawer/app_drawer_widget.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/others/not_auh_page.dart'; import 'package:diplomaticquarterapp/widgets/others/not_auh_page.dart';
@ -421,8 +422,8 @@ class _LandingPageState extends State<LandingPage> with WidgetsBindingObserver {
} }
login() async { login() async {
// dummyCall(); dummyCall();
// return; return;
var data = await sharedPref.getObject(IMEI_USER_DATA); var data = await sharedPref.getObject(IMEI_USER_DATA);
sharedPref.remove(REGISTER_DATA_FOR_LOGIIN); sharedPref.remove(REGISTER_DATA_FOR_LOGIIN);
@ -450,6 +451,13 @@ class _LandingPageState extends State<LandingPage> with WidgetsBindingObserver {
} }
dummyCall() async { dummyCall() async {
final server = await SelectionDialog(
context,
title: "Select Server",
items: ["https://livecareturn.hmg.com:8086", "https://104.197.179.1:8086"]
).show();
final json = { final json = {
"callerID": "s1", "callerID": "s1",
"PatientID": "s2", "PatientID": "s2",
@ -476,7 +484,7 @@ class _LandingPageState extends State<LandingPage> with WidgetsBindingObserver {
"videoUrl": "video", "videoUrl": "video",
"picture": "video", "picture": "video",
"is_call": "true", "is_call": "true",
"server": "192.168.8.104", "server": server,
}; };
IncomingCallData incomingCallData = IncomingCallData.fromJson(json); IncomingCallData incomingCallData = IncomingCallData.fromJson(json);

@ -238,17 +238,20 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
final caller = widget.incomingCallData.callerID; final caller = widget.incomingCallData.callerID;
final receiver = widget.incomingCallData.receiverID; final receiver = widget.incomingCallData.receiverID;
final host = widget.incomingCallData.server; final host = widget.incomingCallData.server;
// return StartVideoCall(caller: caller, receiver: receiver, iAmCaller: false, host: host,); if(widget.incomingCallData.isWebRTC == "true"){
return StartVideoCall(caller: caller, receiver: receiver, iAmCaller: false, host: host);
}else{
return OpenTokConnectCallPage(
apiKey: OPENTOK_API_KEY,
sessionId: widget.incomingCallData.sessionId,
token: widget.incomingCallData.token
);
}
// return VideoCallWebPage(receiverId: widget.incomingCallData.receiverID, callerId: widget.incomingCallData.callerID); // Web WebRTC VideoCall // return VideoCallWebPage(receiverId: widget.incomingCallData.receiverID, callerId: widget.incomingCallData.callerID); // Web WebRTC VideoCall
// return CallHomePage(receiverId: widget.incomingCallData.receiverID, callerId: widget.incomingCallData.callerID); // App WebRTC VideoCall // return CallHomePage(receiverId: widget.incomingCallData.receiverID, callerId: widget.incomingCallData.callerID); // App WebRTC VideoCall
return OpenTokConnectCallPage(
apiKey: OPENTOK_API_KEY,
sessionId: widget.incomingCallData.sessionId,
token: widget.incomingCallData.token
);
}, },
), ),
); );

@ -2,14 +2,14 @@ import 'dart:convert';
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
Future<Map> getTurnCredential(String host, int port) async { Future<Map> getTurnCredential(String host) async {
HttpClient client = HttpClient(context: SecurityContext()); HttpClient client = HttpClient(context: SecurityContext());
client.badCertificateCallback = client.badCertificateCallback =
(X509Certificate cert, String host, int port) { (X509Certificate cert, String host, int port) {
print('getTurnCredential: Allow self-signed certificate => $host:$port. '); print('getTurnCredential: Allow self-signed certificate => $host:$port. ');
return true; return true;
}; };
var url = 'https://$host:$port/api/turn?service=turn&username=flutter-webrtc'; var url = '$host/api/turn?service=turn&username=flutter-webrtc';
var request = await client.getUrl(Uri.parse(url)); var request = await client.getUrl(Uri.parse(url));
var response = await request.close(); var response = await request.close();
var responseBody = await response.transform(Utf8Decoder()).join(); var responseBody = await response.transform(Utf8Decoder()).join();

@ -51,7 +51,6 @@ class SocketUser{
class Signaling { class Signaling {
var _host; var _host;
var _port = 8086;
var _turnCredential; var _turnCredential;
SimpleWebSocket _socket; SimpleWebSocket _socket;
@ -248,11 +247,11 @@ class Signaling {
} }
Future<void> connect() async { Future<void> connect() async {
_socket = SimpleWebSocket('https://$_host:$_port/ws'); _socket = SimpleWebSocket('$_host/ws');
if (_turnCredential == null) { if (_turnCredential == null) {
try { try {
_turnCredential = await getTurnCredential(_host, _port); _turnCredential = await getTurnCredential(_host);
/* /*
{ {
"username": "1584195784:mbzrxpgjys", "username": "1584195784:mbzrxpgjys",
@ -404,7 +403,7 @@ class Signaling {
'to': session.remote_user?.id, 'to': session.remote_user?.id,
'from': session.local_user.id, 'from': session.local_user.id,
'candidate': { 'candidate': {
'sdpMLineIndex': candidate.sdpMLineIndex, 'sdpMLineIndex': candidate.sdpMlineIndex, // sdpMlineIndex or sdpMLineIndex
'sdpMid': candidate.sdpMid, 'sdpMid': candidate.sdpMid,
'candidate': candidate.candidate, 'candidate': candidate.candidate,
}, },

@ -3,6 +3,7 @@ import 'dart:async';
import 'package:diplomaticquarterapp/pages/conference/conference_button_bar.dart'; import 'package:diplomaticquarterapp/pages/conference/conference_button_bar.dart';
import 'package:diplomaticquarterapp/pages/conference/web_rtc/widgets/cam_view_widget.dart'; import 'package:diplomaticquarterapp/pages/conference/web_rtc/widgets/cam_view_widget.dart';
import 'package:diplomaticquarterapp/pages/videocall-webrtc-rnd/utils/device_info.dart'; import 'package:diplomaticquarterapp/pages/videocall-webrtc-rnd/utils/device_info.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'dart:core'; import 'dart:core';

@ -1,5 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:ffi';
import 'dart:io'; import 'dart:io';
import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/config.dart';
@ -9,6 +10,7 @@ import 'package:diplomaticquarterapp/models/LiveCare/IncomingCallData.dart';
import 'package:diplomaticquarterapp/pages/DrawerPages/notifications/notification_details_page.dart'; import 'package:diplomaticquarterapp/pages/DrawerPages/notifications/notification_details_page.dart';
import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; import 'package:diplomaticquarterapp/pages/landing/landing_page.dart';
import 'package:diplomaticquarterapp/pages/livecare/incoming_call.dart'; import 'package:diplomaticquarterapp/pages/livecare/incoming_call.dart';
import 'package:diplomaticquarterapp/pages/videocall-webrtc-rnd/webrtc/start_video_call.dart';
import 'package:diplomaticquarterapp/pages/webRTC/OpenTok/OpenTok.dart'; import 'package:diplomaticquarterapp/pages/webRTC/OpenTok/OpenTok.dart';
import 'package:diplomaticquarterapp/services/livecare_services/livecare_provider.dart'; import 'package:diplomaticquarterapp/services/livecare_services/livecare_provider.dart';
import 'package:diplomaticquarterapp/uitl/app-permissions.dart'; import 'package:diplomaticquarterapp/uitl/app-permissions.dart';
@ -86,8 +88,15 @@ RemoteMessage toFirebaseRemoteMessage(h_push.RemoteMessage message) {
return fire_message; return fire_message;
} }
callPage(String sessionID, String token) async { callPage(String sessionID, String token, String isWebrtc, String callerIdString) async {
await NavigationService.navigateToPage(OpenTokConnectCallPage(apiKey: OPENTOK_API_KEY, sessionId: sessionID, token: token)); if (isWebrtc == "true"){
String caller = callerIdString.split("*")[3];
String receiver = callerIdString.split("*")[4];
String host = callerIdString.split("*")[5];
return StartVideoCall(caller: caller, receiver: receiver, iAmCaller: false, host: host);
}else{
await NavigationService.navigateToPage(OpenTokConnectCallPage(apiKey: OPENTOK_API_KEY, sessionId: sessionID, token: token));
}
} }
_incomingCall(Map data) async { _incomingCall(Map data) async {
@ -192,6 +201,7 @@ class PushNotificationHandler {
String sessionID = callerId.split("*")[0]; String sessionID = callerId.split("*")[0];
String token = callerId.split("*")[1]; String token = callerId.split("*")[1];
String isWebRTC = callerId.split("*")[2];
print("🎈 SessionID: $sessionID"); print("🎈 SessionID: $sessionID");
print("🎈 Token: $token"); print("🎈 Token: $token");
@ -204,7 +214,7 @@ class PushNotificationHandler {
Future.delayed(new Duration(milliseconds: 2000)).then((value) async { Future.delayed(new Duration(milliseconds: 2000)).then((value) async {
print("🎈 Incoming Call!!!"); print("🎈 Incoming Call!!!");
callPage(sessionID, token); callPage(sessionID, token, isWebRTC, callerId);
}); });
// print("🎈 Identity: $identity"); // print("🎈 Identity: $identity");

@ -1,14 +1,22 @@
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class SelectionDialog<T> extends StatefulWidget{ class SelectionDialog<T> extends StatefulWidget{
final String title;
final List<T> items;
BuildContext context;
SelectionDialog(this.context,{@required this.title, @required this.items});
@override @override
State<StatefulWidget> createState() => SelectionDialogState(); State<StatefulWidget> createState() => SelectionDialogState();
String title;
List<T> items; Future<T> show() async{
show({@required String title, @required List<T> items}){ return showDialog<T>(context: context, builder: (ctx){
this.title = title; return this;
});
} }
} }
@ -16,11 +24,14 @@ class SelectionDialogState extends State<SelectionDialog>{
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return Scaffold(
backgroundColor: Colors.transparent,
body: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Container( Container(
margin: EdgeInsets.all(20),
decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(15)), decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(15)),
child: Column( child: Column(
children: [ children: [
@ -32,6 +43,7 @@ class SelectionDialogState extends State<SelectionDialog>{
Container(height: 0.5, color: Colors.grey,), Container(height: 0.5, color: Colors.grey,),
ListView.separated( ListView.separated(
shrinkWrap: true,
padding: EdgeInsets.all(10), padding: EdgeInsets.all(10),
itemCount: widget.items.length, itemCount: widget.items.length,
itemBuilder: (ctx,idx) => item(idx), itemBuilder: (ctx,idx) => item(idx),
@ -40,16 +52,20 @@ class SelectionDialogState extends State<SelectionDialog>{
), ),
) )
], ],
)
); );
} }
Widget item(int idx){ Widget item(int idx){
var model = widget.items[idx]; var model = widget.items[idx];
return Container( return InkWell(
padding: EdgeInsets.all(10), onTap: (){
height: 20, Navigator.pop(context, model);
color: Colors.blue, },
child: Text(model.toString()), child: Container(
padding: EdgeInsets.all(20),
child: Text(model.toString(), style: TextStyle(color: Colors.black)),
),
); );
} }

Loading…
Cancel
Save