Skip to content
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
13 changes: 7 additions & 6 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,17 @@
agp = "8.9.1"
assertk = "0.28.1"
desugar_jdk_libs = "2.1.5"
kotlin = "2.0.0"
kotlin = "2.2.0"
coreKtx = "1.15.0"
junit = "4.13.2"
extJunit = "1.2.1"
kotlinxCoroutinesTest = "1.8.0"
robolectric = "4.16"
xmlUtil = "0.91.2"
timber = "5.0.1"
koin = "3.5.3"
retrofit2 = "2.11.0"
okHttp = "4.12.0"
tikXml = "0.9.0_13-SNAPSHOT"
dokka = "1.9.20"
lifecycleRuntimeKtx = "2.8.7"
activityCompose = "1.10.1"
Expand All @@ -24,20 +25,20 @@ playServices = "21.3.0"

[libraries]
assertk = { module = "com.willowtreeapps.assertk:assertk", version.ref = "assertk" }
converter-kotlinx-serialization = { module = "com.squareup.retrofit2:converter-kotlinx-serialization", version.ref = "retrofit2" }
core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
desugar_jdk_libs = { module = "com.android.tools:desugar_jdk_libs", version.ref = "desugar_jdk_libs" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-test-ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "extJunit" }
kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinxCoroutinesTest" }
xmlUtilCore = { module = "io.github.pdvrieze.xmlutil:core", version.ref = "xmlUtil" }
xml-test = { module = "io.github.pdvrieze.xmlutil:core-jdk", version.ref = "xmlUtil" }
xmlUtilSerialization = { module = "io.github.pdvrieze.xmlutil:serialization-jvm", version.ref = "xmlUtil" }
timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" }
koin-android = { module = "io.insert-koin:koin-android", version.ref = "koin" }
retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit2" }
okHttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okHttp" }
okHttpLogger = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okHttp" }
tikAnnotation = { module = "com.tickaroo.tikxml:annotation", version.ref = "tikXml" }
tikConverters = { module = "com.tickaroo.tikxml:converter-htmlescape", version.ref = "tikXml" }
tikRetrofit = { module = "com.tickaroo.tikxml:retrofit-converter", version.ref = "tikXml" }
tikProcessor = { module = "com.tickaroo.tikxml:processor", version.ref = "tikXml" }
dokka = { module = "org.jetbrains.dokka:android-documentation-plugin", version.ref = "dokka" }
lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" }
viewModel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycleRuntimeKtx" }
Expand Down
8 changes: 4 additions & 4 deletions sdk/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -89,16 +89,16 @@ dependencies {
implementation(libs.retrofit)
implementation(libs.okHttp)
implementation(libs.okHttpLogger)
implementation(libs.tikRetrofit)
implementation(libs.tikAnnotation)
implementation(libs.tikConverters)
kapt(libs.tikProcessor) // needed for TypeAdapter creation
implementation(libs.converter.kotlinx.serialization)
implementation(libs.dokka)
implementation(libs.kotlinx.serialization.json)

testImplementation(libs.junit)
testImplementation(libs.assertk)
testImplementation(libs.kotlinx.coroutines.test)
testImplementation(libs.xml.test)
implementation(libs.xmlUtilCore)
implementation(libs.xmlUtilSerialization)
}

tasks.register<Jar>("javadocJar") {
Expand Down
14 changes: 1 addition & 13 deletions sdk/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -31,19 +31,7 @@
-keep class ch.opentransportdata.ojp.data.dto.converter.** { *; }
-keep class ch.opentransportdata.ojp.data.dto.response.** { *; }
-keep class ch.opentransportdata.ojp.data.dto.request.tir.** { *; }

# TikXML
-keep class com.tickaroo.tikxml.** { *; }
-keep @com.tickaroo.tikxml.annotation.Xml public class *
-keep class **$$TypeAdapter { *; }

-keepclasseswithmembernames class * {
@com.tickaroo.tikxml.* <fields>;
}

-keepclasseswithmembernames class * {
@com.tickaroo.tikxml.* <methods>;
}
-keep class ch.opentransportdata.ojp.data.dto.** { *; }

## Joda Time 2.3
-dontwarn org.joda.convert.**
Expand Down
34 changes: 25 additions & 9 deletions sdk/src/main/java/ch/opentransportdata/ojp/data/dto/OjpDto.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,40 @@ package ch.opentransportdata.ojp.data.dto

import ch.opentransportdata.ojp.data.dto.request.OjpRequestDto
import ch.opentransportdata.ojp.data.dto.response.OjpResponseDto
import com.tickaroo.tikxml.annotation.Attribute
import com.tickaroo.tikxml.annotation.Element
import com.tickaroo.tikxml.annotation.Xml
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.ExperimentalXmlUtilApi
import nl.adaptivity.xmlutil.serialization.XmlElement
import nl.adaptivity.xmlutil.serialization.XmlNamespaceDeclSpecs
import nl.adaptivity.xmlutil.serialization.XmlSerialName

/**
* Created by Michael Ruppen on 08.04.2024
*/
@Xml(
name = "OJP",
writeNamespaces = ["http://www.vdv.de/ojp", "siri=http://www.siri.org.uk/siri", "xsi=http://www.w3.org/2001/XMLSchema-instance", "xsd=http://www.w3.org/2001/XMLSchema"]

@OptIn(ExperimentalXmlUtilApi::class)
@Serializable
@XmlSerialName("OJP", OJP_NAME_SPACE, "")
@XmlNamespaceDeclSpecs(
"siri=http://www.siri.org.uk/siri",
"xsi=http://www.w3.org/2001/XMLSchema-instance",
"xsd=http://www.w3.org/2001/XMLSchema"
)
internal data class OjpDto(
@Element(name = "OJPRequest")

@XmlElement(true)
@XmlSerialName("OJPRequest", OJP_NAME_SPACE, "")
val ojpRequest: OjpRequestDto? = null,

@Element(name = "OJPResponse")
@XmlElement(true)
@XmlSerialName("OJPResponse", OJP_NAME_SPACE, "")
val ojpResponse: OjpResponseDto? = null,

@Attribute(name = "version")
@XmlElement(false)
@SerialName("version")
val version: String = "2.0",
)

internal const val OJP_NAME_SPACE = "http://www.vdv.de/ojp"
internal const val SIRI_NAME_SPACE = "http://www.siri.org.uk/siri"
internal const val SIRI_PREFIX = "siri"

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,18 +1,25 @@
package ch.opentransportdata.ojp.data.dto.converter

import com.tickaroo.tikxml.TypeConverter
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import java.time.Duration

/**
* Created by Michael Ruppen on 31.07.2024
*/
internal class DurationTypeConverter : TypeConverter<Duration> {
override fun read(value: String): Duration {
return Duration.parse(value)
}
object DurationSerializer : KSerializer<Duration> {
override val descriptor: SerialDescriptor =
PrimitiveSerialDescriptor("java.time.Duration", PrimitiveKind.STRING)

override fun write(value: Duration): String {
return value.toString()
override fun serialize(encoder: Encoder, value: Duration) {
encoder.encodeString(value.toString())
}

override fun deserialize(decoder: Decoder): Duration {
return Duration.parse(decoder.decodeString())
}
}
Original file line number Diff line number Diff line change
@@ -1,28 +1,40 @@
package ch.opentransportdata.ojp.data.dto.converter

import ch.opentransportdata.ojp.domain.model.FareClass
import com.tickaroo.tikxml.TypeConverter
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder


/**
* Created by Deniz Kalem on 02.07.2025
*/
internal class FareClassConverter : TypeConverter<FareClass> {
object FareClassSerializer : KSerializer<FareClass> {
override val descriptor: SerialDescriptor =
PrimitiveSerialDescriptor("FareClass", PrimitiveKind.STRING)

override fun read(ojpValue: String): FareClass {
return when (ojpValue) {
"unknown" -> FareClass.UNKNOWN
"firstClass" -> FareClass.FIRST_CLASS
"secondClass " -> FareClass.SECOND_CLASS
else -> FareClass.UNKNOWN
}
private val toWire = mapOf(
FareClass.UNKNOWN to "unknown",
FareClass.FIRST_CLASS to "firstClass",
FareClass.SECOND_CLASS to "secondClass "
)

private val fromWire = mapOf(
"unknown" to FareClass.UNKNOWN,
"firstClass" to FareClass.FIRST_CLASS,
"secondClass " to FareClass.SECOND_CLASS,
"secondClass" to FareClass.SECOND_CLASS
)

override fun serialize(encoder: Encoder, value: FareClass) {
encoder.encodeString(toWire[value] ?: "unknown")
}

override fun write(type: FareClass): String {
return when (type) {
FareClass.UNKNOWN -> "unknown"
FareClass.FIRST_CLASS -> "firstClass"
FareClass.SECOND_CLASS -> "secondClass "
}
override fun deserialize(decoder: Decoder): FareClass {
val raw = decoder.decodeString()
return fromWire[raw] ?: fromWire[raw.trim()] ?: FareClass.UNKNOWN
}
}
Original file line number Diff line number Diff line change
@@ -1,31 +1,28 @@
package ch.opentransportdata.ojp.data.dto.converter

import ch.opentransportdata.ojp.domain.usecase.Initializer
import com.tickaroo.tikxml.TypeConverter
import timber.log.Timber
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import java.time.LocalDateTime
import java.time.ZoneOffset
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import java.time.format.DateTimeParseException

/**
* Created by Michael Ruppen on 05.07.2024
*/
internal class LocalDateTimeTypeConverter(private val initializer: Initializer) : TypeConverter<LocalDateTime> {
object LocalDateTimeSerializer : KSerializer<LocalDateTime> {
private val formatter = DateTimeFormatter.ISO_DATE_TIME

override fun read(value: String): LocalDateTime {
return try {
val zonedDateTime = ZonedDateTime.parse(value, DateTimeFormatter.ISO_ZONED_DATE_TIME)
zonedDateTime.withZoneSameInstant(initializer.defaultTimeZone).toLocalDateTime()
} catch (e: DateTimeParseException) {
Timber.e(e, "$value is not a valid datetime")
LocalDateTime.now()
}
override val descriptor: SerialDescriptor =
PrimitiveSerialDescriptor("LocalDateTime", PrimitiveKind.STRING)

override fun serialize(encoder: Encoder, value: LocalDateTime) {
encoder.encodeString(value.format(formatter))
}

override fun write(value: LocalDateTime): String {
val instant = value.atZone(initializer.defaultTimeZone).toInstant()
return DateTimeFormatter.ISO_INSTANT.format(instant)
override fun deserialize(decoder: Decoder): LocalDateTime {
return LocalDateTime.parse(decoder.decodeString(), formatter)
}
}

This file was deleted.

This file was deleted.

Loading
Loading