@@ -352,7 +352,8 @@ public class MessageAdapter extends ArrayAdapter<Message> 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;
@@ -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) {