From c930db6068e7cbb5be42f1f79b3512f17bf3909f Mon Sep 17 00:00:00 2001 From: sk Date: Sat, 7 Oct 2023 18:25:37 +0200 Subject: [PATCH] refactor filtering hopefully also fixes sk22#816 --- .../android/api/session/AccountSession.java | 90 ++++++++++--------- 1 file changed, 47 insertions(+), 43 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java index ddf8fb5be..4b2d75bec 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java @@ -40,7 +40,6 @@ import java.util.Objects; import java.util.Optional; import java.util.function.Consumer; import java.util.function.Function; -import java.util.function.Predicate; import me.grishka.appkit.api.Callback; import me.grishka.appkit.api.ErrorResponse; @@ -255,57 +254,62 @@ public class AccountSession{ filterStatusContainingObjects(objects, extractor, context, null); } - public void filterStatusContainingObjects(List objects, Function extractor, FilterContext context, Account profile){ - AccountLocalPreferences lp=getLocalPreferences(); - Predicate statusIsOnOwnProfile=(s)->self != null && profile != null && s.account != null + private boolean statusIsOnOwnProfile(Status s, Account profile){ + return self != null && profile != null && s.account != null && Objects.equals(self.id, profile.id) && Objects.equals(self.id, s.account.id); - Predicate isFilteredType=(s)->(!lp.showReplies && s.inReplyToId != null) - || (!lp.showBoosts && s.reblog != null); + } - if(lp.serverSideFiltersSupported){ - // Even with server-side filters, clients are expected to remove statuses that match a filter that hides them - objects.removeIf(o->{ - Status s=extractor.apply(o); - if(s==null) - return false; - if(s.filtered==null) - return false; - // don't hide own posts in own profile - if(statusIsOnOwnProfile.test(s)) - return false; - if(isFilteredType.test(s)) - return true; - for(FilterResult filter:s.filtered){ - if(filter.filter.isActive() && filter.filter.filterAction==FilterAction.HIDE) - return true; - } - return false; - }); - return; - } - for(T obj:objects){ + private boolean isFilteredType(Status s){ + return (!localPreferences.showReplies && s.inReplyToId != null) + || (!localPreferences.showBoosts && s.reblog != null); + } + + public void filterStatusContainingObjects(List objects, Function extractor, FilterContext context, Account profile){ + if(!localPreferences.serverSideFiltersSupported) for(T obj:objects){ Status s=extractor.apply(obj); if(s!=null && s.filtered!=null){ - lp.serverSideFiltersSupported=true; - lp.save(); - return; + localPreferences.serverSideFiltersSupported=true; + localPreferences.save(); } } - objects.removeIf(o->{ - Status s=extractor.apply(o); - if(s==null) - return false; - // don't hide own posts in own profile - if(statusIsOnOwnProfile.test(s)) - return false; - if(isFilteredType.test(s)) - return true; - if(wordFilters!=null) for(LegacyFilter filter:wordFilters){ + + List removeUs=new ArrayList<>(); + for(int i=0; i 0){ + Status prev=extractor.apply(objects.get(i - 1)); + if(prev!=null) prev.hasGapAfter=true; + } + } + } + objects.removeAll(removeUs); + } + + public boolean filterStatusContainingObject(T object, Function extractor, FilterContext context, Account profile){ + Status s=extractor.apply(object); + if(s==null) + return false; + // don't hide own posts in own profile + if(statusIsOnOwnProfile(s, profile)) + return false; + if(isFilteredType(s)) + return true; + // Even with server-side filters, clients are expected to remove statuses that match a filter that hides them + if(localPreferences.serverSideFiltersSupported){ + for(FilterResult filter : s.filtered){ + if(filter.filter.isActive() && filter.filter.filterAction==FilterAction.HIDE) + return true; + } + }else if(wordFilters!=null){ + for(LegacyFilter filter : wordFilters){ if(filter.context.contains(context) && filter.matches(s) && filter.isActive()) return true; } - return false; - }); + } + return false; } public void updateAccountInfo(){