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){
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){
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));
holder.rebind();
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);
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{
displayItems.subList(index+1, index+1+spoilerItem.contentItems.size()).clear();
adapter.notifyItemRangeRemoved(index+1, spoilerItem.contentItems.size());
int itemCount=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();
}

View File

@ -9,6 +9,7 @@ import org.joinmastodon.android.ui.text.HtmlParser;
import org.parceler.Parcel;
import java.time.Instant;
import java.util.EnumSet;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
@ -62,7 +63,7 @@ public class Status extends BaseModel implements DisplayItemsParent{
public boolean bookmarked;
public Boolean pinned;
public transient boolean spoilerRevealed;
public transient EnumSet<SpoilerType> revealedSpoilers=EnumSet.noneOf(SpoilerType.class);
public transient boolean hasGapAfter;
private transient String strippedText;
public transient TranslationState translationState=TranslationState.HIDDEN;
@ -95,16 +96,18 @@ public class Status extends BaseModel implements DisplayItemsParent{
fr.postprocess();
}
spoilerRevealed=!sensitive;
if(!sensitive){
revealedSpoilers.add(SpoilerType.CONTENT_WARNING);
}
}
@Override
public String toString(){
return "Status{"+
"id='"+id+'\''+
"account="+account+
", id='"+id+'\''+
", uri='"+uri+'\''+
", createdAt="+createdAt+
", account="+account+
", content='"+content+'\''+
", visibility="+visibility+
", sensitive="+sensitive+
@ -132,9 +135,11 @@ public class Status extends BaseModel implements DisplayItemsParent{
", muted="+muted+
", bookmarked="+bookmarked+
", pinned="+pinned+
", spoilerRevealed="+spoilerRevealed+
", revealedSpoilers="+revealedSpoilers+
", hasGapAfter="+hasGapAfter+
", strippedText='"+strippedText+'\''+
", translationState="+translationState+
", translation="+translation+
'}';
}
@ -171,7 +176,7 @@ public class Status extends BaseModel implements DisplayItemsParent{
@Override
public Status clone(){
Status copy=(Status) super.clone();
copy.spoilerRevealed=false;
copy.revealedSpoilers=EnumSet.noneOf(SpoilerType.class);
copy.translationState=TranslationState.HIDDEN;
return copy;
}
@ -186,4 +191,9 @@ public class Status extends BaseModel implements DisplayItemsParent{
SHOWN,
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 final Status status;
public final ArrayList<StatusDisplayItem> contentItems=new ArrayList<>();
public final Status.SpoilerType spoilerType;
private final CharSequence parsedTitle;
private CharSequence translatedTitle;
private final CustomEmojiHelper emojiHelper;
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);
this.status=status;
this.type=type;
this.spoilerType=spoilerType;
if(TextUtils.isEmpty(title)){
parsedTitle=HtmlParser.parseCustomEmoji(statusForContent.spoilerText, statusForContent.emojis);
emojiHelper=new CustomEmojiHelper();
@ -94,7 +96,7 @@ public class SpoilerStatusDisplayItem extends StatusDisplayItem{
}else{
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

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){
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);
items.add(spoilerItem);
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);
contentItems.add(spoilerItem);
contentItems=spoilerItem.contentItems;
status.spoilerRevealed=false;
}else if(!TextUtils.isEmpty(statusForContent.spoilerText)){
SpoilerStatusDisplayItem spoilerItem=new SpoilerStatusDisplayItem(parentID, fragment, null, status, statusForContent, Type.SPOILER);
items.add(spoilerItem);
cwParentItems=contentItems;
}
if(!TextUtils.isEmpty(statusForContent.spoilerText)){
SpoilerStatusDisplayItem spoilerItem=new SpoilerStatusDisplayItem(parentID, fragment, null, status, statusForContent, Type.SPOILER, Status.SpoilerType.CONTENT_WARNING);
contentItems.add(spoilerItem);
contentItems=spoilerItem.contentItems;
status.spoilerRevealed=!AccountSessionManager.get(accountID).getLocalPreferences().showCWs;
}else{
contentItems=items;
if(!AccountSessionManager.get(accountID).getLocalPreferences().showCWs && !filtered){
status.revealedSpoilers.add(Status.SpoilerType.CONTENT_WARNING);
needAddCWItems=true;
}
}
if(!TextUtils.isEmpty(statusForContent.content)){
@ -171,8 +175,8 @@ public abstract class StatusDisplayItem{
if(statusForContent.card!=null && statusForContent.mediaAttachments.isEmpty() && TextUtils.isEmpty(statusForContent.spoilerText)){
contentItems.add(new LinkCardStatusDisplayItem(parentID, fragment, statusForContent));
}
if(contentItems!=items && status.spoilerRevealed){
items.addAll(contentItems);
if(needAddCWItems){
cwParentItems.addAll(contentItems);
}
if((flags & FLAG_NO_FOOTER)==0){
FooterStatusDisplayItem footer=new FooterStatusDisplayItem(parentID, fragment, statusForContent, accountID);