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.activities.SimpleActivity
|
||||||
import com.simplemobiletools.calendar.extensions.dbHelper
|
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.extensions.writeLn
|
||||||
import com.simplemobiletools.calendar.helpers.IcsExporter.ExportResult.*
|
import com.simplemobiletools.calendar.helpers.IcsExporter.ExportResult.*
|
||||||
import com.simplemobiletools.calendar.models.Event
|
import com.simplemobiletools.calendar.models.Event
|
||||||
@ -40,8 +38,8 @@ class IcsExporter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
out.writeLn("$STATUS$CONFIRMED")
|
out.writeLn("$STATUS$CONFIRMED")
|
||||||
|
Parser().getShortRepeatInterval(event).let { if (it.isNotEmpty()) out.writeLn(it) }
|
||||||
|
|
||||||
fillRepeatInterval(event, out)
|
|
||||||
fillReminders(event, out)
|
fillReminders(event, out)
|
||||||
fillIgnoredOccurrences(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) {
|
private fun fillReminders(event: Event, out: BufferedWriter) {
|
||||||
checkReminder(event.reminder1Minutes, out)
|
checkReminder(event.reminder1Minutes, out)
|
||||||
checkReminder(event.reminder2Minutes, 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.isXMonthlyRepetition
|
||||||
import com.simplemobiletools.calendar.extensions.isXWeeklyRepetition
|
import com.simplemobiletools.calendar.extensions.isXWeeklyRepetition
|
||||||
import com.simplemobiletools.calendar.extensions.seconds
|
import com.simplemobiletools.calendar.extensions.seconds
|
||||||
|
import com.simplemobiletools.calendar.models.Event
|
||||||
import com.simplemobiletools.calendar.models.RepeatRule
|
import com.simplemobiletools.calendar.models.RepeatRule
|
||||||
import org.joda.time.DateTimeZone
|
import org.joda.time.DateTimeZone
|
||||||
import org.joda.time.format.DateTimeFormat
|
import org.joda.time.format.DateTimeFormat
|
||||||
|
|
||||||
class Parser {
|
class Parser {
|
||||||
|
// from RRULE:FREQ=DAILY;COUNT=5 to Daily, 5x...
|
||||||
fun parseRepeatInterval(fullString: String, startTS: Int): RepeatRule {
|
fun parseRepeatInterval(fullString: String, startTS: Int): RepeatRule {
|
||||||
val parts = fullString.split(";")
|
val parts = fullString.split(";")
|
||||||
var repeatInterval = 0
|
var repeatInterval = 0
|
||||||
@ -88,4 +90,100 @@ class Parser {
|
|||||||
val dateTimeZone = if (useUTC) DateTimeZone.UTC else DateTimeZone.getDefault()
|
val dateTimeZone = if (useUTC) DateTimeZone.UTC else DateTimeZone.getDefault()
|
||||||
return dateTimeFormat.parseDateTime(digitString).withZoneRetainFields(dateTimeZone).seconds()
|
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