Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/bitfireAT/ical4android.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRicki Hirner <hirner@bitfire.at>2021-09-11 15:49:04 +0300
committerRicki Hirner <hirner@bitfire.at>2021-09-11 15:49:04 +0300
commit396537a4f8519a31484d4d090ccca25b1fdb42d2 (patch)
tree22c0882b5ee0858ab35dae1bf50dd804eb321eb0
parent8d7b5d4a47a1ff7b8bb8a17aa8f8d3f2359d55f8 (diff)
Attendees: fix problem where attendees with account owner email ("me") was always inserted as organizer; tests
-rw-r--r--src/androidTest/java/at/bitfire/ical4android/AttendeeMappingsTest.kt727
-rw-r--r--src/main/java/at/bitfire/ical4android/AndroidEvent.kt11
-rw-r--r--src/main/java/at/bitfire/ical4android/AttendeeMappings.kt9
-rw-r--r--src/main/java/at/bitfire/ical4android/Event.kt15
-rw-r--r--src/test/java/at/bitfire/ical4android/EventTest.kt24
5 files changed, 778 insertions, 8 deletions
diff --git a/src/androidTest/java/at/bitfire/ical4android/AttendeeMappingsTest.kt b/src/androidTest/java/at/bitfire/ical4android/AttendeeMappingsTest.kt
new file mode 100644
index 0000000..df507e8
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/ical4android/AttendeeMappingsTest.kt
@@ -0,0 +1,727 @@
+package at.bitfire.ical4android
+
+import android.content.ContentValues
+import android.net.Uri
+import android.provider.CalendarContract.Attendees
+import net.fortuna.ical4j.model.Parameter
+import net.fortuna.ical4j.model.parameter.CuType
+import net.fortuna.ical4j.model.parameter.Role
+import net.fortuna.ical4j.model.property.Attendee
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNull
+import org.junit.Test
+
+class AttendeeMappingsTest {
+
+ companion object {
+ const val DEFAULT_ORGANIZER = "organizer@example.com"
+
+ val CuTypeFancy = CuType("X-FANCY")
+ val RoleFancy = Role("X-FANCY")
+ }
+
+
+ @Test
+ fun testAndroidToICalendar_TypeRequired_RelationshipAttendee() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_REQUIRED)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ATTENDEE)
+ }) {
+ assertNull(getParameter(Parameter.CUTYPE))
+ assertNull(getParameter(Parameter.ROLE))
+ }
+ }
+
+ @Test
+ fun testAndroidToICalendar_TypeRequired_RelationshipOrganizer() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_REQUIRED)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ORGANIZER)
+ }) {
+ assertNull(getParameter(Parameter.CUTYPE))
+ assertNull(getParameter(Parameter.ROLE))
+ }
+ }
+
+ @Test
+ fun testAndroidToICalendar_TypeRequired_RelationshipPerformer() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_REQUIRED)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_PERFORMER)
+ }) {
+ assertEquals(CuType.GROUP, getParameter(Parameter.CUTYPE))
+ assertNull(getParameter(Parameter.ROLE))
+ }
+ }
+
+ @Test
+ fun testAndroidToICalendar_TypeRequired_RelationshipSpeaker() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_REQUIRED)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_SPEAKER)
+ }) {
+ assertNull(getParameter(Parameter.CUTYPE))
+ assertEquals(Role.CHAIR, getParameter(Parameter.ROLE))
+ }
+ }
+
+ @Test
+ fun testAndroidToICalendar_TypeRequired_RelationshipNone() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_REQUIRED)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_NONE)
+ }) {
+ assertEquals(CuType.UNKNOWN, getParameter(Parameter.CUTYPE))
+ assertNull(getParameter(Parameter.ROLE))
+ }
+ }
+
+
+ @Test
+ fun testAndroidToICalendar_TypeOptional_RelationshipAttendee() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_OPTIONAL)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ATTENDEE)
+ }) {
+ assertNull(getParameter(Parameter.CUTYPE))
+ assertEquals(Role.OPT_PARTICIPANT, getParameter(Parameter.ROLE))
+ }
+ }
+
+ @Test
+ fun testAndroidToICalendar_TypeOptional_RelationshipOrganizer() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_OPTIONAL)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ORGANIZER)
+ }) {
+ assertNull(getParameter(Parameter.CUTYPE))
+ assertEquals(Role.OPT_PARTICIPANT, getParameter(Parameter.ROLE))
+ }
+ }
+
+ @Test
+ fun testAndroidToICalendar_TypeOptional_RelationshipPerformer() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_OPTIONAL)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_PERFORMER)
+ }) {
+ assertEquals(CuType.GROUP, getParameter(Parameter.CUTYPE))
+ assertEquals(Role.OPT_PARTICIPANT, getParameter(Parameter.ROLE))
+ }
+ }
+
+ @Test
+ fun testAndroidToICalendar_TypeOptional_RelationshipSpeaker() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_OPTIONAL)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_SPEAKER)
+ }) {
+ assertNull(getParameter(Parameter.CUTYPE))
+ assertEquals(Role.CHAIR, getParameter(Parameter.ROLE))
+ }
+ }
+
+ @Test
+ fun testAndroidToICalendar_TypeOptional_RelationshipNone() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_OPTIONAL)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_NONE)
+ }) {
+ assertEquals(CuType.UNKNOWN, getParameter(Parameter.CUTYPE))
+ assertEquals(Role.OPT_PARTICIPANT, getParameter(Parameter.ROLE))
+ }
+ }
+
+
+ @Test
+ fun testAndroidToICalendar_TypeNone_RelationshipAttendee() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_NONE)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ATTENDEE)
+ }) {
+ assertNull(getParameter(Parameter.CUTYPE))
+ assertNull(getParameter(Parameter.ROLE))
+ }
+ }
+
+ @Test
+ fun testAndroidToICalendar_TypeNone_RelationshipOrganizer() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_NONE)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ORGANIZER)
+ }) {
+ assertNull(getParameter(Parameter.CUTYPE))
+ assertNull(getParameter(Parameter.ROLE))
+ }
+ }
+
+ @Test
+ fun testAndroidToICalendar_TypeNone_RelationshipPerformer() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_NONE)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_PERFORMER)
+ }) {
+ assertEquals(CuType.GROUP, getParameter(Parameter.CUTYPE))
+ assertNull(getParameter(Parameter.ROLE))
+ }
+ }
+
+ @Test
+ fun testAndroidToICalendar_TypeNone_RelationshipSpeaker() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_NONE)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_SPEAKER)
+ }) {
+ assertNull(getParameter(Parameter.CUTYPE))
+ assertEquals(Role.CHAIR, getParameter(Parameter.ROLE))
+ }
+ }
+
+ @Test
+ fun testAndroidToICalendar_TypeNone_RelationshipNone() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_NONE)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_NONE)
+ }) {
+ assertEquals(CuType.UNKNOWN, getParameter(Parameter.CUTYPE))
+ assertNull(getParameter(Parameter.ROLE))
+ }
+ }
+
+
+ @Test
+ fun testAndroidToICalendar_TypeResource_RelationshipAttendee() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_RESOURCE)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ATTENDEE)
+ }) {
+ assertEquals(CuType.RESOURCE, getParameter(Parameter.CUTYPE))
+ assertNull(getParameter(Parameter.ROLE))
+ }
+ }
+
+ @Test
+ fun testAndroidToICalendar_TypeResource_RelationshipOrganizer() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_RESOURCE)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ORGANIZER)
+ }) {
+ assertEquals(CuType.RESOURCE, getParameter(Parameter.CUTYPE))
+ assertNull(getParameter(Parameter.ROLE))
+ }
+ }
+
+ @Test
+ fun testAndroidToICalendar_TypeResource_RelationshipPerformer() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_RESOURCE)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_PERFORMER)
+ }) {
+ assertEquals(CuType.ROOM, getParameter(Parameter.CUTYPE))
+ assertNull(getParameter(Parameter.ROLE))
+ }
+ }
+
+ @Test
+ fun testAndroidToICalendar_TypeResource_RelationshipSpeaker() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_RESOURCE)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_SPEAKER)
+ }) {
+ assertEquals(CuType.RESOURCE, getParameter(Parameter.CUTYPE))
+ assertEquals(Role.CHAIR, getParameter(Parameter.ROLE))
+ }
+ }
+
+ @Test
+ fun testAndroidToICalendar_TypeResource_RelationshipNone() {
+ testAndroidToICalendar(ContentValues().apply {
+ put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_RESOURCE)
+ put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_NONE)
+ }) {
+ assertEquals(CuType.RESOURCE, getParameter(Parameter.CUTYPE))
+ assertNull(getParameter(Parameter.ROLE))
+ }
+ }
+
+
+
+ @Test
+ fun testICalendarToAndroid_CuTypeNone_RoleNone() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com")) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeNone_RoleChair() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(Role.CHAIR)
+ }) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_SPEAKER, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeNone_RoleReqParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(Role.REQ_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeNone_RoleOptParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(Role.OPT_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_OPTIONAL, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeNone_RoleNonParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(Role.NON_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_NONE, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeNone_RoleXValue() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(RoleFancy)
+ }) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+
+ @Test
+ fun testICalendarToAndroid_CuTypeIndividual_RoleNone() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.INDIVIDUAL)
+ }) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeIndividual_RoleChair() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.INDIVIDUAL)
+ parameters.add(Role.CHAIR)
+ }) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_SPEAKER, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeIndividual_RoleReqParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.INDIVIDUAL)
+ parameters.add(Role.REQ_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeIndividual_RoleOptParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.INDIVIDUAL)
+ parameters.add(Role.OPT_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_OPTIONAL, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeIndividual_RoleNonParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.INDIVIDUAL)
+ parameters.add(Role.NON_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_NONE, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeIndividual_RoleXValue() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.INDIVIDUAL)
+ parameters.add(RoleFancy)
+ }) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+
+ @Test
+ fun testICalendarToAndroid_CuTypeUnknown_RoleNone() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.UNKNOWN)
+ }) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeUnknown_RoleChair() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.UNKNOWN)
+ parameters.add(Role.CHAIR)
+ }) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_SPEAKER, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeUnknown_RoleReqParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.UNKNOWN)
+ parameters.add(Role.REQ_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeUnknown_RoleOptParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.UNKNOWN)
+ parameters.add(Role.OPT_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_OPTIONAL, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeUnknown_RoleNonParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.UNKNOWN)
+ parameters.add(Role.NON_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_NONE, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeUnknown_RoleXValue() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.UNKNOWN)
+ parameters.add(RoleFancy)
+ }) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+
+ @Test
+ fun testICalendarToAndroid_CuTypeGroup_RoleNone() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.GROUP)
+ }) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeGroup_RoleChair() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.GROUP)
+ parameters.add(Role.CHAIR)
+ }) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_SPEAKER, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeGroup_RoleReqParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.GROUP)
+ parameters.add(Role.REQ_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeGroup_RoleOptParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.GROUP)
+ parameters.add(Role.OPT_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_OPTIONAL, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeGroup_RoleNonParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.GROUP)
+ parameters.add(Role.NON_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_NONE, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeGroup_RoleXValue() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.GROUP)
+ parameters.add(RoleFancy)
+ }) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+
+ @Test
+ fun testICalendarToAndroid_CuTypeResource_RoleNone() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.RESOURCE)
+ }) {
+ assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeResource_RoleChair() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.RESOURCE)
+ parameters.add(Role.CHAIR)
+ }) {
+ assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_SPEAKER, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeResource_RoleReqParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.RESOURCE)
+ parameters.add(Role.REQ_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeResource_RoleOptParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.RESOURCE)
+ parameters.add(Role.OPT_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeResource_RoleNonParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.RESOURCE)
+ parameters.add(Role.NON_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeResource_RoleXValue() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.RESOURCE)
+ parameters.add(RoleFancy)
+ }) {
+ assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+
+ @Test
+ fun testICalendarToAndroid_CuTypeRoom_RoleNone() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.ROOM)
+ }) {
+ assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeRoom_RoleChair() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.ROOM)
+ parameters.add(Role.CHAIR)
+ }) {
+ assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeRoom_RoleReqParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.ROOM)
+ parameters.add(Role.REQ_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeRoom_RoleOptParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.ROOM)
+ parameters.add(Role.OPT_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeRoom_RoleNonParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.ROOM)
+ parameters.add(Role.NON_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeRoom_RoleXValue() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuType.ROOM)
+ parameters.add(RoleFancy)
+ }) {
+ assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+
+ @Test
+ fun testICalendarToAndroid_CuTypeXValue_RoleNone() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuTypeFancy)
+ }) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeXValue_RoleChair() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuTypeFancy)
+ parameters.add(Role.CHAIR)
+ }) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_SPEAKER, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeXValue_RoleReqParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuTypeFancy)
+ parameters.add(Role.REQ_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeXValue_RoleOptParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuTypeFancy)
+ parameters.add(Role.OPT_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_OPTIONAL, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeXValue_RoleNonParticipant() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuTypeFancy)
+ parameters.add(Role.NON_PARTICIPANT)
+ }) {
+ assertEquals(Attendees.TYPE_NONE, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+ @Test
+ fun testICalendarToAndroid_CuTypeXValue_RoleXValue() {
+ testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply {
+ parameters.add(CuTypeFancy)
+ parameters.add(RoleFancy)
+ }) {
+ assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE])
+ assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+
+ @Test
+ fun testICalendarToAndroid_Organizer() {
+ testICalendarToAndroid(Attendee("mailto:$DEFAULT_ORGANIZER")) {
+ assertEquals(Attendees.RELATIONSHIP_ORGANIZER, values[Attendees.ATTENDEE_RELATIONSHIP])
+ }
+ }
+
+
+
+ // helpers
+
+ private fun testICalendarToAndroid(attendee: Attendee, organizer: String = DEFAULT_ORGANIZER, test: (BatchOperation.CpoBuilder).() -> Unit) {
+ val row = BatchOperation.CpoBuilder.newInsert(Uri.EMPTY)
+ AttendeeMappings.iCalendarToAndroid(attendee, row, organizer)
+ test(row)
+ }
+
+ private fun testAndroidToICalendar(values: ContentValues, test: (Attendee).() -> Unit) {
+ val attendee = Attendee()
+ AttendeeMappings.androidToICalendar(values, attendee)
+ test(attendee)
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/at/bitfire/ical4android/AndroidEvent.kt b/src/main/java/at/bitfire/ical4android/AndroidEvent.kt
index 42e748b..e52a3ca 100644
--- a/src/main/java/at/bitfire/ical4android/AndroidEvent.kt
+++ b/src/main/java/at/bitfire/ical4android/AndroidEvent.kt
@@ -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
diff --git a/src/main/java/at/bitfire/ical4android/AttendeeMappings.kt b/src/main/java/at/bitfire/ical4android/AttendeeMappings.kt
index ac90cdf..8c321f2 100644
--- a/src/main/java/at/bitfire/ical4android/AttendeeMappings.kt
+++ b/src/main/java/at/bitfire/ical4android/AttendeeMappings.kt
@@ -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
}
diff --git a/src/main/java/at/bitfire/ical4android/Event.kt b/src/main/java/at/bitfire/ical4android/Event.kt
index da72c1d..c432511 100644
--- a/src/main/java/at/bitfire/ical4android/Event.kt
+++ b/src/main/java/at/bitfire/ical4android/Event.kt
@@ -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
+ }
+
}
diff --git a/src/test/java/at/bitfire/ical4android/EventTest.kt b/src/test/java/at/bitfire/ical4android/EventTest.kt
index 01604af..a2ce504 100644
--- a/src/test/java/at/bitfire/ical4android/EventTest.kt
+++ b/src/test/java/at/bitfire/ical4android/EventTest.kt
@@ -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 {