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 3e917d945..08ce18204 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -352,7 +352,8 @@ public class MessageAdapter extends ArrayAdapter implements CopyTextVie char current = body.length() > i ? body.charAt(i) : '\n'; if (lineStart == -1) { if (previous == '\n') { - if ((current == '>' && UIHelper.isPositionFollowedByQuoteableCharacter(body,i)) || current == '\u00bb') { + if ((current == '>' && UIHelper.isPositionFollowedByQuoteableCharacter(body,i)) + || current == '\u00bb' && !UIHelper.isPositionFollowedByQuote(body,i)) { // Line start with quote lineStart = i; if (quoteStart == -1) quoteStart = i; diff --git a/src/main/java/eu/siacs/conversations/utils/UIHelper.java b/src/main/java/eu/siacs/conversations/utils/UIHelper.java index b16b97d49..f1f8d0066 100644 --- a/src/main/java/eu/siacs/conversations/utils/UIHelper.java +++ b/src/main/java/eu/siacs/conversations/utils/UIHelper.java @@ -8,7 +8,6 @@ import android.widget.PopupMenu; import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; @@ -25,8 +24,6 @@ import eu.siacs.conversations.entities.Message; import eu.siacs.conversations.entities.MucOptions; import eu.siacs.conversations.entities.Presence; import eu.siacs.conversations.entities.Transferable; -import eu.siacs.conversations.ui.XmppActivity; -import eu.siacs.conversations.xmpp.chatstate.ChatState; import eu.siacs.conversations.xmpp.jid.Jid; public class UIHelper { @@ -233,7 +230,8 @@ public class UIHelper { } public static boolean isPositionFollowedByQuoteableCharacter(CharSequence body, int pos) { - return !isPositionFollowedByNumber(body, pos) && !isPositionFollowedByBigGrin(body,pos); + return !isPositionFollowedByNumber(body, pos) + && !isPositionFollowedByEmoticon(body,pos); } private static boolean isPositionFollowedByNumber(CharSequence body, int pos) { @@ -251,9 +249,45 @@ public class UIHelper { return previousWasNumber; } - private static boolean isPositionFollowedByBigGrin(CharSequence body, int pos) { - return body.length() <= pos + 1 - || ((body.charAt(pos + 1) == '<') && (body.length() == pos + 2 || Character.isWhitespace(body.charAt(pos + 2)))); + private static boolean isPositionFollowedByEmoticon(CharSequence body, int pos) { + if (body.length() <= pos +1) { + return false; + } else { + final char first = body.charAt(pos +1); + return first == ';' + || first == ':' + || smallerThanBeforeWhitespace(body,pos+1); + } + } + + private static boolean smallerThanBeforeWhitespace(CharSequence body, int pos) { + for(int i = pos; i < body.length(); ++i) { + final char c = body.charAt(i); + if (Character.isWhitespace(c)) { + return false; + } else if (c == '<') { + return body.length() == i + 1 || Character.isWhitespace(body.charAt(i + 1)); + } + } + return false; + } + + public static boolean isPositionFollowedByQuote(CharSequence body, int pos) { + if (body.length() <= pos + 1 || Character.isWhitespace(body.charAt(pos+1))) { + return false; + } + boolean previousWasWhitespace = false; + for (int i = pos +1; i < body.length(); i++) { + char c = body.charAt(i); + if (c == '\n' || c == '»') { + return false; + } else if (c == '«' && !previousWasWhitespace) { + return true; + } else { + previousWasWhitespace = Character.isWhitespace(c); + } + } + return false; } public static String getDisplayName(MucOptions.User user) {