X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Ffragments%2FSettingsFragment.java;h=16ca2998ca88e379359534641808ae4f40bf4e3d;hp=c22da979983282c4ef40409db5ff6e17d954d9e5;hb=01d647c09b892384e0b42e86b000b5cb858f7a2b;hpb=f0393ca22075be3e5fe9199c7db87381256236fa diff --git a/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java b/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java index c22da979..16ca2998 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java +++ b/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java @@ -20,100 +20,153 @@ 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.preference.Preference; -import android.preference.PreferenceCategory; -import android.preference.PreferenceFragment; +import android.os.Handler; 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(); // 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"); - final Preference doNotTrackPreference = findPreference("do_not_track"); - final Preference allowScreenshotsPreference = findPreference("allow_screenshots"); - final Preference easyListPreference = findPreference("easylist"); - final Preference easyPrivacyPreference = findPreference("easyprivacy"); - 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"); - final Preference torSearchCustomURLPreference = findPreference("tor_search_custom_url"); - final Preference searchPreference = findPreference("search"); - final Preference searchCustomURLPreference = findPreference("search_custom_url"); - final Preference fullScreenBrowsingModePreference = findPreference("full_screen_browsing_mode"); - final Preference hideAppBarPreference = findPreference("hide_app_bar"); - 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"); // 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 fontSizePreference = findPreference("font_size"); - final Preference swipeToRefreshPreference = findPreference("swipe_to_refresh"); - final Preference scrollAppBarPreference = findPreference("scroll_app_bar"); - final Preference displayAdditionalAppBarIconsPreference = findPreference("display_additional_app_bar_icons"); - final Preference downloadWithExternalAppPreference = findPreference("download_with_external_app"); - final Preference darkThemePreference = findPreference("dark_theme"); - final Preference nightModePreference = findPreference("night_mode"); - final Preference displayWebpageImagesPreference = findPreference("display_webpage_images"); - - // Set dependencies. - torHomepagePreference.setDependency("proxy_through_orbot"); - torSearchPreference.setDependency("proxy_through_orbot"); + Preference javaScriptPreference = findPreference("javascript"); + Preference firstPartyCookiesPreference = findPreference("first_party_cookies"); + Preference thirdPartyCookiesPreference = findPreference("third_party_cookies"); + Preference domStoragePreference = findPreference("dom_storage"); + 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"); + Preference doNotTrackPreference = findPreference("do_not_track"); + Preference allowScreenshotsPreference = findPreference("allow_screenshots"); + Preference easyListPreference = findPreference("easylist"); + 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 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"); + Preference clearCookiesPreference = findPreference("clear_cookies"); + Preference clearDomStoragePreference = findPreference("clear_dom_storage"); + Preference clearFormDataPreference = findPreference("clear_form_data"); // The clear form data preference can be removed once the minimum API >= 26. + Preference clearCachePreference = findPreference("clear_cache"); + Preference homepagePreference = findPreference("homepage"); + Preference fontSizePreference = findPreference("font_size"); + Preference openIntentsInNewTabPreference = findPreference("open_intents_in_new_tab"); + Preference swipeToRefreshPreference = findPreference("swipe_to_refresh"); + Preference scrollAppBarPreference = findPreference("scroll_app_bar"); + Preference displayAdditionalAppBarIconsPreference = findPreference("display_additional_app_bar_icons"); + 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"); + + // 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. - final boolean javaScriptEnabled = savedPreferences.getBoolean("javascript", false); + 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 clearEverything = savedPreferences.getBoolean("clear_everything", true); boolean darkTheme = savedPreferences.getBoolean("dark_theme", false); - final boolean nightMode = savedPreferences.getBoolean("night_mode", false); + boolean nightMode = savedPreferences.getBoolean("night_mode", false); // Only enable the third-party cookies preference if first-party cookies are enabled and API >= 21. thirdPartyCookiesPreference.setEnabled(firstPartyCookiesEnabled && (Build.VERSION.SDK_INT >= 21)); @@ -124,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); } @@ -139,7 +196,7 @@ public class SettingsFragment extends PreferenceFragment { LayoutInflater inflater = getActivity().getLayoutInflater(); // `@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); + WebView bareWebView = bareWebViewLayout.findViewById(R.id.bare_webview); // Get the user agent arrays. ArrayAdapter userAgentNamesArray = ArrayAdapter.createFromResource(context, R.array.user_agent_names, R.layout.spinner_item); @@ -178,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. @@ -212,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); @@ -222,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); @@ -286,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); } } } @@ -425,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) { @@ -455,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 { + facebookClickIdsPreference.setIcon(R.drawable.modify_url_enabled_light); + } + } else { + if (darkTheme) { + facebookClickIdsPreference.setIcon(R.drawable.modify_url_disabled_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_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); } } @@ -509,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. @@ -602,6 +727,21 @@ public class SettingsFragment extends PreferenceFragment { clearCachePreference.setIcon(R.drawable.cache_warning); } + // Set the open intents in new tab preference icon. + if (savedPreferences.getBoolean("open_intents_in_new_tab", true)) { + if (darkTheme) { + openIntentsInNewTabPreference.setIcon(R.drawable.tab_enabled_dark); + } else { + openIntentsInNewTabPreference.setIcon(R.drawable.tab_enabled_light); + } + } else { + if (darkTheme) { + openIntentsInNewTabPreference.setIcon(R.drawable.tab_disabled_dark); + } else { + openIntentsInNewTabPreference.setIcon(R.drawable.tab_disabled_light); + } + } + // Set the swipe to refresh preference icon. if (savedPreferences.getBoolean("swipe_to_refresh", true)) { if (darkTheme) { @@ -684,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) { @@ -812,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; @@ -942,11 +1097,23 @@ public class SettingsFragment extends PreferenceFragment { // Assert that the intent is not null to remove the lint error below. assert allowScreenshotsRestartIntent != null; - // `Intent.FLAG_ACTIVITY_CLEAR_TASK` removes all activities from the stack. It requires `Intent.FLAG_ACTIVITY_NEW_TASK`. TODO. + // `Intent.FLAG_ACTIVITY_CLEAR_TASK` removes all activities from the stack. It requires `Intent.FLAG_ACTIVITY_NEW_TASK`. allowScreenshotsRestartIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - // Make it so. - startActivity(allowScreenshotsRestartIntent); + // Create a handler to restart the activity. + Handler allowScreenshotsRestartHandler = new Handler(); + + // Create a runnable to restart the activity. + Runnable allowScreenshotsRestartRunnable = () -> { + // Restart the activity. + startActivity(allowScreenshotsRestartIntent); + + // Kill this instance of Privacy Browser. Otherwise, the app exhibits sporadic behavior after the restart. + System.exit(0); + }; + + // 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": @@ -1047,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)) { @@ -1081,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": @@ -1213,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. @@ -1397,7 +1614,24 @@ 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": + // Update the icon. + if (sharedPreferences.getBoolean("open_intents_in_new_tab", true)) { + if (darkTheme) { + openIntentsInNewTabPreference.setIcon(R.drawable.tab_enabled_dark); + } else { + openIntentsInNewTabPreference.setIcon(R.drawable.tab_enabled_light); + } + } else { + if (darkTheme) { + openIntentsInNewTabPreference.setIcon(R.drawable.tab_disabled_dark); + } else { + openIntentsInNewTabPreference.setIcon(R.drawable.tab_disabled_light); + } + } break; case "swipe_to_refresh": @@ -1482,17 +1716,26 @@ public class SettingsFragment extends PreferenceFragment { // Assert that the intent is not null to remove the lint error below. assert changeThemeRestartIntent != null; - // `Intent.FLAG_ACTIVITY_CLEAR_TASK` removes all activities from the stack. It requires `Intent.FLAG_ACTIVITY_NEW_TASK`. TODO. + // `Intent.FLAG_ACTIVITY_CLEAR_TASK` removes all activities from the stack. It requires `Intent.FLAG_ACTIVITY_NEW_TASK`. changeThemeRestartIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - // Make it so. - startActivity(changeThemeRestartIntent); + // Create a handler to restart the activity. + Handler changeThemeRestartHandler = new Handler(); + + // Create a runnable to restart the activity. + Runnable changeThemeRestartRunnable = () -> { + // Restart the activity. + startActivity(changeThemeRestartIntent); + + // Kill this instance of Privacy Browser. Otherwise, the app exhibits sporadic behavior after the restart. + System.exit(0); + }; + + // 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": - // Set the URL to be reloaded on restart to apply the new night mode setting. - MainWebViewActivity.reloadOnRestart = true; - // Store the current night mode status. boolean currentNightModeBoolean = sharedPreferences.getBoolean("night_mode", false); boolean currentJavaScriptBoolean = sharedPreferences.getBoolean("javascript", false); @@ -1543,27 +1786,37 @@ 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); } - - // `mainWebView` does not need to be reloaded because unloaded images will load automatically. - MainWebViewActivity.reloadOnRestart = false; } else { - // Update the icon. if (darkTheme) { displayWebpageImagesPreference.setIcon(R.drawable.images_disabled_dark); } else { displayWebpageImagesPreference.setIcon(R.drawable.images_disabled_light); } - - // Set `mainWebView` to reload on restart to remove the current images. - MainWebViewActivity.reloadOnRestart = true; } break; } @@ -1585,4 +1838,4 @@ public class SettingsFragment extends PreferenceFragment { super.onResume(); savedPreferences.registerOnSharedPreferenceChangeListener(preferencesListener); } -} +} \ No newline at end of file