diff --git a/CHANGELOG.md b/CHANGELOG.md index 73a6fc1f1..a3d37f25a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed event text readability on colored backgrounds ([#1065]) - Fixed invisible current time indicator in weekly view ([#99]) - Fixed stuck zoom level in weekly view on some devices ([#621]) +- Fixed events starting at 1970-01-01 00:00 (Unix timestamp 0) not being visible ([#440]) ## [1.10.3] - 2026-02-14 ### Changed @@ -224,6 +225,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#393]: https://github.com/FossifyOrg/Calendar/issues/393 [#394]: https://github.com/FossifyOrg/Calendar/issues/394 [#406]: https://github.com/FossifyOrg/Calendar/issues/406 +[#440]: https://github.com/FossifyOrg/Calendar/issues/440 [#484]: https://github.com/FossifyOrg/Calendar/issues/484 [#486]: https://github.com/FossifyOrg/Calendar/issues/486 [#550]: https://github.com/FossifyOrg/Calendar/issues/550 diff --git a/app/detekt-baseline.xml b/app/detekt-baseline.xml index 12dc7d2b5..dc1b890f3 100644 --- a/app/detekt-baseline.xml +++ b/app/detekt-baseline.xml @@ -275,12 +275,9 @@ MaxLineLength:EventListAdapter.kt$EventListAdapter$val eventsToDelete = listItems.filter { selectedKeys.contains((it as? ListEvent)?.hashCode()) } as List<ListEvent> MaxLineLength:EventListWidgetAdapter.kt$EventListWidgetAdapter$if MaxLineLength:EventListWidgetAdapter.kt$EventListWidgetAdapter$} - MaxLineLength:EventsDao.kt$EventsDao$//val selection = "$COL_REMINDER_MINUTES != -1 AND ($COL_START_TS > ? OR $COL_REPEAT_INTERVAL != 0) AND $COL_START_TS != 0" - MaxLineLength:EventsDao.kt$EventsDao$@Query("SELECT * FROM events WHERE reminder_1_minutes != -1 AND (start_ts > :currentTS OR repeat_interval != 0) AND start_ts != 0") - MaxLineLength:EventsDao.kt$EventsDao$@Query("SELECT * FROM events WHERE start_ts <= :toTS AND end_ts >= :fromTS AND start_ts != 0 AND repeat_interval = 0 AND event_type IN (:calendarIds) AND (title LIKE :searchQuery OR location LIKE :searchQuery OR description LIKE :searchQuery)") - MaxLineLength:EventsDao.kt$EventsDao$@Query("SELECT * FROM events WHERE start_ts <= :toTS AND end_ts >= :fromTS AND start_ts != 0 AND repeat_interval = 0 AND event_type IN (:calendarIds)") - MaxLineLength:EventsDao.kt$EventsDao$@Query("SELECT * FROM events WHERE start_ts <= :toTS AND start_ts != 0 AND repeat_interval != 0 AND event_type IN (:calendarIds) AND (title LIKE :searchQuery OR location LIKE :searchQuery OR description LIKE :searchQuery)") - MaxLineLength:EventsDao.kt$EventsDao$@Query("SELECT * FROM events WHERE start_ts <= :toTS AND start_ts != 0 AND repeat_interval != 0 AND event_type IN (:calendarIds)") + MaxLineLength:EventsDao.kt$EventsDao$@Query("SELECT * FROM events WHERE start_ts <= :toTS AND end_ts >= :fromTS AND repeat_interval = 0 AND event_type IN (:calendarIds) AND (title LIKE :searchQuery OR location LIKE :searchQuery OR description LIKE :searchQuery)") + MaxLineLength:EventsDao.kt$EventsDao$@Query("SELECT * FROM events WHERE start_ts <= :toTS AND end_ts >= :fromTS AND repeat_interval = 0 AND event_type IN (:calendarIds)") + MaxLineLength:EventsDao.kt$EventsDao$@Query("SELECT * FROM events WHERE start_ts <= :toTS AND repeat_interval != 0 AND event_type IN (:calendarIds) AND (title LIKE :searchQuery OR location LIKE :searchQuery OR description LIKE :searchQuery)") MaxLineLength:EventsDao.kt$EventsDao$@Query("SELECT * FROM events WHERE start_ts <= :toTS AND start_ts >= :fromTS AND event_type IN (:calendarIds) AND type = $TYPE_TASK") MaxLineLength:EventsDatabase.kt$EventsDatabase.Companion.<no name provided>$execSQL("CREATE TABLE IF NOT EXISTS `tasks` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `task_id` INTEGER NOT NULL, `start_ts` INTEGER NOT NULL, `flags` INTEGER NOT NULL)") MaxLineLength:EventsDatabase.kt$EventsDatabase.Companion.<no name provided>$execSQL("CREATE TABLE IF NOT EXISTS `widgets` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `widget_id` INTEGER NOT NULL, `period` INTEGER NOT NULL)") diff --git a/app/src/androidTest/kotlin/org/fossify/calendar/interfaces/EventsDaoGetOneTimeEventsFromToWithCalendarIdsTest.kt b/app/src/androidTest/kotlin/org/fossify/calendar/interfaces/EventsDaoGetOneTimeEventsFromToWithCalendarIdsTest.kt index e11e1234f..530cb285a 100644 --- a/app/src/androidTest/kotlin/org/fossify/calendar/interfaces/EventsDaoGetOneTimeEventsFromToWithCalendarIdsTest.kt +++ b/app/src/androidTest/kotlin/org/fossify/calendar/interfaces/EventsDaoGetOneTimeEventsFromToWithCalendarIdsTest.kt @@ -74,12 +74,10 @@ class EventsDaoGetOneTimeEventsFromToWithCalendarIdsTest { @Test @Throws(Exception::class) fun bug440_EventAtMidnightOnFirstJan1970() { - expectedFailure("https://github.com/FossifyOrg/Calendar/issues/440") { - eventsDao.insertOrUpdate(Event(id = 0, startTS = 0, endTS = 3600, calendarId = calendarId)) + eventsDao.insertOrUpdate(Event(id = 0, startTS = 0, endTS = 3600, calendarId = calendarId)) - val eventsOnFirstJan1970 = eventsDao.getOneTimeEventsFromToWithCalendarIds(86400, 0, listOf(calendarId)) + val eventsOnFirstJan1970 = eventsDao.getOneTimeEventsFromToWithCalendarIds(86400, 0, listOf(calendarId)) - Assert.assertEquals(1, eventsOnFirstJan1970.count()) - } + Assert.assertEquals(1, eventsOnFirstJan1970.count()) } } diff --git a/app/src/main/kotlin/org/fossify/calendar/interfaces/EventsDao.kt b/app/src/main/kotlin/org/fossify/calendar/interfaces/EventsDao.kt index 0f2b13863..e3c191d9c 100644 --- a/app/src/main/kotlin/org/fossify/calendar/interfaces/EventsDao.kt +++ b/app/src/main/kotlin/org/fossify/calendar/interfaces/EventsDao.kt @@ -55,14 +55,14 @@ interface EventsDao { @Query("SELECT * FROM events WHERE id = :id AND start_ts <= :toTS AND end_ts >= :fromTS AND repeat_interval = 0") fun getOneTimeEventFromToWithId(id: Long, toTS: Long, fromTS: Long): List - @Query("SELECT * FROM events WHERE start_ts <= :toTS AND end_ts >= :fromTS AND start_ts != 0 AND repeat_interval = 0 AND event_type IN (:calendarIds)") + @Query("SELECT * FROM events WHERE start_ts <= :toTS AND end_ts >= :fromTS AND repeat_interval = 0 AND event_type IN (:calendarIds)") fun getOneTimeEventsFromToWithCalendarIds( toTS: Long, fromTS: Long, calendarIds: List ): List - @Query("SELECT * FROM events WHERE start_ts <= :toTS AND end_ts >= :fromTS AND start_ts != 0 AND repeat_interval = 0 AND event_type IN (:calendarIds) AND (title LIKE :searchQuery OR location LIKE :searchQuery OR description LIKE :searchQuery)") + @Query("SELECT * FROM events WHERE start_ts <= :toTS AND end_ts >= :fromTS AND repeat_interval = 0 AND event_type IN (:calendarIds) AND (title LIKE :searchQuery OR location LIKE :searchQuery OR description LIKE :searchQuery)") fun getOneTimeEventsFromToWithTypesForSearch( toTS: Long, fromTS: Long, @@ -76,10 +76,10 @@ interface EventsDao { @Query("SELECT * FROM events WHERE id = :id AND start_ts <= :toTS AND repeat_interval != 0") fun getRepeatableEventsOrTasksWithId(id: Long, toTS: Long): List - @Query("SELECT * FROM events WHERE start_ts <= :toTS AND start_ts != 0 AND repeat_interval != 0 AND event_type IN (:calendarIds)") + @Query("SELECT * FROM events WHERE start_ts <= :toTS AND repeat_interval != 0 AND event_type IN (:calendarIds)") fun getRepeatableEventsOrTasksWithCalendarIds(toTS: Long, calendarIds: List): List - @Query("SELECT * FROM events WHERE start_ts <= :toTS AND start_ts != 0 AND repeat_interval != 0 AND event_type IN (:calendarIds) AND (title LIKE :searchQuery OR location LIKE :searchQuery OR description LIKE :searchQuery)") + @Query("SELECT * FROM events WHERE start_ts <= :toTS AND repeat_interval != 0 AND event_type IN (:calendarIds) AND (title LIKE :searchQuery OR location LIKE :searchQuery OR description LIKE :searchQuery)") fun getRepeatableEventsOrTasksWithTypesForSearch( toTS: Long, calendarIds: List, @@ -104,8 +104,7 @@ interface EventsDao { @Query("SELECT * FROM events WHERE id IN (:ids)") fun getEventsOrTasksWithIds(ids: List): List - //val selection = "$COL_REMINDER_MINUTES != -1 AND ($COL_START_TS > ? OR $COL_REPEAT_INTERVAL != 0) AND $COL_START_TS != 0" - @Query("SELECT * FROM events WHERE reminder_1_minutes != -1 AND (start_ts > :currentTS OR repeat_interval != 0) AND start_ts != 0") + @Query("SELECT * FROM events WHERE reminder_1_minutes != -1 AND (start_ts > :currentTS OR repeat_interval != 0)") fun getEventsOrTasksAtReboot(currentTS: Long): List @Query("SELECT id FROM events")