Skip to content

Commit 568d1e9

Browse files
committed
remove arrow layers when arrow component is detached (#6065)
1 parent 893ae7d commit 568d1e9

6 files changed

Lines changed: 53 additions & 8 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Mapbox welcomes participation and contributions from everyone.
99
#### Bug fixes and improvements
1010
- Marked `PredictiveCacheController`, `MapboxBuildingView`, `ViewportDataSourceUpdateObserver`, `NavigationScaleGestureHandler`, `NavigationCameraStateChangedObserver`, `NavigationCameraStateTransition`, `NavigationCameraTransition`, `TransitionEndListener`, `MapboxRecenterButton`, `MapboxRouteOverviewButton`, `MapboxJunctionView`, `MapboxSignboardView`, `MapboxRoadNameLabelView`, `MapboxRoadNameView`, `MapboxRouteArrowView`, `MapboxRouteLineView`, `MapboxCameraModeButton` methods and `View.capture` extension with `@UiThread` annotation. [#6235](https://github.com/mapbox/mapbox-navigation-android/pull/6235)
1111
- Marked `Binder`, `MapboxExtendableButton` methods and `MapboxNavigation#installComponents` methods with `@UiThread` annotation. [#6268](https://github.com/mapbox/mapbox-navigation-android/pull/6268)
12+
- Fixed an issue with `NavigationView` that caused `ViewOptionsCustomization.routeArrowOptions` to be ignored, if arrows have already been drawn on the map. [#6333](https://github.com/mapbox/mapbox-navigation-android/pull/6333)
1213

1314
## Mapbox Navigation SDK 2.9.0-alpha.2 - 16 September, 2022
1415
### Changelog

libnavui-maps/src/main/java/com/mapbox/navigation/ui/maps/internal/ui/RouteArrowComponent.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.mapbox.navigation.core.MapboxNavigation
66
import com.mapbox.navigation.core.internal.extensions.flowRouteProgress
77
import com.mapbox.navigation.core.internal.extensions.flowRoutesUpdated
88
import com.mapbox.navigation.ui.base.lifecycle.UIComponent
9+
import com.mapbox.navigation.ui.maps.route.arrow.RouteArrowUtils
910
import com.mapbox.navigation.ui.maps.route.arrow.api.MapboxRouteArrowApi
1011
import com.mapbox.navigation.ui.maps.route.arrow.api.MapboxRouteArrowView
1112
import com.mapbox.navigation.ui.maps.route.arrow.model.RouteArrowOptions
@@ -45,6 +46,7 @@ class RouteArrowComponent(
4546
super.onDetached(mapboxNavigation)
4647
mapboxMap.getStyle()?.also { style ->
4748
routeArrowView.render(style, routeArrowApi.clearArrows())
49+
RouteArrowUtils.removeLayers(style)
4850
}
4951
}
5052
}

libnavui-maps/src/main/java/com/mapbox/navigation/ui/maps/route/arrow/RouteArrowUtils.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import androidx.core.graphics.drawable.DrawableCompat
44
import com.mapbox.geojson.LineString
55
import com.mapbox.geojson.Point
66
import com.mapbox.maps.LayerPosition
7-
import com.mapbox.maps.MapboxExperimental
87
import com.mapbox.maps.Style
98
import com.mapbox.maps.extension.style.expressions.generated.Expression
109
import com.mapbox.maps.extension.style.layers.addPersistentLayer
@@ -55,7 +54,6 @@ internal object RouteArrowUtils {
5554
return arrowCurrentSliced.coordinates().reversed().plus(arrowUpcomingSliced.coordinates())
5655
}
5756

58-
@OptIn(MapboxExperimental::class)
5957
fun initializeLayers(style: Style, options: RouteArrowOptions) {
6058
if (layersAreInitialized(style)) {
6159
return
@@ -262,4 +260,15 @@ internal object RouteArrowUtils {
262260
style.styleLayerExists(RouteLayerConstants.ARROW_SHAFT_LINE_LAYER_ID) &&
263261
style.styleLayerExists(RouteLayerConstants.ARROW_HEAD_LAYER_ID)
264262
}
263+
264+
internal fun removeLayers(style: Style) {
265+
style.removeStyleImage(RouteLayerConstants.ARROW_HEAD_ICON_CASING)
266+
style.removeStyleImage(RouteLayerConstants.ARROW_HEAD_ICON)
267+
style.removeStyleLayer(RouteLayerConstants.ARROW_SHAFT_CASING_LINE_LAYER_ID)
268+
style.removeStyleLayer(RouteLayerConstants.ARROW_HEAD_CASING_LAYER_ID)
269+
style.removeStyleLayer(RouteLayerConstants.ARROW_SHAFT_LINE_LAYER_ID)
270+
style.removeStyleLayer(RouteLayerConstants.ARROW_HEAD_LAYER_ID)
271+
style.removeStyleSource(RouteLayerConstants.ARROW_SHAFT_SOURCE_ID)
272+
style.removeStyleSource(RouteLayerConstants.ARROW_HEAD_SOURCE_ID)
273+
}
265274
}

libnavui-maps/src/test/java/com/mapbox/navigation/ui/maps/internal/ui/RouteArrowComponentTest.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.mapbox.navigation.core.MapboxNavigation
1010
import com.mapbox.navigation.core.directions.session.RoutesObserver
1111
import com.mapbox.navigation.core.trip.session.RouteProgressObserver
1212
import com.mapbox.navigation.testing.MainCoroutineRule
13+
import com.mapbox.navigation.ui.maps.route.arrow.RouteArrowUtils
1314
import com.mapbox.navigation.ui.maps.route.arrow.api.MapboxRouteArrowApi
1415
import com.mapbox.navigation.ui.maps.route.arrow.api.MapboxRouteArrowView
1516
import com.mapbox.navigation.ui.maps.route.arrow.model.ClearArrowsValue
@@ -20,8 +21,10 @@ import io.mockk.Runs
2021
import io.mockk.every
2122
import io.mockk.just
2223
import io.mockk.mockk
24+
import io.mockk.mockkObject
2325
import io.mockk.mockkStatic
2426
import io.mockk.slot
27+
import io.mockk.unmockkObject
2528
import io.mockk.unmockkStatic
2629
import io.mockk.verify
2730
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -34,22 +37,25 @@ import org.junit.Test
3437
class RouteArrowComponentTest {
3538

3639
@get:Rule
37-
var coroutineRule = MainCoroutineRule()
40+
val coroutineRule = MainCoroutineRule()
3841

3942
private val context = mockk<Context>()
4043
private val routeArrowOptions by lazy { RouteArrowOptions.Builder(context).build() }
4144

4245
@Before
4346
fun setUp() {
4447
mockkStatic(AppCompatResources::class)
48+
mockkObject(RouteArrowUtils)
4549
every { AppCompatResources.getDrawable(any(), any()) } returns mockk(relaxed = true) {
4650
every { intrinsicHeight } returns 24
4751
every { intrinsicWidth } returns 24
4852
}
53+
every { RouteArrowUtils.removeLayers(any()) } just Runs
4954
}
5055

5156
@After
5257
fun tearDown() {
58+
unmockkObject(RouteArrowUtils)
5359
unmockkStatic(AppCompatResources::class)
5460
}
5561

@@ -131,6 +137,7 @@ class RouteArrowComponentTest {
131137
sut.onDetached(mockMapboxNavigation)
132138

133139
verify { mockView.render(mockStyle, clearValue) }
140+
verify { RouteArrowUtils.removeLayers(mockStyle) }
134141
}
135142

136143
private fun mockMapWithStyleLoaded(style: Style): MapboxMap = mockk {

libnavui-maps/src/test/java/com/mapbox/navigation/ui/maps/route/arrow/RouteArrowUtilsTest.kt

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import androidx.appcompat.content.res.AppCompatResources
77
import com.mapbox.bindgen.ExpectedFactory
88
import com.mapbox.geojson.Point
99
import com.mapbox.maps.Image
10-
import com.mapbox.maps.MapboxExperimental
1110
import com.mapbox.maps.Style
1211
import com.mapbox.navigation.base.trip.model.RouteLegProgress
1312
import com.mapbox.navigation.base.trip.model.RouteProgress
@@ -26,13 +25,13 @@ import io.mockk.mockk
2625
import io.mockk.mockkStatic
2726
import io.mockk.unmockkStatic
2827
import io.mockk.verify
28+
import io.mockk.verifySequence
2929
import org.junit.After
3030
import org.junit.Assert.assertEquals
3131
import org.junit.Assert.assertTrue
3232
import org.junit.Before
3333
import org.junit.Test
3434

35-
@OptIn(MapboxExperimental::class)
3635
class RouteArrowUtilsTest {
3736

3837
private val ctx: Context = mockk()
@@ -390,4 +389,31 @@ class RouteArrowUtilsTest {
390389
verify(exactly = 0) { style.addImage(ARROW_HEAD_ICON_CASING, any<Bitmap>()) }
391390
verify(exactly = 0) { style.addImage(ARROW_HEAD_ICON_CASING, any<Image>()) }
392391
}
392+
393+
@Test
394+
fun `styles sources are removed after style layers and images`() {
395+
val style = mockk<Style> {
396+
every { removeStyleSource(ARROW_SHAFT_SOURCE_ID) } returns mockk()
397+
every { removeStyleSource(ARROW_HEAD_SOURCE_ID) } returns mockk()
398+
every { removeStyleLayer(ARROW_SHAFT_CASING_LINE_LAYER_ID) } returns mockk()
399+
every { removeStyleLayer(ARROW_HEAD_CASING_LAYER_ID) } returns mockk()
400+
every { removeStyleLayer(ARROW_SHAFT_LINE_LAYER_ID) } returns mockk()
401+
every { removeStyleLayer(ARROW_HEAD_LAYER_ID) } returns mockk()
402+
every { removeStyleImage(ARROW_HEAD_ICON_CASING) } returns mockk()
403+
every { removeStyleImage(ARROW_HEAD_ICON) } returns mockk()
404+
}
405+
406+
RouteArrowUtils.removeLayers(style)
407+
408+
verifySequence {
409+
style.removeStyleImage(ARROW_HEAD_ICON_CASING)
410+
style.removeStyleImage(ARROW_HEAD_ICON)
411+
style.removeStyleLayer(ARROW_SHAFT_CASING_LINE_LAYER_ID)
412+
style.removeStyleLayer(ARROW_HEAD_CASING_LAYER_ID)
413+
style.removeStyleLayer(ARROW_SHAFT_LINE_LAYER_ID)
414+
style.removeStyleLayer(ARROW_HEAD_LAYER_ID)
415+
style.removeStyleSource(ARROW_SHAFT_SOURCE_ID)
416+
style.removeStyleSource(ARROW_HEAD_SOURCE_ID)
417+
}
418+
}
393419
}

qa-test-app/src/main/java/com/mapbox/navigation/qa_test_app/view/customnavview/MapboxNavigationViewCustomizedActivity.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import com.mapbox.navigation.dropin.ActionButtonDescription.Position.START
5353
import com.mapbox.navigation.dropin.MapViewObserver
5454
import com.mapbox.navigation.dropin.MapboxExtendableButtonParams
5555
import com.mapbox.navigation.dropin.NavigationViewListener
56+
import com.mapbox.navigation.dropin.ViewOptionsCustomization.Companion.defaultRouteArrowOptions
5657
import com.mapbox.navigation.dropin.ViewOptionsCustomization.Companion.defaultRouteLineOptions
5758
import com.mapbox.navigation.dropin.ViewStyleCustomization.Companion.defaultAudioGuidanceButtonParams
5859
import com.mapbox.navigation.dropin.ViewStyleCustomization.Companion.defaultCameraModeButtonParams
@@ -229,9 +230,6 @@ class MapboxNavigationViewCustomizedActivity : DrawerActivity() {
229230

230231
binding.navigationView.addListener(freeDriveInfoPanelInstaller)
231232
binding.navigationView.addListener(navViewListener)
232-
binding.navigationView.customizeViewOptions {
233-
routeArrowOptions = customRouteArrowOptions()
234-
}
235233

236234
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.getDefaultNightMode())
237235

@@ -497,6 +495,7 @@ class MapboxNavigationViewCustomizedActivity : DrawerActivity() {
497495
}
498496
binding.navigationView.customizeViewOptions {
499497
routeLineOptions = customRouteLineOptions()
498+
routeArrowOptions = customRouteArrowOptions()
500499
mapStyleUriDay = Style.LIGHT
501500
mapStyleUriNight = Style.DARK
502501
}
@@ -508,6 +507,7 @@ class MapboxNavigationViewCustomizedActivity : DrawerActivity() {
508507
}
509508
binding.navigationView.customizeViewOptions {
510509
routeLineOptions = defaultRouteLineOptions(applicationContext)
510+
routeArrowOptions = defaultRouteArrowOptions(applicationContext)
511511
mapStyleUriDay = NavigationStyles.NAVIGATION_DAY_STYLE
512512
mapStyleUriNight = NavigationStyles.NAVIGATION_NIGHT_STYLE
513513
}

0 commit comments

Comments
 (0)