From 3c323da2b5ee45be63ece78d9dc32ba54d03ad59 Mon Sep 17 00:00:00 2001 From: VysotskiVadim Date: Thu, 28 Jul 2022 16:17:37 +0200 Subject: [PATCH 01/12] prototyping --- .../examples/core/MapboxNavigationActivity.kt | 60 ++-- .../res/layout/layout_activity_navigation.xml | 10 + .../core/PreviewRoutesTest.kt | 141 ++++++++++ .../utils/coroutines/TestUtils.kt | 14 +- .../navigation/core/MapboxNavigation.kt | 34 +++ .../directions/session/DirectionsSession.kt | 2 + .../session/MapboxDirectionsSession.kt | 16 +- .../core/directions/session/RoutesExtra.kt | 4 + .../core/trip/session/NavigationSession.kt | 87 +++++- .../NavigationSessionStateObserverV2.kt | 15 + .../trip/session/NavigationSessionUtils.kt | 19 ++ .../session/MapboxDirectionsSessionTest.kt | 66 +++++ .../trip/session/NavigationSessionTest.kt | 260 ++++++++++++++---- 13 files changed, 637 insertions(+), 91 deletions(-) create mode 100644 instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/core/PreviewRoutesTest.kt create mode 100644 libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/NavigationSessionStateObserverV2.kt diff --git a/examples/src/main/java/com/mapbox/navigation/examples/core/MapboxNavigationActivity.kt b/examples/src/main/java/com/mapbox/navigation/examples/core/MapboxNavigationActivity.kt index 7f4b5aac9fc..2c3670bac45 100644 --- a/examples/src/main/java/com/mapbox/navigation/examples/core/MapboxNavigationActivity.kt +++ b/examples/src/main/java/com/mapbox/navigation/examples/core/MapboxNavigationActivity.kt @@ -10,6 +10,7 @@ import android.view.View.VISIBLE import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat +import androidx.lifecycle.lifecycleScope import com.mapbox.api.directions.v5.models.RouteOptions import com.mapbox.bindgen.Expected import com.mapbox.geojson.Point @@ -52,6 +53,7 @@ import com.mapbox.navigation.ui.maps.location.NavigationLocationProvider import com.mapbox.navigation.ui.maps.route.arrow.api.MapboxRouteArrowApi import com.mapbox.navigation.ui.maps.route.arrow.api.MapboxRouteArrowView import com.mapbox.navigation.ui.maps.route.arrow.model.RouteArrowOptions +import com.mapbox.navigation.ui.maps.route.line.MapboxRouteLineApiExtensions.setNavigationRoutes import com.mapbox.navigation.ui.maps.route.line.MapboxRouteLineApiExtensions.setRoutes import com.mapbox.navigation.ui.maps.route.line.api.MapboxRouteLineApi import com.mapbox.navigation.ui.maps.route.line.api.MapboxRouteLineView @@ -89,6 +91,8 @@ class MapboxNavigationActivity : AppCompatActivity() { // location puck integration private val navigationLocationProvider = NavigationLocationProvider() + private val waypoints = mutableListOf() + // camera private lateinit var navigationCamera: NavigationCamera private lateinit var viewportDataSource: MapboxNavigationViewportDataSource @@ -229,15 +233,19 @@ class MapboxNavigationActivity : AppCompatActivity() { } private val routesObserver = RoutesObserver { result -> - if (result.routes.isNotEmpty()) { + if (result.navigationRoutes.isNotEmpty()) { // generate route geometries asynchronously and render them - CoroutineScope(Dispatchers.Main).launch { - val result = routeLineAPI.setRoutes( - listOf(RouteLine(result.routes.first(), null)) - ) - val style = mapboxMap.getStyle() - if (style != null) { - routeLineView.renderRouteDrawData(style, result) + lifecycleScope.launch { + routeLineAPI.setNavigationRoutes( + newRoutes = result.navigationRoutes, + alternativeRoutesMetadata = mapboxNavigation.getAlternativeMetadataFor( + result.navigationRoutes + ) + ).apply { + routeLineView.renderRouteDrawData( + binding.mapView.getMapboxMap().getStyle()!!, + this + ) } } @@ -399,7 +407,7 @@ class MapboxNavigationActivity : AppCompatActivity() { routeLineView.initializeLayers(style) // add long click listener that search for a route to the clicked destination binding.mapView.gestures.addOnMapLongClickListener { point -> - findRoute(point) + addWaypoint(point) true } } @@ -460,24 +468,26 @@ class MapboxNavigationActivity : AppCompatActivity() { voiceInstructionsPlayer.shutdown() } - private fun findRoute(destination: Point) { + private fun addWaypoint(destination: Point) { val origin = navigationLocationProvider.lastLocation?.let { Point.fromLngLat(it.longitude, it.latitude) } ?: return + waypoints.add(destination) + mapboxNavigation.requestRoutes( RouteOptions.builder() .applyDefaultNavigationOptions() .applyLanguageAndVoiceUnitOptions(this) - .coordinatesList(listOf(origin, destination)) - .layersList(listOf(mapboxNavigation.getZLevel(), null)) + .alternatives(true) + .coordinatesList(listOf(origin) + waypoints) .build(), object : NavigationRouterCallback { override fun onRoutesReady( routes: List, routerOrigin: RouterOrigin ) { - setRouteAndStartNavigation(routes) + setRoutePreview(routes) } override fun onFailure( @@ -494,9 +504,25 @@ class MapboxNavigationActivity : AppCompatActivity() { ) } - private fun setRouteAndStartNavigation(route: List) { + + + private fun setRoutePreview(route: List) { // set route - mapboxNavigation.setNavigationRoutes(route) + mapboxNavigation.previewNavigationRoutes(route) + binding.navigate.visibility = VISIBLE + binding.navigate.setOnClickListener { + setRoute() + binding.navigate.visibility = INVISIBLE + } + + // move the camera to overview when new route is available + navigationCamera.requestNavigationCameraToOverview() + } + + private fun setRoute() { + // set route + mapboxNavigation.setNavigationRoutes(mapboxNavigation.getPreviewedNavigationRoutes()) + waypoints.clear() // show UI elements binding.soundButton.visibility = VISIBLE @@ -506,12 +532,12 @@ class MapboxNavigationActivity : AppCompatActivity() { binding.soundButton.unmuteAndExtend(2000L) // move the camera to overview when new route is available - navigationCamera.requestNavigationCameraToOverview() + navigationCamera.requestNavigationCameraToFollowing() } private fun clearRouteAndStopNavigation() { // clear - mapboxNavigation.setRoutes(listOf()) + mapboxNavigation.clearRoutes() // hide UI elements binding.soundButton.visibility = INVISIBLE diff --git a/examples/src/main/res/layout/layout_activity_navigation.xml b/examples/src/main/res/layout/layout_activity_navigation.xml index 1a6f38c5d9e..607cf58a5c4 100644 --- a/examples/src/main/res/layout/layout_activity_navigation.xml +++ b/examples/src/main/res/layout/layout_activity_navigation.xml @@ -13,6 +13,16 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> +