From 37f63b114265bf9f0ccf81079bc2d5a46f9d1004 Mon Sep 17 00:00:00 2001 From: FineFindus Date: Tue, 2 Apr 2024 19:31:22 +0200 Subject: [PATCH 1/5] feat: add support for rows with custom views --- .../AccountRestrictionConfirmationSheet.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/AccountRestrictionConfirmationSheet.java b/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/AccountRestrictionConfirmationSheet.java index accda39a0..99cd0de04 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/AccountRestrictionConfirmationSheet.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/AccountRestrictionConfirmationSheet.java @@ -17,6 +17,7 @@ import org.joinmastodon.android.R; import org.joinmastodon.android.model.Account; import org.joinmastodon.android.ui.drawables.EmptyDrawable; import org.joinmastodon.android.ui.utils.UiUtils; +import org.joinmastodon.android.ui.views.AutoOrientationLinearLayout; import org.joinmastodon.android.ui.views.ProgressBarButton; import androidx.annotation.DrawableRes; @@ -66,7 +67,7 @@ public abstract class AccountRestrictionConfirmationSheet extends BottomSheet{ }); } - protected void addRow(@DrawableRes int icon, CharSequence text){ + protected void addRow(@DrawableRes int icon, CharSequence text, View view) { TextView tv=new TextView(getContext()); tv.setTextAppearance(R.style.m3_body_large); tv.setTextColor(UiUtils.getThemeColor(getContext(), R.attr.colorM3OnSurfaceVariant)); @@ -77,7 +78,26 @@ public abstract class AccountRestrictionConfirmationSheet extends BottomSheet{ drawable.setBounds(0, 0, V.dp(40), V.dp(40)); tv.setCompoundDrawablesRelative(drawable, null, null, null); tv.setCompoundDrawablePadding(V.dp(16)); - contentWrap.addView(tv, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + + if(view==null){ + contentWrap.addView(tv, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + return; + } + + AutoOrientationLinearLayout layout = new AutoOrientationLinearLayout(getContext()); + LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(0,ViewGroup.LayoutParams.WRAP_CONTENT); + lp.weight=1f; + layout.addView(tv, lp); + layout.addView(view, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + contentWrap.addView(layout, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + } + + protected void addRow(@DrawableRes int icon, @StringRes int text, View view){ + addRow(icon, getContext().getString(text), view); + } + + protected void addRow(@DrawableRes int icon, CharSequence text){ + addRow(icon, text, null); } protected void addRow(@DrawableRes int icon, @StringRes int text){ From 56540d7e7b9041a8e48200397f000321e73685a9 Mon Sep 17 00:00:00 2001 From: FineFindus Date: Tue, 2 Apr 2024 19:32:08 +0200 Subject: [PATCH 2/5] feat: re-add mute duration option --- .../sheets/MuteAccountConfirmationSheet.java | 47 ++++++++++++++++++- .../android/ui/utils/UiUtils.java | 6 ++- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/MuteAccountConfirmationSheet.java b/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/MuteAccountConfirmationSheet.java index 87522e1bf..2a3816858 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/MuteAccountConfirmationSheet.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/MuteAccountConfirmationSheet.java @@ -1,17 +1,22 @@ package org.joinmastodon.android.ui.sheets; import android.content.Context; +import android.view.Gravity; import android.view.View; +import android.widget.Button; +import android.widget.PopupMenu; import org.joinmastodon.android.R; import org.joinmastodon.android.model.Account; +import java.time.Duration; +import java.util.concurrent.atomic.AtomicReference; + import androidx.annotation.NonNull; public class MuteAccountConfirmationSheet extends AccountRestrictionConfirmationSheet{ - public MuteAccountConfirmationSheet(@NonNull Context context, Account user, ConfirmCallback confirmCallback){ + public MuteAccountConfirmationSheet(@NonNull Context context, Account user, AtomicReference muteDuration, ConfirmCallback confirmCallback){ super(context, user, confirmCallback); - //TODO: readd the time option titleView.setText(R.string.mute_user_confirm_title); confirmBtn.setText(R.string.do_mute); secondaryBtn.setVisibility(View.GONE); @@ -21,5 +26,43 @@ public class MuteAccountConfirmationSheet extends AccountRestrictionConfirmation addRow(R.drawable.ic_fluent_eye_off_24_regular, R.string.user_can_still_see_your_posts); addRow(R.drawable.ic_fluent_mention_24_regular, R.string.you_wont_see_user_mentions); addRow(R.drawable.ic_fluent_arrow_reply_24_regular, R.string.user_can_mention_and_follow_you); + + // add mute duration (Moshidon) + Button button=new Button(getContext()); + PopupMenu popupMenu=getMuteDurationPopupMenu(context, muteDuration, button); + button.setOnClickListener(v->popupMenu.show()); + button.setOnTouchListener(popupMenu.getDragToOpenListener()); + button.setText(popupMenu.getMenu().getItem(0).getTitle()); + + addRow(R.drawable.ic_fluent_clock_20_regular, R.string.sk_mute_label, button); + } + + @NonNull + private PopupMenu getMuteDurationPopupMenu(@NonNull Context context, AtomicReference muteDuration, Button button){ + PopupMenu popupMenu=new PopupMenu(context, button, Gravity.CENTER_HORIZONTAL); + popupMenu.inflate(R.menu.mute_duration); + popupMenu.setOnMenuItemClickListener(item->{ + int id=item.getItemId(); + if(id==R.id.duration_indefinite) + muteDuration.set(Duration.ZERO); + else if(id==R.id.duration_minutes_5){ + muteDuration.set(Duration.ofMinutes(5)); + }else if(id==R.id.duration_minutes_30){ + muteDuration.set(Duration.ofMinutes(30)); + }else if(id==R.id.duration_hours_1){ + muteDuration.set(Duration.ofHours(1)); + }else if(id==R.id.duration_hours_6){ + muteDuration.set(Duration.ofHours(6)); + }else if(id==R.id.duration_days_1){ + muteDuration.set(Duration.ofDays(1)); + }else if(id==R.id.duration_days_3){ + muteDuration.set(Duration.ofDays(3)); + }else if(id==R.id.duration_days_7){ + muteDuration.set(Duration.ofDays(7)); + } + button.setText(item.getTitle()); + return true; + }); + return popupMenu; } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java index 2720b997c..f4faad476 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java @@ -599,8 +599,10 @@ public class UiUtils { } public static void confirmToggleMuteUser(Context context, String accountID, Account account, boolean currentlyMuted, Consumer resultCallback){ if(!currentlyMuted){ - new MuteAccountConfirmationSheet(context, account, (onSuccess, onError)->{ - new SetAccountMuted(account.id, true, 0) + //pass a reference to the duration, so it can be changed inside the confirmation sheet + AtomicReference muteDuration=new AtomicReference<>(Duration.ZERO); + new MuteAccountConfirmationSheet(context, account, muteDuration, (onSuccess, onError)->{ + new SetAccountMuted(account.id, true, muteDuration.get().getSeconds()) .setCallback(new Callback<>(){ @Override public void onSuccess(Relationship result){ From 18f8c1d29ecb4f5b854243211677e6ccabb1f2ac Mon Sep 17 00:00:00 2001 From: FineFindus Date: Tue, 2 Apr 2024 19:34:26 +0200 Subject: [PATCH 3/5] refactor: only add body for muting requests --- .../android/api/requests/accounts/SetAccountMuted.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/requests/accounts/SetAccountMuted.java b/mastodon/src/main/java/org/joinmastodon/android/api/requests/accounts/SetAccountMuted.java index 7d6afadf6..22f29b974 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/requests/accounts/SetAccountMuted.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/requests/accounts/SetAccountMuted.java @@ -6,7 +6,8 @@ import org.joinmastodon.android.model.Relationship; public class SetAccountMuted extends MastodonAPIRequest{ public SetAccountMuted(String id, boolean muted, long duration){ super(HttpMethod.POST, "/accounts/"+id+"/"+(muted ? "mute" : "unmute"), Relationship.class); - setRequestBody(new Request(duration)); + if(muted) + setRequestBody(new Request(duration, muteNotifications)); } private static class Request{ From e6501ad8a3bc136243e11f97ab6ff97dd2686988 Mon Sep 17 00:00:00 2001 From: FineFindus Date: Tue, 2 Apr 2024 19:53:54 +0200 Subject: [PATCH 4/5] feat: add mute notifications toggle --- .../api/requests/accounts/SetAccountMuted.java | 8 +++++--- .../sheets/AccountRestrictionConfirmationSheet.java | 1 + .../ui/sheets/MuteAccountConfirmationSheet.java | 11 ++++++++++- .../org/joinmastodon/android/ui/utils/UiUtils.java | 10 ++++++---- mastodon/src/main/res/values/strings_mo.xml | 1 + 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/requests/accounts/SetAccountMuted.java b/mastodon/src/main/java/org/joinmastodon/android/api/requests/accounts/SetAccountMuted.java index 22f29b974..d4940645a 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/requests/accounts/SetAccountMuted.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/requests/accounts/SetAccountMuted.java @@ -4,16 +4,18 @@ import org.joinmastodon.android.api.MastodonAPIRequest; import org.joinmastodon.android.model.Relationship; public class SetAccountMuted extends MastodonAPIRequest{ - public SetAccountMuted(String id, boolean muted, long duration){ + public SetAccountMuted(String id, boolean muted, long duration, boolean muteNotifications){ super(HttpMethod.POST, "/accounts/"+id+"/"+(muted ? "mute" : "unmute"), Relationship.class); if(muted) - setRequestBody(new Request(duration, muteNotifications)); + setRequestBody(new Request(duration, muteNotifications)); } private static class Request{ public long duration; - public Request(long duration){ + public boolean muteNotifications; + public Request(long duration, boolean muteNotifications){ this.duration=duration; + this.muteNotifications=muteNotifications; } } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/AccountRestrictionConfirmationSheet.java b/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/AccountRestrictionConfirmationSheet.java index 99cd0de04..df24c2a37 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/AccountRestrictionConfirmationSheet.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/AccountRestrictionConfirmationSheet.java @@ -86,6 +86,7 @@ public abstract class AccountRestrictionConfirmationSheet extends BottomSheet{ AutoOrientationLinearLayout layout = new AutoOrientationLinearLayout(getContext()); LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(0,ViewGroup.LayoutParams.WRAP_CONTENT); + lp.gravity=Gravity.CENTER; lp.weight=1f; layout.addView(tv, lp); layout.addView(view, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/MuteAccountConfirmationSheet.java b/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/MuteAccountConfirmationSheet.java index 2a3816858..edd9508cd 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/MuteAccountConfirmationSheet.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/MuteAccountConfirmationSheet.java @@ -8,14 +8,16 @@ import android.widget.PopupMenu; import org.joinmastodon.android.R; import org.joinmastodon.android.model.Account; +import org.joinmastodon.android.ui.views.M3Switch; import java.time.Duration; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import androidx.annotation.NonNull; public class MuteAccountConfirmationSheet extends AccountRestrictionConfirmationSheet{ - public MuteAccountConfirmationSheet(@NonNull Context context, Account user, AtomicReference muteDuration, ConfirmCallback confirmCallback){ + public MuteAccountConfirmationSheet(@NonNull Context context, Account user, AtomicReference muteDuration, AtomicBoolean muteNotifications, ConfirmCallback confirmCallback){ super(context, user, confirmCallback); titleView.setText(R.string.mute_user_confirm_title); confirmBtn.setText(R.string.do_mute); @@ -27,6 +29,13 @@ public class MuteAccountConfirmationSheet extends AccountRestrictionConfirmation addRow(R.drawable.ic_fluent_mention_24_regular, R.string.you_wont_see_user_mentions); addRow(R.drawable.ic_fluent_arrow_reply_24_regular, R.string.user_can_mention_and_follow_you); + // add mute notifications toggle (Moshidon) + M3Switch m3Switch=new M3Switch(getContext()); + m3Switch.setClickable(true); + m3Switch.setChecked(muteNotifications.get()); + m3Switch.setOnCheckedChangeListener((compoundButton, b) -> muteNotifications.set(b)); + addRow(R.drawable.ic_fluent_alert_off_24_regular, R.string.mo_mute_notifications, m3Switch); + // add mute duration (Moshidon) Button button=new Button(getContext()); PopupMenu popupMenu=getMuteDurationPopupMenu(context, muteDuration, button); diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java index f4faad476..f5962a209 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java @@ -156,6 +156,7 @@ import java.util.Map; import java.util.Objects; import java.util.Objects; import java.util.Optional; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; import java.util.function.BiPredicate; @@ -599,10 +600,11 @@ public class UiUtils { } public static void confirmToggleMuteUser(Context context, String accountID, Account account, boolean currentlyMuted, Consumer resultCallback){ if(!currentlyMuted){ - //pass a reference to the duration, so it can be changed inside the confirmation sheet + //pass a references, so they can be changed inside the confirmation sheet AtomicReference muteDuration=new AtomicReference<>(Duration.ZERO); - new MuteAccountConfirmationSheet(context, account, muteDuration, (onSuccess, onError)->{ - new SetAccountMuted(account.id, true, muteDuration.get().getSeconds()) + AtomicBoolean muteNotifications=new AtomicBoolean(true); + new MuteAccountConfirmationSheet(context, account, muteDuration, muteNotifications, (onSuccess, onError)->{ + new SetAccountMuted(account.id, true, muteDuration.get().getSeconds(), muteNotifications.get()) .setCallback(new Callback<>(){ @Override public void onSuccess(Relationship result){ @@ -620,7 +622,7 @@ public class UiUtils { .exec(accountID); }).show(); }else{ - new SetAccountMuted(account.id, false, 0) + new SetAccountMuted(account.id, false, 0, false) .setCallback(new Callback<>(){ @Override public void onSuccess(Relationship result){ diff --git a/mastodon/src/main/res/values/strings_mo.xml b/mastodon/src/main/res/values/strings_mo.xml index d0b9d26fe..3649ce74d 100644 --- a/mastodon/src/main/res/values/strings_mo.xml +++ b/mastodon/src/main/res/values/strings_mo.xml @@ -119,4 +119,5 @@ Blocked accounts + Hide notifications from this user? \ No newline at end of file From fe96ee5f2a607850e6b154a51b6441c87b475cd7 Mon Sep 17 00:00:00 2001 From: FineFindus Date: Tue, 2 Apr 2024 20:04:40 +0200 Subject: [PATCH 5/5] feat: propagate row clicks to child --- .../android/ui/sheets/AccountRestrictionConfirmationSheet.java | 3 +++ .../android/ui/sheets/MuteAccountConfirmationSheet.java | 1 + 2 files changed, 4 insertions(+) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/AccountRestrictionConfirmationSheet.java b/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/AccountRestrictionConfirmationSheet.java index df24c2a37..7f293f734 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/AccountRestrictionConfirmationSheet.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/AccountRestrictionConfirmationSheet.java @@ -85,6 +85,9 @@ public abstract class AccountRestrictionConfirmationSheet extends BottomSheet{ } AutoOrientationLinearLayout layout = new AutoOrientationLinearLayout(getContext()); + // allow complete row to trigger child click listener + if(view.hasOnClickListeners()) + layout.setOnClickListener(v -> view.performClick()); LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(0,ViewGroup.LayoutParams.WRAP_CONTENT); lp.gravity=Gravity.CENTER; lp.weight=1f; diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/MuteAccountConfirmationSheet.java b/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/MuteAccountConfirmationSheet.java index edd9508cd..edb1433ec 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/MuteAccountConfirmationSheet.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/sheets/MuteAccountConfirmationSheet.java @@ -34,6 +34,7 @@ public class MuteAccountConfirmationSheet extends AccountRestrictionConfirmation m3Switch.setClickable(true); m3Switch.setChecked(muteNotifications.get()); m3Switch.setOnCheckedChangeListener((compoundButton, b) -> muteNotifications.set(b)); + m3Switch.setOnClickListener(view -> muteNotifications.set(m3Switch.isSelected())); addRow(R.drawable.ic_fluent_alert_off_24_regular, R.string.mo_mute_notifications, m3Switch); // add mute duration (Moshidon)