X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Ffragments%2FDomainSettingsFragment.java;h=ad6653c5387644b7d4fec5f39d3d9d70a9700bf0;hp=dd1385956d5afa1f87473537bf12a5789b1e02d4;hb=4ecc3c256e439e7779d1db4d84800a6b2f9b13e6;hpb=96cf5fae34ebc2ae7ca05322837a859943e19ba0 diff --git a/app/src/main/java/com/stoutner/privacybrowser/fragments/DomainSettingsFragment.java b/app/src/main/java/com/stoutner/privacybrowser/fragments/DomainSettingsFragment.java index dd138595..ad6653c5 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/fragments/DomainSettingsFragment.java +++ b/app/src/main/java/com/stoutner/privacybrowser/fragments/DomainSettingsFragment.java @@ -27,7 +27,7 @@ import android.database.Cursor; import android.net.http.SslCertificate; import android.os.Build; import android.os.Bundle; -// We have to use `android.support.v4.app.Fragment` until minimum API >= 23. Otherwise we cannot call `getContext()`. +// `android.support.v4.app.Fragment` must be used until minimum API >= 23. Otherwise `getContext()` does not work. import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; @@ -95,8 +95,9 @@ public class DomainSettingsFragment extends Fragment { final String defaultUserAgentName = sharedPreferences.getString("user_agent", "Privacy Browser"); final String defaultCustomUserAgentString = sharedPreferences.getString("custom_user_agent", "PrivacyBrowser/1.0"); String defaultFontSizeString = sharedPreferences.getString("default_font_size", "100"); - final boolean defaultDisplayWebpageImagesBoolean = sharedPreferences.getBoolean("display_website_images", true); - final boolean defaultNightModeBoolean = sharedPreferences.getBoolean("night_mode", false); + boolean defaultSwipeToRefresh = sharedPreferences.getBoolean("swipe_to_refresh", true); + final boolean defaultNightMode = sharedPreferences.getBoolean("night_mode", false); + final boolean defaultDisplayWebpageImages = sharedPreferences.getBoolean("display_webpage_images", true); // Get handles for the views in the fragment. final EditText domainNameEditText = domainSettingsView.findViewById(R.id.domain_settings_name_edittext); @@ -109,8 +110,8 @@ public class DomainSettingsFragment extends Fragment { final ImageView thirdPartyCookiesImageView = domainSettingsView.findViewById(R.id.domain_settings_third_party_cookies_imageview); final Switch domStorageEnabledSwitch = domainSettingsView.findViewById(R.id.domain_settings_dom_storage_switch); final ImageView domStorageImageView = domainSettingsView.findViewById(R.id.domain_settings_dom_storage_imageview); - Switch formDataEnabledSwitch = domainSettingsView.findViewById(R.id.domain_settings_form_data_switch); - final ImageView formDataImageView = domainSettingsView.findViewById(R.id.domain_settings_form_data_imageview); + Switch formDataEnabledSwitch = domainSettingsView.findViewById(R.id.domain_settings_form_data_switch); // The form data views can be remove once the minimum API >= 26. + final ImageView formDataImageView = domainSettingsView.findViewById(R.id.domain_settings_form_data_imageview); // The form data views can be remove once the minimum API >= 26. Switch easyListSwitch = domainSettingsView.findViewById(R.id.domain_settings_easylist_switch); ImageView easyListImageView = domainSettingsView.findViewById(R.id.domain_settings_easylist_imageview); Switch easyPrivacySwitch = domainSettingsView.findViewById(R.id.domain_settings_easyprivacy_switch); @@ -119,17 +120,24 @@ public class DomainSettingsFragment extends Fragment { ImageView fanboysAnnoyanceListImageView = domainSettingsView.findViewById(R.id.domain_settings_fanboys_annoyance_list_imageview); Switch fanboysSocialBlockingListSwitch = domainSettingsView.findViewById(R.id.domain_settings_fanboys_social_blocking_list_switch); ImageView fanboysSocialBlockingListImageView = domainSettingsView.findViewById(R.id.domain_settings_fanboys_social_blocking_list_imageview); + Switch ultraPrivacySwitch = domainSettingsView.findViewById(R.id.domain_settings_ultraprivacy_switch); + ImageView ultraPrivacyImageView = domainSettingsView.findViewById(R.id.domain_settings_ultraprivacy_imageview); + Switch blockAllThirdPartyRequestsSwitch = domainSettingsView.findViewById(R.id.domain_settings_block_all_third_party_requests_switch); + ImageView blockAllThirdPartyRequestsImageView = domainSettingsView.findViewById(R.id.domain_settings_block_all_third_party_requests_imageview); final Spinner userAgentSpinner = domainSettingsView.findViewById(R.id.domain_settings_user_agent_spinner); final TextView userAgentTextView = domainSettingsView.findViewById(R.id.domain_settings_user_agent_textview); final EditText customUserAgentEditText = domainSettingsView.findViewById(R.id.domain_settings_custom_user_agent_edittext); final Spinner fontSizeSpinner = domainSettingsView.findViewById(R.id.domain_settings_font_size_spinner); final TextView fontSizeTextView = domainSettingsView.findViewById(R.id.domain_settings_font_size_textview); - final ImageView displayWebpageImagesImageView = domainSettingsView.findViewById(R.id.domain_settings_display_webpage_images_imageview); - final Spinner displayWebpageImagesSpinner = domainSettingsView.findViewById(R.id.domain_settings_display_webpage_images_spinner); - final TextView displayImagesTextView = domainSettingsView.findViewById(R.id.domain_settings_display_webpage_images_textview); + final ImageView swipeToRefreshImageView = domainSettingsView.findViewById(R.id.domain_settings_swipe_to_refresh_imageview); + final Spinner swipeToRefreshSpinner = domainSettingsView.findViewById(R.id.domain_settings_swipe_to_refresh_spinner); + final TextView swipeToRefreshTextView = domainSettingsView.findViewById(R.id.domain_settings_swipe_to_refresh_textview); final ImageView nightModeImageView = domainSettingsView.findViewById(R.id.domain_settings_night_mode_imageview); final Spinner nightModeSpinner = domainSettingsView.findViewById(R.id.domain_settings_night_mode_spinner); final TextView nightModeTextView = domainSettingsView.findViewById(R.id.domain_settings_night_mode_textview); + final ImageView displayWebpageImagesImageView = domainSettingsView.findViewById(R.id.domain_settings_display_webpage_images_imageview); + final Spinner displayWebpageImagesSpinner = domainSettingsView.findViewById(R.id.domain_settings_display_webpage_images_spinner); + final TextView displayImagesTextView = domainSettingsView.findViewById(R.id.domain_settings_display_webpage_images_textview); final ImageView pinnedSslCertificateImageView = domainSettingsView.findViewById(R.id.domain_settings_pinned_ssl_certificate_imageview); Switch pinnedSslCertificateSwitch = domainSettingsView.findViewById(R.id.domain_settings_pinned_ssl_certificate_switch); final LinearLayout savedSslCertificateLinearLayout = domainSettingsView.findViewById(R.id.saved_ssl_certificate_linearlayout); @@ -177,15 +185,18 @@ public class DomainSettingsFragment extends Fragment { int firstPartyCookiesEnabledInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.ENABLE_FIRST_PARTY_COOKIES)); int thirdPartyCookiesEnabledInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.ENABLE_THIRD_PARTY_COOKIES)); final int domStorageEnabledInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.ENABLE_DOM_STORAGE)); - int formDataEnabledInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.ENABLE_FORM_DATA)); + int formDataEnabledInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.ENABLE_FORM_DATA)); // Form data can be remove once the minimum API >= 26. int easyListEnabledInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.ENABLE_EASYLIST)); int easyPrivacyEnabledInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.ENABLE_EASYPRIVACY)); int fanboysAnnoyanceListInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.ENABLE_FANBOYS_ANNOYANCE_LIST)); int fanboysSocialBlockingListInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.ENABLE_FANBOYS_SOCIAL_BLOCKING_LIST)); + int ultraPrivacyEnabledInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.ENABLE_ULTRAPRIVACY)); + int blockAllThirdPartyRequestsInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.BLOCK_ALL_THIRD_PARTY_REQUESTS)); final String currentUserAgentName = domainCursor.getString(domainCursor.getColumnIndex(DomainsDatabaseHelper.USER_AGENT)); int fontSizeInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.FONT_SIZE)); - int displayImagesInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.DISPLAY_IMAGES)); + int swipeToRefreshInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.SWIPE_TO_REFRESH)); int nightModeInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.NIGHT_MODE)); + int displayImagesInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.DISPLAY_IMAGES)); int pinnedSslCertificateInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.PINNED_SSL_CERTIFICATE)); final String savedSslCertificateIssuedToCNameString = domainCursor.getString(domainCursor.getColumnIndex(DomainsDatabaseHelper.SSL_ISSUED_TO_COMMON_NAME)); String savedSslCertificateIssuedToONameString = domainCursor.getString(domainCursor.getColumnIndex(DomainsDatabaseHelper.SSL_ISSUED_TO_ORGANIZATION)); @@ -207,26 +218,29 @@ public class DomainSettingsFragment extends Fragment { savedSslCertificateEndDate = new Date(domainCursor.getLong(domainCursor.getColumnIndex(DomainsDatabaseHelper.SSL_END_DATE))); } - // Create `ArrayAdapters` for the `Spinners`and their `entry values`. - ArrayAdapter translatedUserAgentArrayAdapter = ArrayAdapter.createFromResource(context, R.array.translated_domain_settings_user_agent_names, R.layout.domain_settings_spinner_item); - ArrayAdapter fontSizeArrayAdapter = ArrayAdapter.createFromResource(context, R.array.domain_settings_font_size_entries, R.layout.domain_settings_spinner_item); - ArrayAdapter fontSizeEntryValuesArrayAdapter = ArrayAdapter.createFromResource(context, R.array.domain_settings_font_size_entry_values, R.layout.domain_settings_spinner_item); - final ArrayAdapter displayImagesArrayAdapter = ArrayAdapter.createFromResource(context, R.array.display_webpage_images_array, R.layout.domain_settings_spinner_item); - ArrayAdapter nightModeArrayAdapter = ArrayAdapter.createFromResource(context, R.array.night_mode_array, R.layout.domain_settings_spinner_item); - - // Set the `DropDownViewResource` on the `Spinners`. - translatedUserAgentArrayAdapter.setDropDownViewResource(R.layout.domain_settings_spinner_dropdown_item); - fontSizeArrayAdapter.setDropDownViewResource(R.layout.domain_settings_spinner_dropdown_item); - displayImagesArrayAdapter.setDropDownViewResource(R.layout.domain_settings_spinner_dropdown_item); - nightModeArrayAdapter.setDropDownViewResource(R.layout.domain_settings_spinner_dropdown_item); - - // Set the `ArrayAdapters` for the `Spinners`. + // Create array adapters for the spinners. + ArrayAdapter translatedUserAgentArrayAdapter = ArrayAdapter.createFromResource(context, R.array.translated_domain_settings_user_agent_names, R.layout.spinner_item); + ArrayAdapter fontSizeArrayAdapter = ArrayAdapter.createFromResource(context, R.array.domain_settings_font_size_entries, R.layout.spinner_item); + ArrayAdapter fontSizeEntryValuesArrayAdapter = ArrayAdapter.createFromResource(context, R.array.domain_settings_font_size_entry_values, R.layout.spinner_item); + ArrayAdapter swipeToRefreshArrayAdapter = ArrayAdapter.createFromResource(context, R.array.swipe_to_refresh_array, R.layout.spinner_item); + ArrayAdapter nightModeArrayAdapter = ArrayAdapter.createFromResource(context, R.array.night_mode_array, R.layout.spinner_item); + ArrayAdapter displayImagesArrayAdapter = ArrayAdapter.createFromResource(context, R.array.display_webpage_images_array, R.layout.spinner_item); + + // Set the drop down view resource on the spinners. + translatedUserAgentArrayAdapter.setDropDownViewResource(R.layout.domain_settings_spinner_dropdown_items); + fontSizeArrayAdapter.setDropDownViewResource(R.layout.domain_settings_spinner_dropdown_items); + swipeToRefreshArrayAdapter.setDropDownViewResource(R.layout.domain_settings_spinner_dropdown_items); + nightModeArrayAdapter.setDropDownViewResource(R.layout.domain_settings_spinner_dropdown_items); + displayImagesArrayAdapter.setDropDownViewResource(R.layout.domain_settings_spinner_dropdown_items); + + // Set the array adapters for the spinners. userAgentSpinner.setAdapter(translatedUserAgentArrayAdapter); fontSizeSpinner.setAdapter(fontSizeArrayAdapter); - displayWebpageImagesSpinner.setAdapter(displayImagesArrayAdapter); + swipeToRefreshSpinner.setAdapter(swipeToRefreshArrayAdapter); nightModeSpinner.setAdapter(nightModeArrayAdapter); + displayWebpageImagesSpinner.setAdapter(displayImagesArrayAdapter); - // Create a `SpannableStringBuilder` for each `TextView` that needs multiple colors of text. + // Create a spannable string builder for each TextView that needs multiple colors of text. SpannableStringBuilder savedSslCertificateIssuedToCNameStringBuilder = new SpannableStringBuilder(cNameLabel + savedSslCertificateIssuedToCNameString); SpannableStringBuilder savedSslCertificateIssuedToONameStringBuilder = new SpannableStringBuilder(oNameLabel + savedSslCertificateIssuedToONameString); SpannableStringBuilder savedSslCertificateIssuedToUNameStringBuilder = new SpannableStringBuilder(uNameLabel + savedSslCertificateIssuedToUNameString); @@ -327,9 +341,9 @@ public class DomainSettingsFragment extends Fragment { }); // Create a `boolean` to track if night mode is enabled. - boolean nightModeEnabled = (nightModeInt == DomainsDatabaseHelper.NIGHT_MODE_ENABLED) || ((nightModeInt == DomainsDatabaseHelper.NIGHT_MODE_SYSTEM_DEFAULT) && defaultNightModeBoolean); + boolean nightModeEnabled = (nightModeInt == DomainsDatabaseHelper.NIGHT_MODE_ENABLED) || ((nightModeInt == DomainsDatabaseHelper.NIGHT_MODE_SYSTEM_DEFAULT) && defaultNightMode); - // Disable the JavaScript `Switch` if night mode is enabled. + // Disable the JavaScript switch if night mode is enabled. if (nightModeEnabled) { javaScriptEnabledSwitch.setEnabled(false); } else { @@ -343,7 +357,7 @@ public class DomainSettingsFragment extends Fragment { javaScriptImageView.setImageDrawable(resources.getDrawable(R.drawable.privacy_mode)); } - // Set the JavaScript `Switch` status. + // Set the JavaScript switch status. if (javaScriptEnabledInt == 1) { // JavaScript is enabled. javaScriptEnabledSwitch.setChecked(true); } else { // JavaScript is disabled. @@ -402,7 +416,7 @@ public class DomainSettingsFragment extends Fragment { } } } else { // Third-party cookies cannot be configured for API <= 21. - // Hide the `LinearLayout` for third-party cookies. + // Hide the LinearLayout for third-party cookies. thirdPartyCookiesLinearLayout.setVisibility(View.GONE); } @@ -445,19 +459,24 @@ public class DomainSettingsFragment extends Fragment { } } - // Set the form data status. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. - if (formDataEnabledInt == 1) { // Form data is on. - formDataEnabledSwitch.setChecked(true); - formDataImageView.setImageDrawable(resources.getDrawable(R.drawable.form_data_enabled)); - } else { // Form data is off. - // Turn the form data switch to off. - formDataEnabledSwitch.setChecked(false); + // Set the form data status. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. Form data can be removed once the minimum API >= 26. + if (Build.VERSION.SDK_INT >= 26) { // Form data no longer applies to newer versions of Android. + // Hide the form data switch. + formDataEnabledSwitch.setVisibility(View.GONE); + } else { // Form data should be displayed because this is an older version of Android. + if (formDataEnabledInt == 1) { // Form data is on. + formDataEnabledSwitch.setChecked(true); + formDataImageView.setImageDrawable(resources.getDrawable(R.drawable.form_data_enabled)); + } else { // Form data is off. + // Turn the form data switch to off. + formDataEnabledSwitch.setChecked(false); - // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { - formDataImageView.setImageDrawable(resources.getDrawable(R.drawable.form_data_disabled_dark)); - } else { - formDataImageView.setImageDrawable(resources.getDrawable(R.drawable.form_data_disabled_light)); + // Set the icon according to the theme. + if (MainWebViewActivity.darkTheme) { + formDataImageView.setImageDrawable(resources.getDrawable(R.drawable.form_data_disabled_dark)); + } else { + formDataImageView.setImageDrawable(resources.getDrawable(R.drawable.form_data_disabled_light)); + } } } @@ -576,6 +595,52 @@ public class DomainSettingsFragment extends Fragment { } } + // Set the UltraPrivacy status. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. + if (ultraPrivacyEnabledInt == 1) { // UltraPrivacy is on. + // Turn the switch on. + ultraPrivacySwitch.setChecked(true); + + // Set the icon according to the theme. + if (MainWebViewActivity.darkTheme) { + ultraPrivacyImageView.setImageDrawable(resources.getDrawable(R.drawable.block_tracking_enabled_dark)); + } else { + ultraPrivacyImageView.setImageDrawable(resources.getDrawable(R.drawable.block_tracking_enabled_light)); + } + } else { // EasyPrivacy is off. + // Turn the switch off. + ultraPrivacySwitch.setChecked(false); + + // Set the icon according to the theme. + if (MainWebViewActivity.darkTheme) { + ultraPrivacyImageView.setImageDrawable(resources.getDrawable(R.drawable.block_tracking_disabled_dark)); + } else { + ultraPrivacyImageView.setImageDrawable(resources.getDrawable(R.drawable.block_tracking_disabled_light)); + } + } + + // Set the third-party resource blocking status. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. + if (blockAllThirdPartyRequestsInt == 1) { // Blocking all third-party requests is on. + // Turn the switch on. + blockAllThirdPartyRequestsSwitch.setChecked(true); + + // Set the icon according to the theme. + if (MainWebViewActivity.darkTheme) { + blockAllThirdPartyRequestsImageView.setImageDrawable(resources.getDrawable(R.drawable.block_all_third_party_requests_enabled_dark)); + } else { + blockAllThirdPartyRequestsImageView.setImageDrawable(resources.getDrawable(R.drawable.block_all_third_party_requests_enabled_light)); + } + } else { // Blocking all third-party requests is off. + // Turn the switch off. + blockAllThirdPartyRequestsSwitch.setChecked(false); + + // Set the icon according to the theme. + if (MainWebViewActivity.darkTheme) { + blockAllThirdPartyRequestsImageView.setImageDrawable(resources.getDrawable(R.drawable.block_all_third_party_requests_disabled_dark)); + } else { + blockAllThirdPartyRequestsImageView.setImageDrawable(resources.getDrawable(R.drawable.block_all_third_party_requests_disabled_light)); + } + } + // Inflated a WebView to get the default user agent. // `@SuppressLint("InflateParams")` removes the warning about using `null` as the `ViewGroup`, which in this case makes sense because the bare WebView should not be displayed on the screen. @SuppressLint("InflateParams") View bareWebViewLayout = inflater.inflate(R.layout.bare_webview, null, false); @@ -583,7 +648,7 @@ public class DomainSettingsFragment extends Fragment { final String webViewDefaultUserAgentString = bareWebView.getSettings().getUserAgentString(); // Get a handle for the user agent array adapter. This array does not contain the `System default` entry. - ArrayAdapter userAgentNamesArray = ArrayAdapter.createFromResource(context, R.array.user_agent_names, R.layout.domain_settings_spinner_item); + ArrayAdapter userAgentNamesArray = ArrayAdapter.createFromResource(context, R.array.user_agent_names, R.layout.spinner_item); // Get the positions of the user agent and the default user agent. int userAgentArrayPosition = userAgentNamesArray.getPosition(currentUserAgentName); @@ -648,7 +713,7 @@ public class DomainSettingsFragment extends Fragment { } } - // Open the user agent spinner when the `TextView` is clicked. + // Open the user agent spinner when the TextView is clicked. userAgentTextView.setOnClickListener((View v) -> { // Open the user agent spinner. userAgentSpinner.performClick(); @@ -662,97 +727,96 @@ public class DomainSettingsFragment extends Fragment { int defaultFontSizeArrayPosition = fontSizeEntryValuesArrayAdapter.getPosition(defaultFontSizeString); fontSizeTextView.setText(fontSizeArrayAdapter.getItem(defaultFontSizeArrayPosition)); - // Set the display options for `fontSizeTextView`. + // Set the display options for the font size TextView. if (fontSizeArrayPosition == 0) { // System default font size is selected. Display `fontSizeTextView`. fontSizeTextView.setVisibility(View.VISIBLE); } else { // A custom font size is specified. Hide `fontSizeTextView`. fontSizeTextView.setVisibility(View.GONE); } - // Open the font size spinner when the `TextView` is clicked. + // Open the font size spinner when the TextView is clicked. fontSizeTextView.setOnClickListener((View v) -> { // Open the user agent spinner. fontSizeSpinner.performClick(); }); - // Display the website images mode in the spinner. - displayWebpageImagesSpinner.setSelection(displayImagesInt); + // Display the swipe to refresh selection in the spinner. + swipeToRefreshSpinner.setSelection(swipeToRefreshInt); - // Set the default display images text. - if (defaultDisplayWebpageImagesBoolean) { - displayImagesTextView.setText(displayImagesArrayAdapter.getItem(DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_ENABLED)); + // Set the swipe to refresh text. + if (defaultSwipeToRefresh) { + swipeToRefreshTextView.setText(swipeToRefreshArrayAdapter.getItem(DomainsDatabaseHelper.SWIPE_TO_REFRESH_ENABLED)); } else { - displayImagesTextView.setText(displayImagesArrayAdapter.getItem(DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_DISABLED)); + swipeToRefreshTextView.setText(swipeToRefreshArrayAdapter.getItem(DomainsDatabaseHelper.SWIPE_TO_REFRESH_DISABLED)); } - // Set the display website images icon and `TextView` settings. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. - switch (displayImagesInt) { - case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_SYSTEM_DEFAULT: - if (defaultDisplayWebpageImagesBoolean) { // Display webpage images enabled by default. + // Set the swipe to refresh icon and TextView settings. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. + switch (swipeToRefreshInt) { + case DomainsDatabaseHelper.SWIPE_TO_REFRESH_SYSTEM_DEFAULT: + if (defaultSwipeToRefresh) { // Swipe to refresh is enabled by default. // Set the icon according to the theme. if (MainWebViewActivity.darkTheme) { - displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_dark)); + swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_enabled_dark)); } else { - displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_light)); + swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_enabled_light)); } - } else { // Display webpage images disabled by default. + } else { // Swipe to refresh is disabled by default // Set the icon according to the theme. if (MainWebViewActivity.darkTheme) { - displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_dark)); + swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_disabled_dark)); } else { - displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_light)); + swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_disabled_light)); } } - // Show `displayImagesTextView`. - displayImagesTextView.setVisibility(View.VISIBLE); + // Show the swipe to refresh TextView. + swipeToRefreshTextView.setVisibility(View.VISIBLE); break; - case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_ENABLED: + case DomainsDatabaseHelper.SWIPE_TO_REFRESH_ENABLED: // Set the icon according to the theme. if (MainWebViewActivity.darkTheme) { - displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_dark)); + swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_enabled_dark)); } else { - displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_light)); + swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_enabled_light)); } - // Hide `displayImagesTextView`. - displayImagesTextView.setVisibility(View.GONE); + // Hide the swipe to refresh TextView.` + swipeToRefreshTextView.setVisibility(View.GONE); break; - case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_DISABLED: + case DomainsDatabaseHelper.SWIPE_TO_REFRESH_DISABLED: // Set the icon according to the theme. if (MainWebViewActivity.darkTheme) { - displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_dark)); + swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_disabled_dark)); } else { - displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_light)); + swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_disabled_light)); } - // Hide `displayImagesTextView`. - displayImagesTextView.setVisibility(View.GONE); - break; + // Hide the swipe to refresh TextView. + swipeToRefreshTextView.setVisibility(View.GONE); } - // Open the display images spinner when the `TextView` is clicked. - displayImagesTextView.setOnClickListener((View v) -> { - // Open the user agent spinner. - displayWebpageImagesSpinner.performClick(); + // Open the swipe to refresh spinner when the TextView is clicked. + swipeToRefreshTextView.setOnClickListener((View v) -> { + // Open the swipe to refresh spinner. + swipeToRefreshSpinner.performClick(); }); // Display the night mode in the spinner. nightModeSpinner.setSelection(nightModeInt); // Set the default night mode text. - if (defaultNightModeBoolean) { + if (defaultNightMode) { nightModeTextView.setText(nightModeArrayAdapter.getItem(DomainsDatabaseHelper.NIGHT_MODE_ENABLED)); } else { nightModeTextView.setText(nightModeArrayAdapter.getItem(DomainsDatabaseHelper.NIGHT_MODE_DISABLED)); } - // Set the night mode icon and `TextView` settings. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. - switch (displayImagesInt) { + // Set the night mode icon and TextView settings. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. + switch (nightModeInt) { case DomainsDatabaseHelper.NIGHT_MODE_SYSTEM_DEFAULT: - if (defaultNightModeBoolean) { // Night mode enabled by default. + if (defaultNightMode) { // Night mode enabled by default. // Set the icon according to the theme. if (MainWebViewActivity.darkTheme) { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_enabled_dark)); @@ -768,7 +832,7 @@ public class DomainSettingsFragment extends Fragment { } } - // Show `nightModeTextView`. + // Show night mode TextView. nightModeTextView.setVisibility(View.VISIBLE); break; @@ -780,7 +844,7 @@ public class DomainSettingsFragment extends Fragment { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_enabled_light)); } - // Hide `nightModeTextView`. + // Hide the night mode TextView. nightModeTextView.setVisibility(View.GONE); break; @@ -792,16 +856,80 @@ public class DomainSettingsFragment extends Fragment { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_disabled_light)); } - // Hide `nightModeTextView`. + // Hide the night mode TextView. nightModeTextView.setVisibility(View.GONE); break; } - // Open the night mode spinner when the `TextView` is clicked. + // Open the night mode spinner when the TextView is clicked. nightModeTextView.setOnClickListener((View v) -> { - // Open the user agent spinner. + // Open the night mode spinner. nightModeSpinner.performClick(); }); + + // Display the website images mode in the spinner. + displayWebpageImagesSpinner.setSelection(displayImagesInt); + + // Set the default display images text. + if (defaultDisplayWebpageImages) { + displayImagesTextView.setText(displayImagesArrayAdapter.getItem(DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_ENABLED)); + } else { + displayImagesTextView.setText(displayImagesArrayAdapter.getItem(DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_DISABLED)); + } + + // Set the display website images icon and TextView settings. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. + switch (displayImagesInt) { + case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_SYSTEM_DEFAULT: + if (defaultDisplayWebpageImages) { // Display webpage images enabled by default. + // Set the icon according to the theme. + if (MainWebViewActivity.darkTheme) { + displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_dark)); + } else { + displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_light)); + } + } else { // Display webpage images disabled by default. + // Set the icon according to the theme. + if (MainWebViewActivity.darkTheme) { + displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_dark)); + } else { + displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_light)); + } + } + + // Show the display images TextView. + displayImagesTextView.setVisibility(View.VISIBLE); + break; + + case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_ENABLED: + // Set the icon according to the theme. + if (MainWebViewActivity.darkTheme) { + displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_dark)); + } else { + displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_light)); + } + + // Hide the display images TextView. + displayImagesTextView.setVisibility(View.GONE); + break; + + case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_DISABLED: + // Set the icon according to the theme. + if (MainWebViewActivity.darkTheme) { + displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_dark)); + } else { + displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_light)); + } + + // Hide the display images TextView. + displayImagesTextView.setVisibility(View.GONE); + break; + } + + // Open the display images spinner when the TextView is clicked. + displayImagesTextView.setOnClickListener((View v) -> { + // Open the user agent spinner. + displayWebpageImagesSpinner.performClick(); + }); // Set the pinned SSL certificate icon. if (pinnedSslCertificateInt == 1) { // Pinned SSL certificate is enabled. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. @@ -1089,20 +1217,22 @@ public class DomainSettingsFragment extends Fragment { } }); - // Set the form data switch listener. - formDataEnabledSwitch.setOnCheckedChangeListener((CompoundButton buttonView, boolean isChecked) -> { - // Update the icon. - if (isChecked) { - formDataImageView.setImageDrawable(resources.getDrawable(R.drawable.form_data_enabled)); - } else { - // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { - formDataImageView.setImageDrawable(resources.getDrawable(R.drawable.form_data_disabled_dark)); + // Set the form data switch listener. It can be removed once the minimum API >= 26. + if (Build.VERSION.SDK_INT < 26) { + formDataEnabledSwitch.setOnCheckedChangeListener((CompoundButton buttonView, boolean isChecked) -> { + // Update the icon. + if (isChecked) { + formDataImageView.setImageDrawable(resources.getDrawable(R.drawable.form_data_enabled)); } else { - formDataImageView.setImageDrawable(resources.getDrawable(R.drawable.form_data_disabled_light)); + // Set the icon according to the theme. + if (MainWebViewActivity.darkTheme) { + formDataImageView.setImageDrawable(resources.getDrawable(R.drawable.form_data_disabled_dark)); + } else { + formDataImageView.setImageDrawable(resources.getDrawable(R.drawable.form_data_disabled_light)); + } } - } - }); + }); + } // Set the EasyList switch listener. easyListSwitch.setOnCheckedChangeListener((CompoundButton buttonView, boolean isChecked) -> { @@ -1215,6 +1345,46 @@ public class DomainSettingsFragment extends Fragment { } }); + // Set the UltraPrivacy switch listener. + ultraPrivacySwitch.setOnCheckedChangeListener((CompoundButton buttonView, boolean isChecked) -> { + // Update the icon. + if (isChecked) { // UltraPrivacy is on. + // Set the icon according to the theme. + if (MainWebViewActivity.darkTheme) { + ultraPrivacyImageView.setImageDrawable(resources.getDrawable(R.drawable.block_tracking_enabled_dark)); + } else { + ultraPrivacyImageView.setImageDrawable(resources.getDrawable(R.drawable.block_tracking_enabled_light)); + } + } else { // UltraPrivacy is off. + // Set the icon according to the theme. + if (MainWebViewActivity.darkTheme) { + ultraPrivacyImageView.setImageDrawable(resources.getDrawable(R.drawable.block_tracking_disabled_dark)); + } else { + ultraPrivacyImageView.setImageDrawable(resources.getDrawable(R.drawable.block_tracking_disabled_light)); + } + } + }); + + // Set the block all third-party requests switch listener. + blockAllThirdPartyRequestsSwitch.setOnCheckedChangeListener((CompoundButton buttonView, boolean isChecked) -> { + // Update the icon. + if (isChecked) { // Blocking all third-party requests is on. + // Set the icon according to the theme. + if (MainWebViewActivity.darkTheme) { + blockAllThirdPartyRequestsImageView.setImageDrawable(resources.getDrawable(R.drawable.block_all_third_party_requests_enabled_dark)); + } else { + blockAllThirdPartyRequestsImageView.setImageDrawable(resources.getDrawable(R.drawable.block_all_third_party_requests_enabled_light)); + } + } else { // Blocking all third-party requests is off. + // Set the icon according to the theme. + if (MainWebViewActivity.darkTheme) { + blockAllThirdPartyRequestsImageView.setImageDrawable(resources.getDrawable(R.drawable.block_all_third_party_requests_disabled_dark)); + } else { + blockAllThirdPartyRequestsImageView.setImageDrawable(resources.getDrawable(R.drawable.block_all_third_party_requests_disabled_light)); + } + } + }); + // Set the user agent spinner listener. userAgentSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override @@ -1303,56 +1473,55 @@ public class DomainSettingsFragment extends Fragment { } }); - // Set the display webpage images spinner listener. - displayWebpageImagesSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + // Set the swipe to refresh spinner listener. + swipeToRefreshSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { - // Update the icon and the visibility of `displayImagesTextView`. + // Update the icon and the visibility of `nightModeTextView`. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. switch (position) { - case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_SYSTEM_DEFAULT: - if (defaultDisplayWebpageImagesBoolean) { + case DomainsDatabaseHelper.SWIPE_TO_REFRESH_SYSTEM_DEFAULT: + if (defaultSwipeToRefresh) { // Swipe to refresh enabled by default. // Set the icon according to the theme. if (MainWebViewActivity.darkTheme) { - displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_dark)); + swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_enabled_dark)); } else { - displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_light)); + swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_enabled_light)); } - } else { + } else { // Swipe to refresh disabled by default. // Set the icon according to the theme. if (MainWebViewActivity.darkTheme) { - displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_dark)); + swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_disabled_dark)); } else { - displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_light)); + swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_disabled_light)); } } - // Show `displayImagesTextView`. - displayImagesTextView.setVisibility(View.VISIBLE); + // Show the swipe to refresh TextView. + swipeToRefreshTextView.setVisibility(View.VISIBLE); break; - case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_ENABLED: + case DomainsDatabaseHelper.SWIPE_TO_REFRESH_ENABLED: // Set the icon according to the theme. if (MainWebViewActivity.darkTheme) { - displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_dark)); + swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_enabled_dark)); } else { - displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_light)); + swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_enabled_light)); } - // Hide `displayImagesTextView`. - displayImagesTextView.setVisibility(View.GONE); + // Hide the swipe to refresh TextView. + swipeToRefreshTextView.setVisibility(View.GONE); break; - case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_DISABLED: + case DomainsDatabaseHelper.SWIPE_TO_REFRESH_DISABLED: // Set the icon according to the theme. if (MainWebViewActivity.darkTheme) { - displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_dark)); + swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_disabled_dark)); } else { - displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_light)); + swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_disabled_light)); } - // Hide `displayImagesTextView`. - displayImagesTextView.setVisibility(View.GONE); - break; + // Hide the swipe to refresh TextView. + swipeToRefreshTextView.setVisibility(View.GONE); } } @@ -1369,7 +1538,7 @@ public class DomainSettingsFragment extends Fragment { // Update the icon and the visibility of `nightModeTextView`. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. switch (position) { case DomainsDatabaseHelper.NIGHT_MODE_SYSTEM_DEFAULT: - if (defaultNightModeBoolean) { // Night mode enabled by default. + if (defaultNightMode) { // Night mode enabled by default. // Set the icon according to the theme. if (MainWebViewActivity.darkTheme) { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_enabled_dark)); @@ -1385,7 +1554,7 @@ public class DomainSettingsFragment extends Fragment { } } - // Show `nightModeTextView`. + // Show the night mode TextView. nightModeTextView.setVisibility(View.VISIBLE); break; @@ -1415,7 +1584,7 @@ public class DomainSettingsFragment extends Fragment { } // Create a `boolean` to store the current night mode setting. - boolean currentNightModeEnabled = (position == DomainsDatabaseHelper.NIGHT_MODE_ENABLED) || ((position == DomainsDatabaseHelper.NIGHT_MODE_SYSTEM_DEFAULT) && defaultNightModeBoolean); + boolean currentNightModeEnabled = (position == DomainsDatabaseHelper.NIGHT_MODE_ENABLED) || ((position == DomainsDatabaseHelper.NIGHT_MODE_SYSTEM_DEFAULT) && defaultNightMode); // Disable the JavaScript `Switch` if night mode is enabled. if (currentNightModeEnabled) { @@ -1476,6 +1645,65 @@ public class DomainSettingsFragment extends Fragment { // Do nothing. } }); + + // Set the display webpage images spinner listener. + displayWebpageImagesSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + // Update the icon and the visibility of `displayImagesTextView`. + switch (position) { + case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_SYSTEM_DEFAULT: + if (defaultDisplayWebpageImages) { + // Set the icon according to the theme. + if (MainWebViewActivity.darkTheme) { + displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_dark)); + } else { + displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_light)); + } + } else { + // Set the icon according to the theme. + if (MainWebViewActivity.darkTheme) { + displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_dark)); + } else { + displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_light)); + } + } + + // Show `displayImagesTextView`. + displayImagesTextView.setVisibility(View.VISIBLE); + break; + + case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_ENABLED: + // Set the icon according to the theme. + if (MainWebViewActivity.darkTheme) { + displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_dark)); + } else { + displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_light)); + } + + // Hide `displayImagesTextView`. + displayImagesTextView.setVisibility(View.GONE); + break; + + case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_DISABLED: + // Set the icon according to the theme. + if (MainWebViewActivity.darkTheme) { + displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_dark)); + } else { + displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_light)); + } + + // Hide `displayImagesTextView`. + displayImagesTextView.setVisibility(View.GONE); + break; + } + } + + @Override + public void onNothingSelected(AdapterView parent) { + // Do nothing. + } + }); // Set the pinned SSL certificate switch listener. pinnedSslCertificateSwitch.setOnCheckedChangeListener((CompoundButton buttonView, boolean isChecked) -> { @@ -1567,15 +1795,15 @@ public class DomainSettingsFragment extends Fragment { // Initialize `domainNamesMatch`. boolean domainNamesMatch = false; - // Check if the domains match. - if (domainName.equals(certificateCommonName)) { - domainNamesMatch = true; - } - // Check various wildcard permutations if `domainName` and `certificateCommonName` are not empty. // `noinspection ConstantCondition` removes Android Studio's incorrect lint warning that `domainName` can never be `null`. //noinspection ConstantConditions if ((domainName != null) && (certificateCommonName != null)) { + // Check if the domains match. + if (domainName.equals(certificateCommonName)) { + domainNamesMatch = true; + } + // If `domainName` starts with a wildcard, check the base domain against all the subdomains of `certificateCommonName`. if (!domainNamesMatch && domainName.startsWith("*.") && (domainName.length() > 2)) { // Remove the initial `*.`.