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