Compose BasicTextField: вставить картину из буфера ClipboardManager

приложение - собственный чат.
как отловить событие, когда пытаешься вставить картинку из буфера обмена?
сам BasicTextField пусть и остается пустым.
главное - именно отловить событие и получить Uri (с получением Uri проблем нет)
пните, пожалуйста, в какую сторону копать и возможно ли это вообще.
p.s. судя по телеграмму - возможно.


Ответы (1 шт):

Автор решения: Wlad

нашел решение.
1ым решением является использование классического EditText вот так:

@SuppressLint("NewApi")
class EditTextWithImageClipBoard @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null
) : androidx.appcompat.widget.AppCompatEditText(context, attrs) {

    private val mimeTypesArray = arrayOf("image/*")

    var onClipBoardPaste: (ClipData.Item) -> Unit = {}

    override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection? {
        var ic = super.onCreateInputConnection(outAttrs) ?: return null
        EditorInfoCompat.setContentMimeTypes(outAttrs, mimeTypesArray)
        val mimeTypes = ViewCompat.getOnReceiveContentMimeTypes(this)
        if (mimeTypes != null) {
            EditorInfoCompat.setContentMimeTypes(outAttrs, mimeTypes)
            ic = InputConnectionCompat.createWrapper(this, ic, outAttrs)
        }
        return ic
    }


    init {
        setOnReceiveContentListener(mimeTypesArray) { view, payload ->
            runCatching { payload.clip.getItemAt(0) }.getOrNull()?.let {
                onClipBoardPaste(it)
            }
            null
        }
    }

}

основная магия происходит в методе setOnReceiveContentListener
именно он отвечает за обработку события, когда пытаешься вставить что-то либо из буфера обмена.
важно отметить, что из-за метода надо теперь обрабатывать самостоятельно и вставку текста

метод onCreateInputConnection нужен для случаев, когда над клавиатурой есть еще системная доп.панель, которая предлагает вставить текущую картинку в буфере обмена.
без переопределения этого метода эта доп.панель не будет показывать изображения (только текст)

как это использовать в Compose?
с классическим AndroidView
в Compose только недавно, в релизе 1.7.x появилась похожая вещь
она является 2ым вариантом решения проблемы, но я не проверял

 BasicTextField2(
    value = value,
    onValueChange = { value = it },
    modifier = Modifier
        .fillMaxWidth()
     .receiveContent(setOf(MediaType.Image)) { content ->
          val selectedMediaUri = content.platformTransferableContent?.linkUri
           null
      }
  )
→ Ссылка