Skip to content

Commit ca7605b

Browse files
authored
Merge pull request #176 from baihua666/baihua_dev
Add accept and reject call example
2 parents 26f5bc6 + 7206a98 commit ca7605b

File tree

4 files changed

+116
-7
lines changed

4 files changed

+116
-7
lines changed

lib/src/call_sample/call_sample.dart

Lines changed: 90 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class _CallSampleState extends State<CallSample> {
2121
bool _inCalling = false;
2222
Session? _session;
2323

24+
bool _waitAccept = false;
25+
2426
// ignore: unused_element
2527
_CallSampleState();
2628

@@ -55,15 +57,31 @@ class _CallSampleState extends State<CallSample> {
5557
}
5658
};
5759

58-
_signaling?.onCallStateChange = (Session session, CallState state) {
60+
_signaling?.onCallStateChange = (Session session, CallState state) async {
5961
switch (state) {
6062
case CallState.CallStateNew:
6163
setState(() {
6264
_session = session;
63-
_inCalling = true;
6465
});
6566
break;
67+
case CallState.CallStateRinging:
68+
bool? accept = await _showAcceptDialog();
69+
if (accept!) {
70+
_accept();
71+
setState(() {
72+
_inCalling = true;
73+
});
74+
}
75+
else {
76+
_reject();
77+
}
78+
break;
6679
case CallState.CallStateBye:
80+
if (_waitAccept) {
81+
print('peer reject');
82+
_waitAccept = false;
83+
Navigator.of(context).pop(false);
84+
}
6785
setState(() {
6886
_localRenderer.srcObject = null;
6987
_remoteRenderer.srcObject = null;
@@ -72,7 +90,19 @@ class _CallSampleState extends State<CallSample> {
7290
});
7391
break;
7492
case CallState.CallStateInvite:
93+
_waitAccept = true;
94+
_showInvateDialog();
95+
break;
7596
case CallState.CallStateConnected:
97+
if (_waitAccept) {
98+
_waitAccept = false;
99+
Navigator.of(context).pop(false);
100+
}
101+
setState(() {
102+
_inCalling = true;
103+
});
104+
105+
break;
76106
case CallState.CallStateRinging:
77107
}
78108
};
@@ -97,12 +127,70 @@ class _CallSampleState extends State<CallSample> {
97127
});
98128
}
99129

130+
Future<bool?> _showAcceptDialog() {
131+
return showDialog<bool?>(
132+
context: context,
133+
builder: (context) {
134+
return AlertDialog(
135+
title: Text("title"),
136+
content: Text("accept?"),
137+
actions: <Widget>[
138+
TextButton(
139+
child: Text("reject"),
140+
onPressed: () => Navigator.of(context).pop(false),
141+
),
142+
TextButton(
143+
child: Text("accept"),
144+
onPressed: () {
145+
Navigator.of(context).pop(true);
146+
},
147+
),
148+
],
149+
);
150+
},
151+
);
152+
}
153+
154+
Future<bool?> _showInvateDialog() {
155+
return showDialog<bool?>(
156+
context: context,
157+
builder: (context) {
158+
return AlertDialog(
159+
title: Text("title"),
160+
content: Text("waiting"),
161+
actions: <Widget>[
162+
TextButton(
163+
child: Text("cancel"),
164+
onPressed: () {
165+
Navigator.of(context).pop(false);
166+
_hangUp();
167+
},
168+
169+
),
170+
],
171+
);
172+
},
173+
);
174+
}
175+
100176
_invitePeer(BuildContext context, String peerId, bool useScreen) async {
101177
if (_signaling != null && peerId != _selfId) {
102178
_signaling?.invite(peerId, 'video', useScreen);
103179
}
104180
}
105181

182+
_accept() {
183+
if (_session != null) {
184+
_signaling?.accept(_session!.sid);
185+
}
186+
}
187+
188+
_reject() {
189+
if (_session != null) {
190+
_signaling?.reject(_session!.sid);
191+
}
192+
}
193+
106194
_hangUp() {
107195
if (_session != null) {
108196
_signaling?.bye(_session!.sid);

lib/src/call_sample/signaling.dart

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ class Signaling {
120120
}
121121
_createOffer(session, media);
122122
onCallStateChange?.call(session, CallState.CallStateNew);
123+
onCallStateChange?.call(session, CallState.CallStateInvite);
123124
}
124125

125126
void bye(String sessionId) {
@@ -133,6 +134,22 @@ class Signaling {
133134
}
134135
}
135136

137+
void accept(String sessionId) {
138+
var session = _sessions[sessionId];
139+
if (session == null) {
140+
return;
141+
}
142+
_createAnswer(session, 'video');
143+
}
144+
145+
void reject(String sessionId) {
146+
var session = _sessions[sessionId];
147+
if (session == null) {
148+
return;
149+
}
150+
bye(session.sid);
151+
}
152+
136153
void onMessage(message) async {
137154
Map<String, dynamic> mapData = message;
138155
var data = mapData['data'];
@@ -164,14 +181,17 @@ class Signaling {
164181
_sessions[sessionId] = newSession;
165182
await newSession.pc?.setRemoteDescription(
166183
RTCSessionDescription(description['sdp'], description['type']));
167-
await _createAnswer(newSession, media);
184+
// await _createAnswer(newSession, media);
185+
168186
if (newSession.remoteCandidates.length > 0) {
169187
newSession.remoteCandidates.forEach((candidate) async {
170188
await newSession.pc?.addCandidate(candidate);
171189
});
172190
newSession.remoteCandidates.clear();
173191
}
174192
onCallStateChange?.call(newSession, CallState.CallStateNew);
193+
194+
onCallStateChange?.call(newSession, CallState.CallStateRinging);
175195
}
176196
break;
177197
case 'answer':
@@ -181,6 +201,7 @@ class Signaling {
181201
var session = _sessions[sessionId];
182202
session?.pc?.setRemoteDescription(
183203
RTCSessionDescription(description['sdp'], description['type']));
204+
onCallStateChange?.call(session!, CallState.CallStateConnected);
184205
}
185206
break;
186207
case 'candidate':
@@ -274,7 +295,7 @@ class Signaling {
274295
onMessage(_decoder.convert(message));
275296
};
276297

277-
_socket?.onClose = (int code, String reason) {
298+
_socket?.onClose = (int? code, String? reason) {
278299
print('Closed by server [$code => $reason]!');
279300
onSignalingStateChange?.call(SignalingState.ConnectionClosed);
280301
};
@@ -399,7 +420,7 @@ class Signaling {
399420
'to': peerId,
400421
'from': _selfId,
401422
'candidate': {
402-
'sdpMLineIndex': candidate.sdpMlineIndex,
423+
'sdpMLineIndex': candidate.sdpMLineIndex,
403424
'sdpMid': candidate.sdpMid,
404425
'candidate': candidate.candidate,
405426
},

lib/src/utils/websocket.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class SimpleWebSocket {
88
var _socket;
99
Function()? onOpen;
1010
Function(dynamic msg)? onMessage;
11-
Function(int code, String reaso)? onClose;
11+
Function(int? code, String? reaso)? onClose;
1212
SimpleWebSocket(this._url);
1313

1414
connect() async {

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ dependencies:
1111
sdk: flutter
1212

1313
cupertino_icons: ^1.0.3
14-
flutter_webrtc: ^0.7.0+hotfix.1
14+
flutter_webrtc: ^0.8.3
1515
shared_preferences: ^2.0.7
1616
http: ^0.13.3
1717
path_provider: ^2.0.2

0 commit comments

Comments
 (0)