Pith - kiln
package com.vgmlr.kiln

import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.asAndroidBitmap
import androidx.core.content.FileProvider
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.io.File

object KilnShare {
    private const val MIME = "image/png"
    private const val DIR = "shares"
    private const val NAME = "kiln.png"
    private const val AUTHORITY = ".share"

    suspend fun send(context: Context, image: ImageBitmap) {
        val uri = withContext(Dispatchers.IO) { write(context, image.asAndroidBitmap()) } ?: return
        context.startActivity(
            Intent.createChooser(
                Intent(Intent.ACTION_SEND).apply {
                    type = MIME
                    putExtra(Intent.EXTRA_STREAM, uri)
                    addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
                },
                null
            )
        )
    }

    private fun write(context: Context, bitmap: Bitmap): Uri? = runCatching {
        val out = bitmap.copy(Bitmap.Config.ARGB_8888, false) ?: bitmap
        val file = File(File(context.cacheDir, DIR).apply { mkdirs() }, NAME)
        file.outputStream().use { out.compress(Bitmap.CompressFormat.PNG, 100, it) }
        FileProvider.getUriForFile(context, context.packageName + AUTHORITY, file)
    }.getOrNull()
}