From 975d95e37e8ee7a23ac14f93a4341d561b247bc0 Mon Sep 17 00:00:00 2001 From: johan12345 Date: Sat, 16 Oct 2021 15:49:00 +0200 Subject: [PATCH] refactor app settings into separate sub-screens for better overview --- .../java/net/vonforst/evmap/MapsActivity.kt | 21 +++- .../{ => preference}/AboutFragment.kt | 2 +- .../preference/BaseSettingsFragment.kt | 40 +++++++ .../ChargepriceSettingsFragment.kt} | 66 +----------- .../preference/DataSettingsFragment.kt | 63 +++++++++++ .../fragment/preference/SettingsFragment.kt | 22 ++++ .../fragment/preference/UiSettingsFragment.kt | 26 +++++ app/src/main/res/drawable/ic_chargeprice.xml | 1 + .../res/drawable/ic_settings_data_source.xml | 11 ++ app/src/main/res/drawable/ic_settings_ui.xml | 10 ++ app/src/main/res/navigation/nav_graph.xml | 19 +++- app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/settings.xml | 102 +++--------------- app/src/main/res/xml/settings_chargeprice.xml | 31 ++++++ app/src/main/res/xml/settings_data.xml | 36 +++++++ app/src/main/res/xml/settings_ui.xml | 24 +++++ 17 files changed, 318 insertions(+), 158 deletions(-) rename app/src/main/java/net/vonforst/evmap/fragment/{ => preference}/AboutFragment.kt (98%) create mode 100644 app/src/main/java/net/vonforst/evmap/fragment/preference/BaseSettingsFragment.kt rename app/src/main/java/net/vonforst/evmap/fragment/{SettingsFragment.kt => preference/ChargepriceSettingsFragment.kt} (61%) create mode 100644 app/src/main/java/net/vonforst/evmap/fragment/preference/DataSettingsFragment.kt create mode 100644 app/src/main/java/net/vonforst/evmap/fragment/preference/SettingsFragment.kt create mode 100644 app/src/main/java/net/vonforst/evmap/fragment/preference/UiSettingsFragment.kt create mode 100644 app/src/main/res/drawable/ic_settings_data_source.xml create mode 100644 app/src/main/res/drawable/ic_settings_ui.xml create mode 100644 app/src/main/res/xml/settings_chargeprice.xml create mode 100644 app/src/main/res/xml/settings_data.xml create mode 100644 app/src/main/res/xml/settings_ui.xml diff --git a/app/src/main/java/net/vonforst/evmap/MapsActivity.kt b/app/src/main/java/net/vonforst/evmap/MapsActivity.kt index bf8ffcb1..4804b1a0 100644 --- a/app/src/main/java/net/vonforst/evmap/MapsActivity.kt +++ b/app/src/main/java/net/vonforst/evmap/MapsActivity.kt @@ -19,8 +19,11 @@ import androidx.core.view.WindowInsetsCompat import androidx.drawerlayout.widget.DrawerLayout import androidx.navigation.NavController import androidx.navigation.findNavController +import androidx.navigation.fragment.FragmentNavigator import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.setupWithNavController +import androidx.preference.Preference +import androidx.preference.PreferenceFragmentCompat import com.google.android.material.navigation.NavigationView import com.google.android.material.snackbar.Snackbar import net.vonforst.evmap.fragment.MapFragment @@ -35,7 +38,8 @@ const val EXTRA_CHARGER_ID = "chargerId" const val EXTRA_LAT = "lat" const val EXTRA_LON = "lon" -class MapsActivity : AppCompatActivity() { +class MapsActivity : AppCompatActivity(), + PreferenceFragmentCompat.OnPreferenceStartFragmentCallback { interface FragmentCallback { fun getRootView(): View } @@ -102,11 +106,11 @@ class MapsActivity : AppCompatActivity() { } }) } - navGraph.startDestination = R.id.onboarding + navGraph.setStartDestination(R.id.onboarding) navController.graph = navGraph return } else { - navGraph.startDestination = R.id.map + navGraph.setStartDestination(R.id.map) navController.graph = navGraph } @@ -213,4 +217,15 @@ class MapsActivity : AppCompatActivity() { } startActivity(intent) } + + override fun onPreferenceStartFragment( + caller: PreferenceFragmentCompat, + pref: Preference + ): Boolean { + // Identify the Navigation Destination + val navDestination = navController.graph + .find { target -> target is FragmentNavigator.Destination && pref.fragment == target.className } + navDestination?.let { target -> navController.navigate(target.id) } + return true + } } diff --git a/app/src/main/java/net/vonforst/evmap/fragment/AboutFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/preference/AboutFragment.kt similarity index 98% rename from app/src/main/java/net/vonforst/evmap/fragment/AboutFragment.kt rename to app/src/main/java/net/vonforst/evmap/fragment/preference/AboutFragment.kt index 11a1823b..a30d8163 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/AboutFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/preference/AboutFragment.kt @@ -1,4 +1,4 @@ -package net.vonforst.evmap.fragment +package net.vonforst.evmap.fragment.preference import android.os.Bundle import androidx.appcompat.widget.Toolbar diff --git a/app/src/main/java/net/vonforst/evmap/fragment/preference/BaseSettingsFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/preference/BaseSettingsFragment.kt new file mode 100644 index 00000000..69ba3de6 --- /dev/null +++ b/app/src/main/java/net/vonforst/evmap/fragment/preference/BaseSettingsFragment.kt @@ -0,0 +1,40 @@ +package net.vonforst.evmap.fragment.preference + +import android.content.SharedPreferences +import android.os.Bundle +import android.view.View +import androidx.appcompat.widget.Toolbar +import androidx.navigation.fragment.findNavController +import androidx.navigation.ui.setupWithNavController +import androidx.preference.PreferenceFragmentCompat +import net.vonforst.evmap.MapsActivity +import net.vonforst.evmap.R +import net.vonforst.evmap.storage.PreferenceDataSource + +abstract class BaseSettingsFragment : PreferenceFragmentCompat(), + SharedPreferences.OnSharedPreferenceChangeListener { + protected lateinit var prefs: PreferenceDataSource + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + prefs = PreferenceDataSource(requireContext()) + } + + override fun onResume() { + super.onResume() + preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(this) + + val navController = findNavController() + val toolbar = requireView().findViewById(R.id.toolbar) as Toolbar + toolbar.setupWithNavController( + navController, + (requireActivity() as MapsActivity).appBarConfiguration + ) + } + + override fun onPause() { + preferenceManager.sharedPreferences + .unregisterOnSharedPreferenceChangeListener(this) + super.onPause() + } +} \ No newline at end of file diff --git a/app/src/main/java/net/vonforst/evmap/fragment/SettingsFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/preference/ChargepriceSettingsFragment.kt similarity index 61% rename from app/src/main/java/net/vonforst/evmap/fragment/SettingsFragment.kt rename to app/src/main/java/net/vonforst/evmap/fragment/preference/ChargepriceSettingsFragment.kt index 7d404a4f..04cea65f 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/SettingsFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/preference/ChargepriceSettingsFragment.kt @@ -1,28 +1,15 @@ -package net.vonforst.evmap.fragment +package net.vonforst.evmap.fragment.preference import android.content.SharedPreferences import android.os.Bundle import android.view.View -import android.widget.Toast -import androidx.appcompat.widget.Toolbar import androidx.fragment.app.viewModels -import androidx.navigation.fragment.findNavController -import androidx.navigation.ui.setupWithNavController import androidx.preference.MultiSelectListPreference -import androidx.preference.Preference -import androidx.preference.PreferenceFragmentCompat -import net.vonforst.evmap.MapsActivity import net.vonforst.evmap.R -import net.vonforst.evmap.storage.PreferenceDataSource -import net.vonforst.evmap.ui.updateNightMode import net.vonforst.evmap.viewmodel.SettingsViewModel import net.vonforst.evmap.viewmodel.viewModelFactory - -class SettingsFragment : PreferenceFragmentCompat(), - SharedPreferences.OnSharedPreferenceChangeListener { - private lateinit var prefs: PreferenceDataSource - +class ChargepriceSettingsFragment : BaseSettingsFragment() { private val vm: SettingsViewModel by viewModels(factoryProducer = { viewModelFactory { SettingsViewModel( @@ -37,7 +24,6 @@ class SettingsFragment : PreferenceFragmentCompat(), override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - prefs = PreferenceDataSource(requireContext()) myVehiclePreference = findPreference("chargeprice_my_vehicle")!! myVehiclePreference.isEnabled = false @@ -97,63 +83,17 @@ class SettingsFragment : PreferenceFragmentCompat(), } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - setPreferencesFromResource(R.xml.settings, rootKey) - } - - override fun onPreferenceTreeClick(preference: Preference?): Boolean { - return when (preference?.key) { - "search_delete_recent" -> { - Toast.makeText(context, R.string.deleted_recent_search_results, Toast.LENGTH_LONG) - .show() - vm.deleteRecentSearchResults() - true - } - else -> super.onPreferenceTreeClick(preference) - } + setPreferencesFromResource(R.xml.settings_chargeprice, rootKey) } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { when (key) { - "language" -> { - activity?.let { - it.finish(); - it.startActivity(it.intent); - } - } - "darkmode" -> { - updateNightMode(prefs) - } "chargeprice_my_vehicle" -> { updateMyVehiclesSummary() } "chargeprice_my_tariffs" -> { updateMyTariffsSummary() } - "search_provider" -> { - if (prefs.searchProvider == "google") { - Toast.makeText(context, R.string.pref_search_provider_info, Toast.LENGTH_LONG) - .show() - } - } } } - - override fun onResume() { - super.onResume() - preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(this) - - val navController = findNavController() - val toolbar = requireView().findViewById(R.id.toolbar) as Toolbar - toolbar.setupWithNavController( - navController, - (requireActivity() as MapsActivity).appBarConfiguration - ) - } - - override fun onPause() { - preferenceManager.sharedPreferences - .unregisterOnSharedPreferenceChangeListener(this) - super.onPause() - } - } \ No newline at end of file diff --git a/app/src/main/java/net/vonforst/evmap/fragment/preference/DataSettingsFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/preference/DataSettingsFragment.kt new file mode 100644 index 00000000..edb2c6d7 --- /dev/null +++ b/app/src/main/java/net/vonforst/evmap/fragment/preference/DataSettingsFragment.kt @@ -0,0 +1,63 @@ +package net.vonforst.evmap.fragment.preference + +import android.content.SharedPreferences +import android.os.Bundle +import android.widget.TextView +import androidx.fragment.app.viewModels +import androidx.preference.Preference +import com.google.android.material.snackbar.Snackbar +import net.vonforst.evmap.R +import net.vonforst.evmap.viewmodel.SettingsViewModel +import net.vonforst.evmap.viewmodel.viewModelFactory + +class DataSettingsFragment : BaseSettingsFragment() { + private val vm: SettingsViewModel by viewModels(factoryProducer = { + viewModelFactory { + SettingsViewModel( + requireActivity().application, + getString(R.string.chargeprice_key) + ) + } + }) + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + setPreferencesFromResource(R.xml.settings_data, rootKey) + } + + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { + when (key) { + "search_provider" -> { + if (prefs.searchProvider == "google") { + Snackbar.make( + requireView(), + R.string.pref_search_provider_info, + Snackbar.LENGTH_INDEFINITE + ).apply { + setAction(R.string.ok) {} + this.view.findViewById(com.google.android.material.R.id.snackbar_text) + ?.apply { + maxLines = 6 + } + } + .show() + } + } + } + } + + override fun onPreferenceTreeClick(preference: Preference?): Boolean { + return when (preference?.key) { + "search_delete_recent" -> { + Snackbar.make( + requireView(), + R.string.deleted_recent_search_results, + Snackbar.LENGTH_LONG + ) + .show() + vm.deleteRecentSearchResults() + true + } + else -> super.onPreferenceTreeClick(preference) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/net/vonforst/evmap/fragment/preference/SettingsFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/preference/SettingsFragment.kt new file mode 100644 index 00000000..3302a080 --- /dev/null +++ b/app/src/main/java/net/vonforst/evmap/fragment/preference/SettingsFragment.kt @@ -0,0 +1,22 @@ +package net.vonforst.evmap.fragment.preference + +import android.content.SharedPreferences +import android.os.Bundle +import android.view.View +import net.vonforst.evmap.R + + +class SettingsFragment : BaseSettingsFragment() { + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + } + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + setPreferencesFromResource(R.xml.settings, rootKey) + } + + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { + + } +} \ No newline at end of file diff --git a/app/src/main/java/net/vonforst/evmap/fragment/preference/UiSettingsFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/preference/UiSettingsFragment.kt new file mode 100644 index 00000000..2cefafc7 --- /dev/null +++ b/app/src/main/java/net/vonforst/evmap/fragment/preference/UiSettingsFragment.kt @@ -0,0 +1,26 @@ +package net.vonforst.evmap.fragment.preference + +import android.content.SharedPreferences +import android.os.Bundle +import net.vonforst.evmap.R +import net.vonforst.evmap.ui.updateNightMode + +class UiSettingsFragment : BaseSettingsFragment() { + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + setPreferencesFromResource(R.xml.settings_ui, rootKey) + } + + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { + when (key) { + "language" -> { + activity?.let { + it.finish(); + it.startActivity(it.intent); + } + } + "darkmode" -> { + updateNightMode(prefs) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_chargeprice.xml b/app/src/main/res/drawable/ic_chargeprice.xml index a01e8ce4..43d7c661 100644 --- a/app/src/main/res/drawable/ic_chargeprice.xml +++ b/app/src/main/res/drawable/ic_chargeprice.xml @@ -1,4 +1,5 @@ diff --git a/app/src/main/res/drawable/ic_settings_data_source.xml b/app/src/main/res/drawable/ic_settings_data_source.xml new file mode 100644 index 00000000..6fe2b11f --- /dev/null +++ b/app/src/main/res/drawable/ic_settings_data_source.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_settings_ui.xml b/app/src/main/res/drawable/ic_settings_ui.xml new file mode 100644 index 00000000..48e22e26 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings_ui.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 422737b5..bc9cb379 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -36,7 +36,7 @@ + + + „%s“ bearbeiten Suchverlauf löschen Suchverlauf wurde gelöscht + Datenquellen diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ce8fca2a..d55812c4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -230,4 +230,5 @@ Edit “%s” Delete recent search results Recent search results have been deleted + Data sources diff --git a/app/src/main/res/xml/settings.xml b/app/src/main/res/xml/settings.xml index 8c0271aa..7cfa7aea 100644 --- a/app/src/main/res/xml/settings.xml +++ b/app/src/main/res/xml/settings.xml @@ -1,91 +1,15 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/settings_chargeprice.xml b/app/src/main/res/xml/settings_chargeprice.xml new file mode 100644 index 00000000..535828bb --- /dev/null +++ b/app/src/main/res/xml/settings_chargeprice.xml @@ -0,0 +1,31 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/settings_data.xml b/app/src/main/res/xml/settings_data.xml new file mode 100644 index 00000000..44f2baf6 --- /dev/null +++ b/app/src/main/res/xml/settings_data.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/settings_ui.xml b/app/src/main/res/xml/settings_ui.xml new file mode 100644 index 00000000..69dd7a1b --- /dev/null +++ b/app/src/main/res/xml/settings_ui.xml @@ -0,0 +1,24 @@ + + + + + + + \ No newline at end of file