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=bd880d44156f3f898fdd9c494c04427da6111c65;hp=90b999ceddc0c9b77c4be964daacc589acb8682a;hb=f0393ca22075be3e5fe9199c7db87381256236fa;hpb=d206502603e904c817b3add2482bfbc66692167d 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 90b999ce..bd880d44 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/fragments/DomainSettingsFragment.java +++ b/app/src/main/java/com/stoutner/privacybrowser/fragments/DomainSettingsFragment.java @@ -1,5 +1,5 @@ /* - * Copyright © 2017-2018 Soren Stoutner . + * Copyright © 2017-2019 Soren Stoutner . * * This file is part of Privacy Browser . * @@ -27,10 +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()`. import android.preference.PreferenceManager; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; import android.text.Editable; import android.text.SpannableStringBuilder; import android.text.Spanned; @@ -51,7 +48,12 @@ import android.widget.Spinner; import android.widget.Switch; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.cardview.widget.CardView; +import androidx.fragment.app.Fragment; // The AndroidX fragment must be used until minimum API >= 23. Otherwise `getContext()` does not work. + import com.stoutner.privacybrowser.R; +import com.stoutner.privacybrowser.activities.DomainsActivity; import com.stoutner.privacybrowser.activities.MainWebViewActivity; import com.stoutner.privacybrowser.helpers.DomainsDatabaseHelper; @@ -78,13 +80,12 @@ public class DomainSettingsFragment extends Fragment { } // The deprecated `getDrawable()` must be used until the minimum API >= 21. - @SuppressWarnings("deprecation") @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate `domain_settings_fragment`. `false` does not attach it to the root `container`. View domainSettingsView = inflater.inflate(R.layout.domain_settings_fragment, container, false); - // Get a handle for the `Context` and the `Resources`. + // Get a handle for the context and the resources. Context context = getContext(); final Resources resources = getResources(); @@ -92,51 +93,57 @@ public class DomainSettingsFragment extends Fragment { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); // Store the default settings. - 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"); - boolean defaultSwipeToRefreshBoolean = sharedPreferences.getBoolean("swipe_to_refresh", true); - final boolean defaultNightModeBoolean = sharedPreferences.getBoolean("night_mode", false); - final boolean defaultDisplayWebpageImagesBoolean = sharedPreferences.getBoolean("display_website_images", true); + final String defaultUserAgentName = sharedPreferences.getString("user_agent", getString(R.string.user_agent_default_value)); + final String defaultCustomUserAgentString = sharedPreferences.getString("custom_user_agent", getString(R.string.custom_user_agent_default_value)); + String defaultFontSizeString = sharedPreferences.getString("font_size", getString(R.string.font_size_default_value)); + 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); + boolean darkTheme = sharedPreferences.getBoolean("dark_theme", false); // Get handles for the views in the fragment. final EditText domainNameEditText = domainSettingsView.findViewById(R.id.domain_settings_name_edittext); - final Switch javaScriptEnabledSwitch = domainSettingsView.findViewById(R.id.domain_settings_javascript_switch); - final ImageView javaScriptImageView = domainSettingsView.findViewById(R.id.domain_settings_javascript_imageview); - Switch firstPartyCookiesEnabledSwitch = domainSettingsView.findViewById(R.id.domain_settings_first_party_cookies_switch); - final ImageView firstPartyCookiesImageView = domainSettingsView.findViewById(R.id.domain_settings_first_party_cookies_imageview); - LinearLayout thirdPartyCookiesLinearLayout = domainSettingsView.findViewById(R.id.domain_settings_third_party_cookies_linearlayout); - final Switch thirdPartyCookiesEnabledSwitch = domainSettingsView.findViewById(R.id.domain_settings_third_party_cookies_switch); - 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); // 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); - ImageView easyPrivacyImageView = domainSettingsView.findViewById(R.id.domain_settings_easyprivacy_imageview); - Switch fanboysAnnoyanceListSwitch = domainSettingsView.findViewById(R.id.domain_settings_fanboys_annoyance_list_switch); - 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); - 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 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); + final Switch javaScriptEnabledSwitch = domainSettingsView.findViewById(R.id.javascript_switch); + final ImageView javaScriptImageView = domainSettingsView.findViewById(R.id.javascript_imageview); + Switch firstPartyCookiesEnabledSwitch = domainSettingsView.findViewById(R.id.first_party_cookies_switch); + final ImageView firstPartyCookiesImageView = domainSettingsView.findViewById(R.id.first_party_cookies_imageview); + LinearLayout thirdPartyCookiesLinearLayout = domainSettingsView.findViewById(R.id.third_party_cookies_linearlayout); + final Switch thirdPartyCookiesEnabledSwitch = domainSettingsView.findViewById(R.id.third_party_cookies_switch); + final ImageView thirdPartyCookiesImageView = domainSettingsView.findViewById(R.id.third_party_cookies_imageview); + final Switch domStorageEnabledSwitch = domainSettingsView.findViewById(R.id.dom_storage_switch); + final ImageView domStorageImageView = domainSettingsView.findViewById(R.id.dom_storage_imageview); + Switch formDataEnabledSwitch = domainSettingsView.findViewById(R.id.form_data_switch); // The form data views can be remove once the minimum API >= 26. + final ImageView formDataImageView = domainSettingsView.findViewById(R.id.form_data_imageview); // The form data views can be remove once the minimum API >= 26. + Switch easyListSwitch = domainSettingsView.findViewById(R.id.easylist_switch); + ImageView easyListImageView = domainSettingsView.findViewById(R.id.easylist_imageview); + Switch easyPrivacySwitch = domainSettingsView.findViewById(R.id.easyprivacy_switch); + ImageView easyPrivacyImageView = domainSettingsView.findViewById(R.id.easyprivacy_imageview); + Switch fanboysAnnoyanceListSwitch = domainSettingsView.findViewById(R.id.fanboys_annoyance_list_switch); + ImageView fanboysAnnoyanceListImageView = domainSettingsView.findViewById(R.id.fanboys_annoyance_list_imageview); + Switch fanboysSocialBlockingListSwitch = domainSettingsView.findViewById(R.id.fanboys_social_blocking_list_switch); + ImageView fanboysSocialBlockingListImageView = domainSettingsView.findViewById(R.id.fanboys_social_blocking_list_imageview); + Switch ultraPrivacySwitch = domainSettingsView.findViewById(R.id.ultraprivacy_switch); + ImageView ultraPrivacyImageView = domainSettingsView.findViewById(R.id.ultraprivacy_imageview); + Switch blockAllThirdPartyRequestsSwitch = domainSettingsView.findViewById(R.id.block_all_third_party_requests_switch); + ImageView blockAllThirdPartyRequestsImageView = domainSettingsView.findViewById(R.id.block_all_third_party_requests_imageview); + final Spinner userAgentSpinner = domainSettingsView.findViewById(R.id.user_agent_spinner); + final TextView userAgentTextView = domainSettingsView.findViewById(R.id.user_agent_textview); + final EditText customUserAgentEditText = domainSettingsView.findViewById(R.id.custom_user_agent_edittext); + final Spinner fontSizeSpinner = domainSettingsView.findViewById(R.id.font_size_spinner); + final TextView fontSizeTextView = domainSettingsView.findViewById(R.id.font_size_textview); + final ImageView swipeToRefreshImageView = domainSettingsView.findViewById(R.id.swipe_to_refresh_imageview); + final Spinner swipeToRefreshSpinner = domainSettingsView.findViewById(R.id.swipe_to_refresh_spinner); + final TextView swipeToRefreshTextView = domainSettingsView.findViewById(R.id.swipe_to_refresh_textview); + final ImageView nightModeImageView = domainSettingsView.findViewById(R.id.night_mode_imageview); + final Spinner nightModeSpinner = domainSettingsView.findViewById(R.id.night_mode_spinner); + final TextView nightModeTextView = domainSettingsView.findViewById(R.id.night_mode_textview); + final ImageView displayWebpageImagesImageView = domainSettingsView.findViewById(R.id.display_webpage_images_imageview); + final Spinner displayWebpageImagesSpinner = domainSettingsView.findViewById(R.id.display_webpage_images_spinner); + final TextView displayImagesTextView = domainSettingsView.findViewById(R.id.display_webpage_images_textview); + final ImageView pinnedSslCertificateImageView = domainSettingsView.findViewById(R.id.pinned_ssl_certificate_imageview); + Switch pinnedSslCertificateSwitch = domainSettingsView.findViewById(R.id.pinned_ssl_certificate_switch); + final CardView savedSslCertificateCardView = domainSettingsView.findViewById(R.id.saved_ssl_certificate_cardview); + LinearLayout savedSslCertificateLinearLayout = domainSettingsView.findViewById(R.id.saved_ssl_certificate_linearlayout); final RadioButton savedSslCertificateRadioButton = domainSettingsView.findViewById(R.id.saved_ssl_certificate_radiobutton); final TextView savedSslCertificateIssuedToCNameTextView = domainSettingsView.findViewById(R.id.saved_ssl_certificate_issued_to_cname); TextView savedSslCertificateIssuedToONameTextView = domainSettingsView.findViewById(R.id.saved_ssl_certificate_issued_to_oname); @@ -146,7 +153,8 @@ public class DomainSettingsFragment extends Fragment { TextView savedSslCertificateIssuedByUNameTextView = domainSettingsView.findViewById(R.id.saved_ssl_certificate_issued_by_uname); TextView savedSslCertificateStartDateTextView = domainSettingsView.findViewById(R.id.saved_ssl_certificate_start_date); TextView savedSslCertificateEndDateTextView = domainSettingsView.findViewById(R.id.saved_ssl_certificate_end_date); - final LinearLayout currentWebsiteCertificateLinearLayout = domainSettingsView.findViewById(R.id.current_website_certificate_linearlayout); + final CardView currentWebsiteCertificateCardView = domainSettingsView.findViewById(R.id.current_website_certificate_cardview); + LinearLayout currentWebsiteCertificateLinearLayout = domainSettingsView.findViewById(R.id.current_website_certificate_linearlayout); final RadioButton currentWebsiteCertificateRadioButton = domainSettingsView.findViewById(R.id.current_website_certificate_radiobutton); final TextView currentWebsiteCertificateIssuedToCNameTextView = domainSettingsView.findViewById(R.id.current_website_certificate_issued_to_cname); TextView currentWebsiteCertificateIssuedToONameTextView = domainSettingsView.findViewById(R.id.current_website_certificate_issued_to_oname); @@ -157,25 +165,35 @@ public class DomainSettingsFragment extends Fragment { TextView currentWebsiteCertificateStartDateTextView = domainSettingsView.findViewById(R.id.current_website_certificate_start_date); TextView currentWebsiteCertificateEndDateTextView = domainSettingsView.findViewById(R.id.current_website_certificate_end_date); final TextView noCurrentWebsiteCertificateTextView = domainSettingsView.findViewById(R.id.no_current_website_certificate); - - // Setup the SSL certificate labels. - final String cNameLabel = getString(R.string.common_name) + " "; + ImageView pinnedIpAddressesImageView = domainSettingsView.findViewById(R.id.pinned_ip_addresses_imageview); + Switch pinnedIpAddressesSwitch = domainSettingsView.findViewById(R.id.pinned_ip_addresses_switch); + CardView savedIpAddressesCardView = domainSettingsView.findViewById(R.id.saved_ip_addresses_cardview); + LinearLayout savedIpAddressesLinearLayout = domainSettingsView.findViewById(R.id.saved_ip_addresses_linearlayout); + RadioButton savedIpAddressesRadioButton = domainSettingsView.findViewById(R.id.saved_ip_addresses_radiobutton); + TextView savedIpAddressesTextView = domainSettingsView.findViewById(R.id.saved_ip_addresses_textview); + CardView currentIpAddressesCardView = domainSettingsView.findViewById(R.id.current_ip_addresses_cardview); + LinearLayout currentIpAddressesLinearLayout = domainSettingsView.findViewById(R.id.current_ip_addresses_linearlayout); + RadioButton currentIpAddressesRadioButton = domainSettingsView.findViewById(R.id.current_ip_addresses_radiobutton); + TextView currentIpAddressesTextView = domainSettingsView.findViewById(R.id.current_ip_addresses_textview); + + // Setup the pinned labels. + String cNameLabel = getString(R.string.common_name) + " "; String oNameLabel = getString(R.string.organization) + " "; String uNameLabel = getString(R.string.organizational_unit) + " "; String startDateLabel = getString(R.string.start_date) + " "; String endDateLabel = getString(R.string.end_date) + " "; // Get the current website SSL certificate - final SslCertificate currentWebsiteSslCertificate = MainWebViewActivity.sslCertificate; + final SslCertificate currentWebsiteSslCertificate = DomainsActivity.currentSslCertificate; // Initialize the database handler. The `0` specifies the database version, but that is ignored and set instead using a constant in `DomainsDatabaseHelper`. DomainsDatabaseHelper domainsDatabaseHelper = new DomainsDatabaseHelper(context, null, null, 0); - // Get the database `Cursor` for this ID and move it to the first row. + // Get the database cursor for this ID and move it to the first row. Cursor domainCursor = domainsDatabaseHelper.getCursorForId(databaseId); domainCursor.moveToFirst(); - // Save the `Cursor` entries as variables. + // Save the cursor entries as variables. String domainNameString = domainCursor.getString(domainCursor.getColumnIndex(DomainsDatabaseHelper.DOMAIN_NAME)); final int javaScriptEnabledInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.ENABLE_JAVASCRIPT)); int firstPartyCookiesEnabledInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.ENABLE_FIRST_PARTY_COOKIES)); @@ -186,18 +204,22 @@ public class DomainSettingsFragment extends Fragment { 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 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 savedSslCertificateIssuedToCNameString = domainCursor.getString(domainCursor.getColumnIndex(DomainsDatabaseHelper.SSL_ISSUED_TO_COMMON_NAME)); String savedSslCertificateIssuedToONameString = domainCursor.getString(domainCursor.getColumnIndex(DomainsDatabaseHelper.SSL_ISSUED_TO_ORGANIZATION)); String savedSslCertificateIssuedToUNameString = domainCursor.getString(domainCursor.getColumnIndex(DomainsDatabaseHelper.SSL_ISSUED_TO_ORGANIZATIONAL_UNIT)); String savedSslCertificateIssuedByCNameString = domainCursor.getString(domainCursor.getColumnIndex(DomainsDatabaseHelper.SSL_ISSUED_BY_COMMON_NAME)); String savedSslCertificateIssuedByONameString = domainCursor.getString(domainCursor.getColumnIndex(DomainsDatabaseHelper.SSL_ISSUED_BY_ORGANIZATION)); String savedSslCertificateIssuedByUNameString = domainCursor.getString(domainCursor.getColumnIndex(DomainsDatabaseHelper.SSL_ISSUED_BY_ORGANIZATIONAL_UNIT)); + int pinnedIpAddressesInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.PINNED_IP_ADDRESSES)); + String savedIpAddresses = domainCursor.getString(domainCursor.getColumnIndex(DomainsDatabaseHelper.IP_ADDRESSES)); // Initialize the saved SSL certificate date variables. Date savedSslCertificateStartDate = null; @@ -212,29 +234,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); - ArrayAdapter swipeToRefreshArrayAdapter = ArrayAdapter.createFromResource(context, R.array.swipe_to_refresh_array, R.layout.domain_settings_spinner_item); - ArrayAdapter nightModeArrayAdapter = ArrayAdapter.createFromResource(context, R.array.night_mode_array, R.layout.domain_settings_spinner_item); - ArrayAdapter displayImagesArrayAdapter = ArrayAdapter.createFromResource(context, R.array.display_webpage_images_array, R.layout.domain_settings_spinner_item); + // 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 `DropDownViewResource` on the `Spinners`. + // 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 `ArrayAdapters` for the `Spinners`. + // Set the array adapters for the spinners. userAgentSpinner.setAdapter(translatedUserAgentArrayAdapter); fontSizeSpinner.setAdapter(fontSizeArrayAdapter); 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); @@ -242,7 +264,7 @@ public class DomainSettingsFragment extends Fragment { SpannableStringBuilder savedSslCertificateIssuedByONameStringBuilder = new SpannableStringBuilder(oNameLabel + savedSslCertificateIssuedByONameString); SpannableStringBuilder savedSslCertificateIssuedByUNameStringBuilder = new SpannableStringBuilder(uNameLabel + savedSslCertificateIssuedByUNameString); - // Initialize the `SpannableStringBuilders` for the SSL certificate dates. + // Initialize the spannable string builders for the SSL certificate dates. SpannableStringBuilder savedSslCertificateStartDateStringBuilder; SpannableStringBuilder savedSslCertificateEndDateStringBuilder; @@ -259,19 +281,19 @@ public class DomainSettingsFragment extends Fragment { savedSslCertificateEndDateStringBuilder = new SpannableStringBuilder(endDateLabel + DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.LONG).format(savedSslCertificateEndDate)); } - // Create a red `ForegroundColorSpan`. We have to use the deprecated `getColor` until API >= 23. - final ForegroundColorSpan redColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.red_a700)); + // Create a red foreground color span. The deprecated `resources.getColor` must be used until the minimum API >= 23. + final ForegroundColorSpan redColorSpan = new ForegroundColorSpan(resources.getColor(R.color.red_a700)); - // Create a blue `ForegroundColorSpan`. + // Create a blue foreground color span. final ForegroundColorSpan blueColorSpan; - // Set `blueColorSpan` according to the theme. We have to use the deprecated `getColor()` until API >= 23. - if (MainWebViewActivity.darkTheme) { + // Set the blue color span according to the theme. The deprecated `resources.getColor` must be used until the minimum API >= 23. + if (darkTheme) { //noinspection deprecation - blueColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.blue_400)); + blueColorSpan = new ForegroundColorSpan(resources.getColor(R.color.blue_400)); } else { //noinspection deprecation - blueColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.blue_700)); + blueColorSpan = new ForegroundColorSpan(resources.getColor(R.color.blue_700)); } // Set the domain name from the the database cursor. @@ -334,8 +356,8 @@ 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); + // Create a boolean to track if night mode is enabled. + boolean nightModeEnabled = (nightModeInt == DomainsDatabaseHelper.NIGHT_MODE_ENABLED) || ((nightModeInt == DomainsDatabaseHelper.NIGHT_MODE_SYSTEM_DEFAULT) && defaultNightMode); // Disable the JavaScript switch if night mode is enabled. if (nightModeEnabled) { @@ -366,7 +388,7 @@ public class DomainSettingsFragment extends Fragment { firstPartyCookiesEnabledSwitch.setChecked(false); // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { firstPartyCookiesImageView.setImageDrawable(resources.getDrawable(R.drawable.cookies_disabled_dark)); } else { firstPartyCookiesImageView.setImageDrawable(resources.getDrawable(R.drawable.cookies_disabled_light)); @@ -385,7 +407,7 @@ public class DomainSettingsFragment extends Fragment { thirdPartyCookiesEnabledSwitch.setChecked(false); // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { thirdPartyCookiesImageView.setImageDrawable(resources.getDrawable(R.drawable.cookies_disabled_dark)); } else { thirdPartyCookiesImageView.setImageDrawable(resources.getDrawable(R.drawable.cookies_disabled_light)); @@ -403,7 +425,7 @@ public class DomainSettingsFragment extends Fragment { thirdPartyCookiesEnabledSwitch.setEnabled(false); // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { thirdPartyCookiesImageView.setImageDrawable(resources.getDrawable(R.drawable.cookies_ghosted_dark)); } else { thirdPartyCookiesImageView.setImageDrawable(resources.getDrawable(R.drawable.cookies_ghosted_light)); @@ -428,7 +450,7 @@ public class DomainSettingsFragment extends Fragment { domStorageEnabledSwitch.setChecked(false); // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { domStorageImageView.setImageDrawable(resources.getDrawable(R.drawable.dom_storage_disabled_dark)); } else { domStorageImageView.setImageDrawable(resources.getDrawable(R.drawable.dom_storage_disabled_light)); @@ -446,7 +468,7 @@ public class DomainSettingsFragment extends Fragment { } // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { domStorageImageView.setImageDrawable(resources.getDrawable(R.drawable.dom_storage_ghosted_dark)); } else { domStorageImageView.setImageDrawable(resources.getDrawable(R.drawable.dom_storage_ghosted_light)); @@ -466,7 +488,7 @@ public class DomainSettingsFragment extends Fragment { formDataEnabledSwitch.setChecked(false); // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { formDataImageView.setImageDrawable(resources.getDrawable(R.drawable.form_data_disabled_dark)); } else { formDataImageView.setImageDrawable(resources.getDrawable(R.drawable.form_data_disabled_light)); @@ -480,7 +502,7 @@ public class DomainSettingsFragment extends Fragment { easyListSwitch.setChecked(true); // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { easyListImageView.setImageDrawable(resources.getDrawable(R.drawable.block_ads_enabled_dark)); } else { easyListImageView.setImageDrawable(resources.getDrawable(R.drawable.block_ads_enabled_light)); @@ -490,7 +512,7 @@ public class DomainSettingsFragment extends Fragment { easyListSwitch.setChecked(false); // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { easyListImageView.setImageDrawable(resources.getDrawable(R.drawable.block_ads_disabled_dark)); } else { easyListImageView.setImageDrawable(resources.getDrawable(R.drawable.block_ads_disabled_light)); @@ -503,7 +525,7 @@ public class DomainSettingsFragment extends Fragment { easyPrivacySwitch.setChecked(true); // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { easyPrivacyImageView.setImageDrawable(resources.getDrawable(R.drawable.block_tracking_enabled_dark)); } else { easyPrivacyImageView.setImageDrawable(resources.getDrawable(R.drawable.block_tracking_enabled_light)); @@ -513,7 +535,7 @@ public class DomainSettingsFragment extends Fragment { easyPrivacySwitch.setChecked(false); // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { easyPrivacyImageView.setImageDrawable(resources.getDrawable(R.drawable.block_tracking_disabled_dark)); } else { easyPrivacyImageView.setImageDrawable(resources.getDrawable(R.drawable.block_tracking_disabled_light)); @@ -526,7 +548,7 @@ public class DomainSettingsFragment extends Fragment { fanboysAnnoyanceListSwitch.setChecked(true); // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { fanboysAnnoyanceListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_enabled_dark)); } else { fanboysAnnoyanceListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_enabled_light)); @@ -536,7 +558,7 @@ public class DomainSettingsFragment extends Fragment { fanboysAnnoyanceListSwitch.setChecked(false); // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { fanboysAnnoyanceListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_disabled_dark)); } else { fanboysAnnoyanceListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_disabled_light)); @@ -552,7 +574,7 @@ public class DomainSettingsFragment extends Fragment { fanboysSocialBlockingListSwitch.setChecked(true); // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { fanboysSocialBlockingListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_enabled_dark)); } else { fanboysSocialBlockingListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_enabled_light)); @@ -563,7 +585,7 @@ public class DomainSettingsFragment extends Fragment { fanboysSocialBlockingListSwitch.setChecked(false); // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { fanboysSocialBlockingListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_disabled_dark)); } else { fanboysSocialBlockingListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_disabled_light)); @@ -582,13 +604,59 @@ public class DomainSettingsFragment extends Fragment { } // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { fanboysSocialBlockingListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_ghosted_dark)); } else { fanboysSocialBlockingListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_ghosted_light)); } } + // 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 (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 (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 (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 (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); @@ -596,7 +664,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); @@ -692,7 +760,7 @@ public class DomainSettingsFragment extends Fragment { swipeToRefreshSpinner.setSelection(swipeToRefreshInt); // Set the swipe to refresh text. - if (defaultSwipeToRefreshBoolean) { + if (defaultSwipeToRefresh) { swipeToRefreshTextView.setText(swipeToRefreshArrayAdapter.getItem(DomainsDatabaseHelper.SWIPE_TO_REFRESH_ENABLED)); } else { swipeToRefreshTextView.setText(swipeToRefreshArrayAdapter.getItem(DomainsDatabaseHelper.SWIPE_TO_REFRESH_DISABLED)); @@ -701,16 +769,16 @@ public class DomainSettingsFragment extends Fragment { // 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 (defaultSwipeToRefreshBoolean) { // Swipe to refresh is enabled by default. + if (defaultSwipeToRefresh) { // Swipe to refresh is enabled by default. // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_enabled_dark)); } else { swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_enabled_light)); } } else { // Swipe to refresh is disabled by default // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_disabled_dark)); } else { swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_disabled_light)); @@ -723,7 +791,7 @@ public class DomainSettingsFragment extends Fragment { case DomainsDatabaseHelper.SWIPE_TO_REFRESH_ENABLED: // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_enabled_dark)); } else { swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_enabled_light)); @@ -735,7 +803,7 @@ public class DomainSettingsFragment extends Fragment { case DomainsDatabaseHelper.SWIPE_TO_REFRESH_DISABLED: // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_disabled_dark)); } else { swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_disabled_light)); @@ -755,7 +823,7 @@ public class DomainSettingsFragment extends Fragment { 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)); @@ -764,16 +832,16 @@ public class DomainSettingsFragment extends Fragment { // 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) { + if (darkTheme) { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_enabled_dark)); } else { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_enabled_light)); } } else { // Night mode disabled by default. // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_disabled_dark)); } else { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_disabled_light)); @@ -786,7 +854,7 @@ public class DomainSettingsFragment extends Fragment { case DomainsDatabaseHelper.NIGHT_MODE_ENABLED: // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_enabled_dark)); } else { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_enabled_light)); @@ -798,7 +866,7 @@ public class DomainSettingsFragment extends Fragment { case DomainsDatabaseHelper.NIGHT_MODE_DISABLED: // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_disabled_dark)); } else { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_disabled_light)); @@ -819,7 +887,7 @@ public class DomainSettingsFragment extends Fragment { displayWebpageImagesSpinner.setSelection(displayImagesInt); // Set the default display images text. - if (defaultDisplayWebpageImagesBoolean) { + if (defaultDisplayWebpageImages) { displayImagesTextView.setText(displayImagesArrayAdapter.getItem(DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_ENABLED)); } else { displayImagesTextView.setText(displayImagesArrayAdapter.getItem(DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_DISABLED)); @@ -828,16 +896,16 @@ public class DomainSettingsFragment extends Fragment { // 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. + if (defaultDisplayWebpageImages) { // Display webpage images enabled by default. // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (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) { + if (darkTheme) { displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_dark)); } else { displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_light)); @@ -850,7 +918,7 @@ public class DomainSettingsFragment extends Fragment { case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_ENABLED: // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_dark)); } else { displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_light)); @@ -862,7 +930,7 @@ public class DomainSettingsFragment extends Fragment { case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_DISABLED: // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_dark)); } else { displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_light)); @@ -885,7 +953,7 @@ public class DomainSettingsFragment extends Fragment { pinnedSslCertificateSwitch.setChecked(true); // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { pinnedSslCertificateImageView.setImageDrawable(resources.getDrawable(R.drawable.ssl_certificate_enabled_dark)); } else { pinnedSslCertificateImageView.setImageDrawable(resources.getDrawable(R.drawable.ssl_certificate_enabled_light)); @@ -895,7 +963,7 @@ public class DomainSettingsFragment extends Fragment { pinnedSslCertificateSwitch.setChecked(false); // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { pinnedSslCertificateImageView.setImageDrawable(resources.getDrawable(R.drawable.ssl_certificate_disabled_dark)); } else { pinnedSslCertificateImageView.setImageDrawable(resources.getDrawable(R.drawable.ssl_certificate_disabled_light)); @@ -905,17 +973,17 @@ public class DomainSettingsFragment extends Fragment { // Store the current date. Date currentDate = Calendar.getInstance().getTime(); - // Setup the `StringBuilders` to display the general certificate information in blue. `SPAN_INCLUSIVE_INCLUSIVE` allows the span to grow in either direction. + // Setup the string builders to display the general certificate information in blue. `SPAN_INCLUSIVE_INCLUSIVE` allows the span to grow in either direction. savedSslCertificateIssuedToONameStringBuilder.setSpan(blueColorSpan, oNameLabel.length(), savedSslCertificateIssuedToONameStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); savedSslCertificateIssuedToUNameStringBuilder.setSpan(blueColorSpan, uNameLabel.length(), savedSslCertificateIssuedToUNameStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); savedSslCertificateIssuedByCNameStringBuilder.setSpan(blueColorSpan, cNameLabel.length(), savedSslCertificateIssuedByCNameStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); savedSslCertificateIssuedByONameStringBuilder.setSpan(blueColorSpan, oNameLabel.length(), savedSslCertificateIssuedByONameStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); savedSslCertificateIssuedByUNameStringBuilder.setSpan(blueColorSpan, uNameLabel.length(), savedSslCertificateIssuedByUNameStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); - // Check the certificate `Common Name` against the domain name. + // Check the certificate Common Name against the domain name. boolean savedSSlCertificateCommonNameMatchesDomainName = checkDomainNameAgainstCertificate(domainNameString, savedSslCertificateIssuedToCNameString); - // Format the `issuedToCommonName` color. `SPAN_INCLUSIVE_INCLUSIVE` allows the span to grow in either direction. + // Format the issued to Common Name color. `SPAN_INCLUSIVE_INCLUSIVE` allows the span to grow in either direction. if (savedSSlCertificateCommonNameMatchesDomainName) { savedSslCertificateIssuedToCNameStringBuilder.setSpan(blueColorSpan, cNameLabel.length(), savedSslCertificateIssuedToCNameStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); } else { @@ -936,7 +1004,7 @@ public class DomainSettingsFragment extends Fragment { savedSslCertificateEndDateStringBuilder.setSpan(blueColorSpan, endDateLabel.length(), savedSslCertificateEndDateStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); } - // Display the current website SSL certificate strings. + // Display the saved website SSL certificate strings. savedSslCertificateIssuedToCNameTextView.setText(savedSslCertificateIssuedToCNameStringBuilder); savedSslCertificateIssuedToONameTextView.setText(savedSslCertificateIssuedToONameStringBuilder); savedSslCertificateIssuedToUNameTextView.setText(savedSslCertificateIssuedToUNameStringBuilder); @@ -958,7 +1026,7 @@ public class DomainSettingsFragment extends Fragment { Date currentWebsiteCertificateStartDate = currentWebsiteSslCertificate.getValidNotBeforeDate(); Date currentWebsiteCertificateEndDate = currentWebsiteSslCertificate.getValidNotAfterDate(); - // Create a `SpannableStringBuilder` for each `TextView` that needs multiple colors of text. + // Create a spannable string builder for each text view that needs multiple colors of text. SpannableStringBuilder currentWebsiteCertificateIssuedToCNameStringBuilder = new SpannableStringBuilder(cNameLabel + currentWebsiteCertificateIssuedToCNameString); SpannableStringBuilder currentWebsiteCertificateIssuedToONameStringBuilder = new SpannableStringBuilder(oNameLabel + currentWebsiteCertificateIssuedToONameString); SpannableStringBuilder currentWebsiteCertificateIssuedToUNameStringBuilder = new SpannableStringBuilder(uNameLabel + currentWebsiteCertificateIssuedToUNameString); @@ -970,17 +1038,17 @@ public class DomainSettingsFragment extends Fragment { SpannableStringBuilder currentWebsiteCertificateEndDateStringBuilder = new SpannableStringBuilder(endDateLabel + DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.LONG) .format(currentWebsiteCertificateEndDate)); - // Setup the `StringBuilders` to display the general certificate information in blue. `SPAN_INCLUSIVE_INCLUSIVE` allows the span to grow in either direction. + // Setup the string builders to display the general certificate information in blue. `SPAN_INCLUSIVE_INCLUSIVE` allows the span to grow in either direction. currentWebsiteCertificateIssuedToONameStringBuilder.setSpan(blueColorSpan, oNameLabel.length(), currentWebsiteCertificateIssuedToONameStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); currentWebsiteCertificateIssuedToUNameStringBuilder.setSpan(blueColorSpan, uNameLabel.length(), currentWebsiteCertificateIssuedToUNameStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); currentWebsiteCertificateIssuedByCNameStringBuilder.setSpan(blueColorSpan, cNameLabel.length(), currentWebsiteCertificateIssuedByCNameStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); currentWebsiteCertificateIssuedByONameStringBuilder.setSpan(blueColorSpan, oNameLabel.length(), currentWebsiteCertificateIssuedByONameStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); currentWebsiteCertificateIssuedByUNameStringBuilder.setSpan(blueColorSpan, uNameLabel.length(), currentWebsiteCertificateIssuedByUNameStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); - // Check the certificate `Common Name` against the domain name. + // Check the certificate Common Name against the domain name. boolean currentWebsiteCertificateCommonNameMatchesDomainName = checkDomainNameAgainstCertificate(domainNameString, currentWebsiteCertificateIssuedToCNameString); - // Format the `issuedToCommonName` color. `SPAN_INCLUSIVE_INCLUSIVE` allows the span to grow in either direction. + // Format the issued to Common Name color. `SPAN_INCLUSIVE_INCLUSIVE` allows the span to grow in either direction. if (currentWebsiteCertificateCommonNameMatchesDomainName) { currentWebsiteCertificateIssuedToCNameStringBuilder.setSpan(blueColorSpan, cNameLabel.length(), currentWebsiteCertificateIssuedToCNameStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); } else { @@ -1012,45 +1080,59 @@ public class DomainSettingsFragment extends Fragment { currentWebsiteCertificateEndDateTextView.setText(currentWebsiteCertificateEndDateStringBuilder); } - // Set the initial display status for the SSL certificates. - if (pinnedSslCertificateSwitch.isChecked()) { + // Set the initial display status of the SSL certificates card views. + if (pinnedSslCertificateSwitch.isChecked()) { // An SSL certificate is pinned. // Set the visibility of the saved SSL certificate. if (savedSslCertificateIssuedToCNameString == null) { - savedSslCertificateLinearLayout.setVisibility(View.GONE); + savedSslCertificateCardView.setVisibility(View.GONE); } else { - savedSslCertificateLinearLayout.setVisibility(View.VISIBLE); + savedSslCertificateCardView.setVisibility(View.VISIBLE); } // Set the visibility of the current website SSL certificate. - if (currentWebsiteSslCertificate == null) { + if (currentWebsiteSslCertificate == null) { // There is no current SSL certificate. // Hide the SSL certificate. - currentWebsiteCertificateLinearLayout.setVisibility(View.GONE); + currentWebsiteCertificateCardView.setVisibility(View.GONE); // Show the instruction. noCurrentWebsiteCertificateTextView.setVisibility(View.VISIBLE); - } else { + } else { // There is a current SSL certificate. // Show the SSL certificate. - currentWebsiteCertificateLinearLayout.setVisibility(View.VISIBLE); + currentWebsiteCertificateCardView.setVisibility(View.VISIBLE); // Hide the instruction. noCurrentWebsiteCertificateTextView.setVisibility(View.GONE); } - // Set the status of the radio buttons. - if (savedSslCertificateLinearLayout.getVisibility() == View.VISIBLE) { // The saved SSL certificate is displayed. + // Set the status of the radio buttons and the card view backgrounds. + if (savedSslCertificateCardView.getVisibility() == View.VISIBLE) { // The saved SSL certificate is displayed. + // Check the saved SSL certificate radio button. savedSslCertificateRadioButton.setChecked(true); + + // Uncheck the current website SSL certificate radio button. currentWebsiteCertificateRadioButton.setChecked(false); - } else if (currentWebsiteCertificateLinearLayout.getVisibility() == View.VISIBLE) { // The saved SSL certificate is hidden but the current website SSL certificate is visible. + + // Darken the background of the current website SSL certificate linear layout according to the theme. + if (darkTheme) { + currentWebsiteCertificateLinearLayout.setBackgroundResource(R.color.black_translucent_33); + } else { + currentWebsiteCertificateLinearLayout.setBackgroundResource(R.color.black_translucent_11); + } + } else if (currentWebsiteCertificateCardView.getVisibility() == View.VISIBLE) { // The saved SSL certificate is hidden but the current website SSL certificate is visible. + // Check the current website SSL certificate radio button. currentWebsiteCertificateRadioButton.setChecked(true); + + // Uncheck the saved SSL certificate radio button. savedSslCertificateRadioButton.setChecked(false); } else { // Neither SSL certificate is visible. + // Uncheck both radio buttons. savedSslCertificateRadioButton.setChecked(false); currentWebsiteCertificateRadioButton.setChecked(false); } - } else { // `pinnedSslCertificateSwitch` is not checked. + } else { // An SSL certificate is not pinned. // Hide the SSl certificates and instructions. - savedSslCertificateLinearLayout.setVisibility(View.GONE); - currentWebsiteCertificateLinearLayout.setVisibility(View.GONE); + savedSslCertificateCardView.setVisibility(View.GONE); + currentWebsiteCertificateCardView.setVisibility(View.GONE); noCurrentWebsiteCertificateTextView.setVisibility(View.GONE); // Uncheck the radio buttons. @@ -1058,6 +1140,76 @@ public class DomainSettingsFragment extends Fragment { currentWebsiteCertificateRadioButton.setChecked(false); } + // Set the pinned IP addresses icon. + if (pinnedIpAddressesInt == 1) { // Pinned IP addresses is enabled. Once the minimum API >= 21 a selector can be sued as the tint mode instead of specifying different icons. + // Check the switch. + pinnedIpAddressesSwitch.setChecked(true); + + // Set the icon according to the theme. + if (darkTheme) { + pinnedIpAddressesImageView.setImageDrawable(resources.getDrawable(R.drawable.ssl_certificate_enabled_dark)); + } else { + pinnedIpAddressesImageView.setImageDrawable(resources.getDrawable(R.drawable.ssl_certificate_enabled_light)); + } + } else { // Pinned IP Addresses is disabled. + // Uncheck the switch. + pinnedIpAddressesSwitch.setChecked(false); + + // Set the icon according to the theme. + if (darkTheme) { + pinnedIpAddressesImageView.setImageDrawable(resources.getDrawable(R.drawable.ssl_certificate_disabled_dark)); + } else { + pinnedIpAddressesImageView.setImageDrawable(resources.getDrawable(R.drawable.ssl_certificate_disabled_light)); + } + } + + // Populate the saved and current IP addresses. + savedIpAddressesTextView.setText(savedIpAddresses); + currentIpAddressesTextView.setText(DomainsActivity.currentIpAddresses); + + // Set the initial display status of the IP addresses card views. + if (pinnedIpAddressesSwitch.isChecked()) { // IP addresses are pinned. + // Set the visibility of the saved IP addresses. + if (savedIpAddresses == null) { // There are no saved IP addresses. + savedIpAddressesCardView.setVisibility(View.GONE); + } else { // There are saved IP addresses. + savedIpAddressesCardView.setVisibility(View.VISIBLE); + } + + // Set the visibility of the current IP addresses. + currentIpAddressesCardView.setVisibility(View.VISIBLE); + + // Set the status of the radio buttons and the card view backgrounds. + if (savedIpAddressesCardView.getVisibility() == View.VISIBLE) { // The saved IP addresses are displayed. + // Check the saved IP addresses radio button. + savedIpAddressesRadioButton.setChecked(true); + + // Uncheck the current IP addresses radio button. + currentIpAddressesRadioButton.setChecked(false); + + // Darken the background of the current IP addresses linear layout according to the theme. + if (darkTheme) { + currentIpAddressesLinearLayout.setBackgroundResource(R.color.black_translucent_33); + } else { + currentIpAddressesLinearLayout.setBackgroundResource(R.color.black_translucent_11); + } + } else { // The saved IP addresses are hidden. + // Check the current IP addresses radio button. + currentIpAddressesRadioButton.setChecked(true); + + // Uncheck the saved IP addresses radio button. + savedIpAddressesRadioButton.setChecked(false); + } + } else { // IP addresses are not pinned. + // Hide the IP addresses card views. + savedIpAddressesCardView.setVisibility(View.GONE); + currentIpAddressesCardView.setVisibility(View.GONE); + + // Uncheck the radio buttons. + savedIpAddressesRadioButton.setChecked(false); + currentIpAddressesRadioButton.setChecked(false); + } + // Set the JavaScript switch listener. javaScriptEnabledSwitch.setOnCheckedChangeListener((CompoundButton buttonView, boolean isChecked) -> { @@ -1073,7 +1225,7 @@ public class DomainSettingsFragment extends Fragment { domStorageImageView.setImageDrawable(resources.getDrawable(R.drawable.dom_storage_enabled)); } else { // DOM storage is disabled. // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { domStorageImageView.setImageDrawable(resources.getDrawable(R.drawable.dom_storage_disabled_dark)); } else { domStorageImageView.setImageDrawable(resources.getDrawable(R.drawable.dom_storage_disabled_light)); @@ -1087,7 +1239,7 @@ public class DomainSettingsFragment extends Fragment { domStorageEnabledSwitch.setEnabled(false); // Set the DOM storage icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { domStorageImageView.setImageDrawable(resources.getDrawable(R.drawable.dom_storage_ghosted_dark)); } else { domStorageImageView.setImageDrawable(resources.getDrawable(R.drawable.dom_storage_ghosted_light)); @@ -1109,7 +1261,7 @@ public class DomainSettingsFragment extends Fragment { thirdPartyCookiesImageView.setImageDrawable(resources.getDrawable(R.drawable.cookies_warning)); } else { // Third-party cookies are disabled. // Set the third-party cookies icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { thirdPartyCookiesImageView.setImageDrawable(resources.getDrawable(R.drawable.cookies_disabled_dark)); } else { thirdPartyCookiesImageView.setImageDrawable(resources.getDrawable(R.drawable.cookies_disabled_light)); @@ -1117,7 +1269,7 @@ public class DomainSettingsFragment extends Fragment { } } else { // First-party cookies are disabled. // Update the first-party cookies icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { firstPartyCookiesImageView.setImageDrawable(resources.getDrawable(R.drawable.cookies_disabled_dark)); } else { firstPartyCookiesImageView.setImageDrawable(resources.getDrawable(R.drawable.cookies_disabled_light)); @@ -1127,7 +1279,7 @@ public class DomainSettingsFragment extends Fragment { thirdPartyCookiesEnabledSwitch.setEnabled(false); // Set the third-party cookies icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { thirdPartyCookiesImageView.setImageDrawable(resources.getDrawable(R.drawable.cookies_ghosted_dark)); } else { thirdPartyCookiesImageView.setImageDrawable(resources.getDrawable(R.drawable.cookies_ghosted_light)); @@ -1142,7 +1294,7 @@ public class DomainSettingsFragment extends Fragment { thirdPartyCookiesImageView.setImageDrawable(resources.getDrawable(R.drawable.cookies_warning)); } else { // Update the third-party cookies icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { thirdPartyCookiesImageView.setImageDrawable(resources.getDrawable(R.drawable.cookies_disabled_dark)); } else { thirdPartyCookiesImageView.setImageDrawable(resources.getDrawable(R.drawable.cookies_disabled_light)); @@ -1157,7 +1309,7 @@ public class DomainSettingsFragment extends Fragment { domStorageImageView.setImageDrawable(resources.getDrawable(R.drawable.dom_storage_enabled)); } else { // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { domStorageImageView.setImageDrawable(resources.getDrawable(R.drawable.dom_storage_disabled_dark)); } else { domStorageImageView.setImageDrawable(resources.getDrawable(R.drawable.dom_storage_disabled_light)); @@ -1173,7 +1325,7 @@ public class DomainSettingsFragment extends Fragment { formDataImageView.setImageDrawable(resources.getDrawable(R.drawable.form_data_enabled)); } else { // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { formDataImageView.setImageDrawable(resources.getDrawable(R.drawable.form_data_disabled_dark)); } else { formDataImageView.setImageDrawable(resources.getDrawable(R.drawable.form_data_disabled_light)); @@ -1187,14 +1339,14 @@ public class DomainSettingsFragment extends Fragment { // Update the icon. if (isChecked) { // EasyList is on. // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { easyListImageView.setImageDrawable(resources.getDrawable(R.drawable.block_ads_enabled_dark)); } else { easyListImageView.setImageDrawable(resources.getDrawable(R.drawable.block_ads_enabled_light)); } } else { // EasyList is off. // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { easyListImageView.setImageDrawable(resources.getDrawable(R.drawable.block_ads_disabled_dark)); } else { easyListImageView.setImageDrawable(resources.getDrawable(R.drawable.block_ads_disabled_light)); @@ -1207,14 +1359,14 @@ public class DomainSettingsFragment extends Fragment { // Update the icon. if (isChecked) { // EasyPrivacy is on. // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { easyPrivacyImageView.setImageDrawable(resources.getDrawable(R.drawable.block_tracking_enabled_dark)); } else { easyPrivacyImageView.setImageDrawable(resources.getDrawable(R.drawable.block_tracking_enabled_light)); } } else { // EasyPrivacy is off. // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { easyPrivacyImageView.setImageDrawable(resources.getDrawable(R.drawable.block_tracking_disabled_dark)); } else { easyPrivacyImageView.setImageDrawable(resources.getDrawable(R.drawable.block_tracking_disabled_light)); @@ -1227,7 +1379,7 @@ public class DomainSettingsFragment extends Fragment { // Update the icon and Fanboy's Social Blocking List. if (isChecked) { // Fanboy's Annoyance List is on. // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { fanboysAnnoyanceListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_enabled_dark)); } else { fanboysAnnoyanceListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_enabled_light)); @@ -1237,14 +1389,14 @@ public class DomainSettingsFragment extends Fragment { fanboysSocialBlockingListSwitch.setEnabled(false); // Update the Fanboy's Social Blocking List icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { fanboysSocialBlockingListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_ghosted_dark)); } else { fanboysSocialBlockingListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_ghosted_light)); } } else { // Fanboy's Annoyance List is off. // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { fanboysAnnoyanceListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_disabled_dark)); } else { fanboysAnnoyanceListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_disabled_light)); @@ -1256,14 +1408,14 @@ public class DomainSettingsFragment extends Fragment { // Update the Fanboy's Social Blocking List icon. if (fanboysSocialBlockingListSwitch.isChecked()) { // Fanboy's Social Blocking List is on. // Update the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { fanboysSocialBlockingListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_enabled_dark)); } else { fanboysSocialBlockingListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_enabled_light)); } } else { // Fanboy's Social Blocking List is off. // Update the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { fanboysSocialBlockingListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_disabled_dark)); } else { fanboysSocialBlockingListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_disabled_light)); @@ -1278,14 +1430,14 @@ public class DomainSettingsFragment extends Fragment { // Update the icon. if (isChecked) { // Fanboy's Social Blocking List is on. // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { fanboysSocialBlockingListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_enabled_dark)); } else { fanboysSocialBlockingListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_enabled_light)); } } else { // Fanboy's Social Blocking List is off. // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { fanboysSocialBlockingListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_disabled_dark)); } else { fanboysSocialBlockingListImageView.setImageDrawable(resources.getDrawable(R.drawable.social_media_disabled_light)); @@ -1293,6 +1445,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 (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 (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 (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 (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 @@ -1388,16 +1580,16 @@ 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.SWIPE_TO_REFRESH_SYSTEM_DEFAULT: - if (defaultSwipeToRefreshBoolean) { // Swipe to refresh enabled by default. + if (defaultSwipeToRefresh) { // Swipe to refresh enabled by default. // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_enabled_dark)); } else { swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_enabled_light)); } } else { // Swipe to refresh disabled by default. // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_disabled_dark)); } else { swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_disabled_light)); @@ -1410,7 +1602,7 @@ public class DomainSettingsFragment extends Fragment { case DomainsDatabaseHelper.SWIPE_TO_REFRESH_ENABLED: // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_enabled_dark)); } else { swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_enabled_light)); @@ -1422,7 +1614,7 @@ public class DomainSettingsFragment extends Fragment { case DomainsDatabaseHelper.SWIPE_TO_REFRESH_DISABLED: // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_disabled_dark)); } else { swipeToRefreshImageView.setImageDrawable(resources.getDrawable(R.drawable.refresh_disabled_light)); @@ -1446,16 +1638,16 @@ 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) { + if (darkTheme) { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_enabled_dark)); } else { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_enabled_light)); } } else { // Night mode disabled by default. // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_disabled_dark)); } else { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_disabled_light)); @@ -1468,7 +1660,7 @@ public class DomainSettingsFragment extends Fragment { case DomainsDatabaseHelper.NIGHT_MODE_ENABLED: // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_enabled_dark)); } else { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_enabled_light)); @@ -1480,7 +1672,7 @@ public class DomainSettingsFragment extends Fragment { case DomainsDatabaseHelper.NIGHT_MODE_DISABLED: // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_disabled_dark)); } else { nightModeImageView.setImageDrawable(resources.getDrawable(R.drawable.night_mode_disabled_light)); @@ -1492,7 +1684,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) { @@ -1522,7 +1714,7 @@ public class DomainSettingsFragment extends Fragment { domStorageEnabledSwitch.setChecked(false); // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { domStorageImageView.setImageDrawable(resources.getDrawable(R.drawable.dom_storage_disabled_dark)); } else { domStorageImageView.setImageDrawable(resources.getDrawable(R.drawable.dom_storage_disabled_light)); @@ -1540,7 +1732,7 @@ public class DomainSettingsFragment extends Fragment { } // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { domStorageImageView.setImageDrawable(resources.getDrawable(R.drawable.dom_storage_ghosted_dark)); } else { domStorageImageView.setImageDrawable(resources.getDrawable(R.drawable.dom_storage_ghosted_light)); @@ -1561,16 +1753,16 @@ public class DomainSettingsFragment extends Fragment { // Update the icon and the visibility of `displayImagesTextView`. switch (position) { case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_SYSTEM_DEFAULT: - if (defaultDisplayWebpageImagesBoolean) { + if (defaultDisplayWebpageImages) { // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (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) { + if (darkTheme) { displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_dark)); } else { displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_light)); @@ -1583,7 +1775,7 @@ public class DomainSettingsFragment extends Fragment { case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_ENABLED: // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_dark)); } else { displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_enabled_light)); @@ -1595,7 +1787,7 @@ public class DomainSettingsFragment extends Fragment { case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_DISABLED: // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_dark)); } else { displayWebpageImagesImageView.setImageDrawable(resources.getDrawable(R.drawable.images_disabled_light)); @@ -1615,10 +1807,10 @@ public class DomainSettingsFragment extends Fragment { // Set the pinned SSL certificate switch listener. pinnedSslCertificateSwitch.setOnCheckedChangeListener((CompoundButton buttonView, boolean isChecked) -> { - // Update the icon - if (isChecked) { // Pinned SSL certificate is enabled. + // Update the icon. + if (isChecked) { // SSL certificate pinning is enabled. // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { pinnedSslCertificateImageView.setImageDrawable(resources.getDrawable(R.drawable.ssl_certificate_enabled_dark)); } else { pinnedSslCertificateImageView.setImageDrawable(resources.getDrawable(R.drawable.ssl_certificate_enabled_light)); @@ -1626,48 +1818,84 @@ public class DomainSettingsFragment extends Fragment { // Update the visibility of the saved SSL certificate. if (savedSslCertificateIssuedToCNameString == null) { - savedSslCertificateLinearLayout.setVisibility(View.GONE); + savedSslCertificateCardView.setVisibility(View.GONE); } else { - savedSslCertificateLinearLayout.setVisibility(View.VISIBLE); + savedSslCertificateCardView.setVisibility(View.VISIBLE); } // Update the visibility of the current website SSL certificate. if (currentWebsiteSslCertificate == null) { // Hide the SSL certificate. - currentWebsiteCertificateLinearLayout.setVisibility(View.GONE); + currentWebsiteCertificateCardView.setVisibility(View.GONE); // Show the instruction. noCurrentWebsiteCertificateTextView.setVisibility(View.VISIBLE); } else { // Show the SSL certificate. - currentWebsiteCertificateLinearLayout.setVisibility(View.VISIBLE); + currentWebsiteCertificateCardView.setVisibility(View.VISIBLE); // Hide the instruction. noCurrentWebsiteCertificateTextView.setVisibility(View.GONE); } // Set the status of the radio buttons. - if (savedSslCertificateLinearLayout.getVisibility() == View.VISIBLE) { // The saved SSL certificate is displayed. + if (savedSslCertificateCardView.getVisibility() == View.VISIBLE) { // The saved SSL certificate is displayed. + // Check the saved SSL certificate radio button. savedSslCertificateRadioButton.setChecked(true); + + // Uncheck the current website SSL certificate radio button. currentWebsiteCertificateRadioButton.setChecked(false); - } else if (currentWebsiteCertificateLinearLayout.getVisibility() == View.VISIBLE) { // The saved SSL certificate is hidden but the current website SSL certificate is visible. + + // Set the background of the saved SSL certificate linear layout to be transparent. + savedSslCertificateLinearLayout.setBackgroundResource(R.color.transparent); + + // Darken the background of the current website SSL certificate linear layout according to the theme. + if (darkTheme) { + currentWebsiteCertificateLinearLayout.setBackgroundResource(R.color.black_translucent_33); + } else { + currentWebsiteCertificateLinearLayout.setBackgroundResource(R.color.black_translucent_11); + } + + // Scroll to the current website SSL certificate card. + savedSslCertificateCardView.getParent().requestChildFocus(savedSslCertificateCardView, savedSslCertificateCardView); + } else if (currentWebsiteCertificateCardView.getVisibility() == View.VISIBLE) { // The saved SSL certificate is hidden but the current website SSL certificate is visible. + // Check the current website SSL certificate radio button. currentWebsiteCertificateRadioButton.setChecked(true); + + // Uncheck the saved SSL certificate radio button. savedSslCertificateRadioButton.setChecked(false); + + // Set the background of the current website SSL certificate linear layout to be transparent. + currentWebsiteCertificateLinearLayout.setBackgroundResource(R.color.transparent); + + // Darken the background of the saved SSL certificate linear layout according to the theme. + if (darkTheme) { + savedSslCertificateLinearLayout.setBackgroundResource(R.color.black_translucent_33); + } else { + savedSslCertificateLinearLayout.setBackgroundResource(R.color.black_translucent_11); + } + + // Scroll to the current website SSL certificate card. + currentWebsiteCertificateCardView.getParent().requestChildFocus(currentWebsiteCertificateCardView, currentWebsiteCertificateCardView); } else { // Neither SSL certificate is visible. + // Uncheck both radio buttons. savedSslCertificateRadioButton.setChecked(false); currentWebsiteCertificateRadioButton.setChecked(false); + + // Scroll to the current website SSL certificate card. + noCurrentWebsiteCertificateTextView.getParent().requestChildFocus(noCurrentWebsiteCertificateTextView, noCurrentWebsiteCertificateTextView); } - } else { // Pinned SSL certificate is disabled. + } else { // SSL certificate pinning is disabled. // Set the icon according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { pinnedSslCertificateImageView.setImageDrawable(resources.getDrawable(R.drawable.ssl_certificate_disabled_dark)); } else { pinnedSslCertificateImageView.setImageDrawable(resources.getDrawable(R.drawable.ssl_certificate_disabled_light)); } // Hide the SSl certificates and instructions. - savedSslCertificateLinearLayout.setVisibility(View.GONE); - currentWebsiteCertificateLinearLayout.setVisibility(View.GONE); + savedSslCertificateCardView.setVisibility(View.GONE); + currentWebsiteCertificateCardView.setVisibility(View.GONE); noCurrentWebsiteCertificateTextView.setVisibility(View.GONE); // Uncheck the radio buttons. @@ -1676,24 +1904,224 @@ public class DomainSettingsFragment extends Fragment { } }); - savedSslCertificateLinearLayout.setOnClickListener((View v) -> { + savedSslCertificateCardView.setOnClickListener((View view) -> { + // Check the saved SSL certificate radio button. savedSslCertificateRadioButton.setChecked(true); + + // Uncheck the current website SSL certificate radio button. currentWebsiteCertificateRadioButton.setChecked(false); + + // Set the background of the saved SSL certificate linear layout to be transparent. + savedSslCertificateLinearLayout.setBackgroundResource(R.color.transparent); + + // Darken the background of the current website SSL certificate linear layout according to the theme. + if (darkTheme) { + currentWebsiteCertificateLinearLayout.setBackgroundResource(R.color.black_translucent_33); + } else { + currentWebsiteCertificateLinearLayout.setBackgroundResource(R.color.black_translucent_11); + } }); - savedSslCertificateRadioButton.setOnClickListener((View v) -> { + savedSslCertificateRadioButton.setOnClickListener((View view) -> { + // Check the saved SSL certificate radio button. savedSslCertificateRadioButton.setChecked(true); + + // Uncheck the current website SSL certificate radio button. currentWebsiteCertificateRadioButton.setChecked(false); + + // Set the background of the saved SSL certificate linear layout to be transparent. + savedSslCertificateLinearLayout.setBackgroundResource(R.color.transparent); + + // Darken the background of the current website SSL certificate linear layout according to the theme. + if (darkTheme) { + currentWebsiteCertificateLinearLayout.setBackgroundResource(R.color.black_translucent_33); + } else { + currentWebsiteCertificateLinearLayout.setBackgroundResource(R.color.black_translucent_11); + } }); - currentWebsiteCertificateLinearLayout.setOnClickListener((View v) -> { + currentWebsiteCertificateCardView.setOnClickListener((View view) -> { + // Check the current website SSL certificate radio button. currentWebsiteCertificateRadioButton.setChecked(true); + + // Uncheck the saved SSL certificate radio button. savedSslCertificateRadioButton.setChecked(false); + + // Set the background of the current website SSL certificate linear layout to be transparent. + currentWebsiteCertificateLinearLayout.setBackgroundResource(R.color.transparent); + + // Darken the background of the saved SSL certificate linear layout according to the theme. + if (darkTheme) { + savedSslCertificateLinearLayout.setBackgroundResource(R.color.black_translucent_33); + } else { + savedSslCertificateLinearLayout.setBackgroundResource(R.color.black_translucent_11); + } }); - currentWebsiteCertificateRadioButton.setOnClickListener((View v) -> { + currentWebsiteCertificateRadioButton.setOnClickListener((View view) -> { + // Check the current website SSL certificate radio button. currentWebsiteCertificateRadioButton.setChecked(true); + + // Uncheck the saved SSL certificate radio button. savedSslCertificateRadioButton.setChecked(false); + + // Set the background of the current website SSL certificate linear layout to be transparent. + currentWebsiteCertificateLinearLayout.setBackgroundResource(R.color.transparent); + + // Darken the background of the saved SSL certificate linear layout according to the theme. + if (darkTheme) { + savedSslCertificateLinearLayout.setBackgroundResource(R.color.black_translucent_33); + } else { + savedSslCertificateLinearLayout.setBackgroundResource(R.color.black_translucent_11); + } + }); + + // Set the pinned IP addresses switch listener. + pinnedIpAddressesSwitch.setOnCheckedChangeListener((CompoundButton buttonView, boolean isChecked) -> { + // Update the icon. + if (isChecked) { // IP addresses pinning is enabled. + // Set the icon according to the theme. + if (darkTheme) { + pinnedIpAddressesImageView.setImageDrawable(resources.getDrawable(R.drawable.ssl_certificate_enabled_dark)); + } else { + pinnedIpAddressesImageView.setImageDrawable(resources.getDrawable(R.drawable.ssl_certificate_enabled_light)); + } + + // Update the visibility of the saved IP addresses card view. + if (savedIpAddresses == null) { // There are no saved IP addresses. + savedIpAddressesCardView.setVisibility(View.GONE); + } else { // There are saved IP addresses. + savedIpAddressesCardView.setVisibility(View.VISIBLE); + } + + // Show the current IP addresses card view. + currentIpAddressesCardView.setVisibility(View.VISIBLE); + + // Set the status of the radio buttons. + if (savedIpAddressesCardView.getVisibility() == View.VISIBLE) { // The saved IP addresses are visible. + // Check the saved IP addresses radio button. + savedIpAddressesRadioButton.setChecked(true); + + // Uncheck the current IP addresses radio button. + currentIpAddressesRadioButton.setChecked(false); + + // Set the background of the saved IP addresses linear layout to be transparent. + savedSslCertificateLinearLayout.setBackgroundResource(R.color.transparent); + + // Darken the background of the current IP addresses linear layout according to the theme. + if (darkTheme) { + currentIpAddressesLinearLayout.setBackgroundResource(R.color.black_translucent_33); + } else { + currentIpAddressesLinearLayout.setBackgroundResource(R.color.black_translucent_11); + } + } else { // The saved IP addresses are not visible. + // Check the current IP addresses radio button. + currentIpAddressesRadioButton.setChecked(true); + + // Uncheck the saved IP addresses radio button. + savedIpAddressesRadioButton.setChecked(false); + + // Set the background of the current IP addresses linear layout to be transparent. + currentIpAddressesLinearLayout.setBackgroundResource(R.color.transparent); + + // Darken the background of the saved IP addresses linear layout according to the theme. + if (darkTheme) { + savedIpAddressesLinearLayout.setBackgroundResource(R.color.black_translucent_33); + } else { + savedIpAddressesLinearLayout.setBackgroundResource(R.color.black_translucent_11); + } + } + + // Scroll to the bottom of the card views. + currentIpAddressesCardView.getParent().requestChildFocus(currentIpAddressesCardView, currentIpAddressesCardView); + } else { // IP addresses pinning is disabled. + // Set the icon according to the theme. + if (darkTheme) { + pinnedIpAddressesImageView.setImageDrawable(resources.getDrawable(R.drawable.ssl_certificate_disabled_dark)); + } else { + pinnedIpAddressesImageView.setImageDrawable(resources.getDrawable(R.drawable.ssl_certificate_disabled_light)); + } + + // Hide the IP addresses card views. + savedIpAddressesCardView.setVisibility(View.GONE); + currentIpAddressesCardView.setVisibility(View.GONE); + + // Uncheck the radio buttons. + savedIpAddressesRadioButton.setChecked(false); + currentIpAddressesRadioButton.setChecked(false); + } + }); + + savedIpAddressesCardView.setOnClickListener((View view) -> { + // Check the saved IP addresses radio button. + savedIpAddressesRadioButton.setChecked(true); + + // Uncheck the current website IP addresses radio button. + currentIpAddressesRadioButton.setChecked(false); + + // Set the background of the saved IP addresses linear layout to be transparent. + savedIpAddressesLinearLayout.setBackgroundResource(R.color.transparent); + + // Darken the background of the current IP addresses linear layout according to the theme. + if (darkTheme) { + currentIpAddressesLinearLayout.setBackgroundResource(R.color.black_translucent_33); + } else { + currentIpAddressesLinearLayout.setBackgroundResource(R.color.black_translucent_11); + } + }); + + savedIpAddressesRadioButton.setOnClickListener((View view) -> { + // Check the saved IP addresses radio button. + savedIpAddressesRadioButton.setChecked(true); + + // Uncheck the current website IP addresses radio button. + currentIpAddressesRadioButton.setChecked(false); + + // Set the background of the saved IP addresses linear layout to be transparent. + savedIpAddressesLinearLayout.setBackgroundResource(R.color.transparent); + + // Darken the background of the current IP addresses linear layout according to the theme. + if (darkTheme) { + currentIpAddressesLinearLayout.setBackgroundResource(R.color.black_translucent_33); + } else { + currentIpAddressesLinearLayout.setBackgroundResource(R.color.black_translucent_11); + } + }); + + currentIpAddressesCardView.setOnClickListener((View view) -> { + // Check the current IP addresses radio button. + currentIpAddressesRadioButton.setChecked(true); + + // Uncheck the saved IP addresses radio button. + savedIpAddressesRadioButton.setChecked(false); + + // Set the background of the current IP addresses linear layout to be transparent. + currentIpAddressesLinearLayout.setBackgroundResource(R.color.transparent); + + // Darken the background of the saved IP addresses linear layout according to the theme. + if (darkTheme) { + savedIpAddressesLinearLayout.setBackgroundResource(R.color.black_translucent_33); + } else { + savedIpAddressesLinearLayout.setBackgroundResource(R.color.black_translucent_11); + } + }); + + currentIpAddressesRadioButton.setOnClickListener((View view) -> { + // Check the current IP addresses radio button. + currentIpAddressesRadioButton.setChecked(true); + + // Uncheck the saved IP addresses radio button. + savedIpAddressesRadioButton.setChecked(false); + + // Set the background of the current IP addresses linear layout to be transparent. + currentIpAddressesLinearLayout.setBackgroundResource(R.color.transparent); + + // Darken the background of the saved IP addresses linear layout according to the theme. + if (darkTheme) { + savedIpAddressesLinearLayout.setBackgroundResource(R.color.black_translucent_33); + } else { + savedIpAddressesLinearLayout.setBackgroundResource(R.color.black_translucent_11); + } }); return domainSettingsView; @@ -1775,4 +2203,4 @@ public class DomainSettingsFragment extends Fragment { return domainNamesMatch; } -} +} \ No newline at end of file