Better link replacement logic

Stephen Paul Weber created

Don't change if already custom label by XHTML-IM or similar

If link is for current conversation JID, then don't show display name

Change summary

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java |  2 
src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java      |  2 
src/main/java/eu/siacs/conversations/ui/util/MyLinkify.java              | 21 
src/main/java/eu/siacs/conversations/utils/UIHelper.java                 |  2 
4 files changed, 20 insertions(+), 7 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -4403,7 +4403,7 @@ public class XmppConnectionService extends Service {
     public Conversation findUniqueConversationByJid(XmppUri xmppUri) {
         List<Conversation> findings = new ArrayList<>();
         for (Conversation c : getConversations()) {
-            if (c.getAccount().isEnabled() && c.getJid().asBareJid().equals(xmppUri.getJid()) && ((c.getMode() == Conversational.MODE_MULTI) == xmppUri.isAction(XmppUri.ACTION_JOIN))) {
+            if (c.getAccount().isEnabled() && c.getJid().asBareJid().equals(xmppUri.getJid().asBareJid()) && ((c.getMode() == Conversational.MODE_MULTI) == xmppUri.isAction(XmppUri.ACTION_JOIN))) {
                 findings.add(c);
             }
         }

src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java 🔗

@@ -581,7 +581,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
             if (highlightedTerm != null) {
                 StylingHelper.highlight(activity, body, highlightedTerm, StylingHelper.isDarkText(viewHolder.messageBody));
             }
-            MyLinkify.addLinks(body, message.getConversation().getAccount());
+            MyLinkify.addLinks(body, message.getConversation().getAccount(), message.getConversation().getJid());
             viewHolder.messageBody.setAutoLinkMask(0);
             viewHolder.messageBody.setText(body);
             BetterLinkMovementMethod method = new BetterLinkMovementMethod() {

src/main/java/eu/siacs/conversations/ui/util/MyLinkify.java 🔗

@@ -133,21 +133,34 @@ public class MyLinkify {
         FixedURLSpan.fix(body);
     }
 
-    public static void addLinks(Editable body, Account account) {
+    public static void addLinks(Editable body, Account account, Jid context) {
         addLinks(body, true);
         Roster roster = account.getRoster();
         for (final URLSpan urlspan : body.getSpans(0, body.length() - 1, URLSpan.class)) {
             Uri uri = Uri.parse(urlspan.getURL());
             if ("xmpp".equals(uri.getScheme())) {
+                if (!body.subSequence(body.getSpanStart(urlspan), body.getSpanEnd(urlspan)).toString().startsWith("xmpp:")) {
+                    // Already customized
+                    continue;
+                }
+
                 try {
                     XmppUri xmppUri = new XmppUri(uri);
                     Jid jid = xmppUri.getJid();
-                    ListItem item = account.getBookmark(jid);
-                    if (item == null) item = roster.getContact(jid);
+                    String display = xmppUri.toString();
+                    if (jid.asBareJid().equals(context) && xmppUri.isAction("message") && xmppUri.getBody() != null) {
+                        display = xmppUri.getBody();
+                    } else if (jid.asBareJid().equals(context)) {
+                        display = xmppUri.parameterString();
+                    } else {
+                        ListItem item = account.getBookmark(jid);
+                        if (item == null) item = roster.getContact(jid);
+                        display = item.getDisplayName() + xmppUri.parameterString();
+                    }
                     body.replace(
                         body.getSpanStart(urlspan),
                         body.getSpanEnd(urlspan),
-                        item.getDisplayName() + xmppUri.parameterString()
+                        display
                     );
                 } catch (final IllegalArgumentException e) { /* bad JID */ }
             }

src/main/java/eu/siacs/conversations/utils/UIHelper.java 🔗

@@ -339,7 +339,7 @@ public class UIHelper {
                 if (textColor != 0) {
                     StylingHelper.format(styledBody, 0, styledBody.length() - 1, textColor);
                 }
-                MyLinkify.addLinks(styledBody, message.getConversation().getAccount());
+                MyLinkify.addLinks(styledBody, message.getConversation().getAccount(), message.getConversation().getJid());
                 SpannableStringBuilder builder = new SpannableStringBuilder();
                 for (CharSequence l : CharSequenceUtils.split(styledBody, '\n')) {
                     if (l.length() > 0) {