From 84627f5b7390dfdb4876e5999806af3943d61206 Mon Sep 17 00:00:00 2001 From: Roman Kuznetsov Date: Fri, 25 Sep 2015 20:17:06 +0300 Subject: [PATCH] Removed Dontload-workaround in Android, added drape tasks --- .../mapswithme/country/ActiveCountryTree.cpp | 6 ++- .../com/mapswithme/country/CountryTree.cpp | 6 ++- android/jni/com/mapswithme/maps/Framework.cpp | 38 ++++++++++++++----- android/jni/com/mapswithme/maps/Framework.hpp | 23 ++++++----- .../jni/com/mapswithme/maps/SearchEngine.cpp | 13 ++++--- map/framework.cpp | 5 +-- 6 files changed, 56 insertions(+), 35 deletions(-) diff --git a/android/jni/com/mapswithme/country/ActiveCountryTree.cpp b/android/jni/com/mapswithme/country/ActiveCountryTree.cpp index 3434a6585f..461986a53f 100644 --- a/android/jni/com/mapswithme/country/ActiveCountryTree.cpp +++ b/android/jni/com/mapswithme/country/ActiveCountryTree.cpp @@ -103,8 +103,10 @@ extern "C" JNIEXPORT void JNICALL Java_com_mapswithme_country_ActiveCountryTree_showOnMap(JNIEnv * env, jclass clazz, jint group, jint position) { - GetMapLayout().ShowMap(ToGroup(group), position); - g_framework->DontLoadState(); + g_framework->PostDrapeTask([group, position]() + { + GetMapLayout().ShowMap(ToGroup(group), position); + }); } JNIEXPORT void JNICALL diff --git a/android/jni/com/mapswithme/country/CountryTree.cpp b/android/jni/com/mapswithme/country/CountryTree.cpp index e78cad39b1..ce534974be 100644 --- a/android/jni/com/mapswithme/country/CountryTree.cpp +++ b/android/jni/com/mapswithme/country/CountryTree.cpp @@ -92,8 +92,10 @@ extern "C" JNIEXPORT void JNICALL Java_com_mapswithme_country_CountryTree_showLeafOnMap(JNIEnv * env, jclass clazz, jint position) { - GetTree().ShowLeafOnMap(position); - g_framework->DontLoadState(); + g_framework->PostDrapeTask([position]() + { + GetTree().ShowLeafOnMap(position); + }); } JNIEXPORT jlong JNICALL diff --git a/android/jni/com/mapswithme/maps/Framework.cpp b/android/jni/com/mapswithme/maps/Framework.cpp index e7d2a42914..691c141ad7 100644 --- a/android/jni/com/mapswithme/maps/Framework.cpp +++ b/android/jni/com/mapswithme/maps/Framework.cpp @@ -60,8 +60,7 @@ enum MultiTouchAction }; Framework::Framework() - : m_doLoadState(true) - , m_lastCompass(0.0) + : m_lastCompass(0.0) , m_currentMode(location::MODE_UNKNOWN_POSITION) { ASSERT_EQUAL ( g_framework, 0, () ); @@ -166,6 +165,15 @@ bool Framework::CreateDrapeEngine(JNIEnv * env, jobject jSurface, int densityDpi m_work.CreateDrapeEngine(make_ref(m_contextFactory), move(p)); m_work.EnterForeground(); + // load initial state of the map or execute drape tasks which set up custom state + { + lock_guard lock(m_drapeQueueMutex); + if (m_drapeTasksQueue.empty()) + LoadState(); + else + ExecuteDrapeTasks(); + } + return true; } @@ -230,8 +238,6 @@ Storage & Framework::Storage() void Framework::ShowCountry(TIndex const & idx, bool zoomToDownloadButton) { - m_doLoadState = false; - if (zoomToDownloadButton) { m2::RectD const rect = m_work.GetCountryBounds(idx); @@ -282,13 +288,11 @@ void Framework::Touch(int action, Finger const & f1, Finger const & f2, uint8_t void Framework::ShowSearchResult(search::Result const & r) { - m_doLoadState = false; m_work.ShowSearchResult(r); } void Framework::ShowAllSearchResults() { - m_doLoadState = false; m_work.ShowAllSearchResults(); } @@ -412,9 +416,6 @@ size_t Framework::ChangeBookmarkCategory(BookmarkAndCategory const & ind, size_t bool Framework::ShowMapForURL(string const & url) { - /// @todo this is weird hack, we should reconsider Android lifecycle handling design - m_doLoadState = false; - return m_work.ShowMapForURL(url); } @@ -441,7 +442,6 @@ string Framework::GetOutdatedCountriesString() void Framework::ShowTrack(int category, int track) { Track const * nTrack = NativeFramework()->GetBmCategory(category)->GetTrack(track); - m_doLoadState = false; NativeFramework()->ShowTrack(*nTrack); } @@ -592,6 +592,24 @@ void Framework::InjectMetadata(JNIEnv * env, jclass const clazz, jobject const m } } +void Framework::PostDrapeTask(TDrapeTask const & task) +{ + ASSERT(task != nullptr, ()); + lock_guard lock(m_drapeQueueMutex); + if (IsDrapeEngineCreated()) + task(); + else + m_drapeTasksQueue.push_back(task); +} + +void Framework::ExecuteDrapeTasks() +{ + for (size_t i = 0; i < m_drapeTasksQueue.size(); ++i) + m_drapeTasksQueue[i](); + + m_drapeTasksQueue.clear(); +} + } // namespace android template diff --git a/android/jni/com/mapswithme/maps/Framework.hpp b/android/jni/com/mapswithme/maps/Framework.hpp index cfdff2a79c..4bf3d0dd99 100644 --- a/android/jni/com/mapswithme/maps/Framework.hpp +++ b/android/jni/com/mapswithme/maps/Framework.hpp @@ -16,12 +16,12 @@ #include "geometry/avg_vector.hpp" -#include "base/deferred_task.hpp" #include "base/timer.hpp" #include "indexer/map_style.hpp" #include "std/map.hpp" +#include "std/mutex.hpp" #include "std/shared_ptr.hpp" #include "std/unique_ptr.hpp" #include "std/cstdint.hpp" @@ -38,25 +38,16 @@ namespace android unique_ptr m_skin; typedef shared_ptr TJobject; - TJobject m_javaCountryListener; typedef map TListenerMap; TListenerMap m_javaActiveMapListeners; int m_currentSlotID; int m_activeMapsConnectionID; - bool m_doLoadState; math::LowPassVector m_sensors[2]; double m_lastCompass; - unique_ptr m_deferredTask; - bool m_wasLongClick; - - int m_densityDpi; - int m_screenWidth; - int m_screenHeight; - string m_searchQuery; float GetBestDensity(int densityDpi); @@ -72,8 +63,6 @@ namespace android storage::Storage & Storage(); - void DontLoadState() { m_doLoadState = false; } - void ShowCountry(storage::TIndex const & idx, bool zoomToDownloadButton); storage::TStatus GetCountryStatus(storage::TIndex const & idx) const; @@ -171,6 +160,10 @@ namespace android // Fills mapobject's metadata from UserMark void InjectMetadata(JNIEnv * env, jclass clazz, jobject const mapObject, UserMark const * userMark); + using TDrapeTask = function; + // Posts a task which must be executed when Drape Engine is alive + void PostDrapeTask(TDrapeTask const & task); + public: virtual void ItemStatusChanged(int childPosition); virtual void ItemProgressChanged(int childPosition, storage::LocalAndRemoteSizeT const & sizes); @@ -184,6 +177,12 @@ namespace android MapOptions const & newOpt); virtual void DownloadingProgressUpdate(storage::ActiveMapsLayout::TGroup const & group, int position, storage::LocalAndRemoteSizeT const & progress); + + private: + vector m_drapeTasksQueue; + mutex m_drapeQueueMutex; + + void ExecuteDrapeTasks(); }; } diff --git a/android/jni/com/mapswithme/maps/SearchEngine.cpp b/android/jni/com/mapswithme/maps/SearchEngine.cpp index 7ec30d3e29..10708c3af6 100644 --- a/android/jni/com/mapswithme/maps/SearchEngine.cpp +++ b/android/jni/com/mapswithme/maps/SearchEngine.cpp @@ -201,18 +201,21 @@ extern "C" Java_com_mapswithme_maps_search_SearchEngine_nativeShowResult(JNIEnv * env, jclass clazz, jint index) { lock_guard guard(g_resultsMutex); - g_framework->DontLoadState(); - Result const & result = g_results.GetResult(index); - g_framework->NativeFramework()->ShowSearchResult(result); + g_framework->PostDrapeTask([result]() + { + g_framework->NativeFramework()->ShowSearchResult(result); + }); } JNIEXPORT void JNICALL Java_com_mapswithme_maps_search_SearchEngine_nativeShowAllResults(JNIEnv * env, jclass clazz) { lock_guard guard(g_resultsMutex); - g_framework->DontLoadState(); - g_framework->NativeFramework()->ShowAllSearchResults(g_results); + g_framework->PostDrapeTask([results = g_results]() + { + g_framework->NativeFramework()->ShowAllSearchResults(results); + }); } JNIEXPORT void JNICALL diff --git a/map/framework.cpp b/map/framework.cpp index bc6166b984..619c5c6fd8 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -632,11 +632,8 @@ void Framework::SaveState() void Framework::LoadState() { m2::AnyRectD rect; - if (Settings::Get("ScreenClipRect", rect) && - df::GetWorldRect().IsRectInside(rect.GetGlobalRect())) - { + if (Settings::Get("ScreenClipRect", rect) && df::GetWorldRect().IsRectInside(rect.GetGlobalRect())) CallDrapeFunction(bind(&df::DrapeEngine::SetModelViewAnyRect, _1, rect, false)); - } else ShowAll(); }