diff options
author | Nicholas Hallahan <nick@theoutpost.io> | 2015-07-14 10:45:29 -0700 |
---|---|---|
committer | Nicholas Hallahan <nick@theoutpost.io> | 2015-07-14 10:45:29 -0700 |
commit | 1ac1ba0e18a2d99caeacc86cde096b72ea4a89f3 (patch) | |
tree | 442d0976ed0a856c0287097981784f1d71be5ae2 | |
parent | f710e9607a2d7b5817a84df5c33bcb6a441d2dd6 (diff) | |
download | qtlocation-mapboxgl-1ac1ba0e18a2d99caeacc86cde096b72ea4a89f3.tar.gz |
Fleshing out Android Annotation API, working on removing annotations through JNI.
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() |