From 18b47b3ffc7743f6ff1beacffa862fe1653e991f Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 24 Jul 2017 21:51:30 +0200 Subject: [PATCH] move repeat interval parsing from exporter to parser --- .../calendar/helpers/IcsExporter.kt | 100 +----------------- .../calendar/helpers/Parser.kt | 98 +++++++++++++++++ 2 files changed, 99 insertions(+), 99 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/IcsExporter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/IcsExporter.kt index 7ad573584..488f294c3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/IcsExporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/IcsExporter.kt @@ -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) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/Parser.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/Parser.kt index 78629b2c9..92abc12f2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/Parser.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/Parser.kt @@ -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 + } + } }