Loading app/src/main/java/app/fedilab/android/mastodon/helper/SpannableHelper.java +65 −29 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); } } Loading Loading @@ -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)) { Loading Loading @@ -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(); }); } } app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java +4 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading app/src/main/res/layouts/mastodon/layout/popup_hashtags.xml 0 → 100644 +37 −0 Original line number Diff line number Diff line <?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> app/src/main/res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -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> Loading src/fdroid/fastlane/metadata/android/en/changelogs/535.txt +1 −0 Original line number Diff line number Diff line Added: - Quote support for Mastodon - Long press on tags: Follow / Mute Changed: - Limit the number of highlighted hashtags at the bottom of messages Loading Loading
app/src/main/java/app/fedilab/android/mastodon/helper/SpannableHelper.java +65 −29 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); } } Loading Loading @@ -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)) { Loading Loading @@ -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(); }); } }
app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java +4 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading
app/src/main/res/layouts/mastodon/layout/popup_hashtags.xml 0 → 100644 +37 −0 Original line number Diff line number Diff line <?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>
app/src/main/res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -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> Loading
src/fdroid/fastlane/metadata/android/en/changelogs/535.txt +1 −0 Original line number Diff line number Diff line Added: - Quote support for Mastodon - Long press on tags: Follow / Mute Changed: - Limit the number of highlighted hashtags at the bottom of messages Loading