diff options
author | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2019-06-18 14:43:13 +0300 |
---|---|---|
committer | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2019-08-13 13:32:56 +0300 |
commit | dad43ba8fcd04698230fefa9c6af93931f6c10f3 (patch) | |
tree | 3af84d15a40193e5f23870dd56135324e233e670 | |
parent | e9ca844d666619886141d7dd8ef943e86f4f55e4 (diff) |
[android] Android bindings for new 'text-writing-mode' layout property
7 files changed, 88 insertions, 1 deletions
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 8ffcf6ddb..52ed6c23a 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 @@ -669,6 +669,27 @@ public final class Property { @Retention(RetentionPolicy.SOURCE) public @interface ANCHOR {} + // TEXT_WRITING_MODE: The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. The order of elements in an array define priority order for the placement of an orientation variant. + + /** + * If a text's language supports horizontal writing mode, symbols with point placement would be laid out horizontally. + */ + public static final String TEXT_WRITING_MODE_HORIZONTAL = "horizontal"; + /** + * If a text's language supports vertical writing mode, symbols with point placement would be laid out vertically. + */ + public static final String TEXT_WRITING_MODE_VERTICAL = "vertical"; + + /** + * The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. The order of elements in an array define priority order for the placement of an orientation variant. + */ + @StringDef({ + TEXT_WRITING_MODE_HORIZONTAL, + TEXT_WRITING_MODE_VERTICAL, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface TEXT_WRITING_MODE {} + private Property() { } 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 3f2771a30..82085b171 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 @@ -2376,6 +2376,26 @@ public class PropertyFactory { } /** + * The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. The order of elements in an array define priority order for the placement of an orientation variant. + * + * @param value a String[] value + * @return property wrapper around String[] + */ + public static PropertyValue<String[]> textWritingMode(String[] value) { + return new LayoutPropertyValue<>("text-writing-mode", value); + } + + /** + * The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. The order of elements in an array define priority order for the placement of an orientation variant. + * + * @param value a String[] value + * @return property wrapper around String[] + */ + public static PropertyValue<Expression> textWritingMode(Expression value) { + return new LayoutPropertyValue<>("text-writing-mode", value); + } + + /** * Rotates the text clockwise. * * @param value a Float value 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 1d8bad7e8..5ab47def4 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 @@ -530,6 +530,18 @@ public class SymbolLayer extends Layer { } /** + * Get the TextWritingMode property + * + * @return property wrapper value around String[] + */ + @NonNull + @SuppressWarnings("unchecked") + public PropertyValue<String[]> getTextWritingMode() { + checkThread(); + return (PropertyValue<String[]>) new PropertyValue("text-writing-mode", nativeGetTextWritingMode()); + } + + /** * Get the TextRotate property * * @return property wrapper value around Float @@ -1243,6 +1255,10 @@ public class SymbolLayer extends Layer { @NonNull @Keep + private native Object nativeGetTextWritingMode(); + + @NonNull + @Keep private native Object nativeGetTextRotate(); @NonNull 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 60e305d60..c65e37019 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 @@ -670,6 +670,19 @@ public class SymbolLayerTest extends BaseLayerTest { @Test @UiThreadTest + public void testTextWritingModeAsConstant() { + Timber.i("text-writing-mode"); + assertNotNull(layer); + assertNull(layer.getTextWritingMode().getValue()); + + // Set and Get + String[] propertyValue = new String[0]; + layer.setProperties(textWritingMode(propertyValue)); + assertEquals(layer.getTextWritingMode().getValue(), propertyValue); + } + + @Test + @UiThreadTest public void testTextRotateAsConstant() { Timber.i("text-rotate"); assertNotNull(layer); diff --git a/platform/android/scripts/generate-style-code.js b/platform/android/scripts/generate-style-code.js index 8c34113de..fa814f89a 100755 --- a/platform/android/scripts/generate-style-code.js +++ b/platform/android/scripts/generate-style-code.js @@ -49,10 +49,19 @@ var layers = Object.keys(spec.layer.type.values).map((type) => { }); // Process all layer properties +const uniqueArrayEnum = (prop, enums) => { + if (prop.value !== 'enum') return false; + const enumsEqual = (val1, val2) => val1.length === val1.length && val1.every((val, i) => val === val2[i]); + return enums.filter(e => enumsEqual(Object.keys(prop.values).sort(), Object.keys(e.values).sort())).length == 0; +}; + const layoutProperties = _(layers).map('layoutProperties').flatten().value(); const paintProperties = _(layers).map('paintProperties').flatten().value(); const allProperties = _(layoutProperties).union(paintProperties).union(lightProperties).value(); -const enumProperties = _(allProperties).filter({'type': 'enum'}).value(); +let allEnumProperties = _(allProperties).filter({'type': 'enum'}).value(); +const uniqueArrayEnumProperties = _(allProperties).filter({'type': 'array'}).filter(prop => uniqueArrayEnum(prop, allEnumProperties)).value(); +const enumProperties = _(allEnumProperties).union(uniqueArrayEnumProperties).value(); + global.propertyType = function propertyType(property) { switch (property.type) { diff --git a/platform/android/src/style/layers/symbol_layer.cpp b/platform/android/src/style/layers/symbol_layer.cpp index fb0625591..53b35a9a1 100644 --- a/platform/android/src/style/layers/symbol_layer.cpp +++ b/platform/android/src/style/layers/symbol_layer.cpp @@ -201,6 +201,11 @@ namespace android { return std::move(*convert<jni::Local<jni::Object<>>>(env, toSymbolLayer(layer).getTextMaxAngle())); } + jni::Local<jni::Object<>> SymbolLayer::getTextWritingMode(jni::JNIEnv& env) { + using namespace mbgl::android::conversion; + return std::move(*convert<jni::Local<jni::Object<>>>(env, toSymbolLayer(layer).getTextWritingMode())); + } + jni::Local<jni::Object<>> SymbolLayer::getTextRotate(jni::JNIEnv& env) { using namespace mbgl::android::conversion; return std::move(*convert<jni::Local<jni::Object<>>>(env, toSymbolLayer(layer).getTextRotate())); @@ -534,6 +539,7 @@ namespace android { METHOD(&SymbolLayer::getTextVariableAnchor, "nativeGetTextVariableAnchor"), METHOD(&SymbolLayer::getTextAnchor, "nativeGetTextAnchor"), METHOD(&SymbolLayer::getTextMaxAngle, "nativeGetTextMaxAngle"), + METHOD(&SymbolLayer::getTextWritingMode, "nativeGetTextWritingMode"), METHOD(&SymbolLayer::getTextRotate, "nativeGetTextRotate"), METHOD(&SymbolLayer::getTextPadding, "nativeGetTextPadding"), METHOD(&SymbolLayer::getTextKeepUpright, "nativeGetTextKeepUpright"), diff --git a/platform/android/src/style/layers/symbol_layer.hpp b/platform/android/src/style/layers/symbol_layer.hpp index d2ced8919..9e494e678 100644 --- a/platform/android/src/style/layers/symbol_layer.hpp +++ b/platform/android/src/style/layers/symbol_layer.hpp @@ -90,6 +90,8 @@ public: jni::Local<jni::Object<jni::ObjectTag>> getTextMaxAngle(jni::JNIEnv&); + jni::Local<jni::Object<jni::ObjectTag>> getTextWritingMode(jni::JNIEnv&); + jni::Local<jni::Object<jni::ObjectTag>> getTextRotate(jni::JNIEnv&); jni::Local<jni::Object<jni::ObjectTag>> getTextPadding(jni::JNIEnv&); |