From a713ce21263c29347e633efa871576f31c0d4249 Mon Sep 17 00:00:00 2001 From: bopol <bopol@e.email> Date: Fri, 22 May 2020 15:37:14 +0200 Subject: [PATCH] Add settings for device theme (dark & black) fix bugs related to isLightThemeSelected not handling device themes such as license having dark background when it should be white --- .../org/schabi/newpipe/util/ThemeHelper.java | 91 +++++++++++++++---- app/src/main/res/values-eo/strings.xml | 4 +- app/src/main/res/values-fr/strings.xml | 4 +- app/src/main/res/values/settings_keys.xml | 6 ++ app/src/main/res/values/strings.xml | 2 + 5 files changed, 89 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java b/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java index 5ac4de84c..b8246f0b2 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java @@ -21,6 +21,8 @@ package org.schabi.newpipe.util; import android.app.Activity; import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; import android.content.res.TypedArray; import android.util.TypedValue; import android.view.ContextThemeWrapper; @@ -39,7 +41,8 @@ import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ExtractionException; public final class ThemeHelper { - private ThemeHelper() { } + private ThemeHelper() { + } /** * Apply the selected theme (on NewPipe settings) in the context @@ -70,8 +73,13 @@ public final class ThemeHelper { * @return whether the light theme is selected */ public static boolean isLightThemeSelected(final Context context) { - return getSelectedThemeString(context).equals(context.getResources() - .getString(R.string.light_theme_key)); + final String selectedThemeString = getSelectedThemeString(context); + final Resources res = context.getResources(); + + return selectedThemeString.equals(res.getString(R.string.light_theme_key)) + || (selectedThemeString.equals(res.getString(R.string.device_dark_theme_key)) + || selectedThemeString.equals(res.getString(R.string.device_black_theme_key)) + && !isDeviceDarkThemeEnabled(context)); } @@ -130,9 +138,12 @@ public final class ThemeHelper { */ @StyleRes public static int getThemeForService(final Context context, final int serviceId) { - final String lightTheme = context.getResources().getString(R.string.light_theme_key); - final String darkTheme = context.getResources().getString(R.string.dark_theme_key); - final String blackTheme = context.getResources().getString(R.string.black_theme_key); + final Resources res = context.getResources(); + final String lightTheme = res.getString(R.string.light_theme_key); + final String darkTheme = res.getString(R.string.dark_theme_key); + final String blackTheme = res.getString(R.string.black_theme_key); + final String deviceDarkTheme = res.getString(R.string.device_dark_theme_key); + final String deviceBlackTheme = res.getString(R.string.device_black_theme_key); final String selectedTheme = getSelectedThemeString(context); @@ -141,8 +152,18 @@ public final class ThemeHelper { defaultTheme = R.style.LightTheme; } else if (selectedTheme.equals(blackTheme)) { defaultTheme = R.style.BlackTheme; - } else if (selectedTheme.equals(darkTheme)) { - defaultTheme = R.style.DarkTheme; + } else if (selectedTheme.equals(deviceDarkTheme)) { + if (isDeviceDarkThemeEnabled(context)) { + defaultTheme = R.style.DarkTheme; + } else { + defaultTheme = R.style.LightTheme; + } + } else if (selectedTheme.equals(deviceBlackTheme)) { + if (isDeviceDarkThemeEnabled(context)) { + defaultTheme = R.style.BlackTheme; + } else { + defaultTheme = R.style.LightTheme; + } } if (serviceId <= -1) { @@ -157,12 +178,10 @@ public final class ThemeHelper { } String themeName = "DarkTheme"; - if (selectedTheme.equals(lightTheme)) { + if (defaultTheme == R.style.LightTheme) { themeName = "LightTheme"; - } else if (selectedTheme.equals(blackTheme)) { + } else if (defaultTheme == R.style.BlackTheme) { themeName = "BlackTheme"; - } else if (selectedTheme.equals(darkTheme)) { - themeName = "DarkTheme"; } themeName += "." + service.getServiceInfo().getName(); @@ -179,9 +198,12 @@ public final class ThemeHelper { @StyleRes public static int getSettingsThemeStyle(final Context context) { - final String lightTheme = context.getResources().getString(R.string.light_theme_key); - final String darkTheme = context.getResources().getString(R.string.dark_theme_key); - final String blackTheme = context.getResources().getString(R.string.black_theme_key); + final Resources res = context.getResources(); + final String lightTheme = res.getString(R.string.light_theme_key); + final String darkTheme = res.getString(R.string.dark_theme_key); + final String blackTheme = res.getString(R.string.black_theme_key); + final String deviceDarkTheme = res.getString(R.string.device_dark_theme_key); + final String deviceBlackTheme = res.getString(R.string.device_black_theme_key); final String selectedTheme = getSelectedThemeString(context); @@ -191,6 +213,18 @@ public final class ThemeHelper { return R.style.BlackSettingsTheme; } else if (selectedTheme.equals(darkTheme)) { return R.style.DarkSettingsTheme; + } else if (selectedTheme.equals(deviceDarkTheme)) { + if (isDeviceDarkThemeEnabled(context)) { + return R.style.DarkSettingsTheme; + } else { + return R.style.LightSettingsTheme; + } + } else if (selectedTheme.equals(deviceBlackTheme)) { + if (isDeviceDarkThemeEnabled(context)) { + return R.style.BlackSettingsTheme; + } else { + return R.style.LightSettingsTheme; + } } else { // Fallback return R.style.DarkSettingsTheme; @@ -239,8 +273,9 @@ public final class ThemeHelper { /** * Sets the title to the activity, if the activity is an {@link AppCompatActivity} and has an * action bar. + * * @param activity the activity to set the title of - * @param title the title to set to the activity + * @param title the title to set to the activity */ public static void setTitleToAppCompatActivity(@Nullable final Activity activity, final CharSequence title) { @@ -251,4 +286,28 @@ public final class ThemeHelper { } } } + + /** + * Get the device theme + * <p> + * It will return true if the device 's theme is dark, false otherwise. + * <p> + * From https://developer.android.com/guide/topics/ui/look-and-feel/darktheme#java + * + * @param context the context to use + * @return true:dark theme, false:light or unknown + */ + private static boolean isDeviceDarkThemeEnabled(final Context context) { + int deviceTheme = context.getResources().getConfiguration().uiMode + & Configuration.UI_MODE_NIGHT_MASK; + switch (deviceTheme) { + case Configuration.UI_MODE_NIGHT_YES: + return true; + + case Configuration.UI_MODE_NIGHT_UNDEFINED: + case Configuration.UI_MODE_NIGHT_NO: + default: + return false; + } + } } diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 38e83b662..cb190ea91 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -23,6 +23,9 @@ <string name="theme_title">Etoso</string> <string name="dark_theme_title">Malluma</string> <string name="light_theme_title">Luma</string> + <string name="black_theme_title">Nigra</string> + <string name="device_dark_theme_title">Etoson (Malluma)</string> + <string name="device_black_theme_title">Etoson de la aparato (Nigra)</string> <string name="download_dialog_title">Elŝuti</string> <string name="unsupported_url">Ligilo ne subtenita</string> <string name="content_language_title">Preferata enhavlingvo</string> @@ -90,7 +93,6 @@ <string name="show_higher_resolutions_title">Montri pli altajn rezoluciojn</string> <string name="show_higher_resolutions_summary">Nur kelkaj aparatoj povas ludi 2K / 4K filmetojn</string> <string name="default_video_format_title">Defaŭlta fomato de filmeto</string> - <string name="black_theme_title">Nigra</string> <string name="popup_remember_size_pos_title">Memoru ŝprucfenestran grandecon kaj pozicion</string> <string name="popup_remember_size_pos_summary">Memoru lastan grandecon kaj pozicion de ŝprucfenestro</string> <string name="use_inexact_seek_title">Uzi rapide, ne precizan serĉon</string> diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 86f4fe09c..a538c2721 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -43,6 +43,9 @@ <string name="theme_title">Thème</string> <string name="dark_theme_title">Sombre</string> <string name="light_theme_title">Clair</string> + <string name="black_theme_title">Noir</string> + <string name="device_dark_theme_title">Thème de l\'appareil (Sombre)</string> + <string name="device_black_theme_title">Thème de l\'appareil (Noir)</string> <string name="settings_category_appearance_title">Apparence</string> <string name="network_error">Erreur réseau</string> <string name="download_path_audio_title">Dossier de téléchargement audio</string> @@ -103,7 +106,6 @@ <string name="no_available_dir">Veuillez définir ultérieurement un dossier de téléchargement dans les paramètres</string> <string name="could_not_load_image">Impossible de charger l’image</string> <string name="app_ui_crash">L’application a planté</string> - <string name="black_theme_title">Noir</string> <string name="all">Tout</string> <string name="channel">Chaîne</string> <string name="title_activity_recaptcha">Défi reCAPTCHA</string> diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 0958fce26..195e43e61 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -179,16 +179,22 @@ <string name="light_theme_key" translatable="false">light_theme</string> <string name="dark_theme_key" translatable="false">dark_theme</string> <string name="black_theme_key" translatable="false">black_theme</string> + <string name="device_dark_theme_key" translatable="false">device_dark_theme</string> + <string name="device_black_theme_key" translatable="false">device_black_theme</string> <string name="default_theme_value" translatable="false">@string/dark_theme_key</string> <string-array name="theme_values_list" translatable="false"> <item>@string/light_theme_key</item> <item>@string/dark_theme_key</item> <item>@string/black_theme_key</item> + <item>@string/device_dark_theme_key</item> + <item>@string/device_black_theme_key</item> </string-array> <string-array name="theme_description_list" translatable="false"> <item>@string/light_theme_title</item> <item>@string/dark_theme_title</item> <item>@string/black_theme_title</item> + <item>@string/device_dark_theme_title</item> + <item>@string/device_black_theme_title</item> </string-array> <!-- Caption Size --> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9fb15e463..4bb21c0cf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -82,6 +82,8 @@ <string name="light_theme_title">Light</string> <string name="dark_theme_title">Dark</string> <string name="black_theme_title">Black</string> + <string name="device_dark_theme_title">Device theme (Dark)</string> + <string name="device_black_theme_title">Device theme (Black)</string> <string name="popup_remember_size_pos_title">Remember popup properties</string> <string name="popup_remember_size_pos_summary">Remember last size and position of popup</string> <string name="use_inexact_seek_title">Use fast inexact seek</string>