From 9f1863318116a641a455a05d722a2ff7938a13c4 Mon Sep 17 00:00:00 2001 From: Soren Stoutner Date: Fri, 9 Sep 2022 16:02:45 -0700 Subject: [PATCH] Reenable dark WebViews on API 33. https://redmine.stoutner.com/issues/903 --- .../activities/MainWebViewActivity.java | 113 +++++++++++- .../fragments/SettingsFragment.java | 171 +++++++++++++----- .../res/drawable/webview_theme_ghosted.xml | 32 ++++ 3 files changed, 263 insertions(+), 53 deletions(-) create mode 100644 app/src/main/res/drawable/webview_theme_ghosted.xml diff --git a/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java b/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java index 8307df69..8e01f287 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java +++ b/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java @@ -1056,8 +1056,17 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // Enable DOM Storage if JavaScript is enabled. optionsDomStorageMenuItem.setEnabled(currentWebView.getSettings().getJavaScriptEnabled()); + // Get the current theme status. + int currentThemeStatus = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; + + // Enable dark WebView if the API is < 33 or if night mode is enabled. + optionsDarkWebViewMenuItem.setEnabled((Build.VERSION.SDK_INT < 33) || (currentThemeStatus == Configuration.UI_MODE_NIGHT_YES)); + // Set the checkbox status for dark WebView if the WebView supports it. - if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { + if ((Build.VERSION.SDK_INT >= 33) && WebViewFeature.isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING)) { // The device is running API >= 33 and algorithmic darkening is supported. + optionsDarkWebViewMenuItem.setChecked(WebSettingsCompat.isAlgorithmicDarkeningAllowed(currentWebView.getSettings())); + } else if ((Build.VERSION.SDK_INT < 33) && WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { // The device is running API < 33 and the WebView supports force dark. + //noinspection deprecation optionsDarkWebViewMenuItem.setChecked(WebSettingsCompat.getForceDark(currentWebView.getSettings()) == WebSettingsCompat.FORCE_DARK_ON); } } @@ -1737,13 +1746,19 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook return true; } else if (menuItemId == R.id.dark_webview) { // Dark WebView. // Check to see if dark WebView is supported by this WebView. - if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { + if ((Build.VERSION.SDK_INT >= 33) && WebViewFeature.isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING)) { // The device is running API >= 33 and algorithmic darkening is supported. + // Toggle algorithmic darkening. + WebSettingsCompat.setAlgorithmicDarkeningAllowed(currentWebView.getSettings(), !WebSettingsCompat.isAlgorithmicDarkeningAllowed(currentWebView.getSettings())); + } else if ((Build.VERSION.SDK_INT < 33) && WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { // The device is running API < 33 and the WebView supports force dark. // Toggle the dark WebView setting. + //noinspection deprecation if (WebSettingsCompat.getForceDark(currentWebView.getSettings()) == WebSettingsCompat.FORCE_DARK_ON) { // Dark WebView is currently enabled. // Turn off dark WebView. + //noinspection deprecation WebSettingsCompat.setForceDark(currentWebView.getSettings(), WebSettingsCompat.FORCE_DARK_OFF); } else { // Dark WebView is currently disabled. // Turn on dark WebView. + //noinspection deprecation WebSettingsCompat.setForceDark(currentWebView.getSettings(), WebSettingsCompat.FORCE_DARK_ON); } } @@ -3975,16 +3990,48 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook } // Check to see if WebView themes are supported. - if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { + if ((Build.VERSION.SDK_INT >= 33) && WebViewFeature.isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING)) { // The device is running API >= 33 and algorithmic darkening is supported. + // Set the WebView theme. + switch (webViewThemeInt) { + case DomainsDatabaseHelper.SYSTEM_DEFAULT: + // Set the WebView theme. A switch statement cannot be used because the WebView theme entry values string array is not a compile time constant. + if (webViewTheme.equals(webViewThemeEntryValuesStringArray[1])) { // The light theme is selected. + // Turn off algorithmic darkening. + WebSettingsCompat.setAlgorithmicDarkeningAllowed(nestedScrollWebView.getSettings(), false); + } else if (webViewTheme.equals(webViewThemeEntryValuesStringArray[2])) { // The dark theme is selected. + // Turn on algorithmic darkening. + WebSettingsCompat.setAlgorithmicDarkeningAllowed(nestedScrollWebView.getSettings(), true); + } else { // The system default theme is selected. + // Get the current system theme status. + int currentThemeStatus = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; + + // Set the algorithmic darkening according to the current system theme status. + WebSettingsCompat.setAlgorithmicDarkeningAllowed(nestedScrollWebView.getSettings(), (currentThemeStatus == Configuration.UI_MODE_NIGHT_YES)); + } + break; + + case DomainsDatabaseHelper.LIGHT_THEME: + // Turn off algorithmic darkening. + WebSettingsCompat.setAlgorithmicDarkeningAllowed(nestedScrollWebView.getSettings(), false); + break; + + case DomainsDatabaseHelper.DARK_THEME: + // Turn on algorithmic darkening. + WebSettingsCompat.setAlgorithmicDarkeningAllowed(nestedScrollWebView.getSettings(), true); + break; + } + } else if ((Build.VERSION.SDK_INT < 33) && WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { // The device is running API < 33 and the WebView supports force dark. // Set the WebView theme. switch (webViewThemeInt) { case DomainsDatabaseHelper.SYSTEM_DEFAULT: // Set the WebView theme. A switch statement cannot be used because the WebView theme entry values string array is not a compile time constant. if (webViewTheme.equals(webViewThemeEntryValuesStringArray[1])) { // The light theme is selected. // Turn off the WebView dark mode. + //noinspection deprecation WebSettingsCompat.setForceDark(nestedScrollWebView.getSettings(), WebSettingsCompat.FORCE_DARK_OFF); } else if (webViewTheme.equals(webViewThemeEntryValuesStringArray[2])) { // The dark theme is selected. // Turn on the WebView dark mode. + //noinspection deprecation WebSettingsCompat.setForceDark(nestedScrollWebView.getSettings(), WebSettingsCompat.FORCE_DARK_ON); } else { // The system default theme is selected. // Get the current system theme status. @@ -3993,9 +4040,11 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // Set the WebView theme according to the current system theme status. if (currentThemeStatus == Configuration.UI_MODE_NIGHT_NO) { // The system is in day mode. // Turn off the WebView dark mode. + //noinspection deprecation WebSettingsCompat.setForceDark(nestedScrollWebView.getSettings(), WebSettingsCompat.FORCE_DARK_OFF); } else { // The system is in night mode. // Turn on the WebView dark mode. + //noinspection deprecation WebSettingsCompat.setForceDark(nestedScrollWebView.getSettings(), WebSettingsCompat.FORCE_DARK_ON); } } @@ -4003,11 +4052,13 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook case DomainsDatabaseHelper.LIGHT_THEME: // Turn off the WebView dark mode. + //noinspection deprecation WebSettingsCompat.setForceDark(nestedScrollWebView.getSettings(), WebSettingsCompat.FORCE_DARK_OFF); break; case DomainsDatabaseHelper.DARK_THEME: // Turn on the WebView dark mode. + //noinspection deprecation WebSettingsCompat.setForceDark(nestedScrollWebView.getSettings(), WebSettingsCompat.FORCE_DARK_ON); break; } @@ -4123,13 +4174,30 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook } // Apply the WebView theme if supported by the installed WebView. - if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { + if ((Build.VERSION.SDK_INT >= 33) && WebViewFeature.isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING)) { // The device is running API >= 33 and algorithmic darkening is supported. + // Set the WebView theme. A switch statement cannot be used because the WebView theme entry values string array is not a compile time constant. + if (webViewTheme.equals(webViewThemeEntryValuesStringArray[1])) { // the light theme is selected. + // Turn off algorithmic darkening. + WebSettingsCompat.setAlgorithmicDarkeningAllowed(nestedScrollWebView.getSettings(), false); + } else if (webViewTheme.equals(webViewThemeEntryValuesStringArray[2])) { // The dark theme is selected. + // Turn on algorithmic darkening. + WebSettingsCompat.setAlgorithmicDarkeningAllowed(nestedScrollWebView.getSettings(), true); + } else { // The system default theme is selected. + // Get the current system theme status. + int currentThemeStatus = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; + + // Set the algorithmic darkening according to the current system theme status. + WebSettingsCompat.setAlgorithmicDarkeningAllowed(nestedScrollWebView.getSettings(), currentThemeStatus == Configuration.UI_MODE_NIGHT_YES); + } + } else if ((Build.VERSION.SDK_INT < 33) && WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { // The device is running API < 33 and the WebView supports force dark. // Set the WebView theme. A switch statement cannot be used because the WebView theme entry values string array is not a compile time constant. if (webViewTheme.equals(webViewThemeEntryValuesStringArray[1])) { // The light theme is selected. // Turn off the WebView dark mode. + //noinspection deprecation WebSettingsCompat.setForceDark(nestedScrollWebView.getSettings(), WebSettingsCompat.FORCE_DARK_OFF); } else if (webViewTheme.equals(webViewThemeEntryValuesStringArray[2])) { // The dark theme is selected. // Turn on the WebView dark mode. + //noinspection deprecation WebSettingsCompat.setForceDark(nestedScrollWebView.getSettings(), WebSettingsCompat.FORCE_DARK_ON); } else { // The system default theme is selected. // Get the current system theme status. @@ -4138,9 +4206,11 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // Set the WebView theme according to the current system theme status. if (currentThemeStatus == Configuration.UI_MODE_NIGHT_NO) { // The system is in day mode. // Turn off the WebView dark mode. + //noinspection deprecation WebSettingsCompat.setForceDark(nestedScrollWebView.getSettings(), WebSettingsCompat.FORCE_DARK_OFF); } else { // The system is in night mode. // Turn on the WebView dark mode. + //noinspection deprecation WebSettingsCompat.setForceDark(nestedScrollWebView.getSettings(), WebSettingsCompat.FORCE_DARK_ON); } } @@ -5033,10 +5103,40 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook String[] webViewThemeEntryValuesStringArray = getResources().getStringArray(R.array.webview_theme_entry_values); // Apply the WebView theme if supported by the installed WebView. - if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { + if ((Build.VERSION.SDK_INT >= 33) && WebViewFeature.isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING)) { // The device is running API >= 33 and algorithmic darkening is supported. + // Set the WebView them. A switch statement cannot be used because the WebView theme entry values string array is not a compile time constant. + if (webViewTheme.equals(webViewThemeEntryValuesStringArray[1])) { // The light theme is selected. + // Turn off algorithmic darkening. + WebSettingsCompat.setAlgorithmicDarkeningAllowed(nestedScrollWebView.getSettings(), false); + + // Make the WebView visible. The WebView was created invisible in `webview_framelayout` to prevent a white background splash in night mode. + // If the system is currently in night mode, showing the WebView will be handled in `onProgressChanged()`. + nestedScrollWebView.setVisibility(View.VISIBLE); + } else if (webViewTheme.equals(webViewThemeEntryValuesStringArray[2])) { // The dark theme is selected. + // Turn on algorithmic darkening. + WebSettingsCompat.setAlgorithmicDarkeningAllowed(nestedScrollWebView.getSettings(), true); + } else { + // The system default theme is selected. + int currentThemeStatus = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; + + // Set the algorithmic darkening according to the current system theme status. + if (currentThemeStatus == Configuration.UI_MODE_NIGHT_NO) { // The system is in day mode. + // Turn off algorithmic darkening. + WebSettingsCompat.setAlgorithmicDarkeningAllowed(nestedScrollWebView.getSettings(), false); + + // Make the WebView visible. The WebView was created invisible in `webview_framelayout` to prevent a white background splash in night mode. + // If the system is currently in night mode, showing the WebView will be handled in `onProgressChanged()`. + nestedScrollWebView.setVisibility(View.VISIBLE); + } else { // The system is in night mode. + // Turn on algorithmic darkening. + WebSettingsCompat.setAlgorithmicDarkeningAllowed(nestedScrollWebView.getSettings(), true); + } + } + } else if ((Build.VERSION.SDK_INT < 33) && WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { // The device is running API < 33 and the WebView supports force dark. // Set the WebView theme. A switch statement cannot be used because the WebView theme entry values string array is not a compile time constant. if (webViewTheme.equals(webViewThemeEntryValuesStringArray[1])) { // The light theme is selected. // Turn off the WebView dark mode. + //noinspection deprecation WebSettingsCompat.setForceDark(nestedScrollWebView.getSettings(), WebSettingsCompat.FORCE_DARK_OFF); // Make the WebView visible. The WebView was created invisible in `webview_framelayout` to prevent a white background splash in night mode. @@ -5044,6 +5144,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook nestedScrollWebView.setVisibility(View.VISIBLE); } else if (webViewTheme.equals(webViewThemeEntryValuesStringArray[2])) { // The dark theme is selected. // Turn on the WebView dark mode. + //noinspection deprecation WebSettingsCompat.setForceDark(nestedScrollWebView.getSettings(), WebSettingsCompat.FORCE_DARK_ON); } else { // The system default theme is selected. // Get the current system theme status. @@ -5052,6 +5153,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // Set the WebView theme according to the current system theme status. if (currentThemeStatus == Configuration.UI_MODE_NIGHT_NO) { // The system is in day mode. // Turn off the WebView dark mode. + //noinspection deprecation WebSettingsCompat.setForceDark(nestedScrollWebView.getSettings(), WebSettingsCompat.FORCE_DARK_OFF); // Make the WebView visible. The WebView was created invisible in `webview_framelayout` to prevent a white background splash in night mode. @@ -5059,6 +5161,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook nestedScrollWebView.setVisibility(View.VISIBLE); } else { // The system is in night mode. // Turn on the WebView dark mode. + //noinspection deprecation WebSettingsCompat.setForceDark(nestedScrollWebView.getSettings(), WebSettingsCompat.FORCE_DARK_ON); } } diff --git a/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java b/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java index 5720e06e..a964a9ca 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java +++ b/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java @@ -48,7 +48,6 @@ import java.util.Objects; public class SettingsFragment extends PreferenceFragmentCompat { // Declare the class variables. - private int currentThemeStatus; private String defaultUserAgent; private ArrayAdapter userAgentNamesArray; private String[] translatedUserAgentNamesArray; @@ -117,9 +116,6 @@ public class SettingsFragment extends PreferenceFragmentCompat { // Get a handle for the resources. Resources resources = getResources(); - // Get the current theme status. - currentThemeStatus = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; - // Get a handle for the shared preferences. SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences(); @@ -362,7 +358,7 @@ public class SettingsFragment extends PreferenceFragmentCompat { // Get the current app theme. String currentAppTheme = sharedPreferences.getString("app_theme", getString(R.string.app_theme_default_value)); - // Define an app theme entry number. + // Declare an app theme entry number. int appThemeEntryNumber; // Get the app theme entry number that matches the current app theme. A switch statement cannot be used because the theme entry values string array is not a compile time constant. @@ -380,6 +376,9 @@ public class SettingsFragment extends PreferenceFragmentCompat { // Set the current theme as the summary text for the preference. appThemePreference.setSummary(appThemeEntriesStringArray[appThemeEntryNumber]); + // Disable the WebView theme preference if the API >= 33 and the app theme is set to light. + webViewThemePreference.setEnabled((Build.VERSION.SDK_INT < 33) || (appThemeEntryNumber != 1)); + // Get the WebView theme string arrays. webViewThemeEntriesStringArray = resources.getStringArray(R.array.webview_theme_entries); @@ -655,25 +654,31 @@ public class SettingsFragment extends PreferenceFragmentCompat { displayAdditionalAppBarIconsPreference.setIcon(R.drawable.more_disabled); // Set the WebView theme preference icon. - switch (webViewThemeEntryNumber) { - case 0: // The system default WebView theme is selected. - // Set the icon according to the app theme. - if (currentThemeStatus == Configuration.UI_MODE_NIGHT_NO) { - webViewThemePreference.setIcon(R.drawable.webview_light_theme); - } else { - webViewThemePreference.setIcon(R.drawable.webview_dark_theme); - } - break; + if (webViewThemePreference.isEnabled()) { // The WebView theme preference is enabled. + switch (webViewThemeEntryNumber) { + case 0: // The system default WebView theme is selected. + // Get the current theme status. + int currentThemeStatus = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; + + // Set the icon according to the app theme. + if (currentThemeStatus == Configuration.UI_MODE_NIGHT_NO) + webViewThemePreference.setIcon(R.drawable.webview_light_theme); + else + webViewThemePreference.setIcon(R.drawable.webview_dark_theme); + break; - case 1: // The light WebView theme is selected. - // Set the icon. - webViewThemePreference.setIcon(R.drawable.webview_light_theme); - break; + case 1: // The light WebView theme is selected. + // Set the icon. + webViewThemePreference.setIcon(R.drawable.webview_light_theme); + break; - case 2: // The dark WebView theme is selected. - // Set the icon. - webViewThemePreference.setIcon(R.drawable.webview_dark_theme); - break; + case 2: // The dark WebView theme is selected. + // Set the icon. + webViewThemePreference.setIcon(R.drawable.webview_dark_theme); + break; + } + } else { // The WebView theme preference is disabled. + webViewThemePreference.setIcon(R.drawable.webview_theme_ghosted); } // Set the wide viewport preference icon. @@ -1243,42 +1248,109 @@ public class SettingsFragment extends PreferenceFragmentCompat { // Get the new theme. String newAppTheme = sharedPreferences.getString("app_theme", context.getString(R.string.app_theme_default_value)); - // Update the system according to the new theme. A switch statement cannot be used because the theme entry values string array is not a compile-time constant. - if (newAppTheme.equals(appThemeEntryValuesStringArray[1])) { // The light theme is selected. - // Update the theme preference summary text. - appThemePreference.setSummary(appThemeEntriesStringArray[1]); + // Declare an app theme entry number. + int appThemeEntryNumber; - // Apply the new theme. - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + // Get the app theme entry number that matches the current app theme. A switch statement cannot be used because the theme entry values string array is not a compile time constant. + if (newAppTheme.equals(appThemeEntryValuesStringArray[1])) { // The light theme is selected. + // Store the app theme entry number. + appThemeEntryNumber = 1; } else if (newAppTheme.equals(appThemeEntryValuesStringArray[2])) { // The dark theme is selected. - // Update the theme preference summary text. - appThemePreference.setSummary(appThemeEntriesStringArray[2]); + // Store the app theme entry number. + appThemeEntryNumber = 2; + } else { // The system default theme is selected. + // Store the app theme entry number. + appThemeEntryNumber = 0; + } + + // Update the system according to the new theme. A switch statement cannot be used because the theme entry values string array is not a compile-time constant. + switch (appThemeEntryNumber) { + case 0: // The system default theme is selected. + // Update the theme preference summary text. + appThemePreference.setSummary(appThemeEntriesStringArray[0]); + + // Apply the new theme. + if (Build.VERSION.SDK_INT >= 28) { // The system default theme is supported. + // Follow the system default theme. + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); + } else {// The system default theme is not supported. + // Follow the battery saver mode. + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY); + } + break; + + case 1: // The light theme is selected. + // Update the theme preference summary text. + appThemePreference.setSummary(appThemeEntriesStringArray[1]); - // Apply the new theme. - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + // Apply the new theme. + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + break; + + case 2: + // Update the theme preference summary text. + appThemePreference.setSummary(appThemeEntriesStringArray[2]); + + // Apply the new theme. + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + break; + } + + // Disable the WebView theme preference if the API >= 33 and the app theme is set to light. + webViewThemePreference.setEnabled((Build.VERSION.SDK_INT < 33) || (appThemeEntryNumber != 1)); + + // Get the WebView theme. + String webViewTheme = sharedPreferences.getString("webview_theme", context.getString(R.string.webview_theme_default_value)); + + // Declare a WebView theme entry number. + int webViewThemeEntryNumber; + + // Get the webView theme entry number that matches the new WebView theme. A switch statement cannot be used because the theme entry values string array is not a compile time constant. + if (webViewTheme.equals(webViewThemeEntriesStringArray[1])) { // The light theme is selected. + // Store the WebView theme entry number. + webViewThemeEntryNumber = 1; + } else if (webViewTheme.equals(webViewThemeEntryValuesStringArray[2])) { // The dark theme is selected. + // Store the WebView theme entry number. + webViewThemeEntryNumber = 2; } else { // The system default theme is selected. - // Update the theme preference summary text. - appThemePreference.setSummary(appThemeEntriesStringArray[0]); - - // Apply the new theme. - if (Build.VERSION.SDK_INT >= 28) { // The system default theme is supported. - // Follow the system default theme. - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); - } else {// The system default theme is not supported. - // Follow the battery saver mode. - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY); - } + // Store the WebView theme entry number. + webViewThemeEntryNumber = 0; } - // Update the current theme status. - currentThemeStatus = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; + // Update the WebView theme preference icon. + if (webViewThemePreference.isEnabled()) { // The WebView theme preference is enabled. + switch (webViewThemeEntryNumber) { + case 0: // The system default WebView theme is selected. + // Get the current theme status. + int currentThemeStatus = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; + + // Set the icon according to the app theme. + if (currentThemeStatus == Configuration.UI_MODE_NIGHT_NO) + webViewThemePreference.setIcon(R.drawable.webview_light_theme); + else + webViewThemePreference.setIcon(R.drawable.webview_dark_theme); + break; + + case 1: // The light WebView theme is selected. + // Set the icon. + webViewThemePreference.setIcon(R.drawable.webview_light_theme); + break; + + case 2: // The dark WebView theme is selected. + // Set the icon. + webViewThemePreference.setIcon(R.drawable.webview_dark_theme); + break; + } + } else { // The WebView theme preference is disabled. + webViewThemePreference.setIcon(R.drawable.webview_theme_ghosted); + } break; case "webview_theme": // Get the new WebView theme. String newWebViewTheme = sharedPreferences.getString("webview_theme", context.getString(R.string.webview_theme_default_value)); - // Define a new WebView theme entry number. + // Declare a new WebView theme entry number. int newWebViewThemeEntryNumber; // Get the webView theme entry number that matches the new WebView theme. A switch statement cannot be used because the theme entry values string array is not a compile time constant. @@ -1286,16 +1358,19 @@ public class SettingsFragment extends PreferenceFragmentCompat { // Store the new WebView theme entry number. newWebViewThemeEntryNumber = 1; } else if (newWebViewTheme.equals(webViewThemeEntryValuesStringArray[2])) { // The dark theme is selected. - // Store the WebView theme entry number. + // Store the new WebView theme entry number. newWebViewThemeEntryNumber = 2; } else { // The system default theme is selected. - // Store the WebView theme entry number. + // Store the new WebView theme entry number. newWebViewThemeEntryNumber = 0; } // Update the icon. switch (newWebViewThemeEntryNumber) { case 0: // The system default WebView theme is selected. + // Get the current theme status. + int currentThemeStatus = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; + // Set the icon. if (currentThemeStatus == Configuration.UI_MODE_NIGHT_NO) { webViewThemePreference.setIcon(R.drawable.webview_light_theme); diff --git a/app/src/main/res/drawable/webview_theme_ghosted.xml b/app/src/main/res/drawable/webview_theme_ghosted.xml new file mode 100644 index 00000000..670fb630 --- /dev/null +++ b/app/src/main/res/drawable/webview_theme_ghosted.xml @@ -0,0 +1,32 @@ + + + + + + \ No newline at end of file -- 2.43.0