summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortobrun <tobrun.van.nuland@gmail.com>2018-07-27 14:00:55 +0200
committerTobrun <tobrun.van.nuland@gmail.com>2018-08-29 20:34:40 +0200
commit98a3c0aaba0cd94a3c0aa59836388429a04cbcd1 (patch)
tree57322043f7c7b17410ce63e4d57aac3f67cbd7d1
parent4061e9026e0a90c10f1f2cc77322e05ac8a45cf8 (diff)
downloadqtlocation-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.java50
-rw-r--r--platform/android/core-files.txt2
-rw-r--r--platform/android/src/java/lang.cpp19
-rw-r--r--platform/android/src/java/lang.hpp11
-rwxr-xr-xplatform/android/src/jni.cpp1
-rw-r--r--platform/android/src/string_util.cpp21
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