improve ics parsing by calculating start + duration if end is missing
This commit is contained in:
parent
a76a638fae
commit
f3b5e3a4ae
|
@ -18,6 +18,7 @@ class IcsParser {
|
||||||
private val END = "END:VEVENT"
|
private val END = "END:VEVENT"
|
||||||
private val DTSTART = "DTSTART"
|
private val DTSTART = "DTSTART"
|
||||||
private val DTEND = "DTEND"
|
private val DTEND = "DTEND"
|
||||||
|
private val DURATION = "DURATION:"
|
||||||
private val SUMMARY = "SUMMARY:"
|
private val SUMMARY = "SUMMARY:"
|
||||||
private val DESCRIPTION = "DESCRIPTION:"
|
private val DESCRIPTION = "DESCRIPTION:"
|
||||||
private val UID = "UID:"
|
private val UID = "UID:"
|
||||||
|
@ -55,6 +56,9 @@ class IcsParser {
|
||||||
curStart = getTimestamp(line.substring(DTSTART.length))
|
curStart = getTimestamp(line.substring(DTSTART.length))
|
||||||
} else if (line.startsWith(DTEND)) {
|
} else if (line.startsWith(DTEND)) {
|
||||||
curEnd = getTimestamp(line.substring(DTEND.length))
|
curEnd = getTimestamp(line.substring(DTEND.length))
|
||||||
|
} else if (line.startsWith(DURATION)) {
|
||||||
|
val duration = line.substring(DURATION.length)
|
||||||
|
curEnd = calculateEndTime(curStart, duration)
|
||||||
} else if (line.startsWith(SUMMARY)) {
|
} else if (line.startsWith(SUMMARY)) {
|
||||||
curTitle = line.substring(SUMMARY.length)
|
curTitle = line.substring(SUMMARY.length)
|
||||||
curTitle = curTitle.substring(0, Math.min(curTitle.length, 50))
|
curTitle = curTitle.substring(0, Math.min(curTitle.length, 50))
|
||||||
|
@ -108,6 +112,24 @@ class IcsParser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// P0DT1H0M0S
|
||||||
|
private fun calculateEndTime(curStart: Int, duration: String): Int {
|
||||||
|
val weeks = getDurationValue(duration, "W")
|
||||||
|
val days = getDurationValue(duration, "DT")
|
||||||
|
val hours = getDurationValue(duration, "H")
|
||||||
|
val minutes = getDurationValue(duration, "M")
|
||||||
|
val seconds = getDurationValue(duration, "S")
|
||||||
|
|
||||||
|
val minSecs = 60
|
||||||
|
val hourSecs = minSecs * 60
|
||||||
|
val daySecs = hourSecs * 24
|
||||||
|
val weekSecs = daySecs * 7
|
||||||
|
|
||||||
|
return curStart + seconds + (minutes * minSecs) + (hours * hourSecs) + (days * daySecs) + (weeks * weekSecs)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getDurationValue(duration: String, char: String): Int = Regex("[0-9]+(?=$char)").find(duration)?.value?.toInt() ?: 0
|
||||||
|
|
||||||
private fun parseLongFormat(digitString: String): Int {
|
private fun parseLongFormat(digitString: String): Int {
|
||||||
val dateTimeFormat = DateTimeFormat.forPattern("yyyyMMddHHmmss")
|
val dateTimeFormat = DateTimeFormat.forPattern("yyyyMMddHHmmss")
|
||||||
return dateTimeFormat.parseDateTime(digitString).withZoneRetainFields(DateTimeZone.UTC).seconds()
|
return dateTimeFormat.parseDateTime(digitString).withZoneRetainFields(DateTimeZone.UTC).seconds()
|
||||||
|
|
Loading…
Reference in New Issue