X-Git-Url: https://gitweb.stoutner.com/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacycell%2Ffragments%2FSettingsFragment.kt;h=dc8545ffb0abcfa96225bc19f86dcb6f29b250b9;hb=81346128a1dcde5b65d83f24c1af507cd80802d3;hp=b5acce90fb45e06283ca471915c044a74f364b9f;hpb=ff2f3992b7ecddb804a96322789bd35010529f43;p=PrivacyCell.git diff --git a/app/src/main/java/com/stoutner/privacycell/fragments/SettingsFragment.kt b/app/src/main/java/com/stoutner/privacycell/fragments/SettingsFragment.kt index b5acce9..dc8545f 100644 --- a/app/src/main/java/com/stoutner/privacycell/fragments/SettingsFragment.kt +++ b/app/src/main/java/com/stoutner/privacycell/fragments/SettingsFragment.kt @@ -40,6 +40,9 @@ import com.stoutner.privacycell.activities.PrivacyCellActivity import com.stoutner.privacycell.dialogs.NotificationPermissionDialog import com.stoutner.privacycell.services.RealtimeMonitoringService +// Define the class constants. +private const val SCROLL_Y = "scroll_y" + class SettingsFragment : PreferenceFragmentCompat() { // Declare the class variables. private lateinit var sharedPreferenceChangeListener: OnSharedPreferenceChangeListener @@ -52,6 +55,12 @@ class SettingsFragment : PreferenceFragmentCompat() { private lateinit var consider3gAntiquatedPreference: Preference private lateinit var bottomAppBarPreference: Preference + companion object { + // Declare the private static class variables. Otherwise, onRestart will not pull the same values that are populated from the saved instance state. + private var fragmentRestarted: Boolean = false + private var scrollY: Int = 0 + } + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { // Load the preferences from the XML file. setPreferencesFromResource(R.xml.preferences, rootKey) @@ -128,33 +137,15 @@ class SettingsFragment : PreferenceFragmentCompat() { } else { bottomAppBarPreference.setIcon(R.drawable.bottom_app_bar_disabled) } - } - - // The listener should be unregistered when the app is paused. - override fun onPause() { - // Run the default commands. - super.onPause() - - // Get a handle for the shared preferences. - val sharedPreferences = preferenceScreen.sharedPreferences!! - - // Unregister the shared preference listener. - sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener) - } - - // The listener should be re-registered when the app is resumed. - override fun onResume() { - // Run the default commands. - super.onResume() - // Get a new shared preference change listener. - sharedPreferenceChangeListener = getSharedPreferenceChangeListener() - - // Get a handle for the shared preferences. - val sharedPreferences = preferenceScreen.sharedPreferences!! + // Check if the fragment has been restarted. + if (savedInstanceState != null) { + // Set the fragment restored flag. + fragmentRestarted = true - // Re-register the shared preference listener. - sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener) + // Save the scroll Y. + scrollY = savedInstanceState.getInt(SCROLL_Y) + } } private fun getSharedPreferenceChangeListener(): OnSharedPreferenceChangeListener { @@ -241,6 +232,53 @@ class SettingsFragment : PreferenceFragmentCompat() { } } + // The listener should be unregistered when the app is paused. + override fun onPause() { + // Run the default commands. + super.onPause() + + // Get a handle for the shared preferences. + val sharedPreferences = preferenceScreen.sharedPreferences!! + + // Unregister the shared preference listener. + sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener) + } + + // The listener should be re-registered when the app is resumed. + override fun onResume() { + // Run the default commands. + super.onResume() + + // Get a new shared preference change listener. + sharedPreferenceChangeListener = getSharedPreferenceChangeListener() + + // Get a handle for the shared preferences. + val sharedPreferences = preferenceScreen.sharedPreferences!! + + // Re-register the shared preference listener. + sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener) + + // Update the realtime monitoring preference summary. + updateRealtimeMonitoringSummary() + + // Restore the scroll position if the fragment has been restarted. + if (fragmentRestarted) { + // Reset the fragment restarted flag. + fragmentRestarted = false + + // Set the scroll position. + 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 restartPrivacyCell() { // Create an intent to restart Privacy Cell. val restartIntent = requireActivity().parentActivityIntent!! @@ -260,4 +298,18 @@ class SettingsFragment : PreferenceFragmentCompat() { // Restart the activity after 400 milliseconds, so that the app has enough time to save the change to the preference. restartHandler.postDelayed(restartRunnable, 400) } + + fun updateRealtimeMonitoringSummary() { + // Update the summary according to the API. + if (Build.VERSION.SDK_INT >= 33) { // The API >= 33. + // Set the summary according to the notification permission status. + if (ActivityCompat.checkSelfPermission(requireContext(), Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) + realtimeMonitoringPreference.summary = getString(R.string.realtime_monitoring_summary) + else + realtimeMonitoringPreference.summary = (getString(R.string.realtime_monitoring_summary) + " " + getString(R.string.notification_permission_denied)) + } else { // The API is < 33. + // Set the realtime monitoring summary. + realtimeMonitoringPreference.summary = getString(R.string.realtime_monitoring_summary) + } + } }