Skip to content

Instantly share code, notes, and snippets.

@zamahaka
Created May 13, 2019 10:51
Show Gist options
  • Save zamahaka/02c85e4001b0d0f7e571cdda418acd96 to your computer and use it in GitHub Desktop.
Save zamahaka/02c85e4001b0d0f7e571cdda418acd96 to your computer and use it in GitHub Desktop.
fun Dispensary.currentDayStatus(): DispensaryTimeStatus? {
val currentDayKey = when (Calendar.getInstance().dayOfWeek) {
Calendar.MONDAY -> Dispensary.MONDAY_KEY
Calendar.TUESDAY -> Dispensary.TUESDAY_KEY
Calendar.WEDNESDAY -> Dispensary.WEDNESDAY_KEY
Calendar.THURSDAY -> Dispensary.THURSDAY_KEY
Calendar.FRIDAY -> Dispensary.FRIDAY_KEY
Calendar.SATURDAY -> Dispensary.SATURDAY_KEY
Calendar.SUNDAY -> Dispensary.SUNDAY_KEY
else -> null
}
return timeStatuses
.mapKeys { (key, _) -> key.toLowerCase(Locale.ROOT) }[currentDayKey]
}
fun Dispensary.isOpenNow(): Boolean {
val timeZone = TimeZone.getTimeZone(timeZone)
// current day in dispensary time zone
val timeZoneDayKey = when (Calendar.getInstance(timeZone).dayOfWeek) {
Calendar.MONDAY -> Dispensary.MONDAY_KEY
Calendar.TUESDAY -> Dispensary.TUESDAY_KEY
Calendar.WEDNESDAY -> Dispensary.WEDNESDAY_KEY
Calendar.THURSDAY -> Dispensary.THURSDAY_KEY
Calendar.FRIDAY -> Dispensary.FRIDAY_KEY
Calendar.SATURDAY -> Dispensary.SATURDAY_KEY
Calendar.SUNDAY -> Dispensary.SUNDAY_KEY
else -> null
}
val timeZoneStatus = timeStatuses.mapKeys { (key, _) ->
key.toLowerCase(Locale.ROOT)
}[timeZoneDayKey]
return when (timeZoneStatus) {
null, is DispensaryTimeStatus.Close -> false
is DispensaryTimeStatus.Open -> {
val (currentHour, currentMinute) = Calendar.getInstance(timeZone).let {
it.hourOfDay to it.minute
}
val currentMinutes = TimeUnit.DAYS.toMinutes(currentHour.toLong()) + currentMinute
val (fromHour, fromMinute) = Calendar.getInstance(timeZone).apply {
timeInMillis = timeZoneStatus.open
}.let {
it.hourOfDay to it.minute
}
val fromMinutes = TimeUnit.DAYS.toMinutes(fromHour.toLong()) + fromMinute
val (toHour, toMinute) = Calendar.getInstance(timeZone).apply {
timeInMillis = timeZoneStatus.close
}.let {
it.hourOfDay to it.minute
}
val toMinutes = TimeUnit.DAYS.toMinutes(toHour.toLong()) + toMinute
return currentMinutes in fromMinutes..toMinutes
}
}
}
sealed class DispensaryTimeStatus {
abstract val order: Int
abstract val day: String
data class Open(
override val order: Int,
override val day: String,
val open: Timestamp,
val close: Timestamp
) : DispensaryTimeStatus()
data class Close(
override val order: Int,
override val day: String
) : DispensaryTimeStatus()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment