From b532c4608816c0f978c8c010648e6f75d5e7b78d Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Fri, 20 Jun 2025 11:01:32 +0200 Subject: [PATCH] modernize message preview code --- .../siacs/conversations/utils/UIHelper.java | 83 ++++++++++++------- 1 file changed, 54 insertions(+), 29 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/utils/UIHelper.java b/src/main/java/eu/siacs/conversations/utils/UIHelper.java index bf59a83e8fa01e7162a91bdae2ebf4caf28019a9..d5c8f7362804de0092f00e966353ec65b17aa2a4 100644 --- a/src/main/java/eu/siacs/conversations/utils/UIHelper.java +++ b/src/main/java/eu/siacs/conversations/utils/UIHelper.java @@ -12,7 +12,10 @@ import androidx.annotation.ColorRes; import androidx.annotation.StringRes; import androidx.core.content.ContextCompat; import com.google.android.material.color.MaterialColors; +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; import com.google.common.base.Strings; +import com.google.common.collect.Collections2; import eu.siacs.conversations.Config; import eu.siacs.conversations.R; import eu.siacs.conversations.crypto.axolotl.AxolotlService; @@ -247,41 +250,63 @@ public class UIHelper { getFileDescriptionString(context, message)), true); } else { - SpannableStringBuilder styledBody = new SpannableStringBuilder(body); if (textColor != 0) { - StylingHelper.format(styledBody, 0, styledBody.length() - 1, textColor); - } - SpannableStringBuilder builder = new SpannableStringBuilder(); - for (CharSequence l : CharSequenceUtils.split(styledBody, '\n')) { - if (l.length() > 0) { - if (l.toString().equals("```")) { - continue; - } - char first = l.charAt(0); - if ((!QuoteHelper.isPositionQuoteStart(l, 0))) { - CharSequence line = CharSequenceUtils.trim(l); - if (line.length() == 0) { - continue; - } - char last = line.charAt(line.length() - 1); - if (builder.length() != 0) { - builder.append(' '); - } - builder.append(line); - if (!PUNCTIONATION.contains(last)) { - break; - } - } - } - } - if (builder.length() == 0) { - builder.append(body.trim()); + return new Pair<>(getStyledBodyOneLine(body, textColor), false); + } else { + return new Pair<>(getBodyOmitQuotesAndBlocks(body), false); } - return new Pair<>(builder, false); } } } + private static CharSequence getBodyOmitQuotesAndBlocks(final String body) { + final var parts = Splitter.on('\n').trimResults().omitEmptyStrings().splitToList(body); + final var filtered = + Collections2.filter( + parts, + line -> + !QuoteHelper.isPositionQuoteCharacter(line, 0) + && !line.equals("```")); + if (filtered.isEmpty()) { + return body; + } + return Joiner.on(' ').join(filtered); + } + + private static CharSequence getStyledBodyOneLine(final String body, final int textColor) { + final var styledBody = new SpannableStringBuilder(body); + StylingHelper.format(styledBody, 0, styledBody.length() - 1, textColor); + final var builder = new SpannableStringBuilder(); + for (final var l : CharSequenceUtils.split(styledBody, '\n')) { + if (l.length() == 0) { + continue; + } + if (l.toString().equals("```")) { + continue; + } + if (QuoteHelper.isPositionQuoteCharacter(l, 0)) { + continue; + } + final var trimmed = CharSequenceUtils.trim(l); + if (trimmed.length() == 0) { + continue; + } + char last = trimmed.charAt(trimmed.length() - 1); + if (builder.length() != 0) { + builder.append(' '); + } + builder.append(trimmed); + if (!PUNCTIONATION.contains(last)) { + break; + } + } + if (builder.length() == 0) { + return body.trim(); + } else { + return builder; + } + } + public static boolean isLastLineQuote(String body) { if (body.endsWith("\n")) { return false;