diff --git a/app/src/main/java/dev/kaizen/app/chat/ChatScreen.kt b/app/src/main/java/dev/kaizen/app/chat/ChatScreen.kt index 5eea00b..842df5f 100644 --- a/app/src/main/java/dev/kaizen/app/chat/ChatScreen.kt +++ b/app/src/main/java/dev/kaizen/app/chat/ChatScreen.kt @@ -77,6 +77,7 @@ import dev.kaizen.app.net.WireMessage import dev.kaizen.app.settings.SettingsScreen import dev.kaizen.app.settings.SettingsViewModel import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource @@ -161,13 +162,24 @@ fun ChatScreen( } } - val filePicker = rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { uri -> - uri ?: return@rememberLauncherForActivityResult + val galleryPicker = rememberLauncherForActivityResult(ActivityResultContracts.PickMultipleVisualMedia()) { uris -> val cr = context.contentResolver - val mimeType = cr.getType(uri) ?: "application/octet-stream" - val fileName = uri.lastPathSegment?.substringAfterLast('/') ?: "file" - val bytes = cr.openInputStream(uri)?.use { it.readBytes() } ?: return@rememberLauncherForActivityResult - uploadPickedFile(fileName, mimeType, bytes) + for (uri in uris) { + val mimeType = cr.getType(uri) ?: "image/jpeg" + val fileName = uri.lastPathSegment?.substringAfterLast('/') ?: "image_${System.currentTimeMillis()}" + val bytes = cr.openInputStream(uri)?.use { it.readBytes() } ?: continue + uploadPickedFile(fileName, mimeType, bytes) + } + } + + val filePicker = rememberLauncherForActivityResult(ActivityResultContracts.OpenMultipleDocuments()) { uris -> + val cr = context.contentResolver + for (uri in uris) { + val mimeType = cr.getType(uri) ?: "application/octet-stream" + val fileName = uri.lastPathSegment?.substringAfterLast('/') ?: "file" + val bytes = cr.openInputStream(uri)?.use { it.readBytes() } ?: continue + uploadPickedFile(fileName, mimeType, bytes) + } } val cameraPicker = rememberLauncherForActivityResult(ActivityResultContracts.TakePicturePreview()) { bitmap -> @@ -859,8 +871,8 @@ fun ChatScreen( ) { AttachmentMenu( onCamera = { showAttachMenu = false; cameraPicker.launch(null) }, - onGallery = { showAttachMenu = false; filePicker.launch("image/*") }, - onFile = { showAttachMenu = false; filePicker.launch("*/*") }, + onGallery = { showAttachMenu = false; galleryPicker.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageAndVideo)) }, + onFile = { showAttachMenu = false; filePicker.launch(arrayOf("*/*")) }, ) }