diff options
Diffstat (limited to 'platform/android/src/snapshotter')
-rw-r--r-- | platform/android/src/snapshotter/map_snapshotter.cpp | 56 | ||||
-rw-r--r-- | platform/android/src/snapshotter/map_snapshotter.hpp | 7 |
2 files changed, 61 insertions, 2 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") ); } diff --git a/platform/android/src/snapshotter/map_snapshotter.hpp b/platform/android/src/snapshotter/map_snapshotter.hpp index 3be2cb4f6c..1cc4d23a9d 100644 --- a/platform/android/src/snapshotter/map_snapshotter.hpp +++ b/platform/android/src/snapshotter/map_snapshotter.hpp @@ -54,6 +54,10 @@ public: void start(JNIEnv&); + void queryFeatures(JNIEnv&, jni::jfloat, jni::jfloat, jni::jfloat, + jni::jfloat, jni::Array<jni::String>, + jni::Array<jni::Object<>> jfilter); + void cancel(JNIEnv&); private: @@ -66,7 +70,8 @@ private: bool showLogo; std::shared_ptr<mbgl::ThreadPool> threadPool; - std::unique_ptr<Actor<mbgl::MapSnapshotter::Callback>> snapshotCallback; + std::unique_ptr<Actor<mbgl::MapSnapshotter::SnapshotCallback>> snapshotCallback; + std::unique_ptr<Actor<mbgl::MapSnapshotter::QueryFeaturesCallback>> queryFeaturesCallback; std::unique_ptr<mbgl::MapSnapshotter> snapshotter; FileSource *jFileSource; |