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:
parent
e05323c3bb
commit
ee6509bb9a
@ -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(() {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user