diff --git a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java
index aae9cfca556..a1f563724ee 100644
--- a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java
@@ -13,6 +13,7 @@
import com.google.android.material.snackbar.Snackbar;
import org.schabi.newpipe.R;
+import org.schabi.newpipe.util.ListHelper;
import org.schabi.newpipe.util.PermissionHelper;
import java.util.LinkedList;
@@ -26,7 +27,7 @@ public void onCreatePreferences(final Bundle savedInstanceState, final String ro
addPreferencesFromResourceRegistry();
updateSeekOptions();
-
+ updateResolutionOptions();
listener = (sharedPreferences, key) -> {
// on M and above, if user chooses to minimise to popup player on exit
@@ -48,10 +49,84 @@ && getString(R.string.minimize_on_exit_key).equals(key)) {
}
} else if (getString(R.string.use_inexact_seek_key).equals(key)) {
updateSeekOptions();
+ } else if (getString(R.string.show_higher_resolutions_key).equals(key)) {
+ updateResolutionOptions();
}
};
}
+ /**
+ * Update default resolution, default popup resolution & mobile data resolution options.
+ *
+ * Show high resolutions when "Show higher resolution" option is enabled.
+ * Set default resolution to "best resolution" when "Show higher resolution" option
+ * is disabled.
+ */
+ private void updateResolutionOptions() {
+ final Resources resources = getResources();
+ final boolean showHigherResolutions = getPreferenceManager().getSharedPreferences()
+ .getBoolean(resources.getString(R.string.show_higher_resolutions_key), false);
+
+ // get sorted resolution lists
+ final List resolutionListDescriptions = ListHelper.getSortedResolutionList(
+ resources,
+ R.array.resolution_list_description,
+ R.array.high_resolution_list_descriptions,
+ showHigherResolutions);
+ final List resolutionListValues = ListHelper.getSortedResolutionList(
+ resources,
+ R.array.resolution_list_values,
+ R.array.high_resolution_list_values,
+ showHigherResolutions);
+ final List limitDataUsageResolutionValues = ListHelper.getSortedResolutionList(
+ resources,
+ R.array.limit_data_usage_values_list,
+ R.array.high_resolution_limit_data_usage_values_list,
+ showHigherResolutions);
+ final List limitDataUsageResolutionDescriptions = ListHelper
+ .getSortedResolutionList(resources,
+ R.array.limit_data_usage_description_list,
+ R.array.high_resolution_list_descriptions,
+ showHigherResolutions);
+
+ // get resolution preferences
+ final ListPreference defaultResolution = findPreference(
+ getString(R.string.default_resolution_key));
+ final ListPreference defaultPopupResolution = findPreference(
+ getString(R.string.default_popup_resolution_key));
+ final ListPreference mobileDataResolution = findPreference(
+ getString(R.string.limit_mobile_data_usage_key));
+
+ // update resolution preferences with new resolutions, entries & values for each
+ defaultResolution.setEntries(resolutionListDescriptions.toArray(new String[0]));
+ defaultResolution.setEntryValues(resolutionListValues.toArray(new String[0]));
+ defaultPopupResolution.setEntries(resolutionListDescriptions.toArray(new String[0]));
+ defaultPopupResolution.setEntryValues(resolutionListValues.toArray(new String[0]));
+ mobileDataResolution.setEntries(
+ limitDataUsageResolutionDescriptions.toArray(new String[0]));
+ mobileDataResolution.setEntryValues(limitDataUsageResolutionValues.toArray(new String[0]));
+
+ // if "Show higher resolution" option is disabled,
+ // set default resolution to "best resolution"
+ if (!showHigherResolutions) {
+ if (ListHelper.isHighResolutionSelected(defaultResolution.getValue(),
+ R.array.high_resolution_list_values,
+ resources)) {
+ defaultResolution.setValueIndex(0);
+ }
+ if (ListHelper.isHighResolutionSelected(defaultPopupResolution.getValue(),
+ R.array.high_resolution_list_values,
+ resources)) {
+ defaultPopupResolution.setValueIndex(0);
+ }
+ if (ListHelper.isHighResolutionSelected(mobileDataResolution.getValue(),
+ R.array.high_resolution_limit_data_usage_values_list,
+ resources)) {
+ mobileDataResolution.setValueIndex(0);
+ }
+ }
+ }
+
/**
* Update fast-forward/-rewind seek duration options
* according to language and inexact seek setting.
diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java
index f45f3786da9..5918ece2544 100644
--- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java
+++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java
@@ -4,6 +4,7 @@
import android.content.Context;
import android.content.SharedPreferences;
+import android.content.res.Resources;
import android.net.ConnectivityManager;
import androidx.annotation.NonNull;
@@ -239,6 +240,41 @@ public static List getSortedStreamVideosList(
videoOnlyStreams, ascendingOrder, preferVideoOnlyStreams);
}
+ /**
+ * Get a sorted list containing a set of default resolution info
+ * and additional resolution info if showHigherResolutions is true.
+ *
+ * @param resources the resources to get the resolutions from
+ * @param defaultResolutionKey the settings key of the default resolution
+ * @param additionalResolutionKey the settings key of the additional resolutions
+ * @param showHigherResolutions if higher resolutions should be included in the sorted list
+ * @return a sorted list containing the default and maybe additional resolutions
+ */
+ public static List getSortedResolutionList(
+ final Resources resources,
+ final int defaultResolutionKey,
+ final int additionalResolutionKey,
+ final boolean showHigherResolutions) {
+ final List resolutions = new ArrayList<>(Arrays.asList(
+ resources.getStringArray(defaultResolutionKey)));
+ if (!showHigherResolutions) {
+ return resolutions;
+ }
+ final List additionalResolutions = Arrays.asList(
+ resources.getStringArray(additionalResolutionKey));
+ // keep "best resolution" at the top
+ resolutions.addAll(1, additionalResolutions);
+ return resolutions;
+ }
+
+ public static boolean isHighResolutionSelected(final String selectedResolution,
+ final int additionalResolutionKey,
+ final Resources resources) {
+ return Arrays.asList(resources.getStringArray(
+ additionalResolutionKey))
+ .contains(selectedResolution);
+ }
+
/**
* Filter the list of audio streams and return a list with the preferred stream for
* each audio track. Streams are sorted with the preferred language in the first position.
diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml
index 19188bb6c4a..880fa92da7b 100644
--- a/app/src/main/res/values/settings_keys.xml
+++ b/app/src/main/res/values/settings_keys.xml
@@ -124,6 +124,16 @@
480p
best_resolution
+
+ - 2160p
+ - 1440p
+
+
+
+ - 2160p
+ - 1440p
+
+
- @string/best_resolution_key
- 1080p60
@@ -1346,6 +1356,11 @@
- 144p
+
+ - 2160p
+ - 1440p
+
+
list_view_mode
@string/list_view_mode_auto_key
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 7e93a2ee48e..9dfca829440 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -541,6 +541,10 @@
- 240p
- 144p
+
+ - 2160p
+ - 1440p
+
New streams notifications
Notify about new streams from subscriptions