summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortobrun <tobrun.van.nuland@gmail.com>2018-09-03 11:58:54 +0200
committertobrun <tobrun.van.nuland@gmail.com>2018-09-05 14:34:51 +0200
commitd196f527927f34fbca7c03a3023cd7c85e0aa59b (patch)
tree27dc261efee5353a0a3e58e8e7fa5844123ead7a
parent98a3c0aaba0cd94a3c0aa59836388429a04cbcd1 (diff)
downloadqtlocation-mapboxgl-upstream/tvn-remove-nunicode-2.tar.gz
[android] - add platform specific implementation of unaccentupstream/tvn-remove-nunicode-2
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/render/RenderTestActivity.java3
-rw-r--r--platform/android/config.cmake3
-rw-r--r--platform/android/core-files.txt2
-rw-r--r--platform/android/scripts/run-render-test.py2
-rw-r--r--platform/android/src/java/lang.cpp14
-rw-r--r--platform/android/src/java/lang.hpp12
-rwxr-xr-xplatform/android/src/jni.cpp2
-rw-r--r--platform/android/src/text/collator.cpp40
-rw-r--r--platform/android/src/text/collator_jni.hpp30
-rw-r--r--platform/android/src/unaccent.cpp20
10 files changed, 122 insertions, 6 deletions
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/render/RenderTestActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/render/RenderTestActivity.java
index e3c5254805..7bbaed192f 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/render/RenderTestActivity.java
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/render/RenderTestActivity.java
@@ -56,6 +56,7 @@ public class RenderTestActivity extends AppCompatActivity {
add("overlapping,raster-masking");
add("missing,raster-loading");
add("pitchAndBearing,line-pitch");
+ add("overdraw,sparse-tileset");
}
};
@@ -292,7 +293,7 @@ public class RenderTestActivity extends AppCompatActivity {
}
public void onLoadIgnoreList(List<String> ignoreList) {
- Timber.e("We loaded %s amount of tests to be ignored", ignoreList.size());
+ Timber.e("We loaded %s of tests to be ignored", ignoreList.size());
EXCLUDED_TESTS.addAll(ignoreList);
new LoadRenderDefinitionTask(this).execute();
}
diff --git a/platform/android/config.cmake b/platform/android/config.cmake
index 714d566bd8..954b4e8faa 100644
--- a/platform/android/config.cmake
+++ b/platform/android/config.cmake
@@ -1,7 +1,5 @@
set(USE_GLES2 ON)
-include(cmake/nunicode.cmake)
-
# Build thin archives.
set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> cruT <TARGET> <LINK_FLAGS> <OBJECTS>")
set(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> cruT <TARGET> <LINK_FLAGS> <OBJECTS>")
@@ -48,7 +46,6 @@ macro(mbgl_platform_core)
target_add_mason_package(mbgl-core PRIVATE icu)
target_link_libraries(mbgl-core
- PRIVATE nunicode
PUBLIC expected
PUBLIC -llog
PUBLIC -landroid
diff --git a/platform/android/core-files.txt b/platform/android/core-files.txt
index 9c314fad9f..7a2a94f84a 100644
--- a/platform/android/core-files.txt
+++ b/platform/android/core-files.txt
@@ -14,7 +14,7 @@ platform/android/src/thread.cpp
platform/android/src/string_util.cpp
platform/default/bidi.cpp
platform/default/thread_local.cpp
-platform/default/unaccent.cpp
+platform/android/src/unaccent.cpp
platform/default/unaccent.hpp
platform/default/utf.cpp
diff --git a/platform/android/scripts/run-render-test.py b/platform/android/scripts/run-render-test.py
index 1a7289a116..940ae7a3df 100644
--- a/platform/android/scripts/run-render-test.py
+++ b/platform/android/scripts/run-render-test.py
@@ -3,7 +3,7 @@
import os
import shutil
-catPath = os.getcwd() + "/platform/android/build/render-test/render/"
+catPath = os.getcwd() + "/platform/android/build/render-test/"
failCounter = 0
testCounter = 0
for cat in os.listdir(catPath):
diff --git a/platform/android/src/java/lang.cpp b/platform/android/src/java/lang.cpp
index 9e98410448..47bdc451c5 100644
--- a/platform/android/src/java/lang.cpp
+++ b/platform/android/src/java/lang.cpp
@@ -5,6 +5,15 @@ namespace android {
namespace java {
namespace lang {
+// CharSequence
+
+void CharSequence::registerNative(jni::JNIEnv &env) {
+ // Lookup the class
+ javaClass = *jni::Class<CharSequence>::Find(env).NewGlobalRef(env).release();
+}
+
+jni::Class<CharSequence> CharSequence::javaClass;
+
// String
jni::String String::toUpperCase(JNIEnv& env, jni::String value) {
@@ -17,6 +26,11 @@ jni::String String::toLowerCase(JNIEnv& env, jni::String value) {
return value.Call(env, method);
}
+jni::String String::replaceAll(JNIEnv& env, jni::String value, jni::String regex, jni::String replaceValue) {
+ static auto method = javaClass.GetMethod<jni::String (jni::String, jni::String)>(env, "replaceAll");
+ return value.Call(env, method, regex, replaceValue);
+}
+
void String::registerNative(jni::JNIEnv& env) {
// Lookup the class
javaClass = *jni::Class<jni::StringTag>::Find(env).NewGlobalRef(env).release();
diff --git a/platform/android/src/java/lang.hpp b/platform/android/src/java/lang.hpp
index 893d84dad1..0f3d650095 100644
--- a/platform/android/src/java/lang.hpp
+++ b/platform/android/src/java/lang.hpp
@@ -8,12 +8,24 @@ namespace android {
namespace java {
namespace lang {
+
+class CharSequence : private mbgl::util::noncopyable {
+public:
+ static constexpr auto Name() { return "java/lang/CharSequence"; };
+
+ static jni::Class<CharSequence> javaClass;
+
+ static void registerNative(jni::JNIEnv&);
+};
+
class String : private mbgl::util::noncopyable {
public:
static jni::String toUpperCase(JNIEnv&, jni::String);
static jni::String toLowerCase(JNIEnv&, jni::String);
+ static jni::String replaceAll(JNIEnv&, jni::String, jni::String, jni::String);
+
static jni::Class<jni::StringTag> javaClass;
static void registerNative(jni::JNIEnv&);
diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp
index af1df5282c..08f9b55689 100755
--- a/platform/android/src/jni.cpp
+++ b/platform/android/src/jni.cpp
@@ -121,6 +121,7 @@ void registerNatives(JavaVM *vm) {
java::lang::Double::registerNative(env);
java::lang::Long::registerNative(env);
java::lang::String::registerNative(env);
+ java::lang::CharSequence::registerNative(env);
// GeoJSON
geojson::Feature::registerNative(env);
@@ -194,6 +195,7 @@ void registerNatives(JavaVM *vm) {
LocalGlyphRasterizer::registerNative(env);
Locale::registerNative(env);
Collator::registerNative(env);
+ Normalizer::registerNative(env);
// Logger
Logger::registerNative(env);
diff --git a/platform/android/src/text/collator.cpp b/platform/android/src/text/collator.cpp
index 37af0a1c5b..1f795427ad 100644
--- a/platform/android/src/text/collator.cpp
+++ b/platform/android/src/text/collator.cpp
@@ -5,6 +5,7 @@
#include <unaccent.hpp>
#include <jni/jni.hpp>
+#include "src/java/lang.hpp"
#include "../attach_env.hpp"
#include "collator_jni.hpp"
@@ -36,6 +37,45 @@ jni::jint Collator::compare(jni::JNIEnv& env, jni::Object<Collator> collator, jn
return collator.Call(env, method, lhs, rhs);
}
+void Normalizer::Form::registerNative(jni::JNIEnv& env) {
+ javaClass = *jni::Class<Form>::Find(env).NewGlobalRef(env).release();
+}
+
+jni::Class<Normalizer::Form> Normalizer::Form::javaClass;
+
+jni::Object<Normalizer::Form> Normalizer::Form::create(jni::JNIEnv& env, Value value) {
+ switch (value) {
+ case NFC:
+ return javaClass.Get(env,
+ jni::StaticField<Form, jni::Object<Form>>(env, javaClass, "NFC"));
+ case NFKC:
+ return javaClass.Get(env,
+ jni::StaticField<Form, jni::Object<Form>>(env, javaClass, "NFKC"));
+ case NFD:
+ return javaClass.Get(env,
+ jni::StaticField<Form, jni::Object<Form>>(env, javaClass, "NFD"));
+ case NFKD:
+ return javaClass.Get(env,
+ jni::StaticField<Form, jni::Object<Form>>(env, javaClass, "NFKD"));
+ default:
+ throw std::runtime_error("invalid enum value for Normalizer.Form");
+ }
+}
+
+void Normalizer::registerNative(jni::JNIEnv& env) {
+ javaClass = *jni::Class<Normalizer>::Find(env).NewGlobalRef(env).release();
+ Form::registerNative(env);
+}
+
+jni::Class<Normalizer> Normalizer::javaClass;
+
+jni::String Normalizer::normalize(jni::JNIEnv& env, jni::String value) {
+ using Signature = jni::String(jni::Object<java::lang::CharSequence>,jni::Object<Normalizer::Form>);
+ auto charSequence = jni::Cast(env, value, java::lang::CharSequence::javaClass);
+ auto method = javaClass.GetStaticMethod<Signature>(env, "normalize");
+ return javaClass.Call(env, method, charSequence, Form::create(env, Form::NFD));
+}
+
void Locale::registerNative(jni::JNIEnv& env) {
javaClass = *jni::Class<Locale>::Find(env).NewGlobalRef(env).release();
}
diff --git a/platform/android/src/text/collator_jni.hpp b/platform/android/src/text/collator_jni.hpp
index 96c381b1c1..f40dc83f4e 100644
--- a/platform/android/src/text/collator_jni.hpp
+++ b/platform/android/src/text/collator_jni.hpp
@@ -53,5 +53,35 @@ public:
};
+class Normalizer {
+public:
+ class Form {
+ public:
+ static constexpr auto Name() { return "java/text/Normalizer$Form"; };
+
+ enum Value {
+ NFC,
+ NFD,
+ NFKC,
+ NFKD,
+ };
+
+ static jni::Object<Form> create(jni::JNIEnv&, Value);
+
+ static jni::Class<Form> javaClass;
+
+ static void registerNative(jni::JNIEnv&);
+ };
+
+ static constexpr auto Name() { return "java/text/Normalizer"; };
+
+ static jni::String normalize(jni::JNIEnv&, jni::String);
+
+ static jni::Class<Normalizer> javaClass;
+
+ static void registerNative(jni::JNIEnv&);
+
+};
+
} // namespace android
} // namespace mbgl
diff --git a/platform/android/src/unaccent.cpp b/platform/android/src/unaccent.cpp
new file mode 100644
index 0000000000..ad804b3aae
--- /dev/null
+++ b/platform/android/src/unaccent.cpp
@@ -0,0 +1,20 @@
+#include <unaccent.hpp>
+#include <string>
+#include <src/java/lang.hpp>
+#include "attach_env.hpp"
+#include "text/collator_jni.hpp"
+
+namespace mbgl {
+namespace platform {
+
+std::string unaccent(const std::string& str) {
+ android::UniqueEnv env = android::AttachEnv();
+ jni::String normalized = android::Normalizer::normalize(*env,jni::Make<jni::String>(*env, str));
+ jni::String unaccented = android::java::lang::String::replaceAll(*env, normalized,
+ jni::Make<jni::String>(*env, "\\p{InCombiningDiacriticalMarks}+"),
+ jni::Make<jni::String>(*env, ""));
+ return jni::Make<std::string>(*env, unaccented);
+}
+
+} // namespace platform
+} // namespace mbgl