1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2024-10-23 06:53:23 +00:00

Handles peer ready & peer destroyed streams events

This commit is contained in:
Pierre HUBERT 2020-04-20 14:58:23 +02:00
parent 0f99e807f8
commit 99ecc399ee
5 changed files with 61 additions and 6 deletions

View File

@ -86,6 +86,22 @@ class UserLeftCallEvent {
UserLeftCallEvent(this.callID, this.userID); UserLeftCallEvent(this.callID, this.userID);
} }
/// Call peer ready event
class CallPeerReadyEvent {
final int callID;
final int peerID;
CallPeerReadyEvent(this.callID, this.peerID);
}
/// Call peer interrupted streaming event
class CallPeerInterruptedStreamingEvent {
final int callID;
final int peerID;
CallPeerInterruptedStreamingEvent(this.callID, this.peerID);
}
/// Call closed event /// Call closed event
class CallClosedEvent { class CallClosedEvent {
final int callID; final int callID;

View File

@ -26,7 +26,6 @@ class WebSocketHelper {
} }
/// Get WebSocket access token /// Get WebSocket access token
//TODO : Handles the case user tokens were destroyed (auto sign-out user)
static Future<String> _getWsToken() async => static Future<String> _getWsToken() async =>
(await APIRequest(uri: "ws/token", needLogin: true).exec()) (await APIRequest(uri: "ws/token", needLogin: true).exec())
.assertOk() .assertOk()
@ -173,7 +172,19 @@ class WebSocketHelper {
UserLeftCallEvent(msg.data["callID"], msg.data["userID"])); UserLeftCallEvent(msg.data["callID"], msg.data["userID"]));
break; break;
// The call has been close // Call peer ready event
case "call_peer_ready":
EventsHelper.emit(
CallPeerReadyEvent(msg.data["callID"], msg.data["peerID"]));
break;
// Call peer interrupted streaming event
case "call_peer_interrupted_streaming":
EventsHelper.emit(CallPeerInterruptedStreamingEvent(
msg.data["callID"], msg.data["peerID"]));
break;
// The call has been closed
case "call_closed": case "call_closed":
EventsHelper.emit(CallClosedEvent(msg.data)); EventsHelper.emit(CallClosedEvent(msg.data));
break; break;

View File

@ -11,4 +11,7 @@ class CallMembersList extends AbstractList<CallMember> {
/// Remove a specific member from this list /// Remove a specific member from this list
void removeUser(int userID) => this.removeWhere((f) => f.id == userID); void removeUser(int userID) => this.removeWhere((f) => f.id == userID);
/// Get the connection of a specific user
CallMember getUser(int userID) => this.firstWhere((f) => f.id == userID);
} }

View File

@ -8,9 +8,9 @@ enum MemberStatus { JOINED, READY }
class CallMember { class CallMember {
final int id; final int id;
final MemberStatus status; MemberStatus status;
const CallMember({ CallMember({
@required this.id, @required this.id,
this.status = MemberStatus.JOINED, this.status = MemberStatus.JOINED,
}) : assert(id != null), }) : assert(id != null),

View File

@ -82,6 +82,7 @@ class _CallScreenState extends SafeState<CallScreen> {
// Register to events // Register to events
this.listenChangeState<UserJoinedCallEvent>((e) { this.listenChangeState<UserJoinedCallEvent>((e) {
// TODO : get user information if required
if (e.callID == convID) _membersList.add(CallMember(id: e.userID)); if (e.callID == convID) _membersList.add(CallMember(id: e.userID));
}); });
@ -89,6 +90,14 @@ class _CallScreenState extends SafeState<CallScreen> {
if (e.callID == convID) _removeMember(e.userID); if (e.callID == convID) _removeMember(e.userID);
}); });
this.listen<CallPeerReadyEvent>((e) {
if (e.callID == convID) _memberReady(e.peerID);
});
this.listen<CallPeerInterruptedStreamingEvent>((e) {
if (e.callID == convID) _removeRemotePeerConnection(e.peerID);
});
this.listen<CallClosedEvent>((e) { this.listen<CallClosedEvent>((e) {
if (e.callID == convID) _leaveCall(needConfirm: false); if (e.callID == convID) _leaveCall(needConfirm: false);
}); });
@ -98,7 +107,7 @@ class _CallScreenState extends SafeState<CallScreen> {
} }
} }
// Do clean up operations when call screen is destroyed /// Do clean up operations when call screen is destroyed
void _endCall() async { void _endCall() async {
try { try {
// Leave the call // Leave the call
@ -108,7 +117,7 @@ class _CallScreenState extends SafeState<CallScreen> {
} }
} }
// Make us leave the call /// Make us leave the call
void _leaveCall({bool needConfirm = true}) async { void _leaveCall({bool needConfirm = true}) async {
if (needConfirm && if (needConfirm &&
!await showConfirmDialog( !await showConfirmDialog(
@ -118,7 +127,23 @@ class _CallScreenState extends SafeState<CallScreen> {
MainController.of(context).popPage(); MainController.of(context).popPage();
} }
/// Call this when a user started to stream media
void _memberReady(int memberID) {
_membersList.getUser(memberID).status = MemberStatus.READY;
setState((){});
}
/// Call this when a user has interrupted streaming
void _removeRemotePeerConnection(int memberID) {
_membersList.getUser(memberID).status = MemberStatus.JOINED;
setState((){});
}
/// Call this when a members has completely left the call
void _removeMember(int memberID) { void _removeMember(int memberID) {
_removeRemotePeerConnection(memberID);
_membersList.removeUser(memberID); _membersList.removeUser(memberID);
setState(() {}); setState(() {});
} }