diff --git a/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java b/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java
index c47ce987d..582f0092a 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,30 @@ 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..3c2d598f1 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,19 @@ public void onSuccess(final ImageInfo info) {
mPostListingManager.addViewToItems(emptyView);
}
+ // Show toast if posts were filtered due to few comments
+ 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..e3eaa0547 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 <= 100_000) {
+ // 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 (final 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"/>
+
+