diff options
-rw-r--r-- | src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java | 3 | ||||
-rw-r--r-- | src/main/java/de/pixart/messenger/utils/UIHelper.java | 45 |
2 files changed, 43 insertions, 5 deletions
diff --git a/src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java b/src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java index c608d1b21..bb36f41e0 100644 --- a/src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java +++ b/src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java @@ -406,7 +406,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; diff --git a/src/main/java/de/pixart/messenger/utils/UIHelper.java b/src/main/java/de/pixart/messenger/utils/UIHelper.java index 68f9297e9..37483ad1a 100644 --- a/src/main/java/de/pixart/messenger/utils/UIHelper.java +++ b/src/main/java/de/pixart/messenger/utils/UIHelper.java @@ -239,7 +239,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) { @@ -257,9 +258,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) { |