Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorr.kuznetsov <r.kuznetsov@corp.mail.ru>2018-04-25 13:05:55 +0300
committerDaria Volvenkova <d.volvenkova@corp.mail.ru>2018-05-10 11:21:44 +0300
commit92bef56a178251a3a9b65d06f4e2a69be0cec1b1 (patch)
treea3cbb8cb70a1078615a03b83e704c4d103a27335
parente400ad6c46526cac178ed7522523881fae436361 (diff)
Added hidden local ads objects
-rw-r--r--drape_frontend/backend_renderer.cpp14
-rw-r--r--drape_frontend/custom_features_context.hpp15
-rw-r--r--drape_frontend/drape_engine.cpp2
-rw-r--r--drape_frontend/drape_engine.hpp8
-rwxr-xr-xdrape_frontend/frontend_renderer.cpp4
-rw-r--r--drape_frontend/message.hpp2
-rw-r--r--drape_frontend/message_subclasses.hpp13
-rwxr-xr-xdrape_frontend/read_manager.cpp13
-rwxr-xr-xdrape_frontend/read_manager.hpp3
-rw-r--r--drape_frontend/rule_drawer.cpp4
-rw-r--r--map/framework.cpp4
-rw-r--r--map/framework.hpp2
-rw-r--r--map/local_ads_manager.cpp68
-rw-r--r--map/local_ads_manager.hpp7
14 files changed, 90 insertions, 69 deletions
diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp
index dc2d853d33..2cbbeab6ba 100644
--- a/drape_frontend/backend_renderer.cpp
+++ b/drape_frontend/backend_renderer.cpp
@@ -453,13 +453,11 @@ void BackendRenderer::AcceptMessage(ref_ptr<Message> message)
case Message::SetCustomFeatures:
{
ref_ptr<SetCustomFeaturesMessage> msg = message;
- if (m_readManager->SetCustomFeatures(msg->AcceptFeatures()))
- {
- m_commutator->PostMessage(ThreadsCommutator::RenderThread,
- make_unique_dp<UpdateCustomFeaturesMessage>(
- m_readManager->GetCustomFeaturesArray()),
- MessagePriority::Normal);
- }
+ m_readManager->SetCustomFeatures(msg->AcceptFeatures());
+ m_commutator->PostMessage(ThreadsCommutator::RenderThread,
+ make_unique_dp<SetTrackedFeaturesMessage>(
+ m_readManager->GetCustomFeaturesArray()),
+ MessagePriority::Normal);
break;
}
@@ -475,7 +473,7 @@ void BackendRenderer::AcceptMessage(ref_ptr<Message> message)
if (changed)
{
m_commutator->PostMessage(ThreadsCommutator::RenderThread,
- make_unique_dp<UpdateCustomFeaturesMessage>(
+ make_unique_dp<SetTrackedFeaturesMessage>(
m_readManager->GetCustomFeaturesArray()),
MessagePriority::Normal);
}
diff --git a/drape_frontend/custom_features_context.hpp b/drape_frontend/custom_features_context.hpp
index 3d250e912f..0a4d231e64 100644
--- a/drape_frontend/custom_features_context.hpp
+++ b/drape_frontend/custom_features_context.hpp
@@ -2,23 +2,28 @@
#include "indexer/feature_decl.hpp"
+#include <map>
#include <memory>
-#include <set>
#include <utility>
namespace df
{
+using CustomFeatures = std::map<FeatureID, bool>;
+
struct CustomFeaturesContext
{
- std::set<FeatureID> const m_features;
+ CustomFeatures const m_features;
- explicit CustomFeaturesContext(std::set<FeatureID> && features)
+ explicit CustomFeaturesContext(CustomFeatures && features)
: m_features(std::move(features))
{}
- bool Contains(FeatureID const & id) const
+ bool NeedDiscard(FeatureID const & id) const
{
- return m_features.find(id) != m_features.cend();
+ auto const it = m_features.find(id);
+ if (it == m_features.cend())
+ return false;
+ return it->second;
}
};
diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp
index e4d5658934..7fe08c3b52 100644
--- a/drape_frontend/drape_engine.cpp
+++ b/drape_frontend/drape_engine.cpp
@@ -753,7 +753,7 @@ void DrapeEngine::RunScenario(ScenarioManager::ScenarioData && scenarioData,
manager->RunScenario(std::move(scenarioData), onStartFn, onFinishFn);
}
-void DrapeEngine::SetCustomFeatures(std::set<FeatureID> && ids)
+void DrapeEngine::SetCustomFeatures(df::CustomFeatures && ids)
{
m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread,
make_unique_dp<SetCustomFeaturesMessage>(std::move(ids)),
diff --git a/drape_frontend/drape_engine.hpp b/drape_frontend/drape_engine.hpp
index ed53324e58..b56724b9bb 100644
--- a/drape_frontend/drape_engine.hpp
+++ b/drape_frontend/drape_engine.hpp
@@ -2,6 +2,7 @@
#include "drape_frontend/backend_renderer.hpp"
#include "drape_frontend/color_constants.hpp"
+#include "drape_frontend/custom_features_context.hpp"
#include "drape_frontend/drape_hints.hpp"
#include "drape_frontend/frontend_renderer.hpp"
#include "drape_frontend/route_shape.hpp"
@@ -202,9 +203,10 @@ public:
ScenarioManager::ScenarioCallback const & onStartFn,
ScenarioManager::ScenarioCallback const & onFinishFn);
- // Custom features are features which we do not render usual way.
- // All these features will be skipped in process of geometry generation.
- void SetCustomFeatures(std::set<FeatureID> && ids);
+ // Custom features are features which we render different way.
+ // Value in the map shows if the feature is skipped in process of geometry generation.
+ // For all custom features (if they are overlays) statistics will be gathered.
+ void SetCustomFeatures(df::CustomFeatures && ids);
void RemoveCustomFeatures(MwmSet::MwmId const & mwmId);
void RemoveAllCustomFeatures();
diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp
index e296b6d5b8..0eeca0d50d 100755
--- a/drape_frontend/frontend_renderer.cpp
+++ b/drape_frontend/frontend_renderer.cpp
@@ -799,9 +799,9 @@ void FrontendRenderer::AcceptMessage(ref_ptr<Message> message)
break;
}
- case Message::UpdateCustomFeatures:
+ case Message::SetTrackedFeatures:
{
- ref_ptr<UpdateCustomFeaturesMessage> msg = message;
+ ref_ptr<SetTrackedFeaturesMessage> msg = message;
m_overlaysTracker->SetTrackedOverlaysFeatures(msg->AcceptFeatures());
m_forceUpdateScene = true;
break;
diff --git a/drape_frontend/message.hpp b/drape_frontend/message.hpp
index 47c98f402a..f7604d2fc0 100644
--- a/drape_frontend/message.hpp
+++ b/drape_frontend/message.hpp
@@ -78,7 +78,7 @@ public:
DrapeApiFlush,
SetCustomFeatures,
RemoveCustomFeatures,
- UpdateCustomFeatures,
+ SetTrackedFeatures,
SetPostprocessStaticTextures,
SetPosteffectEnabled,
RunFirstLaunchAnimation,
diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp
index 93c1b14e26..66a3773f99 100644
--- a/drape_frontend/message_subclasses.hpp
+++ b/drape_frontend/message_subclasses.hpp
@@ -2,6 +2,7 @@
#include "drape_frontend/circles_pack_shape.hpp"
#include "drape_frontend/color_constants.hpp"
+#include "drape_frontend/custom_features_context.hpp"
#include "drape_frontend/drape_api.hpp"
#include "drape_frontend/drape_api_builder.hpp"
#include "drape_frontend/gps_track_point.hpp"
@@ -1071,16 +1072,16 @@ private:
class SetCustomFeaturesMessage : public Message
{
public:
- explicit SetCustomFeaturesMessage(std::set<FeatureID> && ids)
+ explicit SetCustomFeaturesMessage(CustomFeatures && ids)
: m_features(std::move(ids))
{}
Type GetType() const override { return Message::SetCustomFeatures; }
- std::set<FeatureID> && AcceptFeatures() { return std::move(m_features); }
+ CustomFeatures && AcceptFeatures() { return std::move(m_features); }
private:
- std::set<FeatureID> m_features;
+ CustomFeatures m_features;
};
class RemoveCustomFeaturesMessage : public Message
@@ -1100,14 +1101,14 @@ private:
bool m_removeAll = true;
};
-class UpdateCustomFeaturesMessage : public Message
+class SetTrackedFeaturesMessage : public Message
{
public:
- explicit UpdateCustomFeaturesMessage(std::vector<FeatureID> && features)
+ explicit SetTrackedFeaturesMessage(std::vector<FeatureID> && features)
: m_features(std::move(features))
{}
- Type GetType() const override { return Message::UpdateCustomFeatures; }
+ Type GetType() const override { return Message::SetTrackedFeatures; }
std::vector<FeatureID> && AcceptFeatures() { return std::move(m_features); }
diff --git a/drape_frontend/read_manager.cpp b/drape_frontend/read_manager.cpp
index fffbf8bcad..320eba5776 100755
--- a/drape_frontend/read_manager.cpp
+++ b/drape_frontend/read_manager.cpp
@@ -337,12 +337,9 @@ void ReadManager::SetDisplacementMode(int displacementMode)
}
}
-bool ReadManager::SetCustomFeatures(std::set<FeatureID> && ids)
+void ReadManager::SetCustomFeatures(CustomFeatures && ids)
{
- size_t const sz = m_customFeaturesContext ? m_customFeaturesContext->m_features.size() : 0;
m_customFeaturesContext = std::make_shared<CustomFeaturesContext>(std::move(ids));
-
- return sz != m_customFeaturesContext->m_features.size();
}
std::vector<FeatureID> ReadManager::GetCustomFeaturesArray() const
@@ -352,7 +349,7 @@ std::vector<FeatureID> ReadManager::GetCustomFeaturesArray() const
std::vector<FeatureID> features;
features.reserve(m_customFeaturesContext->m_features.size());
for (auto const & s : m_customFeaturesContext->m_features)
- features.push_back(s);
+ features.push_back(s.first);
return features;
}
@@ -361,10 +358,10 @@ bool ReadManager::RemoveCustomFeatures(MwmSet::MwmId const & mwmId)
if (!m_customFeaturesContext)
return false;
- std::set<FeatureID> features;
+ CustomFeatures features;
for (auto const & s : m_customFeaturesContext->m_features)
{
- if (s.m_mwmId != mwmId)
+ if (s.first.m_mwmId != mwmId)
features.insert(s);
}
if (features.size() == m_customFeaturesContext->m_features.size())
@@ -379,7 +376,7 @@ bool ReadManager::RemoveAllCustomFeatures()
if (!m_customFeaturesContext || m_customFeaturesContext->m_features.empty())
return false;
- m_customFeaturesContext = std::make_shared<CustomFeaturesContext>(std::set<FeatureID>());
+ m_customFeaturesContext = std::make_shared<CustomFeaturesContext>(CustomFeatures());
return true;
}
} // namespace df
diff --git a/drape_frontend/read_manager.hpp b/drape_frontend/read_manager.hpp
index 276fc31baa..df2ee53633 100755
--- a/drape_frontend/read_manager.hpp
+++ b/drape_frontend/read_manager.hpp
@@ -25,7 +25,6 @@ class TextureManager;
namespace df
{
class MapDataProvider;
-class CoverageUpdateDescriptor;
class MetalineManager;
uint8_t constexpr kReadingThreadsCount = 2;
@@ -54,7 +53,7 @@ public:
void SetDisplacementMode(int displacementMode);
- bool SetCustomFeatures(std::set<FeatureID> && ids);
+ void SetCustomFeatures(CustomFeatures && ids);
std::vector<FeatureID> GetCustomFeaturesArray() const;
bool RemoveCustomFeatures(MwmSet::MwmId const & mwmId);
bool RemoveAllCustomFeatures();
diff --git a/drape_frontend/rule_drawer.cpp b/drape_frontend/rule_drawer.cpp
index 45d56e2770..40ab9b1cca 100644
--- a/drape_frontend/rule_drawer.cpp
+++ b/drape_frontend/rule_drawer.cpp
@@ -337,7 +337,7 @@ void RuleDrawer::ProcessAreaStyle(FeatureType const & f, Stylist const & s,
s.ForEachRule(std::bind(&ApplyAreaFeature::ProcessAreaRule, &apply, _1));
- if (!m_customFeaturesContext || !m_customFeaturesContext->Contains(f.GetID()))
+ if (!m_customFeaturesContext || !m_customFeaturesContext->NeedDiscard(f.GetID()))
apply.Finish(m_context->GetTextureManager());
}
@@ -433,7 +433,7 @@ void RuleDrawer::ProcessLineStyle(FeatureType const & f, Stylist const & s,
void RuleDrawer::ProcessPointStyle(FeatureType const & f, Stylist const & s, TInsertShapeFn const & insertShape,
int & minVisibleScale)
{
- if (m_customFeaturesContext && m_customFeaturesContext->Contains(f.GetID()))
+ if (m_customFeaturesContext && m_customFeaturesContext->NeedDiscard(f.GetID()))
return;
int const zoomLevel = m_context->GetTileKey().m_zoomLevel;
diff --git a/map/framework.cpp b/map/framework.cpp
index 0e9aec3feb..1ca7121f6c 100644
--- a/map/framework.cpp
+++ b/map/framework.cpp
@@ -3201,9 +3201,9 @@ MwmSet::MwmId Framework::GetMwmIdByName(string const & name) const
}
void Framework::ReadFeatures(function<void(FeatureType const &)> const & reader,
- set<FeatureID> const & features)
+ vector<FeatureID> const & features)
{
- m_model.ReadFeatures(reader, vector<FeatureID>(features.begin(), features.end()));
+ m_model.ReadFeatures(reader, features);
}
// RoutingManager::Delegate
diff --git a/map/framework.hpp b/map/framework.hpp
index 9dceb98472..2659182d58 100644
--- a/map/framework.hpp
+++ b/map/framework.hpp
@@ -384,7 +384,7 @@ public:
MwmSet::MwmId GetMwmIdByName(string const & name) const;
void ReadFeatures(function<void(FeatureType const &)> const & reader,
- set<FeatureID> const & features);
+ vector<FeatureID> const & features);
private:
struct TapEvent
diff --git a/map/local_ads_manager.cpp b/map/local_ads_manager.cpp
index f0c3975fe4..c5b137e3fc 100644
--- a/map/local_ads_manager.cpp
+++ b/map/local_ads_manager.cpp
@@ -48,6 +48,8 @@ uint8_t constexpr kRequestMinZoomLevel = 12;
auto constexpr kFailedDownloadingTimeout = std::chrono::seconds(2);
auto constexpr kMaxDownloadingAttempts = 5;
+auto constexpr kHiddenFeaturePriority = 1;
+
void SerializeCampaign(FileWriter & writer, std::string const & countryName,
LocalAdsManager::Timestamp const & ts,
std::vector<uint8_t> const & rawData)
@@ -92,7 +94,7 @@ std::string GetCustomIcon(FeatureType & featureType)
return {};
}
-using CampaignData = std::map<FeatureID, LocalAdsMarkData>;
+using CampaignData = std::map<FeatureID, std::shared_ptr<LocalAdsMarkData>>;
CampaignData ParseCampaign(std::vector<uint8_t> const & rawData, MwmSet::MwmId const & mwmId,
LocalAdsManager::Timestamp timestamp,
@@ -103,12 +105,18 @@ CampaignData ParseCampaign(std::vector<uint8_t> const & rawData, MwmSet::MwmId c
auto campaigns = local_ads::Deserialize(rawData);
for (local_ads::Campaign const & campaign : campaigns)
{
+ FeatureID featureId(mwmId, campaign.m_featureId);
+ if (campaign.m_priority == kHiddenFeaturePriority)
+ {
+ data.insert(std::make_pair(featureId, nullptr));
+ continue;
+ }
+
std::string iconName = campaign.GetIconName();
auto const expiration = timestamp + std::chrono::hours(24 * campaign.m_daysBeforeExpired);
if (iconName.empty() || local_ads::Clock::now() > expiration)
continue;
- FeatureID featureId(mwmId, campaign.m_featureId);
FeatureType featureType;
if (getFeatureByIdFn(featureId, featureType))
{
@@ -117,50 +125,60 @@ CampaignData ParseCampaign(std::vector<uint8_t> const & rawData, MwmSet::MwmId c
iconName = customIcon;
}
- LocalAdsMarkData markData;
- markData.m_symbolName = iconName;
- markData.m_minZoomLevel = campaign.m_minZoomLevel;
+ auto markData = std::make_shared<LocalAdsMarkData>();
+ markData->m_symbolName = iconName;
+ markData->m_minZoomLevel = campaign.m_minZoomLevel;
data.insert(std::make_pair(featureId, std::move(markData)));
}
return data;
}
-std::set<FeatureID> ReadCampaignFeatures(LocalAdsManager::ReadFeaturesFn const & reader,
- CampaignData & campaignData)
+df::CustomFeatures ReadCampaignFeatures(LocalAdsManager::ReadFeaturesFn const & reader,
+ CampaignData & campaignData)
{
ASSERT(reader != nullptr, ());
- std::set<FeatureID> features;
+ std::vector<FeatureID> features;
+ features.reserve(campaignData.size());
+ df::CustomFeatures customFeatures;
for (auto const & data : campaignData)
- features.insert(data.first);
+ {
+ if (data.second)
+ features.push_back(data.first);
+ customFeatures.insert(std::make_pair(data.first, data.second != nullptr));
+ }
auto const deviceLang = StringUtf8Multilang::GetLangIndex(languages::GetCurrentNorm());
reader([&campaignData, deviceLang](FeatureType const & ft)
{
auto it = campaignData.find(ft.GetID());
CHECK(it != campaignData.end(), ());
- it->second.m_position = feature::GetCenter(ft, scales::GetUpperScale());
+ CHECK(it->second != nullptr, ());
+ it->second->m_position = feature::GetCenter(ft, scales::GetUpperScale());
ft.GetPreferredNames(true /* allowTranslit */, deviceLang,
- it->second.m_mainText, it->second.m_auxText);
+ it->second->m_mainText, it->second->m_auxText);
}, features);
- return features;
+ return customFeatures;
}
-void CreateLocalAdsMarks(BookmarkManager * bmManager, CampaignData const & campaignData)
+void CreateLocalAdsMarks(BookmarkManager * bmManager, CampaignData && campaignData)
{
if (bmManager == nullptr)
return;
// Here we copy campaign data, because we can create user marks only from UI thread.
- GetPlatform().RunTask(Platform::Thread::Gui, [bmManager, campaignData]()
+ GetPlatform().RunTask(Platform::Thread::Gui, [bmManager, campaignData = std::move(campaignData)]()
{
auto editSession = bmManager->GetEditSession();
for (auto const & data : campaignData)
{
- auto * mark = editSession.CreateUserMark<LocalAdsMark>(data.second.m_position);
- mark->SetData(LocalAdsMarkData(data.second));
+ if (data.second == nullptr)
+ continue;
+
+ auto * mark = editSession.CreateUserMark<LocalAdsMark>(data.second->m_position);
+ mark->SetData(LocalAdsMarkData(*data.second));
mark->SetFeatureId(data.first);
}
});
@@ -229,6 +247,7 @@ LocalAdsManager::LocalAdsManager(GetMwmsByRectFn && getMwmsByRectFn,
CHECK(m_getMwmsByRectFn != nullptr, ());
CHECK(m_getMwmIdByNameFn != nullptr, ());
CHECK(m_readFeaturesFn != nullptr, ());
+ CHECK(m_getFeatureByIdFn != nullptr, ());
}
void LocalAdsManager::Startup(BookmarkManager * bmManager)
@@ -411,12 +430,11 @@ void LocalAdsManager::ProcessRequests(std::set<Request> && requests)
ClearLocalAdsForMwm(mwm);
if (!info.m_data.empty())
{
- auto campaignData = ParseCampaign(std::move(info.m_data), mwm, info.m_created,
- m_getFeatureByIdFn);
+ auto campaignData = ParseCampaign(info.m_data, mwm, info.m_created, m_getFeatureByIdFn);
if (!campaignData.empty())
{
UpdateFeaturesCache(ReadCampaignFeatures(m_readFeaturesFn, campaignData));
- CreateLocalAdsMarks(m_bmManager, campaignData);
+ CreateLocalAdsMarks(m_bmManager, std::move(campaignData));
}
}
@@ -520,17 +538,17 @@ void LocalAdsManager::Invalidate()
}
}
UpdateFeaturesCache(ReadCampaignFeatures(m_readFeaturesFn, campaignData));
- CreateLocalAdsMarks(m_bmManager, campaignData);
+ CreateLocalAdsMarks(m_bmManager, std::move(campaignData));
});
}
-void LocalAdsManager::UpdateFeaturesCache(std::set<FeatureID> && ids)
+void LocalAdsManager::UpdateFeaturesCache(df::CustomFeatures && features)
{
- std::set<FeatureID> featuresCache;
+ df::CustomFeatures featuresCache;
{
std::lock_guard<std::mutex> lock(m_featuresCacheMutex);
- if (!ids.empty())
- m_featuresCache.insert(ids.begin(), ids.end());
+ if (!features.empty())
+ m_featuresCache.insert(features.begin(), features.end());
featuresCache = m_featuresCache;
}
m_drapeEngine.SafeCall(&df::DrapeEngine::SetCustomFeatures, std::move(featuresCache));
@@ -543,7 +561,7 @@ void LocalAdsManager::ClearLocalAdsForMwm(MwmSet::MwmId const & mwmId)
std::lock_guard<std::mutex> lock(m_featuresCacheMutex);
for (auto it = m_featuresCache.begin(); it != m_featuresCache.end();)
{
- if (it->m_mwmId == mwmId)
+ if (it->first.m_mwmId == mwmId)
it = m_featuresCache.erase(it);
else
++it;
diff --git a/map/local_ads_manager.hpp b/map/local_ads_manager.hpp
index 597a8b99ab..6355381b06 100644
--- a/map/local_ads_manager.hpp
+++ b/map/local_ads_manager.hpp
@@ -2,6 +2,7 @@
#include "local_ads/statistics.hpp"
+#include "drape_frontend/custom_features_context.hpp"
#include "drape_frontend/drape_engine_safe_ptr.hpp"
#include "drape/pointers.hpp"
@@ -38,7 +39,7 @@ public:
using GetMwmIdByNameFn = std::function<MwmSet::MwmId(std::string const &)>;
using ReadFeatureTypeFn = std::function<void(FeatureType const &)>;
using ReadFeaturesFn = std::function<void(ReadFeatureTypeFn const &,
- std::set<FeatureID> const & features)>;
+ std::vector<FeatureID> const & features)>;
using GetFeatureByIdFn = std::function<bool(FeatureID const &, FeatureType &)>;
using Timestamp = local_ads::Timestamp;
@@ -76,7 +77,7 @@ private:
void ReadCampaignFile(std::string const & campaignFile);
void WriteCampaignFile(std::string const & campaignFile);
- void UpdateFeaturesCache(std::set<FeatureID> && ids);
+ void UpdateFeaturesCache(df::CustomFeatures && features);
void ClearLocalAdsForMwm(MwmSet::MwmId const &mwmId);
void FillSupportedTypes();
@@ -105,7 +106,7 @@ private:
std::map<std::string, CampaignInfo> m_info;
std::mutex m_campaignsMutex;
- std::set<FeatureID> m_featuresCache;
+ df::CustomFeatures m_featuresCache;
mutable std::mutex m_featuresCacheMutex;
ftypes::HashSetMatcher<uint32_t> m_supportedTypes;