From 140f1c457add3d4e1f16cbf5db7d1523b2f538e0 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Sat, 29 Oct 2022 22:29:47 -0500 Subject: [PATCH] Allow long press to copy any link in a message --- build.gradle | 1 + .../ui/ConversationFragment.java | 11 ------ .../ui/adapter/MessageAdapter.java | 13 +++++-- .../conversations/ui/util/ShareUtil.java | 34 ++++++++++--------- src/main/res/menu/message_context.xml | 4 --- 5 files changed, 30 insertions(+), 33 deletions(-) diff --git a/build.gradle b/build.gradle index b07919716ca6ee627f8650d2d30ccb353482d0c9..e93e7c40be611e7f48fb0671780bf7cfb52d31ed 100644 --- a/build.gradle +++ b/build.gradle @@ -110,6 +110,7 @@ dependencies { implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'com.github.ipld:java-cid:v1.3.1' implementation 'com.splitwise:tokenautocomplete:3.0.2' + implementation 'me.saket:better-link-movement-method:2.2.0' implementation urlFile('https://gateway.pinata.cloud/ipfs/QmeqMiLxHi8AAjXobxr3QTfa1bSSLyAu86YviAqQnjxCjM/libwebrtc.aar', 'libwebrtc.aar') // INSERT } diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index 73bf6a556930429e866181d475fda3f68aad6483..204a8c084b9d232a11c1f97d361d89d76fcdeabe 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -1321,7 +1321,6 @@ public class ConversationFragment extends XmppFragment menu.setHeaderTitle(R.string.message_options); MenuItem openWith = menu.findItem(R.id.open_with); MenuItem copyMessage = menu.findItem(R.id.copy_message); - MenuItem copyLink = menu.findItem(R.id.copy_link); MenuItem quoteMessage = menu.findItem(R.id.quote_message); MenuItem retryDecryption = menu.findItem(R.id.retry_decryption); MenuItem correctMessage = menu.findItem(R.id.correct_message); @@ -1346,13 +1345,6 @@ public class ConversationFragment extends XmppFragment && t == null) { copyMessage.setVisible(true); quoteMessage.setVisible(!showError && MessageUtils.prepareQuote(m).length() > 0); - String body = m.getMergedBody().toString(); - if (ShareUtil.containsXmppUri(body)) { - copyLink.setTitle(R.string.copy_jabber_id); - copyLink.setVisible(true); - } else if (Patterns.AUTOLINK_WEB_URL.matcher(body).find()) { - copyLink.setVisible(true); - } } if (m.getEncryption() == Message.ENCRYPTION_DECRYPTION_FAILED && !deleted) { retryDecryption.setVisible(true); @@ -1442,9 +1434,6 @@ public class ConversationFragment extends XmppFragment case R.id.copy_message: ShareUtil.copyToClipboard(activity, selectedMessage); return true; - case R.id.copy_link: - ShareUtil.copyLinkToClipboard(activity, selectedMessage); - return true; case R.id.quote_message: quoteMessage(selectedMessage); return true; diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java index 5c181f4ee87b70e37953359d38ee00e0e608caf7..2111a82ed5bebeccc771172ed0f544e76a33e9a1 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -20,6 +20,7 @@ import android.text.style.RelativeSizeSpan; import android.text.style.StyleSpan; import android.text.style.URLSpan; import android.util.DisplayMetrics; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; @@ -51,6 +52,8 @@ import java.util.regex.Pattern; import io.ipfs.cid.Cid; +import me.saket.bettermovementmethod.BetterLinkMovementMethod; + import eu.siacs.conversations.Config; import eu.siacs.conversations.R; import eu.siacs.conversations.crypto.axolotl.FingerprintStatus; @@ -76,9 +79,9 @@ import eu.siacs.conversations.ui.text.QuoteSpan; import eu.siacs.conversations.ui.util.AvatarWorkerTask; import eu.siacs.conversations.ui.util.MyLinkify; import eu.siacs.conversations.ui.util.QuoteHelper; +import eu.siacs.conversations.ui.util.ShareUtil; import eu.siacs.conversations.ui.util.StyledAttributes; import eu.siacs.conversations.ui.util.ViewUtil; -import eu.siacs.conversations.ui.widget.ClickableMovementMethod; import eu.siacs.conversations.utils.CryptoHelper; import eu.siacs.conversations.utils.Emoticons; import eu.siacs.conversations.utils.GeoHelper; @@ -559,7 +562,13 @@ public class MessageAdapter extends ArrayAdapter { MyLinkify.addLinks(body, message.getConversation().getAccount()); viewHolder.messageBody.setAutoLinkMask(0); viewHolder.messageBody.setText(body); - viewHolder.messageBody.setMovementMethod(ClickableMovementMethod.getInstance()); + BetterLinkMovementMethod method = BetterLinkMovementMethod.newInstance(); + method.setOnLinkLongClickListener((tv, url) -> { + tv.dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, 0f, 0f, 0)); + ShareUtil.copyLinkToClipboard(activity, url); + return true; + }); + viewHolder.messageBody.setMovementMethod(method); } else { viewHolder.messageBody.setText(""); viewHolder.messageBody.setTextIsSelectable(false); diff --git a/src/main/java/eu/siacs/conversations/ui/util/ShareUtil.java b/src/main/java/eu/siacs/conversations/ui/util/ShareUtil.java index 8ff81a203eac33f72c04bca72ce960baddc9eb7a..4f25ad436fcb0f136352e756290aadd75ec465f5 100644 --- a/src/main/java/eu/siacs/conversations/ui/util/ShareUtil.java +++ b/src/main/java/eu/siacs/conversations/ui/util/ShareUtil.java @@ -108,26 +108,28 @@ public class ShareUtil { } } + public static void copyLinkToClipboard(final XmppActivity activity, final String url) { + final Uri uri = Uri.parse(url); + if ("xmpp".equals(uri.getScheme())) { + try { + final Jid jid = new XmppUri(uri).getJid(); + if (activity.copyTextToClipboard(jid.asBareJid().toString(), R.string.account_settings_jabber_id)) { + Toast.makeText(activity, R.string.jabber_id_copied_to_clipboard, Toast.LENGTH_SHORT).show(); + } + } catch (final Exception e) { } + } else { + if (activity.copyTextToClipboard(url, R.string.web_address)) { + Toast.makeText(activity, R.string.url_copied_to_clipboard, Toast.LENGTH_SHORT).show(); + } + } + } + public static void copyLinkToClipboard(final XmppActivity activity, final Message message) { final SpannableStringBuilder body = message.getMergedBody(); MyLinkify.addLinks(body, true); for (final URLSpan urlspan : body.getSpans(0, body.length() - 1, URLSpan.class)) { - final Uri uri = Uri.parse(urlspan.getURL()); - if ("xmpp".equals(uri.getScheme())) { - try { - final Jid jid = new XmppUri(uri).getJid(); - if (activity.copyTextToClipboard(jid.asBareJid().toString(), R.string.account_settings_jabber_id)) { - Toast.makeText(activity,R.string.jabber_id_copied_to_clipboard, Toast.LENGTH_SHORT).show(); - } - return; - } catch (final Exception e) { - return; - } - } else { - if (activity.copyTextToClipboard(urlspan.getURL(),R.string.web_address)) { - Toast.makeText(activity,R.string.url_copied_to_clipboard, Toast.LENGTH_SHORT).show(); - } - } + copyLinkToClipboard(activity, urlspan.getURL()); + return; } } diff --git a/src/main/res/menu/message_context.xml b/src/main/res/menu/message_context.xml index 688883515fea3fd6d1e0e9b6c636ab16556f01e1..8f7b9ec305b56b9b4a25821709260fabdef46b83 100644 --- a/src/main/res/menu/message_context.xml +++ b/src/main/res/menu/message_context.xml @@ -16,10 +16,6 @@ android:title="@string/copy_to_clipboard" android:visible="false" /> -