diff --git a/app/src/androidTest/java/org/tasks/opentasks/OpenTasksDueDateTests.kt b/app/src/androidTest/java/org/tasks/opentasks/OpenTasksDueDateTests.kt index 75e3a3615..d3a3f25d1 100644 --- a/app/src/androidTest/java/org/tasks/opentasks/OpenTasksDueDateTests.kt +++ b/app/src/androidTest/java/org/tasks/opentasks/OpenTasksDueDateTests.kt @@ -1,6 +1,7 @@ package org.tasks.opentasks import com.natpryce.makeiteasy.MakeItEasy.with +import com.todoroo.astrid.data.Task import dagger.hilt.android.testing.HiltAndroidTest import dagger.hilt.android.testing.UninstallModules import kotlinx.coroutines.runBlocking @@ -51,7 +52,7 @@ class OpenTasksDueDateTests : OpenTasksTest() { assertEquals( 1612137600000, - openTaskDao.getTask(listId.toLong(), "1234")?.task?.due?.date?.time + openTaskDao.getTask(listId, "1234")?.task?.due?.date?.time ) } @@ -87,7 +88,7 @@ class OpenTasksDueDateTests : OpenTasksTest() { assertEquals( 1612137600000, - openTaskDao.getTask(listId.toLong(), "1234")?.task?.due?.date?.time + openTaskDao.getTask(listId, "1234")?.task?.due?.date?.time ) } @@ -123,10 +124,60 @@ class OpenTasksDueDateTests : OpenTasksTest() { assertEquals( 1612137600000, - openTaskDao.getTask(listId.toLong(), "1234")?.task?.due?.date?.time + openTaskDao.getTask(listId, "1234")?.task?.due?.date?.time ) } + @Test + fun startTimeEqualsDueTime() = runBlocking { + val (listId, list) = openTaskDao.insertList() + val task = newTask( + with(TaskMaker.HIDE_TYPE, Task.HIDE_UNTIL_DUE_TIME), + with(TaskMaker.DUE_TIME, DateTime(2021, 2, 1, 16, 0)) + ) + taskDao.createNew(task) + caldavDao.insert(newCaldavTask( + with(CaldavTaskMaker.CALENDAR, list.uuid), + with(CaldavTaskMaker.REMOTE_ID, "1234"), + with(CaldavTaskMaker.TASK, task.id) + )) + + synchronizer.sync() + + assertEquals( + 1612216800000, + openTaskDao.getTask(listId, "1234")?.task?.dtStart?.date?.time + ) + assertEquals( + 1612216801000, + openTaskDao.getTask(listId, "1234")?.task?.due?.date?.time + ) + } + + @Test + fun startTimeEqualDueTime() = runBlocking { + val (_, list) = withVtodo(START_TIME_DUE_TIME) + + synchronizer.sync() + + val caldavTask = caldavDao.getTaskByRemoteId(list.uuid!!, "2009955511573185442") + val task = taskDao.fetch(caldavTask!!.task)!! + assertEquals(DateTime(2021, 2, 4, 8, 0, 1, 0).millis, task.dueDate) + assertEquals(task.dueDate, task.hideUntil) + } + + @Test + fun startTimeEqualDueTimeNoOffset() = runBlocking { + val (_, list) = withVtodo(START_TIME_DUE_TIME_NO_OFFSET) + + synchronizer.sync() + + val caldavTask = caldavDao.getTaskByRemoteId(list.uuid!!, "2009955511573185442") + val task = taskDao.fetch(caldavTask!!.task)!! + assertEquals(DateTime(2021, 2, 4, 8, 0, 1, 0).millis, task.dueDate) + assertEquals(task.dueDate, task.hideUntil) + } + companion object { private val BERLIN = TimeZone.getTimeZone("Europe/Berlin") private val LONDON = TimeZone.getTimeZone("Europe/London") @@ -146,5 +197,39 @@ class OpenTasksDueDateTests : OpenTasksTest() { END:VTODO END:VCALENDAR """.trimIndent() + + private val START_TIME_DUE_TIME = """ + BEGIN:VCALENDAR + VERSION:2.0 + PRODID:+//IDN tasks.org//android-110305//EN + BEGIN:VTODO + DTSTAMP:20210203T164753Z + UID:2009955511573185442 + CREATED:20210203T164728Z + LAST-MODIFIED:20210203T164750Z + SUMMARY:Start time + X-APPLE-SORT-ORDER:-5 + DUE;TZID=America/Chicago:20210204T080001 + DTSTART;TZID=America/Chicago:20210204T080000 + END:VTODO + END:VCALENDAR + """.trimIndent() + + private val START_TIME_DUE_TIME_NO_OFFSET = """ + BEGIN:VCALENDAR + VERSION:2.0 + PRODID:+//IDN tasks.org//android-110305//EN + BEGIN:VTODO + DTSTAMP:20210203T164753Z + UID:2009955511573185442 + CREATED:20210203T164728Z + LAST-MODIFIED:20210203T164750Z + SUMMARY:Start time + X-APPLE-SORT-ORDER:-5 + DUE;TZID=America/Chicago:20210204T080000 + DTSTART;TZID=America/Chicago:20210204T080000 + END:VTODO + END:VCALENDAR + """.trimIndent() } } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/caldav/iCalendar.kt b/app/src/main/java/org/tasks/caldav/iCalendar.kt index 40c5f3ba2..0a1ce00c1 100644 --- a/app/src/main/java/org/tasks/caldav/iCalendar.kt +++ b/app/src/main/java/org/tasks/caldav/iCalendar.kt @@ -30,6 +30,7 @@ import org.tasks.location.GeofenceApi import org.tasks.preferences.Preferences import org.tasks.time.DateTime.UTC import org.tasks.time.DateTimeUtils.startOfDay +import org.tasks.time.DateTimeUtils.startOfMinute import timber.log.Timber import java.io.ByteArrayOutputStream import java.io.StringReader @@ -305,7 +306,11 @@ class iCalendar @Inject constructor( description = task.notes val allDay = !task.hasDueTime() && !task.hasStartTime() val dueDate = if (task.hasDueTime()) task.dueDate else task.dueDate.startOfDay() - var startDate = if (task.hasStartTime()) task.hideUntil else task.hideUntil.startOfDay() + var startDate = if (task.hasStartTime()) { + task.hideUntil.startOfMinute() + } else { + task.hideUntil.startOfDay() + } due = if (dueDate > 0) { startDate = min(dueDate, startDate) Due(if (allDay) getDate(dueDate) else getDateTime(dueDate)) diff --git a/app/src/main/java/org/tasks/time/DateTimeUtils.kt b/app/src/main/java/org/tasks/time/DateTimeUtils.kt index 648a2f219..9f5f72237 100644 --- a/app/src/main/java/org/tasks/time/DateTimeUtils.kt +++ b/app/src/main/java/org/tasks/time/DateTimeUtils.kt @@ -37,5 +37,7 @@ object DateTimeUtils { @JvmStatic fun Long.startOfDay(): Long = if (this > 0) toDateTime().startOfDay().millis else 0 + fun Long.startOfMinute(): Long = if (this > 0) toDateTime().startOfMinute().millis else 0 + fun Long.millisOfDay(): Int = if (this > 0) toDateTime().millisOfDay else 0 } \ No newline at end of file