#include "formatted.hpp" #include "formatted_section.hpp" #include "../conversion/conversion.hpp" #include "../conversion/constant.hpp" namespace mbgl { namespace android { void Formatted::registerNative(jni::JNIEnv& env) { jni::Class::Singleton(env); } jni::Local> Formatted::New(jni::JNIEnv& env, const style::expression::Formatted& value) { static auto& formatted = jni::Class::Singleton(env); static auto formattedConstructor = formatted.GetConstructor>>(env); static auto& formattedSectionClass = jni::Class::Singleton(env); auto sections = jni::Array>::New(env, value.sections.size()); for (std::size_t i = 0; i < value.sections.size(); i++) { auto section = value.sections.at(i); auto text = jni::Make(env, section.text); static auto formattedSectionConstructor = formattedSectionClass.GetConstructor(env); auto formattedSection = formattedSectionClass.New(env, formattedSectionConstructor, text); if (section.fontScale) { double fontScale = section.fontScale.value(); static auto method = formattedSectionClass.GetMethod(env, "setFontScale"); formattedSection.Call(env, method, jni::Box(env, fontScale)); } if (section.fontStack) { auto fontStack = jni::Array::New(env, section.fontStack.value().size()); for (std::size_t j = 0; j < section.fontStack.value().size(); j++) { fontStack.Set(env, j, jni::Make(env, section.fontStack.value().at(j))); } static auto method = formattedSectionClass.GetMethod)>(env, "setFontStack"); formattedSection.Call(env, method, fontStack); } if (section.textColor) { using namespace mbgl::android::conversion; auto textColor = std::move(*convert>>(env, *section.textColor)); static auto method = formattedSectionClass.GetMethod)>(env, "setTextColor"); formattedSection.Call(env, method, textColor); } sections.Set(env, i, formattedSection); } return formatted.New(env, formattedConstructor, sections); } } // namespace android } // namespace mbgl