Reenable dark WebViews on API 33. https://redmine.stoutner.com/issues/903 master
authorSoren Stoutner <soren@stoutner.com>
Fri, 9 Sep 2022 23:02:45 +0000 (16:02 -0700)
committerSoren Stoutner <soren@stoutner.com>
Fri, 9 Sep 2022 23:02:45 +0000 (16:02 -0700)
app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java
app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java
app/src/main/res/drawable/webview_theme_ghosted.xml [new file with mode: 0644]

index 8307df69c4deb2b25cea420966f509d46a5810e0..8e01f28731ddc4711673582095fce80f0b5ee499 100644 (file)
@@ -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);
                 }
             }
index 5720e06e1a4c13c0db0b5213c7163bda4e351605..a964a9ca8711a1027c340c38adf91a31f7babf3f 100644 (file)
@@ -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<CharSequence> 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 (file)
index 0000000..670fb63
--- /dev/null
@@ -0,0 +1,32 @@
+<!--
+  Copyright © 2017,2022 Soren Stoutner <soren@stoutner.com>.
+
+  This file is derived from `compare`, which is part of the Android Material icon set.  It is released under the Apache License 2.0.
+
+  This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
+
+  Privacy Browser Android is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  Privacy Browser Android is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with Privacy Browser Android.  If not, see <http://www.gnu.org/licenses/>. -->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="24dp"
+    android:width="24dp"
+    android:viewportHeight="24"
+    android:viewportWidth="24"
+    android:autoMirrored="true" >
+
+    <path
+        android:fillColor="@color/ghosted_icon"
+        android:pathData="m14,3h5c1.1,0 2,0.9 2,2v14c0,1.1 -0.9,2 -2,2h-5v2L12,23L12,1h2zM14,18h5L14,12ZM5,3h5L10,5L5,5v13l5,-6v9L5,21C3.9,21 3,20.1 3,19L3,5C3,3.9 3.9,3 5,3Z"/>
+</vector>
\ No newline at end of file