mirror of
https://github.com/sudosylabs/vnidrop.git
synced 2026-08-05 10:29:58 +02:00
feat(send): build adaptive transfer creation flow
This commit is contained in:
@@ -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(),
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user