diff --git a/android/jni/com/mapswithme/maps/SearchEngine.cpp b/android/jni/com/mapswithme/maps/SearchEngine.cpp index 53ab960921..e3d61b582f 100644 --- a/android/jni/com/mapswithme/maps/SearchEngine.cpp +++ b/android/jni/com/mapswithme/maps/SearchEngine.cpp @@ -3,6 +3,7 @@ #include "com/mapswithme/maps/UserMarkHelper.hpp" #include "com/mapswithme/platform/Platform.hpp" +#include "map/bookmarks_search_params.hpp" #include "map/everywhere_search_params.hpp" #include "map/place_page_info.hpp" #include "map/viewport_search_params.hpp" @@ -335,6 +336,9 @@ jmethodID g_mapResultsMethod; jclass g_mapResultClass; jmethodID g_mapResultCtor; +jmethodID g_updateBookmarksResultsId; +jmethodID g_endBookmarksResultsId; + booking::AvailabilityParams g_lastBookingFilterParams; jobject ToJavaResult(Result & result, search::ProductInfo const & productInfo, bool hasPosition, @@ -461,6 +465,30 @@ void OnMapSearchResults(storage::DownloaderSearchResults const & results, long l static_cast(timestamp), results.m_endMarker); } +void OnBookmarksSearchStarted() +{ + // Dummy. +} + +void OnBookmarksSearchResults(search::BookmarksSearchParams::Results const & results, + search::BookmarksSearchParams::Status status, long long timestamp) +{ + // Ignore results from obsolete searches. + if (g_queryTimestamp > timestamp) + return; + + JNIEnv * env = jni::GetEnv(); + + jni::ScopedLocalRef jResults(env, env->NewLongArray(results.size())); + vector const tmp(results.cbegin(), results.cend()); + env->SetLongArrayRegion(jResults.get(), 0, tmp.size(), tmp.data()); + + auto const method = (status == search::BookmarksSearchParams::Status::InProgress) ? + g_updateBookmarksResultsId : g_endBookmarksResultsId; + + env->CallVoidMethod(g_javaListener, method, jResults.get(), static_cast(timestamp)); +} + void OnBookingFilterResults(booking::AvailabilityParams const & params, vector const & featuresSorted) { @@ -520,6 +548,11 @@ extern "C" g_mapResultClass = jni::GetGlobalClassRef(env, "com/mapswithme/maps/search/NativeMapSearchListener$Result"); g_mapResultCtor = jni::GetConstructorID(env, g_mapResultClass, "(Ljava/lang/String;Ljava/lang/String;)V"); + g_updateBookmarksResultsId = + jni::GetMethodID(env, g_javaListener, "onBookmarksResultsUpdate", "([JJ)V"); + g_endBookmarksResultsId = + jni::GetMethodID(env, g_javaListener, "onBookmarksResultsEnd", "([JJ)V"); + g_onFilterAvailableHotelsId = jni::GetMethodID(env, g_javaListener, "onFilterAvailableHotels", "([Lcom/mapswithme/maps/bookmarks/data/FeatureId;)V"); @@ -592,6 +625,18 @@ extern "C" g_queryTimestamp = timestamp; } + JNIEXPORT void JNICALL Java_com_mapswithme_maps_search_SearchEngine_nativeRunSearchInBookmarks( + JNIEnv * env, jclass clazz, jbyteArray query, jlong timestamp) + { + search::BookmarksSearchParams params; + params.m_query = jni::ToNativeString(env, query); + params.m_onStarted = bind(&OnBookmarksSearchStarted); + params.m_onResults = bind(&OnBookmarksSearchResults, _1, _2, timestamp); + + if (g_framework->NativeFramework()->SearchInBookmarks(params)) + g_queryTimestamp = timestamp; + } + JNIEXPORT void JNICALL Java_com_mapswithme_maps_search_SearchEngine_nativeShowResult(JNIEnv * env, jclass clazz, jint index) { diff --git a/android/src/com/mapswithme/maps/search/SearchEngine.java b/android/src/com/mapswithme/maps/search/SearchEngine.java index 97af3c5e08..2a749f4490 100644 --- a/android/src/com/mapswithme/maps/search/SearchEngine.java +++ b/android/src/com/mapswithme/maps/search/SearchEngine.java @@ -59,6 +59,16 @@ public enum SearchEngine implements NativeSearchListener, }); } + public void onBookmarksResultsUpdate(@Nullable long[] bookmarkIds, long timestamp) + { + // Dummy. Will be implemented soon. + } + + public void onBookmarksResultsEnd(@Nullable long[] bookmarkIds, long timestamp) + { + // Dummy. Will be implemented soon. + } + public void onFilterAvailableHotels(@Nullable FeatureId[] availableHotels) { UiThread.run( diff --git a/map/framework.cpp b/map/framework.cpp index 2cc4e8ad3b..77ea5af550 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1243,6 +1243,11 @@ bool Framework::SearchInDownloader(DownloaderSearchParams const & params) return GetSearchAPI().SearchInDownloader(params); } +bool Framework::SearchInBookmarks(search::BookmarksSearchParams const & params) +{ + return GetSearchAPI().SearchInBookmarks(params); +} + void Framework::CancelSearch(search::Mode mode) { return GetSearchAPI().CancelSearch(mode); diff --git a/map/framework.hpp b/map/framework.hpp index c402c64818..15267f8389 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -529,6 +529,8 @@ public: // Search for maps by countries or cities. bool SearchInDownloader(storage::DownloaderSearchParams const & params); + bool SearchInBookmarks(search::BookmarksSearchParams const & params); + void CancelSearch(search::Mode mode); void CancelAllSearches();