diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/location/LocationItem.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/location/LocationItem.kt index 7b9d3c14..fac783eb 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/location/LocationItem.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/location/LocationItem.kt @@ -718,7 +718,7 @@ private fun buildAddress( } private fun OpeningSchedule.getCurrentOpeningHours(): OpeningHours? { - return openingHours.find { it.isOpen } + return openingHours.find { it.isOpen() } } private fun OpeningSchedule.getNextOpeningHours(): OpeningHours { diff --git a/core/base/build.gradle.kts b/core/base/build.gradle.kts index a6f63cbe..a55700f5 100644 --- a/core/base/build.gradle.kts +++ b/core/base/build.gradle.kts @@ -54,4 +54,5 @@ dependencies { implementation(project(":libs:material-color-utilities")) api(project(":core:shared")) + testImplementation(libs.bundles.tests) } \ No newline at end of file diff --git a/core/base/src/main/java/de/mm20/launcher2/search/Location.kt b/core/base/src/main/java/de/mm20/launcher2/search/Location.kt index 7297707f..49c08330 100644 --- a/core/base/src/main/java/de/mm20/launcher2/search/Location.kt +++ b/core/base/src/main/java/de/mm20/launcher2/search/Location.kt @@ -9,7 +9,7 @@ import de.mm20.launcher2.icons.TintedIconLayer import kotlinx.collections.immutable.ImmutableList import java.time.DayOfWeek import java.time.Duration -import java.time.LocalDate +import java.time.LocalDateTime import java.time.LocalTime import android.location.Location as AndroidLocation @@ -233,10 +233,12 @@ data class OpeningHours( val startTime: LocalTime, val duration: Duration ) { - val isOpen: Boolean - get() = LocalDate.now().dayOfWeek == dayOfWeek && - LocalTime.now().isAfter(startTime) && - LocalTime.now().isBefore(startTime.plus(duration)) + + fun isOpen(date: LocalDateTime = LocalDateTime.now()): Boolean { + return date.dayOfWeek == dayOfWeek && + date.toLocalTime().isAfter(startTime) && + date.toLocalTime().isBefore(startTime.plus(duration)) + } override fun toString(): String = "$dayOfWeek $startTime-${startTime.plus(duration)}" } @@ -245,6 +247,7 @@ data class OpeningSchedule( val isTwentyFourSeven: Boolean, val openingHours: ImmutableList ) { - val isOpen: Boolean - get() = isTwentyFourSeven || openingHours.any { it.isOpen } + fun isOpen(date: LocalDateTime = LocalDateTime.now()): Boolean { + return isTwentyFourSeven || openingHours.any { it.isOpen(date) } + } } diff --git a/core/base/src/test/java/de/mm20/launcher2/search/OpeningScheduleTest.kt b/core/base/src/test/java/de/mm20/launcher2/search/OpeningScheduleTest.kt new file mode 100644 index 00000000..40fe77c2 --- /dev/null +++ b/core/base/src/test/java/de/mm20/launcher2/search/OpeningScheduleTest.kt @@ -0,0 +1,104 @@ +package de.mm20.launcher2.search + +import kotlinx.collections.immutable.persistentListOf +import org.junit.Assert +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized +import java.time.DayOfWeek +import java.time.Duration +import java.time.LocalDateTime +import java.time.LocalTime + +@RunWith(Parameterized::class) +class OpeningScheduleTest(val date: LocalDateTime, val expected: Boolean) { + + + @Test + fun isOpen() { + val openingSchedule = OpeningSchedule( + isTwentyFourSeven = false, + /** + * Monday: 18:00 - Tue. 01:00 + * Tuesday: 10:00 - 00:00 + * Wednesday: 08:00 - 12:00, 15:00 - 19:00 + * Thursday: 00:00 - Fri. 01:00 + * Friday: closed + * Saturday: 08:00 - 17:00 + * Sunday: 12:00 - 12:30 + */ + openingHours = persistentListOf( + OpeningHours( + dayOfWeek = DayOfWeek.MONDAY, + startTime = LocalTime.of(18, 0), + duration = Duration.ofHours(7), + ), + OpeningHours( + dayOfWeek = DayOfWeek.TUESDAY, + startTime = LocalTime.of(10, 0), + duration = Duration.ofHours(14), + ), + OpeningHours( + dayOfWeek = DayOfWeek.WEDNESDAY, + startTime = LocalTime.of(8, 0), + duration = Duration.ofHours(4), + ), + OpeningHours( + dayOfWeek = DayOfWeek.WEDNESDAY, + startTime = LocalTime.of(15, 0), + duration = Duration.ofHours(4), + ), + OpeningHours( + dayOfWeek = DayOfWeek.THURSDAY, + startTime = LocalTime.of(0, 0), + duration = Duration.ofHours(25), + ), + OpeningHours( + dayOfWeek = DayOfWeek.SATURDAY, + startTime = LocalTime.of(8, 0), + duration = Duration.ofHours(9), + ), + OpeningHours( + dayOfWeek = DayOfWeek.SUNDAY, + startTime = LocalTime.of(12, 0), + duration = Duration.ofMinutes(30), + ), + ) + ) + println("${date.dayOfWeek}, ${date.toLocalTime()}") + Assert.assertEquals(expected, openingSchedule.isOpen(date)) + } + + companion object { + @JvmStatic + @Parameterized.Parameters + fun data() = listOf( + // Monday, 22:00 + arrayOf(LocalDateTime.of(2024, 5, 13, 22, 0, 0), true), + // Tuesday, 01:01 + arrayOf(LocalDateTime.of(2024, 5, 14, 1, 1, 0), false), + // Wednesday, 11:00 + arrayOf(LocalDateTime.of(2024, 5, 15, 11, 0, 0), true), + // Wednesday, 13:00 + arrayOf(LocalDateTime.of(2024, 5, 15, 13, 0, 0), false), + // Wednesday, 16:00 + arrayOf(LocalDateTime.of(2024, 5, 15, 16, 0, 0), true), + // Thursday, 00:00 + arrayOf(LocalDateTime.of(2024, 5, 16, 0, 0, 0), true), + // Thursday, 02:00 + arrayOf(LocalDateTime.of(2024, 5, 16, 2, 0, 0), true), + // Friday, 00:30 + arrayOf(LocalDateTime.of(2024, 5, 17, 0, 30, 0), true), + // Friday, 12:00 + arrayOf(LocalDateTime.of(2024, 5, 17, 12, 0, 0), false), + // Saturday, 16:00 + arrayOf(LocalDateTime.of(2024, 5, 18, 16, 0, 0), true), + // Sunday, 12:15 + arrayOf(LocalDateTime.of(2024, 5, 19, 12, 15, 0), true), + // Sunday, 12:31 + arrayOf(LocalDateTime.of(2024, 5, 19, 12, 31, 0), false), + + + ) + } +} \ No newline at end of file