From 6cb7db37a5cf151f1996e322952cc42003722280 Mon Sep 17 00:00:00 2001 From: Garrit Franke <32395585+garritfra@users.noreply.github.com> Date: Fri, 15 Jan 2021 21:16:32 +0100 Subject: [PATCH] Show display names for reposts (#2041) * WIP: Show display names for reposts * Display emojis on reposts * Move unicode wrapping Co-authored-by: Garrit Franke --- .../tusky/adapter/StatusViewHolder.java | 12 ++++++++---- .../tusky/util/ViewDataUtils.java | 3 ++- .../tusky/viewdata/StatusViewData.java | 19 ++++++++++++++++--- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusViewHolder.java b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusViewHolder.java index b189ce16..4043f904 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusViewHolder.java @@ -28,8 +28,10 @@ import androidx.recyclerview.widget.RecyclerView; import com.keylesspalace.tusky.R; import com.keylesspalace.tusky.interfaces.StatusActionListener; +import com.keylesspalace.tusky.util.CustomEmojiHelper; import com.keylesspalace.tusky.util.SmartLengthInputFilter; import com.keylesspalace.tusky.util.StatusDisplayOptions; +import com.keylesspalace.tusky.util.StringUtils; import com.keylesspalace.tusky.viewdata.StatusViewData; import at.connyduck.sparkbutton.helpers.Utils; @@ -67,7 +69,7 @@ public class StatusViewHolder extends StatusBaseViewHolder { if (rebloggedByDisplayName == null) { hideStatusInfo(); } else { - setRebloggedByDisplayName(rebloggedByDisplayName); + setRebloggedByDisplayName(rebloggedByDisplayName, status); statusInfo.setOnClickListener(v -> listener.onOpenReblog(getAdapterPosition())); } @@ -83,10 +85,12 @@ public class StatusViewHolder extends StatusBaseViewHolder { } - private void setRebloggedByDisplayName(final String name) { + private void setRebloggedByDisplayName(final CharSequence name, final StatusViewData.Concrete status) { Context context = statusInfo.getContext(); - String boostedText = context.getString(R.string.status_boosted_format, name); - statusInfo.setText(boostedText); + CharSequence wrappedName = StringUtils.unicodeWrap(name); + CharSequence boostedText = context.getString(R.string.status_boosted_format, wrappedName); + CharSequence emojifiedText = CustomEmojiHelper.emojify(boostedText, status.getRebloggedByAccountEmojis(), statusInfo); + statusInfo.setText(emojifiedText); statusInfo.setVisibility(View.VISIBLE); } diff --git a/app/src/main/java/com/keylesspalace/tusky/util/ViewDataUtils.java b/app/src/main/java/com/keylesspalace/tusky/util/ViewDataUtils.java index d9bd3584..abcd8d83 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/ViewDataUtils.java +++ b/app/src/main/java/com/keylesspalace/tusky/util/ViewDataUtils.java @@ -58,7 +58,7 @@ public final class ViewDataUtils { .setSensitive(visibleStatus.getSensitive()) .setIsShowingSensitiveContent(alwaysShowSensitiveMedia || !visibleStatus.getSensitive()) .setSpoilerText(visibleStatus.getSpoilerText()) - .setRebloggedByUsername(status.getReblog() == null ? null : status.getAccount().getUsername()) + .setRebloggedByUsername(status.getReblog() == null ? null : status.getAccount().getDisplayName()) .setUserFullName(visibleStatus.getAccount().getName()) .setVisibility(visibleStatus.getVisibility()) .setSenderId(visibleStatus.getAccount().getId()) @@ -66,6 +66,7 @@ public final class ViewDataUtils { .setApplication(visibleStatus.getApplication()) .setStatusEmojis(visibleStatus.getEmojis()) .setAccountEmojis(visibleStatus.getAccount().getEmojis()) + .setRebloggedByEmojis(status.getReblog() == null ? null : status.getAccount().getEmojis()) .setCollapsible(SmartLengthInputFilterKt.shouldTrimStatus(visibleStatus.getContent())) .setCollapsed(true) .setPoll(visibleStatus.getPoll()) diff --git a/app/src/main/java/com/keylesspalace/tusky/viewdata/StatusViewData.java b/app/src/main/java/com/keylesspalace/tusky/viewdata/StatusViewData.java index af608151..800eb71c 100644 --- a/app/src/main/java/com/keylesspalace/tusky/viewdata/StatusViewData.java +++ b/app/src/main/java/com/keylesspalace/tusky/viewdata/StatusViewData.java @@ -16,10 +16,11 @@ package com.keylesspalace.tusky.viewdata; import android.os.Build; -import androidx.annotation.Nullable; import android.text.SpannableStringBuilder; import android.text.Spanned; +import androidx.annotation.Nullable; + import com.keylesspalace.tusky.entity.Attachment; import com.keylesspalace.tusky.entity.Card; import com.keylesspalace.tusky.entity.Emoji; @@ -87,6 +88,7 @@ public abstract class StatusViewData { private final Status.Application application; private final List statusEmojis; private final List accountEmojis; + private final List rebloggedByAccountEmojis; @Nullable private final Card card; private final boolean isCollapsible; /** Whether the status meets the requirement to be collapse */ @@ -108,7 +110,7 @@ public abstract class StatusViewData { boolean isShowingContent, String userFullName, String nickname, String avatar, Date createdAt, int reblogsCount, int favouritesCount, @Nullable String inReplyToId, @Nullable String inReplyToAccountAcct, @Nullable Status.Mention[] mentions, String senderId, boolean rebloggingEnabled, - Status.Application application, List statusEmojis, List accountEmojis, @Nullable Card card, + Status.Application application, List statusEmojis, List accountEmojis, List rebloggedByAccountEmojis, @Nullable Card card, boolean isCollapsible, boolean isCollapsed, @Nullable PollViewData poll, boolean isBot, boolean isMuted, boolean isThreadMuted, boolean isUserMuted, int conversationId, @Nullable List emojiReactions, boolean parentVisible) { @@ -146,6 +148,7 @@ public abstract class StatusViewData { this.application = application; this.statusEmojis = statusEmojis; this.accountEmojis = accountEmojis; + this.rebloggedByAccountEmojis = rebloggedByAccountEmojis; this.card = card; this.isCollapsible = isCollapsible; this.isCollapsed = isCollapsed; @@ -281,6 +284,10 @@ public abstract class StatusViewData { return parentVisible; } + public List getRebloggedByAccountEmojis() { + return rebloggedByAccountEmojis; + } + @Nullable public Card getCard() { return card; @@ -365,6 +372,7 @@ public abstract class StatusViewData { Objects.equals(application, concrete.application) && Objects.equals(statusEmojis, concrete.statusEmojis) && Objects.equals(accountEmojis, concrete.accountEmojis) && + Objects.equals(rebloggedByAccountEmojis, concrete.rebloggedByAccountEmojis) && Objects.equals(card, concrete.card) && Objects.equals(poll, concrete.poll) && isCollapsed == concrete.isCollapsed && @@ -476,6 +484,7 @@ public abstract class StatusViewData { private Status.Application application; private List statusEmojis; private List accountEmojis; + private List rebloggedByAccountEmojis; private Card card; private boolean isCollapsible; /** Whether the status meets the requirement to be collapsed */ private boolean isCollapsed; /** Whether the status is shown partially or fully */ @@ -673,6 +682,10 @@ public abstract class StatusViewData { public Builder setParentVisible(boolean parentVisible) { this.parentVisible = parentVisible; + } + + public Builder setRebloggedByEmojis(List emojis) { + this.rebloggedByAccountEmojis = emojis; return this; } @@ -744,7 +757,7 @@ public abstract class StatusViewData { visibility, attachments, rebloggedByUsername, rebloggedAvatar, isSensitive, isExpanded, isShowingContent, userFullName, nickname, avatar, createdAt, reblogsCount, favouritesCount, inReplyToId, inReplyToAccountAcct, mentions, senderId, rebloggingEnabled, application, - statusEmojis, accountEmojis, card, isCollapsible, isCollapsed, poll, isBot, isMuted, isThreadMuted, + statusEmojis, accountEmojis, rebloggedByAccountEmojis, card, isCollapsible, isCollapsed, poll, isBot, isMuted, isThreadMuted, isUserMuted, conversationId, emojiReactions, parentVisible); } }