Skip to content

Commit aeeeb98

Browse files
kriedmaru-biz
authored andcommitted
Do not override options values in NavigationRouteOptions and NavigationMatchOptions initializers (#4794)
1 parent 8640ef8 commit aeeeb98

File tree

6 files changed

+278
-59
lines changed

6 files changed

+278
-59
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changes to the Mapbox Navigation SDK for iOS
22

3+
## v2.20.3
4+
5+
### Routing
6+
7+
* `NavigationRouteOptions.init(waypoints:profileIdentifier:queryItems:)` and `NavigationMatchOptions.init(waypoints:profileIdentifier:queryItems:)` set the default values for `shapeFormat`, `locale`, `distanceMeasurementSystem`, `routeShapeResolution`, `includesSpokenInstructions`, and `includesVisualInstructions` only if the values were not passed in `queryItems`. ([#4794](https://github.com/mapbox/mapbox-navigation-ios/pull/4794))
8+
39
## v2.20.2
410

511
### Routing

MapboxNavigation.xcodeproj/project.pbxproj

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@
105105
2C4093B5292661FD0099FA0E /* RouteParserSpy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C4093B4292661FD0099FA0E /* RouteParserSpy.swift */; };
106106
2C484CDA2979AD6F00EAAE78 /* EventsMetadataProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C484CD92979AD6F00EAAE78 /* EventsMetadataProviderTests.swift */; };
107107
2C4D0A2E29F6DC900063BF52 /* NavigationSessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C4D0A2D29F6DC900063BF52 /* NavigationSessionManager.swift */; };
108+
2C4FF6842E7324A400B330FF /* NavigationMatchOptionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C4FF6822E7324A400B330FF /* NavigationMatchOptionsTests.swift */; };
109+
2C4FF6852E7324A400B330FF /* NavigationRouteOptionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C4FF6832E7324A400B330FF /* NavigationRouteOptionsTests.swift */; };
108110
2C585157292521C20077A558 /* MapboxCoreNavigation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5ADFBC91DDCC7840011824B /* MapboxCoreNavigation.framework */; };
109111
2C58515F292523670077A558 /* RouteControllerIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C58515E292523670077A558 /* RouteControllerIntegrationTests.swift */; };
110112
2C585164292530AF0077A558 /* TestHelper.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 35CDA85E2190F2A30072B675 /* TestHelper.framework */; };
@@ -196,7 +198,6 @@
196198
351BEC0D1E5BCC72006FE110 /* Bundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 351BEC081E5BCC72006FE110 /* Bundle.swift */; };
197199
351BEC291E5BD530006FE110 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 351BEC281E5BD530006FE110 /* Assets.xcassets */; };
198200
3525449D1E663D32004C8F1C /* MapboxCoreNavigation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5ADFBC91DDCC7840011824B /* MapboxCoreNavigation.framework */; };
199-
352762A4225B751A0015B632 /* OptionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 352762A3225B751A0015B632 /* OptionsTests.swift */; };
200201
352BBC3B1E5E6A0C00703DF1 /* MapboxCoreNavigation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5ADFBC91DDCC7840011824B /* MapboxCoreNavigation.framework */; };
201202
3531C2701F9E095400D92F9A /* InstructionsBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3531C26F1F9E095400D92F9A /* InstructionsBannerView.swift */; };
202203
353280A11FA72871005175F3 /* InstructionLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 353280A01FA72871005175F3 /* InstructionLabel.swift */; };
@@ -804,6 +805,8 @@
804805
2C4093B4292661FD0099FA0E /* RouteParserSpy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouteParserSpy.swift; sourceTree = "<group>"; };
805806
2C484CD92979AD6F00EAAE78 /* EventsMetadataProviderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventsMetadataProviderTests.swift; sourceTree = "<group>"; };
806807
2C4D0A2D29F6DC900063BF52 /* NavigationSessionManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavigationSessionManager.swift; sourceTree = "<group>"; };
808+
2C4FF6822E7324A400B330FF /* NavigationMatchOptionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationMatchOptionsTests.swift; sourceTree = "<group>"; };
809+
2C4FF6832E7324A400B330FF /* NavigationRouteOptionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationRouteOptionsTests.swift; sourceTree = "<group>"; };
807810
2C585153292521C20077A558 /* MapboxCoreNavigationIntegrationTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MapboxCoreNavigationIntegrationTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
808811
2C58515E292523670077A558 /* RouteControllerIntegrationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RouteControllerIntegrationTests.swift; sourceTree = "<group>"; };
809812
2C58516229252FE20077A558 /* MapboxCoreNavigationIntegrationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapboxCoreNavigationIntegrationTests.swift; sourceTree = "<group>"; };
@@ -892,7 +895,6 @@
892895
351BEC081E5BCC72006FE110 /* Bundle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Bundle.swift; sourceTree = "<group>"; };
893896
351BEC0B1E5BCC72006FE110 /* DistanceFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DistanceFormatter.swift; sourceTree = "<group>"; };
894897
351BEC281E5BD530006FE110 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Resources/Assets.xcassets; sourceTree = "<group>"; };
895-
352762A3225B751A0015B632 /* OptionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionsTests.swift; sourceTree = "<group>"; };
896898
352C35BF2134958F00D77796 /* RecentItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecentItem.swift; sourceTree = "<group>"; };
897899
3531C2691F9DDC6F00D92F9A /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Navigation.strings"; sourceTree = "<group>"; };
898900
3531C26A1F9DDC6F00D92F9A /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = "<group>"; };
@@ -2518,6 +2520,8 @@
25182520
C5ADFBD61DDCC7840011824B /* MapboxCoreNavigationTests */ = {
25192521
isa = PBXGroup;
25202522
children = (
2523+
2C4FF6822E7324A400B330FF /* NavigationMatchOptionsTests.swift */,
2524+
2C4FF6832E7324A400B330FF /* NavigationRouteOptionsTests.swift */,
25212525
2CE89C29299E6C17000A2E34 /* EV */,
25222526
2C484CD82979AD5C00EAAE78 /* Telemetry */,
25232527
2C36D8FC2952256400EE37DF /* Progress */,
@@ -2542,7 +2546,6 @@
25422546
AE8B1B96207D2B2B003050F6 /* TunnelAuthorityTests.swift */,
25432547
3573EA70215A5A9F009899D7 /* RouteControllerTests.swift */,
25442548
3519D01D21F0842900582FF5 /* CLLocationTests.swift */,
2545-
352762A3225B751A0015B632 /* OptionsTests.swift */,
25462549
5A43FC8A24B488DC00BF7943 /* PassiveLocationManagerTests.swift */,
25472550
E2842797265B907C003F86E4 /* UnimplementedLoggingTests.swift */,
25482551
E23D8B6A269D7EE90094CEFA /* TilesetDescriptorFactoryTests.swift */,
@@ -3648,6 +3651,8 @@
36483651
2CA6105429802ACF003E49A7 /* MonitorConnectivityTypeProviderTests.swift in Sources */,
36493652
2CEC5C5829F71D9A001B5EC2 /* NavigationSessionManagerTests.swift in Sources */,
36503653
2C36D9012952256400EE37DF /* RouteStepProgressTests.swift in Sources */,
3654+
2C4FF6842E7324A400B330FF /* NavigationMatchOptionsTests.swift in Sources */,
3655+
2C4FF6852E7324A400B330FF /* NavigationRouteOptionsTests.swift in Sources */,
36513656
359A8AED1FA78D3000BDB486 /* DistanceFormatterTests.swift in Sources */,
36523657
5A43FC8B24B488DC00BF7943 /* PassiveLocationManagerTests.swift in Sources */,
36533658
2C9DDBE32934C457007F8CFD /* RouteControllerTests.swift in Sources */,
@@ -3656,7 +3661,6 @@
36563661
E2814D982693412E000AD987 /* BillingHandlerTests.swift in Sources */,
36573662
2CC3043529A3DCDE00A3318F /* NavigationStatusTests.swift in Sources */,
36583663
C582BA2C2073E77E00647DAA /* StringTests.swift in Sources */,
3659-
352762A4225B751A0015B632 /* OptionsTests.swift in Sources */,
36603664
DA7A97CF26A7613D001B6A9A /* RouteOptionsTests.swift in Sources */,
36613665
2C2880A1291A82630063E5B7 /* RerouteControllerTests.swift in Sources */,
36623666
8A9270EA2704F6CC00B606D9 /* BundleAdditionsTests.swift in Sources */,

Sources/MapboxCoreNavigation/NavigationRouteOptions.swift

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ open class NavigationRouteOptions: RouteOptions, OptimizedForNavigation {
3232
refreshingEnabled = true
3333
}
3434

35-
optimizeForNavigation()
35+
optimizeForNavigation(queryItems: queryItems)
3636
}
3737

3838
/**
@@ -96,7 +96,7 @@ open class NavigationMatchOptions: MatchOptions, OptimizedForNavigation {
9696
}
9797
}
9898

99-
optimizeForNavigation()
99+
optimizeForNavigation(queryItems: queryItems)
100100
}
101101

102102

@@ -123,6 +123,16 @@ open class NavigationMatchOptions: MatchOptions, OptimizedForNavigation {
123123
}
124124
}
125125

126+
fileprivate enum OptimizedForNavigationKey: String {
127+
case includesSteps = "steps"
128+
case shapeFormat = "geometries"
129+
case routeShapeResolution = "overview"
130+
case locale = "language"
131+
case includesSpokenInstructions = "voice_instructions"
132+
case distanceMeasurementSystem = "voice_units"
133+
case includesVisualInstructions = "banner_instructions"
134+
}
135+
126136
protocol OptimizedForNavigation: AnyObject {
127137
var includesSteps: Bool { get set }
128138
var routeShapeResolution: RouteShapeResolution { get set }
@@ -133,17 +143,33 @@ protocol OptimizedForNavigation: AnyObject {
133143
var includesSpokenInstructions: Bool { get set }
134144
var includesVisualInstructions: Bool { get set }
135145

136-
func optimizeForNavigation()
146+
func optimizeForNavigation(queryItems: [URLQueryItem]?)
137147
}
138148

139149
extension OptimizedForNavigation {
140-
func optimizeForNavigation() {
141-
shapeFormat = .polyline6
142-
includesSteps = true
143-
routeShapeResolution = .full
144-
includesSpokenInstructions = true
145-
locale = Locale.nationalizedCurrent
146-
distanceMeasurementSystem = .init(NavigationSettings.shared.distanceUnit)
147-
includesVisualInstructions = true
150+
func optimizeForNavigation(queryItems: [URLQueryItem]?) {
151+
let names = Set(queryItems?.map { $0.name } ?? [])
152+
153+
if !names.contains(OptimizedForNavigationKey.shapeFormat.rawValue) {
154+
shapeFormat = .polyline6
155+
}
156+
if !names.contains(OptimizedForNavigationKey.includesSteps.rawValue) {
157+
includesSteps = true
158+
}
159+
if !names.contains(OptimizedForNavigationKey.routeShapeResolution.rawValue) {
160+
routeShapeResolution = .full
161+
}
162+
if !names.contains(OptimizedForNavigationKey.includesSpokenInstructions.rawValue) {
163+
includesSpokenInstructions = true
164+
}
165+
if !names.contains(OptimizedForNavigationKey.locale.rawValue) {
166+
locale = .nationalizedCurrent
167+
}
168+
if !names.contains(OptimizedForNavigationKey.distanceMeasurementSystem.rawValue) {
169+
distanceMeasurementSystem = .init(NavigationSettings.shared.distanceUnit)
170+
}
171+
if !names.contains(OptimizedForNavigationKey.includesVisualInstructions.rawValue) {
172+
includesVisualInstructions = true
173+
}
148174
}
149175
}
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
import XCTest
2+
import CoreLocation
3+
import MapboxDirections
4+
import TestHelper
5+
@testable import MapboxCoreNavigation
6+
7+
final class NavigationMatchOptionsTests: XCTestCase {
8+
let coordinates = [
9+
CLLocationCoordinate2D(latitude: 0, longitude: 1),
10+
CLLocationCoordinate2D(latitude: 2, longitude: 3),
11+
]
12+
13+
var waypoints: [Waypoint] {
14+
coordinates.map { Waypoint(coordinate: $0) }
15+
}
16+
17+
func testNavigationMatchOptions() {
18+
let options = NavigationMatchOptions(coordinates: coordinates)
19+
navigationPrerequisitesAssertions(options: options)
20+
}
21+
22+
func navigationPrerequisitesAssertions(options: DirectionsOptions) {
23+
XCTAssertEqual(options.profileIdentifier, .automobileAvoidingTraffic)
24+
XCTAssertEqual(options.routeShapeResolution, .full)
25+
XCTAssertEqual(options.shapeFormat, .polyline6)
26+
XCTAssertEqual(options.attributeOptions, [.numericCongestionLevel, .expectedTravelTime, .maximumSpeedLimit])
27+
XCTAssertTrue(options.includesVisualInstructions)
28+
XCTAssertTrue(options.includesSpokenInstructions)
29+
XCTAssertTrue(options.includesSteps)
30+
XCTAssertEqual(options.locale, Locale.nationalizedCurrent)
31+
}
32+
33+
func testDefaultAttributeOptions() {
34+
XCTAssertEqual(
35+
NavigationMatchOptions(coordinates: coordinates).attributeOptions,
36+
[.numericCongestionLevel, .expectedTravelTime, .maximumSpeedLimit]
37+
)
38+
XCTAssertEqual(
39+
NavigationMatchOptions(coordinates: coordinates, profileIdentifier: .automobile).attributeOptions,
40+
[.expectedTravelTime, .maximumSpeedLimit]
41+
)
42+
XCTAssertEqual(
43+
NavigationMatchOptions(coordinates: coordinates, profileIdentifier: .automobileAvoidingTraffic)
44+
.attributeOptions,
45+
[.numericCongestionLevel, .expectedTravelTime, .maximumSpeedLimit]
46+
)
47+
XCTAssertEqual(
48+
NavigationMatchOptions(coordinates: coordinates, profileIdentifier: .cycling).attributeOptions,
49+
[.expectedTravelTime]
50+
)
51+
XCTAssertEqual(
52+
NavigationMatchOptions(coordinates: coordinates, profileIdentifier: .walking).attributeOptions,
53+
[.expectedTravelTime]
54+
)
55+
XCTAssertEqual(
56+
NavigationMatchOptions(coordinates: coordinates, profileIdentifier: .init(rawValue: "mapbox/unicycling"))
57+
.attributeOptions,
58+
[.expectedTravelTime]
59+
)
60+
}
61+
62+
func testSetShapeFormat() {
63+
let queryItems: [URLQueryItem] = [.init(name: "geometries", value: "geojson")]
64+
let options = NavigationMatchOptions(waypoints: waypoints, queryItems: queryItems)
65+
XCTAssertEqual(options.shapeFormat, .geoJSON)
66+
}
67+
68+
func testSetIncludesSteps() {
69+
let queryItems: [URLQueryItem] = [.init(name: "steps", value: "false")]
70+
let options = NavigationMatchOptions(waypoints: waypoints, queryItems: queryItems)
71+
XCTAssertFalse(options.includesSteps)
72+
}
73+
74+
func testSetIncludesSpokenInstructions() {
75+
let queryItems: [URLQueryItem] = [.init(name: "voice_instructions", value: "false")]
76+
let options = NavigationMatchOptions(waypoints: waypoints, queryItems: queryItems)
77+
XCTAssertFalse(options.includesSpokenInstructions)
78+
}
79+
80+
func testSetIncludesVisualInstructions() {
81+
let queryItems: [URLQueryItem] = [.init(name: "banner_instructions", value: "false")]
82+
let options = NavigationMatchOptions(waypoints: waypoints, queryItems: queryItems)
83+
XCTAssertFalse(options.includesVisualInstructions)
84+
}
85+
86+
func testSetRouteShapeResolution() {
87+
let queryItems: [URLQueryItem] = [.init(name: "overview", value: "low")]
88+
let options = NavigationMatchOptions(waypoints: waypoints, queryItems: queryItems)
89+
XCTAssertEqual(options.routeShapeResolution, .low)
90+
}
91+
92+
func testSetLocale() {
93+
let queryItems: [URLQueryItem] = [.init(name: "language", value: "ja_JP")]
94+
let options = NavigationMatchOptions(waypoints: waypoints, queryItems: queryItems)
95+
XCTAssertEqual(options.locale, .init(identifier: "ja_JP"))
96+
}
97+
98+
func testSetDistanceMeasurementSystem() {
99+
let queryItems1: [URLQueryItem] = [
100+
.init(name: "voice_units", value: "metric"),
101+
.init(name: "language", value: "ja_JP"),
102+
]
103+
let options1 = NavigationMatchOptions(waypoints: waypoints, queryItems: queryItems1)
104+
XCTAssertEqual(options1.distanceMeasurementSystem, .metric)
105+
106+
let queryItems2: [URLQueryItem] = [
107+
.init(name: "voice_units", value: "imperial"),
108+
.init(name: "language", value: "ja_JP"),
109+
]
110+
let options2 = NavigationMatchOptions(waypoints: waypoints, queryItems: queryItems2)
111+
XCTAssertEqual(options2.distanceMeasurementSystem, .imperial)
112+
}
113+
}

0 commit comments

Comments
 (0)