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

pull/49/head
Arty Bishop 2020-10-24 23:19:55 +01:00
rodzic 7eb388f63a
commit a7eb805f6d
6 zmienionych plików z 74 dodań i 42 usunięć

Wyświetl plik

@ -25,14 +25,14 @@ import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.data.SatPass
import com.rtbishop.look4sat.data.SatTrans
import com.rtbishop.look4sat.databinding.ItemTransBinding
import com.rtbishop.look4sat.utility.PassPredictor
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 strNo = context.getString(R.string.btn_no)
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 formatLinkNull = context.getString(R.string.trans_no_link)
private val isInverted = context.getString(R.string.trans_inverted)
private val predictor = satPass.predictor
private var transmittersList = emptyList<SatTrans>()
fun setPredictor(predictor: PassPredictor) {
this.predictor = predictor
}
fun setList(list: List<SatTrans>) {
fun setData(list: List<SatTrans>) {
transmittersList = list
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 {
return transmittersList.size
}
@ -69,9 +77,33 @@ class TransAdapter(context: Context) : RecyclerView.Adapter<TransAdapter.TransHo
RecyclerView.ViewHolder(itemView) {
fun bind(satTrans: SatTrans) {
val dateNow = Date()
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) {
val downFreq = predictor.getDownlinkFreq(satTrans.downlinkLow, dateNow) / divider
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
binding.uplink.text = String.format(Locale.ENGLISH, formatLink, upFreq)
} 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)
}
}
}

Wyświetl plik

@ -30,7 +30,7 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) {
super.onViewCreated(view, savedInstanceState)
binding = FragmentEntriesBinding.bind(view)
setupComponents()
setupObservers()
observeEntries()
}
private fun setupComponents() {
@ -51,15 +51,19 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) {
}
}
private fun setupObservers() {
viewModel.getEntries().observe(viewLifecycleOwner, {
if (it.isNullOrEmpty()) setError()
private fun observeEntries() {
viewModel.getEntries().observe(viewLifecycleOwner, { entries ->
if (entries.isNullOrEmpty()) setError()
else {
viewModel.setEntries(it)
entriesAdapter.setEntries(it as MutableList<SatEntry>)
viewModel.setEntries(entries)
entriesAdapter.setEntries(entries as MutableList<SatEntry>)
setLoaded()
}
observeEvents()
})
}
private fun observeEvents() {
viewModel.getAppEvent().observe(viewLifecycleOwner, { event ->
event.getContentIfNotHandled()?.let {
if (it == 0) setLoading()

Wyświetl plik

@ -30,6 +30,7 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.SimpleItemAnimator
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.SharedViewModel
import com.rtbishop.look4sat.data.Result
@ -63,14 +64,6 @@ class PolarFragment : Fragment(R.layout.fragment_polar), SensorEventListener {
super.onViewCreated(view, savedInstanceState)
binding = FragmentPolarBinding.bind(view)
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()
observePasses()
}
@ -114,22 +107,30 @@ class PolarFragment : Fragment(R.layout.fragment_polar), SensorEventListener {
polarView = PolarView(requireContext(), satPass)
binding.frame.addView(polarView)
observeTransmitters()
observeTimer()
}
})
}
private fun observeTransmitters() {
viewModel.getTransmittersForSat(satPass.tle.catnum).observe(viewLifecycleOwner, {
if (it.isNotEmpty()) {
transmitterAdapter.setPredictor(satPass.predictor)
transmitterAdapter.setList(it)
binding.recycler.visibility = View.VISIBLE
viewModel.getTransmittersForSat(satPass.tle.catnum).observe(viewLifecycleOwner, { list ->
transmitterAdapter = TransAdapter(requireContext(), satPass)
if (list.isNotEmpty()) {
transmitterAdapter.setData(list)
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
} else {
binding.recycler.visibility = View.INVISIBLE
binding.noTransMsg.visibility = View.VISIBLE
}
observeTimer()
})
}
@ -137,7 +138,7 @@ class PolarFragment : Fragment(R.layout.fragment_polar), SensorEventListener {
viewModel.getAppTimer().observe(viewLifecycleOwner, {
setPassText(it)
polarView?.invalidate()
transmitterAdapter.notifyDataSetChanged()
transmitterAdapter.tickTransmitters()
})
}

Wyświetl plik

@ -10,7 +10,7 @@ object Utilities {
fun formatForTimer(millis: Long): String {
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 seconds = TimeUnit.MILLISECONDS.toSeconds(millis) % 60
return String.format(format, hours, minutes, seconds)

Wyświetl plik

@ -38,6 +38,7 @@
android:gravity="center"
android:maxLines="1"
android:text="@string/trans_description"
android:textSize="16sp"
app:layout_constraintEnd_toStartOf="@+id/img_uplink"
app:layout_constraintHorizontal_chainStyle="spread_inside"
app:layout_constraintStart_toEndOf="@+id/img_downlink"
@ -76,6 +77,7 @@
android:layout_marginTop="4dp"
android:layout_marginBottom="2dp"
android:text="@string/trans_mode"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/isInverted"
app:layout_constraintHorizontal_chainStyle="spread_inside"
@ -88,6 +90,7 @@
android:layout_height="wrap_content"
android:layout_marginEnd="6dp"
android:text="@string/trans_inverted"
android:textSize="16sp"
app:layout_constraintBaseline_toBaselineOf="@+id/mode"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/mode" />
@ -97,25 +100,23 @@
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_marginStart="4dp"
android:layout_marginTop="4dp"
android:contentDescription="@string/placeholder"
android:rotation="90"
app:layout_constraintBottom_toBottomOf="@+id/description"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintTop_toTopOf="@+id/description"
app:srcCompat="@drawable/ic_arrow" />
<ImageView
android:id="@+id/img_uplink"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="4dp"
android:contentDescription="@string/placeholder"
android:rotation="270"
app:layout_constraintBottom_toBottomOf="@+id/description"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintTop_toTopOf="@+id/description"
app:srcCompat="@drawable/ic_arrow" />
<androidx.constraintlayout.widget.Guideline

Wyświetl plik

@ -46,7 +46,7 @@
app:iconSpaceReserved="false">
<SeekBarPreference
android:key="hoursAhead"
android:max="72"
android:max="96"
android:title="@string/pref_hours_title"
app:defaultValue="8"
app:iconSpaceReserved="false"