From b3ebaae360e423fb2f30a40b4ec2b874c91a2f57 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 28 Jan 2021 16:12:05 +0100 Subject: [PATCH] Added download progress bar + prevent downloading more than one content/message simultaneously --- .../viewmodels/ChatMessageContentViewModel.kt | 33 +++++++++++++++---- .../res/layout/chat_message_content_cell.xml | 14 +++++++- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageContentViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageContentViewModel.kt index 1cb2b09b2..c5cd9c185 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageContentViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageContentViewModel.kt @@ -27,6 +27,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.linphone.core.ChatMessage +import org.linphone.core.ChatMessageListenerStub import org.linphone.core.Content import org.linphone.core.tools.Log import org.linphone.utils.AppUtils @@ -51,6 +52,8 @@ class ChatMessageContentViewModel( val downloadEnabled = MutableLiveData() + val downloadProgress = MutableLiveData() + val isAlone: Boolean get() { var count = 0 @@ -62,6 +65,25 @@ class ChatMessageContentViewModel( return count == 1 } + private val chatMessageListener: ChatMessageListenerStub = object : ChatMessageListenerStub() { + override fun onFileTransferProgressIndication( + message: ChatMessage, + c: Content, + offset: Int, + total: Int + ) { + val percent = offset * 100 / total + if (!c.filePath.isNullOrEmpty() && !content.filePath.isNullOrEmpty() && c.filePath == content.filePath) { + Log.d("[Content] Download progress is: $offset / $total ($percent%)") + downloadProgress.postValue(percent) + } + } + + override fun onMsgStateChanged(message: ChatMessage, state: ChatMessage.State) { + downloadEnabled.postValue(chatMessage.state != ChatMessage.State.FileTransferInProgress) + } + } + init { fileName.value = if (content.name.isNullOrEmpty() && !content.filePath.isNullOrEmpty()) { FileUtils.getNameFromFilePath(content.filePath!!) @@ -94,18 +116,15 @@ class ChatMessageContentViewModel( isAudio.value = false } } else { - if (chatMessage.isFileTransferInProgress) { - Log.i("[Content] Found content currently being downloaded: ${content.name}") - downloadEnabled.value = false - } else { - Log.i("[Content] Found downloadable content: ${content.name}") - downloadEnabled.value = true - } downloadable.value = true isImage.value = false isVideo.value = false isAudio.value = false } + + downloadEnabled.value = !chatMessage.isFileTransferInProgress + downloadProgress.value = 0 + chatMessage.addListener(chatMessageListener) } fun download() { diff --git a/app/src/main/res/layout/chat_message_content_cell.xml b/app/src/main/res/layout/chat_message_content_cell.xml index 1bb821108..0a5f6de92 100644 --- a/app/src/main/res/layout/chat_message_content_cell.xml +++ b/app/src/main/res/layout/chat_message_content_cell.xml @@ -86,6 +86,7 @@ android:orientation="horizontal" android:gravity="center" android:background="@drawable/resizable_assistant_button" + android:layout_margin="5dp" android:visibility="@{data.downloadable ? View.VISIBLE : View.GONE}" android:onClick="@{() -> data.download()}" android:onLongClick="@{longClickListener}" @@ -119,7 +120,18 @@ android:layout_height="wrap_content" android:textColor="@drawable/assistant_button_text_color" android:layout_marginTop="5dp" - android:ellipsize="end" /> + android:ellipsize="end" + android:visibility="@{data.downloadEnabled ? View.VISIBLE : View.GONE}" /> + +