diff --git a/jami-android/app/src/main/java/cx/ring/fragments/ConversationFragment.kt b/jami-android/app/src/main/java/cx/ring/fragments/ConversationFragment.kt index 7046ab3f5860b79055e5cd1dcad1430a025d7fed..07ea20b2d8bc7f45d0ee386bb93dae254bee0a28 100644 --- a/jami-android/app/src/main/java/cx/ring/fragments/ConversationFragment.kt +++ b/jami-android/app/src/main/java/cx/ring/fragments/ConversationFragment.kt @@ -247,18 +247,31 @@ class ConversationFragment : BaseSupportFragment<ConversationPresenter, Conversa } binding.ongoingcallPane.visibility = View.GONE - ViewCompat.setOnReceiveContentListener(binding.msgInputTxt, SUPPORTED_MIME_TYPES) { _, contentInfo -> - for (i in 0 until contentInfo.clip.itemCount) { - val item: ClipData.Item = contentInfo.clip.getItemAt(i) - if (item.uri == null && item.text != null) { - binding.msgInputTxt.setText(item.text) - } else { - startFileSend(AndroidFileUtils.getCacheFile(requireContext(), item.uri) + + // Content may be both text and non-text (HTML, images, videos, audio files, etc). + ViewCompat.setOnReceiveContentListener( + binding.msgInputTxt, + SUPPORTED_MIME_TYPES + ) { _, payload -> + // Split the incoming content into two groups: content URIs and everything else. + // This way we can implement custom handling for URIs and delegate the rest. + val split = payload.partition { item -> item.uri != null } + val uriContent = split.first + val remaining = split.second + + // Handles content URIs. + if (uriContent != null) { + val clip = uriContent.clip + for (i in 0 until clip.itemCount) { + val uri = clip.getItemAt(i).uri + startFileSend(AndroidFileUtils.getCacheFile(requireContext(), uri) .flatMapCompletable { sendFile(it) }) } } - null + // Delegates the processing for text and everything else to the platform. + remaining } + binding.msgInputTxt.setOnEditorActionListener { _, actionId: Int, _ -> actionSendMsgText(actionId) } binding.msgInputTxt.onFocusChangeListener = View.OnFocusChangeListener { _, hasFocus: Boolean -> if (hasFocus) {