From 526e833888482077d1436f4d681f029e8bd9a747 Mon Sep 17 00:00:00 2001 From: VysotskiVadim Date: Tue, 7 Jun 2022 10:57:21 +0200 Subject: [PATCH] added payment methods parameters --- .../api/directions/v5/DirectionsCriteria.java | 103 ++++++++++++++++++ .../v5/models/IntersectionLanes.java | 19 +++- .../directions/v5/models/RouteOptions.java | 49 +++++++++ .../v5/models/IntersectionLanesTest.java | 17 +++ .../v5/models/RouteOptionsTest.java | 44 +++++++- .../src/test/resources/route_options_v5.json | 3 +- .../api/directions/v5/DirectionsService.java | 6 +- .../api/directions/v5/MapboxDirections.java | 6 +- .../directions/v5/MapboxDirectionsTest.java | 11 ++ .../src/test/resources/route_options_v5.json | 3 +- 10 files changed, 253 insertions(+), 8 deletions(-) diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/DirectionsCriteria.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/DirectionsCriteria.java index 8dfecc5e0..717a81cf0 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/DirectionsCriteria.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/DirectionsCriteria.java @@ -314,6 +314,86 @@ public final class DirectionsCriteria { @SuppressWarnings("checkstyle:javadocvariable") public static final int TRAFFIC_TENDENCY_RAPIDLY_DECREASING_CONGESTION = 5; + /* + * Used in Japan for all payments other than transponder such as ETC or ETCX. + */ + @SuppressWarnings("checkstyle:javadocvariable") + public static final String PAYMENT_METHOD_GENERAL = "general"; + + /* + * A transponder in any country, for any transponder system (e.g. EZ-PASS, Peach Pass). + */ + @SuppressWarnings("checkstyle:javadocvariable") + public static final String PAYMENT_METHOD_ETC = "etc"; + + /* + * A transponder only used for several specific roads in Japan. + */ + @SuppressWarnings("checkstyle:javadocvariable") + public static final String PAYMENT_METHOD_ETCX = "etcx"; + + /* + * Payment can be done in cash (coins or notes) of the locally common currency. + */ + @SuppressWarnings("checkstyle:javadocvariable") + public static final String PAYMENT_METHOD_CASH = "cash"; + + /* + * Exact cash payment or tokens at a toll structure. + * Tokens are pre-purchased coins used to pay toll. + */ + @SuppressWarnings("checkstyle:javadocvariable") + public static final String PAYMENT_METHOD_EXACT_CASH = "exact_cash"; + + /* + * Payment can be done by coins. + */ + @SuppressWarnings("checkstyle:javadocvariable") + public static final String PAYMENT_METHOD_COINS = "coins"; + + /* + * Payment can be done by notes (paper money). + */ + @SuppressWarnings("checkstyle:javadocvariable") + public static final String PAYMENT_METHOD_NOTES = "notes"; + + /* + * Payment can be done with common debit cards. + */ + @SuppressWarnings("checkstyle:javadocvariable") + public static final String PAYMENT_METHOD_DEBIT_CARDS = "debit_cards"; + + /* + * A pre-purchased pass or subscription. + */ + @SuppressWarnings("checkstyle:javadocvariable") + public static final String PAYMENT_METHOD_PASS_CARD = "pass_card"; + + /* + * Payment can be done with common credit cards. + */ + @SuppressWarnings("checkstyle:javadocvariable") + public static final String PAYMENT_METHOD_CREDIT_CARDS = "credit_cards"; + + /* + * Automatic monitor of vehicles that enter the toll road without a transponder. + */ + @SuppressWarnings("checkstyle:javadocvariable") + public static final String PAYMENT_METHOD_VIDEO = "video"; + + /* + * Generic tag for any cryptocurrency. + */ + @SuppressWarnings("checkstyle:javadocvariable") + public static final String PAYMENT_METHOD_CRYPTOCURRENCIES = "cryptocurrencies"; + + /* + * Payment possible via phone or other personal device's app + * (e.g. Bluetooth, barcode, CR code, etc.). + */ + @SuppressWarnings("checkstyle:javadocvariable") + public static final String PAYMENT_METHOD_APP = "app"; + private DirectionsCriteria() { //not called } @@ -481,4 +561,27 @@ private DirectionsCriteria() { }) public @interface TrafficTendencyCriteria { } + + /* + * Supported payment methods. See {@link RouteOptions#paymentMethods()}. + */ + @SuppressWarnings("checkstyle:javadoctype") + @Retention(RetentionPolicy.CLASS) + @StringDef({ + PAYMENT_METHOD_GENERAL, + PAYMENT_METHOD_ETC, + PAYMENT_METHOD_ETCX, + PAYMENT_METHOD_CASH, + PAYMENT_METHOD_EXACT_CASH, + PAYMENT_METHOD_COINS, + PAYMENT_METHOD_NOTES, + PAYMENT_METHOD_DEBIT_CARDS, + PAYMENT_METHOD_PASS_CARD, + PAYMENT_METHOD_CREDIT_CARDS, + PAYMENT_METHOD_VIDEO, + PAYMENT_METHOD_CRYPTOCURRENCIES, + PAYMENT_METHOD_APP, + }) + public @interface PaymentMethodsCriteria { + } } diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/IntersectionLanes.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/IntersectionLanes.java index 5ef6f3361..c6b25d192 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/IntersectionLanes.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/IntersectionLanes.java @@ -1,7 +1,6 @@ package com.mapbox.api.directions.v5.models; import androidx.annotation.Nullable; - import com.google.auto.value.AutoValue; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -81,6 +80,16 @@ public static Builder builder() { @Nullable public abstract List indications(); + /* + * Available payment methods for the lane. + * @return A list of strings where each value + * matches {@link DirectionsCriteria.PaymentMethodsCriteria} + */ + @SuppressWarnings("checkstyle:javadocmethod") + @Nullable + @SerializedName("payment_methods") + public abstract List paymentMethods(); + /** * Convert the current {@link IntersectionLanes} to its builder holding the currently assigned * values. This allows you to modify a single property and then rebuild the object resulting in @@ -167,6 +176,14 @@ public abstract static class Builder extends DirectionsJsonObject.Builder indications); + /* + * Set available payment methods for the lane. + * @param paymentMethods is a list of strings where each value + * matches {@link DirectionsCriteria.PaymentMethodsCriteria} + */ + @SuppressWarnings("checkstyle:javadocmethod") + public abstract Builder paymentMethods(@Nullable List paymentMethods); + /** * Build a new {@link IntersectionLanes} object. * diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/RouteOptions.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/RouteOptions.java index a8b558c8c..7bd142749 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/RouteOptions.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/RouteOptions.java @@ -909,6 +909,29 @@ public List snappingIncludeStaticClosuresList() { @Nullable public abstract Boolean metadata(); + /* + * Enables filtering the route and valid lanes by payment methods. Default is no filtering. + * Available payment methods match {@link DirectionsCriteria.PaymentMethodsCriteria} + * @return a comma separated string where each value + * matches {@link DirectionsCriteria.PaymentMethodsCriteria} + */ + @SuppressWarnings("checkstyle:javadocmethod") + @SerializedName("payment_methods") + @Nullable + public abstract String paymentMethods(); + + /* + * Enables filtering the route and valid lanes by payment methods. Default is no filtering. + * Available payment methods match {@link DirectionsCriteria.PaymentMethodsCriteria} + * @return a list of strings where each value + * matches {@link DirectionsCriteria.PaymentMethodsCriteria} + */ + @SuppressWarnings("checkstyle:javadocmethod") + @Nullable + public List paymentMethodsList() { + return ParseUtils.parseToStrings(paymentMethods(), ","); + } + /** * Gson type adapter for parsing Gson to this class. * @@ -1045,6 +1068,7 @@ public URL toUrl(@NonNull String accessToken) { appendQueryParameter(sb, "compute_toll_cost", computeTollCost()); appendQueryParameter(sb, "waypoints_per_route", waypointsPerRoute()); appendQueryParameter(sb, "metadata", metadata()); + appendQueryParameter(sb, "payment_methods", paymentMethods()); Map unrecognized = unrecognized(); if (unrecognized != null) { @@ -2090,6 +2114,31 @@ public Builder unrecognizedProperties(@Nullable Map unrecognized return unrecognized(null); } + /* + * Enables filtering the route and valid lanes by payment methods. Default is no filtering. + * Available payment methods match {@link DirectionsCriteria.PaymentMethodsCriteria} + * @param paymentMethods is a comma separated string where each value + * matches {@link DirectionsCriteria.PaymentMethodsCriteria} + * @return this builder + */ + @SuppressWarnings("checkstyle:javadocmethod") + @NonNull + public abstract Builder paymentMethods(@Nullable String paymentMethods); + + /* + * Enables filtering the route and valid lanes by payment methods. Default is no filtering. + * Available payment methods match {@link DirectionsCriteria.PaymentMethodsCriteria} + * @param paymentMethods is a list of strings where each value + * matches {@link DirectionsCriteria.PaymentMethodsCriteria} + * @return this builder + */ + @SuppressWarnings("checkstyle:javadocmethod") + @NonNull + public Builder paymentMethodsList(@Nullable List paymentMethods) { + String result = FormatUtils.join(",", paymentMethods); + return paymentMethods(result); + } + /** * Builds the object. * diff --git a/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/IntersectionLanesTest.java b/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/IntersectionLanesTest.java index 96135dc7b..dbdf8be61 100644 --- a/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/IntersectionLanesTest.java +++ b/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/IntersectionLanesTest.java @@ -3,12 +3,14 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import com.mapbox.api.directions.v5.DirectionsCriteria; import com.mapbox.core.TestUtils; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.List; public class IntersectionLanesTest extends TestUtils { @@ -71,4 +73,19 @@ public void testFromJson_validIndication() { assertEquals(intersectionLanes, intersectionLanesFromJson); } + + @Test + public void testFromJson_etcAndGeneralPayment() { + IntersectionLanes intersectionLanes = IntersectionLanes.builder() + .paymentMethods(Arrays.asList( + DirectionsCriteria.PAYMENT_METHOD_GENERAL, + DirectionsCriteria.PAYMENT_METHOD_ETC + )) + .build(); + + String jsonString = "{\"payment_methods\": [\"general\", \"etc\"]}"; + IntersectionLanes intersectionLanesFromJson = IntersectionLanes.fromJson(jsonString); + + assertEquals(intersectionLanes, intersectionLanesFromJson); + } } diff --git a/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/RouteOptionsTest.java b/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/RouteOptionsTest.java index 00048560a..317705d4b 100644 --- a/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/RouteOptionsTest.java +++ b/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/RouteOptionsTest.java @@ -24,6 +24,7 @@ import static com.google.gson.JsonParser.parseString; import static com.mapbox.api.directions.v5.utils.Asserts.assertContains; import static com.mapbox.api.directions.v5.utils.Asserts.assertContainsExactCount; +import static com.mapbox.api.directions.v5.utils.Asserts.assertDoesNotContain; import static com.mapbox.api.directions.v5.utils.Asserts.assertNoDuplicatedParameters; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -37,7 +38,7 @@ public class RouteOptionsTest extends TestUtils { */ private static final String ROUTE_OPTIONS_JSON = "route_options_v5.json"; private static final String ROUTE_OPTIONS_URL = - "https://api.mapbox.com/directions/v5/mapbox/driving/-122.4003312,37.7736941;-122.4187529,37.7689715;-122.4255172,37.7775835?access_token=pk.token&geometries=polyline6&alternatives=false&overview=full&radiuses=%3Bunlimited%3B5.1&steps=true&avoid_maneuver_radius=200.0&bearings=0%2C90%3B90%2C0%3B&layers=-42%3B%3B0&continue_straight=false&annotations=congestion%2Cdistance%2Cduration&language=ru&roundabout_exits=false&voice_instructions=true&banner_instructions=true&voice_units=metric&exclude=toll%2Cferry%2Cpoint%2811.0+-22.0%29&include=hot%2Chov2&approaches=%3Bcurb%3B&waypoints=0%3B1%3B2&waypoint_names=%3BSerangoon+Garden+Market+%26+Food+Centre%3BFunky+%26nAmE*&waypoint_targets=%3B12.2%2C21.2%3B&enable_refresh=true&walking_speed=5.11&walkway_bias=-0.2&alley_bias=0.75&snapping_include_closures=%3Bfalse%3Btrue&snapping_include_static_closures=true%3B%3Bfalse&arrive_by=2021-01-01%27T%2701%3A01&depart_at=2021-02-02%27T%2702%3A02&max_height=1.5&max_width=1.4&max_weight=2.9&compute_toll_cost=true&waypoints_per_route=true&metadata=true"; + "https://api.mapbox.com/directions/v5/mapbox/driving/-122.4003312,37.7736941;-122.4187529,37.7689715;-122.4255172,37.7775835?access_token=pk.token&geometries=polyline6&alternatives=false&overview=full&radiuses=%3Bunlimited%3B5.1&steps=true&avoid_maneuver_radius=200.0&bearings=0%2C90%3B90%2C0%3B&layers=-42%3B%3B0&continue_straight=false&annotations=congestion%2Cdistance%2Cduration&language=ru&roundabout_exits=false&voice_instructions=true&banner_instructions=true&voice_units=metric&exclude=toll%2Cferry%2Cpoint%2811.0+-22.0%29&include=hot%2Chov2&approaches=%3Bcurb%3B&waypoints=0%3B1%3B2&waypoint_names=%3BSerangoon+Garden+Market+%26+Food+Centre%3BFunky+%26nAmE*&waypoint_targets=%3B12.2%2C21.2%3B&enable_refresh=true&walking_speed=5.11&walkway_bias=-0.2&alley_bias=0.75&snapping_include_closures=%3Bfalse%3Btrue&snapping_include_static_closures=true%3B%3Bfalse&arrive_by=2021-01-01%27T%2701%3A01&depart_at=2021-02-02%27T%2702%3A02&max_height=1.5&max_width=1.4&max_weight=2.9&compute_toll_cost=true&waypoints_per_route=true&metadata=true&payment_methods=general"; private static final String ACCESS_TOKEN = "pk.token"; private final String optionsJson = loadJsonFixture(ROUTE_OPTIONS_JSON); @@ -1011,6 +1012,45 @@ public void emptyExcludeObjectsCleansUpExcludes() { assertNull(routeOptions.exclude()); } + @Test + public void etcPaymentMethod() { + RouteOptions routeOptions = routeOptions().toBuilder() + .paymentMethodsList(Arrays.asList(DirectionsCriteria.PAYMENT_METHOD_ETC)) + .build(); + String query = routeOptions.toUrl("test").getQuery(); + + assertEquals("etc", routeOptions.paymentMethods()); + assertContains(query, "payment_methods=etc"); + } + + @Test + public void generalAndEtcPaymentsMethod() { + List paymentMethods = Arrays.asList( + DirectionsCriteria.PAYMENT_METHOD_ETC, + DirectionsCriteria.PAYMENT_METHOD_GENERAL + ); + RouteOptions routeOptions = routeOptions().toBuilder() + .paymentMethodsList(paymentMethods) + .build(); + String query = routeOptions.toUrl("test").getQuery(); + + assertEquals("etc,general", routeOptions.paymentMethods()); + assertEquals(paymentMethods, routeOptions.paymentMethodsList()); + assertContains(query, "payment_methods=etc%2Cgeneral"); + } + + @Test + public void emptyPaymentMethodsList() { + RouteOptions routeOptions = routeOptions().toBuilder() + .paymentMethodsList(Collections.emptyList()) + .build(); + String query = routeOptions.toUrl("test").getQuery(); + + assertNull(routeOptions.paymentMethods()); + assertNull(routeOptions.paymentMethodsList()); + assertDoesNotContain(query, "payment_methods"); + } + /** * Fills up all the options using string variants. Values need ot be equal to the ones in {@link #optionsJson}. */ @@ -1061,6 +1101,7 @@ private RouteOptions routeOptions() { .metadata(true) .computeTollCost(true) .waypointsPerRoute(true) + .paymentMethods(DirectionsCriteria.PAYMENT_METHOD_GENERAL) .build(); } @@ -1168,6 +1209,7 @@ private RouteOptions routeOptionsList() { .metadata(true) .computeTollCost(true) .waypointsPerRoute(true) + .paymentMethodsList(Arrays.asList(DirectionsCriteria.PAYMENT_METHOD_GENERAL)) .build(); } } diff --git a/services-directions-models/src/test/resources/route_options_v5.json b/services-directions-models/src/test/resources/route_options_v5.json index 0d5d64560..41b1a8dfc 100644 --- a/services-directions-models/src/test/resources/route_options_v5.json +++ b/services-directions-models/src/test/resources/route_options_v5.json @@ -37,5 +37,6 @@ "enable_refresh": true, "metadata": true, "waypoints_per_route": true, - "compute_toll_cost": true + "compute_toll_cost": true, + "payment_methods": "general" } \ No newline at end of file diff --git a/services-directions/src/main/java/com/mapbox/api/directions/v5/DirectionsService.java b/services-directions/src/main/java/com/mapbox/api/directions/v5/DirectionsService.java index aed5fb4d0..f2d7ca882 100644 --- a/services-directions/src/main/java/com/mapbox/api/directions/v5/DirectionsService.java +++ b/services-directions/src/main/java/com/mapbox/api/directions/v5/DirectionsService.java @@ -102,7 +102,8 @@ Call getCall( @Query("max_weight") Double maxWeight, @Query("compute_toll_cost") Boolean computeTollCost, @Query("waypoints_per_route") Boolean waypointsPerRoute, - @Query("metadata") Boolean metadata + @Query("metadata") Boolean metadata, + @Query("payment_methods") String paymentMethods ); /** @@ -191,6 +192,7 @@ Call postCall( @Field("max_weight") Double maxWeight, @Field("compute_toll_cost") Boolean computeTollCost, @Field("waypoints_per_route") Boolean waypointsPerRoute, - @Field("metadata") Boolean metadata + @Field("metadata") Boolean metadata, + @Field("payment_methods") String paymentMethods ); } diff --git a/services-directions/src/main/java/com/mapbox/api/directions/v5/MapboxDirections.java b/services-directions/src/main/java/com/mapbox/api/directions/v5/MapboxDirections.java index af10df6a0..781b66744 100644 --- a/services-directions/src/main/java/com/mapbox/api/directions/v5/MapboxDirections.java +++ b/services-directions/src/main/java/com/mapbox/api/directions/v5/MapboxDirections.java @@ -111,7 +111,8 @@ private Call get() { routeOptions().maxWeight(), routeOptions().computeTollCost(), routeOptions().waypointsPerRoute(), - routeOptions().metadata() + routeOptions().metadata(), + routeOptions().paymentMethods() ); } @@ -156,7 +157,8 @@ private Call post() { routeOptions().maxWeight(), routeOptions().computeTollCost(), routeOptions().waypointsPerRoute(), - routeOptions().metadata() + routeOptions().metadata(), + routeOptions().paymentMethods() ); } diff --git a/services-directions/src/test/java/com/mapbox/api/directions/v5/MapboxDirectionsTest.java b/services-directions/src/test/java/com/mapbox/api/directions/v5/MapboxDirectionsTest.java index 5f2e3ee68..9e735f8b7 100644 --- a/services-directions/src/test/java/com/mapbox/api/directions/v5/MapboxDirectionsTest.java +++ b/services-directions/src/test/java/com/mapbox/api/directions/v5/MapboxDirectionsTest.java @@ -809,6 +809,17 @@ public void enable_refresh() throws Exception { mapboxDirections.cloneCall().request().url().queryParameter("enable_refresh")); } + @Test + public void paymentMethods() { + MapboxDirections mapboxDirections = MapboxDirections.builder() + .accessToken("token") + .routeOptions(routeOptions.toBuilder().baseUrl(mockUrl.toString()).build()) + .build(); + + assertEquals("general,etcx", + mapboxDirections.cloneCall().request().url().queryParameter("payment_methods")); + } + @Test(expected = Exception.class) public void token_required() throws Exception { MapboxDirections.builder() diff --git a/services-directions/src/test/resources/route_options_v5.json b/services-directions/src/test/resources/route_options_v5.json index 9cd554e75..54f5eeb7f 100644 --- a/services-directions/src/test/resources/route_options_v5.json +++ b/services-directions/src/test/resources/route_options_v5.json @@ -37,5 +37,6 @@ "enable_refresh": true, "compute_toll_cost": true, "waypoints_per_route": true, - "metadata": true + "metadata": true, + "payment_methods": "general,etcx" } \ No newline at end of file