From ebbcdc7478423e97d3058c4775117955453d8f5b Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 8 Sep 2025 11:11:00 +0200 Subject: [PATCH] Detect mime type when picking a file The file picker will now try to detect the mime type of the selected file. If it cannot be detected, it will fallback to `application/octet-stream`. --- .../impl/messagecomposer/MessageComposerPresenter.kt | 4 ++-- .../android/libraries/mediapickers/api/PickerProvider.kt | 2 +- .../libraries/mediapickers/impl/DefaultPickerProvider.kt | 9 ++++++--- .../libraries/mediapickers/test/FakePickerProvider.kt | 4 ++-- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt index 70a79938b3..3d32bea1e0 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt @@ -165,8 +165,8 @@ class MessageComposerPresenter( val galleryMediaPicker = mediaPickerProvider.registerGalleryPicker { uri, mimeType -> handlePickedMedia(uri, mimeType) } - val filesPicker = mediaPickerProvider.registerFilePicker(AnyMimeTypes) { uri -> - handlePickedMedia(uri, MimeTypes.OctetStream) + val filesPicker = mediaPickerProvider.registerFilePicker(AnyMimeTypes) { uri, mimeType -> + handlePickedMedia(uri, mimeType ?: MimeTypes.OctetStream) } val cameraPhotoPicker = mediaPickerProvider.registerCameraPhotoPicker { uri -> handlePickedMedia(uri, MimeTypes.Jpeg) diff --git a/libraries/mediapickers/api/src/main/kotlin/io/element/android/libraries/mediapickers/api/PickerProvider.kt b/libraries/mediapickers/api/src/main/kotlin/io/element/android/libraries/mediapickers/api/PickerProvider.kt index 961f486322..4a2f26a4b3 100644 --- a/libraries/mediapickers/api/src/main/kotlin/io/element/android/libraries/mediapickers/api/PickerProvider.kt +++ b/libraries/mediapickers/api/src/main/kotlin/io/element/android/libraries/mediapickers/api/PickerProvider.kt @@ -25,7 +25,7 @@ interface PickerProvider { @Composable fun registerFilePicker( mimeType: String, - onResult: (Uri?) -> Unit + onResult: (uri: Uri?, mimeType: String?) -> Unit, ): PickerLauncher @Composable diff --git a/libraries/mediapickers/impl/src/main/kotlin/io/element/android/libraries/mediapickers/impl/DefaultPickerProvider.kt b/libraries/mediapickers/impl/src/main/kotlin/io/element/android/libraries/mediapickers/impl/DefaultPickerProvider.kt index b93820b97d..878c9ea865 100644 --- a/libraries/mediapickers/impl/src/main/kotlin/io/element/android/libraries/mediapickers/impl/DefaultPickerProvider.kt +++ b/libraries/mediapickers/impl/src/main/kotlin/io/element/android/libraries/mediapickers/impl/DefaultPickerProvider.kt @@ -88,13 +88,16 @@ class DefaultPickerProvider( @Composable override fun registerFilePicker( mimeType: String, - onResult: (Uri?) -> Unit, + onResult: (uri: Uri?, mimeType: String?) -> Unit, ): PickerLauncher { // Tests and UI preview can't handle Context or FileProviders, so we might as well disable the whole picker return if (LocalInspectionMode.current) { - NoOpPickerLauncher { onResult(null) } + NoOpPickerLauncher { onResult(null, null) } } else { - rememberPickerLauncher(type = PickerType.File(mimeType)) { uri -> onResult(uri) } + rememberPickerLauncher(type = PickerType.File(mimeType)) { uri -> + val pickedMimeType = uri?.let { context.contentResolver.getType(it) } + onResult(uri, pickedMimeType) + } } } diff --git a/libraries/mediapickers/test/src/main/kotlin/io/element/android/libraries/mediapickers/test/FakePickerProvider.kt b/libraries/mediapickers/test/src/main/kotlin/io/element/android/libraries/mediapickers/test/FakePickerProvider.kt index 8dfd88dcd6..3a279868bf 100644 --- a/libraries/mediapickers/test/src/main/kotlin/io/element/android/libraries/mediapickers/test/FakePickerProvider.kt +++ b/libraries/mediapickers/test/src/main/kotlin/io/element/android/libraries/mediapickers/test/FakePickerProvider.kt @@ -30,8 +30,8 @@ class FakePickerProvider : PickerProvider { } @Composable - override fun registerFilePicker(mimeType: String, onResult: (Uri?) -> Unit): PickerLauncher { - return NoOpPickerLauncher { onResult(result) } + override fun registerFilePicker(mimeType: String, onResult: (Uri?, String?) -> Unit): PickerLauncher { + return NoOpPickerLauncher { onResult(result, this.mimeType) } } @Composable