From a53c5a703354563dc78d179c4fe78e3af4ec6812 Mon Sep 17 00:00:00 2001 From: Arsentiy Milchakov Date: Thu, 2 Aug 2018 20:06:56 +0300 Subject: [PATCH] [ios][android] Closed or Popular condition is added for everywhere search --- .../jni/com/mapswithme/maps/SearchEngine.cpp | 29 ++++++++++++++----- .../mapswithme/maps/search/SearchResult.java | 5 +++- .../Search/TableView/MWMSearchCommonCell.mm | 29 ++++++++++++++----- search/result.hpp | 3 ++ 4 files changed, 51 insertions(+), 15 deletions(-) diff --git a/android/jni/com/mapswithme/maps/SearchEngine.cpp b/android/jni/com/mapswithme/maps/SearchEngine.cpp index 144ba3a64b..2d64e8bc9c 100644 --- a/android/jni/com/mapswithme/maps/SearchEngine.cpp +++ b/android/jni/com/mapswithme/maps/SearchEngine.cpp @@ -14,6 +14,8 @@ #include "platform/network_policy.hpp" +#include "geometry/distance_on_sphere.hpp" + #include "base/assert.hpp" #include "base/logging.hpp" @@ -280,6 +282,11 @@ jmethodID g_endBookmarksResultsId; booking::filter::Tasks g_lastBookingFilterTasks; +bool PopularityHasHigherPriority(bool hasPosition, double distanceInMeters) +{ + return !hasPosition || distanceInMeters > search::Result::kPopularityHighPriorityMinDistance; +} + jobject ToJavaResult(Result & result, search::ProductInfo const & productInfo, bool hasPosition, double lat, double lon) { @@ -298,16 +305,23 @@ jobject ToJavaResult(Result & result, search::ProductInfo const & productInfo, b ms::LatLon ll = ms::LatLon::Zero(); string distance; - if (result.HasPoint()) + double distanceInMeters = 0.0; + if (hasPosition) { - ll = MercatorBounds::ToLatLon(result.GetFeatureCenter()); - if (hasPosition) + if (result.HasPoint()) { - double dummy; - (void) fr->GetDistanceAndAzimut(result.GetFeatureCenter(), lat, lon, 0, distance, dummy); + auto const center = result.GetFeatureCenter(); + ll = MercatorBounds::ToLatLon(center); + + distanceInMeters = ms::DistanceOnEarth(lat, lon, + MercatorBounds::YToLat(center.y), + MercatorBounds::XToLon(center.x)); + measurement_utils::FormatDistance(distanceInMeters, distance); } } + bool popularityHasHigherPriority = PopularityHasHigherPriority(hasPosition, distanceInMeters); + if (result.IsSuggest()) { jni::TScopedLocalRef name(env, jni::ToJavaString(env, result.GetString())); @@ -338,7 +352,8 @@ jobject ToJavaResult(Result & result, search::ProductInfo const & productInfo, b dist.get(), cuisine.get(), pricing.get(), rating, result.GetStarsCount(), - static_cast(result.IsOpenNow()))); + static_cast(result.IsOpenNow()), + static_cast(popularityHasHigherPriority))); jni::TScopedLocalRef name(env, jni::ToJavaString(env, result.GetString())); jobject ret = @@ -624,7 +639,7 @@ extern "C" g_descriptionConstructor = jni::GetConstructorID(env, g_descriptionClass, "(Lcom/mapswithme/maps/bookmarks/data/FeatureId;" "Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;" - "Ljava/lang/String;Ljava/lang/String;FII)V"); + "Ljava/lang/String;Ljava/lang/String;FIIZ)V"); g_mapResultsMethod = jni::GetMethodID(env, g_javaListener, "onMapSearchResults", "([Lcom/mapswithme/maps/search/NativeMapSearchListener$Result;JZ)V"); diff --git a/android/src/com/mapswithme/maps/search/SearchResult.java b/android/src/com/mapswithme/maps/search/SearchResult.java index 084974367e..221aae9ad4 100644 --- a/android/src/com/mapswithme/maps/search/SearchResult.java +++ b/android/src/com/mapswithme/maps/search/SearchResult.java @@ -34,9 +34,11 @@ public class SearchResult implements SearchData public final float rating; public final int stars; public final int openNow; + public final boolean popularityHasHigherPriority; public Description(FeatureId featureId, String featureType, String region, String distance, - String cuisine, String pricing, float rating, int stars, int openNow) + String cuisine, String pricing, float rating, int stars, int openNow, + boolean popularityHasHigherPriority) { this.featureId = featureId; this.featureType = featureType; @@ -47,6 +49,7 @@ public class SearchResult implements SearchData this.rating = rating; this.stars = stars; this.openNow = openNow; + this.popularityHasHigherPriority = popularityHasHigherPriority; } } diff --git a/iphone/Maps/UI/Search/TableView/MWMSearchCommonCell.mm b/iphone/Maps/UI/Search/TableView/MWMSearchCommonCell.mm index 787c23d2dd..3f87d88f76 100644 --- a/iphone/Maps/UI/Search/TableView/MWMSearchCommonCell.mm +++ b/iphone/Maps/UI/Search/TableView/MWMSearchCommonCell.mm @@ -4,12 +4,22 @@ #include "map/place_page_info.hpp" +#include "search/result.hpp" + #include "geometry/mercator.hpp" #include "platform/measurement_utils.hpp" #include "defines.hpp" +namespace +{ +bool PopularityHasHigherPriority(bool hasPosition, double distanceInMeters) +{ + return !hasPosition || distanceInMeters > search::Result::kPopularityHighPriorityMinDistance; +} +} // namespace + @interface MWMSearchCommonCell () @property(nonatomic) IBOutletCollection(UIImageView) NSArray * infoRatingStars; @@ -74,19 +84,24 @@ [self clearInfo]; self.closedView.hidden = (result.IsOpenNow() != osm::No); - if (result.HasPoint()) + + CLLocation * lastLocation = [MWMLocationManager lastLocation]; + double distanceInMeters = 0.0; + if (lastLocation) { - string distanceStr; - CLLocation * lastLocation = [MWMLocationManager lastLocation]; - if (lastLocation) + if (result.HasPoint()) { - double const dist = + distanceInMeters = MercatorBounds::DistanceOnEarth(lastLocation.mercator, result.GetFeatureCenter()); - measurement_utils::FormatDistance(dist, distanceStr); + string distanceStr; + measurement_utils::FormatDistance(distanceInMeters, distanceStr); + + self.distanceLabel.text = @(distanceStr.c_str()); } - self.distanceLabel.text = @(distanceStr.c_str()); } + bool popularityHasHigherPriority = PopularityHasHigherPriority(lastLocation, distanceInMeters); + if (productInfo.m_isLocalAdsCustomer) self.backgroundColor = [UIColor bannerBackground]; else if (isAvailable) diff --git a/search/result.hpp b/search/result.hpp index 10bb764372..a62d6265b2 100644 --- a/search/result.hpp +++ b/search/result.hpp @@ -59,6 +59,9 @@ public: bool m_isInitialized = false; }; + // Min distance to search result when popularity label has a higher priority (in meters). + static auto constexpr kPopularityHighPriorityMinDistance = 50000.0; + // For Type::Feature. Result(FeatureID const & id, m2::PointD const & pt, std::string const & str, std::string const & address, std::string const & featureTypeName, uint32_t featureType,