diff --git a/android/jni/Android.mk b/android/jni/Android.mk index a30de29342..abc4f8119e 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -36,6 +36,7 @@ LOCAL_SRC_FILES := \ com/mapswithme/maps/Lifecycle.cpp \ com/mapswithme/platform/Platform.cpp \ com/mapswithme/platform/HttpThread.cpp \ + com/mapswithme/platform/Language.cpp \ com/mapswithme/jni/jni_thread.cpp \ com/mapswithme/jni/jni_method.cpp \ nv_thread/nv_thread.cpp \ diff --git a/android/jni/com/mapswithme/platform/Language.cpp b/android/jni/com/mapswithme/platform/Language.cpp new file mode 100644 index 0000000000..348f23d6a7 --- /dev/null +++ b/android/jni/com/mapswithme/platform/Language.cpp @@ -0,0 +1,47 @@ +#include + +#include "../../../../../base/assert.hpp" +#include "../../../../../base/logging.hpp" + +#include "../../../../../std/string.hpp" + +/// Defined and initialized in MWMActivity.cpp +extern JavaVM * g_jvm; + +#define DEFAULT_LANG "en" + +/// This function is called from native c++ code +string GetAndroidSystemLanguage() +{ + JNIEnv * env = 0; + if (!g_jvm || g_jvm->AttachCurrentThread(&env, 0) || !env) + { + LOG(LWARNING, ("Can't attach thread")); + return DEFAULT_LANG; + } + + jclass localeClass = env->FindClass("java/util/Locale"); + ASSERT(localeClass, ("Can't find java class java/util/Locale")); + + jmethodID localeGetDefaultId = env->GetStaticMethodID(localeClass, "getDefault", "()Ljava/util/Locale;"); + ASSERT(localeGetDefaultId, ("Can't find static java/util/Locale.getDefault() method")); + + jobject localeInstance = env->CallStaticObjectMethod(localeClass, localeGetDefaultId); + ASSERT(localeInstance, ("Locale.getDefault() returned NULL")); + + jmethodID localeGetLanguageId = env->GetMethodID(localeClass, "getLanguage", "()Ljava/lang/String;"); + ASSERT(localeGetLanguageId, ("Can't find java/util/Locale.getLanguage() method")); + + jstring langString = (jstring)env->CallObjectMethod(localeInstance, localeGetLanguageId); + ASSERT(langString, ("Locale.getLanguage() returned NULL")); + + char const * langUtf8 = env->GetStringUTFChars(langString, 0); + string result(DEFAULT_LANG); + if (langUtf8 != 0) + { + result = langUtf8; + env->ReleaseStringUTFChars(langString, langUtf8); + } + g_jvm->DetachCurrentThread(); + return result; +} diff --git a/android/src/com/mapswithme/maps/MWMActivity.java b/android/src/com/mapswithme/maps/MWMActivity.java index 6623cdd4ee..9ed769cc0c 100644 --- a/android/src/com/mapswithme/maps/MWMActivity.java +++ b/android/src/com/mapswithme/maps/MWMActivity.java @@ -146,15 +146,6 @@ public class MWMActivity extends NvEventQueueActivity implements startActivity(new Intent(this, DownloadUI.class)); } - private void setupLanguages() - { - /* - * Log.d(TAG, "Default Language : " + Locale.getDefault().getLanguage()); - * for (Locale l : Locale.getAvailableLocales()) Log.d(TAG, l.getLanguage() - * + " : " + l.getVariant() + " : " + l.toString()); - */ - } - @Override public void onCreate(Bundle savedInstanceState) { @@ -174,8 +165,6 @@ public class MWMActivity extends NvEventQueueActivity implements nativeInit(metrics.densityDpi, getAppBundlePath(), extStoragePath, getTmpPath(), extTmpPath, getSettingsPath()); - setupLanguages(); - checkMeasurementSystem(); m_timer = new VideoTimer(); diff --git a/platform/preferred_languages.cpp b/platform/preferred_languages.cpp index f78dde9548..cde6ae00cc 100644 --- a/platform/preferred_languages.cpp +++ b/platform/preferred_languages.cpp @@ -20,7 +20,8 @@ #include "../std/cstdlib.hpp" #elif defined(OMIM_OS_ANDROID) - /// @TODO + /// Body for this function is inside android/jni sources + string GetAndroidSystemLanguage(); #else #error "Define language preferences for your platform" @@ -155,7 +156,7 @@ void SystemPreferredLanguages(vector & languages) languages.push_back(p); #elif defined(OMIM_OS_ANDROID) - /// @TODO + languages.push_back(GetAndroidSystemLanguage()); #else #error "Define language preferences for your platform"