From 7466969a8223994d09225b1133b4e1ddb2b4a7b0 Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Thu, 20 Jun 2019 19:20:53 +0300 Subject: [PATCH] Added bookmarks catalog pinger --- .../maps/bookmarks/data/BookmarkManager.cpp | 26 ++++++++++++++ .../maps/bookmarks/data/BookmarkManager.java | 24 +++++++++++++ map/bookmark_catalog.cpp | 35 +++++++++++++++++++ map/bookmark_catalog.hpp | 3 ++ 4 files changed, 88 insertions(+) diff --git a/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp b/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp index 794427dce8..bd42c2509c 100644 --- a/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp +++ b/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp @@ -46,6 +46,8 @@ jmethodID g_catalogCustomPropertyOptionConstructor; jclass g_catalogCustomPropertyClass; jmethodID g_catalogCustomPropertyConstructor; +jmethodID g_onPingFinishedMethod; + void PrepareClassRefs(JNIEnv * env) { if (g_bookmarkManagerClass) @@ -95,6 +97,8 @@ void PrepareClassRefs(JNIEnv * env) g_onUploadFinishedMethod = jni::GetMethodID(env, bookmarkManagerInstance, "onUploadFinished", "(ILjava/lang/String;JJ)V"); + g_onPingFinishedMethod = jni::GetMethodID(env, bookmarkManagerInstance, "onPingFinished", "(Z)V"); + g_bookmarkCategoryClass = jni::GetGlobalClassRef(env, "com/mapswithme/maps/bookmarks/data/BookmarkCategory"); //public BookmarkCategory(long id, @@ -351,6 +355,17 @@ void OnCustomPropertiesReceived(JNIEnv * env, bool successful, jni::HandleJavaException(env); } +void OnPingFinished(JNIEnv * env, bool isSuccessful) +{ + ASSERT(g_bookmarkManagerClass, ()); + + jobject bookmarkManagerInstance = env->GetStaticObjectField(g_bookmarkManagerClass, + g_bookmarkManagerInstanceField); + env->CallVoidMethod(bookmarkManagerInstance, g_onPingFinishedMethod, + static_cast(isSuccessful)); + jni::HandleJavaException(env); +} + void OnUploadStarted(JNIEnv * env, kml::MarkGroupId originCategoryId) { ASSERT(g_bookmarkManagerClass, ()); @@ -908,6 +923,17 @@ Java_com_mapswithme_maps_bookmarks_data_BookmarkManager_nativeRequestCatalogCust }); } +JNIEXPORT void JNICALL +Java_com_mapswithme_maps_bookmarks_data_BookmarkManager_nativePingBookmarkCatalog( + JNIEnv * env, jobject) +{ + auto & bm = frm()->GetBookmarkManager(); + bm.GetCatalog().Ping([env](bool isSuccessful) + { + OnPingFinished(env, isSuccessful); + }); +} + JNIEXPORT jobjectArray JNICALL Java_com_mapswithme_maps_bookmarks_data_BookmarkManager_nativeGetBookmarkCategories(JNIEnv *env, jobject thiz) { diff --git a/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java b/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java index 5b0ed81e74..a96b85a8b0 100644 --- a/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java +++ b/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java @@ -65,6 +65,9 @@ public enum BookmarkManager @NonNull private final List mCatalogListeners = new ArrayList<>(); + + @NonNull + private final List mCatalogPingListeners = new ArrayList<>(); static { @@ -314,6 +317,15 @@ public enum BookmarkManager } } + // Called from JNI. + @SuppressWarnings("unused") + @MainThread + public void onPingFinished(boolean serviceIsAvailable) + { + for (BookmarksCatalogPingListener listener : mCatalogPingListeners) + listener.onPingFinished(serviceIsAvailable); + } + public boolean isVisible(long catId) { return nativeIsVisible(catId); @@ -643,6 +655,11 @@ public enum BookmarkManager nativeRequestCatalogCustomProperties(); } + public void pingBookmarkCatalog() + { + nativePingBookmarkCatalog(); + } + public boolean isCategoryFromCatalog(long catId) { return nativeIsCategoryFromCatalog(catId); @@ -785,6 +802,8 @@ public enum BookmarkManager private static native void nativeRequestCatalogCustomProperties(); + private static native void nativePingBookmarkCatalog(); + public interface BookmarksLoadingListener { void onBookmarksLoadingStarted(); @@ -840,6 +859,11 @@ public enum BookmarkManager void onRestoredFilesPrepared(); } + public interface BookmarksCatalogPingListener + { + void onPingFinished(boolean serviceIsAvailable); + } + public interface BookmarksCatalogListener { /** diff --git a/map/bookmark_catalog.cpp b/map/bookmark_catalog.cpp index 69db5202df..f842a8d4b7 100644 --- a/map/bookmark_catalog.cpp +++ b/map/bookmark_catalog.cpp @@ -70,6 +70,13 @@ std::string BuildWebEditorUrl(std::string const & serverId, std::string const & return kCatalogEditorServer + "webeditor/" + language + "/edit/" + serverId; } +std::string BuildPingUrl() +{ + if (kCatalogFrontendServer.empty()) + return {}; + return kCatalogFrontendServer + "storage/ping"; +} + struct SubtagData { std::string m_name; @@ -591,6 +598,34 @@ void BookmarkCatalog::Upload(UploadData uploadData, std::string const & accessTo }); } +void BookmarkCatalog::Ping(PingCallback && callback) const +{ + auto const url = BuildPingUrl(); + if (url.empty()) + { + if (callback) + callback(false /* isSuccessful */); + return; + } + + GetPlatform().RunTask(Platform::Thread::Network, [url, callback = std::move(callback)]() + { + platform::HttpClient request(url); + request.SetRawHeader("User-Agent", GetPlatform().GetAppUserAgent()); + uint32_t constexpr kPingTimeoutInSec = 15; + request.SetTimeout(kPingTimeoutInSec); + if (request.RunHttpRequest()) + { + static std::string const kExpectedResponse = "pong"; + auto const resultCode = request.ErrorCode(); + if (callback && resultCode >= 200 && resultCode < 300 && request.ServerResponse() == kExpectedResponse) + callback(true /* isSuccessful */); + } + if (callback) + callback(false /* isSuccessful */); + }); +} + void BookmarkCatalog::SetInvalidTokenHandler(InvalidTokenHandler && onInvalidToken) { m_onInvalidToken = std::move(onInvalidToken); diff --git a/map/bookmark_catalog.hpp b/map/bookmark_catalog.hpp index 352f0fd609..c033713575 100644 --- a/map/bookmark_catalog.hpp +++ b/map/bookmark_catalog.hpp @@ -113,6 +113,9 @@ public: UploadSuccessCallback && uploadSuccessCallback, UploadErrorCallback && uploadErrorCallback); + using PingCallback = platform::SafeCallback; + void Ping(PingCallback && callback) const; + // Handler can be called from non-UI thread. void SetInvalidTokenHandler(InvalidTokenHandler && onInvalidToken);