Compare commits

...

4 Commits

Author SHA1 Message Date
Aamir Muhammad 00abbd8630 WebRtc Event Changes 3 years ago
Aamir Muhammad 65c380997e WebRtc Event Changes 3 years ago
Zohaib Iqbal Kambrani 691ee4ccbf Updated Events 3 years ago
Zohaib Iqbal Kambrani cf8951f66a no message 3 years ago

@ -34,7 +34,7 @@ configurations.all {
} }
android { android {
compileSdkVersion 31 compileSdkVersion 33
sourceSets { sourceSets {
main.java.srcDirs += 'src/main/kotlin' main.java.srcDirs += 'src/main/kotlin'

@ -90,7 +90,7 @@
</intent-filter> </intent-filter>
</activity> </activity>
<receiver android:exported="true" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver"> <receiver android:exported="true" tools:replace="android:exported" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.MY_PACKAGE_REPLACED"/> <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>

@ -20,8 +20,8 @@ var PACKAGES_ORDERS = '/api/orders';
var PACKAGES_ORDER_HISTORY = '/api/orders/items'; var PACKAGES_ORDER_HISTORY = '/api/orders/items';
var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara'; var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara';
// var BASE_URL = 'http://10.50.100.198:3334/'; // var BASE_URL = 'http://10.50.100.198:3334/';
// var BASE_URL = 'https://uat.hmgwebservices.com/'; var BASE_URL = 'https://uat.hmgwebservices.com/';
var BASE_URL = 'https://hmgwebservices.com/'; // var BASE_URL = 'https://hmgwebservices.com/';
// Pharmacy UAT URLs // Pharmacy UAT URLs
// var BASE_PHARMACY_URL = 'https://uat.hmgwebservices.com/epharmacy/api/'; // var BASE_PHARMACY_URL = 'https://uat.hmgwebservices.com/epharmacy/api/';

@ -81,7 +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"; isWebRTC = json['is_webrtc'] ?? "true";
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@ -111,7 +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; data['is_webrtc'] = this.isWebRTC;
return data; return data;
} }
} }

@ -73,7 +73,6 @@ class LandingPage extends StatefulWidget {
class _LandingPageState extends State<LandingPage> with WidgetsBindingObserver { class _LandingPageState extends State<LandingPage> with WidgetsBindingObserver {
var authProvider = new AuthProvider(); var authProvider = new AuthProvider();
int currentTab = 0; int currentTab = 0;
PageController pageController; PageController pageController;
ProjectViewModel projectViewModel; ProjectViewModel projectViewModel;
@ -123,7 +122,7 @@ class _LandingPageState extends State<LandingPage> with WidgetsBindingObserver {
"DoctorImageURL": "https://image.shutterstock.com/image-vector/sample-stamp-square-grunge-sign-260nw-1474408826.jpg", "DoctorImageURL": "https://image.shutterstock.com/image-vector/sample-stamp-square-grunge-sign-260nw-1474408826.jpg",
"callerID": "9920", "callerID": "9920",
"PatientID": "1231755", "PatientID": "1231755",
"is_call": "true" "is_call": "true",
}; };
void _requestIOSPermissions() { void _requestIOSPermissions() {
@ -451,16 +450,15 @@ class _LandingPageState extends State<LandingPage> with WidgetsBindingObserver {
} }
dummyCall() async { dummyCall() async {
// final server = await SelectionDialog(
final server = await SelectionDialog( // context,
context, // title: "Select Server",
title: "Select Server", // items: ["https://livecareturn.hmg.com:8086", "https://104.197.179.1:8086"]
items: ["https://livecareturn.hmg.com:8086", "https://104.197.179.1:8086"] // ).show();
).show();
final json = { final json = {
"callerID": "s1", "callerID": "9920",
"PatientID": "s2", "PatientID": "1231755",
"msgID": "123", "msgID": "123",
"notfID": "123", "notfID": "123",
"notification_foreground": "true", "notification_foreground": "true",
@ -484,7 +482,9 @@ class _LandingPageState extends State<LandingPage> with WidgetsBindingObserver {
"videoUrl": "video", "videoUrl": "video",
"picture": "video", "picture": "video",
"is_call": "true", "is_call": "true",
"server": server, "is_webrtc": "true",
// "server": "https://192.168.8.163:8086",
"server": "https://livecareturn.hmg.com:8086",
}; };
IncomingCallData incomingCallData = IncomingCallData.fromJson(json); IncomingCallData incomingCallData = IncomingCallData.fromJson(json);
@ -618,6 +618,7 @@ class _LandingPageState extends State<LandingPage> with WidgetsBindingObserver {
changeCurrentTab(1); changeCurrentTab(1);
}, },
onLoginClick: () { onLoginClick: () {
login(); login();
}, },
onMedicalFileClick: () { onMedicalFileClick: () {

@ -4,10 +4,11 @@ import 'package:camera/camera.dart';
import 'package:diplomaticquarterapp/models/LiveCare/IncomingCallData.dart'; import 'package:diplomaticquarterapp/models/LiveCare/IncomingCallData.dart';
import 'package:diplomaticquarterapp/pages/conference/widgets/platform_exception_alert_dialog.dart'; import 'package:diplomaticquarterapp/pages/conference/widgets/platform_exception_alert_dialog.dart';
import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; import 'package:diplomaticquarterapp/pages/landing/landing_page.dart';
import 'package:diplomaticquarterapp/pages/videocall-webrtc-rnd/webrtc/signaling.dart';
import 'package:diplomaticquarterapp/pages/videocall-webrtc-rnd/webrtc/start_video_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/pages/webRTC/signaling.dart';
import 'package:diplomaticquarterapp/services/livecare_services/livecare_provider.dart'; import 'package:diplomaticquarterapp/services/livecare_services/livecare_provider.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.dart'; import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
@ -15,7 +16,7 @@ import 'package:flutter/material.dart';
import 'package:just_audio/just_audio.dart'; import 'package:just_audio/just_audio.dart';
import '../../config/config.dart'; import '../../config/config.dart';
import '../videocall-webrtc-rnd/utils/device_info.dart';
class IncomingCall extends StatefulWidget { class IncomingCall extends StatefulWidget {
IncomingCallData incomingCallData; IncomingCallData incomingCallData;
@ -34,14 +35,17 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
CameraController _controller; CameraController _controller;
Future<void> _initializeControllerFuture; Future<void> _initializeControllerFuture;
bool isCameraReady = false; bool isCameraReady = false;
Signaling signaling = Signaling()..init();
Signaling _signaling;
SessionOneToOne _session;
@override @override
void initState() { void initState() {
_animationController = AnimationController(vsync: this, duration: Duration(milliseconds: 500)); _animationController = AnimationController(vsync: this, duration: Duration(milliseconds: 500));
isCameraReady = false; //_runAnimation();
connectSignaling();
WidgetsBinding.instance.addPostFrameCallback((_) =>_runAnimation());
WidgetsBinding.instance.addPostFrameCallback((_) => _runAnimation());
super.initState(); super.initState();
} }
@ -51,6 +55,9 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
player.stop(); player.stop();
_controller.dispose(); _controller.dispose();
disposeAudioResources(); disposeAudioResources();
// _signaling.close();
super.dispose(); super.dispose();
} }
@ -203,21 +210,15 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
} }
void _runAnimation() async { void _runAnimation() async {
final cameras = await availableCameras(); final cameras = await availableCameras();
final firstCamera = cameras[1]; final firstCamera = cameras[1];
_controller = CameraController( _controller = CameraController(
// Get a specific camera from the list of available cameras.
firstCamera, firstCamera,
// Define the resolution to use.
ResolutionPreset.medium, ResolutionPreset.medium,
); );
_initializeControllerFuture = _controller.initialize(); _initializeControllerFuture = _controller.initialize();
setState(() {});
setState(() {
isCameraReady = true;
});
setAudioFile(); setAudioFile();
for (int i = 0; i < 100; i++) { for (int i = 0; i < 100; i++) {
await _animationController.forward(); await _animationController.forward();
@ -231,30 +232,28 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
// final roomModel = RoomModel(name: widget.incomingCallData.name, token: widget.incomingCallData.sessionId, identity: widget.incomingCallData.identity); // final roomModel = RoomModel(name: widget.incomingCallData.name, token: widget.incomingCallData.sessionId, identity: widget.incomingCallData.identity);
await _controller.dispose(); await _controller.dispose();
changeCallStatusAPI(4); changeCallStatusAPI(4);
await Navigator.of(context).pushReplacement(
MaterialPageRoute(
// fullscreenDialog: true,
builder: (BuildContext context) {
final caller = widget.incomingCallData.callerID;
final receiver = widget.incomingCallData.receiverID;
final host = widget.incomingCallData.server;
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 if (_session != null && _signaling != null) {
await Navigator.of(context).pushReplacement(
MaterialPageRoute(
// fullscreenDialog: true,
builder: (BuildContext context) {
if (widget.incomingCallData.isWebRTC == "true") {
return StartVideoCall(signaling: _signaling, session: _session);
} else {
return OpenTokConnectCallPage(apiKey: OPENTOK_API_KEY, sessionId: widget.incomingCallData.sessionId, token: widget.incomingCallData.token);
}
// return CallHomePage(receiverId: widget.incomingCallData.receiverID, callerId: widget.incomingCallData.callerID); // App 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
), },
); ),
);
} else {
// Invalid Params/Data
AppToast.showErrorToast(message: "Failed to establish connection with server");
}
} catch (err) { } catch (err) {
print(err); print(err);
await PlatformExceptionAlertDialog( await PlatformExceptionAlertDialog(
@ -265,8 +264,7 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
void changeCallStatusAPI(int sessionStatus) { void changeCallStatusAPI(int sessionStatus) {
LiveCareService service = new LiveCareService(); LiveCareService service = new LiveCareService();
service.endCallAPI(widget.incomingCallData.sessionId, sessionStatus, context).then((res) { service.endCallAPI(widget.incomingCallData.sessionId, sessionStatus, context).then((res) {}).catchError((err) {
}).catchError((err) {
print(err); print(err);
}); });
} }
@ -274,8 +272,11 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
void backToHome() async { void backToHome() async {
// final connected = await signaling.declineCall(widget.incomingCallData.callerID, widget.incomingCallData.receiverID); // final connected = await signaling.declineCall(widget.incomingCallData.callerID, widget.incomingCallData.receiverID);
LandingPage.isOpenCallPage = false; LandingPage.isOpenCallPage = false;
// _signaling
player.stop(); player.stop();
changeCallStatusAPI(3); changeCallStatusAPI(3);
_signaling.bye(_session, callRejected: true);
_signaling.callDisconnected(_session, callRejected: true);
Navigator.of(context).pop(); Navigator.of(context).pop();
} }
@ -297,4 +298,29 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
print("Error: $e"); print("Error: $e");
} }
} }
connectSignaling({@required bool iAmCaller = false}) async {
print("----------------- + Signaling Connection Started ---------------------------");
final caller = widget.incomingCallData.callerID;
final receiver = widget.incomingCallData.receiverID;
final host = widget.incomingCallData.server;
final selfRole = iAmCaller ? "Caller" : "Receiver";
final selfId = iAmCaller ? caller : receiver;
final selfUser = SocketUser(id: selfId, name: "$selfRole-$selfId", userAgent: DeviceInfo.userAgent, moreInfo: {});
final remoteRole = !iAmCaller ? "Caller" : "Receiver";
final remoteId = !iAmCaller ? caller : receiver;
final remoteUser = SocketUser(id: remoteId, name: "$remoteRole-$remoteId", userAgent: DeviceInfo.userAgent, moreInfo: {});
final sessionId = "$caller-$receiver";
_session = SessionOneToOne(id: sessionId, local_user: selfUser, remote_user: remoteUser);
_signaling = Signaling(host, session: _session);
await _signaling.connect();
if (_signaling.state == SignalingState.Open) {
return;
}
}
} }

@ -8,7 +8,7 @@ import '../utils/turn.dart' if (dart.library.js) '../utils/turn_web.dart';
enum SignalingState { Open, Closed, Error } enum SignalingState { Open, Closed, Error }
enum CallState { Calling, Ringing, Invite, Connected, Bye } enum CallState {Bye}
const JsonEncoder _encoder = JsonEncoder(); const JsonEncoder _encoder = JsonEncoder();
@ -50,6 +50,8 @@ class SocketUser{
} }
class Signaling { class Signaling {
SignalingState state;
var _host; var _host;
var _turnCredential; var _turnCredential;
@ -68,7 +70,8 @@ class Signaling {
Function(SessionOneToOne session, MediaStream stream) onRemoveRemoteStream; Function(SessionOneToOne session, MediaStream stream) onRemoveRemoteStream;
Function(dynamic event) onPeersUpdate; Function(dynamic event) onPeersUpdate;
Function(dynamic event) onConnected; Function(dynamic event) onConnected;
Function(dynamic event) onRemoteConnected; Function(dynamic event) onCallAccepted;
Function(dynamic event) onCallRejected;
Function(SessionOneToOne session, RTCDataChannel dc, RTCDataChannelMessage data) onDataChannelMessage; Function(SessionOneToOne session, RTCDataChannel dc, RTCDataChannelMessage data) onDataChannelMessage;
Function(SessionOneToOne session, RTCDataChannel dc) onDataChannel; Function(SessionOneToOne session, RTCDataChannel dc) onDataChannel;
@ -105,7 +108,7 @@ class Signaling {
close() async { close() async {
await finishSessions(); finishSessions();
_socket?.close(); _socket?.close();
} }
@ -129,6 +132,12 @@ class Signaling {
'from': session.local_user.id, 'from': session.local_user.id,
'session_id': session.id, 'session_id': session.id,
}); });
_send('patient_call_accepted', {
'to': session.remote_user?.id,
'from': session.local_user.id,
'session_id': session.id,
});
} }
void offer(String media, bool useScreen) async { void offer(String media, bool useScreen) async {
@ -139,17 +148,26 @@ class Signaling {
_createDataChannel(session); _createDataChannel(session);
} }
_createOffer(session, media); _createOffer(session, media);
onCallStateChange?.call(session, CallState.Calling);
} }
void bye(SessionOneToOne session) { void bye(SessionOneToOne session, {bool callRejected = false}) {
_send('bye', { _send('bye', {
'session_id': session.id, 'session_id': session.id,
'from': session.local_user.id, 'from': session.local_user.id,
// 'call_rejected' : callRejected
});
_closeSession(session);
}
void callDisconnected(SessionOneToOne session, {bool callRejected = false}) {
_send('patient_call_rejected', {
'session_id': session.id,
'to': session.remote_user.id,
'from': session.local_user.id,
}); });
_closeSession(session); _closeSession(session);
} }
void onMessage(message) async { void onMessage(message) async {
Map<String, dynamic> mapData = message; Map<String, dynamic> mapData = message;
var data = mapData['data']; var data = mapData['data'];
@ -157,7 +175,7 @@ class Signaling {
switch (mapData['type']) { switch (mapData['type']) {
case 'call_accepted': case 'call_accepted':
{ {
onRemoteConnected?.call(data); onCallAccepted?.call(data);
} }
break; break;
@ -171,8 +189,6 @@ class Signaling {
case 'offer': case 'offer':
{ {
var peerId = data['from'];
var description = data['description']; var description = data['description'];
var media = data['media']; var media = data['media'];
@ -186,12 +202,10 @@ class Signaling {
}); });
session.remoteCandidates.clear(); session.remoteCandidates.clear();
} }
onCallStateChange?.call(session, CallState.Calling);
} }
break; break;
case 'answer': case 'answer':
{ {
var description = data['description']; var description = data['description'];
var sessionId = data['session_id']; var sessionId = data['session_id'];
session.pc?.setRemoteDescription( session.pc?.setRemoteDescription(
@ -200,8 +214,6 @@ class Signaling {
break; break;
case 'candidate': case 'candidate':
{ {
var peerId = data['from'];
var candidateMap = data['candidate']; var candidateMap = data['candidate'];
var sessionId = data['session_id']; var sessionId = data['session_id'];
RTCIceCandidate candidate = RTCIceCandidate(candidateMap['candidate'], RTCIceCandidate candidate = RTCIceCandidate(candidateMap['candidate'],
@ -219,21 +231,11 @@ class Signaling {
} }
} }
break; break;
case 'leave':
{
var peerId = data as String;
_closeSessionById(peerId);
}
break;
case 'bye': case 'bye':
{ {
if(session.local_user.id != data["from"])
var sessionId = data['session_id'];
print('bye: ' + sessionId);
if (session != null) {
onCallStateChange?.call(session, CallState.Bye); onCallStateChange?.call(session, CallState.Bye);
_closeSession(session);
}
} }
break; break;
case 'keepalive': case 'keepalive':
@ -269,11 +271,15 @@ class Signaling {
}, },
] ]
}; };
} catch (e) {} } catch (e) {
print("jsjhs" + e.toString());
}
} }
_socket?.onOpen = () { _socket?.onOpen = () {
print('onOpen'); print('onOpen');
state = SignalingState.Open;
onSignalingStateChange?.call(SignalingState.Open); onSignalingStateChange?.call(SignalingState.Open);
_send('connect', session.local_user.toJson()); _send('connect', session.local_user.toJson());
}; };
@ -284,10 +290,13 @@ class Signaling {
}; };
_socket?.onClose = (int code, String reason) { _socket?.onClose = (int code, String reason) {
state = SignalingState.Closed;
print('Closed by server [$code => $reason]!'); print('Closed by server [$code => $reason]!');
onSignalingStateChange?.call(SignalingState.Closed); onSignalingStateChange?.call(SignalingState.Closed);
}; };
await _socket?.connect(); await _socket?.connect();
} }
@ -403,7 +412,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 or sdpMLineIndex 'sdpMLineIndex': candidate.sdpMLineIndex, // sdpMlineIndex or sdpMLineIndex
'sdpMid': candidate.sdpMid, 'sdpMid': candidate.sdpMid,
'candidate': candidate.candidate, 'candidate': candidate.candidate,
}, },
@ -486,14 +495,7 @@ class Signaling {
} }
Future<void> finishSessions() async { Future<void> finishSessions() async {
_closeSessionById(session.id); _closeSession(session);
}
void _closeSessionById(String sessionId) {
if (session != null && session.id == sessionId) {
_closeSession(session);
onCallStateChange?.call(session, CallState.Bye);
}
} }
Future<void> _closeSession(SessionOneToOne session) async { Future<void> _closeSession(SessionOneToOne session) async {
@ -502,7 +504,6 @@ class Signaling {
}); });
await localStream?.dispose(); await localStream?.dispose();
localStream = null; localStream = null;
await session.pc?.close(); await session.pc?.close();
await session.dc?.close(); await session.dc?.close();
} }

@ -12,33 +12,22 @@ import 'package:flutter_webrtc/flutter_webrtc.dart';
class StartVideoCall extends StatefulWidget { class StartVideoCall extends StatefulWidget {
static String tag = 'webrtc'; static String tag = 'webrtc';
final String host; SessionOneToOne session;
Signaling signaling;
String caller; StartVideoCall({@required this.signaling, @required this.session});
String receiver;
bool iAmCaller;
StartVideoCall({@required this.caller, @required this.receiver, this.iAmCaller = false, @required this.host});
@override @override
StartVideoCallState createState() => StartVideoCallState(receiverId: receiver, callerId: caller, iAmCaller: iAmCaller); StartVideoCallState createState() => StartVideoCallState(session: session, signaling: signaling);
} }
class StartVideoCallState extends State<StartVideoCall> { class StartVideoCallState extends State<StartVideoCall> {
Signaling _signaling; Signaling _signaling;
SessionOneToOne _session; SessionOneToOne _session;
StartVideoCallState({@required String callerId, @required String receiverId, @required bool iAmCaller}){ StartVideoCallState({@required SessionOneToOne session, @required Signaling signaling}) {
this._session = session;
final self_role = iAmCaller ? "Caller" : "Receiver"; this._signaling = signaling;
final self_id = iAmCaller ? callerId : receiverId;
final self_user = SocketUser(id: self_id, name: "$self_role-$self_id", userAgent: DeviceInfo.userAgent, moreInfo: {});
final remote_role = !iAmCaller ? "Caller" : "Receiver";
final remote_id = !iAmCaller ? callerId : receiverId;
final remote_user = SocketUser(id: remote_id, name: "$remote_role-$remote_id", userAgent: DeviceInfo.userAgent, moreInfo: {});
final session_id = "$callerId-$receiverId";
_session = SessionOneToOne(id: session_id, local_user: self_user, remote_user: remote_user);
} }
bool showNoise = true; bool showNoise = true;
@ -51,13 +40,14 @@ class StartVideoCallState extends State<StartVideoCall> {
final RTCVideoRenderer _remoteRenderer = RTCVideoRenderer(); final RTCVideoRenderer _remoteRenderer = RTCVideoRenderer();
MediaStream get localMediaStream => _signaling.localStream; MediaStream get localMediaStream => _signaling.localStream;
MediaStream get remoteMediaStream => _signaling.remoteStreams.first; MediaStream get remoteMediaStream => _signaling.remoteStreams.first;
@override @override
initState() { initState() {
super.initState(); super.initState();
initRenderers(); initRenderers();
_connect(); _setupEventListeners();
} }
initRenderers() async { initRenderers() async {
@ -76,19 +66,6 @@ class StartVideoCallState extends State<StartVideoCall> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
// appBar: AppBar(
// title: Text('P2P Call Sample' + (_session?.local_user != null ? ' [Your ID (${_session?.local_user?.id})] ' : '')),
// actions: <Widget>[
// IconButton(
// icon: const Icon(Icons.settings),
// onPressed: (){
// setState(() {
// });
// },
// tooltip: 'setup',
// ),
// ],
// ),
body: videoCanvasWidgets(), body: videoCanvasWidgets(),
); );
} }
@ -124,13 +101,12 @@ class StartVideoCallState extends State<StartVideoCall> {
); );
} }
void _setupEventListeners() async {
if (_session == null) return;
void _connect() async { // _signaling ??= Signaling(widget.host, session: _session)..connect();
if(_session == null)
return;
_signaling ??= Signaling(widget.host, session: _session)..connect();
_signaling?.callAccepted(_session);
_signaling?.onSignalingStateChange = (SignalingState state) { _signaling?.onSignalingStateChange = (SignalingState state) {
switch (state) { switch (state) {
case SignalingState.Closed: case SignalingState.Closed:
@ -142,19 +118,9 @@ class StartVideoCallState extends State<StartVideoCall> {
_signaling?.onCallStateChange = (SessionOneToOne session, CallState state) { _signaling?.onCallStateChange = (SessionOneToOne session, CallState state) {
switch (state) { switch (state) {
case CallState.Calling:
setState(() {});
break;
case CallState.Bye: case CallState.Bye:
setState(() { _onHangup(byRemote: true);
_localRenderer.srcObject = null;
_remoteRenderer.srcObject = null;
_session = null;
});
break; break;
case CallState.Invite:
case CallState.Connected:
case CallState.Ringing:
} }
}; };
@ -162,14 +128,11 @@ class StartVideoCallState extends State<StartVideoCall> {
_signaling?.callAccepted(_session); _signaling?.callAccepted(_session);
}); });
_signaling?.onRemoteConnected = ((event) { _signaling?.onCallAccepted = ((event) {});
});
_signaling?.onLocalStream = ((stream) { _signaling?.onLocalStream = ((stream) {
_localRenderer.srcObject = stream; _localRenderer.srcObject = stream;
setState(() { setState(() {});
});
}); });
_signaling?.onAddRemoteStream = ((_, stream) { _signaling?.onAddRemoteStream = ((_, stream) {
@ -184,28 +147,26 @@ class StartVideoCallState extends State<StartVideoCall> {
}); });
} }
_hangUp() async{ // _switchCamera() {
if (_session != null) { // _signaling?.switchCamera();
_signaling?.bye(_session); // }
} //
} // _muteMic() {
// _signaling?.muteMic();
_switchCamera() { // }
_signaling?.switchCamera();
}
_muteMic() {
_signaling?.muteMic();
}
Function _onAudioEnable() { Function _onAudioEnable() {
print("================= Audio Event Triggered ===================");
final audioTrack = localMediaStream.getAudioTracks()[0]; final audioTrack = localMediaStream.getAudioTracks()[0];
final mute = audioTrack.muted; final micEnabled = audioTrack.enabled;
Helper.setMicrophoneMute(!mute, audioTrack); localMediaStream.getAudioTracks()[0].enabled = !micEnabled;
_audioButton.add(mute); _audioButton.add(!micEnabled);
// _audioButton.add(!mute);
// Helper.setMicrophoneMute(!mute, audioTrack);
} }
Function _onVideoEnabled() { Function _onVideoEnabled() {
print("================= Video Event Triggered ===================");
final videoTrack = localMediaStream.getVideoTracks()[0]; final videoTrack = localMediaStream.getVideoTracks()[0];
bool videoEnabled = videoTrack.enabled; bool videoEnabled = videoTrack.enabled;
localMediaStream.getVideoTracks()[0].enabled = !videoEnabled; localMediaStream.getVideoTracks()[0].enabled = !videoEnabled;
@ -213,12 +174,12 @@ class StartVideoCallState extends State<StartVideoCall> {
} }
Function _onSwitchCamera() { Function _onSwitchCamera() {
print("================= Camera Switch Event Triggered ===================");
Helper.switchCamera(localMediaStream.getVideoTracks()[0]); Helper.switchCamera(localMediaStream.getVideoTracks()[0]);
} }
void _onShowBar() { void _onShowBar() {
setState(() { setState(() {});
});
_onButtonBarVisibleStreamController.add(true); _onButtonBarVisibleStreamController.add(true);
} }
@ -233,9 +194,13 @@ class StartVideoCallState extends State<StartVideoCall> {
_onButtonBarVisibleStreamController.add(false); _onButtonBarVisibleStreamController.add(false);
} }
Future<void> _onHangup() async { Future<void> _onHangup({bool byRemote = false}) async {
_signaling?.finishSessions();
print('onHangup'); if (byRemote) {
Navigator.of(context).pop(); Navigator.of(context).pop();
} else {
_signaling.bye(_session);
Navigator.of(context).pop();
}
} }
} }

@ -9,12 +9,8 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter_hms_gms_availability/flutter_hms_gms_availability.dart'; import 'package:flutter_hms_gms_availability/flutter_hms_gms_availability.dart';
import 'package:geolocator/geolocator.dart'; import 'package:geolocator/geolocator.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:huawei_location/location/fused_location_provider_client.dart'; import 'package:huawei_location/huawei_location.dart';
import 'package:huawei_location/location/location.dart';
import 'package:huawei_location/location/location_callback.dart';
import 'package:huawei_location/location/location_request.dart';
import 'package:huawei_location/location/location_settings_request.dart';
import 'package:huawei_location/permission/permission_handler.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
class LocationUtils { class LocationUtils {
@ -77,7 +73,8 @@ class LocationUtils {
LocationCallback _locationCallback; LocationCallback _locationCallback;
_getHMSCurrentLocation(Function(LatLng) callBack) async { _getHMSCurrentLocation(Function(LatLng) callBack) async {
PermissionHandler permissionHandler = PermissionHandler(); // PermissionHandler permissionHandler = PermissionHandler();
Permission permissionHandler;
int _locationUpdateCbId = 0; int _locationUpdateCbId = 0;
doIt() { doIt() {
@ -106,7 +103,8 @@ class LocationUtils {
}); });
} }
if (await permissionHandler.hasLocationPermission()) { // if (await permissionHandler.hasLocationPermission()) {
if (await permissionHandler.status.isGranted) {
doIt(); doIt();
} else { } else {
bool has = await requestPermissions(); bool has = await requestPermissions();

@ -93,7 +93,7 @@ callPage(String sessionID, String token, String isWebrtc, String callerIdString)
String caller = callerIdString.split("*")[3]; String caller = callerIdString.split("*")[3];
String receiver = callerIdString.split("*")[4]; String receiver = callerIdString.split("*")[4];
String host = callerIdString.split("*")[5]; String host = callerIdString.split("*")[5];
return StartVideoCall(caller: caller, receiver: receiver, iAmCaller: false, host: host); // return StartVideoCall(caller: caller, receiver: receiver, iAmCaller: false, host: host);
}else{ }else{
await NavigationService.navigateToPage(OpenTokConnectCallPage(apiKey: OPENTOK_API_KEY, sessionId: sessionID, token: token)); await NavigationService.navigateToPage(OpenTokConnectCallPage(apiKey: OPENTOK_API_KEY, sessionId: sessionID, token: token));
} }

@ -35,13 +35,13 @@ class MyInAppBrowser extends InAppBrowser {
// static String APPLE_PAY_PAYFORT_URL = 'https://hmgwebservices.com/PayFortWebLive/PayFortApi/MakeApplePayRequest'; // Payfort Payment Gateway URL LIVE // static String APPLE_PAY_PAYFORT_URL = 'https://hmgwebservices.com/PayFortWebLive/PayFortApi/MakeApplePayRequest'; // Payfort Payment Gateway URL LIVE
static String APPLE_PAY_PAYFORT_URL = 'https://hmgwebservices.com/PayFortWebLive/PayFortApi/MakeApplePayRequest'; // Payfort Payment Gateway URL UAT static String APPLE_PAY_PAYFORT_URL = 'https://hmgwebservices.com/PayFortWebLive/PayFortApi/MakeApplePayRequest'; // Payfort Payment Gateway URL UAT
// static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort Payment Gateway URL UAT static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort Payment Gateway URL UAT
static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL LIVE // static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL LIVE
// static String PREAUTH_SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort PreAuth Payment Gateway URL UAT static String PREAUTH_SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort PreAuth Payment Gateway URL UAT
static String PREAUTH_SERVICE_URL = 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort PreAuth Payment Gateway URL Live Store // static String PREAUTH_SERVICE_URL = 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort PreAuth Payment Gateway URL Live Store
// static String PRESCRIPTION_PAYMENT_WITH_ORDERID = // static String PRESCRIPTION_PAYMENT_WITH_ORDERID =
// 'https://uat.hmgwebservices.com/epharmacy/checkout/OpcCompleteRedirectionPaymentClientbyOrder?orderID='; // 'https://uat.hmgwebservices.com/epharmacy/checkout/OpcCompleteRedirectionPaymentClientbyOrder?orderID=';

@ -146,7 +146,7 @@ dependencies:
jiffy: ^4.1.0 jiffy: ^4.1.0
#Flutter WebRTC #Flutter WebRTC
flutter_webrtc: ^0.8.0 flutter_webrtc: ^0.9.8
screen_brightness: ^0.1.2 screen_brightness: ^0.1.2

@ -1,11 +1,11 @@
arguments= arguments=
auto.sync=false auto.sync=false
build.scans.enabled=false build.scans.enabled=false
connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(5.6.1)) connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(7.4.2))
connection.project.dir= connection.project.dir=
eclipse.preferences.version=1 eclipse.preferences.version=1
gradle.user.home= gradle.user.home=
java.home= java.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home
jvm.arguments= jvm.arguments=
offline.mode=false offline.mode=false
override.workspace.settings=true override.workspace.settings=true

Loading…
Cancel
Save