Improved MIME type related code

This commit is contained in:
Sylvain Berfini 2023-05-25 11:10:24 +02:00
parent 855f8c11c1
commit 83dc8a7b13
7 changed files with 84 additions and 78 deletions

View file

@ -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() {

View file

@ -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

View file

@ -478,8 +478,8 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
"[Chat Room] Content file path was empty, created file from buffer at $path"
)
} else if (content.isIcalendar) {
val name = "conference.ics"
val file = FileUtils.getFileStoragePath(name)
val filename = "conference.ics"
val file = FileUtils.getFileStoragePath(filename)
FileUtils.writeIntoFile(content.buffer, file)
path = file.absolutePath
content.filePath = path
@ -498,20 +498,20 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
val extension = FileUtils.getExtensionFromFileName(path)
val mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension)
when {
FileUtils.isMimeImage(mime) -> 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<ChatRoomDetailFragmentBinding, Cha
viewLifecycleOwner
) {
it.consume { chatMessage ->
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<ChatRoomDetailFragmentBinding, Cha
}
index = events.indexOf(eventLog)
if (index == -1) {
retryCount += 1
loadSteps += 1
listViewModel.loadMoreData(events.size)
}
} while (index == -1 && retryCount < 5)
} while (index == -1 && loadSteps < 5)
if (index != -1) {
if (retryCount == 0) {
if (loadSteps == 0) {
scrollTo(index, true)
} else {
lifecycleScope.launch {
withContext(Dispatchers.Default) {
val layoutManager = binding.chatMessagesList.layoutManager as LinearLayoutManager
var retryCount = 0
do {
// We have to wait for newly loaded items to be added to list before being able to scroll
@ -684,7 +683,7 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
}
}
binding.setVoiceRecordingTouchListener { view, event ->
binding.setVoiceRecordingTouchListener { _, event ->
if (corePreferences.holdToRecordVoiceMessage) {
when (event.action) {
MotionEvent.ACTION_DOWN -> {

View file

@ -92,8 +92,8 @@ class TopBarFragment : GenericFragment<FileViewerTopBarFragmentBinding>() {
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<FileViewerTopBarFragmentBinding>() {
)
}
}
FileUtils.isMimeVideo(mime) -> {
FileUtils.MimeType.Video -> {
val export = lifecycleScope.async {
Compatibility.addVideoToMediaStore(requireContext(), content)
}
@ -123,7 +123,7 @@ class TopBarFragment : GenericFragment<FileViewerTopBarFragmentBinding>() {
)
}
}
FileUtils.isMimeAudio(mime) -> {
FileUtils.MimeType.Audio -> {
val export = lifecycleScope.async {
Compatibility.addAudioToMediaStore(requireContext(), content)
}

View file

@ -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"

View file

@ -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(

View file

@ -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() {