Skip to content

Commit 25998aa

Browse files
committed
Properly handle repeating events
1 parent 6c3f833 commit 25998aa

2 files changed

Lines changed: 20 additions & 10 deletions

File tree

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

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -115,16 +115,17 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
115115
}
116116

117117
private fun groupAllEvents() {
118-
days.forEach {
119-
val day = it
120-
day.dayEvents.forEach {
121-
val event = it
118+
days.forEach { day ->
122119

120+
day.dayEvents.forEach { event ->
123121
// make sure we properly handle events lasting multiple days and repeating ones
124122
val lastEvent = allEvents.lastOrNull { it.id == event.id }
125123
val daysCnt = getEventLastingDaysCount(event)
126124
val validDayEvent = isDayValid(event, day.code)
127-
if ((lastEvent == null || lastEvent.startDayIndex + daysCnt <= day.indexOnMonthView) && !validDayEvent) {
125+
126+
val lastDay = { findLastDay(event) ?: day }
127+
128+
if ((lastEvent == null || lastEvent.startDayIndex + daysCnt <= lastDay().indexOnMonthView) && !validDayEvent) {
128129
val monthViewEvent = MonthViewEvent(
129130
event.id!!, event.title, event.startTS, event.endTS, event.color, day.indexOnMonthView,
130131
daysCnt, day.indexOnMonthView, event.getIsAllDay(), event.isPastEvent, event.isTask(), event.isTaskCompleted()
@@ -135,8 +136,9 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
135136
}
136137

137138
allEvents =
138-
allEvents.asSequence().sortedWith(compareBy({ -it.daysCnt }, { !it.isAllDay }, { it.startTS }, { it.endTS }, { it.startDayIndex }, { it.title }))
139-
.toMutableList() as ArrayList<MonthViewEvent>
139+
allEvents.asSequence().sortedWith(
140+
compareBy({ -it.daysCnt }, { !it.isAllDay }, { it.startTS }, { it.endTS }, { it.startDayIndex }, { it.title })
141+
).toMutableList() as ArrayList<MonthViewEvent>
140142
}
141143

142144
override fun onDraw(canvas: Canvas) {
@@ -287,7 +289,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
287289
}
288290

289291
val startDayIndex = days[event.originalStartDayIndex]
290-
val endDayIndex = days[Math.min(event.startDayIndex + event.daysCnt - 1, 41)]
292+
val endDayIndex = days[min(event.startDayIndex + event.daysCnt - 1, 41)]
291293
bgRectF.set(bgLeft, bgTop, bgRight, bgBottom)
292294
canvas.drawRoundRect(bgRectF, BG_CORNER_RADIUS, BG_CORNER_RADIUS, getEventBackgroundColor(event, startDayIndex, endDayIndex))
293295

@@ -303,7 +305,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
303305

304306
drawEventTitle(event, canvas, xPos + taskIconWidth, yPos + verticalOffset, bgRight - bgLeft - smallPadding - taskIconWidth, specificEventTitlePaint)
305307

306-
for (i in 0 until Math.min(event.daysCnt, 7 - event.startDayIndex % 7)) {
308+
for (i in 0 until min(event.daysCnt, 7 - event.startDayIndex % 7)) {
307309
dayVerticalOffsets.put(event.startDayIndex + i, verticalOffset + eventTitleHeight + smallPadding * 2)
308310
}
309311
}
@@ -431,6 +433,11 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
431433
return event.startTS != event.endTS && Formatter.getDateTimeFromTS(event.endTS) == Formatter.getDateTimeFromTS(date.seconds()).withTimeAtStartOfDay()
432434
}
433435

436+
private fun findLastDay(event: Event) =
437+
days.lastOrNull { day ->
438+
day.dayEvents.find { it.id == event.id } != null
439+
}
440+
434441
fun togglePrintMode() {
435442
isPrintVersion = !isPrintVersion
436443
textColor = if (isPrintVersion) {

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,10 @@ class MonthViewWrapper(context: Context, attrs: AttributeSet, defStyle: Int) : F
5959
continue
6060
}
6161

62-
child.measure(MeasureSpec.makeMeasureSpec(dayWidth.toInt(), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dayHeight.toInt(), MeasureSpec.EXACTLY))
62+
child.measure(
63+
MeasureSpec.makeMeasureSpec(dayWidth.toInt(), MeasureSpec.EXACTLY),
64+
MeasureSpec.makeMeasureSpec(dayHeight.toInt(), MeasureSpec.EXACTLY)
65+
)
6366

6467
val childLeft = x * dayWidth + horizontalOffset - child.translationX
6568
val childTop = y * dayHeight + weekDaysLetterHeight - child.translationY

0 commit comments

Comments
 (0)