Skip to content
Snippets Groups Projects
Unverified Commit bc60bf8d authored by BMItter's avatar BMItter Committed by GitHub
Browse files

Contact Journal time switching at midnight (EXPOSUREAPP-6092, EXPOSUREAPP-6451) (#2835)


* Use user time zone instead of utc for days

* Update dates at midnight

Co-authored-by: default avatarLukas Lechner <lukas.lechner@sap.com>
Co-authored-by: default avatarharambasicluka <64483219+harambasicluka@users.noreply.github.com>
parent 8abd1754
No related branches found
No related tags found
No related merge requests found
...@@ -28,24 +28,26 @@ import de.rki.coronawarnapp.risk.storage.RiskLevelStorage ...@@ -28,24 +28,26 @@ import de.rki.coronawarnapp.risk.storage.RiskLevelStorage
import de.rki.coronawarnapp.server.protocols.internal.v2.RiskCalculationParametersOuterClass import de.rki.coronawarnapp.server.protocols.internal.v2.RiskCalculationParametersOuterClass
import de.rki.coronawarnapp.task.TaskController import de.rki.coronawarnapp.task.TaskController
import de.rki.coronawarnapp.task.common.DefaultTaskRequest import de.rki.coronawarnapp.task.common.DefaultTaskRequest
import de.rki.coronawarnapp.util.TimeAndDateExtensions.toLocalDateUtc import de.rki.coronawarnapp.util.TimeAndDateExtensions.toUserTimeZone
import de.rki.coronawarnapp.util.TimeStamper import de.rki.coronawarnapp.util.TimeStamper
import de.rki.coronawarnapp.util.coroutine.DispatcherProvider import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
import de.rki.coronawarnapp.util.flow.combine import de.rki.coronawarnapp.util.flow.combine
import de.rki.coronawarnapp.util.ui.SingleLiveEvent import de.rki.coronawarnapp.util.ui.SingleLiveEvent
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flowOf import org.joda.time.Days
import org.joda.time.LocalDate import org.joda.time.LocalDate
import timber.log.Timber import timber.log.Timber
import kotlin.concurrent.fixedRateTimer
class ContactDiaryOverviewViewModel @AssistedInject constructor( class ContactDiaryOverviewViewModel @AssistedInject constructor(
taskController: TaskController, taskController: TaskController,
dispatcherProvider: DispatcherProvider, dispatcherProvider: DispatcherProvider,
contactDiaryRepository: ContactDiaryRepository, contactDiaryRepository: ContactDiaryRepository,
riskLevelStorage: RiskLevelStorage, riskLevelStorage: RiskLevelStorage,
timeStamper: TimeStamper, private val timeStamper: TimeStamper,
checkInRepository: CheckInRepository, checkInRepository: CheckInRepository,
private val exporter: ContactDiaryExporter private val exporter: ContactDiaryExporter
) : CWAViewModel(dispatcherProvider = dispatcherProvider) { ) : CWAViewModel(dispatcherProvider = dispatcherProvider) {
...@@ -53,7 +55,18 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor( ...@@ -53,7 +55,18 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor(
val routeToScreen: SingleLiveEvent<ContactDiaryOverviewNavigationEvents> = SingleLiveEvent() val routeToScreen: SingleLiveEvent<ContactDiaryOverviewNavigationEvents> = SingleLiveEvent()
val exportLocationsAndPersons: SingleLiveEvent<String> = SingleLiveEvent() val exportLocationsAndPersons: SingleLiveEvent<String> = SingleLiveEvent()
private val dates = (0 until DAY_COUNT).map { timeStamper.nowUTC.toLocalDateUtc().minusDays(it) } private fun TimeStamper.localDate(): LocalDate = nowUTC.toUserTimeZone().toLocalDate()
private fun dates() = (0 until DAY_COUNT).map { timeStamper.localDate().minusDays(it) }
private val datesFlow = MutableStateFlow(dates())
private val reloadDatesMidnightTimer = fixedRateTimer(
name = "Reload-contact-journal-dates-timer-thread",
daemon = true,
startAt = timeStamper.localDate().plusDays(1).toDate(),
period = Days.ONE.toStandardDuration().millis,
action = { datesFlow.value = dates() }
)
private val locationVisitsFlow = contactDiaryRepository.locationVisits private val locationVisitsFlow = contactDiaryRepository.locationVisits
private val personEncountersFlow = contactDiaryRepository.personEncounters private val personEncountersFlow = contactDiaryRepository.personEncounters
...@@ -63,7 +76,7 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor( ...@@ -63,7 +76,7 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor(
private val checkInsWithinRetentionFlow = checkInRepository.checkInsWithinRetention private val checkInsWithinRetentionFlow = checkInRepository.checkInsWithinRetention
val listItems = combine( val listItems = combine(
flowOf(dates), datesFlow,
locationVisitsFlow, locationVisitsFlow,
personEncountersFlow, personEncountersFlow,
riskLevelPerDateFlow, riskLevelPerDateFlow,
...@@ -303,6 +316,11 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor( ...@@ -303,6 +316,11 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor(
} }
} }
override fun onCleared() {
super.onCleared()
reloadDatesMidnightTimer.cancel()
}
@AssistedFactory @AssistedFactory
interface Factory : SimpleCWAViewModelFactory<ContactDiaryOverviewViewModel> interface Factory : SimpleCWAViewModelFactory<ContactDiaryOverviewViewModel>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment