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 447b3da8b..1cb2b09b2 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 @@ -29,6 +29,7 @@ import kotlinx.coroutines.withContext import org.linphone.core.ChatMessage import org.linphone.core.Content import org.linphone.core.tools.Log +import org.linphone.utils.AppUtils import org.linphone.utils.FileUtils import org.linphone.utils.ImageUtils @@ -39,8 +40,13 @@ class ChatMessageContentViewModel( ) : ViewModel() { val isImage = MutableLiveData() val isVideo = MutableLiveData() + val isAudio = MutableLiveData() val videoPreview = MutableLiveData() + val fileName = MutableLiveData() + + val fileSize = MutableLiveData() + val downloadable = MutableLiveData() val downloadEnabled = MutableLiveData() @@ -57,6 +63,13 @@ class ChatMessageContentViewModel( } init { + fileName.value = if (content.name.isNullOrEmpty() && !content.filePath.isNullOrEmpty()) { + FileUtils.getNameFromFilePath(content.filePath!!) + } else { + content.name + } + fileSize.value = AppUtils.bytesToDisplayableSize(content.fileSize.toLong()) + if (content.isFile || (content.isFileTransfer && chatMessage.isOutgoing)) { val filePath = content.filePath ?: "" downloadable.value = filePath.isEmpty() @@ -65,6 +78,7 @@ class ChatMessageContentViewModel( Log.i("[Content] Found displayable content: $filePath") isImage.value = FileUtils.isExtensionImage(filePath) isVideo.value = FileUtils.isExtensionVideo(filePath) + isAudio.value = FileUtils.isExtensionAudio(filePath) if (isVideo.value == true) { viewModelScope.launch { @@ -77,6 +91,7 @@ class ChatMessageContentViewModel( Log.w("[Content] Found content with empty path...") isImage.value = false isVideo.value = false + isAudio.value = false } } else { if (chatMessage.isFileTransferInProgress) { @@ -89,6 +104,7 @@ class ChatMessageContentViewModel( downloadable.value = true isImage.value = false isVideo.value = false + isAudio.value = false } } diff --git a/app/src/main/java/org/linphone/utils/AppUtils.kt b/app/src/main/java/org/linphone/utils/AppUtils.kt index f646ab75a..89f072e28 100644 --- a/app/src/main/java/org/linphone/utils/AppUtils.kt +++ b/app/src/main/java/org/linphone/utils/AppUtils.kt @@ -21,6 +21,7 @@ package org.linphone.utils import android.app.Activity import android.content.* +import android.text.format.Formatter.formatShortFileSize import android.util.TypedValue import androidx.emoji.text.EmojiCompat import java.util.* @@ -79,6 +80,10 @@ class AppUtils { ) } + fun bytesToDisplayableSize(bytes: Long): String { + return formatShortFileSize(coreContext.context, bytes) + } + fun shareUploadedLogsUrl(activity: Activity, info: String) { val appName = activity.getString(R.string.app_name) val intent = Intent(Intent.ACTION_SEND) diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index bdac98df0..ae80027f1 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -137,6 +137,13 @@ fun setLayoutToLeftOf(view: View, oldTargetId: Int, newTargetId: Int) { view.layoutParams = layoutParams } +@BindingAdapter("android:layout_gravity") +fun setLayoutGravity(view: View, gravity: Int) { + val layoutParams = view.layoutParams as LinearLayout.LayoutParams + layoutParams.gravity = gravity + view.layoutParams = layoutParams +} + @BindingAdapter("layout_constraintGuide_percent") fun setLayoutConstraintGuidePercent(guideline: Guideline, percent: Float) { val params = guideline.layoutParams as ConstraintLayout.LayoutParams diff --git a/app/src/main/java/org/linphone/utils/FileUtils.kt b/app/src/main/java/org/linphone/utils/FileUtils.kt index 590a0d841..20635f276 100644 --- a/app/src/main/java/org/linphone/utils/FileUtils.kt +++ b/app/src/main/java/org/linphone/utils/FileUtils.kt @@ -71,6 +71,12 @@ class FileUtils { return type?.startsWith("video/") ?: false } + fun isExtensionAudio(path: String): Boolean { + val extension = getExtensionFromFileName(path).toLowerCase(Locale.getDefault()) + val type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) + return type?.startsWith("audio/") ?: false + } + fun getFileStorageDir(isPicture: Boolean = false): File { var path: File? = null if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) { diff --git a/app/src/main/res/drawable-xhdpi/audio.png b/app/src/main/res/drawable-xhdpi/audio.png new file mode 100644 index 000000000..472ae2bff Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/audio.png differ 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 86f5fcd20..1bb821108 100644 --- a/app/src/main/res/layout/chat_message_content_cell.xml +++ b/app/src/main/res/layout/chat_message_content_cell.xml @@ -47,43 +47,83 @@ android:layout_centerInParent="true"/> - - + android:padding="10dp" + android:gravity="center_vertical" + android:text="@{data.fileName}" + android:onClick="@{() -> data.openFile()}" + android:onLongClick="@{longClickListener}" + android:visibility="@{data.downloadable || data.image || data.video || !data.alone ? View.GONE : View.VISIBLE, default=gone}" + android:drawablePadding="10dp" + app:drawableTint="@color/dark_grey_color" + android:drawableLeft="@{data.isAudio ? @drawable/audio : @drawable/file}"/> + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/chat_message_list_cell.xml b/app/src/main/res/layout/chat_message_list_cell.xml index 29ad6e347..74bbd7a82 100644 --- a/app/src/main/res/layout/chat_message_list_cell.xml +++ b/app/src/main/res/layout/chat_message_list_cell.xml @@ -6,6 +6,7 @@ + @@ -126,7 +127,7 @@ app:layout="@{@layout/chat_message_content_cell}" app:onLongClick="@{contextMenuClickListener}" app:flexWrap="wrap" - app:justifyContent="center"/> + app:justifyContent="@{viewModel.chatMessage.outgoing ? JustifyContent.FLEX_END : JustifyContent.FLEX_START}"/> 18sp + + + + +