From d4149ea5f1d27685cbe2d19cccf67ff3ffdb613e Mon Sep 17 00:00:00 2001 From: Alexander Shalamov Date: Wed, 10 Apr 2019 22:19:16 +0300 Subject: [android] Generate style code for symbol-sort-key --- .../mapbox/mapboxsdk/style/layers/Property.java | 5 ++++ .../mapboxsdk/style/layers/PropertyFactory.java | 20 ++++++++++++++++ .../mapbox/mapboxsdk/style/layers/SymbolLayer.java | 16 +++++++++++++ .../mapboxsdk/testapp/style/SymbolLayerTest.java | 28 +++++++++++++++++++++- platform/android/src/style/layers/symbol_layer.cpp | 6 +++++ platform/android/src/style/layers/symbol_layer.hpp | 2 ++ 6 files changed, 76 insertions(+), 1 deletion(-) diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/Property.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/Property.java index 57cf6271c9..84285a1c54 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/Property.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/Property.java @@ -110,6 +110,10 @@ public final class Property { // SYMBOL_Z_ORDER: Controls the order in which overlapping symbols in the same layer are rendered + /** + * If {@link SYMBOL_SORT_KEY} is set, sort based on that. Otherwise sort symbols by their position relative to the viewport. + */ + public static final String SYMBOL_Z_ORDER_AUTO = "auto"; /** * Symbols will be sorted by their y-position relative to the viewport. */ @@ -123,6 +127,7 @@ public final class Property { * Controls the order in which overlapping symbols in the same layer are rendered */ @StringDef({ + SYMBOL_Z_ORDER_AUTO, SYMBOL_Z_ORDER_VIEWPORT_Y, SYMBOL_Z_ORDER_SOURCE, }) diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java index 01908b1b0b..43a1c8daac 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java @@ -1785,6 +1785,26 @@ public class PropertyFactory { return new LayoutPropertyValue<>("symbol-avoid-edges", value); } + /** + * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key wehn they overlap. Features with a lower sort key will have priority over other features when doing placement. + * + * @param value a Float value + * @return property wrapper around Float + */ + public static PropertyValue symbolSortKey(Float value) { + return new LayoutPropertyValue<>("symbol-sort-key", value); + } + + /** + * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key wehn they overlap. Features with a lower sort key will have priority over other features when doing placement. + * + * @param value a Float value + * @return property wrapper around Float + */ + public static PropertyValue symbolSortKey(Expression value) { + return new LayoutPropertyValue<>("symbol-sort-key", value); + } + /** * Controls the order in which overlapping symbols in the same layer are rendered * diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/SymbolLayer.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/SymbolLayer.java index 75473f0f30..1d8bad7e8e 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/SymbolLayer.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/SymbolLayer.java @@ -181,6 +181,18 @@ public class SymbolLayer extends Layer { return (PropertyValue) new PropertyValue("symbol-avoid-edges", nativeGetSymbolAvoidEdges()); } + /** + * Get the SymbolSortKey property + * + * @return property wrapper value around Float + */ + @NonNull + @SuppressWarnings("unchecked") + public PropertyValue getSymbolSortKey() { + checkThread(); + return (PropertyValue) new PropertyValue("symbol-sort-key", nativeGetSymbolSortKey()); + } + /** * Get the SymbolZOrder property * @@ -1113,6 +1125,10 @@ public class SymbolLayer extends Layer { @Keep private native Object nativeGetSymbolAvoidEdges(); + @NonNull + @Keep + private native Object nativeGetSymbolSortKey(); + @NonNull @Keep private native Object nativeGetSymbolZOrder(); diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/style/SymbolLayerTest.java b/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/style/SymbolLayerTest.java index ae2c6d98f6..4674c9ffb1 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/style/SymbolLayerTest.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/style/SymbolLayerTest.java @@ -140,6 +140,32 @@ public class SymbolLayerTest extends BaseLayerTest { assertEquals(layer.getSymbolAvoidEdges().getValue(), propertyValue); } + @Test + @UiThreadTest + public void testSymbolSortKeyAsConstant() { + Timber.i("symbol-sort-key"); + assertNotNull(layer); + assertNull(layer.getSymbolSortKey().getValue()); + + // Set and Get + Float propertyValue = 0.3f; + layer.setProperties(symbolSortKey(propertyValue)); + assertEquals(layer.getSymbolSortKey().getValue(), propertyValue); + } + + @Test + @UiThreadTest + public void testSymbolSortKeyAsExpression() { + Timber.i("symbol-sort-key-expression"); + assertNotNull(layer); + assertNull(layer.getSymbolSortKey().getExpression()); + + // Set and Get + Expression expression = number(Expression.get("undefined")); + layer.setProperties(symbolSortKey(expression)); + assertEquals(layer.getSymbolSortKey().getExpression(), expression); + } + @Test @UiThreadTest public void testSymbolZOrderAsConstant() { @@ -148,7 +174,7 @@ public class SymbolLayerTest extends BaseLayerTest { assertNull(layer.getSymbolZOrder().getValue()); // Set and Get - String propertyValue = SYMBOL_Z_ORDER_VIEWPORT_Y; + String propertyValue = SYMBOL_Z_ORDER_AUTO; layer.setProperties(symbolZOrder(propertyValue)); assertEquals(layer.getSymbolZOrder().getValue(), propertyValue); } diff --git a/platform/android/src/style/layers/symbol_layer.cpp b/platform/android/src/style/layers/symbol_layer.cpp index 810848e9cb..fb06255913 100644 --- a/platform/android/src/style/layers/symbol_layer.cpp +++ b/platform/android/src/style/layers/symbol_layer.cpp @@ -56,6 +56,11 @@ namespace android { return std::move(*convert>>(env, toSymbolLayer(layer).getSymbolAvoidEdges())); } + jni::Local> SymbolLayer::getSymbolSortKey(jni::JNIEnv& env) { + using namespace mbgl::android::conversion; + return std::move(*convert>>(env, toSymbolLayer(layer).getSymbolSortKey())); + } + jni::Local> SymbolLayer::getSymbolZOrder(jni::JNIEnv& env) { using namespace mbgl::android::conversion; return std::move(*convert>>(env, toSymbolLayer(layer).getSymbolZOrder())); @@ -500,6 +505,7 @@ namespace android { METHOD(&SymbolLayer::getSymbolPlacement, "nativeGetSymbolPlacement"), METHOD(&SymbolLayer::getSymbolSpacing, "nativeGetSymbolSpacing"), METHOD(&SymbolLayer::getSymbolAvoidEdges, "nativeGetSymbolAvoidEdges"), + METHOD(&SymbolLayer::getSymbolSortKey, "nativeGetSymbolSortKey"), METHOD(&SymbolLayer::getSymbolZOrder, "nativeGetSymbolZOrder"), METHOD(&SymbolLayer::getIconAllowOverlap, "nativeGetIconAllowOverlap"), METHOD(&SymbolLayer::getIconIgnorePlacement, "nativeGetIconIgnorePlacement"), diff --git a/platform/android/src/style/layers/symbol_layer.hpp b/platform/android/src/style/layers/symbol_layer.hpp index 3b0f8ee5d1..d2ced89191 100644 --- a/platform/android/src/style/layers/symbol_layer.hpp +++ b/platform/android/src/style/layers/symbol_layer.hpp @@ -32,6 +32,8 @@ public: jni::Local> getSymbolAvoidEdges(jni::JNIEnv&); + jni::Local> getSymbolSortKey(jni::JNIEnv&); + jni::Local> getSymbolZOrder(jni::JNIEnv&); jni::Local> getIconAllowOverlap(jni::JNIEnv&); -- cgit v1.2.1