From 93148fcf36616b447987d45d6e1dc08597f6177e Mon Sep 17 00:00:00 2001 From: PoliEcho Date: Wed, 28 Jan 2026 21:55:08 +0100 Subject: [PATCH] make sure all stops are requested --- .../org/pupes/mhdrunpathfinder/GTFSUtils.kt | 87 +++++++++++-------- 1 file changed, 52 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/org/pupes/mhdrunpathfinder/GTFSUtils.kt b/app/src/main/java/org/pupes/mhdrunpathfinder/GTFSUtils.kt index e0f9987..7605300 100644 --- a/app/src/main/java/org/pupes/mhdrunpathfinder/GTFSUtils.kt +++ b/app/src/main/java/org/pupes/mhdrunpathfinder/GTFSUtils.kt @@ -10,13 +10,11 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import kotlinx.serialization.Serializable import okhttp3.OkHttpClient import okhttp3.Request -import ovh.plrapps.mapcompose.api.addClusterer -import ovh.plrapps.mapcompose.api.addLazyLoader import ovh.plrapps.mapcompose.api.addMarker +import ovh.plrapps.mapcompose.api.removeMarker import ovh.plrapps.mapcompose.ui.state.markers.model.RenderingStrategy import java.net.URL @@ -37,9 +35,10 @@ data class GTFSRoute( ) // Type alias for array of GTFS routes -typealias GTFSRoutes = List +typealias GTFSRoutes = MutableList + +var gtfsRoutes: GTFSRoutes = mutableListOf() -var gtfsRoutes: GTFSRoutes? = null @Serializable data class GTFSStopGeometry( @@ -68,11 +67,11 @@ data class GTFSStop( @Serializable data class GTFSStops( - val features: List, + val features: MutableList, val type: String? ) -var gtfsStops: GTFSStops? = null +var gtfsStops: GTFSStops = GTFSStops(mutableListOf(), "FeatureCollection") // OkHttpClient for making HTTP requests @@ -108,19 +107,24 @@ private fun fetchGTFSPosition(gtfsUrl: URL,api_key: String, callee: Activity) { } } + // Start the timer with a URL: fun startGTFSTracking(url: String, api_key: String, callee: Activity) { if (GTFSIsTracking) return GTFSIsTracking = true GTFSTrackingThread = Thread { - var gtfsUrl = URL(url); + val gtfsUrl = URL(url); try { - if(gtfsRoutes == null) { + if(gtfsRoutes.isEmpty()) { GTFSMainHandler.post { Toast.makeText(callee, "Fetching routes...", Toast.LENGTH_SHORT).show()} + + var messageParsed: GTFSRoutes; + var offset = 0; + do { val request = Request.Builder() - .url("${gtfsUrl.protocol}://${gtfsUrl.host}${callee.getString(R.string.routes_path)}") + .url("${gtfsUrl.protocol}://${gtfsUrl.host}${callee.getString(R.string.routes_path)}?offset=${offset}") .header( "User-Agent", "${BuildConfig.APPLICATION_ID}/${BuildConfig.VERSION_NAME} (Android)" @@ -133,13 +137,20 @@ fun startGTFSTracking(url: String, api_key: String, callee: Activity) { } else { "Error: ${response.code} ${response.message}" } - gtfsRoutes = json.decodeFromString(message) - }} - if(gtfsStops == null) { + messageParsed = json.decodeFromString(message) + gtfsRoutes.addAll(messageParsed) + offset += messageParsed.size + }} while (messageParsed.isNotEmpty()) + } + if(gtfsStops.features.isEmpty()) { GTFSMainHandler.post { Toast.makeText(callee, "Fetching stops...", Toast.LENGTH_SHORT).show()} + + var messageParsed: GTFSStops; + var offset = 0; + do { val request = Request.Builder() - .url("${gtfsUrl.protocol}://${gtfsUrl.host}${callee.getString(R.string.stops_path)}") + .url("${gtfsUrl.protocol}://${gtfsUrl.host}${callee.getString(R.string.stops_path)}?offset=${offset}") .header( "User-Agent", "${BuildConfig.APPLICATION_ID}/${BuildConfig.VERSION_NAME} (Android)" @@ -152,29 +163,31 @@ fun startGTFSTracking(url: String, api_key: String, callee: Activity) { } else { "Error: ${response.code} ${response.message}" } - gtfsStops = json.decodeFromString(message) + messageParsed = json.decodeFromString(message) + gtfsStops.features.addAll(messageParsed.features) + } - // put all stops on the map - GTFSMainHandler.post { - Toast.makeText(callee, "Drawing stops...", Toast.LENGTH_SHORT).show()} - for (stop in gtfsStops!!.features) { + offset += messageParsed.features.size; + }while(messageParsed.features.isNotEmpty()) + } + // put all stops on the map + GTFSMainHandler.post { + Toast.makeText(callee, "Drawing stops...", Toast.LENGTH_SHORT).show()} + for (stop in gtfsStops!!.features) { - if (stop.properties.parent_station == null) { - mapState.addMarker(stop.properties.stop_id, x = longitudeToXNormalized(stop.geometry.coordinates[0]), y = latitudeToYNormalized(stop.geometry.coordinates[1]), renderingStrategy = RenderingStrategy.LazyLoading("default")) { - Icon( - painter = painterResource(id = R.drawable.outline_directions_bus_24), - contentDescription = null, - modifier = Modifier.size(12.dp), - tint = Color(0xFF0000FF) - ) - }} - - - - } - GTFSMainHandler.post { - Toast.makeText(callee, "Done drawing stops", Toast.LENGTH_SHORT).show()} + if (stop.properties.parent_station == null) { + mapState.addMarker(stop.properties.stop_id, x = longitudeToXNormalized(stop.geometry.coordinates[0]), y = latitudeToYNormalized(stop.geometry.coordinates[1]), renderingStrategy = RenderingStrategy.LazyLoading("default")) { + Icon( + painter = painterResource(id = R.drawable.outline_directions_bus_24), + contentDescription = null, + modifier = Modifier.size(12.dp), + tint = Color(0xFF0000FF) + ) }} + } + GTFSMainHandler.post { + Toast.makeText(callee, "Done drawing stops", Toast.LENGTH_SHORT).show()} + } catch(e: Exception) { GTFSMainHandler.post { Toast.makeText(callee, e.message ?: "Unknown error", Toast.LENGTH_SHORT).show() @@ -195,7 +208,11 @@ fun startGTFSTracking(url: String, api_key: String, callee: Activity) { fun stopGTFSTracking() { GTFSIsTracking = false - + for (stop in gtfsStops!!.features) { + if (stop.properties.parent_station == null) { + mapState.removeMarker(stop.properties.stop_id); + } + } GTFSTrackingThread?.interrupt() GTFSTrackingThread = null } \ No newline at end of file