Loading build.gradle +5 −5 Original line number Original line Diff line number Diff line Loading @@ -17,7 +17,7 @@ buildscript { } } dependencies { dependencies { classpath 'com.android.tools.build:gradle:7.2.2' classpath 'com.android.tools.build:gradle:7.3.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}" classpath "org.jetbrains.dokka:dokka-gradle-plugin:${versions.dokka}" classpath "org.jetbrains.dokka:dokka-gradle-plugin:${versions.dokka}" } } Loading @@ -33,8 +33,8 @@ apply plugin: 'kotlin-android' apply plugin: 'org.jetbrains.dokka' apply plugin: 'org.jetbrains.dokka' android { android { compileSdkVersion 32 compileSdkVersion 33 buildToolsVersion '32.0.0' buildToolsVersion '33.0.0' defaultConfig { defaultConfig { minSdkVersion 21 // Android 5.0 minSdkVersion 21 // Android 5.0 Loading Loading @@ -80,7 +80,7 @@ android { dependencies { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${versions.kotlin}" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${versions.kotlin}" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.6' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.6' // 2.0.0 produces "Unsupported desugared library configuration version, please upgrade the D8/R8 compiler." api("org.mnode.ical4j:ical4j:${versions.ical4j}") { api("org.mnode.ical4j:ical4j:${versions.ical4j}") { // exclude modules which are in conflict with system libraries // exclude modules which are in conflict with system libraries Loading @@ -100,7 +100,7 @@ dependencies { implementation "commons-io:commons-io:${versions.commonsIO}" implementation "commons-io:commons-io:${versions.commonsIO}" implementation 'org.slf4j:slf4j-jdk14:1.7.36' implementation 'org.slf4j:slf4j-jdk14:1.7.36' implementation 'androidx.core:core-ktx:1.8.0' implementation 'androidx.core:core-ktx:1.9.0' androidTestImplementation 'androidx.test:core:1.4.0' androidTestImplementation 'androidx.test:core:1.4.0' androidTestImplementation 'androidx.test:runner:1.4.0' androidTestImplementation 'androidx.test:runner:1.4.0' Loading src/androidTest/java/at/bitfire/ical4android/AndroidCompatTimeZoneRegistryTest.kt +13 −0 Original line number Original line Diff line number Diff line Loading @@ -5,6 +5,7 @@ package at.bitfire.ical4android package at.bitfire.ical4android import net.fortuna.ical4j.model.DefaultTimeZoneRegistryFactory import net.fortuna.ical4j.model.DefaultTimeZoneRegistryFactory import net.fortuna.ical4j.model.TimeZone import net.fortuna.ical4j.model.TimeZoneRegistry import net.fortuna.ical4j.model.TimeZoneRegistry import org.junit.Assert.* import org.junit.Assert.* import org.junit.Assume import org.junit.Assume Loading Loading @@ -41,6 +42,18 @@ class AndroidCompatTimeZoneRegistryTest { ) ) } } @Test fun getTimeZone_Existing_ButNotInIcal4j() { val reg = AndroidCompatTimeZoneRegistry(object: TimeZoneRegistry { override fun register(timezone: TimeZone?) = throw NotImplementedError() override fun register(timezone: TimeZone?, update: Boolean) = throw NotImplementedError() override fun clear() = throw NotImplementedError() override fun getTimeZone(id: String?) = null }) assertNull(reg.getTimeZone("Europe/Berlin")) } @Test @Test fun getTimeZone_Existing_Kiev() { fun getTimeZone_Existing_Kiev() { Assume.assumeFalse(systemKnowsKyiv) Assume.assumeFalse(systemKnowsKyiv) Loading src/androidTest/java/at/bitfire/ical4android/Css3ColorTest.kt +3 −0 Original line number Original line Diff line number Diff line Loading @@ -21,6 +21,9 @@ class Css3ColorTest { // ARGB value // ARGB value assertEquals(0xffffff00.toInt(), Css3Color.colorFromString("#ffffff00")) assertEquals(0xffffff00.toInt(), Css3Color.colorFromString("#ffffff00")) // empty value assertNull(Css3Color.colorFromString("")) // invalid value // invalid value assertNull(Css3Color.colorFromString("DoesNotExist")) assertNull(Css3Color.colorFromString("DoesNotExist")) } } Loading src/androidTest/java/at/bitfire/ical4android/Ical4jTest.kt +2 −2 Original line number Original line Diff line number Diff line Loading @@ -28,12 +28,12 @@ class Ical4jTest { "BEGIN:VEVENT\n" + "BEGIN:VEVENT\n" + "SUMMARY:Test\n" + "SUMMARY:Test\n" + "DTSTART;VALUE=DATE:20200702\n" + "DTSTART;VALUE=DATE:20200702\n" + "ATTENDEE;EMAIL=attendee1@example.com:sample:attendee1\n" + "ATTENDEE;EMAIL=attendee1@example.virtual:sample:attendee1\n" + "END:VEVENT\n" + "END:VEVENT\n" + "END:VCALENDAR" "END:VCALENDAR" ) ) ).first() ).first() assertEquals("attendee1@example.com", e.attendees.first.getParameter<Email>(Parameter.EMAIL).value) assertEquals("attendee1@example.virtual", e.attendees.first.getParameter<Email>(Parameter.EMAIL).value) } } @Test @Test Loading src/androidTest/java/at/bitfire/ical4android/JtxICalObjectTest.kt +8 −5 Original line number Original line Diff line number Diff line Loading @@ -109,7 +109,7 @@ class JtxICalObjectTest { this.dtstamp = System.currentTimeMillis() this.dtstamp = System.currentTimeMillis() this.sequence = 1 this.sequence = 1 this.color = -2298423 this.color = -2298423 this.dirty = false this.dirty = true this.deleted = false this.deleted = false this.fileName = "test.ics" this.fileName = "test.ics" this.eTag = "0" this.eTag = "0" Loading Loading @@ -165,7 +165,6 @@ class JtxICalObjectTest { @Test fun check_SCHEDULETAG() = insertRetrieveAssertString(JtxICalObject.SCHEDULETAG, sample?.scheduleTag, Component.VJOURNAL.name) @Test fun check_SCHEDULETAG() = insertRetrieveAssertString(JtxICalObject.SCHEDULETAG, sample?.scheduleTag, Component.VJOURNAL.name) @Test fun check_FLAGS() = insertRetrieveAssertInt(JtxICalObject.FLAGS, sample?.flags, Component.VJOURNAL.name) @Test fun check_FLAGS() = insertRetrieveAssertInt(JtxICalObject.FLAGS, sample?.flags, Component.VJOURNAL.name) private fun insertRetrieveAssertString(field: String, fieldContent: String?, component: String) { private fun insertRetrieveAssertString(field: String, fieldContent: String?, component: String) { assertNotNull(fieldContent) // fieldContent should not be null, check if the testcase was built correctly assertNotNull(fieldContent) // fieldContent should not be null, check if the testcase was built correctly Loading @@ -184,8 +183,9 @@ class JtxICalObjectTest { } } } } private fun insertRetrieveAssertBoolean(field: String, fieldContent: Boolean?, component: String) { private fun insertRetrieveAssertBoolean(field: String, fieldContent: Boolean?, component: String) { // ATTENTION: getAsBoolean() should not be used as it would interpret "0" and "1" both as false for API-levels < 26 assertNotNull(fieldContent) // fieldContent should not be null, check if the testcase was built correctly assertNotNull(fieldContent) // fieldContent should not be null, check if the testcase was built correctly val cv = ContentValues().apply { val cv = ContentValues().apply { Loading @@ -198,7 +198,9 @@ class JtxICalObjectTest { val itemCV = ContentValues() val itemCV = ContentValues() it.moveToFirst() it.moveToFirst() DatabaseUtils.cursorRowToContentValues(it, itemCV) DatabaseUtils.cursorRowToContentValues(it, itemCV) assertEquals(fieldContent, itemCV.getAsBoolean(field)) val retrievedFieldContent = itemCV.getAsString(field) val retrievedFieldBoolean = retrievedFieldContent == "1" || retrievedFieldContent == "true" assertEquals(fieldContent, retrievedFieldBoolean) } } } } Loading Loading @@ -381,7 +383,8 @@ class JtxICalObjectTest { assertEquals(attendee.member, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.MEMBER)) assertEquals(attendee.member, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.MEMBER)) assertEquals(attendee.partstat, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.PARTSTAT)) assertEquals(attendee.partstat, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.PARTSTAT)) assertEquals(attendee.role, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.ROLE)) assertEquals(attendee.role, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.ROLE)) assertEquals(attendee.rsvp, retrievedAttendeeCV.getAsBoolean(JtxContract.JtxAttendee.RSVP)) assertEquals(attendee.rsvp, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.RSVP) == "1" || retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.RSVP) == "true") assertEquals(attendee.delegatedfrom, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.DELEGATEDFROM)) assertEquals(attendee.delegatedfrom, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.DELEGATEDFROM)) assertEquals(attendee.delegatedto, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.DELEGATEDTO)) assertEquals(attendee.delegatedto, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.DELEGATEDTO)) assertEquals(attendee.sentby, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.SENTBY)) assertEquals(attendee.sentby, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.SENTBY)) Loading Loading
build.gradle +5 −5 Original line number Original line Diff line number Diff line Loading @@ -17,7 +17,7 @@ buildscript { } } dependencies { dependencies { classpath 'com.android.tools.build:gradle:7.2.2' classpath 'com.android.tools.build:gradle:7.3.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}" classpath "org.jetbrains.dokka:dokka-gradle-plugin:${versions.dokka}" classpath "org.jetbrains.dokka:dokka-gradle-plugin:${versions.dokka}" } } Loading @@ -33,8 +33,8 @@ apply plugin: 'kotlin-android' apply plugin: 'org.jetbrains.dokka' apply plugin: 'org.jetbrains.dokka' android { android { compileSdkVersion 32 compileSdkVersion 33 buildToolsVersion '32.0.0' buildToolsVersion '33.0.0' defaultConfig { defaultConfig { minSdkVersion 21 // Android 5.0 minSdkVersion 21 // Android 5.0 Loading Loading @@ -80,7 +80,7 @@ android { dependencies { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${versions.kotlin}" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${versions.kotlin}" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.6' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.6' // 2.0.0 produces "Unsupported desugared library configuration version, please upgrade the D8/R8 compiler." api("org.mnode.ical4j:ical4j:${versions.ical4j}") { api("org.mnode.ical4j:ical4j:${versions.ical4j}") { // exclude modules which are in conflict with system libraries // exclude modules which are in conflict with system libraries Loading @@ -100,7 +100,7 @@ dependencies { implementation "commons-io:commons-io:${versions.commonsIO}" implementation "commons-io:commons-io:${versions.commonsIO}" implementation 'org.slf4j:slf4j-jdk14:1.7.36' implementation 'org.slf4j:slf4j-jdk14:1.7.36' implementation 'androidx.core:core-ktx:1.8.0' implementation 'androidx.core:core-ktx:1.9.0' androidTestImplementation 'androidx.test:core:1.4.0' androidTestImplementation 'androidx.test:core:1.4.0' androidTestImplementation 'androidx.test:runner:1.4.0' androidTestImplementation 'androidx.test:runner:1.4.0' Loading
src/androidTest/java/at/bitfire/ical4android/AndroidCompatTimeZoneRegistryTest.kt +13 −0 Original line number Original line Diff line number Diff line Loading @@ -5,6 +5,7 @@ package at.bitfire.ical4android package at.bitfire.ical4android import net.fortuna.ical4j.model.DefaultTimeZoneRegistryFactory import net.fortuna.ical4j.model.DefaultTimeZoneRegistryFactory import net.fortuna.ical4j.model.TimeZone import net.fortuna.ical4j.model.TimeZoneRegistry import net.fortuna.ical4j.model.TimeZoneRegistry import org.junit.Assert.* import org.junit.Assert.* import org.junit.Assume import org.junit.Assume Loading Loading @@ -41,6 +42,18 @@ class AndroidCompatTimeZoneRegistryTest { ) ) } } @Test fun getTimeZone_Existing_ButNotInIcal4j() { val reg = AndroidCompatTimeZoneRegistry(object: TimeZoneRegistry { override fun register(timezone: TimeZone?) = throw NotImplementedError() override fun register(timezone: TimeZone?, update: Boolean) = throw NotImplementedError() override fun clear() = throw NotImplementedError() override fun getTimeZone(id: String?) = null }) assertNull(reg.getTimeZone("Europe/Berlin")) } @Test @Test fun getTimeZone_Existing_Kiev() { fun getTimeZone_Existing_Kiev() { Assume.assumeFalse(systemKnowsKyiv) Assume.assumeFalse(systemKnowsKyiv) Loading
src/androidTest/java/at/bitfire/ical4android/Css3ColorTest.kt +3 −0 Original line number Original line Diff line number Diff line Loading @@ -21,6 +21,9 @@ class Css3ColorTest { // ARGB value // ARGB value assertEquals(0xffffff00.toInt(), Css3Color.colorFromString("#ffffff00")) assertEquals(0xffffff00.toInt(), Css3Color.colorFromString("#ffffff00")) // empty value assertNull(Css3Color.colorFromString("")) // invalid value // invalid value assertNull(Css3Color.colorFromString("DoesNotExist")) assertNull(Css3Color.colorFromString("DoesNotExist")) } } Loading
src/androidTest/java/at/bitfire/ical4android/Ical4jTest.kt +2 −2 Original line number Original line Diff line number Diff line Loading @@ -28,12 +28,12 @@ class Ical4jTest { "BEGIN:VEVENT\n" + "BEGIN:VEVENT\n" + "SUMMARY:Test\n" + "SUMMARY:Test\n" + "DTSTART;VALUE=DATE:20200702\n" + "DTSTART;VALUE=DATE:20200702\n" + "ATTENDEE;EMAIL=attendee1@example.com:sample:attendee1\n" + "ATTENDEE;EMAIL=attendee1@example.virtual:sample:attendee1\n" + "END:VEVENT\n" + "END:VEVENT\n" + "END:VCALENDAR" "END:VCALENDAR" ) ) ).first() ).first() assertEquals("attendee1@example.com", e.attendees.first.getParameter<Email>(Parameter.EMAIL).value) assertEquals("attendee1@example.virtual", e.attendees.first.getParameter<Email>(Parameter.EMAIL).value) } } @Test @Test Loading
src/androidTest/java/at/bitfire/ical4android/JtxICalObjectTest.kt +8 −5 Original line number Original line Diff line number Diff line Loading @@ -109,7 +109,7 @@ class JtxICalObjectTest { this.dtstamp = System.currentTimeMillis() this.dtstamp = System.currentTimeMillis() this.sequence = 1 this.sequence = 1 this.color = -2298423 this.color = -2298423 this.dirty = false this.dirty = true this.deleted = false this.deleted = false this.fileName = "test.ics" this.fileName = "test.ics" this.eTag = "0" this.eTag = "0" Loading Loading @@ -165,7 +165,6 @@ class JtxICalObjectTest { @Test fun check_SCHEDULETAG() = insertRetrieveAssertString(JtxICalObject.SCHEDULETAG, sample?.scheduleTag, Component.VJOURNAL.name) @Test fun check_SCHEDULETAG() = insertRetrieveAssertString(JtxICalObject.SCHEDULETAG, sample?.scheduleTag, Component.VJOURNAL.name) @Test fun check_FLAGS() = insertRetrieveAssertInt(JtxICalObject.FLAGS, sample?.flags, Component.VJOURNAL.name) @Test fun check_FLAGS() = insertRetrieveAssertInt(JtxICalObject.FLAGS, sample?.flags, Component.VJOURNAL.name) private fun insertRetrieveAssertString(field: String, fieldContent: String?, component: String) { private fun insertRetrieveAssertString(field: String, fieldContent: String?, component: String) { assertNotNull(fieldContent) // fieldContent should not be null, check if the testcase was built correctly assertNotNull(fieldContent) // fieldContent should not be null, check if the testcase was built correctly Loading @@ -184,8 +183,9 @@ class JtxICalObjectTest { } } } } private fun insertRetrieveAssertBoolean(field: String, fieldContent: Boolean?, component: String) { private fun insertRetrieveAssertBoolean(field: String, fieldContent: Boolean?, component: String) { // ATTENTION: getAsBoolean() should not be used as it would interpret "0" and "1" both as false for API-levels < 26 assertNotNull(fieldContent) // fieldContent should not be null, check if the testcase was built correctly assertNotNull(fieldContent) // fieldContent should not be null, check if the testcase was built correctly val cv = ContentValues().apply { val cv = ContentValues().apply { Loading @@ -198,7 +198,9 @@ class JtxICalObjectTest { val itemCV = ContentValues() val itemCV = ContentValues() it.moveToFirst() it.moveToFirst() DatabaseUtils.cursorRowToContentValues(it, itemCV) DatabaseUtils.cursorRowToContentValues(it, itemCV) assertEquals(fieldContent, itemCV.getAsBoolean(field)) val retrievedFieldContent = itemCV.getAsString(field) val retrievedFieldBoolean = retrievedFieldContent == "1" || retrievedFieldContent == "true" assertEquals(fieldContent, retrievedFieldBoolean) } } } } Loading Loading @@ -381,7 +383,8 @@ class JtxICalObjectTest { assertEquals(attendee.member, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.MEMBER)) assertEquals(attendee.member, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.MEMBER)) assertEquals(attendee.partstat, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.PARTSTAT)) assertEquals(attendee.partstat, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.PARTSTAT)) assertEquals(attendee.role, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.ROLE)) assertEquals(attendee.role, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.ROLE)) assertEquals(attendee.rsvp, retrievedAttendeeCV.getAsBoolean(JtxContract.JtxAttendee.RSVP)) assertEquals(attendee.rsvp, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.RSVP) == "1" || retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.RSVP) == "true") assertEquals(attendee.delegatedfrom, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.DELEGATEDFROM)) assertEquals(attendee.delegatedfrom, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.DELEGATEDFROM)) assertEquals(attendee.delegatedto, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.DELEGATEDTO)) assertEquals(attendee.delegatedto, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.DELEGATEDTO)) assertEquals(attendee.sentby, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.SENTBY)) assertEquals(attendee.sentby, retrievedAttendeeCV.getAsString(JtxContract.JtxAttendee.SENTBY)) Loading