From 4f8c4c67d258aa2200ef7794d6ceed2f444740bd Mon Sep 17 00:00:00 2001 From: FineFindus Date: Mon, 25 Sep 2023 20:22:06 +0200 Subject: [PATCH] feat(hashtag): allow unmuting hashtag --- .../fragments/HashtagTimelineFragment.java | 71 ++++++++++++++++--- mastodon/src/main/res/values/strings_mo.xml | 8 ++- 2 files changed, 68 insertions(+), 11 deletions(-) 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 87e6a59caf..ca5c5f6231 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java @@ -13,6 +13,8 @@ import org.joinmastodon.android.E; import org.joinmastodon.android.R; +import org.joinmastodon.android.api.requests.filters.CreateFilter; +import org.joinmastodon.android.api.requests.filters.DeleteFilter; import org.joinmastodon.android.api.requests.filters.GetFilters; import org.joinmastodon.android.api.requests.tags.GetHashtag; import org.joinmastodon.android.api.requests.tags.SetHashtagFollowed; @@ -20,6 +22,7 @@ import org.joinmastodon.android.events.HashtagUpdatedEvent; import org.joinmastodon.android.fragments.settings.EditFilterFragment; import org.joinmastodon.android.model.Filter; +import org.joinmastodon.android.model.FilterAction; import org.joinmastodon.android.model.FilterContext; import org.joinmastodon.android.model.FilterKeyword; import org.joinmastodon.android.model.Hashtag; @@ -30,7 +33,9 @@ import org.parceler.Parcels; import java.util.ArrayList; +import java.util.EnumSet; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import me.grishka.appkit.Nav; @@ -47,6 +52,8 @@ public class HashtagTimelineFragment extends PinnableStatusListFragment { private boolean following; private boolean localOnly; private MenuItem followButton; + private MenuItem muteButton; + private Optional filter = Optional.empty(); @Override protected boolean wantsComposeButton() { @@ -78,13 +85,18 @@ private void updateFollowingState(boolean newFollowing) { E.post(new HashtagUpdatedEvent(hashtag, following)); } + private void updateMuteState(boolean newMute) { + muteButton.setTitle(getString(newMute ? R.string.unmute_user : R.string.mute_user, "#" + hashtag)); + } + @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.hashtag_timeline, menu); super.onCreateOptionsMenu(menu, inflater); followButton = menu.findItem(R.id.follow_hashtag); updateFollowingState(following); - + muteButton = menu.findItem(R.id.mute_hashtag); + updateMuteState(filter.isPresent()); new GetHashtag(hashtag).setCallback(new Callback<>() { @Override public void onSuccess(Hashtag hashtag) { @@ -98,6 +110,20 @@ public void onError(ErrorResponse error) { error.showToast(getActivity()); } }).exec(accountID); + + new GetFilters().setCallback(new Callback<>() { + @Override + public void onSuccess(List filters) { + if (getActivity() == null) return; + filter=filters.stream().filter(filter->filter.title.equals("#"+hashtag)).findAny(); + updateMuteState(filter.isPresent()); + } + + @Override + public void onError(ErrorResponse error) { + error.showToast(getActivity()); + } + }).exec(accountID); } @@ -123,17 +149,46 @@ public void onError(ErrorResponse error) { }).exec(accountID); return true; } else if (item.getItemId() == R.id.mute_hashtag) { - Bundle args=new Bundle(); - args.putString("account", accountID); - FilterKeyword hashtagFilter=new FilterKeyword(); - hashtagFilter.wholeWord=true; - hashtagFilter.keyword=hashtag; - args.putParcelableArrayList("words", new ArrayList<>(List.of(Parcels.wrap(hashtagFilter)))); - Nav.go(getActivity(), EditFilterFragment.class, args); + showMuteDialog(filter.isPresent()); + return true; } return false; } + private void showMuteDialog(boolean mute) { + UiUtils.showConfirmationAlert(getContext(), + mute ? R.string.mo_unmute_hashtag : R.string.mo_mute_hashtag, + mute ? R.string.mo_confirm_to_unmute_hashtag : R.string.mo_confirm_to_mute_hashtag, + mute ? R.string.do_unmute : R.string.do_mute, + mute ? R.drawable.ic_fluent_speaker_2_28_regular : R.drawable.ic_fluent_speaker_off_28_regular, + mute ? this::unmuteHashtag : this::muteHashtag + ); + } + private void unmuteHashtag() { + //safe to get, this only called if filter is present + new DeleteFilter(filter.get().id).exec(accountID); + } + + private void muteHashtag() { + FilterKeyword hashtagFilter=new FilterKeyword(); + hashtagFilter.wholeWord=true; + hashtagFilter.keyword=hashtag; + new CreateFilter("#"+hashtag, EnumSet.of(FilterContext.HOME), FilterAction.HIDE, 0 , List.of(hashtagFilter)).setCallback(new Callback(){ + @Override + public void onSuccess(Filter result){ + filter = Optional.of(result); + updateMuteState(true); + } + + @Override + public void onError(ErrorResponse error){ + error.showToast(getContext()); + } + }).exec(accountID); + } + + + @Override protected TimelineDefinition makeTimelineDefinition() { return TimelineDefinition.ofHashtag(hashtag); diff --git a/mastodon/src/main/res/values/strings_mo.xml b/mastodon/src/main/res/values/strings_mo.xml index 350324d7a3..e8dbdd2ad1 100644 --- a/mastodon/src/main/res/values/strings_mo.xml +++ b/mastodon/src/main/res/values/strings_mo.xml @@ -43,7 +43,11 @@ Unmute conversation Are you sure you want to mute this conversation? Are you sure you want to unmute this conversation? - + Mute hashtag + Unmute hashtag + Are you sure you want to mute this hashtag? + Are you sure you want to unmute this hashtag? + Add new poll option Compose @@ -107,6 +111,4 @@ Recent emoji cleared Show media preview in timelines - - Mute Hashtag \ No newline at end of file