From 35bf858a83189ea35e4d6edc7678df19a6ec000e Mon Sep 17 00:00:00 2001 From: sk Date: Fri, 9 Jun 2023 14:54:03 +0200 Subject: [PATCH] auto-reveal equal spoilers in threads --- .../android/GlobalUserPreferences.java | 9 ++++ .../android/fragments/SettingsFragment.java | 48 +++++++++++++++++-- .../android/fragments/ThreadFragment.java | 21 +++++--- .../ic_fluent_star_off_24_regular.xml | 3 ++ .../res/menu/settings_auto_reveal_spoiler.xml | 12 +++++ mastodon/src/main/res/values/strings_sk.xml | 5 ++ 6 files changed, 87 insertions(+), 11 deletions(-) create mode 100644 mastodon/src/main/res/drawable/ic_fluent_star_off_24_regular.xml create mode 100644 mastodon/src/main/res/menu/settings_auto_reveal_spoiler.xml diff --git a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java index 3366f213f..de73cdfc9 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java +++ b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java @@ -49,6 +49,7 @@ public class GlobalUserPreferences{ public static boolean compactReblogReplyLine; public static boolean confirmBeforeReblog; public static boolean allowRemoteLoading; + public static AutoRevealMode autoRevealEqualSpoilers; public static String publishButtonText; public static ThemePreference theme; public static ColorPreference color; @@ -129,6 +130,7 @@ public class GlobalUserPreferences{ accountsWithContentTypesEnabled=prefs.getStringSet("accountsWithContentTypesEnabled", new HashSet<>()); accountsDefaultContentTypes=fromJson(prefs.getString("accountsDefaultContentTypes", null), accountsDefaultContentTypesType, new HashMap<>()); allowRemoteLoading=prefs.getBoolean("allowRemoteLoading", true); + autoRevealEqualSpoilers=AutoRevealMode.valueOf(prefs.getString("autoRevealEqualSpoilers", AutoRevealMode.THREADS.name())); try { color=ColorPreference.valueOf(prefs.getString("color", ColorPreference.PINK.name())); @@ -179,6 +181,7 @@ public class GlobalUserPreferences{ .putStringSet("accountsWithContentTypesEnabled", accountsWithContentTypesEnabled) .putString("accountsDefaultContentTypes", gson.toJson(accountsDefaultContentTypes)) .putBoolean("allowRemoteLoading", allowRemoteLoading) + .putString("autoRevealEqualSpoilers", autoRevealEqualSpoilers.name()) .apply(); } @@ -198,4 +201,10 @@ public class GlobalUserPreferences{ LIGHT, DARK } + + public enum AutoRevealMode { + NEVER, + THREADS, + DISCUSSIONS + } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java index 2e73e7805..1fbe3c427 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java @@ -37,6 +37,7 @@ import com.squareup.otto.Subscribe; import org.joinmastodon.android.BuildConfig; import org.joinmastodon.android.E; import org.joinmastodon.android.GlobalUserPreferences; +import org.joinmastodon.android.GlobalUserPreferences.AutoRevealMode; import org.joinmastodon.android.GlobalUserPreferences.ColorPreference; import org.joinmastodon.android.MainActivity; import org.joinmastodon.android.MastodonApp; @@ -85,8 +86,8 @@ public class SettingsFragment extends MastodonToolbarFragment implements Provide private ArrayList items=new ArrayList<>(); private ThemeItem themeItem; private NotificationPolicyItem notificationPolicyItem; - private SwitchItem showNewPostsItem, glitchModeItem, compactReblogReplyLineItem; - private ButtonItem defaultContentTypeButtonItem; + private SwitchItem showNewPostsItem, glitchModeItem, compactReblogReplyLineItem, alwaysRevealSpoilersItem; + private ButtonItem defaultContentTypeButtonItem, autoRevealSpoilersItem; private String accountID; private boolean needUpdateNotificationSettings; private boolean needAppRestart; @@ -189,9 +190,18 @@ public class SettingsFragment extends MastodonToolbarFragment implements Provide GlobalUserPreferences.showInteractionCounts=i.checked; GlobalUserPreferences.save(); })); - items.add(new SwitchItem(R.string.sk_settings_always_reveal_content_warnings, R.drawable.ic_fluent_chat_warning_24_regular, GlobalUserPreferences.alwaysExpandContentWarnings, i->{ + items.add(alwaysRevealSpoilersItem = new SwitchItem(R.string.sk_settings_always_reveal_content_warnings, R.drawable.ic_fluent_chat_warning_24_regular, GlobalUserPreferences.alwaysExpandContentWarnings, i->{ GlobalUserPreferences.alwaysExpandContentWarnings=i.checked; GlobalUserPreferences.save(); + if (list.findViewHolderForAdapterPosition(items.indexOf(autoRevealSpoilersItem)) instanceof ButtonViewHolder bvh) bvh.rebind(); + })); + items.add(autoRevealSpoilersItem = new ButtonItem(R.string.sk_settings_auto_reveal_equal_spoilers, R.drawable.ic_fluent_eye_24_regular, b->{ + PopupMenu popupMenu=new PopupMenu(getActivity(), b, Gravity.CENTER_HORIZONTAL); + popupMenu.inflate(R.menu.settings_auto_reveal_spoiler); + popupMenu.setOnMenuItemClickListener(i -> onAutoRevealSpoilerClick(i, b)); + b.setOnTouchListener(popupMenu.getDragToOpenListener()); + b.setOnClickListener(v->popupMenu.show()); + onAutoRevealSpoilerChanged(b); })); items.add(new SwitchItem(R.string.sk_tabs_disable_swipe, R.drawable.ic_fluent_swipe_right_24_regular, GlobalUserPreferences.disableSwipe, i->{ GlobalUserPreferences.disableSwipe=i.checked; @@ -276,7 +286,7 @@ public class SettingsFragment extends MastodonToolbarFragment implements Provide GlobalUserPreferences.collapseLongPosts=i.checked; GlobalUserPreferences.save(); })); - items.add(new SwitchItem(R.string.sk_settings_hide_interaction, R.drawable.ic_fluent_eye_24_regular, GlobalUserPreferences.spectatorMode, i->{ + items.add(new SwitchItem(R.string.sk_settings_hide_interaction, R.drawable.ic_fluent_star_off_24_regular, GlobalUserPreferences.spectatorMode, i->{ GlobalUserPreferences.spectatorMode=i.checked; GlobalUserPreferences.save(); needAppRestart=true; @@ -531,6 +541,36 @@ public class SettingsFragment extends MastodonToolbarFragment implements Provide return true; } + private boolean onAutoRevealSpoilerClick(MenuItem item, Button btn) { + int id = item.getItemId(); + + AutoRevealMode mode = AutoRevealMode.NEVER; + if (id == R.id.auto_reveal_threads) mode = AutoRevealMode.THREADS; + else if (id == R.id.auto_reveal_discussions) mode = AutoRevealMode.DISCUSSIONS; + + GlobalUserPreferences.alwaysExpandContentWarnings = false; + GlobalUserPreferences.autoRevealEqualSpoilers = mode; + GlobalUserPreferences.save(); + onAutoRevealSpoilerChanged(btn); + return true; + } + + private void onAutoRevealSpoilerChanged(Button b) { + if (GlobalUserPreferences.alwaysExpandContentWarnings) { + b.setText(R.string.sk_settings_auto_reveal_always); + } else { + b.setText(switch(GlobalUserPreferences.autoRevealEqualSpoilers){ + case THREADS -> R.string.sk_settings_auto_reveal_threads; + case DISCUSSIONS -> R.string.sk_settings_auto_reveal_discussions; + default -> R.string.sk_settings_auto_reveal_never; + }); + if (alwaysRevealSpoilersItem.checked != GlobalUserPreferences.alwaysExpandContentWarnings) { + alwaysRevealSpoilersItem.checked = GlobalUserPreferences.alwaysExpandContentWarnings; + if (list.findViewHolderForAdapterPosition(items.indexOf(alwaysRevealSpoilersItem)) instanceof SwitchViewHolder svh) svh.rebind(); + } + } + } + private void onTrueBlackThemeChanged(SwitchItem item){ GlobalUserPreferences.trueBlackTheme=item.checked; GlobalUserPreferences.save(); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ThreadFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ThreadFragment.java index 5826d3470..6ff24b7b7 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ThreadFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ThreadFragment.java @@ -8,6 +8,8 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import org.joinmastodon.android.E; +import org.joinmastodon.android.GlobalUserPreferences; +import org.joinmastodon.android.GlobalUserPreferences.AutoRevealMode; import org.joinmastodon.android.R; import org.joinmastodon.android.api.requests.statuses.GetStatusByID; import org.joinmastodon.android.api.requests.statuses.GetStatusContext; @@ -154,13 +156,18 @@ public class ThreadFragment extends StatusListFragment implements ProvidesAssist count--; } - // restore previous spoiler/filter revealed states when refreshing - if (refreshing && oldData.size() > 0) { - for (Status s : data) { - Status oldStatus = oldData.get(s.id); - if (oldStatus != null) { - s.spoilerRevealed = oldStatus.spoilerRevealed; - s.filterRevealed = oldStatus.filterRevealed; + for (Status s : data) { + Status oldStatus = oldData == null ? null : oldData.get(s.id); + // restore previous spoiler/filter revealed states when refreshing + if (oldStatus != null) { + s.spoilerRevealed = oldStatus.spoilerRevealed; + s.filterRevealed = oldStatus.filterRevealed; + } else if (GlobalUserPreferences.autoRevealEqualSpoilers != AutoRevealMode.NEVER && + s.spoilerText != null && + s.spoilerText.equals(mainStatus.spoilerText) && + mainStatus.spoilerRevealed) { + if (GlobalUserPreferences.autoRevealEqualSpoilers == AutoRevealMode.DISCUSSIONS || Objects.equals(mainStatus.account.id, s.account.id)) { + s.spoilerRevealed = true; } } } diff --git a/mastodon/src/main/res/drawable/ic_fluent_star_off_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_star_off_24_regular.xml new file mode 100644 index 000000000..9e46ebd1b --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_star_off_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/menu/settings_auto_reveal_spoiler.xml b/mastodon/src/main/res/menu/settings_auto_reveal_spoiler.xml new file mode 100644 index 000000000..f6a5e31ed --- /dev/null +++ b/mastodon/src/main/res/menu/settings_auto_reveal_spoiler.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index 40dd203a8..05d79c5d2 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -297,4 +297,9 @@ Failed loading the profile via %s Load info from remote instances Try fetching more accurate listings for followers, likes and boosts by loading the information from the instance of origin. + Reveal equal CWs in threads + Never + Same author + Discussions + Always \ No newline at end of file