1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2025-02-16 21:52:38 +00:00

Close remote peer connections on exit

This commit is contained in:
Pierre HUBERT 2020-04-20 17:47:51 +02:00
parent e05323c3bb
commit ee6509bb9a
2 changed files with 21 additions and 5 deletions

View File

@ -118,6 +118,8 @@ class _CallScreenState extends SafeState<CallScreen> {
// Connect to ready peers // Connect to ready peers
for (final peer in _membersList.readyPeers) for (final peer in _membersList.readyPeers)
await this._memberReady(peer.userID); await this._memberReady(peer.userID);
setState(() {});
} catch (e, stack) { } catch (e, stack) {
print("Could not initialize call! $e\n$stack"); print("Could not initialize call! $e\n$stack");
setState(() => _error = true); setState(() => _error = true);
@ -129,6 +131,10 @@ class _CallScreenState extends SafeState<CallScreen> {
try { try {
// Leave the call // Leave the call
await CallsHelper.leave(convID); await CallsHelper.leave(convID);
// Close all ready members
for (final member in _membersList.readyPeers)
await _removeMember(member.userID);
} catch (e, stack) { } catch (e, stack) {
print("Could not end call properly! $e\n$stack"); print("Could not end call properly! $e\n$stack");
} }
@ -205,16 +211,22 @@ class _CallScreenState extends SafeState<CallScreen> {
} }
/// Call this when a user has interrupted streaming /// Call this when a user has interrupted streaming
void _removeRemotePeerConnection(int memberID) { Future<void> _removeRemotePeerConnection(int memberID) async {
_membersList.getUser(memberID).status = MemberStatus.JOINED; _membersList.getUser(memberID).status = MemberStatus.JOINED;
setState(() {}); setState(() {});
if (_peersConnections.containsKey(memberID)) {
await _peersConnections[memberID].close();
_peersConnections.remove(memberID);
}
} }
/// Call this when a members has completely left the call /// Call this when a member has completely left the call
void _removeMember(int memberID) { Future<void> _removeMember(int memberID) async {
_removeRemotePeerConnection(memberID); await _removeRemotePeerConnection(memberID);
_membersList.removeUser(memberID); _membersList.removeUser(memberID);
setState(() {}); setState(() {});
} }

View File

@ -10,8 +10,12 @@ import 'package:flutter/material.dart';
abstract class SafeState<T extends StatefulWidget> extends State<T> { abstract class SafeState<T extends StatefulWidget> extends State<T> {
final _subscriptions = List<StreamSubscription>(); final _subscriptions = List<StreamSubscription>();
bool _unmounted = false;
@override @override
void dispose() { void dispose() {
_unmounted = true;
// Close subscriptions // Close subscriptions
_subscriptions.forEach((f) => f.cancel()); _subscriptions.forEach((f) => f.cancel());
@ -20,7 +24,7 @@ abstract class SafeState<T extends StatefulWidget> extends State<T> {
@override @override
void setState(fn) { void setState(fn) {
if (mounted) super.setState(fn); if (mounted && !_unmounted) super.setState(fn);
} }
/// Register to a new subscription /// Register to a new subscription