From fc6b4948f1f23e74629a1cbfe3fe77bb98798f24 Mon Sep 17 00:00:00 2001 From: "Alejandro R. Mosteo" Date: Wed, 18 Jun 2025 10:20:31 +0200 Subject: [PATCH 1/4] feat: settings to filter out posts with few comments When the checkbox is enabled, the user is asked for the minimum number of comments. This info is shown as the summary of the checkbox, when it is enabled. A toast is shown when comments are filtered, just as a reminder that this filter is in effect. --- .../adapters/PostListingManager.java | 2 + .../redreader/common/PrefsUtility.java | 25 +++++- .../fragments/PostListingFragment.java | 26 +++++++ .../redreader/settings/SettingsFragment.java | 77 +++++++++++++++++++ src/main/res/values/strings.xml | 23 +++++- src/main/res/xml/prefs_behaviour.xml | 4 + 6 files changed, 154 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/quantumbadger/redreader/adapters/PostListingManager.java b/src/main/java/org/quantumbadger/redreader/adapters/PostListingManager.java index 464604534..8d86518b9 100644 --- a/src/main/java/org/quantumbadger/redreader/adapters/PostListingManager.java +++ b/src/main/java/org/quantumbadger/redreader/adapters/PostListingManager.java @@ -18,8 +18,10 @@ package org.quantumbadger.redreader.adapters; import android.content.Context; +import org.quantumbadger.redreader.common.PrefsUtility; import org.quantumbadger.redreader.reddit.RedditPostListItem; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; diff --git a/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java b/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java index c47ce987d..c291bbc42 100644 --- a/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java +++ b/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java @@ -115,6 +115,8 @@ public static boolean isRefreshRequired(final Context context, final String key) || key.equals(context.getString(R.string.pref_behaviour_nsfw_key)) || key.equals(context.getString(R.string.pref_behaviour_postcount_key)) || key.equals(context.getString(R.string.pref_behaviour_comment_min_key)) + || key.equals(context.getString(R.string.pref_behaviour_hide_few_comments_key)) + || key.equals(context.getString(R.string.pref_behaviour_min_comments_key)) || key.equals(context.getString(R.string.pref_behaviour_pinned_subredditsort_key)) || key.equals(context.getString( R.string.pref_behaviour_blocked_subredditsort_key)) @@ -806,7 +808,6 @@ public static boolean pref_behaviour_video_frame_step() { return getBoolean(R.string.pref_behaviour_video_frame_step_key, false); } - public static boolean pref_behaviour_video_mute_default() { return getBoolean( R.string.pref_behaviour_video_mute_default_key, @@ -1171,6 +1172,28 @@ public static boolean pref_behaviour_mark_posts_as_read() { true); } + public static boolean pref_behaviour_hide_few_comments() { + return getBoolean( + R.string.pref_behaviour_hide_few_comments_key, + false); + } + + public static int pref_behaviour_min_comments() { + try { + return Integer.parseInt(getString( + R.string.pref_behaviour_min_comments_key, + "10")); + } catch(final Throwable e) { + return 10; + } + } + + public static void pref_behaviour_min_comments(final int value) { + sharedPrefs.edit() + .putString(getPrefKey(R.string.pref_behaviour_min_comments_key), String.valueOf(value)) + .apply(); + } + public enum SharingDomain { STANDARD_REDDIT("reddit.com"), SHORT_REDDIT("redd.it"), diff --git a/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java b/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java index ad6f08728..c7703c7bc 100644 --- a/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java +++ b/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java @@ -713,6 +713,15 @@ public void onDataStreamComplete( && mPostListingURL.pathType() != RedditURLParser.USER_POST_LISTING_URL; + final boolean hideFewComments + = PrefsUtility.pref_behaviour_hide_few_comments(); + + final int minComments = hideFewComments + ? PrefsUtility.pref_behaviour_min_comments() + : 0; + + final AtomicInteger filteredCommentCount = new AtomicInteger(0); + final boolean isConnectionWifi = General.isConnectionWifi(activity); final boolean inlinePreviews @@ -856,6 +865,13 @@ public void onDataStreamComplete( continue; } + // Skip adding this post if it has too few comments + if(hideFewComments && post.getNum_comments() < minComments) { + mPostsNotShown = true; + filteredCommentCount.incrementAndGet(); + continue; + } + if(precacheComments) { precacheComments(activity, preparedPost, positionInList); } @@ -944,6 +960,16 @@ public void onSuccess(final ImageInfo info) { mPostListingManager.addViewToItems(emptyView); } + // Show toast if posts were filtered due to few comments (only on first download) + if(firstDownload && filteredCommentCount.get() > 0) { + final String message = getContext().getResources().getQuantityString( + R.plurals.posts_filtered_few_comments, + filteredCommentCount.get(), + filteredCommentCount.get(), + minComments); + Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show(); + } + onPostsAdded(); mRequest = null; diff --git a/src/main/java/org/quantumbadger/redreader/settings/SettingsFragment.java b/src/main/java/org/quantumbadger/redreader/settings/SettingsFragment.java index 2d2cd3f58..6d6184ffb 100644 --- a/src/main/java/org/quantumbadger/redreader/settings/SettingsFragment.java +++ b/src/main/java/org/quantumbadger/redreader/settings/SettingsFragment.java @@ -261,6 +261,31 @@ public void onCreatePreferences( } } + { + final CheckBoxPreference hideFewCommentsPref = + findPreference(getString(R.string.pref_behaviour_hide_few_comments_key)); + + if (hideFewCommentsPref != null) { + // Update summary to show current minimum when enabled + updateHideFewCommentsSummary(hideFewCommentsPref); + + hideFewCommentsPref.setOnPreferenceChangeListener((preference, newValue) -> { + final boolean isChecked = (Boolean) newValue; + + if (isChecked) { + // Show dialog to ask for minimum comment count + showMinCommentsDialog(hideFewCommentsPref); + return false; // Don't change the preference yet + } else { + // Clear the summary when unchecked + hideFewCommentsPref.setSummary(null); + return true; + } + }); + } + } + + final Preference testNotificationPref = findPreference(getString(R.string.pref_developer_test_notification_key)); @@ -796,4 +821,56 @@ public void run() { }.start(); } + + private void updateHideFewCommentsSummary(final CheckBoxPreference preference) { + if (preference.isChecked()) { + final Context context = getActivity(); + final int minComments = PrefsUtility.pref_behaviour_min_comments(); + final String summary = context.getResources().getQuantityString( + R.plurals.pref_behaviour_hide_few_comments_summary, + minComments, + minComments); + preference.setSummary(summary); + } else { + preference.setSummary(null); + } + } + + private void showMinCommentsDialog(final CheckBoxPreference preference) { + final Context context = getActivity(); + final int currentValue = PrefsUtility.pref_behaviour_min_comments(); + + // Create an EditText for number input + final android.widget.EditText editText = new android.widget.EditText(context); + editText.setInputType(android.text.InputType.TYPE_CLASS_NUMBER); + editText.setText(String.valueOf(currentValue)); + editText.setSelection(editText.getText().length()); + + new MaterialAlertDialogBuilder(context) + .setTitle(R.string.pref_behaviour_min_comments_dialog_title) + .setView(editText) + .setPositiveButton(android.R.string.ok, (dialog, which) -> { + try { + final String input = editText.getText().toString().trim(); + final int minComments = Integer.parseInt(input); + + if (minComments >= 0 && minComments <= 100000) { + // Save the minimum comments value + PrefsUtility.pref_behaviour_min_comments(minComments); + + // Enable the checkbox + preference.setChecked(true); + + // Update the summary + updateHideFewCommentsSummary(preference); + } else { + General.quickToast(context, R.string.error_invalid_number_range); + } + } catch (NumberFormatException e) { + General.quickToast(context, R.string.error_invalid_number); + } + }) + .setNegativeButton(android.R.string.cancel, null) + .show(); + } } diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index eba05baca..126bcb67a 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -1057,6 +1057,22 @@ pref_behaviour_hide_read_posts Hide read posts + pref_behaviour_hide_few_comments + Hide posts with few comments + pref_behaviour_min_comments + Minimum comments + Minimum number of comments to show post + + + %1$d post filtered (fewer than %2$d comments) + %1$d posts filtered (fewer than %2$d comments) + + + + Minimum %1$d comment + Minimum %1$d comments + + Shortcuts pref_menus_mainmenu_shortcutitems_key @@ -1507,7 +1523,7 @@ Warning The selected file was created by a newer version of RedReader. Restoring the preferences from this file may lead to crashes and instability. - + Continue anyway Cancel Restore @@ -1879,7 +1895,7 @@ All settings Link - + Selected Not selected @@ -1891,6 +1907,9 @@ Invalid account Selected account is not currently logged in + Invalid number + Number must be between 0 and 100000 + More settings diff --git a/src/main/res/xml/prefs_behaviour.xml b/src/main/res/xml/prefs_behaviour.xml index b64412042..c849d2524 100644 --- a/src/main/res/xml/prefs_behaviour.xml +++ b/src/main/res/xml/prefs_behaviour.xml @@ -179,6 +179,10 @@ android:key="@string/pref_behaviour_mark_posts_as_read_key" android:defaultValue="true"/> + + Date: Wed, 18 Jun 2025 11:18:55 +0200 Subject: [PATCH 2/4] fix lint errors --- .../quantumbadger/redreader/adapters/PostListingManager.java | 2 -- .../org/quantumbadger/redreader/settings/SettingsFragment.java | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/quantumbadger/redreader/adapters/PostListingManager.java b/src/main/java/org/quantumbadger/redreader/adapters/PostListingManager.java index 8d86518b9..464604534 100644 --- a/src/main/java/org/quantumbadger/redreader/adapters/PostListingManager.java +++ b/src/main/java/org/quantumbadger/redreader/adapters/PostListingManager.java @@ -18,10 +18,8 @@ package org.quantumbadger.redreader.adapters; import android.content.Context; -import org.quantumbadger.redreader.common.PrefsUtility; import org.quantumbadger.redreader.reddit.RedditPostListItem; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; diff --git a/src/main/java/org/quantumbadger/redreader/settings/SettingsFragment.java b/src/main/java/org/quantumbadger/redreader/settings/SettingsFragment.java index 6d6184ffb..92e96bf7c 100644 --- a/src/main/java/org/quantumbadger/redreader/settings/SettingsFragment.java +++ b/src/main/java/org/quantumbadger/redreader/settings/SettingsFragment.java @@ -854,7 +854,7 @@ private void showMinCommentsDialog(final CheckBoxPreference preference) { final String input = editText.getText().toString().trim(); final int minComments = Integer.parseInt(input); - if (minComments >= 0 && minComments <= 100000) { + if (minComments >= 0 && minComments <= 100_000) { // Save the minimum comments value PrefsUtility.pref_behaviour_min_comments(minComments); From aaa696858de6bf5f8806c60ede7a4ef23d651a50 Mon Sep 17 00:00:00 2001 From: "Alejandro R. Mosteo" Date: Wed, 18 Jun 2025 11:39:31 +0200 Subject: [PATCH 3/4] fix style checks --- .../org/quantumbadger/redreader/common/PrefsUtility.java | 3 ++- .../redreader/fragments/PostListingFragment.java | 8 +++++--- .../redreader/settings/SettingsFragment.java | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java b/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java index c291bbc42..970d02cca 100644 --- a/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java +++ b/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java @@ -1190,7 +1190,8 @@ public static int pref_behaviour_min_comments() { public static void pref_behaviour_min_comments(final int value) { sharedPrefs.edit() - .putString(getPrefKey(R.string.pref_behaviour_min_comments_key), String.valueOf(value)) + .putString(getPrefKey(R.string.pref_behaviour_min_comments_key), + String.valueOf(value)) .apply(); } diff --git a/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java b/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java index c7703c7bc..7575087e9 100644 --- a/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java +++ b/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java @@ -960,14 +960,16 @@ public void onSuccess(final ImageInfo info) { mPostListingManager.addViewToItems(emptyView); } - // Show toast if posts were filtered due to few comments (only on first download) + // Show toast if posts were filtered due to few comments if(firstDownload && filteredCommentCount.get() > 0) { - final String message = getContext().getResources().getQuantityString( + final String message = getContext().getResources() + .getQuantityString( R.plurals.posts_filtered_few_comments, filteredCommentCount.get(), filteredCommentCount.get(), minComments); - Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show(); + Toast.makeText(getContext(), message, Toast.LENGTH_SHORT) + .show(); } onPostsAdded(); diff --git a/src/main/java/org/quantumbadger/redreader/settings/SettingsFragment.java b/src/main/java/org/quantumbadger/redreader/settings/SettingsFragment.java index 92e96bf7c..e3eaa0547 100644 --- a/src/main/java/org/quantumbadger/redreader/settings/SettingsFragment.java +++ b/src/main/java/org/quantumbadger/redreader/settings/SettingsFragment.java @@ -866,7 +866,7 @@ private void showMinCommentsDialog(final CheckBoxPreference preference) { } else { General.quickToast(context, R.string.error_invalid_number_range); } - } catch (NumberFormatException e) { + } catch (final NumberFormatException e) { General.quickToast(context, R.string.error_invalid_number); } }) From e38ad1d8bbdca70cc3b83146172e84998f816b54 Mon Sep 17 00:00:00 2001 From: "Alejandro R. Mosteo" Date: Wed, 18 Jun 2025 14:28:05 +0200 Subject: [PATCH 4/4] fix spaces instead of tabs --- .../org/quantumbadger/redreader/common/PrefsUtility.java | 5 +++-- .../redreader/fragments/PostListingFragment.java | 9 +++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java b/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java index 970d02cca..582f0092a 100644 --- a/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java +++ b/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java @@ -1190,8 +1190,9 @@ public static int pref_behaviour_min_comments() { public static void pref_behaviour_min_comments(final int value) { sharedPrefs.edit() - .putString(getPrefKey(R.string.pref_behaviour_min_comments_key), - String.valueOf(value)) + .putString( + getPrefKey(R.string.pref_behaviour_min_comments_key), + String.valueOf(value)) .apply(); } diff --git a/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java b/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java index 7575087e9..3c2d598f1 100644 --- a/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java +++ b/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java @@ -962,14 +962,15 @@ public void onSuccess(final ImageInfo info) { // Show toast if posts were filtered due to few comments if(firstDownload && filteredCommentCount.get() > 0) { - final String message = getContext().getResources() - .getQuantityString( + final String message = + getContext().getResources().getQuantityString( R.plurals.posts_filtered_few_comments, filteredCommentCount.get(), filteredCommentCount.get(), minComments); - Toast.makeText(getContext(), message, Toast.LENGTH_SHORT) - .show(); + Toast + .makeText(getContext(), message, Toast.LENGTH_SHORT) + .show(); } onPostsAdded();