From: Soren Stoutner Date: Sat, 23 Jul 2022 00:06:22 +0000 (-0700) Subject: Add Night Theme dual tone blue text. https://redmine.stoutner.com/issues/878 X-Git-Tag: v3.11~3 X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=commitdiff_plain;h=48ae68b846bb5bb035e0d86659e4736b6db6f12d Add Night Theme dual tone blue text. https://redmine.stoutner.com/issues/878 --- diff --git a/app/src/main/assets/de/about_licenses.html b/app/src/main/assets/de/about_licenses.html index db8f873c..c5944fe2 100644 --- a/app/src/main/assets/de/about_licenses.html +++ b/app/src/main/assets/de/about_licenses.html @@ -113,6 +113,7 @@

delete.

delete_forever.

devices_other.

+

disabled_by_default.

dns.

donut_small.

edit.

diff --git a/app/src/main/assets/de/guide_local_storage.html b/app/src/main/assets/de/guide_local_storage.html index 434b5c49..4161bfe8 100644 --- a/app/src/main/assets/de/guide_local_storage.html +++ b/app/src/main/assets/de/guide_local_storage.html @@ -1,7 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/assets/tr/about_licenses.html b/app/src/main/assets/tr/about_licenses.html index 71c13537..ef449180 100644 --- a/app/src/main/assets/tr/about_licenses.html +++ b/app/src/main/assets/tr/about_licenses.html @@ -112,6 +112,7 @@

delete.

delete_forever.

devices_other.

+

disabled_by_default.

dns.

donut_small.

edit.

diff --git a/app/src/main/java/com/stoutner/privacybrowser/activities/DomainsActivity.java b/app/src/main/java/com/stoutner/privacybrowser/activities/DomainsActivity.java index 03a39919..3718edbd 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/activities/DomainsActivity.java +++ b/app/src/main/java/com/stoutner/privacybrowser/activities/DomainsActivity.java @@ -748,6 +748,7 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo SwitchCompat blockAllThirdPartyRequestsSwitch = view.findViewById(R.id.block_all_third_party_requests_switch); Spinner userAgentSpinner = view.findViewById(R.id.user_agent_spinner); EditText customUserAgentEditText = view.findViewById(R.id.custom_user_agent_edittext); + Spinner xRequestedWithHeaderSpinner = view.findViewById(R.id.x_requested_with_header_spinner); Spinner fontSizeSpinner = view.findViewById(R.id.font_size_spinner); EditText customFontSizeEditText = view.findViewById(R.id.custom_font_size_edittext); Spinner swipeToRefreshSpinner = view.findViewById(R.id.swipe_to_refresh_spinner); @@ -773,6 +774,7 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo boolean ultraPrivacy = ultraPrivacySwitch.isChecked(); boolean blockAllThirdPartyRequests = blockAllThirdPartyRequestsSwitch.isChecked(); int userAgentSwitchPosition = userAgentSpinner.getSelectedItemPosition(); + int xRequestedWithHeaderSwitchInt = xRequestedWithHeaderSpinner.getSelectedItemPosition(); int fontSizeSwitchPosition = fontSizeSpinner.getSelectedItemPosition(); int swipeToRefreshInt = swipeToRefreshSpinner.getSelectedItemPosition(); int webViewThemeInt = webViewThemeSpinner.getSelectedItemPosition(); @@ -815,8 +817,8 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo // Save the domain settings. domainsDatabaseHelper.updateDomain(DomainsActivity.currentDomainDatabaseId, domainNameString, javaScript, cookies, domStorage, formData, easyList, easyPrivacy, - fanboysAnnoyance, fanboysSocialBlocking, ultraList, ultraPrivacy, blockAllThirdPartyRequests, userAgentName, fontSizeInt, swipeToRefreshInt, webViewThemeInt, wideViewportInt, - displayWebpageImagesInt, pinnedSslCertificate, pinnedIpAddress); + fanboysAnnoyance, fanboysSocialBlocking, ultraList, ultraPrivacy, blockAllThirdPartyRequests, userAgentName, xRequestedWithHeaderSwitchInt, fontSizeInt, swipeToRefreshInt, webViewThemeInt, + wideViewportInt, displayWebpageImagesInt, pinnedSslCertificate, pinnedIpAddress); // Update the pinned SSL certificate if a new one is checked. if (currentWebsiteCertificateRadioButton.isChecked()) { diff --git a/app/src/main/java/com/stoutner/privacybrowser/adapters/PinnedMismatchPagerAdapter.kt b/app/src/main/java/com/stoutner/privacybrowser/adapters/PinnedMismatchPagerAdapter.kt index 8953d854..6cf5485b 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/adapters/PinnedMismatchPagerAdapter.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/adapters/PinnedMismatchPagerAdapter.kt @@ -187,7 +187,7 @@ class PinnedMismatchPagerAdapter(private val context: Context, private val layou } // Create the color spans. - val blueColorSpan = ForegroundColorSpan(context.getColor(R.color.blue_text)) + val blueColorSpan = ForegroundColorSpan(context.getColor(R.color.alt_blue_text)) val redColorSpan = ForegroundColorSpan(context.getColor(R.color.red_text)) // Set the domain name to be blue. diff --git a/app/src/main/java/com/stoutner/privacybrowser/dialogs/SslCertificateErrorDialog.kt b/app/src/main/java/com/stoutner/privacybrowser/dialogs/SslCertificateErrorDialog.kt index 04ff8982..1179c29e 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/dialogs/SslCertificateErrorDialog.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/dialogs/SslCertificateErrorDialog.kt @@ -226,7 +226,7 @@ class SslCertificateErrorDialog : DialogFragment() { val endDateStringBuilder = SpannableStringBuilder(endDateLabel + endDate) // Define the color spans. - val blueColorSpan = ForegroundColorSpan(requireContext().getColor(R.color.blue_text)) + val blueColorSpan = ForegroundColorSpan(requireContext().getColor(R.color.alt_blue_text)) val redColorSpan = ForegroundColorSpan(requireContext().getColor(R.color.red_text)) // Setup the spans to display the certificate information in blue. `SPAN_INCLUSIVE_INCLUSIVE` allows the span to grow in either direction. @@ -363,7 +363,7 @@ class SslCertificateErrorDialog : DialogFragment() { val ipAddressesStringBuilder = SpannableStringBuilder(ipAddressesLabel + ipAddresses) // Create a blue color span according to the theme. - val blueColorSpan = ForegroundColorSpan(activity.getColor(R.color.blue_text)) + val blueColorSpan = ForegroundColorSpan(activity.getColor(R.color.alt_blue_text)) // Set the string builder to display the certificate information in blue. `SPAN_INCLUSIVE_INCLUSIVE` allows the span to grow in either direction. ipAddressesStringBuilder.setSpan(blueColorSpan, ipAddressesLabel.length, ipAddressesStringBuilder.length, Spanned.SPAN_INCLUSIVE_INCLUSIVE) diff --git a/app/src/main/java/com/stoutner/privacybrowser/dialogs/ViewSslCertificateDialog.kt b/app/src/main/java/com/stoutner/privacybrowser/dialogs/ViewSslCertificateDialog.kt index 0a79f806..04cdad8d 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/dialogs/ViewSslCertificateDialog.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/dialogs/ViewSslCertificateDialog.kt @@ -250,7 +250,7 @@ class ViewSslCertificateDialog : DialogFragment() { val endDateStringBuilder = SpannableStringBuilder(endDateLabel + DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.LONG).format(endDate)) // Define the color spans. - val blueColorSpan = ForegroundColorSpan(requireContext().getColor(R.color.blue_text)) + val blueColorSpan = ForegroundColorSpan(requireContext().getColor(R.color.alt_blue_text)) val redColorSpan = ForegroundColorSpan(requireContext().getColor(R.color.red_text)) // Format the domain string and issued to CName colors. diff --git a/app/src/main/java/com/stoutner/privacybrowser/fragments/AboutVersionFragment.kt b/app/src/main/java/com/stoutner/privacybrowser/fragments/AboutVersionFragment.kt index 7fb52dac..7dfeda99 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/fragments/AboutVersionFragment.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/fragments/AboutVersionFragment.kt @@ -363,7 +363,7 @@ class AboutVersionFragment : Fragment() { val ultraPrivacyStringBuilder = SpannableStringBuilder(ultraPrivacyLabel + blocklistVersions[5]) // Set the blue color span according to the theme. The deprecated `getColor()` must be used until the minimum API >= 23. - blueColorSpan = ForegroundColorSpan(requireContext().getColor(R.color.about_version_blue_text)) + blueColorSpan = ForegroundColorSpan(requireContext().getColor(R.color.alt_blue_text)) // Set the spans to display the device information in blue. `SPAN_INCLUSIVE_INCLUSIVE` allows the span to grow in either direction. brandStringBuilder.setSpan(blueColorSpan, brandLabel.length, brandStringBuilder.length, Spanned.SPAN_INCLUSIVE_INCLUSIVE) 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 474d01c2..365a4f79 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/fragments/DomainSettingsFragment.java +++ b/app/src/main/java/com/stoutner/privacybrowser/fragments/DomainSettingsFragment.java @@ -20,7 +20,6 @@ package com.stoutner.privacybrowser.fragments; import android.annotation.SuppressLint; -import android.content.Context; import android.content.SharedPreferences; import android.content.res.Configuration; import android.content.res.Resources; @@ -52,7 +51,7 @@ import androidx.annotation.NonNull; import androidx.appcompat.widget.SwitchCompat; import androidx.cardview.widget.CardView; import androidx.core.content.res.ResourcesCompat; -import androidx.fragment.app.Fragment; // The AndroidX fragment must be used until minimum API >= 23. Otherwise `getContext()` does not work. +import androidx.fragment.app.Fragment; import com.stoutner.privacybrowser.R; import com.stoutner.privacybrowser.activities.DomainsActivity; @@ -94,21 +93,18 @@ public class DomainSettingsFragment extends Fragment { View domainSettingsView = inflater.inflate(R.layout.domain_settings_fragment, container, false); // Get handles for the context and the resources. - Context context = getContext(); Resources resources = getResources(); - // Remove the error below that the context might be null. - assert context != null; - // Get the current theme status. int currentThemeStatus = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; // Get a handle for the shared preference. - SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()); // Store the default settings. String defaultUserAgentName = sharedPreferences.getString("user_agent", getString(R.string.user_agent_default_value)); String defaultCustomUserAgentString = sharedPreferences.getString("custom_user_agent", getString(R.string.custom_user_agent_default_value)); + boolean defaultXRequestedWithHeader = sharedPreferences.getBoolean(getString(R.string.x_requested_with_header_key), true); String defaultFontSizeString = sharedPreferences.getString("font_size", getString(R.string.font_size_default_value)); boolean defaultSwipeToRefresh = sharedPreferences.getBoolean("swipe_to_refresh", true); String defaultWebViewTheme = sharedPreferences.getString("webview_theme", getString(R.string.webview_theme_default_value)); @@ -143,6 +139,9 @@ public class DomainSettingsFragment extends Fragment { Spinner userAgentSpinner = domainSettingsView.findViewById(R.id.user_agent_spinner); TextView userAgentTextView = domainSettingsView.findViewById(R.id.user_agent_textview); EditText customUserAgentEditText = domainSettingsView.findViewById(R.id.custom_user_agent_edittext); + ImageView xRequestedWithHeaderImageView = domainSettingsView.findViewById(R.id.x_requested_with_header_imageview); + Spinner xRequestedWithHeaderSpinner = domainSettingsView.findViewById(R.id.x_requested_with_header_spinner); + TextView xRequestedWithHeaderTextView = domainSettingsView.findViewById(R.id.x_requested_with_header_textview); Spinner fontSizeSpinner = domainSettingsView.findViewById(R.id.font_size_spinner); TextView defaultFontSizeTextView = domainSettingsView.findViewById(R.id.default_font_size_textview); EditText customFontSizeEditText = domainSettingsView.findViewById(R.id.custom_font_size_edittext); @@ -222,6 +221,7 @@ public class DomainSettingsFragment extends Fragment { int ultraPrivacyInt = domainCursor.getInt(domainCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.ENABLE_ULTRAPRIVACY)); int blockAllThirdPartyRequestsInt = domainCursor.getInt(domainCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.BLOCK_ALL_THIRD_PARTY_REQUESTS)); String currentUserAgentName = domainCursor.getString(domainCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.USER_AGENT)); + int xRequestedWithHeaderInt = domainCursor.getInt(domainCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.X_REQUESTED_WITH_HEADER)); int fontSizeInt = domainCursor.getInt(domainCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.FONT_SIZE)); int swipeToRefreshInt = domainCursor.getInt(domainCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.SWIPE_TO_REFRESH)); int webViewThemeInt = domainCursor.getInt(domainCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.WEBVIEW_THEME)); @@ -251,15 +251,17 @@ public class DomainSettingsFragment extends Fragment { } // 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.font_size_array, R.layout.spinner_item); - ArrayAdapter swipeToRefreshArrayAdapter = ArrayAdapter.createFromResource(context, R.array.swipe_to_refresh_array, R.layout.spinner_item); - ArrayAdapter webViewThemeArrayAdapter = ArrayAdapter.createFromResource(context, R.array.webview_theme_array, R.layout.spinner_item); - ArrayAdapter wideViewportArrayAdapter = ArrayAdapter.createFromResource(context, R.array.wide_viewport_array, R.layout.spinner_item); - ArrayAdapter displayImagesArrayAdapter = ArrayAdapter.createFromResource(context, R.array.display_webpage_images_array, R.layout.spinner_item); + ArrayAdapter translatedUserAgentArrayAdapter = ArrayAdapter.createFromResource(requireContext(), R.array.translated_domain_settings_user_agent_names, R.layout.spinner_item); + ArrayAdapter xRequestedWithHeaderArrayAdapter = ArrayAdapter.createFromResource(requireContext(), R.array.x_requested_with_header_array, R.layout.spinner_item); + ArrayAdapter fontSizeArrayAdapter = ArrayAdapter.createFromResource(requireContext(), R.array.font_size_array, R.layout.spinner_item); + ArrayAdapter swipeToRefreshArrayAdapter = ArrayAdapter.createFromResource(requireContext(), R.array.swipe_to_refresh_array, R.layout.spinner_item); + ArrayAdapter webViewThemeArrayAdapter = ArrayAdapter.createFromResource(requireContext(), R.array.webview_theme_array, R.layout.spinner_item); + ArrayAdapter wideViewportArrayAdapter = ArrayAdapter.createFromResource(requireContext(), R.array.wide_viewport_array, R.layout.spinner_item); + ArrayAdapter displayImagesArrayAdapter = ArrayAdapter.createFromResource(requireContext(), 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); + xRequestedWithHeaderArrayAdapter.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); webViewThemeArrayAdapter.setDropDownViewResource(R.layout.domain_settings_spinner_dropdown_items); @@ -268,6 +270,7 @@ public class DomainSettingsFragment extends Fragment { // Set the array adapters for the spinners. userAgentSpinner.setAdapter(translatedUserAgentArrayAdapter); + xRequestedWithHeaderSpinner.setAdapter(xRequestedWithHeaderArrayAdapter); fontSizeSpinner.setAdapter(fontSizeArrayAdapter); swipeToRefreshSpinner.setAdapter(swipeToRefreshArrayAdapter); webViewThemeSpinner.setAdapter(webViewThemeArrayAdapter); @@ -300,8 +303,8 @@ public class DomainSettingsFragment extends Fragment { } // Create the color spans. - final ForegroundColorSpan blueColorSpan = new ForegroundColorSpan(context.getColor(R.color.blue_text)); - final ForegroundColorSpan redColorSpan = new ForegroundColorSpan(context.getColor(R.color.red_text)); + final ForegroundColorSpan blueColorSpan = new ForegroundColorSpan(requireContext().getColor(R.color.alt_blue_text)); + final ForegroundColorSpan redColorSpan = new ForegroundColorSpan(requireContext().getColor(R.color.red_text)); // Set the domain name from the the database cursor. domainNameEditText.setText(domainNameString); @@ -435,132 +438,29 @@ public class DomainSettingsFragment extends Fragment { } } - // Set the EasyList status. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. - // Doing this makes no sense until it can also be done with the preferences. - if (easyListInt == 1) { // EasyList is on. - // Turn the switch on. - easyListSwitch.setChecked(true); - - // Set the icon. - easyListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_ads_enabled, null)); - } else { // EasyList is off. - // Turn the switch off. - easyListSwitch.setChecked(false); - - // Set the icon. - easyListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_ads_disabled, null)); - } - - // Set the EasyPrivacy status. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. - // Doing this makes no sense until it can also be done with the preferences. - if (easyPrivacyInt == 1) { // EasyPrivacy is on. - // Turn the switch on. - easyPrivacySwitch.setChecked(true); - - // Set the icon. - easyPrivacyImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_tracking_enabled, null)); - } else { // EasyPrivacy is off. - // Turn the switch off. - easyPrivacySwitch.setChecked(false); - - // Set the icon. - easyPrivacyImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_tracking_disabled, null)); - } - - // Set the Fanboy's Annoyance List status. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. - // Doing this makes no sense until it can also be done with the preferences. - if (fanboysAnnoyanceListInt == 1) { // Fanboy's Annoyance List is on. - // Turn the switch on. - fanboysAnnoyanceListSwitch.setChecked(true); - - // Set the icon. - fanboysAnnoyanceListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.social_media_enabled, null)); - } else { // Fanboy's Annoyance List is off. - // Turn the switch off. - fanboysAnnoyanceListSwitch.setChecked(false); - - // Set the icon. - fanboysAnnoyanceListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.social_media_disabled, null)); - } - - // Only enable Fanboy's Social Blocking List if Fanboy's Annoyance List is off. - if (fanboysAnnoyanceListInt == 0) { // Fanboy's Annoyance List is on. - // Enable Fanboy's Social Blocking List switch. - fanboysSocialBlockingListSwitch.setEnabled(true); - - // Enable Fanboy's Social Blocking List. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. - // Doing this makes no sense until it can also be done with the preferences. - if (fanboysSocialBlockingListInt == 1) { // Fanboy's Social Blocking List is on. - // Turn on Fanboy's Social Blocking List switch. - fanboysSocialBlockingListSwitch.setChecked(true); - - // Set the icon. - fanboysSocialBlockingListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.social_media_enabled, null)); - } else { // Fanboy's Social Blocking List is off. - // Turn off Fanboy's Social Blocking List switch. - fanboysSocialBlockingListSwitch.setChecked(false); - - // Set the icon. - fanboysSocialBlockingListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.social_media_disabled, null)); - } - } else { // Fanboy's Annoyance List is on. - // Disable Fanboy's Social Blocking List switch. - fanboysSocialBlockingListSwitch.setEnabled(false); - - // Set the status of Fanboy's Social Blocking List. - fanboysSocialBlockingListSwitch.setChecked(fanboysSocialBlockingListInt == 1); - - // Set the icon. - fanboysSocialBlockingListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.social_media_ghosted, null)); - } - - // Set the UltraList status. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. - // Doing this makes no sense until it can also be done with the preferences. - if (ultraListInt == 1) { // UltraList is on. - // Turn the switch on. - ultraListSwitch.setChecked(true); - - // Set the icon. - ultraListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_ads_enabled, null)); - } else { // UltraList is off. - // Turn the switch off. - ultraListSwitch.setChecked(false); - - // Set the icon. - ultraListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_ads_disabled, null)); - } - - // Set the UltraPrivacy status. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. - // Doing this makes no sense until it can also be done with the preferences. - if (ultraPrivacyInt == 1) { // UltraPrivacy is on. - // Turn the switch on. - ultraPrivacySwitch.setChecked(true); - - // Set the icon. - ultraPrivacyImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_tracking_enabled, null)); - } else { // EasyPrivacy is off. - // Turn the switch off. - ultraPrivacySwitch.setChecked(false); - - // Set the icon. - ultraPrivacyImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_tracking_disabled, null)); - } - - // 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. - // Doing this makes no sense until it can also be done with the preferences. - if (blockAllThirdPartyRequestsInt == 1) { // Blocking all third-party requests is on. - // Turn the switch on. - blockAllThirdPartyRequestsSwitch.setChecked(true); - - // Set the icon. - blockAllThirdPartyRequestsImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_all_third_party_requests_enabled, null)); - } else { // Blocking all third-party requests is off. - // Turn the switch off. - blockAllThirdPartyRequestsSwitch.setChecked(false); - - // Set the icon. - blockAllThirdPartyRequestsImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_all_third_party_requests_disabled, null)); - } + // Set the switch positions. + easyListSwitch.setChecked(easyListInt == 1); + easyPrivacySwitch.setChecked(easyPrivacyInt == 1); + fanboysAnnoyanceListSwitch.setChecked(fanboysAnnoyanceListInt == 1); + fanboysSocialBlockingListSwitch.setChecked(fanboysSocialBlockingListInt == 1); + ultraListSwitch.setChecked(ultraListInt == 1); + ultraPrivacySwitch.setChecked(ultraPrivacyInt == 1); + blockAllThirdPartyRequestsSwitch.setChecked(blockAllThirdPartyRequestsInt == 1); + + // Set the switch icon colors. + easyListImageView.setSelected(easyListInt == 1); + easyPrivacyImageView.setSelected(easyPrivacyInt == 1); + fanboysAnnoyanceListImageView.setSelected(fanboysAnnoyanceListInt == 1); + fanboysSocialBlockingListImageView.setSelected(fanboysSocialBlockingListInt == 1); + ultraListImageView.setSelected(ultraListInt == 1); + ultraPrivacyImageView.setSelected(ultraPrivacyInt == 1); + blockAllThirdPartyRequestsImageView.setSelected(blockAllThirdPartyRequestsInt == 1); + + // Set Fanboy's Social Blocking List switch status based on the Annoyance List status. + fanboysSocialBlockingListSwitch.setEnabled(fanboysAnnoyanceListInt == 0); + + // Set the Social Blocking List icon ghosted status based on the Annoyance List status. + fanboysSocialBlockingListImageView.setEnabled(fanboysAnnoyanceListInt == 0); // 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. @@ -569,7 +469,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.spinner_item); + ArrayAdapter userAgentNamesArray = ArrayAdapter.createFromResource(requireContext(), 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); @@ -638,6 +538,48 @@ public class DomainSettingsFragment extends Fragment { userAgentSpinner.performClick(); }); + // Select the X-Requested-With header selection in the spinner. + xRequestedWithHeaderSpinner.setSelection(xRequestedWithHeaderInt); + + // Set the X-Requested-With header text. + if (defaultXRequestedWithHeader) + xRequestedWithHeaderTextView.setText(xRequestedWithHeaderArrayAdapter.getItem(DomainsDatabaseHelper.ENABLED)); + else + xRequestedWithHeaderTextView.setText(xRequestedWithHeaderArrayAdapter.getItem(DomainsDatabaseHelper.DISABLED)); + + // Set the X-Requested-With header icon and text view settings. + switch (xRequestedWithHeaderInt) { + case DomainsDatabaseHelper.SYSTEM_DEFAULT: + // Set the icon color. + xRequestedWithHeaderImageView.setSelected(defaultXRequestedWithHeader); + + // Show the X-Requested-With header text view. + xRequestedWithHeaderTextView.setVisibility(View.VISIBLE); + break; + + case DomainsDatabaseHelper.ENABLED: + // Set the icon color. + xRequestedWithHeaderImageView.setSelected(true); + + // Hide the X-Requested-With header text view. + xRequestedWithHeaderTextView.setVisibility(View.GONE); + break; + + case DomainsDatabaseHelper.DISABLED: + // Set the icon color. + xRequestedWithHeaderImageView.setSelected(false); + + // Hide the X-Requested-With header text view. + xRequestedWithHeaderTextView.setVisibility(View.GONE); + break; + } + + // Open the X-Requested-With header spinner when the text view is clicked. + xRequestedWithHeaderTextView.setOnClickListener((View v) -> { + // Open the X-Requested-With header spinner. + xRequestedWithHeaderSpinner.performClick(); + }); + // Display the font size settings. if (fontSizeInt == 0) { // `0` is the code for system default font size. // Set the font size to the system default @@ -681,39 +623,32 @@ public class DomainSettingsFragment extends Fragment { swipeToRefreshSpinner.setSelection(swipeToRefreshInt); // Set the swipe to refresh text. - if (defaultSwipeToRefresh) { + if (defaultSwipeToRefresh) swipeToRefreshTextView.setText(swipeToRefreshArrayAdapter.getItem(DomainsDatabaseHelper.ENABLED)); - } else { + else swipeToRefreshTextView.setText(swipeToRefreshArrayAdapter.getItem(DomainsDatabaseHelper.DISABLED)); - } - // Set the swipe to refresh icon and text view settings. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. - // Doing this makes no sense until it can also be done with the preferences. + // Set the swipe to refresh icon and text view settings. switch (swipeToRefreshInt) { case DomainsDatabaseHelper.SYSTEM_DEFAULT: - if (defaultSwipeToRefresh) { // Swipe to refresh is enabled by default. - // Set the icon. - swipeToRefreshImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.refresh_enabled, null)); - } else { - // Set the icon. - swipeToRefreshImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.refresh_disabled, null)); - } + // Set the icon color. + swipeToRefreshImageView.setSelected(defaultSwipeToRefresh); // Show the swipe to refresh text view. swipeToRefreshTextView.setVisibility(View.VISIBLE); break; case DomainsDatabaseHelper.ENABLED: - // Set the icon. - swipeToRefreshImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.refresh_enabled, null)); + // Set the icon color. + swipeToRefreshImageView.setSelected(true); // Hide the swipe to refresh text view. swipeToRefreshTextView.setVisibility(View.GONE); break; case DomainsDatabaseHelper.DISABLED: - // Set the icon. - swipeToRefreshImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.refresh_disabled, null)); + // Set the icon color. + swipeToRefreshImageView.setSelected(false); // Hide the swipe to refresh text view. swipeToRefreshTextView.setVisibility(View.GONE); @@ -761,31 +696,24 @@ public class DomainSettingsFragment extends Fragment { webViewThemeTextView.setText(webViewThemeStringArray[appWebViewThemeEntryNumber]); } - // Set the WebView theme icon and text visibility. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. - // Doing this makes no sense until it can also be done with the preferences. + // Set the WebView theme icon and text visibility. switch (webViewThemeInt) { case DomainsDatabaseHelper.SYSTEM_DEFAULT: // The domain WebView theme is system default. // Set the icon according to the app WebView theme. switch (appWebViewThemeEntryNumber) { case DomainsDatabaseHelper.SYSTEM_DEFAULT: // The default WebView theme is system default. - // Set the icon according to the app theme. - if (currentThemeStatus == Configuration.UI_MODE_NIGHT_NO) { - // Set the light theme icon. - webViewThemeImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.webview_light_theme, null)); - } else { - // Set the dark theme icon. - webViewThemeImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.webview_dark_theme, null)); - } + // Set the icon color. + webViewThemeImageView.setSelected(currentThemeStatus == Configuration.UI_MODE_NIGHT_NO); break; case DomainsDatabaseHelper.LIGHT_THEME: // the default WebView theme is light. - // Set the icon. - webViewThemeImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.webview_light_theme, null)); + // Set the icon color. + webViewThemeImageView.setSelected(true); break; case DomainsDatabaseHelper.DARK_THEME: // the default WebView theme is dark. - // Set the icon. - webViewThemeImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.webview_dark_theme, null)); + // Set the icon color. + webViewThemeImageView.setSelected(false); break; } @@ -794,16 +722,16 @@ public class DomainSettingsFragment extends Fragment { break; case DomainsDatabaseHelper.LIGHT_THEME: // The domain WebView theme is light. - // Set the icon. - webViewThemeImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.webview_light_theme, null)); + // Set the icon color. + webViewThemeImageView.setSelected(true); // Hide the WebView theme text view. webViewThemeTextView.setVisibility(View.GONE); break; case DomainsDatabaseHelper.DARK_THEME: // The domain WebView theme is dark. - // Set the icon. - webViewThemeImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.webview_dark_theme, null)); + // Set the icon color. + webViewThemeImageView.setSelected(false); // Hide the WebView theme text view. webViewThemeTextView.setVisibility(View.GONE); @@ -820,38 +748,32 @@ public class DomainSettingsFragment extends Fragment { wideViewportSpinner.setSelection(wideViewportInt); // Set the default wide viewport text. - if (defaultWideViewport) { + if (defaultWideViewport) wideViewportTextView.setText(wideViewportArrayAdapter.getItem(DomainsDatabaseHelper.ENABLED)); - } else { + else wideViewportTextView.setText(wideViewportArrayAdapter.getItem(DomainsDatabaseHelper.DISABLED)); - } - // Set the wide viewport icon and text view settings. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. - // Doing this makes no sense until it can also be done with the preferences. + // Set the wide viewport icon and text view settings. switch (wideViewportInt) { case DomainsDatabaseHelper.SYSTEM_DEFAULT: - // Set the icon. - if (defaultWideViewport) { // Wide viewport enabled by default. - wideViewportImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.wide_viewport_enabled, null)); - } else { // Wide viewport disabled by default. - wideViewportImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.wide_viewport_disabled, null)); - } + // Set the icon color. + wideViewportImageView.setSelected(defaultWideViewport); // Show the wide viewport text view. wideViewportTextView.setVisibility(View.VISIBLE); break; case DomainsDatabaseHelper.ENABLED: - // Set the icon according to the theme. - wideViewportImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.wide_viewport_enabled, null)); + // Set the icon color. + wideViewportImageView.setSelected(true); // Hide the wide viewport text view. wideViewportTextView.setVisibility(View.GONE); break; case DomainsDatabaseHelper.DISABLED: - // Set the icon. - wideViewportImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.wide_viewport_disabled, null)); + // Set the icon color. + wideViewportImageView.setSelected(false); // Hide the wide viewport text view. wideViewportTextView.setVisibility(View.GONE); @@ -874,33 +796,27 @@ public class DomainSettingsFragment extends Fragment { displayImagesTextView.setText(displayImagesArrayAdapter.getItem(DomainsDatabaseHelper.DISABLED)); } - // Set the display website images icon and text view settings. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. - // Doing this makes no sense until it can also be done with the preferences. + // Set the display website images icon and text view settings. switch (displayImagesInt) { case DomainsDatabaseHelper.SYSTEM_DEFAULT: - if (defaultDisplayWebpageImages) { // Display webpage images enabled by default. - // Set the icon. - displayWebpageImagesImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.images_enabled, null)); - } else { // Display webpage images disabled by default. - // Set the icon. - displayWebpageImagesImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.images_disabled, null)); - } + // Set the icon color. + displayWebpageImagesImageView.setSelected(defaultDisplayWebpageImages); // Show the display images text view. displayImagesTextView.setVisibility(View.VISIBLE); break; case DomainsDatabaseHelper.ENABLED: - // Set the icon. - displayWebpageImagesImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.images_enabled, null)); + // Set the icon color. + displayWebpageImagesImageView.setSelected(true); // Hide the display images text view. displayImagesTextView.setVisibility(View.GONE); break; case DomainsDatabaseHelper.DISABLED: - // Set the icon. - displayWebpageImagesImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.images_disabled, null)); + // Set the icon color. + displayWebpageImagesImageView.setSelected(false); // Hide the display images text view. displayImagesTextView.setVisibility(View.GONE); @@ -912,22 +828,14 @@ public class DomainSettingsFragment extends Fragment { // 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. - // Doing this makes no sense until it can also be done with the preferences. - // Check the switch. - pinnedSslCertificateSwitch.setChecked(true); - // Set the icon. - pinnedSslCertificateImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ssl_certificate_enabled, null)); - } else { // Pinned SSL certificate is disabled. - // Uncheck the switch. - pinnedSslCertificateSwitch.setChecked(false); + // Set the switch positions. + pinnedSslCertificateSwitch.setChecked(pinnedSslCertificateInt == 1); + pinnedIpAddressesSwitch.setChecked(pinnedIpAddressesInt == 1); - // Set the icon. - pinnedSslCertificateImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ssl_certificate_disabled, null)); - } + // Set the switch icon colors. + pinnedSslCertificateImageView.setSelected(pinnedSslCertificateInt == 1); + pinnedIpAddressesImageView.setSelected(pinnedIpAddressesInt == 1); // Store the current date. Date currentDate = Calendar.getInstance().getTime(); @@ -1093,22 +1001,6 @@ 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. - // Doing this makes no sense until it can also be done with the preferences. - // Check the switch. - pinnedIpAddressesSwitch.setChecked(true); - - // Set the icon. - pinnedIpAddressesImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ssl_certificate_enabled, null)); - } else { // Pinned IP Addresses is disabled. - // Uncheck the switch. - pinnedIpAddressesSwitch.setChecked(false); - - // Set the icon. - pinnedIpAddressesImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ssl_certificate_disabled, null)); - } - // Populate the saved and current IP addresses. savedIpAddressesTextView.setText(savedIpAddresses); currentIpAddressesTextView.setText(DomainsActivity.currentIpAddresses); @@ -1221,91 +1113,51 @@ public class DomainSettingsFragment extends Fragment { // Set the EasyList switch listener. easyListSwitch.setOnCheckedChangeListener((CompoundButton buttonView, boolean isChecked) -> { - // Update the icon. - if (isChecked) { - easyListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_ads_enabled, null)); - } else { - easyListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_ads_disabled, null)); - } + // Update the icon color. + easyListImageView.setSelected(isChecked); }); // Set the EasyPrivacy switch listener. easyPrivacySwitch.setOnCheckedChangeListener((CompoundButton buttonView, boolean isChecked) -> { - // Update the icon. - if (isChecked) { // EasyPrivacy is on. - // Set the icon. - easyPrivacyImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_tracking_enabled, null)); - } else { - easyPrivacyImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_tracking_disabled, null)); - } + // Update the icon color. + easyPrivacyImageView.setSelected(isChecked); }); // Set the Fanboy's Annoyance List switch listener. fanboysAnnoyanceListSwitch.setOnCheckedChangeListener((CompoundButton buttonView, boolean isChecked) -> { - // Update the icon and Fanboy's Social Blocking List. - if (isChecked) { // Fanboy's Annoyance List is on. - // Set the icon. - fanboysAnnoyanceListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.social_media_enabled, null)); - - // Disable the Fanboy's Social Blocking List switch. - fanboysSocialBlockingListSwitch.setEnabled(false); + // Update the icon color. + fanboysAnnoyanceListImageView.setSelected(isChecked); - // Update the Fanboy's Social Blocking List icon. - fanboysSocialBlockingListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.social_media_ghosted, null)); - } else { // Fanboy's Annoyance List is off. - // Set the icon. - fanboysAnnoyanceListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.social_media_disabled, null)); - // Enable the Fanboy's Social Blocking List switch. - fanboysSocialBlockingListSwitch.setEnabled(true); + // Set Fanboy's Social Blocking List switch position. + fanboysSocialBlockingListSwitch.setEnabled(!isChecked); - // Update the Fanboy's Social Blocking List icon. - if (fanboysSocialBlockingListSwitch.isChecked()) { - fanboysSocialBlockingListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.social_media_enabled, null)); - } else { - fanboysSocialBlockingListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.social_media_disabled, null)); - } - } + // Set the Social Blocking List icon ghosted status. + fanboysSocialBlockingListImageView.setEnabled(!isChecked); }); // Set the Fanboy's Social Blocking List switch listener. fanboysSocialBlockingListSwitch.setOnCheckedChangeListener((CompoundButton buttonView, boolean isChecked) -> { - // Update the icon. - if (isChecked) { - fanboysSocialBlockingListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.social_media_enabled, null)); - } else { - fanboysSocialBlockingListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.social_media_disabled, null)); - } + // Update the icon color. + fanboysSocialBlockingListImageView.setSelected(isChecked); }); // Set the UltraList switch listener. ultraListSwitch.setOnCheckedChangeListener((CompoundButton buttonView, boolean isChecked) -> { - // Update the icon. - if (isChecked) { - ultraListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_ads_enabled, null)); - } else { - ultraListImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_ads_disabled, null)); - } + // Update the icon color. + ultraListImageView.setSelected(isChecked); }); // Set the UltraPrivacy switch listener. ultraPrivacySwitch.setOnCheckedChangeListener((CompoundButton buttonView, boolean isChecked) -> { - // Update the icon. - if (isChecked) { - ultraPrivacyImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_tracking_enabled, null)); - } else { - ultraPrivacyImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_tracking_disabled, null)); - } + // Update the icon color. + ultraPrivacyImageView.setSelected(isChecked); }); // Set the block all third-party requests switch listener. blockAllThirdPartyRequestsSwitch.setOnCheckedChangeListener((CompoundButton buttonView, boolean isChecked) -> { - // Update the icon. - if (isChecked) { - blockAllThirdPartyRequestsImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_all_third_party_requests_enabled, null)); - } else { - blockAllThirdPartyRequestsImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.block_all_third_party_requests_disabled, null)); - } + // Update the icon color. + blockAllThirdPartyRequestsImageView.setSelected(isChecked); }); // Set the user agent spinner listener. @@ -1378,6 +1230,44 @@ public class DomainSettingsFragment extends Fragment { } }); + // Set the X-Requested-With header spinner listener. + xRequestedWithHeaderSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + // Update the icon and the visibility of the text view. + switch (position) { + case DomainsDatabaseHelper.SYSTEM_DEFAULT: + // Set the icon color. + xRequestedWithHeaderImageView.setSelected(defaultXRequestedWithHeader); + + // Show the X-Requested-With header text view. + xRequestedWithHeaderTextView.setVisibility(View.VISIBLE); + break; + + case DomainsDatabaseHelper.ENABLED: + // Set the icon color. + xRequestedWithHeaderImageView.setSelected(true); + + // Hide the X-Requested-With header text view. + xRequestedWithHeaderTextView.setVisibility(View.GONE); + break; + + case DomainsDatabaseHelper.DISABLED: + // Set the icon color. + xRequestedWithHeaderImageView.setSelected(false); + + // Hide the X-Requested-With header text view. + xRequestedWithHeaderTextView.setVisibility(View.GONE); + break; + } + } + + @Override + public void onNothingSelected(AdapterView parent) { + // Do nothing. + } + }); + // Set the font size spinner listener. fontSizeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override @@ -1408,33 +1298,27 @@ public class DomainSettingsFragment extends Fragment { swipeToRefreshSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { - // Update the icon and the visibility of the night mode text view. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. - // Doing this makes no sense until it can also be done with the preferences. + // Update the icon and the visibility of the text view. switch (position) { case DomainsDatabaseHelper.SYSTEM_DEFAULT: - if (defaultSwipeToRefresh) { - // Set the icon. - swipeToRefreshImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.refresh_enabled, null)); - } else { - // Set the icon. - swipeToRefreshImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.refresh_disabled, null)); - } + // Set the icon color. + swipeToRefreshImageView.setSelected(defaultSwipeToRefresh); // Show the swipe to refresh text view. swipeToRefreshTextView.setVisibility(View.VISIBLE); break; case DomainsDatabaseHelper.ENABLED: - // Set the icon. - swipeToRefreshImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.refresh_enabled, null)); + // Set the icon color. + swipeToRefreshImageView.setSelected(true); // Hide the swipe to refresh text view. swipeToRefreshTextView.setVisibility(View.GONE); break; case DomainsDatabaseHelper.DISABLED: - // Set the icon. - swipeToRefreshImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.refresh_disabled, null)); + // Set the icon color. + swipeToRefreshImageView.setSelected(false); // Hide the swipe to refresh text view. swipeToRefreshTextView.setVisibility(View.GONE); @@ -1451,31 +1335,24 @@ public class DomainSettingsFragment extends Fragment { webViewThemeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { - // Update the icon and the visibility of the WebView theme text view. Once the minimum API >= 21 a selector can be used as the tint mode instead of specifying different icons. - // Doing this makes no sense until it can also be done with the preferences. + // Update the icon and the visibility of the WebView theme text view. switch (position) { case DomainsDatabaseHelper.SYSTEM_DEFAULT: // the domain WebView theme is system default. // Set the icon according to the app WebView theme. switch (appWebViewThemeEntryNumber) { case DomainsDatabaseHelper.SYSTEM_DEFAULT: // The default WebView theme is system default. - // Set the icon according to the app theme. - if (currentThemeStatus == Configuration.UI_MODE_NIGHT_NO) { - // Set the light theme icon. - webViewThemeImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.webview_light_theme, null)); - } else { - // Set the dark theme icon. - webViewThemeImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.webview_dark_theme, null)); - } + // Set the icon color. + webViewThemeImageView.setSelected(currentThemeStatus == Configuration.UI_MODE_NIGHT_NO); break; case DomainsDatabaseHelper.LIGHT_THEME: // The default WebView theme is light. - // Set the icon. - webViewThemeImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.webview_light_theme, null)); + // Set the icon color. + webViewThemeImageView.setSelected(true); break; case DomainsDatabaseHelper.DARK_THEME: // The default WebView theme is dark. // Set the icon. - webViewThemeImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.webview_dark_theme, null)); + webViewThemeImageView.setSelected(false); break; } @@ -1484,16 +1361,16 @@ public class DomainSettingsFragment extends Fragment { break; case DomainsDatabaseHelper.LIGHT_THEME: // The domain WebView theme is light. - // Set the icon. - webViewThemeImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.webview_light_theme, null)); + // Set the icon color. + webViewThemeImageView.setSelected(true); // Hide the WebView theme text view. webViewThemeTextView.setVisibility(View.GONE); break; case DomainsDatabaseHelper.DARK_THEME: // The domain WebView theme is dark. - // Set the icon. - webViewThemeImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.webview_dark_theme, null)); + // Set the icon color. + webViewThemeImageView.setSelected(false); // Hide the WebView theme text view. webViewThemeTextView.setVisibility(View.GONE); @@ -1514,28 +1391,24 @@ public class DomainSettingsFragment extends Fragment { // Update the icon and the visibility of the wide viewport text view. switch (position) { case DomainsDatabaseHelper.SYSTEM_DEFAULT: - // Set the icon. - if (defaultWideViewport) { // Wide viewport is enabled by default. - wideViewportImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.wide_viewport_enabled, null)); - } else { // Wide viewport is disabled by default. - wideViewportImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.wide_viewport_disabled, null)); - } + // Set the icon color. + wideViewportImageView.setSelected(defaultWideViewport); // Show the wide viewport text view. wideViewportTextView.setVisibility(View.VISIBLE); break; case DomainsDatabaseHelper.ENABLED: - // Set the icon according to the theme. - wideViewportImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.wide_viewport_enabled, null)); + // Set the icon color. + wideViewportImageView.setSelected(true); // Hide the wide viewport text view. wideViewportTextView.setVisibility(View.GONE); break; case DomainsDatabaseHelper.DISABLED: - // Set the icon. - wideViewportImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.wide_viewport_disabled, null)); + // Set the icon color. + wideViewportImageView.setSelected(false); // Hid ethe wide viewport text view. wideViewportTextView.setVisibility(View.GONE); @@ -1556,29 +1429,24 @@ public class DomainSettingsFragment extends Fragment { // Update the icon and the visibility of the display images text view. switch (position) { case DomainsDatabaseHelper.SYSTEM_DEFAULT: - if (defaultDisplayWebpageImages) { // Display webpage images is enabled by default. - // Set the icon. - displayWebpageImagesImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.images_enabled, null)); - } else { // Display webpage images is disabled by default. - // Set the icon. - displayWebpageImagesImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.images_disabled, null)); - } + // Set the icon color. + displayWebpageImagesImageView.setSelected(defaultDisplayWebpageImages); // Show the display images text view. displayImagesTextView.setVisibility(View.VISIBLE); break; case DomainsDatabaseHelper.ENABLED: - // Set the icon. - displayWebpageImagesImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.images_enabled, null)); + // Set the icon color. + displayWebpageImagesImageView.setSelected(true); // Hide the display images text view. displayImagesTextView.setVisibility(View.GONE); break; case DomainsDatabaseHelper.DISABLED: - // Set the icon. - displayWebpageImagesImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.images_disabled, null)); + // Set the icon color. + displayWebpageImagesImageView.setSelected(false); // Hide the display images text view. displayImagesTextView.setVisibility(View.GONE); @@ -1594,11 +1462,11 @@ public class DomainSettingsFragment extends Fragment { // Set the pinned SSL certificate switch listener. pinnedSslCertificateSwitch.setOnCheckedChangeListener((CompoundButton buttonView, boolean isChecked) -> { - // Update the icon. - if (isChecked) { // SSL certificate pinning is enabled. - // Set the icon. - pinnedSslCertificateImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ssl_certificate_enabled, null)); + // Update the icon color. + pinnedSslCertificateImageView.setSelected(isChecked); + // Update the views. + if (isChecked) { // SSL certificate pinning is enabled. // Update the visibility of the saved SSL certificate. if (savedSslIssuedToCNameString == null) { savedSslCardView.setVisibility(View.GONE); @@ -1669,9 +1537,6 @@ public class DomainSettingsFragment extends Fragment { noCurrentWebsiteCertificateTextView.getParent().requestChildFocus(noCurrentWebsiteCertificateTextView, noCurrentWebsiteCertificateTextView); } } else { // SSL certificate pinning is disabled. - // Set the icon. - pinnedSslCertificateImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ssl_certificate_disabled, null)); - // Hide the SSl certificates and instructions. savedSslCardView.setVisibility(View.GONE); currentSslCardView.setVisibility(View.GONE); @@ -1757,11 +1622,11 @@ public class DomainSettingsFragment extends Fragment { // 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. - pinnedIpAddressesImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ssl_certificate_enabled, null)); + // Update the icon color. + pinnedIpAddressesImageView.setSelected(isChecked); + // Update the views. + if (isChecked) { // IP addresses pinning is enabled. // Update the visibility of the saved IP addresses card view. if (savedIpAddresses == null) { // There are no saved IP addresses. savedIpAddressesCardView.setVisibility(View.GONE); @@ -1810,9 +1675,6 @@ public class DomainSettingsFragment extends Fragment { // Scroll to the bottom of the card views. currentIpAddressesCardView.getParent().requestChildFocus(currentIpAddressesCardView, currentIpAddressesCardView); } else { // IP addresses pinning is disabled. - // Set the icon. - pinnedIpAddressesImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ssl_certificate_disabled, null)); - // Hide the IP addresses card views. savedIpAddressesCardView.setVisibility(View.GONE); currentIpAddressesCardView.setVisibility(View.GONE); diff --git a/app/src/main/java/com/stoutner/privacybrowser/helpers/DomainsDatabaseHelper.kt b/app/src/main/java/com/stoutner/privacybrowser/helpers/DomainsDatabaseHelper.kt index 9d58eef0..c5401d45 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/helpers/DomainsDatabaseHelper.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/helpers/DomainsDatabaseHelper.kt @@ -31,7 +31,7 @@ import androidx.preference.PreferenceManager import com.stoutner.privacybrowser.R // The private constants. -private const val SCHEMA_VERSION = 13 +private const val SCHEMA_VERSION = 14 class DomainsDatabaseHelper(private val appContext: Context) : SQLiteOpenHelper(appContext, DOMAINS_DATABASE, null, SCHEMA_VERSION) { // Define the public companion object constants. These can be moved to public class constants once the entire project has migrated to Kotlin. @@ -62,6 +62,7 @@ class DomainsDatabaseHelper(private val appContext: Context) : SQLiteOpenHelper( const val ENABLE_ULTRAPRIVACY = "enableultraprivacy" const val BLOCK_ALL_THIRD_PARTY_REQUESTS = "blockallthirdpartyrequests" const val USER_AGENT = "useragent" + const val X_REQUESTED_WITH_HEADER = "x_requested_with_header" const val FONT_SIZE = "fontsize" const val SWIPE_TO_REFRESH = "swipetorefresh" const val WEBVIEW_THEME = "webview_theme" @@ -95,6 +96,7 @@ class DomainsDatabaseHelper(private val appContext: Context) : SQLiteOpenHelper( "$ENABLE_ULTRAPRIVACY BOOLEAN, " + "$BLOCK_ALL_THIRD_PARTY_REQUESTS BOOLEAN, " + "$USER_AGENT TEXT, " + + "$X_REQUESTED_WITH_HEADER INTEGER, " + "$FONT_SIZE INTEGER, " + "$SWIPE_TO_REFRESH INTEGER, " + "$WEBVIEW_THEME INTEGER, " + @@ -255,6 +257,12 @@ class DomainsDatabaseHelper(private val appContext: Context) : SQLiteOpenHelper( // Copy the data from the old column to the new one. domainsDatabase.execSQL("UPDATE $DOMAINS_TABLE SET $COOKIES = enablefirstpartycookies") } + + // Upgrade from schema version 13, first used in Privacy Browser 3.8, to schema version 14, first used in Privacy Browser 3.11. + if (oldVersion < 14) { + // Add the X-Requested-With header column. This defaults to `0`, which is `System default`, so a separate step isn't needed to populate the column. + domainsDatabase.execSQL("ALTER TABLE $DOMAINS_TABLE ADD COLUMN $X_REQUESTED_WITH_HEADER INTEGER") + } } val completeCursorOrderedByDomain: Cursor @@ -336,6 +344,7 @@ class DomainsDatabaseHelper(private val appContext: Context) : SQLiteOpenHelper( domainContentValues.put(ENABLE_ULTRAPRIVACY, ultraPrivacy) domainContentValues.put(BLOCK_ALL_THIRD_PARTY_REQUESTS, blockAllThirdPartyRequests) domainContentValues.put(USER_AGENT, "System default user agent") + domainContentValues.put(X_REQUESTED_WITH_HEADER, 0) domainContentValues.put(FONT_SIZE, 0) domainContentValues.put(SWIPE_TO_REFRESH, 0) domainContentValues.put(WEBVIEW_THEME, 0) @@ -367,8 +376,9 @@ class DomainsDatabaseHelper(private val appContext: Context) : SQLiteOpenHelper( } fun updateDomain(databaseId: Int, domainName: String, javaScript: Boolean, cookies: Boolean, domStorage: Boolean, formData: Boolean, easyList: Boolean, easyPrivacy: Boolean, fanboysAnnoyance: Boolean, - fanboysSocialBlocking: Boolean, ultraList: Boolean, ultraPrivacy: Boolean, blockAllThirdPartyRequests: Boolean, userAgent: String, fontSize: Int, swipeToRefresh: Int, webViewTheme: Int, - wideViewport: Int, displayImages: Int, pinnedSslCertificate: Boolean, pinnedIpAddresses: Boolean) { + fanboysSocialBlocking: Boolean, ultraList: Boolean, ultraPrivacy: Boolean, blockAllThirdPartyRequests: Boolean, userAgent: String, xRequestedWithHeader: Int, fontSize: Int, + swipeToRefresh: Int, webViewTheme: Int, wideViewport: Int, displayImages: Int, pinnedSslCertificate: Boolean, pinnedIpAddresses: Boolean) { + // Instantiate a content values. val domainContentValues = ContentValues() @@ -386,6 +396,7 @@ class DomainsDatabaseHelper(private val appContext: Context) : SQLiteOpenHelper( domainContentValues.put(ENABLE_ULTRAPRIVACY, ultraPrivacy) domainContentValues.put(BLOCK_ALL_THIRD_PARTY_REQUESTS, blockAllThirdPartyRequests) domainContentValues.put(USER_AGENT, userAgent) + domainContentValues.put(X_REQUESTED_WITH_HEADER, xRequestedWithHeader) domainContentValues.put(FONT_SIZE, fontSize) domainContentValues.put(SWIPE_TO_REFRESH, swipeToRefresh) domainContentValues.put(WEBVIEW_THEME, webViewTheme) diff --git a/app/src/main/res/color/blue_icon_selector.xml b/app/src/main/res/color/blue_icon_selector.xml new file mode 100644 index 00000000..f088f1fa --- /dev/null +++ b/app/src/main/res/color/blue_icon_selector.xml @@ -0,0 +1,26 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/about_version_scrollview.xml b/app/src/main/res/layout/about_version_scrollview.xml index 95f2be66..8d5da980 100644 --- a/app/src/main/res/layout/about_version_scrollview.xml +++ b/app/src/main/res/layout/about_version_scrollview.xml @@ -58,7 +58,7 @@ android:text="@string/privacy_browser" android:textStyle="bold" android:textSize="22sp" - android:textColor="?attr/blueTitleTextColor" + android:textColor="@color/blue_title_text" android:paddingTop="12dp" android:layout_toEndOf="@id/icon" /> @@ -66,7 +66,7 @@ android:id="@+id/version" android:layout_height="wrap_content" android:layout_width="wrap_content" - android:textColor="?attr/blueTextColor" + android:textColor="@color/alt_blue_text" android:textIsSelectable="true" android:layout_below="@id/privacy_browser_textview" android:layout_toEndOf="@id/icon" /> @@ -90,7 +90,7 @@ android:text="@string/hardware" android:textStyle="bold" android:textSize="18sp" - android:textColor="?attr/blueTitleTextColor" /> + android:textColor="@color/blue_title_text" /> @@ -202,6 +202,8 @@ android:layout_marginTop="1dp" android:layout_marginEnd="10dp" android:layout_gravity="center_vertical" + android:src="@drawable/block_ads_enabled" + app:tint="@color/blue_icon_selector" tools:ignore="contentDescription" /> + + + + + + + + + + + + + + android:textColor="@color/blue_title_text" /> + android:textColor="@color/blue_title_text"/> + android:textColor="@color/blue_title_text"/> + android:textColor="@color/blue_title_text" /> + android:textColor="@color/blue_title_text" /> + android:textColor="@color/blue_title_text" /> + android:textColor="@color/blue_text" /> @@ -972,7 +1037,7 @@ android:layout_height="wrap_content" android:layout_width="match_parent" android:layout_marginStart="32dp" - android:textColor="?attr/blueTextColor" /> + android:textColor="@color/blue_text" /> diff --git a/app/src/main/res/layout/pinned_mismatch_tab_linearlayout.xml b/app/src/main/res/layout/pinned_mismatch_tab_linearlayout.xml index 66254f9d..2802a2d3 100644 --- a/app/src/main/res/layout/pinned_mismatch_tab_linearlayout.xml +++ b/app/src/main/res/layout/pinned_mismatch_tab_linearlayout.xml @@ -33,7 +33,7 @@ android:text="@string/domain" android:textAllCaps="true" android:textStyle="bold" - android:textColor="?attr/blueTitleTextColor" /> + android:textColor="@color/blue_title_text" /> + android:textColor="@color/blue_title_text" /> + android:textColor="@color/blue_title_text" /> + android:textColor="@color/blue_title_text" /> + android:textColor="@color/blue_title_text" /> + android:textColor="@color/blue_title_text" /> + android:textColor="@color/blue_title_text" /> + android:textColor="@color/blue_title_text" /> . --> - + android:textColor="@color/blue_title_text" /> + android:textColor="@color/blue_title_text" /> + android:textColor="@color/blue_title_text" /> + android:textColor="@color/blue_title_text" /> ?android:attr/colorBackground @color/violet_700 - @color/violet_700 - @color/violet_500 @color/button_background_color_selector_night @color/button_text_color_selector_night @color/violet_500 @color/red_900 - @color/violet_500 @color/gray_875 @color/violet_500 @color/violet_500 diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index d07e87fb..39633670 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -20,9 +20,10 @@ - @color/violet_700 + @color/violet_700 @color/violet_500 @color/violet_500 + @color/violet_500 @color/gray_500 @color/gray_700 @color/white diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index 77a3d1f6..3ad61ec9 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -27,15 +27,12 @@ ?android:attr/colorBackground @color/violet_700 - @color/violet_700 - @color/violet_500 @color/button_background_color_selector_night @color/button_text_color_selector_night @color/violet_500 @color/red_900 - @color/violet_500 @color/gray_875 @color/violet_500 @color/violet_500 diff --git a/app/src/main/res/values-v27/styles.xml b/app/src/main/res/values-v27/styles.xml index e0010ebb..1a670d41 100644 --- a/app/src/main/res/values-v27/styles.xml +++ b/app/src/main/res/values-v27/styles.xml @@ -29,15 +29,12 @@ ?android:attr/colorBackground @color/blue_200 - @color/blue_700 - @color/blue_900 @color/button_background_color_selector_day @color/button_text_color_selector_day @color/blue_700 @color/red_a700 - @color/blue_800 @color/white @color/blue_800 @color/blue_800 diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 5331ec07..5babdef6 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -21,14 +21,11 @@ - - - diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 3045569c..275d8645 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -20,9 +20,10 @@ - @color/blue_700 + @color/blue_700 @color/blue_800 @color/blue_700 + @color/blue_900 @color/gray_600 @color/gray_425 @color/gray_925 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4f9ce7f3..9d9fc616 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -323,6 +323,11 @@ Domain name Domain deleted *. may be prepended to a domain to include all subdomains (eg. *.stoutner.com) + + System default + X-Requested-With header enabled + X-Requested-With header disabled + System default Custom font size diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 4f19586a..dcf4cab4 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -27,15 +27,12 @@ ?android:attr/colorBackground @color/blue_200 - @color/blue_700 - @color/blue_900 @color/button_background_color_selector_day @color/button_text_color_selector_day @color/blue_700 @color/red_a700 - @color/blue_800 @color/white @color/blue_800 @color/blue_800 diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index a27c1d83..14396430 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -18,7 +18,9 @@ You should have received a copy of the GNU General Public License along with Privacy Browser Android. If not, see . --> - + +