From 4e3f3882adc1dd17bbf344deb3369d6b36d8f641 Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Tue, 1 Nov 2016 15:27:08 +0300 Subject: [PATCH] Added PushWoosh tags initialization --- android/jni/Android.mk | 2 + android/jni/com/mapswithme/maps/Framework.cpp | 6 +- .../mapswithme/platform/MarketingService.cpp | 23 ++++++++ .../jni/com/mapswithme/platform/Platform.cpp | 48 +++++---------- .../jni/com/mapswithme/platform/Platform.hpp | 2 + .../util/statistics/PushwooshHelper.cpp | 24 ++++++++ .../src/com/mapswithme/maps/Framework.java | 2 +- .../src/com/mapswithme/maps/MapFragment.java | 4 ++ .../maps/routing/RoutingController.java | 8 ++- .../util/statistics/PushwooshHelper.java | 25 +------- .../util/statistics/Statistics.java | 8 +-- .../BottomMenu/MWMBottomMenuViewController.mm | 2 +- iphone/Maps/Classes/MWMPlacePageManager.mm | 2 +- .../Maps/Classes/MWMPlacePageViewManager.mm | 2 +- iphone/Maps/Classes/MapViewController.mm | 2 +- iphone/Maps/Classes/MapsAppDelegate.mm | 2 + iphone/Maps/Classes/Routing/MWMRouter.mm | 27 +-------- iphone/Maps/main.mm | 6 +- map/framework.cpp | 37 +++++++++--- map/framework.hpp | 2 +- platform/CMakeLists.txt | 7 +++ platform/marketing_service.cpp | 50 ++++++++++++++++ platform/marketing_service.hpp | 58 +++++++++++++++++++ platform/marketing_service_dummy.cpp | 13 +++++ platform/marketing_service_ios.mm | 23 ++++++++ platform/platform.hpp | 18 ++---- platform/platform.pro | 41 ++++++++----- platform/platform_android.cpp | 4 -- platform/platform_ios.mm | 18 ------ platform/platform_mac.mm | 13 ----- platform/platform_qt.cpp | 12 ---- platform/platform_tizen.cpp | 12 ---- platform/platform_win.cpp | 16 ----- search/processor.cpp | 2 +- storage/country.cpp | 2 +- storage/storage.cpp | 7 ++- 36 files changed, 315 insertions(+), 215 deletions(-) create mode 100644 android/jni/com/mapswithme/platform/MarketingService.cpp create mode 100644 android/jni/com/mapswithme/util/statistics/PushwooshHelper.cpp create mode 100644 platform/marketing_service.cpp create mode 100644 platform/marketing_service.hpp create mode 100644 platform/marketing_service_dummy.cpp create mode 100644 platform/marketing_service_ios.mm diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 4b2c67c893..5430b8a05a 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -102,11 +102,13 @@ LOCAL_SRC_FILES := \ com/mapswithme/platform/HttpThread.cpp \ com/mapswithme/platform/SocketImpl.cpp \ com/mapswithme/platform/Language.cpp \ + com/mapswithme/platform/MarketingService.cpp \ com/mapswithme/platform/Platform.cpp \ com/mapswithme/platform/PThreadImpl.cpp \ com/mapswithme/util/Config.cpp \ com/mapswithme/util/HttpClient.cpp \ com/mapswithme/util/StringUtils.cpp \ + com/mapswithme/util/statistics/PushwooshHelper.cpp \ LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv2 -latomic -lz diff --git a/android/jni/com/mapswithme/maps/Framework.cpp b/android/jni/com/mapswithme/maps/Framework.cpp index 002967850a..ce57235b04 100644 --- a/android/jni/com/mapswithme/maps/Framework.cpp +++ b/android/jni/com/mapswithme/maps/Framework.cpp @@ -832,10 +832,12 @@ Java_com_mapswithme_maps_Framework_nativeCloseRouting(JNIEnv * env, jclass) JNIEXPORT void JNICALL Java_com_mapswithme_maps_Framework_nativeBuildRoute(JNIEnv * env, jclass, jdouble startLat, jdouble startLon, - jdouble finishLat, jdouble finishLon) + jdouble finishLat, jdouble finishLon, + jboolean isP2P) { frm()->BuildRoute(MercatorBounds::FromLatLon(startLat, startLon), - MercatorBounds::FromLatLon(finishLat, finishLon), 0 /* timeoutSec */); + MercatorBounds::FromLatLon(finishLat, finishLon), + isP2P, 0 /* timeoutSec */); } diff --git a/android/jni/com/mapswithme/platform/MarketingService.cpp b/android/jni/com/mapswithme/platform/MarketingService.cpp new file mode 100644 index 0000000000..9d36b3c4bb --- /dev/null +++ b/android/jni/com/mapswithme/platform/MarketingService.cpp @@ -0,0 +1,23 @@ +#include "platform/marketing_service.hpp" + +#include "Platform.hpp" + +void MarketingService::SendPushWooshTag(string const & tag) +{ + SendPushWooshTag(tag, vector{"1"}); +} + +void MarketingService::SendPushWooshTag(string const & tag, string const & value) +{ + SendPushWooshTag(tag, vector{value}); +} + +void MarketingService::SendPushWooshTag(string const & tag, vector const & values) +{ + android::Platform::Instance().SendPushWooshTag(tag, values); +} + +void MarketingService::SendMarketingEvent(string const & tag, map const & params) +{ + android::Platform::Instance().SendMarketingEvent(tag, params); +} diff --git a/android/jni/com/mapswithme/platform/Platform.cpp b/android/jni/com/mapswithme/platform/Platform.cpp index 329d24b883..6a958e47fb 100644 --- a/android/jni/com/mapswithme/platform/Platform.cpp +++ b/android/jni/com/mapswithme/platform/Platform.cpp @@ -41,41 +41,6 @@ void Platform::RunOnGuiThread(TFunctor const & fn) android::Platform::Instance().RunOnGuiThread(fn); } -void Platform::SendPushWooshTag(string const & tag) -{ - SendPushWooshTag(tag, vector{ "1" }); -} - -void Platform::SendPushWooshTag(string const & tag, string const & value) -{ - SendPushWooshTag(tag, vector{ value }); -} - -void Platform::SendPushWooshTag(string const & tag, vector const & values) -{ - android::Platform::Instance().SendPushWooshTag(tag, values); -} - -void Platform::SendMarketingEvent(string const & tag, map const & params) -{ - JNIEnv * env = jni::GetEnv(); - if (env == nullptr) - return; - - string eventData = tag; - - for (auto const & item : params) - { - eventData.append("_" + item.first + "_" + item.second); - } - - static jmethodID const myTrackerTrackEvent = - env->GetStaticMethodID(g_myTrackerClazz, "trackEvent", "(Ljava/lang/String;)V"); - - env->CallStaticVoidMethod(g_myTrackerClazz, myTrackerTrackEvent, - jni::TScopedLocalRef(env, jni::ToJavaString(env, eventData)).get()); -} - Platform::EConnectionType Platform::ConnectionStatus() { JNIEnv * env = jni::GetEnv(); @@ -102,6 +67,7 @@ namespace android jclass const functorProcessClass = env->GetObjectClass(functorProcessObject); m_functorProcessMethod = env->GetMethodID(functorProcessClass, "forwardToMainThread", "(J)V"); m_sendPushWooshTagsMethod = env->GetMethodID(functorProcessClass, "sendPushWooshTags", "(Ljava/lang/String;[Ljava/lang/String;)V"); + m_myTrackerTrackMethod = env->GetStaticMethodID(g_myTrackerClazz, "trackEvent", "(Ljava/lang/String;)V"); string const flavor = jni::ToNativeString(env, flavorName); string const build = jni::ToNativeString(env, buildType); @@ -202,6 +168,18 @@ namespace android jni::TScopedLocalRef(env, jni::ToJavaString(env, tag)).get(), jni::TScopedLocalObjectArrayRef(env, jni::ToJavaStringArray(env, values)).get()); } + + void Platform::SendMarketingEvent(string const & tag, map const & params) + { + JNIEnv * env = jni::GetEnv(); + string eventData = tag; + for (auto const & item : params) + eventData.append("_" + item.first + "_" + item.second); + + env->CallStaticVoidMethod(g_myTrackerClazz, m_myTrackerTrackMethod, + jni::TScopedLocalRef(env, jni::ToJavaString(env, eventData)).get()); + } + } // namespace android Platform & GetPlatform() diff --git a/android/jni/com/mapswithme/platform/Platform.hpp b/android/jni/com/mapswithme/platform/Platform.hpp index f47bf1645f..4ffb7540c7 100644 --- a/android/jni/com/mapswithme/platform/Platform.hpp +++ b/android/jni/com/mapswithme/platform/Platform.hpp @@ -30,6 +30,7 @@ namespace android void RunOnGuiThread(TFunctor const & fn); void SendPushWooshTag(string const & tag, vector const & values); + void SendMarketingEvent(string const & tag, map const & params); static Platform & Instance(); @@ -37,5 +38,6 @@ namespace android jobject m_functorProcessObject; jmethodID m_functorProcessMethod; jmethodID m_sendPushWooshTagsMethod; + jmethodID m_myTrackerTrackMethod; }; } // namespace android diff --git a/android/jni/com/mapswithme/util/statistics/PushwooshHelper.cpp b/android/jni/com/mapswithme/util/statistics/PushwooshHelper.cpp new file mode 100644 index 0000000000..f59efab62a --- /dev/null +++ b/android/jni/com/mapswithme/util/statistics/PushwooshHelper.cpp @@ -0,0 +1,24 @@ +#include "../../core/jni_helper.hpp" + +#include "platform/platform.hpp" + +extern "C" +{ +JNIEXPORT void JNICALL +Java_com_mapswithme_util_statistics_PushwooshHelper_nativeProcessFirstLaunch(JNIEnv * env, jclass thiz) +{ + GetPlatform().GetMarketingService().ProcessFirstLaunch(); +} + +JNIEXPORT void JNICALL +Java_com_mapswithme_util_statistics_PushwooshHelper_nativeSendEditorAddObjectTag(JNIEnv * env, jclass thiz) +{ + GetPlatform().GetMarketingService().SendPushWooshTag(marketing::kEditorAddDiscovered); +} + +JNIEXPORT void JNICALL +Java_com_mapswithme_util_statistics_PushwooshHelper_nativeSendEditorEditObjectTag(JNIEnv * env, jclass thiz) +{ + GetPlatform().GetMarketingService().SendPushWooshTag(marketing::kEditorEditDiscovered); +} +} // extern "C" diff --git a/android/src/com/mapswithme/maps/Framework.java b/android/src/com/mapswithme/maps/Framework.java index 03ae287703..bddef7a50a 100644 --- a/android/src/com/mapswithme/maps/Framework.java +++ b/android/src/com/mapswithme/maps/Framework.java @@ -167,7 +167,7 @@ public class Framework public static native void nativeCloseRouting(); - public static native void nativeBuildRoute(double startLat, double startLon, double finishLat, double finishLon); + public static native void nativeBuildRoute(double startLat, double startLon, double finishLat, double finishLon, boolean isP2P); public static native void nativeFollowRoute(); diff --git a/android/src/com/mapswithme/maps/MapFragment.java b/android/src/com/mapswithme/maps/MapFragment.java index 1b92d491e7..e7dacde089 100644 --- a/android/src/com/mapswithme/maps/MapFragment.java +++ b/android/src/com/mapswithme/maps/MapFragment.java @@ -17,6 +17,7 @@ import android.view.ViewGroup; import com.mapswithme.maps.base.BaseMwmFragment; import com.mapswithme.util.UiUtils; +import com.mapswithme.util.statistics.PushwooshHelper; public class MapFragment extends BaseMwmFragment implements View.OnTouchListener, @@ -167,6 +168,9 @@ public class MapFragment extends BaseMwmFragment final float exactDensityDpi = metrics.densityDpi; mFirstStart = ((MwmActivity) getMwmActivity()).isFirstStart(); + if (mFirstStart) + PushwooshHelper.nativeProcessFirstLaunch(); + if (!nativeCreateEngine(surface, (int) exactDensityDpi, mFirstStart)) { reportUnsupported(); diff --git a/android/src/com/mapswithme/maps/routing/RoutingController.java b/android/src/com/mapswithme/maps/routing/RoutingController.java index dada15de8f..9f11177b79 100644 --- a/android/src/com/mapswithme/maps/routing/RoutingController.java +++ b/android/src/com/mapswithme/maps/routing/RoutingController.java @@ -283,10 +283,12 @@ public class RoutingController setBuildState(BuildState.BUILDING); updatePlan(); + boolean isP2P = !MapObject.isOfType(MapObject.MY_POSITION, mStartPoint) && !MapObject.isOfType(MapObject.MY_POSITION, mEndPoint); + Statistics.INSTANCE.trackRouteBuild(mLastRouterType, mStartPoint, mEndPoint); - org.alohalytics.Statistics.logEvent(AlohaHelper.ROUTING_BUILD, new String[] {Statistics.EventParam.FROM, Statistics.getPointType(mStartPoint), - Statistics.EventParam.TO, Statistics.getPointType(mEndPoint)}); - Framework.nativeBuildRoute(mStartPoint.getLat(), mStartPoint.getLon(), mEndPoint.getLat(), mEndPoint.getLon()); + org.alohalytics.Statistics.logEvent(AlohaHelper.ROUTING_BUILD, new String[]{Statistics.EventParam.FROM, Statistics.getPointType(mStartPoint), + Statistics.EventParam.TO, Statistics.getPointType(mEndPoint)}); + Framework.nativeBuildRoute(mStartPoint.getLat(), mStartPoint.getLon(), mEndPoint.getLat(), mEndPoint.getLon(), isP2P); } private void completeUberRequest() diff --git a/android/src/com/mapswithme/util/statistics/PushwooshHelper.java b/android/src/com/mapswithme/util/statistics/PushwooshHelper.java index 7f33a59cf7..87bfa6b458 100644 --- a/android/src/com/mapswithme/util/statistics/PushwooshHelper.java +++ b/android/src/com/mapswithme/util/statistics/PushwooshHelper.java @@ -6,7 +6,6 @@ import android.os.Handler; import android.os.Looper; import android.util.Log; -import com.mapswithme.maps.Framework; import com.pushwoosh.PushManager; import com.pushwoosh.SendPushTagsCallBack; @@ -18,9 +17,6 @@ import java.util.Map; public final class PushwooshHelper implements SendPushTagsCallBack { - public final static String ADD_MAP_OBJECT = "editor_add_discovered"; - public final static String EDIT_MAP_OBJECT = "editor_edit_discovered"; - private static final PushwooshHelper sInstance = new PushwooshHelper(); private WeakReference mContext; @@ -144,22 +140,7 @@ public final class PushwooshHelper implements SendPushTagsCallBack return mContext != null && mTask == null; } - public static String getRoutingTag(int routerType, boolean isP2P) - { - String result = "routing_"; - if (isP2P) - result += "p2p_"; - - if (routerType == Framework.ROUTER_TYPE_VEHICLE) - result += "vehicle"; - else if (routerType == Framework.ROUTER_TYPE_PEDESTRIAN) - result += "pedestrian"; - else if (routerType == Framework.ROUTER_TYPE_BICYCLE) - result += "bicycle"; - else - result += "unknown"; - - result += "_discovered"; - return result; - } + public static native void nativeProcessFirstLaunch(); + public static native void nativeSendEditorAddObjectTag(); + public static native void nativeSendEditorEditObjectTag(); } diff --git a/android/src/com/mapswithme/util/statistics/Statistics.java b/android/src/com/mapswithme/util/statistics/Statistics.java index 7cd53af5ae..6af56e084b 100644 --- a/android/src/com/mapswithme/util/statistics/Statistics.java +++ b/android/src/com/mapswithme/util/statistics/Statistics.java @@ -376,9 +376,6 @@ public enum Statistics { trackEvent(EventName.ROUTING_BUILD, params().add(EventParam.FROM, Statistics.getPointType(from)) .add(EventParam.TO, Statistics.getPointType(to))); - - boolean isP2P = !MapObject.isOfType(MapObject.MY_POSITION, from) && !MapObject.isOfType(MapObject.MY_POSITION, to); - PushwooshHelper.get().sendTag(PushwooshHelper.getRoutingTag(routerType, isP2P)); } public void trackEditorLaunch(boolean newObject) @@ -387,7 +384,10 @@ public enum Statistics editorMwmParams().add(EventParam.IS_AUTHENTICATED, String.valueOf(OsmOAuth.isAuthorized())) .add(EventParam.IS_ONLINE, String.valueOf(ConnectionState.isConnected()))); - PushwooshHelper.get().sendTag(newObject ? PushwooshHelper.ADD_MAP_OBJECT : PushwooshHelper.EDIT_MAP_OBJECT); + if (newObject) + PushwooshHelper.nativeSendEditorAddObjectTag(); + else + PushwooshHelper.nativeSendEditorEditObjectTag(); } public void trackEditorSuccess(boolean newObject) diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.mm index 7bac18d51b..ed263b2e90 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.mm +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.mm @@ -344,7 +344,7 @@ typedef NS_ENUM(NSUInteger, MWMBottomMenuViewCell) { - (void)menuActionAddPlace { [Statistics logEvent:kStatEditorAddClick withParameters:@{kStatValue : kStatMenu}]; - [[PushNotificationManager pushManager] setTags:@{ @"editor_add_discovered" : @YES }]; + GetPlatform().GetMarketingService().SendPushWooshTag(marketing::kEditorAddDiscovered); self.state = self.restoreState; [self.delegate addPlace:NO hasPoint:NO point:m2::PointD()]; } diff --git a/iphone/Maps/Classes/MWMPlacePageManager.mm b/iphone/Maps/Classes/MWMPlacePageManager.mm index 70a44f9813..1abe3825df 100644 --- a/iphone/Maps/Classes/MWMPlacePageManager.mm +++ b/iphone/Maps/Classes/MWMPlacePageManager.mm @@ -213,7 +213,7 @@ - (void)editPlace { [Statistics logEvent:kStatEventName(kStatPlacePage, kStatEdit)]; - [[PushNotificationManager pushManager] setTags:@{ @"editor_edit_discovered" : @YES }]; + GetPlatform().GetMarketingService().SendPushWooshTag(marketing::kEditorEditDiscovered); [(MapViewController *)self.ownerViewController openEditor]; } diff --git a/iphone/Maps/Classes/MWMPlacePageViewManager.mm b/iphone/Maps/Classes/MWMPlacePageViewManager.mm index 8fa2623792..cb2b99709f 100644 --- a/iphone/Maps/Classes/MWMPlacePageViewManager.mm +++ b/iphone/Maps/Classes/MWMPlacePageViewManager.mm @@ -258,7 +258,7 @@ extern NSString * const kBookmarksChangedNotification; - (void)editPlace { [Statistics logEvent:kStatEventName(kStatPlacePage, kStatEdit)]; - [[PushNotificationManager pushManager] setTags:@{ @"editor_edit_discovered" : @YES }]; + GetPlatform().GetMarketingService().SendPushWooshTag(marketing::kEditorEditDiscovered); [(MapViewController *)self.ownerViewController openEditor]; } diff --git a/iphone/Maps/Classes/MapViewController.mm b/iphone/Maps/Classes/MapViewController.mm index a72dd8cc29..9f6bea466f 100644 --- a/iphone/Maps/Classes/MapViewController.mm +++ b/iphone/Maps/Classes/MapViewController.mm @@ -309,7 +309,7 @@ BOOL gIsFirstMyPositionMode = YES; NSUserDefaults * ud = [NSUserDefaults standardUserDefaults]; if ([ud boolForKey:[welcomeClass udWelcomeWasShownKey]]) return; - + self.pageViewController = [MWMPageController pageControllerWithParent:self welcomeClass:welcomeClass]; [self.pageViewController show]; diff --git a/iphone/Maps/Classes/MapsAppDelegate.mm b/iphone/Maps/Classes/MapsAppDelegate.mm index 5e3a9cc685..81cfe4efff 100644 --- a/iphone/Maps/Classes/MapsAppDelegate.mm +++ b/iphone/Maps/Classes/MapsAppDelegate.mm @@ -943,6 +943,8 @@ using namespace osm_auth_ios; [standartDefaults setInteger:1 forKey:kUDSessionsCountKey]; [standartDefaults setObject:NSDate.date forKey:kUDLastLaunchDateKey]; [standartDefaults synchronize]; + + GetPlatform().GetMarketingService().ProcessFirstLaunch(); } - (void)incrementSessionCount diff --git a/iphone/Maps/Classes/Routing/MWMRouter.mm b/iphone/Maps/Classes/Routing/MWMRouter.mm index a6b197b719..369ae56a03 100644 --- a/iphone/Maps/Classes/Routing/MWMRouter.mm +++ b/iphone/Maps/Classes/Routing/MWMRouter.mm @@ -157,27 +157,7 @@ bool isMarkerPoint(MWMRoutePoint const & point) { return point.IsValid() && !poi if ([MWMRouter isTaxi]) bestRouter = NO; - auto const setTags = ^(RouterType t, BOOL isP2P) - { - NSMutableString * tag = (isP2P ? @"routing_p2p_" : @"routing_").mutableCopy; - switch (t) - { - case RouterType::Vehicle: - [tag appendString:@"vehicle_discovered"]; - break; - case RouterType::Pedestrian: - [tag appendString:@"pedestrian_discovered"]; - break; - case RouterType::Bicycle: - [tag appendString:@"bicycle_discovered"]; - break; - case RouterType::Taxi: - [tag appendString:@"uber_discovered"]; - break; - } - [[PushNotificationManager pushManager] setTags:@{ tag : @YES }]; - }; - + bool isP2P = false; if (self.startPoint.IsMyPosition()) { [Statistics logEvent:kStatPointToPoint @@ -194,7 +174,7 @@ bool isMarkerPoint(MWMRoutePoint const & point) { return point.IsValid() && !poi { [Statistics logEvent:kStatPointToPoint withParameters:@{kStatAction : kStatBuildRoute, kStatValue : kStatPointToPoint}]; - setTags(self.type, YES); + isP2P = true; } MWMMapViewControlsManager * mapViewControlsManager = [MWMMapViewControlsManager manager]; @@ -206,11 +186,10 @@ bool isMarkerPoint(MWMRoutePoint const & point) { return point.IsValid() && !poi auto const & finishPoint = self.finishPoint.Point(); if (bestRouter) self.type = GetFramework().GetBestRouter(startPoint, finishPoint); - f.BuildRoute(startPoint, finishPoint, 0 /* timeoutSec */); + f.BuildRoute(startPoint, finishPoint, isP2P, 0 /* timeoutSec */); f.SetRouteStartPoint(startPoint, isMarkerPoint(self.startPoint)); f.SetRouteFinishPoint(finishPoint, isMarkerPoint(self.finishPoint)); [mapViewControlsManager onRouteRebuild]; - setTags(self.type, NO); } - (void)start diff --git a/iphone/Maps/main.mm b/iphone/Maps/main.mm index 7a3dba22b6..ff9a7fa2b6 100644 --- a/iphone/Maps/main.mm +++ b/iphone/Maps/main.mm @@ -13,7 +13,8 @@ void setPushWooshSender() { - GetPlatform().SetPushWooshSender([](string const & tag, vector const & values) { + GetPlatform().GetMarketingService().SetPushWooshSender([](string const & tag, vector const & values) + { if (values.empty() || tag.empty()) return; PushNotificationManager * pushManager = [PushNotificationManager pushManager]; @@ -33,7 +34,8 @@ void setPushWooshSender() void setMarketingSender() { - GetPlatform().SetMarketingSender([](string const & tag, map const & params) { + GetPlatform().GetMarketingService().SetMarketingSender([](string const & tag, map const & params) + { if (tag.empty()) return; NSMutableDictionary * eventParams = [@{} mutableCopy]; diff --git a/map/framework.cpp b/map/framework.cpp index 3276a0fa46..590a46f6fd 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -397,7 +397,7 @@ Framework::Framework() auto const routingStatisticsFn = [](map const & statistics) { alohalytics::LogEvent("Routing_CalculatingRoute", statistics); - GetPlatform().SendMarketingEvent("Routing_CalculatingRoute", {}); + GetPlatform().GetMarketingService().SendMarketingEvent(marketing::kRoutingCalculatingRoute, {}); }; #ifdef DEBUG auto const routingVisualizerFn = [this](m2::PointD const & pt) @@ -660,7 +660,8 @@ void Framework::LoadBookmarks() size_t Framework::AddBookmark(size_t categoryIndex, const m2::PointD & ptOrg, BookmarkData & bm) { - GetPlatform().SendMarketingEvent("Bookmarks_Bookmark_action", {{"action", "create"}}); + GetPlatform().GetMarketingService().SendMarketingEvent(marketing::kBookmarksBookmarkAction, + {{"action", "create"}}); return m_bmManager.AddBookmark(categoryIndex, ptOrg, bm); } @@ -2063,7 +2064,7 @@ void Framework::OnTapEvent(TapEvent const & tapEvent) alohalytics::Stats::Instance().LogEvent("$SelectMapObject", kv, alohalytics::Location::FromLatLon(ll.lat, ll.lon)); if (info.m_sponsoredType == SponsoredType::Booking) - GetPlatform().SendMarketingEvent("Placepage_Hotel_book", {{"provider", "booking.com"}}); + GetPlatform().GetMarketingService().SendMarketingEvent(marketing::kPlacepageHotelBook, {{"provider", "booking.com"}}); } ActivateMapSelection(true, selection, info); @@ -2268,6 +2269,7 @@ void Framework::UpdateSavedDataVersion() } int64_t Framework::GetCurrentDataVersion() const { return m_storage.GetCurrentDataVersion(); } + void Framework::BuildRoute(m2::PointD const & finish, uint32_t timeoutSec) { ASSERT_THREAD_CHECKER(m_threadChecker, ("BuildRoute")); @@ -2279,14 +2281,35 @@ void Framework::BuildRoute(m2::PointD const & finish, uint32_t timeoutSec) CallRouteBuilded(IRouter::NoCurrentPosition, storage::TCountriesVec()); return; } - BuildRoute(start, finish, timeoutSec); + BuildRoute(start, finish, false /* isP2P */, timeoutSec); } -void Framework::BuildRoute(m2::PointD const & start, m2::PointD const & finish, uint32_t timeoutSec) +void Framework::BuildRoute(m2::PointD const & start, m2::PointD const & finish, bool isP2P, uint32_t timeoutSec) { ASSERT_THREAD_CHECKER(m_threadChecker, ("BuildRoute")); ASSERT(m_drapeEngine != nullptr, ()); + // Send tag to Push Woosh. + { + string tag; + switch (m_currentRouterType) + { + case RouterType::Vehicle: + tag = isP2P ? marketing::kRoutingP2PVehicleDiscovered : marketing::kRoutingVehicleDiscovered; + break; + case RouterType::Pedestrian: + tag = isP2P ? marketing::kRoutingP2PPedestrianDiscovered : marketing::kRoutingPedestrianDiscovered; + break; + case RouterType::Bicycle: + tag = isP2P ? marketing::kRoutingP2PBicycleDiscovered : marketing::kRoutingBicycleDiscovered; + break; + case RouterType::Taxi: + tag = isP2P ? marketing::kRoutingP2PTaxiDiscovered : marketing::kRoutingTaxiDiscovered; + break; + } + GetPlatform().GetMarketingService().SendPushWooshTag(tag); + } + if (IsRoutingActive()) CloseRouting(); @@ -2875,7 +2898,7 @@ bool Framework::CreateMapObject(m2::PointD const & mercator, uint32_t const feat if (!mwmId.IsAlive()) return false; - GetPlatform().SendMarketingEvent("EditorAdd_start", {}); + GetPlatform().GetMarketingService().SendMarketingEvent(marketing::kEditorAddStart, {}); search::ReverseGeocoder const coder(m_model.GetIndex()); vector streets; @@ -2898,7 +2921,7 @@ bool Framework::GetEditableMapObject(FeatureID const & fid, osm::EditableMapObje if (!GetFeatureByID(fid, ft)) return false; - GetPlatform().SendMarketingEvent("EditorEdit_start", {}); + GetPlatform().GetMarketingService().SendMarketingEvent(marketing::kEditorEditStart, {}); emo = {}; emo.SetFromFeatureType(ft); diff --git a/map/framework.hpp b/map/framework.hpp index b03c6b0036..1288ad071d 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -708,7 +708,7 @@ public: bool IsRouteNavigable() const { return m_routingSession.IsNavigable(); } void BuildRoute(m2::PointD const & finish, uint32_t timeoutSec); - void BuildRoute(m2::PointD const & start, m2::PointD const & finish, uint32_t timeoutSec); + void BuildRoute(m2::PointD const & start, m2::PointD const & finish, bool isP2P, uint32_t timeoutSec); // FollowRoute has a bug where the router follows the route even if the method hads't been called. // This method was added because we do not want to break the behaviour that is familiar to our users. bool DisableFollowMode(); diff --git a/platform/CMakeLists.txt b/platform/CMakeLists.txt index 160c3f72ec..f749f27217 100644 --- a/platform/CMakeLists.txt +++ b/platform/CMakeLists.txt @@ -23,6 +23,8 @@ set( local_country_file_utils.cpp local_country_file_utils.hpp location.hpp + marketing_service.cpp + marketing_service.hpp measurement_utils.cpp measurement_utils.hpp mwm_traits.cpp @@ -47,6 +49,7 @@ if(${PLATFORM_IPHONE}) http_thread_apple.h http_thread_apple.mm http_client_apple.mm + marketing_service_ios.mm platform_ios.mm platform_unix_impl.cpp platform_unix_impl.hpp @@ -65,6 +68,7 @@ else() # neither iPhone nor Android ${SRC} location_service.cpp location_service.hpp + marketing_service_dummy.cpp platform_qt.cpp wifi_info.hpp wifi_location_service.cpp @@ -77,6 +81,7 @@ else() # neither iPhone nor Android http_client_curl.cpp http_thread_qt.cpp http_thread_qt.hpp + marketing_service_dummy.cpp platform_win.cpp wifi_info_windows.cpp ) @@ -88,6 +93,7 @@ else() # neither iPhone nor Android http_client_apple.mm http_thread_apple.h http_thread_apple.mm + marketing_service_dummy.cpp platform_mac.mm platform_unix_impl.cpp platform_unix_impl.hpp @@ -99,6 +105,7 @@ else() # neither iPhone nor Android http_client_curl.cpp http_thread_qt.cpp http_thread_qt.hpp + marketing_service_dummy.cpp platform_linux.cpp platform_unix_impl.cpp platform_unix_impl.hpp diff --git a/platform/marketing_service.cpp b/platform/marketing_service.cpp new file mode 100644 index 0000000000..1f5662ee6d --- /dev/null +++ b/platform/marketing_service.cpp @@ -0,0 +1,50 @@ +#include "platform/marketing_service.hpp" + +namespace marketing +{ + +// Tags. +char const * const kMapVersion = "map_version"; +char const * const kMapListing = "map_listing"; +char const * const kMapDownloadDiscovered = "map_download_discovered"; +char const * const kRoutingP2PVehicleDiscovered = "routing_p2p_vehicle_discovered"; +char const * const kRoutingP2PPedestrianDiscovered = "routing_p2p_pedestrian_discovered"; +char const * const kRoutingP2PBicycleDiscovered = "routing_p2p_bicycle_discovered"; +char const * const kRoutingP2PTaxiDiscovered = "routing_p2p_taxi_discovered"; +char const * const kRoutingVehicleDiscovered = "routing_vehicle_discovered"; +char const * const kRoutingPedestrianDiscovered = "routing_pedestrian_discovered"; +char const * const kRoutingBicycleDiscovered = "routing_bicycle_discovered"; +char const * const kRoutingTaxiDiscovered = "routing_taxi_discovered"; +char const * const kEditorAddDiscovered = "editor_add_discovered"; +char const * const kEditorEditDiscovered = "editor_edit_discovered"; + +// Events. +char const * const kDownloaderMapActionFinished = "Downloader_Map_action_finished"; +char const * const kSearchEmitResultsAndCoords = "searchEmitResultsAndCoords"; +char const * const kRoutingCalculatingRoute = "Routing_CalculatingRoute"; +char const * const kBookmarksBookmarkAction = "Bookmarks_Bookmark_action"; +char const * const kPlacepageHotelBook = "Placepage_Hotel_book"; +char const * const kEditorAddStart = "EditorAdd_start"; +char const * const kEditorEditStart = "EditorEdit_start"; + +} // marketing + +void MarketingService::ProcessFirstLaunch() +{ + // Send initial value for "discovered" tags. + using namespace marketing; + vector tags = + { + kMapDownloadDiscovered, + + kRoutingP2PVehicleDiscovered, kRoutingP2PPedestrianDiscovered, + kRoutingP2PBicycleDiscovered, kRoutingP2PTaxiDiscovered, + kRoutingVehicleDiscovered, kRoutingPedestrianDiscovered, + kRoutingBicycleDiscovered, kRoutingTaxiDiscovered, + + kEditorAddDiscovered, kEditorEditDiscovered + }; + + for (auto const & tag : tags) + SendPushWooshTag(tag, vector{"0"}); +} diff --git a/platform/marketing_service.hpp b/platform/marketing_service.hpp new file mode 100644 index 0000000000..8d044f45aa --- /dev/null +++ b/platform/marketing_service.hpp @@ -0,0 +1,58 @@ +#pragma once + +#include "std/function.hpp" +#include "std/map.hpp" +#include "std/string.hpp" +#include "std/utility.hpp" +#include "std/vector.hpp" + +namespace marketing +{ +// Tags. +extern char const * const kMapVersion; +extern char const * const kMapListing; +extern char const * const kMapDownloadDiscovered; +extern char const * const kRoutingP2PVehicleDiscovered; +extern char const * const kRoutingP2PPedestrianDiscovered; +extern char const * const kRoutingP2PBicycleDiscovered; +extern char const * const kRoutingP2PTaxiDiscovered; +extern char const * const kRoutingVehicleDiscovered; +extern char const * const kRoutingPedestrianDiscovered; +extern char const * const kRoutingBicycleDiscovered; +extern char const * const kRoutingTaxiDiscovered; +extern char const * const kEditorAddDiscovered; +extern char const * const kEditorEditDiscovered; + +// Events. +extern char const * const kDownloaderMapActionFinished; +extern char const * const kSearchEmitResultsAndCoords; +extern char const * const kRoutingCalculatingRoute; +extern char const * const kBookmarksBookmarkAction; +extern char const * const kPlacepageHotelBook; +extern char const * const kEditorAddStart; +extern char const * const kEditorEditStart; +} // marketing + +class MarketingService +{ +public: + using PushWooshSenderFn = function const & values)>; + using MarketingSenderFn = function const & params)>; + + void ProcessFirstLaunch(); + + void SetPushWooshSender(PushWooshSenderFn const & fn) { m_pushwooshSender = fn; } + void SendPushWooshTag(string const & tag); + void SendPushWooshTag(string const & tag, string const & value); + void SendPushWooshTag(string const & tag, vector const & values); + + void SetMarketingSender(MarketingSenderFn const & fn) { m_marketingSender = fn; } + void SendMarketingEvent(string const & tag, map const & params); + +private: + /// Callback fucntion for setting PushWoosh tags. + PushWooshSenderFn m_pushwooshSender; + + /// Callback fucntion for sending marketing events. + MarketingSenderFn m_marketingSender; +}; diff --git a/platform/marketing_service_dummy.cpp b/platform/marketing_service_dummy.cpp new file mode 100644 index 0000000000..173e7b3c96 --- /dev/null +++ b/platform/marketing_service_dummy.cpp @@ -0,0 +1,13 @@ +#include "platform/marketing_service.hpp" + +void MarketingService::SendPushWooshTag(string const & tag) +{} + +void MarketingService::SendPushWooshTag(string const & tag, string const & value) +{} + +void MarketingService::SendPushWooshTag(string const & tag, vector const & values) +{} + +void MarketingService::SendMarketingEvent(string const & tag, map const & params) +{} diff --git a/platform/marketing_service_ios.mm b/platform/marketing_service_ios.mm new file mode 100644 index 0000000000..7d32d3d0fe --- /dev/null +++ b/platform/marketing_service_ios.mm @@ -0,0 +1,23 @@ +#include "platform/marketing_service.hpp" + +void MarketingService::SendPushWooshTag(string const & tag) +{ + SendPushWooshTag(tag, vector{"1"}); +} + +void MarketingService::SendPushWooshTag(string const & tag, string const & value) +{ + SendPushWooshTag(tag, vector{value}); +} + +void MarketingService::SendPushWooshTag(string const & tag, vector const & values) +{ + if (m_pushwooshSender) + m_pushwooshSender(tag, values); +} + +void MarketingService::SendMarketingEvent(string const & tag, map const & params) +{ + if (m_marketingSender) + m_marketingSender(tag, params); +} diff --git a/platform/platform.hpp b/platform/platform.hpp index 47ffba2525..73323df51b 100644 --- a/platform/platform.hpp +++ b/platform/platform.hpp @@ -1,6 +1,7 @@ #pragma once #include "platform/country_defines.hpp" +#include "platform/marketing_service.hpp" #include "coding/reader.hpp" @@ -55,8 +56,6 @@ public: }; using TFilesWithType = vector>; - using TPushWooshSenderFn = function const & values)>; - using TMarketingSenderFn = function const & params)>; protected: /// Usually read-only directory for application resources @@ -89,11 +88,8 @@ protected: /// Returns last system call error as EError. static EError ErrnoToError(); - /// Callback fucntion for setting PushWoosh tags. - TPushWooshSenderFn m_pushwooshSender; - - /// Callback fucntion for sending marketing events. - TMarketingSenderFn m_marketingSender; + /// Platform-dependent marketing services. + MarketingService m_marketingService; public: Platform(); @@ -233,13 +229,7 @@ public: void SetupMeasurementSystem() const; - void SetPushWooshSender(TPushWooshSenderFn const & fn) { m_pushwooshSender = fn; } - void SendPushWooshTag(string const & tag); - void SendPushWooshTag(string const & tag, string const & value); - void SendPushWooshTag(string const & tag, vector const & values); - - void SetMarketingSender(TMarketingSenderFn const & fn) { m_marketingSender = fn; } - void SendMarketingEvent(string const & tag, map const & params); + MarketingService & GetMarketingService() { return m_marketingService; } private: void GetSystemFontNames(FilesList & res) const; diff --git a/platform/platform.pro b/platform/platform.pro index d05cc1f1e4..1d3462a463 100644 --- a/platform/platform.pro +++ b/platform/platform.pro @@ -13,11 +13,12 @@ INCLUDEPATH += $$ROOT_DIR/3party/jansson/src !iphone*:!android*:!tizen { QT *= core - SOURCES += platform_qt.cpp \ - wifi_location_service.cpp \ - location_service.cpp - HEADERS += wifi_info.hpp \ - location_service.hpp + SOURCES += location_service.cpp \ + marketing_service_dummy.cpp \ + platform_qt.cpp \ + wifi_location_service.cpp + HEADERS += location_service.hpp \ + wifi_info.hpp !macx-* { QT *= network SOURCES += http_thread_qt.cpp @@ -25,24 +26,29 @@ INCLUDEPATH += $$ROOT_DIR/3party/jansson/src } win32* { - SOURCES += platform_win.cpp \ + SOURCES += marketing_service_dummy.cpp \ + platform_win.cpp \ wifi_info_windows.cpp } else:macx-* { - OBJECTIVE_SOURCES += platform_mac.mm \ + OBJECTIVE_SOURCES += marketing_service_dummy.cpp \ + platform_mac.mm \ apple_location_service.mm } else:linux* { - SOURCES += platform_linux.cpp + SOURCES += marketing_service_dummy.cpp \ + platform_linux.cpp } } else:iphone* { - OBJECTIVE_SOURCES += platform_ios.mm + OBJECTIVE_SOURCES += marketing_service_ios.mm \ + platform_ios.mm } else:android* { - SOURCES += platform_android.cpp \ + SOURCES += platform_android.cpp } else:tizen* { - HEADERS += tizen_utils.hpp \ - http_thread_tizen.hpp - SOURCES += platform_tizen.cpp \ - tizen_utils.cpp \ - http_thread_tizen.cpp \ + HEADERS += http_thread_tizen.hpp \ + tizen_utils.hpp + SOURCES += http_thread_tizen.cpp \ + marketing_service_dummy.cpp \ + platform_tizen.cpp \ + tizen_utils.cpp } macx-*|iphone* { @@ -61,7 +67,8 @@ linux*|win* { !win32* { HEADERS += platform_unix_impl.hpp - SOURCES += platform_unix_impl.cpp + SOURCES += marketing_service_dummy.cpp \ + platform_unix_impl.cpp } # common sources for all platforms @@ -79,6 +86,7 @@ HEADERS += \ local_country_file.hpp \ local_country_file_utils.hpp \ location.hpp \ + marketing_service.hpp \ measurement_utils.hpp \ mwm_traits.hpp \ mwm_version.hpp \ @@ -98,6 +106,7 @@ SOURCES += \ http_request.cpp \ local_country_file.cpp \ local_country_file_utils.cpp \ + marketing_service.cpp \ measurement_utils.cpp \ mwm_traits.cpp \ mwm_version.cpp \ diff --git a/platform/platform_android.cpp b/platform/platform_android.cpp index e8dacd3f8f..93b7011a57 100644 --- a/platform/platform_android.cpp +++ b/platform/platform_android.cpp @@ -262,10 +262,6 @@ void Platform::SetupMeasurementSystem() const /// @see implementation of methods below in android/jni/com/.../Platform.cpp // void Platform::RunOnGuiThread(TFunctor const & fn){} -// void Platform::SendPushWooshTag(string const & tag){} -// void Platform::SendPushWooshTag(string const & tag, string const & value){} -// void Platform::SendPushWooshTag(string const & tag, vector const & values){} -// void Platform::SendMarketingEvent(string const & tag, map const & params){} namespace { diff --git a/platform/platform_ios.mm b/platform/platform_ios.mm index 0d50d04d29..ce6af8489d 100644 --- a/platform/platform_ios.mm +++ b/platform/platform_ios.mm @@ -215,24 +215,6 @@ void Platform::SetupMeasurementSystem() const settings::Set(settings::kMeasurementUnits, units); } -void Platform::SendPushWooshTag(string const & tag) { SendPushWooshTag(tag, vector{"1"}); } -void Platform::SendPushWooshTag(string const & tag, string const & value) -{ - SendPushWooshTag(tag, vector{value}); -} - -void Platform::SendPushWooshTag(string const & tag, vector const & values) -{ - if (m_pushwooshSender) - m_pushwooshSender(tag, values); -} - -void Platform::SendMarketingEvent(string const & tag, map const & params) -{ - if (m_marketingSender) - m_marketingSender(tag, params); -} - //////////////////////////////////////////////////////////////////////// extern Platform & GetPlatform() { diff --git a/platform/platform_mac.mm b/platform/platform_mac.mm index 062e06b64b..4041d0fa90 100644 --- a/platform/platform_mac.mm +++ b/platform/platform_mac.mm @@ -135,16 +135,3 @@ Platform::EConnectionType Platform::ConnectionStatus() return EConnectionType::CONNECTION_NONE; return EConnectionType::CONNECTION_WIFI; } - -void Platform::SendPushWooshTag(string const & tag) -{ -} - -void Platform::SendPushWooshTag(string const & tag, string const & value) -{ -} - -void Platform::SendPushWooshTag(string const & tag, vector const & values) -{ -} -void Platform::SendMarketingEvent(string const & tag, map const & params) {} diff --git a/platform/platform_qt.cpp b/platform/platform_qt.cpp index 4a7069f00a..cba405d065 100644 --- a/platform/platform_qt.cpp +++ b/platform/platform_qt.cpp @@ -96,18 +96,6 @@ void Platform::RunAsync(TFunctor const & fn, Priority p) async(fn); } -void Platform::SendPushWooshTag(string const & tag) -{ -} - -void Platform::SendPushWooshTag(string const & tag, string const & value) -{ -} - -void Platform::SendPushWooshTag(string const & tag, vector const & values) -{ -} -void Platform::SendMarketingEvent(string const & tag, map const & params) {} #endif // defined(OMIM_OS_LINUX) extern Platform & GetPlatform() diff --git a/platform/platform_tizen.cpp b/platform/platform_tizen.cpp index 43313a8ebd..7c4001e759 100644 --- a/platform/platform_tizen.cpp +++ b/platform/platform_tizen.cpp @@ -109,18 +109,6 @@ void Platform::GetSystemFontNames(FilesList & res) const { } -void Platform::SendPushWooshTag(string const & tag) -{ -} - -void Platform::SendPushWooshTag(string const & tag, string const & value) -{ -} - -void Platform::SendPushWooshTag(string const & tag, vector const & values) -{ -} - extern Platform & GetPlatform() { static Platform platform; diff --git a/platform/platform_win.cpp b/platform/platform_win.cpp index b4571f46cf..c494d80e43 100644 --- a/platform/platform_win.cpp +++ b/platform/platform_win.cpp @@ -176,19 +176,3 @@ bool Platform::GetFileSizeByFullPath(string const & filePath, uint64_t & size) } return false; } - -void Platform::GetSystemFontNames(FilesList & res) const -{ -} - -void Platform::SendPushWooshTag(string const & tag) -{ -} - -void Platform::SendPushWooshTag(string const & tag, string const & value) -{ -} - -void Platform::SendPushWooshTag(string const & tag, vector const & values) -{ -} diff --git a/search/processor.cpp b/search/processor.cpp index 659bd53f19..b4037a98fa 100644 --- a/search/processor.cpp +++ b/search/processor.cpp @@ -127,7 +127,7 @@ void SendStatistics(SearchParams const & params, m2::RectD const & viewport, Res {"results", resultString}, }; alohalytics::LogEvent("searchEmitResultsAndCoords", stats); - GetPlatform().SendMarketingEvent("searchEmitResultsAndCoords", {}); + GetPlatform().GetMarketingService().SendMarketingEvent(marketing::kSearchEmitResultsAndCoords, {}); } } // namespace diff --git a/storage/country.cpp b/storage/country.cpp index c83ad03caf..e69fe6d6e1 100644 --- a/storage/country.cpp +++ b/storage/country.cpp @@ -327,7 +327,7 @@ int64_t LoadCountries(string const & jsonBuffer, TCountryTree & countries, } stringstream ss; ss << version; - GetPlatform().SendPushWooshTag("map_version", ss.str()); + GetPlatform().GetMarketingService().SendPushWooshTag(marketing::kMapVersion, ss.str()); return version; } diff --git a/storage/storage.cpp b/storage/storage.cpp index 57210b0411..302e6702b8 100644 --- a/storage/storage.cpp +++ b/storage/storage.cpp @@ -560,9 +560,9 @@ void Storage::DownloadNextCountryFromQueue() }); TCountriesVec localMaps; GetLocalRealMaps(localMaps); - GetPlatform().SendPushWooshTag("map_listing", localMaps); + GetPlatform().GetMarketingService().SendPushWooshTag(marketing::kMapListing, localMaps); if (!localMaps.empty()) - GetPlatform().SendPushWooshTag("map_download_discovered"); + GetPlatform().GetMarketingService().SendPushWooshTag(marketing::kMapDownloadDiscovered); return; } @@ -830,7 +830,8 @@ void Storage::OnMapDownloadFinished(TCountryId const & countryId, bool success, {"status", success ? "ok" : "failed"}, {"version", strings::to_string(GetCurrentDataVersion())}, {"option", DebugPrint(files)}})); - GetPlatform().SendMarketingEvent("Downloader_Map_action_finished", {{"action", "download"}}); + GetPlatform().GetMarketingService().SendMarketingEvent(marketing::kDownloaderMapActionFinished, + {{"action", "download"}}); } success = success && RegisterDownloadedFiles(countryId, files);