mirror of
https://github.com/SimpleMobileTools/Simple-Calendar.git
synced 2025-02-16 20:00:39 +01:00
Merge pull request #2126 from Naveen3Singh/fix_edit_future_occurrences
Properly handle `Update/Delete this and all future occurrences`
This commit is contained in:
commit
8d27660671
@ -1376,13 +1376,19 @@ class EventActivity : SimpleActivity() {
|
||||
}
|
||||
EDIT_FUTURE_OCCURRENCES -> {
|
||||
ensureBackgroundThread {
|
||||
eventsHelper.addEventRepeatLimit(mEvent.id!!, mEventOccurrenceTS)
|
||||
mEvent.apply {
|
||||
id = null
|
||||
}
|
||||
val eventId = mEvent.id!!
|
||||
val originalEvent = eventsDB.getEventWithId(eventId) ?: return@ensureBackgroundThread
|
||||
mEvent.maybeAdjustRepeatLimitCount(originalEvent, mEventOccurrenceTS)
|
||||
mEvent.id = null
|
||||
eventsHelper.apply {
|
||||
addEventRepeatLimit(eventId, mEventOccurrenceTS)
|
||||
if (mEventOccurrenceTS == originalEvent.startTS) {
|
||||
deleteEvent(eventId, true)
|
||||
}
|
||||
|
||||
eventsHelper.insertEvent(mEvent, addToCalDAV = true, showToasts = true) {
|
||||
finish()
|
||||
insertEvent(mEvent, addToCalDAV = true, showToasts = true) {
|
||||
finish()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -489,13 +489,19 @@ class TaskActivity : SimpleActivity() {
|
||||
}
|
||||
EDIT_FUTURE_OCCURRENCES -> {
|
||||
ensureBackgroundThread {
|
||||
eventsHelper.addEventRepeatLimit(mTask.id!!, mTaskOccurrenceTS)
|
||||
mTask.apply {
|
||||
id = null
|
||||
}
|
||||
val taskId = mTask.id!!
|
||||
val originalTask = eventsDB.getTaskWithId(taskId) ?: return@ensureBackgroundThread
|
||||
mTask.maybeAdjustRepeatLimitCount(originalTask, mTaskOccurrenceTS)
|
||||
mTask.id = null
|
||||
eventsHelper.apply {
|
||||
addEventRepeatLimit(taskId, mTaskOccurrenceTS)
|
||||
if (mTaskOccurrenceTS == originalTask.startTS) {
|
||||
deleteEvent(taskId, true)
|
||||
}
|
||||
|
||||
eventsHelper.insertTask(mTask, showToasts = true) {
|
||||
finish()
|
||||
insertTask(mTask, showToasts = true) {
|
||||
finish()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -29,3 +29,14 @@ fun Event.toUtcAllDayEvent() {
|
||||
startTS = Formatter.getShiftedUtcTS(startTS)
|
||||
endTS = Formatter.getShiftedUtcTS(endTS)
|
||||
}
|
||||
|
||||
// this is to make sure the repetition ends on the date set when creating the original event
|
||||
fun Event.maybeAdjustRepeatLimitCount(original: Event, occurrenceTS: Long) {
|
||||
val hasFixedRepeatCount = original.repeatLimit < 0 && repeatLimit < 0
|
||||
val repeatLimitUnchanged = original.repeatLimit == repeatLimit
|
||||
if (hasFixedRepeatCount && repeatLimitUnchanged) {
|
||||
val occurrencesSinceStart = (occurrenceTS - original.startTS) / original.repeatInterval
|
||||
val newRepeatLimit = repeatLimit + occurrencesSinceStart
|
||||
this.repeatLimit = newRepeatLimit
|
||||
}
|
||||
}
|
||||
|
@ -225,9 +225,17 @@ class EventsHelper(val context: Context) {
|
||||
deleteEvents(eventIds, true)
|
||||
}
|
||||
|
||||
fun addEventRepeatLimit(eventId: Long, limitTS: Long) {
|
||||
val time = Formatter.getDateTimeFromTS(limitTS)
|
||||
eventsDB.updateEventRepetitionLimit(limitTS - time.hourOfDay, eventId)
|
||||
fun addEventRepeatLimit(eventId: Long, occurrenceTS: Long) {
|
||||
val event = eventsDB.getEventOrTaskWithId(eventId) ?: return
|
||||
val previousOccurrenceTS = occurrenceTS - event.repeatInterval // always update repeat limit of the occurrence preceding the one being edited
|
||||
val repeatLimitDateTime = Formatter.getDateTimeFromTS(previousOccurrenceTS).withTimeAtStartOfDay()
|
||||
val repeatLimitTS = if (event.getIsAllDay()) {
|
||||
repeatLimitDateTime.seconds()
|
||||
} else {
|
||||
repeatLimitDateTime.withTime(23, 59, 59, 0).seconds()
|
||||
}
|
||||
|
||||
eventsDB.updateEventRepetitionLimit(repeatLimitTS, eventId)
|
||||
context.cancelNotification(eventId)
|
||||
context.cancelPendingIntent(eventId)
|
||||
if (config.caldavSync) {
|
||||
|
@ -145,7 +145,14 @@ class Parser {
|
||||
private fun getRepeatLimitString(event: Event) = when {
|
||||
event.repeatLimit == 0L -> ""
|
||||
event.repeatLimit < 0 -> ";$COUNT=${-event.repeatLimit}"
|
||||
else -> ";$UNTIL=${Formatter.getDayCodeFromTS(event.repeatLimit)}"
|
||||
else -> if (event.getIsAllDay()) {
|
||||
";$UNTIL=${Formatter.getDayCodeFromTS(event.repeatLimit)}"
|
||||
} else {
|
||||
val dateTime = Formatter.getUTCDateTimeFromTS(event.repeatLimit)
|
||||
val dayCode = dateTime.toString(Formatter.DAYCODE_PATTERN)
|
||||
val timeCode = dateTime.toString(Formatter.TIME_PATTERN)
|
||||
";$UNTIL=${dayCode}T${timeCode}Z"
|
||||
}
|
||||
}
|
||||
|
||||
private fun getByMonth(event: Event) = when {
|
||||
|
Loading…
x
Reference in New Issue
Block a user