mirror of
https://github.com/SimpleMobileTools/Simple-Calendar.git
synced 2025-06-05 21:59:17 +02:00
move repeat interval parsing from exporter to parser
This commit is contained in:
@ -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)
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user