From 3db07639bf5264bc7a82c902493497f23cd82c75 Mon Sep 17 00:00:00 2001 From: Honk2 Date: Tue, 11 Jan 2022 22:48:36 +0100 Subject: [PATCH 1/2] fix issue 1588 overlapp issue by adding crosswise collision checks --- .../calendar/pro/fragments/WeekFragment.kt | 101 ++++++++++-------- .../calendar/pro/models/EventWeeklyView.kt | 2 +- 2 files changed, 56 insertions(+), 47 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt index da445b7a9..7d670821d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt @@ -33,6 +33,8 @@ import kotlinx.android.synthetic.main.fragment_week.view.* import org.joda.time.DateTime import org.joda.time.Days import java.util.* +import kotlin.collections.ArrayList +import kotlin.collections.LinkedHashMap class WeekFragment : Fragment(), WeeklyCalendar { private val WEEKLY_EVENT_ID_LABEL = "event_id_label" @@ -70,7 +72,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { private var currEvents = ArrayList() private var dayColumns = ArrayList() private var eventTypeColors = LongSparseArray() - private var eventTimeRanges = LinkedHashMap>() + private var eventTimeRanges = LinkedHashMap>() private var currentlyDraggedView: View? = null private lateinit var inflater: LayoutInflater @@ -446,18 +448,60 @@ class WeekFragment : Fragment(), WeeklyCalendar { else -> 1440 } val range = Range(startMinutes, startMinutes + duration) - val eventWeekly = EventWeeklyView(event.id!!, range) + val eventWeekly = EventWeeklyView(range) if (!eventTimeRanges.containsKey(currentDayCode)) { - eventTimeRanges[currentDayCode] = ArrayList() + eventTimeRanges[currentDayCode] = LinkedHashMap() } - eventTimeRanges[currentDayCode]?.add(eventWeekly) + eventTimeRanges[currentDayCode]?.put(event.id!!, eventWeekly) currentDateTime = currentDateTime.plusDays(1) currentDayCode = Formatter.getDayCodeFromDateTime(currentDateTime) } while (currentDayCode.toInt() <= endDayCode.toInt()) } + eventTimeRanges.forEach { daycode, eventDayList -> + var eventsCollisionChecked = ArrayList() + eventDayList.forEach { eventId, eventWeeklyView -> + if (eventWeeklyView.slot == 0) { + eventWeeklyView.slot = 1 + eventWeeklyView.slot_max = 1 + } + + eventsCollisionChecked.add(eventId) + val eventWeeklyViewsToCheck = eventDayList.filter { !eventsCollisionChecked.contains(it.key) } + eventWeeklyViewsToCheck.forEach { toCheckId, eventWeeklyViewToCheck -> + if (eventWeeklyView.range.touch(eventWeeklyViewToCheck.range)) { + if (eventWeeklyViewToCheck.slot == 0) { + val nextSlot = eventWeeklyView.slot_max + 1 + val slotRange = Array(eventWeeklyView.slot_max) {it+1} + val collisionEventWeeklyViews = eventDayList.filter {eventWeeklyView.collisions.contains(it.key)} + collisionEventWeeklyViews.forEach { collision_id, collisionEventWeeklyView -> + if (collisionEventWeeklyView.range.touch(eventWeeklyViewToCheck.range)) { + slotRange[collisionEventWeeklyView.slot - 1] = nextSlot + } + } + slotRange[eventWeeklyView.slot-1] = nextSlot + val slot = slotRange.minOrNull() + eventWeeklyViewToCheck.slot = slot!! + if (slot == nextSlot) { + eventWeeklyViewToCheck.slot_max = nextSlot + eventWeeklyView.slot_max = nextSlot + collisionEventWeeklyViews.forEach { collision_id, collisionEventWeeklyView -> + collisionEventWeeklyView.slot_max++ + } + } + else { + eventWeeklyViewToCheck.slot_max = eventWeeklyView.slot_max + } + } + eventWeeklyView.collisions.add(toCheckId) + eventWeeklyViewToCheck.collisions.add(eventId) + } + } + } + } + dayevents@ for (event in events) { val startDateTime = Formatter.getDateTimeFromTS(event.startTS) val startDayCode = Formatter.getDayCodeFromDateTime(startDateTime) @@ -474,37 +518,11 @@ class WeekFragment : Fragment(), WeeklyCalendar { continue@dayevents } - val startMinutes = when (currentDayCode == startDayCode) { - true -> (startDateTime.minuteOfDay) - else -> 0 - } - val duration = when (currentDayCode == endDayCode) { - true -> (endDateTime.minuteOfDay - startMinutes) - else -> 1440 - } - val range = Range(startMinutes, startMinutes + duration) - var overlappingEvents = 0 - var currentEventOverlapIndex = 0 - var foundCurrentEvent = false - - eventTimeRanges[currentDayCode]!!.forEachIndexed { index, eventWeeklyView -> - if (eventWeeklyView.range.touch(range)) { - overlappingEvents++ - - if (eventWeeklyView.id == event.id) { - foundCurrentEvent = true - } - - if (!foundCurrentEvent) { - currentEventOverlapIndex++ - } - } - } - val dayColumn = dayColumns[dayOfWeek] (inflater.inflate(R.layout.week_event_marker, null, false) as TextView).apply { var backgroundColor = eventTypeColors.get(event.eventType, primaryColor) var textColor = backgroundColor.getContrastColor() + val currentEventWeeklyView = eventTimeRanges[currentDayCode]!!.get(event.id) if (dimPastEvents && event.isPastEvent && !isPrintVersion) { backgroundColor = backgroundColor.adjustAlpha(MEDIUM_ALPHA) textColor = textColor.adjustAlpha(HIGHER_ALPHA) @@ -515,28 +533,19 @@ class WeekFragment : Fragment(), WeeklyCalendar { text = event.title contentDescription = text dayColumn.addView(this) - y = startMinutes * minuteHeight + y = currentEventWeeklyView!!.range.lower * minuteHeight (layoutParams as RelativeLayout.LayoutParams).apply { - width = dayColumn.width - 1 - width /= Math.max(overlappingEvents, 1) - if (overlappingEvents > 1) { - x = width * currentEventOverlapIndex.toFloat() - if (currentEventOverlapIndex != 0) { - x += density - } - + width = (dayColumn.width - 1) / currentEventWeeklyView!!.slot_max + x = (width * (currentEventWeeklyView!!.slot - 1)).toFloat() + if (currentEventWeeklyView!!.slot > 1) { + x += density width -= density - if (currentEventOverlapIndex + 1 != overlappingEvents) { - if (currentEventOverlapIndex != 0) { - width -= density - } - } } minHeight = if (event.startTS == event.endTS) { minimalHeight } else { - (duration * minuteHeight).toInt() - 1 + ((currentEventWeeklyView.range.upper - currentEventWeeklyView.range.lower) * minuteHeight).toInt() - 1 } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/models/EventWeeklyView.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/models/EventWeeklyView.kt index c57b55d5a..bcea00641 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/models/EventWeeklyView.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/models/EventWeeklyView.kt @@ -2,4 +2,4 @@ package com.simplemobiletools.calendar.pro.models import android.util.Range -data class EventWeeklyView(val id: Long, val range: Range) +data class EventWeeklyView(val range: Range, var slot: Int = 0, var slot_max: Int = 0, var collisions: ArrayList = ArrayList()) From a5a9ed667b47ca2b7978ea1d3b0b3d0ae580aa61 Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Wed, 9 Feb 2022 11:25:44 +0100 Subject: [PATCH 2/2] formatting some code and removing warnings --- .../calendar/pro/fragments/WeekFragment.kt | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt index 7d670821d..0c685ea0f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt @@ -461,7 +461,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { } eventTimeRanges.forEach { daycode, eventDayList -> - var eventsCollisionChecked = ArrayList() + val eventsCollisionChecked = ArrayList() eventDayList.forEach { eventId, eventWeeklyView -> if (eventWeeklyView.slot == 0) { eventWeeklyView.slot = 1 @@ -474,14 +474,14 @@ class WeekFragment : Fragment(), WeeklyCalendar { if (eventWeeklyView.range.touch(eventWeeklyViewToCheck.range)) { if (eventWeeklyViewToCheck.slot == 0) { val nextSlot = eventWeeklyView.slot_max + 1 - val slotRange = Array(eventWeeklyView.slot_max) {it+1} - val collisionEventWeeklyViews = eventDayList.filter {eventWeeklyView.collisions.contains(it.key)} + val slotRange = Array(eventWeeklyView.slot_max) { it + 1 } + val collisionEventWeeklyViews = eventDayList.filter { eventWeeklyView.collisions.contains(it.key) } collisionEventWeeklyViews.forEach { collision_id, collisionEventWeeklyView -> if (collisionEventWeeklyView.range.touch(eventWeeklyViewToCheck.range)) { slotRange[collisionEventWeeklyView.slot - 1] = nextSlot } } - slotRange[eventWeeklyView.slot-1] = nextSlot + slotRange[eventWeeklyView.slot - 1] = nextSlot val slot = slotRange.minOrNull() eventWeeklyViewToCheck.slot = slot!! if (slot == nextSlot) { @@ -490,8 +490,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { collisionEventWeeklyViews.forEach { collision_id, collisionEventWeeklyView -> collisionEventWeeklyView.slot_max++ } - } - else { + } else { eventWeeklyViewToCheck.slot_max = eventWeeklyView.slot_max } } @@ -535,9 +534,9 @@ class WeekFragment : Fragment(), WeeklyCalendar { dayColumn.addView(this) y = currentEventWeeklyView!!.range.lower * minuteHeight (layoutParams as RelativeLayout.LayoutParams).apply { - width = (dayColumn.width - 1) / currentEventWeeklyView!!.slot_max - x = (width * (currentEventWeeklyView!!.slot - 1)).toFloat() - if (currentEventWeeklyView!!.slot > 1) { + width = (dayColumn.width - 1) / currentEventWeeklyView.slot_max + x = (width * (currentEventWeeklyView.slot - 1)).toFloat() + if (currentEventWeeklyView.slot > 1) { x += density width -= density }