#include "layer.hpp" #include "../android_conversion.hpp" #include #include #include // Java -> C++ conversion #include #include #include // C++ -> Java conversion #include "../conversion/property_value.hpp" #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.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::String Layer::getId(jni::JNIEnv& env) { return jni::Make(env, layer.getID()); } style::Layer& Layer::get() { return layer; } void Layer::setLayoutProperty(jni::JNIEnv& env, jni::String jname, jni::Object<> jvalue) { Value value(env, jvalue); // Convert and set property optional error = mbgl::style::conversion::setLayoutProperty(layer, jni::Make(env, jname), value); if (error) { mbgl::Log::Error(mbgl::Event::JNI, "Error setting property: " + jni::Make(env, jname) + " " + error->message); return; } } void Layer::setPaintProperty(jni::JNIEnv& env, jni::String jname, jni::Object<> jvalue) { Value value(env, jvalue); // Convert and set property optional error = mbgl::style::conversion::setPaintProperty(layer, jni::Make(env, jname), value, mbgl::optional()); if (error) { mbgl::Log::Error(mbgl::Event::JNI, "Error setting property: " + jni::Make(env, jname) + " " + error->message); return; } } void Layer::setFilter(jni::JNIEnv& env, jni::Array> jfilter) { using namespace mbgl::style; using namespace mbgl::style::conversion; Value wrapped(env, jfilter); Filter filter; Error error; optional converted = convert(wrapped, error); if (!converted) { mbgl::Log::Error(mbgl::Event::JNI, "Error setting filter: " + error.message); return; } filter = std::move(*converted); if (layer.is()) { layer.as()->setFilter(filter); } else if (layer.is()) { layer.as()->setFilter(filter); } else if (layer.is()) { layer.as()->setFilter(filter); } else if (layer.is()) { layer.as()->setFilter(filter); } else { mbgl::Log::Warning(mbgl::Event::JNI, "Layer doesn't support filters"); } } void Layer::setSourceLayer(jni::JNIEnv& env, jni::String sourceLayer) { using namespace mbgl::style; std::string layerId = jni::Make(env, sourceLayer); if (layer.is()) { layer.as()->setSourceLayer(layerId); } else if (layer.is()) { layer.as()->setSourceLayer(layerId); } else if (layer.is()) { layer.as()->setSourceLayer(layerId); } else if (layer.is()) { layer.as()->setSourceLayer(layerId); } else { mbgl::Log::Warning(mbgl::Event::JNI, "Layer doesn't support source layer"); } } jni::String Layer::getSourceLayer(jni::JNIEnv& env) { using namespace mbgl::style; std::string sourceLayerId; if (layer.is()) { sourceLayerId = layer.as()->getSourceLayer(); } else if (layer.is()) { sourceLayerId = layer.as()->getSourceLayer(); } else if (layer.is()) { sourceLayerId = layer.as()->getSourceLayer(); } else if (layer.is()) { sourceLayerId = layer.as()->getSourceLayer(); } else { mbgl::Log::Warning(mbgl::Event::JNI, "Layer doesn't support source layer"); } return jni::Make(env, sourceLayerId); } 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::Object Layer::getVisibility(jni::JNIEnv& env) { using namespace mbgl::android::conversion; return jni::Object(*convert(env, layer.getVisibility())); } jni::Class Layer::javaClass; void Layer::registerNative(jni::JNIEnv& env) { // Lookup the class Layer::javaClass = *jni::Class::Find(env).NewGlobalRef(env).release(); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer(env, Layer::javaClass, "nativePtr", METHOD(&Layer::getId, "nativeGetId"), METHOD(&Layer::setLayoutProperty, "nativeSetLayoutProperty"), METHOD(&Layer::setPaintProperty, "nativeSetPaintProperty"), METHOD(&Layer::setFilter, "nativeSetFilter"), METHOD(&Layer::setSourceLayer, "nativeSetSourceLayer"), METHOD(&Layer::getSourceLayer, "nativeGetSourceLayer"), METHOD(&Layer::getMinZoom, "nativeGetMinZoom"), METHOD(&Layer::getMaxZoom, "nativeGetMaxZoom"), METHOD(&Layer::setMinZoom, "nativeSetMinZoom"), METHOD(&Layer::setMaxZoom, "nativeSetMaxZoom"), METHOD(&Layer::getVisibility, "nativeGetVisibility") ); } } // namespace android } // namespace mbgl