summaryrefslogtreecommitdiff
path: root/platform/android/src/snapshotter/map_snapshotter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/src/snapshotter/map_snapshotter.cpp')
-rw-r--r--platform/android/src/snapshotter/map_snapshotter.cpp56
1 files changed, 55 insertions, 1 deletions
diff --git a/platform/android/src/snapshotter/map_snapshotter.cpp b/platform/android/src/snapshotter/map_snapshotter.cpp
index 155fdf81fb..8e0faf5cde 100644
--- a/platform/android/src/snapshotter/map_snapshotter.cpp
+++ b/platform/android/src/snapshotter/map_snapshotter.cpp
@@ -7,6 +7,15 @@
#include <mbgl/util/string.hpp>
#include <mbgl/actor/scheduler.hpp>
+#include "../style/android_conversion.hpp"
+#include <mbgl/style/conversion.hpp>
+#include <mbgl/style/conversion/filter.hpp>
+
+#include "../conversion/conversion.hpp"
+#include "../conversion/collection.hpp"
+#include "../style/conversion/filter.hpp"
+#include "../geojson/conversion/feature.hpp"
+
#include "../attach_env.hpp"
#include "map_snapshot.hpp"
@@ -75,7 +84,7 @@ void MapSnapshotter::start(JNIEnv& env) {
MBGL_VERIFY_THREAD(tid);
activateFilesource(env);
- snapshotCallback = std::make_unique<Actor<mbgl::MapSnapshotter::Callback>>(
+ snapshotCallback = std::make_unique<Actor<mbgl::MapSnapshotter::SnapshotCallback>>(
*Scheduler::GetCurrent(),
[this](std::exception_ptr err, PremultipliedImage image, std::vector<std::string> attributions, mbgl::MapSnapshotter::PointForFn pointForFn) {
MBGL_VERIFY_THREAD(tid);
@@ -102,6 +111,50 @@ void MapSnapshotter::start(JNIEnv& env) {
snapshotter->snapshot(snapshotCallback->self());
}
+void MapSnapshotter::queryFeatures(JNIEnv& env, jni::jfloat left, jni::jfloat top,
+ jni::jfloat right, jni::jfloat bottom, jni::Array<jni::String> layerIds,
+ jni::Array<jni::Object<>> jfilter) {
+ MBGL_VERIFY_THREAD(tid);
+ activateFilesource(env);
+
+ using namespace mbgl::android::conversion;
+ using namespace mbgl::android::geojson;
+
+ queryFeaturesCallback = std::make_unique<Actor<mbgl::MapSnapshotter::QueryFeaturesCallback>>(
+ *Scheduler::GetCurrent(),
+ [this](std::exception_ptr err, const std::vector<mbgl::Feature> features) {
+ MBGL_VERIFY_THREAD(tid);
+ android::UniqueEnv _env = android::AttachEnv();
+
+ using namespace mbgl::android::conversion;
+ using namespace mbgl::android::geojson;
+
+ // todo add error handling
+ if (!err) {
+ // invoke callback
+ static auto onQueryFeaturesReady = javaClass.GetMethod<void (jni::Array<jni::Object<geojson::Feature>>)>(*_env, "onQueryFeaturesReady");
+ jni::Array<jni::Object<geojson::Feature>> featureArray =
+ *convert<jni::Array<jni::Object<geojson::Feature>>, std::vector<mbgl::Feature>>(*_env, features);
+
+ javaPeer->Call(*_env,
+ onQueryFeaturesReady,
+ featureArray);
+ }
+ }
+ );
+
+ mbgl::optional<std::vector<std::string>> layers;
+ if (layerIds != nullptr && layerIds.Length(env) > 0) {
+ layers = toVector(env, layerIds);
+ }
+ mapbox::geometry::box<double> box = {
+ mapbox::geometry::point<double>{ left, top},
+ mapbox::geometry::point<double>{ right, bottom }
+ };
+
+ snapshotter->queryFeatures(queryFeaturesCallback->self(), box, { layers, toFilter(env, jfilter) });
+}
+
void MapSnapshotter::cancel(JNIEnv& env) {
MBGL_VERIFY_THREAD(tid);
snapshotCallback.reset();
@@ -168,6 +221,7 @@ void MapSnapshotter::registerNative(jni::JNIEnv& env) {
METHOD(&MapSnapshotter::setCameraPosition, "setCameraPosition"),
METHOD(&MapSnapshotter::setRegion, "setRegion"),
METHOD(&MapSnapshotter::start, "nativeStart"),
+ METHOD(&MapSnapshotter::queryFeatures, "nativeQueryFeatures"),
METHOD(&MapSnapshotter::cancel, "nativeCancel")
);
}