Handle the case when a post with CW is also filtered

This commit is contained in:
Grishka
2024-09-10 13:08:58 +03:00
parent 9cbfb1a7f8
commit 9f4575f349
4 changed files with 58 additions and 32 deletions

View File

@@ -432,23 +432,33 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
public void onRevealSpoilerClick(SpoilerStatusDisplayItem.Holder holder){ public void onRevealSpoilerClick(SpoilerStatusDisplayItem.Holder holder){
Status status=holder.getItem().status; Status status=holder.getItem().status;
toggleSpoiler(status, holder.getItemID()); SpoilerStatusDisplayItem spoilerItem=holder.getItem();
} if(status.revealedSpoilers.contains(spoilerItem.spoilerType))
status.revealedSpoilers.remove(spoilerItem.spoilerType);
else
status.revealedSpoilers.add(spoilerItem.spoilerType);
protected void toggleSpoiler(Status status, String itemID){ holder.rebind();
status.spoilerRevealed=!status.spoilerRevealed;
SpoilerStatusDisplayItem.Holder spoiler=findHolderOfType(itemID, SpoilerStatusDisplayItem.Holder.class);
if(spoiler!=null)
spoiler.rebind();
SpoilerStatusDisplayItem spoilerItem=Objects.requireNonNull(findItemOfType(itemID, SpoilerStatusDisplayItem.class));
int index=displayItems.indexOf(spoilerItem); int index=displayItems.indexOf(spoilerItem);
if(status.spoilerRevealed){ if(status.revealedSpoilers.contains(spoilerItem.spoilerType)){
int itemCount=spoilerItem.contentItems.size();
displayItems.addAll(index+1, spoilerItem.contentItems); displayItems.addAll(index+1, spoilerItem.contentItems);
adapter.notifyItemRangeInserted(index+1, spoilerItem.contentItems.size()); if(spoilerItem.spoilerType==Status.SpoilerType.FILTER && spoilerItem.contentItems.get(0) instanceof SpoilerStatusDisplayItem nestedSpoiler
&& nestedSpoiler.spoilerType==Status.SpoilerType.CONTENT_WARNING && !AccountSessionManager.get(accountID).getLocalPreferences().showCWs){
status.revealedSpoilers.add(Status.SpoilerType.CONTENT_WARNING);
displayItems.addAll(index+1+itemCount, nestedSpoiler.contentItems);
itemCount+=nestedSpoiler.contentItems.size();
}
adapter.notifyItemRangeInserted(index+1, itemCount);
}else{ }else{
displayItems.subList(index+1, index+1+spoilerItem.contentItems.size()).clear(); int itemCount=spoilerItem.contentItems.size();
adapter.notifyItemRangeRemoved(index+1, spoilerItem.contentItems.size()); if(spoilerItem.contentItems.get(0) instanceof SpoilerStatusDisplayItem nestedSpoiler && status.revealedSpoilers.contains(nestedSpoiler.spoilerType)){
status.revealedSpoilers.remove(nestedSpoiler.spoilerType);
itemCount+=nestedSpoiler.contentItems.size();
}
displayItems.subList(index+1, index+1+itemCount).clear();
adapter.notifyItemRangeRemoved(index+1, itemCount);
} }
list.invalidateItemDecorations(); list.invalidateItemDecorations();
} }

View File

@@ -9,6 +9,7 @@ import org.joinmastodon.android.ui.text.HtmlParser;
import org.parceler.Parcel; import org.parceler.Parcel;
import java.time.Instant; import java.time.Instant;
import java.util.EnumSet;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;
@@ -62,7 +63,7 @@ public class Status extends BaseModel implements DisplayItemsParent{
public boolean bookmarked; public boolean bookmarked;
public Boolean pinned; public Boolean pinned;
public transient boolean spoilerRevealed; public transient EnumSet<SpoilerType> revealedSpoilers=EnumSet.noneOf(SpoilerType.class);
public transient boolean hasGapAfter; public transient boolean hasGapAfter;
private transient String strippedText; private transient String strippedText;
public transient TranslationState translationState=TranslationState.HIDDEN; public transient TranslationState translationState=TranslationState.HIDDEN;
@@ -95,16 +96,18 @@ public class Status extends BaseModel implements DisplayItemsParent{
fr.postprocess(); fr.postprocess();
} }
spoilerRevealed=!sensitive; if(!sensitive){
revealedSpoilers.add(SpoilerType.CONTENT_WARNING);
}
} }
@Override @Override
public String toString(){ public String toString(){
return "Status{"+ return "Status{"+
"id='"+id+'\''+ "account="+account+
", id='"+id+'\''+
", uri='"+uri+'\''+ ", uri='"+uri+'\''+
", createdAt="+createdAt+ ", createdAt="+createdAt+
", account="+account+
", content='"+content+'\''+ ", content='"+content+'\''+
", visibility="+visibility+ ", visibility="+visibility+
", sensitive="+sensitive+ ", sensitive="+sensitive+
@@ -132,9 +135,11 @@ public class Status extends BaseModel implements DisplayItemsParent{
", muted="+muted+ ", muted="+muted+
", bookmarked="+bookmarked+ ", bookmarked="+bookmarked+
", pinned="+pinned+ ", pinned="+pinned+
", spoilerRevealed="+spoilerRevealed+ ", revealedSpoilers="+revealedSpoilers+
", hasGapAfter="+hasGapAfter+ ", hasGapAfter="+hasGapAfter+
", strippedText='"+strippedText+'\''+ ", strippedText='"+strippedText+'\''+
", translationState="+translationState+
", translation="+translation+
'}'; '}';
} }
@@ -171,7 +176,7 @@ public class Status extends BaseModel implements DisplayItemsParent{
@Override @Override
public Status clone(){ public Status clone(){
Status copy=(Status) super.clone(); Status copy=(Status) super.clone();
copy.spoilerRevealed=false; copy.revealedSpoilers=EnumSet.noneOf(SpoilerType.class);
copy.translationState=TranslationState.HIDDEN; copy.translationState=TranslationState.HIDDEN;
return copy; return copy;
} }
@@ -186,4 +191,9 @@ public class Status extends BaseModel implements DisplayItemsParent{
SHOWN, SHOWN,
LOADING LOADING
} }
public enum SpoilerType{
CONTENT_WARNING,
FILTER
}
} }

View File

@@ -25,15 +25,17 @@ import me.grishka.appkit.imageloader.requests.ImageLoaderRequest;
public class SpoilerStatusDisplayItem extends StatusDisplayItem{ public class SpoilerStatusDisplayItem extends StatusDisplayItem{
public final Status status; public final Status status;
public final ArrayList<StatusDisplayItem> contentItems=new ArrayList<>(); public final ArrayList<StatusDisplayItem> contentItems=new ArrayList<>();
public final Status.SpoilerType spoilerType;
private final CharSequence parsedTitle; private final CharSequence parsedTitle;
private CharSequence translatedTitle; private CharSequence translatedTitle;
private final CustomEmojiHelper emojiHelper; private final CustomEmojiHelper emojiHelper;
private final Type type; private final Type type;
public SpoilerStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, String title, Status status, Status statusForContent, Type type){ public SpoilerStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, String title, Status status, Status statusForContent, Type type, Status.SpoilerType spoilerType){
super(parentID, parentFragment); super(parentID, parentFragment);
this.status=status; this.status=status;
this.type=type; this.type=type;
this.spoilerType=spoilerType;
if(TextUtils.isEmpty(title)){ if(TextUtils.isEmpty(title)){
parsedTitle=HtmlParser.parseCustomEmoji(statusForContent.spoilerText, statusForContent.emojis); parsedTitle=HtmlParser.parseCustomEmoji(statusForContent.spoilerText, statusForContent.emojis);
emojiHelper=new CustomEmojiHelper(); emojiHelper=new CustomEmojiHelper();
@@ -94,7 +96,7 @@ public class SpoilerStatusDisplayItem extends StatusDisplayItem{
}else{ }else{
title.setText(item.parsedTitle); title.setText(item.parsedTitle);
} }
action.setText(item.status.spoilerRevealed ? R.string.spoiler_hide : R.string.spoiler_show); action.setText(item.status.revealedSpoilers.contains(item.spoilerType) ? R.string.spoiler_hide : R.string.spoiler_show);
} }
@Override @Override

View File

@@ -121,19 +121,23 @@ public abstract class StatusDisplayItem{
} }
} }
ArrayList<StatusDisplayItem> contentItems; ArrayList<StatusDisplayItem> contentItems=items;
ArrayList<StatusDisplayItem> cwParentItems=items;
boolean needAddCWItems=false;
if(filtered){ if(filtered){
SpoilerStatusDisplayItem spoilerItem=new SpoilerStatusDisplayItem(parentID, fragment, fragment.getString(R.string.post_matches_filter_x, status.filtered.get(0).filter.title), status, statusForContent, Type.FILTER_SPOILER); SpoilerStatusDisplayItem spoilerItem=new SpoilerStatusDisplayItem(parentID, fragment, fragment.getString(R.string.post_matches_filter_x, status.filtered.get(0).filter.title), status, statusForContent, Type.FILTER_SPOILER, Status.SpoilerType.FILTER);
items.add(spoilerItem); contentItems.add(spoilerItem);
contentItems=spoilerItem.contentItems; contentItems=spoilerItem.contentItems;
status.spoilerRevealed=false; cwParentItems=contentItems;
}else if(!TextUtils.isEmpty(statusForContent.spoilerText)){ }
SpoilerStatusDisplayItem spoilerItem=new SpoilerStatusDisplayItem(parentID, fragment, null, status, statusForContent, Type.SPOILER); if(!TextUtils.isEmpty(statusForContent.spoilerText)){
items.add(spoilerItem); SpoilerStatusDisplayItem spoilerItem=new SpoilerStatusDisplayItem(parentID, fragment, null, status, statusForContent, Type.SPOILER, Status.SpoilerType.CONTENT_WARNING);
contentItems.add(spoilerItem);
contentItems=spoilerItem.contentItems; contentItems=spoilerItem.contentItems;
status.spoilerRevealed=!AccountSessionManager.get(accountID).getLocalPreferences().showCWs; if(!AccountSessionManager.get(accountID).getLocalPreferences().showCWs && !filtered){
}else{ status.revealedSpoilers.add(Status.SpoilerType.CONTENT_WARNING);
contentItems=items; needAddCWItems=true;
}
} }
if(!TextUtils.isEmpty(statusForContent.content)){ if(!TextUtils.isEmpty(statusForContent.content)){
@@ -171,8 +175,8 @@ public abstract class StatusDisplayItem{
if(statusForContent.card!=null && statusForContent.mediaAttachments.isEmpty() && TextUtils.isEmpty(statusForContent.spoilerText)){ if(statusForContent.card!=null && statusForContent.mediaAttachments.isEmpty() && TextUtils.isEmpty(statusForContent.spoilerText)){
contentItems.add(new LinkCardStatusDisplayItem(parentID, fragment, statusForContent)); contentItems.add(new LinkCardStatusDisplayItem(parentID, fragment, statusForContent));
} }
if(contentItems!=items && status.spoilerRevealed){ if(needAddCWItems){
items.addAll(contentItems); cwParentItems.addAll(contentItems);
} }
if((flags & FLAG_NO_FOOTER)==0){ if((flags & FLAG_NO_FOOTER)==0){
FooterStatusDisplayItem footer=new FooterStatusDisplayItem(parentID, fragment, statusForContent, accountID); FooterStatusDisplayItem footer=new FooterStatusDisplayItem(parentID, fragment, statusForContent, accountID);