diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java b/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java index 79cf1c680..cc65eb682 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java @@ -74,7 +74,6 @@ public class CacheController{ result.add(status); }while(cursor.moveToNext()); String _newMaxID=newMaxID; - AccountSessionManager.get(accountID).filterStatuses(result, FilterContext.HOME); uiHandler.post(()->callback.onSuccess(new CacheablePaginatedResponse<>(result, _newMaxID, true))); return; } @@ -86,9 +85,7 @@ public class CacheController{ .setCallback(new Callback<>(){ @Override public void onSuccess(List result){ - ArrayList filtered=new ArrayList<>(result); - AccountSessionManager.get(accountID).filterStatuses(filtered, FilterContext.HOME); - callback.onSuccess(new CacheablePaginatedResponse<>(filtered, result.isEmpty() ? null : result.get(result.size()-1).id, false)); + callback.onSuccess(new CacheablePaginatedResponse<>(result, result.isEmpty() ? null : result.get(result.size()-1).id, false)); putHomeTimeline(result, maxID==null); } 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 c4c7fe09e..ddf8fb5be 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 @@ -256,10 +256,13 @@ public class AccountSession{ } public void filterStatusContainingObjects(List objects, Function extractor, FilterContext context, Account profile){ - Predicate statusIsOnOwnProfile = (s) -> self != null && profile != null && s.account != null + AccountLocalPreferences lp=getLocalPreferences(); + Predicate statusIsOnOwnProfile=(s)->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(getLocalPreferences().serverSideFiltersSupported){ + 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); @@ -268,8 +271,10 @@ public class AccountSession{ if(s.filtered==null) return false; // don't hide own posts in own profile - if (statusIsOnOwnProfile.test(s)) + 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; @@ -278,13 +283,11 @@ public class AccountSession{ }); return; } - if(wordFilters==null) - return; for(T obj:objects){ Status s=extractor.apply(obj); if(s!=null && s.filtered!=null){ - getLocalPreferences().serverSideFiltersSupported=true; - getLocalPreferences().save(); + lp.serverSideFiltersSupported=true; + lp.save(); return; } } @@ -293,9 +296,11 @@ public class AccountSession{ if(s==null) return false; // don't hide own posts in own profile - if (statusIsOnOwnProfile.test(s)) + if(statusIsOnOwnProfile.test(s)) return false; - for(LegacyFilter filter:wordFilters){ + if(isFilteredType.test(s)) + return true; + if(wordFilters!=null) for(LegacyFilter filter:wordFilters){ if(filter.context.contains(context) && filter.matches(s) && filter.isActive()) return true; } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/AccountTimelineFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/AccountTimelineFragment.java index 3451eb9a4..815a2bf68 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/AccountTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/AccountTimelineFragment.java @@ -9,19 +9,16 @@ import org.joinmastodon.android.R; import org.joinmastodon.android.api.requests.accounts.GetAccountStatuses; import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.events.RemoveAccountPostsEvent; -import org.joinmastodon.android.events.StatusCreatedEvent; import org.joinmastodon.android.events.StatusUnpinnedEvent; import org.joinmastodon.android.model.Account; import org.joinmastodon.android.model.FilterContext; import org.joinmastodon.android.model.Status; import org.joinmastodon.android.ui.displayitems.HeaderStatusDisplayItem; -import org.joinmastodon.android.utils.StatusFilterPredicate; import org.parceler.Parcels; import java.util.Collections; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; import me.grishka.appkit.api.SimpleCallback; @@ -60,7 +57,6 @@ public class AccountTimelineFragment extends StatusListFragment{ @Override public void onSuccess(List result){ if(getActivity()==null) return; - AccountSessionManager asm = AccountSessionManager.getInstance(); boolean empty=result.isEmpty(); AccountSessionManager.get(accountID).filterStatuses(result, getFilterContext(), user); onDataLoaded(result, !empty); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java index c8e07f5b1..0db3110dc 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java @@ -21,6 +21,7 @@ import org.joinmastodon.android.api.MastodonErrorResponse; import org.joinmastodon.android.api.requests.tags.GetTag; import org.joinmastodon.android.api.requests.tags.SetTagFollowed; import org.joinmastodon.android.api.requests.timelines.GetHashtagTimeline; +import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.model.FilterContext; import org.joinmastodon.android.model.Hashtag; import org.joinmastodon.android.model.Status; @@ -94,7 +95,10 @@ public class HashtagTimelineFragment extends PinnableStatusListFragment{ .setCallback(new SimpleCallback<>(this){ @Override public void onSuccess(List result){ - onDataLoaded(result, !result.isEmpty()); + if(getActivity()==null) return; + boolean empty=result.isEmpty(); + AccountSessionManager.get(accountID).filterStatuses(result, getFilterContext()); + onDataLoaded(result, !empty); } }) .exec(accountID); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java index 92d0bb076..e9bc0832d 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java @@ -11,7 +11,6 @@ import androidx.recyclerview.widget.RecyclerView; import org.joinmastodon.android.GlobalUserPreferences; import org.joinmastodon.android.api.requests.markers.SaveMarkers; import org.joinmastodon.android.api.requests.timelines.GetHomeTimeline; -import org.joinmastodon.android.api.session.AccountLocalPreferences; import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.model.CacheablePaginatedResponse; import org.joinmastodon.android.model.FilterContext; @@ -20,13 +19,13 @@ import org.joinmastodon.android.model.TimelineMarkers; import org.joinmastodon.android.ui.displayitems.GapStatusDisplayItem; import org.joinmastodon.android.ui.displayitems.StatusDisplayItem; +import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.Set; -import java.util.stream.Collectors; import me.grishka.appkit.api.Callback; import me.grishka.appkit.api.ErrorResponse; @@ -49,16 +48,6 @@ public class HomeTimelineFragment extends StatusListFragment { loadData(); } - private boolean typeFilterPredicate(Status s) { - AccountLocalPreferences lp=getLocalPrefs(); - return (lp.showReplies || s.inReplyToId == null) && - (lp.showBoosts || s.reblog == null); - } - - private List filterPosts(List items) { - return items.stream().filter(this::typeFilterPredicate).collect(Collectors.toList()); - } - @Override protected void doLoadData(int offset, int count){ AccountSessionManager.getInstance() @@ -66,10 +55,11 @@ public class HomeTimelineFragment extends StatusListFragment { .getHomeTimeline(offset>0 ? maxID : null, count, refreshing, new SimpleCallback<>(this){ @Override public void onSuccess(CacheablePaginatedResponse> result){ - if (getActivity() == null) return; - List filteredItems = filterPosts(result.items); + if(getActivity()==null) return; + boolean empty=result.items.isEmpty(); maxID=result.maxID; - onDataLoaded(filteredItems, !result.items.isEmpty()); + AccountSessionManager.get(accountID).filterStatuses(result.items, getFilterContext()); + onDataLoaded(result.items, !empty); if(result.isFromCache()) loadNewPosts(); } @@ -142,7 +132,6 @@ public class HomeTimelineFragment extends StatusListFragment { public void onSuccess(List result){ currentRequest=null; dataLoading=false; - result = filterPosts(result); if(result.isEmpty() || getActivity()==null) return; Status last=result.get(result.size()-1); @@ -153,12 +142,14 @@ public class HomeTimelineFragment extends StatusListFragment { result.get(result.size()-1).hasGapAfter=true; toAdd=result; } + List toAddUnfiltered=new ArrayList<>(toAdd); AccountSessionManager.get(accountID).filterStatuses(toAdd, getFilterContext()); if(!toAdd.isEmpty()){ prependItems(toAdd, true); - if (parent != null && GlobalUserPreferences.showNewPostsButton) parent.showNewPostsButton(); - AccountSessionManager.getInstance().getAccount(accountID).getCacheController().putHomeTimeline(toAdd, false); + if(parent != null && GlobalUserPreferences.showNewPostsButton) parent.showNewPostsButton(); } + if(toAddUnfiltered.isEmpty()) + AccountSessionManager.getInstance().getAccount(accountID).getCacheController().putHomeTimeline(toAddUnfiltered, false); } @Override diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelineFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelineFragment.java index aaa6e83f1..5e45fb977 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelineFragment.java @@ -16,6 +16,7 @@ import org.joinmastodon.android.R; import org.joinmastodon.android.api.requests.lists.GetList; import org.joinmastodon.android.api.requests.lists.UpdateList; import org.joinmastodon.android.api.requests.timelines.GetListTimeline; +import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.events.ListDeletedEvent; import org.joinmastodon.android.events.ListUpdatedCreatedEvent; import org.joinmastodon.android.model.FilterContext; @@ -25,10 +26,8 @@ import org.joinmastodon.android.model.TimelineDefinition; import org.joinmastodon.android.ui.M3AlertDialogBuilder; import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.ui.views.ListEditor; -import org.joinmastodon.android.utils.StatusFilterPredicate; import java.util.List; -import java.util.stream.Collectors; import me.grishka.appkit.Nav; import me.grishka.appkit.api.Callback; @@ -138,9 +137,10 @@ public class ListTimelineFragment extends PinnableStatusListFragment { .setCallback(new SimpleCallback<>(this) { @Override public void onSuccess(List result) { - if (getActivity() == null) return; - result=result.stream().filter(new StatusFilterPredicate(accountID, getFilterContext())).collect(Collectors.toList()); - onDataLoaded(result, !result.isEmpty()); + if(getActivity()==null) return; + boolean empty=result.isEmpty(); + AccountSessionManager.get(accountID).filterStatuses(result, getFilterContext()); + onDataLoaded(result, !empty); } }) .exec(accountID); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/PinnedPostsListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/PinnedPostsListFragment.java index 53c44d36d..ff6b16780 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/PinnedPostsListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/PinnedPostsListFragment.java @@ -5,6 +5,7 @@ import android.os.Bundle; import org.joinmastodon.android.R; import org.joinmastodon.android.api.requests.accounts.GetAccountStatuses; +import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.model.Account; import org.joinmastodon.android.model.FilterContext; import org.joinmastodon.android.model.Status; @@ -35,6 +36,8 @@ public class PinnedPostsListFragment extends StatusListFragment{ .setCallback(new SimpleCallback<>(this){ @Override public void onSuccess(List result){ + if(getActivity()==null) return; + AccountSessionManager.get(accountID).filterStatuses(result, getFilterContext()); onDataLoaded(result, false); } }).exec(accountID); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/StatusEditHistoryFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/StatusEditHistoryFragment.java index aa52dda9a..0a723a322 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/StatusEditHistoryFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/StatusEditHistoryFragment.java @@ -48,8 +48,8 @@ public class StatusEditHistoryFragment extends StatusListFragment{ .setCallback(new SimpleCallback<>(this){ @Override public void onSuccess(List result){ + if(getActivity()==null) return; Collections.sort(result, Comparator.comparing((Status s)->s.createdAt).reversed()); - if (getActivity() == null) return; onDataLoaded(result, false); } }) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/BubbleTimelineFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/BubbleTimelineFragment.java index 7b1ec89ed..efae99c81 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/BubbleTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/BubbleTimelineFragment.java @@ -6,14 +6,13 @@ import android.os.Bundle; import androidx.recyclerview.widget.RecyclerView; import org.joinmastodon.android.api.requests.timelines.GetBubbleTimeline; +import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.fragments.StatusListFragment; import org.joinmastodon.android.model.FilterContext; import org.joinmastodon.android.model.Status; import org.joinmastodon.android.ui.utils.DiscoverInfoBannerHelper; -import org.joinmastodon.android.utils.StatusFilterPredicate; import java.util.List; -import java.util.stream.Collectors; import me.grishka.appkit.api.SimpleCallback; import me.grishka.appkit.utils.MergeRecyclerAdapter; @@ -40,11 +39,11 @@ public class BubbleTimelineFragment extends StatusListFragment { .setCallback(new SimpleCallback<>(this){ @Override public void onSuccess(List result){ - if(!result.isEmpty()) - maxID=result.get(result.size()-1).id; - if (getActivity() == null) return; - result=result.stream().filter(new StatusFilterPredicate(accountID, getFilterContext())).collect(Collectors.toList()); - onDataLoaded(result, !result.isEmpty()); + if(getActivity()==null) return; + boolean empty=result.isEmpty(); + if(!empty) maxID=result.get(result.size()-1).id; + AccountSessionManager.get(accountID).filterStatuses(result, getFilterContext()); + onDataLoaded(result, !empty); bannerHelper.onBannerBecameVisible(); } }) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverPostsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverPostsFragment.java index 7e017e382..f7f0fef07 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverPostsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverPostsFragment.java @@ -4,6 +4,7 @@ import android.net.Uri; import android.os.Bundle; import org.joinmastodon.android.api.requests.trends.GetTrendingStatuses; +import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.fragments.StatusListFragment; import org.joinmastodon.android.model.FilterContext; import org.joinmastodon.android.model.Status; @@ -30,7 +31,10 @@ public class DiscoverPostsFragment extends StatusListFragment{ .setCallback(new SimpleCallback<>(this){ @Override public void onSuccess(List result){ - onDataLoaded(result, !result.isEmpty()); + if(getActivity()==null) return; + boolean empty=result.isEmpty(); + AccountSessionManager.get(accountID).filterStatuses(result, getFilterContext()); + onDataLoaded(result, !empty); bannerHelper.onBannerBecameVisible(); } }).exec(accountID); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/FederatedTimelineFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/FederatedTimelineFragment.java index 0c61f8c8d..c3318ae3e 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/FederatedTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/FederatedTimelineFragment.java @@ -33,10 +33,10 @@ public class FederatedTimelineFragment extends StatusListFragment{ .setCallback(new SimpleCallback<>(this){ @Override public void onSuccess(List result){ - if(!result.isEmpty()) - maxID=result.get(result.size()-1).id; + if(getActivity()==null) return; boolean empty=result.isEmpty(); - AccountSessionManager.get(accountID).filterStatuses(result, FilterContext.PUBLIC); + if(!empty) maxID=result.get(result.size()-1).id; + AccountSessionManager.get(accountID).filterStatuses(result, getFilterContext()); onDataLoaded(result, !empty); bannerHelper.onBannerBecameVisible(); } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/LocalTimelineFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/LocalTimelineFragment.java index 2ae94c3d0..c4979d1ab 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/LocalTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/LocalTimelineFragment.java @@ -2,7 +2,6 @@ package org.joinmastodon.android.fragments.discover; import android.net.Uri; import android.os.Bundle; -import android.view.View; import org.joinmastodon.android.api.requests.timelines.GetPublicTimeline; import org.joinmastodon.android.api.session.AccountSessionManager; @@ -34,10 +33,10 @@ public class LocalTimelineFragment extends StatusListFragment{ .setCallback(new SimpleCallback<>(this){ @Override public void onSuccess(List result){ - if(!result.isEmpty()) - maxID=result.get(result.size()-1).id; + if(getActivity()==null) return; boolean empty=result.isEmpty(); - AccountSessionManager.get(accountID).filterStatuses(result, FilterContext.PUBLIC); + if(!empty) maxID=result.get(result.size()-1).id; + AccountSessionManager.get(accountID).filterStatuses(result, getFilterContext()); onDataLoaded(result, !empty); bannerHelper.onBannerBecameVisible(); } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/report/ReportAddPostsChoiceFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/report/ReportAddPostsChoiceFragment.java index dad96fa4f..4a857d864 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/report/ReportAddPostsChoiceFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/report/ReportAddPostsChoiceFragment.java @@ -87,6 +87,7 @@ public class ReportAddPostsChoiceFragment extends StatusListFragment{ .setCallback(new SimpleCallback<>(this){ @Override public void onSuccess(List result){ + if(getActivity()==null) return; for(Status s:result){ s.sensitive=true; }