Handle the case when a post with CW is also filtered
This commit is contained in:
parent
9cbfb1a7f8
commit
9f4575f349
@ -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();
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user