diff --git a/lib/models/LiveCare/IncomingCallData.dart b/lib/models/LiveCare/IncomingCallData.dart index 507bcc85..1ee149a3 100644 --- a/lib/models/LiveCare/IncomingCallData.dart +++ b/lib/models/LiveCare/IncomingCallData.dart @@ -26,6 +26,7 @@ class IncomingCallData { String isCall; String sound; String server; + String isWebRTC; IncomingCallData( {this.msgID, @@ -80,6 +81,7 @@ class IncomingCallData { isCall = json['is_call']; sound = json['sound']; server = json['server']; + isWebRTC = json['isWebRTC'] ?? "false"; } Map toJson() { @@ -109,6 +111,7 @@ class IncomingCallData { data['is_call'] = this.isCall; data['sound'] = this.sound; data['server'] = this.server; + data['isWebRTC'] = this.isWebRTC; return data; } } diff --git a/lib/pages/MyAppointments/AppointmentDetails.dart b/lib/pages/MyAppointments/AppointmentDetails.dart index 25bb4b6f..8726ac31 100644 --- a/lib/pages/MyAppointments/AppointmentDetails.dart +++ b/lib/pages/MyAppointments/AppointmentDetails.dart @@ -613,6 +613,7 @@ class _AppointmentDetailsState extends State with SingleTick getToDoCount(); AppToast.showSuccessToast(message: res['ErrorEndUserMessage']); Navigator.of(context).pop(); + projectViewModel.analytics.appointment.appointment_details_cancel(appointment: widget.appo); } else { AppToast.showErrorToast(message: res['ErrorEndUserMessage']); } diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index 834bf465..51ed948c 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -34,6 +34,7 @@ import 'package:diplomaticquarterapp/uitl/push-notification-handler.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/bottom_navigation/bottom_nav_bar.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/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/not_auh_page.dart'; @@ -421,8 +422,8 @@ class _LandingPageState extends State with WidgetsBindingObserver { } login() async { - // dummyCall(); - // return; + dummyCall(); + return; var data = await sharedPref.getObject(IMEI_USER_DATA); sharedPref.remove(REGISTER_DATA_FOR_LOGIIN); @@ -450,6 +451,13 @@ class _LandingPageState extends State with WidgetsBindingObserver { } 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 = { "callerID": "s1", "PatientID": "s2", @@ -476,7 +484,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { "videoUrl": "video", "picture": "video", "is_call": "true", - "server": "192.168.8.104", + "server": server, }; IncomingCallData incomingCallData = IncomingCallData.fromJson(json); diff --git a/lib/pages/livecare/incoming_call.dart b/lib/pages/livecare/incoming_call.dart index 1e5947e5..907d6b23 100644 --- a/lib/pages/livecare/incoming_call.dart +++ b/lib/pages/livecare/incoming_call.dart @@ -238,17 +238,20 @@ class _IncomingCallState extends State with SingleTickerProviderSt final caller = widget.incomingCallData.callerID; final receiver = widget.incomingCallData.receiverID; 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 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 - ); }, ), ); diff --git a/lib/pages/videocall-webrtc-rnd/utils/turn.dart b/lib/pages/videocall-webrtc-rnd/utils/turn.dart index 0d4a00f9..f91fef80 100644 --- a/lib/pages/videocall-webrtc-rnd/utils/turn.dart +++ b/lib/pages/videocall-webrtc-rnd/utils/turn.dart @@ -2,14 +2,14 @@ import 'dart:convert'; import 'dart:async'; import 'dart:io'; -Future getTurnCredential(String host, int port) async { +Future getTurnCredential(String host) async { HttpClient client = HttpClient(context: SecurityContext()); client.badCertificateCallback = (X509Certificate cert, String host, int port) { print('getTurnCredential: Allow self-signed certificate => $host:$port. '); 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 response = await request.close(); var responseBody = await response.transform(Utf8Decoder()).join(); diff --git a/lib/pages/videocall-webrtc-rnd/webrtc/signaling.dart b/lib/pages/videocall-webrtc-rnd/webrtc/signaling.dart index 4ca87644..4458604a 100644 --- a/lib/pages/videocall-webrtc-rnd/webrtc/signaling.dart +++ b/lib/pages/videocall-webrtc-rnd/webrtc/signaling.dart @@ -51,7 +51,6 @@ class SocketUser{ class Signaling { var _host; - var _port = 8086; var _turnCredential; SimpleWebSocket _socket; @@ -248,11 +247,11 @@ class Signaling { } Future connect() async { - _socket = SimpleWebSocket('https://$_host:$_port/ws'); + _socket = SimpleWebSocket('$_host/ws'); if (_turnCredential == null) { try { - _turnCredential = await getTurnCredential(_host, _port); + _turnCredential = await getTurnCredential(_host); /* { "username": "1584195784:mbzrxpgjys", @@ -404,7 +403,7 @@ class Signaling { 'to': session.remote_user?.id, 'from': session.local_user.id, 'candidate': { - 'sdpMLineIndex': candidate.sdpMLineIndex, + 'sdpMLineIndex': candidate.sdpMlineIndex, // sdpMlineIndex or sdpMLineIndex 'sdpMid': candidate.sdpMid, 'candidate': candidate.candidate, }, diff --git a/lib/pages/videocall-webrtc-rnd/webrtc/start_video_call.dart b/lib/pages/videocall-webrtc-rnd/webrtc/start_video_call.dart index ea3bbcb0..b1d89f66 100644 --- a/lib/pages/videocall-webrtc-rnd/webrtc/start_video_call.dart +++ b/lib/pages/videocall-webrtc-rnd/webrtc/start_video_call.dart @@ -3,6 +3,7 @@ import 'dart:async'; 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/videocall-webrtc-rnd/utils/device_info.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'dart:core'; diff --git a/lib/uitl/push-notification-handler.dart b/lib/uitl/push-notification-handler.dart index a8b06051..f46ba2a6 100644 --- a/lib/uitl/push-notification-handler.dart +++ b/lib/uitl/push-notification-handler.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:convert'; +import 'dart:ffi'; import 'dart:io'; 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/landing/landing_page.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/services/livecare_services/livecare_provider.dart'; import 'package:diplomaticquarterapp/uitl/app-permissions.dart'; @@ -86,8 +88,15 @@ RemoteMessage toFirebaseRemoteMessage(h_push.RemoteMessage message) { return fire_message; } -callPage(String sessionID, String token) async { - await NavigationService.navigateToPage(OpenTokConnectCallPage(apiKey: OPENTOK_API_KEY, sessionId: sessionID, token: token)); +callPage(String sessionID, String token, String isWebrtc, String callerIdString) async { + 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 { @@ -192,6 +201,7 @@ class PushNotificationHandler { String sessionID = callerId.split("*")[0]; String token = callerId.split("*")[1]; + String isWebRTC = callerId.split("*")[2]; print("🎈 SessionID: $sessionID"); print("🎈 Token: $token"); @@ -204,7 +214,7 @@ class PushNotificationHandler { Future.delayed(new Duration(milliseconds: 2000)).then((value) async { print("🎈 Incoming Call!!!"); - callPage(sessionID, token); + callPage(sessionID, token, isWebRTC, callerId); }); // print("🎈 Identity: $identity"); diff --git a/lib/widgets/dialogs/selection-dailog.dart b/lib/widgets/dialogs/selection-dailog.dart index a1f4c66d..f3dfe083 100644 --- a/lib/widgets/dialogs/selection-dailog.dart +++ b/lib/widgets/dialogs/selection-dailog.dart @@ -1,14 +1,22 @@ +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class SelectionDialog extends StatefulWidget{ + final String title; + final List items; + BuildContext context; + + SelectionDialog(this.context,{@required this.title, @required this.items}); + @override State createState() => SelectionDialogState(); - String title; - List items; - show({@required String title, @required List items}){ - this.title = title; + + Future show() async{ + return showDialog(context: context, builder: (ctx){ + return this; + }); } } @@ -16,11 +24,14 @@ class SelectionDialogState extends State{ @override Widget build(BuildContext context) { - return Column( + return Scaffold( + backgroundColor: Colors.transparent, + body: Column( crossAxisAlignment: CrossAxisAlignment.stretch, mainAxisAlignment: MainAxisAlignment.center, children: [ Container( + margin: EdgeInsets.all(20), decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(15)), child: Column( children: [ @@ -32,6 +43,7 @@ class SelectionDialogState extends State{ Container(height: 0.5, color: Colors.grey,), ListView.separated( + shrinkWrap: true, padding: EdgeInsets.all(10), itemCount: widget.items.length, itemBuilder: (ctx,idx) => item(idx), @@ -40,16 +52,20 @@ class SelectionDialogState extends State{ ), ) ], + ) ); } Widget item(int idx){ var model = widget.items[idx]; - return Container( - padding: EdgeInsets.all(10), - height: 20, - color: Colors.blue, - child: Text(model.toString()), + return InkWell( + onTap: (){ + Navigator.pop(context, model); + }, + child: Container( + padding: EdgeInsets.all(20), + child: Text(model.toString(), style: TextStyle(color: Colors.black)), + ), ); }