diff options
author | tobrun <tobrun.van.nuland@gmail.com> | 2018-07-27 14:00:55 +0200 |
---|---|---|
committer | Tobrun <tobrun.van.nuland@gmail.com> | 2018-08-29 20:34:40 +0200 |
commit | 98a3c0aaba0cd94a3c0aa59836388429a04cbcd1 (patch) | |
tree | 57322043f7c7b17410ce63e4d57aac3f67cbd7d1 | |
parent | 4061e9026e0a90c10f1f2cc77322e05ac8a45cf8 (diff) | |
download | qtlocation-mapboxgl-98a3c0aaba0cd94a3c0aa59836388429a04cbcd1.tar.gz |
[android] - replace platform default implementation using nunicode for uppercasing an lowercasing with an Android specific String.java equivalent
-rw-r--r-- | platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/string/UppperLowerCaseTest.java | 50 | ||||
-rw-r--r-- | platform/android/core-files.txt | 2 | ||||
-rw-r--r-- | platform/android/src/java/lang.cpp | 19 | ||||
-rw-r--r-- | platform/android/src/java/lang.hpp | 11 | ||||
-rwxr-xr-x | platform/android/src/jni.cpp | 1 | ||||
-rw-r--r-- | platform/android/src/string_util.cpp | 21 |
6 files changed, 103 insertions, 1 deletions
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/string/UppperLowerCaseTest.java b/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/string/UppperLowerCaseTest.java new file mode 100644 index 0000000000..f5b4586a86 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/string/UppperLowerCaseTest.java @@ -0,0 +1,50 @@ +package com.mapbox.mapboxsdk.testapp.string; + +import com.mapbox.mapboxsdk.testapp.activity.BaseActivityTest; +import com.mapbox.mapboxsdk.testapp.activity.espresso.EspressoTestActivity; +import org.junit.Test; + +import static junit.framework.Assert.assertEquals; + +/** + * Test verifying if String#toUpperCase and String#toLowerCase produces desired results + * <p> + * See core test in https://github.com/mapbox/mapbox-gl-native/blob/master/test/util/text_conversions.test.cpp + * </p> + */ +public class UppperLowerCaseTest extends BaseActivityTest { + + @Override + protected Class getActivityClass() { + return EspressoTestActivity.class; + } + + @Test + public void testToUpperCase() { + assertEquals("STREET", "strEEt".toUpperCase()); // EN + assertEquals("ROAD", "rOAd".toUpperCase()); // EN + + assertEquals("STRASSE", "straße".toUpperCase()); // DE + assertEquals("MASSE", "maße".toUpperCase()); // DE + assertEquals("WEISSKOPFSEEADLER", "weißkopfseeadler".toUpperCase()); // DE + + assertEquals("BÊNÇÃO", "bênção".toUpperCase()); // PT + assertEquals("AZƏRBAYCAN", "Azərbaycan".toUpperCase()); // AZ + assertEquals("ὈΔΥΣΣΕΎΣ", "Ὀδυσσεύς".toUpperCase()); // GR + } + + @Test + public void testToLowerCase() { + assertEquals("street", "strEEt".toLowerCase()); // EN + assertEquals("road", "rOAd".toLowerCase()); // EN + + assertEquals("straße", "Straße".toLowerCase()); // DE + assertEquals("strasse", "STRASSE".toLowerCase()); // DE + assertEquals("masse", "MASSE".toLowerCase()); // DE + assertEquals("weisskopfseeadler", "weiSSkopfseeadler".toLowerCase()); // DE + + assertEquals("bênção", "BÊNÇÃO".toLowerCase()); // PT + assertEquals("azərbaycan", "AZƏRBAYCAN".toLowerCase()); // + } + +} diff --git a/platform/android/core-files.txt b/platform/android/core-files.txt index eca7529c0b..9c314fad9f 100644 --- a/platform/android/core-files.txt +++ b/platform/android/core-files.txt @@ -11,7 +11,7 @@ platform/android/src/text/local_glyph_rasterizer.cpp platform/android/src/text/local_glyph_rasterizer_jni.hpp platform/android/src/logging_android.cpp platform/android/src/thread.cpp -platform/default/string_stdlib.cpp +platform/android/src/string_util.cpp platform/default/bidi.cpp platform/default/thread_local.cpp platform/default/unaccent.cpp diff --git a/platform/android/src/java/lang.cpp b/platform/android/src/java/lang.cpp index 3c95737169..9e98410448 100644 --- a/platform/android/src/java/lang.cpp +++ b/platform/android/src/java/lang.cpp @@ -5,6 +5,25 @@ namespace android { namespace java { namespace lang { +// String + +jni::String String::toUpperCase(JNIEnv& env, jni::String value) { + static auto method = javaClass.GetMethod<jni::String ()>(env, "toUpperCase"); + return value.Call(env, method); +} + +jni::String String::toLowerCase(JNIEnv& env, jni::String value) { + static auto method = javaClass.GetMethod<jni::String ()>(env, "toLowerCase"); + return value.Call(env, method); +} + +void String::registerNative(jni::JNIEnv& env) { + // Lookup the class + javaClass = *jni::Class<jni::StringTag>::Find(env).NewGlobalRef(env).release(); +} + +jni::Class<jni::StringTag> String::javaClass; + // Float jni::Object<Float> Float::valueOf(JNIEnv &env, jfloat value) { diff --git a/platform/android/src/java/lang.hpp b/platform/android/src/java/lang.hpp index 981e3b14b7..893d84dad1 100644 --- a/platform/android/src/java/lang.hpp +++ b/platform/android/src/java/lang.hpp @@ -8,6 +8,17 @@ namespace android { namespace java { namespace lang { +class String : private mbgl::util::noncopyable { +public: + static jni::String toUpperCase(JNIEnv&, jni::String); + + static jni::String toLowerCase(JNIEnv&, jni::String); + + static jni::Class<jni::StringTag> javaClass; + + static void registerNative(jni::JNIEnv&); +}; + class Float : private mbgl::util::noncopyable { public: static constexpr auto Name() { return "java/lang/Float"; }; diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp index 872d8bc89a..af1df5282c 100755 --- a/platform/android/src/jni.cpp +++ b/platform/android/src/jni.cpp @@ -120,6 +120,7 @@ void registerNatives(JavaVM *vm) { java::lang::Boolean::registerNative(env); java::lang::Double::registerNative(env); java::lang::Long::registerNative(env); + java::lang::String::registerNative(env); // GeoJSON geojson::Feature::registerNative(env); diff --git a/platform/android/src/string_util.cpp b/platform/android/src/string_util.cpp new file mode 100644 index 0000000000..6100104959 --- /dev/null +++ b/platform/android/src/string_util.cpp @@ -0,0 +1,21 @@ +#include <mbgl/util/platform.hpp> +#include "java/lang.hpp" +#include "attach_env.hpp" + +namespace mbgl { +namespace platform { + +std::string uppercase(const std::string& str) { + auto env{ android::AttachEnv() }; + auto jstring = jni::Make<jni::String>(*env, str.c_str()); + return jni::Make<std::string>(*env, mbgl::android::java::lang::String::toUpperCase(*env, jstring)); +} + +std::string lowercase(const std::string& str) { + auto env{ android::AttachEnv() }; + auto jstring = jni::Make<jni::String>(*env, str.c_str()); + return jni::Make<std::string>(*env, mbgl::android::java::lang::String::toLowerCase(*env, jstring)); +} + +} // namespace platform +} // namespace mbgl |