diff --git a/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt b/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt index ea9534b8..61a0d876 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt @@ -27,12 +27,15 @@ import javax.inject.Inject class MainViewModel(application: Application) : AndroidViewModel(application) { - private val keyLat = "latitude" - private val keyLon = "longitude" - private val keyAlt = "altitude" - private val keyHours = "hoursAhead" - private val keyMaxEl = "maxElevation" - private val tleFileName = "tleFile.txt" + private val defValueLoc = application.getString(R.string.def_gsp_loc) + private val defValueHours = application.getString(R.string.def_hours_ahead) + private val defValueMinEl = application.getString(R.string.def_min_el) + private val keyLat = application.getString(R.string.key_lat) + private val keyLon = application.getString(R.string.key_lon) + private val keyAlt = application.getString(R.string.key_alt) + private val keyHours = application.getString(R.string.key_hours_ahead) + private val keyMinEl = application.getString(R.string.key_min_el) + private val tleFileName = application.getString(R.string.tle_file_name) @Inject lateinit var locationClient: FusedLocationProviderClient @@ -48,9 +51,9 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { val debugMessage = MutableLiveData("") val gsp = MutableLiveData( GroundStationPosition( - preferences.getDouble(keyLat, 0.0), - preferences.getDouble(keyLon, 0.0), - preferences.getDouble(keyAlt, 0.0) + preferences.getString(keyLat, defValueLoc)!!.toDouble(), + preferences.getString(keyLon, defValueLoc)!!.toDouble(), + preferences.getString(keyAlt, defValueLoc)!!.toDouble() ) ) @@ -58,8 +61,8 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { var tleMainList = loadTwoLineElementFile() var tleSelectedMap = mutableMapOf() var passPrefs = SatPassPrefs( - preferences.getInt(keyHours, 8), - preferences.getDouble(keyMaxEl, 16.0) + preferences.getString(keyHours, defValueHours)!!.toInt(), + preferences.getString(keyMinEl, defValueMinEl)!!.toDouble() ) private fun loadTwoLineElementFile(): List { @@ -102,11 +105,25 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { passPrefs = SatPassPrefs(hoursAhead, maxEl) preferences.edit { putInt(keyHours, hoursAhead) - putDouble(keyMaxEl, maxEl) + putLong(keyMinEl, maxEl.toRawBits()) apply() } } + fun updateGsp() { + val lat = preferences.getString(keyLat, defValueLoc)!!.toDouble() + val lon = preferences.getString(keyLon, defValueLoc)!!.toDouble() + val alt = preferences.getString(keyAlt, defValueLoc)!!.toDouble() + gsp.postValue(GroundStationPosition(lat, lon, alt)) + } + + fun updatePassPref() { + passPrefs = SatPassPrefs( + preferences.getString(keyHours, defValueHours)!!.toInt(), + preferences.getString(keyMinEl, defValueMinEl)!!.toDouble() + ) + } + fun updateLocation() { locationClient.lastLocation.addOnSuccessListener { location: Location? -> val lat = location?.latitude ?: 0.0 @@ -114,9 +131,9 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { val alt = location?.altitude ?: 0.0 preferences.edit { - putDouble(keyLat, lat) - putDouble(keyLon, lon) - putDouble(keyAlt, alt) + putString(keyLat, lat.toString()) + putString(keyLon, lon.toString()) + putString(keyAlt, alt.toString()) apply() } gsp.postValue(GroundStationPosition(lat, lon, alt)) @@ -154,10 +171,4 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { suspend fun getTransmittersForSat(id: Int): List { return repository.getTransmittersForSat(id) } -} - -fun SharedPreferences.Editor.putDouble(key: String, double: Double) - : SharedPreferences.Editor = putLong(key, double.toRawBits()) - -fun SharedPreferences.getDouble(key: String, default: Double) = - Double.fromBits(getLong(key, default.toRawBits())) \ No newline at end of file +} \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/lookingsat/ui/SettingsFragment.kt b/app/src/main/java/com/rtbishop/lookingsat/ui/SettingsFragment.kt index ff1844e6..c230cb14 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/ui/SettingsFragment.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/SettingsFragment.kt @@ -1,11 +1,54 @@ package com.rtbishop.lookingsat.ui +import android.content.SharedPreferences import android.os.Bundle +import androidx.lifecycle.ViewModelProvider +import androidx.preference.EditTextPreference import androidx.preference.PreferenceFragmentCompat +import com.rtbishop.lookingsat.MainViewModel import com.rtbishop.lookingsat.R -class SettingsFragment : PreferenceFragmentCompat() { +class SettingsFragment : PreferenceFragmentCompat(), + SharedPreferences.OnSharedPreferenceChangeListener { + + private lateinit var viewModel: MainViewModel + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preference, rootKey) + + viewModel = ViewModelProvider(activity as MainActivity).get(MainViewModel::class.java) + + val provider = EditTextPreference.SimpleSummaryProvider.getInstance() + val latPref = findPreference(context!!.getText(R.string.key_lat)) + val lonPref = findPreference(context!!.getText(R.string.key_lon)) + val altPref = findPreference(context!!.getText(R.string.key_alt)) + + latPref?.summaryProvider = provider + lonPref?.summaryProvider = provider + altPref?.summaryProvider = provider + } + + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + if (key == context!!.getText(R.string.key_lat) || + key == context!!.getText(R.string.key_lon) || + key == context!!.getText(R.string.key_alt) + ) { + viewModel.updateGsp() + } + if (key == context!!.getText(R.string.key_hours_ahead) || + key == context!!.getText(R.string.key_min_el) + ) { + viewModel.updatePassPref() + } + } + + override fun onResume() { + super.onResume() + preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(this) + } + + override fun onPause() { + super.onPause() + preferenceManager.sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) } } \ No newline at end of file diff --git a/app/src/main/res/layout/sat_pass_pref.xml b/app/src/main/res/layout/sat_pass_pref.xml index b0034939..26a1d910 100644 --- a/app/src/main/res/layout/sat_pass_pref.xml +++ b/app/src/main/res/layout/sat_pass_pref.xml @@ -10,7 +10,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" - android:text="@string/pass_pref_tv_hours" + android:text="@string/pref_hours_ahead_title" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -19,7 +19,7 @@ android:id="@+id/pass_pref_et_hours" android:layout_width="0dp" android:layout_height="wrap_content" - android:hint="@string/pass_pref_hint_hours" + android:hint="@string/pref_hours_ahead_title" android:importantForAutofill="no" android:inputType="number" app:layout_constraintEnd_toEndOf="@+id/pass_pref_tv_hours" @@ -31,7 +31,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" - android:text="@string/pass_pref_tv_maxEl" + android:text="@string/pref_min_el_title" app:layout_constraintEnd_toEndOf="@+id/pass_pref_et_hours" app:layout_constraintStart_toStartOf="@+id/pass_pref_et_hours" app:layout_constraintTop_toBottomOf="@+id/pass_pref_et_hours" /> @@ -40,7 +40,7 @@ android:id="@+id/pass_pref_et_maxEl" android:layout_width="0dp" android:layout_height="wrap_content" - android:hint="@string/pass_pref_hint_maxEl" + android:hint="@string/pref_min_el_title" android:importantForAutofill="no" android:inputType="numberDecimal" app:layout_constraintEnd_toEndOf="@+id/pass_pref_tv_maxEl" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b69c84f1..7743899c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -39,10 +39,31 @@ Passes preferences Select satellites to track - Show passes that occur within X hours - Hours ahead - Show passes with max elevation above - Max elevation + Ground station position settings + Latitude + Longitude + Altitude + Satellite pass settings + Hours ahead + Show passes that occur within X hours + Minimum elevation + Show passes with max elevation above + Other settings + Update frequency + Views update interval, ms + + 0.0 + 8 + 16.0 + 3000 + + latitude + longitude + altitude + hours_ahead + min_elevation + update_freq + tleFile.txt No Yes diff --git a/app/src/main/res/xml/preference.xml b/app/src/main/res/xml/preference.xml index e968c100..d8601728 100644 --- a/app/src/main/res/xml/preference.xml +++ b/app/src/main/res/xml/preference.xml @@ -1,48 +1,48 @@ - + + android:title="@string/pref_lat_title" /> + android:title="@string/pref_lon_title" /> + android:title="@string/pref_alt_title" /> - + + android:summary="@string/pref_hours_ahead_summary" + android:title="@string/pref_hours_ahead_title" /> + android:summary="@string/pref_min_el_summary" + android:title="@string/pref_min_el_title" /> - + + android:summary="@string/pref_update_freq_summary" + android:title="@string/pref_update_freq_title" /> \ No newline at end of file