From efdb9fe7fcbcd48b092367ab191027a9d4ebe3c2 Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Sun, 12 Jan 2020 10:37:41 +0000 Subject: [PATCH] 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. --- .../com/rtbishop/look4sat/MainViewModel.kt | 10 ++++- .../com/rtbishop/look4sat/repo/SatPass.kt | 3 +- .../rtbishop/look4sat/ui/SatPassAdapter.kt | 37 +++++++++++++++---- .../com/rtbishop/look4sat/ui/SkyFragment.kt | 22 +++++------ 4 files changed, 49 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/rtbishop/look4sat/MainViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/MainViewModel.kt index 085f8a13..b3768ba9 100644 --- a/app/src/main/java/com/rtbishop/look4sat/MainViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/MainViewModel.kt @@ -65,8 +65,8 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { private val _debugMessage = MutableLiveData() val debugMessage: LiveData = _debugMessage - private val _satPassList = MutableLiveData>() - val passSatList: LiveData> = _satPassList + private val _satPassList = MutableLiveData>() + val passSatList: LiveData> = _satPassList private val _gsp = MutableLiveData() val gsp: LiveData = _gsp @@ -181,6 +181,11 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { suspend fun getPasses() { val passList = mutableListOf() 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 } diff --git a/app/src/main/java/com/rtbishop/look4sat/repo/SatPass.kt b/app/src/main/java/com/rtbishop/look4sat/repo/SatPass.kt index c4fcc872..804107c7 100644 --- a/app/src/main/java/com/rtbishop/look4sat/repo/SatPass.kt +++ b/app/src/main/java/com/rtbishop/look4sat/repo/SatPass.kt @@ -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 \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/SatPassAdapter.kt b/app/src/main/java/com/rtbishop/look4sat/ui/SatPassAdapter.kt index 24d5cbf2..2b1165d3 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/SatPassAdapter.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/SatPassAdapter.kt @@ -33,10 +33,34 @@ import java.util.* class SatPassAdapter : RecyclerView.Adapter() { - private var satPassList = emptyList() + private var satPassList = mutableListOf() - fun setList(list: List) { + fun setList(list: MutableList) { 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() { } 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() { private val passVector = itemView.findViewById(R.id.pass_azVector) private val passStart = itemView.findViewById(R.id.pass_aosTime) private val passEnd = itemView.findViewById(R.id.pass_losTime) - var progressBar = itemView.findViewById(R.id.pass_progress) - - fun bind(position: Int) { - val satPass = satPassList[position] + private var progressBar = itemView.findViewById(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() { 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) diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/SkyFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/SkyFragment.kt index bfbfd41f..90f9ef33 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/SkyFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/SkyFragment.kt @@ -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 + private lateinit var satPassList: MutableList 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()