Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 396537a4 authored by Ricki Hirner's avatar Ricki Hirner
Browse files

Attendees: fix problem where attendees with account owner email ("me") was...

Attendees: fix problem where attendees with account owner email ("me") was always inserted as organizer; tests
parent 8d7b5d4a
Loading
Loading
Loading
Loading
+727 −0

File added.

Preview size limit exceeded, changes collapsed.

+7 −4
Original line number Diff line number Diff line
@@ -534,7 +534,10 @@ abstract class AndroidEvent(
        event.alarms.forEach { insertReminder(batch, idxEvent, it) }

        // add attendees
        event.attendees.forEach { insertAttendee(batch, idxEvent, it) }
        val organizer = event.organizerEmail ?:
                /* no ORGANIZER, use current account owner as ORGANIZER */
                calendar.ownerAccount ?: calendar.account.name
        event.attendees.forEach { insertAttendee(batch, idxEvent, it, organizer) }

        // add extended properties
        // CATEGORIES
@@ -610,7 +613,7 @@ abstract class AndroidEvent(
            exception.alarms.forEach { insertReminder(batch, idxException, it) }

            // add exception attendees
            exception.attendees.forEach { insertAttendee(batch, idxException, it) }
            exception.attendees.forEach { insertAttendee(batch, idxException, it, organizer) }
        }

        return idxEvent
@@ -911,7 +914,7 @@ abstract class AndroidEvent(
        batch.enqueue(builder)
    }

    protected open fun insertAttendee(batch: BatchOperation, idxEvent: Int?, attendee: Attendee) {
    protected open fun insertAttendee(batch: BatchOperation, idxEvent: Int?, attendee: Attendee, organizer: String) {
        val builder = CpoBuilder
                .newInsert(calendar.syncAdapterURI(Attendees.CONTENT_URI))
                .withEventId(Attendees.EVENT_ID, idxEvent)
@@ -935,7 +938,7 @@ abstract class AndroidEvent(
        }

        // type/relation mapping is complex and thus outsourced to AttendeeMappings
        AttendeeMappings.iCalendarToAndroid(attendee, builder, calendar.ownerAccount ?: calendar.account.name)
        AttendeeMappings.iCalendarToAndroid(attendee, builder, organizer)

        val status = when(attendee.getParameter(Parameter.PARTSTAT) as? PartStat) {
            PartStat.ACCEPTED     -> Attendees.ATTENDEE_STATUS_ACCEPTED
+5 −4
Original line number Diff line number Diff line
@@ -95,14 +95,14 @@ object AttendeeMappings {
     *     ¹ custom/unknown ROLE values must be treated as REQ-PARTICIPANT
     *     ² custom/unknown CUTYPE values must be treated as UNKNOWN
     *
     *  When [attendee] is the ORGANIZER, [CalendarContract.Attendees.ATTENDEE_RELATIONSHIP] = RELATIONSHIP_ATTENDEE
     *  When [attendee] is the [organizer], [CalendarContract.Attendees.ATTENDEE_RELATIONSHIP] = RELATIONSHIP_ATTENDEE
     *  is replaced by [CalendarContract.Attendees.RELATIONSHIP_ORGANIZER].
     *
     * @param attendee   iCalendar attendee to map
     * @param row        builder for the Android attendee row
     * @param owner      email address of account owner ([CalendarContract.Calendars.OWNER_ACCOUNT]); used to determine whether [attendee] is the organizer
     * @param organizer  email address of iCalendar ORGANIZER; used to determine whether [attendee] is the organizer
     */
    fun iCalendarToAndroid(attendee: Attendee, row: BatchOperation.CpoBuilder, owner: String) {
    fun iCalendarToAndroid(attendee: Attendee, row: BatchOperation.CpoBuilder, organizer: String) {
        val type: Int
        var relationship: Int

@@ -155,7 +155,8 @@ object AttendeeMappings {
                uri.schemeSpecificPart
            else
                attendee.getParameter<Email>(Parameter.EMAIL)?.value
            if (email == owner)

            if (email == organizer)
                relationship = Attendees.RELATIONSHIP_ORGANIZER
        }

+15 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ import net.fortuna.ical4j.model.Calendar
import net.fortuna.ical4j.model.TimeZone
import net.fortuna.ical4j.model.component.VAlarm
import net.fortuna.ical4j.model.component.VEvent
import net.fortuna.ical4j.model.parameter.Email
import net.fortuna.ical4j.model.property.*
import java.io.IOException
import java.io.OutputStream
@@ -316,4 +317,18 @@ class Event: ICalendar() {
        return event
    }


    val organizerEmail: String?
    get() {
        var email: String? = null
        organizer?.let { organizer ->
            val uri = organizer.calAddress
            email = if (uri.scheme.equals("mailto", true))
                uri.schemeSpecificPart
            else
                organizer.getParameter<Email>(Parameter.EMAIL)?.value
        }
        return email
    }

}
+24 −0
Original line number Diff line number Diff line
@@ -280,6 +280,30 @@ class EventTest {
    }


    // methods / fields

    @Test
    fun testOrganizerEmail_None() {
        assertNull(Event().organizerEmail)
    }

    @Test
    fun testOrganizerEmail_EmailParameter() {
        assertEquals("organizer@example.com", Event().apply {
            organizer = Organizer("SomeFancyOrganizer").apply {
                parameters.add(Email("organizer@example.com"))
            }
        }.organizerEmail)
    }

    @Test
    fun testOrganizerEmail_MailtoValue() {
        assertEquals("organizer@example.com", Event().apply {
            organizer = Organizer("mailto:organizer@example.com")
        }.organizerEmail)
    }


    // helpers

    private fun findEvent(events: Iterable<Event>, uid: String): Event {