Automotive Navigation Application

Route planning

Request access

Route 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.Log
import com.tomtom.automotive.integration.client.api.model.NavigableLocation
import com.tomtom.automotive.integration.client.api.trip.TripManager
import com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningCallback
import com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningFailure
import com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningParameters
import com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningResponse
import com.tomtom.automotive.integration.client.api.model.trip.Trip
import com.tomtom.automotive.integration.client.common.Callback
import com.tomtom.automotive.integration.client.common.Result
import com.tomtom.automotive.integration.client.common.SdkReleasable
private val TAG = "TripPlanning"
private var planTripReleasable: SdkReleasable? = null
private 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.Log
import com.tomtom.automotive.integration.client.api.model.Coordinate
import com.tomtom.automotive.integration.client.api.model.NavigableLocation
import com.tomtom.automotive.integration.client.api.trip.TripManager
import com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningCallback
import com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningFailure
import com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningParameters
import com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningResponse
import com.tomtom.automotive.integration.client.common.Callback
import com.tomtom.automotive.integration.client.common.Result
import 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 usage
val 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.Log
import com.tomtom.automotive.integration.client.api.model.NavigableLocation
import com.tomtom.automotive.integration.client.api.model.trip.TripPlanningAvoids
import com.tomtom.automotive.integration.client.api.trip.TripManager
import com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningCallback
import com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningFailure
import com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningParameters
import com.tomtom.automotive.integration.client.api.trip.plantrip.TripPlanningResponse
import com.tomtom.automotive.integration.client.common.Callback
import 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 roads
  • TripPlanningAvoids.MOTORWAY - Avoid highways
  • TripPlanningAvoids.FERRY - Avoid ferries
  • TripPlanningAvoids.UNPAVED_ROAD - Avoid unpaved roads
  • TripPlanningAvoids.BORDER_CROSSING - Avoid border crossings
  • TripPlanningAvoids.CARPOOLS - Avoid high occupancy vehicle roads
  • TripPlanningAvoids.TUNNELS - Avoid tunnels
  • TripPlanningAvoids.LOW_EMISSION_ZONES - Avoid low emission zones

Managing waypoints on active trips

Adding waypoints

Add intermediate stops to an active trip:

import android.util.Log
import com.tomtom.automotive.integration.client.api.model.NavigableLocation
import com.tomtom.automotive.integration.client.api.model.trip.RouteStop
import com.tomtom.automotive.integration.client.api.trip.TripManager
import com.tomtom.automotive.integration.client.api.trip.waypoints.AddWaypointParameters
import com.tomtom.automotive.integration.client.api.trip.waypoints.UpdateWaypointsCallback
import com.tomtom.automotive.integration.client.api.trip.waypoints.UpdateWaypointsFailure
import com.tomtom.automotive.integration.client.api.trip.waypoints.UpdateWaypointsResponse
import com.tomtom.automotive.integration.client.common.Callback
import 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.Log
import com.tomtom.automotive.integration.client.api.model.trip.RouteStop
import com.tomtom.automotive.integration.client.api.trip.TripManager
import com.tomtom.automotive.integration.client.api.trip.waypoints.RemoveWaypointParameters
import com.tomtom.automotive.integration.client.api.trip.waypoints.UpdateWaypointsCallback
import com.tomtom.automotive.integration.client.api.trip.waypoints.UpdateWaypointsFailure
import com.tomtom.automotive.integration.client.api.trip.waypoints.UpdateWaypointsResponse
import com.tomtom.automotive.integration.client.common.Callback
import 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.Log
import com.tomtom.automotive.integration.client.api.trip.TripManager
import com.tomtom.automotive.integration.client.api.trip.tripprogress.TripProgressInfo
import com.tomtom.automotive.integration.client.api.trip.tripprogress.TripProgressListener
import com.tomtom.automotive.integration.client.api.trip.tripprogress.TripProgressParameters
import com.tomtom.automotive.integration.client.common.Callback
import 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.Log
import com.tomtom.automotive.integration.client.api.model.Coordinate
import com.tomtom.automotive.integration.client.api.model.quantity.Distance
import com.tomtom.automotive.integration.client.api.trip.TripManager
import com.tomtom.automotive.integration.client.api.trip.routepolyline.RoutePolylineCallback
import com.tomtom.automotive.integration.client.api.trip.routepolyline.RoutePolylineFailure
import com.tomtom.automotive.integration.client.api.trip.routepolyline.RoutePolylineParameters
import com.tomtom.automotive.integration.client.api.trip.routepolyline.RoutePolylineResponse
import com.tomtom.automotive.integration.client.common.Callback
import com.tomtom.automotive.integration.client.common.Result
import 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 route
fun 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 of Coordinate objects 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.Log
import com.tomtom.automotive.integration.client.api.trip.TripManager
import com.tomtom.automotive.integration.client.api.trip.canceltrip.CancelTripCallback
import com.tomtom.automotive.integration.client.api.trip.canceltrip.CancelTripFailure
import com.tomtom.automotive.integration.client.api.trip.canceltrip.CancelTripParameters
import com.tomtom.automotive.integration.client.api.trip.canceltrip.CancelTripResponse
import com.tomtom.automotive.integration.client.common.Callback
import 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}")
}
}
)
}