/*
- * Copyright © 2016-2019 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2016-2020 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
*
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import com.stoutner.privacybrowser.R;
import com.stoutner.privacybrowser.activities.MainWebViewActivity;
+import com.stoutner.privacybrowser.helpers.DownloadLocationHelper;
import com.stoutner.privacybrowser.helpers.ProxyHelper;
public class SettingsFragment extends PreferenceFragmentCompat {
Preference searchPreference = findPreference("search");
Preference searchCustomURLPreference = findPreference("search_custom_url");
Preference proxyPreference = findPreference("proxy");
- Preference proxyCustomHostPreference = findPreference("proxy_custom_host");
- Preference proxyCustomPortPreference = findPreference("proxy_custom_port");
+ 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 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 downloadLocationPreference = findPreference("download_location");
+ Preference downloadCustomLocationPreference = findPreference("download_custom_location");
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");
assert searchPreference != null;
assert searchCustomURLPreference != null;
assert proxyPreference != null;
- assert proxyCustomHostPreference != null;
- assert proxyCustomPortPreference != null;
+ assert proxyCustomUrlPreference != null;
assert fullScreenBrowsingModePreference != null;
assert hideAppBarPreference != null;
assert clearEverythingPreference != null;
assert clearFormDataPreference != null;
assert clearCachePreference != null;
assert homepagePreference != null;
+ assert downloadLocationPreference != null;
+ assert downloadCustomLocationPreference != 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;
hideAppBarPreference.setDependency("full_screen_browsing_mode");
// Get strings from the preferences.
+ String userAgentName = savedPreferences.getString("user_agent", getString(R.string.user_agent_default_value));
String searchString = savedPreferences.getString("search", getString(R.string.search_default_value));
String proxyString = savedPreferences.getString("proxy", getString(R.string.proxy_default_value));
+ String downloadLocationString = savedPreferences.getString("download_location", getString(R.string.download_location_default_value));
// Get booleans that are used in multiple places from the preferences.
boolean javaScriptEnabled = savedPreferences.getBoolean("javascript", false);
// Only enable Fanboy's social blocking list preference if Fanboy's annoyance list is disabled.
fanboySocialBlockingListPreference.setEnabled(!fanboyAnnoyanceListEnabled);
+
// 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 the `bare_webview` will not be displayed.
@SuppressLint("InflateParams") View bareWebViewLayout = inflater.inflate(R.layout.bare_webview, null, false);
+
+ // Get a handle for a bare WebView.
WebView bareWebView = bareWebViewLayout.findViewById(R.id.bare_webview);
// Get the user agent arrays.
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", getString(R.string.user_agent_default_value));
-
// Get the array position of the user agent name.
int userAgentArrayPosition = userAgentNamesArray.getPosition(userAgentName);
userAgentPreference.setSummary(translatedUserAgentNamesArray[userAgentArrayPosition] + ":\n" + userAgentDataArray[userAgentArrayPosition]);
}
- // Set the summary text for the custom user agent preference and enable it if user agent preference is set to custom.
+ // Set the summary text for the custom user agent preference.
customUserAgentPreference.setSummary(savedPreferences.getString("custom_user_agent", getString(R.string.custom_user_agent_default_value)));
+
+ // Only enable the custom user agent preference if the user agent is set to `Custom`.
customUserAgentPreference.setEnabled(userAgentPreference.getSummary().equals(getString(R.string.custom_user_agent)));
+
// 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(searchString);
}
- // Set the summary text for `search_custom_url` (the default is `""`) and enable it if `search` is set to `Custom URL`.
+ // Set the summary text for the search custom URL (the default is `""`).
searchCustomURLPreference.setSummary(savedPreferences.getString("search_custom_url", getString(R.string.search_custom_url_default_value)));
+
+ // Only enable the search custom URL preference if the search is set to `Custom URL`.
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:
break;
case ProxyHelper.TOR:
- proxyPreference.setSummary(getString(R.string.tor_enabled));
+ 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:
break;
}
- // Only enable the custom proxy options if a custom proxy is selected.
- proxyCustomHostPreference.setEnabled(proxyString.equals("Custom"));
- proxyCustomPortPreference.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)));
+
+ // 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 options.
- proxyCustomHostPreference.setSummary(savedPreferences.getString("proxy_custom_host", getString(R.string.proxy_custom_host_default_value)));
- proxyCustomPortPreference.setSummary(savedPreferences.getString("proxy_custom_port", getString(R.string.proxy_custom_port_default_value)));
// Set the status of the Clear and Exit preferences.
clearCookiesPreference.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", getString(R.string.homepage_default_value)));
+
+ // Instantiate the download location helper.
+ DownloadLocationHelper downloadLocationHelper = new DownloadLocationHelper();
+
+ // Set the download location summary text.
+ downloadLocationPreference.setSummary(downloadLocationHelper.getDownloadLocation(context));
+
+ // Set the summary text for the download custom location (the default is `"`).
+ downloadCustomLocationPreference.setSummary(savedPreferences.getString("download_custom_location", getString(R.string.download_custom_location_default_value)));
+
+ // Get the download location entry values string array.
+ String[] downloadLocationEntryValuesStringArray = context.getResources().getStringArray(R.array.download_location_entry_values);
+
+ // Only enable the download custom location preference if the download location is set to `Custom`.
+ downloadCustomLocationPreference.setEnabled(downloadLocationString.equals(downloadLocationEntryValuesStringArray[3]));
+
+
// 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);
// Set the main proxy icon to be disabled.
proxyPreference.setIcon(R.drawable.proxy_disabled_dark);
- // Set the custom proxy icons to be ghosted.
- proxyCustomHostPreference.setIcon(R.drawable.proxy_ghosted_dark);
- proxyCustomPortPreference.setIcon(R.drawable.proxy_ghosted_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 icons to be ghosted.
- proxyCustomHostPreference.setIcon(R.drawable.proxy_ghosted_light);
- proxyCustomPortPreference.setIcon(R.drawable.proxy_ghosted_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 icons according to their status.
- if (proxyCustomHostPreference.isEnabled()) { // Custom proxy is enabled.
- proxyCustomHostPreference.setIcon(R.drawable.proxy_enabled_dark);
- proxyCustomPortPreference.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.
- proxyCustomHostPreference.setIcon(R.drawable.proxy_ghosted_dark);
- proxyCustomPortPreference.setIcon(R.drawable.proxy_ghosted_dark);
+ 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 icons according to their status.
- if (proxyCustomHostPreference.isEnabled()) { // Custom proxy is enabled.
- proxyCustomHostPreference.setIcon(R.drawable.proxy_enabled_light);
- proxyCustomPortPreference.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.
- proxyCustomHostPreference.setIcon(R.drawable.proxy_ghosted_light);
- proxyCustomPortPreference.setIcon(R.drawable.proxy_ghosted_light);
+ proxyCustomUrlPreference.setIcon(R.drawable.proxy_ghosted_light);
}
}
}
clearCachePreference.setIcon(R.drawable.cache_warning);
}
+ // Set the download custom location icon.
+ if (downloadCustomLocationPreference.isEnabled()) {
+ if (darkTheme) {
+ downloadCustomLocationPreference.setIcon(R.drawable.downloads_enabled_dark);
+ } else {
+ downloadCustomLocationPreference.setIcon(R.drawable.downloads_enabled_light);
+ }
+ } else {
+ if (darkTheme) {
+ downloadCustomLocationPreference.setIcon(R.drawable.downloads_ghosted_dark);
+ } else {
+ downloadCustomLocationPreference.setIcon(R.drawable.downloads_ghosted_light);
+ }
+ }
+
// Set the open intents in new tab preference icon.
if (savedPreferences.getBoolean("open_intents_in_new_tab", true)) {
if (darkTheme) {
}
}
- // Set the download with external app preference icon.
- if (savedPreferences.getBoolean("download_with_external_app", false)) {
- if (darkTheme) {
- downloadWithExternalAppPreference.setIcon(R.drawable.open_with_external_app_enabled_dark);
- } else {
- downloadWithExternalAppPreference.setIcon(R.drawable.open_with_external_app_enabled_light);
- }
- } else {
- if (darkTheme) {
- downloadWithExternalAppPreference.setIcon(R.drawable.open_with_external_app_disabled_dark);
- } else {
- downloadWithExternalAppPreference.setIcon(R.drawable.open_with_external_app_disabled_light);
- }
- }
-
// Set the dark theme preference icon.
if (savedPreferences.getBoolean("dark_theme", false)) {
darkThemePreference.setIcon(R.drawable.theme_dark);
// Store the new search string.
String newSearchString = sharedPreferences.getString("search", getString(R.string.search_default_value));
- // Update `searchPreference` and `searchCustomURLPreference`.
+ // Update the search and search custom URL preferences.
if (newSearchString.equals("Custom URL")) { // `Custom URL` is selected.
// Set the summary text to `R.string.custom_url`, which is translated.
searchPreference.setSummary(R.string.custom_url);
break;
case "search_custom_url":
- // Set the new custom search URL as the summary text for `search_custom_url`. The default is `""`.
+ // Set the new search custom URL as the summary text for the preference.
searchCustomURLPreference.setSummary(sharedPreferences.getString("search_custom_url", getString(R.string.search_custom_url_default_value)));
break;
break;
case ProxyHelper.TOR:
- proxyPreference.setSummary(getString(R.string.tor_enabled));
+ 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:
break;
}
- // Update the status of the custom proxy options.
- proxyCustomHostPreference.setEnabled(currentProxyString.equals("Custom"));
- proxyCustomPortPreference.setEnabled(currentProxyString.equals("Custom"));
+ // Update the status of the custom URL preference.
+ proxyCustomUrlPreference.setEnabled(currentProxyString.equals("Custom"));
// Update the icons.
if (currentProxyString.equals("None")) { // Proxying is disabled.
// Set the main proxy icon to be disabled
proxyPreference.setIcon(R.drawable.proxy_disabled_dark);
- // Set the custom proxy icons to be ghosted.
- proxyCustomHostPreference.setIcon(R.drawable.proxy_ghosted_dark);
- proxyCustomPortPreference.setIcon(R.drawable.proxy_ghosted_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 icons to be ghosted.
- proxyCustomHostPreference.setIcon(R.drawable.proxy_ghosted_light);
- proxyCustomPortPreference.setIcon(R.drawable.proxy_ghosted_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 icons according to their status.
- if (proxyCustomHostPreference.isEnabled()) { // Custom proxy is enabled.
- proxyCustomHostPreference.setIcon(R.drawable.proxy_enabled_dark);
- proxyCustomPortPreference.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.
- proxyCustomHostPreference.setIcon(R.drawable.proxy_ghosted_dark);
- proxyCustomPortPreference.setIcon(R.drawable.proxy_ghosted_dark);
+ 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 icons according to their status.
- if (proxyCustomHostPreference.isEnabled()) { // Custom proxy is enabled.
- proxyCustomHostPreference.setIcon(R.drawable.proxy_enabled_light);
- proxyCustomPortPreference.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.
- proxyCustomHostPreference.setIcon(R.drawable.proxy_ghosted_light);
- proxyCustomPortPreference.setIcon(R.drawable.proxy_ghosted_light);
+ proxyCustomUrlPreference.setIcon(R.drawable.proxy_ghosted_light);
}
}
}
break;
- case "proxy_custom_host":
- // Set the summary text for the proxy custom host.
- proxyCustomHostPreference.setSummary(sharedPreferences.getString("proxy_custom_host", getString(R.string.proxy_custom_host_default_value)));
+ 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 "proxy_custom_port":
- // Set the summary text for the proxy custom port.
- proxyCustomPortPreference.setSummary(sharedPreferences.getString("proxy_custom_port", getString(R.string.proxy_custom_port_default_value)));
-
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.
homepagePreference.setSummary(sharedPreferences.getString("homepage", getString(R.string.homepage_default_value)));
break;
+ case "download_location":
+ // Get the new download location.
+ String newDownloadLocationString = sharedPreferences.getString("download_location", getString(R.string.download_location_default_value));
+
+ // Update the download location summary text.
+ downloadLocationPreference.setSummary(downloadLocationHelper.getDownloadLocation(context));
+
+ // Update the status of the download custom location preference.
+ downloadCustomLocationPreference.setEnabled(newDownloadLocationString.equals(downloadLocationEntryValuesStringArray[3]));
+
+ // Update the download custom location icon.
+ if (downloadCustomLocationPreference.isEnabled()) {
+ if (darkTheme) {
+ downloadCustomLocationPreference.setIcon(R.drawable.downloads_enabled_dark);
+ } else {
+ downloadCustomLocationPreference.setIcon(R.drawable.downloads_enabled_light);
+ }
+ } else {
+ if (darkTheme) {
+ downloadCustomLocationPreference.setIcon(R.drawable.downloads_ghosted_dark);
+ } else {
+ downloadCustomLocationPreference.setIcon(R.drawable.downloads_ghosted_light);
+ }
+ }
+ break;
+
+ case "download_custom_location":
+ // Set the new download custom location as the summary text for the preference.
+ downloadCustomLocationPreference.setSummary(sharedPreferences.getString("download_custom_location", getString(R.string.download_custom_location_default_value)));
+ break;
+
case "font_size":
// Update the font size summary text.
fontSizePreference.setSummary(sharedPreferences.getString("font_size", getString(R.string.font_size_default_value)) + "%");
}
break;
- case "download_with_external_app":
- // Update the icon.
- if (sharedPreferences.getBoolean("download_with_external_app", false)) {
- if (darkTheme) {
- downloadWithExternalAppPreference.setIcon(R.drawable.open_with_external_app_enabled_dark);
- } else {
- downloadWithExternalAppPreference.setIcon(R.drawable.open_with_external_app_enabled_light);
- }
- } else {
- if (darkTheme) {
- downloadWithExternalAppPreference.setIcon(R.drawable.open_with_external_app_disabled_dark);
- } else {
- downloadWithExternalAppPreference.setIcon(R.drawable.open_with_external_app_disabled_light);
- }
- }
- break;
-
case "dark_theme":
// Update the icon.
if (sharedPreferences.getBoolean("dark_theme", false)) {