diff --git a/src/main/java/com/google/maps/FindPlaceFromTextRequest.java b/src/main/java/com/google/maps/FindPlaceFromTextRequest.java index 6f05fb6ed..ec6ffac6f 100644 --- a/src/main/java/com/google/maps/FindPlaceFromTextRequest.java +++ b/src/main/java/com/google/maps/FindPlaceFromTextRequest.java @@ -22,6 +22,7 @@ import com.google.maps.internal.StringJoin; import com.google.maps.internal.StringJoin.UrlValue; import com.google.maps.model.FindPlaceFromText; +import com.google.maps.model.LatLng; import com.google.maps.model.PlacesSearchResult; public class FindPlaceFromTextRequest @@ -53,18 +54,48 @@ public String toUrlValue() { } } + /** + * The text input specifying which place to search for (for example, a name, address, or phone + * number). + * + * @param input The text input. + * @return Returns {@code FindPlaceFromTextRequest} for call chaining. + */ public FindPlaceFromTextRequest input(String input) { return param("input", input); } + /** + * The type of input. + * + * @param inputType The input type. + * @return Returns {@code FindPlaceFromTextRequest} for call chaining. + */ public FindPlaceFromTextRequest inputType(InputType inputType) { return param("inputtype", inputType); } + /** + * The fields specifying the types of place data to return. + * + * @param fields The fields to return. + * @return Returns {@code FindPlaceFromTextRequest} for call chaining. + */ public FindPlaceFromTextRequest fields(FieldMask... fields) { return param("fields", StringJoin.join(',', fields)); } + /** + * Prefer results in a specified area, by specifying either a radius plus lat/lng, or two lat/lng + * pairs representing the points of a rectangle. + * + * @param locationBias The location bias for this request. + * @return Returns {@code FindPlaceFromTextRequest} for call chaining. + */ + public FindPlaceFromTextRequest locationBias(LocationBias locationBias) { + return param("locationbias", locationBias); + } + @Override protected void validateRequest() { if (!params().containsKey("input")) { @@ -127,4 +158,55 @@ public String toUrlValue() { return field; } } + + public interface LocationBias extends UrlValue {} + + public static class LocationBiasIP implements LocationBias { + public String toUrlValue() { + return "ipbias"; + } + } + + public static class LocationBiasPoint implements LocationBias { + private final LatLng point; + + public LocationBiasPoint(LatLng point) { + this.point = point; + } + + @Override + public String toUrlValue() { + return "point:" + point.toUrlValue(); + } + } + + public static class LocationBiasCircular implements LocationBias { + private final LatLng center; + private final int radius; + + public LocationBiasCircular(LatLng center, int radius) { + this.center = center; + this.radius = radius; + } + + @Override + public String toUrlValue() { + return "circle:" + radius + "@" + center.toUrlValue(); + } + } + + public static class LocationBiasRectangular implements LocationBias { + private final LatLng southWest; + private final LatLng northEast; + + public LocationBiasRectangular(LatLng southWest, LatLng northEast) { + this.southWest = southWest; + this.northEast = northEast; + } + + @Override + public String toUrlValue() { + return "rectangle:" + southWest.toUrlValue() + "|" + northEast.toUrlValue(); + } + } } diff --git a/src/test/java/com/google/maps/PlacesApiTest.java b/src/test/java/com/google/maps/PlacesApiTest.java index 757417c9e..01b0861df 100644 --- a/src/test/java/com/google/maps/PlacesApiTest.java +++ b/src/test/java/com/google/maps/PlacesApiTest.java @@ -22,6 +22,10 @@ import static org.junit.Assert.assertTrue; import com.google.maps.FindPlaceFromTextRequest.InputType; +import com.google.maps.FindPlaceFromTextRequest.LocationBiasCircular; +import com.google.maps.FindPlaceFromTextRequest.LocationBiasIP; +import com.google.maps.FindPlaceFromTextRequest.LocationBiasPoint; +import com.google.maps.FindPlaceFromTextRequest.LocationBiasRectangular; import com.google.maps.PlaceAutocompleteRequest.SessionToken; import com.google.maps.model.AddressComponentType; import com.google.maps.model.AutocompletePrediction; @@ -926,11 +930,13 @@ public void testFindPlaceFromText() throws Exception { FindPlaceFromTextRequest.FieldMask.RATING, FindPlaceFromTextRequest.FieldMask.OPENING_HOURS, FindPlaceFromTextRequest.FieldMask.GEOMETRY) + .locationBias(new LocationBiasIP()) .await(); sc.assertParamValue(input, "input"); sc.assertParamValue("textquery", "inputtype"); sc.assertParamValue("photos,formatted_address,name,rating,opening_hours,geometry", "fields"); + sc.assertParamValue("ipbias", "locationbias"); assertNotNull(response); PlacesSearchResult candidate = response.candidates[0]; @@ -950,4 +956,82 @@ public void testFindPlaceFromText() throws Exception { assertEquals(4.4, candidate.rating, 0.01); } } + + @Test + public void testFindPlaceFromTextPoint() throws Exception { + try (LocalTestServerContext sc = + new LocalTestServerContext(findPlaceFromTextMuseumOfContemporaryArt)) { + + String input = "Museum of Contemporary Art Australia"; + + FindPlaceFromText response = + PlacesApi.findPlaceFromText(sc.context, input, InputType.TEXT_QUERY) + .fields( + FindPlaceFromTextRequest.FieldMask.PHOTOS, + FindPlaceFromTextRequest.FieldMask.FORMATTED_ADDRESS, + FindPlaceFromTextRequest.FieldMask.NAME, + FindPlaceFromTextRequest.FieldMask.RATING, + FindPlaceFromTextRequest.FieldMask.OPENING_HOURS, + FindPlaceFromTextRequest.FieldMask.GEOMETRY) + .locationBias(new LocationBiasPoint(new LatLng(1, 2))) + .await(); + + sc.assertParamValue(input, "input"); + sc.assertParamValue("textquery", "inputtype"); + sc.assertParamValue("photos,formatted_address,name,rating,opening_hours,geometry", "fields"); + sc.assertParamValue("point:1.00000000,2.00000000", "locationbias"); + } + } + + @Test + public void testFindPlaceFromTextCircular() throws Exception { + try (LocalTestServerContext sc = + new LocalTestServerContext(findPlaceFromTextMuseumOfContemporaryArt)) { + + String input = "Museum of Contemporary Art Australia"; + + FindPlaceFromText response = + PlacesApi.findPlaceFromText(sc.context, input, InputType.TEXT_QUERY) + .fields( + FindPlaceFromTextRequest.FieldMask.PHOTOS, + FindPlaceFromTextRequest.FieldMask.FORMATTED_ADDRESS, + FindPlaceFromTextRequest.FieldMask.NAME, + FindPlaceFromTextRequest.FieldMask.RATING, + FindPlaceFromTextRequest.FieldMask.OPENING_HOURS, + FindPlaceFromTextRequest.FieldMask.GEOMETRY) + .locationBias(new LocationBiasCircular(new LatLng(1, 2), 3000)) + .await(); + + sc.assertParamValue(input, "input"); + sc.assertParamValue("textquery", "inputtype"); + sc.assertParamValue("photos,formatted_address,name,rating,opening_hours,geometry", "fields"); + sc.assertParamValue("circle:3000@1.00000000,2.00000000", "locationbias"); + } + } + + @Test + public void testFindPlaceFromTextRectangular() throws Exception { + try (LocalTestServerContext sc = + new LocalTestServerContext(findPlaceFromTextMuseumOfContemporaryArt)) { + + String input = "Museum of Contemporary Art Australia"; + + FindPlaceFromText response = + PlacesApi.findPlaceFromText(sc.context, input, InputType.TEXT_QUERY) + .fields( + FindPlaceFromTextRequest.FieldMask.PHOTOS, + FindPlaceFromTextRequest.FieldMask.FORMATTED_ADDRESS, + FindPlaceFromTextRequest.FieldMask.NAME, + FindPlaceFromTextRequest.FieldMask.RATING, + FindPlaceFromTextRequest.FieldMask.OPENING_HOURS, + FindPlaceFromTextRequest.FieldMask.GEOMETRY) + .locationBias(new LocationBiasRectangular(new LatLng(1, 2), new LatLng(3, 4))) + .await(); + + sc.assertParamValue(input, "input"); + sc.assertParamValue("textquery", "inputtype"); + sc.assertParamValue("photos,formatted_address,name,rating,opening_hours,geometry", "fields"); + sc.assertParamValue("rectangle:1.00000000,2.00000000|3.00000000,4.00000000", "locationbias"); + } + } }