diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/database/AutoBackupTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/database/AutoBackupTest.kt index d0c518f07..04fab93b0 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/database/AutoBackupTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/database/AutoBackupTest.kt @@ -20,9 +20,9 @@ package org.isoron.uhabits.database import org.isoron.platform.time.LocalDate +import org.isoron.platform.time.LocalDate.Companion.DAY_LENGTH import org.isoron.uhabits.AndroidDirFinder import org.isoron.uhabits.BaseAndroidTest -import org.isoron.uhabits.core.utils.DateUtils import org.junit.Test import java.io.File import java.io.FileOutputStream @@ -30,7 +30,7 @@ import java.io.FileOutputStream class AutoBackupTest : BaseAndroidTest() { @Test fun testRun() { - LocalDate.fixedLocalTime = 40 * DateUtils.DAY_LENGTH + LocalDate.fixedLocalTime = 40 * DAY_LENGTH val basedir = AndroidDirFinder(targetContext).getFilesDir("Backups")!! createTestFiles(basedir, 30) @@ -64,7 +64,7 @@ class AutoBackupTest : BaseAndroidTest() { private fun createTestFiles(basedir: File, nfiles: Int) { removeAllFiles(basedir) for (k in 1..nfiles) { - touch("${basedir.path}/test-$k.txt", DateUtils.DAY_LENGTH * k) + touch("${basedir.path}/test-$k.txt", DAY_LENGTH * k) } } diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/performance/PerformanceTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/performance/PerformanceTest.kt index 10ad56057..65c75c886 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/performance/PerformanceTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/performance/PerformanceTest.kt @@ -20,12 +20,12 @@ package org.isoron.uhabits.performance import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.MediumTest +import org.isoron.platform.time.LocalDate.Companion.DAY_LENGTH import org.isoron.uhabits.BaseAndroidTest import org.isoron.uhabits.core.commands.CreateHabitCommand import org.isoron.uhabits.core.commands.CreateRepetitionCommand import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.Timestamp -import org.isoron.uhabits.core.models.Timestamp.Companion.DAY_LENGTH import org.isoron.uhabits.core.models.sqlite.SQLModelFactory import org.junit.Ignore import org.junit.Test diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/database/AutoBackup.kt b/uhabits-android/src/main/java/org/isoron/uhabits/database/AutoBackup.kt index 9c431591a..db978e05d 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/database/AutoBackup.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/database/AutoBackup.kt @@ -22,8 +22,8 @@ package org.isoron.uhabits.database import android.content.Context import android.util.Log import org.isoron.platform.time.LocalDate +import org.isoron.platform.time.LocalDate.Companion.DAY_LENGTH import org.isoron.uhabits.AndroidDirFinder -import org.isoron.uhabits.core.utils.DateUtils import org.isoron.uhabits.utils.DatabaseUtils import java.io.File @@ -40,7 +40,7 @@ class AutoBackup(private val context: Context) { } val now = LocalDate.getLocalTime() removeOldest(files, keep) - if (now - newestTimestamp > DateUtils.DAY_LENGTH) { + if (now - newestTimestamp > DAY_LENGTH) { DatabaseUtils.saveDatabaseCopy(context, basedir) } else { Log.i("AutoBackup", "Fresh backup found (timestamp=$newestTimestamp)") diff --git a/uhabits-core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt b/uhabits-core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt index fbce2bc80..5c334cabb 100644 --- a/uhabits-core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt +++ b/uhabits-core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt @@ -146,6 +146,26 @@ data class LocalDate(val daysSince2000: Int) { var fixedTimeZone: TimeZone? = null var fixedLocale: Locale? = null + /** + * Number of milliseconds in one second. + */ + const val SECOND_LENGTH: Long = 1000 + + /** + * Number of milliseconds in one minute. + */ + const val MINUTE_LENGTH: Long = 60 * SECOND_LENGTH + + /** + * Number of milliseconds in one hour. + */ + const val HOUR_LENGTH: Long = 60 * MINUTE_LENGTH + + /** + * Number of milliseconds in one day. + */ + const val DAY_LENGTH: Long = 24 * HOUR_LENGTH + fun getLocalTime(testTimeInMillis: Long? = null): Long { if (fixedLocalTime != null) return fixedLocalTime as Long diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Timestamp.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Timestamp.kt index feb118ce5..baa281aeb 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Timestamp.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Timestamp.kt @@ -19,6 +19,7 @@ package org.isoron.uhabits.core.models import org.isoron.platform.time.LocalDate +import org.isoron.platform.time.LocalDate.Companion.DAY_LENGTH import org.isoron.uhabits.core.utils.DateFormats.Companion.getCSVDateFormat import org.isoron.uhabits.core.utils.DateUtils import org.isoron.uhabits.core.utils.DateUtils.Companion.getStartOfTodayCalendar @@ -103,7 +104,6 @@ data class Timestamp(var unixTime: Long) : Comparable { } companion object { - const val DAY_LENGTH: Long = 86400000 val ZERO = Timestamp(0) fun fromLocalDate(date: LocalDate): Timestamp { return Timestamp(946684800000L + date.daysSince2000 * 86400000L) 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 fad335dfa..761e77186 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 @@ -21,6 +21,9 @@ package org.isoron.uhabits.core.utils import kotlinx.datetime.Instant import kotlinx.datetime.offsetAt import org.isoron.platform.time.LocalDate +import org.isoron.platform.time.LocalDate.Companion.DAY_LENGTH +import org.isoron.platform.time.LocalDate.Companion.HOUR_LENGTH +import org.isoron.platform.time.LocalDate.Companion.MINUTE_LENGTH import org.isoron.platform.time.LocalDate.Companion.getLocalTime import org.isoron.platform.time.LocalDate.Companion.getTimeZone import org.isoron.uhabits.core.models.Timestamp @@ -38,26 +41,6 @@ abstract class DateUtils { private var startDayHourOffset: Int = 0 private var startDayMinuteOffset: Int = 0 - /** - * Number of milliseconds in one second. - */ - const val SECOND_LENGTH: Long = 1000 - - /** - * Number of milliseconds in one minute. - */ - const val MINUTE_LENGTH: Long = 60 * SECOND_LENGTH - - /** - * Number of milliseconds in one hour. - */ - const val HOUR_LENGTH: Long = 60 * MINUTE_LENGTH - - /** - * Number of milliseconds in one day. - */ - const val DAY_LENGTH: Long = 24 * HOUR_LENGTH - @JvmStatic fun applyTimezone(localTimestamp: Long): Long { val tz = getTimeZone() 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..1de73bd26 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 @@ -18,6 +18,8 @@ */ package org.isoron.uhabits.core.utils +import org.isoron.platform.time.LocalDate.Companion.DAY_LENGTH +import org.isoron.platform.time.LocalDate.Companion.SECOND_LENGTH import org.isoron.uhabits.core.AppScope import java.util.LinkedList import java.util.concurrent.Executors @@ -43,14 +45,14 @@ open class MidnightTimer @Inject constructor() { @Synchronized fun onResume( - delayOffsetInMillis: Long = DateUtils.SECOND_LENGTH, + delayOffsetInMillis: Long = SECOND_LENGTH, testExecutor: ScheduledExecutorService? = null ) { executor = testExecutor ?: Executors.newSingleThreadScheduledExecutor() executor.scheduleAtFixedRate( { notifyListeners() }, DateUtils.millisecondsUntilTomorrowWithOffset() + delayOffsetInMillis, - DateUtils.DAY_LENGTH, + DAY_LENGTH, TimeUnit.MILLISECONDS ) } diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt index 40996be8a..a84e1b66d 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt @@ -23,6 +23,9 @@ import junit.framework.Assert.assertEquals import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.core.IsEqual.equalTo import org.isoron.platform.time.LocalDate +import org.isoron.platform.time.LocalDate.Companion.DAY_LENGTH +import org.isoron.platform.time.LocalDate.Companion.HOUR_LENGTH +import org.isoron.platform.time.LocalDate.Companion.MINUTE_LENGTH import org.isoron.uhabits.core.BaseUnitTest import org.isoron.uhabits.core.models.Timestamp import org.isoron.uhabits.core.utils.DateUtils.Companion.applyTimezone @@ -288,22 +291,22 @@ class DateUtilsTest : BaseUnitTest() { fun testMillisecondsUntilTomorrow() { LocalDate.fixedTimeZone = kotlinx.datetime.TimeZone.UTC LocalDate.fixedLocalTime = unixTime(2017, Calendar.JANUARY, 1, 23, 59) - assertThat(millisecondsUntilTomorrowWithOffset(), equalTo(DateUtils.MINUTE_LENGTH)) + assertThat(millisecondsUntilTomorrowWithOffset(), equalTo(MINUTE_LENGTH)) LocalDate.fixedLocalTime = unixTime(2017, Calendar.JANUARY, 1, 20, 0) assertThat( millisecondsUntilTomorrowWithOffset(), - equalTo(4 * DateUtils.HOUR_LENGTH) + equalTo(4 * HOUR_LENGTH) ) setStartDayOffset(3, 30) LocalDate.fixedLocalTime = unixTime(2017, Calendar.JANUARY, 1, 23, 59) assertThat( millisecondsUntilTomorrowWithOffset(), - equalTo(3 * DateUtils.HOUR_LENGTH + 31 * DateUtils.MINUTE_LENGTH) + equalTo(3 * HOUR_LENGTH + 31 * MINUTE_LENGTH) ) LocalDate.fixedLocalTime = unixTime(2017, Calendar.JANUARY, 2, 1, 0) assertThat( millisecondsUntilTomorrowWithOffset(), - equalTo(2 * DateUtils.HOUR_LENGTH + 30 * DateUtils.MINUTE_LENGTH) + equalTo(2 * HOUR_LENGTH + 30 * MINUTE_LENGTH) ) } @@ -353,7 +356,7 @@ class DateUtilsTest : BaseUnitTest() { setStartDayOffset(9, 0) assertThat( getTodayWithOffset(), - equalTo(Timestamp(FIXED_LOCAL_TIME - DateUtils.DAY_LENGTH)) + equalTo(Timestamp(FIXED_LOCAL_TIME - DAY_LENGTH)) ) } @@ -362,13 +365,13 @@ class DateUtilsTest : BaseUnitTest() { fun testGetStartOfDayWithOffset() { val timestamp = unixTime(2020, Calendar.SEPTEMBER, 3) assertThat( - getStartOfDayWithOffset(timestamp + DateUtils.HOUR_LENGTH), + getStartOfDayWithOffset(timestamp + HOUR_LENGTH), equalTo(timestamp) ) setStartDayOffset(3, 30) assertThat( - getStartOfDayWithOffset(timestamp + 3 * DateUtils.HOUR_LENGTH + 29 * DateUtils.MINUTE_LENGTH), - equalTo(timestamp - DateUtils.DAY_LENGTH) + getStartOfDayWithOffset(timestamp + 3 * HOUR_LENGTH + 29 * MINUTE_LENGTH), + equalTo(timestamp - DAY_LENGTH) ) } 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 d0474d4be..6a24644cc 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,10 +4,10 @@ import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext import org.isoron.platform.time.LocalDate +import org.isoron.platform.time.LocalDate.Companion.MINUTE_LENGTH import org.isoron.uhabits.core.BaseUnitTest import org.junit.Test import java.util.Calendar -import java.util.TimeZone import java.util.concurrent.Executors import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine @@ -30,7 +30,7 @@ class MidnightTimerTest : BaseUnitTest() { 1, 23, 59, - DateUtils.MINUTE_LENGTH - 1 + MINUTE_LENGTH - 1 ) val suspendedListener = suspendCoroutine { continuation ->