Skip to content

Commit e9e1363

Browse files
author
Seth Bourget
committed
Modified the initialize layers behavior to always apply the current options even if it means removing the existing layers.
1 parent 1419bb1 commit e9e1363

File tree

5 files changed

+303
-1
lines changed

5 files changed

+303
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ Mapbox welcomes participation and contributions from everyone.
3030
- Each newly instantiated MapboxRouteArrowView class will initialize the layers with the provided options on the first render call. Previously this would only be done if the layers hadn't already been initialized. [#6466](https://github.com/mapbox/mapbox-navigation-android/pull/6466)
3131
- Fixed an issue where the first voice instruction might have been played twice. [#6766](https://github.com/mapbox/mapbox-navigation-android/pull/6766)
3232
- Changed distance formatting: now all the imperial distances down to 0.1 miles will be represented in miles, while the smaller ones - in feet. [#6775](https://github.com/mapbox/mapbox-navigation-android/pull/6775)
33+
- Updated behavior of `MapboxRouteLineView::initializeLayers` to always reset the route line related layers with the options provided even if it means removing existing layers in order to apply the options. [#6793](https://github.com/mapbox/mapbox-navigation-android/pull/6793)
3334

3435
## Mapbox Navigation SDK 2.10.0-rc.1 - 16 December, 2022
3536
### Changelog

libnavui-maps/src/main/java/com/mapbox/navigation/ui/maps/internal/route/line/MapboxRouteLineUtils.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1751,4 +1751,31 @@ internal object MapboxRouteLineUtils {
17511751
.iconIgnorePlacement(true)
17521752
.iconKeepUpright(true)
17531753
}
1754+
1755+
internal fun removeLayersAndSources(style: Style) {
1756+
style.removeStyleSource(RouteLayerConstants.LAYER_GROUP_1_SOURCE_ID)
1757+
style.removeStyleSource(RouteLayerConstants.LAYER_GROUP_2_SOURCE_ID)
1758+
style.removeStyleSource(RouteLayerConstants.LAYER_GROUP_3_SOURCE_ID)
1759+
style.removeStyleSource(RouteLayerConstants.WAYPOINT_SOURCE_ID)
1760+
style.removeStyleLayer(RouteLayerConstants.TOP_LEVEL_ROUTE_LINE_LAYER_ID)
1761+
style.removeStyleLayer(RouteLayerConstants.BOTTOM_LEVEL_ROUTE_LINE_LAYER_ID)
1762+
style.removeStyleLayer(RouteLayerConstants.LAYER_GROUP_1_TRAIL_CASING)
1763+
style.removeStyleLayer(RouteLayerConstants.LAYER_GROUP_1_TRAIL)
1764+
style.removeStyleLayer(RouteLayerConstants.LAYER_GROUP_1_CASING)
1765+
style.removeStyleLayer(RouteLayerConstants.LAYER_GROUP_1_MAIN)
1766+
style.removeStyleLayer(RouteLayerConstants.LAYER_GROUP_1_TRAFFIC)
1767+
style.removeStyleLayer(RouteLayerConstants.LAYER_GROUP_1_RESTRICTED)
1768+
style.removeStyleLayer(RouteLayerConstants.LAYER_GROUP_2_TRAIL_CASING)
1769+
style.removeStyleLayer(RouteLayerConstants.LAYER_GROUP_2_TRAIL)
1770+
style.removeStyleLayer(RouteLayerConstants.LAYER_GROUP_2_CASING)
1771+
style.removeStyleLayer(RouteLayerConstants.LAYER_GROUP_2_MAIN)
1772+
style.removeStyleLayer(RouteLayerConstants.LAYER_GROUP_2_TRAFFIC)
1773+
style.removeStyleLayer(RouteLayerConstants.LAYER_GROUP_2_RESTRICTED)
1774+
style.removeStyleLayer(RouteLayerConstants.LAYER_GROUP_3_TRAIL_CASING)
1775+
style.removeStyleLayer(RouteLayerConstants.LAYER_GROUP_3_TRAIL)
1776+
style.removeStyleLayer(RouteLayerConstants.LAYER_GROUP_3_CASING)
1777+
style.removeStyleLayer(RouteLayerConstants.LAYER_GROUP_3_MAIN)
1778+
style.removeStyleLayer(RouteLayerConstants.LAYER_GROUP_3_TRAFFIC)
1779+
style.removeStyleLayer(RouteLayerConstants.LAYER_GROUP_3_RESTRICTED)
1780+
}
17541781
}

libnavui-maps/src/main/java/com/mapbox/navigation/ui/maps/route/line/api/MapboxRouteLineView.kt

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,14 +142,32 @@ class MapboxRouteLineView(options: MapboxRouteLineOptions) {
142142
* the layers if they have not yet been initialized. If you have a use case for initializing
143143
* the layers in advance of any API calls this method may be used.
144144
*
145+
* If the layers already exist they will be removed and re-initialized with the options provided.
146+
*
145147
* Each [Layer] added to the map by this class is a persistent layer - it will survive style changes.
146148
* This means that if the data has not changed, it does not have to be manually redrawn after a style change.
147149
* See [Style.addPersistentStyleLayer].
148150
*
149151
* @param style a valid [Style] instance
150152
*/
151153
fun initializeLayers(style: Style) {
152-
MapboxRouteLineUtils.initializeLayers(style, options)
154+
resetLayers(style)
155+
}
156+
157+
/**
158+
* Updates the [MapboxRouteLineOptions] used for the route line related layers and initializes the layers.
159+
* If the layers already exist they will be removed and re-initialized with the options provided.
160+
*
161+
* Each [Layer] added to the map by this class is a persistent layer - it will survive style changes.
162+
* This means that if the data has not changed, it does not have to be manually redrawn after a style change.
163+
* See [Style.addPersistentStyleLayer].
164+
*
165+
* @param style a valid [Style] instance
166+
* @param options used for the route line related layers.
167+
*/
168+
fun initializeLayers(style: Style, options: MapboxRouteLineOptions) {
169+
this.options = options
170+
resetLayers(style)
153171
}
154172

155173
/**
@@ -862,4 +880,26 @@ class MapboxRouteLineView(options: MapboxRouteLineOptions) {
862880
}
863881
}
864882
}
883+
884+
private fun resetLayers(style: Style) {
885+
sourceToFeatureMap.clear()
886+
sourceToFeatureMap[MapboxRouteLineUtils.layerGroup1SourceKey] = RouteLineFeatureId(null)
887+
sourceToFeatureMap[MapboxRouteLineUtils.layerGroup2SourceKey] = RouteLineFeatureId(null)
888+
sourceToFeatureMap[MapboxRouteLineUtils.layerGroup3SourceKey] = RouteLineFeatureId(null)
889+
primaryRouteLineLayerGroup = setOf()
890+
listOf(
891+
RouteLayerConstants.LAYER_GROUP_1_SOURCE_ID,
892+
RouteLayerConstants.LAYER_GROUP_2_SOURCE_ID,
893+
RouteLayerConstants.LAYER_GROUP_3_SOURCE_ID,
894+
RouteLayerConstants.WAYPOINT_SOURCE_ID
895+
).forEach {
896+
updateSource(
897+
style,
898+
it,
899+
FeatureCollection.fromFeatures(listOf())
900+
)
901+
}
902+
MapboxRouteLineUtils.removeLayersAndSources(style)
903+
MapboxRouteLineUtils.initializeLayers(style, options)
904+
}
865905
}

libnavui-maps/src/test/java/com/mapbox/navigation/ui/maps/internal/route/line/MapboxRouteLineUtilsTest.kt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2028,6 +2028,41 @@ class MapboxRouteLineUtilsTest {
20282028
assertFalse(result)
20292029
}
20302030

2031+
@Test
2032+
fun removeLayersAndSources() {
2033+
val style = mockk<Style> {
2034+
every { removeStyleLayer(any()) } returns ExpectedFactory.createNone()
2035+
every { removeStyleSource(any()) } returns ExpectedFactory.createNone()
2036+
}
2037+
2038+
MapboxRouteLineUtils.removeLayersAndSources(style)
2039+
2040+
verify { style.removeStyleSource(LAYER_GROUP_1_SOURCE_ID) }
2041+
verify { style.removeStyleSource(LAYER_GROUP_2_SOURCE_ID) }
2042+
verify { style.removeStyleSource(LAYER_GROUP_3_SOURCE_ID) }
2043+
verify { style.removeStyleSource(WAYPOINT_SOURCE_ID) }
2044+
verify { style.removeStyleLayer(TOP_LEVEL_ROUTE_LINE_LAYER_ID) }
2045+
verify { style.removeStyleLayer(BOTTOM_LEVEL_ROUTE_LINE_LAYER_ID) }
2046+
verify { style.removeStyleLayer(LAYER_GROUP_1_TRAIL_CASING) }
2047+
verify { style.removeStyleLayer(LAYER_GROUP_1_TRAIL) }
2048+
verify { style.removeStyleLayer(LAYER_GROUP_1_CASING) }
2049+
verify { style.removeStyleLayer(LAYER_GROUP_1_MAIN) }
2050+
verify { style.removeStyleLayer(LAYER_GROUP_1_TRAFFIC) }
2051+
verify { style.removeStyleLayer(LAYER_GROUP_1_RESTRICTED) }
2052+
verify { style.removeStyleLayer(LAYER_GROUP_2_TRAIL_CASING) }
2053+
verify { style.removeStyleLayer(LAYER_GROUP_2_TRAIL) }
2054+
verify { style.removeStyleLayer(LAYER_GROUP_2_CASING) }
2055+
verify { style.removeStyleLayer(LAYER_GROUP_2_MAIN) }
2056+
verify { style.removeStyleLayer(LAYER_GROUP_2_TRAFFIC) }
2057+
verify { style.removeStyleLayer(LAYER_GROUP_2_RESTRICTED) }
2058+
verify { style.removeStyleLayer(LAYER_GROUP_3_TRAIL_CASING) }
2059+
verify { style.removeStyleLayer(LAYER_GROUP_3_TRAIL) }
2060+
verify { style.removeStyleLayer(LAYER_GROUP_3_CASING) }
2061+
verify { style.removeStyleLayer(LAYER_GROUP_3_MAIN) }
2062+
verify { style.removeStyleLayer(LAYER_GROUP_3_TRAFFIC) }
2063+
verify { style.removeStyleLayer(LAYER_GROUP_3_RESTRICTED) }
2064+
}
2065+
20312066
private fun <T> listElementsAreEqual(
20322067
first: List<T>,
20332068
second: List<T>,

libnavui-maps/src/test/java/com/mapbox/navigation/ui/maps/route/line/api/MapboxRouteLineViewTest.kt

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,88 @@ class MapboxRouteLineViewTest {
169169
every {
170170
setStyleSourceProperty(WAYPOINT_SOURCE_ID, any(), any())
171171
} returns ExpectedFactory.createNone()
172+
every { getSource(LAYER_GROUP_1_SOURCE_ID) } returns null
173+
every { getSource(LAYER_GROUP_2_SOURCE_ID) } returns null
174+
every { getSource(LAYER_GROUP_3_SOURCE_ID) } returns null
175+
every { getSource(WAYPOINT_SOURCE_ID) } returns null
176+
every {
177+
removeStyleSource(LAYER_GROUP_1_SOURCE_ID)
178+
} returns ExpectedFactory.createNone()
179+
every {
180+
removeStyleSource(LAYER_GROUP_2_SOURCE_ID)
181+
} returns ExpectedFactory.createNone()
182+
every {
183+
removeStyleSource(LAYER_GROUP_3_SOURCE_ID)
184+
} returns ExpectedFactory.createNone()
185+
every {
186+
removeStyleSource(WAYPOINT_SOURCE_ID)
187+
} returns ExpectedFactory.createNone()
188+
every {
189+
removeStyleSource(TOP_LEVEL_ROUTE_LINE_LAYER_ID)
190+
} returns ExpectedFactory.createNone()
191+
every {
192+
removeStyleSource(BOTTOM_LEVEL_ROUTE_LINE_LAYER_ID)
193+
} returns ExpectedFactory.createNone()
194+
every {
195+
removeStyleLayer(TOP_LEVEL_ROUTE_LINE_LAYER_ID)
196+
} returns ExpectedFactory.createNone()
197+
every {
198+
removeStyleLayer(BOTTOM_LEVEL_ROUTE_LINE_LAYER_ID)
199+
} returns ExpectedFactory.createNone()
200+
every {
201+
removeStyleLayer(LAYER_GROUP_1_TRAIL_CASING)
202+
} returns ExpectedFactory.createNone()
203+
every {
204+
removeStyleLayer(LAYER_GROUP_1_TRAIL)
205+
} returns ExpectedFactory.createNone()
206+
every {
207+
removeStyleLayer(LAYER_GROUP_1_CASING)
208+
} returns ExpectedFactory.createNone()
209+
every {
210+
removeStyleLayer(LAYER_GROUP_1_MAIN)
211+
} returns ExpectedFactory.createNone()
212+
every {
213+
removeStyleLayer(LAYER_GROUP_1_TRAFFIC)
214+
} returns ExpectedFactory.createNone()
215+
every {
216+
removeStyleLayer(LAYER_GROUP_1_RESTRICTED)
217+
} returns ExpectedFactory.createNone()
218+
every {
219+
removeStyleLayer(LAYER_GROUP_2_TRAIL_CASING)
220+
} returns ExpectedFactory.createNone()
221+
every {
222+
removeStyleLayer(LAYER_GROUP_2_TRAIL)
223+
} returns ExpectedFactory.createNone()
224+
every {
225+
removeStyleLayer(LAYER_GROUP_2_CASING)
226+
} returns ExpectedFactory.createNone()
227+
every {
228+
removeStyleLayer(LAYER_GROUP_2_MAIN)
229+
} returns ExpectedFactory.createNone()
230+
every {
231+
removeStyleLayer(LAYER_GROUP_2_TRAFFIC)
232+
} returns ExpectedFactory.createNone()
233+
every {
234+
removeStyleLayer(LAYER_GROUP_2_RESTRICTED)
235+
} returns ExpectedFactory.createNone()
236+
every {
237+
removeStyleLayer(LAYER_GROUP_3_TRAIL_CASING)
238+
} returns ExpectedFactory.createNone()
239+
every {
240+
removeStyleLayer(LAYER_GROUP_3_TRAIL)
241+
} returns ExpectedFactory.createNone()
242+
every {
243+
removeStyleLayer(LAYER_GROUP_3_CASING)
244+
} returns ExpectedFactory.createNone()
245+
every {
246+
removeStyleLayer(LAYER_GROUP_3_MAIN)
247+
} returns ExpectedFactory.createNone()
248+
every {
249+
removeStyleLayer(LAYER_GROUP_3_TRAFFIC)
250+
} returns ExpectedFactory.createNone()
251+
every {
252+
removeStyleLayer(LAYER_GROUP_3_RESTRICTED)
253+
} returns ExpectedFactory.createNone()
172254
}.also {
173255
mockCheckForLayerInitialization(it)
174256
}
@@ -179,6 +261,123 @@ class MapboxRouteLineViewTest {
179261
unmockkObject(MapboxRouteLineUtils)
180262
}
181263

264+
@Test
265+
fun initializeLayers_withOptions() {
266+
mockkObject(MapboxRouteLineUtils)
267+
val options = MapboxRouteLineOptions.Builder(ctx).build()
268+
val options2 = MapboxRouteLineOptions.Builder(ctx).withTolerance(59.0).build()
269+
val style = mockk<Style> {
270+
every {
271+
setStyleSourceProperty(LAYER_GROUP_1_SOURCE_ID, any(), any())
272+
} returns ExpectedFactory.createNone()
273+
every {
274+
setStyleSourceProperty(LAYER_GROUP_2_SOURCE_ID, any(), any())
275+
} returns ExpectedFactory.createNone()
276+
every {
277+
setStyleSourceProperty(LAYER_GROUP_3_SOURCE_ID, any(), any())
278+
} returns ExpectedFactory.createNone()
279+
every {
280+
setStyleSourceProperty(WAYPOINT_SOURCE_ID, any(), any())
281+
} returns ExpectedFactory.createNone()
282+
every { getSource(LAYER_GROUP_1_SOURCE_ID) } returns null
283+
every { getSource(LAYER_GROUP_2_SOURCE_ID) } returns null
284+
every { getSource(LAYER_GROUP_3_SOURCE_ID) } returns null
285+
every { getSource(WAYPOINT_SOURCE_ID) } returns null
286+
every {
287+
removeStyleSource(LAYER_GROUP_1_SOURCE_ID)
288+
} returns ExpectedFactory.createNone()
289+
every {
290+
removeStyleSource(LAYER_GROUP_2_SOURCE_ID)
291+
} returns ExpectedFactory.createNone()
292+
every {
293+
removeStyleSource(LAYER_GROUP_3_SOURCE_ID)
294+
} returns ExpectedFactory.createNone()
295+
every {
296+
removeStyleSource(WAYPOINT_SOURCE_ID)
297+
} returns ExpectedFactory.createNone()
298+
every {
299+
removeStyleSource(TOP_LEVEL_ROUTE_LINE_LAYER_ID)
300+
} returns ExpectedFactory.createNone()
301+
every {
302+
removeStyleSource(BOTTOM_LEVEL_ROUTE_LINE_LAYER_ID)
303+
} returns ExpectedFactory.createNone()
304+
every {
305+
removeStyleLayer(TOP_LEVEL_ROUTE_LINE_LAYER_ID)
306+
} returns ExpectedFactory.createNone()
307+
every {
308+
removeStyleLayer(BOTTOM_LEVEL_ROUTE_LINE_LAYER_ID)
309+
} returns ExpectedFactory.createNone()
310+
every {
311+
removeStyleLayer(LAYER_GROUP_1_TRAIL_CASING)
312+
} returns ExpectedFactory.createNone()
313+
every {
314+
removeStyleLayer(LAYER_GROUP_1_TRAIL)
315+
} returns ExpectedFactory.createNone()
316+
every {
317+
removeStyleLayer(LAYER_GROUP_1_CASING)
318+
} returns ExpectedFactory.createNone()
319+
every {
320+
removeStyleLayer(LAYER_GROUP_1_MAIN)
321+
} returns ExpectedFactory.createNone()
322+
every {
323+
removeStyleLayer(LAYER_GROUP_1_TRAFFIC)
324+
} returns ExpectedFactory.createNone()
325+
every {
326+
removeStyleLayer(LAYER_GROUP_1_RESTRICTED)
327+
} returns ExpectedFactory.createNone()
328+
every {
329+
removeStyleLayer(LAYER_GROUP_2_TRAIL_CASING)
330+
} returns ExpectedFactory.createNone()
331+
every {
332+
removeStyleLayer(LAYER_GROUP_2_TRAIL)
333+
} returns ExpectedFactory.createNone()
334+
every {
335+
removeStyleLayer(LAYER_GROUP_2_CASING)
336+
} returns ExpectedFactory.createNone()
337+
every {
338+
removeStyleLayer(LAYER_GROUP_2_MAIN)
339+
} returns ExpectedFactory.createNone()
340+
every {
341+
removeStyleLayer(LAYER_GROUP_2_TRAFFIC)
342+
} returns ExpectedFactory.createNone()
343+
every {
344+
removeStyleLayer(LAYER_GROUP_2_RESTRICTED)
345+
} returns ExpectedFactory.createNone()
346+
every {
347+
removeStyleLayer(LAYER_GROUP_3_TRAIL_CASING)
348+
} returns ExpectedFactory.createNone()
349+
every {
350+
removeStyleLayer(LAYER_GROUP_3_TRAIL)
351+
} returns ExpectedFactory.createNone()
352+
every {
353+
removeStyleLayer(LAYER_GROUP_3_CASING)
354+
} returns ExpectedFactory.createNone()
355+
every {
356+
removeStyleLayer(LAYER_GROUP_3_MAIN)
357+
} returns ExpectedFactory.createNone()
358+
every {
359+
removeStyleLayer(LAYER_GROUP_3_TRAFFIC)
360+
} returns ExpectedFactory.createNone()
361+
every {
362+
removeStyleLayer(LAYER_GROUP_3_RESTRICTED)
363+
} returns ExpectedFactory.createNone()
364+
}.also {
365+
mockCheckForLayerInitialization(it)
366+
}
367+
val view = MapboxRouteLineView(options)
368+
369+
view.initializeLayers(style, options2)
370+
371+
verify { MapboxRouteLineUtils.removeLayersAndSources(style) }
372+
verify { MapboxRouteLineUtils.initializeLayers(style, options2) }
373+
verify { style.getSource(LAYER_GROUP_1_SOURCE_ID) }
374+
verify { style.getSource(LAYER_GROUP_2_SOURCE_ID) }
375+
verify { style.getSource(LAYER_GROUP_3_SOURCE_ID) }
376+
verify { style.getSource(WAYPOINT_SOURCE_ID) }
377+
assertEquals(view.options, options2)
378+
unmockkObject(MapboxRouteLineUtils)
379+
}
380+
182381
@Test
183382
fun renderClearRouteLineValue() = coroutineRule.runBlockingTest {
184383
mockkStatic("com.mapbox.maps.extension.style.sources.SourceUtils")

0 commit comments

Comments
 (0)