From c3f8dd4066ee228defe7b06e44b4196b551c9d65 Mon Sep 17 00:00:00 2001 From: PoliEcho Date: Fri, 13 Feb 2026 14:37:17 +0100 Subject: [PATCH] revert GTFSUtils.kt from 67fea519 --- .../org/pupes/mhdrunpathfinder/GTFSUtils.kt | 121 +++++++----------- 1 file changed, 46 insertions(+), 75 deletions(-) diff --git a/app/src/main/java/org/pupes/mhdrunpathfinder/GTFSUtils.kt b/app/src/main/java/org/pupes/mhdrunpathfinder/GTFSUtils.kt index eff546e..af31131 100644 --- a/app/src/main/java/org/pupes/mhdrunpathfinder/GTFSUtils.kt +++ b/app/src/main/java/org/pupes/mhdrunpathfinder/GTFSUtils.kt @@ -13,7 +13,6 @@ import androidx.compose.ui.unit.dp import kotlinx.serialization.Serializable import okhttp3.OkHttpClient import okhttp3.Request -import ovh.plrapps.mapcompose.api.addClusterer import ovh.plrapps.mapcompose.api.addMarker import ovh.plrapps.mapcompose.api.removeMarker import ovh.plrapps.mapcompose.ui.state.markers.model.RenderingStrategy @@ -82,13 +81,12 @@ val gtfshttpClient = OkHttpClient.Builder() private val GTFSMainHandler = Handler(Looper.getMainLooper()) private var GTFSTrackingThread: Thread? = null private var GTFSIsTracking = false -private var GTFSIsInitialized = false // Prevent duplicate initialization private fun fetchGTFSPosition(gtfsUrl: URL,api_key: String, callee: Activity) { try { val request = Request.Builder() - .url("${gtfsUrl.protocol}://${gtfsUrl.host}${"/"}.pd") + .url("${gtfsUrl.protocol}://${gtfsUrl.host}${"/"}") .header("User-Agent", "${BuildConfig.APPLICATION_ID}/${BuildConfig.VERSION_NAME} (Android)") .build() @@ -118,39 +116,39 @@ fun startGTFSTracking(url: String, api_key: String, callee: Activity) { GTFSTrackingThread = Thread { val gtfsUrl = URL(url); try { - if(gtfsRoutes.isEmpty() && !GTFSIsInitialized) { - GTFSMainHandler.post { + 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)}?offset=${offset}") - .header( - "User-Agent", - "${BuildConfig.APPLICATION_ID}/${BuildConfig.VERSION_NAME} (Android)" - ) - .header("X-Access-Token", api_key).build(); + var messageParsed: GTFSRoutes; + var offset = 0; + do { + val request = Request.Builder() + .url("${gtfsUrl.protocol}://${gtfsUrl.host}${callee.getString(R.string.routes_path)}?offset=${offset}") + .header( + "User-Agent", + "${BuildConfig.APPLICATION_ID}/${BuildConfig.VERSION_NAME} (Android)" + ) + .header("X-Access-Token", api_key).build(); - gtfshttpClient.newCall(request).execute().use { response -> - var message = if (response.isSuccessful) { - response.body?.string() ?: "Empty response" - } else { - "Error: ${response.code} ${response.message}" - } - messageParsed = json.decodeFromString(message) - gtfsRoutes.addAll(messageParsed) - offset += messageParsed.size - }} while (messageParsed.isNotEmpty()) - } - if(gtfsStops.features.isEmpty()) { - GTFSMainHandler.post { + gtfshttpClient.newCall(request).execute().use { response -> + var message = if (response.isSuccessful) { + response.body?.string() ?: "Empty response" + } else { + "Error: ${response.code} ${response.message}" + } + 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 { + var messageParsed: GTFSStops; + var offset = 0; + do { val request = Request.Builder() .url("${gtfsUrl.protocol}://${gtfsUrl.host}${callee.getString(R.string.stops_path)}?offset=${offset}") .header( @@ -170,58 +168,32 @@ fun startGTFSTracking(url: String, api_key: String, callee: Activity) { } offset += messageParsed.features.size; - }while(messageParsed.features.isNotEmpty()) - } - // put all stops on the map in batches to prevent ANR + }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) { - val stopsToAdd = gtfsStops!!.features.filter { it.properties.parent_station == null } - val batchSize = 50 // Process 50 markers at a time - val totalStops = stopsToAdd.size - var processed = 0 - - for (batch in stopsToAdd.chunked(batchSize)) { - if (!GTFSIsTracking) break // Stop if tracking was cancelled - - GTFSMainHandler.post { - for (stop in batch) { - try { - 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) - ) - } - } catch (e: Exception) { - // Skip markers that fail to add - } - } - } - - processed += batch.size - // Small delay between batches to let UI breathe - Thread.sleep(50) + 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 ${totalStops} stops", Toast.LENGTH_SHORT).show()} + Toast.makeText(callee, "Done drawing ${gtfsStops.features.size} stops", Toast.LENGTH_SHORT).show()} - GTFSIsInitialized = true // Mark as initialized to prevent duplicate additions - - } catch(e: Exception) { + } catch(e: Exception) { GTFSMainHandler.post { Toast.makeText(callee, e.message ?: "Unknown error", Toast.LENGTH_SHORT).show() } - GTFSMainHandler.post { stopGTFSTracking() } - return@Thread + GTFSMainHandler.post { stopGTFSTracking() } + return@Thread } while (GTFSIsTracking) { fetchGTFSPosition(gtfsUrl,api_key, callee) @@ -236,7 +208,6 @@ fun startGTFSTracking(url: String, api_key: String, callee: Activity) { fun stopGTFSTracking() { GTFSIsTracking = false - GTFSIsInitialized = false for (stop in gtfsStops!!.features) { if (stop.properties.parent_station == null) { mapState.removeMarker(stop.properties.stop_id);