move repeat interval parsing from exporter to parser

This commit is contained in:
tibbi
2017-07-24 21:51:30 +02:00
parent 33f10240af
commit 18b47b3ffc
2 changed files with 99 additions and 99 deletions

View File

@ -2,8 +2,6 @@ package com.simplemobiletools.calendar.helpers
import com.simplemobiletools.calendar.activities.SimpleActivity
import com.simplemobiletools.calendar.extensions.dbHelper
import com.simplemobiletools.calendar.extensions.isXMonthlyRepetition
import com.simplemobiletools.calendar.extensions.isXWeeklyRepetition
import com.simplemobiletools.calendar.extensions.writeLn
import com.simplemobiletools.calendar.helpers.IcsExporter.ExportResult.*
import com.simplemobiletools.calendar.models.Event
@ -40,8 +38,8 @@ class IcsExporter {
}
out.writeLn("$STATUS$CONFIRMED")
Parser().getShortRepeatInterval(event).let { if (it.isNotEmpty()) out.writeLn(it) }
fillRepeatInterval(event, out)
fillReminders(event, out)
fillIgnoredOccurrences(event, out)
@ -61,102 +59,6 @@ class IcsExporter {
}
}
private fun fillRepeatInterval(event: Event, out: BufferedWriter) {
val repeatInterval = event.repeatInterval
if (repeatInterval == 0)
return
val freq = getFreq(repeatInterval)
val interval = getInterval(repeatInterval)
val repeatLimit = getRepeatLimitString(event)
val byDay = getByDay(event)
val rrule = "$RRULE$FREQ=$freq;$INTERVAL=$interval$repeatLimit$byDay"
out.writeLn(rrule)
}
private fun getFreq(interval: Int): String {
return if (interval % YEAR == 0)
YEARLY
else if (interval % MONTH == 0)
MONTHLY
else if (interval % WEEK == 0)
WEEKLY
else
DAILY
}
private fun getInterval(interval: Int): Int {
return if (interval % YEAR == 0)
interval / YEAR
else if (interval % MONTH == 0)
interval / MONTH
else if (interval % WEEK == 0)
interval / WEEK
else
interval / DAY
}
private fun getRepeatLimitString(event: Event): String {
return if (event.repeatLimit == 0)
""
else if (event.repeatLimit < 0)
";$COUNT=${-event.repeatLimit}"
else
";$UNTIL=${Formatter.getDayCodeFromTS(event.repeatLimit)}"
}
private fun getByDay(event: Event): String {
return if (event.repeatInterval.isXWeeklyRepetition()) {
val days = getByDayString(event.repeatRule)
";$BYDAY=$days"
} else if (event.repeatInterval.isXMonthlyRepetition()) {
if (event.repeatRule == REPEAT_MONTH_LAST_DAY) {
";$BYMONTHDAY=-1"
} else if (event.repeatRule == REPEAT_MONTH_EVERY_XTH_DAY) {
val start = Formatter.getDateTimeFromTS(event.startTS)
val dayOfMonth = start.dayOfMonth
val order = (dayOfMonth - 1) / 7 + 1
val day = getDayLetters(start.dayOfWeek)
";$BYDAY=$order$day"
} else {
""
}
} else {
""
}
}
private fun getByDayString(rule: Int): String {
var result = ""
if (rule and MONDAY != 0)
result += "$MO,"
if (rule and TUESDAY != 0)
result += "$TU,"
if (rule and WEDNESDAY != 0)
result += "$WE,"
if (rule and THURSDAY != 0)
result += "$TH,"
if (rule and FRIDAY != 0)
result += "$FR,"
if (rule and SATURDAY != 0)
result += "$SA,"
if (rule and SUNDAY != 0)
result += "$SU,"
return result.trimEnd(',')
}
private fun getDayLetters(dayOfWeek: Int): String {
return when (dayOfWeek) {
1 -> MO
2 -> TU
3 -> WE
4 -> TH
5 -> FR
6 -> SA
else -> SU
}
}
private fun fillReminders(event: Event, out: BufferedWriter) {
checkReminder(event.reminder1Minutes, out)
checkReminder(event.reminder2Minutes, out)

View File

@ -3,11 +3,13 @@ package com.simplemobiletools.calendar.helpers
import com.simplemobiletools.calendar.extensions.isXMonthlyRepetition
import com.simplemobiletools.calendar.extensions.isXWeeklyRepetition
import com.simplemobiletools.calendar.extensions.seconds
import com.simplemobiletools.calendar.models.Event
import com.simplemobiletools.calendar.models.RepeatRule
import org.joda.time.DateTimeZone
import org.joda.time.format.DateTimeFormat
class Parser {
// from RRULE:FREQ=DAILY;COUNT=5 to Daily, 5x...
fun parseRepeatInterval(fullString: String, startTS: Int): RepeatRule {
val parts = fullString.split(";")
var repeatInterval = 0
@ -88,4 +90,100 @@ class Parser {
val dateTimeZone = if (useUTC) DateTimeZone.UTC else DateTimeZone.getDefault()
return dateTimeFormat.parseDateTime(digitString).withZoneRetainFields(dateTimeZone).seconds()
}
// from Daily, 5x... to RRULE:FREQ=DAILY;COUNT=5
fun getShortRepeatInterval(event: Event): String {
val repeatInterval = event.repeatInterval
if (repeatInterval == 0)
return ""
val freq = getFreq(repeatInterval)
val interval = getInterval(repeatInterval)
val repeatLimit = getRepeatLimitString(event)
val byDay = getByDay(event)
return "$RRULE$FREQ=$freq;$INTERVAL=$interval$repeatLimit$byDay"
}
private fun getFreq(interval: Int): String {
return if (interval % YEAR == 0)
YEARLY
else if (interval % MONTH == 0)
MONTHLY
else if (interval % WEEK == 0)
WEEKLY
else
DAILY
}
private fun getInterval(interval: Int): Int {
return if (interval % YEAR == 0)
interval / YEAR
else if (interval % MONTH == 0)
interval / MONTH
else if (interval % WEEK == 0)
interval / WEEK
else
interval / DAY
}
private fun getRepeatLimitString(event: Event): String {
return if (event.repeatLimit == 0)
""
else if (event.repeatLimit < 0)
";$COUNT=${-event.repeatLimit}"
else
";$UNTIL=${Formatter.getDayCodeFromTS(event.repeatLimit)}"
}
private fun getByDay(event: Event): String {
return if (event.repeatInterval.isXWeeklyRepetition()) {
val days = getByDayString(event.repeatRule)
";$BYDAY=$days"
} else if (event.repeatInterval.isXMonthlyRepetition()) {
if (event.repeatRule == REPEAT_MONTH_LAST_DAY) {
";$BYMONTHDAY=-1"
} else if (event.repeatRule == REPEAT_MONTH_EVERY_XTH_DAY) {
val start = Formatter.getDateTimeFromTS(event.startTS)
val dayOfMonth = start.dayOfMonth
val order = (dayOfMonth - 1) / 7 + 1
val day = getDayLetters(start.dayOfWeek)
";$BYDAY=$order$day"
} else {
""
}
} else {
""
}
}
private fun getByDayString(rule: Int): String {
var result = ""
if (rule and MONDAY != 0)
result += "$MO,"
if (rule and TUESDAY != 0)
result += "$TU,"
if (rule and WEDNESDAY != 0)
result += "$WE,"
if (rule and THURSDAY != 0)
result += "$TH,"
if (rule and FRIDAY != 0)
result += "$FR,"
if (rule and SATURDAY != 0)
result += "$SA,"
if (rule and SUNDAY != 0)
result += "$SU,"
return result.trimEnd(',')
}
private fun getDayLetters(dayOfWeek: Int): String {
return when (dayOfWeek) {
1 -> MO
2 -> TU
3 -> WE
4 -> TH
5 -> FR
6 -> SA
else -> SU
}
}
}