|
|
|
|
@ -4,10 +4,11 @@ import 'package:camera/camera.dart';
|
|
|
|
|
import 'package:diplomaticquarterapp/models/LiveCare/IncomingCallData.dart';
|
|
|
|
|
import 'package:diplomaticquarterapp/pages/conference/widgets/platform_exception_alert_dialog.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/webRTC/OpenTok/OpenTok.dart';
|
|
|
|
|
import 'package:diplomaticquarterapp/pages/webRTC/signaling.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/utils_new.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 '../../config/config.dart';
|
|
|
|
|
|
|
|
|
|
import '../videocall-webrtc-rnd/utils/device_info.dart';
|
|
|
|
|
|
|
|
|
|
class IncomingCall extends StatefulWidget {
|
|
|
|
|
IncomingCallData incomingCallData;
|
|
|
|
|
@ -34,14 +35,17 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
|
|
|
|
|
CameraController _controller;
|
|
|
|
|
Future<void> _initializeControllerFuture;
|
|
|
|
|
bool isCameraReady = false;
|
|
|
|
|
Signaling signaling = Signaling()..init();
|
|
|
|
|
|
|
|
|
|
Signaling _signaling;
|
|
|
|
|
SessionOneToOne _session;
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
void initState() {
|
|
|
|
|
_animationController = AnimationController(vsync: this, duration: Duration(milliseconds: 500));
|
|
|
|
|
isCameraReady = false;
|
|
|
|
|
//_runAnimation();
|
|
|
|
|
connectSignaling();
|
|
|
|
|
WidgetsBinding.instance.addPostFrameCallback((_) =>_runAnimation());
|
|
|
|
|
|
|
|
|
|
WidgetsBinding.instance.addPostFrameCallback((_) => _runAnimation());
|
|
|
|
|
super.initState();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -51,6 +55,9 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
|
|
|
|
|
player.stop();
|
|
|
|
|
_controller.dispose();
|
|
|
|
|
disposeAudioResources();
|
|
|
|
|
|
|
|
|
|
// _signaling.close();
|
|
|
|
|
|
|
|
|
|
super.dispose();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -203,21 +210,15 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void _runAnimation() async {
|
|
|
|
|
|
|
|
|
|
final cameras = await availableCameras();
|
|
|
|
|
final firstCamera = cameras[1];
|
|
|
|
|
|
|
|
|
|
_controller = CameraController(
|
|
|
|
|
// Get a specific camera from the list of available cameras.
|
|
|
|
|
firstCamera,
|
|
|
|
|
// Define the resolution to use.
|
|
|
|
|
ResolutionPreset.medium,
|
|
|
|
|
);
|
|
|
|
|
_initializeControllerFuture = _controller.initialize();
|
|
|
|
|
|
|
|
|
|
setState(() {
|
|
|
|
|
isCameraReady = true;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
setState(() {});
|
|
|
|
|
setAudioFile();
|
|
|
|
|
for (int i = 0; i < 100; i++) {
|
|
|
|
|
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);
|
|
|
|
|
await _controller.dispose();
|
|
|
|
|
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) {
|
|
|
|
|
print(err);
|
|
|
|
|
await PlatformExceptionAlertDialog(
|
|
|
|
|
@ -265,8 +264,7 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
|
|
|
|
|
|
|
|
|
|
void changeCallStatusAPI(int sessionStatus) {
|
|
|
|
|
LiveCareService service = new LiveCareService();
|
|
|
|
|
service.endCallAPI(widget.incomingCallData.sessionId, sessionStatus, context).then((res) {
|
|
|
|
|
}).catchError((err) {
|
|
|
|
|
service.endCallAPI(widget.incomingCallData.sessionId, sessionStatus, context).then((res) {}).catchError((err) {
|
|
|
|
|
print(err);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
@ -274,8 +272,11 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
|
|
|
|
|
void backToHome() async {
|
|
|
|
|
// final connected = await signaling.declineCall(widget.incomingCallData.callerID, widget.incomingCallData.receiverID);
|
|
|
|
|
LandingPage.isOpenCallPage = false;
|
|
|
|
|
// _signaling
|
|
|
|
|
player.stop();
|
|
|
|
|
changeCallStatusAPI(3);
|
|
|
|
|
_signaling.bye(_session, callRejected: true);
|
|
|
|
|
_signaling.callDisconnected(_session, callRejected: true);
|
|
|
|
|
Navigator.of(context).pop();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -297,4 +298,29 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|