Merge pull request #2126 from Naveen3Singh/fix_edit_future_occurrences

Properly handle `Update/Delete this and all future occurrences`
This commit is contained in:
Tibor Kaputa 2023-06-25 20:51:41 +02:00 committed by GitHub
commit 8d27660671
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 54 additions and 16 deletions

View File

@ -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()
}
}
}
}

View File

@ -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()
}
}
}
}

View File

@ -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
}
}

View File

@ -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) {

View File

@ -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 {