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:
authorArsentiy Milchakov <milcars@mapswithme.com>2019-05-21 20:45:23 +0300
committermpimenov <mpimenov@users.noreply.github.com>2019-05-22 21:13:05 +0300
commit7f550f91f8521e3848d140f813fa681c12e51654 (patch)
tree6bdaa962451f994025b233fb24a2b3a43b99e946 /partners_api
parentfa59cb2a6a97839d035f33127aff5e38d334a85a (diff)
[core] synchronous cross reference url calculation after booking
Diffstat (limited to 'partners_api')
-rw-r--r--partners_api/cross_reference_api.cpp98
-rw-r--r--partners_api/cross_reference_api.hpp15
-rw-r--r--partners_api/partners_api_tests/cross_reference_tests.cpp132
3 files changed, 54 insertions, 191 deletions
diff --git a/partners_api/cross_reference_api.cpp b/partners_api/cross_reference_api.cpp
index 99c69986bc..b488774cf6 100644
--- a/partners_api/cross_reference_api.cpp
+++ b/partners_api/cross_reference_api.cpp
@@ -143,9 +143,10 @@ void Api::SetDelegate(std::unique_ptr<Delegate> delegate)
void Api::OnEnterForeground()
{
- settings::TryGet("BookingCrossReferenceIsAwaiting", m_bookingCrossReferenceIsAwaiting);
+ m_bookingCrossReferenceAwaitingForId.clear();
+ settings::TryGet("BookingCrossReferenceAwaitingForId", m_bookingCrossReferenceAwaitingForId);
- if (!m_bookingCrossReferenceIsAwaiting)
+ if (m_bookingCrossReferenceAwaitingForId.empty())
return;
auto const eyeInfo = eye::Eye::Instance().GetInfo();
@@ -155,74 +156,28 @@ void Api::OnEnterForeground()
if (timeSinceLastTransitionToBooking < kMinMinutesCountAfterBooking ||
timeSinceLastTransitionToBooking > kMaxMinutesCountAfterBooking)
{
- m_bookingCrossReferenceIsAwaiting = false;
- settings::Set("BookingCrossReferenceIsAwaiting", false);
+ settings::Delete("BookingCrossReferenceAwaitingForId");
+ m_bookingCrossReferenceAwaitingForId.clear();
}
}
bool Api::NeedToShow() const
{
- if (!m_bookingCrossReferenceIsAwaiting)
+ if (m_bookingCrossReferenceAwaitingForId.empty())
return false;
return NeedToShowImpl(eye::Eye::Instance().GetInfo());
}
-void Api::GetCrossReferenceLinkAfterBooking(AfterBookingCallback const & cb) const
+std::string Api::GetCrossReferenceLinkAfterBooking() const
{
- CHECK(m_delegate, ());
-
auto const eyeInfo = eye::Eye::Instance().GetInfo();
- if (!m_bookingCrossReferenceIsAwaiting || !NeedToShowImpl(eyeInfo))
- {
- GetPlatform().RunTask(Platform::Thread::Gui, [cb]() { cb({}); });
- return;
- }
+ if (m_bookingCrossReferenceAwaitingForId.empty() || !NeedToShowImpl(eyeInfo))
+ return "";
- GetPlatform().RunTask(Platform::Thread::Background, [this, eyeInfo, cb]()
- {
- auto const targetTime = eyeInfo->m_crossReferences.m_transitionToBookingTime;
- m2::PointD pos;
- auto const found =
- eyeInfo->m_mapObjects.FindNode([&pos, targetTime](eye::MapObject const & mapObject)
- {
- if (mapObject.GetEvents().empty())
- return false;
-
- auto const typeIt = std::find(kSupportedBookingTypes.cbegin(),
- kSupportedBookingTypes.cend(), mapObject.GetBestType());
-
- if (typeIt == kSupportedBookingTypes.cend())
- return false;
-
- for (auto const & event : mapObject.GetEvents())
- {
- switch (event.m_type)
- {
- case eye::MapObject::Event::Type::BookingBook:
- case eye::MapObject::Event::Type::BookingMore:
- case eye::MapObject::Event::Type::BookingReviews:
- case eye::MapObject::Event::Type::BookingDetails:
- {
- if (event.m_eventTime == targetTime)
- {
- pos = mapObject.GetPos();
- return true;
- }
- }
- default: continue;
- }
- }
- return false;
- });
-
- auto const osmId = found ? m_delegate->GetCityOsmId(pos) : "";
- auto const resultUrl =
- osmId.empty() ? "" : MakeCityGalleryUrl(m_baseUrl, osmId, languages::GetCurrentNorm());
-
- GetPlatform().RunTask(Platform::Thread::Gui, [cb, resultUrl]() { cb(resultUrl); });
- });
+ return MakeCityGalleryUrl(m_baseUrl, m_bookingCrossReferenceAwaitingForId,
+ languages::GetCurrentNorm());
}
void Api::GetCrossReferenceCityGallery(std::string const & osmId,
@@ -238,4 +193,35 @@ void Api::GetCrossReferenceCityGallery(m2::PointD const & point,
GetCrossReferenceCityGalleryImpl(m_baseUrl, m_delegate->GetCityOsmId(point), cb);
}
+
+void Api::OnMapObjectEvent(eye::MapObject const & mapObject)
+{
+ CHECK(!mapObject.GetEvents().empty(), ());
+
+ auto const typeIt = std::find(kSupportedBookingTypes.cbegin(), kSupportedBookingTypes.cend(),
+ mapObject.GetBestType());
+
+ if (typeIt == kSupportedBookingTypes.cend())
+ return;
+
+ m2::PointD pos;
+ bool found = false;
+ switch (mapObject.GetEvents().back().m_type)
+ {
+ case eye::MapObject::Event::Type::BookingBook:
+ case eye::MapObject::Event::Type::BookingMore:
+ case eye::MapObject::Event::Type::BookingReviews:
+ case eye::MapObject::Event::Type::BookingDetails:
+ {
+ pos = mapObject.GetPos();
+ found = true;
+ }
+ default: /* do nothing */;
+ }
+
+ auto const osmId = found ? m_delegate->GetCityOsmId(pos) : "";
+
+ if (!osmId.empty())
+ settings::Set("BookingCrossReferenceAwaitingForId", osmId);
+}
} // namespace cross_reference
diff --git a/partners_api/cross_reference_api.hpp b/partners_api/cross_reference_api.hpp
index 33f0dec148..cfd37be713 100644
--- a/partners_api/cross_reference_api.hpp
+++ b/partners_api/cross_reference_api.hpp
@@ -1,5 +1,7 @@
#pragma once
+#include "metrics/eye.hpp"
+
#include "geometry/point2d.hpp"
#include <functional>
@@ -39,10 +41,9 @@ public:
std::string const & lang, std::string & result);
};
-using AfterBookingCallback = std::function<void(std::string const & url)>;
using CityGalleryCallback = std::function<void(CityGallery const & gallery)>;
-class Api
+class Api : public eye::Subscriber
{
public:
class Delegate
@@ -58,16 +59,18 @@ public:
void SetDelegate(std::unique_ptr<Delegate> delegate);
void OnEnterForeground();
bool NeedToShow() const;
- void GetCrossReferenceLinkAfterBooking(AfterBookingCallback const & cb) const;
+ std::string GetCrossReferenceLinkAfterBooking() const;
void GetCrossReferenceCityGallery(std::string const & osmId,
CityGalleryCallback const & cb) const;
- void GetCrossReferenceCityGallery(m2::PointD const & point,
- CityGalleryCallback const & cb) const;
+ void GetCrossReferenceCityGallery(m2::PointD const & point, CityGalleryCallback const & cb) const;
+
+ // eye::Subscriber overrides:
+ void OnMapObjectEvent(eye::MapObject const & poi) override;
private:
std::unique_ptr<Delegate> m_delegate;
std::string m_baseUrl;
- bool m_bookingCrossReferenceIsAwaiting = false;
+ std::string m_bookingCrossReferenceAwaitingForId;
};
} // namespace cross_reference
diff --git a/partners_api/partners_api_tests/cross_reference_tests.cpp b/partners_api/partners_api_tests/cross_reference_tests.cpp
index 1d48e86640..8b12c62aab 100644
--- a/partners_api/partners_api_tests/cross_reference_tests.cpp
+++ b/partners_api/partners_api_tests/cross_reference_tests.cpp
@@ -69,7 +69,7 @@ UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, CrossReference_NeedToShow)
}
EyeForTesting::SetInfo(info);
- settings::Set("BookingCrossReferenceIsAwaiting", true);
+ settings::Set("BookingCrossReferenceAwaitingForId", kTestOsmId);
api.OnEnterForeground();
TEST_EQUAL(api.NeedToShow(), false, ());
@@ -94,7 +94,7 @@ UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, CrossReference_NeedToShow)
info.m_crossReferences.m_transitionToBookingTime = Clock::now() - std::chrono::hours(2);
EyeForTesting::SetInfo(info);
- settings::Set("BookingCrossReferenceIsAwaiting", true);
+ settings::Set("BookingCrossReferenceAwaitingForId", kTestOsmId);
api.OnEnterForeground();
TEST_EQUAL(api.NeedToShow(), false, ());
@@ -129,139 +129,13 @@ UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, CrossReference_NeedToShow)
info.m_crossReferences.m_transitionToBookingTime = Clock::now() - std::chrono::minutes(6);
EyeForTesting::SetInfo(info);
- settings::Set("BookingCrossReferenceIsAwaiting", true);
+ settings::Set("BookingCrossReferenceAwaitingForId", kTestOsmId);
api.OnEnterForeground();
TEST_EQUAL(api.NeedToShow(), true, ());
}
-UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, CrossReference_GetCrossReferenceLinkAfterBooking)
-{
- cross_reference::Api api;
- api.SetDelegate(std::make_unique<DelegateForTesting>());
- Info info;
- {
- MapObject poi;
- poi.SetBestType("tourism-hotel");
- poi.SetPos({53.652007, 108.143443});
- MapObject::Event eventInfo;
-
- eventInfo.m_eventTime = Clock::now() - std::chrono::hours((24 * 30 * 3) + 1);
- eventInfo.m_userPos = {72.045507, 81.408095};
- eventInfo.m_type = MapObject::Event::Type::Open;
- poi.GetEditableEvents().emplace_back(eventInfo);
-
- eventInfo.m_eventTime =
- Clock::now() - (std::chrono::hours(24 * 30 * 3) + std::chrono::seconds(1));
- eventInfo.m_userPos = {72.045400, 81.408200};
- eventInfo.m_type = MapObject::Event::Type::AddToBookmark;
- poi.GetEditableEvents().emplace_back(eventInfo);
-
- eventInfo.m_eventTime = Clock::now() - std::chrono::hours(24 * 30 * 3);
- eventInfo.m_userPos = {72.045450, 81.408201};
- eventInfo.m_type = MapObject::Event::Type::RouteToCreated;
- poi.GetEditableEvents().emplace_back(eventInfo);
-
- info.m_mapObjects.Add(poi);
- }
-
- EyeForTesting::SetInfo(info);
- settings::Set("BookingCrossReferenceIsAwaiting", true);
- api.OnEnterForeground();
-
- std::string result{};
- api.GetCrossReferenceLinkAfterBooking([&result](std::string const & url)
- {
- result = url;
- testing::Notify();
- });
-
- testing::Wait();
- TEST(result.empty(), ());
-
- auto eventTime = Clock::now() - std::chrono::hours(2);
- {
- MapObject poi;
- poi.SetBestType("tourism-hotel");
- poi.SetPos({53.652005, 108.143448});
- MapObject::Event eventInfo;
-
- eventInfo.m_eventTime = Clock::now() - std::chrono::hours(24 * 30 * 3);
- eventInfo.m_userPos = {53.016347, 158.683327};
- eventInfo.m_type = MapObject::Event::Type::Open;
- poi.GetEditableEvents().emplace_back(eventInfo);
-
- eventInfo.m_eventTime = eventTime;
- eventInfo.m_userPos = {53.016347, 158.683327};
- eventInfo.m_type = MapObject::Event::Type::BookingBook;
- poi.GetEditableEvents().emplace_back(eventInfo);
-
- info.m_mapObjects.Add(poi);
- }
-
- info.m_crossReferences.m_transitionToBookingTime = Clock::now() - std::chrono::hours(2);
- EyeForTesting::SetInfo(info);
- settings::Set("BookingCrossReferenceIsAwaiting", true);
- api.OnEnterForeground();
-
- result = {};
- api.GetCrossReferenceLinkAfterBooking([&result](std::string const & url)
- {
- result = url;
- testing::Notify();
- });
-
- testing::Wait();
- TEST(result.empty(), ());
-
- eventTime = Clock::now() - std::chrono::minutes(6);
- {
- MapObject poi;
- poi.SetBestType("tourism-hotel");
- poi.SetPos({53.653005, 108.143548});
- MapObject::Event eventInfo;
-
- eventInfo.m_eventTime = Clock::now() - std::chrono::hours(24 * 20 * 3);
- eventInfo.m_userPos = {53.016347, 158.683327};
- eventInfo.m_type = MapObject::Event::Type::Open;
- poi.GetEditableEvents().emplace_back(eventInfo);
-
- eventInfo.m_eventTime = eventTime;
- eventInfo.m_userPos = {53.016347, 158.683327};
- eventInfo.m_type = MapObject::Event::Type::BookingReviews;
- poi.GetEditableEvents().emplace_back(eventInfo);
-
- eventInfo.m_eventTime = Clock::now() - std::chrono::minutes(3);
- eventInfo.m_userPos = {53.016347, 158.683327};
- eventInfo.m_type = MapObject::Event::Type::Open;
- poi.GetEditableEvents().emplace_back(eventInfo);
-
- eventInfo.m_eventTime = Clock::now() - std::chrono::minutes(1);
- eventInfo.m_userPos = {53.016347, 158.683327};
- eventInfo.m_type = MapObject::Event::Type::RouteToCreated;
- poi.GetEditableEvents().emplace_back(eventInfo);
-
- info.m_mapObjects.Add(poi);
- }
-
- info.m_crossReferences.m_transitionToBookingTime = eventTime;
- EyeForTesting::SetInfo(info);
- settings::Set("BookingCrossReferenceIsAwaiting", true);
- api.OnEnterForeground();
-
- result = {};
- api.GetCrossReferenceLinkAfterBooking([&result](std::string const & url)
- {
- result = url;
- testing::Notify();
- });
-
- testing::Wait();
- TEST_NOT_EQUAL(result.find(kTestOsmId, 0), std::string::npos, ());
-}
-
UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, CrossReference_GetCrossReferenceCityGallery)
{
- {}
cross_reference::Api api("http://localhost:34568/gallery/city/");
api.SetDelegate(std::make_unique<DelegateForTesting>());