Skip to content

Commit fd0edf2

Browse files
committed
fix restricted masking data calculation
1 parent 8a4ad19 commit fd0edf2

File tree

7 files changed

+1113
-151
lines changed

7 files changed

+1113
-151
lines changed

libnavui-maps/api/current.txt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1201,6 +1201,13 @@ package com.mapbox.navigation.ui.maps.route.line.model {
12011201
method public int getAlternativeRouteUnknownCongestionColor();
12021202
method public kotlin.ranges.IntRange getHeavyCongestionRange();
12031203
method public int getInActiveRouteLegsColor();
1204+
method public int getInactiveRouteLegClosureColor();
1205+
method public int getInactiveRouteLegHeavyCongestionColor();
1206+
method public int getInactiveRouteLegLowCongestionColor();
1207+
method public int getInactiveRouteLegModerateCongestionColor();
1208+
method public int getInactiveRouteLegRestrictedRoadColor();
1209+
method public int getInactiveRouteLegSevereCongestionColor();
1210+
method public int getInactiveRouteLegUnknownCongestionColor();
12041211
method public kotlin.ranges.IntRange getLowCongestionRange();
12051212
method public kotlin.ranges.IntRange getModerateCongestionRange();
12061213
method public int getRestrictedRoadColor();
@@ -1227,6 +1234,13 @@ package com.mapbox.navigation.ui.maps.route.line.model {
12271234
property public final int alternativeRouteUnknownCongestionColor;
12281235
property public final kotlin.ranges.IntRange heavyCongestionRange;
12291236
property public final int inActiveRouteLegsColor;
1237+
property public final int inactiveRouteLegClosureColor;
1238+
property public final int inactiveRouteLegHeavyCongestionColor;
1239+
property public final int inactiveRouteLegLowCongestionColor;
1240+
property public final int inactiveRouteLegModerateCongestionColor;
1241+
property public final int inactiveRouteLegRestrictedRoadColor;
1242+
property public final int inactiveRouteLegSevereCongestionColor;
1243+
property public final int inactiveRouteLegUnknownCongestionColor;
12301244
property public final kotlin.ranges.IntRange lowCongestionRange;
12311245
property public final kotlin.ranges.IntRange moderateCongestionRange;
12321246
property public final int restrictedRoadColor;
@@ -1257,6 +1271,13 @@ package com.mapbox.navigation.ui.maps.route.line.model {
12571271
method public com.mapbox.navigation.ui.maps.route.line.model.RouteLineColorResources build();
12581272
method public com.mapbox.navigation.ui.maps.route.line.model.RouteLineColorResources.Builder heavyCongestionRange(kotlin.ranges.IntRange range);
12591273
method public com.mapbox.navigation.ui.maps.route.line.model.RouteLineColorResources.Builder inActiveRouteLegsColor(@ColorInt int color);
1274+
method public com.mapbox.navigation.ui.maps.route.line.model.RouteLineColorResources.Builder inactiveRouteLegClosureColor(@ColorInt int color);
1275+
method public com.mapbox.navigation.ui.maps.route.line.model.RouteLineColorResources.Builder inactiveRouteLegHeavyCongestionColor(@ColorInt int color);
1276+
method public com.mapbox.navigation.ui.maps.route.line.model.RouteLineColorResources.Builder inactiveRouteLegLowCongestionColor(@ColorInt int color);
1277+
method public com.mapbox.navigation.ui.maps.route.line.model.RouteLineColorResources.Builder inactiveRouteLegModerateCongestionColor(@ColorInt int color);
1278+
method public com.mapbox.navigation.ui.maps.route.line.model.RouteLineColorResources.Builder inactiveRouteLegRestrictedRoadColor(@ColorInt int color);
1279+
method public com.mapbox.navigation.ui.maps.route.line.model.RouteLineColorResources.Builder inactiveRouteLegSevereCongestionColor(@ColorInt int color);
1280+
method public com.mapbox.navigation.ui.maps.route.line.model.RouteLineColorResources.Builder inactiveRouteLegUnknownCongestionColor(@ColorInt int color);
12601281
method public com.mapbox.navigation.ui.maps.route.line.model.RouteLineColorResources.Builder lowCongestionRange(kotlin.ranges.IntRange range);
12611282
method public com.mapbox.navigation.ui.maps.route.line.model.RouteLineColorResources.Builder moderateCongestionRange(kotlin.ranges.IntRange range);
12621283
method public com.mapbox.navigation.ui.maps.route.line.model.RouteLineColorResources.Builder restrictedRoadColor(@ColorInt int color);

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

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1730,31 +1730,47 @@ internal object MapboxRouteLineUtils {
17301730
}
17311731
}
17321732

1733-
internal fun getRestrictedLineExpressionProducer(
1733+
internal fun getNonMaskingRestrictedLineExpressionProducer(
17341734
routeData: List<ExtractedRouteRestrictionData>,
17351735
vanishingPointOffset: Double,
17361736
activeLegIndex: Int,
1737-
routeLineOptions: MapboxRouteLineOptions,
1738-
) = RouteLineExpressionProvider {
1739-
val (restrictedSectionColor, restrictedSectionInactiveColor) =
1740-
routeLineOptions.resourceProvider.routeLineColorResources.run {
1741-
if (routeLineOptions.styleInactiveRouteLegsIndependently) {
1742-
Pair(restrictedRoadColor, inactiveRouteLegRestrictedRoadColor)
1743-
} else {
1744-
Pair(restrictedRoadColor, restrictedRoadColor)
1745-
}
1746-
}
1747-
getRestrictedLineExpression(
1737+
options: MapboxRouteLineOptions
1738+
): RouteLineExpressionProvider {
1739+
val colorResources = options.resourceProvider.routeLineColorResources
1740+
val inactiveColor = if (options.styleInactiveRouteLegsIndependently) {
1741+
colorResources.inactiveRouteLegRestrictedRoadColor
1742+
} else {
1743+
colorResources.restrictedRoadColor
1744+
}
1745+
return getRestrictedLineExpressionProducer(
1746+
routeData,
17481747
vanishingPointOffset,
17491748
activeLegIndex,
1750-
restrictedSectionColor = restrictedSectionColor,
1751-
restrictedSectionInactiveColor = restrictedSectionInactiveColor,
1752-
routeData
1749+
options.displayRestrictedRoadSections,
1750+
activeColor = colorResources.restrictedRoadColor,
1751+
inactiveColor = inactiveColor,
17531752
)
17541753
}
17551754

1756-
internal fun getDisabledRestrictedLineExpressionProducer() = RouteLineExpressionProvider {
1757-
color(Color.TRANSPARENT)
1755+
internal fun getRestrictedLineExpressionProducer(
1756+
routeData: List<ExtractedRouteRestrictionData>,
1757+
vanishingPointOffset: Double,
1758+
activeLegIndex: Int,
1759+
displayRestrictedEnabled: Boolean,
1760+
activeColor: Int,
1761+
inactiveColor: Int,
1762+
) = RouteLineExpressionProvider {
1763+
if (displayRestrictedEnabled) {
1764+
getRestrictedLineExpression(
1765+
vanishingPointOffset,
1766+
activeLegIndex,
1767+
restrictedSectionColor = activeColor,
1768+
restrictedSectionInactiveColor = inactiveColor,
1769+
routeData
1770+
)
1771+
} else {
1772+
color(Color.TRANSPARENT)
1773+
}
17581774
}
17591775

17601776
internal fun getRestrictedLineExpression(

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

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ import com.mapbox.navigation.ui.maps.internal.route.line.MapboxRouteLineUtils
3131
import com.mapbox.navigation.ui.maps.internal.route.line.MapboxRouteLineUtils.extractRouteRestrictionData
3232
import com.mapbox.navigation.ui.maps.internal.route.line.MapboxRouteLineUtils.getCongestionColorForInactiveRouteLegs
3333
import com.mapbox.navigation.ui.maps.internal.route.line.MapboxRouteLineUtils.getMatchingColors
34+
import com.mapbox.navigation.ui.maps.internal.route.line.MapboxRouteLineUtils.getNonMaskingRestrictedLineExpressionProducer
35+
import com.mapbox.navigation.ui.maps.internal.route.line.MapboxRouteLineUtils.getRestrictedLineExpressionProducer
3436
import com.mapbox.navigation.ui.maps.internal.route.line.MapboxRouteLineUtils.granularDistancesProvider
3537
import com.mapbox.navigation.ui.maps.internal.route.line.MapboxRouteLineUtils.layerGroup1SourceLayerIds
3638
import com.mapbox.navigation.ui.maps.internal.route.line.MapboxRouteLineUtils.layerGroup2SourceLayerIds
@@ -1003,10 +1005,14 @@ class MapboxRouteLineApi(
10031005
Color.TRANSPARENT,
10041006
legIndex
10051007
)
1006-
val restrictedExpProvider = getRestrictedLineExpressionProducerForLegIndex(
1008+
val restrictedExpProvider = getRestrictedLineExpressionProducer(
1009+
restrictedExpressionData,
1010+
0.0,
10071011
legIndex,
1008-
routeLineOptions,
1009-
restrictedExpressionData
1012+
routeLineOptions.displayRestrictedRoadSections,
1013+
activeColor = routeLineOptions.resourceProvider.routeLineColorResources
1014+
.restrictedRoadColor,
1015+
inactiveColor = Color.TRANSPARENT,
10101016
)
10111017

10121018
return RouteLineDynamicData(
@@ -1172,7 +1178,7 @@ class MapboxRouteLineApi(
11721178
true -> null
11731179
false -> {
11741180
{
1175-
MapboxRouteLineUtils.getRestrictedLineExpressionProducer(
1181+
getNonMaskingRestrictedLineExpressionProducer(
11761182
restrictedExpressionData,
11771183
0.0,
11781184
legIndexToHighlight,
@@ -1610,10 +1616,11 @@ class MapboxRouteLineApi(
16101616
// If false produce a gradient for the restricted line layer that is completely transparent.
16111617
val primaryRouteRestrictedSectionsExpressionDef = jobControl.scope.async {
16121618
primaryRoute?.route?.run {
1613-
getRestrictedLineExpressionProducerForLegIndex(
1619+
getNonMaskingRestrictedLineExpressionProducer(
1620+
restrictedExpressionData,
1621+
0.0,
16141622
legIndex,
16151623
routeLineOptions,
1616-
restrictedExpressionData
16171624
)
16181625
}?.generateExpression()
16191626
}
@@ -1939,21 +1946,4 @@ class MapboxRouteLineApi(
19391946
jobControl.scope
19401947
)
19411948
}.cacheResult(alternativelyStyleSegmentsNotInLegCache)
1942-
1943-
private fun getRestrictedLineExpressionProducerForLegIndex(
1944-
activeLegIndex: Int,
1945-
options: MapboxRouteLineOptions,
1946-
restrictedRouteExpressionData: List<ExtractedRouteRestrictionData>
1947-
): RouteLineExpressionProvider {
1948-
return if (routeLineOptions.displayRestrictedRoadSections) {
1949-
MapboxRouteLineUtils.getRestrictedLineExpressionProducer(
1950-
restrictedRouteExpressionData,
1951-
vanishingPointOffset = 0.0,
1952-
activeLegIndex = activeLegIndex,
1953-
options,
1954-
)
1955-
} else {
1956-
MapboxRouteLineUtils.getDisabledRestrictedLineExpressionProducer()
1957-
}
1958-
}
19591949
}

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

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -195,26 +195,12 @@ internal class VanishingRouteLine {
195195
}
196196
val restrictedRoadExpressionProvider =
197197
ifNonNull(restrictedLineExpressionData) { expressionData ->
198-
{
199-
val (restrictedSectionColor, restrictedSectionInactiveColor) =
200-
options.resourceProvider.routeLineColorResources.run {
201-
if (options.styleInactiveRouteLegsIndependently) {
202-
Pair(
203-
restrictedRoadColor,
204-
inactiveRouteLegRestrictedRoadColor
205-
)
206-
} else {
207-
Pair(restrictedRoadColor, restrictedRoadColor)
208-
}
209-
}
210-
MapboxRouteLineUtils.getRestrictedLineExpression(
211-
offset,
212-
activeLegIndex,
213-
restrictedSectionColor = restrictedSectionColor,
214-
restrictedSectionInactiveColor = restrictedSectionInactiveColor,
215-
expressionData,
216-
)
217-
}
198+
MapboxRouteLineUtils.getNonMaskingRestrictedLineExpressionProducer(
199+
expressionData,
200+
offset,
201+
activeLegIndex,
202+
options
203+
)
218204
}
219205

220206
VanishingRouteLineExpressions(

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

Lines changed: 136 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -249,18 +249,7 @@ class MapboxRouteLineUtilsTest {
249249
}
250250

251251
@Test
252-
fun getRestrictedLineExpressionProducer() {
253-
val colorResources = RouteLineColorResources.Builder()
254-
.restrictedRoadColor(Color.CYAN)
255-
.inactiveRouteLegRestrictedRoadColor(Color.GRAY)
256-
.build()
257-
val options = MapboxRouteLineOptions.Builder(ctx)
258-
.withRouteLineResources(
259-
RouteLineResources.Builder()
260-
.routeLineColorResources(colorResources)
261-
.build()
262-
)
263-
.build()
252+
fun getRestrictedLineExpressionProducerRestrictionsEnabled() {
264253
val expectedExpressionContents = listOf(
265254
StringChecker("step"),
266255
StringChecker("[line-progress]"),
@@ -286,18 +275,32 @@ class MapboxRouteLineUtilsTest {
286275
expData,
287276
0.2,
288277
0,
289-
options
278+
activeColor = Color.CYAN,
279+
inactiveColor = Color.GRAY,
280+
displayRestrictedEnabled = true
290281
).generateExpression()
291282

292283
checkExpression(expectedExpressionContents, expression)
293284
}
294285

295286
@Test
296-
fun getDisabledRestrictedLineExpressionProducer() {
287+
fun getRestrictedLineExpressionProducerRestrictionsDisabled() {
297288
val expectedExpression = "[rgba, 0.0, 0.0, 0.0, 0.0]"
298289

299-
val expression = MapboxRouteLineUtils.getDisabledRestrictedLineExpressionProducer()
300-
.generateExpression()
290+
val route = loadNavigationRoute("route-with-restrictions.json")
291+
val expData = MapboxRouteLineUtils.extractRouteRestrictionData(
292+
route,
293+
MapboxRouteLineUtils.granularDistancesProvider
294+
)
295+
296+
val expression = MapboxRouteLineUtils.getRestrictedLineExpressionProducer(
297+
expData,
298+
0.2,
299+
0,
300+
activeColor = Color.CYAN,
301+
inactiveColor = Color.GRAY,
302+
displayRestrictedEnabled = false
303+
).generateExpression()
301304

302305
assertEquals(expectedExpression, expression.toString())
303306
}
@@ -2322,6 +2325,123 @@ class MapboxRouteLineUtilsTest {
23222325
assertEquals(expectedExpression, result.toString())
23232326
}
23242327

2328+
@Test
2329+
fun `getRestrictedLineExpression with restriction across two legs, active index = 0`() {
2330+
val expectedExpression = "[step, [line-progress], [rgba, 0.0, 0.0, 0.0, 0.0], 0.0, " +
2331+
"[rgba, 0.0, 0.0, 0.0, 0.0], 0.3956457979751531, " +
2332+
"[rgba, 0.0, 255.0, 255.0, 1.0], 0.4897719974699625, " +
2333+
"[rgba, 136.0, 136.0, 136.0, 1.0], 0.5540039481345271, [rgba, 0.0, 0.0, 0.0, 0.0]]"
2334+
val route = loadNavigationRoute("multileg_route_two_legs_with_restrictions.json")
2335+
val expressionData = MapboxRouteLineUtils.extractRouteRestrictionData(
2336+
route,
2337+
MapboxRouteLineUtils.granularDistancesProvider
2338+
)
2339+
2340+
val result = MapboxRouteLineUtils.getRestrictedLineExpression(
2341+
vanishingPointOffset = 0.0,
2342+
activeLegIndex = 0,
2343+
Color.CYAN,
2344+
Color.GRAY,
2345+
expressionData
2346+
)
2347+
2348+
assertEquals(expectedExpression, result.toString())
2349+
}
2350+
2351+
@Test
2352+
fun `getRestrictedLineExpression with restriction across two legs, active index = 1`() {
2353+
val expectedExpression = "[step, [line-progress], [rgba, 0.0, 0.0, 0.0, 0.0], 0.0, " +
2354+
"[rgba, 0.0, 0.0, 0.0, 0.0], 0.3956457979751531, " +
2355+
"[rgba, 136.0, 136.0, 136.0, 1.0], 0.4897719974699625, " +
2356+
"[rgba, 0.0, 255.0, 255.0, 1.0], 0.5540039481345271, [rgba, 0.0, 0.0, 0.0, 0.0]]"
2357+
val route = loadNavigationRoute("multileg_route_two_legs_with_restrictions.json")
2358+
val expressionData = MapboxRouteLineUtils.extractRouteRestrictionData(
2359+
route,
2360+
MapboxRouteLineUtils.granularDistancesProvider
2361+
)
2362+
2363+
val result = MapboxRouteLineUtils.getRestrictedLineExpression(
2364+
vanishingPointOffset = 0.0,
2365+
activeLegIndex = 1,
2366+
Color.CYAN,
2367+
Color.GRAY,
2368+
expressionData
2369+
)
2370+
2371+
assertEquals(expectedExpression, result.toString())
2372+
}
2373+
2374+
@Test
2375+
fun `getNonMaskingRestrictedLineExpression with restriction across two legs, enabled`() {
2376+
val options = MapboxRouteLineOptions.Builder(ctx)
2377+
.withRouteLineResources(
2378+
RouteLineResources.Builder()
2379+
.routeLineColorResources(
2380+
RouteLineColorResources.Builder()
2381+
.restrictedRoadColor(Color.CYAN)
2382+
.inactiveRouteLegRestrictedRoadColor(Color.GRAY)
2383+
.build()
2384+
)
2385+
.build()
2386+
)
2387+
.styleInactiveRouteLegsIndependently(true)
2388+
.displayRestrictedRoadSections(true)
2389+
.build()
2390+
val expectedExpression = "[step, [line-progress], [rgba, 0.0, 0.0, 0.0, 0.0], 0.0, " +
2391+
"[rgba, 0.0, 0.0, 0.0, 0.0], 0.3956457979751531, " +
2392+
"[rgba, 136.0, 136.0, 136.0, 1.0], 0.4897719974699625, " +
2393+
"[rgba, 0.0, 255.0, 255.0, 1.0], 0.5540039481345271, [rgba, 0.0, 0.0, 0.0, 0.0]]"
2394+
val route = loadNavigationRoute("multileg_route_two_legs_with_restrictions.json")
2395+
val expressionData = MapboxRouteLineUtils.extractRouteRestrictionData(
2396+
route,
2397+
MapboxRouteLineUtils.granularDistancesProvider
2398+
)
2399+
2400+
val result = MapboxRouteLineUtils.getNonMaskingRestrictedLineExpressionProducer(
2401+
expressionData,
2402+
vanishingPointOffset = 0.0,
2403+
activeLegIndex = 1,
2404+
options
2405+
)
2406+
2407+
assertEquals(expectedExpression, result.generateExpression().toString())
2408+
}
2409+
2410+
@Test
2411+
fun `getNonMaskingRestrictedLineExpression with restriction across two legs, disabled`() {
2412+
val options = MapboxRouteLineOptions.Builder(ctx)
2413+
.withRouteLineResources(
2414+
RouteLineResources.Builder()
2415+
.routeLineColorResources(
2416+
RouteLineColorResources.Builder()
2417+
.restrictedRoadColor(Color.CYAN)
2418+
.inactiveRouteLegRestrictedRoadColor(Color.GRAY)
2419+
.build()
2420+
)
2421+
.build()
2422+
)
2423+
.styleInactiveRouteLegsIndependently(false)
2424+
.displayRestrictedRoadSections(true)
2425+
.build()
2426+
val expectedExpression = "[step, [line-progress], [rgba, 0.0, 0.0, 0.0, 0.0], 0.0, " +
2427+
"[rgba, 0.0, 0.0, 0.0, 0.0], 0.3956457979751531, " +
2428+
"[rgba, 0.0, 255.0, 255.0, 1.0], 0.5540039481345271, [rgba, 0.0, 0.0, 0.0, 0.0]]"
2429+
val route = loadNavigationRoute("multileg_route_two_legs_with_restrictions.json")
2430+
val expressionData = MapboxRouteLineUtils.extractRouteRestrictionData(
2431+
route,
2432+
MapboxRouteLineUtils.granularDistancesProvider
2433+
)
2434+
2435+
val result = MapboxRouteLineUtils.getNonMaskingRestrictedLineExpressionProducer(
2436+
expressionData,
2437+
vanishingPointOffset = 0.0,
2438+
activeLegIndex = 1,
2439+
options
2440+
)
2441+
2442+
assertEquals(expectedExpression, result.generateExpression().toString())
2443+
}
2444+
23252445
@Test
23262446
fun getMaskingLayerDynamicData() {
23272447
val expectedExpression = "[literal, [0.0, 0.1]]"

0 commit comments

Comments
 (0)