diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadBodyUtil.java b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadBodyUtil.java index 530042c6a2..577e5a98b3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadBodyUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadBodyUtil.java @@ -21,6 +21,7 @@ import org.thoughtcrime.securesms.mms.StickerSlide; import org.thoughtcrime.securesms.util.MessageRecordUtil; import org.thoughtcrime.securesms.util.Util; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; @@ -57,15 +58,15 @@ public final class ThreadBodyUtil { String emoji = getStickerEmoji(record); return format(context, record, emoji, R.string.ThreadRecord_sticker, bodyOverride); } else if (MessageRecordUtil.hasGiftBadge(record)) { - return format(EmojiStrings.GIFT, getGiftSummary(context, record)); + return format(EmojiStrings.GIFT, getGiftSummary(context, record), null); } else if (MessageRecordUtil.isStoryReaction(record)) { return new ThreadBody(getStoryReactionSummary(context, record)); } else if (record.isPaymentNotification()) { - return format(EmojiStrings.CARD, context.getString(R.string.ThreadRecord_payment)); + return format(EmojiStrings.CARD, context.getString(R.string.ThreadRecord_payment), null); } else if (record.isPaymentsRequestToActivate()) { - return format(EmojiStrings.CARD, getPaymentActivationRequestSummary(context, record)); + return format(EmojiStrings.CARD, getPaymentActivationRequestSummary(context, record), null); } else if (record.isPaymentsActivated()) { - return format(EmojiStrings.CARD, getPaymentActivatedSummary(context, record)); + return format(EmojiStrings.CARD, getPaymentActivatedSummary(context, record), null); } else if (record.isCallLog() && !record.isGroupCall()) { return new ThreadBody(getCallLogSummary(context, record)); } else if (MessageRecordUtil.isScheduled(record)) { @@ -166,18 +167,28 @@ public final class ThreadBodyUtil { @StringRes int defaultStringRes, @Nullable CharSequence bodyOverride) { - CharSequence body = !TextUtils.isEmpty(bodyOverride) ? bodyOverride - : TextUtils.isEmpty(record.getBody()) ? context.getString(defaultStringRes) - : getBody(context, record).getBody(); - return format(emoji, body); + CharSequence body; + List adjustments = null; + + if (!TextUtils.isEmpty(bodyOverride)) { + body = bodyOverride; + } else if (TextUtils.isEmpty(record.getBody())) { + body = context.getString(defaultStringRes); + } else { + ThreadBody threadBody = getBody(context, record); + body = threadBody.getBody(); + adjustments = threadBody.getBodyAdjustments(); + } + + return format(emoji, body, adjustments); } - private static @NonNull ThreadBody format(@NonNull CharSequence prefix, @NonNull CharSequence body) { + private static @NonNull ThreadBody format(@NonNull CharSequence prefix, @NonNull CharSequence body, @Nullable List adjustments) { SpannableStringBuilder builder = new SpannableStringBuilder(); builder.append(prefix) .append(" ") .append(body); - return new ThreadBody(builder, prefix.length() + 1); + return new ThreadBody(builder, prefix.length() + 1, adjustments != null ? adjustments : Collections.emptyList()); } private static @NonNull ThreadBody getBody(@NonNull Context context, @NonNull MessageRecord record) { @@ -198,16 +209,24 @@ public final class ThreadBodyUtil { private final List bodyAdjustments; public ThreadBody(@NonNull CharSequence body) { - this(body, 0); - } - - public ThreadBody(@NonNull CharSequence body, int startOffset) { - this(body, startOffset == 0 ? Collections.emptyList() : Collections.singletonList(new BodyAdjustment(0, 0, startOffset))); + this(body, 0, Collections.emptyList()); } public ThreadBody(@NonNull CharSequence body, @NonNull List bodyAdjustments) { - this.body = body; - this.bodyAdjustments = bodyAdjustments; + this(body, 0, bodyAdjustments); + } + + public ThreadBody(@NonNull CharSequence body, int startOffset, @NonNull List bodyAdjustments) { + this.body = body; + if (startOffset == 0) { + this.bodyAdjustments = bodyAdjustments; + } else { + ArrayList updatedAdjustments = new ArrayList<>(bodyAdjustments.size() + 1); + updatedAdjustments.add(new BodyAdjustment(0, 0, startOffset)); + updatedAdjustments.addAll(bodyAdjustments); + + this.bodyAdjustments = updatedAdjustments; + } } public @NonNull CharSequence getBody() {