diff --git a/lib/src/main/kotlin/at/bitfire/ical4android/Event.kt b/lib/src/main/kotlin/at/bitfire/ical4android/Event.kt index 6e97f02e..8c0a8420 100644 --- a/lib/src/main/kotlin/at/bitfire/ical4android/Event.kt +++ b/lib/src/main/kotlin/at/bitfire/ical4android/Event.kt @@ -243,8 +243,6 @@ data class Event( fun write(os: OutputStream) { - Ical4Android.checkThreadContextClassLoader() - val ical = Calendar() ical.properties += Version.VERSION_2_0 ical.properties += prodId() diff --git a/lib/src/main/kotlin/at/bitfire/ical4android/ICalendar.kt b/lib/src/main/kotlin/at/bitfire/ical4android/ICalendar.kt index 6d1772e7..a450cf24 100644 --- a/lib/src/main/kotlin/at/bitfire/ical4android/ICalendar.kt +++ b/lib/src/main/kotlin/at/bitfire/ical4android/ICalendar.kt @@ -4,6 +4,7 @@ package at.bitfire.ical4android +import at.bitfire.ical4android.ICalendar.Companion.CALENDAR_NAME import at.bitfire.ical4android.validation.ICalPreprocessor import net.fortuna.ical4j.data.CalendarBuilder import net.fortuna.ical4j.data.CalendarParserFactory @@ -80,7 +81,6 @@ open class ICalendar { * @throws IllegalArgumentException when the iCalendar resource contains an invalid value */ fun fromReader(reader: Reader, properties: MutableMap? = null): Calendar { - Ical4Android.checkThreadContextClassLoader() logger.fine("Parsing iCalendar stream") // preprocess stream to work around some problems that can't be fixed later @@ -229,7 +229,6 @@ open class ICalendar { * @return time zone id (TZID) if VTIMEZONE contains a TZID, null otherwise */ fun timezoneDefToTzId(timezoneDef: String): String? { - Ical4Android.checkThreadContextClassLoader() try { val builder = CalendarBuilder() val cal = builder.build(StringReader(timezoneDef)) diff --git a/lib/src/main/kotlin/at/bitfire/ical4android/Ical4Android.kt b/lib/src/main/kotlin/at/bitfire/ical4android/Ical4jVersion.kt similarity index 50% rename from lib/src/main/kotlin/at/bitfire/ical4android/Ical4Android.kt rename to lib/src/main/kotlin/at/bitfire/ical4android/Ical4jVersion.kt index fdd8c695..17ee850b 100644 --- a/lib/src/main/kotlin/at/bitfire/ical4android/Ical4Android.kt +++ b/lib/src/main/kotlin/at/bitfire/ical4android/Ical4jVersion.kt @@ -4,15 +4,8 @@ package at.bitfire.ical4android +/** + * The used version of ical4j. + */ @Suppress("unused") -object Ical4Android { - - const val ical4jVersion = BuildConfig.version_ical4j - - - fun checkThreadContextClassLoader() { - if (Thread.currentThread().contextClassLoader == null) - throw IllegalStateException("Thread.currentThread().contextClassLoader must be set for java.util.ServiceLoader (used by ical4j)") - } - -} \ No newline at end of file +const val ical4jVersion = BuildConfig.version_ical4j diff --git a/lib/src/main/kotlin/at/bitfire/ical4android/JtxICalObject.kt b/lib/src/main/kotlin/at/bitfire/ical4android/JtxICalObject.kt index 6b2ef777..6b9af310 100644 --- a/lib/src/main/kotlin/at/bitfire/ical4android/JtxICalObject.kt +++ b/lib/src/main/kotlin/at/bitfire/ical4android/JtxICalObject.kt @@ -47,7 +47,42 @@ import net.fortuna.ical4j.model.parameter.Rsvp import net.fortuna.ical4j.model.parameter.SentBy import net.fortuna.ical4j.model.parameter.Value import net.fortuna.ical4j.model.parameter.XParameter -import net.fortuna.ical4j.model.property.* +import net.fortuna.ical4j.model.property.Action +import net.fortuna.ical4j.model.property.Attach +import net.fortuna.ical4j.model.property.Categories +import net.fortuna.ical4j.model.property.Clazz +import net.fortuna.ical4j.model.property.Color +import net.fortuna.ical4j.model.property.Comment +import net.fortuna.ical4j.model.property.Completed +import net.fortuna.ical4j.model.property.Contact +import net.fortuna.ical4j.model.property.Created +import net.fortuna.ical4j.model.property.Description +import net.fortuna.ical4j.model.property.DtEnd +import net.fortuna.ical4j.model.property.DtStamp +import net.fortuna.ical4j.model.property.DtStart +import net.fortuna.ical4j.model.property.Due +import net.fortuna.ical4j.model.property.Duration +import net.fortuna.ical4j.model.property.ExDate +import net.fortuna.ical4j.model.property.Geo +import net.fortuna.ical4j.model.property.LastModified +import net.fortuna.ical4j.model.property.Location +import net.fortuna.ical4j.model.property.PercentComplete +import net.fortuna.ical4j.model.property.Priority +import net.fortuna.ical4j.model.property.ProdId +import net.fortuna.ical4j.model.property.RDate +import net.fortuna.ical4j.model.property.RRule +import net.fortuna.ical4j.model.property.RecurrenceId +import net.fortuna.ical4j.model.property.RelatedTo +import net.fortuna.ical4j.model.property.Repeat +import net.fortuna.ical4j.model.property.Resources +import net.fortuna.ical4j.model.property.Sequence +import net.fortuna.ical4j.model.property.Status +import net.fortuna.ical4j.model.property.Summary +import net.fortuna.ical4j.model.property.Trigger +import net.fortuna.ical4j.model.property.Uid +import net.fortuna.ical4j.model.property.Url +import net.fortuna.ical4j.model.property.Version +import net.fortuna.ical4j.model.property.XProperty import java.io.FileNotFoundException import java.io.IOException import java.io.OutputStream @@ -593,8 +628,6 @@ open class JtxICalObject( * @return The current JtxICalObject transformed into a ical4j Calendar */ fun getICalendarFormat(): Calendar? { - Ical4Android.checkThreadContextClassLoader() - val ical = Calendar() ical.properties += Version.VERSION_2_0 ical.properties += ICalendar.prodId(listOf(TaskProvider.ProviderName.JtxBoard.packageName)) @@ -697,7 +730,6 @@ open class JtxICalObject( * @param [os] OutputStream where iCalendar should be written to */ fun write(os: OutputStream) { - Ical4Android.checkThreadContextClassLoader() CalendarOutputter(false).output(this.getICalendarFormat(), os) } diff --git a/lib/src/main/kotlin/at/bitfire/ical4android/Task.kt b/lib/src/main/kotlin/at/bitfire/ical4android/Task.kt index 2a1172ad..900a9be1 100644 --- a/lib/src/main/kotlin/at/bitfire/ical4android/Task.kt +++ b/lib/src/main/kotlin/at/bitfire/ical4android/Task.kt @@ -193,8 +193,6 @@ data class Task( fun write(os: OutputStream) { - Ical4Android.checkThreadContextClassLoader() - val ical = Calendar() ical.properties += Version.VERSION_2_0 ical.properties += prodId() diff --git a/lib/src/main/kotlin/at/bitfire/ical4android/util/AndroidTimeUtils.kt b/lib/src/main/kotlin/at/bitfire/ical4android/util/AndroidTimeUtils.kt index 653622a0..67ff8dc0 100644 --- a/lib/src/main/kotlin/at/bitfire/ical4android/util/AndroidTimeUtils.kt +++ b/lib/src/main/kotlin/at/bitfire/ical4android/util/AndroidTimeUtils.kt @@ -7,11 +7,14 @@ package at.bitfire.ical4android.util import android.text.format.Time -import at.bitfire.ical4android.Ical4Android +import at.bitfire.ical4android.util.AndroidTimeUtils.androidifyTimeZone +import at.bitfire.ical4android.util.AndroidTimeUtils.storageTzId import at.bitfire.ical4android.util.TimeApiExtensions.toLocalDate import at.bitfire.ical4android.util.TimeApiExtensions.toZonedDateTime -import net.fortuna.ical4j.model.* import net.fortuna.ical4j.model.Date +import net.fortuna.ical4j.model.DateList +import net.fortuna.ical4j.model.DateTime +import net.fortuna.ical4j.model.TemporalAmountAdapter import net.fortuna.ical4j.model.TimeZone import net.fortuna.ical4j.model.parameter.Value import net.fortuna.ical4j.model.property.DateListProperty @@ -27,7 +30,8 @@ import java.time.ZoneOffset import java.time.ZonedDateTime import java.time.format.DateTimeFormatter import java.time.temporal.TemporalAmount -import java.util.* +import java.util.LinkedList +import java.util.Locale import java.util.logging.Logger object AndroidTimeUtils { diff --git a/lib/src/main/kotlin/at/bitfire/ical4android/util/DateUtils.kt b/lib/src/main/kotlin/at/bitfire/ical4android/util/DateUtils.kt index a19a9c02..26793f12 100644 --- a/lib/src/main/kotlin/at/bitfire/ical4android/util/DateUtils.kt +++ b/lib/src/main/kotlin/at/bitfire/ical4android/util/DateUtils.kt @@ -4,7 +4,6 @@ package at.bitfire.ical4android.util -import at.bitfire.ical4android.Ical4Android import net.fortuna.ical4j.data.CalendarBuilder import net.fortuna.ical4j.model.Date import net.fortuna.ical4j.model.DateTime @@ -24,10 +23,6 @@ import java.util.logging.Logger */ object DateUtils { - init { - Ical4Android.checkThreadContextClassLoader() - } - private val logger get() = Logger.getLogger(javaClass.name) @@ -130,8 +125,6 @@ object DateUtils { * @return parsed [VTimeZone], or `null` when the timezone definition can't be parsed */ fun parseVTimeZone(timezoneDef: String): VTimeZone? { - Ical4Android.checkThreadContextClassLoader() - val builder = CalendarBuilder(tzRegistry) try { val cal = builder.build(StringReader(timezoneDef)) diff --git a/lib/src/test/kotlin/at/bitfire/ical4android/Ical4jServiceLoaderTest.kt b/lib/src/test/kotlin/at/bitfire/ical4android/Ical4jServiceLoaderTest.kt new file mode 100644 index 00000000..37f947d0 --- /dev/null +++ b/lib/src/test/kotlin/at/bitfire/ical4android/Ical4jServiceLoaderTest.kt @@ -0,0 +1,31 @@ +package at.bitfire.ical4android + +import net.fortuna.ical4j.data.CalendarBuilder +import net.fortuna.ical4j.model.Component +import net.fortuna.ical4j.model.component.VEvent +import org.junit.Assert.assertEquals +import org.junit.Test +import java.io.StringReader + +class Ical4jServiceLoaderTest { + + @Test + fun Ical4j_ServiceLoader_DoesntNeedContextClassLoader() { + Thread.currentThread().contextClassLoader = null + + val iCal = "BEGIN:VCALENDAR\n" + + "PRODID:-//xyz Corp//NONSGML PDA Calendar Version 1.0//EN\n" + + "VERSION:2.0\n" + + "BEGIN:VEVENT\n" + + "UID:uid1@example.com\n" + + "DTSTART:19960918T143000Z\n" + + "DTEND:19960920T220000Z\n" + + "SUMMARY:Networld+Interop Conference\n" + + "END:VEVENT\n" + + "END:VCALENDAR\n" + val result = CalendarBuilder().build(StringReader(iCal)) + val vEvent = result.getComponent(Component.VEVENT) + assertEquals("Networld+Interop Conference", vEvent.summary.value) + } + +} \ No newline at end of file