diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java index e100ca17a..2fc3d8292 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java @@ -148,6 +148,8 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import kotlin.Unit; import kotlin.jvm.functions.Function1; @@ -175,6 +177,8 @@ public final class ConversationItem extends RelativeLayout implements BindableCo private static final long MAX_CLUSTERING_TIME_DIFF = TimeUnit.MINUTES.toMillis(3); private static final int CONDENSED_MODE_MAX_LINES = 3; + private static final Pattern NOT_URL_PATTERN = Pattern.compile("[^a-zA-Z0-9-._~:/?#\\[\\]@!$&'()\\*+,;=]"); + private ConversationMessage conversationMessage; private MessageRecord messageRecord; private Optional nextMessageRecord; @@ -1444,12 +1448,26 @@ public final class ConversationItem extends RelativeLayout implements BindableCo boolean hasLinks = LinkifyCompat.addLinks(messageBody, shouldLinkifyAllLinks ? linkPattern : 0); if (hasLinks) { - Stream.of(messageBody.getSpans(0, messageBody.length(), URLSpan.class)) + URLSpan[] urlSpans = messageBody.getSpans(0, messageBody.length(), URLSpan.class); + + for (URLSpan urlSpan : urlSpans) { + int start = messageBody.getSpanStart(urlSpan); + int end = messageBody.getSpanEnd(urlSpan); + + Matcher matcher = NOT_URL_PATTERN.matcher(messageBody.toString().substring(end)); + if (matcher.find()) { + int newEnd = end + matcher.start(); + URLSpan newSpan = new URLSpan(messageBody.toString().substring(start, newEnd)); + messageBody.removeSpan(urlSpan); + messageBody.setSpan(newSpan, start, newEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + + Stream.of(urlSpans) .filterNot(url -> LinkUtil.isLegalUrl(url.getURL())) .forEach(messageBody::removeSpan); - URLSpan[] urlSpans = messageBody.getSpans(0, messageBody.length(), URLSpan.class); - + urlSpans = messageBody.getSpans(0, messageBody.length(), URLSpan.class); for (URLSpan urlSpan : urlSpans) { int start = messageBody.getSpanStart(urlSpan); int end = messageBody.getSpanEnd(urlSpan);