From 0c4ef8e52ede5231649419ba743ee383b6d5a493 Mon Sep 17 00:00:00 2001 From: Andrey Gruzinov Date: Thu, 30 Nov 2017 18:28:27 +0300 Subject: [PATCH] F! Session duration tracking for Windows --- .../Appmetr/Impl/AppmetrPluginStandalone.cs | 113 ++++++++++++++++-- ProjectSettings/EditorBuildSettings.asset | Bin 4160 -> 4160 bytes ProjectSettings/GraphicsSettings.asset | Bin 4376 -> 4376 bytes ProjectSettings/ProjectVersion.txt | 2 +- 4 files changed, 103 insertions(+), 12 deletions(-) diff --git a/Assets/ThirdParty/Appmetr/Impl/AppmetrPluginStandalone.cs b/Assets/ThirdParty/Appmetr/Impl/AppmetrPluginStandalone.cs index 44ce952..dc36421 100644 --- a/Assets/ThirdParty/Appmetr/Impl/AppmetrPluginStandalone.cs +++ b/Assets/ThirdParty/Appmetr/Impl/AppmetrPluginStandalone.cs @@ -34,23 +34,26 @@ public static void SetupWithToken(string token, string commandListenerName) _appMetr = new AppMetrWin(ServerDefaultAddress, token, MobUuid, SubPlatformDefault, presister, new HttpRequestService(NewtonsoftSerializerTyped.Instance)); _appMetr.Start(); AttachProperties(); + SessionInit(); } public static void OnPause() { - if(_appMetr != null) + SessionOnPause(); + if (_appMetr != null) _appMetr.Stop(); } public static void OnResume() { - if(_appMetr != null) + SessionOnResume(); + if (_appMetr != null) _appMetr.Start(); } public static void TrackSession() { - _appMetr.Track(new TrackSession()); + TrackSession(null); } public static void TrackSession(IDictionary properties) @@ -59,7 +62,26 @@ public static void TrackSession(IDictionary properties) { properties = new Dictionary(); } + + int duration = (int)(_sessionDuration / 1000L); + + if (!_isFirstTrackSessionSent) + duration = -1; + else if (duration <= 0) + return; + + properties.Add("$duration", duration); + + _sessionDuration = 0; + SessionSaveProps(); + _appMetr.Track(new TrackSession { Properties = properties }); + + if (!_isFirstTrackSessionSent) + { + Flush(); + _isFirstTrackSessionSent = true; + } } public static void TrackLevel(int level) @@ -152,12 +174,12 @@ public static void TrackExperimentEnd(string experiment) {} public static bool VerifyIosPayment(string productId, string transactionId, string receipt, string privateKey) { return false; } public static void VerifyAndroidPayment(string purchaseInfo, string signature, string privateKey, Action callback) - { - if (callback != null) - { - callback(false); - } - } + { + if (callback != null) + { + callback(false); + } + } public static void TrackState(IDictionary state) { @@ -246,14 +268,83 @@ private static string Get2LetterIsoCodeFromSystemLanguage() { } return res.ToLower(); } - + + + //--------------------------------- + // Session duration calculation + private static void SessionInit() + { + _sessionStartTick = Environment.TickCount; + + _isFirstTrackSessionSent = PlayerPrefs.HasKey(PlayerPrefsSessionDuration); + _sessionDuration = PlayerPrefs.GetInt(PlayerPrefsSessionDuration, 0); + _sessionDurationCurrent = PlayerPrefs.GetInt(PlayerPrefsSessionCurrent, 0); + + SessionStart(); + } + + private static void SessionSaveProps() + { + PlayerPrefs.SetInt(PlayerPrefsSessionDuration, (int)_sessionDuration); + PlayerPrefs.SetInt(PlayerPrefsSessionCurrent, (int)_sessionDurationCurrent); + + PlayerPrefs.Save(); + } + + private static void SessionStart() + { + // ntrf: should not be possible if game makes TrackSession calls on start + if (_sessionDuration > 0) + { + TrackSession(); + } + + // remember current session as previous + _sessionDuration = _sessionDurationCurrent; + _sessionDurationCurrent = 0; + SessionSaveProps(); + } + + private static void SessionOnPause() + { + // Accumulate session + var tk = Environment.TickCount; + _sessionDurationCurrent = _sessionDurationCurrent + (tk - _sessionStartTick); + SessionSaveProps(); + + // Remember when we started session gap + _sessionStartTick = tk; + } + + private static void SessionOnResume() + { + var tk = Environment.TickCount; + if ((tk - _sessionStartTick) >= SessionSplitTimout) + { + SessionStart(); + } + + _sessionStartTick = tk; + } + + private static AppMetrWin _appMetr; - private const string ServerDefaultAddress = "https://appmetr.com/api"; + private const string ServerDefaultAddress = "http://appmetr.com/api"; private const string SubPlatformDefault = "Facebook"; private const string AppmetrCacheFolder = "Appmetr"; private const string AttachPropertiesLanguage = "$language"; private const string AttachPropertiesVersion = "$version"; private const string PlayerPrefsMobUuidKey = "AppmetrUuid"; + private const string PlayerPrefsSessionDuration = "AppmetrSessionDuration"; + private const string PlayerPrefsSessionCurrent = "AppmetrSessionCurrent"; + + private static int _sessionStartTick; + private static long _sessionDuration; + private static long _sessionDurationCurrent; + private static bool _isFirstTrackSessionSent; + + private const long SessionSplitTimout = 600000L; + } } diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index a2fc39317ab48130401ebc0bcb0ca040aae85af7..3b841ddf2d4f34de88577aa909a8fdee1e2bfbe3 100644 GIT binary patch delta 44 ycmX@0a6n;#1hYwj=|<_d{F00e3=9T9>{wi!T2ibZl95@I5|CI_QaM>pKpp@dqzvQ$ delta 45 wcmX@0a6n;#1ha9P;YR7V{9+71pbNx~#l@*5#rgp`rRkY@#gi2Uc<60FT24ZvX%Q delta 36 jcmbQCG(%~E1ha9P;YR6`0)h-czz8CM08CH*DxeGijr#^& diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index e3aa8aa..3293705 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1 +1 @@ -m_EditorVersion: 5.5.3p4 +m_EditorVersion: 5.5.4p5