From 8b55ffb147cb3d015e60b2db7aec5a3a0854270e Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sun, 4 Jun 2023 18:25:33 -0500 Subject: [PATCH] Fix timezone bug in MidnightTimer; increase logging --- .../org/isoron/uhabits/core/utils/DateUtils.kt | 2 +- .../org/isoron/uhabits/core/utils/MidnightTimer.kt | 14 +++++++++++--- .../isoron/uhabits/core/utils/MidnightTimerTest.kt | 3 ++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt index b06513140..d0ca726a5 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt @@ -227,7 +227,7 @@ abstract class DateUtils { fun getStartOfTodayWithOffset(): Long = getStartOfDayWithOffset(getLocalTime()) @JvmStatic - fun millisecondsUntilTomorrowWithOffset(): Long = getStartOfTomorrowWithOffset() - getLocalTime() + fun millisecondsUntilTomorrowWithOffset(): Long = getStartOfTomorrowWithOffset() - applyTimezone(getLocalTime()) @JvmStatic fun getStartOfTodayCalendar(): GregorianCalendar = getCalendar(getStartOfToday()) diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/MidnightTimer.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/MidnightTimer.kt index 903099293..b63569533 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/MidnightTimer.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/MidnightTimer.kt @@ -19,6 +19,7 @@ package org.isoron.uhabits.core.utils import org.isoron.uhabits.core.AppScope +import org.isoron.uhabits.core.io.Logging import java.util.LinkedList import java.util.concurrent.Executors import java.util.concurrent.ScheduledExecutorService @@ -29,9 +30,10 @@ import javax.inject.Inject * A class that emits events when a new day starts. */ @AppScope -open class MidnightTimer @Inject constructor() { +open class MidnightTimer @Inject constructor(logging: Logging) { private val listeners: MutableList = LinkedList() private lateinit var executor: ScheduledExecutorService + private val logger = logging.getLogger("MidnightTimer") @Synchronized fun addListener(listener: MidnightListener) { @@ -39,7 +41,10 @@ open class MidnightTimer @Inject constructor() { } @Synchronized - fun onPause(): MutableList? = executor.shutdownNow() + fun onPause(): MutableList? { + logger.info("Pausing timer") + return executor.shutdownNow() + } @Synchronized fun onResume( @@ -47,9 +52,11 @@ open class MidnightTimer @Inject constructor() { testExecutor: ScheduledExecutorService? = null ) { executor = testExecutor ?: Executors.newSingleThreadScheduledExecutor() + val initialDelay = DateUtils.millisecondsUntilTomorrowWithOffset() + delayOffsetInMillis + logger.info("Scheduling refresh for $initialDelay ms from now") executor.scheduleAtFixedRate( { notifyListeners() }, - DateUtils.millisecondsUntilTomorrowWithOffset() + delayOffsetInMillis, + initialDelay, DateUtils.DAY_LENGTH, TimeUnit.MILLISECONDS ) @@ -60,6 +67,7 @@ open class MidnightTimer @Inject constructor() { @Synchronized private fun notifyListeners() { + logger.info("Midnight refresh") for (l in listeners) { l.atMidnight() } diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/MidnightTimerTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/MidnightTimerTest.kt index b92507da0..c0eb3fe2d 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/MidnightTimerTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/MidnightTimerTest.kt @@ -4,6 +4,7 @@ import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext import org.isoron.uhabits.core.BaseUnitTest +import org.isoron.uhabits.core.io.StandardLogging import org.junit.Test import java.util.Calendar import java.util.TimeZone @@ -34,7 +35,7 @@ class MidnightTimerTest : BaseUnitTest() { ) val suspendedListener = suspendCoroutine { continuation -> - MidnightTimer().apply { + MidnightTimer(StandardLogging()).apply { addListener { continuation.resume(true) } // When onResume(1, executor)