#include "layer_manager.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "background_layer.hpp" #include "circle_layer.hpp" #include "custom_layer.hpp" #include "fill_extrusion_layer.hpp" #include "fill_layer.hpp" #include "heatmap_layer.hpp" #include "hillshade_layer.hpp" #include "line_layer.hpp" #include "raster_layer.hpp" #include "symbol_layer.hpp" #include "fill_extrusion_layer.hpp" namespace mbgl { namespace android { LayerManagerAndroid::LayerManagerAndroid() { factories.emplace_back(std::unique_ptr(new FillJavaLayerPeerFactory)); factories.emplace_back(std::unique_ptr(new LineJavaLayerPeerFactory)); factories.emplace_back(std::unique_ptr(new CircleJavaLayerPeerFactory)); factories.emplace_back(std::unique_ptr(new SymbolJavaLayerPeerFactory)); factories.emplace_back(std::unique_ptr(new RasterJavaLayerPeerFactory)); factories.emplace_back(std::unique_ptr(new BackgroundJavaLayerPeerFactory)); factories.emplace_back(std::unique_ptr(new HillshadeJavaLayerPeerFactory)); factories.emplace_back(std::unique_ptr(new FillExtrusionJavaLayerPeerFactory)); factories.emplace_back(std::unique_ptr(new HeatmapJavaLayerPeerFactory)); factories.emplace_back(std::unique_ptr(new CustomJavaLayerPeerFactory)); } LayerManagerAndroid::~LayerManagerAndroid() = default; jni::Local> LayerManagerAndroid::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, mbgl::style::Layer& layer) { if (JavaLayerPeerFactory* factory = getPeerFactory(&layer)) { return factory->createJavaLayerPeer(env, map, layer); } return jni::Local>(); } jni::Local> LayerManagerAndroid::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr layer) { if (JavaLayerPeerFactory* factory = getPeerFactory(layer.get())) { return factory->createJavaLayerPeer(env, map, std::move(layer)); } return jni::Local>(); } void LayerManagerAndroid::registerNative(jni::JNIEnv& env) { Layer::registerNative(env); for (const auto& factory: factories) { factory->registerNative(env); } } JavaLayerPeerFactory* LayerManagerAndroid::getPeerFactory(mbgl::style::Layer* layer) { auto* layerFactory = layer->baseImpl->getLayerFactory(); assert(layerFactory); for (const auto& factory: factories) { if (factory->getLayerFactory() == layerFactory) { return factory.get(); } } assert(false); return nullptr; } std::unique_ptr LayerManagerAndroid::createLayer(const std::string& type, const std::string& id, const style::conversion::Convertible& value, style::conversion::Error& error) noexcept{ for (const auto& factory: factories) { auto* layerFactory = factory->getLayerFactory(); if (layerFactory->supportsType(type)) { if (auto layer = layerFactory->createLayer(id, value)) { return layer; } error.message = "Error parsing a layer of type: " + type; return nullptr; } } error.message = "Unsupported layer type: " + type; return nullptr; } // static LayerManagerAndroid* LayerManagerAndroid::get() noexcept { static LayerManagerAndroid impl; return &impl; } } // namespace android namespace style { // static LayerManager* LayerManager::get() noexcept { return android::LayerManagerAndroid::get(); } } // style } // namespace mbgl