Changes into Rating Bar
parent
8bdcfcb764
commit
b4bc99369f
@ -1,82 +1,82 @@
|
|||||||
import 'dart:async';
|
// import 'dart:async';
|
||||||
import 'dart:core';
|
// import 'dart:core';
|
||||||
|
//
|
||||||
import 'package:diplomaticquarterapp/pages/conference/widgets/noise_box.dart';
|
// import 'package:diplomaticquarterapp/pages/conference/widgets/noise_box.dart';
|
||||||
import 'package:flutter/material.dart';
|
// import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_webrtc/flutter_webrtc.dart';
|
// import 'package:flutter_webrtc/flutter_webrtc.dart';
|
||||||
|
//
|
||||||
import 'draggable_cam.dart';
|
// import 'draggable_cam.dart';
|
||||||
|
//
|
||||||
class CamViewWidget extends StatefulWidget {
|
// class CamViewWidget extends StatefulWidget {
|
||||||
RTCVideoRenderer? localRenderer;
|
// RTCVideoRenderer? localRenderer;
|
||||||
RTCVideoRenderer? remoteRenderer;
|
// RTCVideoRenderer? remoteRenderer;
|
||||||
MediaStream? localStream;
|
// MediaStream? localStream;
|
||||||
BoxConstraints? constraints;
|
// BoxConstraints? constraints;
|
||||||
StreamController<bool>? onButtonBarVisibleStreamController;
|
// StreamController<bool>? onButtonBarVisibleStreamController;
|
||||||
StreamController<double>? onButtonBarHeightStreamController;
|
// StreamController<double>? onButtonBarHeightStreamController;
|
||||||
|
//
|
||||||
CamViewWidget({this.localRenderer, this.remoteRenderer, this.constraints, this.onButtonBarVisibleStreamController, this.onButtonBarHeightStreamController});
|
// CamViewWidget({this.localRenderer, this.remoteRenderer, this.constraints, this.onButtonBarVisibleStreamController, this.onButtonBarHeightStreamController});
|
||||||
|
//
|
||||||
@override
|
// @override
|
||||||
_CamViewWidgetState createState() => _CamViewWidgetState();
|
// _CamViewWidgetState createState() => _CamViewWidgetState();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
class _CamViewWidgetState extends State<CamViewWidget> {
|
// class _CamViewWidgetState extends State<CamViewWidget> {
|
||||||
@override
|
// @override
|
||||||
void initState() {
|
// void initState() {
|
||||||
super.initState();
|
// super.initState();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
@override
|
// @override
|
||||||
Widget build(BuildContext context) {
|
// Widget build(BuildContext context) {
|
||||||
return Container(
|
// return Container(
|
||||||
width: double.infinity,
|
// width: double.infinity,
|
||||||
height: double.infinity,
|
// height: double.infinity,
|
||||||
child: Stack(
|
// child: Stack(
|
||||||
children: [
|
// children: [
|
||||||
FractionallySizedBox(
|
// FractionallySizedBox(
|
||||||
heightFactor: 1, widthFactor: 1,
|
// heightFactor: 1, widthFactor: 1,
|
||||||
child: Container(
|
// child: Container(
|
||||||
color: Colors.black87,
|
// color: Colors.black87,
|
||||||
child: RTCVideoView(widget.remoteRenderer!, mirror: true,filterQuality: FilterQuality.medium,),
|
// // child: RTCVideoView(widget.remoteRenderer!, mirror: true,filterQuality: FilterQuality.medium,),
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
|
//
|
||||||
if(widget.remoteRenderer!.srcObject == null)
|
// if(widget.remoteRenderer!.srcObject == null)
|
||||||
Positioned.fill(child: _buildNoiseBox()),
|
// Positioned.fill(child: _buildNoiseBox()),
|
||||||
|
//
|
||||||
Positioned.fill(
|
// // Positioned.fill(
|
||||||
child: RTCVideoView(widget.remoteRenderer!)
|
// // child: RTCVideoView(widget.remoteRenderer!)
|
||||||
),
|
// // ),
|
||||||
|
//
|
||||||
DraggableCam(
|
// // DraggableCam(
|
||||||
key: Key('publisher'),
|
// // key: Key('publisher'),
|
||||||
onButtonBarHeight: widget.onButtonBarHeightStreamController!.stream,
|
// // onButtonBarHeight: widget.onButtonBarHeightStreamController!.stream,
|
||||||
onButtonBarVisible: widget.onButtonBarVisibleStreamController!.stream,
|
// // onButtonBarVisible: widget.onButtonBarVisibleStreamController!.stream,
|
||||||
availableScreenSize: widget.constraints!.biggest,
|
// // availableScreenSize: widget.constraints!.biggest,
|
||||||
child: RTCVideoView(widget.localRenderer!)
|
// // child: RTCVideoView(widget.localRenderer!)
|
||||||
),
|
// // ),
|
||||||
|
//
|
||||||
if(widget.remoteRenderer!.srcObject == null)
|
// if(widget.remoteRenderer!.srcObject == null)
|
||||||
Container(
|
// Container(
|
||||||
margin: EdgeInsets.all(MediaQuery.of(context).size.width/8),
|
// margin: EdgeInsets.all(MediaQuery.of(context).size.width/8),
|
||||||
child: Text(
|
// child: Text(
|
||||||
'Waiting for another participant to connect to the call...',
|
// 'Waiting for another participant to connect to the call...',
|
||||||
key: Key('text-wait'),
|
// key: Key('text-wait'),
|
||||||
textAlign: TextAlign.center,
|
// textAlign: TextAlign.center,
|
||||||
style: TextStyle(color: Colors.white),
|
// style: TextStyle(color: Colors.white),
|
||||||
)
|
// )
|
||||||
),
|
// ),
|
||||||
],
|
// ],
|
||||||
),
|
// ),
|
||||||
);
|
// );
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
Widget _buildNoiseBox() {
|
// Widget _buildNoiseBox() {
|
||||||
return NoiseBox(
|
// return NoiseBox(
|
||||||
density: NoiseBoxDensity.xHigh,
|
// density: NoiseBoxDensity.xHigh,
|
||||||
backgroundColor: Colors.grey.shade900,
|
// backgroundColor: Colors.grey.shade900,
|
||||||
);
|
// );
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,241 +1,241 @@
|
|||||||
import 'dart:async';
|
// 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: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';
|
||||||
import 'signaling.dart';
|
// import 'signaling.dart';
|
||||||
import 'package:flutter_webrtc/flutter_webrtc.dart';
|
// 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;
|
// final String host;
|
||||||
|
//
|
||||||
String caller;
|
// String caller;
|
||||||
String receiver;
|
// String receiver;
|
||||||
bool iAmCaller;
|
// bool iAmCaller;
|
||||||
StartVideoCall({required this.caller, required this.receiver, this.iAmCaller = false, required this.host});
|
// 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(receiverId: receiver, callerId: caller, iAmCaller: iAmCaller);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
class StartVideoCallState extends State<StartVideoCall> {
|
// class StartVideoCallState extends State<StartVideoCall> {
|
||||||
late Signaling _signaling;
|
// late Signaling _signaling;
|
||||||
late SessionOneToOne? _session;
|
// late SessionOneToOne? _session;
|
||||||
|
//
|
||||||
StartVideoCallState({required String callerId, required String receiverId, required bool iAmCaller}){
|
// StartVideoCallState({required String callerId, required String receiverId, required bool iAmCaller}){
|
||||||
|
//
|
||||||
final self_role = iAmCaller ? "Caller" : "Receiver";
|
// final self_role = iAmCaller ? "Caller" : "Receiver";
|
||||||
final self_id = iAmCaller ? callerId : receiverId;
|
// final self_id = iAmCaller ? callerId : receiverId;
|
||||||
final self_user = SocketUser(id: self_id, name: "$self_role-$self_id", userAgent: DeviceInfo.userAgent, moreInfo: {});
|
// final self_user = SocketUser(id: self_id, name: "$self_role-$self_id", userAgent: DeviceInfo.userAgent, moreInfo: {});
|
||||||
|
//
|
||||||
final remote_role = !iAmCaller ? "Caller" : "Receiver";
|
// final remote_role = !iAmCaller ? "Caller" : "Receiver";
|
||||||
final remote_id = !iAmCaller ? callerId : receiverId;
|
// final remote_id = !iAmCaller ? callerId : receiverId;
|
||||||
final remote_user = SocketUser(id: remote_id, name: "$remote_role-$remote_id", userAgent: DeviceInfo.userAgent, moreInfo: {});
|
// final remote_user = SocketUser(id: remote_id, name: "$remote_role-$remote_id", userAgent: DeviceInfo.userAgent, moreInfo: {});
|
||||||
|
//
|
||||||
final session_id = "$callerId-$receiverId";
|
// final session_id = "$callerId-$receiverId";
|
||||||
_session = SessionOneToOne(id: session_id, local_user: self_user, remote_user: remote_user);
|
// _session = SessionOneToOne(id: session_id, local_user: self_user, remote_user: remote_user);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
bool showNoise = true;
|
// bool showNoise = true;
|
||||||
final StreamController<bool> _audioButton = StreamController<bool>.broadcast();
|
// final StreamController<bool> _audioButton = StreamController<bool>.broadcast();
|
||||||
final StreamController<bool> _videoButton = StreamController<bool>.broadcast();
|
// final StreamController<bool> _videoButton = StreamController<bool>.broadcast();
|
||||||
final StreamController<bool> _onButtonBarVisibleStreamController = StreamController<bool>.broadcast();
|
// final StreamController<bool> _onButtonBarVisibleStreamController = StreamController<bool>.broadcast();
|
||||||
final StreamController<double> _onButtonBarHeightStreamController = StreamController<double>.broadcast();
|
// final StreamController<double> _onButtonBarHeightStreamController = StreamController<double>.broadcast();
|
||||||
|
//
|
||||||
final RTCVideoRenderer _localRenderer = RTCVideoRenderer();
|
// final RTCVideoRenderer _localRenderer = RTCVideoRenderer();
|
||||||
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();
|
// _connect();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
initRenderers() async {
|
// initRenderers() async {
|
||||||
await _localRenderer.initialize();
|
// await _localRenderer.initialize();
|
||||||
await _remoteRenderer.initialize();
|
// await _remoteRenderer.initialize();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
@override
|
// @override
|
||||||
deactivate() {
|
// deactivate() {
|
||||||
super.deactivate();
|
// super.deactivate();
|
||||||
_signaling?.close();
|
// _signaling?.close();
|
||||||
_localRenderer.dispose();
|
// _localRenderer.dispose();
|
||||||
_remoteRenderer.dispose();
|
// _remoteRenderer.dispose();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
@override
|
// @override
|
||||||
Widget build(BuildContext context) {
|
// Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
// return Scaffold(
|
||||||
// appBar: AppBar(
|
// // appBar: AppBar(
|
||||||
// title: Text('P2P Call Sample' + (_session?.local_user != null ? ' [Your ID (${_session?.local_user?.id})] ' : '')),
|
// // title: Text('P2P Call Sample' + (_session?.local_user != null ? ' [Your ID (${_session?.local_user?.id})] ' : '')),
|
||||||
// actions: <Widget>[
|
// // actions: <Widget>[
|
||||||
// IconButton(
|
// // IconButton(
|
||||||
// icon: const Icon(Icons.settings),
|
// // icon: const Icon(Icons.settings),
|
||||||
// onPressed: (){
|
// // onPressed: (){
|
||||||
// setState(() {
|
// // setState(() {
|
||||||
// });
|
// // });
|
||||||
// },
|
// // },
|
||||||
// tooltip: 'setup',
|
// // tooltip: 'setup',
|
||||||
// ),
|
// // ),
|
||||||
// ],
|
// // ],
|
||||||
// ),
|
// // ),
|
||||||
body: videoCanvasWidgets(),
|
// body: videoCanvasWidgets(),
|
||||||
);
|
// );
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
LayoutBuilder videoCanvasWidgets() {
|
// LayoutBuilder videoCanvasWidgets() {
|
||||||
return LayoutBuilder(
|
// return LayoutBuilder(
|
||||||
builder: (BuildContext context, BoxConstraints constraints) {
|
// builder: (BuildContext context, BoxConstraints constraints) {
|
||||||
return Stack(
|
// return Stack(
|
||||||
children: [
|
// children: [
|
||||||
CamViewWidget(
|
// CamViewWidget(
|
||||||
localRenderer: _localRenderer,
|
// localRenderer: _localRenderer,
|
||||||
remoteRenderer: _remoteRenderer,
|
// remoteRenderer: _remoteRenderer,
|
||||||
constraints: constraints,
|
// constraints: constraints,
|
||||||
onButtonBarVisibleStreamController: _onButtonBarVisibleStreamController,
|
// onButtonBarVisibleStreamController: _onButtonBarVisibleStreamController,
|
||||||
onButtonBarHeightStreamController: _onButtonBarHeightStreamController,
|
// onButtonBarHeightStreamController: _onButtonBarHeightStreamController,
|
||||||
),
|
// ),
|
||||||
ConferenceButtonBar(
|
// ConferenceButtonBar(
|
||||||
audioEnabled: _audioButton.stream,
|
// audioEnabled: _audioButton.stream,
|
||||||
videoEnabled: _videoButton.stream,
|
// videoEnabled: _videoButton.stream,
|
||||||
onAudioEnabled: _onAudioEnable,
|
// onAudioEnabled: _onAudioEnable,
|
||||||
onVideoEnabled: _onVideoEnabled,
|
// onVideoEnabled: _onVideoEnabled,
|
||||||
onSwitchCamera: _onSwitchCamera,
|
// onSwitchCamera: _onSwitchCamera,
|
||||||
onHangup: _onHangup,
|
// onHangup: _onHangup,
|
||||||
onPersonAdd: () {},
|
// onPersonAdd: () {},
|
||||||
onPersonRemove: () {},
|
// onPersonRemove: () {},
|
||||||
onHeight: _onHeightBar,
|
// onHeight: _onHeightBar,
|
||||||
onShow: _onShowBar,
|
// onShow: _onShowBar,
|
||||||
onHide: _onHideBar,
|
// onHide: _onHideBar,
|
||||||
),
|
// ),
|
||||||
],
|
// ],
|
||||||
);
|
// );
|
||||||
},
|
// },
|
||||||
);
|
// );
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
void _connect() async {
|
// void _connect() async {
|
||||||
if(_session == null)
|
// if(_session == null)
|
||||||
return;
|
// return;
|
||||||
|
//
|
||||||
_signaling ??= Signaling(widget.host, session: _session!)..connect();
|
// _signaling ??= Signaling(widget.host, session: _session!)..connect();
|
||||||
|
//
|
||||||
_signaling?.onSignalingStateChange = (SignalingState state) {
|
// _signaling?.onSignalingStateChange = (SignalingState state) {
|
||||||
switch (state) {
|
// switch (state) {
|
||||||
case SignalingState.Closed:
|
// case SignalingState.Closed:
|
||||||
case SignalingState.Error:
|
// case SignalingState.Error:
|
||||||
case SignalingState.Open:
|
// case SignalingState.Open:
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
};
|
// };
|
||||||
|
//
|
||||||
_signaling?.onCallStateChange = (SessionOneToOne session, CallState state) {
|
// _signaling?.onCallStateChange = (SessionOneToOne session, CallState state) {
|
||||||
switch (state) {
|
// switch (state) {
|
||||||
case CallState.Calling:
|
// case CallState.Calling:
|
||||||
setState(() {});
|
// setState(() {});
|
||||||
break;
|
// break;
|
||||||
case CallState.Bye:
|
// case CallState.Bye:
|
||||||
setState(() {
|
// setState(() {
|
||||||
_localRenderer.srcObject = null;
|
// _localRenderer.srcObject = null;
|
||||||
_remoteRenderer.srcObject = null;
|
// _remoteRenderer.srcObject = null;
|
||||||
_session = null;
|
// _session = null;
|
||||||
});
|
// });
|
||||||
break;
|
// break;
|
||||||
case CallState.Invite:
|
// case CallState.Invite:
|
||||||
case CallState.Connected:
|
// case CallState.Connected:
|
||||||
case CallState.Ringing:
|
// case CallState.Ringing:
|
||||||
}
|
// }
|
||||||
};
|
// };
|
||||||
|
//
|
||||||
_signaling?.onConnected = ((event) {
|
// _signaling?.onConnected = ((event) {
|
||||||
_signaling?.callAccepted(_session!);
|
// _signaling?.callAccepted(_session!);
|
||||||
});
|
// });
|
||||||
|
//
|
||||||
_signaling?.onRemoteConnected = ((event) {
|
// _signaling?.onRemoteConnected = ((event) {
|
||||||
|
//
|
||||||
});
|
// });
|
||||||
|
//
|
||||||
_signaling?.onLocalStream = ((stream) {
|
// _signaling?.onLocalStream = ((stream) {
|
||||||
_localRenderer.srcObject = stream;
|
// _localRenderer.srcObject = stream;
|
||||||
setState(() {
|
// setState(() {
|
||||||
});
|
// });
|
||||||
});
|
// });
|
||||||
|
//
|
||||||
_signaling?.onAddRemoteStream = ((_, stream) {
|
// _signaling?.onAddRemoteStream = ((_, stream) {
|
||||||
_remoteRenderer.srcObject = stream;
|
// _remoteRenderer.srcObject = stream;
|
||||||
setState(() {});
|
// setState(() {});
|
||||||
});
|
// });
|
||||||
|
//
|
||||||
_signaling?.onRemoveRemoteStream = ((_, stream) {
|
// _signaling?.onRemoveRemoteStream = ((_, stream) {
|
||||||
setState(() {
|
// setState(() {
|
||||||
_remoteRenderer.srcObject = null;
|
// _remoteRenderer.srcObject = null;
|
||||||
});
|
// });
|
||||||
});
|
// });
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
_hangUp() async{
|
// _hangUp() async{
|
||||||
if (_session != null) {
|
// if (_session != null) {
|
||||||
_signaling?.bye(_session!);
|
// _signaling?.bye(_session!);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
_switchCamera() {
|
// _switchCamera() {
|
||||||
_signaling?.switchCamera();
|
// _signaling?.switchCamera();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
_muteMic() {
|
// _muteMic() {
|
||||||
_signaling?.muteMic();
|
// _signaling?.muteMic();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
Function? _onAudioEnable() {
|
// Function? _onAudioEnable() {
|
||||||
final audioTrack = localMediaStream.getAudioTracks()[0];
|
// final audioTrack = localMediaStream.getAudioTracks()[0];
|
||||||
final mute = audioTrack.muted;
|
// final mute = audioTrack.muted;
|
||||||
Helper.setMicrophoneMute(!mute!, audioTrack);
|
// Helper.setMicrophoneMute(!mute!, audioTrack);
|
||||||
_audioButton.add(mute);
|
// _audioButton.add(mute);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
Function? _onVideoEnabled() {
|
// Function? _onVideoEnabled() {
|
||||||
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;
|
||||||
_videoButton.add(!videoEnabled);
|
// _videoButton.add(!videoEnabled);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
Function? _onSwitchCamera() {
|
// Function? _onSwitchCamera() {
|
||||||
Helper.switchCamera(localMediaStream.getVideoTracks()[0]);
|
// Helper.switchCamera(localMediaStream.getVideoTracks()[0]);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
void _onShowBar() {
|
// void _onShowBar() {
|
||||||
setState(() {
|
// setState(() {
|
||||||
});
|
// });
|
||||||
_onButtonBarVisibleStreamController.add(true);
|
// _onButtonBarVisibleStreamController.add(true);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
void _onHeightBar(double height) {
|
// void _onHeightBar(double height) {
|
||||||
_onButtonBarHeightStreamController.add(height);
|
// _onButtonBarHeightStreamController.add(height);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
void _onHideBar() {
|
// void _onHideBar() {
|
||||||
setState(() {
|
// setState(() {
|
||||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: [SystemUiOverlay.bottom]);
|
// SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: [SystemUiOverlay.bottom]);
|
||||||
});
|
// });
|
||||||
_onButtonBarVisibleStreamController.add(false);
|
// _onButtonBarVisibleStreamController.add(false);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
Future<void> _onHangup() async {
|
// Future<void> _onHangup() async {
|
||||||
_signaling?.finishSessions();
|
// _signaling?.finishSessions();
|
||||||
print('onHangup');
|
// print('onHangup');
|
||||||
Navigator.of(context).pop();
|
// Navigator.of(context).pop();
|
||||||
}
|
// }
|
||||||
}
|
// }
|
@ -1,242 +1,242 @@
|
|||||||
import 'dart:convert';
|
// import 'dart:convert';
|
||||||
|
//
|
||||||
// import 'package:cloud_firestore/cloud_firestore.dart';
|
// // import 'package:cloud_firestore/cloud_firestore.dart';
|
||||||
import 'package:flutter_webrtc/flutter_webrtc.dart';
|
// import 'package:flutter_webrtc/flutter_webrtc.dart';
|
||||||
|
//
|
||||||
typedef void StreamStateCallback(MediaStream stream);
|
// typedef void StreamStateCallback(MediaStream stream);
|
||||||
|
//
|
||||||
class Signaling {
|
// class Signaling {
|
||||||
Map<String, dynamic> configuration = {
|
// Map<String, dynamic> configuration = {
|
||||||
'iceServers': [
|
// 'iceServers': [
|
||||||
{
|
// {
|
||||||
'urls': ['stun:stun1.l.google.com:19302', 'stun:stun2.l.google.com:19302']
|
// 'urls': ['stun:stun1.l.google.com:19302', 'stun:stun2.l.google.com:19302']
|
||||||
}
|
// }
|
||||||
]
|
// ]
|
||||||
};
|
// };
|
||||||
|
//
|
||||||
late RTCPeerConnection peerConnection;
|
// late RTCPeerConnection peerConnection;
|
||||||
late MediaStream localStream;
|
// late MediaStream localStream;
|
||||||
late MediaStream remoteStream;
|
// late MediaStream remoteStream;
|
||||||
late String roomId;
|
// late String roomId;
|
||||||
late String currentRoomText;
|
// late String currentRoomText;
|
||||||
late StreamStateCallback onAddRemoteStream;
|
// late StreamStateCallback onAddRemoteStream;
|
||||||
|
//
|
||||||
Future<String> createRoom(RTCVideoRenderer remoteRenderer) async {
|
// Future<String> createRoom(RTCVideoRenderer remoteRenderer) async {
|
||||||
// FirebaseFirestore db = FirebaseFirestore.instance;
|
// // FirebaseFirestore db = FirebaseFirestore.instance;
|
||||||
// DocumentReference roomRef = db.collection('rooms').doc();
|
// // DocumentReference roomRef = db.collection('rooms').doc();
|
||||||
|
//
|
||||||
print('Create PeerConnection with configuration: $configuration');
|
// print('Create PeerConnection with configuration: $configuration');
|
||||||
|
//
|
||||||
peerConnection = await createPeerConnection(configuration);
|
// peerConnection = await createPeerConnection(configuration);
|
||||||
|
//
|
||||||
registerPeerConnectionListeners();
|
// registerPeerConnectionListeners();
|
||||||
|
//
|
||||||
localStream.getTracks().forEach((track) {
|
// localStream.getTracks().forEach((track) {
|
||||||
peerConnection?.addTrack(track, localStream);
|
// peerConnection?.addTrack(track, localStream);
|
||||||
});
|
// });
|
||||||
|
//
|
||||||
// Code for collecting ICE candidates below
|
// // Code for collecting ICE candidates below
|
||||||
// var callerCandidatesCollection = roomRef.collection('callerCandidates');
|
// // var callerCandidatesCollection = roomRef.collection('callerCandidates');
|
||||||
|
//
|
||||||
peerConnection?.onIceCandidate = (RTCIceCandidate candidate) {
|
// peerConnection?.onIceCandidate = (RTCIceCandidate candidate) {
|
||||||
print('Got candidate: ${candidate.toMap()}');
|
// print('Got candidate: ${candidate.toMap()}');
|
||||||
// callerCandidatesCollection.add(candidate.toMap());
|
// // callerCandidatesCollection.add(candidate.toMap());
|
||||||
};
|
// };
|
||||||
// Finish Code for collecting ICE candidate
|
// // Finish Code for collecting ICE candidate
|
||||||
|
//
|
||||||
// Add code for creating a room
|
// // Add code for creating a room
|
||||||
RTCSessionDescription offer = await peerConnection.createOffer();
|
// RTCSessionDescription offer = await peerConnection.createOffer();
|
||||||
await peerConnection.setLocalDescription(offer);
|
// await peerConnection.setLocalDescription(offer);
|
||||||
print('Created offer: $offer');
|
// print('Created offer: $offer');
|
||||||
|
//
|
||||||
Map<String, dynamic> roomWithOffer = {'offer': offer.toMap()};
|
// Map<String, dynamic> roomWithOffer = {'offer': offer.toMap()};
|
||||||
|
//
|
||||||
// await roomRef.set(roomWithOffer);
|
// // await roomRef.set(roomWithOffer);
|
||||||
// var roomId = roomRef.id;
|
// // var roomId = roomRef.id;
|
||||||
print('New room created with SDK offer. Room ID: $roomId');
|
// print('New room created with SDK offer. Room ID: $roomId');
|
||||||
currentRoomText = 'Current room is $roomId - You are the caller!';
|
// currentRoomText = 'Current room is $roomId - You are the caller!';
|
||||||
// Created a Room
|
// // Created a Room
|
||||||
|
//
|
||||||
peerConnection?.onTrack = (RTCTrackEvent event) {
|
// peerConnection?.onTrack = (RTCTrackEvent event) {
|
||||||
print('Got remote track: ${event.streams[0]}');
|
// print('Got remote track: ${event.streams[0]}');
|
||||||
|
//
|
||||||
event.streams[0].getTracks().forEach((track) {
|
// event.streams[0].getTracks().forEach((track) {
|
||||||
print('Add a track to the remoteStream $track');
|
// print('Add a track to the remoteStream $track');
|
||||||
remoteStream?.addTrack(track);
|
// remoteStream?.addTrack(track);
|
||||||
});
|
// });
|
||||||
};
|
// };
|
||||||
|
//
|
||||||
// Listening for remote session description below
|
// // Listening for remote session description below
|
||||||
// roomRef.snapshots().listen((snapshot) async {
|
// // roomRef.snapshots().listen((snapshot) async {
|
||||||
// print('Got updated room: ${snapshot.data()}');
|
// // print('Got updated room: ${snapshot.data()}');
|
||||||
//
|
// //
|
||||||
// Map<String, dynamic> data = snapshot.data() as Map<String, dynamic>;
|
// // Map<String, dynamic> data = snapshot.data() as Map<String, dynamic>;
|
||||||
// if (peerConnection?.getRemoteDescription() != null && data['answer'] != null) {
|
// // if (peerConnection?.getRemoteDescription() != null && data['answer'] != null) {
|
||||||
// var answer = RTCSessionDescription(
|
// // var answer = RTCSessionDescription(
|
||||||
// data['answer']['sdp'],
|
// // data['answer']['sdp'],
|
||||||
// data['answer']['type'],
|
// // data['answer']['type'],
|
||||||
// );
|
// // );
|
||||||
//
|
// //
|
||||||
// print("Someone tried to connect");
|
// // print("Someone tried to connect");
|
||||||
// await peerConnection?.setRemoteDescription(answer);
|
// // await peerConnection?.setRemoteDescription(answer);
|
||||||
// }
|
// // }
|
||||||
// });
|
// // });
|
||||||
// // Listening for remote session description above
|
// // // Listening for remote session description above
|
||||||
//
|
// //
|
||||||
// // Listen for remote Ice candidates below
|
// // // Listen for remote Ice candidates below
|
||||||
// roomRef.collection('calleeCandidates').snapshots().listen((snapshot) {
|
// // roomRef.collection('calleeCandidates').snapshots().listen((snapshot) {
|
||||||
// snapshot.docChanges.forEach((change) {
|
// // snapshot.docChanges.forEach((change) {
|
||||||
// if (change.type == DocumentChangeType.added) {
|
// // if (change.type == DocumentChangeType.added) {
|
||||||
// Map<String, dynamic> data = change.doc.data() as Map<String, dynamic>;
|
// // Map<String, dynamic> data = change.doc.data() as Map<String, dynamic>;
|
||||||
// print('Got new remote ICE candidate: ${jsonEncode(data)}');
|
// // print('Got new remote ICE candidate: ${jsonEncode(data)}');
|
||||||
// peerConnection.addCandidate(
|
// // peerConnection.addCandidate(
|
||||||
// RTCIceCandidate(
|
// // RTCIceCandidate(
|
||||||
// data['candidate'],
|
// // data['candidate'],
|
||||||
// data['sdpMid'],
|
// // data['sdpMid'],
|
||||||
// data['sdpMLineIndex'],
|
// // data['sdpMLineIndex'],
|
||||||
// ),
|
// // ),
|
||||||
// );
|
// // );
|
||||||
// }
|
// // }
|
||||||
// });
|
// // });
|
||||||
// });
|
// // });
|
||||||
// Listen for remote ICE candidates above
|
// // Listen for remote ICE candidates above
|
||||||
|
//
|
||||||
return roomId;
|
// return roomId;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
Future<void> joinRoom(String roomId, RTCVideoRenderer remoteVideo) async {
|
// Future<void> joinRoom(String roomId, RTCVideoRenderer remoteVideo) async {
|
||||||
// FirebaseFirestore db = FirebaseFirestore.instance;
|
// // FirebaseFirestore db = FirebaseFirestore.instance;
|
||||||
// DocumentReference roomRef = db.collection('rooms').doc('$roomId');
|
// // DocumentReference roomRef = db.collection('rooms').doc('$roomId');
|
||||||
// var roomSnapshot = await roomRef.get();
|
// // var roomSnapshot = await roomRef.get();
|
||||||
// print('Got room ${roomSnapshot.exists}');
|
// // print('Got room ${roomSnapshot.exists}');
|
||||||
|
//
|
||||||
// if (roomSnapshot.exists) {
|
// // if (roomSnapshot.exists) {
|
||||||
// print('Create PeerConnection with configuration: $configuration');
|
// // print('Create PeerConnection with configuration: $configuration');
|
||||||
// peerConnection = await createPeerConnection(configuration);
|
// // peerConnection = await createPeerConnection(configuration);
|
||||||
//
|
// //
|
||||||
// registerPeerConnectionListeners();
|
// // registerPeerConnectionListeners();
|
||||||
//
|
// //
|
||||||
// localStream.getTracks().forEach((track) {
|
// // localStream.getTracks().forEach((track) {
|
||||||
// peerConnection?.addTrack(track, localStream);
|
// // peerConnection?.addTrack(track, localStream);
|
||||||
// });
|
// // });
|
||||||
//
|
// //
|
||||||
// // Code for collecting ICE candidates below
|
// // // Code for collecting ICE candidates below
|
||||||
// // var calleeCandidatesCollection = roomRef.collection('calleeCandidates');
|
// // // var calleeCandidatesCollection = roomRef.collection('calleeCandidates');
|
||||||
// peerConnection.onIceCandidate = (RTCIceCandidate candidate) {
|
// // peerConnection.onIceCandidate = (RTCIceCandidate candidate) {
|
||||||
// if (candidate == null) {
|
// // if (candidate == null) {
|
||||||
// print('onIceCandidate: complete!');
|
// // print('onIceCandidate: complete!');
|
||||||
// return;
|
// // return;
|
||||||
// }
|
// // }
|
||||||
// print('onIceCandidate: ${candidate.toMap()}');
|
// // print('onIceCandidate: ${candidate.toMap()}');
|
||||||
// // calleeCandidatesCollection.add(candidate.toMap());
|
// // // calleeCandidatesCollection.add(candidate.toMap());
|
||||||
// };
|
// // };
|
||||||
// // Code for collecting ICE candidate above
|
// // // Code for collecting ICE candidate above
|
||||||
//
|
// //
|
||||||
// peerConnection?.onTrack = (RTCTrackEvent event) {
|
// // peerConnection?.onTrack = (RTCTrackEvent event) {
|
||||||
// print('Got remote track: ${event.streams[0]}');
|
// // print('Got remote track: ${event.streams[0]}');
|
||||||
// event.streams[0].getTracks().forEach((track) {
|
// // event.streams[0].getTracks().forEach((track) {
|
||||||
// print('Add a track to the remoteStream: $track');
|
// // print('Add a track to the remoteStream: $track');
|
||||||
// remoteStream?.addTrack(track);
|
// // remoteStream?.addTrack(track);
|
||||||
// });
|
// // });
|
||||||
// };
|
// // };
|
||||||
//
|
// //
|
||||||
// // Code for creating SDP answer below
|
// // // Code for creating SDP answer below
|
||||||
// var data = roomSnapshot.data() as Map<String, dynamic>;
|
// // var data = roomSnapshot.data() as Map<String, dynamic>;
|
||||||
// print('Got offer $data');
|
// // print('Got offer $data');
|
||||||
// var offer = data['offer'];
|
// // var offer = data['offer'];
|
||||||
// await peerConnection?.setRemoteDescription(
|
// // await peerConnection?.setRemoteDescription(
|
||||||
// RTCSessionDescription(offer['sdp'], offer['type']),
|
// // RTCSessionDescription(offer['sdp'], offer['type']),
|
||||||
// );
|
// // );
|
||||||
// var answer = await peerConnection.createAnswer();
|
// // var answer = await peerConnection.createAnswer();
|
||||||
// print('Created Answer $answer');
|
// // print('Created Answer $answer');
|
||||||
//
|
// //
|
||||||
// await peerConnection.setLocalDescription(answer);
|
// // await peerConnection.setLocalDescription(answer);
|
||||||
//
|
// //
|
||||||
// Map<String, dynamic> roomWithAnswer = {
|
// // Map<String, dynamic> roomWithAnswer = {
|
||||||
// 'answer': {'type': answer.type, 'sdp': answer.sdp}
|
// // 'answer': {'type': answer.type, 'sdp': answer.sdp}
|
||||||
// };
|
// // };
|
||||||
//
|
// //
|
||||||
// await roomRef.update(roomWithAnswer);
|
// // await roomRef.update(roomWithAnswer);
|
||||||
// // Finished creating SDP answer
|
// // // Finished creating SDP answer
|
||||||
//
|
// //
|
||||||
// // Listening for remote ICE candidates below
|
// // // Listening for remote ICE candidates below
|
||||||
// // roomRef.collection('callerCandidates').snapshots().listen((snapshot) {
|
// // // roomRef.collection('callerCandidates').snapshots().listen((snapshot) {
|
||||||
// // snapshot.docChanges.forEach((document) {
|
// // // snapshot.docChanges.forEach((document) {
|
||||||
// // var data = document.doc.data() as Map<String, dynamic>;
|
// // // var data = document.doc.data() as Map<String, dynamic>;
|
||||||
// // print(data);
|
// // // print(data);
|
||||||
// // print('Got new remote ICE candidate: $data');
|
// // // print('Got new remote ICE candidate: $data');
|
||||||
// // peerConnection.addCandidate(
|
// // // peerConnection.addCandidate(
|
||||||
// // RTCIceCandidate(
|
// // // RTCIceCandidate(
|
||||||
// // data['candidate'],
|
// // // data['candidate'],
|
||||||
// // data['sdpMid'],
|
// // // data['sdpMid'],
|
||||||
// // data['sdpMLineIndex'],
|
// // // data['sdpMLineIndex'],
|
||||||
// // ),
|
// // // ),
|
||||||
// // );
|
// // // );
|
||||||
// // });
|
// // // });
|
||||||
// // });
|
// // // });
|
||||||
// }
|
// // }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
Future<void> openUserMedia(
|
// Future<void> openUserMedia(
|
||||||
RTCVideoRenderer localVideo,
|
// RTCVideoRenderer localVideo,
|
||||||
RTCVideoRenderer remoteVideo,
|
// RTCVideoRenderer remoteVideo,
|
||||||
) async {
|
// ) async {
|
||||||
var stream = await navigator.mediaDevices.getUserMedia({'video': true, 'audio': false});
|
// var stream = await navigator.mediaDevices.getUserMedia({'video': true, 'audio': false});
|
||||||
|
//
|
||||||
localVideo.srcObject = stream;
|
// localVideo.srcObject = stream;
|
||||||
localStream = stream;
|
// localStream = stream;
|
||||||
|
//
|
||||||
remoteVideo.srcObject = await createLocalMediaStream('key');
|
// remoteVideo.srcObject = await createLocalMediaStream('key');
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
Future<void> hangUp(RTCVideoRenderer localVideo) async {
|
// Future<void> hangUp(RTCVideoRenderer localVideo) async {
|
||||||
List<MediaStreamTrack> tracks = localVideo.srcObject!.getTracks();
|
// List<MediaStreamTrack> tracks = localVideo.srcObject!.getTracks();
|
||||||
tracks.forEach((track) {
|
// tracks.forEach((track) {
|
||||||
track.stop();
|
// track.stop();
|
||||||
});
|
// });
|
||||||
|
//
|
||||||
if (remoteStream != null) {
|
// if (remoteStream != null) {
|
||||||
remoteStream.getTracks().forEach((track) => track.stop());
|
// remoteStream.getTracks().forEach((track) => track.stop());
|
||||||
}
|
// }
|
||||||
if (peerConnection != null) peerConnection.close();
|
// if (peerConnection != null) peerConnection.close();
|
||||||
|
//
|
||||||
if (roomId != null) {
|
// if (roomId != null) {
|
||||||
// var db = FirebaseFirestore.instance;
|
// // var db = FirebaseFirestore.instance;
|
||||||
// var roomRef = db.collection('rooms').doc(roomId);
|
// // var roomRef = db.collection('rooms').doc(roomId);
|
||||||
// var calleeCandidates = await roomRef.collection('calleeCandidates').get();
|
// // var calleeCandidates = await roomRef.collection('calleeCandidates').get();
|
||||||
// calleeCandidates.docs.forEach((document) => document.reference.delete());
|
// // calleeCandidates.docs.forEach((document) => document.reference.delete());
|
||||||
|
//
|
||||||
// var callerCandidates = await roomRef.collection('callerCandidates').get();
|
// // var callerCandidates = await roomRef.collection('callerCandidates').get();
|
||||||
// callerCandidates.docs.forEach((document) => document.reference.delete());
|
// // callerCandidates.docs.forEach((document) => document.reference.delete());
|
||||||
|
//
|
||||||
// await roomRef.delete();
|
// // await roomRef.delete();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
localStream.dispose();
|
// localStream.dispose();
|
||||||
remoteStream?.dispose();
|
// remoteStream?.dispose();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
void registerPeerConnectionListeners() {
|
// void registerPeerConnectionListeners() {
|
||||||
peerConnection?.onIceGatheringState = (RTCIceGatheringState state) {
|
// peerConnection?.onIceGatheringState = (RTCIceGatheringState state) {
|
||||||
print('ICE gathering state changed: $state');
|
// print('ICE gathering state changed: $state');
|
||||||
};
|
// };
|
||||||
|
//
|
||||||
peerConnection?.onConnectionState = (RTCPeerConnectionState state) {
|
// peerConnection?.onConnectionState = (RTCPeerConnectionState state) {
|
||||||
print('Connection state change: $state');
|
// print('Connection state change: $state');
|
||||||
};
|
// };
|
||||||
|
//
|
||||||
peerConnection?.onSignalingState = (RTCSignalingState state) {
|
// peerConnection?.onSignalingState = (RTCSignalingState state) {
|
||||||
print('Signaling state change: $state');
|
// print('Signaling state change: $state');
|
||||||
};
|
// };
|
||||||
|
//
|
||||||
peerConnection?.onIceGatheringState = (RTCIceGatheringState state) {
|
// peerConnection?.onIceGatheringState = (RTCIceGatheringState state) {
|
||||||
print('ICE connection state change: $state');
|
// print('ICE connection state change: $state');
|
||||||
};
|
// };
|
||||||
|
//
|
||||||
peerConnection?.onAddStream = (MediaStream stream) {
|
// peerConnection?.onAddStream = (MediaStream stream) {
|
||||||
print("Add remote stream");
|
// print("Add remote stream");
|
||||||
onAddRemoteStream?.call(stream);
|
// onAddRemoteStream?.call(stream);
|
||||||
remoteStream = stream;
|
// remoteStream = stream;
|
||||||
};
|
// };
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
Loading…
Reference in New Issue