[Android]: Improve files management and connection (#18)

This commit is contained in:
Kseniia Nikitina
2024-10-16 21:00:30 +02:00
committed by GitHub
parent 897997e770
commit 1d31e4d4b1
2 changed files with 53 additions and 34 deletions
@@ -9,11 +9,12 @@ class FileSocketsManager {
final _filesSockets = <String, FilesSocket>{}; final _filesSockets = <String, FilesSocket>{};
final _serverWaitingRequests = <String, HttpRequest>{}; final _serverWaitingRequests = <String, HttpRequest>{};
final _cachedFilesRequests = <NearbyMessageFilesRequest>[];
final _socketCreationFutures = <String, Future>{};
NearbyServiceFilesListener? _filesListener; NearbyServiceFilesListener? _filesListener;
NearbyDeviceInfo? _sender; NearbyDeviceInfo? _sender;
NearbyMessageFilesRequest? _cachedFilesRequest;
Future? _socketCreationFuture;
var _connectionData = const NearbyAndroidCommunicationChannelData(); var _connectionData = const NearbyAndroidCommunicationChannelData();
void setListener(NearbyServiceFilesListener? listener) { void setListener(NearbyServiceFilesListener? listener) {
@@ -55,31 +56,35 @@ class FileSocketsManager {
content is NearbyMessageFilesResponse && content.isAccepted; content is NearbyMessageFilesResponse && content.isAccepted;
if (isRequest) { if (isRequest) {
_cachedFilesRequest = content; _cachedFilesRequests.add(content);
Logger.debug('Files pack request ${content.id} was cached'); Logger.debug('Files pack request ${content.id} was cached');
} }
final cachedRequest = _cachedFilesRequests
.where(
(e) => e.id == content.id,
)
.firstOrNull;
if (!socketExists) { if (!socketExists) {
final info = await _service.getConnectionInfo(); final info = await _service.getConnectionInfo();
if (info != null && info.groupFormed) { if (info != null && info.groupFormed) {
if (info.isGroupOwner) { if (info.isGroupOwner) {
if (isPositiveResponse && _cachedFilesRequest != null) { if (isPositiveResponse && cachedRequest != null) {
_socketCreationFuture = _startFilesServerSocket( _socketCreationFutures[content.id] = _startFilesServerSocket(
_cachedFilesRequest!, cachedRequest,
); );
} }
} else { } else {
NearbyMessageFilesRequest? request; NearbyMessageFilesRequest? request;
if (!isReceived && if (!isReceived && isPositiveResponse && cachedRequest != null) {
isPositiveResponse && request = cachedRequest;
_cachedFilesRequest != null) {
request = _cachedFilesRequest!;
} else if (isRequest) { } else if (isRequest) {
request = content; request = content;
} }
if (request != null) { if (request != null) {
_socketCreationFuture = _connectToFilesSocket( _socketCreationFutures[content.id] = _connectToFilesSocket(
request, request,
ownerIpAddress: info.ownerIpAddress, ownerIpAddress: info.ownerIpAddress,
); );
@@ -88,12 +93,12 @@ class FileSocketsManager {
} }
} }
if (isReceived && isPositiveResponse && _cachedFilesRequest != null) { if (isReceived && isPositiveResponse && cachedRequest != null) {
await _socketCreationFuture?.whenComplete( await _socketCreationFutures[content.id]?.whenComplete(
() async { () async {
await _startDataTransfer(_cachedFilesRequest!); await _startDataTransfer(cachedRequest);
_socketCreationFuture = null; _socketCreationFutures.remove(content.id);
_cachedFilesRequest = null; _cachedFilesRequests.remove(cachedRequest);
}, },
); );
} }
@@ -105,8 +110,8 @@ class FileSocketsManager {
} }
_filesSockets.clear(); _filesSockets.clear();
_filesListener = null; _filesListener = null;
_cachedFilesRequest = null; _cachedFilesRequests.clear();
_socketCreationFuture = null; _socketCreationFutures.clear();
} }
Future<void> _connectToFilesSocket( Future<void> _connectToFilesSocket(
@@ -162,6 +167,11 @@ class FileSocketsManager {
if (result) { if (result) {
_serverWaitingRequests.remove(filesRequest.id); _serverWaitingRequests.remove(filesRequest.id);
} }
} else {
await Future.delayed(
_connectionData.clientReconnectInterval,
() => _startFilesServerSocket(filesRequest),
);
} }
} }
@@ -86,8 +86,12 @@ class NearbySocketService {
); );
return true; 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)) { if (await _pingManager.checkPong(response)) {
_socket = await _network.connectToSocket( try {
ownerIpAddress: info.ownerIpAddress, _socket = await _network.connectToSocket(
port: _androidData.port, ownerIpAddress: info.ownerIpAddress,
socketType: NearbySocketType.message, 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,
); );
}); _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,
);
});
} }
} }