From e4c9eb089a22cf8b58e598f5bdb897ab83c38ce0 Mon Sep 17 00:00:00 2001 From: Grishka Date: Sat, 26 Nov 2022 23:09:46 +0300 Subject: [PATCH] Hide posts when muting, blocking or unfollowing an account --- .../events/RemoveAccountPostsEvent.java | 13 ++++ .../fragments/AccountTimelineFragment.java | 6 ++ .../fragments/HomeTimelineFragment.java | 5 ++ .../fragments/NotificationsListFragment.java | 34 ++++++++++ .../android/fragments/StatusListFragment.java | 65 ++++++++++++++----- .../fragments/report/ReportDoneFragment.java | 3 + .../android/ui/utils/UiUtils.java | 10 +++ 7 files changed, 118 insertions(+), 18 deletions(-) create mode 100644 mastodon/src/main/java/org/joinmastodon/android/events/RemoveAccountPostsEvent.java diff --git a/mastodon/src/main/java/org/joinmastodon/android/events/RemoveAccountPostsEvent.java b/mastodon/src/main/java/org/joinmastodon/android/events/RemoveAccountPostsEvent.java new file mode 100644 index 000000000..f71634fd4 --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/events/RemoveAccountPostsEvent.java @@ -0,0 +1,13 @@ +package org.joinmastodon.android.events; + +public class RemoveAccountPostsEvent{ + public final String accountID; + public final String postsByAccountID; + public final boolean isUnfollow; + + public RemoveAccountPostsEvent(String accountID, String postsByAccountID, boolean isUnfollow){ + this.accountID=accountID; + this.postsByAccountID=postsByAccountID; + this.isUnfollow=isUnfollow; + } +} 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 7924e9c93..2c5efb83d 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/AccountTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/AccountTimelineFragment.java @@ -7,6 +7,7 @@ import android.view.View; 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.model.Account; import org.joinmastodon.android.model.Status; @@ -86,4 +87,9 @@ public class AccountTimelineFragment extends StatusListFragment{ } prependItems(Collections.singletonList(ev.status), true); } + + @Override + protected void onRemoveAccountPostsEvent(RemoveAccountPostsEvent ev){ + // no-op + } } 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 8cfc5347e..b7895ba87 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java @@ -422,4 +422,9 @@ public class HomeTimelineFragment extends StatusListFragment{ public void onSelfUpdateStateChanged(SelfUpdateStateChangedEvent ev){ updateUpdateState(ev.state); } + + @Override + protected boolean shouldRemoveAccountPostsWhenUnfollowing(){ + return true; + } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java index 2804be5c4..86e3cedde 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java @@ -10,6 +10,7 @@ import org.joinmastodon.android.E; import org.joinmastodon.android.R; import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.events.PollUpdatedEvent; +import org.joinmastodon.android.events.RemoveAccountPostsEvent; import org.joinmastodon.android.model.Notification; import org.joinmastodon.android.model.PaginatedResponse; import org.joinmastodon.android.model.Status; @@ -26,6 +27,7 @@ import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import androidx.recyclerview.widget.RecyclerView; import me.grishka.appkit.Nav; @@ -180,4 +182,36 @@ public class NotificationsListFragment extends BaseStatusListFragment toRemove=Stream.concat(data.stream(), preloadedData.stream()) + .filter(n->n.account!=null && n.account.id.equals(ev.postsByAccountID)) + .collect(Collectors.toList()); + for(Notification n:toRemove){ + removeNotification(n); + } + } + + private void removeNotification(Notification n){ + data.remove(n); + preloadedData.remove(n); + int index=-1; + for(int i=0;i{ return null; } + protected boolean shouldRemoveAccountPostsWhenUnfollowing(){ + return false; + } + + protected void onRemoveAccountPostsEvent(RemoveAccountPostsEvent ev){ + List toRemove=Stream.concat(data.stream(), preloadedData.stream()) + .filter(s->s.account.id.equals(ev.postsByAccountID) || (s.reblog!=null && s.reblog.account.id.equals(ev.postsByAccountID))) + .collect(Collectors.toList()); + for(Status s:toRemove){ + removeStatus(s); + } + } + + protected void removeStatus(Status status){ + data.remove(status); + preloadedData.remove(status); + int index=-1; + for(int i=0;i{ Status status=getStatusByID(ev.id); if(status==null) return; - data.remove(status); - preloadedData.remove(status); - int index=-1; - for(int i=0;i{ } } } + + @Subscribe + public void onRemoveAccountPostsEvent(RemoveAccountPostsEvent ev){ + if(!ev.accountID.equals(accountID)) + return; + if(ev.isUnfollow && !shouldRemoveAccountPostsWhenUnfollowing()) + return; + StatusListFragment.this.onRemoveAccountPostsEvent(ev); + } } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/report/ReportDoneFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/report/ReportDoneFragment.java index 1970bf48d..dba213882 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/report/ReportDoneFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/report/ReportDoneFragment.java @@ -11,8 +11,10 @@ import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; +import org.joinmastodon.android.E; import org.joinmastodon.android.R; import org.joinmastodon.android.api.requests.accounts.SetAccountFollowed; +import org.joinmastodon.android.events.RemoveAccountPostsEvent; import org.joinmastodon.android.fragments.MastodonToolbarFragment; import org.joinmastodon.android.model.Account; import org.joinmastodon.android.model.Relationship; @@ -130,6 +132,7 @@ public class ReportDoneFragment extends MastodonToolbarFragment{ @Override public void onSuccess(Relationship result){ Nav.finish(ReportDoneFragment.this); + E.post(new RemoveAccountPostsEvent(accountID, reportAccount.id, true)); } @Override diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java index 47f750845..41d97e8ea 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java @@ -43,6 +43,7 @@ import org.joinmastodon.android.api.requests.accounts.SetDomainBlocked; import org.joinmastodon.android.api.requests.statuses.DeleteStatus; import org.joinmastodon.android.api.requests.statuses.GetStatusByID; import org.joinmastodon.android.api.session.AccountSessionManager; +import org.joinmastodon.android.events.RemoveAccountPostsEvent; import org.joinmastodon.android.events.StatusDeletedEvent; import org.joinmastodon.android.fragments.HashtagTimelineFragment; import org.joinmastodon.android.fragments.ProfileFragment; @@ -325,6 +326,9 @@ public class UiUtils{ @Override public void onSuccess(Relationship result){ resultCallback.accept(result); + if(!currentlyBlocked){ + E.post(new RemoveAccountPostsEvent(accountID, account.id, false)); + } } @Override @@ -367,6 +371,9 @@ public class UiUtils{ @Override public void onSuccess(Relationship result){ resultCallback.accept(result); + if(!currentlyMuted){ + E.post(new RemoveAccountPostsEvent(accountID, account.id, false)); + } } @Override @@ -448,6 +455,9 @@ public class UiUtils{ public void onSuccess(Relationship result){ resultCallback.accept(result); progressCallback.accept(false); + if(!result.following){ + E.post(new RemoveAccountPostsEvent(accountID, account.id, true)); + } } @Override