Fix incorrect thread body adjustments containing media, mentions, and styling.

This commit is contained in:
Cody Henthorne
2024-04-04 16:16:28 -04:00
committed by Greyson Parrelli
parent 76665c1f0d
commit d5bf16b91a

View File

@@ -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<BodyAdjustment> 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<BodyAdjustment> 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<BodyAdjustment> 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<BodyAdjustment> bodyAdjustments) {
this.body = body;
this.bodyAdjustments = bodyAdjustments;
this(body, 0, bodyAdjustments);
}
public ThreadBody(@NonNull CharSequence body, int startOffset, @NonNull List<BodyAdjustment> bodyAdjustments) {
this.body = body;
if (startOffset == 0) {
this.bodyAdjustments = bodyAdjustments;
} else {
ArrayList<BodyAdjustment> updatedAdjustments = new ArrayList<>(bodyAdjustments.size() + 1);
updatedAdjustments.add(new BodyAdjustment(0, 0, startOffset));
updatedAdjustments.addAll(bodyAdjustments);
this.bodyAdjustments = updatedAdjustments;
}
}
public @NonNull CharSequence getBody() {