summaryrefslogtreecommitdiff
path: root/platform/android
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-11-28 18:19:17 +0200
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-11-29 09:53:28 +0200
commitcd4136ed4b4fc5d9a44fe17aa98dfd590c9c0bfb (patch)
tree42e601f7b16a83a62a8418511b795b6dfcf9eeff /platform/android
parente3d1daaf6687467ee5c064d2577d2903c508c2dc (diff)
downloadqtlocation-mapboxgl-cd4136ed4b4fc5d9a44fe17aa98dfd590c9c0bfb.tar.gz
[core][android][darwin] Fix GeoJSONOptions handling
- share the `GeoJSONOptions` instances using `Immutable<GeoJSONOptions>` - avoid extra copying - fix wrapping of the `GeoJSONOptions` instances in supercluster map/reduce lambdas. Previously, local variables were wrapped by reference.
Diffstat (limited to 'platform/android')
-rw-r--r--platform/android/src/style/sources/geojson_source.cpp62
-rw-r--r--platform/android/src/style/sources/geojson_source.hpp4
2 files changed, 33 insertions, 33 deletions
diff --git a/platform/android/src/style/sources/geojson_source.cpp b/platform/android/src/style/sources/geojson_source.cpp
index 0eece4b1ad..f68c9d8f42 100644
--- a/platform/android/src/style/sources/geojson_source.cpp
+++ b/platform/android/src/style/sources/geojson_source.cpp
@@ -1,4 +1,5 @@
#include "geojson_source.hpp"
+#include <mbgl/style/sources/geojson_source_impl.hpp>
#include "../../attach_env.hpp"
#include <mbgl/renderer/query.hpp>
@@ -29,44 +30,42 @@ namespace android {
// This conversion is expected not to fail because it's used only in contexts where
// the value was originally a GeoJsonOptions object on the Java side. If it fails
// to convert, it's a bug in our serialization or Java-side static typing.
- static style::GeoJSONOptions convertGeoJSONOptions(jni::JNIEnv& env, const jni::Object<>& options) {
- using namespace mbgl::style::conversion;
- if (!options) {
- return style::GeoJSONOptions();
- }
- Error error;
- optional<style::GeoJSONOptions> result = convert<style::GeoJSONOptions>(
- mbgl::android::Value(env, options), error);
- if (!result) {
- throw std::logic_error(error.message);
- }
- return *result;
+static Immutable<style::GeoJSONOptions> convertGeoJSONOptions(jni::JNIEnv& env, const jni::Object<>& options) {
+ using namespace mbgl::style::conversion;
+ if (!options) {
+ return style::GeoJSONOptions::defaultOptions();
}
+ Error error;
+ optional<style::GeoJSONOptions> result = convert<style::GeoJSONOptions>(mbgl::android::Value(env, options), error);
+ if (!result) {
+ throw std::logic_error(error.message);
+ }
+ return makeMutable<style::GeoJSONOptions>(std::move(*result));
+}
- GeoJSONSource::GeoJSONSource(jni::JNIEnv& env, const jni::String& sourceId, const jni::Object<>& options)
- : Source(env,
- std::make_unique<mbgl::style::GeoJSONSource>(jni::Make<std::string>(env, sourceId),
- convertGeoJSONOptions(env, options))),
- converter(std::make_unique<Actor<FeatureConverter>>(Scheduler::GetBackground(),
- source.as<style::GeoJSONSource>()->getOptions())) {}
-
- GeoJSONSource::GeoJSONSource(jni::JNIEnv& env, mbgl::style::Source& coreSource, AndroidRendererFrontend& frontend)
- : Source(env, coreSource, createJavaPeer(env), frontend),
- converter(std::make_unique<Actor<FeatureConverter>>(Scheduler::GetBackground(),
- source.as<style::GeoJSONSource>()->getOptions())) {}
+GeoJSONSource::GeoJSONSource(jni::JNIEnv& env, const jni::String& sourceId, const jni::Object<>& options)
+ : Source(env,
+ std::make_unique<mbgl::style::GeoJSONSource>(jni::Make<std::string>(env, sourceId),
+ convertGeoJSONOptions(env, options))),
+ converter(std::make_unique<Actor<FeatureConverter>>(Scheduler::GetBackground(),
+ source.as<style::GeoJSONSource>()->impl().getOptions())) {}
- GeoJSONSource::~GeoJSONSource() = default;
+GeoJSONSource::GeoJSONSource(jni::JNIEnv& env, mbgl::style::Source& coreSource, AndroidRendererFrontend& frontend)
+ : Source(env, coreSource, createJavaPeer(env), frontend),
+ converter(std::make_unique<Actor<FeatureConverter>>(Scheduler::GetBackground(),
+ source.as<style::GeoJSONSource>()->impl().getOptions())) {}
- void GeoJSONSource::setGeoJSONString(jni::JNIEnv& env, const jni::String& jString) {
+GeoJSONSource::~GeoJSONSource() = default;
- std::shared_ptr<std::string> json = std::make_shared<std::string>(jni::Make<std::string>(env, jString));
+void GeoJSONSource::setGeoJSONString(jni::JNIEnv& env, const jni::String& jString) {
+ std::shared_ptr<std::string> json = std::make_shared<std::string>(jni::Make<std::string>(env, jString));
- Update::Converter converterFn = [this, json](ActorRef<GeoJSONDataCallback> _callback) {
- converter->self().invoke(&FeatureConverter::convertJson, json, _callback);
- };
+ Update::Converter converterFn = [this, json](ActorRef<GeoJSONDataCallback> _callback) {
+ converter->self().invoke(&FeatureConverter::convertJson, json, _callback);
+ };
- setAsync(converterFn);
- }
+ setAsync(converterFn);
+}
void GeoJSONSource::setFeatureCollection(jni::JNIEnv& env, const jni::Object<geojson::FeatureCollection>& jFeatures) {
setCollectionAsync(env, jFeatures);
@@ -237,6 +236,7 @@ namespace android {
mbgl::Log::Error(mbgl::Event::JNI, "Error setting geo json: " + error.message);
return;
}
+
callback.invoke(&GeoJSONDataCallback::operator(), style::GeoJSONData::create(*converted, options));
}
diff --git a/platform/android/src/style/sources/geojson_source.hpp b/platform/android/src/style/sources/geojson_source.hpp
index e506191ceb..668e944e1c 100644
--- a/platform/android/src/style/sources/geojson_source.hpp
+++ b/platform/android/src/style/sources/geojson_source.hpp
@@ -15,7 +15,7 @@ using GeoJSONDataCallback = std::function<void(std::shared_ptr<style::GeoJSONDat
class FeatureConverter {
public:
- explicit FeatureConverter(style::GeoJSONOptions options_) : options(std::move(options_)) {}
+ explicit FeatureConverter(Immutable<style::GeoJSONOptions> options_) : options(std::move(options_)) {}
void convertJson(std::shared_ptr<std::string>, ActorRef<GeoJSONDataCallback>);
template <class JNIType>
@@ -23,7 +23,7 @@ public:
ActorRef<GeoJSONDataCallback>);
private:
- style::GeoJSONOptions options;
+ Immutable<style::GeoJSONOptions> options;
};
struct Update {