mapbox / mapbox/mapbox-navigation-android

Navigation UI map doesn't zoom to origin on starting navigation in Android

Open
#4,407 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

jira-sync-complete
Dominant language
Kotlin
Stars
651
Forks
321
PR merge metrics
No merged PRs in 30d

Description

**Mapbox UI Navigation Android SDK version:**
1.5.1

Navigation UI map doesn't zoom to origin position on starting navigation. Voice instruction is heard, puck is seen but map doesn't zoom.

[Screenshot 1](https://dl3.pushbulletusercontent.com/3Fg9t41Ad0PygzZU1Dr9y6qMn3uxtQWm/Screenshot_2021-05-18-14-07-51-875_com.thegana.jpg)

But after dragging map a bit and clicking on recenter button (that appears after dragging map), it zooms to origin position as as expected.

[Screenshot 2](https://dl3.pushbulletusercontent.com/xgj4ZF4uVbMTYKWBxr61sefstUOlXTji/Screenshot_2021-05-18-14-17-23-610_com.thegana.jpg)

Here's a video demonstration of the issue.
[Video link](https://youtu.be/HHiPh8_xMFc)

I'm opening this activity from a react-native app and getting route as intent string passed from rn app.

`
package com.thegana.MapBoxDirections
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.mapbox.api.directions.v5.models.DirectionsRoute
import com.mapbox.mapboxsdk.Mapbox
import com.mapbox.navigation.core.MapboxNavigation
import com.mapbox.navigation.ui.NavigationViewOptions
import com.mapbox.navigation.ui.OnNavigationReadyCallback
import com.mapbox.navigation.ui.listeners.NavigationListener
import com.mapbox.navigation.ui.map.NavigationMapboxMap
import com.mapbox.geojson.Point
import android.location.Location;
import com.mapbox.api.directions.v5.DirectionsCriteria
import com.mapbox.api.directions.v5.models.RouteOptions
import com.mapbox.geojson.LineString
import com.mapbox.mapboxsdk.geometry.LatLng
import com.mapbox.navigation.base.internal.extensions.applyDefaultParams
import com.mapbox.navigation.core.directions.session.RoutesRequestCallback

import android.util.Log;

import com.thegana.R
import kotlinx.android.synthetic.main.activity_embedded_navigation.*

class MapboxActivity : AppCompatActivity(), OnNavigationReadyCallback, NavigationListener {
private lateinit var navigationMapboxMap: NavigationMapboxMap
private lateinit var mapboxNavigation: MapboxNavigation
private lateinit var routeString: String

private val route by lazy { getRoutes() }


override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

Mapbox.getInstance(applicationContext, getString(R.string.mapbox_access_token))
setContentView(R.layout.activity_embedded_navigation)
navigationView.onCreate(savedInstanceState)
navigationView.initialize(this)
}

override fun onLowMemory() {
super.onLowMemory()
navigationView.onLowMemory()
}

override fun onStart() {
super.onStart()
navigationView.onStart()
}

override fun onResume() {
super.onResume()
navigationView.onResume()
}

override fun onStop() {
super.onStop()
navigationView.onStop()
}

override fun onPause() {
super.onPause()
navigationView.onPause()
}

override fun onDestroy() {
navigationView.onDestroy()
super.onDestroy()
}

override fun onBackPressed() {
// If the navigation view didn't need to do anything, call super
if (!navigationView.onBackPressed()) {
super.onBackPressed()
}
}

override fun onSaveInstanceState(outState: Bundle) {
navigationView.onSaveInstanceState(outState)
super.onSaveInstanceState(outState)
}

override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
navigationView.onRestoreInstanceState(savedInstanceState)
}

override fun onNavigationReady(isRunning: Boolean) {
if (!isRunning && !::navigationMapboxMap.isInitialized) {
if (navigationView.retrieveNavigationMapboxMap() != null) {
this.navigationMapboxMap = navigationView.retrieveNavigationMapboxMap()!!
navigationView.retrieveMapboxNavigation()?.let { this.mapboxNavigation = it }

val optionsBuilder = NavigationViewOptions.builder(this)
optionsBuilder.navigationListener(this)
optionsBuilder.directionsRoute(route)
navigationView.startNavigation(optionsBuilder.build())
}
}
}

override fun onNavigationRunning() {
// Empty because not needed in this example
}

override fun onNavigationFinished() {
finish()
}

override fun onCancelNavigation() {
navigationView.stopNavigation()
finish()
}

private fun getRoutes(): DirectionsRoute {
routeString = intent.getStringExtra("routeString")
return DirectionsRoute.fromJson(routeString)
}

companion object {
private const val TAG = "MainActivity"
}
}
`

I tried adding navigationView.startCamera() on onNavigationRunning but didn't work.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the issue with the provided MapboxActivity flow, especially onNavigationReady, startNavigation, and onNavigationRunning, using the route passed through the intent. Trace the NavigationView camera behavior and verify that starting navigation automatically centers and zooms the map to the origin without requiring a drag or recenter action.

Written by the indexing model from the issue text.

Assessment

Tech stack
kotlin, react-native
Domain
mobile
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.