Skip to content
This repository was archived by the owner on Jun 9, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions lib/src/main/kotlin/at/bitfire/ical4android/Event.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
3 changes: 1 addition & 2 deletions lib/src/main/kotlin/at/bitfire/ical4android/ICalendar.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -80,7 +81,6 @@ open class ICalendar {
* @throws IllegalArgumentException when the iCalendar resource contains an invalid value
*/
fun fromReader(reader: Reader, properties: MutableMap<String, String>? = null): Calendar {
Ical4Android.checkThreadContextClassLoader()
logger.fine("Parsing iCalendar stream")

// preprocess stream to work around some problems that can't be fixed later
Expand Down Expand Up @@ -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))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)")
}

}
const val ical4jVersion = BuildConfig.version_ical4j
40 changes: 36 additions & 4 deletions lib/src/main/kotlin/at/bitfire/ical4android/JtxICalObject.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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))
Expand Down Expand Up @@ -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)
}

Expand Down
2 changes: 0 additions & 2 deletions lib/src/main/kotlin/at/bitfire/ical4android/Task.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 {
Expand Down
7 changes: 0 additions & 7 deletions lib/src/main/kotlin/at/bitfire/ical4android/util/DateUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -24,10 +23,6 @@ import java.util.logging.Logger
*/
object DateUtils {

init {
Ical4Android.checkThreadContextClassLoader()
}

private val logger
get() = Logger.getLogger(javaClass.name)

Expand Down Expand Up @@ -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))
Expand Down
Original file line number Diff line number Diff line change
@@ -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<VEvent>(Component.VEVENT)
assertEquals("Networld+Interop Conference", vEvent.summary.value)
}

}
Loading