From 68632a42f4d5de9a71966131b7d4ba24fed98a95 Mon Sep 17 00:00:00 2001 From: Synced Synapse Date: Fri, 16 Sep 2022 16:48:19 +0100 Subject: [PATCH] Tweak theme preferences and add a new "System Colours" option (#898) "System Colours" works on Android 12+ using the the user's wallpaper to extract colors to colorize the app. This also tweaks the settings screen to make it more intuitive selecting theme, which is composed of the color scheme and variant (light, dark). --- app/src/main/java/org/xbmc/kore/Settings.java | 36 ++++++++++++++- .../java/org/xbmc/kore/ui/BaseActivity.java | 13 ++++-- .../sections/settings/SettingsFragment.java | 46 +++++++++++++------ .../java/org/xbmc/kore/utils/UIUtils.java | 23 ---------- app/src/main/res/values-night/themes.xml | 4 +- app/src/main/res/values/arrays.xml | 34 ++++++++++++++ app/src/main/res/values/strings.xml | 11 +++++ app/src/main/res/values/themes.xml | 4 +- app/src/main/res/xml/preferences.xml | 22 ++++++--- 9 files changed, 140 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/org/xbmc/kore/Settings.java b/app/src/main/java/org/xbmc/kore/Settings.java index c34fb7911..343baa4f5 100644 --- a/app/src/main/java/org/xbmc/kore/Settings.java +++ b/app/src/main/java/org/xbmc/kore/Settings.java @@ -59,8 +59,12 @@ public class Settings { */ // Theme - public static final String KEY_PREF_THEME = "pref_theme"; - public static final String DEFAULT_PREF_THEME = "0"; + public static final String KEY_PREF_THEME_COLOR = "pref_theme_color"; + public static final String DEFAULT_PREF_THEME_COLOR = "kore"; + public static final String VALUE_PREF_THEME_COLOR_SYSTEM_COLORS = "system_colors"; + + public static final String KEY_PREF_THEME_VARIANT = "pref_theme_variant"; + public static final String DEFAULT_PREF_THEME_VARIANT = "auto"; // Switch to remote public static final String KEY_PREF_SWITCH_TO_REMOTE_AFTER_MEDIA_START = "pref_switch_to_remote_after_media_start"; @@ -212,4 +216,32 @@ public static String getNameBookmarkedAddonsPrefKey(int hostId) { } public static final String DEFAULT_PREF_NAME_BOOKMARKED_ADDON = "Content"; + /** + * Returns a theme resource Id given the value stored in Shared Preferences + * @param prefThemeColor Shared Preferences colour for the theme + * @param prefThemeVariant Shared Preferences variant for the theme + * @return Android resource id of the theme + */ + public static int getThemeResourceId(String prefThemeColor, String prefThemeVariant) { + switch (prefThemeColor) { + case "sun": + switch (prefThemeVariant) { + case "light": + return R.style.Theme_Kore_Sun_Light; + case "dark": + return R.style.Theme_Kore_Sun_Dark; + default: + return R.style.Theme_Kore_Sun_Auto; + } + default: // "kore" and "system_colors" share this + switch (prefThemeVariant) { + case "light": + return R.style.Theme_Kore_Default_Light; + case "dark": + return R.style.Theme_Kore_Default_Dark; + default: + return R.style.Theme_Kore_Default_Auto; + } + } + } } diff --git a/app/src/main/java/org/xbmc/kore/ui/BaseActivity.java b/app/src/main/java/org/xbmc/kore/ui/BaseActivity.java index 4130be57c..924396bb5 100644 --- a/app/src/main/java/org/xbmc/kore/ui/BaseActivity.java +++ b/app/src/main/java/org/xbmc/kore/ui/BaseActivity.java @@ -17,12 +17,12 @@ import android.content.SharedPreferences; import android.os.Bundle; -import android.os.StrictMode; import android.text.TextUtils; +import androidx.appcompat.app.AppCompatActivity; import androidx.preference.PreferenceManager; -import androidx.appcompat.app.AppCompatActivity; +import com.google.android.material.color.DynamicColors; import org.xbmc.kore.Settings; import org.xbmc.kore.utils.UIUtils; @@ -49,7 +49,14 @@ protected void onCreate(Bundle savedInstanceState) { // .build()); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - setTheme(UIUtils.getThemeResourceId(prefs.getString(Settings.KEY_PREF_THEME, Settings.DEFAULT_PREF_THEME))); + + String themeColor = prefs.getString(Settings.KEY_PREF_THEME_COLOR, Settings.DEFAULT_PREF_THEME_COLOR), + themeVariant = prefs.getString(Settings.KEY_PREF_THEME_VARIANT, Settings.DEFAULT_PREF_THEME_VARIANT); + setTheme(Settings.getThemeResourceId(themeColor, themeVariant)); + if (Utils.isSOrLater() && themeColor.equals(Settings.VALUE_PREF_THEME_COLOR_SYSTEM_COLORS)) { + DynamicColors.applyToActivityIfAvailable(this); + } + String preferredLocale = prefs.getString(Settings.KEY_PREF_SELECTED_LANGUAGE, null); if (!TextUtils.isEmpty(preferredLocale)) Utils.setLocale(this, preferredLocale); diff --git a/app/src/main/java/org/xbmc/kore/ui/sections/settings/SettingsFragment.java b/app/src/main/java/org/xbmc/kore/ui/sections/settings/SettingsFragment.java index a91323d2a..754c7773b 100644 --- a/app/src/main/java/org/xbmc/kore/ui/sections/settings/SettingsFragment.java +++ b/app/src/main/java/org/xbmc/kore/ui/sections/settings/SettingsFragment.java @@ -120,16 +120,6 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { } setupPreferences(); - - ListPreference languagePref = findPreference(Settings.KEY_PREF_LANGUAGE); - if (languagePref != null) { - Locale currentLocale = getCurrentLocale(); - languagePref.setSummary(currentLocale.getDisplayLanguage(currentLocale)); - languagePref.setOnPreferenceClickListener(preference -> { - setupLanguagePreference((ListPreference) preference); - return true; - }); - } } @Override @@ -155,8 +145,10 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin setupPreferences(); Context ctx = requireContext(); - if (key.equals(Settings.KEY_PREF_THEME) || key.equals(Settings.getNavDrawerItemsPrefKey(hostId)) - || key.equals((Settings.getRemoteBarItemsPrefKey(hostId)))) { + if (key.equals(Settings.KEY_PREF_THEME_COLOR) || + key.equals(Settings.KEY_PREF_THEME_VARIANT) || + key.equals(Settings.getNavDrawerItemsPrefKey(hostId)) || + key.equals((Settings.getRemoteBarItemsPrefKey(hostId)))) { // restart to apply new theme (actually build an entirely new task stack) TaskStackBuilder.create(ctx) .addNextIntent(new Intent(ctx, RemoteActivity.class)) @@ -192,11 +184,35 @@ private boolean hasPhonePermission() { * Sets up the preferences state and summaries */ private void setupPreferences() { - // Theme preferences - ListPreference themePref = findPreference(Settings.KEY_PREF_THEME); - if (themePref != null) themePref.setSummary(themePref.getEntry()); Context context = requireContext(); + // Theme preferences + ListPreference themeColorPref = findPreference(Settings.KEY_PREF_THEME_COLOR); + if (themeColorPref != null) { + // Depending on the Android version we need to show different entries and values + if (Utils.isSOrLater()) { + themeColorPref.setEntries(R.array.theme_colors_array); + themeColorPref.setEntryValues(R.array.theme_colors_values_array); + } else { + themeColorPref.setEntries(R.array.theme_colors_array_pre_S); + themeColorPref.setEntryValues(R.array.theme_colors_values_array_pre_S); + } + themeColorPref.setSummary(themeColorPref.getEntry()); + } + ListPreference themeVariantPref = findPreference(Settings.KEY_PREF_THEME_VARIANT); + if (themeVariantPref != null) themeVariantPref.setSummary(themeVariantPref.getEntry()); + + // Language preference + ListPreference languagePref = findPreference(Settings.KEY_PREF_LANGUAGE); + if (languagePref != null) { + Locale currentLocale = getCurrentLocale(); + languagePref.setSummary(currentLocale.getDisplayLanguage(currentLocale)); + languagePref.setOnPreferenceClickListener(preference -> { + setupLanguagePreference((ListPreference) preference); + return true; + }); + } + // About preference String nameAndVersion = context.getString(R.string.app_name); try { diff --git a/app/src/main/java/org/xbmc/kore/utils/UIUtils.java b/app/src/main/java/org/xbmc/kore/utils/UIUtils.java index 0e6ba7898..67576436e 100644 --- a/app/src/main/java/org/xbmc/kore/utils/UIUtils.java +++ b/app/src/main/java/org/xbmc/kore/utils/UIUtils.java @@ -390,29 +390,6 @@ public static int changeColorAlpha(int color, int alpha) return (alpha << 24) | (color & 0x00ffffff); } - /** - * Returns a theme resource Id given the value stored in Shared Preferences - * @param prefThemeValue Shared Preferences value for the theme - * @return Android resource id of the theme - */ - public static int getThemeResourceId(String prefThemeValue) { - switch (Integer.parseInt(prefThemeValue)) { - case 1: - return R.style.Theme_Kore_Default_Light; - case 2: - return R.style.Theme_Kore_Default_Dark; - case 3: - return R.style.Theme_Kore_Sun_Dynamic; - case 4: - return R.style.Theme_Kore_Sun_Light; - case 5: - return R.style.Theme_Kore_Sun_Dark; - case 0: - default: - return R.style.Theme_Kore_Default_Dynamic; - } - } - public static void handleVibration(Context context) { if(context == null) return; diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index cdb5c0456..94cd9708d 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -1,5 +1,5 @@ - -