#pragma once #include #include "../../conversion/conversion.hpp" #include "../../conversion/constant.hpp" #include "types.hpp" #include "../../java/lang.hpp" #include "../functions/stop.hpp" #include "../functions/categorical_stops.hpp" #include "../functions/exponential_stops.hpp" #include "../functions/identity_stops.hpp" #include "../functions/interval_stops.hpp" #include #include #include namespace mbgl { namespace android { namespace conversion { /** * Conversion from core composite value to java type */ class CategoricalValueEvaluator { public: CategoricalValueEvaluator(jni::JNIEnv& _env) : env(_env) {} template jni::jobject* operator()(const T &value) const { return *convert(env, value); } private: jni::JNIEnv& env; }; /** * Conversion from core composite value to java type */ template <> struct Converter { Result operator()(jni::JNIEnv& env, const mbgl::style::CategoricalValue& value) const { CategoricalValueEvaluator evaluator(env); return apply_visitor(evaluator, value); } }; template jni::Array> toFunctionStopJavaArray(jni::JNIEnv& env, std::map value) { auto jarray = jni::Array>::New(env, value.size(), Stop::javaClass); size_t i = 0; for (auto const& stop : value) { jni::jobject* in = *convert(env, stop.first); jni::jobject* out = *convert(env, stop.second); auto jstop = Stop::New(env, jni::Object<>(in), jni::Object<>(out)); jarray.Set(env, i, jstop); jni::DeleteLocalRef(env, in); jni::DeleteLocalRef(env, out); jni::DeleteLocalRef(env, jstop); i++; } return jarray; } template jni::Array> toFunctionStopJavaArray(jni::JNIEnv& env, std::map> value) { auto jarray = jni::Array>::New(env, value.size(), Stop::javaClass); for (auto const& zoomLevelMap : value) { size_t i = 0; for (auto const& stop: zoomLevelMap.second) { auto zoom = jni::Object(*convert(env, zoomLevelMap.first)); auto in = jni::Object<>(*convert(env, stop.first)); auto out = jni::Object<>(*convert(env, stop.second)); auto compositeValue = Stop::CompositeValue::New(env, zoom, in); auto jstop = Stop::New(env, compositeValue, out); jarray.Set(env, i, jstop); jni::DeleteLocalRef(env, zoom); jni::DeleteLocalRef(env, in); jni::DeleteLocalRef(env, out); jni::DeleteLocalRef(env, compositeValue); jni::DeleteLocalRef(env, jstop); i++; } } return jarray; } template inline jni::jobject* convertCompositeStopsArray(jni::JNIEnv& env, std::map> value) { static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "com/mapbox/mapboxsdk/style/functions/stops/Stop")).release(); static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "", "(Ljava/lang/Object;Ljava/lang/Object;)V"); jni::jarray& jarray = jni::NewObjectArray(env, value.size(), *javaClass); size_t i = 0; for (auto const& stop : value) { jni::jobject* in = *convert(env, stop.first); jni::jobject* out = *convert(env, stop.second); jni::SetObjectArrayElement(env, jarray, i, &jni::NewObject(env, *javaClass, *constructor, in, out)); i++; jni::DeleteLocalRef(env, in); jni::DeleteLocalRef(env, out); } return &jarray; } /** * Conversion from core function stops to Stops java subclasses */ template class StopsEvaluator { public: StopsEvaluator(jni::JNIEnv& _env) : env(_env) {} jni::jobject* operator()(const mbgl::style::CategoricalStops &value) const { return CategoricalStops::New(env, toFunctionStopJavaArray(env, value.stops)).Get(); } jni::jobject* operator()(const mbgl::style::CompositeCategoricalStops &value) const { return CategoricalStops::New(env, toFunctionStopJavaArray(env, value.stops)).Get(); } jni::jobject* operator()(const mbgl::style::ExponentialStops &value) const { return ExponentialStops::New(env, jni::Object(*convert(env, value.base)), toFunctionStopJavaArray(env, value.stops)).Get(); } jni::jobject* operator()(const mbgl::style::CompositeExponentialStops &value) const { return ExponentialStops::New(env, jni::Object(*convert(env, value.base)), toFunctionStopJavaArray(env, value.stops)).Get(); } jni::jobject* operator()(const mbgl::style::IdentityStops &) const { return IdentityStops::New(env).Get(); } jni::jobject* operator()(const mbgl::style::IntervalStops &value) const { return IntervalStops::New(env, toFunctionStopJavaArray(env, value.stops)).Get(); } jni::jobject* operator()(const mbgl::style::CompositeIntervalStops &value) const { return IntervalStops::New(env, toFunctionStopJavaArray(env, value.stops)).Get(); } private: jni::JNIEnv& env; }; template struct Converter> { Result operator()(jni::JNIEnv& env, const mbgl::style::CameraFunction& value) const { static jni::jclass* clazz = jni::NewGlobalRef(env, &jni::FindClass(env, "com/mapbox/mapboxsdk/style/functions/CameraFunction")).release(); static jni::jmethodID* constructor = &jni::GetMethodID(env, *clazz, "", "(Lcom/mapbox/mapboxsdk/style/functions/stops/Stops;)V"); StopsEvaluator evaluator(env); jni::jobject* stops = apply_visitor(evaluator, value.stops); jni::jobject* converted = &jni::NewObject(env, *clazz, *constructor, stops); return { converted }; } }; template struct Converter> { Result operator()(jni::JNIEnv& env, const mbgl::style::SourceFunction& value) const { static jni::jclass* clazz = jni::NewGlobalRef(env, &jni::FindClass(env, "com/mapbox/mapboxsdk/style/functions/SourceFunction")).release(); static jni::jmethodID* constructor = &jni::GetMethodID(env, *clazz, "", "(Ljava/lang/Object;Ljava/lang/String;Lcom/mapbox/mapboxsdk/style/functions/stops/Stops;)V"); // Convert stops StopsEvaluator evaluator(env); jni::jobject* stops = apply_visitor(evaluator, value.stops); // Convert default value jni::jobject* defaultValue = nullptr; if (value.defaultValue) { defaultValue = *convert(env, *value.defaultValue); } return { &jni::NewObject(env, *clazz, *constructor, defaultValue, jni::Make(env, value.property).Get(), stops) }; } }; template struct Converter> { Result operator()(jni::JNIEnv& env, const mbgl::style::CompositeFunction& value) const { static jni::jclass* clazz = jni::NewGlobalRef(env, &jni::FindClass(env, "com/mapbox/mapboxsdk/style/functions/CompositeFunction")).release(); static jni::jmethodID* constructor = &jni::GetMethodID(env, *clazz, "", "(Ljava/lang/Object;Ljava/lang/String;Lcom/mapbox/mapboxsdk/style/functions/stops/Stops;)V"); // Convert stops StopsEvaluator evaluator(env); jni::jobject* stops = apply_visitor(evaluator, value.stops); // Convert default value jni::jobject* defaultValue = nullptr; if (value.defaultValue) { defaultValue = *convert(env, *value.defaultValue); } return { &jni::NewObject(env, *clazz, *constructor, defaultValue, jni::Make(env, value.property).Get(), stops) }; } }; } // namespace conversion } // namespace android } // namespace mbgl