[android] android part of adaptation

This commit is contained in:
ExMix 2014-05-15 11:33:15 +03:00 committed by Alex Zolotarev
parent bacc53e24b
commit bd1c2ce569
7 changed files with 150 additions and 98 deletions

View file

@ -8,6 +8,7 @@
#include "../../../../../map/framework.hpp"
#include "../../../../../map/measurement_utils.hpp"
#include "../../../../../map/user_mark.hpp"
#include "../../../../../gui/controller.hpp"
@ -444,7 +445,7 @@ namespace android
::Framework * f = NativeFramework();
// Call ClearXXX first, then RemovePin (Framework::Invalidate is called inside).
f->GetBookmarkManager().AdditionalPoiLayerClear();
f->GetBookmarkManager().UserMarksClear(UserMarkContainer::SEARCH_MARK);
f->GetBalloonManager().RemovePin();
f->GetBalloonManager().Dismiss();
f->Invalidate();
@ -570,12 +571,12 @@ namespace android
GetPinClickManager().OnClick(m2::PointD(x, y), m_wasLongClick);
}
BookmarkAndCategory Framework::AddBookmark(size_t cat, Bookmark & bm)
BookmarkAndCategory Framework::AddBookmark(size_t cat, m2::PointD const & pt, BookmarkCustomData & bm)
{
return BookmarkAndCategory(cat, m_work.AddBookmark(cat, bm));
return BookmarkAndCategory(cat, m_work.AddBookmark(cat, pt, bm));
}
void Framework::ReplaceBookmark(BookmarkAndCategory const & ind, Bookmark & bm)
void Framework::ReplaceBookmark(BookmarkAndCategory const & ind, BookmarkCustomData & bm)
{
m_work.ReplaceBookmark(ind.first, ind.second, bm);
}
@ -583,13 +584,14 @@ namespace android
size_t Framework::ChangeBookmarkCategory(BookmarkAndCategory const & ind, size_t newCat)
{
BookmarkCategory * pOld = m_work.GetBmCategory(ind.first);
Bookmark bmk(*(pOld->GetBookmark(ind.second)));
Bookmark const * oldBm = pOld->GetBookmark(ind.second);
m2::PointD pt = oldBm->GetOrg();
BookmarkCustomData bm(static_cast<BookmarkCustomData const &>(oldBm->GetCustomData()));
pOld->DeleteBookmark(ind.second);
pOld->SaveToKMLFile();
return AddBookmark(newCat, bmk).second;
return AddBookmark(newCat, pt, bm).second;
}
bool Framework::IsDownloadingActive()
@ -607,6 +609,7 @@ namespace android
void Framework::DeactivatePopup()
{
GetPinClickManager().RemovePin();
GetPinClickManager().Hide();
}
@ -634,6 +637,13 @@ namespace android
}
template <class T>
T const & CastData(UserCustomData const & data)
{
return static_cast<T const &>(data);
}
//============ GLUE CODE for com.mapswithme.maps.Framework class =============//
/* ____
* _ |||| _
@ -646,7 +656,7 @@ namespace android
extern "C"
{
// API
void CallOnApiPointActivatedListener(shared_ptr<jobject> obj, url_scheme::ApiPoint const & apiPoint)
void CallOnApiPointActivatedListener(shared_ptr<jobject> obj, ApiCustomData const & data, double lat, double lon)
{
JNIEnv * jniEnv = jni::GetEnv();
const jmethodID methodID = jni::GetJavaMethodID(jniEnv,
@ -654,22 +664,23 @@ extern "C"
"onApiPointActivated",
"(DDLjava/lang/String;Ljava/lang/String;)V");
jstring j_name = jni::ToJavaString(jniEnv, apiPoint.m_name);
jstring j_id = jni::ToJavaString(jniEnv, apiPoint.m_id);
jniEnv->CallVoidMethod(*obj.get(), methodID, apiPoint.m_lat, apiPoint.m_lon, j_name, j_id);
jstring j_name = jni::ToJavaString(jniEnv, data.GetName());
jstring j_id = jni::ToJavaString(jniEnv, data.GetID());
jniEnv->CallVoidMethod(*obj.get(), methodID, lat, lon, j_name, j_id);
}
// Additional layer
void CallOnAdditionalLayerActivatedListener(shared_ptr<jobject> obj, size_t index)
{
JNIEnv * jniEnv = jni::GetEnv();
const jmethodID methodID = jni::GetJavaMethodID(jniEnv,
*obj.get(),
"onAdditionalLayerActivated",
"(J)V");
void CallOnAdditionalLayerActivatedListener(shared_ptr<jobject> obj, size_t index)
{
JNIEnv * jniEnv = jni::GetEnv();
const jmethodID methodID = jni::GetJavaMethodID(jniEnv,
*obj.get(),
"onAdditionalLayerActivated",
"(J)V");
jniEnv->CallVoidMethod(*obj.get(), methodID, static_cast<jlong>(index));
}
jniEnv->CallVoidMethod(*obj.get(), methodID, static_cast<jlong>(index));
}
// POI
void CallOnPoiActivatedListener(shared_ptr<jobject> obj, m2::PointD const & globalPoint, search::AddressInfo const & addrInfo)
@ -684,7 +695,7 @@ extern "C"
const char * signature = "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;DD)V";
const jmethodID methodId = jni::GetJavaMethodID(jniEnv, *obj.get(),
"onPoiActivated", signature);
"onPoiActivated", signature);
jniEnv->CallVoidMethod(*obj.get(), methodId, j_name, j_type, j_address, lat, lon);
}
@ -697,13 +708,71 @@ extern "C"
jniEnv->CallVoidMethod(*obj.get(), methodId, bmkAndCat.first, bmkAndCat.second);
}
// My Position
void CallOnMyPositionActivatedListener(shared_ptr<jobject> obj, double lat, double lon)
void CallOnUserMarkActivated(shared_ptr<jobject> obj, UserMark const * mark)
{
JNIEnv * jniEnv = jni::GetEnv();
const jmethodID methodId = jni::GetJavaMethodID(jniEnv, *obj.get(),
"onMyPositionActivated", "(DD)V");
jniEnv->CallVoidMethod(*obj.get(), methodId, lat, lon);
::Framework * fm = g_framework->NativeFramework();
UserCustomData const & data = mark->GetCustomData();
switch (data.GetType())
{
case UserCustomData::API:
{
double lat, lon;
mark->GetLatLon(lat, lon);
CallOnApiPointActivatedListener(obj, CastData<ApiCustomData>(data), lat, lon);
}
break;
case UserCustomData::BOOKMARK:
{
BookmarkAndCategory bmAndCat = MakeEmptyBookmarkAndCategory();
for (size_t i = 0; i < fm->GetBmCategoriesCount(); ++i)
{
if (fm->GetBmCategory(i) == mark->GetContainer())
{
bmAndCat.first = i;
break;
}
}
ASSERT(bmAndCat.first != MakeEmptyBookmarkAndCategory().first, ());
BookmarkCategory const * cat = fm->GetBmCategory(bmAndCat.first);
for (size_t i = 0; i < cat->GetBookmarksCount(); ++i)
{
if (cat->GetBookmark(i) == mark)
{
bmAndCat.second = i;
break;
}
}
ASSERT(IsValid(bmAndCat), ());
CallOnBookmarkActivatedListener(obj, bmAndCat);
}
break;
case UserCustomData::POI:
{
search::AddressInfo info;
fm->GetAddressInfoForGlobalPoint(mark->GetOrg(), info);
CallOnPoiActivatedListener(obj, mark->GetOrg(), info);
}
break;
case UserCustomData::SEARCH:
{
UserMarkContainer::Controller & c = fm->GetBookmarkManager().UserMarksGetController(UserMarkContainer::SEARCH_MARK);
size_t index = (size_t)-1;
for (size_t i = 0; i < c.GetUserMarkCount(); ++i)
{
if (c.GetUserMark(i) == mark)
{
index = i;
break;
}
}
ASSERT(index != (size_t) -1, ());
CallOnAdditionalLayerActivatedListener(obj, index);
}
break;
}
}
// Dismiss information box
@ -730,7 +799,7 @@ extern "C"
JNIEXPORT void JNICALL
Java_com_mapswithme_maps_Framework_nativeClearApiPoints(JNIEnv * env, jclass clazz)
{
g_framework->NativeFramework()->ClearMapApiPoints();
g_framework->NativeFramework()->GetBookmarkManager().UserMarksClear(UserMarkContainer::API_MARK);
}
JNIEXPORT void JNICALL
@ -739,11 +808,7 @@ extern "C"
PinClickManager & manager = g_framework->GetPinClickManager();
shared_ptr<jobject> obj = jni::make_global_ref(l);
manager.ConnectApiListener(bind(&CallOnApiPointActivatedListener, obj, _1));
manager.ConnectPoiListener(bind(&CallOnPoiActivatedListener, obj, _1, _2));
manager.ConnectBookmarkListener(bind(&CallOnBookmarkActivatedListener, obj, _1));
manager.ConnectPositionListener(bind(&CallOnMyPositionActivatedListener, obj, _1, _2));
manager.ConnectAdditionalListener(bind(&CallOnAdditionalLayerActivatedListener, obj, _1));
manager.ConnectUserMarkListener(bind(&CallOnUserMarkActivated, obj, _1));
manager.ConnectDismissListener(bind(&CallOnDismissListener, obj));
}
@ -896,24 +961,26 @@ extern "C"
Java_com_mapswithme_maps_Framework_injectData(JNIEnv * env, jclass clazz, jobject jsearchResult, jlong index)
{
const size_t nIndex = static_cast<size_t>(index);
ASSERT_LESS(nIndex , g_framework->NativeFramework()->AdditionalLayerNumberOfPoi(), ("Invalid index", nIndex));
Bookmark * b = g_framework->NativeFramework()->
GetBookmarkManager().AdditionalPoiLayerGetBookmark(nIndex);
BookmarkManager & m = g_framework->NativeFramework()->GetBookmarkManager();
UserMarkContainer::Controller & c = m.UserMarksGetController(UserMarkContainer::SEARCH_MARK);
ASSERT_LESS(nIndex , c.GetUserMarkCount(), ("Invalid index", nIndex));
UserMark const * mark = c.GetUserMark(nIndex);
SearchCustomData const & data = CastData<SearchCustomData>(mark->GetCustomData());
const jclass javaClazz = env->GetObjectClass(jsearchResult);
const jfieldID nameId = env->GetFieldID(javaClazz, "mName", "Ljava/lang/String;");
env->SetObjectField(jsearchResult, nameId, jni::ToJavaString(env, b->GetName()));
env->SetObjectField(jsearchResult, nameId, jni::ToJavaString(env, data.GetName()));
const jfieldID typeId = env->GetFieldID(javaClazz, "mTypeName", "Ljava/lang/String;");
env->SetObjectField(jsearchResult, typeId, jni::ToJavaString(env, b->GetDescription()));
env->SetObjectField(jsearchResult, typeId, jni::ToJavaString(env, data.GetTypeName()));
const jfieldID latId = env->GetFieldID(javaClazz, "mLat", "D");
env->SetDoubleField(jsearchResult, latId, MercatorBounds::YToLat(b->GetOrg().y));
env->SetDoubleField(jsearchResult, latId, MercatorBounds::YToLat(mark->GetOrg().y));
const jfieldID lonId = env->GetFieldID(javaClazz, "mLon", "D");
env->SetDoubleField(jsearchResult, lonId, MercatorBounds::XToLon(b->GetOrg().x));
env->SetDoubleField(jsearchResult, lonId, MercatorBounds::XToLon(mark->GetOrg().x));
}
JNIEXPORT void JNICALL

View file

@ -118,8 +118,8 @@ namespace android
void Scale(double k);
BookmarkAndCategory AddBookmark(size_t category, Bookmark & bm);
void ReplaceBookmark(BookmarkAndCategory const & ind, Bookmark & bm);
BookmarkAndCategory AddBookmark(size_t category, m2::PointD const & pt, BookmarkCustomData & bm);
void ReplaceBookmark(BookmarkAndCategory const & ind, BookmarkCustomData & bm);
size_t ChangeBookmarkCategory(BookmarkAndCategory const & ind, size_t newCat);
::Framework * NativeFramework();

View file

@ -48,7 +48,7 @@ extern "C"
Bookmark const * p = getBookmark(cat, bmk);
// initialize new bookmark
Bookmark bm(p->GetOrg(), jni::ToNativeString(env, name), jni::ToNativeString(env, type));
BookmarkCustomData bm(jni::ToNativeString(env, name), jni::ToNativeString(env, type));
if (descr != 0)
bm.SetDescription(jni::ToNativeString(env, descr));
else

View file

@ -94,8 +94,8 @@ extern "C"
MercatorBounds::LatToY(lat));
::Framework * f = frm();
Bookmark bmk(glbPoint, jni::ToNativeString(env, name), f->LastEditedBMType());
return g_framework->AddBookmark(frm()->LastEditedBMCategory(), bmk).second;
BookmarkCustomData bmk(jni::ToNativeString(env, name), f->LastEditedBMType());
return g_framework->AddBookmark(frm()->LastEditedBMCategory(), glbPoint, bmk).second;
}
JNIEXPORT jint JNICALL

View file

@ -19,55 +19,6 @@ PinClickManager::PinClickManager(Framework & f)
: m_f(f)
{}
//graphics::DisplayList * PinClickManager::GetSearchPinDL()
//{
// using namespace graphics;
// if (!m_searchPinDL)
// {
// Screen * cacheScreen = m_f.GetGuiController()->GetCacheScreen();
// m_searchPinDL = cacheScreen->createDisplayList();
// cacheScreen->beginFrame();
// cacheScreen->setDisplayList(m_searchPinDL);
// Icon::Info infoKey("search-result-active");
// Resource const * res = cacheScreen->fromID(cacheScreen->findInfo(infoKey));
// shared_ptr<gl::BaseTexture> texture = cacheScreen->pipeline(res->m_pipelineID).texture();
// m2::RectU texRect = res->m_texRect;
// double halfSizeX = texRect.SizeX() / 2.0;
// double halfSizeY = texRect.SizeY() / 2.0;
// m2::PointD coords[] =
// {
// m2::PointD(-halfSizeX, -halfSizeY),
// m2::PointD(-halfSizeX, halfSizeY),
// m2::PointD(halfSizeX, -halfSizeY),
// m2::PointD(halfSizeX, halfSizeY)
// };
// m2::PointF normal(0.0, 0.0);
// m2::PointF texCoords[] =
// {
// texture->mapPixel(m2::PointF(texRect.minX(), texRect.minY())),
// texture->mapPixel(m2::PointF(texRect.minX(), texRect.maxY())),
// texture->mapPixel(m2::PointF(texRect.maxX(), texRect.minY())),
// texture->mapPixel(m2::PointF(texRect.maxX(), texRect.maxY()))
// };
// cacheScreen->addTexturedStripStrided(coords, sizeof(m2::PointD),
// &normal, 0,
// texCoords, sizeof(m2::PointF),
// 4, graphics::activePinDepth, res->m_pipelineID);
// cacheScreen->setDisplayList(NULL);
// cacheScreen->endFrame();
// }
// return m_searchPinDL;
//}
void PinClickManager::Hide()
{
m_f.Invalidate();

View file

@ -1506,8 +1506,7 @@ UserMark const * Framework::ActivateUserMark(m2::PointD const & pxPoint, bool is
}
}
if (mark)
m_bmManager.ActivateMark(mark);
m_bmManager.ActivateMark(mark);
return mark;
}

View file

@ -205,7 +205,10 @@ void UserMarkContainer::Draw(PaintOverlayEvent const & e)
graphics::Screen * screen = e.GetDrawer()->screen();
ScreenBase modelView = e.GetModelView();
if (m_activeMark != NULL)
{
LOG(LINFO, ("Scale for active mark = ", GetActiveMarkScale()));
(void)DrawFunctor(GetActiveMarkScale(), modelView, GetActiveDL(), screen)(m_activeMark);
}
DrawFunctor f(1.0, modelView, GetDL(), screen);
for_each(m_userMarks.begin(), m_userMarks.end(), f);
@ -344,11 +347,43 @@ graphics::DisplayList * UserMarkContainer::GetActiveDL()
graphics::DisplayList * UserMarkContainer::CreateDL(const string & symbolName)
{
using namespace graphics;
graphics::DisplayList * dl = m_cacheScreen->createDisplayList();
m_cacheScreen->beginFrame();
m_cacheScreen->setDisplayList(dl);
m_cacheScreen->drawSymbol(m2::PointD(0.0, 0.0), symbolName, graphics::EPosCenter, m_layerDepth);
m_cacheScreen->setDisplayList(0);
Icon::Info infoKey(symbolName);
Resource const * res = m_cacheScreen->fromID(m_cacheScreen->findInfo(infoKey));
shared_ptr<gl::BaseTexture> texture = m_cacheScreen->pipeline(res->m_pipelineID).texture();
m2::RectU texRect = res->m_texRect;
double halfSizeX = texRect.SizeX() / 2.0;
double halfSizeY = texRect.SizeY() / 2.0;
m2::PointD coords[] =
{
m2::PointD(-halfSizeX, -halfSizeY),
m2::PointD(-halfSizeX, halfSizeY),
m2::PointD(halfSizeX, -halfSizeY),
m2::PointD(halfSizeX, halfSizeY)
};
m2::PointF normal(0.0, 0.0);
m2::PointF texCoords[] =
{
texture->mapPixel(m2::PointF(texRect.minX(), texRect.minY())),
texture->mapPixel(m2::PointF(texRect.minX(), texRect.maxY())),
texture->mapPixel(m2::PointF(texRect.maxX(), texRect.minY())),
texture->mapPixel(m2::PointF(texRect.maxX(), texRect.maxY()))
};
m_cacheScreen->addTexturedStripStrided(coords, sizeof(m2::PointD),
&normal, 0,
texCoords, sizeof(m2::PointF),
4, m_layerDepth, res->m_pipelineID);
m_cacheScreen->setDisplayList(NULL);
m_cacheScreen->endFrame();
return dl;