[Android]: Improve files management and connection (#18)
This commit is contained in:
@@ -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,
|
||||||
|
);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user