Calculating doppler only for active leo satellites. Fixes to EntriesFragment states, etc.

This commit is contained in:
Arty Bishop committed 2020-10-24 23:21:23 +01:00
1 parent 7eb388f63a
commit a7eb805f6d
6 files changed
+74 -42

No files matched your search

@@ -25,14 +25,14 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.data.SatPass
import com.rtbishop.look4sat.data.SatTrans import com.rtbishop.look4sat.data.SatTrans
import com.rtbishop.look4sat.databinding.ItemTransBinding import com.rtbishop.look4sat.databinding.ItemTransBinding
import com.rtbishop.look4sat.utility.PassPredictor
import java.util.* import java.util.*
class TransAdapter(context: Context) : RecyclerView.Adapter<TransAdapter.TransHolder>() { class TransAdapter(context: Context, private val satPass: SatPass) :
RecyclerView.Adapter<TransAdapter.TransHolder>() {
private lateinit var predictor: PassPredictor
private val divider = 1000000f private val divider = 1000000f
private val strNo = context.getString(R.string.btn_no) private val strNo = context.getString(R.string.btn_no)
private val strYes = context.getString(R.string.btn_yes) private val strYes = context.getString(R.string.btn_yes)
@@ -40,17 +40,25 @@ class TransAdapter(context: Context) : RecyclerView.Adapter<TransAdapter.TransHo
private val formatLink = context.getString(R.string.trans_link_low) private val formatLink = context.getString(R.string.trans_link_low)
private val formatLinkNull = context.getString(R.string.trans_no_link) private val formatLinkNull = context.getString(R.string.trans_no_link)
private val isInverted = context.getString(R.string.trans_inverted) private val isInverted = context.getString(R.string.trans_inverted)
private val predictor = satPass.predictor
private var transmittersList = emptyList<SatTrans>() private var transmittersList = emptyList<SatTrans>()
fun setPredictor(predictor: PassPredictor) { fun setData(list: List<SatTrans>) {
this.predictor = predictor
}
fun setList(list: List<SatTrans>) {
transmittersList = list transmittersList = list
notifyDataSetChanged() notifyDataSetChanged()
} }
fun tickTransmitters() {
if (!satPass.tle.isDeepspace and satPass.active) {
val iterator = transmittersList.listIterator()
while (iterator.hasNext()) {
val trans = iterator.next()
val index = transmittersList.indexOf(trans)
notifyItemChanged(index)
}
}
}
override fun getItemCount(): Int { override fun getItemCount(): Int {
return transmittersList.size return transmittersList.size
} }
@@ -69,9 +77,33 @@ class TransAdapter(context: Context) : RecyclerView.Adapter<TransAdapter.TransHo
RecyclerView.ViewHolder(itemView) { RecyclerView.ViewHolder(itemView) {
fun bind(satTrans: SatTrans) { fun bind(satTrans: SatTrans) {
val dateNow = Date()
binding.description.text = satTrans.description binding.description.text = satTrans.description
if (satPass.tle.isDeepspace or !satPass.active) setRegularFreq(satTrans)
else setDopplerFreq(satTrans)
if (satTrans.mode != null) binding.mode.text = String.format(mode, satTrans.mode)
else binding.mode.text = String.format(mode, strNo)
if (satTrans.isInverted) binding.isInverted.text = String.format(isInverted, strYes)
else binding.isInverted.text = String.format(isInverted, strNo)
}
private fun setRegularFreq(satTrans: SatTrans) {
if (satTrans.downlinkLow != null) {
val downFreq = satTrans.downlinkLow / divider
binding.downlink.text = String.format(Locale.ENGLISH, formatLink, downFreq)
} else binding.downlink.text = formatLinkNull
if (satTrans.uplinkLow != null) {
val upFreq = satTrans.uplinkLow / divider
binding.uplink.text = String.format(Locale.ENGLISH, formatLink, upFreq)
} else binding.uplink.text = formatLinkNull
}
private fun setDopplerFreq(satTrans: SatTrans) {
val dateNow = Date()
if (satTrans.downlinkLow != null) { if (satTrans.downlinkLow != null) {
val downFreq = predictor.getDownlinkFreq(satTrans.downlinkLow, dateNow) / divider val downFreq = predictor.getDownlinkFreq(satTrans.downlinkLow, dateNow) / divider
binding.downlink.text = String.format(Locale.ENGLISH, formatLink, downFreq) binding.downlink.text = String.format(Locale.ENGLISH, formatLink, downFreq)
@@ -81,12 +113,6 @@ class TransAdapter(context: Context) : RecyclerView.Adapter<TransAdapter.TransHo
val upFreq = predictor.getUplinkFreq(satTrans.uplinkLow, dateNow) / divider val upFreq = predictor.getUplinkFreq(satTrans.uplinkLow, dateNow) / divider
binding.uplink.text = String.format(Locale.ENGLISH, formatLink, upFreq) binding.uplink.text = String.format(Locale.ENGLISH, formatLink, upFreq)
} else binding.uplink.text = formatLinkNull } else binding.uplink.text = formatLinkNull
if (satTrans.mode != null) binding.mode.text = String.format(mode, satTrans.mode)
else binding.mode.text = String.format(mode, strNo)
if (satTrans.isInverted) binding.isInverted.text = String.format(isInverted, strYes)
else binding.isInverted.text = String.format(isInverted, strNo)
} }
} }
} }
@@ -30,7 +30,7 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding = FragmentEntriesBinding.bind(view) binding = FragmentEntriesBinding.bind(view)
setupComponents() setupComponents()
setupObservers() observeEntries()
} }
private fun setupComponents() { private fun setupComponents() {
@@ -51,15 +51,19 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) {
} }
} }
private fun setupObservers() { private fun observeEntries() {
viewModel.getEntries().observe(viewLifecycleOwner, { viewModel.getEntries().observe(viewLifecycleOwner, { entries ->
if (it.isNullOrEmpty()) setError() if (entries.isNullOrEmpty()) setError()
else { else {
viewModel.setEntries(it) viewModel.setEntries(entries)
entriesAdapter.setEntries(it as MutableList<SatEntry>) entriesAdapter.setEntries(entries as MutableList<SatEntry>)
setLoaded() setLoaded()
} }
observeEvents()
}) })
}
private fun observeEvents() {
viewModel.getAppEvent().observe(viewLifecycleOwner, { event -> viewModel.getAppEvent().observe(viewLifecycleOwner, { event ->
event.getContentIfNotHandled()?.let { event.getContentIfNotHandled()?.let {
if (it == 0) setLoading() if (it == 0) setLoading()
@@ -30,6 +30,7 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.SimpleItemAnimator
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.SharedViewModel import com.rtbishop.look4sat.SharedViewModel
import com.rtbishop.look4sat.data.Result import com.rtbishop.look4sat.data.Result
@@ -63,14 +64,6 @@ class PolarFragment : Fragment(R.layout.fragment_polar), SensorEventListener {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding = FragmentPolarBinding.bind(view) binding = FragmentPolarBinding.bind(view)
sensorManager = requireContext().getSystemService(Context.SENSOR_SERVICE) as SensorManager sensorManager = requireContext().getSystemService(Context.SENSOR_SERVICE) as SensorManager
transmitterAdapter = TransAdapter(requireContext())
binding.recycler.apply {
setHasFixedSize(true)
adapter = transmitterAdapter
isVerticalScrollBarEnabled = false
layoutManager = LinearLayoutManager(context)
addItemDecoration(RecyclerDivider(R.drawable.rec_divider_dark))
}
magneticDeclination = prefsManager.getMagDeclination() magneticDeclination = prefsManager.getMagDeclination()
observePasses() observePasses()
} }
@@ -114,22 +107,30 @@ class PolarFragment : Fragment(R.layout.fragment_polar), SensorEventListener {
polarView = PolarView(requireContext(), satPass) polarView = PolarView(requireContext(), satPass)
binding.frame.addView(polarView) binding.frame.addView(polarView)
observeTransmitters() observeTransmitters()
observeTimer()
} }
}) })
} }
private fun observeTransmitters() { private fun observeTransmitters() {
viewModel.getTransmittersForSat(satPass.tle.catnum).observe(viewLifecycleOwner, { viewModel.getTransmittersForSat(satPass.tle.catnum).observe(viewLifecycleOwner, { list ->
if (it.isNotEmpty()) { transmitterAdapter = TransAdapter(requireContext(), satPass)
transmitterAdapter.setPredictor(satPass.predictor) if (list.isNotEmpty()) {
transmitterAdapter.setList(it) transmitterAdapter.setData(list)
binding.recycler.visibility = View.VISIBLE binding.recycler.apply {
setHasFixedSize(true)
adapter = transmitterAdapter
isVerticalScrollBarEnabled = false
layoutManager = LinearLayoutManager(context)
(itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false
addItemDecoration(RecyclerDivider(R.drawable.rec_divider_dark))
visibility = View.VISIBLE
}
binding.noTransMsg.visibility = View.INVISIBLE binding.noTransMsg.visibility = View.INVISIBLE
} else { } else {
binding.recycler.visibility = View.INVISIBLE binding.recycler.visibility = View.INVISIBLE
binding.noTransMsg.visibility = View.VISIBLE binding.noTransMsg.visibility = View.VISIBLE
} }
observeTimer()
}) })
} }
@@ -137,7 +138,7 @@ class PolarFragment : Fragment(R.layout.fragment_polar), SensorEventListener {
viewModel.getAppTimer().observe(viewLifecycleOwner, { viewModel.getAppTimer().observe(viewLifecycleOwner, {
setPassText(it) setPassText(it)
polarView?.invalidate() polarView?.invalidate()
transmitterAdapter.notifyDataSetChanged() transmitterAdapter.tickTransmitters()
}) })
} }
@@ -10,7 +10,7 @@ object Utilities {
fun formatForTimer(millis: Long): String { fun formatForTimer(millis: Long): String {
val format = "%02d:%02d:%02d" val format = "%02d:%02d:%02d"
val hours = TimeUnit.MILLISECONDS.toHours(millis) % 60 val hours = TimeUnit.MILLISECONDS.toHours(millis)
val minutes = TimeUnit.MILLISECONDS.toMinutes(millis) % 60 val minutes = TimeUnit.MILLISECONDS.toMinutes(millis) % 60
val seconds = TimeUnit.MILLISECONDS.toSeconds(millis) % 60 val seconds = TimeUnit.MILLISECONDS.toSeconds(millis) % 60
return String.format(format, hours, minutes, seconds) return String.format(format, hours, minutes, seconds)
+5 -4
View File
@@ -38,6 +38,7 @@
android:gravity="center" android:gravity="center"
android:maxLines="1" android:maxLines="1"
android:text="@string/trans_description" android:text="@string/trans_description"
android:textSize="16sp"
app:layout_constraintEnd_toStartOf="@+id/img_uplink" app:layout_constraintEnd_toStartOf="@+id/img_uplink"
app:layout_constraintHorizontal_chainStyle="spread_inside" app:layout_constraintHorizontal_chainStyle="spread_inside"
app:layout_constraintStart_toEndOf="@+id/img_downlink" app:layout_constraintStart_toEndOf="@+id/img_downlink"
@@ -76,6 +77,7 @@
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:layout_marginBottom="2dp" android:layout_marginBottom="2dp"
android:text="@string/trans_mode" android:text="@string/trans_mode"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/isInverted" app:layout_constraintEnd_toStartOf="@+id/isInverted"
app:layout_constraintHorizontal_chainStyle="spread_inside" app:layout_constraintHorizontal_chainStyle="spread_inside"
@@ -88,6 +90,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="6dp" android:layout_marginEnd="6dp"
android:text="@string/trans_inverted" android:text="@string/trans_inverted"
android:textSize="16sp"
app:layout_constraintBaseline_toBaselineOf="@+id/mode" app:layout_constraintBaseline_toBaselineOf="@+id/mode"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/mode" /> app:layout_constraintStart_toEndOf="@+id/mode" />
@@ -97,25 +100,23 @@
android:layout_width="18dp" android:layout_width="18dp"
android:layout_height="18dp" android:layout_height="18dp"
android:layout_marginStart="4dp" android:layout_marginStart="4dp"
android:layout_marginTop="4dp"
android:contentDescription="@string/placeholder" android:contentDescription="@string/placeholder"
android:rotation="90" android:rotation="90"
app:layout_constraintBottom_toBottomOf="@+id/description" app:layout_constraintBottom_toBottomOf="@+id/description"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="@+id/description"
app:srcCompat="@drawable/ic_arrow" /> app:srcCompat="@drawable/ic_arrow" />
<ImageView <ImageView
android:id="@+id/img_uplink" android:id="@+id/img_uplink"
android:layout_width="18dp" android:layout_width="18dp"
android:layout_height="18dp" android:layout_height="18dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="4dp" android:layout_marginEnd="4dp"
android:contentDescription="@string/placeholder" android:contentDescription="@string/placeholder"
android:rotation="270" android:rotation="270"
app:layout_constraintBottom_toBottomOf="@+id/description" app:layout_constraintBottom_toBottomOf="@+id/description"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="@+id/description"
app:srcCompat="@drawable/ic_arrow" /> app:srcCompat="@drawable/ic_arrow" />
<androidx.constraintlayout.widget.Guideline <androidx.constraintlayout.widget.Guideline
+1 -1
View File
@@ -46,7 +46,7 @@
app:iconSpaceReserved="false"> app:iconSpaceReserved="false">
<SeekBarPreference <SeekBarPreference
android:key="hoursAhead" android:key="hoursAhead"
android:max="72" android:max="96"
android:title="@string/pref_hours_title" android:title="@string/pref_hours_title"
app:defaultValue="8" app:defaultValue="8"
app:iconSpaceReserved="false" app:iconSpaceReserved="false"