Route planning
Request accessRoute planning
The TripManager component handles all route planning operations in the Client Integration Library, including planning routes to destinations, managing waypoints, configuring routing preferences, and controlling the trip lifecycle.
Overview
TripManager provides functionality for:
- Planning routes
- Adding and removing waypoints
- Configuring avoid preferences (tolls, ferries, motorways, etc.)
- Canceling active trips
- Starting navigation for the planned trip
- Observing trip progress during navigation
- Retrieving route polyline
Planning a basic trip
To plan a simple route to a destination, use the planTrip method with TripPlanningParameters.ToDestination:
import android.util.Logimport com.tomtom.automotive.integration.client.api.model.NavigableLocationimport com.tomtom.automotive.integration.client.api.trip.TripManagerimport com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningCallbackimport com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningFailureimport com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningParametersimport com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningResponseimport com.tomtom.automotive.integration.client.api.model.trip.Tripimport com.tomtom.automotive.integration.client.common.Callbackimport com.tomtom.automotive.integration.client.common.Resultimport com.tomtom.automotive.integration.client.common.SdkReleasable
private val TAG = "TripPlanning"private var planTripReleasable: SdkReleasable? = nullprivate var currentTrip: Trip? = null
fun planTrip(tripManager: TripManager, destination: NavigableLocation) { val parameters = TripPlanningParameters.ToDestination( destination = destination, avoids = null, waypoints = null )
planTripReleasable = tripManager.planTrip( tripPlanningParameters = parameters, callback = object : TripPlanningCallback { override fun onTripPlanned(response: Result<TripPlanningResponse, TripPlanningFailure>) { when (response) { is Result.Success -> { val trip = response.value.trip Log.d(TAG, "Trip planned: ${trip.id}") currentTrip = trip } is Result.Failure -> { Log.e(TAG, "Error planning trip: ${response.failure}") } } }
override fun onFunctionalityUnavailable(reason: Callback.Reason) { Log.e(TAG, "Trip planning unavailable: ${reason.devMessage}") } } )}Planning with waypoints
For routes with multiple stops, include waypoints in your trip planning parameters:
import android.util.Logimport com.tomtom.automotive.integration.client.api.model.Coordinateimport com.tomtom.automotive.integration.client.api.model.NavigableLocationimport com.tomtom.automotive.integration.client.api.trip.TripManagerimport com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningCallbackimport com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningFailureimport com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningParametersimport com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningResponseimport com.tomtom.automotive.integration.client.common.Callbackimport com.tomtom.automotive.integration.client.common.Resultimport com.tomtom.automotive.integration.client.common.SdkReleasable
private val TAG = "TripPlanning"private var planTripReleasable: SdkReleasable? = null
fun planTripWithWaypoints( tripManager: TripManager, destination: NavigableLocation, waypoints: List<NavigableLocation>) { val parameters = TripPlanningParameters.ToDestination( destination = destination, avoids = null, waypoints = waypoints )
planTripReleasable = tripManager.planTrip( tripPlanningParameters = parameters, callback = object : TripPlanningCallback { override fun onTripPlanned(response: Result<TripPlanningResponse, TripPlanningFailure>) { when (response) { is Result.Success -> { Log.d(TAG, "Trip with waypoints planned: ${response.value.trip.id}") } is Result.Failure -> { Log.e(TAG, "Error planning trip: ${response.failure}") } } }
override fun onFunctionalityUnavailable(reason: Callback.Reason) { Log.e(TAG, "Trip planning unavailable: ${reason.devMessage}") } } )}
// Example usageval waypoints = listOf( NavigableLocation.Place(Coordinate(latitude = 52.3676, longitude = 4.9041), address = null), NavigableLocation.Place(Coordinate(latitude = 52.5200, longitude = 13.4050), address = null))Waypoints are visited in the order they appear in the list.
Configuring route avoidances
Specify road types to avoid when planning a trip:
import android.util.Logimport com.tomtom.automotive.integration.client.api.model.NavigableLocationimport com.tomtom.automotive.integration.client.api.model.trip.TripPlanningAvoidsimport com.tomtom.automotive.integration.client.api.trip.TripManagerimport com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningCallbackimport com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningFailureimport com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningParametersimport com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningResponseimport com.tomtom.automotive.integration.client.common.Callbackimport com.tomtom.automotive.integration.client.common.Result
private val TAG = "TripPlanning"
fun planTripWithAvoidances( tripManager: TripManager, destination: NavigableLocation, avoidTolls: Boolean, avoidFerries: Boolean, avoidMotorways: Boolean) { val avoids = buildSet { if (avoidTolls) add(TripPlanningAvoids.TOLLS) if (avoidFerries) add(TripPlanningAvoids.FERRY) if (avoidMotorways) add(TripPlanningAvoids.MOTORWAY) }
val parameters = TripPlanningParameters.ToDestination( destination = destination, avoids = avoids.takeIf { it.isNotEmpty() }, waypoints = null )
tripManager.planTrip( tripPlanningParameters = parameters, callback = object : TripPlanningCallback { override fun onTripPlanned(response: Result<TripPlanningResponse, TripPlanningFailure>) { when (response) { is Result.Success -> { Log.d(TAG, "Trip planned: ${response.value.trip.id}") } is Result.Failure -> { Log.e(TAG, "Error planning trip: ${response.failure}") } } }
override fun onFunctionalityUnavailable(reason: Callback.Reason) { Log.e(TAG, "Trip planning unavailable: ${reason.devMessage}") } } )}Available avoid options
The library supports the following avoidance preferences:
TripPlanningAvoids.TOLLS- Avoid toll roadsTripPlanningAvoids.MOTORWAY- Avoid highwaysTripPlanningAvoids.FERRY- Avoid ferriesTripPlanningAvoids.UNPAVED_ROAD- Avoid unpaved roadsTripPlanningAvoids.BORDER_CROSSING- Avoid border crossingsTripPlanningAvoids.CARPOOLS- Avoid high occupancy vehicle roadsTripPlanningAvoids.TUNNELS- Avoid tunnelsTripPlanningAvoids.LOW_EMISSION_ZONES- Avoid low emission zones
Managing waypoints on active trips
Adding waypoints
Add intermediate stops to an active trip:
import android.util.Logimport com.tomtom.automotive.integration.client.api.model.NavigableLocationimport com.tomtom.automotive.integration.client.api.model.trip.RouteStopimport com.tomtom.automotive.integration.client.api.trip.TripManagerimport com.tomtom.automotive.integration.client.api.trip.waypoints.AddWaypointParametersimport com.tomtom.automotive.integration.client.api.trip.waypoints.UpdateWaypointsCallbackimport com.tomtom.automotive.integration.client.api.trip.waypoints.UpdateWaypointsFailureimport com.tomtom.automotive.integration.client.api.trip.waypoints.UpdateWaypointsResponseimport com.tomtom.automotive.integration.client.common.Callbackimport com.tomtom.automotive.integration.client.common.Result
private val TAG = "TripPlanning"
fun addWaypoint(tripManager: TripManager, location: NavigableLocation) { val parameters = AddWaypointParameters(waypoint = location)
tripManager.addWaypoint( params = parameters, callback = object : UpdateWaypointsCallback { override fun onWaypointsUpdated(response: Result<UpdateWaypointsResponse, UpdateWaypointsFailure>) { when (response) { is Result.Success -> { val waypoints: List<RouteStop> = response.value.trip.itinerary.waypoints Log.d(TAG, "Waypoint added successfully. Total waypoints: ${waypoints.size}") } is Result.Failure -> { Log.e(TAG, "Failed to add waypoint: ${response.failure}") } } }
override fun onFunctionalityUnavailable(reason: Callback.Reason) { Log.e(TAG, "Add waypoint unavailable: ${reason.devMessage}") } } )}Removing waypoints
Remove a waypoint from the trip:
import android.util.Logimport com.tomtom.automotive.integration.client.api.model.trip.RouteStopimport com.tomtom.automotive.integration.client.api.trip.TripManagerimport com.tomtom.automotive.integration.client.api.trip.waypoints.RemoveWaypointParametersimport com.tomtom.automotive.integration.client.api.trip.waypoints.UpdateWaypointsCallbackimport com.tomtom.automotive.integration.client.api.trip.waypoints.UpdateWaypointsFailureimport com.tomtom.automotive.integration.client.api.trip.waypoints.UpdateWaypointsResponseimport com.tomtom.automotive.integration.client.common.Callbackimport com.tomtom.automotive.integration.client.common.Result
private val TAG = "TripPlanning"
fun removeWaypoint(tripManager: TripManager, routeStop: RouteStop) { val parameters = RemoveWaypointParameters(waypoint = routeStop)
tripManager.removeWaypoint( params = parameters, callback = object : UpdateWaypointsCallback { override fun onWaypointsUpdated(response: Result<UpdateWaypointsResponse, UpdateWaypointsFailure>) { when (response) { is Result.Success -> { Log.d(TAG, "Waypoint removed successfully") } is Result.Failure -> { Log.e(TAG, "Failed to remove waypoint: ${response.failure}") } } }
override fun onFunctionalityUnavailable(reason: Callback.Reason) { Log.e(TAG, "Remove waypoint unavailable: ${reason.devMessage}") } } )}Observing trip progress
Monitor navigation progress:
import android.util.Logimport com.tomtom.automotive.integration.client.api.trip.TripManagerimport com.tomtom.automotive.integration.client.api.trip.tripprogress.TripProgressInfoimport com.tomtom.automotive.integration.client.api.trip.tripprogress.TripProgressListenerimport com.tomtom.automotive.integration.client.api.trip.tripprogress.TripProgressParametersimport com.tomtom.automotive.integration.client.common.Callbackimport com.tomtom.automotive.integration.client.common.SdkReleasable
private val TAG = "TripPlanning"private var tripProgressReleasable: SdkReleasable? = null
fun observeTripProgress(tripManager: TripManager) { tripProgressReleasable = tripManager.observeTripProgress( tripProgressParameters = TripProgressParameters(), tripProgressListener = object : TripProgressListener { override fun onTripProgress(info: TripProgressInfo) { Log.d(TAG, "Remaining distance: ${info.distanceRemaining.formattedValue?.formatted}") Log.d(TAG, "Remaining time: ${info.remainingTime.formattedValue?.formatted}") Log.d(TAG, "ETA: ${info.eta.formattedValue?.formatted}") }
override fun onFunctionalityUnavailable(reason: Callback.Reason) { Log.e(TAG, "Trip progress unavailable: ${reason.devMessage}") } } )}
fun unObserveTripProgress() { tripProgressReleasable?.release() tripProgressReleasable = null}Retrieving the route polyline
The route polyline represents the geometric path of a navigated route as a sequence of geographic coordinates. Each coordinate in the polyline contains latitude and longitude values in degrees.
import android.util.Logimport com.tomtom.automotive.integration.client.api.model.Coordinateimport com.tomtom.automotive.integration.client.api.model.quantity.Distanceimport com.tomtom.automotive.integration.client.api.trip.TripManagerimport com.tomtom.automotive.integration.client.api.trip.routepolyline.RoutePolylineCallbackimport com.tomtom.automotive.integration.client.api.trip.routepolyline.RoutePolylineFailureimport com.tomtom.automotive.integration.client.api.trip.routepolyline.RoutePolylineParametersimport com.tomtom.automotive.integration.client.api.trip.routepolyline.RoutePolylineResponseimport com.tomtom.automotive.integration.client.common.Callbackimport com.tomtom.automotive.integration.client.common.Resultimport com.tomtom.automotive.integration.client.common.SdkReleasable
private val TAG = "TripPlanning"private var routePolylineReleasable: SdkReleasable? = null
fun getRoutePolyline(tripManager: TripManager) { // Request 100 polyline points from current location to destination val parameters = RoutePolylineParameters( numberOfPolylinePoints = 100, startOffset = null, // null means start from current location endOffset = null // null means end at the destination )
routePolylineReleasable = tripManager.getRoutePolyline( params = parameters, callback = object : RoutePolylineCallback { override fun onRoutePolyline(response: Result<RoutePolylineResponse, RoutePolylineFailure>) { when (response) { is Result.Success -> { val polylinePoints: List<Coordinate> = response.value.upcomingPolylinePoints Log.d(TAG, "Received ${polylinePoints.size} polyline points")
// Each coordinate contains latitude and longitude in degrees polylinePoints.forEach { coordinate -> Log.d(TAG, "Point: lat=${coordinate.latitude}, lon=${coordinate.longitude}") } } is Result.Failure -> { Log.e(TAG, "Failed to get route polyline: ${response.failure}") } } }
override fun onFunctionalityUnavailable(reason: Callback.Reason) { Log.e(TAG, "Route polyline unavailable: ${reason.devMessage}") } } )}
// Example: Get polyline for a specific segment of the routefun getRoutePolylineSegment(tripManager: TripManager) { val parameters = RoutePolylineParameters( numberOfPolylinePoints = 50, startOffset = Distance.Companion.meters(1000.0), // Start 1km from route start endOffset = Distance.Companion.meters(5000.0) // End 5km from route start )
tripManager.getRoutePolyline(params = parameters, callback = object : RoutePolylineCallback { override fun onRoutePolyline(response: Result<RoutePolylineResponse, RoutePolylineFailure>) { when (response) { is Result.Success -> { Log.d(TAG, "Retrieved polyline segment with ${response.value.upcomingPolylinePoints.size} points") } is Result.Failure -> { Log.e(TAG, "Failed to get polyline segment: ${response.failure}") } } }
override fun onFunctionalityUnavailable(reason: Callback.Reason) { Log.e(TAG, "Route polyline unavailable: ${reason.devMessage}") } })}Polyline data structure
The RoutePolylineResponse contains:
upcomingPolylinePoints: A list ofCoordinateobjects representing the route geometry
Each Coordinate object provides:
latitude: The latitude in degrees (range: -90.0 to 90.0)longitude: The longitude in degrees (range: -180.0 to 180.0)
The polyline points are ordered sequentially along the route from the start offset to the end offset. You can control the density of points by adjusting the numberOfPolylinePoints parameter, and specify which portion of the route to retrieve using the startOffset and endOffset parameters.
Canceling a trip
Stop an active navigation session:
import android.util.Logimport com.tomtom.automotive.integration.client.api.trip.TripManagerimport com.tomtom.automotive.integration.client.api.trip.canceltrip.CancelTripCallbackimport com.tomtom.automotive.integration.client.api.trip.canceltrip.CancelTripFailureimport com.tomtom.automotive.integration.client.api.trip.canceltrip.CancelTripParametersimport com.tomtom.automotive.integration.client.api.trip.canceltrip.CancelTripResponseimport com.tomtom.automotive.integration.client.common.Callbackimport com.tomtom.automotive.integration.client.common.Result
private val TAG = "TripPlanning"
fun cancelTrip(tripManager: TripManager) { tripManager.cancelTrip( parameters = CancelTripParameters(tripId = null), callback = object : CancelTripCallback { override fun onTripCancelled(response: Result<CancelTripResponse, CancelTripFailure>) { when (response) { is Result.Success -> { Log.d(TAG, "Trip cancelled: ${response.value.tripId}") } is Result.Failure -> { Log.e(TAG, "Failed to cancel trip: ${response.failure}") } } }
override fun onFunctionalityUnavailable(reason: Callback.Reason) { Log.e(TAG, "Cancel trip unavailable: ${reason.devMessage}") } } )}