From ec1dc2622b633227321ffde962ecc7c85b751190 Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Fri, 24 Feb 2017 14:29:57 +0200 Subject: [PATCH] [android] layer list accessor + example --- .../com/mapbox/mapboxsdk/maps/MapboxMap.java | 16 +++++++++++++ .../mapbox/mapboxsdk/maps/NativeMapView.java | 9 +++++++ .../testapp/style/RuntimeStyleTests.java | 24 +++++++++++++++++++ .../activity/style/RuntimeStyleActivity.java | 14 +++++++++++ .../src/main/res/menu/menu_runtime_style.xml | 4 ++++ platform/android/src/native_map_view.cpp | 19 +++++++++++++++ platform/android/src/native_map_view.hpp | 2 ++ 7 files changed, 88 insertions(+) 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 c95d39127..cf56f6346 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 @@ -209,6 +209,22 @@ public final class MapboxMap { nativeMapView.setTransitionDelay(delay); } + /** + * Retrieve all the layers in the style + * + * @return all the layers in the current style + */ + @UiThread + public List getLayers() { + return nativeMapView.getLayers(); + } + + /** + * Get the layer by id + * + * @param layerId the layer's id + * @return the layer, if present in the style + */ @Nullable @UiThread public Layer getLayer(@NonNull String layerId) { 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 aed3f6b30..a3ec1cc3c 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 @@ -747,6 +747,13 @@ final class NativeMapView { nativeSetTransitionDelay(delay); } + public List getLayers() { + if (isDestroyedOn("getLayers")) { + return null; + } + return Arrays.asList(nativeGetLayers()); + } + public Layer getLayer(String layerId) { if (isDestroyedOn("getLayer")) { return null; @@ -1054,6 +1061,8 @@ final class NativeMapView { private native void nativeSetTransitionDelay(long delay); + private native Layer[] nativeGetLayers(); + private native Layer nativeGetLayer(String layerId); private native void nativeAddLayer(long layerPtr, String before) throws CannotAddLayerException; 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 04c57636f..f24e6dbf5 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 @@ -12,6 +12,7 @@ import android.view.View; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.style.layers.CannotAddLayerException; import com.mapbox.mapboxsdk.style.layers.FillLayer; +import com.mapbox.mapboxsdk.style.layers.Layer; import com.mapbox.mapboxsdk.style.layers.Property; import com.mapbox.mapboxsdk.style.layers.PropertyFactory; import com.mapbox.mapboxsdk.style.sources.CannotAddSourceException; @@ -31,9 +32,12 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +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.assertNotNull; import static org.junit.Assert.assertNull; @@ -55,6 +59,26 @@ public class RuntimeStyleTests { Espresso.registerIdlingResources(idlingResource); } + @Test + public void testListLayers() { + 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 layers = mapboxMap.getLayers(); + assertNotNull(layers); + assertTrue(layers.size() > 0); + for (Layer layer : layers) { + assertNotNull(layer); + } + } + + }); + } + @Test public void testGetAddRemoveLayer() { ViewUtils.checkViewIsDisplayed(R.id.mapView); 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 6e0593216..8624feaec 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,6 +40,7 @@ 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; @@ -150,6 +151,9 @@ public class RuntimeStyleActivity extends AppCompatActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { + case R.id.action_list_layers: + listLayers(); + return true; case R.id.action_water_color: setWaterColor(); return true; @@ -197,6 +201,16 @@ public class RuntimeStyleActivity extends AppCompatActivity { } } + private void listLayers() { + List layers = mapboxMap.getLayers(); + StringBuilder builder = new StringBuilder("Layers:"); + for (Layer layer : layers) { + builder.append("\n"); + builder.append(layer.getId()); + } + Toast.makeText(this, builder.toString(), Toast.LENGTH_LONG).show(); + } + private void setLayerInvisible() { String[] roadLayers = new String[] {"water"}; for (String roadLayer : roadLayers) { diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_runtime_style.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_runtime_style.xml index 7f49dc7ba..4b1f928d1 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_runtime_style.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_runtime_style.xml @@ -2,6 +2,10 @@ + > NativeMapView::queryRenderedFeaturesForBox(JNIE return *convert>, std::vector>(env, map->queryRenderedFeatures(box, layers)); } +jni::Array> NativeMapView::getLayers(JNIEnv& env) { + + // Get the core layers + std::vector layers = map->getLayers(); + + // Convert + jni::Array> jLayers = jni::Array>::New(env, layers.size(), Layer::javaClass); + int index = 0; + for (auto layer : layers) { + auto jLayer = jni::Object(createJavaLayerPeer(env, *map, *layer)); + jLayers.Set(env, index, jLayer); + jni::DeleteLocalRef(env, jLayer); + index++; + } + + return jLayers; +} + jni::Object NativeMapView::getLayer(JNIEnv& env, jni::String layerId) { // Find the layer @@ -1333,6 +1351,7 @@ void NativeMapView::registerNative(jni::JNIEnv& env) { METHOD(&NativeMapView::queryPointAnnotations, "nativeQueryPointAnnotations"), METHOD(&NativeMapView::queryRenderedFeaturesForPoint, "nativeQueryRenderedFeaturesForPoint"), METHOD(&NativeMapView::queryRenderedFeaturesForBox, "nativeQueryRenderedFeaturesForBox"), + METHOD(&NativeMapView::getLayers, "nativeGetLayers"), METHOD(&NativeMapView::getLayer, "nativeGetLayer"), METHOD(&NativeMapView::addLayer, "nativeAddLayer"), METHOD(&NativeMapView::removeLayerById, "nativeRemoveLayerById"), diff --git a/platform/android/src/native_map_view.hpp b/platform/android/src/native_map_view.hpp index b8a7a3914..fb6c7fa69 100755 --- a/platform/android/src/native_map_view.hpp +++ b/platform/android/src/native_map_view.hpp @@ -201,6 +201,8 @@ public: jni::Array> queryRenderedFeaturesForBox(JNIEnv&, jni::jfloat, jni::jfloat, jni::jfloat, jni::jfloat, jni::Array); + jni::Array> getLayers(JNIEnv&); + jni::Object getLayer(JNIEnv&, jni::String); void addLayer(JNIEnv&, jlong, jni::String);