Swapped the passes countdown timer for the coroutine LiveData trigger

pull/49/head
Arty Bishop 2020-10-10 14:37:29 +01:00
rodzic 648da0094a
commit 46e92424d4
3 zmienionych plików z 26 dodań i 54 usunięć

Wyświetl plik

@ -34,6 +34,7 @@ import com.rtbishop.look4sat.repo.TransmittersRepo
import com.rtbishop.look4sat.utility.PassPredictor
import com.rtbishop.look4sat.utility.PrefsManager
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.util.*
import javax.inject.Singleton
@ -47,6 +48,7 @@ class SharedViewModel @ViewModelInject constructor(
@Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() {
private val _currentTimeMillis = MutableLiveData(System.currentTimeMillis())
private val _passes = MutableLiveData<Result<MutableList<SatPass>>>()
private var selectedEntries = emptyList<SatEntry>()
private var shouldTriggerCalculation = true
@ -55,10 +57,12 @@ class SharedViewModel @ViewModelInject constructor(
if (prefsManager.isFirstLaunch()) {
updateDefaultSourcesAndEntries()
}
startApplicationTimer()
}
fun getSources() = sourcesRepo.getSources()
fun getEntries() = entriesRepo.getEntries()
fun getCurrentTimeMillis(): LiveData<Long> = _currentTimeMillis
fun getPasses(): LiveData<Result<MutableList<SatPass>>> = _passes
fun getTransmittersForSat(satId: Int) = transmittersRepo.getTransmittersForSat(satId)
@ -117,6 +121,15 @@ class SharedViewModel @ViewModelInject constructor(
updateEntriesFromSources(defaultTleSources)
}
private fun startApplicationTimer(tickMillis: Long = 1000L) {
viewModelScope.launch(Dispatchers.IO) {
while (true) {
delay(tickMillis)
_currentTimeMillis.postValue(System.currentTimeMillis())
}
}
}
private fun getPassesForEntries(
entry: SatEntry,
dateNow: Date,

Wyświetl plik

@ -51,8 +51,7 @@ class PassesAdapter(context: Context, private var shouldUseUTC: Boolean = false)
notifyDataSetChanged()
}
fun updateRecycler() {
val timeNow = System.currentTimeMillis()
fun tickPasses(timeNow: Long) {
val iterator = satPassList.listIterator()
while (iterator.hasNext()) {
val satPass = iterator.next()

Wyświetl plik

@ -21,7 +21,6 @@ package com.rtbishop.look4sat.ui.fragments
import android.animation.ObjectAnimator
import android.os.Bundle
import android.os.CountDownTimer
import android.view.View
import android.widget.EditText
import androidx.appcompat.app.AlertDialog
@ -49,12 +48,10 @@ class PassesFragment : Fragment(R.layout.fragment_passes) {
@Inject
lateinit var prefsManager: PrefsManager
private lateinit var aosTimer: CountDownTimer
private lateinit var binding: FragmentPassesBinding
private lateinit var animator: ObjectAnimator
private lateinit var passesAdapter: PassesAdapter
private val viewModel: SharedViewModel by activityViewModels()
private var isTimerSet: Boolean = false
private var passes = mutableListOf<SatPass>()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@ -71,11 +68,14 @@ class PassesFragment : Fragment(R.layout.fragment_passes) {
animator.cancel()
passes = result.data
passesAdapter.setList(passes)
setTimerForPasses(passes)
}
is Result.InProgress -> animator.start()
}
})
viewModel.getCurrentTimeMillis().observe(viewLifecycleOwner, { currentTime ->
tickMainTimer(currentTime)
passesAdapter.tickPasses(currentTime)
})
}
private fun setupComponents() {
@ -101,7 +101,6 @@ class PassesFragment : Fragment(R.layout.fragment_passes) {
}
}
}
setTimerForPasses(passes)
viewModel.triggerCalculation()
}
@ -143,58 +142,19 @@ class PassesFragment : Fragment(R.layout.fragment_passes) {
}
}
private fun setTimerForPasses(passes: List<SatPass>) {
private fun tickMainTimer(timeNow: Long) {
if (passes.isNotEmpty()) {
resetTimer()
val timeNow = Date()
try {
setTimerForNext(timeNow)
val nextPass = passes.first { it.pass.startTime.time.minus(timeNow) > 0 }
val millisBeforeStart = nextPass.pass.startTime.time.minus(timeNow)
binding.passesTimer.text = Utilities.formatForTimer(millisBeforeStart)
} catch (e: NoSuchElementException) {
setTimerForLast(timeNow)
} finally {
aosTimer.start()
isTimerSet = true
val lastPass = passes.last()
val millisBeforeEnd = lastPass.pass.endTime.time.minus(timeNow)
binding.passesTimer.text = Utilities.formatForTimer(millisBeforeEnd)
}
} else {
resetTimer(true)
binding.passesTimer.text = Utilities.formatForTimer(0L)
}
}
private fun setTimerForNext(timeNow: Date) {
val nextPass = passes.first { it.pass.startTime.after(timeNow) }
val millisBeforeStart = nextPass.pass.startTime.time.minus(timeNow.time)
aosTimer = object : CountDownTimer(millisBeforeStart, 1000) {
override fun onFinish() {
setTimerForPasses(passes)
}
override fun onTick(millisUntilFinished: Long) {
binding.passesTimer.text = Utilities.formatForTimer(millisUntilFinished)
passesAdapter.updateRecycler()
}
}
}
private fun setTimerForLast(timeNow: Date) {
val lastPass = passes.last()
val millisBeforeEnd = lastPass.pass.endTime.time.minus(timeNow.time)
aosTimer = object : CountDownTimer(millisBeforeEnd, 1000) {
override fun onFinish() {
viewModel.calculatePasses()
}
override fun onTick(millisUntilFinished: Long) {
binding.passesTimer.text = Utilities.formatForTimer(millisUntilFinished)
passesAdapter.updateRecycler()
}
}
}
private fun resetTimer(resetToNull: Boolean = false) {
if (isTimerSet) {
aosTimer.cancel()
isTimerSet = false
}
if (resetToNull) binding.passesTimer.text = String.format("%02d:%02d:%02d", 0, 0, 0)
}
}