diff --git a/map/framework.cpp b/map/framework.cpp index 8280abe35b..227cff46bb 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -859,8 +859,10 @@ void Framework::FillInfoFromFeatureType(FeatureType const & ft, place_page::Info if (m_bannerSet.HasBannerForFeature(ft)) info.m_banner = m_bannerSet.GetBannerForFeature(ft); + auto const mwmInfo = ft.GetID().m_mwmId.GetInfo(); + bool const isMapVersionEditable = mwmInfo && mwmInfo->m_version.IsEditableMap(); info.m_canEditOrAdd = featureStatus != osm::Editor::FeatureStatus::Obsolete && CanEditMap() && - !info.IsNotEditableSponsored(); + !info.IsNotEditableSponsored() && isMapVersionEditable; info.m_localizedWifiString = m_stringsBundle.GetString("wifi"); info.m_localizedRatingString = m_stringsBundle.GetString("place_page_booking_rating"); diff --git a/platform/mwm_version.cpp b/platform/mwm_version.cpp index bf713c0d2c..47f3391382 100644 --- a/platform/mwm_version.cpp +++ b/platform/mwm_version.cpp @@ -19,6 +19,12 @@ namespace version { namespace { +// Editing maps older than approximately two months old is disabled, since the data +// is most likely already fixed on OSM. Not limited to the latest one or two versions, +// because a user can forget to update maps after a new app version has been installed +// automatically in the background. +uint64_t constexpr kMaxSecondsTillNoEdits = 3600 * 24 * 31 * 2; + uint64_t VersionToSecondsSinceEpoch(uint64_t version) { auto constexpr partsCount = 3; @@ -74,6 +80,11 @@ uint32_t MwmVersion::GetVersion() const return my::GenerateYYMMDD(tm.tm_year, tm.tm_mon, tm.tm_mday); } +bool MwmVersion::IsEditableMap() const +{ + return m_secondsSinceEpoch + kMaxSecondsTillNoEdits > my::SecondsSinceEpoch(); +} + string DebugPrint(Format f) { return "v" + strings::to_string(static_cast(f) + 1); diff --git a/platform/mwm_version.hpp b/platform/mwm_version.hpp index 0f18e0b74d..66b5e57b29 100644 --- a/platform/mwm_version.hpp +++ b/platform/mwm_version.hpp @@ -36,6 +36,7 @@ public: void SetFormat(Format format) { m_format = format; } void SetSecondsSinceEpoch(uint64_t secondsSinceEpoch) { m_secondsSinceEpoch = secondsSinceEpoch; } + bool IsEditableMap() const; private: /// Data layout format in mwm file.