From bb500d04a68252542adae8e9fa69bb38ea7f8393 Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 24 Jul 2025 18:12:01 +0200 Subject: [PATCH] Long press on tags: Follow / Mute --- .../mastodon/helper/SpannableHelper.java | 94 +++++++++++++------ .../mastodon/ui/drawer/StatusAdapter.java | 4 + .../mastodon/layout/popup_hashtags.xml | 37 ++++++++ app/src/main/res/values/strings.xml | 2 + .../metadata/android/en/changelogs/535.txt | 1 + 5 files changed, 109 insertions(+), 29 deletions(-) create mode 100644 app/src/main/res/layouts/mastodon/layout/popup_hashtags.xml diff --git a/app/src/main/java/app/fedilab/android/mastodon/helper/SpannableHelper.java b/app/src/main/java/app/fedilab/android/mastodon/helper/SpannableHelper.java index 6a2d36ca..99812a5d 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/helper/SpannableHelper.java +++ b/app/src/main/java/app/fedilab/android/mastodon/helper/SpannableHelper.java @@ -74,6 +74,7 @@ import app.fedilab.android.BaseMainActivity; import app.fedilab.android.MySuperGrammerLocator; import app.fedilab.android.R; import app.fedilab.android.activities.MainActivity; +import app.fedilab.android.databinding.PopupHashtagsBinding; import app.fedilab.android.databinding.PopupLinksBinding; import app.fedilab.android.mastodon.activities.ContextActivity; import app.fedilab.android.mastodon.activities.HashTagActivity; @@ -85,10 +86,12 @@ import app.fedilab.android.mastodon.client.entities.api.Emoji; import app.fedilab.android.mastodon.client.entities.api.Filter; import app.fedilab.android.mastodon.client.entities.api.Mention; import app.fedilab.android.mastodon.client.entities.api.Status; +import app.fedilab.android.mastodon.client.entities.api.Tag; import app.fedilab.android.mastodon.client.entities.app.CachedBundle; import app.fedilab.android.mastodon.client.entities.app.MarkdownConverter; import app.fedilab.android.mastodon.ui.drawer.StatusAdapter; import app.fedilab.android.mastodon.viewmodel.mastodon.FiltersVM; +import app.fedilab.android.mastodon.viewmodel.mastodon.TagVM; import es.dmoral.toasty.Toasty; import io.noties.markwon.AbstractMarkwonPlugin; import io.noties.markwon.Markwon; @@ -276,35 +279,7 @@ public class SpannableHelper { if (!tag.startsWith("#")) { tag = "#" + tag; } - Filter fedilabFilter = null; - for (Filter filter : MainActivity.mainFilters) { - if (filter.title.equals(Helper.FEDILAB_MUTED_HASHTAGS)) { - fedilabFilter = filter; - break; - } - } - //Filter for Fedilab doesn't exist we have to create it - if (fedilabFilter == null) { - Filter.FilterParams filterParams = new Filter.FilterParams(); - filterParams.title = Helper.FEDILAB_MUTED_HASHTAGS; - filterParams.filter_action = "hide"; - filterParams.context = new ArrayList<>(); - filterParams.context.add("home"); - filterParams.context.add("public"); - filterParams.context.add("thread"); - filterParams.context.add("account"); - String finalTag = tag; - FiltersVM filtersVM = new ViewModelProvider((ViewModelStoreOwner) context).get(FiltersVM.class); - filtersVM.addFilter(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, filterParams) - .observe((LifecycleOwner) context, filter -> { - if (filter != null) { - MainActivity.mainFilters.add(filter); - addTagToFilter(context, finalTag, status, filter); - } - }); - } else { - addTagToFilter(context, tag, status, fedilabFilter); - } + longPressHashTags(context, status, tag); } } @@ -857,6 +832,17 @@ public class SpannableHelper { } } + public static void addTagToFollowed(Context context, String tag) { + AlertDialog.Builder builder = new MaterialAlertDialogBuilder(context); + builder.setMessage(context.getString(R.string.action_follow_tag_confirm, tag)); + builder.setPositiveButton(R.string.follow_tag, (dialog, which) -> { + TagVM tagVM = new ViewModelProvider((ViewModelStoreOwner) context).get(TagVM.class); + tagVM.follow(MainActivity.currentInstance, MainActivity.currentToken, tag).observe((LifecycleOwner) context, returnedTag -> Toasty.success(context, context.getString(R.string.followed_tag_success), Toast.LENGTH_LONG).show()); + dialog.dismiss(); + }) + .setNegativeButton(R.string.no, (dialog, which) -> dialog.dismiss()) + .show(); + } public static void addTagToFilter(Context context, String tag, Status status, Filter filter) { for (Filter.KeywordsAttributes keywords : filter.keywords) { if (keywords.keyword.equalsIgnoreCase(tag)) { @@ -1047,4 +1033,54 @@ public class SpannableHelper { return trimSpannable(new SpannableStringBuilder(content)); } + + + public static void longPressHashTags(Context context, Status status, String tag) { + AlertDialog.Builder dialogBuilder = new MaterialAlertDialogBuilder(context); + PopupHashtagsBinding popupHashtagsBinding = PopupHashtagsBinding.inflate(LayoutInflater.from(context)); + dialogBuilder.setView(popupHashtagsBinding.getRoot()); + AlertDialog alertDialog = dialogBuilder.create(); + alertDialog.show(); + popupHashtagsBinding.followTags.setOnClickListener(v -> { + addTagToFollowed(context, tag); + alertDialog.dismiss(); + }); + /*popupHashtagsBinding.pinTag.setOnClickListener(v -> { + + alertDialog.dismiss(); + });*/ + + popupHashtagsBinding.muteTag.setOnClickListener(v -> { + Filter fedilabFilter = null; + for (Filter filter : MainActivity.mainFilters) { + if (filter.title.equals(Helper.FEDILAB_MUTED_HASHTAGS)) { + fedilabFilter = filter; + break; + } + } + //Filter for Fedilab doesn't exist we have to create it + if (fedilabFilter == null) { + Filter.FilterParams filterParams = new Filter.FilterParams(); + filterParams.title = Helper.FEDILAB_MUTED_HASHTAGS; + filterParams.filter_action = "hide"; + filterParams.context = new ArrayList<>(); + filterParams.context.add("home"); + filterParams.context.add("public"); + filterParams.context.add("thread"); + filterParams.context.add("account"); + FiltersVM filtersVM = new ViewModelProvider((ViewModelStoreOwner) context).get(FiltersVM.class); + filtersVM.addFilter(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, filterParams) + .observe((LifecycleOwner) context, filter -> { + if (filter != null) { + MainActivity.mainFilters.add(filter); + addTagToFilter(context, tag, status, filter); + } + }); + } else { + addTagToFilter(context, tag, status, fedilabFilter); + } + alertDialog.dismiss(); + }); + + } } diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java index 3f79825b..51c86dba 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java @@ -1541,6 +1541,10 @@ public class StatusAdapter extends RecyclerView.Adapter chip.setEnsureMinTouchTargetSize(false); chip.setText(tag); chip.setTextColor(ThemeHelper.getAttColor(context, R.attr.colorPrimary)); + chip.setOnLongClickListener(v->{ + SpannableHelper.longPressHashTags(context, statusToDeal, tag); + return true; + }); chip.setOnClickListener(v -> { Intent intentTag = new Intent(context, HashTagActivity.class); Bundle args = new Bundle(); diff --git a/app/src/main/res/layouts/mastodon/layout/popup_hashtags.xml b/app/src/main/res/layouts/mastodon/layout/popup_hashtags.xml new file mode 100644 index 00000000..ff957348 --- /dev/null +++ b/app/src/main/res/layouts/mastodon/layout/popup_hashtags.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 433e48cb..4394ff0e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1905,8 +1905,10 @@ Languages in picker Allow to reduce the list of languages in the picker when composing a message. You don\'t follow any tags! + You now follow this tag! Unfollow tag Are you sure you want to unfollow this tag? + Are you sure you want to follow the tag %1$s?? Unfollow Follow a tag Write the tag to follow diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/535.txt b/src/fdroid/fastlane/metadata/android/en/changelogs/535.txt index 7056dfe2..60e97eb6 100644 --- a/src/fdroid/fastlane/metadata/android/en/changelogs/535.txt +++ b/src/fdroid/fastlane/metadata/android/en/changelogs/535.txt @@ -1,5 +1,6 @@ Added: - Quote support for Mastodon +- Long press on tags: Follow / Mute Changed: - Limit the number of highlighted hashtags at the bottom of messages