Skip to content

Commit e545f37

Browse files
authored
Merge pull request #1731 from Naveen3Singh/fix_repeating_events
Properly handle repeating and overlapping events
2 parents 479a756 + 69ddc43 commit e545f37

1 file changed

Lines changed: 13 additions & 11 deletions

File tree

  • app/src/main/kotlin/com/simplemobiletools/calendar/pro/views

app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/MonthView.kt

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -116,16 +116,24 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
116116

117117
private fun groupAllEvents() {
118118
days.forEach { day ->
119+
val dayIndexOnMonthView = day.indexOnMonthView
120+
119121
day.dayEvents.forEach { event ->
120122
// make sure we properly handle events lasting multiple days and repeating ones
121-
val lastEvent = allEvents.lastOrNull { it.id == event.id }
122-
val daysCnt = getEventLastingDaysCount(event)
123123
val validDayEvent = isDayValid(event, day.code)
124+
val lastEvent = allEvents.lastOrNull { it.id == event.id }
125+
val notYetAddedOrIsRepeatingEvent = lastEvent == null || lastEvent.endTS <= event.startTS
126+
127+
// handle overlapping repeating events e.g. an event that lasts 3 days, but repeats every 2 days has a one day overlap
128+
val canOverlap = event.endTS - event.startTS > event.repeatInterval
129+
val shouldAddEvent = notYetAddedOrIsRepeatingEvent || canOverlap && (lastEvent!!.startTS < event.startTS)
130+
131+
if (shouldAddEvent && !validDayEvent) {
132+
val daysCnt = getEventLastingDaysCount(event)
124133

125-
if ((lastEvent == null || lastEvent.startDayIndex + daysCnt <= findLastDay(event).indexOnMonthView) && !validDayEvent) {
126134
val monthViewEvent = MonthViewEvent(
127-
event.id!!, event.title, event.startTS, event.endTS, event.color, day.indexOnMonthView,
128-
daysCnt, day.indexOnMonthView, event.getIsAllDay(), event.isPastEvent, event.isTask(), event.isTaskCompleted()
135+
event.id!!, event.title, event.startTS, event.endTS, event.color, dayIndexOnMonthView,
136+
daysCnt, dayIndexOnMonthView, event.getIsAllDay(), event.isPastEvent, event.isTask(), event.isTaskCompleted()
129137
)
130138
allEvents.add(monthViewEvent)
131139
}
@@ -429,12 +437,6 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
429437
return event.startTS != event.endTS && Formatter.getDateTimeFromTS(event.endTS) == Formatter.getDateTimeFromTS(date.seconds()).withTimeAtStartOfDay()
430438
}
431439

432-
private fun findLastDay(event: Event): DayMonthly {
433-
return days.last { day ->
434-
day.dayEvents.find { it.id == event.id } != null
435-
}
436-
}
437-
438440
fun togglePrintMode() {
439441
isPrintVersion = !isPrintVersion
440442
textColor = if (isPrintVersion) {

0 commit comments

Comments
 (0)