From 51eaec33fd7b9e59631136a41ab56e260134712d Mon Sep 17 00:00:00 2001 From: Dmitry Yunitsky Date: Tue, 24 Feb 2015 19:37:54 +0300 Subject: [PATCH] Pass metadata for POI from core to java. --- android/jni/com/mapswithme/maps/Framework.cpp | 21 ++++- .../src/com/mapswithme/maps/Framework.java | 2 +- .../src/com/mapswithme/maps/MWMActivity.java | 6 +- .../maps/bookmarks/data/MapObject.java | 14 +++- .../maps/bookmarks/data/Metadata.java | 82 +++++++++++++++++++ indexer/feature_meta.hpp | 10 +++ indexer/index.cpp | 1 + map/framework.cpp | 9 +- map/framework.hpp | 2 +- map/user_mark.hpp | 7 ++ 10 files changed, 142 insertions(+), 12 deletions(-) create mode 100644 android/src/com/mapswithme/maps/bookmarks/data/Metadata.java diff --git a/android/jni/com/mapswithme/maps/Framework.cpp b/android/jni/com/mapswithme/maps/Framework.cpp index e135498082..d11abbc208 100644 --- a/android/jni/com/mapswithme/maps/Framework.cpp +++ b/android/jni/com/mapswithme/maps/Framework.cpp @@ -821,7 +821,8 @@ extern "C" } // POI - void CallOnPoiActivatedListener(shared_ptr obj, m2::PointD const & globalPoint, search::AddressInfo const & addrInfo) + void CallOnPoiActivatedListener(shared_ptr obj, m2::PointD const & globalPoint, + search::AddressInfo const & addrInfo, feature::FeatureMetadata const & metadata) { JNIEnv * jniEnv = jni::GetEnv(); @@ -831,10 +832,22 @@ extern "C" const double lon = MercatorBounds::XToLon(globalPoint.x); const double lat = MercatorBounds::YToLat(globalPoint.y); - const char * signature = "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;DD)V"; + const vector metaTypes = metadata.GetPresentTypes(); + const jintArray j_metaTypes = jniEnv->NewIntArray(metadata.Size()); + jint * arr = jniEnv->GetIntArrayElements(j_metaTypes, 0); + const jobjectArray j_metaValues = jniEnv->NewObjectArray(metadata.Size(), jni::GetStringClass(jniEnv), 0); + for (int i = 0; i < metaTypes.size(); i++) + { + arr[i] = metaTypes[i]; + feature::FeatureMetadata::EMetadataType metaType = static_cast(metaTypes[i]); + jniEnv->SetObjectArrayElement(j_metaValues, i, jni::ToJavaString(jniEnv, metadata.Get(metaType))); + } + jniEnv->ReleaseIntArrayElements(j_metaTypes, arr, 0); + + const char * signature = "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;DD[I[Ljava/lang/String;)V"; const jmethodID methodId = jni::GetJavaMethodID(jniEnv, *obj.get(), "onPoiActivated", signature); - jniEnv->CallVoidMethod(*obj.get(), methodId, j_name, j_type, j_address, lat, lon); + jniEnv->CallVoidMethod(*obj.get(), methodId, j_name, j_type, j_address, lat, lon, j_metaTypes, j_metaValues); } // Bookmark @@ -879,7 +892,7 @@ extern "C" case UserMark::POI: { PoiMarkPoint const * poiMark = CastMark(mark); - CallOnPoiActivatedListener(obj, mark->GetOrg(), poiMark->GetInfo()); + CallOnPoiActivatedListener(obj, mark->GetOrg(), poiMark->GetInfo(), poiMark->GetMetadata()); } break; case UserMark::SEARCH: diff --git a/android/src/com/mapswithme/maps/Framework.java b/android/src/com/mapswithme/maps/Framework.java index 5fff2bae0a..ce1ac87c40 100644 --- a/android/src/com/mapswithme/maps/Framework.java +++ b/android/src/com/mapswithme/maps/Framework.java @@ -16,7 +16,7 @@ public class Framework { public void onApiPointActivated(double lat, double lon, String name, String id); - public void onPoiActivated(String name, String type, String address, double lat, double lon); + public void onPoiActivated(String name, String type, String address, double lat, double lon, int[] metaTypes, String[] metaValues); public void onBookmarkActivated(int category, int bookmarkIndex); diff --git a/android/src/com/mapswithme/maps/MWMActivity.java b/android/src/com/mapswithme/maps/MWMActivity.java index ebf07d716f..15379821b8 100644 --- a/android/src/com/mapswithme/maps/MWMActivity.java +++ b/android/src/com/mapswithme/maps/MWMActivity.java @@ -90,7 +90,6 @@ import java.io.Serializable; import java.util.List; import java.util.Stack; import java.util.concurrent.TimeUnit; -import android.os.Debug; public class MWMActivity extends NvEventQueueActivity implements LocationHelper.LocationListener, OnBalloonListener, @@ -1337,9 +1336,12 @@ public class MWMActivity extends NvEventQueueActivity } @Override - public void onPoiActivated(final String name, final String type, final String address, final double lat, final double lon) + public void onPoiActivated(final String name, final String type, final String address, final double lat, final double lon, + final int[] metaTypes, final String[] metaValues) { final MapObject poi = new MapObject.Poi(name, lat, lon, type); + for (int i = 0; i < metaTypes.length; i++) + poi.addMetadata(metaTypes[i], metaValues[i]); runOnUiThread(new Runnable() { diff --git a/android/src/com/mapswithme/maps/bookmarks/data/MapObject.java b/android/src/com/mapswithme/maps/bookmarks/data/MapObject.java index 217d5b1c6f..3c5b329926 100644 --- a/android/src/com/mapswithme/maps/bookmarks/data/MapObject.java +++ b/android/src/com/mapswithme/maps/bookmarks/data/MapObject.java @@ -14,6 +14,7 @@ public abstract class MapObject protected double mLat; protected double mLon; protected String mTypeName; + protected Metadata mMetadata; public MapObject(String name, double lat, double lon, String typeName) { @@ -21,6 +22,7 @@ public abstract class MapObject mLat = lat; mLon = lon; mTypeName = typeName; + mMetadata = new Metadata(); } private static boolean isEmpty(String s) @@ -108,6 +110,16 @@ public abstract class MapObject public String getPoiTypeName() { return mTypeName; } + public void addMetadata(int type, String value) + { + mMetadata.addMetadata(type, value); + } + + public String getMetadata(Metadata.MetadataType type) + { + return mMetadata.getMetadata(type); + } + public abstract MapObjectType getType(); public static enum MapObjectType implements Serializable @@ -177,8 +189,6 @@ public abstract class MapObject public static class MyPosition extends MapObject { - - public MyPosition(String name, double lat, double lon) { super(name, lat, lon, ""); diff --git a/android/src/com/mapswithme/maps/bookmarks/data/Metadata.java b/android/src/com/mapswithme/maps/bookmarks/data/Metadata.java new file mode 100644 index 0000000000..4173ef53e9 --- /dev/null +++ b/android/src/com/mapswithme/maps/bookmarks/data/Metadata.java @@ -0,0 +1,82 @@ +package com.mapswithme.maps.bookmarks.data; + +import java.util.HashMap; +import java.util.Map; + +public class Metadata +{ + // values MUST correspond to definitions from feature_meta.hpp + public enum MetadataType + { + FMD_CUISINE(1), + FMD_OPEN_HOURS(2), + FMD_PHONE_NUMBER(3), + FMD_FAX_NUMBER(4), + FMD_STARS(5), + FMD_OPERATOR(6), + FMD_URL(7), + FMD_INTERNET(8), + FMD_ELE(9), + FMD_TURN_LANES(10), + FMD_TURN_LANES_FORWARD(11), + FMD_TURN_LANES_BACKWARD(12), + FMD_EMAIL(13); + + private int mMetaType; + + MetadataType(int metadataType) + { + mMetaType = metadataType; + } + + public static MetadataType fromInt(int metaType) + { + for (MetadataType type : values()) + if (type.mMetaType == metaType) + return type; + + return null; + } + } + + private Map mMetadataMap = new HashMap<>(); + + /** + * Adds metadata with type code and value. Returns false if metaType is wrong or unknown + * + * @param metaType + * @param metaValue + * @return true, if metadata was added, false otherwise + */ + public boolean addMetadata(int metaType, String metaValue) + { + final MetadataType type = MetadataType.fromInt(metaType); + if (type == null) + return false; + + mMetadataMap.put(type, metaValue); + return true; + } + + /** + * Adds metadata with type and value. + * + * @param type + * @param value + * @return true, if metadata was added, false otherwise + */ + public boolean addMetadata(MetadataType type, String value) + { + mMetadataMap.put(type, value); + return true; + } + + /** + * @param type + * @return null if metadata doesn't exist + */ + public String getMetadata(MetadataType type) + { + return mMetadataMap.get(type); + } +} diff --git a/indexer/feature_meta.hpp b/indexer/feature_meta.hpp index 2bfdd6263b..ffe2294caf 100644 --- a/indexer/feature_meta.hpp +++ b/indexer/feature_meta.hpp @@ -7,6 +7,7 @@ #include "../std/string.hpp" #include "../std/limits.hpp" #include "../std/algorithm.hpp" +#include "../std/vector.hpp" namespace feature { @@ -51,6 +52,15 @@ namespace feature return (it == m_metadata.end()) ? string() : it->second; } + vector GetPresentTypes() const + { + vector types; + for (auto item: m_metadata) + types.push_back(static_cast(item.first)); + + return types; + } + void Drop(EMetadataType type) { m_metadata.erase(type); diff --git a/indexer/index.cpp b/indexer/index.cpp index 2aab7a75e4..2d65e1286e 100644 --- a/indexer/index.cpp +++ b/indexer/index.cpp @@ -193,4 +193,5 @@ bool Index::FeaturesLoaderGuard::IsWorld() const void Index::FeaturesLoaderGuard::GetFeature(uint32_t offset, FeatureType & ft) { m_vector.Get(offset, ft); + ft.SetID(FeatureID(m_lock.GetID(), offset)); } diff --git a/map/framework.cpp b/map/framework.cpp index 466f117d97..c352b0b041 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1677,7 +1677,7 @@ OEPointerT GetClosestToPivot(list const & l, m2::PointD const & pxPo #endif // USE_DRAPE bool Framework::GetVisiblePOI(m2::PointD const & pxPoint, m2::PointD & pxPivot, - search::AddressInfo & info) const + search::AddressInfo & info, feature::FeatureMetadata & metadata) const { #ifndef USE_DRAPE graphics::OverlayElement::UserInfo ui; @@ -1714,6 +1714,9 @@ bool Framework::GetVisiblePOI(m2::PointD const & pxPoint, m2::PointD & pxPivot, FeatureType ft; guard.GetFeature(ui.m_offset, ft); + ft.ParseMetadata(); + metadata = ft.GetMetadata(); + // @TODO experiment with other pivots ASSERT_NOT_EQUAL(ft.GetFeatureType(), feature::GEOM_LINE, ()); m2::PointD const center = feature::GetCenter(ft); @@ -1817,7 +1820,8 @@ UserMark const * Framework::GetUserMark(m2::PointD const & pxPoint, bool isLongP bool needMark = false; m2::PointD pxPivot; search::AddressInfo info; - if (GetVisiblePOI(pxPoint, pxPivot, info)) + feature::FeatureMetadata metadata; + if (GetVisiblePOI(pxPoint, pxPivot, info, metadata)) needMark = true; else if (isLongPress) { @@ -1831,6 +1835,7 @@ UserMark const * Framework::GetUserMark(m2::PointD const & pxPoint, bool isLongP PoiMarkPoint * poiMark = UserMarkContainer::UserMarkForPoi(); poiMark->SetPtOrg(m_navigator.PtoG(pxPivot)); poiMark->SetInfo(info); + poiMark->SetMetadata(metadata); mark = poiMark; } } diff --git a/map/framework.hpp b/map/framework.hpp index 2850fe9456..91de7a28fe 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -357,7 +357,7 @@ private: void GetLocality(m2::PointD const & pt, search::AddressInfo & info) const; public: - bool GetVisiblePOI(m2::PointD const & pxPoint, m2::PointD & pxPivot, search::AddressInfo & info) const; + bool GetVisiblePOI(m2::PointD const & pxPoint, m2::PointD & pxPivot, search::AddressInfo & info, feature::FeatureMetadata & metadata) const; #ifndef USE_DRAPE virtual void BeginPaint(shared_ptr const & e); diff --git a/map/user_mark.hpp b/map/user_mark.hpp index fb0b55cb51..5bf34c0db3 100644 --- a/map/user_mark.hpp +++ b/map/user_mark.hpp @@ -2,6 +2,8 @@ #include "../geometry/point2d.hpp" +#include "../indexer/feature.hpp" + #include "../search/result.hpp" #include "../std/string.hpp" @@ -123,6 +125,10 @@ public: search::AddressInfo const & GetInfo() const { return m_info; } void SetInfo(search::AddressInfo const & info) { m_info = info; } + + feature::FeatureMetadata const & GetMetadata() const { return m_metadata; } + void SetMetadata(feature::FeatureMetadata const & metadata) { m_metadata = metadata; } + virtual UserMarkCopy * Copy() const { return new UserMarkCopy(new SearchMarkPoint(m_info, m_ptOrg, m_container)); @@ -130,6 +136,7 @@ public: protected: search::AddressInfo m_info; + feature::FeatureMetadata m_metadata; }; class PoiMarkPoint : public SearchMarkPoint