parent
d96d4dd581
commit
c930db6068
|
@ -40,7 +40,6 @@ import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.function.Predicate;
|
|
||||||
|
|
||||||
import me.grishka.appkit.api.Callback;
|
import me.grishka.appkit.api.Callback;
|
||||||
import me.grishka.appkit.api.ErrorResponse;
|
import me.grishka.appkit.api.ErrorResponse;
|
||||||
|
@ -255,57 +254,62 @@ public class AccountSession{
|
||||||
filterStatusContainingObjects(objects, extractor, context, null);
|
filterStatusContainingObjects(objects, extractor, context, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T> void filterStatusContainingObjects(List<T> objects, Function<T, Status> extractor, FilterContext context, Account profile){
|
private boolean statusIsOnOwnProfile(Status s, Account profile){
|
||||||
AccountLocalPreferences lp=getLocalPreferences();
|
return self != null && profile != null && s.account != null
|
||||||
Predicate<Status> statusIsOnOwnProfile=(s)->self != null && profile != null && s.account != null
|
|
||||||
&& Objects.equals(self.id, profile.id) && Objects.equals(self.id, s.account.id);
|
&& Objects.equals(self.id, profile.id) && Objects.equals(self.id, s.account.id);
|
||||||
Predicate<Status> isFilteredType=(s)->(!lp.showReplies && s.inReplyToId != null)
|
}
|
||||||
|| (!lp.showBoosts && s.reblog != null);
|
|
||||||
|
|
||||||
if(lp.serverSideFiltersSupported){
|
private boolean isFilteredType(Status s){
|
||||||
// Even with server-side filters, clients are expected to remove statuses that match a filter that hides them
|
return (!localPreferences.showReplies && s.inReplyToId != null)
|
||||||
objects.removeIf(o->{
|
|| (!localPreferences.showBoosts && s.reblog != null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> void filterStatusContainingObjects(List<T> objects, Function<T, Status> extractor, FilterContext context, Account profile){
|
||||||
|
if(!localPreferences.serverSideFiltersSupported) for(T obj:objects){
|
||||||
|
Status s=extractor.apply(obj);
|
||||||
|
if(s!=null && s.filtered!=null){
|
||||||
|
localPreferences.serverSideFiltersSupported=true;
|
||||||
|
localPreferences.save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<T> removeUs=new ArrayList<>();
|
||||||
|
for(int i=0; i<objects.size(); i++){
|
||||||
|
T o=objects.get(i);
|
||||||
|
if(filterStatusContainingObject(o, extractor, context, profile)){
|
||||||
Status s=extractor.apply(o);
|
Status s=extractor.apply(o);
|
||||||
|
removeUs.add(o);
|
||||||
|
if(s!=null && s.hasGapAfter && i > 0){
|
||||||
|
Status prev=extractor.apply(objects.get(i - 1));
|
||||||
|
if(prev!=null) prev.hasGapAfter=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
objects.removeAll(removeUs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> boolean filterStatusContainingObject(T object, Function<T, Status> extractor, FilterContext context, Account profile){
|
||||||
|
Status s=extractor.apply(object);
|
||||||
if(s==null)
|
if(s==null)
|
||||||
return false;
|
return false;
|
||||||
if(s.filtered==null)
|
|
||||||
return false;
|
|
||||||
// don't hide own posts in own profile
|
// don't hide own posts in own profile
|
||||||
if(statusIsOnOwnProfile.test(s))
|
if(statusIsOnOwnProfile(s, profile))
|
||||||
return false;
|
return false;
|
||||||
if(isFilteredType.test(s))
|
if(isFilteredType(s))
|
||||||
return true;
|
return true;
|
||||||
for(FilterResult filter:s.filtered){
|
// 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)
|
if(filter.filter.isActive() && filter.filter.filterAction==FilterAction.HIDE)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
}else if(wordFilters!=null){
|
||||||
});
|
for(LegacyFilter filter : wordFilters){
|
||||||
return;
|
|
||||||
}
|
|
||||||
for(T obj:objects){
|
|
||||||
Status s=extractor.apply(obj);
|
|
||||||
if(s!=null && s.filtered!=null){
|
|
||||||
lp.serverSideFiltersSupported=true;
|
|
||||||
lp.save();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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){
|
|
||||||
if(filter.context.contains(context) && filter.matches(s) && filter.isActive())
|
if(filter.context.contains(context) && filter.matches(s) && filter.isActive())
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateAccountInfo(){
|
public void updateAccountInfo(){
|
||||||
|
|
Loading…
Reference in New Issue