From 0f5b734933acaa6aa135664f14f34f5de6b1598d Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Sun, 24 Nov 2019 17:57:58 +0000 Subject: [PATCH] Added pass preferences dialog. Pass prefs are stored in sharedPrefs. --- .../com/rtbishop/lookingsat/MainViewModel.kt | 21 +++++++- .../rtbishop/lookingsat/repo/SatPassPrefs.kt | 3 ++ .../rtbishop/lookingsat/ui/SatPassAdapter.kt | 2 +- .../com/rtbishop/lookingsat/ui/SkyFragment.kt | 45 ++++++++++++----- app/src/main/res/layout/sat_pass_pref.xml | 49 +++++++++++++++++++ app/src/main/res/values/strings.xml | 13 +++++ 6 files changed, 119 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/com/rtbishop/lookingsat/repo/SatPassPrefs.kt create mode 100644 app/src/main/res/layout/sat_pass_pref.xml diff --git a/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt b/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt index a6eaf84b..e00bcbbe 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt @@ -18,6 +18,7 @@ import com.github.amsacode.predict4java.TLE import com.google.android.gms.location.LocationServices import com.rtbishop.lookingsat.repo.Repository import com.rtbishop.lookingsat.repo.SatPass +import com.rtbishop.lookingsat.repo.SatPassPrefs import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -43,6 +44,14 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { private val _debugMessage = MutableLiveData("") val debugMessage: LiveData = _debugMessage + private val _satPassPrefs = MutableLiveData( + SatPassPrefs( + preferences.getInt("hoursAhead", 8), + preferences.getDouble("maxEl", 20.0) + ) + ) + val satPassPrefs: LiveData = _satPassPrefs + private val _gsp = MutableLiveData( GroundStationPosition( preferences.getDouble(keyLat, 0.0), @@ -71,13 +80,14 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { suspend fun getPassesForSelectedSatellites(): List { val satPassList = mutableListOf() var sortedList = listOf() + val hoursAhead = satPassPrefs.value?.hoursAhead ?: 8 withContext(Dispatchers.Default) { for ((tle, value) in tleSelectedMap) { if (value) { try { Log.d(tag, "Trying ${tle.name}") val passPredictor = PassPredictor(tle, gsp.value) - val passes = passPredictor.getPasses(Date(), 6, false) + val passes = passPredictor.getPasses(Date(), hoursAhead, false) for (pass in passes) { Log.d(tag, "Trying ${pass.maxEl}") satPassList.add(SatPass(tle.name, tle.catnum, pass)) @@ -96,6 +106,15 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { return sortedList } + fun updatePassPrefs(hoursAhead: Int, maxEl: Double) { + _satPassPrefs.postValue(SatPassPrefs(hoursAhead, maxEl)) + preferences.edit { + putInt("hoursAhead", hoursAhead) + putDouble("maxEl", maxEl) + apply() + } + } + fun updateLocation() { fusedLocationClient.lastLocation.addOnSuccessListener { location: Location? -> val lat = location?.latitude ?: 0.0 diff --git a/app/src/main/java/com/rtbishop/lookingsat/repo/SatPassPrefs.kt b/app/src/main/java/com/rtbishop/lookingsat/repo/SatPassPrefs.kt new file mode 100644 index 00000000..7e4398ac --- /dev/null +++ b/app/src/main/java/com/rtbishop/lookingsat/repo/SatPassPrefs.kt @@ -0,0 +1,3 @@ +package com.rtbishop.lookingsat.repo + +data class SatPassPrefs(val hoursAhead: Int, val maxEl: Double) \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/lookingsat/ui/SatPassAdapter.kt b/app/src/main/java/com/rtbishop/lookingsat/ui/SatPassAdapter.kt index d6287a65..93010df6 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/ui/SatPassAdapter.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/SatPassAdapter.kt @@ -35,7 +35,7 @@ class SatPassAdapter(private val satPassList: List) : satName.text = String.format("%s", satPass.satName) maxEl.text = String.format("%.1f°", satPass.pass.maxEl) passVector.text = - String.format("V: %02d° -> %02d°", satPass.pass.aosAzimuth, satPass.pass.losAzimuth) + String.format("V: %2d° -> %2d°", satPass.pass.aosAzimuth, satPass.pass.losAzimuth) passStart.text = SimpleDateFormat("HH:mm:ss", Locale.getDefault()).format(satPass.pass.startTime) passEnd.text = diff --git a/app/src/main/java/com/rtbishop/lookingsat/ui/SkyFragment.kt b/app/src/main/java/com/rtbishop/lookingsat/ui/SkyFragment.kt index 0b0bf873..6eeb6a23 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/ui/SkyFragment.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/SkyFragment.kt @@ -5,10 +5,7 @@ import android.os.CountDownTimer import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.ImageButton -import android.widget.ProgressBar -import android.widget.TextView -import android.widget.Toast +import android.widget.* import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider @@ -55,11 +52,35 @@ class SkyFragment : Fragment() { recViewFuture.layoutManager = LinearLayoutManager(activity) + btnPassPrefs.setOnClickListener { showSatPassPrefsDialog() } fab.setOnClickListener { showSelectSatDialog() } resetTimer() } + private fun showSatPassPrefsDialog() { + val context = activity as MainActivity + val satPassPrefView = View.inflate(context, R.layout.sat_pass_pref, null) + val etHours = satPassPrefView.findViewById(R.id.pass_pref_et_hours) + val etMaxEl = satPassPrefView.findViewById(R.id.pass_pref_et_maxEl) + etHours.setText(viewModel.satPassPrefs.value?.hoursAhead.toString()) + etMaxEl.setText(viewModel.satPassPrefs.value?.maxEl.toString()) + + val builder = AlertDialog.Builder(context) + builder.setTitle(getString(R.string.title_pass_pref)) + .setPositiveButton(getString(R.string.btn_ok)) { _, _ -> + val hoursAhead = etHours.text.toString().toInt() + val maxEl = etMaxEl.text.toString().toDouble() + viewModel.updatePassPrefs(hoursAhead, maxEl) + } + .setNegativeButton(getString(R.string.btn_cancel)) { dialog, _ -> + dialog.cancel() + } + .setView(satPassPrefView) + .create() + .show() + } + private fun showSelectSatDialog() { val tleSelectedMap = viewModel.tleSelectedMap val tleMainListSize = viewModel.tleMainList.size @@ -81,23 +102,23 @@ class SkyFragment : Fragment() { val selectionMap = mutableMapOf() val builder = AlertDialog.Builder(activity as MainActivity) - builder.setTitle("Select satellites to track") + builder.setTitle(getString(R.string.title_select_sat)) .setMultiChoiceItems(tleNameArray, tleCheckedArray) { _, which, isChecked -> selectionMap[viewModel.tleMainList[which]] = isChecked } - .setPositiveButton("Ok") { _, _ -> + .setPositiveButton(getString(R.string.btn_ok)) { _, _ -> for ((tle, value) in selectionMap) { tleSelectedMap[tle] = value calculatePasses() } } - .setNeutralButton("Clear All") { _, _ -> + .setNegativeButton(getString(R.string.btn_cancel)) { dialog, _ -> + dialog.cancel() + } + .setNeutralButton(getString(R.string.btn_clear)) { _, _ -> tleSelectedMap.clear() calculatePasses() } - .setNegativeButton("Cancel") { dialog, _ -> - dialog.cancel() - } .create() .show() } @@ -134,7 +155,7 @@ class SkyFragment : Fragment() { override fun onTick(millisUntilFinished: Long) { timeToAos.text = String.format( - "AOS -%02d:%02d:%02d", + getString(R.string.pattern_aos), TimeUnit.MILLISECONDS.toHours(millisUntilFinished) % 60, TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % 60, TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) % 60 @@ -152,6 +173,6 @@ class SkyFragment : Fragment() { (aosTimer as CountDownTimer).cancel() aosTimer = null } - timeToAos.text = String.format("AOS -%02d:%02d:%02d", 0, 0, 0) + timeToAos.text = String.format(getString(R.string.pattern_aos), 0, 0, 0) } } \ 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 new file mode 100644 index 00000000..b58b34b2 --- /dev/null +++ b/app/src/main/res/layout/sat_pass_pref.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 782a5bd4..0b7ddd0a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -29,6 +29,19 @@ 13:14:15 16:17:18 + OK + Cancel + Clear All + + Passes preferences + Select satellites to track + + Show passes that occur within X hours + Hours ahead + Show passes with max elevation above + Max elevation + + AOS -%02d:%02d:%02d Nasa Map Placeholder