From 09be5b3f9783a16f9823aef0604a9eb7fce9944d Mon Sep 17 00:00:00 2001 From: Grishka Date: Sat, 20 Apr 2024 04:48:57 +0300 Subject: [PATCH] Add descriptions to post visibility options --- mastodon/build.gradle | 2 +- .../android/fragments/ComposeFragment.java | 31 +++++----- .../android/model/viewmodel/ListItem.java | 6 ++ .../android/ui/ExtendedPopupMenu.java | 61 +++++++++++++++++++ .../main/res/drawable/ic_clear_night_24px.xml | 9 +++ .../src/main/res/drawable/ic_lock_24px.xml | 9 +++ mastodon/src/main/res/values/strings.xml | 8 ++- mastodon/src/main/res/values/styles.xml | 2 + 8 files changed, 108 insertions(+), 20 deletions(-) create mode 100644 mastodon/src/main/java/org/joinmastodon/android/ui/ExtendedPopupMenu.java create mode 100644 mastodon/src/main/res/drawable/ic_clear_night_24px.xml create mode 100644 mastodon/src/main/res/drawable/ic_lock_24px.xml diff --git a/mastodon/build.gradle b/mastodon/build.gradle index 5077aae0..18684e10 100644 --- a/mastodon/build.gradle +++ b/mastodon/build.gradle @@ -13,7 +13,7 @@ android { applicationId "org.joinmastodon.android" minSdk 23 targetSdk 33 - versionCode 93 + versionCode 97 versionName "2.5.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java index e309efc3..078a003f 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java @@ -66,7 +66,9 @@ import org.joinmastodon.android.model.Mention; import org.joinmastodon.android.model.Preferences; import org.joinmastodon.android.model.Status; import org.joinmastodon.android.model.StatusPrivacy; +import org.joinmastodon.android.model.viewmodel.ListItem; import org.joinmastodon.android.ui.CustomEmojiPopupKeyboard; +import org.joinmastodon.android.ui.ExtendedPopupMenu; import org.joinmastodon.android.ui.M3AlertDialogBuilder; import org.joinmastodon.android.ui.OutlineProviders; import org.joinmastodon.android.ui.PopupKeyboard; @@ -87,6 +89,7 @@ import org.parceler.Parcels; import java.util.ArrayList; import java.util.List; import java.util.UUID; +import java.util.function.Consumer; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -909,24 +912,18 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr } private void onVisibilityClick(View v){ - PopupMenu menu=new PopupMenu(getActivity(), v); - menu.inflate(R.menu.compose_visibility); - menu.setOnMenuItemClickListener(item->{ - int id=item.getItemId(); - if(id==R.id.vis_public){ - statusVisibility=StatusPrivacy.PUBLIC; - }else if(id==R.id.vis_unlisted){ - statusVisibility=StatusPrivacy.UNLISTED; - }else if(id==R.id.vis_followers){ - statusVisibility=StatusPrivacy.PRIVATE; - }else if(id==R.id.vis_private){ - statusVisibility=StatusPrivacy.DIRECT; - } - item.setChecked(true); + ArrayList> items=new ArrayList<>(); + ExtendedPopupMenu menu=new ExtendedPopupMenu(getActivity(), items); + Consumer> onClick=i->{ + statusVisibility=i.parentObject; updateVisibilityIcon(); - return true; - }); - menu.show(); + menu.dismiss(); + }; + items.add(new ListItem<>(R.string.visibility_public, R.string.visibility_subtitle_public, R.drawable.ic_public_24px, StatusPrivacy.PUBLIC, onClick)); + items.add(new ListItem<>(R.string.visibility_unlisted, R.string.visibility_subtitle_unlisted, R.drawable.ic_clear_night_24px, StatusPrivacy.UNLISTED, onClick)); + items.add(new ListItem<>(R.string.visibility_followers_only, R.string.visibility_subtitle_followers, R.drawable.ic_lock_24px, StatusPrivacy.PRIVATE, onClick)); + items.add(new ListItem<>(R.string.visibility_private, R.string.visibility_subtitle_private, R.drawable.ic_alternate_email_24px, StatusPrivacy.DIRECT, onClick)); + menu.showAsDropDown(v); } private void loadDefaultStatusVisibility(Bundle savedInstanceState){ diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/viewmodel/ListItem.java b/mastodon/src/main/java/org/joinmastodon/android/model/viewmodel/ListItem.java index 97854314..e5e1d601 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/viewmodel/ListItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/viewmodel/ListItem.java @@ -68,6 +68,12 @@ public class ListItem{ this.subtitleRes=subtitleRes; } + public ListItem(@StringRes int titleRes, @StringRes int subtitleRes, @DrawableRes int iconRes, T parentObject, Consumer> onClick){ + this(null, null, iconRes, onClick, parentObject, 0, false); + this.titleRes=titleRes; + this.subtitleRes=subtitleRes; + } + public ListItem(@StringRes int titleRes, @StringRes int subtitleRes, @DrawableRes int iconRes, Consumer> onClick, int colorOverrideAttr, boolean dividerAfter){ this(null, null, iconRes, onClick, null, colorOverrideAttr, dividerAfter); this.titleRes=titleRes; diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/ExtendedPopupMenu.java b/mastodon/src/main/java/org/joinmastodon/android/ui/ExtendedPopupMenu.java new file mode 100644 index 00000000..92b2ff47 --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/ExtendedPopupMenu.java @@ -0,0 +1,61 @@ +package org.joinmastodon.android.ui; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.widget.PopupWindow; + +import org.joinmastodon.android.R; +import org.joinmastodon.android.model.viewmodel.ListItem; +import org.joinmastodon.android.ui.adapters.GenericListItemsAdapter; +import org.joinmastodon.android.ui.viewholders.ListItemViewHolder; + +import java.util.List; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import me.grishka.appkit.utils.V; +import me.grishka.appkit.views.UsableRecyclerView; + +public class ExtendedPopupMenu extends PopupWindow{ + private UsableRecyclerView list; + + public ExtendedPopupMenu(Context context, List> items){ + super(context, null, 0, R.style.Widget_Mastodon_PopupMenu); + setWidth(V.dp(200)); + setElevation(V.dp(3)); + setOutsideTouchable(true); + setFocusable(true); + setInputMethodMode(INPUT_METHOD_NOT_NEEDED); + list=new UsableRecyclerView(context); + list.setLayoutManager(new LinearLayoutManager(context)); + list.setAdapter(new ReducedPaddingItemsAdapter<>(items)); + list.setClipToPadding(false); + setContentView(list); + } + + @Override + public void showAsDropDown(View anchor, int xoff, int yoff, int gravity){ + super.showAsDropDown(anchor, xoff, yoff, gravity); + View bgView=(View) list.getParent(); + list.setPadding(0, bgView.getPaddingTop(), 0, bgView.getPaddingBottom()); + bgView.setPadding(0, 0, 0, 0); + } + + private static class ReducedPaddingItemsAdapter extends GenericListItemsAdapter{ + public ReducedPaddingItemsAdapter(List> listItems){ + super(listItems); + } + + @NonNull + @Override + public ListItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){ + ListItemViewHolder holder=super.onCreateViewHolder(parent, viewType); + int padH=V.dp(12), padV=V.dp(8); + holder.itemView.setPadding(padH, padV, padH, padV); + View icon=holder.itemView.findViewById(R.id.icon); + ((ViewGroup.MarginLayoutParams)icon.getLayoutParams()).setMarginEnd(padH); + return holder; + } + } +} diff --git a/mastodon/src/main/res/drawable/ic_clear_night_24px.xml b/mastodon/src/main/res/drawable/ic_clear_night_24px.xml new file mode 100644 index 00000000..cd46aab4 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_clear_night_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_lock_24px.xml b/mastodon/src/main/res/drawable/ic_lock_24px.xml new file mode 100644 index 00000000..62392637 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_lock_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/mastodon/src/main/res/values/strings.xml b/mastodon/src/main/res/values/strings.xml index 54bd3c2c..d5d79830 100644 --- a/mastodon/src/main/res/values/strings.xml +++ b/mastodon/src/main/res/values/strings.xml @@ -171,8 +171,8 @@ Save Add alt text Public - Followers only - Only people mentioned + Followers + Specific people Recents Skip New followers @@ -747,4 +747,8 @@ Notifications from %s Notifications from %s have been dismissed. %s will now appear in your notification list. + Everyone on and off Mastodon + Fewer algorithmic fanfares + Only your followers + Everyone mentioned in the post \ No newline at end of file diff --git a/mastodon/src/main/res/values/styles.xml b/mastodon/src/main/res/values/styles.xml index 98b54c11..e664e9d1 100644 --- a/mastodon/src/main/res/values/styles.xml +++ b/mastodon/src/main/res/values/styles.xml @@ -211,6 +211,7 @@ @drawable/bg_popup @drawable/bg_spinner ?colorM3OnSurface + 3dp