kopia lustrzana https://github.com/rt-bishop/Look4Sat
Calculating doppler only for active leo satellites. Fixes to EntriesFragment states, etc.
rodzic
7eb388f63a
commit
a7eb805f6d
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
Ładowanie…
Reference in New Issue