From 75deb3ec33619cee9a761568fa5db23f32b911b6 Mon Sep 17 00:00:00 2001 From: Arsentiy Milchakov Date: Tue, 9 Jul 2019 19:24:31 +0300 Subject: [PATCH] [eye][promo] several fixes for promo --- .../maps/metrics/UserActionsLogger.cpp | 14 +++- metrics/eye.cpp | 46 ++++++---- metrics/eye.hpp | 5 ++ metrics/eye_info.hpp | 12 +-- metrics/metrics_tests/eye_tests.cpp | 15 ---- .../partners_api_tests/promo_tests.cpp | 83 ++----------------- partners_api/promo_api.cpp | 29 +------ partners_api/promo_api.hpp | 2 +- 8 files changed, 56 insertions(+), 150 deletions(-) diff --git a/android/jni/com/mapswithme/maps/metrics/UserActionsLogger.cpp b/android/jni/com/mapswithme/maps/metrics/UserActionsLogger.cpp index a274ad6c26..95bfe5eef8 100644 --- a/android/jni/com/mapswithme/maps/metrics/UserActionsLogger.cpp +++ b/android/jni/com/mapswithme/maps/metrics/UserActionsLogger.cpp @@ -18,6 +18,12 @@ void RegisterEventIfPossible(eye::MapObject::Event::Type const type) utils::RegisterEyeEventIfPossible(type, userPos, info); } + +void RegisterTransitionToBooking() +{ + auto & info = g_framework->GetPlacePageInfo(); + eye::Eye::Event::TransitionToBooking(info.GetMercator()); +} } // namespace extern "C" @@ -79,25 +85,25 @@ Java_com_mapswithme_maps_metrics_UserActionsLogger_nativeUgcSaved(JNIEnv *, jcla JNIEXPORT void JNICALL Java_com_mapswithme_maps_metrics_UserActionsLogger_nativeBookingBookClicked(JNIEnv *, jclass) { - RegisterEventIfPossible(eye::MapObject::Event::Type::BookingBook); + RegisterTransitionToBooking(); } JNIEXPORT void JNICALL Java_com_mapswithme_maps_metrics_UserActionsLogger_nativeBookingMoreClicked(JNIEnv *, jclass) { - RegisterEventIfPossible(eye::MapObject::Event::Type::BookingMore); + RegisterTransitionToBooking(); } JNIEXPORT void JNICALL Java_com_mapswithme_maps_metrics_UserActionsLogger_nativeBookingReviewsClicked(JNIEnv *, jclass) { - RegisterEventIfPossible(eye::MapObject::Event::Type::BookingReviews); + RegisterTransitionToBooking(); } JNIEXPORT void JNICALL Java_com_mapswithme_maps_metrics_UserActionsLogger_nativeBookingDetailsClicked(JNIEnv *, jclass) { - RegisterEventIfPossible(eye::MapObject::Event::Type::BookingDetails); + RegisterTransitionToBooking(); } JNIEXPORT void JNICALL diff --git a/metrics/eye.cpp b/metrics/eye.cpp index 36c982b479..edb5500575 100644 --- a/metrics/eye.cpp +++ b/metrics/eye.cpp @@ -23,14 +23,10 @@ namespace auto constexpr kMapObjectEventsExpirePeriod = std::chrono::hours(24 * 30 * 3); auto constexpr kEventCooldown = std::chrono::seconds(2); -std::array const kMapEventSupportedTypes = {{"amenity-bar", "amenity-cafe", +std::array const kMapEventSupportedTypes = {{"amenity-bar", "amenity-cafe", "amenity-pub", "amenity-restaurant", "amenity-fast_food", "amenity-biergarden", - "shop-bakery", "tourism-hotel", - "tourism-apartment", "tourism-camp_site", - "tourism-chalet", "tourism-guest_house", - "tourism-hostel", "tourism-motel", - "tourism-resort", "sponsored-booking"}}; + "shop-bakery"}}; void Load(Info & info) { @@ -347,10 +343,9 @@ void Eye::RegisterMapObjectEvent(MapObject const & mapObject, MapObject::Event:: MapObject result = mapObject; MapObject::Event event; - auto const eventTime = Clock::now(); event.m_type = type; event.m_userPos = userPos; - event.m_eventTime = eventTime; + event.m_eventTime = Clock::now(); bool found = false; bool duplication = false; @@ -383,14 +378,6 @@ void Eye::RegisterMapObjectEvent(MapObject const & mapObject, MapObject::Event:: mapObjects.Add(result); } - if (type == MapObject::Event::Type::BookingBook || - type == MapObject::Event::Type::BookingMore || - type == MapObject::Event::Type::BookingReviews || - type == MapObject::Event::Type::BookingDetails) - { - editableInfo->m_promo.m_transitionToBookingTime = eventTime; - } - if (!SaveLastMapObjectEvent(result)) return; @@ -404,6 +391,24 @@ void Eye::RegisterMapObjectEvent(MapObject const & mapObject, MapObject::Event:: }); } +void Eye::RegisterTransitionToBooking(m2::PointD const & hotelPos) +{ + auto const info = m_info.Get(); + auto editableInfo = std::make_shared(*info); + + editableInfo->m_promo.m_transitionToBookingTime = Clock::now(); + if (!Save(editableInfo)) + return; + + GetPlatform().RunTask(Platform::Thread::Gui, [this, hotelPos] + { + for (auto subscriber : m_subscribers) + { + subscriber->OnTransitionToBooking(hotelPos); + } + }); +} + void Eye::RegisterPromoAfterBookingShown(std::string const & cityId) { auto const info = m_info.Get(); @@ -505,6 +510,15 @@ void Eye::Event::MapObjectEvent(MapObject const & mapObject, MapObject::Event::T }); } +// static +void Eye::Event::TransitionToBooking(m2::PointD const & hotelPos) +{ + GetPlatform().RunTask(Platform::Thread::File, [hotelPos] + { + Instance().RegisterTransitionToBooking(hotelPos); + }); +} + // static void Eye::Event::PromoAfterBookingShown(std::string const & cityId) { diff --git a/metrics/eye.hpp b/metrics/eye.hpp index cd2596e14e..336e8cec55 100644 --- a/metrics/eye.hpp +++ b/metrics/eye.hpp @@ -5,6 +5,8 @@ #include "base/atomic_shared_ptr.hpp" #include "base/macros.hpp" +#include "geometry/point2d.hpp" + #include #include #include @@ -25,6 +27,7 @@ public: virtual void OnLayerShown(Layer const & layer) {} virtual void OnMapObjectEvent(MapObject const & poi) {} virtual void OnPromoAfterBookingShown(Time const & time, std::string const & cityId) {} + virtual void OnTransitionToBooking(m2::PointD const & hotelPos) {} }; // Note This class IS thread-safe. @@ -48,6 +51,7 @@ public: static void LayerShown(Layer::Type type); static void MapObjectEvent(MapObject const & mapObject, MapObject::Event::Type type, m2::PointD const & userPos); + static void TransitionToBooking(m2::PointD const & hotelPos); static void PromoAfterBookingShown(std::string const & cityId); }; @@ -77,6 +81,7 @@ private: void RegisterLayerShown(Layer::Type type); void RegisterMapObjectEvent(MapObject const & mapObject, MapObject::Event::Type type, m2::PointD const & userPos); + void RegisterTransitionToBooking(m2::PointD const & hotelPos); void RegisterPromoAfterBookingShown(std::string const & cityId); base::AtomicSharedPtr m_info; diff --git a/metrics/eye_info.hpp b/metrics/eye_info.hpp index 5f88f3df11..65d9dd1f13 100644 --- a/metrics/eye_info.hpp +++ b/metrics/eye_info.hpp @@ -209,10 +209,6 @@ public: UgcEditorOpened, UgcSaved, RouteToCreated, - BookingBook, - BookingMore, - BookingReviews, - BookingDetails, }; DECLARE_VISITOR(visitor(m_type, "type"), visitor(m_userPos, "user_pos"), @@ -289,7 +285,9 @@ struct Promo DECLARE_VISITOR_AND_DEBUG_PRINT(Promo, visitor(m_transitionToBookingTime, "transitionToBookingTime"), - visitor(m_lastTimeShownAfterBooking, "lastTimeShownAfterBooking")) + visitor(m_lastTimeShownAfterBooking, "lastTimeShownAfterBooking"), + visitor(m_lastTimeShownAfterBookingCityId, + "lastTimeShownAfterBookingCityId")) Time m_transitionToBookingTime; Time m_lastTimeShownAfterBooking; std::string m_lastTimeShownAfterBookingCityId; @@ -378,10 +376,6 @@ inline std::string DebugPrint(MapObject::Event::Type const & type) case MapObject::Event::Type::UgcEditorOpened: return "UgcEditorOpened"; case MapObject::Event::Type::UgcSaved: return "UgcSaved"; case MapObject::Event::Type::RouteToCreated: return "RouteToCreated"; - case MapObject::Event::Type::BookingBook: return "BookingBook"; - case MapObject::Event::Type::BookingMore: return "BookingMore"; - case MapObject::Event::Type::BookingReviews: return "BookingReviews"; - case MapObject::Event::Type::BookingDetails: return "BookingDetails"; } UNREACHABLE(); } diff --git a/metrics/metrics_tests/eye_tests.cpp b/metrics/metrics_tests/eye_tests.cpp index 6bd3a817be..10863a7278 100644 --- a/metrics/metrics_tests/eye_tests.cpp +++ b/metrics/metrics_tests/eye_tests.cpp @@ -59,9 +59,6 @@ Info MakeDefaultInfoForTesting() eventInfo.m_userPos = {53.016347, 158.683327}; eventInfo.m_type = MapObject::Event::Type::Open; poi.GetEditableEvents().push_back(eventInfo); - eventInfo.m_eventTime = Time(std::chrono::hours(100000)); - eventInfo.m_userPos = {53.016347, 158.683327}; - eventInfo.m_type = MapObject::Event::Type::BookingMore; info.m_mapObjects.Add(poi); info.m_promo.m_lastTimeShownAfterBooking = Time(std::chrono::hours(100000)); @@ -733,18 +730,6 @@ std::string DebugPrint(First first) case First::Count: return "Count"; } } - -std::string DebugPrint(Second second) -{ - switch (second) - { - case Second::One: return "One"; - case Second::Two: return "Two"; - case Second::Three: return "Three"; - case Second::Four: return "Four"; - case Second::Count: return "Count"; - } -} } // namespace UNIT_TEST(EyeInfo_CountersSerdes) diff --git a/partners_api/partners_api_tests/promo_tests.cpp b/partners_api/partners_api_tests/promo_tests.cpp index 62f695fe13..859e07fd15 100644 --- a/partners_api/partners_api_tests/promo_tests.cpp +++ b/partners_api/partners_api_tests/promo_tests.cpp @@ -41,97 +41,24 @@ public: }; } // namespace -UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, Promo_NeedToShowAfterBooking) +UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, Promo_GetAfterBooking) { promo::Api api; - Info info; std::string lang = "en"; - { - 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("BookingPromoAwaitingForId", kTestId); - TEST_EQUAL(api.GetAfterBooking(lang).IsEmpty(), false, ()); - - { - 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 = Clock::now() - std::chrono::hours(2); - eventInfo.m_userPos = {53.016347, 158.683327}; - eventInfo.m_type = MapObject::Event::Type::BookingBook; - poi.GetEditableEvents().emplace_back(eventInfo); - - info.m_mapObjects.Add(poi); - } + TEST_EQUAL(api.GetAfterBooking(lang).IsEmpty(), true, ()); + Info info; info.m_promo.m_transitionToBookingTime = Clock::now() - std::chrono::hours(2); EyeForTesting::SetInfo(info); settings::Set("BookingPromoAwaitingForId", kTestId); - TEST_EQUAL(api.GetAfterBooking(lang).IsEmpty(), false, ()); - - { - 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 = Clock::now() - std::chrono::minutes(6); - 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); - } + TEST_EQUAL(api.GetAfterBooking(lang).IsEmpty(), true, ()); info.m_promo.m_transitionToBookingTime = Clock::now() - std::chrono::minutes(6); EyeForTesting::SetInfo(info); settings::Set("BookingPromoAwaitingForId", kTestId); - TEST_EQUAL(api.GetAfterBooking(lang).IsEmpty(), true, ()); + TEST_EQUAL(api.GetAfterBooking(lang).IsEmpty(), false, ()); } UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, Promo_GetCityGallery) diff --git a/partners_api/promo_api.cpp b/partners_api/promo_api.cpp index f45ca19399..7f3eeba2dc 100644 --- a/partners_api/promo_api.cpp +++ b/partners_api/promo_api.cpp @@ -233,34 +233,9 @@ void Api::GetCityGallery(m2::PointD const & point, std::string const & lang, UTM GetPromoCityGalleryImpl(m_baseUrl, m_delegate->GetCityId(point), lang, utm, onSuccess, onError); } -void Api::OnMapObjectEvent(eye::MapObject const & mapObject) +void Api::OnTransitionToBooking(m2::PointD const & hotelPos) { - CHECK(!mapObject.GetEvents().empty(), ()); - - auto const bestType = classif().GetTypeByReadableObjectName(mapObject.GetBestType()); - - if (!ftypes::IsHotelChecker::Instance()(bestType) && - !ftypes::IsBookingHotelChecker::Instance()(bestType)) - { - 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 id = found ? m_delegate->GetCityId(pos) : ""; + auto const id = m_delegate->GetCityId(hotelPos); if (!id.empty()) settings::Set("BookingPromoAwaitingForId", id); diff --git a/partners_api/promo_api.hpp b/partners_api/promo_api.hpp index 6cdc9532f5..f62d028772 100644 --- a/partners_api/promo_api.hpp +++ b/partners_api/promo_api.hpp @@ -91,7 +91,7 @@ public: CityGalleryCallback const & onSuccess, OnError const & onError) const; // eye::Subscriber overrides: - void OnMapObjectEvent(eye::MapObject const & poi) override; + void OnTransitionToBooking(m2::PointD const & hotelPos) override; private: std::unique_ptr m_delegate;