From e9474695bf60abc0b52d02b3bb4ee901bd0854e4 Mon Sep 17 00:00:00 2001 From: Dimitris Date: Mon, 9 Feb 2026 08:44:57 +0100 Subject: [PATCH] TomTom Routing --- .../com/kouros/navigation/ui/MainActivity.kt | 9 ++-- .../navigation/data/NavigationRepository.kt | 25 +---------- .../navigation/data/osrm/OsrmRepository.kt | 8 ++++ .../data/tomtom/TomTomRepository.kt | 33 ++++++++++++-- .../data/valhalla/ValhallaRepository.kt | 8 ++++ .../com/kouros/navigation/model/RouteModel.kt | 43 ++++++++++--------- .../data/src/main/res/raw/liberty_night.json | 11 ++--- gradle/libs.versions.toml | 28 ++++++------ 8 files changed, 95 insertions(+), 70 deletions(-) diff --git a/app/src/main/java/com/kouros/navigation/ui/MainActivity.kt b/app/src/main/java/com/kouros/navigation/ui/MainActivity.kt index 7f12a3d..64b9fba 100644 --- a/app/src/main/java/com/kouros/navigation/ui/MainActivity.kt +++ b/app/src/main/java/com/kouros/navigation/ui/MainActivity.kt @@ -87,8 +87,8 @@ class MainActivity : ComponentActivity() { val routeModel = RouteModel() var tilt = 50.0 - val useMock = false - val type = 1 // simulate 2 test 3 gpx + val useMock = true + val type = 3 // simulate 2 test 3 gpx var currentIndex = 0 val stepData: MutableLiveData by lazy { @@ -317,6 +317,7 @@ class MainActivity : ComponentActivity() { if (isNavigating()) { updateLocation(currentLocation, navigationViewModel) stepData.value = currentStep() + println("Step: ${stepData.value!!.instruction} ${stepData.value!!.leftStepDistance}") if (route.currentStepIndex + 1 <= curLeg.steps.size) { nextStepData.value = nextStep() } @@ -390,7 +391,7 @@ class MainActivity : ComponentActivity() { for ((index, waypoint) in routeModel.curRoute.waypoints.withIndex()) { if (routeModel.isNavigating()) { val deviation = 0.0 - if (index in 300..routeModel.curRoute.waypoints.size) { + if (index in 0..routeModel.curRoute.waypoints.size) { mock.setMockLocation(waypoint[1], waypoint[0]) delay(500L) // } @@ -408,7 +409,7 @@ class MainActivity : ComponentActivity() { navigationViewModel ) val step = routeModel.currentStep() - println("Step: ${step}") + println("Step: ${step.instruction} ${step.leftStepDistance}") if (step.leftStepDistance == 70.0) { println("") } diff --git a/common/data/src/main/java/com/kouros/navigation/data/NavigationRepository.kt b/common/data/src/main/java/com/kouros/navigation/data/NavigationRepository.kt index d477045..95e07c4 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/NavigationRepository.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/NavigationRepository.kt @@ -33,12 +33,6 @@ abstract class NavigationRepository { //private val nominatimUrl = "https://kouros-online.de/nominatim/" - val tomtomApiKey = "678k5v6940cSXXIS5oD92qIrDgW3RBZ3" - - private val tomtomUrl = "https://api.tomtom.com/traffic/services/5/incidentDetails" - - private val tomtomFields = - "{incidents{type,geometry{type,coordinates},properties{iconCategory,events{description}}}}" abstract fun getRoute( context: Context, @@ -48,6 +42,7 @@ abstract class NavigationRepository { searchFilter: SearchFilter ): String + abstract fun getTraffic(context: Context, location: Location, carOrientation: Float): String fun getRouteDistance( currentLocation: Location, location: Location, @@ -78,23 +73,7 @@ abstract class NavigationRepository { ) } - fun getTraffic(context: Context, location: Location, carOrientation: Float): String { - val useAsset = false - val bbox = calculateSquareRadius(location.latitude, location.longitude, 15.0) - return if (useAsset) { - val trafficJson = context.resources.openRawResource(R.raw.tomtom_traffic) - trafficJson.bufferedReader().use { it.readText() } - } else { - val trafficResult = fetchUrl( - "$tomtomUrl?key=$tomtomApiKey&bbox=$bbox&fields=$tomtomFields&language=en-GB&timeValidityFilter=present", - false - ) - trafficResult.replace( - "{\"incidents\":", - "{\"type\": \"FeatureCollection\", \"features\":" - ) - } - } + fun fetchUrl(url: String, authenticator: Boolean): String { try { diff --git a/common/data/src/main/java/com/kouros/navigation/data/osrm/OsrmRepository.kt b/common/data/src/main/java/com/kouros/navigation/data/osrm/OsrmRepository.kt index 1e86d9b..5eaac6b 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/osrm/OsrmRepository.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/osrm/OsrmRepository.kt @@ -26,4 +26,12 @@ class OsrmRepository : NavigationRepository() { val routeLocation = "${currentLocation.longitude},${currentLocation.latitude};${location.longitude},${location.latitude}?steps=true&alternatives=0" return fetchUrl(routeUrl + routeLocation + exclude, true) } + + override fun getTraffic( + context: Context, + location: Location, + carOrientation: Float + ): String { + TODO("Not yet implemented") + } } \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRepository.kt b/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRepository.kt index d8ce84b..4e77006 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRepository.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRepository.kt @@ -5,10 +5,19 @@ import android.location.Location import com.kouros.data.R import com.kouros.navigation.data.NavigationRepository import com.kouros.navigation.data.SearchFilter +import com.kouros.navigation.utils.GeoUtils.calculateSquareRadius private const val routeUrl = "https://api.tomtom.com/routing/1/calculateRoute/" +val tomtomApiKey = "678k5v6940cSXXIS5oD92qIrDgW3RBZ3" + +val tomtomTrafficUrl = "https://api.tomtom.com/traffic/services/5/incidentDetails" + + +private val tomtomFields = + "{incidents{type,geometry{type,coordinates},properties{iconCategory,events{description}}}}" + class TomTomRepository : NavigationRepository() { override fun getRoute( context: Context, @@ -17,9 +26,9 @@ class TomTomRepository : NavigationRepository() { carOrientation: Float, searchFilter: SearchFilter ): String { - //val routeJson = context.resources.openRawResource(R.raw.tomom_routing) - //val routeJsonString = routeJson.bufferedReader().use { it.readText() } - //return routeJsonString + val routeJson = context.resources.openRawResource(R.raw.tomom_routing) + val routeJsonString = routeJson.bufferedReader().use { it.readText() } + return routeJsonString val url = routeUrl + "${currentLocation.latitude},${currentLocation.longitude}:${location.latitude},${location.longitude}" + "/json?vehicleHeading=90§ionType=traffic&report=effectiveSettings&routeType=eco" + @@ -33,4 +42,22 @@ class TomTomRepository : NavigationRepository() { false ) } + + override fun getTraffic(context: Context, location: Location, carOrientation: Float): String { + val useAsset = true + val bbox = calculateSquareRadius(location.latitude, location.longitude, 15.0) + return if (useAsset) { + val trafficJson = context.resources.openRawResource(R.raw.tomtom_traffic) + trafficJson.bufferedReader().use { it.readText() } + } else { + val trafficResult = fetchUrl( + "$tomtomTrafficUrl?key=$tomtomApiKey&bbox=$bbox&fields=$tomtomFields&language=en-GB&timeValidityFilter=present", + false + ) + trafficResult.replace( + "{\"incidents\":", + "{\"type\": \"FeatureCollection\", \"features\":" + ) + } + } } \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/valhalla/ValhallaRepository.kt b/common/data/src/main/java/com/kouros/navigation/data/valhalla/ValhallaRepository.kt index 3a9882f..aac6645 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/valhalla/ValhallaRepository.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/valhalla/ValhallaRepository.kt @@ -47,4 +47,12 @@ class ValhallaRepository : NavigationRepository() { val routeLocation = Json.encodeToString(valhallaLocation) return fetchUrl(routeUrl + routeLocation, true) } + + override fun getTraffic( + context: Context, + location: Location, + carOrientation: Float + ): String { + TODO("Not yet implemented") + } } \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/model/RouteModel.kt b/common/data/src/main/java/com/kouros/navigation/model/RouteModel.kt index a6d1a09..2a32804 100644 --- a/common/data/src/main/java/com/kouros/navigation/model/RouteModel.kt +++ b/common/data/src/main/java/com/kouros/navigation/model/RouteModel.kt @@ -136,25 +136,25 @@ open class RouteModel() { } return lanes - var inter = Intersection() - var nearestDistance = 100000.0f - route.currentStep().intersection.forEach { - if (it.lane.isNotEmpty()) { - val distance = location.distanceTo(location(it.location[0], it.location[1])) - val interBearing = location.bearingTo(location(it.location[0], it.location[1])) - if (distance < nearestDistance) { - nearestDistance = distance - if (distance <= NEXT_STEP_THRESHOLD * 3) { - if (route.routeEngine == RouteEngine.TOMTOM.ordinal - || (interBearing.absoluteValue - route.currentStep().maneuver.bearingAfter.absoluteValue).absoluteValue < 20 - ) { - inter = it - } - } - } - } - } - return inter.lane +// var inter = Intersection() +// var nearestDistance = 100000.0f +// route.currentStep().intersection.forEach { +// if (it.lane.isNotEmpty()) { +// val distance = location.distanceTo(location(it.location[0], it.location[1])) +// val interBearing = location.bearingTo(location(it.location[0], it.location[1])) +// if (distance < nearestDistance) { +// nearestDistance = distance +// if (distance <= NEXT_STEP_THRESHOLD * 3) { +// if (route.routeEngine == RouteEngine.TOMTOM.ordinal +// || (interBearing.absoluteValue - route.currentStep().maneuver.bearingAfter.absoluteValue).absoluteValue < 20 +// ) { +// inter = it +// } +// } +// } +// } +// } +// return inter.lane } fun updateSpeedLimit(location: Location, viewModel: ViewModel) = runBlocking { @@ -188,7 +188,7 @@ open class RouteModel() { fun currentStep(): StepData { val distanceToNextStep = leftStepDistance() // Determine the maneuver type and corresponding icon - val currentStep = route.nextStep(1) // This advances the route's state + val currentStep = route.nextStep(1) // Safely get the street name from the maneuver val streetName = currentStep.name val curManeuverType = currentStep.maneuver.type @@ -270,7 +270,8 @@ open class RouteModel() { /** Returns the current [Step] left distance in m. */ fun leftStepDistance(): Double { val step = route.currentStep() - var leftDistance = 0.0 + println(step.index) + var leftDistance = 0F for (i in step.waypointIndex..