diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageModel.kt index dd63e4618..97d11495d 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageModel.kt @@ -53,6 +53,7 @@ import org.linphone.ui.main.contacts.model.ContactAvatarModel import org.linphone.utils.AppUtils import org.linphone.utils.AudioRouteUtils import org.linphone.utils.Event +import org.linphone.utils.FileUtils import org.linphone.utils.LinphoneUtils import org.linphone.utils.PatternClickableSpan import org.linphone.utils.SpannableClickedListener @@ -95,7 +96,7 @@ class ChatMessageModel @WorkerThread constructor( val reactions = MutableLiveData() - val imagesList = MutableLiveData>() + val filesList = MutableLiveData>() val firstImage = MutableLiveData() @@ -178,7 +179,7 @@ class ChatMessageModel @WorkerThread constructor( var displayableContentFound = false var filesContentCount = 0 - val imagesPath = arrayListOf() + val filesPath = arrayListOf() val contents = chatMessage.contents for (content in contents) { @@ -198,10 +199,10 @@ class ChatMessageModel @WorkerThread constructor( ) when (content.type) { "image", "video" -> { - val fileModel = FileModel(path) { file -> + val fileModel = FileModel(path, "") { file -> onContentClicked?.invoke(file) } - imagesPath.add(fileModel) + filesPath.add(fileModel) if (filesContentCount == 1) { firstImage.postValue(fileModel) @@ -222,6 +223,15 @@ class ChatMessageModel @WorkerThread constructor( displayableContentFound = true } else -> { + val size = FileUtils.bytesToDisplayableSize( + content.fileSize.toLong() + ) + val fileModel = FileModel(path, size) { file -> + onContentClicked?.invoke(file) + } + filesPath.add(fileModel) + + displayableContentFound = true } } } else { @@ -234,7 +244,7 @@ class ChatMessageModel @WorkerThread constructor( } } - imagesList.postValue(imagesPath) + filesList.postValue(filesPath) if (!displayableContentFound) { // Temporary workaround to prevent empty bubbles val describe = LinphoneUtils.getTextDescribingMessage(chatMessage) diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/FileModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/FileModel.kt index c6ba76f64..529d72f3d 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/FileModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/FileModel.kt @@ -9,6 +9,7 @@ import org.linphone.utils.FileUtils class FileModel @AnyThread constructor( val file: String, + val fileSize: String, private val onClicked: ((file: String) -> Unit)? = null ) { companion object { @@ -21,12 +22,22 @@ class FileModel @AnyThread constructor( val mimeType: FileUtils.MimeType + val isImage: Boolean + + val isVideoPreview: Boolean + + val isPdf: Boolean + init { path.postValue(file) val extension = FileUtils.getExtensionFromFileName(file) + isPdf = extension == "pdf" + val mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) mimeType = FileUtils.getMimeType(mime) + isImage = mimeType == FileUtils.MimeType.Image + isVideoPreview = mimeType == FileUtils.MimeType.Video } @UiThread diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt index 4fb642d72..f5892ae8a 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt @@ -300,7 +300,7 @@ class SendMessageInConversationViewModel @UiThread constructor() : ViewModel() { fun addAttachment(file: String) { val list = arrayListOf() list.addAll(attachments.value.orEmpty()) - val model = FileModel(file) { file -> + val model = FileModel(file, "") { file -> removeAttachment(file) } list.add(model) diff --git a/app/src/main/java/org/linphone/utils/FileUtils.kt b/app/src/main/java/org/linphone/utils/FileUtils.kt index 7bbcc6447..a0102336c 100644 --- a/app/src/main/java/org/linphone/utils/FileUtils.kt +++ b/app/src/main/java/org/linphone/utils/FileUtils.kt @@ -27,6 +27,7 @@ import android.os.ParcelFileDescriptor import android.os.Process import android.provider.OpenableColumns import android.system.Os +import android.text.format.Formatter import android.webkit.MimeTypeMap import androidx.annotation.AnyThread import java.io.File @@ -52,6 +53,11 @@ class FileUtils { companion object { private const val TAG = "[File Utils]" + @AnyThread + fun bytesToDisplayableSize(bytes: Long): String { + return Formatter.formatShortFileSize(coreContext.context, bytes) + } + @AnyThread fun isExtensionVideo(path: String): Boolean { val extension = getExtensionFromFileName(path) diff --git a/app/src/main/res/drawable/file.xml b/app/src/main/res/drawable/file.xml new file mode 100644 index 000000000..6595d615d --- /dev/null +++ b/app/src/main/res/drawable/file.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/file_pdf.xml b/app/src/main/res/drawable/file_pdf.xml new file mode 100644 index 000000000..7e7bf3d29 --- /dev/null +++ b/app/src/main/res/drawable/file_pdf.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/shape_squircle_main2_200_left.xml b/app/src/main/res/drawable/shape_squircle_main2_200_left.xml new file mode 100644 index 000000000..6d29d89f8 --- /dev/null +++ b/app/src/main/res/drawable/shape_squircle_main2_200_left.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_squircle_white_right.xml b/app/src/main/res/drawable/shape_squircle_white_right.xml new file mode 100644 index 000000000..b686ccd82 --- /dev/null +++ b/app/src/main/res/drawable/shape_squircle_white_right.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/chat_bubble_content_grid_cell.xml b/app/src/main/res/layout/chat_bubble_content_grid_cell.xml index abf8b2f52..3c99c7a07 100644 --- a/app/src/main/res/layout/chat_bubble_content_grid_cell.xml +++ b/app/src/main/res/layout/chat_bubble_content_grid_cell.xml @@ -1,5 +1,6 @@ - + @@ -8,13 +9,101 @@ type="org.linphone.ui.main.chat.model.FileModel" /> - + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/chat_bubble_incoming.xml b/app/src/main/res/layout/chat_bubble_incoming.xml index a7c228bcc..532d0be00 100644 --- a/app/src/main/res/layout/chat_bubble_incoming.xml +++ b/app/src/main/res/layout/chat_bubble_incoming.xml @@ -145,15 +145,15 @@ app:layout_constraintStart_toEndOf="@id/avatar"> 30sp 88dp 150dp + 151dp 271dp 271dp 271dp