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`.
This commit is contained in:
Benoit Marty 2025-09-08 11:11:00 +02:00 committed by Benoit Marty
parent f852fb4f82
commit 255d786b70
4 changed files with 11 additions and 8 deletions

View file

@ -165,8 +165,8 @@ class MessageComposerPresenter(
val galleryMediaPicker = mediaPickerProvider.registerGalleryPicker { uri, mimeType -> val galleryMediaPicker = mediaPickerProvider.registerGalleryPicker { uri, mimeType ->
handlePickedMedia(uri, mimeType) handlePickedMedia(uri, mimeType)
} }
val filesPicker = mediaPickerProvider.registerFilePicker(AnyMimeTypes) { uri -> val filesPicker = mediaPickerProvider.registerFilePicker(AnyMimeTypes) { uri, mimeType ->
handlePickedMedia(uri, MimeTypes.OctetStream) handlePickedMedia(uri, mimeType ?: MimeTypes.OctetStream)
} }
val cameraPhotoPicker = mediaPickerProvider.registerCameraPhotoPicker { uri -> val cameraPhotoPicker = mediaPickerProvider.registerCameraPhotoPicker { uri ->
handlePickedMedia(uri, MimeTypes.Jpeg) handlePickedMedia(uri, MimeTypes.Jpeg)

View file

@ -25,7 +25,7 @@ interface PickerProvider {
@Composable @Composable
fun registerFilePicker( fun registerFilePicker(
mimeType: String, mimeType: String,
onResult: (Uri?) -> Unit onResult: (uri: Uri?, mimeType: String?) -> Unit,
): PickerLauncher<String, Uri?> ): PickerLauncher<String, Uri?>
@Composable @Composable

View file

@ -88,13 +88,16 @@ class DefaultPickerProvider(
@Composable @Composable
override fun registerFilePicker( override fun registerFilePicker(
mimeType: String, mimeType: String,
onResult: (Uri?) -> Unit, onResult: (uri: Uri?, mimeType: String?) -> Unit,
): PickerLauncher<String, Uri?> { ): PickerLauncher<String, Uri?> {
// Tests and UI preview can't handle Context or FileProviders, so we might as well disable the whole picker // Tests and UI preview can't handle Context or FileProviders, so we might as well disable the whole picker
return if (LocalInspectionMode.current) { return if (LocalInspectionMode.current) {
NoOpPickerLauncher { onResult(null) } NoOpPickerLauncher { onResult(null, null) }
} else { } 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)
}
} }
} }

View file

@ -30,8 +30,8 @@ class FakePickerProvider : PickerProvider {
} }
@Composable @Composable
override fun registerFilePicker(mimeType: String, onResult: (Uri?) -> Unit): PickerLauncher<String, Uri?> { override fun registerFilePicker(mimeType: String, onResult: (Uri?, String?) -> Unit): PickerLauncher<String, Uri?> {
return NoOpPickerLauncher { onResult(result) } return NoOpPickerLauncher { onResult(result, this.mimeType) }
} }
@Composable @Composable