feat: Navigation observer

This commit is contained in:
Piotr Dec 2024-07-19 22:15:32 +02:00
parent 9db0e3611c
commit 0a1c908a9d
Signed by: stawros
GPG key ID: F89F27AD8F881A91
4 changed files with 90 additions and 8 deletions

View file

@ -32,7 +32,8 @@ class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var mapControl: MapControl
private val navigationObserver = NavigationObserver()
private lateinit var navigationObserver: NavigationObserver
private lateinit var initThread: Thread
val permissionsHelper = PermissionsHelper(WeakReference(this))
init {
@ -62,13 +63,27 @@ class MainActivity : AppCompatActivity() {
.build()
}
}
MapboxNavigationApp.current()?.startTripSession()
mapControl = MapControl(this, binding.mapView, resources)
mapControl = MapControl(binding.mapView, resources)
mapControl.init()
navigationObserver = NavigationObserver(mapControl)
}
initThread = Thread {
while (true) {
if (MapboxNavigationApp.current() != null) {
MapboxNavigationApp.current()!!.startTripSession()
threadCallback()
}
Thread.sleep(100)
}
}
initThread.start()
bluetoothInit()
}
private fun threadCallback() {
initThread.join()
}
override fun onStart() {
super.onStart()
// MapboxNavigationApp.current()?.registerRouteProgressObserver(routeProgressObserver)

View file

@ -2,6 +2,7 @@ package eu.ztsh.garmin.mapbox
import android.content.res.Resources
import android.util.Log
import com.mapbox.api.directions.v5.models.RouteOptions
import com.mapbox.maps.EdgeInsets
import com.mapbox.maps.MapView
import com.mapbox.maps.Style
@ -10,12 +11,45 @@ import com.mapbox.maps.plugin.locationcomponent.location
import com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions
import com.mapbox.maps.plugin.viewport.state.FollowPuckViewportState
import com.mapbox.maps.plugin.viewport.viewport
import eu.ztsh.garmin.MainActivity
import com.mapbox.navigation.base.extensions.applyDefaultNavigationOptions
import com.mapbox.navigation.base.route.NavigationRoute
import com.mapbox.navigation.base.route.NavigationRouterCallback
import com.mapbox.navigation.base.route.RouterFailure
import com.mapbox.navigation.base.route.RouterOrigin
import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp
import com.mapbox.navigation.ui.maps.location.NavigationLocationProvider
import com.mapbox.navigation.utils.internal.toPoint
class MapControl(val mapView: MapView, private val resources: Resources) {
val navigationLocationProvider = NavigationLocationProvider()
val routesRequestCallback = object : NavigationRouterCallback {
override fun onRoutesReady(routes: List<NavigationRoute>, @RouterOrigin routerOrigin: String) {
MapboxNavigationApp.current()?.setNavigationRoutes(routes)
}
override fun onFailure(reasons: List<RouterFailure>, routeOptions: RouteOptions) {
Log.e(TAG, "onFailure: ")
}
override fun onCanceled(routeOptions: RouteOptions, @RouterOrigin routerOrigin: String) {
Log.w(TAG, "onCanceled: ")
}
}
class MapControl(private val context: MainActivity, private val mapView: MapView, private val resources: Resources) {
fun init() {
mapView.mapboxMap.loadStyle(Style.TRAFFIC_DAY) // TODO: base on sun position
mapView.location.apply {
// locationProvider = this.getLocationProvider()
// setLocationProvider(navigationLocationProvider)
puckBearingEnabled = true
enabled = true
}
follow(true)
setGestures(mapView)
}
@ -52,6 +86,16 @@ class MapControl(private val context: MainActivity, private val mapView: MapView
}
true
}
addOnMapLongClickListener { point ->
MapboxNavigationApp.current()?.requestRoutes(
RouteOptions.builder()
.applyDefaultNavigationOptions()
.coordinatesList(mutableListOf(navigationLocationProvider.lastLocation!!.toPoint(), point))
.build(),
routesRequestCallback
)
true
}
}
}

View file

@ -1,16 +1,41 @@
package eu.ztsh.garmin.mapbox
import android.util.Log
import com.mapbox.common.location.Location
import com.mapbox.navigation.core.MapboxNavigation
import com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver
import com.mapbox.navigation.core.trip.session.LocationMatcherResult
import com.mapbox.navigation.core.trip.session.LocationObserver
import com.mapbox.navigation.ui.maps.camera.data.MapboxNavigationViewportDataSource
class NavigationObserver : MapboxNavigationObserver {
class NavigationObserver(private val mapControl: MapControl) : MapboxNavigationObserver {
private val viewportDataSource = MapboxNavigationViewportDataSource(mapControl.mapView.mapboxMap)
private val locationObserver = object : LocationObserver {
override fun onNewLocationMatcherResult(locationMatcherResult: LocationMatcherResult) {
mapControl.navigationLocationProvider.changePosition(
location = locationMatcherResult.enhancedLocation,
keyPoints = locationMatcherResult.keyPoints
)
viewportDataSource.onLocationChanged(locationMatcherResult.enhancedLocation)
viewportDataSource.evaluate()
}
override fun onNewRawLocation(rawLocation: Location) {
println()
}
}
override fun onAttached(mapboxNavigation: MapboxNavigation) {
mapboxNavigation.registerLocationObserver(locationObserver)
Log.d(TAG, "Attached")
}
override fun onDetached(mapboxNavigation: MapboxNavigation) {
mapboxNavigation.unregisterLocationObserver(locationObserver)
Log.d(TAG, "Detached")
}

View file

@ -5,6 +5,4 @@
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
mapbox:mapbox_locationComponentEnabled = "true"
mapbox:mapbox_locationComponentPuckBearingEnabled = "true"
tools:context=".MainActivity" />