diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index f54b51759f6200133988ff5a8737cec5f1add78a..9dd6f9cff96c52faaf1f7b388e89bd5c86122003 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -7,6 +7,8 @@ import android.graphics.Rect; import android.net.Uri; import android.text.Editable; import android.text.InputType; +import android.text.SpannableStringBuilder; +import android.text.Spanned; import android.text.StaticLayout; import android.text.TextPaint; import android.text.TextUtils; @@ -60,6 +62,8 @@ import java.util.stream.Collectors; import java.util.Timer; import java.util.TimerTask; +import me.saket.bettermovementmethod.BetterLinkMovementMethod; + import eu.siacs.conversations.Config; import eu.siacs.conversations.R; import eu.siacs.conversations.crypto.OmemoSetting; @@ -1499,6 +1503,12 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl } binding.values.setAdapter(values); + if (field.getType().equals(Optional.of("jid-single")) || field.getType().equals(Optional.of("jid-multi"))) { + binding.values.setOnItemClickListener((arg0, arg1, pos, id) -> { + new FixedURLSpan("xmpp:" + Jid.ofEscaped(values.getItem(pos)).toEscapedString()).onClick(binding.values); + }); + } + binding.values.setOnItemLongClickListener((arg0, arg1, pos, id) -> { if (ShareUtil.copyTextToClipboard(binding.getRoot().getContext(), values.getItem(pos), R.string.message)) { Toast.makeText(binding.getRoot().getContext(), R.string.message_copied_to_clipboard, Toast.LENGTH_SHORT).show(); @@ -1519,8 +1529,21 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl binding.text.setTextAppearance(binding.getRoot().getContext(), R.style.TextAppearance_Conversations_Subhead); setTextOrHide(binding.text, cell.reported.getLabel()); } else { + SpannableStringBuilder text = new SpannableStringBuilder(cell.el.findChildContent("value", "jabber:x:data")); + if (cell.reported.getType().equals(Optional.of("jid-single"))) { + text.setSpan(new FixedURLSpan("xmpp:" + Jid.ofEscaped(text.toString()).toEscapedString()), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + binding.text.setTextAppearance(binding.getRoot().getContext(), R.style.TextAppearance_Conversations_Body1); - binding.text.setText(cell.el.findChildContent("value", "jabber:x:data")); + binding.text.setText(text); + + BetterLinkMovementMethod method = BetterLinkMovementMethod.newInstance(); + method.setOnLinkLongClickListener((tv, url) -> { + tv.dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, 0f, 0f, 0)); + ShareUtil.copyLinkToClipboard(binding.getRoot().getContext(), url); + return true; + }); + binding.text.setMovementMethod(method); } } } @@ -1874,6 +1897,10 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl return el.getAttribute("var"); } + public Optional getType() { + return Optional.fromNullable(el.getAttribute("type")); + } + public Optional getLabel() { String label = el.getAttribute("label"); if (label == null) label = getVar();