Use Jsoup to hide quote link

This commit is contained in:
kyori19 2021-01-10 13:40:02 +09:00
parent 5b2a39fd12
commit d5f5c0b695
11 changed files with 28 additions and 32 deletions

View File

@ -194,4 +194,5 @@ dependencies {
androidTestImplementation "androidx.test.ext:junit:1.1.2"
implementation 'net.accelf:easter:1.0.2'
implementation 'org.jsoup:jsoup:1.13.1'
}

View File

@ -378,7 +378,7 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI
accountDisplayNameTextView.text = account.name.emojify(account.emojis, accountDisplayNameTextView)
val emojifiedNote = account.note.emojify(account.emojis, accountNoteTextView)
LinkHelper.setClickableText(accountNoteTextView, emojifiedNote, null, this, false)
LinkHelper.setClickableText(accountNoteTextView, emojifiedNote, null, this)
// accountFieldAdapter.fields = account.fields ?: emptyList()
accountFieldAdapter.emojis = account.emojis ?: emptyList()

View File

@ -26,7 +26,9 @@ import com.keylesspalace.tusky.entity.Emoji
import com.keylesspalace.tusky.entity.Field
import com.keylesspalace.tusky.entity.IdentityProof
import com.keylesspalace.tusky.interfaces.LinkListener
import com.keylesspalace.tusky.util.*
import com.keylesspalace.tusky.util.Either
import com.keylesspalace.tusky.util.LinkHelper
import com.keylesspalace.tusky.util.emojify
import kotlinx.android.synthetic.main.item_account_field.view.*
class AccountFieldAdapter(private val linkListener: LinkListener) : RecyclerView.Adapter<AccountFieldAdapter.ViewHolder>() {
@ -59,7 +61,7 @@ class AccountFieldAdapter(private val linkListener: LinkListener) : RecyclerView
viewHolder.nameTextView.text = emojifiedName
val emojifiedValue = field.value.emojify(emojis, viewHolder.valueTextView)
LinkHelper.setClickableText(viewHolder.valueTextView, emojifiedValue, null, linkListener, false)
LinkHelper.setClickableText(viewHolder.valueTextView, emojifiedValue, null, linkListener)
if(field.verifiedAt != null) {
viewHolder.valueTextView.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, R.drawable.ic_check_circle, 0)

View File

@ -651,8 +651,7 @@ public class NotificationsAdapter extends RecyclerView.Adapter {
}
CharSequence emojifiedText = CustomEmojiHelper.emojify(content, emojis, statusContent);
LinkHelper.setClickableText(statusContent, emojifiedText, statusViewData.getMentions(), listener,
statusViewData.getQuote() != null);
LinkHelper.setClickableText(statusContent, emojifiedText, statusViewData.getMentions(), listener);
CharSequence emojifiedContentWarning =
CustomEmojiHelper.emojify(statusViewData.getSpoilerText(), statusViewData.getStatusEmojis(), contentWarningDescriptionTextView);

View File

@ -212,8 +212,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
@NonNull List<Emoji> emojis,
@Nullable PollViewData poll,
@NonNull StatusDisplayOptions statusDisplayOptions,
final StatusActionListener listener,
boolean removeQuote) {
final StatusActionListener listener) {
boolean sensitive = !TextUtils.isEmpty(spoilerText);
if (sensitive) {
CharSequence emojiSpoiler = CustomEmojiHelper.emojify(spoilerText, emojis, contentWarningDescription);
@ -228,13 +227,13 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
}
setContentWarningButtonText(!expanded);
this.setTextVisible(sensitive, !expanded, content, mentions, emojis, poll, statusDisplayOptions, listener, removeQuote);
this.setTextVisible(sensitive, !expanded, content, mentions, emojis, poll, statusDisplayOptions, listener);
});
this.setTextVisible(sensitive, expanded, content, mentions, emojis, poll, statusDisplayOptions, listener, removeQuote);
this.setTextVisible(sensitive, expanded, content, mentions, emojis, poll, statusDisplayOptions, listener);
} else {
contentWarningDescription.setVisibility(View.GONE);
contentWarningButton.setVisibility(View.GONE);
this.setTextVisible(sensitive, true, content, mentions, emojis, poll, statusDisplayOptions, listener, removeQuote);
this.setTextVisible(sensitive, true, content, mentions, emojis, poll, statusDisplayOptions, listener);
}
}
@ -253,11 +252,10 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
List<Emoji> emojis,
@Nullable PollViewData poll,
StatusDisplayOptions statusDisplayOptions,
final StatusActionListener listener,
boolean removeQuote) {
final StatusActionListener listener) {
if (expanded) {
CharSequence emojifiedText = CustomEmojiHelper.emojify(content, emojis, this.content);
LinkHelper.setClickableText(this.content, emojifiedText, mentions, listener, removeQuote);
LinkHelper.setClickableText(this.content, emojifiedText, mentions, listener);
for (int i = 0; i < mediaLabels.length; ++i) {
updateMediaLabel(i, sensitive, expanded);
}
@ -857,7 +855,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
setRebloggingEnabled(status.getRebloggingEnabled(), status.getVisibility());
setQuoteEnabled(status.getRebloggingEnabled() && !status.isNotestock(), status.getVisibility());
setSpoilerAndContent(status.isExpanded(), status.getContent(), status.getSpoilerText(), status.getMentions(), status.getStatusEmojis(), status.getPoll(), statusDisplayOptions, listener, status.getQuote() != null);
setSpoilerAndContent(status.isExpanded(), status.getContent(), status.getSpoilerText(), status.getMentions(), status.getStatusEmojis(), status.getPoll(), statusDisplayOptions, listener);
setDescriptionForStatus(status, statusDisplayOptions);

View File

@ -68,7 +68,7 @@ class AnnouncementAdapter(
private val addReactionChip: Chip = view.addReactionChip
fun bind(item: Announcement) {
LinkHelper.setClickableText(text, item.content, null, listener, false)
LinkHelper.setClickableText(text, item.content, null, listener)
// If wellbeing mode is enabled, announcement badge counts should not be shown.
if (wellbeingEnabled) {

View File

@ -109,7 +109,7 @@ public class ConversationViewHolder extends StatusBaseViewHolder {
setSpoilerAndContent(status.getExpanded(), status.getContent(), status.getSpoilerText(),
status.getMentions(), status.getEmojis(),
PollViewDataKt.toViewData(status.getPoll()), statusDisplayOptions, listener, false);
PollViewDataKt.toViewData(status.getPoll()), statusDisplayOptions, listener);
setConversationName(conversation.getAccounts());

View File

@ -127,7 +127,7 @@ class StatusViewHolder(
removeQuote: Boolean) {
if (expanded) {
val emojifiedText = content.emojify(emojis, itemView.statusContent)
LinkHelper.setClickableText(itemView.statusContent, emojifiedText, mentions, listener, removeQuote)
LinkHelper.setClickableText(itemView.statusContent, emojifiedText, mentions, listener)
} else {
LinkHelper.setClickableMentions(itemView.statusContent, mentions, listener)
}
@ -179,4 +179,4 @@ class StatusViewHolder(
}
private fun status() = getStatusForPosition(adapterPosition)
}
}

View File

@ -16,11 +16,11 @@
package com.keylesspalace.tusky.json
import android.text.Spanned
import android.text.SpannedString
import androidx.core.text.HtmlCompat
import androidx.core.text.parseAsHtml
import com.google.gson.*
import com.keylesspalace.tusky.util.trimTrailingWhitespace
import org.jsoup.Jsoup
import java.lang.reflect.Type
class SpannedTypeAdapter : JsonDeserializer<Spanned>, JsonSerializer<Spanned?> {
@ -28,10 +28,14 @@ class SpannedTypeAdapter : JsonDeserializer<Spanned>, JsonSerializer<Spanned?> {
override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): Spanned {
/* Html.fromHtml returns trailing whitespace if the html ends in a </p> tag, which
* all status contents do, so it should be trimmed. */
return json.asString?.parseAsHtml()?.trimTrailingWhitespace() ?: SpannedString("")
return Jsoup.parse(json.asString ?: "")
.apply {
select(".quote-inline").forEach { it.remove() }
}
.html().parseAsHtml().trimTrailingWhitespace()
}
override fun serialize(src: Spanned?, typeOfSrc: Type, context: JsonSerializationContext): JsonElement {
return JsonPrimitive(HtmlCompat.toHtml(src!!, HtmlCompat.TO_HTML_PARAGRAPH_LINES_INDIVIDUAL))
}
}
}

View File

@ -69,8 +69,7 @@ public class LinkHelper {
* @param listener to notify about particular spans that are clicked
*/
public static void setClickableText(TextView view, CharSequence content,
@Nullable Status.Mention[] mentions, final LinkListener listener,
boolean removeQuote) {
@Nullable Status.Mention[] mentions, final LinkListener listener) {
SpannableStringBuilder builder = SpannableStringBuilder.valueOf(content);
URLSpan[] urlSpans = builder.getSpans(0, content.length(), URLSpan.class);
for (URLSpan span : urlSpans) {
@ -127,13 +126,6 @@ public class LinkHelper {
builder.subSequence(end, end + 1).toString().equals("\n")){
builder.insert(end, "\u200B");
}
if (start >= 13 && end < builder.length() && removeQuote) {
if (builder.subSequence(start - 13, start).toString().equals("\n~~~~~~~~~~\n[")
&& builder.subSequence(end, end + 1).toString().equals("]")) {
builder.delete(start - 13, end + 1);
}
}
}
view.setText(builder);

View File

@ -70,7 +70,7 @@ public class QuoteInlineHelper {
LinkListener listener) {
Spanned singleLineText = SpannedTextHelper.replaceSpanned(content);
CharSequence emojifiedText = CustomEmojiHelper.emojify(singleLineText, emojis, quoteContent);
LinkHelper.setClickableText(quoteContent, emojifiedText, mentions, listener, false);
LinkHelper.setClickableText(quoteContent, emojifiedText, mentions, listener);
}
private void setAvatar(String url, @Px int avatarRadius24dp, StatusDisplayOptions statusDisplayOptions) {
@ -136,4 +136,4 @@ public class QuoteInlineHelper {
quoteStatus.getAttachments().size()));
}
}
}
}