mirror of
https://github.com/rt-bishop/Look4Sat.git
synced 2026-10-02 03:15:37 +00:00
Significantly revamped the recycler behaviour. Now accurately showing the satellites currently overhead and their pass progress, removing them from the list after the pass is finished.
This commit is contained in:
1 parent
c68eff90a5
commit
efdb9fe7fc
4 files changed
+49
-23
No files matched your search
@@ -65,8 +65,8 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
|
||||
private val _debugMessage = MutableLiveData<String>()
|
||||
val debugMessage: LiveData<String> = _debugMessage
|
||||
|
||||
private val _satPassList = MutableLiveData<List<SatPass>>()
|
||||
val passSatList: LiveData<List<SatPass>> = _satPassList
|
||||
private val _satPassList = MutableLiveData<MutableList<SatPass>>()
|
||||
val passSatList: LiveData<MutableList<SatPass>> = _satPassList
|
||||
|
||||
private val _gsp = MutableLiveData<GroundStationPosition>()
|
||||
val gsp: LiveData<GroundStationPosition> = _gsp
|
||||
@@ -181,6 +181,11 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
|
||||
suspend fun getPasses() {
|
||||
val passList = mutableListOf<SatPass>()
|
||||
val dateNow = Date()
|
||||
val dateFuture = Calendar.getInstance().let {
|
||||
it.time = dateNow
|
||||
it.add(Calendar.HOUR, hoursAhead)
|
||||
it.time
|
||||
}
|
||||
withContext(Dispatchers.Default) {
|
||||
tleSelection.forEach { indexOfSelection ->
|
||||
val tle = tleMainList[indexOfSelection]
|
||||
@@ -194,6 +199,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
|
||||
_debugMessage.postValue("${tle.name} shall not pass")
|
||||
}
|
||||
}
|
||||
passList.removeAll { it.pass.startTime.after(dateFuture) }
|
||||
passList.removeAll { it.pass.endTime.before(dateNow) }
|
||||
passList.removeAll { it.pass.maxEl < minEl }
|
||||
passList.sortBy { it.pass.startTime }
|
||||
|
||||
@@ -30,5 +30,6 @@ import kotlinx.android.parcel.RawValue
|
||||
data class SatPass(
|
||||
val tle: TLE,
|
||||
val predictor: @RawValue PassPredictor,
|
||||
val pass: @RawValue SatPassTime
|
||||
val pass: @RawValue SatPassTime,
|
||||
var progress: Int = 0
|
||||
) : Parcelable
|
||||
@@ -33,10 +33,34 @@ import java.util.*
|
||||
|
||||
class SatPassAdapter : RecyclerView.Adapter<SatPassAdapter.PassHolder>() {
|
||||
|
||||
private var satPassList = emptyList<SatPass>()
|
||||
private var satPassList = mutableListOf<SatPass>()
|
||||
|
||||
fun setList(list: List<SatPass>) {
|
||||
fun setList(list: MutableList<SatPass>) {
|
||||
satPassList = list
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
fun updateRecycler() {
|
||||
val timeNow = Date()
|
||||
val iterator = satPassList.listIterator()
|
||||
while (iterator.hasNext()) {
|
||||
val satPass = iterator.next()
|
||||
if (satPass.progress < 100) {
|
||||
val timeStart = satPass.pass.startTime
|
||||
val timeEnd = satPass.pass.endTime
|
||||
if (timeNow.after(timeStart)) {
|
||||
val index = satPassList.indexOf(satPass)
|
||||
val deltaTotal = timeEnd.time.minus(timeStart.time)
|
||||
val deltaNow = timeNow.time.minus(timeStart.time)
|
||||
satPass.progress = ((deltaNow.toFloat() / deltaTotal.toFloat()) * 100).toInt()
|
||||
notifyItemChanged(index)
|
||||
}
|
||||
} else {
|
||||
val index = satPassList.indexOf(satPass)
|
||||
iterator.remove()
|
||||
notifyItemRemoved(index)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int {
|
||||
@@ -51,7 +75,7 @@ class SatPassAdapter : RecyclerView.Adapter<SatPassAdapter.PassHolder>() {
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: PassHolder, position: Int) {
|
||||
holder.bind(position)
|
||||
holder.bind(satPassList[position])
|
||||
}
|
||||
|
||||
inner class PassHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
|
||||
@@ -62,11 +86,9 @@ class SatPassAdapter : RecyclerView.Adapter<SatPassAdapter.PassHolder>() {
|
||||
private val passVector = itemView.findViewById<TextView>(R.id.pass_azVector)
|
||||
private val passStart = itemView.findViewById<TextView>(R.id.pass_aosTime)
|
||||
private val passEnd = itemView.findViewById<TextView>(R.id.pass_losTime)
|
||||
var progressBar = itemView.findViewById<ProgressBar>(R.id.pass_progress)
|
||||
|
||||
fun bind(position: Int) {
|
||||
val satPass = satPassList[position]
|
||||
private var progressBar = itemView.findViewById<ProgressBar>(R.id.pass_progress)
|
||||
|
||||
fun bind(satPass: SatPass) {
|
||||
val aosTime =
|
||||
SimpleDateFormat("HH:mm:ss", Locale.getDefault()).format(satPass.pass.startTime)
|
||||
val losTime =
|
||||
@@ -78,6 +100,7 @@ class SatPassAdapter : RecyclerView.Adapter<SatPassAdapter.PassHolder>() {
|
||||
String.format("Az: %2d° -> %2d°", satPass.pass.aosAzimuth, satPass.pass.losAzimuth)
|
||||
passStart.text = String.format("AOS - %s", aosTime)
|
||||
passEnd.text = String.format("LOS - %s", losTime)
|
||||
progressBar.progress = satPass.progress
|
||||
|
||||
itemView.setOnClickListener {
|
||||
val action = SkyFragmentDirections.actionNavSkyToNavRadar(satPass)
|
||||
|
||||
@@ -35,6 +35,7 @@ import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import androidx.recyclerview.widget.SimpleItemAnimator
|
||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||
import com.github.amsacode.predict4java.TLE
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
@@ -43,6 +44,7 @@ import com.rtbishop.look4sat.R
|
||||
import com.rtbishop.look4sat.repo.SatPass
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import java.util.*
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
class SkyFragment : Fragment() {
|
||||
@@ -56,7 +58,7 @@ class SkyFragment : Fragment() {
|
||||
private lateinit var aosTimer: CountDownTimer
|
||||
private lateinit var swipeLayout: SwipeRefreshLayout
|
||||
private lateinit var mainActivity: MainActivity
|
||||
private lateinit var satPassList: List<SatPass>
|
||||
private lateinit var satPassList: MutableList<SatPass>
|
||||
private var isTimerSet: Boolean = false
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
@@ -64,7 +66,7 @@ class SkyFragment : Fragment() {
|
||||
mainActivity = activity as MainActivity
|
||||
viewModel = ViewModelProvider(mainActivity).get(MainViewModel::class.java)
|
||||
recyclerAdapter = SatPassAdapter()
|
||||
satPassList = emptyList()
|
||||
satPassList = mutableListOf()
|
||||
}
|
||||
|
||||
override fun onCreateView(
|
||||
@@ -92,9 +94,9 @@ class SkyFragment : Fragment() {
|
||||
recyclerPasses.apply {
|
||||
layoutManager = LinearLayoutManager(mainActivity)
|
||||
adapter = recyclerAdapter
|
||||
(itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false
|
||||
}
|
||||
recyclerAdapter.setList(satPassList)
|
||||
recyclerAdapter.notifyDataSetChanged()
|
||||
setTimerForNextPass()
|
||||
|
||||
swipeLayout.setProgressBackgroundColorSchemeResource(R.color.themeAccent)
|
||||
@@ -112,7 +114,6 @@ class SkyFragment : Fragment() {
|
||||
viewModel.passSatList.observe(viewLifecycleOwner, Observer {
|
||||
satPassList = it
|
||||
recyclerAdapter.setList(satPassList)
|
||||
recyclerAdapter.notifyDataSetChanged()
|
||||
setTimerForNextPass()
|
||||
swipeLayout.isRefreshing = false
|
||||
})
|
||||
@@ -210,18 +211,12 @@ class SkyFragment : Fragment() {
|
||||
if (satPassList.isNotEmpty()) {
|
||||
resetTimer()
|
||||
try {
|
||||
val timeNow = System.currentTimeMillis()
|
||||
val nextPass = satPassList.first {
|
||||
it.pass.startTime.time.minus(timeNow) > 0
|
||||
}
|
||||
val passTime = nextPass.pass.startTime.time
|
||||
val totalMillis = passTime.minus(timeNow)
|
||||
val timeNow = Date()
|
||||
val nextPass = satPassList.first { it.pass.startTime.after(timeNow) }
|
||||
val totalMillis = nextPass.pass.startTime.time.minus(timeNow.time)
|
||||
|
||||
aosTimer = object : CountDownTimer(totalMillis, 1000) {
|
||||
override fun onFinish() {
|
||||
Toast
|
||||
.makeText(activity, "Incoming ${nextPass.tle.name}", Toast.LENGTH_SHORT)
|
||||
.show()
|
||||
setTimerForNextPass()
|
||||
}
|
||||
|
||||
@@ -232,6 +227,7 @@ class SkyFragment : Fragment() {
|
||||
TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % 60,
|
||||
TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) % 60
|
||||
)
|
||||
recyclerAdapter.updateRecycler()
|
||||
}
|
||||
}
|
||||
aosTimer.start()
|
||||
|
||||
Reference in new issue
Block a user