mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-24 04:58:45 +00:00
Fix incorrect thread body adjustments containing media, mentions, and styling.
This commit is contained in:
committed by
Greyson Parrelli
parent
76665c1f0d
commit
d5bf16b91a
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user