summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Hallahan <nick@theoutpost.io>2015-07-14 10:45:29 -0700
committerNicholas Hallahan <nick@theoutpost.io>2015-07-14 10:45:29 -0700
commit1ac1ba0e18a2d99caeacc86cde096b72ea4a89f3 (patch)
tree442d0976ed0a856c0287097981784f1d71be5ae2
parentf710e9607a2d7b5817a84df5c33bcb6a441d2dd6 (diff)
downloadqtlocation-mapboxgl-1ac1ba0e18a2d99caeacc86cde096b72ea4a89f3.tar.gz
Fleshing out Android Annotation API, working on removing annotations through JNI.
-rw-r--r--android/cpp/jni.cpp9
-rw-r--r--android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Annotation.java42
-rw-r--r--android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Circle.java8
-rw-r--r--android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/CircleOptions.java9
-rw-r--r--android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Marker.java98
-rw-r--r--android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/MarkerOptions.java134
-rw-r--r--android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Polygon.java9
-rw-r--r--android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/PolygonOptions.java9
-rw-r--r--android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Polyline.java9
-rw-r--r--android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/PolylineOptions.java9
-rw-r--r--android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java23
-rw-r--r--android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/NativeMapView.java12
-rw-r--r--android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java16
13 files changed, 381 insertions, 6 deletions
diff --git a/android/cpp/jni.cpp b/android/cpp/jni.cpp
index 23a297220f..61af695f5f 100644
--- a/android/cpp/jni.cpp
+++ b/android/cpp/jni.cpp
@@ -455,6 +455,13 @@ jlong JNICALL nativeAddMarker(JNIEnv *env, jobject obj, jlong nativeMapViewPtr,
return (jlong) nativeMapView->getMap().addPointAnnotation(mbgl::PointAnnotation(mbgl::LatLng(latitude, longitude), std::string("default_marker")));
}
+// void JNICALL nativeRemoveAnnotation(JNIEnv *env, jobject obj, jlong nativeMapViewPtr, jlong annotationId) {
+// mbgl::Log::Debug(mbgl::Event::JNI, "nativeRemoveAnnotation");
+// assert(nativeMapViewPtr != 0);
+// NativeMapView *nativeMapView = reinterpret_cast<NativeMapView *>(nativeMapViewPtr);
+// nativeMapView->getMap().setLatLng((uint32_t)annotationId);
+// }
+
jobject JNICALL nativeGetLatLng(JNIEnv *env, jobject obj, jlong nativeMapViewPtr) {
mbgl::Log::Debug(mbgl::Event::JNI, "nativeGetLatLng");
assert(nativeMapViewPtr != 0);
@@ -1000,6 +1007,8 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
reinterpret_cast<void *>(&nativeSetLatLng)},
{"nativeAddMarker", "(JLcom/mapbox/mapboxgl/geometry/LatLng;)J",
reinterpret_cast<void *>(&nativeAddMarker)},
+ // {"nativeRemoveAnnotation", "(J)V",
+ // reinterpret_cast<void *>(&nativeRemoveAnnotation)},
{"nativeGetLatLng", "(J)Lcom/mapbox/mapboxgl/geometry/LatLng;",
reinterpret_cast<void *>(&nativeGetLatLng)},
{"nativeResetPosition", "(J)V", reinterpret_cast<void *>(&nativeResetPosition)},
diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Annotation.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Annotation.java
new file mode 100644
index 0000000000..fb2b7e2a39
--- /dev/null
+++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Annotation.java
@@ -0,0 +1,42 @@
+package com.mapbox.mapboxgl.annotations;
+
+import com.mapbox.mapboxgl.views.MapView;
+
+/**
+ * Created by Nicholas Hallahan on 7/13/15.
+ * nick@theoutpost.io
+ */
+public abstract class Annotation {
+
+ /**
+ * The annotation id
+ *
+ * Internal C++ id is stored as unsigned int.
+ */
+ protected Long id;
+ private MapView mapView;
+
+ public Annotation() {}
+
+ public Annotation(long id) {
+ this.id = id;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void remove() {
+ if (mapView == null) return;
+ mapView.removeAnnotation(this);
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public void setMapView(MapView mapView) {
+ this.mapView = mapView;
+ }
+
+}
diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Circle.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Circle.java
new file mode 100644
index 0000000000..298643f641
--- /dev/null
+++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Circle.java
@@ -0,0 +1,8 @@
+package com.mapbox.mapboxgl.annotations;
+
+/**
+ * Created by Nicholas Hallahan on 7/13/15.
+ * nick@theoutpost.io
+ */
+public class Circle {
+}
diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/CircleOptions.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/CircleOptions.java
new file mode 100644
index 0000000000..afb80b78a2
--- /dev/null
+++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/CircleOptions.java
@@ -0,0 +1,9 @@
+package com.mapbox.mapboxgl.annotations;
+
+/**
+ * Created by Nicholas Hallahan on 7/13/15.
+ * nick@theoutpost.io
+ */
+public class CircleOptions {
+
+}
diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Marker.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Marker.java
new file mode 100644
index 0000000000..a178786c51
--- /dev/null
+++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Marker.java
@@ -0,0 +1,98 @@
+package com.mapbox.mapboxgl.annotations;
+
+import com.mapbox.mapboxgl.geometry.LatLng;
+
+/**
+ * Created by Nicholas Hallahan on 7/13/15.
+ * nick@theoutpost.io
+ */
+public class Marker extends Annotation {
+
+ /**
+ * Member fields are without access qualifiers
+ * so that they can be directly set by MarkerOptions
+ * from within the module.
+ */
+ float alpha;
+ float anchorU;
+ float anchorV;
+ boolean draggable;
+ boolean flat;
+ float infoWindowAnchorU;
+ float infoWindowAnchorV;
+ LatLng position;
+ float rotation;
+ String snippet;
+ String title;
+ boolean visible;
+
+ private boolean infoWindowShown = false;
+
+ public Marker() {
+
+ }
+
+ public boolean equals(Object other) {
+ double lat = position.getLatitude();
+ double lng = position.getLongitude();
+ // TODO Implement equals
+ return false;
+ }
+
+ public float getAlpha() {
+ return alpha;
+ }
+
+ /**
+ * NOTE: Google Maps Android API uses String for IDs.
+ *
+ * Internal C++ id is stored as unsigned int.
+ *
+ * @return the annotation id
+ */
+ public long getId() {
+ return id;
+ }
+
+ public LatLng getPosition() {
+ return position;
+ }
+
+ public float getRotation() {
+ return rotation;
+ }
+
+ public String getSnippet() {
+ return snippet;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+// Method in Google Maps Android API
+// public int hashCode()
+
+ public void hideInfoWindow() {
+ //TODO hideInfoWindow
+ infoWindowShown = true;
+ }
+
+ public boolean isDraggable() {
+ return draggable;
+ }
+
+ public boolean isFlat() {
+ return flat;
+ }
+
+ public boolean isInfoWindowShown () {
+ return infoWindowShown;
+ }
+
+ public boolean isVisible() {
+ return visible;
+ }
+
+
+}
diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/MarkerOptions.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/MarkerOptions.java
new file mode 100644
index 0000000000..723707a854
--- /dev/null
+++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/MarkerOptions.java
@@ -0,0 +1,134 @@
+package com.mapbox.mapboxgl.annotations;
+
+import com.mapbox.mapboxgl.geometry.LatLng;
+
+/**
+ * Created by Nicholas Hallahan on 7/13/15.
+ * nick@theoutpost.io
+ */
+public class MarkerOptions {
+
+ private Marker marker;
+
+ public MarkerOptions() {
+ marker = new Marker();
+ }
+
+ public MarkerOptions alpha(float alpha) {
+ marker.alpha = alpha;
+ return this;
+ }
+
+ public MarkerOptions anchor(float u, float v) {
+ marker.anchorU = u;
+ marker.anchorV = v;
+ return this;
+ }
+
+ public MarkerOptions draggable(boolean draggable) {
+ marker.draggable = draggable;
+ return this;
+ }
+
+ public MarkerOptions flat(boolean flat) {
+ marker.flat = flat;
+ return this;
+ }
+
+ public float getAlpha() {
+ return marker.alpha;
+ }
+
+ public float getAnchorU() {
+ return marker.anchorU;
+ }
+
+ public float getAnchorV() {
+ return marker.anchorV;
+ }
+
+ // TODO: Implement this method of Google Maps Android API
+// public BitmapDescriptor getIcon () {
+//
+// }
+
+ public float getInfoWindowAnchorU() {
+ return marker.infoWindowAnchorU;
+ }
+
+ public float getInfoWindowAnchorV() {
+ return marker.infoWindowAnchorV;
+ }
+
+ public Marker getMarker() {
+ return marker;
+ }
+
+ public LatLng getPosition() {
+ return marker.position;
+ }
+
+ public float getRotation() {
+ return marker.rotation;
+ }
+
+ public String getSnippet() {
+ return marker.snippet;
+ }
+
+ public String getTitle() {
+ return marker.title;
+ }
+
+ // TODO: Implement this method of Google Maps Android API
+// public MarkerOptions icon(BitmapDescriptor icon) {
+//
+// }
+
+ public MarkerOptions infoWindowAnchor(float u, float v) {
+ marker.infoWindowAnchorU = u;
+ marker.infoWindowAnchorV = v;
+ return this;
+ }
+
+ public boolean isDraggable() {
+ return marker.draggable;
+ }
+
+ public boolean isFlat() {
+ return marker.flat;
+ }
+
+ public boolean isVisible() {
+ return marker.visible;
+ }
+
+ public MarkerOptions position(LatLng position) {
+ marker.position = position;
+ return this;
+ }
+
+ public MarkerOptions rotation(float rotation) {
+ marker.rotation = rotation;
+ return this;
+ }
+
+ public MarkerOptions snippet(String snippet) {
+ marker.snippet = snippet;
+ return this;
+ }
+
+ public MarkerOptions title(String title) {
+ marker.title = title;
+ return this;
+ }
+
+ public MarkerOptions visible(boolean visible) {
+ marker.visible = visible;
+ return this;
+ }
+
+ // TODO: Implement this method of Google Maps Android API
+// public void writeToParcel (Parcel out, int flags)
+
+}
diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Polygon.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Polygon.java
new file mode 100644
index 0000000000..acd88673d1
--- /dev/null
+++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Polygon.java
@@ -0,0 +1,9 @@
+package com.mapbox.mapboxgl.annotations;
+
+/**
+ * Created by Nicholas Hallahan on 7/13/15.
+ * nick@theoutpost.io
+ */
+public class Polygon {
+
+}
diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/PolygonOptions.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/PolygonOptions.java
new file mode 100644
index 0000000000..29673465f2
--- /dev/null
+++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/PolygonOptions.java
@@ -0,0 +1,9 @@
+package com.mapbox.mapboxgl.annotations;
+
+/**
+ * Created by Nicholas Hallahan on 7/13/15.
+ * nick@theoutpost.io
+ */
+public class PolygonOptions {
+
+}
diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Polyline.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Polyline.java
new file mode 100644
index 0000000000..c600549788
--- /dev/null
+++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Polyline.java
@@ -0,0 +1,9 @@
+package com.mapbox.mapboxgl.annotations;
+
+/**
+ * Created by Nicholas Hallahan on 7/13/15.
+ * nick@theoutpost.io
+ */
+public class Polyline {
+
+}
diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/PolylineOptions.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/PolylineOptions.java
new file mode 100644
index 0000000000..4201d41b54
--- /dev/null
+++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/PolylineOptions.java
@@ -0,0 +1,9 @@
+package com.mapbox.mapboxgl.annotations;
+
+/**
+ * Created by Nicholas Hallahan on 7/13/15.
+ * nick@theoutpost.io
+ */
+public class PolylineOptions {
+
+}
diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java
index 6af2e3e60c..f9524bad2d 100644
--- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java
+++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java
@@ -29,6 +29,9 @@ import android.widget.ZoomButtonsController;
import com.almeros.android.multitouch.gesturedetectors.RotateGestureDetector;
import com.almeros.android.multitouch.gesturedetectors.TwoFingerGestureDetector;
+import com.mapbox.mapboxgl.annotations.Annotation;
+import com.mapbox.mapboxgl.annotations.Marker;
+import com.mapbox.mapboxgl.annotations.MarkerOptions;
import com.mapbox.mapboxgl.geometry.LatLng;
import com.mapbox.mapboxgl.geometry.LatLngZoom;
@@ -62,6 +65,11 @@ public class MapView extends SurfaceView {
private static final String STATE_CLASSES = "classes";
private static final String STATE_DEFAULT_TRANSITION_DURATION = "defaultTransitionDuration";
+ /**
+ * Every annotation that has been added to the map.
+ */
+ private List<Annotation> annotations = new ArrayList<>();
+
//
// Instance members
//
@@ -204,10 +212,21 @@ public class MapView extends SurfaceView {
}
}
- public void addMarker(LatLng marker) {
- mNativeMapView.addMarker(marker);
+ public Marker addMarker(MarkerOptions markerOptions) {
+ Marker marker = markerOptions.getMarker();
+ Long markerId = mNativeMapView.addMarker(marker);
+ marker.setId(markerId); // the annotation needs to know its id
+ marker.setMapView(this); // the annotation needs to know which map view it is in
+ annotations.add(marker);
+ return marker;
+ }
+
+ public void removeAnnotation(Annotation annotation) {
+ long id = annotation.getId();
+ mNativeMapView.removeAnnotation(id);
}
+
//
// Property methods
//
diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/NativeMapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/NativeMapView.java
index 6d4f026b1e..9ed7d29b94 100644
--- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/NativeMapView.java
+++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/NativeMapView.java
@@ -3,6 +3,7 @@ package com.mapbox.mapboxgl.views;
import android.graphics.PointF;
import android.view.Surface;
+import com.mapbox.mapboxgl.annotations.Marker;
import com.mapbox.mapboxgl.geometry.LatLng;
import com.mapbox.mapboxgl.geometry.LatLngZoom;
import com.mapbox.mapboxgl.geometry.ProjectedMeters;
@@ -213,8 +214,13 @@ class NativeMapView {
nativeSetLatLng(mNativeMapViewPtr, latLng, duration);
}
- public void addMarker(LatLng latLng) {
- nativeAddMarker(mNativeMapViewPtr, latLng);
+ public long addMarker(Marker marker) {
+ LatLng latLng = marker.getPosition();
+ return nativeAddMarker(mNativeMapViewPtr, latLng);
+ }
+
+ public void removeAnnotation(long id) {
+// nativeRemoveAnnotation(mNativeMapViewPtr, id);
}
public LatLng getLatLng() {
@@ -451,6 +457,8 @@ class NativeMapView {
private native long nativeAddMarker(long nativeMapViewPtr, LatLng latLng);
+ private native void nativeRemoveAnnotation(long nativeMapViewPtr, long id);
+
private native LatLng nativeGetLatLng(long nativeMapViewPtr);
private native void nativeResetPosition(long nativeMapViewPtr);
diff --git a/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java b/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java
index 34fe4f02f1..9bc696b40c 100644
--- a/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java
+++ b/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java
@@ -23,6 +23,8 @@ import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
+import com.mapbox.mapboxgl.annotations.Marker;
+import com.mapbox.mapboxgl.annotations.MarkerOptions;
import com.mapbox.mapboxgl.geometry.LatLng;
import com.mapbox.mapboxgl.views.MapView;
import com.mapzen.android.lost.api.LocationListener;
@@ -80,6 +82,8 @@ public class MainActivity extends ActionBarActivity {
// Used for markers
private boolean mIsMarkersOn = false;
+ private Marker marker;
+
//
// Lifecycle events
//
@@ -272,14 +276,22 @@ public class MainActivity extends ActionBarActivity {
} else {
if (mIsMarkersOn) {
mIsMarkersOn = false;
-
+ removeMarkers();
}
}
}
private void addMarkers() {
LatLng backLot = new LatLng(38.649441, -121.369064);
- mMapFragment.getMap().addMarker(backLot);
+ MapView map = mMapFragment.getMap();
+ marker = map.addMarker(new MarkerOptions()
+ .position(backLot)
+ .title("Back Lot")
+ .snippet("The back lot behind my house"));
+ }
+
+ private void removeMarkers() {
+ marker.remove();
}
// This class forwards location updates to updateLocation()