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 943bbee131
commit ebbcdc7478
4 changed files with 11 additions and 8 deletions

View File

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

View File

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

View File

@@ -88,13 +88,16 @@ class DefaultPickerProvider(
@Composable
override fun registerFilePicker(
mimeType: String,
onResult: (Uri?) -> Unit,
onResult: (uri: Uri?, mimeType: String?) -> Unit,
): PickerLauncher<String, Uri?> {
// 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)
}
}
}

View File

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