diff --git a/android/jni/com/mapswithme/maps/SearchRecents.cpp b/android/jni/com/mapswithme/maps/SearchRecents.cpp index 76d2b24a91..cf899f596b 100644 --- a/android/jni/com/mapswithme/maps/SearchRecents.cpp +++ b/android/jni/com/mapswithme/maps/SearchRecents.cpp @@ -15,22 +15,18 @@ extern "C" if (items.empty()) return; - static jclass const pairClass = static_cast(env->NewGlobalRef(env->FindClass("android/util/Pair"))); - static jmethodID const pairCtor = env->GetMethodID(pairClass, "", "(Ljava/lang/Object;Ljava/lang/Object;)V"); - static jmethodID const listAddMethod = env->GetMethodID(env->GetObjectClass(result), "add", "(Ljava/lang/Object;)Z"); + static jclass const pairClass = jni::GetGlobalClassRef(env, "android/util/Pair"); + static jmethodID const pairCtor = jni::GetConstructorID(env, pairClass, "(Ljava/lang/Object;Ljava/lang/Object;)V"); + static jmethodID const listAddMethod = jni::GetMethodID(env, result, "add", "(Ljava/lang/Object;)Z"); for (TSearchRequest const & item : items) { - jstring locale = jni::ToJavaString(env, item.first.c_str()); - jstring query = jni::ToJavaString(env, item.second.c_str()); - jobject pair = env->NewObject(pairClass, pairCtor, locale, query); - ASSERT(pair, (jni::DescribeException())); + jni::TScopedLocalRef locale(env, jni::ToJavaString(env, item.first.c_str())); + jni::TScopedLocalRef query(env, jni::ToJavaString(env, item.second.c_str())); + jni::TScopedLocalRef pair(env, env->NewObject(pairClass, pairCtor, locale.get(), query.get())); + ASSERT(pair.get(), (jni::DescribeException())); - env->CallBooleanMethod(result, listAddMethod, pair); - - env->DeleteLocalRef(locale); - env->DeleteLocalRef(query); - env->DeleteLocalRef(pair); + env->CallBooleanMethod(result, listAddMethod, pair.get()); } } diff --git a/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkCategory.cpp b/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkCategory.cpp index 01576f9861..2dd767dc82 100644 --- a/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkCategory.cpp +++ b/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkCategory.cpp @@ -105,8 +105,8 @@ Java_com_mapswithme_maps_bookmarks_data_BookmarkCategory_nativeGetTrack( ASSERT(nTrack, ("Track must not be null with index:)", bmkId)); - string formattedLenght; - MeasurementUtils::FormatDistance(nTrack->GetLengthMeters(), formattedLenght); + string formattedLength; + MeasurementUtils::FormatDistance(nTrack->GetLengthMeters(), formattedLength); dp::Color nColor = nTrack->GetColor(0); @@ -117,6 +117,6 @@ Java_com_mapswithme_maps_bookmarks_data_BookmarkCategory_nativeGetTrack( return env->NewObject(trackClazz, cId, bmkId, id, jni::ToJavaString(env, nTrack->GetName()), - jni::ToJavaString(env, formattedLenght), androidColor); + jni::ToJavaString(env, formattedLength), androidColor); } } // extern "C" diff --git a/android/jni/com/mapswithme/maps/editor/Editor.cpp b/android/jni/com/mapswithme/maps/editor/Editor.cpp index cab55b0b08..b994731ced 100644 --- a/android/jni/com/mapswithme/maps/editor/Editor.cpp +++ b/android/jni/com/mapswithme/maps/editor/Editor.cpp @@ -227,7 +227,6 @@ Java_com_mapswithme_maps_editor_Editor_nativeHasWifi(JNIEnv *, jclass) return g_editableMapObject.GetMetadata().Get(feature::Metadata::FMD_INTERNET) == "wlan"; } - JNIEXPORT jboolean JNICALL Java_com_mapswithme_maps_editor_Editor_nativeHasSomethingToUpload(JNIEnv * env, jclass clazz) { diff --git a/android/jni/com/mapswithme/maps/editor/OpeningHours.cpp b/android/jni/com/mapswithme/maps/editor/OpeningHours.cpp index 3502c3eb14..81d61aff58 100644 --- a/android/jni/com/mapswithme/maps/editor/OpeningHours.cpp +++ b/android/jni/com/mapswithme/maps/editor/OpeningHours.cpp @@ -68,9 +68,8 @@ jobjectArray JavaTimespans(JNIEnv * env, vector const & spans) jobjectArray const result = env->NewObjectArray(size, g_clazzTimespan, 0); for (int i = 0; i < size; i++) { - jobject const jSpan = JavaTimespan(env, spans[i]); - env->SetObjectArrayElement(result, i, jSpan); - env->DeleteLocalRef(jSpan); + jni::TScopedLocalRef jSpan(env, JavaTimespan(env, spans[i])); + env->SetObjectArrayElement(result, i, jSpan.get()); } return result; @@ -109,9 +108,8 @@ jobjectArray JavaTimetables(JNIEnv * env, TimeTableSet & tts) jobjectArray const result = env->NewObjectArray(size, g_clazzTimetable, 0); for (int i = 0; i < size; i++) { - jobject const jTable = JavaTimetable(env, tts.Get(i)); - env->SetObjectArrayElement(result, i, jTable); - env->DeleteLocalRef(jTable); + jni::TScopedLocalRef jTable(env, JavaTimetable(env, tts.Get(i))); + env->SetObjectArrayElement(result, i, jTable.get()); } return result; @@ -149,12 +147,9 @@ TimeTable NativeTimetable(JNIEnv * env, jobject jTimetable) size = env->GetArrayLength(jClosedSpans); for (int i = 0; i < size; i++) { - jobject const jSpan = env->GetObjectArrayElement(jClosedSpans, i); - if (jSpan) - { - tt.AddExcludeTime(NativeTimespan(env, jSpan)); - env->DeleteLocalRef(jSpan); - } + jni::TScopedLocalRef jSpan(env, env->GetObjectArrayElement(jClosedSpans, i)); + if (jSpan.get()) + tt.AddExcludeTime(NativeTimespan(env, jSpan.get())); } return tt; } @@ -168,9 +163,8 @@ TimeTableSet NativeTimetableSet(JNIEnv * env, jobjectArray jTimetables) for (int i = 1; i < size; i++) { - jobject const timetable = env->GetObjectArrayElement(jTimetables, i); - tts.Append(NativeTimetable(env, timetable)); - env->DeleteLocalRef(timetable); + jni::TScopedLocalRef timetable(env, env->GetObjectArrayElement(jTimetables, i)); + tts.Append(NativeTimetable(env, timetable.get())); } return tts; diff --git a/android/jni/com/mapswithme/maps/editor/OsmOAuth.cpp b/android/jni/com/mapswithme/maps/editor/OsmOAuth.cpp index 6bc0f231e2..11b1d96be6 100644 --- a/android/jni/com/mapswithme/maps/editor/OsmOAuth.cpp +++ b/android/jni/com/mapswithme/maps/editor/OsmOAuth.cpp @@ -3,7 +3,9 @@ #include "com/mapswithme/core/jni_helper.hpp" #include "base/logging.hpp" + #include "editor/osm_auth.hpp" +#include "editor/server_api.hpp" namespace { @@ -97,4 +99,20 @@ Java_com_mapswithme_maps_editor_OsmOAuth_nativeGetGoogleAuthUrl(JNIEnv * env, jc return nullptr; } } + +JNIEXPORT jstring JNICALL +Java_com_mapswithme_maps_editor_OsmOAuth_nativeGetOsmUsername(JNIEnv * env, jclass clazz, jstring token, jstring secret) +{ + try + { + TKeySecret keySecret(jni::ToNativeString(env, token), jni::ToNativeString(env, secret)); + ServerApi06 const api(OsmOAuth::ServerAuth(keySecret)); + return jni::ToJavaString(env, api.GetUserPreferences().m_displayName); + } + catch (exception const & ex) + { + LOG(LWARNING, ("Can't load user preferences from server: ", ex.what())); + return nullptr; + } +} } // extern "C" diff --git a/android/jni/com/mapswithme/platform/HttpThread.cpp b/android/jni/com/mapswithme/platform/HttpThread.cpp index 26c11dcc34..fa3054fb17 100644 --- a/android/jni/com/mapswithme/platform/HttpThread.cpp +++ b/android/jni/com/mapswithme/platform/HttpThread.cpp @@ -1,8 +1,7 @@ -#include "platform/http_thread_callback.hpp" - +#include "Platform.hpp" #include "../core/jni_helper.hpp" -#include "Platform.hpp" +#include "platform/http_thread_callback.hpp" class HttpThread { @@ -17,64 +16,48 @@ public: int64_t expectedFileSize, string const & pb) { - /// should create java object here. JNIEnv * env = jni::GetEnv(); - ASSERT ( env, () ); - jclass klass = env->FindClass("com/mapswithme/maps/downloader/ChunkTask"); - ASSERT ( klass, () ); - - static jmethodID initMethodId = env->GetMethodID(klass, "", "(JLjava/lang/String;JJJ[BLjava/lang/String;)V"); - ASSERT ( initMethodId, () ); + static jclass const klass = jni::GetGlobalClassRef(env, "com/mapswithme/maps/downloader/ChunkTask"); + // public ChunkTask(long httpCallbackID, String url, long beg, long end, + // long expectedFileSize, byte[] postBody, String userAgent) + static jmethodID const initMethodId = jni::GetConstructorID(env, klass, "(JLjava/lang/String;JJJ[BLjava/lang/String;)V"); + static jmethodID const startMethodId = env->GetMethodID(klass, "start", "()V"); // User id is always the same, so do not waste time on every chunk call - static string uniqueUserId = GetPlatform().UniqueClientId(); + static string const uniqueUserId = GetPlatform().UniqueClientId(); - jbyteArray postBody = 0; + jni::TScopedLocalByteArrayRef postBody(env, nullptr); size_t const postBodySize = pb.size(); if (postBodySize) { - postBody = env->NewByteArray(postBodySize); - env->SetByteArrayRegion(postBody, 0, postBodySize, reinterpret_cast(pb.c_str())); + postBody.reset(env->NewByteArray(postBodySize)); + env->SetByteArrayRegion(postBody.get(), 0, postBodySize, reinterpret_cast(pb.c_str())); } - jstring jUrl = env->NewStringUTF(url.c_str()); - jstring jUserId = env->NewStringUTF(uniqueUserId.c_str()); - jobject const localSelf = env->NewObject(klass, - initMethodId, - reinterpret_cast(&cb), - jUrl, - static_cast(beg), - static_cast(end), - static_cast(expectedFileSize), - postBody, - jUserId); - m_self = env->NewGlobalRef(localSelf); - ASSERT ( m_self, () ); - - env->DeleteLocalRef(localSelf); - env->DeleteLocalRef(postBody); - env->DeleteLocalRef(jUrl); - env->DeleteLocalRef(jUserId); - - static jmethodID startMethodId = env->GetMethodID(klass, "start", "()V"); - ASSERT ( startMethodId, () ); - - env->DeleteLocalRef(klass); + jni::TScopedLocalRef jUrl(env, jni::ToJavaString(env, url.c_str())); + jni::TScopedLocalRef jUserId(env, jni::ToJavaString(env, uniqueUserId.c_str())); + jni::TScopedLocalRef localSelf(env, env->NewObject(klass, + initMethodId, + reinterpret_cast(&cb), + jUrl.get(), + static_cast(beg), + static_cast(end), + static_cast(expectedFileSize), + postBody.get(), + jUserId.get())); + m_self = env->NewGlobalRef(localSelf.get()); + ASSERT(m_self, ()); env->CallVoidMethod(m_self, startMethodId); + jni::DumpDalvikReferenceTables(); } ~HttpThread() { JNIEnv * env = jni::GetEnv(); - ASSERT ( env, () ); - jmethodID methodId = jni::GetMethodID(env, m_self, "cancel", "(Z)Z"); - ASSERT ( methodId, () ); - env->CallBooleanMethod(m_self, methodId, false); - env->DeleteGlobalRef(m_self); } }; @@ -100,22 +83,22 @@ namespace downloader extern "C" { - JNIEXPORT jboolean JNICALL - Java_com_mapswithme_maps_downloader_ChunkTask_nativeOnWrite(JNIEnv * env, jclass clazz, jlong httpCallbackID, jlong beg, jbyteArray data, jlong size) - { - downloader::IHttpThreadCallback * cb = reinterpret_cast(httpCallbackID); - jbyte * buf = env->GetByteArrayElements(data, 0); - ASSERT ( buf, () ); +JNIEXPORT jboolean JNICALL +Java_com_mapswithme_maps_downloader_ChunkTask_nativeOnWrite(JNIEnv * env, jclass clazz, jlong httpCallbackID, jlong beg, jbyteArray data, jlong size) +{ + downloader::IHttpThreadCallback * cb = reinterpret_cast(httpCallbackID); + jbyte * buf = env->GetByteArrayElements(data, 0); + ASSERT(buf, ()); - bool const ret = cb->OnWrite(beg, buf, size); - env->ReleaseByteArrayElements(data, buf, 0); - return ret; - } - - JNIEXPORT void JNICALL - Java_com_mapswithme_maps_downloader_ChunkTask_nativeOnFinish(JNIEnv * env, jclass clazz, jlong httpCallbackID, jlong httpCode, jlong beg, jlong end) - { - downloader::IHttpThreadCallback * cb = reinterpret_cast(httpCallbackID); - cb->OnFinish(httpCode, beg, end); - } + bool const ret = cb->OnWrite(beg, buf, size); + env->ReleaseByteArrayElements(data, buf, 0); + return ret; } + +JNIEXPORT void JNICALL +Java_com_mapswithme_maps_downloader_ChunkTask_nativeOnFinish(JNIEnv * env, jclass clazz, jlong httpCallbackID, jlong httpCode, jlong beg, jlong end) +{ + downloader::IHttpThreadCallback * cb = reinterpret_cast(httpCallbackID); + cb->OnFinish(httpCode, beg, end); +} +} // extern "C" diff --git a/android/res/layout/item_osm_edits.xml b/android/res/layout/item_osm_edits.xml index 2c7259a6ef..afe64c285f 100644 --- a/android/res/layout/item_osm_edits.xml +++ b/android/res/layout/item_osm_edits.xml @@ -25,6 +25,7 @@ android:layout_marginStart="@dimen/margin_half" android:background="?circleAccent" android:scaleType="center" + android:tint="?cardBackground" tools:src="@drawable/ic_device"/>