feat(send): build adaptive transfer creation flow

This commit is contained in:
2026-07-10 22:06:31 +02:00
parent 0bf4da0ee9
commit b4306d6694
18 changed files with 1009 additions and 245 deletions

View File

@@ -2,7 +2,11 @@ package com.vnidrop.app.core
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.Point
import android.net.Uri
import android.os.Build
import android.provider.DocumentsContract
import android.provider.OpenableColumns
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
@@ -18,7 +22,7 @@ actual fun rememberShareFilePicker(
val context = LocalContext.current
val launcher = rememberLauncherForActivityResult(ActivityResultContracts.OpenDocument()) { uri ->
if (uri != null) {
onFilePicked(PickedShareFile(uri.toString(), context.displayName(uri)))
onFilePicked(context.pickedShareFile(uri))
}
}
return remember(launcher) {
@@ -62,12 +66,33 @@ actual fun rememberReceiveFolderPicker(
}
}
private fun Context.displayName(uri: Uri): String {
private fun Context.pickedShareFile(uri: Uri): PickedShareFile {
var displayName: String? = null
var sizeBytes: ULong? = null
contentResolver.query(uri, null, null, null, null)?.use { cursor ->
val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
if (nameIndex >= 0 && cursor.moveToFirst()) {
return cursor.getString(nameIndex)
val sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE)
if (cursor.moveToFirst()) {
if (nameIndex >= 0 && !cursor.isNull(nameIndex)) displayName = cursor.getString(nameIndex)
if (sizeIndex >= 0 && !cursor.isNull(sizeIndex)) {
sizeBytes = cursor.getLong(sizeIndex).takeIf { it >= 0L }?.toULong()
}
}
}
return uri.lastPathSegment ?: "transfer"
return PickedShareFile(
value = uri.toString(),
displayName = displayName ?: uri.lastPathSegment ?: "transfer",
sizeBytes = sizeBytes,
thumbnailBytes = runCatching {
val bitmap = (if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
contentResolver.loadThumbnail(uri, android.util.Size(192, 192), null)
} else {
DocumentsContract.getDocumentThumbnail(contentResolver, uri, Point(192, 192), null)
}) ?: error("The document provider did not return a thumbnail")
java.io.ByteArrayOutputStream().use { output ->
bitmap.compress(Bitmap.CompressFormat.PNG, 100, output)
output.toByteArray()
}
}.getOrNull(),
)
}