From 5e194e30795be42a4b2a1696a10bfaeba2bc39f1 Mon Sep 17 00:00:00 2001 From: sk Date: Tue, 14 Mar 2023 14:59:11 +0100 Subject: [PATCH] display both reply and reblog re: sk22#448 --- .../ReblogOrReplyLineStatusDisplayItem.java | 23 ++++++++-- .../ui/displayitems/StatusDisplayItem.java | 46 +++++++++++-------- .../display_item_reblog_or_reply_line.xml | 1 + 3 files changed, 48 insertions(+), 22 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java index 366d5ba9f..b958fa7ed 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java @@ -27,6 +27,7 @@ import androidx.annotation.Nullable; import me.grishka.appkit.imageloader.ImageLoaderViewHolder; import me.grishka.appkit.imageloader.requests.ImageLoaderRequest; +import me.grishka.appkit.utils.V; public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ private CharSequence text; @@ -37,8 +38,13 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ private int iconEnd; private CustomEmojiHelper emojiHelper=new CustomEmojiHelper(); private View.OnClickListener handleClick; + private boolean isLastLine; public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick){ + this(parentID, parentFragment, text, emojis, icon, visibility, handleClick, true); + } + + public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick, boolean isLastLine){ super(parentID, parentFragment); SpannableStringBuilder ssb=new SpannableStringBuilder(text); HtmlParser.parseCustomEmoji(ssb, emojis); @@ -49,6 +55,11 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ TypedValue outValue = new TypedValue(); context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true); updateVisibility(visibility); + setIsLastLine(isLastLine); + } + + public void setIsLastLine(boolean isLastLine) { + this.isLastLine = isLastLine; } public void updateVisibility(StatusPrivacy visibility) { @@ -78,18 +89,21 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ public static class Holder extends StatusDisplayItem.Holder implements ImageLoaderViewHolder{ private final TextView text; + private final View frame; + public Holder(Activity activity, ViewGroup parent){ super(activity, R.layout.display_item_reblog_or_reply_line, parent); text=findViewById(R.id.text); + frame=findViewById(R.id.frame); } @Override public void onBind(ReblogOrReplyLineStatusDisplayItem item){ text.setText(item.text); text.setCompoundDrawablesRelativeWithIntrinsicBounds(item.icon, 0, item.iconEnd, 0); - if(item.handleClick!=null) text.setOnClickListener(item.handleClick); - text.setEnabled(!item.inset); - text.setClickable(!item.inset); + text.setOnClickListener(item.handleClick); + text.setEnabled(!item.inset && item.handleClick != null); + text.setClickable(!item.inset && item.handleClick != null); Context ctx = itemView.getContext(); int visibilityText = item.visibility != null ? switch (item.visibility) { case PUBLIC -> R.string.visibility_public; @@ -100,6 +114,9 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ if (visibilityText != 0) text.setContentDescription(item.text + " (" + ctx.getString(visibilityText) + ")"); if(Build.VERSION.SDK_INT{ args.putParcelable("profileAccount", Parcels.wrap(status.account)); Nav.go(fragment.getActivity(), ProfileFragment.class, args); - })); - } if(status.inReplyToAccountId!=null){ - if (knownAccounts.containsKey(status.inReplyToAccountId)) { - Account account = Objects.requireNonNull(knownAccounts.get(status.inReplyToAccountId)); - items.add(new ReblogOrReplyLineStatusDisplayItem(parentID, fragment, fragment.getString(R.string.in_reply_to, account.displayName), account.emojis, R.drawable.ic_fluent_arrow_reply_20_filled, null, i -> { - args.putParcelable("profileAccount", Parcels.wrap(account)); - Nav.go(fragment.getActivity(), ProfileFragment.class, args); - })); - } else { - items.add(new ReblogOrReplyLineStatusDisplayItem(parentID, fragment, fragment.getString(R.string.sk_in_reply), List.of(), R.drawable.ic_fluent_arrow_reply_20_filled, null, null)); - } - } else if ( - !(status.tags.isEmpty() || - fragment instanceof HashtagTimelineFragment || - fragment instanceof ListTimelineFragment - ) && fragment.getParentFragment() instanceof HomeTabFragment home - ) { + }, false)); + } + + if(statusForContent.inReplyToAccountId!=null){ + Account account = knownAccounts.get(statusForContent.inReplyToAccountId); + View.OnClickListener handleClick = account == null ? null : i -> { + args.putParcelable("profileAccount", Parcels.wrap(account)); + Nav.go(fragment.getActivity(), ProfileFragment.class, args); + }; + String text = account != null ? fragment.getString(R.string.in_reply_to, account.displayName) : fragment.getString(R.string.sk_in_reply); + items.add(new ReblogOrReplyLineStatusDisplayItem( + parentID, fragment, text, account == null ? List.of() : account.emojis, + R.drawable.ic_fluent_arrow_reply_20_filled, null, handleClick, false + )); + } + + if (status.reblog == null && !(status.tags.isEmpty() || + fragment instanceof HashtagTimelineFragment || + fragment instanceof ListTimelineFragment + ) && fragment.getParentFragment() instanceof HomeTabFragment home) { home.getHashtags().stream() .filter(followed -> status.tags.stream() .anyMatch(hashtag -> followed.name.equalsIgnoreCase(hashtag.name))) @@ -142,9 +144,15 @@ public abstract class StatusDisplayItem{ i -> { args.putString("hashtag", hashtag.name); Nav.go(fragment.getActivity(), HashtagTimelineFragment.class, args); - } + }, + false ))); } + + if (items.size() > 0) { + ((ReblogOrReplyLineStatusDisplayItem) items.get(items.size() - 1)).setIsLastLine(true); + } + HeaderStatusDisplayItem header; items.add(header=new HeaderStatusDisplayItem(parentID, statusForContent.account, statusForContent.createdAt, fragment, accountID, statusForContent, null, notification, scheduledStatus)); if(!TextUtils.isEmpty(statusForContent.content)) diff --git a/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml b/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml index b97a3c8a0..90bf482c3 100644 --- a/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml +++ b/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml @@ -2,6 +2,7 @@