Removed Dontload-workaround in Android, added drape tasks

This commit is contained in:
Roman Kuznetsov 2015-09-25 20:17:06 +03:00 committed by r.kuznetsov
parent cc9aa209a0
commit 84627f5b73
6 changed files with 56 additions and 35 deletions

View file

@ -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

View file

@ -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

View file

@ -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<mutex> 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<mutex> 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 <class T>

View file

@ -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<gui::Skin> m_skin;
typedef shared_ptr<jobject> TJobject;
TJobject m_javaCountryListener;
typedef map<int, TJobject> TListenerMap;
TListenerMap m_javaActiveMapListeners;
int m_currentSlotID;
int m_activeMapsConnectionID;
bool m_doLoadState;
math::LowPassVector<float, 3> m_sensors[2];
double m_lastCompass;
unique_ptr<DeferredTask> 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<void()>;
// 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<TDrapeTask> m_drapeTasksQueue;
mutex m_drapeQueueMutex;
void ExecuteDrapeTasks();
};
}

View file

@ -201,18 +201,21 @@ extern "C"
Java_com_mapswithme_maps_search_SearchEngine_nativeShowResult(JNIEnv * env, jclass clazz, jint index)
{
lock_guard<mutex> 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<mutex> 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

View file

@ -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();
}