From ba7ccf97dec35ef470498e09668ede7fe6159bcf Mon Sep 17 00:00:00 2001 From: HellPie Date: Wed, 5 Sep 2018 23:05:23 +0200 Subject: [PATCH] Fix thread view showing button but not collapsing by implementing the feature --- .../tusky/adapter/StatusBaseViewHolder.java | 2 ++ .../tusky/fragment/ViewThreadFragment.java | 28 ++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java index 961c0b4f4..e39b49209 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java @@ -503,6 +503,8 @@ abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { setSpoilerText(status.getSpoilerText(), status.getStatusEmojis(), status.isExpanded(), listener); } + // When viewing threads this ViewHolder is used and the main post does not have a collapse + // button by design so avoid crashing the app when that happens if(contentCollapseButton != null) { if(status.isCollapsible() && (status.isExpanded() || status.getSpoilerText() == null || status.getSpoilerText().isEmpty())) { contentCollapseButton.setOnCheckedChangeListener((buttonView, isChecked) -> { diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewThreadFragment.java b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewThreadFragment.java index a56df7895..b80c64bc5 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewThreadFragment.java +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewThreadFragment.java @@ -55,6 +55,7 @@ import com.keylesspalace.tusky.interfaces.StatusActionListener; import com.keylesspalace.tusky.network.MastodonApi; import com.keylesspalace.tusky.network.TimelineCases; import com.keylesspalace.tusky.util.PairedList; +import com.keylesspalace.tusky.util.SmartLengthInputFilter; import com.keylesspalace.tusky.util.ThemeUtils; import com.keylesspalace.tusky.util.ViewDataUtils; import com.keylesspalace.tusky.view.ConversationLineItemDecoration; @@ -361,7 +362,32 @@ public final class ViewThreadFragment extends SFragment implements @Override public void onContentCollapsedChange(boolean isCollapsed, int position) { - // No need to implement this method as status threads always show all content in a status. + if(position < 0 || position >= statuses.size()) { + Log.e(TAG, String.format("Tried to access out of bounds status position: %d of %d", position, statuses.size() - 1)); + return; + } + + StatusViewData.Concrete status = statuses.getPairedItem(position); + if(status == null) { + // Statuses PairedList contains a base type of StatusViewData.Concrete and also doesn't + // check for null values when adding values to it although this doesn't seem to be an issue. + Log.e(TAG, String.format( + "Expected StatusViewData.Concrete, got null instead at position: %d of %d", + position, + statuses.size() - 1 + )); + return; + } + + StatusViewData.Concrete updatedStatus = new StatusViewData.Builder(status) + .setCollapsible(collapseLongStatusContent && !SmartLengthInputFilter.hasBadRatio( + status.getContent(), + SmartLengthInputFilter.LENGTH_DEFAULT + )) + .setCollapsed(isCollapsed) + .createStatusViewData(); + statuses.setPairedItem(position, updatedStatus); + recyclerView.post(() -> adapter.setItem(position, updatedStatus, true)); } @Override