]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java
Switch to using AndroidX's ProxyController. https://redmine.stoutner.com/issues/486
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / fragments / SettingsFragment.java
index 35956e94aae28a95d9b9bed8791dfcf052ef2caa..16ca2998ca88e379359534641808ae4f40bf4e3d 100644 (file)
 package com.stoutner.privacybrowser.fragments;
 
 import android.annotation.SuppressLint;
+import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
-import android.preference.Preference;
-import android.preference.PreferenceCategory;
-import android.preference.PreferenceFragment;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.webkit.WebView;
 import android.widget.ArrayAdapter;
 
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceFragmentCompat;
+
 import com.stoutner.privacybrowser.R;
 import com.stoutner.privacybrowser.activities.MainWebViewActivity;
+import com.stoutner.privacybrowser.helpers.ProxyHelper;
 
-public class SettingsFragment extends PreferenceFragment {
+public class SettingsFragment extends PreferenceFragmentCompat {
+    // Define the class variables.
     private SharedPreferences.OnSharedPreferenceChangeListener preferencesListener;
     private SharedPreferences savedPreferences;
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        // Run the default commands.
-        super.onCreate(savedInstanceState);
-
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
         // Load the preferences from the XML file.
-        addPreferencesFromResource(R.xml.preferences);
+        setPreferencesFromResource(R.xml.preferences, rootKey);
+
+        // Get a handle for the activity.
+        Activity activity = getActivity();
+
+        // Remove the lint warning below that `getApplicationContext()` might produce a null pointer exception.
+        assert activity != null;
 
         // Get a handle for the context.
-        Context context = getActivity().getApplicationContext();
+        Context context = activity.getApplicationContext();
 
         // Initialize savedPreferences.
         savedPreferences = getPreferenceScreen().getSharedPreferences();
@@ -60,7 +67,7 @@ public class SettingsFragment extends PreferenceFragment {
         Preference firstPartyCookiesPreference = findPreference("first_party_cookies");
         Preference thirdPartyCookiesPreference = findPreference("third_party_cookies");
         Preference domStoragePreference = findPreference("dom_storage");
-        Preference saveFormDataPreference = findPreference("save_form_data");  // The form data preference can be removed once the minimum API >= 26.
+        Preference formDataPreference = findPreference("save_form_data");  // The form data preference can be removed once the minimum API >= 26.
         Preference userAgentPreference = findPreference("user_agent");
         Preference customUserAgentPreference = findPreference("custom_user_agent");
         Preference incognitoModePreference = findPreference("incognito_mode");
@@ -70,14 +77,16 @@ public class SettingsFragment extends PreferenceFragment {
         Preference easyPrivacyPreference = findPreference("easyprivacy");
         Preference fanboyAnnoyanceListPreference = findPreference("fanboys_annoyance_list");
         Preference fanboySocialBlockingListPreference = findPreference("fanboys_social_blocking_list");
+        Preference ultraListPreference = findPreference("ultralist");
         Preference ultraPrivacyPreference = findPreference("ultraprivacy");
         Preference blockAllThirdPartyRequestsPreference = findPreference("block_all_third_party_requests");
-        Preference proxyThroughOrbotPreference = findPreference("proxy_through_orbot");
-        Preference torHomepagePreference = findPreference("tor_homepage");
-        Preference torSearchPreference = findPreference("tor_search");
-        Preference torSearchCustomURLPreference = findPreference("tor_search_custom_url");
+        Preference googleAnalyticsPreference = findPreference("google_analytics");
+        Preference facebookClickIdsPreference = findPreference("facebook_click_ids");
+        Preference twitterAmpRedirectsPreference = findPreference("twitter_amp_redirects");
         Preference searchPreference = findPreference("search");
         Preference searchCustomURLPreference = findPreference("search_custom_url");
+        Preference proxyPreference = findPreference("proxy");
+        Preference proxyCustomUrlPreference = findPreference("proxy_custom_url");
         Preference fullScreenBrowsingModePreference = findPreference("full_screen_browsing_mode");
         Preference hideAppBarPreference = findPreference("hide_app_bar");
         Preference clearEverythingPreference = findPreference("clear_everything");
@@ -94,16 +103,59 @@ public class SettingsFragment extends PreferenceFragment {
         Preference downloadWithExternalAppPreference = findPreference("download_with_external_app");
         Preference darkThemePreference = findPreference("dark_theme");
         Preference nightModePreference = findPreference("night_mode");
+        Preference wideViewportPreference = findPreference("wide_viewport");
         Preference displayWebpageImagesPreference = findPreference("display_webpage_images");
 
-        // Set dependencies.
-        torHomepagePreference.setDependency("proxy_through_orbot");
-        torSearchPreference.setDependency("proxy_through_orbot");
+        // Remove the lint warnings below that the preferences might be null.
+        assert javaScriptPreference != null;
+        assert firstPartyCookiesPreference != null;
+        assert thirdPartyCookiesPreference != null;
+        assert domStoragePreference != null;
+        assert formDataPreference != null;
+        assert userAgentPreference != null;
+        assert customUserAgentPreference != null;
+        assert incognitoModePreference != null;
+        assert doNotTrackPreference != null;
+        assert allowScreenshotsPreference != null;
+        assert easyListPreference != null;
+        assert easyPrivacyPreference != null;
+        assert fanboyAnnoyanceListPreference != null;
+        assert fanboySocialBlockingListPreference != null;
+        assert ultraListPreference != null;
+        assert ultraPrivacyPreference != null;
+        assert blockAllThirdPartyRequestsPreference != null;
+        assert googleAnalyticsPreference != null;
+        assert facebookClickIdsPreference != null;
+        assert twitterAmpRedirectsPreference != null;
+        assert searchPreference != null;
+        assert searchCustomURLPreference != null;
+        assert proxyPreference != null;
+        assert proxyCustomUrlPreference != null;
+        assert fullScreenBrowsingModePreference != null;
+        assert hideAppBarPreference != null;
+        assert clearEverythingPreference != null;
+        assert clearCookiesPreference != null;
+        assert clearDomStoragePreference != null;
+        assert clearFormDataPreference != null;
+        assert clearCachePreference != null;
+        assert homepagePreference != null;
+        assert fontSizePreference != null;
+        assert openIntentsInNewTabPreference != null;
+        assert swipeToRefreshPreference != null;
+        assert scrollAppBarPreference != null;
+        assert displayAdditionalAppBarIconsPreference != null;
+        assert downloadWithExternalAppPreference != null;
+        assert darkThemePreference != null;
+        assert nightModePreference != null;
+        assert wideViewportPreference != null;
+        assert displayWebpageImagesPreference != null;
+
+        // Set the hide app bar preference dependency.
         hideAppBarPreference.setDependency("full_screen_browsing_mode");
 
         // Get strings from the preferences.
-        String torSearchString = savedPreferences.getString("tor_search", getString(R.string.tor_search_default_value));
         String searchString = savedPreferences.getString("search", getString(R.string.search_default_value));
+        String proxyString = savedPreferences.getString("proxy", getString(R.string.proxy_default_value));
 
         // Get booleans that are used in multiple places from the preferences.
         boolean javaScriptEnabled = savedPreferences.getBoolean("javascript", false);
@@ -111,7 +163,6 @@ public class SettingsFragment extends PreferenceFragment {
         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 clearEverything = savedPreferences.getBoolean("clear_everything", true);
         boolean darkTheme = savedPreferences.getBoolean("dark_theme", false);
@@ -126,11 +177,15 @@ public class SettingsFragment extends PreferenceFragment {
         // 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");
+            PreferenceCategory privacyCategory = findPreference("privacy");
+            PreferenceCategory clearAndExitCategory = findPreference("clear_and_exit");
+
+            // Remove the lint warnings below that the preference categories might be null.
+            assert privacyCategory != null;
+            assert clearAndExitCategory != null;
 
             // Remove the form data preferences.
-            privacyCategory.removePreference(saveFormDataPreference);
+            privacyCategory.removePreference(formDataPreference);
             clearAndExitCategory.removePreference(clearFormDataPreference);
         }
 
@@ -180,27 +235,6 @@ public class SettingsFragment extends PreferenceFragment {
         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 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.
-        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);
-        } else {
-            // Set the array value as the summary text.
-            torSearchPreference.setSummary(torSearchString);
-        }
-
-        // Set the summary text for `tor_search_custom_url`.  The default is `""`.
-        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.
         if (searchString.equals("Custom URL")) {
             // Use R.string.custom_url, which will be translated, instead of the array value, which will not.
@@ -214,6 +248,35 @@ public class SettingsFragment extends PreferenceFragment {
         searchCustomURLPreference.setSummary(savedPreferences.getString("search_custom_url", getString(R.string.search_custom_url_default_value)));
         searchCustomURLPreference.setEnabled(searchString.equals("Custom URL"));
 
+        // Set the summary text for the proxy preference when the preference screen is loaded.
+        switch (proxyString) {
+            case ProxyHelper.NONE:
+                proxyPreference.setSummary(getString(R.string.no_proxy_enabled));
+                break;
+
+            case ProxyHelper.TOR:
+                if (Build.VERSION.SDK_INT == 19) {  // Proxying through SOCKS doesn't work on Android KitKat.
+                    proxyPreference.setSummary(getString(R.string.tor_enabled_kitkat));
+                } else {
+                    proxyPreference.setSummary(getString(R.string.tor_enabled));
+                }
+                break;
+
+            case ProxyHelper.I2P:
+                proxyPreference.setSummary(getString(R.string.i2p_enabled));
+                break;
+
+            case ProxyHelper.CUSTOM:
+                proxyPreference.setSummary(getString(R.string.custom_proxy));
+                break;
+        }
+
+        // Only enable the custom proxy URL if a custom proxy is selected.
+        proxyCustomUrlPreference.setEnabled(proxyString.equals("Custom"));
+
+        // Set the summary text for the custom proxy URL.
+        proxyCustomUrlPreference.setSummary(savedPreferences.getString("proxy_custom_url", getString(R.string.proxy_custom_url_default_value)));
+
         // Set the status of the Clear and Exit preferences.
         clearCookiesPreference.setEnabled(!clearEverything);
         clearDomStoragePreference.setEnabled(!clearEverything);
@@ -224,7 +287,7 @@ public class SettingsFragment extends PreferenceFragment {
         homepagePreference.setSummary(savedPreferences.getString("homepage", getString(R.string.homepage_default_value)));
 
         // Set the font size as the summary text for the preference.
-        fontSizePreference.setSummary(savedPreferences.getString("font_size", getString(R.string.font_size_default_value)) + "%%");
+        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);
@@ -288,12 +351,12 @@ public class SettingsFragment extends PreferenceFragment {
         // 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);
+                formDataPreference.setIcon(R.drawable.form_data_enabled);
             } else {
                 if (darkTheme) {
-                    saveFormDataPreference.setIcon(R.drawable.form_data_disabled_dark);
+                    formDataPreference.setIcon(R.drawable.form_data_disabled_dark);
                 } else {
-                    saveFormDataPreference.setIcon(R.drawable.form_data_disabled_light);
+                    formDataPreference.setIcon(R.drawable.form_data_disabled_light);
                 }
             }
         }
@@ -427,6 +490,21 @@ public class SettingsFragment extends PreferenceFragment {
             }
         }
 
+        // Set the UltraList icon.
+        if (savedPreferences.getBoolean("ultralist", true)){
+            if (darkTheme) {
+                ultraListPreference.setIcon(R.drawable.block_ads_enabled_dark);
+            } else {
+                ultraListPreference.setIcon(R.drawable.block_ads_enabled_light);
+            }
+        } else {
+            if (darkTheme) {
+                ultraListPreference.setIcon(R.drawable.block_ads_disabled_dark);
+            } else {
+                ultraListPreference.setIcon(R.drawable.block_ads_disabled_light);
+            }
+        }
+
         // Set the UltraPrivacy icon.
         if (savedPreferences.getBoolean("ultraprivacy", true)) {
             if (darkTheme) {
@@ -457,42 +535,48 @@ public class SettingsFragment extends PreferenceFragment {
             }
         }
 
-        // Set the Tor icons according to the theme.
-        if (proxyThroughOrbot) {  // Proxying is enabled.
+        // Set the Google Analytics icon according to the theme.
+        if (savedPreferences.getBoolean("google_analytics", true)) {
             if (darkTheme) {
-                proxyThroughOrbotPreference.setIcon(R.drawable.orbot_enabled_dark);
-                torHomepagePreference.setIcon(R.drawable.home_enabled_dark);
-                torSearchPreference.setIcon(R.drawable.search_enabled_dark);
+                googleAnalyticsPreference.setIcon(R.drawable.modify_url_enabled_dark);
+            } else {
+                googleAnalyticsPreference.setIcon(R.drawable.modify_url_enabled_light);
+            }
+        } else {
+            if (darkTheme) {
+                googleAnalyticsPreference.setIcon(R.drawable.modify_url_disabled_dark);
+            } else {
+                googleAnalyticsPreference.setIcon(R.drawable.modify_url_disabled_light);
+            }
+        }
 
-                // Set the custom search icon.
-                if (torSearchCustomURLPreference.isEnabled()) {
-                    torSearchCustomURLPreference.setIcon(R.drawable.search_custom_url_enabled_dark);
-                } else {
-                    torSearchCustomURLPreference.setIcon(R.drawable.search_custom_url_ghosted_dark);
-                }
+        // Set the Facebook Click IDs icon according to the theme.
+        if (savedPreferences.getBoolean("facebook_click_ids", true)) {
+            if (darkTheme) {
+                facebookClickIdsPreference.setIcon(R.drawable.modify_url_enabled_dark);
             } else {
-                proxyThroughOrbotPreference.setIcon(R.drawable.orbot_enabled_light);
-                torHomepagePreference.setIcon(R.drawable.home_enabled_light);
-                torSearchPreference.setIcon(R.drawable.search_enabled_light);
+                facebookClickIdsPreference.setIcon(R.drawable.modify_url_enabled_light);
+            }
+        } else {
+            if (darkTheme) {
+                facebookClickIdsPreference.setIcon(R.drawable.modify_url_disabled_dark);
+            } else {
+                facebookClickIdsPreference.setIcon(R.drawable.modify_url_disabled_light);
+            }
+        }
 
-                // Set the custom search icon.
-                if (torSearchCustomURLPreference.isEnabled()) {
-                    torSearchCustomURLPreference.setIcon(R.drawable.search_custom_url_enabled_light);
-                } else {
-                    torSearchCustomURLPreference.setIcon(R.drawable.search_custom_url_ghosted_light);
-                }
+        // Set the Twitter AMP redirects icon according to the theme.
+        if (savedPreferences.getBoolean("twitter_amp_redirects", true)) {
+            if (darkTheme) {
+                twitterAmpRedirectsPreference.setIcon(R.drawable.modify_url_enabled_dark);
+            } else {
+                twitterAmpRedirectsPreference.setIcon(R.drawable.modify_url_enabled_light);
             }
-        } else {  // Proxying is disabled.
+        } else {
             if (darkTheme) {
-                proxyThroughOrbotPreference.setIcon(R.drawable.orbot_disabled_dark);
-                torHomepagePreference.setIcon(R.drawable.home_ghosted_dark);
-                torSearchPreference.setIcon(R.drawable.search_ghosted_dark);
-                torSearchCustomURLPreference.setIcon(R.drawable.search_custom_url_ghosted_dark);
+                twitterAmpRedirectsPreference.setIcon(R.drawable.modify_url_disabled_dark);
             } else {
-                proxyThroughOrbotPreference.setIcon(R.drawable.orbot_disabled_light);
-                torHomepagePreference.setIcon(R.drawable.home_ghosted_light);
-                torSearchPreference.setIcon(R.drawable.search_ghosted_light);
-                torSearchCustomURLPreference.setIcon(R.drawable.search_custom_url_ghosted_light);
+                twitterAmpRedirectsPreference.setIcon(R.drawable.modify_url_disabled_light);
             }
         }
 
@@ -511,6 +595,45 @@ public class SettingsFragment extends PreferenceFragment {
             }
         }
 
+        // Set the Proxy icons according to the theme and status.
+        if (proxyString.equals("None")) {  // Proxying is disabled.
+            if (darkTheme) {  // Dark theme.
+                // Set the main proxy icon to be disabled.
+                proxyPreference.setIcon(R.drawable.proxy_disabled_dark);
+
+                // Set the custom proxy URL icon to be ghosted.
+                proxyCustomUrlPreference.setIcon(R.drawable.proxy_ghosted_dark);
+            } else {  // Light theme.
+                // Set the main proxy icon to be disabled.
+                proxyPreference.setIcon(R.drawable.proxy_disabled_light);
+
+                // Set the custom proxy URL icon to be ghosted.
+                proxyCustomUrlPreference.setIcon(R.drawable.proxy_ghosted_light);
+            }
+        } else {  // Proxying is enabled.
+            if (darkTheme) {  // Dark theme.
+                // Set the main proxy icon to be enabled.
+                proxyPreference.setIcon(R.drawable.proxy_enabled_dark);
+
+                // Set the custom proxy URL icon according to its status.
+                if (proxyCustomUrlPreference.isEnabled()) {  // Custom proxy is enabled.
+                    proxyCustomUrlPreference.setIcon(R.drawable.proxy_enabled_dark);
+                } else {  // Custom proxy is disabled.
+                    proxyCustomUrlPreference.setIcon(R.drawable.proxy_ghosted_dark);
+                }
+            } else {  // Light theme.
+                // Set the main proxy icon to be enabled.
+                proxyPreference.setIcon(R.drawable.proxy_enabled_light);
+
+                // Set the custom proxy URL icon according to its status.
+                if (proxyCustomUrlPreference.isEnabled()) {  // Custom proxy is enabled.
+                    proxyCustomUrlPreference.setIcon(R.drawable.proxy_enabled_light);
+                } else {  // Custom proxy is disabled.
+                    proxyCustomUrlPreference.setIcon(R.drawable.proxy_ghosted_light);
+                }
+            }
+        }
+
         // Set the full screen browsing mode icons.
         if (fullScreenBrowsingMode) {  // Full screen browsing mode is enabled.
             // Set the `fullScreenBrowsingModePreference` icon according to the theme.
@@ -701,6 +824,21 @@ public class SettingsFragment extends PreferenceFragment {
             }
         }
 
+        // Set the wide viewport preference icon.
+        if (savedPreferences.getBoolean("wide_viewport", true)) {
+            if (darkTheme) {
+                wideViewportPreference.setIcon(R.drawable.wide_viewport_enabled_dark);
+            } else {
+                wideViewportPreference.setIcon(R.drawable.wide_viewport_enabled_light);
+            }
+        } else {
+            if (darkTheme) {
+                wideViewportPreference.setIcon(R.drawable.wide_viewport_disabled_dark);
+            } else {
+                wideViewportPreference.setIcon(R.drawable.wide_viewport_disabled_light);
+            }
+        }
+
         // Set the display webpage images preference icon.
         if (savedPreferences.getBoolean("display_webpage_images", true)) {
             if (darkTheme) {
@@ -829,12 +967,12 @@ public class SettingsFragment extends PreferenceFragment {
                 case "save_form_data":
                     // Update the icon.
                     if (sharedPreferences.getBoolean("save_form_data", false)) {
-                        saveFormDataPreference.setIcon(R.drawable.form_data_enabled);
+                        formDataPreference.setIcon(R.drawable.form_data_enabled);
                     } else {
                         if (darkTheme) {
-                            saveFormDataPreference.setIcon(R.drawable.form_data_disabled_dark);
+                            formDataPreference.setIcon(R.drawable.form_data_disabled_dark);
                         } else {
-                            saveFormDataPreference.setIcon(R.drawable.form_data_disabled_light);
+                            formDataPreference.setIcon(R.drawable.form_data_disabled_light);
                         }
                     }
                     break;
@@ -974,8 +1112,8 @@ public class SettingsFragment extends PreferenceFragment {
                         System.exit(0);
                     };
 
-                    // Restart the activity after 100 milliseconds, so that the app has enough time to save the change to the preference.
-                    allowScreenshotsRestartHandler.postDelayed(allowScreenshotsRestartRunnable, 100);
+                    // Restart the activity after 150 milliseconds, so that the app has enough time to save the change to the preference.
+                    allowScreenshotsRestartHandler.postDelayed(allowScreenshotsRestartRunnable, 150);
                     break;
 
                 case "easylist":
@@ -1076,6 +1214,23 @@ public class SettingsFragment extends PreferenceFragment {
                     }
                     break;
 
+                case "ultralist":
+                    // Update the icon.
+                    if (sharedPreferences.getBoolean("ultralist", true)) {
+                        if (darkTheme) {
+                            ultraListPreference.setIcon(R.drawable.block_ads_enabled_dark);
+                        } else {
+                            ultraListPreference.setIcon(R.drawable.block_ads_enabled_light);
+                        }
+                    } else {
+                        if (darkTheme) {
+                            ultraListPreference.setIcon(R.drawable.block_ads_disabled_dark);
+                        } else {
+                            ultraListPreference.setIcon(R.drawable.block_ads_disabled_light);
+                        }
+                    }
+                    break;
+
                 case "ultraprivacy":
                     // Update the icon.
                     if (sharedPreferences.getBoolean("ultraprivacy", true)) {
@@ -1110,97 +1265,55 @@ public class SettingsFragment extends PreferenceFragment {
                     }
                     break;
 
-                case "proxy_through_orbot":
-                    // Get current settings.
-                    boolean currentProxyThroughOrbot = sharedPreferences.getBoolean("proxy_through_orbot", false);
-                    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"));
-
-                    // Update the icons.
-                    if (currentProxyThroughOrbot) {
-                        // Set the Tor icons according to the theme.
+                case "google_analytics":
+                    // Update the icon.
+                    if (sharedPreferences.getBoolean("google_analytics", true)) {
                         if (darkTheme) {
-                            proxyThroughOrbotPreference.setIcon(R.drawable.orbot_enabled_dark);
-                            torHomepagePreference.setIcon(R.drawable.home_enabled_dark);
-                            torSearchPreference.setIcon(R.drawable.search_enabled_dark);
-
-                            // Set the `torSearchCustomURLPreference` icon.
-                            if (torSearchCustomURLPreference.isEnabled()) {
-                                torSearchCustomURLPreference.setIcon(R.drawable.search_custom_url_enabled_dark);
-                            } else {
-                                torSearchCustomURLPreference.setIcon(R.drawable.search_custom_url_ghosted_dark);
-                            }
+                            googleAnalyticsPreference.setIcon(R.drawable.modify_url_enabled_dark);
                         } else {
-                            proxyThroughOrbotPreference.setIcon(R.drawable.orbot_enabled_light);
-                            torHomepagePreference.setIcon(R.drawable.home_enabled_light);
-                            torSearchPreference.setIcon(R.drawable.search_enabled_light);
-
-                            // Set the `torSearchCustomURLPreference` icon.
-                            if (torSearchCustomURLPreference.isEnabled()) {
-                                torSearchCustomURLPreference.setIcon(R.drawable.search_custom_url_enabled_light);
-                            } else {
-                                torSearchCustomURLPreference.setIcon(R.drawable.search_custom_url_ghosted_light);
-                            }
+                            googleAnalyticsPreference.setIcon(R.drawable.modify_url_enabled_light);
                         }
-                    } else {  // Proxy through Orbot is disabled.
+                    } else {
                         if (darkTheme) {
-                            proxyThroughOrbotPreference.setIcon(R.drawable.orbot_disabled_dark);
-                            torHomepagePreference.setIcon(R.drawable.home_ghosted_dark);
-                            torSearchPreference.setIcon(R.drawable.search_ghosted_dark);
-                            torSearchCustomURLPreference.setIcon(R.drawable.search_custom_url_ghosted_dark);
+                            googleAnalyticsPreference.setIcon(R.drawable.modify_url_disabled_dark);
                         } else {
-                            proxyThroughOrbotPreference.setIcon(R.drawable.orbot_disabled_light);
-                            torHomepagePreference.setIcon(R.drawable.home_ghosted_light);
-                            torSearchPreference.setIcon(R.drawable.search_ghosted_light);
-                            torSearchCustomURLPreference.setIcon(R.drawable.search_custom_url_ghosted_light);
+                            googleAnalyticsPreference.setIcon(R.drawable.modify_url_disabled_light);
                         }
                     }
                     break;
 
-                case "tor_homepage":
-                    // 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", getString(R.string.tor_search_default_value));
-
-                    // Update the preferences.
-                    if (presentTorSearchString.equals("Custom URL")) {
-                        // Use `R.string.custom_url`, which is translated, as the summary instead of the array value, which isn't.
-                        torSearchPreference.setSummary(R.string.custom_url);
-
-                        // Enable `torSearchCustomURLPreference`.
-                        torSearchCustomURLPreference.setEnabled(true);
-
-                        // Update the `torSearchCustomURLPreference` icon.
+                case "facebook_click_ids":
+                    // Update the icon.
+                    if (sharedPreferences.getBoolean("facebook_click_ids", true)) {
                         if (darkTheme) {
-                            torSearchCustomURLPreference.setIcon(R.drawable.search_custom_url_enabled_dark);
+                            facebookClickIdsPreference.setIcon(R.drawable.modify_url_enabled_dark);
                         } else {
-                            torSearchCustomURLPreference.setIcon(R.drawable.search_custom_url_enabled_light);
+                            facebookClickIdsPreference.setIcon(R.drawable.modify_url_enabled_light);
                         }
                     } else {
-                        // Set the array value as the summary text.
-                        torSearchPreference.setSummary(presentTorSearchString);
-
-                        // Disable `torSearchCustomURLPreference`.
-                        torSearchCustomURLPreference.setEnabled(false);
-
-                        // Update the `torSearchCustomURLPreference` icon.
                         if (darkTheme) {
-                            torSearchCustomURLPreference.setIcon(R.drawable.search_custom_url_ghosted_dark);
+                            facebookClickIdsPreference.setIcon(R.drawable.modify_url_disabled_dark);
                         } else {
-                            torSearchCustomURLPreference.setIcon(R.drawable.search_custom_url_ghosted_light);
+                            facebookClickIdsPreference.setIcon(R.drawable.modify_url_disabled_light);
                         }
                     }
                     break;
 
-                case "tor_search_custom_url":
-                    // Set the summary text for `tor_search_custom_url`.
-                    torSearchCustomURLPreference.setSummary(sharedPreferences.getString("tor_search_custom_url", getString(R.string.tor_search_custom_url_default_value)));
+                case "twitter_amp_redirects":
+                    // Update the icon.
+                    if (sharedPreferences.getBoolean("twitter_amp_redirects", true)) {
+                        if (darkTheme) {
+                            twitterAmpRedirectsPreference.setIcon(R.drawable.modify_url_enabled_dark);
+                        } else {
+                            twitterAmpRedirectsPreference.setIcon(R.drawable.modify_url_enabled_light);
+                        }
+                    } else {
+                        if (darkTheme) {
+                            twitterAmpRedirectsPreference.setIcon(R.drawable.modify_url_disabled_dark);
+                        } else {
+                            twitterAmpRedirectsPreference.setIcon(R.drawable.modify_url_disabled_light);
+                        }
+                    }
                     break;
 
                 case "search":
@@ -1242,6 +1355,81 @@ public class SettingsFragment extends PreferenceFragment {
                     searchCustomURLPreference.setSummary(sharedPreferences.getString("search_custom_url", getString(R.string.search_custom_url_default_value)));
                     break;
 
+                case "proxy":
+                    // Get current proxy string.
+                    String currentProxyString = sharedPreferences.getString("proxy", getString(R.string.proxy_default_value));
+
+                    // Update the summary text for the proxy preference.
+                    switch (currentProxyString) {
+                        case ProxyHelper.NONE:
+                            proxyPreference.setSummary(getString(R.string.no_proxy_enabled));
+                            break;
+
+                        case ProxyHelper.TOR:
+                            if (Build.VERSION.SDK_INT == 19) {  // Proxying through SOCKS doesn't work on Android KitKat.
+                                proxyPreference.setSummary(getString(R.string.tor_enabled_kitkat));
+                            } else {
+                                proxyPreference.setSummary(getString(R.string.tor_enabled));
+                            }
+                            break;
+
+                        case ProxyHelper.I2P:
+                            proxyPreference.setSummary(getString(R.string.i2p_enabled));
+                            break;
+
+                        case ProxyHelper.CUSTOM:
+                            proxyPreference.setSummary(getString(R.string.custom_proxy));
+                            break;
+                    }
+
+                    // Update the status of the custom URL preference.
+                    proxyCustomUrlPreference.setEnabled(currentProxyString.equals("Custom"));
+
+                    // Update the icons.
+                    if (currentProxyString.equals("None")) {  // Proxying is disabled.
+                        if (darkTheme) {  // Dark theme.
+                            // Set the main proxy icon to be disabled
+                            proxyPreference.setIcon(R.drawable.proxy_disabled_dark);
+
+                            // Set the custom proxy URL icon to be ghosted.
+                            proxyCustomUrlPreference.setIcon(R.drawable.proxy_ghosted_dark);
+                        } else {  // Light theme.
+                            // Set the main proxy icon to be disabled.
+                            proxyPreference.setIcon(R.drawable.proxy_disabled_light);
+
+                            // Set the custom proxy URL icon to be ghosted.
+                            proxyCustomUrlPreference.setIcon(R.drawable.proxy_ghosted_light);
+                        }
+                    } else {  // Proxying is enabled.
+                        if (darkTheme) {  // Dark theme.
+                            // Set the main proxy icon to be enabled.
+                            proxyPreference.setIcon(R.drawable.proxy_enabled_dark);
+
+                            /// Set the custom proxy URL icon according to its status.
+                            if (proxyCustomUrlPreference.isEnabled()) {  // Custom proxy is enabled.
+                                proxyCustomUrlPreference.setIcon(R.drawable.proxy_enabled_dark);
+                            } else {  // Custom proxy is disabled.
+                                proxyCustomUrlPreference.setIcon(R.drawable.proxy_ghosted_dark);
+                            }
+                        } else {  // Light theme.
+                            // Set the main proxy icon to be enabled.
+                            proxyPreference.setIcon(R.drawable.proxy_enabled_light);
+
+                            // Set the custom proxy URL icon according to its status.
+                            if (proxyCustomUrlPreference.isEnabled()) {  // Custom proxy is enabled.
+                                proxyCustomUrlPreference.setIcon(R.drawable.proxy_enabled_light);
+                            } else {  // Custom proxy is disabled.
+                                proxyCustomUrlPreference.setIcon(R.drawable.proxy_ghosted_light);
+                            }
+                        }
+                    }
+                    break;
+
+                case "proxy_custom_url":
+                    // Set the summary text for the proxy custom URL.
+                    proxyCustomUrlPreference.setSummary(sharedPreferences.getString("proxy_custom_url", getString(R.string.proxy_custom_url_default_value)));
+                    break;
+
                 case "full_screen_browsing_mode":
                     if (sharedPreferences.getBoolean("full_screen_browsing_mode", false)) {  // Full screen browsing is enabled.
                         // Set the full screen browsing mode preference icon according to the theme.
@@ -1426,7 +1614,7 @@ public class SettingsFragment extends PreferenceFragment {
 
                 case "font_size":
                     // Update the font size summary text.
-                    fontSizePreference.setSummary(sharedPreferences.getString("font_size", getString(R.string.font_size_default_value)) + "%%");
+                    fontSizePreference.setSummary(sharedPreferences.getString("font_size", getString(R.string.font_size_default_value)) + "%");
                     break;
 
                 case "open_intents_in_new_tab":
@@ -1543,8 +1731,8 @@ public class SettingsFragment extends PreferenceFragment {
                         System.exit(0);
                     };
 
-                    // Restart the activity after 100 milliseconds, so that the app has enough time to save the change to the preference.
-                    changeThemeRestartHandler.postDelayed(changeThemeRestartRunnable, 100);
+                    // Restart the activity after 150 milliseconds, so that the app has enough time to save the change to the preference.
+                    changeThemeRestartHandler.postDelayed(changeThemeRestartRunnable, 150);
                     break;
 
                 case "night_mode":
@@ -1598,16 +1786,32 @@ public class SettingsFragment extends PreferenceFragment {
                     }
                     break;
 
+                case "wide_viewport":
+                    // Update the icon.
+                    if (sharedPreferences.getBoolean("wide_viewport", true)) {
+                        if (darkTheme) {
+                            wideViewportPreference.setIcon(R.drawable.wide_viewport_enabled_dark);
+                        } else {
+                            wideViewportPreference.setIcon(R.drawable.wide_viewport_enabled_light);
+                        }
+                    } else {
+                        if (darkTheme) {
+                            wideViewportPreference.setIcon(R.drawable.wide_viewport_disabled_dark);
+                        } else {
+                            wideViewportPreference.setIcon(R.drawable.wide_viewport_disabled_light);
+                        }
+                    }
+                    break;
+
                 case "display_webpage_images":
+                    // Update the icon.
                     if (sharedPreferences.getBoolean("display_webpage_images", true)) {
-                        // Update the icon.
                         if (darkTheme) {
                             displayWebpageImagesPreference.setIcon(R.drawable.images_enabled_dark);
                         } else {
                             displayWebpageImagesPreference.setIcon(R.drawable.images_enabled_light);
                         }
                     } else {
-                        // Update the icon.
                         if (darkTheme) {
                             displayWebpageImagesPreference.setIcon(R.drawable.images_disabled_dark);
                         } else {
@@ -1634,4 +1838,4 @@ public class SettingsFragment extends PreferenceFragment {
         super.onResume();
         savedPreferences.registerOnSharedPreferenceChangeListener(preferencesListener);
     }
-}
+}
\ No newline at end of file