Updated Events

development_amir
Zohaib Iqbal Kambrani 3 years ago
parent cf8951f66a
commit 691ee4ccbf

@ -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,6 +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 {
@ -27,6 +29,7 @@ class IncomingCall extends StatefulWidget {
} }
class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderStateMixin { class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderStateMixin {
AnimationController _animationController; AnimationController _animationController;
bool openCallInWeb = true; bool openCallInWeb = true;
@ -34,7 +37,9 @@ 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() {
@ -51,16 +56,25 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
player.stop(); player.stop();
_controller.dispose(); _controller.dispose();
disposeAudioResources(); disposeAudioResources();
// _signaling.close();
super.dispose(); super.dispose();
} }
Future<void> future() async {
await connectSignaling();
// await _initializeControllerFuture();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return AppScaffold( return AppScaffold(
isShowAppBar: false, isShowAppBar: false,
isShowDecPage: false, isShowDecPage: false,
body: FutureBuilder<void>( body: FutureBuilder<void>(
future: _initializeControllerFuture, future: future(),
builder: (context, snapshot) { builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) { if (snapshot.connectionState == ConnectionState.done) {
return Stack( return Stack(
@ -214,9 +228,9 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
); );
_initializeControllerFuture = _controller.initialize(); _initializeControllerFuture = _controller.initialize();
setState(() { // setState(() {
isCameraReady = true; // isCameraReady = true;
}); // });
setAudioFile(); setAudioFile();
for (int i = 0; i < 100; i++) { for (int i = 0; i < 100; i++) {
@ -231,15 +245,15 @@ 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);
if(_session != null && _signaling != null){
await Navigator.of(context).pushReplacement( await Navigator.of(context).pushReplacement(
MaterialPageRoute( MaterialPageRoute(
// fullscreenDialog: true, // fullscreenDialog: true,
builder: (BuildContext context) { builder: (BuildContext context) {
final caller = widget.incomingCallData.callerID;
final receiver = widget.incomingCallData.receiverID;
final host = widget.incomingCallData.server;
if(widget.incomingCallData.isWebRTC == "true"){ if(widget.incomingCallData.isWebRTC == "true"){
return StartVideoCall(caller: caller, receiver: receiver, iAmCaller: false, host: host); return StartVideoCall(signaling: _signaling, session: _session);
}else{ }else{
return OpenTokConnectCallPage( return OpenTokConnectCallPage(
apiKey: OPENTOK_API_KEY, apiKey: OPENTOK_API_KEY,
@ -255,6 +269,11 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
}, },
), ),
); );
}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(
@ -276,6 +295,7 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
LandingPage.isOpenCallPage = false; LandingPage.isOpenCallPage = false;
player.stop(); player.stop();
changeCallStatusAPI(3); changeCallStatusAPI(3);
_signaling.bye(_session, callRejected: true);
Navigator.of(context).pop(); Navigator.of(context).pop();
} }
@ -297,4 +317,31 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
print("Error: $e"); print("Error: $e");
} }
} }
connectSignaling({@required bool iAmCaller = false}) async{
final caller = widget.incomingCallData.callerID;
final receiver = widget.incomingCallData.receiverID;
final host = widget.incomingCallData.server;
final self_role = iAmCaller ? "Caller" : "Receiver";
final self_id = iAmCaller ? caller : receiver;
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 ? caller : receiver;
final remote_user = SocketUser(id: remote_id, name: "$remote_role-$remote_id", userAgent: DeviceInfo.userAgent, moreInfo: {});
final session_id = "$caller-$receiver";
_session = SessionOneToOne(id: session_id, local_user: self_user, remote_user: remote_user);
_signaling = Signaling(host, session: _session);
await _signaling.connect();
if(_signaling.state == SignalingState.Open){
return;
}
}
} }

@ -50,6 +50,8 @@ class SocketUser{
} }
class Signaling { class Signaling {
SignalingState state;
var _host; var _host;
var _turnCredential; var _turnCredential;
@ -141,10 +143,11 @@ class Signaling {
_createOffer(session, media); _createOffer(session, media);
} }
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); _closeSession(session);
} }
@ -258,6 +261,8 @@ class Signaling {
_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());
}; };
@ -268,10 +273,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();
} }
@ -387,7 +395,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,
}, },

@ -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;
@ -57,7 +46,7 @@ class StartVideoCallState extends State<StartVideoCall> {
initState() { initState() {
super.initState(); super.initState();
initRenderers(); initRenderers();
_connect(); _setupEventListeners();
} }
initRenderers() async { initRenderers() async {
@ -112,12 +101,13 @@ class StartVideoCallState extends State<StartVideoCall> {
} }
void _connect() async { void _setupEventListeners() async {
if(_session == null) if(_session == null)
return; return;
_signaling ??= Signaling(widget.host, session: _session)..connect(); // _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:

@ -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));
} }

@ -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

Loading…
Cancel
Save