mirror of
https://codeberg.org/tom79/Fedilab.git
synced 2025-07-20 10:30:31 +03:00
Fix custom emojis
This commit is contained in:
parent
02a066a253
commit
2ff3e10303
14 changed files with 64 additions and 85 deletions
|
@ -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"
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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<View> viewWeakReference) {
|
||||
|
@ -106,16 +106,14 @@ public class Account implements Serializable {
|
|||
}
|
||||
|
||||
public synchronized Spannable getSpanDisplayNameTitle(Context context, WeakReference<View> 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<View> viewWeakReference) {
|
||||
return SpannableHelper.convert(context, note, null, this, null, viewWeakReference, null, true, false);
|
||||
}
|
||||
public synchronized Spannable getSpanNote(Context context, WeakReference<View> 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;
|
||||
|
|
|
@ -56,7 +56,7 @@ public class Announcement {
|
|||
|
||||
|
||||
public synchronized Spannable getSpanContent(Context context, WeakReference<View> viewWeakReference) {
|
||||
return SpannableHelper.convert(context, content, null, null, this, viewWeakReference, null, true, false);
|
||||
return SpannableHelper.convert(context, content, null, null, this, viewWeakReference, true, false);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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<View> 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);
|
||||
}
|
||||
|
|
|
@ -61,7 +61,7 @@ public class Poll implements Serializable {
|
|||
public transient Spannable span_title;
|
||||
|
||||
public Spannable getSpanTitle(Context context, Status status, WeakReference<View> 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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -155,23 +155,23 @@ public class Status implements Serializable, Cloneable {
|
|||
return same;
|
||||
}
|
||||
|
||||
public synchronized Spannable getSpanContent(Context context, boolean checkRemotely, WeakReference<View> viewWeakReference, Callback callback) {
|
||||
public synchronized Spannable getSpanContent(Context context, boolean checkRemotely, WeakReference<View> 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<View> viewWeakReference, Callback callback) {
|
||||
public synchronized Spannable getSpanSpoiler(Context context, WeakReference<View> 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<View> viewWeakReference, Callback callback) {
|
||||
public synchronized Spannable getSpanTranslate(Context context, WeakReference<View> 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;
|
||||
}
|
||||
|
|
|
@ -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<View> viewWeakReference;
|
||||
private float scale;
|
||||
private Drawable imageDrawable;
|
||||
private boolean callbackCalled;
|
||||
|
||||
CustomEmoji(WeakReference<View> viewWeakReference) {
|
||||
CustomImageSpan(WeakReference<View> 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<Emoji> 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<Drawable> getTarget(boolean animate, Status.Callback callback) {
|
||||
return new CustomTarget<Drawable>() {
|
||||
public Target<Drawable> getTarget(boolean animate) {
|
||||
return new CustomTarget<>() {
|
||||
@Override
|
||||
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> 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
|
|
@ -109,13 +109,13 @@ public class SpannableHelper {
|
|||
|
||||
public static Spannable convert(Context context, String text,
|
||||
Status status, Account account, Announcement announcement,
|
||||
WeakReference<View> viewWeakReference, Status.Callback callback, boolean convertHtml, boolean convertMarkdown) {
|
||||
return convert(context, text, status, account, announcement, false, viewWeakReference, callback, convertHtml, convertMarkdown);
|
||||
WeakReference<View> 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<View> viewWeakReference, Status.Callback callback, boolean convertHtml, boolean convertMarkdown) {
|
||||
WeakReference<View> 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<Emoji> 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<String, String> 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<Emoji> 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1418,7 +1418,7 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
|
|||
}
|
||||
holder.binding.statusContent.setText(
|
||||
status.getSpanContent(context, false,
|
||||
new WeakReference<>(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<RecyclerView.ViewHolder
|
|||
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);
|
||||
|
|
|
@ -199,7 +199,7 @@ public class ConversationAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
|||
holder.binding.spoiler.setVisibility(View.VISIBLE);
|
||||
holder.binding.spoiler.setText(
|
||||
conversation.last_status.getSpanSpoiler(context,
|
||||
new WeakReference<>(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<RecyclerView.ViewH
|
|||
//--- MAIN CONTENT ---
|
||||
holder.binding.statusContent.setText(
|
||||
conversation.last_status.getSpanContent(context, false,
|
||||
new WeakReference<>(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));
|
||||
|
|
|
@ -604,7 +604,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
|||
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<RecyclerView.ViewHolder>
|
|||
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<RecyclerView.ViewHolder>
|
|||
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<RecyclerView.ViewHolder>
|
|||
|
||||
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<RecyclerView.ViewHolder>
|
|||
//--- 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<RecyclerView.ViewHolder>
|
|||
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);
|
||||
|
|
|
@ -241,8 +241,7 @@ public class StatusDirectMessageAdapter extends RecyclerView.Adapter<RecyclerVie
|
|||
status.underlined = true;
|
||||
holder.binding.messageContent.setText(
|
||||
status.getSpanContent(context, false,
|
||||
new WeakReference<>(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) {
|
||||
|
|
|
@ -56,13 +56,13 @@ public class StatusHistoryAdapter extends RecyclerView.Adapter<RecyclerView.View
|
|||
Status status = statuses.get(position);
|
||||
holder.binding.statusContent.setText(
|
||||
status.getSpanContent(context, false,
|
||||
new WeakReference<>(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);
|
||||
|
|
Loading…
Reference in a new issue