diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt index ff2cb199e..eb1f7fc9f 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt @@ -86,10 +86,6 @@ class MessageModel @WorkerThread constructor( val isInError = chatMessage.state == ChatMessage.State.NotDelivered - val statusIcon = MutableLiveData() - - val text = MutableLiveData() - val timestamp = chatMessage.time val time = TimestampUtils.toString(timestamp) @@ -100,11 +96,15 @@ class MessageModel @WorkerThread constructor( val groupedWithPreviousMessage = MutableLiveData() + val statusIcon = MutableLiveData() + + val text = MutableLiveData() + val reactions = MutableLiveData() val filesList = MutableLiveData>() - val firstImage = MutableLiveData() + val firstImagePath = MutableLiveData() val isSelected = MutableLiveData() @@ -164,7 +164,7 @@ class MessageModel @WorkerThread constructor( override fun onMsgStateChanged(message: ChatMessage, messageState: ChatMessage.State?) { statusIcon.postValue(LinphoneUtils.getChatIconResId(chatMessage.state)) - if (messageState == ChatMessage.State.FileTransferDone) { + if (messageState == ChatMessage.State.FileTransferDone && !message.isOutgoing) { Log.i("$TAG File transfer is done") downloadingFileModel?.downloadProgress?.postValue(-1) downloadingFileModel = null @@ -279,9 +279,18 @@ class MessageModel @WorkerThread constructor( } } + @UiThread + fun firstImageClicked() { + filesList.value.orEmpty().firstOrNull()?.onClick() + } + @WorkerThread private fun computeContentsList() { Log.d("$TAG Computing message contents list") + text.postValue(Spannable.Factory.getInstance().newSpannable("")) + filesList.postValue(arrayListOf()) + firstImagePath.postValue("") + var displayableContentFound = false var filesContentCount = 0 val filesPath = arrayListOf() @@ -295,8 +304,8 @@ class MessageModel @WorkerThread constructor( computeTextContent(content) displayableContentFound = true } else { - filesContentCount += 1 if (content.isFile) { + filesContentCount += 1 val path = content.filePath ?: "" if (path.isNotEmpty()) { Log.d( @@ -310,7 +319,7 @@ class MessageModel @WorkerThread constructor( filesPath.add(fileModel) if (filesContentCount == 1) { - firstImage.postValue(fileModel) + firstImagePath.postValue(path) } displayableContentFound = true @@ -340,6 +349,7 @@ class MessageModel @WorkerThread constructor( Log.e("$TAG No path found for File Content!") } } else if (content.isFileTransfer) { + filesContentCount += 1 val name = content.name ?: "" if (name.isNotEmpty()) { val fileModel = FileModel(name, content.fileSize.toLong(), true) { model -> @@ -472,7 +482,7 @@ class MessageModel @WorkerThread constructor( override fun onSpanClicked(text: String) { coreContext.postOnCoreThread { Log.i("$TAG Clicked on SIP URI: $text") - val address = coreContext.core.interpretUrl(text) + val address = coreContext.core.interpretUrl(text, false) if (address != null) { coreContext.startCall(address) } else { diff --git a/app/src/main/res/layout/chat_bubble_incoming.xml b/app/src/main/res/layout/chat_bubble_incoming.xml index 80287921d..0a9812d8d 100644 --- a/app/src/main/res/layout/chat_bubble_incoming.xml +++ b/app/src/main/res/layout/chat_bubble_incoming.xml @@ -150,7 +150,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:onLongClick="@{onLongClickListener}" - android:visibility="@{model.filesList.size() >= 2 || (model.filesList.size() >= 1 && model.firstImage.path.length() == 0) ? View.VISIBLE : View.GONE, default=gone}" + android:visibility="@{model.filesList.size() >= 2 || (model.filesList.size() >= 1 && model.firstImagePath.length() == 0) ? View.VISIBLE : View.GONE, default=gone}" app:alignItems="center" app:flexWrap="wrap" app:justifyContent="@{model.outgoing ? JustifyContent.FLEX_END : JustifyContent.FLEX_START}" @@ -159,15 +159,15 @@ + android:visibility="@{model.filesList.size() == 1 && model.firstImagePath.length() >= 0 ? View.VISIBLE : View.GONE}" + coilBubble="@{model.firstImagePath}"/>/> + android:visibility="@{model.filesList.size() == 1 && model.firstImagePath.length() >= 0 ? View.VISIBLE : View.GONE}" + coilBubble="@{model.firstImagePath}"/>