diff options
9 files changed, 118 insertions, 15 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java index ecea6b2244..9b40685408 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java @@ -257,18 +257,29 @@ public final class MapboxMap { */ @UiThread public void addLayer(@NonNull Layer layer) { - addLayer(layer, null); + nativeMapView.addLayer(layer); } /** * Adds the layer to the map. The layer must be newly created and not added to the map before * * @param layer the layer to add - * @param before the layer id to add this layer before + * @param below the layer id to add this layer before */ @UiThread - public void addLayer(@NonNull Layer layer, String before) { - nativeMapView.addLayer(layer, before); + public void addLayerBelow(@NonNull Layer layer, @NonNull String below) { + nativeMapView.addLayerBelow(layer, below); + } + + /** + * Adds the layer to the map. The layer must be newly created and not added to the map before + * + * @param layer the layer to add + * @param above the layer id to add this layer above + */ + @UiThread + public void addLayerAbove(@NonNull Layer layer, @NonNull String above) { + nativeMapView.addLayerAbove(layer, above); } /** diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java index 47f4ad722e..a816808f7b 100755 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java @@ -761,11 +761,25 @@ final class NativeMapView { return nativeGetLayer(layerId); } - public void addLayer(@NonNull Layer layer, @Nullable String before) { - if (isDestroyedOn("")) { + public void addLayer(@NonNull Layer layer) { + if (isDestroyedOn("addLayer")) { + return; + } + nativeAddLayer(layer.getNativePtr(), null); + } + + public void addLayerBelow(@NonNull Layer layer, @NonNull String below) { + if (isDestroyedOn("addLayerBelow")) { return; } - nativeAddLayer(layer.getNativePtr(), before); + nativeAddLayer(layer.getNativePtr(), below); + } + + public void addLayerAbove(@NonNull Layer layer, @NonNull String above) { + if (isDestroyedOn("addLayerAbove")) { + return; + } + nativeAddLayerAbove(layer.getNativePtr(), above); } @Nullable @@ -1079,6 +1093,8 @@ final class NativeMapView { private native void nativeAddLayer(long layerPtr, String before) throws CannotAddLayerException; + private native void nativeAddLayerAbove(long layerPtr, String above) throws CannotAddLayerException; + private native Layer nativeRemoveLayerById(String layerId); private native void nativeRemoveLayer(long layerId); diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/style/RuntimeStyleTests.java b/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/style/RuntimeStyleTests.java index cda4b62d58..2014208fcf 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/style/RuntimeStyleTests.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/style/RuntimeStyleTests.java @@ -11,6 +11,7 @@ import android.view.View; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.style.layers.CannotAddLayerException; +import com.mapbox.mapboxsdk.style.layers.CircleLayer; import com.mapbox.mapboxsdk.style.layers.FillLayer; import com.mapbox.mapboxsdk.style.layers.Layer; import com.mapbox.mapboxsdk.style.layers.Property; @@ -37,10 +38,11 @@ import java.util.List; import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static junit.framework.Assert.assertTrue; -import static junit.framework.Assert.fail; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; /** * Basic smoke tests for Layer and Source @@ -86,6 +88,41 @@ public class RuntimeStyleTests { } @Test + public void testAddLayerAbove() { + ViewUtils.checkViewIsDisplayed(R.id.mapView); + onView(withId(R.id.mapView)).perform(new BaseViewAction() { + @Override + public void perform(UiController uiController, View view) { + MapboxMap mapboxMap = rule.getActivity().getMapboxMap(); + + List<Layer> layers = mapboxMap.getLayers(); + Source source = mapboxMap.getSources().get(0); + + // Test inserting with invalid above-id + try { + mapboxMap.addLayerAbove(new CircleLayer("invalid-id-layer-test", source.getId()), "no-such-layer-here-man"); + fail("Should have thrown exception"); + } catch (CannotAddLayerException ex) { + // Yeah + assertNotNull(ex.getMessage()); + } + + // Insert as last + CircleLayer last = new CircleLayer("this is the last one", source.getId()); + mapboxMap.addLayerAbove(last, layers.get(layers.size() - 1).getId()); + layers = mapboxMap.getLayers(); + assertEquals(last.getId(), layers.get(layers.size() - 1).getId()); + + // Insert + CircleLayer second = new CircleLayer("this is the second one", source.getId()); + mapboxMap.addLayerAbove(second, layers.get(0).getId()); + layers = mapboxMap.getLayers(); + assertEquals(second.getId(), layers.get(1).getId()); + } + }); + } + + @Test public void testListSources() { ViewUtils.checkViewIsDisplayed(R.id.mapView); onView(withId(R.id.mapView)).perform(new BaseViewAction() { @@ -97,7 +134,7 @@ public class RuntimeStyleTests { List<Source> sources = mapboxMap.getSources(); assertNotNull(sources); assertTrue(sources.size() > 0); - for (Source source: sources) { + for (Source source : sources) { assertNotNull(source); } } diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/customlayer/CustomLayerActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/customlayer/CustomLayerActivity.java index 2f445b2c37..dde22db2db 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/customlayer/CustomLayerActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/customlayer/CustomLayerActivity.java @@ -70,7 +70,7 @@ public class CustomLayerActivity extends AppCompatActivity { ExampleCustomLayer.InitializeFunction, ExampleCustomLayer.RenderFunction, ExampleCustomLayer.DeinitializeFunction); - mapboxMap.addLayer(customLayer, "building"); + mapboxMap.addLayerBelow(customLayer, "building"); fab.setImageResource(R.drawable.ic_layers_clear); } } diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/CircleLayerActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/CircleLayerActivity.java index 7c3afd387e..ebf1fc4fdf 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/CircleLayerActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/CircleLayerActivity.java @@ -91,7 +91,7 @@ public class CircleLayerActivity extends AppCompatActivity { Timber.e("That's not an url... ", malformedUrlException); } LineLayer lineLayer = new LineLayer("route_layer", "bus_route"); - mapboxMap.addLayer(lineLayer, "stops_layer"); + mapboxMap.addLayerBelow(lineLayer, "stops_layer"); // move camera to start route mapboxMap.animateCamera(CameraUpdateFactory.newCameraPosition( diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/CustomSpriteActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/CustomSpriteActivity.java index 36bfc44057..3763b45e7a 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/CustomSpriteActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/CustomSpriteActivity.java @@ -77,7 +77,7 @@ public class CustomSpriteActivity extends AppCompatActivity { ); // lets add a circle below labels! - mapboxMap.addLayer(layer, "waterway-label"); + mapboxMap.addLayerBelow(layer, "waterway-label"); fab.setImageResource(R.drawable.ic_directions_car_black); } else { diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/RuntimeStyleActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/RuntimeStyleActivity.java index cd50dc2f00..af42b7a0fe 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/RuntimeStyleActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/RuntimeStyleActivity.java @@ -40,7 +40,6 @@ import java.io.Reader; import java.io.StringWriter; import java.io.Writer; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import timber.log.Timber; @@ -302,7 +301,7 @@ public class RuntimeStyleActivity extends AppCompatActivity { // Only show me parks (except westerpark with stroke-width == 3) layer.setFilter(all(eq("type", "park"), eq("stroke-width", 2))); - mapboxMap.addLayer(layer, "building"); + mapboxMap.addLayerBelow(layer, "building"); // layer.setPaintProperty(fillColor(Color.RED)); // XXX But not after the object is attached // Or get the object later and set it. It's all good. diff --git a/platform/android/src/native_map_view.cpp b/platform/android/src/native_map_view.cpp index 5587300c1c..34e18754e9 100755 --- a/platform/android/src/native_map_view.cpp +++ b/platform/android/src/native_map_view.cpp @@ -779,6 +779,43 @@ void NativeMapView::addLayer(JNIEnv& env, jlong nativeLayerPtr, jni::String befo } } +void NativeMapView::addLayerAbove(JNIEnv& env, jlong nativeLayerPtr, jni::String above) { + assert(nativeLayerPtr != 0); + + Layer *layer = reinterpret_cast<Layer *>(nativeLayerPtr); + + // Find the sibling + auto layers = map->getLayers(); + auto siblingId = jni::Make<std::string>(env, above); + + size_t index = 0; + for (auto l : layers) { + if (l->getID() == siblingId) { + break; + } + index++; + } + + // Check if we found a sibling to place before + mbgl::optional<std::string> before; + if (index + 1 > layers.size()) { + // Not found + jni::ThrowNew(env, jni::FindClass(env, "com/mapbox/mapboxsdk/style/layers/CannotAddLayerException"), + std::string("Could not find layer: ").append(siblingId).c_str()); + return; + } else if (index + 1 < layers.size()) { + // Place before the sibling + before = { layers.at(index + 1)->getID() }; + } + + // Add the layer + try { + layer->addToMap(*map, before); + } catch (const std::runtime_error& error) { + jni::ThrowNew(env, jni::FindClass(env, "com/mapbox/mapboxsdk/style/layers/CannotAddLayerException"), error.what()); + } +} + /** * Remove by layer id. */ @@ -1380,6 +1417,7 @@ void NativeMapView::registerNative(jni::JNIEnv& env) { METHOD(&NativeMapView::getLayers, "nativeGetLayers"), METHOD(&NativeMapView::getLayer, "nativeGetLayer"), METHOD(&NativeMapView::addLayer, "nativeAddLayer"), + METHOD(&NativeMapView::addLayerAbove, "nativeAddLayerAbove"), METHOD(&NativeMapView::removeLayerById, "nativeRemoveLayerById"), METHOD(&NativeMapView::removeLayer, "nativeRemoveLayer"), METHOD(&NativeMapView::getSources, "nativeGetSources"), diff --git a/platform/android/src/native_map_view.hpp b/platform/android/src/native_map_view.hpp index 7b3694e73c..9f02f4a25c 100755 --- a/platform/android/src/native_map_view.hpp +++ b/platform/android/src/native_map_view.hpp @@ -207,6 +207,8 @@ public: void addLayer(JNIEnv&, jlong, jni::String); + void addLayerAbove(JNIEnv&, jlong, jni::String); + jni::Object<Layer> removeLayerById(JNIEnv&, jni::String); void removeLayer(JNIEnv&, jlong); |