aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java3
-rw-r--r--src/main/java/de/pixart/messenger/utils/UIHelper.java45
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) {