From c5466d8d411215596a270a1dc6f741bdfbdb2480 Mon Sep 17 00:00:00 2001 From: Tobrun Date: Thu, 9 May 2019 19:05:41 +0200 Subject: [PATCH] [annotation] - allow to set custom arbitrary data on an annotation --- .../activity/annotation/FillActivity.java | 22 +++++++++++++--- .../annotation_manager_unit_test.junit.ejs | 25 +++++++++++++++++++ .../scripts/annotation_options.java.ejs | 22 ++++++++++++++++ .../plugins/annotation/Annotation.java | 21 ++++++++++++++++ .../plugins/annotation/CircleOptions.java | 22 ++++++++++++++++ .../plugins/annotation/FillOptions.java | 22 ++++++++++++++++ .../plugins/annotation/LineOptions.java | 22 ++++++++++++++++ .../plugins/annotation/SymbolOptions.java | 22 ++++++++++++++++ .../plugins/annotation/CircleManagerTest.java | 10 ++++++++ .../plugins/annotation/FillManagerTest.java | 16 ++++++++++++ .../plugins/annotation/LineManagerTest.java | 13 ++++++++++ .../plugins/annotation/SymbolManagerTest.java | 10 ++++++++ 12 files changed, 224 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/annotation/FillActivity.java b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/annotation/FillActivity.java index 093044102..a36aa0d26 100644 --- a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/annotation/FillActivity.java +++ b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/annotation/FillActivity.java @@ -7,6 +7,10 @@ import android.view.MenuItem; import android.widget.Toast; +import com.google.gson.JsonElement; +import com.google.gson.JsonNull; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; import com.mapbox.geojson.FeatureCollection; import com.mapbox.mapboxsdk.camera.CameraUpdateFactory; import com.mapbox.mapboxsdk.geometry.LatLng; @@ -15,6 +19,7 @@ import com.mapbox.mapboxsdk.plugins.annotation.Fill; import com.mapbox.mapboxsdk.plugins.annotation.FillManager; import com.mapbox.mapboxsdk.plugins.annotation.FillOptions; +import com.mapbox.mapboxsdk.plugins.annotation.OnFillClickListener; import com.mapbox.mapboxsdk.plugins.testapp.R; import com.mapbox.mapboxsdk.plugins.testapp.Utils; import com.mapbox.mapboxsdk.utils.ColorUtils; @@ -47,11 +52,12 @@ protected void onCreate(Bundle savedInstanceState) { fillManager = new FillManager(mapView, mapboxMap, style); fillManager.addClickListener(fill -> Toast.makeText(FillActivity.this, - String.format("Fill clicked %s", fill.getId()), + String.format("Fill clicked %s with title: %s", fill.getId(), getTitleFromFill(fill)), Toast.LENGTH_SHORT ).show()); + fillManager.addLongClickListener(fill -> Toast.makeText(FillActivity.this, - String.format("Fill long clicked %s", fill.getId()), + String.format("Fill long clicked %s with title: %s", fill.getId(), getTitleFromFill(fill)), Toast.LENGTH_SHORT ).show()); @@ -66,12 +72,13 @@ protected void onCreate(Bundle savedInstanceState) { FillOptions fillOptions = new FillOptions() .withLatLngs(latLngs) + .withData(new JsonPrimitive("Foobar")) .withFillColor(ColorUtils.colorToRgbaString(Color.RED)); fillManager.create(fillOptions); // random add fills across the globe List fillOptionsList = new ArrayList<>(); - for (int i = 0; i < 20; i++) { + for (int i = 0; i < 3; i++) { int color = Color.argb(255, random.nextInt(256), random.nextInt(256), random.nextInt(256)); fillOptionsList.add(new FillOptions() .withLatLngs(createRandomLatLngs()) @@ -88,6 +95,15 @@ protected void onCreate(Bundle savedInstanceState) { })); } + private String getTitleFromFill(Fill fill) { + String title = "unknown"; + JsonElement customData = fill.getData(); + if (!(customData.isJsonNull())) { + title = customData.getAsString(); + } + return title; + } + private List> createRandomLatLngs() { List latLngs = new ArrayList<>(); LatLng firstLast = new LatLng((random.nextDouble() * -180.0) + 90.0, diff --git a/plugin-annotation/scripts/annotation_manager_unit_test.junit.ejs b/plugin-annotation/scripts/annotation_manager_unit_test.junit.ejs index b64a03cb3..638289bc4 100644 --- a/plugin-annotation/scripts/annotation_manager_unit_test.junit.ejs +++ b/plugin-annotation/scripts/annotation_manager_unit_test.junit.ejs @@ -7,6 +7,7 @@ package com.mapbox.mapboxsdk.plugins.annotation; +import com.google.gson.JsonPrimitive; import com.mapbox.geojson.*; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.maps.MapView; @@ -526,6 +527,30 @@ public class <%- camelize(type) %>ManagerTest { assertTrue(<%- type %>Manager.getDragListeners().isEmpty()); } + @Test + public void testCustomData() { + <%- type %>Manager = new <%- camelize(type) %>Manager(mapView, mapboxMap, style, coreElementProvider, null, null, draggableAnnotationController); +<% if (type === "circle" || type === "symbol") { -%> + <%- camelize(type) %>Options options = new <%- camelize(type) %>Options().withLatLng(new LatLng()); +<% } else if (type === "line") { -%> + ListlatLngs = new ArrayList<>(); + latLngs.add(new LatLng()); + latLngs.add(new LatLng(1,1)); + <%- camelize(type) %>Options options = new <%- camelize(type) %>Options().withLatLngs(latLngs); +<% } else { -%> + ListinnerLatLngs = new ArrayList<>(); + innerLatLngs.add(new LatLng()); + innerLatLngs.add(new LatLng(1,1)); + innerLatLngs.add(new LatLng(-1,-1)); + List>latLngs = new ArrayList<>(); + latLngs.add(innerLatLngs); + <%- camelize(type) %>Options options = new <%- camelize(type) %>Options().withLatLngs(latLngs); +<% } -%> + options.withData(new JsonPrimitive("hello")); + <%- camelize(type) %> <%- type %> = <%- type %>Manager.create(options); + assertEquals(new JsonPrimitive("hello"), <%- type %>.getData()); + } + @Test public void testClearAll() { <%- type %>Manager = new <%- camelize(type) %>Manager(mapView, mapboxMap, style, coreElementProvider, null, null, draggableAnnotationController); diff --git a/plugin-annotation/scripts/annotation_options.java.ejs b/plugin-annotation/scripts/annotation_options.java.ejs index e431c4ba7..704fd758e 100644 --- a/plugin-annotation/scripts/annotation_options.java.ejs +++ b/plugin-annotation/scripts/annotation_options.java.ejs @@ -31,6 +31,7 @@ import static com.mapbox.mapboxsdk.plugins.annotation.ConvertUtils.toStringArray public class <%- camelize(type) %>Options extends Options<<%- camelize(type) %>> { private boolean isDraggable; + private JsonElement data; private <%- geometryType(type) %> geometry; <% for (const property of properties) { -%> <% if (supportsPropertyFunction(property)) { -%> @@ -279,6 +280,26 @@ public class <%- camelize(type) %>Options extends Options<<%- camelize(type) %>> return this; } + /** + * Set the arbitrary json data of the annotation. + * + * @param jsonElement the arbitrary json element data + */ + public <%- camelize(type) %>Options withData(@Nullable JsonElement jsonElement) { + this.data = jsonElement; + return this; + } + + /** + * Get the arbitrary json data of the annotation. + * + * @return the arbitrary json object data if set, else null + */ + @Nullable + public JsonElement getData() { + return data; + } + @Override <%- camelize(type) %> build(long id, AnnotationManager, ?, ?, ?, ?> annotationManager) { if (geometry == null) { @@ -299,6 +320,7 @@ public class <%- camelize(type) %>Options extends Options<<%- camelize(type) %>> <% } -%> <%- camelize(type) %> <%- type %> = new <%- camelize(type) %>(id, annotationManager, jsonObject, geometry); <%- type %>.setDraggable(isDraggable); + <%- type %>.setData(data); return <%- type %>; } diff --git a/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/Annotation.java b/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/Annotation.java index 25ad494b6..093509286 100644 --- a/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/Annotation.java +++ b/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/Annotation.java @@ -3,6 +3,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.mapbox.android.gestures.MoveDistancesObject; import com.mapbox.geojson.Geometry; @@ -11,6 +12,7 @@ public abstract class Annotation { static final String ID_KEY = "id"; + static final String ID_DATA = "custom_data"; protected JsonObject jsonObject; protected T geometry; private boolean isDraggable; @@ -75,6 +77,25 @@ public void setDraggable(boolean draggable) { isDraggable = draggable; } + /** + * Set the arbitrary json data of the annotation. + * + * @param jsonElement the arbitrary json object data + */ + public void setData(@Nullable JsonElement jsonElement) { + this.jsonObject.add(ID_DATA, jsonElement); + } + + /** + * Get the arbitrary json object data of the annotation. + * + * @return the arbitrary json object data if set, else null + */ + @Nullable + public JsonElement getData() { + return jsonObject.get(ID_DATA); + } + @Nullable abstract Geometry getOffsetGeometry(@NonNull Projection projection, @NonNull MoveDistancesObject moveDistancesObject, float touchAreaShiftX, float touchAreaShiftY); diff --git a/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/CircleOptions.java b/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/CircleOptions.java index aeb9b4b1b..2a222195e 100644 --- a/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/CircleOptions.java +++ b/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/CircleOptions.java @@ -26,6 +26,7 @@ public class CircleOptions extends Options { private boolean isDraggable; + private JsonElement data; private Point geometry; private Float circleRadius; private String circleColor; @@ -275,6 +276,26 @@ public CircleOptions withDraggable(boolean draggable) { return this; } + /** + * Set the arbitrary json data of the annotation. + * + * @param jsonElement the arbitrary json element data + */ + public CircleOptions withData(@Nullable JsonElement jsonElement) { + this.data = jsonElement; + return this; + } + + /** + * Get the arbitrary json data of the annotation. + * + * @return the arbitrary json object data if set, else null + */ + @Nullable + public JsonElement getData() { + return data; + } + @Override Circle build(long id, AnnotationManager annotationManager) { if (geometry == null) { @@ -290,6 +311,7 @@ Circle build(long id, AnnotationManager annotationManager jsonObject.addProperty(PROPERTY_CIRCLE_STROKE_OPACITY, circleStrokeOpacity); Circle circle = new Circle(id, annotationManager, jsonObject, geometry); circle.setDraggable(isDraggable); + circle.setData(data); return circle; } diff --git a/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/FillOptions.java b/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/FillOptions.java index be1cb6d60..a1bb08e36 100644 --- a/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/FillOptions.java +++ b/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/FillOptions.java @@ -26,6 +26,7 @@ public class FillOptions extends Options { private boolean isDraggable; + private JsonElement data; private Polygon geometry; private Float fillOpacity; private String fillColor; @@ -212,6 +213,26 @@ public FillOptions withDraggable(boolean draggable) { return this; } + /** + * Set the arbitrary json data of the annotation. + * + * @param jsonElement the arbitrary json element data + */ + public FillOptions withData(@Nullable JsonElement jsonElement) { + this.data = jsonElement; + return this; + } + + /** + * Get the arbitrary json data of the annotation. + * + * @return the arbitrary json object data if set, else null + */ + @Nullable + public JsonElement getData() { + return data; + } + @Override Fill build(long id, AnnotationManager annotationManager) { if (geometry == null) { @@ -224,6 +245,7 @@ Fill build(long id, AnnotationManager annotationManager) { jsonObject.addProperty(PROPERTY_FILL_PATTERN, fillPattern); Fill fill = new Fill(id, annotationManager, jsonObject, geometry); fill.setDraggable(isDraggable); + fill.setData(data); return fill; } diff --git a/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/LineOptions.java b/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/LineOptions.java index c58376b29..8ae11d42f 100644 --- a/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/LineOptions.java +++ b/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/LineOptions.java @@ -26,6 +26,7 @@ public class LineOptions extends Options { private boolean isDraggable; + private JsonElement data; private LineString geometry; private String lineJoin; private Float lineOpacity; @@ -308,6 +309,26 @@ public LineOptions withDraggable(boolean draggable) { return this; } + /** + * Set the arbitrary json data of the annotation. + * + * @param jsonElement the arbitrary json element data + */ + public LineOptions withData(@Nullable JsonElement jsonElement) { + this.data = jsonElement; + return this; + } + + /** + * Get the arbitrary json data of the annotation. + * + * @return the arbitrary json object data if set, else null + */ + @Nullable + public JsonElement getData() { + return data; + } + @Override Line build(long id, AnnotationManager annotationManager) { if (geometry == null) { @@ -324,6 +345,7 @@ Line build(long id, AnnotationManager annotationManager) { jsonObject.addProperty(PROPERTY_LINE_PATTERN, linePattern); Line line = new Line(id, annotationManager, jsonObject, geometry); line.setDraggable(isDraggable); + line.setData(data); return line; } diff --git a/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/SymbolOptions.java b/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/SymbolOptions.java index f0f0a0491..3ee39bb5d 100644 --- a/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/SymbolOptions.java +++ b/plugin-annotation/src/main/java/com/mapbox/mapboxsdk/plugins/annotation/SymbolOptions.java @@ -26,6 +26,7 @@ public class SymbolOptions extends Options { private boolean isDraggable; + private JsonElement data; private Point geometry; private Float iconSize; private String iconImage; @@ -768,6 +769,26 @@ public SymbolOptions withDraggable(boolean draggable) { return this; } + /** + * Set the arbitrary json data of the annotation. + * + * @param jsonElement the arbitrary json element data + */ + public SymbolOptions withData(@Nullable JsonElement jsonElement) { + this.data = jsonElement; + return this; + } + + /** + * Get the arbitrary json data of the annotation. + * + * @return the arbitrary json object data if set, else null + */ + @Nullable + public JsonElement getData() { + return data; + } + @Override Symbol build(long id, AnnotationManager annotationManager) { if (geometry == null) { @@ -802,6 +823,7 @@ Symbol build(long id, AnnotationManager annotationManager jsonObject.addProperty(PROPERTY_Z_INDEX, zIndex); Symbol symbol = new Symbol(id, annotationManager, jsonObject, geometry); symbol.setDraggable(isDraggable); + symbol.setData(data); return symbol; } diff --git a/plugin-annotation/src/test/java/com/mapbox/mapboxsdk/plugins/annotation/CircleManagerTest.java b/plugin-annotation/src/test/java/com/mapbox/mapboxsdk/plugins/annotation/CircleManagerTest.java index 5a188f3b5..68446a35e 100644 --- a/plugin-annotation/src/test/java/com/mapbox/mapboxsdk/plugins/annotation/CircleManagerTest.java +++ b/plugin-annotation/src/test/java/com/mapbox/mapboxsdk/plugins/annotation/CircleManagerTest.java @@ -2,6 +2,7 @@ package com.mapbox.mapboxsdk.plugins.annotation; +import com.google.gson.JsonPrimitive; import com.mapbox.geojson.*; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.maps.MapView; @@ -379,6 +380,15 @@ public void testDragListener() { assertTrue(circleManager.getDragListeners().isEmpty()); } + @Test + public void testCustomData() { + circleManager = new CircleManager(mapView, mapboxMap, style, coreElementProvider, null, null, draggableAnnotationController); + CircleOptions options = new CircleOptions().withLatLng(new LatLng()); + options.withData(new JsonPrimitive("hello")); + Circle circle = circleManager.create(options); + assertEquals(new JsonPrimitive("hello"), circle.getData()); + } + @Test public void testClearAll() { circleManager = new CircleManager(mapView, mapboxMap, style, coreElementProvider, null, null, draggableAnnotationController); diff --git a/plugin-annotation/src/test/java/com/mapbox/mapboxsdk/plugins/annotation/FillManagerTest.java b/plugin-annotation/src/test/java/com/mapbox/mapboxsdk/plugins/annotation/FillManagerTest.java index 3f70a4eb5..2d5bda1f1 100644 --- a/plugin-annotation/src/test/java/com/mapbox/mapboxsdk/plugins/annotation/FillManagerTest.java +++ b/plugin-annotation/src/test/java/com/mapbox/mapboxsdk/plugins/annotation/FillManagerTest.java @@ -2,6 +2,7 @@ package com.mapbox.mapboxsdk.plugins.annotation; +import com.google.gson.JsonPrimitive; import com.mapbox.geojson.*; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.maps.MapView; @@ -428,6 +429,21 @@ public void testDragListener() { assertTrue(fillManager.getDragListeners().isEmpty()); } + @Test + public void testCustomData() { + fillManager = new FillManager(mapView, mapboxMap, style, coreElementProvider, null, null, draggableAnnotationController); + ListinnerLatLngs = new ArrayList<>(); + innerLatLngs.add(new LatLng()); + innerLatLngs.add(new LatLng(1,1)); + innerLatLngs.add(new LatLng(-1,-1)); + List>latLngs = new ArrayList<>(); + latLngs.add(innerLatLngs); + FillOptions options = new FillOptions().withLatLngs(latLngs); + options.withData(new JsonPrimitive("hello")); + Fill fill = fillManager.create(options); + assertEquals(new JsonPrimitive("hello"), fill.getData()); + } + @Test public void testClearAll() { fillManager = new FillManager(mapView, mapboxMap, style, coreElementProvider, null, null, draggableAnnotationController); diff --git a/plugin-annotation/src/test/java/com/mapbox/mapboxsdk/plugins/annotation/LineManagerTest.java b/plugin-annotation/src/test/java/com/mapbox/mapboxsdk/plugins/annotation/LineManagerTest.java index 09dd661fa..503fc5359 100644 --- a/plugin-annotation/src/test/java/com/mapbox/mapboxsdk/plugins/annotation/LineManagerTest.java +++ b/plugin-annotation/src/test/java/com/mapbox/mapboxsdk/plugins/annotation/LineManagerTest.java @@ -2,6 +2,7 @@ package com.mapbox.mapboxsdk.plugins.annotation; +import com.google.gson.JsonPrimitive; import com.mapbox.geojson.*; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.maps.MapView; @@ -447,6 +448,18 @@ public void testDragListener() { assertTrue(lineManager.getDragListeners().isEmpty()); } + @Test + public void testCustomData() { + lineManager = new LineManager(mapView, mapboxMap, style, coreElementProvider, null, null, draggableAnnotationController); + ListlatLngs = new ArrayList<>(); + latLngs.add(new LatLng()); + latLngs.add(new LatLng(1,1)); + LineOptions options = new LineOptions().withLatLngs(latLngs); + options.withData(new JsonPrimitive("hello")); + Line line = lineManager.create(options); + assertEquals(new JsonPrimitive("hello"), line.getData()); + } + @Test public void testClearAll() { lineManager = new LineManager(mapView, mapboxMap, style, coreElementProvider, null, null, draggableAnnotationController); diff --git a/plugin-annotation/src/test/java/com/mapbox/mapboxsdk/plugins/annotation/SymbolManagerTest.java b/plugin-annotation/src/test/java/com/mapbox/mapboxsdk/plugins/annotation/SymbolManagerTest.java index cc36b518d..23a1ccc23 100644 --- a/plugin-annotation/src/test/java/com/mapbox/mapboxsdk/plugins/annotation/SymbolManagerTest.java +++ b/plugin-annotation/src/test/java/com/mapbox/mapboxsdk/plugins/annotation/SymbolManagerTest.java @@ -2,6 +2,7 @@ package com.mapbox.mapboxsdk.plugins.annotation; +import com.google.gson.JsonPrimitive; import com.mapbox.geojson.*; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.maps.MapView; @@ -667,6 +668,15 @@ public void testDragListener() { assertTrue(symbolManager.getDragListeners().isEmpty()); } + @Test + public void testCustomData() { + symbolManager = new SymbolManager(mapView, mapboxMap, style, coreElementProvider, null, null, draggableAnnotationController); + SymbolOptions options = new SymbolOptions().withLatLng(new LatLng()); + options.withData(new JsonPrimitive("hello")); + Symbol symbol = symbolManager.create(options); + assertEquals(new JsonPrimitive("hello"), symbol.getData()); + } + @Test public void testClearAll() { symbolManager = new SymbolManager(mapView, mapboxMap, style, coreElementProvider, null, null, draggableAnnotationController);