From 9a4600196a1a480dccaeb6d0bd10349187c32290 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 1 Jun 2021 12:02:02 +0200 Subject: [PATCH] Improved contents update in file transfer chat message --- .../main/chat/data/ChatMessageContentData.kt | 102 +++++++++--------- .../main/chat/data/ChatMessageData.kt | 17 +-- .../viewmodels/ContactsListViewModel.kt | 6 +- 3 files changed, 66 insertions(+), 59 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageContentData.kt b/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageContentData.kt index 9583929fe..fa7f90922 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageContentData.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageContentData.kt @@ -36,8 +36,8 @@ import org.linphone.utils.FileUtils import org.linphone.utils.ImageUtils class ChatMessageContentData( - val content: Content, private val chatMessage: ChatMessage, + private val contentIndex: Int, private val listener: OnContentClickedListener? ) { val isImage = MutableLiveData() @@ -68,6 +68,9 @@ class ChatMessageContentData( return count == 1 } + var isFileEncrypted: Boolean = false + private lateinit var content: Content + private val chatMessageListener: ChatMessageListenerStub = object : ChatMessageListenerStub() { override fun onFileTransferProgressIndication( message: ChatMessage, @@ -75,31 +78,67 @@ class ChatMessageContentData( offset: Int, total: Int ) { - if (message == chatMessage) { - if (c.filePath == content.filePath) { - val percent = offset * 100 / total - Log.d("[Content] Download progress is: $offset / $total ($percent%)") - downloadProgressInt.postValue(percent) - downloadProgressString.postValue("$percent%") - } + if (c.filePath == content.filePath) { + val percent = offset * 100 / total + Log.d("[Content] Download progress is: $offset / $total ($percent%)") + + downloadProgressInt.value = percent + downloadProgressString.value = "$percent%" } } override fun onMsgStateChanged(message: ChatMessage, state: ChatMessage.State) { - downloadEnabled.postValue(chatMessage.state != ChatMessage.State.FileTransferInProgress) - if (message == chatMessage) { - if (state == ChatMessage.State.FileTransferDone || state == ChatMessage.State.FileTransferError) { - downloadProgressInt.value = 0 - } + downloadEnabled.value = state != ChatMessage.State.FileTransferInProgress + + if (state == ChatMessage.State.FileTransferDone || state == ChatMessage.State.FileTransferError) { + updateContent() } } } - private val isEncrypted = content.isFileEncrypted - private val scope = CoroutineScope(Dispatchers.Main + SupervisorJob()) init { + updateContent() + chatMessage.addListener(chatMessageListener) + } + + fun destroy() { + scope.cancel() + + val path = filePath.value.orEmpty() + if (path.isNotEmpty() && isFileEncrypted) { + Log.i("[Content] Deleting file used for preview: $path") + FileUtils.deleteFile(path) + filePath.value = "" + } + + chatMessage.removeListener(chatMessageListener) + } + + fun download() { + val filePath = content.filePath + if (content.isFileTransfer && (filePath == null || filePath.isEmpty())) { + val contentName = content.name + if (contentName != null) { + val file = FileUtils.getFileStoragePath(contentName) + content.filePath = file.path + downloadEnabled.value = false + + Log.i("[Content] Started downloading $contentName into ${content.filePath}") + chatMessage.downloadContent(content) + } + } + } + + fun openFile() { + listener?.onContentClicked(content) + } + + private fun updateContent() { + content = chatMessage.contents[contentIndex] + isFileEncrypted = content.isFileEncrypted + filePath.value = "" fileName.value = if (content.name.isNullOrEmpty() && !content.filePath.isNullOrEmpty()) { FileUtils.getNameFromFilePath(content.filePath!!) @@ -151,39 +190,6 @@ class ChatMessageContentData( downloadEnabled.value = !chatMessage.isFileTransferInProgress downloadProgressInt.value = 0 downloadProgressString.value = "0%" - chatMessage.addListener(chatMessageListener) - } - - fun destroy() { - scope.cancel() - - val path = filePath.value.orEmpty() - if (path.isNotEmpty() && isEncrypted) { - Log.i("[Content] Deleting file used for preview: $path") - FileUtils.deleteFile(path) - filePath.value = "" - } - - chatMessage.removeListener(chatMessageListener) - } - - fun download() { - val filePath = content.filePath - if (content.isFileTransfer && (filePath == null || filePath.isEmpty())) { - val contentName = content.name - if (contentName != null) { - val file = FileUtils.getFileStoragePath(contentName) - content.filePath = file.path - downloadEnabled.value = false - - Log.i("[Content] Started downloading $contentName into ${content.filePath}") - chatMessage.downloadContent(content) - } - } - } - - fun openFile() { - listener?.onContentClicked(content) } } diff --git a/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageData.kt b/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageData.kt index 638820a10..f51b43557 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageData.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageData.kt @@ -67,12 +67,11 @@ class ChatMessageData( time.value = TimestampUtils.toString(chatMessage.time) updateChatMessageState(state) - // TODO FIXME : find a way to refresh outgoing message downloaded - if (state == ChatMessage.State.FileTransferDone && !message.isOutgoing) { + if (state == ChatMessage.State.FileTransferDone) { Log.i("[Chat Message] File transfer done") - updateContentsList() - - coreContext.exportFilesInMessageToMediaStore(message) + if (!message.isOutgoing) { + coreContext.exportFilesInMessageToMediaStore(message) + } } } @@ -150,11 +149,13 @@ class ChatMessageData( private fun updateContentsList() { contents.value.orEmpty().forEach(ChatMessageContentData::destroy) - val list = arrayListOf() - for (content in chatMessage.contents) { + + val contentsList = chatMessage.contents + for (index in 0 until contentsList.size) { + val content = contentsList[index] if (content.isFileTransfer || content.isFile) { - list.add(ChatMessageContentData(content, chatMessage, contentListener)) + list.add(ChatMessageContentData(chatMessage, index, contentListener)) } else if (content.isText) { val spannable = Spannable.Factory.getInstance().newSpannable(content.utf8Text) LinkifyCompat.addLinks(spannable, Linkify.WEB_URLS) diff --git a/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactsListViewModel.kt b/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactsListViewModel.kt index 80926d131..b4d4f5450 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactsListViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactsListViewModel.kt @@ -56,7 +56,7 @@ class ContactsListViewModel : ViewModel() { super.onCleared() } - private fun getContactsList(): ArrayList { + private fun getSelectedContactsList(): ArrayList { return if (sipContactsSelected.value == true) coreContext.contactsManager.sipContacts else coreContext.contactsManager.contacts } @@ -65,11 +65,11 @@ class ContactsListViewModel : ViewModel() { val filterValue = filter.value.orEmpty() list = if (filterValue.isNotEmpty()) { - getContactsList().filter { contact -> + getSelectedContactsList().filter { contact -> contact.fullName?.contains(filterValue, true) ?: false } as ArrayList } else { - getContactsList() + getSelectedContactsList() } // Prevent blinking items when list hasn't changed