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")