diff --git a/lib/src/call_sample/call_sample.dart b/lib/src/call_sample/call_sample.dart index d0a289b..fac35f2 100644 --- a/lib/src/call_sample/call_sample.dart +++ b/lib/src/call_sample/call_sample.dart @@ -186,7 +186,7 @@ class _CallSampleState extends State { _accept() { if (_session != null) { - _signaling?.accept(_session!.sid); + _signaling?.accept(_session!.sid, 'video'); } } diff --git a/lib/src/call_sample/data_channel_sample.dart b/lib/src/call_sample/data_channel_sample.dart index aaca560..e9bb883 100644 --- a/lib/src/call_sample/data_channel_sample.dart +++ b/lib/src/call_sample/data_channel_sample.dart @@ -25,6 +25,7 @@ class _DataChannelSampleState extends State { var _text = ''; // ignore: unused_element _DataChannelSampleState(); + bool _waitAccept = false; @override initState() { @@ -39,6 +40,55 @@ class _DataChannelSampleState extends State { _timer?.cancel(); } + Future _showAcceptDialog() { + return showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text("title"), + content: Text("accept?"), + actions: [ + MaterialButton( + child: Text( + 'Reject', + style: TextStyle(color: Colors.red), + ), + onPressed: () => Navigator.of(context).pop(false), + ), + MaterialButton( + child: Text( + 'Accept', + style: TextStyle(color: Colors.green), + ), + onPressed: () => Navigator.of(context).pop(true), + ), + ], + ); + }, + ); + } + + Future _showInvateDialog() { + return showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text("title"), + content: Text("waiting"), + actions: [ + TextButton( + child: Text("cancel"), + onPressed: () { + Navigator.of(context).pop(false); + _hangUp(); + }, + ), + ], + ); + }, + ); + } + void _connect(BuildContext context) async { _signaling ??= Signaling(widget.host, context)..connect(); @@ -65,33 +115,54 @@ class _DataChannelSampleState extends State { } }; - _signaling?.onCallStateChange = (Session session, CallState state) { + _signaling?.onCallStateChange = (Session session, CallState state) async { switch (state) { case CallState.CallStateNew: - { - setState(() { - _session = session; - _inCalling = true; - }); - _timer = - Timer.periodic(Duration(seconds: 1), _handleDataChannelTest); - break; - } + setState(() { + _session = session; + }); + _timer = Timer.periodic(Duration(seconds: 1), _handleDataChannelTest); + break; case CallState.CallStateBye: - { - setState(() { - _inCalling = false; - }); - _timer?.cancel(); - _dataChannel = null; - _inCalling = false; - _session = null; - _text = ''; - break; + if (_waitAccept) { + print('peer reject'); + _waitAccept = false; + Navigator.of(context).pop(false); } + setState(() { + _inCalling = false; + }); + _timer?.cancel(); + _dataChannel = null; + _inCalling = false; + _session = null; + _text = ''; + break; case CallState.CallStateInvite: + _waitAccept = true; + _showInvateDialog(); + break; case CallState.CallStateConnected: + if (_waitAccept) { + _waitAccept = false; + Navigator.of(context).pop(false); + } + setState(() { + _inCalling = true; + }); + break; case CallState.CallStateRinging: + bool? accept = await _showAcceptDialog(); + if (accept!) { + _accept(); + setState(() { + _inCalling = true; + }); + } else { + _reject(); + } + + break; } }; @@ -117,6 +188,18 @@ class _DataChannelSampleState extends State { } } + _accept() { + if (_session != null) { + _signaling?.accept(_session!.sid, 'data'); + } + } + + _reject() { + if (_session != null) { + _signaling?.reject(_session!.sid); + } + } + _hangUp() { _signaling?.bye(_session!.sid); } diff --git a/lib/src/call_sample/signaling.dart b/lib/src/call_sample/signaling.dart index f375889..abbaf6b 100644 --- a/lib/src/call_sample/signaling.dart +++ b/lib/src/call_sample/signaling.dart @@ -165,12 +165,12 @@ class Signaling { } } - void accept(String sessionId) { + void accept(String sessionId, String media) { var session = _sessions[sessionId]; if (session == null) { return; } - _createAnswer(session, 'video'); + _createAnswer(session, media); } void reject(String sessionId) {