diff --git a/app/src/main/java/org/kiwix/kiwixmobile/localFileTransfer/ReceiverHandShake.kt b/app/src/main/java/org/kiwix/kiwixmobile/localFileTransfer/ReceiverHandShake.kt index aaa6bec03..ba12dc54c 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/localFileTransfer/ReceiverHandShake.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/localFileTransfer/ReceiverHandShake.kt @@ -45,7 +45,7 @@ class ReceiverHandShake(private val wifiDirectManager: WifiDirectManager, groupI FileItem(fileName = fileName) } } - wifiDirectManager.setFilesForTransfer(fileItems.toList()) + wifiDirectManager.setFilesForTransfer(fileItems) } } } catch (e: Exception) { diff --git a/app/src/main/java/org/kiwix/kiwixmobile/localFileTransfer/SenderDevice.kt b/app/src/main/java/org/kiwix/kiwixmobile/localFileTransfer/SenderDevice.kt index 5e0ab9327..112167b63 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/localFileTransfer/SenderDevice.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/localFileTransfer/SenderDevice.kt @@ -47,14 +47,13 @@ import java.net.Socket private const val TIME_OUT = 15000 internal class SenderDevice( - activity: Activity, + var activity: Activity, private val wifiDirectManager: WifiDirectManager, - val fileReceiverDeviceAddress: InetAddress + private val fileReceiverDeviceAddress: InetAddress ) { - private val contentResolver: ContentResolver = activity.contentResolver - private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO - suspend fun send(fileItems: List) = withContext(ioDispatcher) { - delayForSlowReceiverDevicesToSetupServer() + suspend fun send(fileItems: List) = withContext(Dispatchers.IO) { + // Delay trying to connect with receiver, to allow slow receiver devices to setup server + delay(FOR_SLOW_RECEIVER) val hostAddress = fileReceiverDeviceAddress.hostAddress var isTransferErrorFree = true @@ -63,7 +62,7 @@ internal class SenderDevice( .forEachIndexed { fileIndex, fileItem -> try { Socket().use { socket -> - contentResolver.openInputStream(fileItem?.fileUri!!).use { fileInputStream -> + activity.contentResolver.openInputStream(fileItem?.fileUri!!).use { fileInputStream -> socket.bind(null) socket.connect( InetSocketAddress(hostAddress, WifiDirectManager.FILE_TRANSFER_PORT), @@ -85,7 +84,7 @@ internal class SenderDevice( } } - return@withContext isTransferErrorFree + isTransferErrorFree } private suspend fun publishProgress(fileIndex: Int, fileStatus: FileItem.FileStatus) { @@ -94,13 +93,8 @@ internal class SenderDevice( } } - @SuppressWarnings("MagicNumber") - private suspend fun delayForSlowReceiverDevicesToSetupServer() { - // Delay trying to connect with receiver, to allow slow receiver devices to setup server - delay(3000) - } - companion object { private const val TAG = "SenderDeviceAsyncTask" + private const val FOR_SLOW_RECEIVER: Long = 3000 } } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/localFileTransfer/WifiDirectManager.kt b/app/src/main/java/org/kiwix/kiwixmobile/localFileTransfer/WifiDirectManager.kt index dafbe8398..213c2511d 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/localFileTransfer/WifiDirectManager.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/localFileTransfer/WifiDirectManager.kt @@ -219,11 +219,11 @@ class WifiDirectManager @Inject constructor( Log.d(TAG, "Starting handshake") } lifecycleCoroutineScope.launch { - val peerGroupHandshake = if (isFileSender) { + val peerGroupHandshake = if (isFileSender) SenderHandShake(this@WifiDirectManager, groupInfo) - } else { + else ReceiverHandShake(this@WifiDirectManager, groupInfo) - } + val inetAddress = peerGroupHandshake.handshake() if (inetAddress != null) { startFileTransfer(groupInfo, inetAddress) @@ -248,7 +248,7 @@ class WifiDirectManager @Inject constructor( val zimStorageRootPath get() = sharedPreferenceUtil.prefStorage + "/Kiwix/" - private fun startFileTransfer(groupInfo: WifiP2pInfo, inetAddress: InetAddress) { + private suspend fun startFileTransfer(groupInfo: WifiP2pInfo, inetAddress: InetAddress) { if (groupInfo.groupFormed) { if (isFileSender) { Log.d(LocalFileTransferFragment.TAG, "Starting file transfer") @@ -256,22 +256,18 @@ class WifiDirectManager @Inject constructor( if (groupInfo.isGroupOwner) inetAddress else groupInfo.groupOwnerAddress activity.toast(R.string.preparing_files, Toast.LENGTH_LONG) val senderDevice = SenderDevice(activity, this, fileReceiverDeviceAddress) - lifecycleCoroutineScope.launch { - val isFileSendSuccessfully = senderDevice.send(filesForTransfer) - onFileTransferAsyncTaskComplete(isFileSendSuccessfully) - if (BuildConfig.DEBUG) { - Log.d(TAG, "SenderDevice completed $isFileSendSuccessfully") - } + val isFileSendSuccessfully = senderDevice.send(filesForTransfer) + onFileTransferAsyncTaskComplete(isFileSendSuccessfully) + if (BuildConfig.DEBUG) { + Log.d(TAG, "SenderDevice completed $isFileSendSuccessfully") } } else { callbacks?.onFilesForTransferAvailable(filesForTransfer) val receiverDevice = ReceiverDevice(this) - lifecycleCoroutineScope.launch { - val isReceivedFileSuccessFully = receiverDevice.receive() - onFileTransferAsyncTaskComplete(isReceivedFileSuccessFully) - if (BuildConfig.DEBUG) { - Log.d(TAG, "ReceiverDevice completed $isReceivedFileSuccessFully") - } + val isReceivedFileSuccessFully = receiverDevice.receive() + onFileTransferAsyncTaskComplete(isReceivedFileSuccessFully) + if (BuildConfig.DEBUG) { + Log.d(TAG, "ReceiverDevice completed $isReceivedFileSuccessFully") } } }