From 9f608915c33142f6db40b8136eae3ccd782b4568 Mon Sep 17 00:00:00 2001 From: deka91 Date: Tue, 24 Feb 2026 11:35:05 +0100 Subject: [PATCH 1/6] Fix missing = null defaults on nullable DTO fields --- .../data/dto/request/tir/ItModeAndModeOfOperationDto.kt | 4 ++-- .../ojp/data/dto/request/tir/PlaceContextDto.kt | 2 +- .../ojp/data/dto/request/tir/TripParamsDto.kt | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/sdk/src/main/java/ch/opentransportdata/ojp/data/dto/request/tir/ItModeAndModeOfOperationDto.kt b/sdk/src/main/java/ch/opentransportdata/ojp/data/dto/request/tir/ItModeAndModeOfOperationDto.kt index 7bcd8f6..41691cd 100644 --- a/sdk/src/main/java/ch/opentransportdata/ojp/data/dto/request/tir/ItModeAndModeOfOperationDto.kt +++ b/sdk/src/main/java/ch/opentransportdata/ojp/data/dto/request/tir/ItModeAndModeOfOperationDto.kt @@ -13,9 +13,9 @@ import nl.adaptivity.xmlutil.serialization.XmlSerialName data class ItModeAndModeOfOperationDto( @XmlElement(true) @XmlSerialName("PersonalMode", OJP_NAME_SPACE, "") - val personalMode: String?, + val personalMode: String? = null, @XmlElement(true) @XmlSerialName("PersonalModeOfOperation", OJP_NAME_SPACE, "") - val personalModeOfOperation: String?, + val personalModeOfOperation: String? = null, ) diff --git a/sdk/src/main/java/ch/opentransportdata/ojp/data/dto/request/tir/PlaceContextDto.kt b/sdk/src/main/java/ch/opentransportdata/ojp/data/dto/request/tir/PlaceContextDto.kt index 2ff125e..2e0140f 100644 --- a/sdk/src/main/java/ch/opentransportdata/ojp/data/dto/request/tir/PlaceContextDto.kt +++ b/sdk/src/main/java/ch/opentransportdata/ojp/data/dto/request/tir/PlaceContextDto.kt @@ -23,5 +23,5 @@ internal data class PlaceContextDto( @XmlElement(true) @XmlSerialName("IndividualTransportOption", OJP_NAME_SPACE, "") - val individualTransportOption: IndividualTransportOptionDto?, + val individualTransportOption: IndividualTransportOptionDto? = null, ) diff --git a/sdk/src/main/java/ch/opentransportdata/ojp/data/dto/request/tir/TripParamsDto.kt b/sdk/src/main/java/ch/opentransportdata/ojp/data/dto/request/tir/TripParamsDto.kt index 9e8fda7..8577e35 100644 --- a/sdk/src/main/java/ch/opentransportdata/ojp/data/dto/request/tir/TripParamsDto.kt +++ b/sdk/src/main/java/ch/opentransportdata/ojp/data/dto/request/tir/TripParamsDto.kt @@ -55,17 +55,17 @@ internal data class TripParamsDto( @XmlElement(true) @XmlSerialName("WalkSpeed", OJP_NAME_SPACE, "") - val walkSpeed: Int?, + val walkSpeed: Int? = null, @XmlElement(true) @XmlSerialName("TransferLimit", OJP_NAME_SPACE, "") - val transferLimit: Int?, + val transferLimit: Int? = null, @XmlElement(true) @XmlSerialName("OptimisationMethod", OJP_NAME_SPACE, "") - val optimisationMethod: String?, + val optimisationMethod: String? = null, @XmlElement(true) @XmlSerialName("BikeTransport", OJP_NAME_SPACE, "") - val bikeTransport: Boolean?, + val bikeTransport: Boolean? = null, ) \ No newline at end of file From e535a08e2043fa947418a1f72199abe177168249 Mon Sep 17 00:00:00 2001 From: deka91 Date: Tue, 24 Feb 2026 11:35:36 +0100 Subject: [PATCH 2/6] Replace reflection-based serializedName() with exhaustive when --- .../ojp/domain/model/OptimisationMethod.kt | 10 ++++------ .../ojp/domain/model/RailSubmode.kt | 14 ++++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/OptimisationMethod.kt b/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/OptimisationMethod.kt index 325af17..1a4ae15 100644 --- a/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/OptimisationMethod.kt +++ b/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/OptimisationMethod.kt @@ -7,13 +7,11 @@ import kotlinx.serialization.Serializable * Created by Nico Brandenberger on 19.02.2026 */ @Serializable -enum class OptimisationMethod() { +enum class OptimisationMethod { @SerialName("minChanges") MIN_CHANGES } -fun OptimisationMethod.serializedName(): String = - this::class.java.getField(this.name) - .getAnnotation(SerialName::class.java) - ?.value - ?: this.name \ No newline at end of file +fun OptimisationMethod.serializedName(): String = when (this) { + OptimisationMethod.MIN_CHANGES -> "minChanges" +} \ No newline at end of file diff --git a/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/RailSubmode.kt b/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/RailSubmode.kt index a0fb475..9d58f4f 100644 --- a/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/RailSubmode.kt +++ b/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/RailSubmode.kt @@ -7,7 +7,7 @@ import kotlinx.serialization.Serializable * Created by Nico Brandenberger on 19.02.2026 */ @Serializable -enum class RailSubmode() { +enum class RailSubmode { @SerialName("international") //Trains ICE, TGV, EC, RJX, NJ, EN INTERNATIONAL, @SerialName("highSpeedRail") //Trains IC @@ -20,8 +20,10 @@ enum class RailSubmode() { LOCAL, } -fun RailSubmode.serializedName(): String = - this::class.java.getField(this.name) - .getAnnotation(SerialName::class.java) - ?.value - ?: this.name \ No newline at end of file +fun RailSubmode.serializedName(): String = when (this) { + RailSubmode.INTERNATIONAL -> "international" + RailSubmode.HIGH_SPEED_RAIL -> "highSpeedRail" + RailSubmode.INTERREGIONAL_RAIL -> "interregionalRail" + RailSubmode.RAIL_SHUTTLE -> "railShuttle" + RailSubmode.LOCAL -> "local" +} \ No newline at end of file From 34a08243009ebe3d99a07d534c3e016a1ca1df88 Mon Sep 17 00:00:00 2001 From: deka91 Date: Tue, 24 Feb 2026 11:36:35 +0100 Subject: [PATCH 3/6] Use typed enums for OptimisationMethod and RailSubmode filter params --- .../presentation/tir/result/TripResultViewModel.kt | 6 +++--- .../ojp/data/remote/trip/RemoteTripDataSourceImpl.kt | 7 ++++--- .../ojp/domain/model/ModeAndModeOfOperationFilter.kt | 2 +- .../opentransportdata/ojp/domain/model/TripParams.kt | 10 +++++----- .../ojp/domain/usecase/TripRefinementTest.kt | 4 ++-- 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/ch/opentransportdata/presentation/tir/result/TripResultViewModel.kt b/app/src/main/java/ch/opentransportdata/presentation/tir/result/TripResultViewModel.kt index e530ca5..e1d42a7 100644 --- a/app/src/main/java/ch/opentransportdata/presentation/tir/result/TripResultViewModel.kt +++ b/app/src/main/java/ch/opentransportdata/presentation/tir/result/TripResultViewModel.kt @@ -196,7 +196,7 @@ class TripResultViewModel( useRealtimeData = RealtimeData.EXPLANATORY, walkSpeed = state.value.walkingSpeed, transferLimit = if (state.value.isDirectConnection) 0 else null, - optimisationMethod = if (state.value.isFewerTransfers) OptimisationMethod.MIN_CHANGES.serializedName() else null, + optimisationMethod = if (state.value.isFewerTransfers) OptimisationMethod.MIN_CHANGES else null, bikeTransport = state.value.isBikeTransport, ), trip = trip, @@ -272,7 +272,7 @@ class TripResultViewModel( ModeAndModeOfOperationFilter( exclude = false, ptMode = emptyList(), - railSubmode = vehicleOption.vehicleType + railSubmode = RailSubmode.entries.firstOrNull { it.serializedName() == vehicleOption.vehicleType } ) } .toMutableList() @@ -305,7 +305,7 @@ class TripResultViewModel( useRealtimeData = RealtimeData.EXPLANATORY, walkSpeed = state.value.walkingSpeed, transferLimit = if (state.value.isDirectConnection) 0 else null, - optimisationMethod = if (state.value.isFewerTransfers) OptimisationMethod.MIN_CHANGES.serializedName() else null, + optimisationMethod = if (state.value.isFewerTransfers) OptimisationMethod.MIN_CHANGES else null, bikeTransport = state.value.isBikeTransport, ), individualTransportOption = IndividualTransportOptionDto( diff --git a/sdk/src/main/java/ch/opentransportdata/ojp/data/remote/trip/RemoteTripDataSourceImpl.kt b/sdk/src/main/java/ch/opentransportdata/ojp/data/remote/trip/RemoteTripDataSourceImpl.kt index b91adf5..cbfdbb2 100644 --- a/sdk/src/main/java/ch/opentransportdata/ojp/data/remote/trip/RemoteTripDataSourceImpl.kt +++ b/sdk/src/main/java/ch/opentransportdata/ojp/data/remote/trip/RemoteTripDataSourceImpl.kt @@ -19,6 +19,7 @@ import ch.opentransportdata.ojp.data.remote.OjpService import ch.opentransportdata.ojp.domain.model.LanguageCode import ch.opentransportdata.ojp.domain.model.TripParams import ch.opentransportdata.ojp.domain.model.TripRefineParam +import ch.opentransportdata.ojp.domain.model.serializedName import ch.opentransportdata.ojp.domain.model.shortName import ch.opentransportdata.ojp.domain.usecase.Initializer import kotlinx.coroutines.Dispatchers @@ -134,13 +135,13 @@ internal class RemoteTripDataSourceImpl( ModeAndModeOfOperationFilterDto( ptMode = filter.ptMode, exclude = filter.exclude, - railSubmode = filter.railSubmode, + railSubmode = filter.railSubmode?.serializedName(), busSubmode = filter.busSubmode, coachSubmode = filter.coachSubmode, metroSubmode = filter.metroSubmode, tramSubmode = filter.tramSubmode, trolleyBusSubmode = filter.trolleyBusSubmode, - telecabinSubmode = filter.trolleyBusSubmode, + telecabinSubmode = filter.telecabinSubmode, funicularSubmode = filter.funicularSubmode, waterSubmode = filter.waterSubmode, airSubmode = filter.airSubmode, @@ -150,7 +151,7 @@ internal class RemoteTripDataSourceImpl( }, walkSpeed = this.walkSpeed, transferLimit = this.transferLimit, - optimisationMethod = this.optimisationMethod, + optimisationMethod = this.optimisationMethod?.serializedName(), bikeTransport = this.bikeTransport, ) } diff --git a/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/ModeAndModeOfOperationFilter.kt b/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/ModeAndModeOfOperationFilter.kt index eeb8091..ec8ba76 100644 --- a/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/ModeAndModeOfOperationFilter.kt +++ b/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/ModeAndModeOfOperationFilter.kt @@ -10,7 +10,7 @@ import kotlinx.parcelize.Parcelize data class ModeAndModeOfOperationFilter( val ptMode: List, val exclude: Boolean, - val railSubmode: String? = null, + val railSubmode: RailSubmode? = null, val busSubmode: String? = null, val coachSubmode: String? = null, val metroSubmode: String? = null, diff --git a/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/TripParams.kt b/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/TripParams.kt index e0801f5..d7a67ac 100644 --- a/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/TripParams.kt +++ b/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/TripParams.kt @@ -21,9 +21,9 @@ data class TripParams( val includeIntermediateStops: Boolean = false, val includeAllRestrictedLines: Boolean = false, val useRealtimeData: RealtimeData? = null, - val modeAndModeOfOperationFilter: List?, - val walkSpeed: Int?, - val transferLimit: Int?, - val optimisationMethod: String?, - val bikeTransport: Boolean?, + val modeAndModeOfOperationFilter: List? = null, + val walkSpeed: Int? = null, + val transferLimit: Int? = null, + val optimisationMethod: OptimisationMethod? = null, + val bikeTransport: Boolean? = null, ) : Parcelable \ No newline at end of file diff --git a/sdk/src/test/java/ch/opentransportdata/ojp/domain/usecase/TripRefinementTest.kt b/sdk/src/test/java/ch/opentransportdata/ojp/domain/usecase/TripRefinementTest.kt index 4eb6062..2e88695 100644 --- a/sdk/src/test/java/ch/opentransportdata/ojp/domain/usecase/TripRefinementTest.kt +++ b/sdk/src/test/java/ch/opentransportdata/ojp/domain/usecase/TripRefinementTest.kt @@ -24,7 +24,7 @@ import ch.opentransportdata.ojp.domain.model.RealtimeData import ch.opentransportdata.ojp.domain.model.Result import ch.opentransportdata.ojp.domain.model.TripParams import ch.opentransportdata.ojp.domain.model.TripRefineParam -import ch.opentransportdata.ojp.domain.model.serializedName + import kotlinx.coroutines.test.runTest import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString @@ -141,7 +141,7 @@ class TripRefinementXmlUtilTest { useRealtimeData = RealtimeData.FULL, walkSpeed = 100, transferLimit = 0, - optimisationMethod = OptimisationMethod.MIN_CHANGES.serializedName(), + optimisationMethod = OptimisationMethod.MIN_CHANGES, bikeTransport = false ) From 6cdd0e4e32248ddb05f85325bdbb2bf85a528885 Mon Sep 17 00:00:00 2001 From: deka91 Date: Tue, 24 Feb 2026 11:36:51 +0100 Subject: [PATCH 4/6] Fix individualTransportOption not persisted to RequestTrips state --- .../java/ch/opentransportdata/ojp/domain/usecase/RequestTrips.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/src/main/java/ch/opentransportdata/ojp/domain/usecase/RequestTrips.kt b/sdk/src/main/java/ch/opentransportdata/ojp/domain/usecase/RequestTrips.kt index 6d73afc..7a77545 100644 --- a/sdk/src/main/java/ch/opentransportdata/ojp/domain/usecase/RequestTrips.kt +++ b/sdk/src/main/java/ch/opentransportdata/ojp/domain/usecase/RequestTrips.kt @@ -45,6 +45,7 @@ internal class RequestTrips( time = time, isSearchForDepartureTime = isSearchForDepartureTime, params = params, + individualTransportOption = individualTransportOption, ) return when (val response = From 2b4d99d1e03d5f1e78c9049ee6897dd77becf7c4 Mon Sep 17 00:00:00 2001 From: deka91 Date: Tue, 24 Feb 2026 11:37:15 +0100 Subject: [PATCH 5/6] Add missing KDoc for updateTripData and individualTransportOption --- .../main/java/ch/opentransportdata/ojp/OjpSdk.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/sdk/src/main/java/ch/opentransportdata/ojp/OjpSdk.kt b/sdk/src/main/java/ch/opentransportdata/ojp/OjpSdk.kt index 9ad0df0..1281cb9 100644 --- a/sdk/src/main/java/ch/opentransportdata/ojp/OjpSdk.kt +++ b/sdk/src/main/java/ch/opentransportdata/ojp/OjpSdk.kt @@ -92,6 +92,7 @@ class OjpSdk( * @param time The time the trip should start/end * @param isSearchForDepartureTime weather to search for trips that arrive at [time] or leave at [time]. Set to true if searching for trips that leave at [time]. * @param params The params to get further information on each trip + * @param individualTransportOption Optional individual transport option for the trip request * * @return [TripDeliveryDto] object with related trip information */ @@ -152,6 +153,19 @@ class OjpSdk( return OjpKoinContext.koinApp.koin.get().invoke(stream) } + /** + * Updates the trip data for a given trip by re-requesting it with the same parameters + * + * @param languageCode The [LanguageCode] for the desired results, default is [LanguageCode.DE] + * @param origin The origin where the trip starts + * @param destination The destination where the trip ends + * @param via The via station which the trip should cover + * @param params The params to get further information on each trip + * @param trip The existing [TripDto] that should be updated + * @param individualTransportOption Optional individual transport option for the trip request + * + * @return [TripDeliveryDto] with the updated trip information + */ suspend fun updateTripData( languageCode: LanguageCode = LanguageCode.DE, origin: PlaceReferenceDto, From 9ce2823e041ecc858de3dcf1efee65eae51e4a23 Mon Sep 17 00:00:00 2001 From: deka91 Date: Tue, 24 Feb 2026 13:54:43 +0100 Subject: [PATCH 6/6] Add RailSubmode.fromSerializedName() factory to simplify submode lookup --- .../presentation/tir/result/TripResultViewModel.kt | 2 +- .../ch/opentransportdata/ojp/domain/model/RailSubmode.kt | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/ch/opentransportdata/presentation/tir/result/TripResultViewModel.kt b/app/src/main/java/ch/opentransportdata/presentation/tir/result/TripResultViewModel.kt index e1d42a7..612ae31 100644 --- a/app/src/main/java/ch/opentransportdata/presentation/tir/result/TripResultViewModel.kt +++ b/app/src/main/java/ch/opentransportdata/presentation/tir/result/TripResultViewModel.kt @@ -272,7 +272,7 @@ class TripResultViewModel( ModeAndModeOfOperationFilter( exclude = false, ptMode = emptyList(), - railSubmode = RailSubmode.entries.firstOrNull { it.serializedName() == vehicleOption.vehicleType } + railSubmode = RailSubmode.fromSerializedName(vehicleOption.vehicleType) ) } .toMutableList() diff --git a/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/RailSubmode.kt b/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/RailSubmode.kt index 9d58f4f..9f9faee 100644 --- a/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/RailSubmode.kt +++ b/sdk/src/main/java/ch/opentransportdata/ojp/domain/model/RailSubmode.kt @@ -17,7 +17,12 @@ enum class RailSubmode { @SerialName("railShuttle") // Trains ATZ, PE RAIL_SHUTTLE, @SerialName("local") //Trains S, SN, RB, RE, - LOCAL, + LOCAL; + + companion object { + fun fromSerializedName(name: String): RailSubmode? = + entries.firstOrNull { it.serializedName() == name } + } } fun RailSubmode.serializedName(): String = when (this) {