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 de127bd7a8..a9a74c4204 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java @@ -13,18 +13,29 @@ 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; import org.joinmastodon.android.api.requests.timelines.GetHashtagTimeline; 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; import org.joinmastodon.android.model.Status; import org.joinmastodon.android.model.TimelineDefinition; import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.utils.StatusFilterPredicate; +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; @@ -41,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() { @@ -72,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) { @@ -92,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); } @@ -116,10 +148,47 @@ public void onError(ErrorResponse error) { } }).exec(accountID); return true; + } else if (item.getItemId() == R.id.mute_hashtag) { + 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/java/org/joinmastodon/android/fragments/settings/EditFilterFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/settings/EditFilterFragment.java index 4655c4169d..e1a69acacf 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/settings/EditFilterFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/settings/EditFilterFragment.java @@ -68,6 +68,10 @@ public class EditFilterFragment extends BaseSettingsFragment implements On public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); filter=Parcels.unwrap(getArguments().getParcelable("filter")); + ArrayList words=getArguments().getParcelableArrayList("words"); + if (words != null) { + words.stream().map(p->(FilterKeyword)Parcels.unwrap(p)).forEach(keywords::add); + } setTitle(filter==null ? R.string.settings_add_filter : R.string.settings_edit_filter); onDataLoaded(List.of( durationItem=new ListItem<>(R.string.settings_filter_duration, 0, this::onDurationClick), diff --git a/mastodon/src/main/res/menu/hashtag_timeline.xml b/mastodon/src/main/res/menu/hashtag_timeline.xml index efc7cc2e21..0050f39ae6 100644 --- a/mastodon/src/main/res/menu/hashtag_timeline.xml +++ b/mastodon/src/main/res/menu/hashtag_timeline.xml @@ -10,4 +10,8 @@ android:icon="@drawable/ic_fluent_person_add_24_regular" android:showAsAction="always" android:title="@string/button_follow"/> + \ No newline at end of file diff --git a/mastodon/src/main/res/values/strings_mo.xml b/mastodon/src/main/res/values/strings_mo.xml index bc6c5c33f5..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 @@ -106,4 +110,5 @@ Confirm to unfollow %s Recent emoji cleared Show media preview in timelines + \ No newline at end of file