diff --git a/android/jni/com/mapswithme/maps/ugc/UGC.cpp b/android/jni/com/mapswithme/maps/ugc/UGC.cpp index 09c9a49083..afdc58130c 100644 --- a/android/jni/com/mapswithme/maps/ugc/UGC.cpp +++ b/android/jni/com/mapswithme/maps/ugc/UGC.cpp @@ -86,7 +86,7 @@ public: Init(env); jobjectArray jratings = static_cast(env->GetObjectField(ugcUpdate, m_ratingArrayFieldId)); - int const length = env->GetArrayLength(jratings); + auto const length = static_cast(env->GetArrayLength(jratings)); std::vector records; records.reserve(length); for (int i = 0; i < length; i++) @@ -102,16 +102,25 @@ public: records.emplace_back(std::move(key), std::move(ratingValue)); } jstring jtext = static_cast(env->GetObjectField(ugcUpdate, m_ratingTextFieldId)); - jstring jlocale = static_cast(env->GetObjectField(ugcUpdate, m_localeFieldId)); - std::string normalizedLocale = languages::Normalize(jni::ToNativeString(env, jlocale)); - // TODO: Set the list of keyboard's locales - ugc::KeyboardText text(jni::ToNativeString(env, jtext), StringUtf8Multilang::GetLangIndex(normalizedLocale), {}); + jstring jdevicelocale = static_cast(env->GetObjectField(ugcUpdate, m_deviceLocaleFieldId)); + jstring jkeyboardLocale = static_cast(env->GetObjectField(ugcUpdate, m_keyboardLocaleFieldId)); + std::vector keyboardLangs; + keyboardLangs.push_back(ToNativeLangIndex(env, jkeyboardLocale)); + ugc::KeyboardText text(jni::ToNativeString(env, jtext), ToNativeLangIndex(env, jdevicelocale), + keyboardLangs); jlong jtime = env->GetLongField(ugcUpdate, m_updateTimeFieldId); - uint64_t timeSec = static_cast(jtime / 1000); + auto const timeSec = static_cast(jtime / 1000); return ugc::UGCUpdate(records, text, std::chrono::system_clock::from_time_t(timeSec)); } private: + + uint8_t ToNativeLangIndex(JNIEnv * env, jstring lang) + { + std::string normLocale = languages::Normalize(jni::ToNativeString(env, lang)); + return static_cast(StringUtf8Multilang::GetLangIndex(normLocale)); + } + jobject ToJavaUGC(JNIEnv * env, ugc::UGC const & ugc) { jni::TScopedLocalObjectArrayRef ratings(env, ToJavaRatings(env, ugc.m_ratings)); @@ -130,12 +139,17 @@ private: jni::TScopedLocalRef text(env, jni::ToJavaString(env, ugcUpdate.m_text.m_text)); std::string locale(StringUtf8Multilang::GetLangByCode(ugcUpdate.m_text.m_deviceLang)); jni::TScopedLocalRef localeRef(env, jni::ToJavaString(env, locale)); + std::string keyboardLocale; + auto const & keyboardLangs = ugcUpdate.m_text.m_keyboardLangs; + if (!keyboardLangs.empty()) + keyboardLocale = StringUtf8Multilang::GetLangByCode(keyboardLangs.front()); + jni::TScopedLocalRef keyboardLocaleRef(env, jni::ToJavaString(env, keyboardLocale)); jobject result = nullptr; if (!ugcUpdate.IsEmpty()) result = env->NewObject(m_ugcUpdateClass, m_ugcUpdateCtor, ratings.get(), text.get(), ugc::ToMillisecondsSinceEpoch(ugcUpdate.m_time), - localeRef.get()); + localeRef.get(), keyboardLocaleRef.get()); return result; } @@ -202,11 +216,13 @@ private: m_ugcUpdateClass = jni::GetGlobalClassRef(env, "com/mapswithme/maps/ugc/UGCUpdate"); m_ugcUpdateCtor = jni::GetConstructorID( - env, m_ugcUpdateClass, "([Lcom/mapswithme/maps/ugc/UGC$Rating;Ljava/lang/String;JLjava/lang/String;)V"); + env, m_ugcUpdateClass, "([Lcom/mapswithme/maps/ugc/UGC$Rating;Ljava/lang/String;" + "JLjava/lang/String;Ljava/lang/String;)V"); m_ratingArrayFieldId = env->GetFieldID(m_ugcUpdateClass, "mRatings", "[Lcom/mapswithme/maps/ugc/UGC$Rating;"); m_ratingTextFieldId = env->GetFieldID(m_ugcUpdateClass, "mText", "Ljava/lang/String;"); m_updateTimeFieldId = env->GetFieldID(m_ugcUpdateClass, "mTimeMillis", "J"); - m_localeFieldId = env->GetFieldID(m_ugcUpdateClass, "mLocale", "Ljava/lang/String;"); + m_deviceLocaleFieldId = env->GetFieldID(m_ugcUpdateClass, "mDeviceLocale", "Ljava/lang/String;"); + m_keyboardLocaleFieldId = env->GetFieldID(m_ugcUpdateClass, "mKeyboardLocale", "Ljava/lang/String;"); m_ratingNameFieldId = env->GetFieldID(g_ratingClazz, "mName", "Ljava/lang/String;"); m_ratingValueFieldId = env->GetFieldID(g_ratingClazz, "mValue", "F"); m_initialized = true; @@ -222,7 +238,8 @@ private: jfieldID m_ratingArrayFieldId; jfieldID m_ratingTextFieldId; jfieldID m_updateTimeFieldId; - jfieldID m_localeFieldId; + jfieldID m_deviceLocaleFieldId; + jfieldID m_keyboardLocaleFieldId; jfieldID m_ratingNameFieldId; jfieldID m_ratingValueFieldId; diff --git a/android/src/com/mapswithme/maps/ugc/UGCEditorFragment.java b/android/src/com/mapswithme/maps/ugc/UGCEditorFragment.java index 184f836fba..5c1c5d61c0 100644 --- a/android/src/com/mapswithme/maps/ugc/UGCEditorFragment.java +++ b/android/src/com/mapswithme/maps/ugc/UGCEditorFragment.java @@ -97,7 +97,8 @@ public class UGCEditorFragment extends BaseMwmAuthorizationFragment UGC.Rating[] ratings = new UGC.Rating[modifiedRatings.size()]; modifiedRatings.toArray(ratings); UGCUpdate update = new UGCUpdate(ratings, mReviewEditText.getText().toString(), - System.currentTimeMillis(), Language.getDefaultLocale()); + System.currentTimeMillis(), Language.getDefaultLocale(), + Language.getKeyboardLocale()); FeatureId featureId = getArguments().getParcelable(ARG_FEATURE_ID); if (featureId == null) { diff --git a/android/src/com/mapswithme/maps/ugc/UGCUpdate.java b/android/src/com/mapswithme/maps/ugc/UGCUpdate.java index 9a5b278785..7e59e296f0 100644 --- a/android/src/com/mapswithme/maps/ugc/UGCUpdate.java +++ b/android/src/com/mapswithme/maps/ugc/UGCUpdate.java @@ -15,15 +15,18 @@ class UGCUpdate private String mText; private long mTimeMillis; @NonNull - private final String mLocale; + private final String mDeviceLocale; + @NonNull + private final String mKeyboardLocale; UGCUpdate(@Nullable UGC.Rating[] ratings, @Nullable String text, long timeMillis, - @NonNull String locale) + @NonNull String deviceLocale, @NonNull String keyboardLocale) { mRatings = ratings; mText = text; mTimeMillis = timeMillis; - mLocale = locale; + mDeviceLocale = deviceLocale; + mKeyboardLocale = keyboardLocale; } public void setText(@Nullable String text)