From 524e2156e423016679b21f9619b98e829ca55ccc Mon Sep 17 00:00:00 2001 From: Ellen Poe Date: Sat, 6 Dec 2025 12:11:31 -0800 Subject: [PATCH] feat: show direct transit itineraries --- .../java/earth/maps/cardinal/transit/TransitousModels.kt | 9 ++++++++- .../earth/maps/cardinal/transit/TransitousService.kt | 6 ++++-- .../maps/cardinal/ui/directions/DirectionsScreen.kt | 2 +- .../maps/cardinal/ui/directions/DirectionsViewModel.kt | 1 - .../cardinal/ui/directions/TransitDirectionsScreen.kt | 5 +++-- 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/cardinal-android/app/src/main/java/earth/maps/cardinal/transit/TransitousModels.kt b/cardinal-android/app/src/main/java/earth/maps/cardinal/transit/TransitousModels.kt index f486044..000a786 100644 --- a/cardinal-android/app/src/main/java/earth/maps/cardinal/transit/TransitousModels.kt +++ b/cardinal-android/app/src/main/java/earth/maps/cardinal/transit/TransitousModels.kt @@ -22,6 +22,8 @@ import androidx.compose.ui.graphics.Color import androidx.core.graphics.toColorInt import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlin.time.ExperimentalTime +import kotlin.time.Instant @Serializable data class TransitStop( @@ -317,4 +319,9 @@ data class PlanResponse( val itineraries: List, val previousPageCursor: String, val nextPageCursor: String -) +) { + @OptIn(ExperimentalTime::class) + fun allItineraries(): List { + return itineraries.plus(direct).sortedBy { itinerary -> Instant.parse(itinerary.endTime) } + } +} diff --git a/cardinal-android/app/src/main/java/earth/maps/cardinal/transit/TransitousService.kt b/cardinal-android/app/src/main/java/earth/maps/cardinal/transit/TransitousService.kt index 8aa0e1e..66626cd 100644 --- a/cardinal-android/app/src/main/java/earth/maps/cardinal/transit/TransitousService.kt +++ b/cardinal-android/app/src/main/java/earth/maps/cardinal/transit/TransitousService.kt @@ -142,7 +142,8 @@ class TransitousService @Inject constructor(private val appPreferenceRepository: directRentalPropulsionTypes: List? = null, preTransitRentalPropulsionTypes: List? = null, postTransitRentalPropulsionTypes: List? = null, - numItineraries: Int = 5, + numItineraries: Int = 10, + maxItineraries: Int = 10, pageCursor: String? = null, timetableView: Boolean = true, withFares: Boolean = false, @@ -199,6 +200,7 @@ class TransitousService @Inject constructor(private val appPreferenceRepository: ) } parameter("numItineraries", numItineraries) + parameter("maxItineraries", maxItineraries) pageCursor?.let { parameter("pageCursor", it) } parameter("timetableView", timetableView) parameter("withFares", withFares) @@ -206,7 +208,7 @@ class TransitousService @Inject constructor(private val appPreferenceRepository: } val result = response.body() - Log.d(TAG, "Plan response: ${result.itineraries.size} itineraries") + Log.d(TAG, "Plan response: ${result.allItineraries()} itineraries (including direct)") emit(result) } catch (e: Exception) { diff --git a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/directions/DirectionsScreen.kt b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/directions/DirectionsScreen.kt index 74d0805..2194e2a 100644 --- a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/directions/DirectionsScreen.kt +++ b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/directions/DirectionsScreen.kt @@ -727,7 +727,7 @@ fun RouteDisplayHandler( } } } else { - onRouteUpdate(null, routeState.routes) + onRouteUpdate(null, emptyList()) } } } diff --git a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/directions/DirectionsViewModel.kt b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/directions/DirectionsViewModel.kt index 5cd2ba1..20a3594 100644 --- a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/directions/DirectionsViewModel.kt +++ b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/directions/DirectionsViewModel.kt @@ -191,7 +191,6 @@ class DirectionsViewModel @Inject constructor( transitousService.getPlan( from = LatLng(origin.latLng.latitude, origin.latLng.longitude), to = LatLng(destination.latLng.latitude, destination.latLng.longitude), - timetableView = false, withFares = true, ).collect { planResponse -> planStateRepository.setPlanResponse(planResponse) diff --git a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/directions/TransitDirectionsScreen.kt b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/directions/TransitDirectionsScreen.kt index d7bbb98..e6437f6 100644 --- a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/directions/TransitDirectionsScreen.kt +++ b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/directions/TransitDirectionsScreen.kt @@ -113,9 +113,10 @@ private fun TransitTimelineResults( distanceUnit: Int, modifier: Modifier = Modifier ) { + val itineraries = planResponse.allItineraries() LazyColumn(modifier = modifier) { - items(planResponse.itineraries.size) { index -> - val itinerary = planResponse.itineraries.reversed()[index] + items(itineraries.size) { index -> + val itinerary = itineraries[index] TransitItineraryCard( itinerary = itinerary, -- GitLab