Long press on tags: Follow / Mute

This commit is contained in:
Thomas 2025-07-24 18:12:01 +02:00
parent 96ed973163
commit bb500d04a6
5 changed files with 109 additions and 29 deletions

View file

@ -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();
});
}
}

View file

@ -1541,6 +1541,10 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
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();

View file

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="12dp">
<com.google.android.material.button.MaterialButton
android:id="@+id/follow_tags"
style="@style/Widget.Material3.Button.TextButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/follow_tag"
android:textAlignment="textStart"
app:icon="@drawable/tag_follow" />
<!-- <com.google.android.material.button.MaterialButton
android:id="@+id/pin_tag"
style="@style/Widget.Material3.Button.TextButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/pin_tag"
android:textAlignment="textStart"
app:icon="@drawable/tag_pin" /> -->
<com.google.android.material.button.MaterialButton
android:id="@+id/mute_tag"
style="@style/Widget.Material3.Button.TextButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/mute_tag_action"
android:textAlignment="textStart"
app:icon="@drawable/tag_muted" />
</LinearLayout>

View file

@ -1905,8 +1905,10 @@
<string name="set_language_picker_title">Languages in picker</string>
<string name="set_language_picker">Allow to reduce the list of languages in the picker when composing a message.</string>
<string name="action_followed_tag_empty">You don\'t follow any tags!</string>
<string name="followed_tag_success">You now follow this tag!</string>
<string name="action_unfollow_tag">Unfollow tag</string>
<string name="action_unfollow_tag_confirm">Are you sure you want to unfollow this tag?</string>
<string name="action_follow_tag_confirm">Are you sure you want to follow the tag %1$s??</string>
<string name="unfollow">Unfollow</string>
<string name="action_tag_follow">Follow a tag</string>
<string name="write_the_tag_to_follow">Write the tag to follow</string>

View file

@ -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