summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvo van Dongen <info@ivovandongen.nl>2017-02-24 17:18:26 +0200
committerIvo van Dongen <ivovandongen@users.noreply.github.com>2017-02-28 09:33:04 -0800
commitdc21396d71ea28b736ee6fb3dcd476fed80fbd5d (patch)
tree7ffda504ae73e9ddb4998e8290601bba5ddcfa9f
parent3040d407723ed8a8e2dfa27ad0ba49f534772342 (diff)
downloadqtlocation-mapboxgl-dc21396d71ea28b736ee6fb3dcd476fed80fbd5d.tar.gz
[android] insert layer above
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java19
-rwxr-xr-xplatform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java22
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/style/RuntimeStyleTests.java43
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/customlayer/CustomLayerActivity.java2
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/CircleLayerActivity.java2
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/CustomSpriteActivity.java2
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/RuntimeStyleActivity.java3
-rwxr-xr-xplatform/android/src/native_map_view.cpp38
-rwxr-xr-xplatform/android/src/native_map_view.hpp2
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);