From 4a9ad42ec71c3481a27144e59b67fce9b6116981 Mon Sep 17 00:00:00 2001 From: tatiana-yan Date: Wed, 18 Sep 2019 16:21:46 +0300 Subject: [PATCH] [search][map] Add custom search result type for postcodes. --- .../src/com/mapswithme/maps/MwmApplication.java | 1 + iphone/Maps/Classes/MapsAppDelegate.mm | 1 + map/framework.cpp | 13 +++++++++++++ map/framework.hpp | 2 ++ map/place_page_info.cpp | 7 +++++++ map/place_page_info.hpp | 1 + search/intermediate_result.cpp | 10 ++++++++-- search/intermediate_result.hpp | 16 ++++++++++------ search/processor.cpp | 7 ++----- search/ranker.cpp | 9 +++++---- search/result.cpp | 6 ++++++ search/result.hpp | 6 +++++- .../postcode_points_tests.cpp | 2 +- 13 files changed, 62 insertions(+), 19 deletions(-) diff --git a/android/src/com/mapswithme/maps/MwmApplication.java b/android/src/com/mapswithme/maps/MwmApplication.java index 997fb259ce..a40ba7e8d4 100644 --- a/android/src/com/mapswithme/maps/MwmApplication.java +++ b/android/src/com/mapswithme/maps/MwmApplication.java @@ -291,6 +291,7 @@ public class MwmApplication extends Application implements AppBackgroundTracker. nativeAddLocalization("core_my_places", getString(R.string.core_my_places)); nativeAddLocalization("core_my_position", getString(R.string.core_my_position)); nativeAddLocalization("core_placepage_unknown_place", getString(R.string.core_placepage_unknown_place)); + nativeAddLocalization("postal_code", getString(R.string.postal_code)); nativeAddLocalization("wifi", getString(R.string.wifi)); } diff --git a/iphone/Maps/Classes/MapsAppDelegate.mm b/iphone/Maps/Classes/MapsAppDelegate.mm index b1e56c6cc2..db856dfe14 100644 --- a/iphone/Maps/Classes/MapsAppDelegate.mm +++ b/iphone/Maps/Classes/MapsAppDelegate.mm @@ -71,6 +71,7 @@ void InitLocalizedStrings() f.AddString("core_my_places", L(@"core_my_places").UTF8String); f.AddString("core_my_position", L(@"core_my_position").UTF8String); f.AddString("core_placepage_unknown_place", L(@"core_placepage_unknown_place").UTF8String); + f.AddString("postal_code", L(@"postal_code").UTF8String); f.AddString("wifi", L(@"wifi").UTF8String); } diff --git a/map/framework.cpp b/map/framework.cpp index e8c5001cbd..ed73a55801 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -476,6 +476,7 @@ Framework::Framework(FrameworkParams const & params) m_stringsBundle.SetDefaultString("core_placepage_unknown_place", "Unknown Place"); m_stringsBundle.SetDefaultString("core_my_places", "My Places"); m_stringsBundle.SetDefaultString("core_my_position", "My Position"); + m_stringsBundle.SetDefaultString("postal_code", "Postal Code"); // Wi-Fi string is used in categories that's why does not have core_ prefix m_stringsBundle.SetDefaultString("wifi", "WiFi"); @@ -910,6 +911,13 @@ void Framework::FillPointInfo(place_page::Info & info, m2::PointD const & mercat info.SetMercator(mercator); } +void Framework::FillPostcodeInfo(string const & postcode, m2::PointD const & mercator, + place_page::Info & info) const +{ + info.SetCustomNames(postcode, m_stringsBundle.GetString("postal_code")); + info.SetMercator(mercator); +} + void Framework::FillInfoFromFeatureType(FeatureType & ft, place_page::Info & info) const { using place_page::SponsoredType; @@ -1716,6 +1724,11 @@ void Framework::SelectSearchResult(search::Result const & result, bool animation scale = scales::GetUpperComfortScale(); break; + case Result::Type::Postcode: + FillPostcodeInfo(result.GetString(), result.GetFeatureCenter(), info); + scale = scales::GetUpperComfortScale(); + break; + case Result::Type::SuggestFromFeature: case Result::Type::PureSuggest: ASSERT(false, ("Suggests should not be here.")); return; } diff --git a/map/framework.hpp b/map/framework.hpp index 6ff66932f1..caa910da0e 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -739,6 +739,8 @@ private: /// @param customTitle, if not empty, overrides any other calculated name. void FillPointInfo(place_page::Info & info, m2::PointD const & mercator, string const & customTitle = {}, FeatureMatcher && matcher = nullptr) const; + void FillPostcodeInfo(std::string const & postcode, m2::PointD const & mercator, + place_page::Info & info) const; void FillInfoFromFeatureType(FeatureType & ft, place_page::Info & info) const; void FillApiMarkInfo(ApiMarkPoint const & api, place_page::Info & info) const; void FillSearchResultInfo(SearchMarkPoint const & smp, place_page::Info & info) const; diff --git a/map/place_page_info.cpp b/map/place_page_info.cpp index e8b9d74560..0ae4d0b421 100644 --- a/map/place_page_info.cpp +++ b/map/place_page_info.cpp @@ -180,6 +180,13 @@ void Info::SetCustomName(std::string const & name) m_customName = name; } +void Info::SetCustomNames(std::string const & title, std::string const & subtitle) +{ + m_uiTitle = title; + m_uiSubtitle = subtitle; + m_customName = title; +} + void Info::SetCustomNameWithCoordinates(m2::PointD const & mercator, std::string const & name) { if (IsBookmark()) diff --git a/map/place_page_info.hpp b/map/place_page_info.hpp index 2edcd493a0..0ef7de602e 100644 --- a/map/place_page_info.hpp +++ b/map/place_page_info.hpp @@ -126,6 +126,7 @@ public: /// UI setters void SetCustomName(std::string const & name); + void SetCustomNames(std::string const & title, std::string const & subtitle); void SetCustomNameWithCoordinates(m2::PointD const & mercator, std::string const & name); void SetAddress(std::string const & address) { m_address = address; } void SetIsMyPosition() { m_isMyPosition = true; } diff --git a/search/intermediate_result.cpp b/search/intermediate_result.cpp index 2107fbd66d..bb042ce028 100644 --- a/search/intermediate_result.cpp +++ b/search/intermediate_result.cpp @@ -137,7 +137,7 @@ RankerResult::RankerResult(FeatureType & f, m2::PointD const & center, m2::Point : m_id(f.GetID()) , m_types(f) , m_str(displayName) - , m_resultType(ftypes::IsBuildingChecker::Instance()(m_types) ? TYPE_BUILDING : TYPE_FEATURE) + , m_resultType(ftypes::IsBuildingChecker::Instance()(m_types) ? Type::Building : Type::Feature) , m_geomType(f.GetGeomType()) { ASSERT(m_id.IsValid(), ()); @@ -152,11 +152,17 @@ RankerResult::RankerResult(FeatureType & f, m2::PointD const & center, m2::Point } RankerResult::RankerResult(double lat, double lon) - : m_str("(" + measurement_utils::FormatLatLon(lat, lon) + ")"), m_resultType(TYPE_LATLON) + : m_str("(" + measurement_utils::FormatLatLon(lat, lon) + ")"), m_resultType(Type::LatLon) { m_region.SetParams(string(), MercatorBounds::FromLatLon(lat, lon)); } +RankerResult::RankerResult(m2::PointD const & coord, string const & postcode) + : m_str(postcode), m_resultType(Type::Postcode) +{ + m_region.SetParams(string(), coord); +} + bool RankerResult::GetCountryId(storage::CountryInfoGetter const & infoGetter, uint32_t ftype, storage::CountryId & countryId) const { diff --git a/search/intermediate_result.hpp b/search/intermediate_result.hpp index 00491f0aba..9dac7e7b32 100644 --- a/search/intermediate_result.hpp +++ b/search/intermediate_result.hpp @@ -86,20 +86,24 @@ private: class RankerResult { public: - enum Type + enum class Type { - TYPE_LATLON, - TYPE_FEATURE, - TYPE_BUILDING //!< Buildings are not filtered out in duplicates filter. + LatLon, + Feature, + Building, //!< Buildings are not filtered out in duplicates filter. + Postcode }; - /// For RESULT_FEATURE and RESULT_BUILDING. + /// For Type::Feature and Type::Building. RankerResult(FeatureType & f, m2::PointD const & center, m2::PointD const & pivot, std::string const & displayName, std::string const & fileName); - /// For RESULT_LATLON. + /// For Type::LatLon. RankerResult(double lat, double lon); + /// For Type::Postcode. + RankerResult(m2::PointD const & coord, std::string const & postcode); + bool IsStreet() const; search::RankingInfo const & GetRankingInfo() const { return m_info; } diff --git a/search/processor.cpp b/search/processor.cpp index 079e70cecc..ee1f75a571 100644 --- a/search/processor.cpp +++ b/search/processor.cpp @@ -570,11 +570,8 @@ void Processor::SearchPostcode() for (auto const & p : points) r.Add(p); - auto const center = r.Center(); - auto const lat = MercatorBounds::YToLat(center.y); - auto const lon = MercatorBounds::XToLon(center.x); - m_emitter.AddResultNoChecks(m_ranker.MakeResult(RankerResult(lat, lon), true /* needAddress */, - false /* needHighlighting */)); + m_emitter.AddResultNoChecks(m_ranker.MakeResult( + RankerResult(r.Center(), query), true /* needAddress */, false /* needHighlighting */)); m_emitter.Emit(); return; } diff --git a/search/ranker.cpp b/search/ranker.cpp index 3240fb4c20..033d098166 100644 --- a/search/ranker.cpp +++ b/search/ranker.cpp @@ -245,7 +245,7 @@ bool ResultExists(RankerResult const & p, vector const & results, // Filter equal features in different mwms. auto equalCmp = [&p, &minDistanceOnMapBetweenResults](RankerResult const & r) -> bool { if (p.GetResultType() == r.GetResultType() && - p.GetResultType() == RankerResult::Type::TYPE_FEATURE) + p.GetResultType() == RankerResult::Type::Feature) { if (p.IsEqualCommon(r)) return PointDistance(p.GetCenter(), r.GetCenter()) < minDistanceOnMapBetweenResults; @@ -544,13 +544,14 @@ Result Ranker::MakeResult(RankerResult const & rankerResult, bool needAddress, auto mk = [&](RankerResult const & r) -> Result { switch (r.GetResultType()) { - case RankerResult::Type::TYPE_FEATURE: - case RankerResult::Type::TYPE_BUILDING: + case RankerResult::Type::Feature: + case RankerResult::Type::Building: { auto const type = rankerResult.GetBestType(m_params.m_preferredTypes); return Result(r.GetID(), r.GetCenter(), name, address, type, r.GetMetadata()); } - case RankerResult::Type::TYPE_LATLON: return Result(r.GetCenter(), name, address); + case RankerResult::Type::LatLon: return Result(r.GetCenter(), name, address); + case RankerResult::Type::Postcode: return Result(r.GetCenter(), name); } ASSERT(false, ("Bad RankerResult type:", static_cast(r.GetResultType()))); UNREACHABLE(); diff --git a/search/result.cpp b/search/result.cpp index e8042d9269..74b4817422 100644 --- a/search/result.cpp +++ b/search/result.cpp @@ -31,6 +31,11 @@ Result::Result(m2::PointD const & pt, string const & latlon, string const & addr { } +Result::Result(m2::PointD const & pt, string const & postcode) + : m_resultType(Type::Postcode), m_center(pt), m_str(postcode) +{ +} + Result::Result(string const & str, string const & suggest) : m_resultType(Type::PureSuggest), m_str(str), m_suggestionStr(suggest) { @@ -155,6 +160,7 @@ string DebugPrint(Result::Type type) case Result::Type::LatLon: return "LatLon"; case Result::Type::PureSuggest: return "PureSuggest"; case Result::Type::SuggestFromFeature: return "SuggestFromFeature"; + case Result::Type::Postcode: return "Postcode"; } return "Unknown"; diff --git a/search/result.hpp b/search/result.hpp index 70e7ccde57..b109c6507b 100644 --- a/search/result.hpp +++ b/search/result.hpp @@ -37,7 +37,8 @@ public: Feature, LatLon, PureSuggest, - SuggestFromFeature + SuggestFromFeature, + Postcode }; // Metadata for search results. Considered valid if GetResultType() == Type::Feature. @@ -76,6 +77,9 @@ public: // For Type::LatLon. Result(m2::PointD const & pt, std::string const & latlon, std::string const & address); + // For Type::Postcode. + Result(m2::PointD const & pt, std::string const & postcode); + // For Type::PureSuggest. Result(std::string const & str, std::string const & suggest); diff --git a/search/search_integration_tests/postcode_points_tests.cpp b/search/search_integration_tests/postcode_points_tests.cpp index 9d687a3fd1..5b640fb694 100644 --- a/search/search_integration_tests/postcode_points_tests.cpp +++ b/search/search_integration_tests/postcode_points_tests.cpp @@ -122,7 +122,7 @@ UNIT_CLASS_TEST(PostcodePointsTest, SearchPostcode) TEST_EQUAL(results.size(), 1, ()); auto const & result = results[0]; - TEST_EQUAL(result.GetResultType(), Result::Type::LatLon, ()); + TEST_EQUAL(result.GetResultType(), Result::Type::Postcode, ()); TEST(result.HasPoint(), ()); auto const actual = result.GetFeatureCenter();