]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java
Update preference names. https://redmine.stoutner.com/issues/343
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / fragments / SettingsFragment.java
index cb0ca13e4883f6c0ad6ce26fe55c60ceb2527a5e..af87568b34493537dab5d04d9fe234779f2a8bcf 100644 (file)
@@ -26,6 +26,7 @@ import android.content.SharedPreferences;
 import android.os.Build;
 import android.os.Bundle;
 import android.preference.Preference;
+import android.preference.PreferenceCategory;
 import android.preference.PreferenceFragment;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -41,7 +42,10 @@ public class SettingsFragment extends PreferenceFragment {
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
+        // Run the default commands.
         super.onCreate(savedInstanceState);
+
+        // Load the preferences from the XML file.
         addPreferencesFromResource(R.xml.preferences);
 
         // Get a handle for the context.
@@ -50,12 +54,12 @@ public class SettingsFragment extends PreferenceFragment {
         // Initialize savedPreferences.
         savedPreferences = getPreferenceScreen().getSharedPreferences();
 
-        // Get handles for the preferences we need to modify.
-        final Preference javaScriptPreference = findPreference("javascript_enabled");
-        final Preference firstPartyCookiesPreference = findPreference("first_party_cookies_enabled");
-        final Preference thirdPartyCookiesPreference = findPreference("third_party_cookies_enabled");
-        final Preference domStoragePreference = findPreference("dom_storage_enabled");
-        final Preference saveFormDataPreference = findPreference("save_form_data_enabled");
+        // Get handles for the preferences.
+        final Preference javaScriptPreference = findPreference("javascript");
+        final Preference firstPartyCookiesPreference = findPreference("first_party_cookies");
+        final Preference thirdPartyCookiesPreference = findPreference("third_party_cookies");
+        final Preference domStoragePreference = findPreference("dom_storage");
+        final Preference saveFormDataPreference = findPreference("save_form_data");  // The form data preference can be removed once the minimum API >= 26.
         final Preference userAgentPreference = findPreference("user_agent");
         final Preference customUserAgentPreference = findPreference("custom_user_agent");
         final Preference incognitoModePreference = findPreference("incognito_mode");
@@ -63,8 +67,10 @@ public class SettingsFragment extends PreferenceFragment {
         final Preference allowScreenshotsPreference = findPreference("allow_screenshots");
         final Preference easyListPreference = findPreference("easylist");
         final Preference easyPrivacyPreference = findPreference("easyprivacy");
-        final Preference fanboyAnnoyanceListPreference = findPreference("fanboy_annoyance_list");
-        final Preference fanboySocialBlockingListPreference = findPreference("fanboy_social_blocking_list");
+        final Preference fanboyAnnoyanceListPreference = findPreference("fanboys_annoyance_list");
+        final Preference fanboySocialBlockingListPreference = findPreference("fanboys_social_blocking_list");
+        final Preference ultraPrivacyPreference = findPreference("ultraprivacy");
+        final Preference blockAllThirdPartyRequestsPreference = findPreference("block_all_third_party_requests");
         final Preference proxyThroughOrbotPreference = findPreference("proxy_through_orbot");
         final Preference torHomepagePreference = findPreference("tor_homepage");
         final Preference torSearchPreference = findPreference("tor_search");
@@ -77,11 +83,12 @@ public class SettingsFragment extends PreferenceFragment {
         final Preference clearEverythingPreference = findPreference("clear_everything");
         final Preference clearCookiesPreference = findPreference("clear_cookies");
         final Preference clearDomStoragePreference = findPreference("clear_dom_storage");
-        final Preference clearFormDataPreference = findPreference("clear_form_data");
+        final Preference clearFormDataPreference = findPreference("clear_form_data");  // The clear form data preference can be removed once the minimum API >= 26.
         final Preference clearCachePreference = findPreference("clear_cache");
         final Preference homepagePreference = findPreference("homepage");
-        final Preference defaultFontSizePreference = findPreference("default_font_size");
+        final Preference fontSizePreference = findPreference("font_size");
         final Preference swipeToRefreshPreference = findPreference("swipe_to_refresh");
+        final Preference downloadWithExternalAppPreference = findPreference("download_with_external_app");
         final Preference displayAdditionalAppBarIconsPreference = findPreference("display_additional_app_bar_icons");
         final Preference darkThemePreference = findPreference("dark_theme");
         final Preference nightModePreference = findPreference("night_mode");
@@ -93,43 +100,54 @@ public class SettingsFragment extends PreferenceFragment {
         hideSystemBarsPreference.setDependency("full_screen_browsing_mode");
 
         // Get Strings from the preferences.
-        String torSearchString = savedPreferences.getString("tor_search", "https://3g2upl4pq6kufc4m.onion/html/?q=");
-        String searchString = savedPreferences.getString("search", "https://duckduckgo.com/html/?q=");
-
-        // Get booleans from the preferences.
-        final boolean javaScriptEnabled = savedPreferences.getBoolean("javascript_enabled", false);
-        boolean firstPartyCookiesEnabled = savedPreferences.getBoolean("first_party_cookies_enabled", false);
-        boolean thirdPartyCookiesEnabled = savedPreferences.getBoolean("third_party_cookies_enabled", false);
-        boolean fanboyAnnoyanceListEnabled = savedPreferences.getBoolean("fanboy_annoyance_list", true);
-        boolean fanboySocialBlockingEnabled = savedPreferences.getBoolean("fanboy_social_blocking_list", true);
+        String torSearchString = savedPreferences.getString("tor_search", getString(R.string.tor_search_default_value));
+        String searchString = savedPreferences.getString("search", getString(R.string.search_default_value));
+
+        // Get booleans that are used in multiple places from the preferences.
+        final boolean javaScriptEnabled = savedPreferences.getBoolean("javascript", false);
+        boolean firstPartyCookiesEnabled = savedPreferences.getBoolean("first_party_cookies", false);
+        boolean thirdPartyCookiesEnabled = savedPreferences.getBoolean("third_party_cookies", false);
+        boolean fanboyAnnoyanceListEnabled = savedPreferences.getBoolean("fanboys_annoyance_list", true);
+        boolean fanboySocialBlockingEnabled = savedPreferences.getBoolean("fanboys_social_blocking_list", true);
         boolean proxyThroughOrbot = savedPreferences.getBoolean("proxy_through_orbot", false);
         boolean fullScreenBrowsingMode = savedPreferences.getBoolean("full_screen_browsing_mode", false);
         boolean hideSystemBars = savedPreferences.getBoolean("hide_system_bars", false);
         boolean clearEverything = savedPreferences.getBoolean("clear_everything", true);
         final boolean nightMode = savedPreferences.getBoolean("night_mode", false);
 
-        // Only enable the third-party preference if first-party cookies are enabled and API >= 21.
+        // Only enable the third-party cookies preference if first-party cookies are enabled and API >= 21.
         thirdPartyCookiesPreference.setEnabled(firstPartyCookiesEnabled && (Build.VERSION.SDK_INT >= 21));
 
         // Only enable the DOM storage preference if either JavaScript or Night Mode is enabled.
         domStoragePreference.setEnabled(javaScriptEnabled || nightMode);
 
+        // Remove the form data preferences if the API is >= 26 as they no longer do anything.
+        if (Build.VERSION.SDK_INT >= 26) {
+            // Get the categories.
+            PreferenceCategory privacyCategory = (PreferenceCategory) findPreference("privacy");
+            PreferenceCategory clearAndExitCategory = (PreferenceCategory) findPreference("clear_and_exit");
+
+            // Remove the form data preferences.
+            privacyCategory.removePreference(saveFormDataPreference);
+            clearAndExitCategory.removePreference(clearFormDataPreference);
+        }
+
         // Only enable Fanboy's social blocking list preference if Fanboy's annoyance list is disabled.
         fanboySocialBlockingListPreference.setEnabled(!fanboyAnnoyanceListEnabled);
 
-        // We need to inflated a `WebView` to get the default user agent.
+        // Inflate a WebView to get the default user agent.
         LayoutInflater inflater = getActivity().getLayoutInflater();
-        // `@SuppressLint("InflateParams")` removes the warning about using `null` as the `ViewGroup`, which in this case makes sense because we don't want to display `bare_webview` on the screen.
+        // `@SuppressLint("InflateParams")` removes the warning about using `null` as the `ViewGroup`, which in this case makes sense because the `bare_webview` will not be displayed.
         @SuppressLint("InflateParams") View bareWebViewLayout = inflater.inflate(R.layout.bare_webview, null, false);
         final WebView bareWebView = bareWebViewLayout.findViewById(R.id.bare_webview);
 
         // Get the user agent arrays.
-        ArrayAdapter<CharSequence> userAgentNamesArray = ArrayAdapter.createFromResource(context, R.array.user_agent_names, R.layout.domain_settings_spinner_item);
+        ArrayAdapter<CharSequence> userAgentNamesArray = ArrayAdapter.createFromResource(context, R.array.user_agent_names, R.layout.spinner_item);
         String[] translatedUserAgentNamesArray = getResources().getStringArray(R.array.translated_user_agent_names);
         String[] userAgentDataArray = getResources().getStringArray(R.array.user_agent_data);
 
         // Get the current user agent name from the preference.
-        String userAgentName = savedPreferences.getString("user_agent", "Privacy Browser");
+        String userAgentName = savedPreferences.getString("user_agent", getString(R.string.user_agent_default_value));
 
         // Get the array position of the user agent name.
         int userAgentArrayPosition = userAgentNamesArray.getPosition(userAgentName);
@@ -157,15 +175,15 @@ public class SettingsFragment extends PreferenceFragment {
         }
 
         // Set the summary text for the custom user agent preference and enable it if user agent preference is set to custom.
-        customUserAgentPreference.setSummary(savedPreferences.getString("custom_user_agent", "PrivacyBrowser/1.0"));
+        customUserAgentPreference.setSummary(savedPreferences.getString("custom_user_agent", getString(R.string.custom_user_agent_default_value)));
         customUserAgentPreference.setEnabled(userAgentPreference.getSummary().equals(getString(R.string.custom_user_agent)));
 
 
-        // Set the Tor homepage URL as the summary text for the `tor_homepage` preference when the preference screen is loaded.  The default is DuckDuckGo: `https://3g2upl4pq6kufc4m.onion`.
-        torHomepagePreference.setSummary(savedPreferences.getString("tor_homepage", "https://3g2upl4pq6kufc4m.onion"));
+        // Set the Tor homepage URL as the summary text for the `tor_homepage` preference when the preference screen is loaded.  The default is Searx: `http://ulrn6sryqaifefld.onion/`.
+        torHomepagePreference.setSummary(savedPreferences.getString("tor_homepage", getString(R.string.tor_homepage_default_value)));
 
 
-        // Set the Tor search URL as the summary text for the Tor preference when the preference screen is loaded.  The default is `https://3g2upl4pq6kufc4m.onion/html/?q=`
+        // Set the Tor search URL as the summary text for the Tor preference when the preference screen is loaded.
         if (torSearchString.equals("Custom URL")) {
             // Use R.string.custom_url, which will be translated, instead of the array value, which will not.
             torSearchPreference.setSummary(R.string.custom_url);
@@ -175,13 +193,13 @@ public class SettingsFragment extends PreferenceFragment {
         }
 
         // Set the summary text for `tor_search_custom_url`.  The default is `""`.
-        torSearchCustomURLPreference.setSummary(savedPreferences.getString("tor_search_custom_url", ""));
+        torSearchCustomURLPreference.setSummary(savedPreferences.getString("tor_search_custom_url", getString(R.string.tor_search_custom_url_default_value)));
 
         // Enable the Tor custom URL search options only if proxying through Orbot and the search is set to `Custom URL`.
         torSearchCustomURLPreference.setEnabled(proxyThroughOrbot && torSearchString.equals("Custom URL"));
 
 
-        // Set the search URL as the summary text for the search preference when the preference screen is loaded.  The default is `https://duckduckgo.com/html/?q=`.
+        // Set the search URL as the summary text for the search preference when the preference screen is loaded.
         if (searchString.equals("Custom URL")) {
             // Use R.string.custom_url, which will be translated, instead of the array value, which will not.
             searchPreference.setSummary(R.string.custom_url);
@@ -191,7 +209,7 @@ public class SettingsFragment extends PreferenceFragment {
         }
 
         // Set the summary text for `search_custom_url` (the default is `""`) and enable it if `search` is set to `Custom URL`.
-        searchCustomURLPreference.setSummary(savedPreferences.getString("search_custom_url", ""));
+        searchCustomURLPreference.setSummary(savedPreferences.getString("search_custom_url", getString(R.string.search_custom_url_default_value)));
         searchCustomURLPreference.setEnabled(searchString.equals("Custom URL"));
 
 
@@ -201,14 +219,14 @@ public class SettingsFragment extends PreferenceFragment {
         // Set the status of the `Clear and Exit` preferences.
         clearCookiesPreference.setEnabled(!clearEverything);
         clearDomStoragePreference.setEnabled(!clearEverything);
-        clearFormDataPreference.setEnabled(!clearEverything);
+        clearFormDataPreference.setEnabled(!clearEverything);  // The form data line can be removed once the minimum API is >= 26.
         clearCachePreference.setEnabled(!clearEverything);
 
         // Set the homepage URL as the summary text for the homepage preference.
-        homepagePreference.setSummary(savedPreferences.getString("homepage", "https://duckduckgo.com/?kao=-1&amp;kak=-1"));
+        homepagePreference.setSummary(savedPreferences.getString("homepage", getString(R.string.homepage_default_value)));
 
-        // Set the default font size as the summary text for the preference.
-        defaultFontSizePreference.setSummary(savedPreferences.getString("default_font_size", "100") + "%%");
+        // Set the font size as the summary text for the preference.
+        fontSizePreference.setSummary(savedPreferences.getString("font_size", getString(R.string.font_size_default_value)) + "%%");
 
         // Disable the JavaScript preference if Night Mode is enabled.  JavaScript will be enabled for all web pages.
         javaScriptPreference.setEnabled(!nightMode);
@@ -252,7 +270,7 @@ public class SettingsFragment extends PreferenceFragment {
 
         // Set the DOM storage icon.
         if (javaScriptEnabled || nightMode) {  // The preference is enabled.
-            if (savedPreferences.getBoolean("dom_storage_enabled", false)) {  // DOM storage is enabled.
+            if (savedPreferences.getBoolean("dom_storage", false)) {  // DOM storage is enabled.
                 domStoragePreference.setIcon(R.drawable.dom_storage_enabled);
             } else {  // DOM storage is disabled.
                 if (MainWebViewActivity.darkTheme) {
@@ -269,14 +287,16 @@ public class SettingsFragment extends PreferenceFragment {
             }
         }
 
-        // Set the save form data icon.
-        if (savedPreferences.getBoolean("save_form_data_enabled", false)) {
-            saveFormDataPreference.setIcon(R.drawable.form_data_enabled);
-        } else {
-            if (MainWebViewActivity.darkTheme) {
-                saveFormDataPreference.setIcon(R.drawable.form_data_disabled_dark);
+        // Set the save form data icon if API < 26.  Save form data has no effect on API >= 26.
+        if (Build.VERSION.SDK_INT < 26) {
+            if (savedPreferences.getBoolean("save_form_data", false)) {
+                saveFormDataPreference.setIcon(R.drawable.form_data_enabled);
             } else {
-                saveFormDataPreference.setIcon(R.drawable.form_data_disabled_light);
+                if (MainWebViewActivity.darkTheme) {
+                    saveFormDataPreference.setIcon(R.drawable.form_data_disabled_dark);
+                } else {
+                    saveFormDataPreference.setIcon(R.drawable.form_data_disabled_light);
+                }
             }
         }
 
@@ -409,6 +429,36 @@ public class SettingsFragment extends PreferenceFragment {
             }
         }
 
+        // Set the UltraPrivacy icon.
+        if (savedPreferences.getBoolean("ultraprivacy", true)) {
+            if (MainWebViewActivity.darkTheme) {
+                ultraPrivacyPreference.setIcon(R.drawable.block_tracking_enabled_dark);
+            } else {
+                ultraPrivacyPreference.setIcon(R.drawable.block_tracking_enabled_light);
+            }
+        } else {
+            if (MainWebViewActivity.darkTheme) {
+                ultraPrivacyPreference.setIcon(R.drawable.block_tracking_disabled_dark);
+            } else {
+                ultraPrivacyPreference.setIcon(R.drawable.block_tracking_disabled_light);
+            }
+        }
+
+        // Set the block all third-party requests icon.
+        if (savedPreferences.getBoolean("block_all_third_party_requests", false)) {
+            if (MainWebViewActivity.darkTheme) {
+                blockAllThirdPartyRequestsPreference.setIcon(R.drawable.block_all_third_party_requests_enabled_dark);
+            } else {
+                blockAllThirdPartyRequestsPreference.setIcon(R.drawable.block_all_third_party_requests_enabled_light);
+            }
+        } else {
+            if (MainWebViewActivity.darkTheme) {
+                blockAllThirdPartyRequestsPreference.setIcon(R.drawable.block_all_third_party_requests_disabled_dark);
+            } else {
+                blockAllThirdPartyRequestsPreference.setIcon(R.drawable.block_all_third_party_requests_disabled_light);
+            }
+        }
+
         // Set the Tor icons according to the theme.
         if (proxyThroughOrbot) {  // Proxying is enabled.
             if (MainWebViewActivity.darkTheme) {
@@ -551,15 +601,17 @@ public class SettingsFragment extends PreferenceFragment {
             clearDomStoragePreference.setIcon(R.drawable.dom_storage_warning);
         }
 
-        // Set the clear form data preference icon.
-        if (clearEverything || savedPreferences.getBoolean("clear_form_data", true)) {
-            if (MainWebViewActivity.darkTheme) {
-                clearFormDataPreference.setIcon(R.drawable.form_data_cleared_dark);
+        // Set the clear form data preference icon if the API < 26.  It has no effect on newer versions of Android.
+        if (Build.VERSION.SDK_INT < 26) {
+            if (clearEverything || savedPreferences.getBoolean("clear_form_data", true)) {
+                if (MainWebViewActivity.darkTheme) {
+                    clearFormDataPreference.setIcon(R.drawable.form_data_cleared_dark);
+                } else {
+                    clearFormDataPreference.setIcon(R.drawable.form_data_cleared_light);
+                }
             } else {
-                clearFormDataPreference.setIcon(R.drawable.form_data_cleared_light);
+                clearFormDataPreference.setIcon(R.drawable.form_data_warning);
             }
-        } else {
-            clearFormDataPreference.setIcon(R.drawable.form_data_warning);
         }
 
         // Set the clear cache preference icon.
@@ -588,6 +640,21 @@ public class SettingsFragment extends PreferenceFragment {
             }
         }
 
+        // Set the download with external app preference icon.
+        if (savedPreferences.getBoolean("download_with_external_app", false)) {
+            if (MainWebViewActivity.darkTheme) {
+                downloadWithExternalAppPreference.setIcon(R.drawable.open_with_external_app_enabled_dark);
+            } else {
+                downloadWithExternalAppPreference.setIcon(R.drawable.open_with_external_app_enabled_light);
+            }
+        } else {
+            if (MainWebViewActivity.darkTheme) {
+                downloadWithExternalAppPreference.setIcon(R.drawable.open_with_external_app_disabled_dark);
+            } else {
+                downloadWithExternalAppPreference.setIcon(R.drawable.open_with_external_app_disabled_light);
+            }
+        }
+
         // Set the display additional app bar icons preference icon.
         if (savedPreferences.getBoolean("display_additional_app_bar_icons", false)) {
             if (MainWebViewActivity.darkTheme) {
@@ -644,9 +711,9 @@ public class SettingsFragment extends PreferenceFragment {
         // Listen for preference changes.
         preferencesListener = (SharedPreferences sharedPreferences, String key) -> {
             switch (key) {
-                case "javascript_enabled":
+                case "javascript":
                     // Update the icons and the DOM storage preference status.
-                    if (sharedPreferences.getBoolean("javascript_enabled", false)) {  // The JavaScript preference is enabled.
+                    if (sharedPreferences.getBoolean("javascript", false)) {  // The JavaScript preference is enabled.
                         // Update the icon for the JavaScript preference.
                         javaScriptPreference.setIcon(R.drawable.javascript_enabled);
 
@@ -654,7 +721,7 @@ public class SettingsFragment extends PreferenceFragment {
                         domStoragePreference.setEnabled(true);
 
                         // Update the icon for the DOM storage preference.
-                        if (sharedPreferences.getBoolean("dom_storage_enabled", false)) {
+                        if (sharedPreferences.getBoolean("dom_storage", false)) {
                             domStoragePreference.setIcon(R.drawable.dom_storage_enabled);
                         } else {
                             if (MainWebViewActivity.darkTheme) {
@@ -679,15 +746,15 @@ public class SettingsFragment extends PreferenceFragment {
                     }
                     break;
 
-                case "first_party_cookies_enabled":
-                    // Update the icons for `first_party_cookies_enabled` and `third_party_cookies_enabled`.
-                    if (sharedPreferences.getBoolean("first_party_cookies_enabled", false)) {
-                        // Set the icon for `first_party_cookies_enabled`.
+                case "first_party_cookies":
+                    // Update the icons for `first_party_cookies` and `third_party_cookies`.
+                    if (sharedPreferences.getBoolean("first_party_cookies", false)) {
+                        // Set the icon for `first_party_cookies`.
                         firstPartyCookiesPreference.setIcon(R.drawable.cookies_enabled);
 
-                        // Update the icon for `third_party_cookies_enabled`.
+                        // Update the icon for `third_party_cookies`.
                         if (Build.VERSION.SDK_INT >= 21) {
-                            if (sharedPreferences.getBoolean("third_party_cookies_enabled", false)) {
+                            if (sharedPreferences.getBoolean("third_party_cookies", false)) {
                                 thirdPartyCookiesPreference.setIcon(R.drawable.cookies_warning);
                             } else {
                                 if (MainWebViewActivity.darkTheme) {
@@ -703,15 +770,15 @@ public class SettingsFragment extends PreferenceFragment {
                                 thirdPartyCookiesPreference.setIcon(R.drawable.cookies_ghosted_light);
                             }
                         }
-                    } else {  // `first_party_cookies_enabled` is `false`.
-                        // Update the icon for `first_party_cookies_enabled`.
+                    } else {  // `first_party_cookies` is `false`.
+                        // Update the icon for `first_party_cookies`.
                         if (MainWebViewActivity.darkTheme) {
                             firstPartyCookiesPreference.setIcon(R.drawable.cookies_disabled_dark);
                         } else {
                             firstPartyCookiesPreference.setIcon(R.drawable.cookies_disabled_light);
                         }
 
-                        // Set the icon for `third_party_cookies_enabled` to be ghosted.
+                        // Set the icon for `third_party_cookies` to be ghosted.
                         if (MainWebViewActivity.darkTheme) {
                             thirdPartyCookiesPreference.setIcon(R.drawable.cookies_ghosted_dark);
                         } else {
@@ -719,13 +786,13 @@ public class SettingsFragment extends PreferenceFragment {
                         }
                     }
 
-                    // Enable `third_party_cookies_enabled` if `first_party_cookies_enabled` is `true` and API >= 21.
-                    thirdPartyCookiesPreference.setEnabled(sharedPreferences.getBoolean("first_party_cookies_enabled", false) && (Build.VERSION.SDK_INT >= 21));
+                    // Enable `third_party_cookies` if `first_party_cookies` is `true` and API >= 21.
+                    thirdPartyCookiesPreference.setEnabled(sharedPreferences.getBoolean("first_party_cookies", false) && (Build.VERSION.SDK_INT >= 21));
                     break;
 
-                case "third_party_cookies_enabled":
+                case "third_party_cookies":
                     // Update the icon.
-                    if (sharedPreferences.getBoolean("third_party_cookies_enabled", false)) {
+                    if (sharedPreferences.getBoolean("third_party_cookies", false)) {
                         thirdPartyCookiesPreference.setIcon(R.drawable.cookies_warning);
                     } else {
                         if (MainWebViewActivity.darkTheme) {
@@ -736,9 +803,9 @@ public class SettingsFragment extends PreferenceFragment {
                     }
                     break;
 
-                case "dom_storage_enabled":
+                case "dom_storage":
                     // Update the icon.
-                    if (sharedPreferences.getBoolean("dom_storage_enabled", false)) {
+                    if (sharedPreferences.getBoolean("dom_storage", false)) {
                         domStoragePreference.setIcon(R.drawable.dom_storage_enabled);
                     } else {
                         if (MainWebViewActivity.darkTheme) {
@@ -749,9 +816,10 @@ public class SettingsFragment extends PreferenceFragment {
                     }
                     break;
 
-                case "save_form_data_enabled":
+                // Save form data can be removed once the minimum API >= 26.
+                case "save_form_data":
                     // Update the icon.
-                    if (sharedPreferences.getBoolean("save_form_data_enabled", false)) {
+                    if (sharedPreferences.getBoolean("save_form_data", false)) {
                         saveFormDataPreference.setIcon(R.drawable.form_data_enabled);
                     } else {
                         if (MainWebViewActivity.darkTheme) {
@@ -763,7 +831,7 @@ public class SettingsFragment extends PreferenceFragment {
 
                 case "user_agent":
                     // Get the new user agent name.
-                    String newUserAgentName = sharedPreferences.getString("user_agent", "Privacy Browser");
+                    String newUserAgentName = sharedPreferences.getString("user_agent", getString(R.string.user_agent_default_value));
 
                     // Get the array position for the new user agent name.
                     int newUserAgentArrayPosition = userAgentNamesArray.getPosition(newUserAgentName);
@@ -821,7 +889,7 @@ public class SettingsFragment extends PreferenceFragment {
 
                 case "custom_user_agent":
                     // Set the new custom user agent as the summary text for the preference.
-                    customUserAgentPreference.setSummary(sharedPreferences.getString("custom_user_agent", "PrivacyBrowser/1.0"));
+                    customUserAgentPreference.setSummary(sharedPreferences.getString("custom_user_agent", getString(R.string.custom_user_agent_default_value)));
                     break;
 
                 case "incognito_mode":
@@ -922,12 +990,12 @@ public class SettingsFragment extends PreferenceFragment {
                     }
                     break;
 
-                case "fanboy_annoyance_list":
-                    boolean currentFanboyAnnoyanceList = sharedPreferences.getBoolean("fanboy_annoyance_list", true);
-                    boolean currentFanboySocialBlockingList = sharedPreferences.getBoolean("fanboy_social_blocking_list", true);
+                case "fanboys_annoyance_list":
+                    boolean currentFanboyAnnoyanceList = sharedPreferences.getBoolean("fanboys_annoyance_list", true);
+                    boolean currentFanboySocialBlockingList = sharedPreferences.getBoolean("fanboys_social_blocking_list", true);
 
                     // Update the Fanboy icons.
-                    if (sharedPreferences.getBoolean("fanboy_annoyance_list", true)) {
+                    if (currentFanboyAnnoyanceList) {  // Fanboy's annoyance list is enabled.
                         if (MainWebViewActivity.darkTheme) {
                             // Update the Fanboy's annoyance list icon.
                             fanboyAnnoyanceListPreference.setIcon(R.drawable.social_media_enabled_dark);
@@ -941,16 +1009,16 @@ public class SettingsFragment extends PreferenceFragment {
                             // Update the Fanboy's social blocking list icon.
                             fanboySocialBlockingListPreference.setIcon(R.drawable.social_media_ghosted_light);
                         }
-                    } else {
+                    } else {  // Fanboy's annoyance list is disabled.
                         if (MainWebViewActivity.darkTheme) {
                             // Update the Fanboy's annoyance list icon.
                             fanboyAnnoyanceListPreference.setIcon(R.drawable.social_media_disabled_dark);
 
                             // Update the Fanboy's social blocking list icon.
                             if (currentFanboySocialBlockingList) {
-                                fanboyAnnoyanceListPreference.setIcon(R.drawable.social_media_enabled_dark);
+                                fanboySocialBlockingListPreference.setIcon(R.drawable.social_media_enabled_dark);
                             } else {
-                                fanboyAnnoyanceListPreference.setIcon(R.drawable.social_media_disabled_dark);
+                                fanboySocialBlockingListPreference.setIcon(R.drawable.social_media_disabled_dark);
                             }
                         } else {
                             // Update the Fanboy's annoyance list icon.
@@ -958,9 +1026,9 @@ public class SettingsFragment extends PreferenceFragment {
 
                             // Update the Fanboy's social blocking list icon.
                             if (currentFanboySocialBlockingList) {
-                                fanboyAnnoyanceListPreference.setIcon(R.drawable.social_media_enabled_light);
+                                fanboySocialBlockingListPreference.setIcon(R.drawable.social_media_enabled_light);
                             } else {
-                                fanboyAnnoyanceListPreference.setIcon(R.drawable.social_media_disabled_light);
+                                fanboySocialBlockingListPreference.setIcon(R.drawable.social_media_disabled_light);
                             }
                         }
                     }
@@ -969,9 +1037,9 @@ public class SettingsFragment extends PreferenceFragment {
                     fanboySocialBlockingListPreference.setEnabled(!currentFanboyAnnoyanceList);
                     break;
 
-                case "fanboy_social_blocking_list":
+                case "fanboys_social_blocking_list":
                     // Update the icon.
-                    if (sharedPreferences.getBoolean("fanboy_social_blocking_list", true)) {
+                    if (sharedPreferences.getBoolean("fanboys_social_blocking_list", true)) {
                         if (MainWebViewActivity.darkTheme) {
                             fanboySocialBlockingListPreference.setIcon(R.drawable.social_media_enabled_dark);
                         } else {
@@ -986,10 +1054,44 @@ public class SettingsFragment extends PreferenceFragment {
                     }
                     break;
 
+                case "ultraprivacy":
+                    // Update the icon.
+                    if (sharedPreferences.getBoolean("ultraprivacy", true)) {
+                        if (MainWebViewActivity.darkTheme) {
+                            ultraPrivacyPreference.setIcon(R.drawable.block_tracking_enabled_dark);
+                        } else {
+                            ultraPrivacyPreference.setIcon(R.drawable.block_tracking_enabled_light);
+                        }
+                    } else {
+                        if (MainWebViewActivity.darkTheme) {
+                            ultraPrivacyPreference.setIcon(R.drawable.block_tracking_disabled_dark);
+                        } else {
+                            ultraPrivacyPreference.setIcon(R.drawable.block_tracking_disabled_light);
+                        }
+                    }
+                    break;
+
+                case "block_all_third_party_requests":
+                    // Update the icon.
+                    if (sharedPreferences.getBoolean("block_all_third_party_requests", false)) {
+                        if (MainWebViewActivity.darkTheme) {
+                            blockAllThirdPartyRequestsPreference.setIcon(R.drawable.block_all_third_party_requests_enabled_dark);
+                        } else {
+                            blockAllThirdPartyRequestsPreference.setIcon(R.drawable.block_all_third_party_requests_enabled_light);
+                        }
+                    } else {
+                        if (MainWebViewActivity.darkTheme) {
+                            blockAllThirdPartyRequestsPreference.setIcon(R.drawable.block_all_third_party_requests_disabled_dark);
+                        } else {
+                            blockAllThirdPartyRequestsPreference.setIcon(R.drawable.block_all_third_party_requests_disabled_light);
+                        }
+                    }
+                    break;
+
                 case "proxy_through_orbot":
                     // Get current settings.
                     boolean currentProxyThroughOrbot = sharedPreferences.getBoolean("proxy_through_orbot", false);
-                    String currentTorSearchString = sharedPreferences.getString("tor_search", "https://3g2upl4pq6kufc4m.onion/html/?q=");
+                    String currentTorSearchString = sharedPreferences.getString("tor_search", getString(R.string.tor_search_default_value));
 
                     // Enable the Tor custom URL search option only if `currentProxyThroughOrbot` is true and the search is set to `Custom URL`.
                     torSearchCustomURLPreference.setEnabled(currentProxyThroughOrbot && currentTorSearchString.equals("Custom URL"));
@@ -1036,13 +1138,13 @@ public class SettingsFragment extends PreferenceFragment {
                     break;
 
                 case "tor_homepage":
-                    // Set the new tor homepage URL as the summary text for the `tor_homepage` preference.  The default is DuckDuckGo:  `https://3g2upl4pq6kufc4m.onion`.
-                    torHomepagePreference.setSummary(sharedPreferences.getString("tor_homepage", "https://3g2upl4pq6kufc4m.onion"));
+                    // Set the new tor homepage URL as the summary text for the `tor_homepage` preference.  The default is Searx:  `http://ulrn6sryqaifefld.onion/`.
+                    torHomepagePreference.setSummary(sharedPreferences.getString("tor_homepage", getString(R.string.tor_homepage_default_value)));
                     break;
 
                 case "tor_search":
                     // Get the present search string.
-                    String presentTorSearchString = sharedPreferences.getString("tor_search", "https://3g2upl4pq6kufc4m.onion/html/?q=");
+                    String presentTorSearchString = sharedPreferences.getString("tor_search", getString(R.string.tor_search_default_value));
 
                     // Update the preferences.
                     if (presentTorSearchString.equals("Custom URL")) {
@@ -1076,12 +1178,12 @@ public class SettingsFragment extends PreferenceFragment {
 
                 case "tor_search_custom_url":
                     // Set the summary text for `tor_search_custom_url`.
-                    torSearchCustomURLPreference.setSummary(sharedPreferences.getString("tor_search_custom_url", ""));
+                    torSearchCustomURLPreference.setSummary(sharedPreferences.getString("tor_search_custom_url", getString(R.string.tor_search_custom_url_default_value)));
                     break;
 
                 case "search":
                     // Store the new search string.
-                    String newSearchString = sharedPreferences.getString("search", "https://duckduckgo.com/html/?q=");
+                    String newSearchString = sharedPreferences.getString("search", getString(R.string.search_default_value));
 
                     // Update `searchPreference` and `searchCustomURLPreference`.
                     if (newSearchString.equals("Custom URL")) {  // `Custom URL` is selected.
@@ -1115,7 +1217,7 @@ public class SettingsFragment extends PreferenceFragment {
 
                 case "search_custom_url":
                     // Set the new custom search URL as the summary text for `search_custom_url`.  The default is `""`.
-                    searchCustomURLPreference.setSummary(sharedPreferences.getString("search_custom_url", ""));
+                    searchCustomURLPreference.setSummary(sharedPreferences.getString("search_custom_url", getString(R.string.search_custom_url_default_value)));
                     break;
 
                 case "full_screen_browsing_mode":
@@ -1249,7 +1351,7 @@ public class SettingsFragment extends PreferenceFragment {
                     // Update the status of the `Clear and Exit` preferences.
                     clearCookiesPreference.setEnabled(!newClearEverythingBoolean);
                     clearDomStoragePreference.setEnabled(!newClearEverythingBoolean);
-                    clearFormDataPreference.setEnabled(!newClearEverythingBoolean);
+                    clearFormDataPreference.setEnabled(!newClearEverythingBoolean);  // This line can be removed once the minimum API >= 26.
                     clearCachePreference.setEnabled(!newClearEverythingBoolean);
 
                     // Update the `clearEverythingPreference` icon.
@@ -1285,15 +1387,17 @@ public class SettingsFragment extends PreferenceFragment {
                         clearDomStoragePreference.setIcon(R.drawable.dom_storage_warning);
                     }
 
-                    // Update the `clearFormDataPreference` icon.
-                    if (newClearEverythingBoolean || sharedPreferences.getBoolean("clear_form_data", true)) {
-                        if (MainWebViewActivity.darkTheme) {
-                            clearFormDataPreference.setIcon(R.drawable.form_data_cleared_dark);
+                    // Update the clear form data preference icon if the API < 26.
+                    if (Build.VERSION.SDK_INT < 26) {
+                        if (newClearEverythingBoolean || sharedPreferences.getBoolean("clear_form_data", true)) {
+                            if (MainWebViewActivity.darkTheme) {
+                                clearFormDataPreference.setIcon(R.drawable.form_data_cleared_dark);
+                            } else {
+                                clearFormDataPreference.setIcon(R.drawable.form_data_cleared_light);
+                            }
                         } else {
-                            clearFormDataPreference.setIcon(R.drawable.form_data_cleared_light);
+                            clearFormDataPreference.setIcon(R.drawable.form_data_warning);
                         }
-                    } else {
-                        clearFormDataPreference.setIcon(R.drawable.form_data_warning);
                     }
 
                     // Update the `clearCachePreference` icon.
@@ -1334,6 +1438,7 @@ public class SettingsFragment extends PreferenceFragment {
                     }
                     break;
 
+                // This section can be removed once the minimum API >= 26.
                 case "clear_form_data":
                     // Update the icon.
                     if (sharedPreferences.getBoolean("clear_form_data", true)) {
@@ -1361,13 +1466,13 @@ public class SettingsFragment extends PreferenceFragment {
                     break;
 
                 case "homepage":
-                    // Set the new homepage URL as the summary text for the Homepage preference.  The default is `https://www.duckduckgo.com`.
-                    homepagePreference.setSummary(sharedPreferences.getString("homepage", "https://www.duckduckgo.com"));
+                    // Set the new homepage URL as the summary text for the Homepage preference.
+                    homepagePreference.setSummary(sharedPreferences.getString("homepage", getString(R.string.homepage_default_value)));
                     break;
 
-                case "default_font_size":
-                    // Update the summary text of `default_font_size`.
-                    defaultFontSizePreference.setSummary(sharedPreferences.getString("default_font_size", "100") + "%%");
+                case "font_size":
+                    // Update the font size summary text.
+                    fontSizePreference.setSummary(sharedPreferences.getString("font_size", getString(R.string.font_size_default_value)) + "%%");
                     break;
 
                 case "swipe_to_refresh":
@@ -1387,6 +1492,23 @@ public class SettingsFragment extends PreferenceFragment {
                     }
                     break;
 
+                case "download_with_external_app":
+                    // Update the icon.
+                    if (sharedPreferences.getBoolean("download_with_external_app", false)) {
+                        if (MainWebViewActivity.darkTheme) {
+                            downloadWithExternalAppPreference.setIcon(R.drawable.open_with_external_app_enabled_dark);
+                        } else {
+                            downloadWithExternalAppPreference.setIcon(R.drawable.open_with_external_app_enabled_light);
+                        }
+                    } else {
+                        if (MainWebViewActivity.darkTheme) {
+                            downloadWithExternalAppPreference.setIcon(R.drawable.open_with_external_app_disabled_dark);
+                        } else {
+                            downloadWithExternalAppPreference.setIcon(R.drawable.open_with_external_app_disabled_light);
+                        }
+                    }
+                    break;
+
                 case "display_additional_app_bar_icons":
                     // Update the icon.
                     if (sharedPreferences.getBoolean("display_additional_app_bar_icons", false)) {
@@ -1431,7 +1553,7 @@ public class SettingsFragment extends PreferenceFragment {
 
                     // Store the current night mode status.
                     boolean currentNightModeBoolean = sharedPreferences.getBoolean("night_mode", false);
-                    boolean currentJavaScriptBoolean = sharedPreferences.getBoolean("javascript_enabled", false);
+                    boolean currentJavaScriptBoolean = sharedPreferences.getBoolean("javascript", false);
 
                     // Update the icon.
                     if (currentNightModeBoolean) {
@@ -1459,9 +1581,9 @@ public class SettingsFragment extends PreferenceFragment {
                         javaScriptPreference.setIcon(R.drawable.privacy_mode);
                     }
 
-                    // Update the `domStoragePreference` icon.
+                    // Update the DOM storage preference icon.
                     if (currentNightModeBoolean || currentJavaScriptBoolean) {  // The preference is enabled.
-                        if (sharedPreferences.getBoolean("dom_storage_enabled", false)) {  // DOM storage is enabled.
+                        if (sharedPreferences.getBoolean("dom_storage", false)) {  // DOM storage is enabled.
                             domStoragePreference.setIcon(R.drawable.dom_storage_enabled);
                         } else {  // DOM storage is disabled.
                             if (MainWebViewActivity.darkTheme) {