summaryrefslogtreecommitdiff
path: root/platform/android/src
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/src')
-rw-r--r--platform/android/src/android_renderer_frontend.cpp9
-rw-r--r--platform/android/src/android_renderer_frontend.hpp10
-rw-r--r--platform/android/src/gson/json_element.cpp11
-rwxr-xr-xplatform/android/src/jni.cpp2
-rw-r--r--platform/android/src/math/math.cpp13
-rw-r--r--platform/android/src/math/math.hpp26
-rw-r--r--platform/android/src/style/sources/geojson_source.cpp52
-rw-r--r--platform/android/src/style/sources/geojson_source.hpp5
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&);