mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-11-04 04:04:18 +00:00 
			
		
		
		
	Close remote peer connections on exit
This commit is contained in:
		@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user