diff --git a/app/build.gradle b/app/build.gradle index 8b6ae325..8518e1c0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -141,7 +141,7 @@ dependencies { implementation("com.vanniktech:android-image-cropper:4.3.3") annotationProcessor "com.github.bumptech.glide:compiler:4.12.0" implementation 'jp.wasabeef:glide-transformations:4.3.0' - implementation 'com.github.penfeizhou.android.animation:glide-plugin:2.23.0' + implementation 'com.github.penfeizhou.android.animation:glide-plugin:3.0.5' implementation 'androidx.media3:media3-exoplayer-hls:1.2.1' implementation "androidx.media3:media3-exoplayer:1.2.1" implementation "androidx.media3:media3-exoplayer-dash:1.2.1" diff --git a/app/src/main/java/app/fedilab/android/mastodon/activities/ProfileActivity.java b/app/src/main/java/app/fedilab/android/mastodon/activities/ProfileActivity.java index 1588c20c..4594e545 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/activities/ProfileActivity.java +++ b/app/src/main/java/app/fedilab/android/mastodon/activities/ProfileActivity.java @@ -540,13 +540,7 @@ public class ProfileActivity extends BaseActivity { }); binding.accountNote.setText( account.getSpanNote(ProfileActivity.this, - new WeakReference<>(binding.accountNote), () -> { - //TODO: replace this hack - binding.accountNote.setText( - account.getSpanNote(ProfileActivity.this, - new WeakReference<>(binding.accountNote)), TextView.BufferType.SPANNABLE); - - }), + new WeakReference<>(binding.accountNote)), TextView.BufferType.SPANNABLE); binding.accountNote.setMovementMethod(LinkMovementMethod.getInstance()); diff --git a/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Account.java b/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Account.java index 2408db28..778e915f 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Account.java +++ b/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Account.java @@ -95,7 +95,7 @@ public class Account implements Serializable { if (display_name == null || display_name.isEmpty()) { display_name = username; } - return SpannableHelper.convert(context, display_name, null, this, null, viewWeakReference, null, true, false); + return SpannableHelper.convert(context, display_name, null, this, null, viewWeakReference, true, false); } public synchronized Spannable getSpanDisplayNameEmoji(Activity activity, WeakReference viewWeakReference) { @@ -106,16 +106,14 @@ public class Account implements Serializable { } public synchronized Spannable getSpanDisplayNameTitle(Context context, WeakReference viewWeakReference, String title) { - return SpannableHelper.convert(context, title, null, this, null, viewWeakReference, null, true, false); + return SpannableHelper.convert(context, title, null, this, null, viewWeakReference, true, false); } public synchronized Spannable getSpanNote(Context context, WeakReference viewWeakReference) { - return SpannableHelper.convert(context, note, null, this, null, viewWeakReference, null, true, false); - } - public synchronized Spannable getSpanNote(Context context, WeakReference viewWeakReference, Status.Callback callback) { - return SpannableHelper.convert(context, note, null, this, null, viewWeakReference, callback, true, false); + return SpannableHelper.convert(context, note, null, this, null, viewWeakReference, true, false); } + @Override public boolean equals(@Nullable Object obj) { boolean same = false; diff --git a/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Announcement.java b/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Announcement.java index b429bb7d..b9ed4556 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Announcement.java +++ b/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Announcement.java @@ -56,7 +56,7 @@ public class Announcement { public synchronized Spannable getSpanContent(Context context, WeakReference viewWeakReference) { - return SpannableHelper.convert(context, content, null, null, this, viewWeakReference, null, true, false); + return SpannableHelper.convert(context, content, null, null, this, viewWeakReference, true, false); } } diff --git a/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Field.java b/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Field.java index 9b8551ff..b8ee4bf9 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Field.java +++ b/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Field.java @@ -47,7 +47,7 @@ public class Field implements Serializable { if (verified_at != null && value != null) { value_span = new ForegroundColorSpan(ContextCompat.getColor(context, R.color.verified_text)); } - Spannable spannable = SpannableHelper.convert(context, value, null, account, null, viewWeakReference, null, true, false); + Spannable spannable = SpannableHelper.convert(context, value, null, account, null, viewWeakReference, true, false); if (value_span != null && spannable != null) { spannable.setSpan(value_span, 0, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } @@ -57,7 +57,7 @@ public class Field implements Serializable { public synchronized Spannable getLabelSpan(Context context, Account account, WeakReference viewWeakReference) { - Spannable spannable = SpannableHelper.convert(context, name, null, account, null, viewWeakReference, null, true, false); + Spannable spannable = SpannableHelper.convert(context, name, null, account, null, viewWeakReference, true, false); if (name_span != null && spannable != null) { spannable.setSpan(name_span, 0, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } diff --git a/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Poll.java b/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Poll.java index 87269a59..c8577783 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Poll.java +++ b/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Poll.java @@ -61,7 +61,7 @@ public class Poll implements Serializable { public transient Spannable span_title; public Spannable getSpanTitle(Context context, Status status, WeakReference viewWeakReference) { - span_title = SpannableHelper.convert(context, title, status, null, null, viewWeakReference, null, false, false); + span_title = SpannableHelper.convert(context, title, status, null, null, viewWeakReference, false, false); return span_title; } } diff --git a/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Status.java b/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Status.java index 94a7d08f..f47ce735 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Status.java +++ b/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Status.java @@ -155,23 +155,23 @@ public class Status implements Serializable, Cloneable { return same; } - public synchronized Spannable getSpanContent(Context context, boolean checkRemotely, WeakReference viewWeakReference, Callback callback) { + public synchronized Spannable getSpanContent(Context context, boolean checkRemotely, WeakReference viewWeakReference) { if (contentSpan == null) { - contentSpan = SpannableHelper.convert(context, content, this, null, null, checkRemotely, viewWeakReference, callback, true, true); + contentSpan = SpannableHelper.convert(context, content, this, null, null, checkRemotely, viewWeakReference, true, true); } return contentSpan; } - public synchronized Spannable getSpanSpoiler(Context context, WeakReference viewWeakReference, Callback callback) { + public synchronized Spannable getSpanSpoiler(Context context, WeakReference viewWeakReference) { if (contentSpoilerSpan == null) { - contentSpoilerSpan = SpannableHelper.convert(context, spoiler_text, this, null, null, viewWeakReference, callback, true, false); + contentSpoilerSpan = SpannableHelper.convert(context, spoiler_text, this, null, null, viewWeakReference, true, false); } return contentSpoilerSpan; } - public synchronized Spannable getSpanTranslate(Context context, WeakReference viewWeakReference, Callback callback) { + public synchronized Spannable getSpanTranslate(Context context, WeakReference viewWeakReference) { if (contentTranslateSpan == null) { - contentTranslateSpan = SpannableHelper.convert(context, translationContent, this, null, null, viewWeakReference, callback, true, true); + contentTranslateSpan = SpannableHelper.convert(context, translationContent, this, null, null, viewWeakReference, true, true); } return contentTranslateSpan; } diff --git a/app/src/main/java/app/fedilab/android/mastodon/helper/CustomEmoji.java b/app/src/main/java/app/fedilab/android/mastodon/helper/CustomImageSpan.java similarity index 73% rename from app/src/main/java/app/fedilab/android/mastodon/helper/CustomEmoji.java rename to app/src/main/java/app/fedilab/android/mastodon/helper/CustomImageSpan.java index 69e02ad7..31186e88 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/helper/CustomEmoji.java +++ b/app/src/main/java/app/fedilab/android/mastodon/helper/CustomImageSpan.java @@ -20,22 +20,20 @@ import com.bumptech.glide.request.target.Target; import com.bumptech.glide.request.transition.Transition; import java.lang.ref.WeakReference; -import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import app.fedilab.android.R; import app.fedilab.android.mastodon.client.entities.api.Emoji; -import app.fedilab.android.mastodon.client.entities.api.Status; -public class CustomEmoji extends ReplacementSpan { + +public class CustomImageSpan extends ReplacementSpan { private final WeakReference viewWeakReference; private float scale; private Drawable imageDrawable; - private boolean callbackCalled; - CustomEmoji(WeakReference viewWeakReference) { + CustomImageSpan(WeakReference viewWeakReference) { Context mContext = viewWeakReference.get().getContext(); this.viewWeakReference = viewWeakReference; SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(mContext); @@ -43,27 +41,21 @@ public class CustomEmoji extends ReplacementSpan { if (scale > 1.3f) { scale = 1.3f; } - callbackCalled = false; } - public SpannableStringBuilder makeEmoji(SpannableStringBuilder content, List emojiList, boolean animate, Status.Callback callback) { - if (emojiList != null && emojiList.size() > 0) { - int count = 1; - for (Emoji emoji : emojiList) { - Matcher matcher = Pattern.compile(":" + emoji.shortcode + ":", Pattern.LITERAL) - .matcher(content); - while (matcher.find()) { - CustomEmoji customEmoji = new CustomEmoji(new WeakReference<>(viewWeakReference.get())); - content.setSpan(customEmoji, matcher.start(), matcher.end(), 0); - Glide.with(viewWeakReference.get()) - .asDrawable() - .load(animate ? emoji.url : emoji.static_url) - .into(customEmoji.getTarget(animate, count == emojiList.size() && !callbackCalled ? callback : null)); - } - count++; + public void makeEmoji(SpannableStringBuilder content, Emoji emoji, boolean animate) { + if (emoji != null) { + Matcher matcher = Pattern.compile(":" + emoji.shortcode + ":", Pattern.LITERAL) + .matcher(content); + while (matcher.find()) { + CustomImageSpan customEmoji = new CustomImageSpan(new WeakReference<>(viewWeakReference.get())); + content.setSpan(customEmoji, matcher.start(), matcher.end(), 0); + Glide.with(viewWeakReference.get()) + .asDrawable() + .load(animate ? emoji.url : emoji.static_url) + .into(customEmoji.getTarget(animate)); } } - return content; } @Override @@ -85,15 +77,15 @@ public class CustomEmoji extends ReplacementSpan { int emojiSize = (int) (paint.getTextSize() * scale); imageDrawable.setBounds(0, 0, emojiSize, emojiSize); int transY = bottom - imageDrawable.getBounds().bottom; - transY -= paint.getFontMetrics().descent / 2; + transY -= (int) (paint.getFontMetrics().descent / 2); canvas.translate(x, (float) transY); imageDrawable.draw(canvas); canvas.restore(); } } - public Target getTarget(boolean animate, Status.Callback callback) { - return new CustomTarget() { + public Target getTarget(boolean animate) { + return new CustomTarget<>() { @Override public void onResourceReady(@NonNull Drawable resource, @Nullable Transition transition) { View view = viewWeakReference.get(); @@ -131,10 +123,6 @@ public class CustomEmoji extends ReplacementSpan { if (view != null) { view.invalidate(); } - if (callback != null && !callbackCalled) { - callbackCalled = true; - callback.emojiFetched(); - } } @Override diff --git a/app/src/main/java/app/fedilab/android/mastodon/helper/SpannableHelper.java b/app/src/main/java/app/fedilab/android/mastodon/helper/SpannableHelper.java index 0a3f34e3..bd9c3d0d 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/helper/SpannableHelper.java +++ b/app/src/main/java/app/fedilab/android/mastodon/helper/SpannableHelper.java @@ -109,13 +109,13 @@ public class SpannableHelper { public static Spannable convert(Context context, String text, Status status, Account account, Announcement announcement, - WeakReference viewWeakReference, Status.Callback callback, boolean convertHtml, boolean convertMarkdown) { - return convert(context, text, status, account, announcement, false, viewWeakReference, callback, convertHtml, convertMarkdown); + WeakReference viewWeakReference, boolean convertHtml, boolean convertMarkdown) { + return convert(context, text, status, account, announcement, false, viewWeakReference, convertHtml, convertMarkdown); } public static Spannable convert(Context context, String text, Status status, Account account, Announcement announcement, boolean checkRemotely, - WeakReference viewWeakReference, Status.Callback callback, boolean convertHtml, boolean convertMarkdown) { + WeakReference viewWeakReference, boolean convertHtml, boolean convertMarkdown) { if (text == null) { return null; } @@ -365,7 +365,6 @@ public class SpannableHelper { text = text.replaceAll(Pattern.quote(matcherImg.group()), replacement); } - View view = viewWeakReference.get(); List emojiList = null; if (status != null) { emojiList = status.emojis; @@ -375,21 +374,26 @@ public class SpannableHelper { emojiList = announcement.emojis; } boolean animate = !sharedpreferences.getBoolean(context.getString(R.string.SET_DISABLE_ANIMATED_EMOJI), false); - CustomEmoji customEmoji = new CustomEmoji(new WeakReference<>(view)); - content = customEmoji.makeEmoji(content, emojiList, animate, callback); + if(emojiList != null) { + emojiList.forEach(emoji -> { + CustomImageSpan customImageSpan = new CustomImageSpan(viewWeakReference); + customImageSpan.makeEmoji(content, emoji, animate); + }); + } if (!imagesToReplace.isEmpty()) { for (Map.Entry entry : imagesToReplace.entrySet()) { + CustomImageSpan customImageSpan = new CustomImageSpan(viewWeakReference); String key = entry.getKey(); String url = entry.getValue(); Matcher matcher = Pattern.compile(key, Pattern.LITERAL) .matcher(content); while (matcher.find()) { - content.setSpan(customEmoji, matcher.start(), matcher.end(), 0); - Glide.with(view) + content.setSpan(customImageSpan, matcher.start(), matcher.end(), 0); + Glide.with(viewWeakReference.get().getContext()) .asDrawable() .load(url) - .into(customEmoji.getTarget(animate, null)); + .into(customImageSpan.getTarget(animate)); } } @@ -990,18 +994,18 @@ public class SpannableHelper { List emojiList = account.emojis; SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(activity); boolean animate = !sharedpreferences.getBoolean(activity.getString(R.string.SET_DISABLE_ANIMATED_EMOJI), false); - if (emojiList != null && emojiList.size() > 0) { + if (emojiList != null && !emojiList.isEmpty()) { for (Emoji emoji : emojiList) { Matcher matcher = Pattern.compile(":" + emoji.shortcode + ":", Pattern.LITERAL) .matcher(content); while (matcher.find()) { - CustomEmoji customEmoji = new CustomEmoji(new WeakReference<>(viewWeakReference.get())); - content.setSpan(customEmoji, matcher.start(), matcher.end(), 0); + CustomImageSpan customImageSpan = new CustomImageSpan(viewWeakReference); + content.setSpan(customImageSpan, matcher.start(), matcher.end(), 0); if (Helper.isValidContextForGlide(activity)) { - Glide.with(viewWeakReference.get()) + Glide.with(viewWeakReference.get().getContext()) .asDrawable() .load(animate ? emoji.url : emoji.static_url) - .into(customEmoji.getTarget(animate, null)); + .into(customImageSpan.getTarget(animate)); } } } diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ComposeAdapter.java b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ComposeAdapter.java index c620dfa8..704342ca 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ComposeAdapter.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ComposeAdapter.java @@ -1418,7 +1418,7 @@ public class ComposeAdapter extends RecyclerView.Adapter(holder.binding.statusContent), () -> mRecyclerView.post(() -> notifyItemChanged(position))), + new WeakReference<>(holder.binding.statusContent)), TextView.BufferType.SPANNABLE); holder.binding.statusContent.setMovementMethod(LongClickLinkMovementMethod.getInstance()); MastodonHelper.loadPPMastodon(holder.binding.avatar, status.account); @@ -1434,7 +1434,7 @@ public class ComposeAdapter extends RecyclerView.Adapter(holder.binding.spoiler), null), + new WeakReference<>(holder.binding.spoiler)), TextView.BufferType.SPANNABLE); } else { holder.binding.spoiler.setVisibility(View.GONE); diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ConversationAdapter.java b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ConversationAdapter.java index 0ce5ecd9..b93c5f00 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ConversationAdapter.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ConversationAdapter.java @@ -199,7 +199,7 @@ public class ConversationAdapter extends RecyclerView.Adapter(holder.binding.spoiler), () -> mRecyclerView.post(() -> notifyItemChanged(holder.getBindingAdapterPosition()))), + new WeakReference<>(holder.binding.spoiler)), TextView.BufferType.SPANNABLE); } else { holder.binding.spoiler.setVisibility(View.GONE); @@ -209,7 +209,7 @@ public class ConversationAdapter extends RecyclerView.Adapter(holder.binding.statusContent), () -> mRecyclerView.post(() -> notifyItemChanged(holder.getBindingAdapterPosition()))), + new WeakReference<>(holder.binding.statusContent)), TextView.BufferType.SPANNABLE); //--- DATE --- holder.binding.lastMessageDate.setText(Helper.dateDiff(context, conversation.last_status.created_at)); diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java index eab59d9b..2cb0e454 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java @@ -604,7 +604,7 @@ public class StatusAdapter extends RecyclerView.Adapter holder.binding.quotedMessage.cardviewContainer.setStrokeColor(ThemeHelper.getAttColor(context, R.attr.colorPrimary)); holder.binding.quotedMessage.statusContent.setText( statusToDeal.quote.getSpanContent(context, remote, - new WeakReference<>(holder.binding.quotedMessage.statusContent), null), + new WeakReference<>(holder.binding.quotedMessage.statusContent)), TextView.BufferType.SPANNABLE); MastodonHelper.loadPPMastodon(holder.binding.quotedMessage.avatar, statusToDeal.quote.account); if (statusToDeal.quote.account != null) { @@ -619,7 +619,7 @@ public class StatusAdapter extends RecyclerView.Adapter holder.binding.quotedMessage.spoiler.setVisibility(View.VISIBLE); holder.binding.quotedMessage.spoiler.setText( statusToDeal.quote.getSpanSpoiler(context, - new WeakReference<>(holder.binding.quotedMessage.spoiler), null), + new WeakReference<>(holder.binding.quotedMessage.spoiler)), TextView.BufferType.SPANNABLE); } else { holder.binding.quotedMessage.spoiler.setVisibility(View.GONE); @@ -1440,7 +1440,7 @@ public class StatusAdapter extends RecyclerView.Adapter holder.binding.spoiler.setVisibility(View.VISIBLE); holder.binding.spoiler.setText( statusToDeal.getSpanSpoiler(context, - new WeakReference<>(holder.binding.spoiler), () -> recyclerView.post(() -> adapter.notifyItemChanged(holder.getBindingAdapterPosition()))), + new WeakReference<>(holder.binding.spoiler)), TextView.BufferType.SPANNABLE); statusToDeal.isExpended = true; } else { @@ -1453,7 +1453,7 @@ public class StatusAdapter extends RecyclerView.Adapter holder.binding.spoiler.setText( statusToDeal.getSpanSpoiler(context, - new WeakReference<>(holder.binding.spoiler), () -> recyclerView.post(() -> adapter.notifyItemChanged(holder.getBindingAdapterPosition()))), + new WeakReference<>(holder.binding.spoiler)), TextView.BufferType.SPANNABLE); } if (statusToDeal.isExpended) { @@ -1506,9 +1506,7 @@ public class StatusAdapter extends RecyclerView.Adapter //--- MAIN CONTENT --- holder.binding.statusContent.setText( statusToDeal.getSpanContent(context, remote, - new WeakReference<>(holder.binding.statusContent), () -> { - recyclerView.post(() -> adapter.notifyItemChanged(holder.getBindingAdapterPosition())); - }), + new WeakReference<>(holder.binding.statusContent)), TextView.BufferType.SPANNABLE); if (truncate_toots_size > 0) { holder.binding.statusContent.setMaxLines(truncate_toots_size); @@ -1533,9 +1531,7 @@ public class StatusAdapter extends RecyclerView.Adapter holder.binding.containerTrans.setVisibility(View.VISIBLE); holder.binding.statusContentTranslated.setText( statusToDeal.getSpanTranslate(context, - new WeakReference<>(holder.binding.statusContentTranslated), () -> { - recyclerView.post(() -> adapter.notifyItemChanged(holder.getBindingAdapterPosition())); - }), + new WeakReference<>(holder.binding.statusContentTranslated)), TextView.BufferType.SPANNABLE); } else { holder.binding.containerTrans.setVisibility(View.GONE); diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusDirectMessageAdapter.java b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusDirectMessageAdapter.java index 9485ee72..54686aa1 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusDirectMessageAdapter.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusDirectMessageAdapter.java @@ -241,8 +241,7 @@ public class StatusDirectMessageAdapter extends RecyclerView.Adapter(holder.binding.messageContent), - () -> mRecyclerView.post(() -> notifyItemChanged(holder.getBindingAdapterPosition()))), + new WeakReference<>(holder.binding.messageContent)), TextView.BufferType.SPANNABLE); holder.binding.messageContent.setMovementMethod(LongClickLinkMovementMethod.getInstance()); if (measuredWidth <= 0 && status.media_attachments != null && status.media_attachments.size() > 0) { diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusHistoryAdapter.java b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusHistoryAdapter.java index 9eb5f25d..84e29693 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusHistoryAdapter.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusHistoryAdapter.java @@ -56,13 +56,13 @@ public class StatusHistoryAdapter extends RecyclerView.Adapter(holder.binding.statusContent), null), + new WeakReference<>(holder.binding.statusContent)), TextView.BufferType.SPANNABLE); if (status.spoiler_text != null && !status.spoiler_text.trim().isEmpty()) { holder.binding.spoiler.setVisibility(View.VISIBLE); holder.binding.spoiler.setText( status.getSpanSpoiler(context, - new WeakReference<>(holder.binding.spoiler), null), + new WeakReference<>(holder.binding.spoiler)), TextView.BufferType.SPANNABLE); } else { holder.binding.spoiler.setVisibility(View.GONE);