diff --git a/CHANGELOG.md b/CHANGELOG.md index 11810124c..abf32ef84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Mapbox welcomes participation and contributions from everyone. ### main +- Added roundtrip of unrecognized JSON properties [#1394](https://github.com/mapbox/mapbox-java/pull/1394) ### v6.4.1 - April 22, 2022 - Added correct escaping for `&` pattern in query parameters for `RouteOptions#toUrl`. [#1410](https://github.com/mapbox/mapbox-java/pull/1410). diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index a4c8b03dd..571b3d126 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -2,7 +2,7 @@ ext { version = [ autoValue : '1.7', - autoValueGson : '0.8.0', + autoValueGson : '0.0.1', junit : '4.12', annotation : '1.0.0', gson : '2.8.6', @@ -31,7 +31,8 @@ ext { dependenciesList = [ autoValue : "com.google.auto.value:auto-value:${version.autoValue}", - autoValueGson : "com.ryanharter.auto.value:auto-value-gson:${version.autoValueGson}", + autoValueGson : "com.mapbox.mapboxsdk:auto-value-gson:${version.autoValueGson}", + autoValueGsonRuntime: "com.mapbox.mapboxsdk:auto-value-gson-runtime:${version.autoValueGson}", junit : "junit:junit:${version.junit}", supportAnnotation : "androidx.annotation:annotation:${version.annotation}", gson : "com.google.code.gson:gson:${version.gson}", diff --git a/services-directions-models/build.gradle b/services-directions-models/build.gradle index e3c64262a..682695cbe 100644 --- a/services-directions-models/build.gradle +++ b/services-directions-models/build.gradle @@ -9,6 +9,7 @@ dependencies { // AutoValue compileOnly dependenciesList.autoValue compileOnly dependenciesList.autoValueGson + implementation dependenciesList.autoValueGsonRuntime annotationProcessor(dependenciesList.autoValueGson) // Test Dependencies diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/DirectionsAdapterFactory.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/DirectionsAdapterFactory.java index 56ec5a2f4..738cf4ceb 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/DirectionsAdapterFactory.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/DirectionsAdapterFactory.java @@ -1,7 +1,7 @@ package com.mapbox.api.directions.v5; import com.google.gson.TypeAdapterFactory; -import com.ryanharter.auto.value.gson.GsonTypeAdapterFactory; +import com.mapbox.auto.value.gson.GsonTypeAdapterFactory; /** * Required so that AutoValue can generate specific type adapters when needed inside the direction diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Admin.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Admin.java index 1e14769b6..df02882bc 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Admin.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Admin.java @@ -75,7 +75,7 @@ public static Admin fromJson(String json) { * This builder can be used to set the values describing the {@link Admin}. */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * The 2 character ISO 3166-1 alpha-2 code that applies to a country boundary. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/BannerComponents.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/BannerComponents.java index 89568f08a..dd8b648f0 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/BannerComponents.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/BannerComponents.java @@ -345,7 +345,7 @@ public int compareTo(BannerComponents bannerComponents) { * @since 3.0.0 */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * A snippet of the full {@link BannerText#text()} which can be used for visually altering parts diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/BannerInstructions.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/BannerInstructions.java index d9511c38b..c6e5a671b 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/BannerInstructions.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/BannerInstructions.java @@ -124,7 +124,7 @@ public static BannerInstructions fromJson(String json) { * @since 3.0.0 */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Distance in meters from the beginning of the step at which the visual instruction should be diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/BannerText.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/BannerText.java index 83d1a6800..7c9feeea7 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/BannerText.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/BannerText.java @@ -138,7 +138,7 @@ public static BannerText fromJson(String json) { * @since 3.0.0 */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Plain text with all the {@link BannerComponents} text combined. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/BannerView.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/BannerView.java index 2426083ec..5ebbbc5dc 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/BannerView.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/BannerView.java @@ -115,7 +115,7 @@ public static BannerView fromJson(String json) { * @since 5.0.0 */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Plain text with all the {@link BannerComponents} text combined. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Bearing.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Bearing.java index b8783402f..1db968040 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Bearing.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Bearing.java @@ -8,7 +8,7 @@ * and a {@link #degrees()} which is the range of degrees by which the angle can deviate. */ @AutoValue -public abstract class Bearing { +public abstract class Bearing extends DirectionsJsonObject { /** * Build a new instance of this builder. @@ -54,7 +54,7 @@ public static Bearing.Builder builder() { * This builder can be used to set the values describing the {@link Bearing}. */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Clockwise value from true north between 0 and 360. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Closure.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Closure.java index 83d5cc0ea..80ea2e06f 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Closure.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Closure.java @@ -74,7 +74,7 @@ public static Closure fromJson(String json) { * This builder can be used to set the values describing the {@link Closure}. */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Closure's geometry index start point. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Congestion.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Congestion.java index e853cd711..6de66134d 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Congestion.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Congestion.java @@ -62,7 +62,7 @@ public static Congestion fromJson(String json) { * This builder can be used to set the values describing the {@link Congestion}. */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Quantitative descriptor of congestion. 0 to 100. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsError.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsError.java index 948ec1f67..0287befce 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsError.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsError.java @@ -14,7 +14,7 @@ * @since 3.0.0 */ @AutoValue -public abstract class DirectionsError implements Serializable { +public abstract class DirectionsError extends DirectionsJsonObject implements Serializable { /** * Create a new instance of this class by using the {@link Builder} class. @@ -82,7 +82,7 @@ public static TypeAdapter typeAdapter(Gson gson) { * @since 3.0.0 */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * String indicating the state of the response. This is a separate code than the HTTP status diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsJsonObject.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsJsonObject.java index 75d4cf754..158e17c2c 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsJsonObject.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsJsonObject.java @@ -1,18 +1,23 @@ package com.mapbox.api.directions.v5.models; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.google.gson.GsonBuilder; import com.mapbox.api.directions.v5.DirectionsAdapterFactory; import com.mapbox.geojson.Point; import com.mapbox.geojson.PointAsCoordinatesTypeAdapter; +import com.mapbox.auto.value.gson.SerializableJsonElement; +import com.mapbox.auto.value.gson.UnrecognizedJsonProperties; import java.io.Serializable; +import java.util.Map; /** * Provides a base class for Directions model classes. * * @since 3.4.0 */ -public class DirectionsJsonObject implements Serializable { +public abstract class DirectionsJsonObject implements Serializable { /** * This takes the currently defined values found inside this instance and converts it to a json @@ -27,4 +32,13 @@ public String toJson() { gson.registerTypeAdapter(Point.class, new PointAsCoordinatesTypeAdapter()); return gson.create().toJson(this); } + + @Nullable + @UnrecognizedJsonProperties + abstract Map unrecognized(); + + abstract static class Builder { + @NonNull + abstract T unrecognized(Map value); + } } diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsResponse.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsResponse.java index 7fd4325d8..3350be797 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsResponse.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsResponse.java @@ -236,7 +236,7 @@ public DirectionsResponse updateWithRequestData(@NonNull RouteOptions routeOptio * @since 3.0.0 */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * String indicating the state of the response. This is a separate code than the HTTP status diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsRoute.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsRoute.java index 33e8105cc..a5aabeb4f 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsRoute.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsRoute.java @@ -214,7 +214,7 @@ public static DirectionsRoute fromJson( * @since 3.0.0 */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * The distance traveled from origin to destination. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsWaypoint.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsWaypoint.java index d5b278388..3bbc0d11a 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsWaypoint.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsWaypoint.java @@ -111,7 +111,7 @@ public static DirectionsWaypoint fromJson(String json) { * @since 3.0.0 */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Provides the way name which the waypoint's coordinate is snapped to. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Exclude.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Exclude.java index e9809778f..3f5cea443 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Exclude.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Exclude.java @@ -23,7 +23,7 @@ * consider using raw {@link RouteOptions#exclude()} directly. */ @AutoValue -public abstract class Exclude { +public abstract class Exclude extends DirectionsJsonObject { /** * Build a new instance of {@link Exclude}. Nothing is excluded by default. @@ -66,7 +66,7 @@ public static Builder builder() { * Use this builder to build an {@link Exclude} object. */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Exclude certain road types from routing. The default is to not exclude anything from the diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ExperimentalWaypointMetadata.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ExperimentalWaypointMetadata.java index d07492faf..2269c1112 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ExperimentalWaypointMetadata.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ExperimentalWaypointMetadata.java @@ -118,7 +118,7 @@ public static ExperimentalWaypointMetadata fromJson(String json) { * This builder can be used to set the values describing the {@link ExperimentalWaypointMetadata}. */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Object representing experimental value. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Incident.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Incident.java index cb88033a6..f0685a67a 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Incident.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Incident.java @@ -324,7 +324,7 @@ public static Incident fromJson(String json) { * This builder can be used to set the values describing the {@link Incident}. */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Unique identifier for incident. It might be the only one non-null filed which meant 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 054c02a13..5ef6f3361 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 @@ -123,7 +123,7 @@ public static IntersectionLanes fromJson(String json) { * @since 3.0.0 */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Provide a boolean value you can use to determine if the given lane is valid for the user to diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/LegAnnotation.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/LegAnnotation.java index 24c81d8fe..b1c198105 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/LegAnnotation.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/LegAnnotation.java @@ -144,7 +144,7 @@ public static LegAnnotation fromJson(String json) { * @since 3.0.0 */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * The distance, in meters, between each pair of coordinates. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/LegStep.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/LegStep.java index 7bd36a5c5..4059abacc 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/LegStep.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/LegStep.java @@ -298,7 +298,7 @@ public static LegStep fromJson(String json) { * @since 3.0.0 */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * The distance traveled from the maneuver to the next {@link LegStep}. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/MapboxShield.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/MapboxShield.java index b207bbe7c..9ab603ae7 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/MapboxShield.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/MapboxShield.java @@ -98,7 +98,7 @@ public static MapboxShield fromJson(String json) { * @since 3.0.0 */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Base url to query the styles endpoint. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/MapboxStreetsV8.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/MapboxStreetsV8.java index 486eff522..c5764f3ac 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/MapboxStreetsV8.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/MapboxStreetsV8.java @@ -76,7 +76,7 @@ public static MapboxStreetsV8 fromJson(String json) { * This builder can be used to set the values describing the {@link MapboxStreetsV8}. */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Class of the road exiting the intersection. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/MaxSpeed.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/MaxSpeed.java index 7c01bc6ea..c934c6cf2 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/MaxSpeed.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/MaxSpeed.java @@ -106,7 +106,7 @@ public static MaxSpeed fromJson(String json) { * @since 3.0.0 */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Number indicating the posted speed limit. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Metadata.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Metadata.java index 66f69f474..4fc4af6db 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Metadata.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/Metadata.java @@ -72,7 +72,7 @@ public static Metadata fromJson(String json) { * This builder can be used to set the values describing the {@link Metadata}. */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Map indicating the key/value pairs. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/RestStop.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/RestStop.java index 3e1643cf5..364fb0539 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/RestStop.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/RestStop.java @@ -69,7 +69,7 @@ public static RestStop fromJson(String json) { * This builder can be used to set the values describing the {@link RestStop}. */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * The type of rest stop, either `rest_area` (includes parking only) or `service_area` diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/RouteLeg.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/RouteLeg.java index f7d34850b..ac3eadd81 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/RouteLeg.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/RouteLeg.java @@ -167,7 +167,7 @@ public static RouteLeg fromJson(String json) { * @since 3.0.0 */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * A list of silent waypoints which were used to request a route. 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 6dc8576f3..0e80da5f0 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 @@ -33,6 +33,7 @@ public abstract class RouteOptions extends DirectionsJsonObject { private static final String UTF_8 = "UTF-8"; + private static final String ACCESS_TOKEN_URL_PARAM_NAME = "access_token"; /** * Build a new instance of {@link RouteOptions} and sets default values for: @@ -889,6 +890,9 @@ public static RouteOptions fromUrl(@NonNull URL url) { int idx = query.indexOf("="); String property = URLDecoder.decode(query.substring(0, idx), UTF_8); String value = URLDecoder.decode(query.substring(idx + 1), UTF_8); + if (property.equals(ACCESS_TOKEN_URL_PARAM_NAME)) { + continue; + } boolean isExperimental = false; for (int i = 0; i < Experimental.experimentalParameters.length; i++) { @@ -937,7 +941,7 @@ public URL toUrl(@NonNull String accessToken) { .append(String.format("/%s", user())) .append(String.format("/%s", profile())) .append(String.format("/%s", coordinates())) - .append(String.format("?access_token=%s", accessToken)) + .append(String.format("?%s=%s", ACCESS_TOKEN_URL_PARAM_NAME, accessToken)) .append(String.format("&geometries=%s", geometries())); if (alternatives() != null) { @@ -1134,7 +1138,7 @@ private static RouteOptions fromJsonString(@NonNull String json) { * This builder can be used to set the values describing the {@link RouteOptions}. */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Base URL for the request. @@ -2191,7 +2195,7 @@ public static Experimental fromJson(String json) { * This builder can be used to set the values describing the {@link Experimental}. */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Object representing experimental value. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ShieldSprite.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ShieldSprite.java index f8b986cd2..b9e77b2b6 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ShieldSprite.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ShieldSprite.java @@ -12,7 +12,7 @@ * ShieldSprite. */ @AutoValue -public abstract class ShieldSprite implements Serializable { +public abstract class ShieldSprite extends DirectionsJsonObject implements Serializable { /** * Create a new instance of this class by using the {@link ShieldSprite.Builder} class. @@ -59,7 +59,7 @@ public static TypeAdapter typeAdapter(Gson gson) { * This builder can be used to set the values describing the {@link ShieldSprite}. */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Shield sprite's name. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ShieldSpriteAttribute.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ShieldSpriteAttribute.java index 280f72e0f..8c761ba68 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ShieldSpriteAttribute.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ShieldSpriteAttribute.java @@ -16,7 +16,7 @@ * ShieldSpriteAttribute. */ @AutoValue -public abstract class ShieldSpriteAttribute implements Serializable { +public abstract class ShieldSpriteAttribute extends DirectionsJsonObject implements Serializable { /** * Create a new instance of this class by using the {@link ShieldSpriteAttribute.Builder} class. @@ -120,7 +120,7 @@ public static TypeAdapter typeAdapter(Gson gson) { * This builder can be used to set the values describing the {@link ShieldSpriteAttribute}. */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Shield sprite's width. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ShieldSprites.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ShieldSprites.java index 90a3240f9..a3d10412a 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ShieldSprites.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ShieldSprites.java @@ -20,7 +20,7 @@ * ShieldSprites. */ @AutoValue -public abstract class ShieldSprites implements Serializable { +public abstract class ShieldSprites extends DirectionsJsonObject implements Serializable { /** * Create a new instance of this class by using the {@link ShieldSprites.Builder} class. @@ -107,7 +107,7 @@ public static TypeAdapter typeAdapter(Gson gson) { * This builder can be used to set the values describing the {@link ShieldSprites}. */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * List of {@link ShieldSprite}. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ShieldSvg.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ShieldSvg.java index 92b1a5de2..086272ab0 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ShieldSvg.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/ShieldSvg.java @@ -14,7 +14,7 @@ * ShieldSvg. */ @AutoValue -public abstract class ShieldSvg implements Serializable { +public abstract class ShieldSvg extends DirectionsJsonObject implements Serializable { /** * Create a new instance of this class by using the {@link ShieldSvg.Builder} class. @@ -82,7 +82,7 @@ public static TypeAdapter typeAdapter(Gson gson) { * This builder can be used to set the values describing the {@link ShieldSvg}. */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * SVG. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/SilentWaypoint.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/SilentWaypoint.java index 8ca01594e..1cf09dcd7 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/SilentWaypoint.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/SilentWaypoint.java @@ -62,7 +62,7 @@ public static TypeAdapter typeAdapter(Gson gson) { * This builder can be used to set the values describing the {@link SilentWaypoint}. */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * @param waypointIndex the associated waypoint index, excluding diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/StepIntersection.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/StepIntersection.java index 02db6e33d..3ffa75679 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/StepIntersection.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/StepIntersection.java @@ -256,7 +256,7 @@ public static StepIntersection fromJson(String json) { * @since 3.0.0 */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * An integer array of bearing values available at the step intersection. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/StepManeuver.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/StepManeuver.java index 80b372c02..15e9aa3d1 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/StepManeuver.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/StepManeuver.java @@ -324,7 +324,7 @@ public static StepManeuver fromJson(String json) { * @since 3.0.0 */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * The rawLocation as a double array. Once the {@link StepManeuver} object's created, this raw diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/TollCollection.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/TollCollection.java index c318ff3b1..9a0e8a176 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/TollCollection.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/TollCollection.java @@ -72,7 +72,7 @@ public static TollCollection fromJson(String json) { * This builder can be used to set the values describing the {@link TollCollection}. */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * The type of toll collection point, either `toll_booth` or `toll_gantry`. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/VoiceInstructions.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/VoiceInstructions.java index 724c1760c..15553c786 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/VoiceInstructions.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/VoiceInstructions.java @@ -101,7 +101,7 @@ public static VoiceInstructions fromJson(String json) { * @since 3.0.0 */ @AutoValue.Builder - public abstract static class Builder { + public abstract static class Builder extends DirectionsJsonObject.Builder { /** * Returns the missing piece in which is needed to announce instructions at accurate diff --git a/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/DirectionsResponseTest.java b/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/DirectionsResponseTest.java index 3e1b583f3..867005a6a 100644 --- a/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/DirectionsResponseTest.java +++ b/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/DirectionsResponseTest.java @@ -1,23 +1,31 @@ package com.mapbox.api.directions.v5.models; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; import com.mapbox.api.directions.v5.DirectionsCriteria; import com.mapbox.core.TestUtils; import com.mapbox.geojson.Point; import java.io.IOException; -import java.util.Arrays; import java.util.List; -import org.junit.Assert; + import org.junit.Test; import java.util.ArrayList; +import java.util.Map; +import static com.mapbox.api.directions.v5.utils.MutateJsonUtil.mutateJson; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; public class DirectionsResponseTest extends TestUtils { private static final String DIRECTIONS_V5_PRECISION6_FIXTURE = "directions_v5_precision_6.json"; + private static final String DIRECTIONS_V5_PRECISION6_FIXTURE_ARTIFICIAL_FIELDS = "directions_v5_precision_6_with_artificial_fields.json"; private static final String DIRECTIONS_V5_MULTIPLE_ROUTES = "directions_v5_multiple_routes.json"; private static final String DIRECTIONS_V5_MULTIPLE_ROUTES_WITH_OPTIONS = "directions_v5_multiple_routes_with_options.json"; @@ -41,15 +49,27 @@ public void fromJson_correctlyBuildsFromJson() throws Exception { } @Test - public void testToFromJson() throws Exception { - String json = loadJsonFixture(DIRECTIONS_V5_PRECISION6_FIXTURE); - DirectionsResponse responseFromJson1 = DirectionsResponse.fromJson(json); + public void testToFromJsonWithRealResponse() throws Exception { + Gson gson = new GsonBuilder().create(); + String originalJson = loadJsonFixture(DIRECTIONS_V5_PRECISION6_FIXTURE_ARTIFICIAL_FIELDS); + JsonObject originalJsonObject = gson.fromJson(originalJson, JsonObject.class); + + DirectionsResponse model = DirectionsResponse.fromJson(originalJson); + JsonObject jsonFromObject = gson.fromJson(model.toJson(), JsonObject.class); + + assertEquals(originalJsonObject, jsonFromObject); + } + + @Test + public void testToFromJsonWithMutatedResponse() throws Exception { + Gson gson = new GsonBuilder().create(); + JsonObject mutatedJson = gson.fromJson(loadJsonFixture(DIRECTIONS_V5_PRECISION6_FIXTURE_ARTIFICIAL_FIELDS), JsonObject.class); + mutateJson(mutatedJson); - String jsonString = responseFromJson1.toJson(); - DirectionsResponse responseFromJson2 = DirectionsResponse.fromJson(jsonString); + DirectionsResponse responseFromJson1 = DirectionsResponse.fromJson(mutatedJson.toString()); + JsonObject jsonFromObject = gson.fromJson(responseFromJson1.toJson(), JsonObject.class); - Assert.assertEquals(responseFromJson1, responseFromJson2); - Assert.assertEquals(responseFromJson2, responseFromJson1); + assertEquals(mutatedJson, jsonFromObject); } @Test diff --git a/services-directions-models/src/test/java/com/mapbox/api/directions/v5/utils/MutateJsonUtil.java b/services-directions-models/src/test/java/com/mapbox/api/directions/v5/utils/MutateJsonUtil.java new file mode 100644 index 000000000..b648255a8 --- /dev/null +++ b/services-directions-models/src/test/java/com/mapbox/api/directions/v5/utils/MutateJsonUtil.java @@ -0,0 +1,61 @@ +package com.mapbox.api.directions.v5.utils; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import org.junit.Test; + +import java.util.Map; + +import static org.junit.Assert.assertEquals; + +public class MutateJsonUtil { + + /*** + * Adds a set of artificial fields of different types to every json object inside the passed json. + * See an example in {@link MutateJsonTest#mutateJson} + */ + public static void mutateJson(JsonElement jsonToMutate) { + if (jsonToMutate.isJsonPrimitive() || jsonToMutate.isJsonNull()) { + } else if (jsonToMutate.isJsonArray()) { + JsonArray array = (JsonArray) jsonToMutate; + for (JsonElement item : array) { + mutateJson(item); + } + } else if (jsonToMutate.isJsonObject()) { + JsonObject object = (JsonObject) jsonToMutate; + for (Map.Entry field : object.entrySet()) { + mutateJson(field.getValue()); + } + addPrimitiveValues(object); + JsonObject testJsonObject = new JsonObject(); + addPrimitiveValues(testJsonObject); + object.add("testingObject", testJsonObject); + } + } + + private static void addPrimitiveValues(JsonObject object) { + object.add("testingStringValue", new JsonPrimitive("test")); + object.add("testingBooleanValue", new JsonPrimitive(true)); + object.add("testingNumberValue", new JsonPrimitive(5)); + } + + public static class MutateJsonTest { + @Test public void mutateJson() { + String sourceJson = "{'a':'a','b':{},'c':{'c':{}}}"; + Gson gson = new GsonBuilder().create(); + + JsonObject jsonToMutate = gson.fromJson(sourceJson, JsonObject.class); + MutateJsonUtil.mutateJson(jsonToMutate); + + String mutatedJson = gson.toJson(jsonToMutate); + assertEquals( + "{\"a\":\"a\",\"b\":{\"testingStringValue\":\"test\",\"testingBooleanValue\":true,\"testingNumberValue\":5,\"testingObject\":{\"testingStringValue\":\"test\",\"testingBooleanValue\":true,\"testingNumberValue\":5}},\"c\":{\"c\":{\"testingStringValue\":\"test\",\"testingBooleanValue\":true,\"testingNumberValue\":5,\"testingObject\":{\"testingStringValue\":\"test\",\"testingBooleanValue\":true,\"testingNumberValue\":5}},\"testingStringValue\":\"test\",\"testingBooleanValue\":true,\"testingNumberValue\":5,\"testingObject\":{\"testingStringValue\":\"test\",\"testingBooleanValue\":true,\"testingNumberValue\":5}},\"testingStringValue\":\"test\",\"testingBooleanValue\":true,\"testingNumberValue\":5,\"testingObject\":{\"testingStringValue\":\"test\",\"testingBooleanValue\":true,\"testingNumberValue\":5}}", + mutatedJson + ); + } + } +} diff --git a/services-directions-models/src/test/resources/directions_v5_precision_6_with_artificial_fields.json b/services-directions-models/src/test/resources/directions_v5_precision_6_with_artificial_fields.json new file mode 100644 index 000000000..87a17945a --- /dev/null +++ b/services-directions-models/src/test/resources/directions_v5_precision_6_with_artificial_fields.json @@ -0,0 +1 @@ +{"routes":[{"requestUuid":"cjhk3ov9e1voc3vp58hcgit34","routeIndex":"0","geometry":"awbagAzavnhFp`@~fGr~Ya|BhcBwcYbr\\u{C`tZ~{H~vrBsge@bdo@`kc@dqpAckUbmn@sphAjnDovu@zviDgasDpa^ixsBbmy@{ubBvou@ajy@|}\\y~q@dycAcotGj{v@cdr@lyUwpC","legs":[{"summary":"Bayshore Freeway, Bayshore Freeway","weight":4008.7,"duration":3722.6,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[261],"location":[-122.416686,37.783425]},{"out":2,"in":0,"entry":[false,false,true,true],"bearings":[75,165,255,345],"location":[-122.417548,37.783315]},{"out":2,"in":0,"entry":[false,true,true,true],"bearings":[75,165,255,345],"location":[-122.419192,37.783106]}],"driving_side":"right","geometry":"awbagAzavnhFzEzt@|@hNbJlvA`Dbg@xA~T`@dGnBtZ","mode":"driving","maneuver":{"bearing_after":261,"bearing_before":0,"location":[-122.416686,37.783425],"modifier":"left","type":"depart","instruction":"Head west on Eddy Street"},"weight":236,"duration":211.60000000000002,"name":"Eddy Street","distance":362.7},{"intersections":[{"out":2,"in":0,"entry":[false,false,true,true],"bearings":[75,165,255,345],"location":[-122.42076,37.782907]},{"out":1,"in":0,"entry":[false,true,true,false],"bearings":[75,165,255,345],"location":[-122.42091,37.782888]},{"out":1,"in":3,"entry":[false,true,true,false],"bearings":[75,165,255,345],"location":[-122.420722,37.781954]},{"out":1,"in":3,"entry":[false,true,false,false],"bearings":[75,165,255,345],"location":[-122.420534,37.781023]},{"out":1,"in":3,"entry":[false,true,true,false],"bearings":[90,165,255,345],"location":[-122.420342,37.780077]},{"out":1,"in":3,"entry":[false,true,true,false],"bearings":[75,165,255,345],"location":[-122.419972,37.778242]},{"out":1,"in":3,"entry":[false,true,true,false],"bearings":[75,165,255,345],"location":[-122.419782,37.777295]},{"out":1,"in":3,"entry":[false,true,true,false],"bearings":[75,165,255,345],"location":[-122.419594,37.776367]},{"out":0,"in":2,"entry":[true,true,false],"bearings":[165,255,345],"location":[-122.419398,37.775431]},{"out":1,"in":3,"entry":[false,true,true,false],"bearings":[45,165,225,345],"location":[-122.41935,37.775193]},{"out":1,"in":3,"entry":[false,true,false,false],"bearings":[45,165,225,345],"location":[-122.419314,37.775061]},{"out":0,"in":2,"entry":[true,true,false],"bearings":[165,210,345],"location":[-122.418875,37.773667]},{"out":1,"in":4,"entry":[false,true,true,false,false],"bearings":[45,165,225,315,345],"location":[-122.418702,37.773081]},{"out":1,"in":3,"entry":[false,true,false,false],"bearings":[30,165,210,345],"location":[-122.418631,37.772842]},{"out":0,"in":2,"entry":[true,false,false],"bearings":[165,270,345],"location":[-122.418498,37.772399]},{"out":1,"in":2,"entry":[true,true,false],"bearings":[75,165,345],"location":[-122.41845,37.772238]},{"out":1,"in":2,"entry":[false,true,false],"bearings":[120,165,345],"location":[-122.418146,37.771238]},{"out":1,"in":2,"entry":[true,true,false],"bearings":[135,165,345],"location":[-122.418096,37.771089]},{"out":0,"in":2,"entry":[true,true,false],"bearings":[165,270,345],"location":[-122.418033,37.770901]},{"out":1,"in":0,"entry":[false,true,true,false],"bearings":[0,195,210,270],"location":[-122.417742,37.770207]},{"out":2,"in":0,"entry":[false,false,true,false],"bearings":[15,105,195,285],"location":[-122.417803,37.769889]},{"out":2,"in":0,"entry":[false,true,true,false],"bearings":[15,105,180,285],"location":[-122.417834,37.769712]}],"driving_side":"right","geometry":"uvaagAn`~nhFd@jHfEg@xUsCjW{C|C_@pC]v[yDtR_CdD_@zC_@f]cEfQuBvDe@tH}@tn@sHl[wD`R{BxH}@vDe@lt@uIjb@eFxN}AxEs@n\\}D~ZcE^ExH_A`D_@vBa@zAUr@OvEc@fHuAbFiA~~@iTrc@yI|MmCtZiG`I_Bn}@_RhHcBlEcAhDy@lKiDjEgCnDyCtCgBdBk@pBGjDVfAHzRxB`J|@dIf@vO`B","mode":"driving","maneuver":{"bearing_after":260,"bearing_before":260,"location":[-122.42076,37.782907],"modifier":"left","type":"turn","instruction":"Turn left onto Van Ness Avenue (US 101 South)"},"ref":"US 101 South","weight":480.9,"duration":308.29999999999995,"name":"Van Ness Avenue (US 101 South)","distance":1559.1},{"distance":379.8,"name":"US 101 South","ref":"US 101 South","maneuver":{"bearing_after":201,"bearing_before":187,"location":[-122.417903,37.769281],"modifier":"straight","type":"off ramp","instruction":"Take the ramp towards US 101 South: Oakland"},"destinations":"US 101 South, I-80 East: Oakland, San Jose","weight":49,"mode":"driving","geometry":"acg`gA|mxnhFfGdCnCpBbC`ChB|CjAlDt@vEN`FSpEu@fEiAlDcBpCyB`CeCzAkCx@kC^iC?gCe@aCy@wBsAcB_BgBaCqA{Cy@qD_@}DKqDDmETuErA}Ox@cJf@gHdAoPr@yMh@aMcBuM","intersections":[{"classes":["motorway"],"out":2,"in":0,"entry":[false,true,true,false],"bearings":[0,180,195,345],"location":[-122.417903,37.769281]},{"classes":["motorway"],"out":0,"in":1,"entry":[true,false],"bearings":[15,180],"location":[-122.419,37.769346]}],"duration":42.2,"driving_side":"right"},{"intersections":[{"classes":["motorway"],"out":0,"in":1,"entry":[true,false,false],"bearings":[90,255,285],"location":[-122.416662,37.769596]},{"classes":["motorway"],"out":1,"in":2,"entry":[true,true,false],"bearings":[102,108,282],"location":[-122.40981,37.769161]},{"classes":["motorway"],"out":0,"in":1,"entry":[true,false,false],"bearings":[174,353,358],"location":[-122.405473,37.767261]},{"classes":["motorway"],"out":1,"in":2,"entry":[false,true,false],"bearings":[0,180,345],"location":[-122.405244,37.766048]},{"classes":["motorway"],"out":1,"in":0,"entry":[false,true,true],"bearings":[0,180,195],"location":[-122.402999,37.752554]},{"classes":["motorway"],"out":2,"in":1,"entry":[false,false,true],"bearings":[0,15,195],"location":[-122.404558,37.746941]},{"classes":["motorway"],"out":1,"in":0,"entry":[false,true,true],"bearings":[7,180,187],"location":[-122.408143,37.739469]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[155,332,335],"location":[-122.406401,37.734438]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[150,180,330],"location":[-122.405674,37.733191]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[165,330,345],"location":[-122.403995,37.730114]},{"classes":["motorway"],"out":0,"in":1,"entry":[true,false,false],"bearings":[163,341,346],"location":[-122.402483,37.726603]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[163,168,343],"location":[-122.401701,37.724557]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[165,180,345],"location":[-122.400278,37.720955]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[150,315,330],"location":[-122.397974,37.714805]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[165,180,345],"location":[-122.39554,37.710237]},{"classes":["motorway"],"out":0,"in":1,"entry":[true,false],"bearings":[165,345],"location":[-122.395121,37.708328]},{"classes":["motorway"],"out":0,"in":1,"entry":[true,false,false],"bearings":[170,347,350],"location":[-122.393825,37.702429]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[165,180,345],"location":[-122.391826,37.693636]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[170,345,350],"location":[-122.3906,37.688244]},{"classes":["motorway"],"out":1,"in":0,"entry":[false,true,true],"bearings":[30,210,225],"location":[-122.392891,37.669787]},{"classes":["motorway"],"out":1,"in":0,"entry":[false,true,true],"bearings":[30,210,225],"location":[-122.395051,37.667539]},{"classes":["motorway"],"out":2,"in":1,"entry":[false,false,true],"bearings":[46,50,231],"location":[-122.39982,37.663398]},{"classes":["motorway"],"out":2,"in":1,"entry":[false,false,true],"bearings":[30,45,210],"location":[-122.403926,37.660623]},{"classes":["motorway"],"out":1,"in":0,"entry":[false,true,true],"bearings":[15,195,210],"location":[-122.405731,37.65805]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[176,181,356],"location":[-122.406979,37.651445]},{"classes":["motorway"],"out":1,"in":0,"entry":[false,true,false],"bearings":[0,180,345],"location":[-122.406419,37.64457]},{"classes":["motorway"],"out":1,"in":0,"entry":[false,true,true],"bearings":[0,165,195],"location":[-122.406082,37.641332]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[150,165,345],"location":[-122.405024,37.63824]},{"classes":["motorway"],"out":1,"in":2,"entry":[false,true,false],"bearings":[0,180,345],"location":[-122.402719,37.630324]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[166,341,345],"location":[-122.401464,37.62492]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[162,342,345],"location":[-122.398689,37.616736]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[135,300,315],"location":[-122.394473,37.611514]},{"classes":["motorway"],"out":0,"in":1,"entry":[true,false,false],"bearings":[128,308,309],"location":[-122.391675,37.609715]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[129,134,309],"location":[-122.384799,37.605291]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[135,300,315],"location":[-122.378646,37.601292]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[135,300,315],"location":[-122.376557,37.599922]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[130,136,309],"location":[-122.364079,37.591793]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[105,285,300],"location":[-122.357438,37.587965]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[135,150,315],"location":[-122.325833,37.581641]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[139,314,319],"location":[-122.322934,37.578971]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[135,150,315],"location":[-122.316743,37.573261]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[139,316,319],"location":[-122.310821,37.567812]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[135,150,315],"location":[-122.302578,37.560185]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[150,315,330],"location":[-122.293655,37.550567]},{"classes":["motorway"],"out":0,"in":1,"entry":[true,false,false],"bearings":[150,315,330],"location":[-122.293005,37.549875]},{"classes":["motorway"],"out":0,"in":1,"entry":[true,false,false],"bearings":[150,315,330],"location":[-122.292169,37.548986]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[144,149,324],"location":[-122.291949,37.548743]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[150,315,330],"location":[-122.286169,37.542512]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[150,315,330],"location":[-122.283856,37.53998]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[135,150,315],"location":[-122.273979,37.529546]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[138,313,318],"location":[-122.262626,37.51954]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[138,141,318],"location":[-122.260906,37.518025]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[138,314,318],"location":[-122.247718,37.506343]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[138,315,318],"location":[-122.242977,37.502159]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[137,142,317],"location":[-122.239937,37.499488]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[110,284,290],"location":[-122.231907,37.495907]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[110,283,290],"location":[-122.228972,37.495072]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[120,135,300],"location":[-122.218915,37.491223]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[105,270,285],"location":[-122.205884,37.487457]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[107,110,285],"location":[-122.185632,37.484733]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[120,285,300],"location":[-122.179679,37.482856]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[126,302,307],"location":[-122.177095,37.481497]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[120,135,300],"location":[-122.155045,37.468654]},{"classes":["motorway"],"out":0,"in":1,"entry":[true,false,false],"bearings":[126,305,307],"location":[-122.152581,37.467179]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[120,135,300],"location":[-122.144516,37.462442]},{"classes":["motorway"],"out":0,"in":1,"entry":[true,false,false],"bearings":[126,304,306],"location":[-122.136462,37.457738]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[131,141,308],"location":[-122.12693,37.452112]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[140,317,320],"location":[-122.118132,37.444081]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[135,150,315],"location":[-122.103307,37.429953]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[135,150,315],"location":[-122.101751,37.428459]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[135,300,315],"location":[-122.092643,37.42097]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[135,150,315],"location":[-122.09244,37.420823]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[133,309,312],"location":[-122.089184,37.418478]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[120,285,300],"location":[-122.081848,37.413404]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[120,135,300],"location":[-122.081263,37.413111]},{"classes":["motorway"],"lanes":[{"valid":false,"indications":["left"]},{"valid":true,"indications":["straight"]},{"valid":true,"indications":["straight"]},{"valid":true,"indications":["straight"]},{"valid":true,"indications":["straight"]},{"valid":true,"indications":["right"]}],"out":1,"in":2,"entry":[true,true,false],"bearings":[105,120,300],"location":[-122.078361,37.411892]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[118,124,297],"location":[-122.076323,37.411054]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[105,270,285],"location":[-122.067607,37.407809]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[105,110,286],"location":[-122.067189,37.407713]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[105,270,285],"location":[-122.063708,37.406961]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[105,120,285],"location":[-122.056615,37.405407]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[105,270,285],"location":[-122.047017,37.403049]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[105,120,285],"location":[-122.036066,37.400658]},{"classes":["motorway"],"out":0,"in":3,"entry":[true,true,false,false],"bearings":[105,120,270,285],"location":[-122.03242,37.39989]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[105,279,286],"location":[-122.027075,37.398693]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[105,280,285],"location":[-122.024811,37.398202]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[105,111,285],"location":[-122.017288,37.396552]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[105,270,285],"location":[-122.012976,37.395607]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[105,120,285],"location":[-122.012709,37.395542]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[107,280,285],"location":[-122.008838,37.394702]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[105,120,285],"location":[-122.000135,37.392318]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[111,284,291],"location":[-121.994151,37.390522]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[110,282,290],"location":[-121.991164,37.389654]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[105,120,285],"location":[-121.983628,37.387548]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[110,287,290],"location":[-121.974838,37.385032]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[105,270,285],"location":[-121.972437,37.384341]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[105,120,285],"location":[-121.969543,37.383509]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[110,284,290],"location":[-121.957291,37.380021]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[105,120,285],"location":[-121.945834,37.377446]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[105,270,285],"location":[-121.941787,37.376663]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[105,120,285],"location":[-121.941403,37.376591]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[105,270,285],"location":[-121.939052,37.376128]}],"driving_side":"right","geometry":"wvg`gAj`vnhFb@sMZeMd@cX^mX`Da~DHoIJaJNsIRqIZgI^}I`@uHj@mIt@iJ|@uJdGwq@pJ_l@xAgKnAsKjAyLn@gJj@eKb@eLj@iL`AeLtA_LnBmK|BaJrB}G|BsGtCmHxAcD|AcDlBsDdBwCbCuDrCaEfD}D|DuDrEaDrFmCzCgAnD_A~GkAvBS|c@_DzLuA~WsEzqA}FvJ]`IAtKF`K\\dKv@vJhAvJ|A`KzBbJjCnJdDzIxD|InEvIlE~\\|QhHlDhInDnHjCbIzBdI`B`IjA~Hr@dIZpIBjIWrIq@dJqA`JgBfJqCfIcDzImEzH{EhIiGdImHbHyHdHeJpG_JfGoJtN_UfF{H`GmIlF{GxFmG|FkF~F_FvGqE`HyDtIyDjIsCjIwB~IaBfJiAdK{@dKm@vJc@pbCqK~Ni@rO]rNKdN\\lOp@pNnAzOjBvLnBnL~B`nAzWlcBp^~nAbX|_Bl]rNdDrOrEbN`FlMbG~MhH`MdIfMdJz_Apu@xFhEbFvD|MxInN`IfN`HnN|FhPjFvMlDfQlDfOjCjPnBlPtApUrA`OXlOGrOWrOm@tO}@hMyAbOwBtOqCnOkDnNuDrMgE`MqEzMqFlOiHvJiEdWgM|w@{_@pYwNjr@u\\tm@w\\zQ{IfRuIxVsKrQoHhTqIl^aNhK{DvYcKxVqIzVgHl`Ag[xHaCvdAg]|hAk[|t@oSzb@eMfYyId{Age@n^{Jhf@yLdP_E`QwDnz@sOdk@wJtKoBdvAgWxMgChNgD~NeE`N}EbUaJjOyH|MkH`NyIzNmKdUoP~p@ui@jFoDxEaDxLkHbMaHvLuG|L{FfL{E~NiFhMwDtNoDdNsCzMsB~UkDd^iF`l@_Iva@qFv_@cFvEo@||@mLrcBwSbmEym@pdP}{B~oIskAddKowA|i@oIpv@sLvXkE`XkDrUeCvVeBxPc@~RO`RNjSb@xSrApS~BtRxC|P|CzQrEzTzGzSlHrP|FfR~GbQxGjRvHfQjHnChAbd@lTvSpKrMbHnMfHhMvH`MxH|LdIjMvIjLhI|LbJlL|IzLlJdLfJpLzJ`L|JpNtMnkC~eCzr@zp@b`@z^vKfKnKjK`KrKpKpLtLzMlJfLvJbM`K`NvI~L~IrMxIhNpIrN|IhOfItNtIrO|oBdoDjI~NxJzOnJhNhKnNnMvOpLfMhMrLxNvL|LhJpMlIrL~G`NdH`NfGlNzFl\\bNjlArf@|NzFxNfFhOnErOxDlO|CnPrC`NdBlOzAdNbAdOx@jN\\zNRfPAfO[`Pi@taAyDlXcAjqAeFrRu@fw@{CrSy@xyFmR`vCsLhr@mFjKaA`YuDr\\_G~YiGxRkFrVoHdYsJp[qLdyAco@hWmJhSaHjT}G~QkFzPiE~RmEvSaE~RaDdTwCpSaCdTiBx]{Bty@uEnwAqKftAsHvXuBbZeD`\\uEdU{DfWqFtaAgUbl@yNhKw@fZiG`wDy~@hqAa[~gDyw@`h@qLxF{ApUiGfXwIhZwLxXmMhZmPdWmP~XyS|VkT~SoQ`VwVnSyU|SeXne@}o@loB{mDpzAiqC~[uh@fp@qgAtiBehDhuB{uDrbCuhErtAqaCpn@mgAteAwiB~u@_sAlxEslI~o@mlA~Vkd@jk@gcA~{Bg~DbRy\\xP_\\dQa^vOo_@zMk_@jM{`@bLeb@`T_gAzHsk@~Fcj@`De_@jCkc@bB}f@r@ef@Rme@tAyqB~FgmHnDcrElDmwEjEi_Fl@yr@nB}e@tBoXxEe`@nG}^fJs_@pLy^tN{\\`OyXpPiVxPwSrk@io@~wCseDzeDetDfhDqvDrzDkjEpcAwiA~nGkfHngE_xEjlEm|Ef`@ac@|Zg]rHmI|TiUfVoT`YkVlxAwlAh^_[vn@sk@ht@_q@j^y[|a@k`@lt@ms@jZcYj\\eZpbCeyBfj@sg@pv@gs@dNwLhlDy~Cb_Au|@rh@ae@jmBudBl`@_^bNaMnN_M|x@is@fc@e`@vcCsyBrcFurEhR{PpwBqnBxTaSfTiSdW}V`UqUdSaTdT}UdSuUtl@qr@|sDwmE|oDqgEhcBspBjBwB~FaHbmBg{Bva@gf@|z@gcA|pAm{AbYw\\pc@kh@x|AciBha@me@~dBirBpjByxB~y@q`Ax{DmtE~iA}sAtlAawAxkBizBfqAc{Azn@yu@xc@aj@tPmS~O}SlO{TbOoVnMcVpM{WpCsGzBiFzEcLbM_]hJoXfIyXfIi[xGyZjGkZ`p@glDds@mvDzPq}@vGa^lHq_@~FyXbGgX~F{V|Jq`@lH}XzIw[~IsZhJgZjJiYjKk[`eBsdFvp@anBzJiZtJiZdJwZzI{ZdE{ObCgJjD{MzCmL`I_\\fGmXtGiZhHm^fEqTbGo\\pF}[lF_]|Ey\\nEy\\bEg]|Dc]hDc]`Dq]vCo]bLieBzuBa_]xB{]fCw_@`Cm]jCk]|Cy]hDc]tD_]xDi]jEy\\vEe]fEsZnFq\\rFm\\~Fo\\nGa\\tG_\\zG{[jH{[vHw[`Ia[fIwZ~I}ZlJsZ~JcZpKqYfLoYpLwXjMqXlMwWvCgDptEesJfq@}uAxxBkpEpzFijLpj@}gA|xBkpEbuAqrC`EmExiEm{If|AszCxhBuuDh~CmnGz[gp@htH{mOfGkMjPg[tOgYhSg\\dK{OfPqUpPyTbQ_TpQkS`iEksE|cByhB|}AybBbz@w|@l_EsiEhIwI`yD_bEvkHszHnG}Gx|B{bCpf@mh@xt@yv@rxBa_CjXqY~WwYlVcYzUiYtWw\\lVy\\|Zqd@h[gf@jpCafEdHuKdvAqxBjz@}pAt}B}lDhcBaiClJcObIuMjI}NlNaWzMaXjMkXnLgXzK}XlDsIjRqk@zk@akB|Jw[js@k~Bvg@gaBx_BulFxFcSxFySxFcTzEgStEoSxE{UfDqQrDySbDiSlDmV~DcYrLm~@j`@cyCfx@qcGzf@wuDxHgi@pImj@tJcj@fc@e`CnMev@~Hwg@lHwh@xGkf@hc@ycDpsBwuOhNkdApPioA~n@{bF~_As`HxHmk@t]olCbfBeuM`z@olG`CuOns@}pFhUuyAzo@iqDxlA}qGd`@arBd]}`Bzo@_`DjIga@xR{bA`WqsAdNos@nTgjAf[acBtaAerFhlBg~J|n@ceDdj@auC~r@{sDfMqp@jD_SbjAufGvkAskGnm@{bDv`@cvBpUswAvb@odDpb@amDh`@wgD|o@}{FnC_W|[}qCvj@o{ExKa}@fGyf@vGce@pL_x@tHag@","mode":"driving","maneuver":{"bearing_after":94,"bearing_before":73,"location":[-122.416662,37.769596],"modifier":"slight left","type":"merge","instruction":"Merge left onto US 101 South"},"ref":"US 101 South","weight":2830.2000000000003,"duration":2819.2000000000007,"name":"Central Freeway (US 101 South)","distance":70046.4},{"distance":4798.2,"name":"","maneuver":{"bearing_after":112,"bearing_before":106,"location":[-121.931731,37.374579],"modifier":"slight right","type":"off ramp","instruction":"Take exit 390 towards CA 87 South: Guadalupe Parkway"},"destinations":"CA 87 South: Guadalupe Parkway","exits":"390","intersections":[{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[105,120,285],"location":[-121.931731,37.374579]},{"classes":["motorway"],"lanes":[{"valid":true,"indications":["straight"]},{"valid":true,"indications":["straight"]}],"out":0,"in":2,"entry":[true,false,false],"bearings":[150,300,330],"location":[-121.926597,37.37012]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[128,138,308],"location":[-121.923722,37.367884]},{"classes":["motorway"],"out":1,"in":3,"entry":[false,true,true,false],"bearings":[0,150,180,330],"location":[-121.918933,37.364245]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[150,315,330],"location":[-121.915678,37.359877]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,true,false],"bearings":[135,150,330],"location":[-121.908322,37.349121]},{"classes":["motorway"],"out":0,"in":2,"entry":[true,false,false],"bearings":[150,330,345],"location":[-121.901664,37.343143]}],"duration":192.39999999999998,"driving_side":"right","weight":206.7,"mode":"driving","geometry":"efdhfAd|bqgF|Rwy@dFyVxRu_AbLy^|GgNjGcLhSeWtLmLvLaIjFoCdFoBfIkCfHkBvo@aPnXoI~NqEfS{I~G_D|NgJrJ{HtGoGfK_L|IqKzLmQbDiGhKqQ|Vie@`X{g@dkAw{B~NcXhPoWlRmXfSeW|UcXpTcTtYmV`FsDhA{@zQ_NnWmQhbFcgDhoCqkBnbAiq@htAq~@lf@{Zzp@y`@ne@_Ujo@uYpfB}v@hMcGhMeH`P}JhOiKj`@m\\ra@}f@~JuOzI_OtJwQhJcSpIwTzSsh@nT_g@hPkZ~PuVxNmRrNwPfO}NjO{MnKcI~JaHtIaFxKuGdRcJ~^aOrh@aSj]oOlSmKxIcF~pA}v@"},{"distance":508.9,"name":"","maneuver":{"bearing_after":171,"bearing_before":150,"location":[-121.900192,37.340845],"modifier":"slight right","type":"off ramp","instruction":"Take exit 6B towards Julian Street"},"destinations":"Julian Street, Saint James Street","exits":"6B","intersections":[{"classes":["motorway"],"out":1,"in":2,"entry":[true,true,false],"bearings":[150,165,330],"location":[-121.900192,37.340845]}],"duration":44.8,"driving_side":"right","weight":57,"mode":"driving","geometry":"yibffA~heogF|Hu@lp@ca@zLsGvr@g[hF{B|GaB|HcAxKKlIp@lOzC|Dh@hKtAzFh@`FDvHy@bG{AjKaEfFuBvEiB"},{"intersections":[{"lanes":[{"valid":true,"indications":["left"]},{"valid":true,"indications":["straight","left"]},{"valid":false,"indications":["right"]}],"out":1,"in":3,"entry":[false,true,true,false],"bearings":[60,150,240,345],"location":[-121.898785,37.336552]},{"lanes":[{"valid":false,"indications":["left"]},{"valid":true,"indications":["straight","left"]},{"valid":false,"indications":["right"]}],"out":1,"in":3,"entry":[true,true,false,false],"bearings":[60,165,240,330],"location":[-121.898691,37.336402]}],"driving_side":"right","geometry":"o}yefA`qbogFjH{DtEkBrTePj^}W|D}E","mode":"driving","maneuver":{"bearing_after":153,"bearing_before":158,"location":[-121.898785,37.336552],"modifier":"straight","type":"new name","instruction":"Continue onto North Almaden Boulevard"},"weight":75.1,"pronunciation":"ˈnoɹθ ˈɔlmədən ˈbʊləvɑɹd","duration":43.5,"name":"North Almaden Boulevard","distance":157.5},{"intersections":[{"out":1,"in":2,"entry":[true,true,false],"bearings":[105,240,315],"location":[-121.897852,37.335352]}],"driving_side":"right","geometry":"orwefAvv`ogFhCrF`Qtc@vDzJtFlOv@`CdJrWlCvItShi@pBfF","mode":"driving","maneuver":{"bearing_after":236,"bearing_before":136,"location":[-121.897852,37.335352],"modifier":"right","type":"turn","instruction":"Turn right onto West Saint John Street"},"weight":58.6,"duration":45.4,"name":"West Saint John Street","distance":267.1},{"intersections":[{"out":1,"in":0,"entry":[false,true,true,true],"bearings":[60,165,240,315],"location":[-121.900438,37.334113]}],"driving_side":"right","geometry":"aeuefAjxeogFpFi@vFeAla@sA","mode":"driving","maneuver":{"bearing_after":171,"bearing_before":237,"location":[-121.900438,37.334113],"modifier":"left","type":"turn","instruction":"Turn left onto North Autumn Street"},"weight":15.2,"duration":15.2,"name":"North Autumn Street","distance":89.1},{"intersections":[{"in":0,"entry":[true],"bearings":[357],"location":[-121.90034,37.333317]}],"driving_side":"right","geometry":"issefAfreogF","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":177,"location":[-121.90034,37.333317],"modifier":"left","type":"arrive","instruction":"You have arrived at your destination, on the left"},"weight":0,"duration":0,"name":"North Autumn Street","distance":0}],"distance":78168.7}],"weight_name":"routability","weight":4008.7,"duration":3722.6,"distance":78168.7}],"waypoints":[{"name":"Eddy Street","location":[-122.416686,37.783425]},{"name":"North Autumn Street","location":[-121.90034,37.333317]}],"code":"Ok","uuid":"cjhk3ov9e1voc3vp58hcgit34"} \ No newline at end of file diff --git a/services-directions-refresh-models/build.gradle b/services-directions-refresh-models/build.gradle index 74f79703f..3e8e0f31f 100644 --- a/services-directions-refresh-models/build.gradle +++ b/services-directions-refresh-models/build.gradle @@ -9,6 +9,7 @@ dependencies { // AutoValue compileOnly dependenciesList.autoValue compileOnly dependenciesList.autoValueGson + implementation dependenciesList.autoValueGsonRuntime annotationProcessor(dependenciesList.autoValueGson) // Test Dependencies diff --git a/services-directions-refresh-models/src/main/java/com/mapbox/api/directionsrefresh/v1/DirectionsRefreshAdapterFactory.java b/services-directions-refresh-models/src/main/java/com/mapbox/api/directionsrefresh/v1/DirectionsRefreshAdapterFactory.java index 114950d8e..93686f863 100644 --- a/services-directions-refresh-models/src/main/java/com/mapbox/api/directionsrefresh/v1/DirectionsRefreshAdapterFactory.java +++ b/services-directions-refresh-models/src/main/java/com/mapbox/api/directionsrefresh/v1/DirectionsRefreshAdapterFactory.java @@ -1,7 +1,7 @@ package com.mapbox.api.directionsrefresh.v1; import com.google.gson.TypeAdapterFactory; -import com.ryanharter.auto.value.gson.GsonTypeAdapterFactory; +import com.mapbox.auto.value.gson.GsonTypeAdapterFactory; /** * Required so that AutoValue can generate specific type adapters when needed inside the direction diff --git a/services-directions-refresh/build.gradle b/services-directions-refresh/build.gradle index c7a006fab..955c130b5 100644 --- a/services-directions-refresh/build.gradle +++ b/services-directions-refresh/build.gradle @@ -11,6 +11,7 @@ dependencies { // AutoValue compileOnly dependenciesList.autoValue compileOnly dependenciesList.autoValueGson + implementation dependenciesList.autoValueGsonRuntime implementation project(":services") // Test Dependencies diff --git a/services-directions/build.gradle b/services-directions/build.gradle index b17724941..a22dc7453 100644 --- a/services-directions/build.gradle +++ b/services-directions/build.gradle @@ -10,6 +10,7 @@ dependencies { // AutoValue compileOnly dependenciesList.autoValue compileOnly dependenciesList.autoValueGson + implementation dependenciesList.autoValueGsonRuntime annotationProcessor(dependenciesList.autoValueGson) // Test Dependencies diff --git a/services-geocoding/build.gradle b/services-geocoding/build.gradle index 69a163016..a4d85d843 100644 --- a/services-geocoding/build.gradle +++ b/services-geocoding/build.gradle @@ -11,6 +11,7 @@ dependencies { // AutoValue compileOnly dependenciesList.autoValue compileOnly dependenciesList.autoValueGson + implementation dependenciesList.autoValueGsonRuntime annotationProcessor(dependenciesList.autoValueGson) // Test Dependencies diff --git a/services-geocoding/src/main/java/com/mapbox/api/geocoding/v5/models/GeocodingAdapterFactory.java b/services-geocoding/src/main/java/com/mapbox/api/geocoding/v5/models/GeocodingAdapterFactory.java index 5be6df493..5a43822e3 100644 --- a/services-geocoding/src/main/java/com/mapbox/api/geocoding/v5/models/GeocodingAdapterFactory.java +++ b/services-geocoding/src/main/java/com/mapbox/api/geocoding/v5/models/GeocodingAdapterFactory.java @@ -1,7 +1,7 @@ package com.mapbox.api.geocoding.v5.models; import com.google.gson.TypeAdapterFactory; -import com.ryanharter.auto.value.gson.GsonTypeAdapterFactory; +import com.mapbox.auto.value.gson.GsonTypeAdapterFactory; /** * A Geocoding type adapter factory for convenience when using AutoValue and handling diff --git a/services-isochrone/build.gradle b/services-isochrone/build.gradle index aca560c45..e06e593a6 100644 --- a/services-isochrone/build.gradle +++ b/services-isochrone/build.gradle @@ -10,6 +10,7 @@ dependencies { // AutoValue compileOnly dependenciesList.autoValue compileOnly dependenciesList.autoValueGson + implementation dependenciesList.autoValueGsonRuntime annotationProcessor(dependenciesList.autoValueGson) // Test Dependencies diff --git a/services-matching/build.gradle b/services-matching/build.gradle index 5f5382927..14c52d6e7 100644 --- a/services-matching/build.gradle +++ b/services-matching/build.gradle @@ -9,6 +9,7 @@ dependencies { // AutoValue compileOnly dependenciesList.autoValue compileOnly dependenciesList.autoValueGson + implementation dependenciesList.autoValueGsonRuntime annotationProcessor(dependenciesList.autoValueGson) // Test Dependencies diff --git a/services-matching/src/main/java/com/mapbox/api/matching/v5/models/MapMatchingAdapterFactory.java b/services-matching/src/main/java/com/mapbox/api/matching/v5/models/MapMatchingAdapterFactory.java index fa2bb4996..935b8a6ac 100644 --- a/services-matching/src/main/java/com/mapbox/api/matching/v5/models/MapMatchingAdapterFactory.java +++ b/services-matching/src/main/java/com/mapbox/api/matching/v5/models/MapMatchingAdapterFactory.java @@ -1,7 +1,7 @@ package com.mapbox.api.matching.v5.models; import com.google.gson.TypeAdapterFactory; -import com.ryanharter.auto.value.gson.GsonTypeAdapterFactory; +import com.mapbox.auto.value.gson.GsonTypeAdapterFactory; /** * A MapMatching type adapter factory for convenience when using AutoValue and handling diff --git a/services-matrix/build.gradle b/services-matrix/build.gradle index 5f5382927..14c52d6e7 100644 --- a/services-matrix/build.gradle +++ b/services-matrix/build.gradle @@ -9,6 +9,7 @@ dependencies { // AutoValue compileOnly dependenciesList.autoValue compileOnly dependenciesList.autoValueGson + implementation dependenciesList.autoValueGsonRuntime annotationProcessor(dependenciesList.autoValueGson) // Test Dependencies diff --git a/services-matrix/src/main/java/com/mapbox/api/matrix/v1/MatrixAdapterFactory.java b/services-matrix/src/main/java/com/mapbox/api/matrix/v1/MatrixAdapterFactory.java index f7cdf65e8..c6af2308e 100644 --- a/services-matrix/src/main/java/com/mapbox/api/matrix/v1/MatrixAdapterFactory.java +++ b/services-matrix/src/main/java/com/mapbox/api/matrix/v1/MatrixAdapterFactory.java @@ -1,7 +1,7 @@ package com.mapbox.api.matrix.v1; import com.google.gson.TypeAdapterFactory; -import com.ryanharter.auto.value.gson.GsonTypeAdapterFactory; +import com.mapbox.auto.value.gson.GsonTypeAdapterFactory; /** * Required so that AutoValue can generate specific type adapters when needed inside the matrix diff --git a/services-optimization/build.gradle b/services-optimization/build.gradle index 5f5382927..14c52d6e7 100644 --- a/services-optimization/build.gradle +++ b/services-optimization/build.gradle @@ -9,6 +9,7 @@ dependencies { // AutoValue compileOnly dependenciesList.autoValue compileOnly dependenciesList.autoValueGson + implementation dependenciesList.autoValueGsonRuntime annotationProcessor(dependenciesList.autoValueGson) // Test Dependencies diff --git a/services-optimization/src/main/java/com/mapbox/api/optimization/v1/models/OptimizationAdapterFactory.java b/services-optimization/src/main/java/com/mapbox/api/optimization/v1/models/OptimizationAdapterFactory.java index c1153800d..c9555cac4 100644 --- a/services-optimization/src/main/java/com/mapbox/api/optimization/v1/models/OptimizationAdapterFactory.java +++ b/services-optimization/src/main/java/com/mapbox/api/optimization/v1/models/OptimizationAdapterFactory.java @@ -1,7 +1,7 @@ package com.mapbox.api.optimization.v1.models; import com.google.gson.TypeAdapterFactory; -import com.ryanharter.auto.value.gson.GsonTypeAdapterFactory; +import com.mapbox.auto.value.gson.GsonTypeAdapterFactory; /** * Required so that AutoValue can generate specific type adapters when needed inside the diff --git a/services-route-tiles/build.gradle b/services-route-tiles/build.gradle index cb5596307..f6fd4edf5 100644 --- a/services-route-tiles/build.gradle +++ b/services-route-tiles/build.gradle @@ -10,6 +10,7 @@ dependencies { // AutoValue compileOnly dependenciesList.autoValue compileOnly dependenciesList.autoValueGson + implementation dependenciesList.autoValueGsonRuntime annotationProcessor(dependenciesList.autoValueGson) // Test Dependencies diff --git a/services-route-tiles/src/main/java/com/mapbox/api/routetiles/v1/versions/models/RouteTileVersionsAdapterFactory.java b/services-route-tiles/src/main/java/com/mapbox/api/routetiles/v1/versions/models/RouteTileVersionsAdapterFactory.java index d6a9d615b..742e9e83b 100644 --- a/services-route-tiles/src/main/java/com/mapbox/api/routetiles/v1/versions/models/RouteTileVersionsAdapterFactory.java +++ b/services-route-tiles/src/main/java/com/mapbox/api/routetiles/v1/versions/models/RouteTileVersionsAdapterFactory.java @@ -1,7 +1,7 @@ package com.mapbox.api.routetiles.v1.versions.models; import com.google.gson.TypeAdapterFactory; -import com.ryanharter.auto.value.gson.GsonTypeAdapterFactory; +import com.mapbox.auto.value.gson.GsonTypeAdapterFactory; /** * Required so that AutoValue can generate specific type adapters when needed inside the direction diff --git a/services-speech/build.gradle b/services-speech/build.gradle index 02a867b22..b0497a429 100644 --- a/services-speech/build.gradle +++ b/services-speech/build.gradle @@ -9,6 +9,7 @@ dependencies { // AutoValue compileOnly dependenciesList.autoValue compileOnly dependenciesList.autoValueGson + implementation dependenciesList.autoValueGsonRuntime annotationProcessor(dependenciesList.autoValueGson) // Test Dependencies diff --git a/services-staticmap/build.gradle b/services-staticmap/build.gradle index bd0110aef..055a97d8b 100644 --- a/services-staticmap/build.gradle +++ b/services-staticmap/build.gradle @@ -10,6 +10,7 @@ dependencies { // AutoValue compileOnly dependenciesList.autoValue compileOnly dependenciesList.autoValueGson + implementation dependenciesList.autoValueGsonRuntime annotationProcessor(dependenciesList.autoValueGson) // Test Dependencies diff --git a/services-tilequery/build.gradle b/services-tilequery/build.gradle index aca560c45..e06e593a6 100644 --- a/services-tilequery/build.gradle +++ b/services-tilequery/build.gradle @@ -10,6 +10,7 @@ dependencies { // AutoValue compileOnly dependenciesList.autoValue compileOnly dependenciesList.autoValueGson + implementation dependenciesList.autoValueGsonRuntime annotationProcessor(dependenciesList.autoValueGson) // Test Dependencies diff --git a/services/build.gradle b/services/build.gradle index 1fba4157c..0ddf6433e 100644 --- a/services/build.gradle +++ b/services/build.gradle @@ -21,6 +21,7 @@ dependencies { // AutoValue compileOnly dependenciesList.autoValue compileOnly dependenciesList.autoValueGson + implementation dependenciesList.autoValueGsonRuntime annotationProcessor(dependenciesList.autoValueGson) }