From 581327dc8e331b50ca644936b1225dbf24b04c0c Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 28 May 2020 22:05:57 -0700 Subject: [PATCH] Improve resolution preference storage to remove 16:9 assumptions --- .../preferences/PreferenceConfiguration.java | 58 +++++++++++-------- .../limelight/preferences/StreamSettings.java | 12 ++-- app/src/main/res/values/arrays.xml | 12 ++-- app/src/main/res/xml/preferences.xml | 2 +- 4 files changed, 47 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java b/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java index 692a9bea..06f6777d 100644 --- a/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java +++ b/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java @@ -44,7 +44,7 @@ public class PreferenceConfiguration { private static final String FLIP_FACE_BUTTONS_PREF_STRING = "checkbox_flip_face_buttons"; private static final String TOUCHSCREEN_TRACKPAD_PREF_STRING = "checkbox_touchscreen_trackpad"; - static final String DEFAULT_RESOLUTION = "720p"; + static final String DEFAULT_RESOLUTION = "1280x720"; static final String DEFAULT_FPS = "60"; private static final boolean DEFAULT_STRETCH = false; private static final boolean DEFAULT_SOPS = true; @@ -77,6 +77,13 @@ public class PreferenceConfiguration { public static final int AUTOSELECT_H265 = 0; public static final int FORCE_H265_OFF = 1; + public static final String RES_360P = "640x360"; + public static final String RES_480P = "854x480"; + public static final String RES_720P = "1280x720"; + public static final String RES_1080P = "1920x1080"; + public static final String RES_1440P = "2560x1440"; + public static final String RES_4K = "3840x2160"; + public int width, height, fps; public int bitrate; public int videoFormat; @@ -100,58 +107,54 @@ public class PreferenceConfiguration { public boolean touchscreenTrackpad; public MoonBridge.AudioConfiguration audioConfiguration; - private static int getHeightFromResolutionString(String resString) { + private static String convertFromLegacyResolutionString(String resString) { if (resString.equalsIgnoreCase("360p")) { - return 360; + return RES_360P; } else if (resString.equalsIgnoreCase("480p")) { - return 480; + return RES_480P; } else if (resString.equalsIgnoreCase("720p")) { - return 720; + return RES_720P; } else if (resString.equalsIgnoreCase("1080p")) { - return 1080; + return RES_1080P; } else if (resString.equalsIgnoreCase("1440p")) { - return 1440; + return RES_1440P; } else if (resString.equalsIgnoreCase("4K")) { - return 2160; + return RES_4K; } else { // Should be unreachable - return 720; + return RES_720P; } } private static int getWidthFromResolutionString(String resString) { - int height = getHeightFromResolutionString(resString); - if (height == 480) { - // This isn't an exact 16:9 resolution - return 854; - } - else { - return (height * 16) / 9; - } + return Integer.parseInt(resString.split("x")[0]); + } + + private static int getHeightFromResolutionString(String resString) { + return Integer.parseInt(resString.split("x")[1]); } private static String getResolutionString(int width, int height) { switch (height) { case 360: - return "360p"; + return RES_360P; case 480: - return "480p"; + return RES_480P; default: case 720: - return "720p"; + return RES_720P; case 1080: - return "1080p"; + return RES_1080P; case 1440: - return "1440p"; + return RES_1440P; case 2160: - return "4K"; - + return RES_4K; } } @@ -322,6 +325,13 @@ public class PreferenceConfiguration { else { // Use the new preference location String resStr = prefs.getString(RESOLUTION_PREF_STRING, PreferenceConfiguration.DEFAULT_RESOLUTION); + + // Convert legacy resolution strings to the new style + if (!resStr.contains("x")) { + resStr = PreferenceConfiguration.convertFromLegacyResolutionString(resStr); + prefs.edit().putString(RESOLUTION_PREF_STRING, resStr).apply(); + } + config.width = PreferenceConfiguration.getWidthFromResolutionString(resStr); config.height = PreferenceConfiguration.getHeightFromResolutionString(resStr); config.fps = Integer.parseInt(prefs.getString(FPS_PREF_STRING, PreferenceConfiguration.DEFAULT_FPS)); diff --git a/app/src/main/java/com/limelight/preferences/StreamSettings.java b/app/src/main/java/com/limelight/preferences/StreamSettings.java index 5f33453d..cdc40253 100644 --- a/app/src/main/java/com/limelight/preferences/StreamSettings.java +++ b/app/src/main/java/com/limelight/preferences/StreamSettings.java @@ -249,33 +249,33 @@ public class StreamSettings extends Activity { if (maxSupportedResW != 0) { if (maxSupportedResW < 3840) { // 4K is unsupported - removeValue(PreferenceConfiguration.RESOLUTION_PREF_STRING, "4K", new Runnable() { + removeValue(PreferenceConfiguration.RESOLUTION_PREF_STRING, PreferenceConfiguration.RES_4K, new Runnable() { @Override public void run() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(SettingsFragment.this.getActivity()); - setValue(PreferenceConfiguration.RESOLUTION_PREF_STRING, "1440p"); + setValue(PreferenceConfiguration.RESOLUTION_PREF_STRING, PreferenceConfiguration.RES_1440P); resetBitrateToDefault(prefs, null, null); } }); } if (maxSupportedResW < 2560) { // 1440p is unsupported - removeValue(PreferenceConfiguration.RESOLUTION_PREF_STRING, "1440p", new Runnable() { + removeValue(PreferenceConfiguration.RESOLUTION_PREF_STRING, PreferenceConfiguration.RES_1440P, new Runnable() { @Override public void run() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(SettingsFragment.this.getActivity()); - setValue(PreferenceConfiguration.RESOLUTION_PREF_STRING, "1080p"); + setValue(PreferenceConfiguration.RESOLUTION_PREF_STRING, PreferenceConfiguration.RES_1080P); resetBitrateToDefault(prefs, null, null); } }); } if (maxSupportedResW < 1920) { // 1080p is unsupported - removeValue(PreferenceConfiguration.RESOLUTION_PREF_STRING, "1080p", new Runnable() { + removeValue(PreferenceConfiguration.RESOLUTION_PREF_STRING, PreferenceConfiguration.RES_1080P, new Runnable() { @Override public void run() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(SettingsFragment.this.getActivity()); - setValue(PreferenceConfiguration.RESOLUTION_PREF_STRING, "720p"); + setValue(PreferenceConfiguration.RESOLUTION_PREF_STRING, PreferenceConfiguration.RES_720P); resetBitrateToDefault(prefs, null, null); } }); diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index abf5b1ce..fe52c6dc 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -9,12 +9,12 @@ 4K - 360p - 480p - 720p - 1080p - 1440p - 4K + 640x360 + 854x480 + 1280x720 + 1920x1080 + 2560x1440 + 3840x2160 diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 8646da56..1bfd6466 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -10,7 +10,7 @@ android:summary="@string/summary_resolution_list" android:entries="@array/resolution_names" android:entryValues="@array/resolution_values" - android:defaultValue="720p" /> + android:defaultValue="1280x720" />