Migrate time constants

pull/1120/head
sgallese 4 years ago
parent 150dcefb2c
commit a4fe16c0c1

@ -20,9 +20,9 @@
package org.isoron.uhabits.database package org.isoron.uhabits.database
import org.isoron.platform.time.LocalDate import org.isoron.platform.time.LocalDate
import org.isoron.platform.time.LocalDate.Companion.DAY_LENGTH
import org.isoron.uhabits.AndroidDirFinder import org.isoron.uhabits.AndroidDirFinder
import org.isoron.uhabits.BaseAndroidTest import org.isoron.uhabits.BaseAndroidTest
import org.isoron.uhabits.core.utils.DateUtils
import org.junit.Test import org.junit.Test
import java.io.File import java.io.File
import java.io.FileOutputStream import java.io.FileOutputStream
@ -30,7 +30,7 @@ import java.io.FileOutputStream
class AutoBackupTest : BaseAndroidTest() { class AutoBackupTest : BaseAndroidTest() {
@Test @Test
fun testRun() { fun testRun() {
LocalDate.fixedLocalTime = 40 * DateUtils.DAY_LENGTH LocalDate.fixedLocalTime = 40 * DAY_LENGTH
val basedir = AndroidDirFinder(targetContext).getFilesDir("Backups")!! val basedir = AndroidDirFinder(targetContext).getFilesDir("Backups")!!
createTestFiles(basedir, 30) createTestFiles(basedir, 30)
@ -64,7 +64,7 @@ class AutoBackupTest : BaseAndroidTest() {
private fun createTestFiles(basedir: File, nfiles: Int) { private fun createTestFiles(basedir: File, nfiles: Int) {
removeAllFiles(basedir) removeAllFiles(basedir)
for (k in 1..nfiles) { for (k in 1..nfiles) {
touch("${basedir.path}/test-$k.txt", DateUtils.DAY_LENGTH * k) touch("${basedir.path}/test-$k.txt", DAY_LENGTH * k)
} }
} }

@ -20,12 +20,12 @@ package org.isoron.uhabits.performance
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.MediumTest import androidx.test.filters.MediumTest
import org.isoron.platform.time.LocalDate.Companion.DAY_LENGTH
import org.isoron.uhabits.BaseAndroidTest import org.isoron.uhabits.BaseAndroidTest
import org.isoron.uhabits.core.commands.CreateHabitCommand import org.isoron.uhabits.core.commands.CreateHabitCommand
import org.isoron.uhabits.core.commands.CreateRepetitionCommand import org.isoron.uhabits.core.commands.CreateRepetitionCommand
import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.Habit
import org.isoron.uhabits.core.models.Timestamp 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.isoron.uhabits.core.models.sqlite.SQLModelFactory
import org.junit.Ignore import org.junit.Ignore
import org.junit.Test import org.junit.Test

@ -22,8 +22,8 @@ package org.isoron.uhabits.database
import android.content.Context import android.content.Context
import android.util.Log import android.util.Log
import org.isoron.platform.time.LocalDate import org.isoron.platform.time.LocalDate
import org.isoron.platform.time.LocalDate.Companion.DAY_LENGTH
import org.isoron.uhabits.AndroidDirFinder import org.isoron.uhabits.AndroidDirFinder
import org.isoron.uhabits.core.utils.DateUtils
import org.isoron.uhabits.utils.DatabaseUtils import org.isoron.uhabits.utils.DatabaseUtils
import java.io.File import java.io.File
@ -40,7 +40,7 @@ class AutoBackup(private val context: Context) {
} }
val now = LocalDate.getLocalTime() val now = LocalDate.getLocalTime()
removeOldest(files, keep) removeOldest(files, keep)
if (now - newestTimestamp > DateUtils.DAY_LENGTH) { if (now - newestTimestamp > DAY_LENGTH) {
DatabaseUtils.saveDatabaseCopy(context, basedir) DatabaseUtils.saveDatabaseCopy(context, basedir)
} else { } else {
Log.i("AutoBackup", "Fresh backup found (timestamp=$newestTimestamp)") Log.i("AutoBackup", "Fresh backup found (timestamp=$newestTimestamp)")

@ -146,6 +146,26 @@ data class LocalDate(val daysSince2000: Int) {
var fixedTimeZone: TimeZone? = null var fixedTimeZone: TimeZone? = null
var fixedLocale: Locale? = 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 { fun getLocalTime(testTimeInMillis: Long? = null): Long {
if (fixedLocalTime != null) return fixedLocalTime as Long if (fixedLocalTime != null) return fixedLocalTime as Long

@ -19,6 +19,7 @@
package org.isoron.uhabits.core.models package org.isoron.uhabits.core.models
import org.isoron.platform.time.LocalDate 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.DateFormats.Companion.getCSVDateFormat
import org.isoron.uhabits.core.utils.DateUtils import org.isoron.uhabits.core.utils.DateUtils
import org.isoron.uhabits.core.utils.DateUtils.Companion.getStartOfTodayCalendar import org.isoron.uhabits.core.utils.DateUtils.Companion.getStartOfTodayCalendar
@ -103,7 +104,6 @@ data class Timestamp(var unixTime: Long) : Comparable<Timestamp> {
} }
companion object { companion object {
const val DAY_LENGTH: Long = 86400000
val ZERO = Timestamp(0) val ZERO = Timestamp(0)
fun fromLocalDate(date: LocalDate): Timestamp { fun fromLocalDate(date: LocalDate): Timestamp {
return Timestamp(946684800000L + date.daysSince2000 * 86400000L) return Timestamp(946684800000L + date.daysSince2000 * 86400000L)

@ -21,6 +21,9 @@ package org.isoron.uhabits.core.utils
import kotlinx.datetime.Instant import kotlinx.datetime.Instant
import kotlinx.datetime.offsetAt import kotlinx.datetime.offsetAt
import org.isoron.platform.time.LocalDate 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.getLocalTime
import org.isoron.platform.time.LocalDate.Companion.getTimeZone import org.isoron.platform.time.LocalDate.Companion.getTimeZone
import org.isoron.uhabits.core.models.Timestamp import org.isoron.uhabits.core.models.Timestamp
@ -38,26 +41,6 @@ abstract class DateUtils {
private var startDayHourOffset: Int = 0 private var startDayHourOffset: Int = 0
private var startDayMinuteOffset: 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 @JvmStatic
fun applyTimezone(localTimestamp: Long): Long { fun applyTimezone(localTimestamp: Long): Long {
val tz = getTimeZone() val tz = getTimeZone()

@ -18,6 +18,8 @@
*/ */
package org.isoron.uhabits.core.utils 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 org.isoron.uhabits.core.AppScope
import java.util.LinkedList import java.util.LinkedList
import java.util.concurrent.Executors import java.util.concurrent.Executors
@ -43,14 +45,14 @@ open class MidnightTimer @Inject constructor() {
@Synchronized @Synchronized
fun onResume( fun onResume(
delayOffsetInMillis: Long = DateUtils.SECOND_LENGTH, delayOffsetInMillis: Long = SECOND_LENGTH,
testExecutor: ScheduledExecutorService? = null testExecutor: ScheduledExecutorService? = null
) { ) {
executor = testExecutor ?: Executors.newSingleThreadScheduledExecutor() executor = testExecutor ?: Executors.newSingleThreadScheduledExecutor()
executor.scheduleAtFixedRate( executor.scheduleAtFixedRate(
{ notifyListeners() }, { notifyListeners() },
DateUtils.millisecondsUntilTomorrowWithOffset() + delayOffsetInMillis, DateUtils.millisecondsUntilTomorrowWithOffset() + delayOffsetInMillis,
DateUtils.DAY_LENGTH, DAY_LENGTH,
TimeUnit.MILLISECONDS TimeUnit.MILLISECONDS
) )
} }

@ -23,6 +23,9 @@ import junit.framework.Assert.assertEquals
import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.core.IsEqual.equalTo import org.hamcrest.core.IsEqual.equalTo
import org.isoron.platform.time.LocalDate 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.BaseUnitTest
import org.isoron.uhabits.core.models.Timestamp import org.isoron.uhabits.core.models.Timestamp
import org.isoron.uhabits.core.utils.DateUtils.Companion.applyTimezone import org.isoron.uhabits.core.utils.DateUtils.Companion.applyTimezone
@ -288,22 +291,22 @@ class DateUtilsTest : BaseUnitTest() {
fun testMillisecondsUntilTomorrow() { fun testMillisecondsUntilTomorrow() {
LocalDate.fixedTimeZone = kotlinx.datetime.TimeZone.UTC LocalDate.fixedTimeZone = kotlinx.datetime.TimeZone.UTC
LocalDate.fixedLocalTime = unixTime(2017, Calendar.JANUARY, 1, 23, 59) 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) LocalDate.fixedLocalTime = unixTime(2017, Calendar.JANUARY, 1, 20, 0)
assertThat( assertThat(
millisecondsUntilTomorrowWithOffset(), millisecondsUntilTomorrowWithOffset(),
equalTo(4 * DateUtils.HOUR_LENGTH) equalTo(4 * HOUR_LENGTH)
) )
setStartDayOffset(3, 30) setStartDayOffset(3, 30)
LocalDate.fixedLocalTime = unixTime(2017, Calendar.JANUARY, 1, 23, 59) LocalDate.fixedLocalTime = unixTime(2017, Calendar.JANUARY, 1, 23, 59)
assertThat( assertThat(
millisecondsUntilTomorrowWithOffset(), 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) LocalDate.fixedLocalTime = unixTime(2017, Calendar.JANUARY, 2, 1, 0)
assertThat( assertThat(
millisecondsUntilTomorrowWithOffset(), 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) setStartDayOffset(9, 0)
assertThat( assertThat(
getTodayWithOffset(), 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() { fun testGetStartOfDayWithOffset() {
val timestamp = unixTime(2020, Calendar.SEPTEMBER, 3) val timestamp = unixTime(2020, Calendar.SEPTEMBER, 3)
assertThat( assertThat(
getStartOfDayWithOffset(timestamp + DateUtils.HOUR_LENGTH), getStartOfDayWithOffset(timestamp + HOUR_LENGTH),
equalTo(timestamp) equalTo(timestamp)
) )
setStartDayOffset(3, 30) setStartDayOffset(3, 30)
assertThat( assertThat(
getStartOfDayWithOffset(timestamp + 3 * DateUtils.HOUR_LENGTH + 29 * DateUtils.MINUTE_LENGTH), getStartOfDayWithOffset(timestamp + 3 * HOUR_LENGTH + 29 * MINUTE_LENGTH),
equalTo(timestamp - DateUtils.DAY_LENGTH) equalTo(timestamp - DAY_LENGTH)
) )
} }

@ -4,10 +4,10 @@ import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.isoron.platform.time.LocalDate import org.isoron.platform.time.LocalDate
import org.isoron.platform.time.LocalDate.Companion.MINUTE_LENGTH
import org.isoron.uhabits.core.BaseUnitTest import org.isoron.uhabits.core.BaseUnitTest
import org.junit.Test import org.junit.Test
import java.util.Calendar import java.util.Calendar
import java.util.TimeZone
import java.util.concurrent.Executors import java.util.concurrent.Executors
import kotlin.coroutines.resume import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine import kotlin.coroutines.suspendCoroutine
@ -30,7 +30,7 @@ class MidnightTimerTest : BaseUnitTest() {
1, 1,
23, 23,
59, 59,
DateUtils.MINUTE_LENGTH - 1 MINUTE_LENGTH - 1
) )
val suspendedListener = suspendCoroutine<Boolean> { continuation -> val suspendedListener = suspendCoroutine<Boolean> { continuation ->

Loading…
Cancel
Save