]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.kt
Bump the minimum API to 26. https://redmine.stoutner.com/issues/1163
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / fragments / SettingsFragment.kt
index a22734eeb4404451073f5711fae83b811a6ba06b..b5d14b44c054863896066a1ecd7a9167946a9faf 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-2023 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2016-2024 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Browser Android <https://www.stoutner.com/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<String>
     private lateinit var appThemeEntryValuesStringArray: Array<String>
-    private lateinit var defaultUserAgent: String
-    private lateinit var sharedPreferenceChangeListener: OnSharedPreferenceChangeListener
-    private lateinit var translatedUserAgentNamesArray: Array<String>
-    private lateinit var userAgentDataArray: Array<String>
-    private lateinit var userAgentNamesArray: ArrayAdapter<CharSequence>
-    private lateinit var webViewThemeEntriesStringArray: Array<String>
-    private lateinit var webViewThemeEntryValuesStringArray: Array<String>
-
-    // 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<String>
+    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<String>
+    private lateinit var ultraListPreference: Preference
+    private lateinit var ultraPrivacyPreference: Preference
+    private lateinit var userAgentDataArray: Array<String>
+    private lateinit var userAgentPreference: Preference
+    private lateinit var userAgentNamesArray: ArrayAdapter<CharSequence>
+    private lateinit var webViewThemeEntriesStringArray: Array<String>
+    private lateinit var webViewThemeEntryValuesStringArray: Array<String>
     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<PreferenceCategory>(getString(R.string.privacy_category_key))!!
-            val clearAndExitCategory = findPreference<PreferenceCategory>(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<PreferenceCategory>(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)