Use Jsoup to hide quote link
This commit is contained in:
parent
5b2a39fd12
commit
d5f5c0b695
|
@ -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'
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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());
|
||||
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue