From f53679f24ab1c2a5a04bbd8dcc1b8010245fc36d Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Fri, 24 Mar 2023 15:22:46 -0400 Subject: [PATCH] Fix spoiler rendering in quotes. --- .../components/emoji/EmojiTextView.java | 61 ++++++++++++------- .../conversation/ConversationMessage.java | 2 +- .../securesms/search/SearchRepository.java | 6 +- .../viewer/page/StoryViewerPageFragment.kt | 2 +- 4 files changed, 43 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiTextView.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiTextView.java index 9e21be37ff..056b5c8ad3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiTextView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiTextView.java @@ -94,7 +94,7 @@ public class EmojiTextView extends AppCompatTextView { forceJumboEmoji = a.getBoolean(R.styleable.EmojiTextView_emoji_forceJumbo, false); a.recycle(); - a = context.obtainStyledAttributes(attrs, new int[]{android.R.attr.textSize}); + a = context.obtainStyledAttributes(attrs, new int[] { android.R.attr.textSize }); originalFontSize = a.getDimensionPixelSize(0, 0); a.recycle(); @@ -116,22 +116,36 @@ public class EmojiTextView extends AppCompatTextView { @Override protected void onDraw(Canvas canvas) { isInOnDraw = true; - if (getText() instanceof Spanned && getLayout() != null) { - int checkpoint = canvas.save(); - canvas.translate(getTotalPaddingLeft(), getTotalPaddingTop()); - try { - if (renderMentions) { - mentionRendererDelegate.draw(canvas, (Spanned) getText(), getLayout()); - } - spoilerRendererDelegate.draw(canvas, (Spanned) getText(), getLayout()); - } finally { - canvas.restoreToCount(checkpoint); - } + + boolean hasSpannedText = getText() instanceof Spanned; + boolean hasLayout = getLayout() != null; + + if (hasSpannedText && hasLayout) { + drawSpecialRenderers(canvas, mentionRendererDelegate, spoilerRendererDelegate); } + super.onDraw(canvas); + + if (hasSpannedText && !hasLayout && getLayout() != null) { + drawSpecialRenderers(canvas, null, spoilerRendererDelegate); + } + isInOnDraw = false; } + private void drawSpecialRenderers(@NonNull Canvas canvas, @Nullable MentionRendererDelegate mentionDelegate, @NonNull SpoilerRendererDelegate spoilerDelegate) { + int checkpoint = canvas.save(); + canvas.translate(getTotalPaddingLeft(), getTotalPaddingTop()); + try { + if (mentionDelegate != null) { + mentionDelegate.draw(canvas, (Spanned) getText(), getLayout()); + } + spoilerDelegate.draw(canvas, (Spanned) getText(), getLayout()); + } finally { + canvas.restoreToCount(checkpoint); + } + } + @Override public void setText(@Nullable CharSequence text, BufferType type) { EmojiParser.CandidateList candidates = isInEditMode() ? null : EmojiProvider.getCandidates(text); @@ -214,7 +228,8 @@ public class EmojiTextView extends AppCompatTextView { int start = layout.getLineStart(lines - 1); if ((getLayoutDirection() == LAYOUT_DIRECTION_LTR && textDirection.isRtl(text, 0, text.length())) || - (getLayoutDirection() == LAYOUT_DIRECTION_RTL && !textDirection.isRtl(text, 0, text.length()))) { + (getLayoutDirection() == LAYOUT_DIRECTION_RTL && !textDirection.isRtl(text, 0, text.length()))) + { lastLineWidth = getMeasuredWidth(); } else { lastLineWidth = (int) getPaint().measureText(text, start, text.length()); @@ -340,10 +355,10 @@ public class EmojiTextView extends AppCompatTextView { return; } - int overflowEnd = getLayout().getLineEnd(maxLines - 1); - CharSequence overflow = getText().subSequence(overflowStart, overflowEnd); - float adjust = overflowText != null ? getPaint().measureText(overflowText, 0, overflowText.length()) : 0f; - CharSequence ellipsized = StringUtil.trim(TextUtils.ellipsize(overflow, getPaint(), getWidth() - adjust, TextUtils.TruncateAt.END)); + int overflowEnd = getLayout().getLineEnd(maxLines - 1); + CharSequence overflow = getText().subSequence(overflowStart, overflowEnd); + float adjust = overflowText != null ? getPaint().measureText(overflowText, 0, overflowText.length()) : 0f; + CharSequence ellipsized = StringUtil.trim(TextUtils.ellipsize(overflow, getPaint(), getWidth() - adjust, TextUtils.TruncateAt.END)); SpannableStringBuilder newContent = new SpannableStringBuilder(); newContent.append(getText().subSequence(0, overflowStart)) @@ -374,16 +389,16 @@ public class EmojiTextView extends AppCompatTextView { } private boolean unchanged(CharSequence text, CharSequence overflowText, BufferType bufferType) { - return Util.equals(previousText, text) && + return Util.equals(previousText, text) && Util.equals(previousOverflowText, overflowText) && - Util.equals(previousBufferType, bufferType) && - useSystemEmoji == useSystemEmoji() && - !sizeChangeInProgress && + Util.equals(previousBufferType, bufferType) && + useSystemEmoji == useSystemEmoji() && + !sizeChangeInProgress && previousTransformationMethod == getTransformationMethod(); } private boolean useSystemEmoji() { - return isInEditMode() || (!forceCustom && SignalStore.settings().isPreferSystemEmoji()); + return isInEditMode() || (!forceCustom && SignalStore.settings().isPreferSystemEmoji()); } @Override @@ -400,7 +415,7 @@ public class EmojiTextView extends AppCompatTextView { @Override public void invalidateDrawable(@NonNull Drawable drawable) { if (drawable instanceof EmojiProvider.EmojiDrawable) invalidate(); - else super.invalidateDrawable(drawable); + else super.invalidateDrawable(drawable); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java index bcfb4e5361..54a3fa80c5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java @@ -150,7 +150,7 @@ public class ConversationMessage { : BodyRangeUtil.adjustBodyRanges(messageRecord.getMessageRanges(), mentionsUpdate.getBodyAdjustments()); styledAndMentionBody = SpannableString.valueOf(mentionsUpdate != null ? mentionsUpdate.getBody() : body); - styleResult = MessageStyler.style(messageRecord.getId(), bodyRanges, styledAndMentionBody); + styleResult = MessageStyler.style(messageRecord.getDateSent(), bodyRanges, styledAndMentionBody); } return new ConversationMessage(messageRecord, diff --git a/app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.java b/app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.java index 5331caa6c4..ddc45817ec 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.java @@ -256,11 +256,11 @@ public class SearchRepository { if (ranges != null) { updatedBody = SpannableString.valueOf(updatedBody); - MessageStyler.style(result.getMessageId(), BodyRangeUtil.adjustBodyRanges(ranges, bodyAdjustments), (Spannable) updatedBody); + MessageStyler.style(result.getReceivedTimestampMs(), BodyRangeUtil.adjustBodyRanges(ranges, bodyAdjustments), (Spannable) updatedBody); updatedSnippet = SpannableString.valueOf(updatedSnippet); //noinspection ConstantConditions - updateSnippetWithStyles(result.getMessageId(), updatedBody, (SpannableString) updatedSnippet, BodyRangeUtil.adjustBodyRanges(ranges, snippetAdjustments)); + updateSnippetWithStyles(result.getReceivedTimestampMs(), updatedBody, (SpannableString) updatedSnippet, BodyRangeUtil.adjustBodyRanges(ranges, snippetAdjustments)); } updatedResults.add(new MessageResult(result.getConversationRecipient(), result.getMessageRecipient(), updatedBody, updatedSnippet, result.getThreadId(), result.getMessageId(), result.getReceivedTimestampMs(), result.isMms())); @@ -361,7 +361,7 @@ public class SearchRepository { SpannableString body = new SpannableString(record.getBody()); if (bodyRanges != null) { - MessageStyler.style(record.getId(), bodyRanges, body); + MessageStyler.style(record.getDateSent(), bodyRanges, body); } CharSequence updatedBody = MentionUtil.updateBodyAndMentionsWithDisplayNames(context, body, mentions).getBody(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt index 5f1d10abcb..2ab121da90 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt @@ -815,7 +815,7 @@ class StoryViewerPageFragment : val displayBodySpan = SpannableString(storyPost.content.attachment.caption ?: "") val ranges: BodyRangeList? = storyPost.conversationMessage.messageRecord.messageRanges if (ranges != null && displayBodySpan.isNotEmpty()) { - MessageStyler.style(storyPost.id, ranges, displayBodySpan) + MessageStyler.style(storyPost.conversationMessage.messageRecord.dateSent, ranges, displayBodySpan) } displayBodySpan