From bc60bf8d348a4ed58b9ad8a75d2da43f8aab8300 Mon Sep 17 00:00:00 2001 From: BMItter <Berndus@gmx.de> Date: Fri, 16 Apr 2021 13:56:12 +0200 Subject: [PATCH] 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: Lukas Lechner <lukas.lechner@sap.com> Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com> --- .../overview/ContactDiaryOverviewViewModel.kt | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewViewModel.kt index b5d208955..74dff7008 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewViewModel.kt @@ -28,24 +28,26 @@ import de.rki.coronawarnapp.risk.storage.RiskLevelStorage import de.rki.coronawarnapp.server.protocols.internal.v2.RiskCalculationParametersOuterClass import de.rki.coronawarnapp.task.TaskController 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.coroutine.DispatcherProvider import de.rki.coronawarnapp.util.flow.combine import de.rki.coronawarnapp.util.ui.SingleLiveEvent import de.rki.coronawarnapp.util.viewmodel.CWAViewModel import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.first -import kotlinx.coroutines.flow.flowOf +import org.joda.time.Days import org.joda.time.LocalDate import timber.log.Timber +import kotlin.concurrent.fixedRateTimer class ContactDiaryOverviewViewModel @AssistedInject constructor( taskController: TaskController, dispatcherProvider: DispatcherProvider, contactDiaryRepository: ContactDiaryRepository, riskLevelStorage: RiskLevelStorage, - timeStamper: TimeStamper, + private val timeStamper: TimeStamper, checkInRepository: CheckInRepository, private val exporter: ContactDiaryExporter ) : CWAViewModel(dispatcherProvider = dispatcherProvider) { @@ -53,7 +55,18 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor( val routeToScreen: SingleLiveEvent<ContactDiaryOverviewNavigationEvents> = 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 personEncountersFlow = contactDiaryRepository.personEncounters @@ -63,7 +76,7 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor( private val checkInsWithinRetentionFlow = checkInRepository.checkInsWithinRetention val listItems = combine( - flowOf(dates), + datesFlow, locationVisitsFlow, personEncountersFlow, riskLevelPerDateFlow, @@ -303,6 +316,11 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor( } } + override fun onCleared() { + super.onCleared() + reloadDatesMidnightTimer.cancel() + } + @AssistedFactory interface Factory : SimpleCWAViewModelFactory<ContactDiaryOverviewViewModel> -- GitLab