📦 Parcel

Complete File Operations for Kotlin Multiplatform
A unified, type-safe API for file picking, saving, camera capture, and sharing across Android, iOS, Desktop, and Web.
✨ Features
📋 Platform Support
📦 Installation
dependencies {
implementation("in.sitharaj.parcel:parcel:1.0.0")
}
🚀 Quick Start
Pick Files
@Composable
fun FilePickerDemo() {
val launcher = rememberParcelLauncher(
onPickResult = { result ->
result.onSuccess { file ->
println("Picked: ${file.name} (${file.size} bytes)")
}.onCancelled {
println("Cancelled")
}.onError { e ->
println("Error: ${e.message}")
}
}
)
Button(onClick = {
launcher.pickFile(PickConfig.build {
types(FileType.Images, FileType.Documents)
title()
})
}) {
Text()
}
}
Pick Multiple Files
launcher.pickMultiple(PickConfig.build {
types(FileType.Images)
maxCount(5)
})
Pick Directory
launcher.pickDirectory("Select folder") { result ->
result.onSuccess { dir ->
println("Selected: ${dir.name}")
}
}
Save Files
val data = "Hello, World!".encodeToByteArray()
launcher.saveFile(data, SaveConfig.build {
suggestedName("document.txt")
mimeType("text/plain")
}) { result ->
result.onSuccess { file ->
println("Saved to: ${file.uri}")
}
}
Camera Capture
launcher.capturePhoto(CaptureConfig.build {
useFrontCamera(false)
}) { result ->
result.onSuccess { photo ->
println("Photo: ${photo.uri}")
}
}
launcher.captureVideo(CaptureConfig.build {
maxDuration(60)
videoQuality(VideoQuality.High)
}) { result ->
result.onSuccess { video ->
println("Video: ${video.uri}")
}
}
Share Content
launcher.share(ShareContent.Text(
text = "Check this out!",
subject = "Amazing content"
))
launcher.share(ShareContent.Url(
url = "https://github.com/sitharaj88/parcel-kmp"
))
launcher.share(ShareContent.File(
uri = fileUri,
mimeType = "image/png"
))
launcher.share(ShareContent.Files(
uris = listOf(file1, file2),
mimeType = "image/*"
))
Read Files
launcher.readText(file) { result ->
result.onSuccess { content ->
println("Content: $content")
}
}
launcher.readBytes(file) { result ->
result.onSuccess { bytes ->
println("Size: ${bytes.size}")
}
}
📖 API Reference
FileType
FileType.All
FileType.Images
FileType.Videos
FileType.Audio
FileType.Documents
FileType.Custom(listOf("application/json"))
PickConfig
PickConfig.build {
types(FileType.Images)
maxCount(10)
title("Select")
initialDirectory("/path")
}
SaveConfig
SaveConfig.build {
suggestedName("doc.pdf")
mimeType("application/pdf")
title("Save As")
}
CaptureConfig
CaptureConfig.build {
useFrontCamera(true)
videoQuality(VideoQuality.High)
maxDuration(120)
}
ParcelCapabilities
Check platform support at runtime:
if (ParcelCapabilities.canCapturePhoto) {
}
if (ParcelCapabilities.canShare) {
}
🏗️ Architecture
┌─────────────────────────────────────────────────────────────────┐
│ Parcel API (Common) │
│ ┌─────────┐ ┌──────┐ ┌─────────┐ ┌───────┐ ┌───────┐ ┌──────┐ │
│ │ pick │ │ save │ │ capture │ │ share │ │ read │ │ dir │ │
│ └─────────┘ └──────┘ └─────────┘ └───────┘ └───────┘ └──────┘ │
├─────────────────────────────────────────────────────────────────┤
│ Android │ iOS │ Desktop │ Web (JS) │ WASM │
│ ──────────── │ ─────────── │ ────────── │ ────────── │ ─────── │
│ ActivityRes │ UIDocument │ JFileChoos │ input │ Stub │
│ TakePicture │ Picker+Cam │ FileDialog │ Web Share │ │
│ Intent.SEND │ UIActivity │ Desktop │ Blob │ │
└─────────────────────────────────────────────────────────────────┘
📄 License
Copyright 2024 Sitharaj Seenivasan
Licensed under the Apache License, Version 2.0
🔗 Links