Skip to content

Commit 42fa584

Browse files
author
Pablo Guardiola
authored
expose include-hov/hot parameters and add exclude list option (#1296)
1 parent a913461 commit 42fa584

8 files changed

Lines changed: 220 additions & 15 deletions

File tree

services-directions-models/src/main/java/com/mapbox/api/directions/v5/DirectionsCriteria.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,21 @@ public final class DirectionsCriteria {
178178
*/
179179
public static final String EXCLUDE_RESTRICTED = "restricted";
180180

181+
/**
182+
* A road type that requires a minimum of two vehicle occupants.
183+
*/
184+
public static final String INCLUDE_HOV2 = "hov2";
185+
186+
/**
187+
* A road type that requires a minimum of three vehicle occupants.
188+
*/
189+
public static final String INCLUDE_HOV3 = "hov3";
190+
191+
/**
192+
* An hov road that is tolled if your vehicle doesn't meet the minimum occupant requirement.
193+
*/
194+
public static final String INCLUDE_HOT = "hot";
195+
181196
/**
182197
* Change the units to imperial for voice and visual information. Note that this won't change
183198
* other results such as raw distance measurements which will always be returned in meters.
@@ -325,6 +340,18 @@ private DirectionsCriteria() {
325340
public @interface ExcludeCriteria {
326341
}
327342

343+
/**
344+
* Retention policy for include key.
345+
*/
346+
@Retention(RetentionPolicy.CLASS)
347+
@StringDef( {
348+
INCLUDE_HOV2,
349+
INCLUDE_HOV3,
350+
INCLUDE_HOT
351+
})
352+
public @interface IncludeCriteria {
353+
}
354+
328355
/**
329356
* Retention policy for the various units of measurements.
330357
*

services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/RouteOptions.java

Lines changed: 146 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,72 @@ public List<String> annotationsList() {
353353
@Nullable
354354
public abstract String exclude();
355355

356+
/**
357+
* A list of exclude.
358+
* Exclude certain road types from routing. The default is to not exclude anything from the
359+
* profile selected. The following exclude flags are available for each profile:
360+
* <p>
361+
* {@link DirectionsCriteria#PROFILE_DRIVING}: One of {@link DirectionsCriteria#EXCLUDE_TOLL},
362+
* {@link DirectionsCriteria#EXCLUDE_MOTORWAY}, or {@link DirectionsCriteria#EXCLUDE_FERRY}.
363+
* <p>
364+
* {@link DirectionsCriteria#PROFILE_DRIVING_TRAFFIC}: One of
365+
* {@link DirectionsCriteria#EXCLUDE_TOLL}, {@link DirectionsCriteria#EXCLUDE_MOTORWAY}, or
366+
* {@link DirectionsCriteria#EXCLUDE_FERRY}.
367+
* <p>
368+
* {@link DirectionsCriteria#PROFILE_WALKING}: No excludes supported
369+
* <p>
370+
* {@link DirectionsCriteria#PROFILE_CYCLING}: {@link DirectionsCriteria#EXCLUDE_FERRY}
371+
*
372+
* @return a string matching one of the {@link DirectionsCriteria.ExcludeCriteria} exclusions
373+
*/
374+
@Nullable
375+
public List<String> excludeList() {
376+
return ParseUtils.parseToStrings(exclude(), ",");
377+
}
378+
379+
/**
380+
* Include certain road types in routing. By default, none of the road types listed below
381+
* are included. The following include flags are available for each profile:
382+
* <p>
383+
* {@link DirectionsCriteria#PROFILE_DRIVING}: One of {@link DirectionsCriteria#INCLUDE_HOV2},
384+
* {@link DirectionsCriteria#INCLUDE_HOV3}, or {@link DirectionsCriteria#INCLUDE_HOT}.
385+
* <p>
386+
* {@link DirectionsCriteria#PROFILE_DRIVING_TRAFFIC}: One of
387+
* {@link DirectionsCriteria#INCLUDE_HOV2}, {@link DirectionsCriteria#INCLUDE_HOV3}, or
388+
* {@link DirectionsCriteria#INCLUDE_HOT}.
389+
* <p>
390+
* {@link DirectionsCriteria#PROFILE_WALKING}: No includes supported
391+
* <p>
392+
* {@link DirectionsCriteria#PROFILE_CYCLING}: No includes supported
393+
*
394+
* @return a string matching one of the {@link DirectionsCriteria.IncludeCriteria} inclusions
395+
*/
396+
@Nullable
397+
public abstract String include();
398+
399+
/**
400+
* A list of include.
401+
* Include certain road types in routing. By default, none of the road types listed below
402+
* are included. The following include flags are available for each profile:
403+
* <p>
404+
* {@link DirectionsCriteria#PROFILE_DRIVING}: One of {@link DirectionsCriteria#INCLUDE_HOV2},
405+
* {@link DirectionsCriteria#INCLUDE_HOV3}, or {@link DirectionsCriteria#INCLUDE_HOT}.
406+
* <p>
407+
* {@link DirectionsCriteria#PROFILE_DRIVING_TRAFFIC}: One of
408+
* {@link DirectionsCriteria#INCLUDE_HOV2}, {@link DirectionsCriteria#INCLUDE_HOV3}, or
409+
* {@link DirectionsCriteria#INCLUDE_HOT}.
410+
* <p>
411+
* {@link DirectionsCriteria#PROFILE_WALKING}: No includes supported
412+
* <p>
413+
* {@link DirectionsCriteria#PROFILE_CYCLING}: No includes supported
414+
*
415+
* @return a string matching one of the {@link DirectionsCriteria.IncludeCriteria} inclusions
416+
*/
417+
@Nullable
418+
public List<String> includeList() {
419+
return ParseUtils.parseToStrings(include(), ",");
420+
}
421+
356422
/**
357423
* Whether to return SSML marked-up text for voice guidance along the route (true) or not
358424
* (false, default if null).
@@ -1055,7 +1121,8 @@ public Builder layersList(@Nullable List<Integer> layers) {
10551121
*/
10561122
@NonNull
10571123
public abstract Builder geometries(
1058-
@NonNull @DirectionsCriteria.GeometriesCriteria String geometries);
1124+
@NonNull @DirectionsCriteria.GeometriesCriteria String geometries
1125+
);
10591126

10601127
/**
10611128
* Displays the requested type of overview geometry. Can be
@@ -1195,6 +1262,84 @@ public Builder annotationsList(@Nullable List<String> annotations) {
11951262
@NonNull
11961263
public abstract Builder exclude(@Nullable @DirectionsCriteria.ExcludeCriteria String exclude);
11971264

1265+
/**
1266+
* A list of exclude. Exclude certain road types from routing.
1267+
* The default is to not exclude anything from the profile selected.
1268+
* The following exclude flags are available for each profile:
1269+
* <p>
1270+
* {@link DirectionsCriteria#PROFILE_DRIVING}: One of {@link DirectionsCriteria#EXCLUDE_TOLL},
1271+
* {@link DirectionsCriteria#EXCLUDE_MOTORWAY}, or {@link DirectionsCriteria#EXCLUDE_FERRY}.
1272+
* <p>
1273+
* {@link DirectionsCriteria#PROFILE_DRIVING_TRAFFIC}: One of
1274+
* {@link DirectionsCriteria#EXCLUDE_TOLL}, {@link DirectionsCriteria#EXCLUDE_MOTORWAY}, or
1275+
* {@link DirectionsCriteria#EXCLUDE_FERRY}.
1276+
* <p>
1277+
* {@link DirectionsCriteria#PROFILE_WALKING}: No excludes supported
1278+
* <p>
1279+
* {@link DirectionsCriteria#PROFILE_CYCLING}: {@link DirectionsCriteria#EXCLUDE_FERRY}
1280+
*
1281+
* @param exclude a list of exclude that were used during the request
1282+
* @return this builder for chaining options together
1283+
*/
1284+
@NonNull
1285+
public Builder excludeList(@Nullable List<String> exclude) {
1286+
String result = FormatUtils.join(",", exclude);
1287+
if (result != null) {
1288+
exclude(result);
1289+
}
1290+
return this;
1291+
}
1292+
1293+
/**
1294+
* Include certain road types in routing. By default, none of the road types listed below
1295+
* are included. The following include flags are available for each profile:
1296+
* <p>
1297+
* {@link DirectionsCriteria#PROFILE_DRIVING}: One of {@link DirectionsCriteria#INCLUDE_HOV2},
1298+
* {@link DirectionsCriteria#INCLUDE_HOV3}, or {@link DirectionsCriteria#INCLUDE_HOT}.
1299+
* <p>
1300+
* {@link DirectionsCriteria#PROFILE_DRIVING_TRAFFIC}: One of
1301+
* {@link DirectionsCriteria#INCLUDE_HOV2}, {@link DirectionsCriteria#INCLUDE_HOV3}, or
1302+
* {@link DirectionsCriteria#INCLUDE_HOT}.
1303+
* <p>
1304+
* {@link DirectionsCriteria#PROFILE_WALKING}: No includes supported
1305+
* <p>
1306+
* {@link DirectionsCriteria#PROFILE_CYCLING}: No includes supported
1307+
*
1308+
* @param include a string matching one of the {@link DirectionsCriteria.IncludeCriteria}
1309+
* inclusions
1310+
* @return this builder for chaining options together
1311+
*/
1312+
@NonNull
1313+
public abstract Builder include(@Nullable @DirectionsCriteria.IncludeCriteria String include);
1314+
1315+
/**
1316+
* A list of include. Include certain road types in routing.
1317+
* By default, none of the road types listed below are included.
1318+
* The following include flags are available for each profile:
1319+
* <p>
1320+
* {@link DirectionsCriteria#PROFILE_DRIVING}: One of {@link DirectionsCriteria#INCLUDE_HOV2},
1321+
* {@link DirectionsCriteria#INCLUDE_HOV3}, or {@link DirectionsCriteria#INCLUDE_HOT}.
1322+
* <p>
1323+
* {@link DirectionsCriteria#PROFILE_DRIVING_TRAFFIC}: One of
1324+
* {@link DirectionsCriteria#INCLUDE_HOV2}, {@link DirectionsCriteria#INCLUDE_HOV3}, or
1325+
* {@link DirectionsCriteria#INCLUDE_HOT}.
1326+
* <p>
1327+
* {@link DirectionsCriteria#PROFILE_WALKING}: No includes supported
1328+
* <p>
1329+
* {@link DirectionsCriteria#PROFILE_CYCLING}: No includes supported
1330+
*
1331+
* @param include a list of include that were used during the request
1332+
* @return this builder for chaining options together
1333+
*/
1334+
@NonNull
1335+
public Builder includeList(@Nullable List<String> include) {
1336+
String result = FormatUtils.join(",", include);
1337+
if (result != null) {
1338+
include(result);
1339+
}
1340+
return this;
1341+
}
1342+
11981343
/**
11991344
* A semicolon-separated list indicating from which side of the road
12001345
* to approach a waypoint.

services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/RouteOptionsTest.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public void userIsValid_fromJson() {
4141
public void profileIsValid_fromJson() {
4242
RouteOptions routeOptions = RouteOptions.fromJson(optionsJson);
4343

44-
assertEquals(DirectionsCriteria.PROFILE_DRIVING_TRAFFIC, routeOptions.profile());
44+
assertEquals(DirectionsCriteria.PROFILE_DRIVING, routeOptions.profile());
4545
}
4646

4747
@Test
@@ -168,7 +168,14 @@ public void annotationsAreValid_fromJson() {
168168
public void excludeIsValid_fromJson() {
169169
RouteOptions routeOptions = RouteOptions.fromJson(optionsJson);
170170

171-
assertEquals("toll", routeOptions.exclude());
171+
assertEquals("toll,ferry", routeOptions.exclude());
172+
}
173+
174+
@Test
175+
public void includeIsValid_fromJson() {
176+
RouteOptions routeOptions = RouteOptions.fromJson(optionsJson);
177+
178+
assertEquals("hot,hov2", routeOptions.include());
172179
}
173180

174181
@Test
@@ -322,14 +329,15 @@ private RouteOptions routeOptions() {
322329

323330
return RouteOptions.builder()
324331
.baseUrl("https://api.mapbox.com")
325-
.profile(DirectionsCriteria.PROFILE_DRIVING_TRAFFIC)
332+
.profile(DirectionsCriteria.PROFILE_DRIVING)
326333
.coordinatesList(coordinates)
327334
.alternatives(false)
328335
.annotations("congestion,distance,duration")
329336
.bearings("0,90;90,0;")
330337
.layers("-42;;0")
331338
.continueStraight(false)
332-
.exclude(DirectionsCriteria.EXCLUDE_TOLL)
339+
.exclude(DirectionsCriteria.EXCLUDE_TOLL + "," + DirectionsCriteria.EXCLUDE_FERRY)
340+
.include(DirectionsCriteria.INCLUDE_HOT + "," + DirectionsCriteria.INCLUDE_HOV2)
333341
.geometries(DirectionsCriteria.GEOMETRY_POLYLINE6)
334342
.overview(DirectionsCriteria.OVERVIEW_FULL)
335343
.radiuses(";unlimited;5.1")
@@ -358,7 +366,7 @@ private RouteOptions routeOptions() {
358366
}
359367

360368
/**
361-
* Fills up all the options using list variants. Values need ot be equal to the ones in {@link #optionsJson}.
369+
* Fills up all the options using list variants. Values need to be equal to the ones in {@link #optionsJson}.
362370
*/
363371
private RouteOptions routeOptionsList() {
364372
List<Point> coordinates = new ArrayList<>();
@@ -368,7 +376,7 @@ private RouteOptions routeOptionsList() {
368376

369377
return RouteOptions.builder()
370378
.baseUrl("https://api.mapbox.com")
371-
.profile(DirectionsCriteria.PROFILE_DRIVING_TRAFFIC)
379+
.profile(DirectionsCriteria.PROFILE_DRIVING)
372380
.coordinatesList(coordinates)
373381
.alternatives(false)
374382
.annotationsList(new ArrayList<String>() {{
@@ -387,7 +395,14 @@ private RouteOptions routeOptionsList() {
387395
add(0);
388396
}})
389397
.continueStraight(false)
390-
.exclude(DirectionsCriteria.EXCLUDE_TOLL)
398+
.excludeList(new ArrayList<String>() {{
399+
add(DirectionsCriteria.EXCLUDE_TOLL);
400+
add(DirectionsCriteria.EXCLUDE_FERRY);
401+
}})
402+
.includeList(new ArrayList<String>() {{
403+
add(DirectionsCriteria.INCLUDE_HOT);
404+
add(DirectionsCriteria.INCLUDE_HOV2);
405+
}})
391406
.geometries(DirectionsCriteria.GEOMETRY_POLYLINE6)
392407
.overview(DirectionsCriteria.OVERVIEW_FULL)
393408
.radiusesList(new ArrayList<Double>() {{

services-directions-models/src/test/resources/route_options_v5.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"baseUrl": "https://api.mapbox.com",
33
"user": "mapbox",
4-
"profile": "driving-traffic",
4+
"profile": "driving",
55
"coordinates": "-122.4003312,37.7736941;-122.4187529,37.7689715;-122.4255172,37.7775835",
66
"alternatives": false,
77
"language": "ru",
@@ -14,7 +14,8 @@
1414
"overview": "full",
1515
"steps": true,
1616
"annotations": "congestion,distance,duration",
17-
"exclude": "toll",
17+
"exclude": "toll,ferry",
18+
"include": "hot,hov2",
1819
"voice_instructions": true,
1920
"banner_instructions": true,
2021
"voice_units": "metric",

services-directions/src/main/java/com/mapbox/api/directions/v5/DirectionsService.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ interface DirectionsService {
2424
* @param user {@link RouteOptions#user()}
2525
* @param profile {@link RouteOptions#profile()}
2626
* @param coordinates {@link RouteOptions#coordinatesList()}
27-
* @param accessToken {@link RouteOptions#accessToken()}
27+
* @param accessToken the access token
2828
* @param alternatives {@link RouteOptions#alternatives()}
2929
* @param geometries {@link RouteOptions#geometries()}
3030
* @param overview {@link RouteOptions#overview()}
@@ -40,6 +40,7 @@ interface DirectionsService {
4040
* @param bannerInstructions {@link RouteOptions#bannerInstructions()}
4141
* @param voiceUnits {@link RouteOptions#voiceUnits()}
4242
* @param exclude {@link RouteOptions#exclude()}
43+
* @param include {@link RouteOptions#include()}
4344
* @param approaches {@link RouteOptions#approaches()}
4445
* @param waypointIndices {@link RouteOptions#waypointIndices()}
4546
* @param waypointNames {@link RouteOptions#waypointNames()}
@@ -78,6 +79,7 @@ Call<DirectionsResponse> getCall(
7879
@Query("banner_instructions") Boolean bannerInstructions,
7980
@Query("voice_units") String voiceUnits,
8081
@Query("exclude") String exclude,
82+
@Query("include") String include,
8183
@Query("approaches") String approaches,
8284
@Query("waypoints") String waypointIndices,
8385
@Query("waypoint_names") String waypointNames,
@@ -101,7 +103,7 @@ Call<DirectionsResponse> getCall(
101103
* @param user {@link RouteOptions#user()}
102104
* @param profile {@link RouteOptions#profile()}
103105
* @param coordinates {@link RouteOptions#coordinatesList()}
104-
* @param accessToken {@link RouteOptions#accessToken()}
106+
* @param accessToken the access token
105107
* @param alternatives {@link RouteOptions#alternatives()}
106108
* @param geometries {@link RouteOptions#geometries()}
107109
* @param overview {@link RouteOptions#overview()}
@@ -117,6 +119,7 @@ Call<DirectionsResponse> getCall(
117119
* @param bannerInstructions {@link RouteOptions#bannerInstructions()}
118120
* @param voiceUnits {@link RouteOptions#voiceUnits()}
119121
* @param exclude {@link RouteOptions#exclude()}
122+
* @param include {@link RouteOptions#include()}
120123
* @param approaches {@link RouteOptions#approaches()}
121124
* @param waypointIndices {@link RouteOptions#waypointIndices()}
122125
* @param waypointNames {@link RouteOptions#waypointNames()}
@@ -156,6 +159,7 @@ Call<DirectionsResponse> postCall(
156159
@Field("banner_instructions") Boolean bannerInstructions,
157160
@Field("voice_units") String voiceUnits,
158161
@Field("exclude") String exclude,
162+
@Field("include") String include,
159163
@Field("approaches") String approaches,
160164
@Field("waypoints") String waypointIndices,
161165
@Field("waypoint_names") String waypointNames,

services-directions/src/main/java/com/mapbox/api/directions/v5/MapboxDirections.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ private Call<DirectionsResponse> get() {
9595
routeOptions().bannerInstructions(),
9696
routeOptions().voiceUnits(),
9797
routeOptions().exclude(),
98+
routeOptions().include(),
9899
routeOptions().approaches(),
99100
routeOptions().waypointIndices(),
100101
routeOptions().waypointNames(),
@@ -134,6 +135,7 @@ private Call<DirectionsResponse> post() {
134135
routeOptions().bannerInstructions(),
135136
routeOptions().voiceUnits(),
136137
routeOptions().exclude(),
138+
routeOptions().include(),
137139
routeOptions().approaches(),
138140
routeOptions().waypointIndices(),
139141
routeOptions().waypointNames(),

services-directions/src/test/java/com/mapbox/api/directions/v5/MapboxDirectionsTest.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ public void profile_doesGetFormattedInUrlCorrectly() throws Exception {
179179
.accessToken("token")
180180
.routeOptions(routeOptions)
181181
.build();
182-
assertTrue(directions.cloneCall().request().url().toString().contains("/driving-traffic/"));
182+
assertTrue(directions.cloneCall().request().url().toString().contains("/driving/"));
183183
}
184184

185185
@Test
@@ -358,6 +358,16 @@ public void exclude_doesGetFormattedInUrlCorrectly() throws Exception {
358358
assertTrue(directions.cloneCall().request().url().toString().contains("exclude=toll"));
359359
}
360360

361+
@Test
362+
public void include_doesGetFormattedInUrlCorrectly() throws Exception {
363+
MapboxDirections directions = MapboxDirections.builder()
364+
.accessToken("token")
365+
.routeOptions(routeOptions)
366+
.build();
367+
368+
assertTrue(directions.cloneCall().request().url().toString().contains("include=hot"));
369+
}
370+
361371
@Test
362372
public void callFactoryNonNull() throws IOException {
363373
MapboxDirections client = MapboxDirections.builder()

0 commit comments

Comments
 (0)