diff options
Diffstat (limited to 'platform/android/src')
-rw-r--r-- | platform/android/src/android_renderer_frontend.cpp | 9 | ||||
-rw-r--r-- | platform/android/src/android_renderer_frontend.hpp | 10 | ||||
-rw-r--r-- | platform/android/src/gson/json_element.cpp | 11 | ||||
-rwxr-xr-x | platform/android/src/jni.cpp | 2 | ||||
-rw-r--r-- | platform/android/src/math/math.cpp | 13 | ||||
-rw-r--r-- | platform/android/src/math/math.hpp | 26 | ||||
-rw-r--r-- | platform/android/src/style/sources/geojson_source.cpp | 52 | ||||
-rw-r--r-- | platform/android/src/style/sources/geojson_source.hpp | 5 |
8 files changed, 126 insertions, 2 deletions
diff --git a/platform/android/src/android_renderer_frontend.cpp b/platform/android/src/android_renderer_frontend.cpp index 8b4a25a4d9..295ed1766b 100644 --- a/platform/android/src/android_renderer_frontend.cpp +++ b/platform/android/src/android_renderer_frontend.cpp @@ -7,6 +7,7 @@ #include <mbgl/util/async_task.hpp> #include <mbgl/util/thread.hpp> #include <mbgl/util/run_loop.hpp> +#include <mbgl/util/geojson.hpp> #include "android_renderer_backend.hpp" @@ -122,6 +123,14 @@ AnnotationIDs AndroidRendererFrontend::queryShapeAnnotations(const ScreenBox& bo return mapRenderer.actor().ask(&Renderer::queryShapeAnnotations, box).get(); } +FeatureExtensionValue AndroidRendererFrontend::queryFeatureExtensions(const std::string& sourceID, + const Feature& feature, + const std::string& extension, + const std::string& extensionField, + const optional<std::map<std::string, mbgl::Value>>& args) const { + return mapRenderer.actor().ask(&Renderer::queryFeatureExtensions, sourceID, feature, extension, extensionField, args).get(); +} + } // namespace android } // namespace mbgl diff --git a/platform/android/src/android_renderer_frontend.hpp b/platform/android/src/android_renderer_frontend.hpp index 9bd64e4819..dc5f11e57e 100644 --- a/platform/android/src/android_renderer_frontend.hpp +++ b/platform/android/src/android_renderer_frontend.hpp @@ -10,6 +10,7 @@ #include <memory> #include <vector> #include <string> +#include <mbgl/util/geojson.hpp> #include "map_renderer.hpp" @@ -44,6 +45,15 @@ public: AnnotationIDs queryPointAnnotations(const ScreenBox& box) const; AnnotationIDs queryShapeAnnotations(const ScreenBox& box) const; + + // Feature extension query + FeatureExtensionValue + queryFeatureExtensions(const std::string& sourceID, + const Feature& feature, + const std::string& extension, + const std::string& extensionField, + const optional<std::map<std::string, mbgl::Value>>& args) const; + // Memory void reduceMemoryUse(); diff --git a/platform/android/src/gson/json_element.cpp b/platform/android/src/gson/json_element.cpp index 7c9a34c03c..405efe71ca 100644 --- a/platform/android/src/gson/json_element.cpp +++ b/platform/android/src/gson/json_element.cpp @@ -2,6 +2,7 @@ #include "json_array.hpp" #include "json_object.hpp" #include "json_primitive.hpp" +#include "../math/math.hpp" namespace mbgl { namespace android { @@ -58,13 +59,21 @@ mbgl::Value JsonElement::convert(jni::JNIEnv &env, const jni::Object<JsonElement static auto getAsBoolean = primitiveClass.GetMethod<jni::jboolean ()>(env, "getAsBoolean"); static auto getAsString = primitiveClass.GetMethod<jni::String ()>(env, "getAsString"); static auto getAsDouble = primitiveClass.GetMethod<jni::jdouble ()>(env, "getAsDouble"); + static auto getAsInteger = primitiveClass.GetMethod<jni::jint ()>(env, "getAsInt"); if (jsonElement.Call(env, isJsonPrimitive)) { auto primitive = jni::Cast(env, primitiveClass, jsonElement); if (primitive.Call(env, isBoolean)) { return bool(primitive.Call(env, getAsBoolean)); } else if (primitive.Call(env, isNumber)) { - return primitive.Call(env, getAsDouble); // TODO: how to differentiate types here? + auto value = primitive.Call(env, getAsDouble); + if (value == math::Math::rint(env, value)) { + // uint64_t + return static_cast<uint64_t>(primitive.Call(env, getAsInteger)); + } else { + // double + return value; + } } else if (primitive.Call(env, isString)) { return jni::Make<std::string>(env, primitive.Call(env, getAsString)); } else { diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp index 45b3e02252..bd66ca3b18 100755 --- a/platform/android/src/jni.cpp +++ b/platform/android/src/jni.cpp @@ -51,6 +51,7 @@ #include "text/collator_jni.hpp" #include "text/local_glyph_rasterizer_jni.hpp" #include "logger.hpp" +#include "math/math.hpp" namespace mbgl { namespace android { @@ -114,6 +115,7 @@ void registerNatives(JavaVM *vm) { // Basic types java::registerNatives(env); java::util::registerNative(env); + math::registerNative(env); PointF::registerNative(env); RectF::registerNative(env); diff --git a/platform/android/src/math/math.cpp b/platform/android/src/math/math.cpp new file mode 100644 index 0000000000..17d34caacb --- /dev/null +++ b/platform/android/src/math/math.cpp @@ -0,0 +1,13 @@ +#include "math.hpp" + +namespace mbgl { +namespace android { +namespace math { + +void registerNative(jni::JNIEnv& env) { + jni::Class<Math>::Singleton(env); +} + +} // namespace math +} // namespace android +} // namespace mbgl
\ No newline at end of file diff --git a/platform/android/src/math/math.hpp b/platform/android/src/math/math.hpp new file mode 100644 index 0000000000..c6a8549f10 --- /dev/null +++ b/platform/android/src/math/math.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include <mbgl/util/noncopyable.hpp> + +#include <jni/jni.hpp> + +namespace mbgl { +namespace android { +namespace math { + +class Math : private mbgl::util::noncopyable { +public: + static constexpr auto Name() { return "java/lang/Math"; }; + + static jni::jdouble rint(jni::JNIEnv& env, const jni::jdouble value) { + static auto& javaClass = jni::Class<Math>::Singleton(env); + static auto method = javaClass.GetStaticMethod<jni::jdouble (jni::jdouble)>(env, "rint"); + return javaClass.Call(env, method, value); + }; +}; + +void registerNative(jni::JNIEnv&); + +} // namespace math +} // namespace android +} // namespace mbgl
\ No newline at end of file diff --git a/platform/android/src/style/sources/geojson_source.cpp b/platform/android/src/style/sources/geojson_source.cpp index d0ad5fb699..f213cbbad8 100644 --- a/platform/android/src/style/sources/geojson_source.cpp +++ b/platform/android/src/style/sources/geojson_source.cpp @@ -108,6 +108,53 @@ namespace android { return Feature::convert(env, features); } + jni::Local<jni::Array<jni::Object<geojson::Feature>>> GeoJSONSource::getClusterChildren(jni::JNIEnv& env, const jni::Object<geojson::Feature>& feature) { + using namespace mbgl::android::conversion; + using namespace mbgl::android::geojson; + + if (rendererFrontend) { + mbgl::Feature _feature = Feature::convert(env, feature); + const auto featureExtension = rendererFrontend->queryFeatureExtensions(source.getID(), _feature, "supercluster", "children", {}); + if (featureExtension.is<mbgl::FeatureCollection>()) { + return Feature::convert(env, featureExtension.get<mbgl::FeatureCollection>()); + } + } + return jni::Array<jni::Object<Feature>>::New(env, 0); + } + + jni::Local<jni::Array<jni::Object<geojson::Feature>>> GeoJSONSource::getClusterLeaves(jni::JNIEnv& env, const jni::Object<geojson::Feature>& feature, jni::jlong limit, jni::jlong offset) { + using namespace mbgl::android::conversion; + using namespace mbgl::android::geojson; + + if (rendererFrontend) { + mbgl::Feature _feature = Feature::convert(env, feature); + const std::map<std::string, mbgl::Value> options = { {"limit", static_cast<uint64_t>(limit)}, + {"offset", static_cast<uint64_t>(offset)} }; + auto featureExtension = rendererFrontend->queryFeatureExtensions(source.getID(), _feature, "supercluster", "leaves", options); + if (featureExtension.is<mbgl::FeatureCollection>()) { + return Feature::convert(env, featureExtension.get<mbgl::FeatureCollection>()); + } + } + return jni::Array<jni::Object<Feature>>::New(env, 0);; + } + + jint GeoJSONSource::getClusterExpansionZoom(jni::JNIEnv& env, const jni::Object<geojson::Feature>& feature) { + using namespace mbgl::android::conversion; + using namespace mbgl::android::geojson; + + if (rendererFrontend) { + mbgl::Feature _feature = Feature::convert(env, feature); + auto featureExtension = rendererFrontend->queryFeatureExtensions(source.getID(), _feature, "supercluster", "expansion-zoom", {}); + if (featureExtension.is<mbgl::Value>()) { + auto value = featureExtension.get<mbgl::Value>(); + if (value.is<uint64_t>()) { + return value.get<uint64_t>(); + } + } + } + return 0; + } + jni::Local<jni::Object<Source>> GeoJSONSource::createJavaPeer(jni::JNIEnv& env) { static auto& javaClass = jni::Class<GeoJSONSource>::Singleton(env); static auto constructor = javaClass.GetConstructor<jni::jlong>(env); @@ -176,7 +223,10 @@ namespace android { METHOD(&GeoJSONSource::setGeometry, "nativeSetGeometry"), METHOD(&GeoJSONSource::setURL, "nativeSetUrl"), METHOD(&GeoJSONSource::getURL, "nativeGetUrl"), - METHOD(&GeoJSONSource::querySourceFeatures, "querySourceFeatures") + METHOD(&GeoJSONSource::querySourceFeatures, "querySourceFeatures"), + METHOD(&GeoJSONSource::getClusterChildren, "nativeGetClusterChildren"), + METHOD(&GeoJSONSource::getClusterLeaves, "nativeGetClusterLeaves"), + METHOD(&GeoJSONSource::getClusterExpansionZoom, "nativeGetClusterExpansionZoom") ); } diff --git a/platform/android/src/style/sources/geojson_source.hpp b/platform/android/src/style/sources/geojson_source.hpp index 20e8b6873b..e737e41924 100644 --- a/platform/android/src/style/sources/geojson_source.hpp +++ b/platform/android/src/style/sources/geojson_source.hpp @@ -5,6 +5,7 @@ #include "../../geojson/geometry.hpp" #include "../../geojson/feature.hpp" #include "../../geojson/feature_collection.hpp" +#include "../../android_renderer_frontend.hpp" #include <jni/jni.hpp> namespace mbgl { @@ -49,6 +50,10 @@ private: jni::Local<jni::Array<jni::Object<geojson::Feature>>> querySourceFeatures(jni::JNIEnv&, const jni::Array<jni::Object<>>&); + jni::Local<jni::Array<jni::Object<geojson::Feature>>> getClusterChildren(jni::JNIEnv&, const jni::Object<geojson::Feature>&); + jni::Local<jni::Array<jni::Object<geojson::Feature>>> getClusterLeaves(jni::JNIEnv&, const jni::Object<geojson::Feature>&, jni::jlong, jni::jlong); + jint getClusterExpansionZoom(jni::JNIEnv&, const jni::Object<geojson::Feature>&); + jni::Local<jni::String> getURL(jni::JNIEnv&); jni::Local<jni::Object<Source>> createJavaPeer(jni::JNIEnv&); |