diff --git a/app/src/main/java/com/rtbishop/look4sat/SharedViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/SharedViewModel.kt index caf4efe9..e25dcd30 100644 --- a/app/src/main/java/com/rtbishop/look4sat/SharedViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/SharedViewModel.kt @@ -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>>() private var selectedEntries = emptyList() 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 = _currentTimeMillis fun getPasses(): LiveData>> = _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, diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/adapters/PassesAdapter.kt b/app/src/main/java/com/rtbishop/look4sat/ui/adapters/PassesAdapter.kt index b175ac6c..e90dc397 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/adapters/PassesAdapter.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/adapters/PassesAdapter.kt @@ -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() diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PassesFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PassesFragment.kt index b589cd15..a1bb95f3 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PassesFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PassesFragment.kt @@ -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() 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) { + 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) - } }