diff --git a/android/cpp/jni.cpp b/android/cpp/jni.cpp index dcf64eed2..86fdc615b 100644 --- a/android/cpp/jni.cpp +++ b/android/cpp/jni.cpp @@ -821,6 +821,73 @@ jlong JNICALL nativeAddMarker(JNIEnv *env, jobject obj, jlong nativeMapViewPtr, return nativeMapView->getMap().addPointAnnotation(mbgl::PointAnnotation(mbgl::LatLng(latitude, longitude), sprite)); } +jlongArray JNICALL nativeAddMarkers(JNIEnv *env, jobject obj, jlong nativeMapViewPtr, jobject jlist) { + mbgl::Log::Debug(mbgl::Event::JNI, "nativeAddMarkers"); + assert(nativeMapViewPtr != 0); + NativeMapView *nativeMapView = reinterpret_cast(nativeMapViewPtr); + + std::vector markers; + + if (jlist == nullptr) { + if (env->ThrowNew(nullPointerExceptionClass, "List cannot be null.") < 0) { + env->ExceptionDescribe(); + return nullptr; + } + return nullptr; + } + + jobjectArray jarray = + reinterpret_cast(env->CallObjectMethod(jlist, listToArrayId)); + if (env->ExceptionCheck() || (jarray == nullptr)) { + env->ExceptionDescribe(); + return nullptr; + } + + jsize len = env->GetArrayLength(jarray); + if (len < 0) { + env->ExceptionDescribe(); + return nullptr; + } + + markers.reserve(len); + + for (jsize i = 0; i < len; i++) { + jobject marker = reinterpret_cast(env->GetObjectArrayElement(jarray, i)); + + jobject position = env->GetObjectField(marker, markerPositionId); + if (env->ExceptionCheck()) { + env->ExceptionDescribe(); + return nullptr; + } + + jstring jsprite = reinterpret_cast(env->GetObjectField(marker, markerSpriteId)); + std::string sprite = std_string_from_jstring(env, jsprite); + + jdouble latitude = env->GetDoubleField(position, latLngLatitudeId); + if (env->ExceptionCheck()) { + env->ExceptionDescribe(); + return nullptr; + } + + jdouble longitude = env->GetDoubleField(position, latLngLongitudeId); + if (env->ExceptionCheck()) { + env->ExceptionDescribe(); + return nullptr; + } + + markers.emplace_back(mbgl::PointAnnotation(mbgl::LatLng(latitude, longitude), sprite)); + + /* Do I need to delete other LocalRefs? */ + env->DeleteLocalRef(marker); + } + + env->DeleteLocalRef(jarray); + + std::vector pointAnnotationIDs = nativeMapView->getMap().addPointAnnotations(markers); + return std_vector_uint_to_jobject(env, pointAnnotationIDs); +} + + jlong JNICALL nativeAddPolyline(JNIEnv *env, jobject obj, jlong nativeMapViewPtr, jobject polyline) { mbgl::Log::Debug(mbgl::Event::JNI, "nativeAddPolyline"); assert(nativeMapViewPtr != 0); @@ -1689,6 +1756,8 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { {"nativeResetNorth", "(J)V", reinterpret_cast(&nativeResetNorth)}, {"nativeAddMarker", "(JLcom/mapbox/mapboxgl/annotations/Marker;)J", reinterpret_cast(&nativeAddMarker)}, + {"nativeAddMarkers", "(JLjava/util/List;)[J", + reinterpret_cast(&nativeAddMarkers)}, {"nativeAddPolyline", "(JLcom/mapbox/mapboxgl/annotations/Polyline;)J", reinterpret_cast(&nativeAddPolyline)}, {"nativeAddPolygon", "(JLcom/mapbox/mapboxgl/annotations/Polygon;)J", 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 1c100c6e9..fe00b3a41 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 @@ -1078,6 +1078,19 @@ public class MapView extends FrameLayout implements LocationListener { return marker; } + public List addMarkers(List markers){ + long[] ids = mNativeMapView.addMarkers(markers); + Marker m; + int count = markers.size(); + for (int i = 0; i < count; i++) { + m = markers.get(i); + m.setId(ids[i]); + m.setMapView(this); + mAnnotations.add(m); + } + return markers; + } + public Polyline addPolyline(PolylineOptions polylineOptions) { Polyline polyline = polylineOptions.getPolyline(); long id = mNativeMapView.addPolyline(polyline); 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 1023fa1ff..f529c301a 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 @@ -333,6 +333,10 @@ class NativeMapView { return nativeAddMarker(mNativeMapViewPtr, marker); } + public long[] addMarkers(List markers) { + return nativeAddMarkers(mNativeMapViewPtr, markers); + } + public long addPolyline(Polyline polyline) { return nativeAddPolyline(mNativeMapViewPtr, polyline); } @@ -561,6 +565,8 @@ class NativeMapView { private native long nativeAddMarker(long nativeMapViewPtr, Marker marker); + private native long[] nativeAddMarkers(long nativeMapViewPtr, List markers); + private native long nativeAddPolyline(long nativeMapViewPtr, Polyline polyline); private native long nativeAddPolygon(long mNativeMapViewPtr, Polygon polygon); 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 2f9b374e2..e0c9d49f3 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 @@ -37,6 +37,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.text.DecimalFormat; import java.util.ArrayList; +import java.util.List; public class MainActivity extends AppCompatActivity { @@ -404,26 +405,34 @@ public class MainActivity extends AppCompatActivity { } private void addMarkers() { - LatLng backLot = new LatLng(38.649441, -121.369064); - final Marker marker = mMapView.addMarker(new MarkerOptions() - .position(backLot) - .title("Back Lot") - .snippet("The back lot behind my house")); - marker.setInfoWindowOnTouchListener(new View.OnTouchListener() { + List markerList = new ArrayList<>(); + + final Marker backLot = generateMarker("Back Lot", "The back lot behind my house", "default_marker", 38.649441, -121.369064); + markerList.add(backLot); + + final Marker cheeseRoom = generateMarker("Cheese Room", "The only air conditioned room on the property", "dog-park-15", 38.531577, -122.010646); + markerList.add(cheeseRoom); + + mMapView.addMarkers(markerList); + + // need to call this after adding markers to map, click event hook into InfoWindow needs refactoring + backLot.setInfoWindowOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { Toast.makeText(getApplicationContext(), "Custom Info Touch Listener!!", Toast.LENGTH_SHORT).show(); - marker.hideInfoWindow(); + backLot.hideInfoWindow(); return true; } }); + } - LatLng cheeseRoom = new LatLng(38.531577,-122.010646); - mMapView.addMarker(new MarkerOptions() - .position(cheeseRoom) - .sprite("dog-park-15") - .title("Cheese Room") - .snippet("The only air conditioned room on the property!")); + private Marker generateMarker(String title, String snippet, String sprite, double lat, double lng){ + return new MarkerOptions() + .position(new LatLng(lat,lng)) + .title(title) + .sprite(sprite) + .snippet(snippet) + .getMarker(); } private void addPolyline() {