From e7e3db60b44b143230aabccd95034db6b137a9ee Mon Sep 17 00:00:00 2001 From: Hardcore Sushi Date: Wed, 5 May 2021 18:07:38 +0200 Subject: [PATCH] Handling null Uri when selecting file & Prevent double large file transfer --- app/src/main/AndroidManifest.xml | 4 +-- .../java/sushi/hardcore/aira/ChatActivity.kt | 25 ++++++++++++------- .../aira/background_service/AIRAService.kt | 14 +++++++---- app/src/main/res/values/strings.xml | 1 + 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f3436ba..ae4f9ea 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,9 +28,7 @@ - + diff --git a/app/src/main/java/sushi/hardcore/aira/ChatActivity.kt b/app/src/main/java/sushi/hardcore/aira/ChatActivity.kt index a121892..d7f7e3a 100644 --- a/app/src/main/java/sushi/hardcore/aira/ChatActivity.kt +++ b/app/src/main/java/sushi/hardcore/aira/ChatActivity.kt @@ -23,6 +23,7 @@ import sushi.hardcore.aira.databinding.DialogFingerprintsBinding import sushi.hardcore.aira.databinding.DialogInfoBinding import sushi.hardcore.aira.utils.FileUtils import sushi.hardcore.aira.utils.StringUtils +import java.io.FileNotFoundException import java.util.* class ChatActivity : AppCompatActivity() { @@ -39,15 +40,19 @@ class ChatActivity : AppCompatActivity() { if (::airaService.isInitialized && uri != null) { contentResolver.query(uri, null, null, null, null)?.let { cursor -> if (cursor.moveToFirst()) { - contentResolver.openInputStream(uri)?.let { inputStream -> - val fileName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)) - val fileSize = cursor.getLong(cursor.getColumnIndex(OpenableColumns.SIZE)) - airaService.sendFileTo(sessionId, fileName, fileSize, inputStream)?.let { msg -> - chatAdapter.newMessage(ChatItem(true, msg)) - } - if (airaService.contacts.contains(sessionId)) { - lastLoadedMessageOffset += 1 + try { + contentResolver.openInputStream(uri)?.let { inputStream -> + val fileName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)) + val fileSize = cursor.getLong(cursor.getColumnIndex(OpenableColumns.SIZE)) + airaService.sendFileTo(sessionId, fileName, fileSize, inputStream)?.let { msg -> + chatAdapter.newMessage(ChatItem(true, msg)) + } + if (airaService.contacts.contains(sessionId)) { + lastLoadedMessageOffset += 1 + } } + } catch (e: FileNotFoundException) { + Toast.makeText(this, e.localizedMessage, Toast.LENGTH_SHORT).show() } } cursor.close() @@ -70,7 +75,9 @@ class ChatActivity : AppCompatActivity() { chatAdapter = ChatAdapter(this@ChatActivity, ::onClickSaveFile) binding.recyclerChat.apply { adapter = chatAdapter - layoutManager = LinearLayoutManager(this@ChatActivity, LinearLayoutManager.VERTICAL, false) + layoutManager = LinearLayoutManager(this@ChatActivity, LinearLayoutManager.VERTICAL, false).apply { + stackFromEnd = true + } addOnScrollListener(object : RecyclerView.OnScrollListener() { fun loadMsgsIfNeeded(recyclerView: RecyclerView) { if (!recyclerView.canScrollVertically(-1) && ::airaService.isInitialized) { diff --git a/app/src/main/java/sushi/hardcore/aira/background_service/AIRAService.kt b/app/src/main/java/sushi/hardcore/aira/background_service/AIRAService.kt index e808229..420963b 100644 --- a/app/src/main/java/sushi/hardcore/aira/background_service/AIRAService.kt +++ b/app/src/main/java/sushi/hardcore/aira/background_service/AIRAService.kt @@ -8,6 +8,7 @@ import android.net.nsd.NsdServiceInfo import android.os.* import android.os.Process.THREAD_PRIORITY_BACKGROUND import android.util.Log +import android.widget.Toast import androidx.annotation.RequiresApi import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat @@ -16,7 +17,6 @@ import sushi.hardcore.aira.* import java.io.IOException import java.io.InputStream import java.net.* -import java.nio.ByteBuffer import java.nio.channels.* class AIRAService : Service() { @@ -143,10 +143,14 @@ class AIRAService : Service() { return msg } } else { - val fileTransfer = SendFileTransfer(fileName, fileSize, inputStream) - sendFileTransfers[sessionId] = fileTransfer - createFileTransferNotification(sessionId, fileTransfer) - sendTo(sessionId, Protocol.askLargeFile(fileSize, fileName)) + if (sendFileTransfers[sessionId] == null && receiveFileTransfers[sessionId] == null) { + val fileTransfer = SendFileTransfer(fileName, fileSize, inputStream) + sendFileTransfers[sessionId] = fileTransfer + createFileTransferNotification(sessionId, fileTransfer) + sendTo(sessionId, Protocol.askLargeFile(fileSize, fileName)) + } else { + Toast.makeText(this, R.string.file_transfer_already_in_progress, Toast.LENGTH_SHORT).show() + } } return null } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2f87cbf..1468a70 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -71,4 +71,5 @@ Remove contact Details Your IP addresses: + Another file transfer is already in progress