From 1d31e4d4b1d667eb6a2c03602ddf7d6ccefadf36 Mon Sep 17 00:00:00 2001 From: Kseniia Nikitina Date: Wed, 16 Oct 2024 21:00:30 +0200 Subject: [PATCH] [Android]: Improve files management and connection (#18) --- .../socket_service/file_sockets_manager.dart | 46 +++++++++++-------- .../socket_service/nearby_socket_service.dart | 41 ++++++++++------- 2 files changed, 53 insertions(+), 34 deletions(-) diff --git a/lib/src/platforms/android/socket_service/file_sockets_manager.dart b/lib/src/platforms/android/socket_service/file_sockets_manager.dart index 7623d80..6218f38 100644 --- a/lib/src/platforms/android/socket_service/file_sockets_manager.dart +++ b/lib/src/platforms/android/socket_service/file_sockets_manager.dart @@ -9,11 +9,12 @@ class FileSocketsManager { final _filesSockets = {}; final _serverWaitingRequests = {}; + final _cachedFilesRequests = []; + final _socketCreationFutures = {}; NearbyServiceFilesListener? _filesListener; NearbyDeviceInfo? _sender; - NearbyMessageFilesRequest? _cachedFilesRequest; - Future? _socketCreationFuture; + var _connectionData = const NearbyAndroidCommunicationChannelData(); void setListener(NearbyServiceFilesListener? listener) { @@ -55,31 +56,35 @@ class FileSocketsManager { content is NearbyMessageFilesResponse && content.isAccepted; if (isRequest) { - _cachedFilesRequest = content; + _cachedFilesRequests.add(content); Logger.debug('Files pack request ${content.id} was cached'); } + final cachedRequest = _cachedFilesRequests + .where( + (e) => e.id == content.id, + ) + .firstOrNull; + if (!socketExists) { final info = await _service.getConnectionInfo(); if (info != null && info.groupFormed) { if (info.isGroupOwner) { - if (isPositiveResponse && _cachedFilesRequest != null) { - _socketCreationFuture = _startFilesServerSocket( - _cachedFilesRequest!, + if (isPositiveResponse && cachedRequest != null) { + _socketCreationFutures[content.id] = _startFilesServerSocket( + cachedRequest, ); } } else { NearbyMessageFilesRequest? request; - if (!isReceived && - isPositiveResponse && - _cachedFilesRequest != null) { - request = _cachedFilesRequest!; + if (!isReceived && isPositiveResponse && cachedRequest != null) { + request = cachedRequest; } else if (isRequest) { request = content; } if (request != null) { - _socketCreationFuture = _connectToFilesSocket( + _socketCreationFutures[content.id] = _connectToFilesSocket( request, ownerIpAddress: info.ownerIpAddress, ); @@ -88,12 +93,12 @@ class FileSocketsManager { } } - if (isReceived && isPositiveResponse && _cachedFilesRequest != null) { - await _socketCreationFuture?.whenComplete( + if (isReceived && isPositiveResponse && cachedRequest != null) { + await _socketCreationFutures[content.id]?.whenComplete( () async { - await _startDataTransfer(_cachedFilesRequest!); - _socketCreationFuture = null; - _cachedFilesRequest = null; + await _startDataTransfer(cachedRequest); + _socketCreationFutures.remove(content.id); + _cachedFilesRequests.remove(cachedRequest); }, ); } @@ -105,8 +110,8 @@ class FileSocketsManager { } _filesSockets.clear(); _filesListener = null; - _cachedFilesRequest = null; - _socketCreationFuture = null; + _cachedFilesRequests.clear(); + _socketCreationFutures.clear(); } Future _connectToFilesSocket( @@ -162,6 +167,11 @@ class FileSocketsManager { if (result) { _serverWaitingRequests.remove(filesRequest.id); } + } else { + await Future.delayed( + _connectionData.clientReconnectInterval, + () => _startFilesServerSocket(filesRequest), + ); } } diff --git a/lib/src/platforms/android/socket_service/nearby_socket_service.dart b/lib/src/platforms/android/socket_service/nearby_socket_service.dart index 283eb94..0baf637 100644 --- a/lib/src/platforms/android/socket_service/nearby_socket_service.dart +++ b/lib/src/platforms/android/socket_service/nearby_socket_service.dart @@ -86,8 +86,12 @@ class NearbySocketService { ); return true; } + } else { + Future.delayed(data.androidData.clientReconnectInterval, () { + startSocket(data: data); + }); + return false; } - return false; } /// @@ -149,23 +153,28 @@ class NearbySocketService { ); if (await _pingManager.checkPong(response)) { - _socket = await _network.connectToSocket( - ownerIpAddress: info.ownerIpAddress, - port: _androidData.port, - socketType: NearbySocketType.message, - ); - _createSocketSubscription(socketListener); - } else { - Logger.debug( - 'Retry to connect to the server in ${_androidData.clientReconnectInterval.inSeconds}s', - ); - Future.delayed(_androidData.clientReconnectInterval, () { - _tryConnectClient( - socketListener: socketListener, - info: info, + try { + _socket = await _network.connectToSocket( + ownerIpAddress: info.ownerIpAddress, + port: _androidData.port, + socketType: NearbySocketType.message, ); - }); + _createSocketSubscription(socketListener); + return; + } catch (e) { + Logger.error(e); + } } + + Logger.debug( + 'Retry to connect to the server in ${_androidData.clientReconnectInterval.inSeconds}s', + ); + Future.delayed(_androidData.clientReconnectInterval, () { + _tryConnectClient( + socketListener: socketListener, + info: info, + ); + }); } }