#include "layer.hpp" #include "../android_conversion.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include #include // Java -> C++ conversion #include #include #include #include // C++ -> Java conversion #include "../conversion/property_value.hpp" #include "custom_layer.hpp" #include "background_layer.hpp" #include #include namespace mbgl { namespace android { /** * Invoked when the construction is initiated from the jvm through a subclass */ Layer::Layer(jni::JNIEnv&, std::unique_ptr coreLayer) : ownedLayer(std::move(coreLayer)) , layer(*ownedLayer) { } /** * Takes a non-owning reference. For lookup methods */ Layer::Layer(mbgl::Map& coreMap, mbgl::style::Layer& coreLayer) : layer(coreLayer) , map(&coreMap) { } /** * Takes a owning reference. Ownership is transfered to this peer, eg after removing * from the map */ Layer::Layer(mbgl::Map& coreMap, std::unique_ptr coreLayer) : ownedLayer(std::move(coreLayer)) , layer(*ownedLayer) , map(&coreMap) { } Layer::~Layer() { } void Layer::addToMap(mbgl::Map& _map, mbgl::optional before) { // Check to see if we own the layer first if (!ownedLayer) { throw std::runtime_error("Cannot add layer twice"); } // Add layer to map _map.getStyle().addLayer(releaseCoreLayer(), before); // Save pointer to the map this->map = &_map; } void Layer::setLayer(std::unique_ptr sourceLayer) { this->ownedLayer = std::move(sourceLayer); } std::unique_ptr Layer::releaseCoreLayer() { assert(ownedLayer != nullptr); return std::move(ownedLayer); } jni::Local Layer::getId(jni::JNIEnv& env) { return jni::Make(env, layer.getID()); } style::Layer& Layer::get() { return layer; } void Layer::setLayoutProperty(jni::JNIEnv& env, const jni::String& jname, const jni::Object<>& jvalue) { // Convert and set property optional error = layer.setLayoutProperty(jni::Make(env, jname), Value(env, jvalue)); if (error) { mbgl::Log::Error(mbgl::Event::JNI, "Error setting property: " + jni::Make(env, jname) + " " + error->message); return; } } void Layer::setPaintProperty(jni::JNIEnv& env, const jni::String& jname, const jni::Object<>& jvalue) { // Convert and set property optional error = layer.setPaintProperty(jni::Make(env, jname), Value(env, jvalue)); if (error) { mbgl::Log::Error(mbgl::Event::JNI, "Error setting property: " + jni::Make(env, jname) + " " + error->message); return; } } void Layer::setFilter(jni::JNIEnv& env, const jni::Array>& jfilter) { using namespace mbgl::style; using namespace mbgl::style::conversion; Error error; optional converted = convert(Value(env, jfilter), error); if (!converted) { mbgl::Log::Error(mbgl::Event::JNI, "Error setting filter: " + error.message); return; } layer.setFilter(std::move(*converted)); } jni::Local> Layer::getFilter(jni::JNIEnv& env) { using namespace mbgl::style; using namespace mbgl::style::conversion; Filter filter = layer.getFilter(); if (filter.expression) { mbgl::Value expressionValue = (*filter.expression)->serialize(); return gson::JsonElement::New(env, expressionValue); } else { return jni::Local>(env, nullptr); } } void Layer::setSourceLayer(jni::JNIEnv& env, const jni::String& sourceLayer) { layer.setSourceLayer(jni::Make(env, sourceLayer)); } jni::Local Layer::getSourceLayer(jni::JNIEnv& env) { return jni::Make(env, layer.getSourceLayer()); } jni::Local Layer::getSourceId(jni::JNIEnv& env) { return jni::Make(env, layer.getSourceID()); } jni::jfloat Layer::getMinZoom(jni::JNIEnv&){ return layer.getMinZoom(); } jni::jfloat Layer::getMaxZoom(jni::JNIEnv&) { return layer.getMaxZoom(); } void Layer::setMinZoom(jni::JNIEnv&, jni::jfloat zoom) { layer.setMinZoom(zoom); } void Layer::setMaxZoom(jni::JNIEnv&, jni::jfloat zoom) { layer.setMaxZoom(zoom); } jni::Local> Layer::getVisibility(jni::JNIEnv& env) { using namespace mbgl::android::conversion; return std::move(*convert>>(env, layer.getVisibility())); } void Layer::registerNative(jni::JNIEnv& env) { // Lookup the class static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer(env, javaClass, "nativePtr", METHOD(&Layer::getId, "nativeGetId"), METHOD(&Layer::setLayoutProperty, "nativeSetLayoutProperty"), METHOD(&Layer::setPaintProperty, "nativeSetPaintProperty"), METHOD(&Layer::setFilter, "nativeSetFilter"), METHOD(&Layer::getFilter, "nativeGetFilter"), METHOD(&Layer::setSourceLayer, "nativeSetSourceLayer"), METHOD(&Layer::getSourceLayer, "nativeGetSourceLayer"), METHOD(&Layer::getSourceId, "nativeGetSourceId"), METHOD(&Layer::getMinZoom, "nativeGetMinZoom"), METHOD(&Layer::getMaxZoom, "nativeGetMaxZoom"), METHOD(&Layer::setMinZoom, "nativeSetMinZoom"), METHOD(&Layer::setMaxZoom, "nativeSetMaxZoom"), METHOD(&Layer::getVisibility, "nativeGetVisibility") ); } } // namespace android } // namespace mbgl