From 937747e11b2e6fb995f14a405e238edbcaa96f12 Mon Sep 17 00:00:00 2001 From: sk Date: Mon, 6 Feb 2023 10:42:27 +0100 Subject: [PATCH] add collapse button to header --- .../fragments/BaseStatusListFragment.java | 19 ++++++++++++++++++- .../joinmastodon/android/model/Status.java | 1 + .../displayitems/HeaderStatusDisplayItem.java | 11 ++++++++++- .../displayitems/TextStatusDisplayItem.java | 16 ++++++---------- .../ic_fluent_chevron_up_20_filled.xml | 3 +++ .../main/res/layout/display_item_header.xml | 13 ++++++++++++- 6 files changed, 50 insertions(+), 13 deletions(-) create mode 100644 mastodon/src/main/res/drawable/ic_fluent_chevron_up_20_filled.xml diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java index fb57d67ad..91fd22aeb 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java @@ -479,7 +479,7 @@ public abstract class BaseStatusListFragment exten Status status=holder.getItem().status; status.spoilerRevealed=!status.spoilerRevealed; if(!TextUtils.isEmpty(status.spoilerText)){ - TextStatusDisplayItem.Holder text=findHolderOfType(holder.getItemID(), TextStatusDisplayItem.Holder.class); + TextStatusDisplayItem.Holder text = findHolderOfType(holder.getItemID(), TextStatusDisplayItem.Holder.class); if(text!=null){ adapter.notifyItemChanged(text.getAbsoluteAdapterPosition()); } @@ -488,6 +488,23 @@ public abstract class BaseStatusListFragment exten updateImagesSpoilerState(status, holder.getItemID()); } + public void onEnableExpandable(TextStatusDisplayItem.Holder holder, boolean expandable) { + if (holder.getItem().status.textExpandable != expandable) { + holder.getItem().status.textExpandable = expandable; + HeaderStatusDisplayItem.Holder header = findHolderOfType(holder.getItemID(), HeaderStatusDisplayItem.Holder.class); + if (header != null) header.rebind(); + holder.rebind(); + } + } + + public void onToggleExpanded(Status status, String itemID) { + status.textExpanded = !status.textExpanded; + TextStatusDisplayItem.Holder text=findHolderOfType(itemID, TextStatusDisplayItem.Holder.class); + HeaderStatusDisplayItem.Holder header=findHolderOfType(itemID, HeaderStatusDisplayItem.Holder.class); + if (text != null) text.rebind(); + if (header != null) header.rebind(); + } + protected void updateImagesSpoilerState(Status status, String itemID){ ArrayList updatedPositions=new ArrayList<>(); for(ImageStatusDisplayItem.Holder photo:(List)findAllHoldersOfType(itemID, ImageStatusDisplayItem.Holder.class)){ diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/Status.java b/mastodon/src/main/java/org/joinmastodon/android/model/Status.java index 139d1857d..e17e02741 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/Status.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/Status.java @@ -60,6 +60,7 @@ public class Status extends BaseModel implements DisplayItemsParent{ public transient boolean filterRevealed; public transient boolean spoilerRevealed; + public transient boolean textExpanded, textExpandable; public transient boolean hasGapAfter; private transient String strippedText; diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java index c79bae069..1a09a59d8 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java @@ -20,6 +20,8 @@ import android.widget.PopupMenu; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.StringRes; + import org.joinmastodon.android.GlobalUserPreferences; import org.joinmastodon.android.R; import org.joinmastodon.android.api.requests.accounts.GetAccountRelationships; @@ -137,7 +139,7 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{ public static class Holder extends StatusDisplayItem.Holder implements ImageLoaderViewHolder{ private final TextView name, username, timestamp, extraText, separator; - private final ImageView avatar, more, visibility, deleteNotification, unreadIndicator; + private final ImageView avatar, more, visibility, deleteNotification, unreadIndicator, collapseBtn; private final PopupMenu optionsMenu; private Relationship relationship; private APIRequest currentRelationshipRequest; @@ -160,6 +162,7 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{ visibility=findViewById(R.id.visibility); deleteNotification=findViewById(R.id.delete_notification); unreadIndicator=findViewById(R.id.unread_indicator); + collapseBtn=findViewById(R.id.collapse_btn); extraText=findViewById(R.id.extra_text); avatar.setOnClickListener(this::onAvaClick); avatar.setOutlineProvider(roundCornersOutline); @@ -171,6 +174,7 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{ fragment.removeNotification(item.notification); } })); + collapseBtn.setOnClickListener(l -> item.parentFragment.onToggleExpanded(item.status, getItemID())); optionsMenu=new PopupMenu(activity, more); optionsMenu.inflate(R.menu.post); @@ -373,6 +377,11 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{ more.setContentDescription(desc); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) more.setTooltipText(desc); + + String collapseText = item.parentFragment.getString(item.status.textExpanded ? R.string.sk_collapse : R.string.sk_expand); + collapseBtn.setVisibility(item.status.textExpandable && item.status.textExpanded ? View.VISIBLE : View.GONE); + collapseBtn.setContentDescription(collapseText); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) collapseBtn.setTooltipText(collapseText); } @Override diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java index 1052cb3aa..6e94d4195 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java @@ -51,7 +51,6 @@ public class TextStatusDisplayItem extends StatusDisplayItem{ public boolean translated = false; public TranslatedStatus translation = null; private AccountSession session; - private boolean textIsRevealed; public static final Pattern BOTTOM_TEXT_PATTERN = Pattern.compile("(?:[\uD83E\uDEC2\uD83D\uDC96✨\uD83E\uDD7A,]+|❤️)(?:\uD83D\uDC49\uD83D\uDC48(?:[\uD83E\uDEC2\uD83D\uDC96✨\uD83E\uDD7A,]+|❤️))*\uD83D\uDC49\uD83D\uDC48"); public TextStatusDisplayItem(String parentID, CharSequence text, BaseStatusListFragment parentFragment, Status status, boolean disableTranslate){ @@ -123,7 +122,7 @@ public class TextStatusDisplayItem extends StatusDisplayItem{ textCollapsedHeight=activity.getResources().getDimension(R.dimen.text_collapsed_height); collapseParams=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, (int) textCollapsedHeight); wrapParams=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - readMore.setOnClickListener(this::onClickReadMore); + readMore.setOnClickListener(v -> item.parentFragment.onToggleExpanded(item.status, getItemID())); } @Override @@ -220,7 +219,7 @@ public class TextStatusDisplayItem extends StatusDisplayItem{ } }); - readMore.setText(item.textIsRevealed ? R.string.sk_collapse : R.string.sk_expand); + readMore.setText(item.status.textExpanded ? R.string.sk_collapse : R.string.sk_expand); spaceBelowText.setVisibility(translateVisible ? View.VISIBLE : View.GONE); if (!GlobalUserPreferences.collapseLongPosts) { @@ -233,15 +232,12 @@ public class TextStatusDisplayItem extends StatusDisplayItem{ boolean inTimeline = !item.textSelectable; boolean hasSpoiler = !TextUtils.isEmpty(item.status.spoilerText); boolean expandable = inTimeline && tooBig && !hasSpoiler; - readMore.setVisibility(expandable ? View.VISIBLE : View.GONE); - textScrollView.setLayoutParams(expandable && !item.textIsRevealed ? collapseParams : wrapParams); - if (expandable && !translateVisible) spaceBelowText.setVisibility(View.VISIBLE); + item.parentFragment.onEnableExpandable(this, expandable); }); - } - private void onClickReadMore(View v) { - item.textIsRevealed = !item.textIsRevealed; - rebind(); + readMore.setVisibility(item.status.textExpandable && !item.status.textExpanded ? View.VISIBLE : View.GONE); + textScrollView.setLayoutParams(item.status.textExpandable && !item.status.textExpanded ? collapseParams : wrapParams); + if (item.status.textExpandable && !translateVisible) spaceBelowText.setVisibility(View.VISIBLE); } @Override diff --git a/mastodon/src/main/res/drawable/ic_fluent_chevron_up_20_filled.xml b/mastodon/src/main/res/drawable/ic_fluent_chevron_up_20_filled.xml new file mode 100644 index 000000000..eb8494db7 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_chevron_up_20_filled.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/layout/display_item_header.xml b/mastodon/src/main/res/layout/display_item_header.xml index 0628c4c4f..729ba897c 100644 --- a/mastodon/src/main/res/layout/display_item_header.xml +++ b/mastodon/src/main/res/layout/display_item_header.xml @@ -42,10 +42,21 @@ android:tint="?android:textColorSecondary" /> + +