mirror of
https://github.com/atsunatsu/Look4Sat.git
synced 2026-10-05 12:07:25 +00:00
Swapped the passes countdown timer for the coroutine LiveData trigger
This commit is contained in:
1 parent
648da0094a
commit
46e92424d4
3 files changed
+26
-54
No files matched your search
@@ -34,6 +34,7 @@ import com.rtbishop.look4sat.repo.TransmittersRepo
|
|||||||
import com.rtbishop.look4sat.utility.PassPredictor
|
import com.rtbishop.look4sat.utility.PassPredictor
|
||||||
import com.rtbishop.look4sat.utility.PrefsManager
|
import com.rtbishop.look4sat.utility.PrefsManager
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
@@ -47,6 +48,7 @@ class SharedViewModel @ViewModelInject constructor(
|
|||||||
@Assisted private val savedStateHandle: SavedStateHandle
|
@Assisted private val savedStateHandle: SavedStateHandle
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
|
private val _currentTimeMillis = MutableLiveData(System.currentTimeMillis())
|
||||||
private val _passes = MutableLiveData<Result<MutableList<SatPass>>>()
|
private val _passes = MutableLiveData<Result<MutableList<SatPass>>>()
|
||||||
private var selectedEntries = emptyList<SatEntry>()
|
private var selectedEntries = emptyList<SatEntry>()
|
||||||
private var shouldTriggerCalculation = true
|
private var shouldTriggerCalculation = true
|
||||||
@@ -55,10 +57,12 @@ class SharedViewModel @ViewModelInject constructor(
|
|||||||
if (prefsManager.isFirstLaunch()) {
|
if (prefsManager.isFirstLaunch()) {
|
||||||
updateDefaultSourcesAndEntries()
|
updateDefaultSourcesAndEntries()
|
||||||
}
|
}
|
||||||
|
startApplicationTimer()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getSources() = sourcesRepo.getSources()
|
fun getSources() = sourcesRepo.getSources()
|
||||||
fun getEntries() = entriesRepo.getEntries()
|
fun getEntries() = entriesRepo.getEntries()
|
||||||
|
fun getCurrentTimeMillis(): LiveData<Long> = _currentTimeMillis
|
||||||
fun getPasses(): LiveData<Result<MutableList<SatPass>>> = _passes
|
fun getPasses(): LiveData<Result<MutableList<SatPass>>> = _passes
|
||||||
fun getTransmittersForSat(satId: Int) = transmittersRepo.getTransmittersForSat(satId)
|
fun getTransmittersForSat(satId: Int) = transmittersRepo.getTransmittersForSat(satId)
|
||||||
|
|
||||||
@@ -117,6 +121,15 @@ class SharedViewModel @ViewModelInject constructor(
|
|||||||
updateEntriesFromSources(defaultTleSources)
|
updateEntriesFromSources(defaultTleSources)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun startApplicationTimer(tickMillis: Long = 1000L) {
|
||||||
|
viewModelScope.launch(Dispatchers.IO) {
|
||||||
|
while (true) {
|
||||||
|
delay(tickMillis)
|
||||||
|
_currentTimeMillis.postValue(System.currentTimeMillis())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun getPassesForEntries(
|
private fun getPassesForEntries(
|
||||||
entry: SatEntry,
|
entry: SatEntry,
|
||||||
dateNow: Date,
|
dateNow: Date,
|
||||||
|
|||||||
@@ -51,8 +51,7 @@ class PassesAdapter(context: Context, private var shouldUseUTC: Boolean = false)
|
|||||||
notifyDataSetChanged()
|
notifyDataSetChanged()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun updateRecycler() {
|
fun tickPasses(timeNow: Long) {
|
||||||
val timeNow = System.currentTimeMillis()
|
|
||||||
val iterator = satPassList.listIterator()
|
val iterator = satPassList.listIterator()
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
val satPass = iterator.next()
|
val satPass = iterator.next()
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ package com.rtbishop.look4sat.ui.fragments
|
|||||||
|
|
||||||
import android.animation.ObjectAnimator
|
import android.animation.ObjectAnimator
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.CountDownTimer
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.EditText
|
import android.widget.EditText
|
||||||
import androidx.appcompat.app.AlertDialog
|
import androidx.appcompat.app.AlertDialog
|
||||||
@@ -49,12 +48,10 @@ class PassesFragment : Fragment(R.layout.fragment_passes) {
|
|||||||
@Inject
|
@Inject
|
||||||
lateinit var prefsManager: PrefsManager
|
lateinit var prefsManager: PrefsManager
|
||||||
|
|
||||||
private lateinit var aosTimer: CountDownTimer
|
|
||||||
private lateinit var binding: FragmentPassesBinding
|
private lateinit var binding: FragmentPassesBinding
|
||||||
private lateinit var animator: ObjectAnimator
|
private lateinit var animator: ObjectAnimator
|
||||||
private lateinit var passesAdapter: PassesAdapter
|
private lateinit var passesAdapter: PassesAdapter
|
||||||
private val viewModel: SharedViewModel by activityViewModels()
|
private val viewModel: SharedViewModel by activityViewModels()
|
||||||
private var isTimerSet: Boolean = false
|
|
||||||
private var passes = mutableListOf<SatPass>()
|
private var passes = mutableListOf<SatPass>()
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
@@ -71,11 +68,14 @@ class PassesFragment : Fragment(R.layout.fragment_passes) {
|
|||||||
animator.cancel()
|
animator.cancel()
|
||||||
passes = result.data
|
passes = result.data
|
||||||
passesAdapter.setList(passes)
|
passesAdapter.setList(passes)
|
||||||
setTimerForPasses(passes)
|
|
||||||
}
|
}
|
||||||
is Result.InProgress -> animator.start()
|
is Result.InProgress -> animator.start()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
viewModel.getCurrentTimeMillis().observe(viewLifecycleOwner, { currentTime ->
|
||||||
|
tickMainTimer(currentTime)
|
||||||
|
passesAdapter.tickPasses(currentTime)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupComponents() {
|
private fun setupComponents() {
|
||||||
@@ -101,7 +101,6 @@ class PassesFragment : Fragment(R.layout.fragment_passes) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setTimerForPasses(passes)
|
|
||||||
viewModel.triggerCalculation()
|
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()) {
|
if (passes.isNotEmpty()) {
|
||||||
resetTimer()
|
|
||||||
val timeNow = Date()
|
|
||||||
try {
|
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) {
|
} catch (e: NoSuchElementException) {
|
||||||
setTimerForLast(timeNow)
|
val lastPass = passes.last()
|
||||||
} finally {
|
val millisBeforeEnd = lastPass.pass.endTime.time.minus(timeNow)
|
||||||
aosTimer.start()
|
binding.passesTimer.text = Utilities.formatForTimer(millisBeforeEnd)
|
||||||
isTimerSet = true
|
|
||||||
}
|
}
|
||||||
} else {
|
} 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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user