From fe5d9b43089e6b33c83fc33ce8120e5ddca0de59 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Tue, 15 Apr 2025 17:05:09 +0200 Subject: [PATCH] Send SVG images as files (#4595) Since Android doesn't have support for SVG files we can't create a thumbnail or get the dimensions and other metadata needed for the `m.image` message type, so we need to send them as plain files --- .../io/element/android/libraries/core/mimetype/MimeTypes.kt | 1 + .../libraries/mediaupload/impl/AndroidMediaPreProcessor.kt | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/libraries/core/src/main/kotlin/io/element/android/libraries/core/mimetype/MimeTypes.kt b/libraries/core/src/main/kotlin/io/element/android/libraries/core/mimetype/MimeTypes.kt index 82c1cb2c71..357fce2feb 100644 --- a/libraries/core/src/main/kotlin/io/element/android/libraries/core/mimetype/MimeTypes.kt +++ b/libraries/core/src/main/kotlin/io/element/android/libraries/core/mimetype/MimeTypes.kt @@ -24,6 +24,7 @@ object MimeTypes { const val Jpeg = "image/jpeg" const val Gif = "image/gif" const val WebP = "image/webp" + const val Svg = "image/svg+xml" const val Videos = "video/*" const val Mp4 = "video/mp4" diff --git a/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/AndroidMediaPreProcessor.kt b/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/AndroidMediaPreProcessor.kt index 3fb96a75b3..5f662d416f 100644 --- a/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/AndroidMediaPreProcessor.kt +++ b/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/AndroidMediaPreProcessor.kt @@ -62,7 +62,7 @@ class AndroidMediaPreProcessor @Inject constructor( */ private const val IMAGE_SCALE_REF_SIZE = 640 - private val notCompressibleImageTypes = listOf(MimeTypes.Gif, MimeTypes.WebP) + private val notCompressibleImageTypes = listOf(MimeTypes.Gif, MimeTypes.WebP, MimeTypes.Svg) } private val contentResolver = context.contentResolver @@ -75,6 +75,10 @@ class AndroidMediaPreProcessor @Inject constructor( ): Result = withContext(coroutineDispatchers.computation) { runCatching { val result = when { + // Special case for SVG, since Android can't read its metadata or create a thumbnail, it must be sent as a file + mimeType == MimeTypes.Svg -> { + processFile(uri, mimeType) + } mimeType.isMimeTypeImage() -> { val shouldBeCompressed = compressIfPossible && mimeType !in notCompressibleImageTypes processImage(uri, mimeType, shouldBeCompressed)