#include #include #include #include #include "../attach_env.hpp" #include "format_number_jni.hpp" namespace mbgl { namespace android { void NumberFormat::registerNative(jni::JNIEnv& env) { jni::Class::Singleton(env); } jni::Local> NumberFormat::getInstance(jni::JNIEnv& env, const jni::Object& locale) { static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetStaticMethod (jni::Object)>(env, "getInstance"); return javaClass.Call(env, method, locale); } jni::Local> NumberFormat::getCurrencyInstance(jni::JNIEnv& env, const jni::Object& locale) { static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetStaticMethod (jni::Object)>(env, "getCurrencyInstance"); return javaClass.Call(env, method, locale); } jni::Local NumberFormat::format(jni::JNIEnv& env, const jni::Object& nf, jni::jdouble number) { static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod(env, "format"); return nf.Call(env, method, number); } void NumberFormat::setMinimumFractionDigits(jni::JNIEnv& env, const jni::Object& nf, jni::jint value) { static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod(env, "setMinimumFractionDigits"); return nf.Call(env, method, value); } void NumberFormat::setMaximumFractionDigits(jni::JNIEnv& env, const jni::Object& nf, jni::jint value) { static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod(env, "setMaximumFractionDigits"); return nf.Call(env, method, value); } } // namespace android namespace platform { std::string formatNumber(double number, const std::string& localeId, const std::string& currency, uint8_t minFractionDigits, uint8_t maxFractionDigits) { auto env{ android::AttachEnv() }; jni::Global> locale; LanguageTag languageTag = !localeId.empty() ? LanguageTag::fromBCP47(localeId) : LanguageTag(); if (!languageTag.language) { locale = jni::NewGlobal(*env, android::Locale::getDefault(*env)); } else if (!languageTag.region) { locale = jni::NewGlobal(*env, android::Locale::New(*env, jni::Make(*env, *languageTag.language))); } else { locale = jni::NewGlobal(*env, android::Locale::New(*env, jni::Make(*env, *languageTag.language), jni::Make(*env, *languageTag.region))); } jni::Global> formatter; if (currency.empty()) { formatter = jni::NewGlobal(*env, android::NumberFormat::getInstance(*env, locale)); android::NumberFormat::setMinimumFractionDigits(*env, formatter, static_cast(minFractionDigits)); android::NumberFormat::setMaximumFractionDigits(*env, formatter, static_cast(maxFractionDigits)); } else { formatter = jni::NewGlobal(*env, android::NumberFormat::getCurrencyInstance(*env, locale)); } auto result = android::NumberFormat::format(*env, formatter, static_cast(number)); return jni::Make(*env, result); } } // namespace platform } // namespace mbgl