X-Git-Url: https://gitweb.stoutner.com/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Ffragments%2FSettingsFragment.kt;h=b5d14b44c054863896066a1ecd7a9167946a9faf;hb=e065315a36c804626a7dba38d3edad05e9fdb473;hp=a22734eeb4404451073f5711fae83b811a6ba06b;hpb=dc36dea65a4eb37496fb1ecbbd9f8e1906f50216;p=PrivacyBrowserAndroid.git diff --git a/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.kt b/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.kt index a22734ee..b5d14b44 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2023 Soren Stoutner . + * Copyright 2016-2024 Soren Stoutner . * * This file is part of Privacy Browser Android . * @@ -33,7 +33,6 @@ import android.widget.ArrayAdapter import androidx.appcompat.app.AppCompatDelegate import androidx.preference.Preference -import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat import com.stoutner.privacybrowser.R @@ -43,62 +42,78 @@ import com.stoutner.privacybrowser.activities.UNRECOGNIZED_USER_AGENT import com.stoutner.privacybrowser.helpers.ProxyHelper import kotlin.system.exitProcess +// Define the class constants. +private const val SCROLL_Y = "scroll_y" + class SettingsFragment : PreferenceFragmentCompat() { + companion object { + // Declare the private static class variables. For some reason (I'm looking at you Android's Activity Lifecycle) this only works if these are static. + private var fragmentRestarted: Boolean = false + private var scrollY: Int = 0 + } + // Declare the class variables. + private lateinit var allowScreenshotsPreference: Preference + private lateinit var ampRedirectsPreference: Preference private lateinit var appThemeEntriesStringArray: Array private lateinit var appThemeEntryValuesStringArray: Array - private lateinit var defaultUserAgent: String - private lateinit var sharedPreferenceChangeListener: OnSharedPreferenceChangeListener - private lateinit var translatedUserAgentNamesArray: Array - private lateinit var userAgentDataArray: Array - private lateinit var userAgentNamesArray: ArrayAdapter - private lateinit var webViewThemeEntriesStringArray: Array - private lateinit var webViewThemeEntryValuesStringArray: Array - - // Define the the class views. - private lateinit var javaScriptPreference: Preference + private lateinit var appThemePreference: Preference + private lateinit var blockAllThirdPartyRequestsPreference: Preference + private lateinit var bottomAppBarPreference: Preference + private lateinit var clearCachePreference: Preference + private lateinit var clearCookiesPreference: Preference + private lateinit var clearDomStoragePreference: Preference + private lateinit var clearEverythingPreference: Preference + private lateinit var clearLogcatPreference: Preference private lateinit var cookiesPreference: Preference - private lateinit var domStoragePreference: Preference - private lateinit var formDataPreference: Preference // The form data preference can be removed once the minimum API >= 26. - private lateinit var userAgentPreference: Preference private lateinit var customUserAgentPreference: Preference - private lateinit var incognitoModePreference: Preference - private lateinit var allowScreenshotsPreference: Preference + private lateinit var defaultUserAgent: String + private lateinit var displayAdditionalAppBarIconsPreference: Preference + private lateinit var displayWebpageImagesPreference: Preference + private lateinit var domStoragePreference: Preference + private lateinit var downloadProviderEntryValuesStringArray: Array + private lateinit var downloadProviderPreference: Preference private lateinit var easyListPreference: Preference private lateinit var easyPrivacyPreference: Preference private lateinit var fanboyAnnoyanceListPreference: Preference private lateinit var fanboySocialBlockingListPreference: Preference - private lateinit var ultraListPreference: Preference - private lateinit var ultraPrivacyPreference: Preference - private lateinit var blockAllThirdPartyRequestsPreference: Preference - private lateinit var trackingQueriesPreference: Preference - private lateinit var ampRedirectsPreference: Preference - private lateinit var searchPreference: Preference - private lateinit var searchCustomURLPreference: Preference - private lateinit var proxyPreference: Preference - private lateinit var proxyCustomUrlPreference: Preference + private lateinit var fontSizePreference: Preference private lateinit var fullScreenBrowsingModePreference: Preference private lateinit var hideAppBarPreference: Preference - private lateinit var clearEverythingPreference: Preference - private lateinit var clearCookiesPreference: Preference - private lateinit var clearDomStoragePreference: Preference - private lateinit var clearFormDataPreference: Preference // The clear form data preference can be removed once the minimum API >= 26. - private lateinit var clearLogcatPreference: Preference - private lateinit var clearCachePreference: Preference + private lateinit var displayUnderCutoutsPreference: Preference private lateinit var homepagePreference: Preference - private lateinit var fontSizePreference: Preference + private lateinit var incognitoModePreference: Preference + private lateinit var javaScriptPreference: Preference private lateinit var openIntentsInNewTabPreference: Preference - private lateinit var swipeToRefreshPreference: Preference - private lateinit var downloadWithExternalAppPreference: Preference + private lateinit var proxyCustomUrlPreference: Preference + private lateinit var proxyPreference: Preference private lateinit var scrollAppBarPreference: Preference - private lateinit var bottomAppBarPreference: Preference - private lateinit var displayAdditionalAppBarIconsPreference: Preference - private lateinit var appThemePreference: Preference + private lateinit var searchCustomURLPreference: Preference + private lateinit var searchPreference: Preference + private lateinit var sharedPreferenceChangeListener: OnSharedPreferenceChangeListener + private lateinit var swipeToRefreshPreference: Preference + private lateinit var trackingQueriesPreference: Preference + private lateinit var translatedUserAgentNamesArray: Array + private lateinit var ultraListPreference: Preference + private lateinit var ultraPrivacyPreference: Preference + private lateinit var userAgentDataArray: Array + private lateinit var userAgentPreference: Preference + private lateinit var userAgentNamesArray: ArrayAdapter + private lateinit var webViewThemeEntriesStringArray: Array + private lateinit var webViewThemeEntryValuesStringArray: Array private lateinit var webViewThemePreference: Preference private lateinit var wideViewportPreference: Preference - private lateinit var displayWebpageImagesPreference: Preference override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + // Check if the fragment has been restarted. + if (savedInstanceState != null) { + // Set the fragment restored flag. + fragmentRestarted = true + + // Save the scroll Y. + scrollY = savedInstanceState.getInt(SCROLL_Y) + } + // Load the preferences from the XML file. setPreferencesFromResource(R.xml.preferences, rootKey) @@ -109,7 +124,6 @@ class SettingsFragment : PreferenceFragmentCompat() { javaScriptPreference = findPreference(getString(R.string.javascript_key))!! cookiesPreference = findPreference(getString(R.string.cookies_key))!! domStoragePreference = findPreference(getString(R.string.dom_storage_key))!! - formDataPreference = findPreference(getString(R.string.save_form_data_key))!! // The form data preference can be removed once the minimum API >= 26. userAgentPreference = findPreference(getString(R.string.user_agent_key))!! customUserAgentPreference = findPreference(getString(R.string.custom_user_agent_key))!! incognitoModePreference = findPreference(getString(R.string.incognito_mode_key))!! @@ -129,17 +143,17 @@ class SettingsFragment : PreferenceFragmentCompat() { proxyCustomUrlPreference = findPreference(getString(R.string.proxy_custom_url_key))!! fullScreenBrowsingModePreference = findPreference(getString(R.string.full_screen_browsing_mode_key))!! hideAppBarPreference = findPreference(getString(R.string.hide_app_bar_key))!! + displayUnderCutoutsPreference = findPreference(getString(R.string.display_under_cutouts_key))!! clearEverythingPreference = findPreference(getString(R.string.clear_everything_key))!! clearCookiesPreference = findPreference(getString(R.string.clear_cookies_key))!! clearDomStoragePreference = findPreference(getString(R.string.clear_dom_storage_key))!! - clearFormDataPreference = findPreference(getString(R.string.clear_form_data_key))!! // The clear form data preference can be removed once the minimum API >= 26. clearLogcatPreference = findPreference(getString(R.string.clear_logcat_key))!! clearCachePreference = findPreference(getString(R.string.clear_cache_key))!! homepagePreference = findPreference(getString(R.string.homepage_key))!! fontSizePreference = findPreference(getString(R.string.font_size_key))!! openIntentsInNewTabPreference = findPreference(getString(R.string.open_intents_in_new_tab_key))!! swipeToRefreshPreference = findPreference(getString(R.string.swipe_to_refresh_key))!! - downloadWithExternalAppPreference = findPreference(getString(R.string.download_with_external_app_key))!! + downloadProviderPreference = findPreference(getString(R.string.download_provider_key))!! scrollAppBarPreference = findPreference(getString(R.string.scroll_app_bar_key))!! bottomAppBarPreference = findPreference(getString(R.string.bottom_app_bar_key))!! displayAdditionalAppBarIconsPreference = findPreference(getString(R.string.display_additional_app_bar_icons_key))!! @@ -151,6 +165,7 @@ class SettingsFragment : PreferenceFragmentCompat() { // Set the preference dependencies. domStoragePreference.dependency = getString(R.string.javascript_key) hideAppBarPreference.dependency = getString(R.string.full_screen_browsing_mode_key) + displayUnderCutoutsPreference.dependency = getString(R.string.full_screen_browsing_mode_key) // Get strings from the preferences. val userAgentName = sharedPreferences.getString(getString(R.string.user_agent_key), getString(R.string.user_agent_default_value)) @@ -164,26 +179,6 @@ class SettingsFragment : PreferenceFragmentCompat() { val fullScreenBrowsingMode = sharedPreferences.getBoolean(getString(R.string.full_screen_browsing_mode_key), false) val clearEverything = sharedPreferences.getBoolean(getString(R.string.clear_everything_key), true) - // Remove the form data preferences if the API is >= 26 as they no longer do anything. - if (Build.VERSION.SDK_INT >= 26) { - // Get handles for the categories. - val privacyCategory = findPreference(getString(R.string.privacy_category_key))!! - val clearAndExitCategory = findPreference(getString(R.string.clear_and_exit_category_key))!! - - // Remove the form data preferences. - privacyCategory.removePreference(formDataPreference) - clearAndExitCategory.removePreference(clearFormDataPreference) - } - - // Remove the WebView theme preference if the API < 29. - if (Build.VERSION.SDK_INT < 29) { - // Get a handle for the general category. - val generalCategory = findPreference(getString(R.string.general_category_key))!! - - // Remove the WebView theme preference. - generalCategory.removePreference(webViewThemePreference) - } - // Only enable Fanboy's social blocking list preference if Fanboy's annoyance list is disabled. fanboySocialBlockingListPreference.isEnabled = !fanboyAnnoyanceListEnabled @@ -260,7 +255,6 @@ class SettingsFragment : PreferenceFragmentCompat() { // Set the status of the clear and exit preferences. clearCookiesPreference.isEnabled = !clearEverything clearDomStoragePreference.isEnabled = !clearEverything - clearFormDataPreference.isEnabled = !clearEverything // Clear form data can be removed once the minimum API is >= 26. clearLogcatPreference.isEnabled = !clearEverything clearCachePreference.isEnabled = !clearEverything @@ -270,6 +264,16 @@ class SettingsFragment : PreferenceFragmentCompat() { // Set the font size as the summary text for the preference. fontSizePreference.summary = sharedPreferences.getString(getString(R.string.font_size_key), getString(R.string.font_size_default_value)) + "%" + // Get the download provider entry values string array + downloadProviderEntryValuesStringArray = resources.getStringArray(R.array.download_provider_entry_values) + + // Set the summary text for the download provider preference. + downloadProviderPreference.summary = when (sharedPreferences.getString(getString(R.string.download_provider_key), getString(R.string.download_provider_default_value))) { + downloadProviderEntryValuesStringArray[0] -> getString(R.string.download_with_privacy_browser) // Privacy Browser is selected. + downloadProviderEntryValuesStringArray[1] -> getString(R.string.download_with_android_download_manager) // Android download manager is selected. + else -> getString(R.string.download_with_external_app) // External app is selected. + } + // Get the app theme string arrays. appThemeEntriesStringArray = resources.getStringArray(R.array.app_theme_entries) appThemeEntryValuesStringArray = resources.getStringArray(R.array.app_theme_entry_values) @@ -323,14 +327,6 @@ class SettingsFragment : PreferenceFragmentCompat() { domStoragePreference.setIcon(R.drawable.dom_storage_ghosted) } - // Set the save form data icon if API < 26. Save form data has no effect on API >= 26. - if (Build.VERSION.SDK_INT < 26) { - if (sharedPreferences.getBoolean(getString(R.string.save_form_data_key), false)) - formDataPreference.setIcon(R.drawable.form_data_enabled) - else - formDataPreference.setIcon(R.drawable.form_data_disabled) - } - // Set the custom user agent icon. if (customUserAgentPreference.isEnabled) customUserAgentPreference.setIcon(R.drawable.custom_user_agent_enabled) @@ -449,6 +445,12 @@ class SettingsFragment : PreferenceFragmentCompat() { hideAppBarPreference.setIcon(R.drawable.app_bar_ghosted) } + // Set the display under cutouts icon. + if (sharedPreferences.getBoolean(getString(R.string.display_under_cutouts_key), false)) + displayUnderCutoutsPreference.setIcon(R.drawable.display_under_cutouts_enabled) + else + displayUnderCutoutsPreference.setIcon(R.drawable.display_under_cutouts_disabled) + // Set the clear everything icon. if (clearEverything) { clearEverythingPreference.setIcon(R.drawable.clear_everything_enabled) @@ -468,14 +470,6 @@ class SettingsFragment : PreferenceFragmentCompat() { else clearDomStoragePreference.setIcon(R.drawable.clear_dom_storage_disabled) - // Set the clear form data icon if the API < 26. It has no effect on newer versions of Android. - if (Build.VERSION.SDK_INT < 26) { - if (clearEverything || sharedPreferences.getBoolean(getString(R.string.clear_form_data_key), true)) - clearFormDataPreference.setIcon(R.drawable.clear_form_data_enabled) - else - clearFormDataPreference.setIcon(R.drawable.clear_form_data_disabled) - } - // Set the clear logcat icon. if (clearEverything || sharedPreferences.getBoolean(getString(R.string.clear_logcat_key), true)) clearLogcatPreference.setIcon(R.drawable.clear_logcat_enabled) @@ -500,14 +494,8 @@ class SettingsFragment : PreferenceFragmentCompat() { else swipeToRefreshPreference.setIcon(R.drawable.refresh_disabled) - // Set the download with external app icon. - if (sharedPreferences.getBoolean(getString(R.string.download_with_external_app_key), false)) - downloadWithExternalAppPreference.setIcon(R.drawable.download_with_external_app_enabled) - else - downloadWithExternalAppPreference.setIcon(R.drawable.download_with_external_app_disabled) - // Set the scroll app bar icon. - if (sharedPreferences.getBoolean(getString(R.string.scroll_app_bar_key), true)) + if (sharedPreferences.getBoolean(getString(R.string.scroll_app_bar_key), false)) scrollAppBarPreference.setIcon(R.drawable.app_bar_enabled) else scrollAppBarPreference.setIcon(R.drawable.app_bar_disabled) @@ -593,6 +581,23 @@ class SettingsFragment : PreferenceFragmentCompat() { // Re-register the shared preference listener. sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener) + + // Restore the scroll position if the fragment has been restarted. + if (fragmentRestarted) { + // Reset the fragment restarted flag. + fragmentRestarted = false + + // Set the scroll position. + listView.post { listView.smoothScrollBy(0, scrollY) } + } + } + + override fun onSaveInstanceState(savedInstanceState: Bundle) { + // Run the default commands. + super.onSaveInstanceState(savedInstanceState) + + // Save the scroll position. + savedInstanceState.putInt(SCROLL_Y, listView.computeVerticalScrollOffset()) } private fun getSharedPreferenceChangeListener(): OnSharedPreferenceChangeListener { @@ -641,14 +646,6 @@ class SettingsFragment : PreferenceFragmentCompat() { domStoragePreference.setIcon(R.drawable.dom_storage_disabled) } - getString(R.string.save_form_data_key) -> { // Saved form data can be removed once the minimum API >= 26. - // Update the icon. - if (sharedPreferences.getBoolean(getString(R.string.save_form_data_key), false)) - formDataPreference.setIcon(R.drawable.form_data_enabled) - else - formDataPreference.setIcon(R.drawable.form_data_disabled) - } - getString(R.string.user_agent_key) -> { // Get the new user agent name. val newUserAgentName = sharedPreferences.getString(getString(R.string.user_agent_key), getString(R.string.user_agent_default_value)) @@ -909,6 +906,17 @@ class SettingsFragment : PreferenceFragmentCompat() { hideAppBarPreference.setIcon(R.drawable.app_bar_disabled) } + getString(R.string.display_under_cutouts_key) -> { + // Update the icon. + if (sharedPreferences.getBoolean(getString(R.string.display_under_cutouts_key), true)) + displayUnderCutoutsPreference.setIcon(R.drawable.display_under_cutouts_enabled) + else + displayUnderCutoutsPreference.setIcon(R.drawable.display_under_cutouts_disabled) + + // Restart Privacy Browser. + restartPrivacyBrowser() + } + getString(R.string.clear_everything_key) -> { // Store the new clear everything status val newClearEverythingBoolean = sharedPreferences.getBoolean(getString(R.string.clear_everything_key), true) @@ -916,7 +924,6 @@ class SettingsFragment : PreferenceFragmentCompat() { // Update the status of the clear and exit preferences. clearCookiesPreference.isEnabled = !newClearEverythingBoolean clearDomStoragePreference.isEnabled = !newClearEverythingBoolean - clearFormDataPreference.isEnabled = !newClearEverythingBoolean // Clear form data can be removed once the minimum API >= 26. clearLogcatPreference.isEnabled = !newClearEverythingBoolean clearCachePreference.isEnabled = !newClearEverythingBoolean @@ -938,14 +945,6 @@ class SettingsFragment : PreferenceFragmentCompat() { else clearDomStoragePreference.setIcon(R.drawable.clear_dom_storage_disabled) - // Update the clear form data preference icon if the API < 26. - if (Build.VERSION.SDK_INT < 26) { - if (newClearEverythingBoolean || sharedPreferences.getBoolean(getString(R.string.clear_form_data_key), true)) - clearFormDataPreference.setIcon(R.drawable.clear_form_data_enabled) - else - clearFormDataPreference.setIcon(R.drawable.clear_form_data_disabled) - } - // Update the clear logcat preference icon. if (newClearEverythingBoolean || sharedPreferences.getBoolean(getString(R.string.clear_logcat_key), true)) clearLogcatPreference.setIcon(R.drawable.clear_logcat_enabled) @@ -975,14 +974,6 @@ class SettingsFragment : PreferenceFragmentCompat() { clearDomStoragePreference.setIcon(R.drawable.clear_dom_storage_disabled) } - getString(R.string.clear_form_data_key) -> { - // Update the icon. - if (sharedPreferences.getBoolean(getString(R.string.clear_form_data_key), true)) - clearFormDataPreference.setIcon(R.drawable.clear_form_data_enabled) - else - clearFormDataPreference.setIcon(R.drawable.clear_form_data_disabled) - } - getString(R.string.clear_logcat_key) -> { // Update the icon. if (sharedPreferences.getBoolean(getString(R.string.clear_logcat_key), true)) @@ -1025,17 +1016,18 @@ class SettingsFragment : PreferenceFragmentCompat() { swipeToRefreshPreference.setIcon(R.drawable.refresh_disabled) } - getString(R.string.download_with_external_app_key) -> { - // Update the icon. - if (sharedPreferences.getBoolean(getString(R.string.download_with_external_app_key), false)) - downloadWithExternalAppPreference.setIcon(R.drawable.download_with_external_app_enabled) - else - downloadWithExternalAppPreference.setIcon(R.drawable.download_with_external_app_disabled) + getString(R.string.download_provider_key) -> { + // Set the summary text for the download provider preference. + downloadProviderPreference.summary = when (sharedPreferences.getString(getString(R.string.download_provider_key), getString(R.string.download_provider_default_value))) { + downloadProviderEntryValuesStringArray[0] -> getString(R.string.download_with_privacy_browser) // Privacy Browser is selected. + downloadProviderEntryValuesStringArray[1] -> getString(R.string.download_with_android_download_manager) // Android download manager is selected. + else -> getString(R.string.download_with_external_app) // External app is selected. + } } getString(R.string.scroll_app_bar_key) -> { // Update the icon. - if (sharedPreferences.getBoolean(getString(R.string.scroll_app_bar_key), true)) + if (sharedPreferences.getBoolean(getString(R.string.scroll_app_bar_key), false)) scrollAppBarPreference.setIcon(R.drawable.app_bar_enabled) else scrollAppBarPreference.setIcon(R.drawable.app_bar_disabled)