fix: multi-select for gallery and file picker
Gallery uses PickMultipleVisualMedia (image + video), file picker uses OpenMultipleDocuments — both now allow selecting multiple items at once. Camera stays single-shot (one photo per shutter, standard behavior). Each selected item uploads in parallel as before.
This commit is contained in:
parent
875a319ddd
commit
ad11c0ee46
1 changed files with 20 additions and 8 deletions
|
|
@ -77,6 +77,7 @@ import dev.kaizen.app.net.WireMessage
|
||||||
import dev.kaizen.app.settings.SettingsScreen
|
import dev.kaizen.app.settings.SettingsScreen
|
||||||
import dev.kaizen.app.settings.SettingsViewModel
|
import dev.kaizen.app.settings.SettingsViewModel
|
||||||
import androidx.activity.compose.rememberLauncherForActivityResult
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||||
|
import androidx.activity.result.PickVisualMediaRequest
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
|
|
@ -161,14 +162,25 @@ fun ChatScreen(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val filePicker = rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { uri ->
|
val galleryPicker = rememberLauncherForActivityResult(ActivityResultContracts.PickMultipleVisualMedia()) { uris ->
|
||||||
uri ?: return@rememberLauncherForActivityResult
|
|
||||||
val cr = context.contentResolver
|
val cr = context.contentResolver
|
||||||
|
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 mimeType = cr.getType(uri) ?: "application/octet-stream"
|
||||||
val fileName = uri.lastPathSegment?.substringAfterLast('/') ?: "file"
|
val fileName = uri.lastPathSegment?.substringAfterLast('/') ?: "file"
|
||||||
val bytes = cr.openInputStream(uri)?.use { it.readBytes() } ?: return@rememberLauncherForActivityResult
|
val bytes = cr.openInputStream(uri)?.use { it.readBytes() } ?: continue
|
||||||
uploadPickedFile(fileName, mimeType, bytes)
|
uploadPickedFile(fileName, mimeType, bytes)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val cameraPicker = rememberLauncherForActivityResult(ActivityResultContracts.TakePicturePreview()) { bitmap ->
|
val cameraPicker = rememberLauncherForActivityResult(ActivityResultContracts.TakePicturePreview()) { bitmap ->
|
||||||
bitmap ?: return@rememberLauncherForActivityResult
|
bitmap ?: return@rememberLauncherForActivityResult
|
||||||
|
|
@ -859,8 +871,8 @@ fun ChatScreen(
|
||||||
) {
|
) {
|
||||||
AttachmentMenu(
|
AttachmentMenu(
|
||||||
onCamera = { showAttachMenu = false; cameraPicker.launch(null) },
|
onCamera = { showAttachMenu = false; cameraPicker.launch(null) },
|
||||||
onGallery = { showAttachMenu = false; filePicker.launch("image/*") },
|
onGallery = { showAttachMenu = false; galleryPicker.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageAndVideo)) },
|
||||||
onFile = { showAttachMenu = false; filePicker.launch("*/*") },
|
onFile = { showAttachMenu = false; filePicker.launch(arrayOf("*/*")) },
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue