From 83dc8a7b13a70643648ab1eabe6d4571419f57ff Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 25 May 2023 11:10:24 +0200 Subject: [PATCH] Improved MIME type related code --- .../chat/data/ChatMessageAttachmentData.kt | 9 +-- .../main/chat/data/ChatMessageContentData.kt | 59 +++++++++++-------- .../chat/fragments/DetailChatRoomFragment.kt | 31 +++++----- .../main/files/fragments/TopBarFragment.kt | 8 +-- .../java/org/linphone/core/CoreContext.kt | 8 +-- .../org/linphone/utils/DataBindingUtils.kt | 2 +- .../main/java/org/linphone/utils/FileUtils.kt | 45 +++++++------- 7 files changed, 84 insertions(+), 78 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageAttachmentData.kt b/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageAttachmentData.kt index caa0a4f5c..fc66b68a5 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageAttachmentData.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageAttachmentData.kt @@ -35,10 +35,11 @@ class ChatMessageAttachmentData( init { val extension = FileUtils.getExtensionFromFileName(path) val mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) - isImage = FileUtils.isMimeImage(mime) - isVideo = FileUtils.isMimeVideo(mime) - isAudio = FileUtils.isMimeAudio(mime) - isPdf = FileUtils.isMimePdf(mime) + val mimeType = FileUtils.getMimeType(mime) + isImage = mimeType == FileUtils.MimeType.Image + isVideo = mimeType == FileUtils.MimeType.Video + isAudio = mimeType == FileUtils.MimeType.Audio + isPdf = mimeType == FileUtils.MimeType.Pdf } fun delete() { 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 eb028b38a..6428c7706 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 @@ -275,18 +275,26 @@ class ChatMessageContentData( filePath.value = path val extension = FileUtils.getExtensionFromFileName(path) val mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) - isImage.value = FileUtils.isMimeImage(mime) - isVideo.value = FileUtils.isMimeVideo(mime) && !isVoiceRecord - isAudio.value = FileUtils.isMimeAudio(mime) && !isVoiceRecord - isPdf.value = FileUtils.isMimePdf(mime) - val type = when { - isImage.value == true -> "image" - isVideo.value == true -> "video" - isAudio.value == true -> "audio" - isPdf.value == true -> "pdf" - isVoiceRecord -> "voice recording" - isConferenceIcs -> "conference invitation" - else -> "unknown" + val type = when (FileUtils.getMimeType(mime)) { + FileUtils.MimeType.Image -> { + isImage.value = true + "image" + } + FileUtils.MimeType.Video -> { + isVideo.value = !isVoiceRecord + if (isVoiceRecord) "voice recording" else "video" + } + FileUtils.MimeType.Audio -> { + isAudio.value = !isVoiceRecord + if (isVoiceRecord) "voice recording" else "audio" + } + FileUtils.MimeType.Pdf -> { + isPdf.value = true + "pdf" + } + else -> { + if (isConferenceIcs) "conference invitation" else "unknown" + } } Log.i( "[Content] Extension for file [$path] is [$extension], deduced type from MIME is [$type]" @@ -311,23 +319,26 @@ class ChatMessageContentData( Log.w( "[Content] Found ${if (content.isFile) "file" else "file transfer"} content with empty path..." ) - isImage.value = false - isVideo.value = false - isAudio.value = false - isPdf.value = false - isVoiceRecording.value = false - isConferenceSchedule.value = false } } else if (content.isFileTransfer) { downloadable.value = true val extension = FileUtils.getExtensionFromFileName(fileName.value!!) val mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) - isImage.value = FileUtils.isMimeImage(mime) - isVideo.value = FileUtils.isMimeVideo(mime) - isAudio.value = FileUtils.isMimeAudio(mime) - isPdf.value = FileUtils.isMimePdf(mime) - isVoiceRecording.value = false - isConferenceSchedule.value = false + when (FileUtils.getMimeType(mime)) { + FileUtils.MimeType.Image -> { + isImage.value = true + } + FileUtils.MimeType.Video -> { + isVideo.value = true + } + FileUtils.MimeType.Audio -> { + isAudio.value = true + } + FileUtils.MimeType.Pdf -> { + isPdf.value = true + } + else -> {} + } } else if (content.isIcalendar) { Log.i("[Content] Found content with icalendar body") isConferenceSchedule.value = true diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt index 060dc4413..76269e963 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt @@ -478,8 +478,8 @@ class DetailChatRoomFragment : MasterFragment navigateToImageFileViewer( + when (FileUtils.getMimeType(mime)) { + FileUtils.MimeType.Image -> navigateToImageFileViewer( preventScreenshots ) - FileUtils.isMimeVideo(mime) -> navigateToVideoFileViewer( + FileUtils.MimeType.Video -> navigateToVideoFileViewer( preventScreenshots ) - FileUtils.isMimeAudio(mime) -> navigateToAudioFileViewer( + FileUtils.MimeType.Audio -> navigateToAudioFileViewer( preventScreenshots ) - FileUtils.isMimePdf(mime) -> navigateToPdfFileViewer( + FileUtils.MimeType.Pdf -> navigateToPdfFileViewer( preventScreenshots ) - FileUtils.isMimePlainText(mime) -> navigateToTextFileViewer( + FileUtils.MimeType.PlainText -> navigateToTextFileViewer( preventScreenshots ) else -> { @@ -584,9 +584,9 @@ class DetailChatRoomFragment : MasterFragment - var index = 0 - var retryCount = 0 - var expectedChildCount = 0 + var index: Int + var loadSteps = 0 + var expectedChildCount: Int do { val events = listViewModel.events.value.orEmpty() expectedChildCount = events.size @@ -600,18 +600,17 @@ class DetailChatRoomFragment : MasterFragment + binding.setVoiceRecordingTouchListener { _, event -> if (corePreferences.holdToRecordVoiceMessage) { when (event.action) { MotionEvent.ACTION_DOWN -> { diff --git a/app/src/main/java/org/linphone/activities/main/files/fragments/TopBarFragment.kt b/app/src/main/java/org/linphone/activities/main/files/fragments/TopBarFragment.kt index d636d194c..e956f4654 100644 --- a/app/src/main/java/org/linphone/activities/main/files/fragments/TopBarFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/files/fragments/TopBarFragment.kt @@ -92,8 +92,8 @@ class TopBarFragment : GenericFragment() { val extension = FileUtils.getExtensionFromFileName(filePath) val mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) - when { - FileUtils.isMimeImage(mime) -> { + when (FileUtils.getMimeType(mime)) { + FileUtils.MimeType.Image -> { val export = lifecycleScope.async { Compatibility.addImageToMediaStore(requireContext(), content) } @@ -108,7 +108,7 @@ class TopBarFragment : GenericFragment() { ) } } - FileUtils.isMimeVideo(mime) -> { + FileUtils.MimeType.Video -> { val export = lifecycleScope.async { Compatibility.addVideoToMediaStore(requireContext(), content) } @@ -123,7 +123,7 @@ class TopBarFragment : GenericFragment() { ) } } - FileUtils.isMimeAudio(mime) -> { + FileUtils.MimeType.Audio -> { val export = lifecycleScope.async { Compatibility.addAudioToMediaStore(requireContext(), content) } diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 4b38f1269..007c619b3 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -1048,8 +1048,8 @@ class CoreContext( val extension = FileUtils.getExtensionFromFileName(filePath) val mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) - when { - FileUtils.isMimeImage(mime) -> { + when (FileUtils.getMimeType(mime)) { + FileUtils.MimeType.Image -> { if (Compatibility.addImageToMediaStore(context, content)) { Log.i( "[Context] Successfully exported image [${content.name}] to Media Store" @@ -1060,7 +1060,7 @@ class CoreContext( ) } } - FileUtils.isMimeVideo(mime) -> { + FileUtils.MimeType.Video -> { if (Compatibility.addVideoToMediaStore(context, content)) { Log.i( "[Context] Successfully exported video [${content.name}] to Media Store" @@ -1071,7 +1071,7 @@ class CoreContext( ) } } - FileUtils.isMimeAudio(mime) -> { + FileUtils.MimeType.Audio -> { if (Compatibility.addAudioToMediaStore(context, content)) { Log.i( "[Context] Successfully exported audio [${content.name}] to Media Store" diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index 74a58cdd0..0708a9658 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -547,7 +547,7 @@ fun loadAvatarWithCoil(imageView: ImageView, path: String?) { @BindingAdapter("coilVideoPreview") fun loadVideoPreview(imageView: ImageView, path: String?) { - if (!path.isNullOrEmpty() && FileUtils.isExtensionVideo(path)) { + if (!path.isNullOrEmpty()) { imageView.load(path) { videoFrameMillis(0) listener( diff --git a/app/src/main/java/org/linphone/utils/FileUtils.kt b/app/src/main/java/org/linphone/utils/FileUtils.kt index f15260a19..1035ab6f9 100644 --- a/app/src/main/java/org/linphone/utils/FileUtils.kt +++ b/app/src/main/java/org/linphone/utils/FileUtils.kt @@ -42,6 +42,15 @@ import org.linphone.R import org.linphone.core.tools.Log class FileUtils { + enum class MimeType { + PlainText, + Pdf, + Image, + Video, + Audio, + Unknown + } + companion object { fun getNameFromFilePath(filePath: String): String { var name = filePath @@ -64,36 +73,22 @@ class FileUtils { return extension.lowercase(Locale.getDefault()) } - fun isMimePlainText(type: String?): Boolean { - return type?.startsWith("text/plain") ?: false - } - - fun isMimePdf(type: String?): Boolean { - return type?.startsWith("application/pdf") ?: false - } - - fun isMimeImage(type: String?): Boolean { - return type?.startsWith("image/") ?: false - } - - fun isMimeVideo(type: String?): Boolean { - return type?.startsWith("video/") ?: false - } - - fun isMimeAudio(type: String?): Boolean { - return type?.startsWith("audio/") ?: false + fun getMimeType(type: String?): MimeType { + if (type.isNullOrEmpty()) return MimeType.Unknown + return when { + type.startsWith("image/") -> MimeType.Image + type.startsWith("text/plain") -> MimeType.PlainText + type.startsWith("video/") -> MimeType.Video + type.startsWith("audio/") -> MimeType.Audio + type.startsWith("application/pdf") -> MimeType.Pdf + else -> MimeType.Unknown + } } fun isExtensionImage(path: String): Boolean { val extension = getExtensionFromFileName(path) val type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) - return isMimeImage(type) - } - - fun isExtensionVideo(path: String): Boolean { - val extension = getExtensionFromFileName(path) - val type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) - return isMimeVideo(type) + return getMimeType(type) == MimeType.Image } fun clearExistingPlainFiles() {