From d8d0890bc263714901507ce946cc7de25acd82b9 Mon Sep 17 00:00:00 2001 From: Arsentiy Milchakov Date: Tue, 20 Sep 2016 16:41:31 +0300 Subject: added marketing events into core and android --- android/jni/Android.mk | 1 + android/jni/com/mapswithme/core/ScopedEnv.hpp | 38 ++++++++++++++++++++++ android/jni/com/mapswithme/core/jni_helper.cpp | 3 ++ android/jni/com/mapswithme/core/jni_helper.hpp | 1 + android/jni/com/mapswithme/platform/Platform.cpp | 18 +++++++++- .../src/com/mapswithme/maps/MwmApplication.java | 12 +++++++ map/framework.cpp | 9 +++++ search/processor.cpp | 1 + storage/storage.cpp | 1 + 9 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 android/jni/com/mapswithme/core/ScopedEnv.hpp diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 5d72693732..54f8106310 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -61,6 +61,7 @@ TARGET_PLATFORM := android-15 LOCAL_HEADER_FILES := \ ../../private.h \ com/mapswithme/core/jni_helper.hpp \ + com/mapswithme/core/ScopedEnv.hpp \ com/mapswithme/core/ScopedLocalRef.hpp \ com/mapswithme/core/logging.hpp \ com/mapswithme/maps/Framework.hpp \ diff --git a/android/jni/com/mapswithme/core/ScopedEnv.hpp b/android/jni/com/mapswithme/core/ScopedEnv.hpp new file mode 100644 index 0000000000..6d517066f2 --- /dev/null +++ b/android/jni/com/mapswithme/core/ScopedEnv.hpp @@ -0,0 +1,38 @@ +#include + +// Scoped environment which can attach to any thread and automatically detach +class ScopedEnv final +{ +public: + ScopedEnv(JavaVM * vm) + { + JNIEnv * env; + auto result = vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_6); + if (result == JNI_EDETACHED) + { + result = vm->AttachCurrentThread(&env, nullptr); + m_needToDetach = (result == JNI_OK); + } + + if (result == JNI_OK) + { + m_env = env; + m_vm = vm; + } + } + + ~ScopedEnv() + { + if (m_vm != nullptr && m_needToDetach) + m_vm->DetachCurrentThread(); + } + + JNIEnv * operator->() { return m_env; } + operator bool() const { return m_env != nullptr; } + JNIEnv * get() { return m_env; } + +private: + bool m_needToDetach = false; + JNIEnv * m_env = nullptr; + JavaVM * m_vm = nullptr; +}; diff --git a/android/jni/com/mapswithme/core/jni_helper.cpp b/android/jni/com/mapswithme/core/jni_helper.cpp index 5bf37b0ae0..0524197558 100644 --- a/android/jni/com/mapswithme/core/jni_helper.cpp +++ b/android/jni/com/mapswithme/core/jni_helper.cpp @@ -16,6 +16,7 @@ extern JavaVM * GetJVM() // caching is necessary to create class from native threads jclass g_mapObjectClazz; jclass g_bookmarkClazz; +jclass g_myTrackerClazz; extern "C" { @@ -29,6 +30,7 @@ JNI_OnLoad(JavaVM * jvm, void *) JNIEnv * env = jni::GetEnv(); g_mapObjectClazz = jni::GetGlobalClassRef(env, "com/mapswithme/maps/bookmarks/data/MapObject"); g_bookmarkClazz = jni::GetGlobalClassRef(env, "com/mapswithme/maps/bookmarks/data/Bookmark"); + g_myTrackerClazz = jni::GetGlobalClassRef(env, "com/my/tracker/MyTracker"); return JNI_VERSION_1_6; } @@ -40,6 +42,7 @@ JNI_OnUnload(JavaVM *, void *) JNIEnv * env = jni::GetEnv(); env->DeleteGlobalRef(g_mapObjectClazz); env->DeleteGlobalRef(g_bookmarkClazz); + env->DeleteGlobalRef(g_myTrackerClazz); } } // extern "C" diff --git a/android/jni/com/mapswithme/core/jni_helper.hpp b/android/jni/com/mapswithme/core/jni_helper.hpp index 6ac621c37c..5e507d0bcc 100644 --- a/android/jni/com/mapswithme/core/jni_helper.hpp +++ b/android/jni/com/mapswithme/core/jni_helper.hpp @@ -11,6 +11,7 @@ extern jclass g_mapObjectClazz; extern jclass g_bookmarkClazz; +extern jclass g_myTrackerClazz; namespace jni { diff --git a/android/jni/com/mapswithme/platform/Platform.cpp b/android/jni/com/mapswithme/platform/Platform.cpp index 16793dcccc..291b925e47 100644 --- a/android/jni/com/mapswithme/platform/Platform.cpp +++ b/android/jni/com/mapswithme/platform/Platform.cpp @@ -1,6 +1,7 @@ #include "Platform.hpp" #include "../core/jni_helper.hpp" +#include "../core/ScopedEnv.hpp" #include "platform/settings.hpp" @@ -86,7 +87,22 @@ void Platform::SendPushWooshTag(string const & tag, vector const & value void Platform::SendMarketingEvent(string const & tag, map const & params) { - // TODO: Add implementation. + ScopedEnv env(jni::GetJVM()); + if (!env) + 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::ToJavaString(env.get(), eventData)); } Platform::EConnectionType Platform::ConnectionStatus() diff --git a/android/src/com/mapswithme/maps/MwmApplication.java b/android/src/com/mapswithme/maps/MwmApplication.java index d59f48c5b7..f7120e6a1b 100644 --- a/android/src/com/mapswithme/maps/MwmApplication.java +++ b/android/src/com/mapswithme/maps/MwmApplication.java @@ -33,6 +33,8 @@ import com.mapswithme.util.UiUtils; import com.mapswithme.util.Utils; import com.mapswithme.util.statistics.PushwooshHelper; import com.mapswithme.util.statistics.Statistics; +import com.my.tracker.MyTracker; +import com.my.tracker.MyTrackerParams; import com.pushwoosh.PushManager; import io.fabric.sdk.android.Fabric; import net.hockeyapp.android.CrashManager; @@ -112,6 +114,7 @@ public class MwmApplication extends Application initHockeyApp(); initCrashlytics(); initPushWoosh(); + initTracker(); String settingsPath = getSettingsPath(); new File(settingsPath).mkdirs(); @@ -287,6 +290,15 @@ public class MwmApplication extends Application } } + private void initTracker() + { + MyTracker.setDebugMode(BuildConfig.DEBUG); + MyTracker.createTracker(PrivateVariables.myTrackerKey(), this); + final MyTrackerParams myParams = MyTracker.getTrackerParams(); + myParams.setDefaultVendorAppPackage(); + MyTracker.initTracker(); + } + public void initCounters() { if (!mAreCountersInitialized) diff --git a/map/framework.cpp b/map/framework.cpp index 7290d056d1..b51102dbb5 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -375,6 +375,7 @@ Framework::Framework() auto const routingStatisticsFn = [](map const & statistics) { alohalytics::LogEvent("Routing_CalculatingRoute", statistics); + GetPlatform().SendMarketingEvent("Routing_CalculatingRoute", {}); }; #ifdef DEBUG auto const routingVisualizerFn = [this](m2::PointD const & pt) @@ -636,6 +637,7 @@ void Framework::LoadBookmarks() size_t Framework::AddBookmark(size_t categoryIndex, const m2::PointD & ptOrg, BookmarkData & bm) { + GetPlatform().SendMarketingEvent("Bookmarks_Bookmark_action", {{"action", "create"}}); return m_bmManager.AddBookmark(categoryIndex, ptOrg, bm); } @@ -1985,6 +1987,9 @@ void Framework::OnTapEvent(TapEvent const & tapEvent) kv["types"] = DebugPrint(info.GetTypes()); // Older version of statistics used "$GetUserMark" event. alohalytics::Stats::Instance().LogEvent("$SelectMapObject", kv, alohalytics::Location::FromLatLon(ll.lat, ll.lon)); + + if (info.IsHotel()) + GetPlatform().SendMarketingEvent("Placepage_Hotel_book", {{"provider", "booking.com"}}); } ActivateMapSelection(true, selection, info); @@ -2787,6 +2792,8 @@ bool Framework::CreateMapObject(m2::PointD const & mercator, uint32_t const feat if (!mwmId.IsAlive()) return false; + GetPlatform().SendMarketingEvent("EditorAdd_start", {}); + search::ReverseGeocoder const coder(m_model.GetIndex()); vector streets; @@ -2808,6 +2815,8 @@ bool Framework::GetEditableMapObject(FeatureID const & fid, osm::EditableMapObje if (!GetFeatureByID(fid, ft)) return false; + GetPlatform().SendMarketingEvent("EditorEdit_start", {}); + emo.SetFromFeatureType(ft); emo.SetHouseNumber(ft.GetHouseNumber()); auto const & editor = osm::Editor::Instance(); diff --git a/search/processor.cpp b/search/processor.cpp index a2851c4987..9dd4deaf98 100644 --- a/search/processor.cpp +++ b/search/processor.cpp @@ -127,6 +127,7 @@ void SendStatistics(SearchParams const & params, m2::RectD const & viewport, Res {"results", resultString}, }; alohalytics::LogEvent("searchEmitResultsAndCoords", stats); + GetPlatform().SendMarketingEvent("searchEmitResultsAndCoords", {}); } } // namespace diff --git a/storage/storage.cpp b/storage/storage.cpp index 82358cb482..57210b0411 100644 --- a/storage/storage.cpp +++ b/storage/storage.cpp @@ -830,6 +830,7 @@ 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"}}); } success = success && RegisterDownloadedFiles(countryId, files); -- cgit v1.2.3