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"/> + +