1754 lines
		
	
	
		
			68 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			1754 lines
		
	
	
		
			68 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | /* | |||
|  |  *  | |||
|  |     Copyright 2019, ThinkingData, Inc | |||
|  |     Licensed under the Apache License, Version 2.0 (the "License"); | |||
|  |     you may not use this file except in compliance with the License. | |||
|  |     You may obtain a copy of the License at | |||
|  | 
 | |||
|  |         http://www.apache.org/licenses/LICENSE-2.0 | |||
|  | 
 | |||
|  |     Unless required by applicable law or agreed to in writing, software | |||
|  |     distributed under the License is distributed on an "AS IS" BASIS, | |||
|  |     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
|  |     See the License for the specific language governing permissions and | |||
|  |     limitations under the License. | |||
|  |     SDK VERSION:3.2.2 | |||
|  |  */ | |||
|  | #if !(UNITY_5_4_OR_NEWER) | |||
|  | #define DISABLE_TA | |||
|  | #warning "Your Unity version is not supported by us - ThinkingAnalyticsSDK disabled" | |||
|  | #endif | |||
|  | 
 | |||
|  | using System; | |||
|  | using System.Collections.Generic; | |||
|  | using ThinkingData.Analytics; | |||
|  | using ThinkingData.Analytics.Utils; | |||
|  | using ThinkingData.Analytics.Wrapper; | |||
|  | using UnityEngine; | |||
|  | using ThinkingData.Analytics.TDException; | |||
|  | using UnityEngine.SceneManagement; | |||
|  | 
 | |||
|  | namespace ThinkingAnalytics | |||
|  | { | |||
|  |     [DisallowMultipleComponent] | |||
|  |     [Obsolete("ThinkingAnalyticsAPI is deprecated, please use ThinkingData.Analytics instead.")] | |||
|  |     public class ThinkingAnalyticsAPI : MonoBehaviour, TDDynamicSuperPropertiesHandler, TDAutoTrackEventHandler | |||
|  |     { | |||
|  |         #region settings | |||
|  |         [System.Serializable] | |||
|  |         public struct Token | |||
|  |         { | |||
|  |             public string appid; | |||
|  |             public string serverUrl; | |||
|  |             public TAMode mode; | |||
|  |             public TATimeZone timeZone; | |||
|  |             public string timeZoneId; | |||
|  |             public bool enableEncrypt; // enable data encryption, default is false (iOS/Android only) | |||
|  |             public int encryptVersion; // secret key version (iOS/Android only) | |||
|  |             public string encryptPublicKey; // public secret key (iOS/Android only) | |||
|  |             public TDSSLPinningMode pinningMode; // SSL Pinning mode, default is NONE (iOS/Android only) | |||
|  |             public bool allowInvalidCertificates; // allow invalid certificates, default is false (iOS/Android only) | |||
|  |             public bool validatesDomainName; // enable to verify domain name, default is true (iOS/Android only) | |||
|  |             private string instanceName; // instances name | |||
|  | 
 | |||
|  |             public Token(string appId, string serverUrl, TAMode mode = TAMode.NORMAL, TATimeZone timeZone = TATimeZone.Local, string timeZoneId = null, string instanceName = null) | |||
|  |             { | |||
|  |                 this.appid = appId.Replace(" ", ""); | |||
|  |                 this.serverUrl = serverUrl; | |||
|  |                 this.mode = mode; | |||
|  |                 this.timeZone = timeZone; | |||
|  |                 this.timeZoneId = timeZoneId; | |||
|  |                 this.enableEncrypt = false; | |||
|  |                 this.encryptVersion = 0; | |||
|  |                 this.encryptPublicKey = null; | |||
|  |                 this.pinningMode = TDSSLPinningMode.NONE; | |||
|  |                 this.allowInvalidCertificates = false; | |||
|  |                 this.validatesDomainName = true; | |||
|  |                 if (!string.IsNullOrEmpty(instanceName)) | |||
|  |                 { | |||
|  |                     instanceName = instanceName.Replace(" ", ""); | |||
|  |                 } | |||
|  |                 this.instanceName = instanceName; | |||
|  |             } | |||
|  | 
 | |||
|  |             public string GetInstanceName() | |||
|  |             { | |||
|  |                 return this.instanceName; | |||
|  |             } | |||
|  | 
 | |||
|  |             public string getTimeZoneId() | |||
|  |             { | |||
|  | #if UNITY_STANDALONE_WIN | |||
|  |                 switch (timeZone) | |||
|  |                 { | |||
|  |                     case TATimeZone.UTC: | |||
|  |                         return "UTC"; | |||
|  |                     case TATimeZone.Asia_Shanghai: | |||
|  |                         return "China Standard Time"; | |||
|  |                     case TATimeZone.Asia_Tokyo: | |||
|  |                         return "Tokyo Standard Time"; | |||
|  |                     case TATimeZone.America_Los_Angeles: | |||
|  |                         return "Pacific Standard Time"; | |||
|  |                     case TATimeZone.America_New_York: | |||
|  |                         return "Eastern Standard Time"; | |||
|  |                     case TATimeZone.Other: | |||
|  |                         return timeZoneId; | |||
|  |                     default: | |||
|  |                         break; | |||
|  |                 } | |||
|  | #else | |||
|  |                 switch (timeZone) | |||
|  |                 { | |||
|  |                     case TATimeZone.UTC: | |||
|  |                         return "UTC"; | |||
|  |                     case TATimeZone.Asia_Shanghai: | |||
|  |                         return "Asia/Shanghai"; | |||
|  |                     case TATimeZone.Asia_Tokyo: | |||
|  |                         return "Asia/Tokyo"; | |||
|  |                     case TATimeZone.America_Los_Angeles: | |||
|  |                         return "America/Los_Angeles"; | |||
|  |                     case TATimeZone.America_New_York: | |||
|  |                         return "America/New_York"; | |||
|  |                     case TATimeZone.Other: | |||
|  |                         return timeZoneId; | |||
|  |                     default: | |||
|  |                         break; | |||
|  |                 } | |||
|  | #endif | |||
|  |                 return null; | |||
|  |             } | |||
|  | 
 | |||
|  |             internal TDConfig ToTDConfig() | |||
|  |             { | |||
|  |                 TDConfig config = new TDConfig(this.appid, this.serverUrl); | |||
|  |                 config.mode = (TDMode)this.mode; | |||
|  |                 config.timeZone = (TDTimeZone)this.timeZone; | |||
|  |                 config.timeZoneId = this.timeZoneId; | |||
|  |                 config.pinningMode = this.pinningMode; | |||
|  |                 config.allowInvalidCertificates = this.allowInvalidCertificates; | |||
|  |                 config.validatesDomainName = this.validatesDomainName; | |||
|  |                 config.name = this.instanceName; | |||
|  |                 if(this.enableEncrypt){ | |||
|  |                     config.EnableEncrypt(this.encryptPublicKey, this.encryptVersion); | |||
|  |                 } | |||
|  |                 return config; | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         public enum TATimeZone | |||
|  |         { | |||
|  |             Local, | |||
|  |             UTC, | |||
|  |             Asia_Shanghai, | |||
|  |             Asia_Tokyo, | |||
|  |             America_Los_Angeles, | |||
|  |             America_New_York, | |||
|  |             Other = 100 | |||
|  |         } | |||
|  | 
 | |||
|  |         public enum TAMode | |||
|  |         { | |||
|  |             NORMAL = 0, | |||
|  |             DEBUG = 1, | |||
|  |             DEBUG_ONLY = 2 | |||
|  |         } | |||
|  | 
 | |||
|  |         public enum NetworkType | |||
|  |         { | |||
|  |             DEFAULT = 1, | |||
|  |             WIFI = 2, | |||
|  |             ALL = 3 | |||
|  |         } | |||
|  | 
 | |||
|  |         [Header("Configuration")] | |||
|  |         [Tooltip("Enable Start SDK Manually")] | |||
|  |         public bool startManually = true; | |||
|  | 
 | |||
|  |         [Tooltip("Enable Log")] | |||
|  |         public bool enableLog = true; | |||
|  |         [Tooltip("Sets the Network Type")] | |||
|  |         public NetworkType networkType = NetworkType.DEFAULT; | |||
|  | 
 | |||
|  |         [Header("Project")] | |||
|  |         [Tooltip("Project Setting, APP ID is given when the project is created")] | |||
|  |         [HideInInspector] | |||
|  |         public Token[] tokens = new Token[1]; | |||
|  | 
 | |||
|  | #endregion | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Whether to enable logs | |||
|  |         /// </summary> | |||
|  |         /// <param name="enable">enable logs</param> | |||
|  |         public static void EnableLog(bool enable, string appId = "") | |||
|  |         { | |||
|  |             if (sThinkingAnalyticsAPI != null) | |||
|  |             { | |||
|  |                 sThinkingAnalyticsAPI.enableLog = enable; | |||
|  |                 TDLog.EnableLog(enable); | |||
|  |                 TDWrapper.EnableLog(enable); | |||
|  |             } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Set custom distinct ID, to replace the distinct ID generated by the system  | |||
|  |         /// </summary> | |||
|  |         /// <param name="distinctId">distinct ID</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void Identify(string distinctId, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.SetDistinctId(distinctId, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { distinctId, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Returns the current distinct ID | |||
|  |         /// </summary> | |||
|  |         /// <returns>distinct ID</returns> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static string GetDistinctId(string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 return TDWrapper.GetDistinctId(appId); | |||
|  |             } | |||
|  |             return null; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Set account ID. This method does not upload Login events | |||
|  |         /// </summary> | |||
|  |         /// <param name="account">account ID</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void Login(string account, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.Login(account, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { account, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Clear account ID. This method does not upload Logout events | |||
|  |         /// </summary> | |||
|  |         /// <param name="appId">project ID (optional) </param> | |||
|  |         public static void Logout(string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.Logout(appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Enable auto-tracking | |||
|  |         /// </summary> | |||
|  |         /// <param name="events">auto-tracking events</param> | |||
|  |         /// <param name="properties">properties for auto-tracking events (optional)</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void EnableAutoTrack(AUTO_TRACK_EVENTS events, Dictionary<string, object> properties = null, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 if (properties == null) | |||
|  |                 { | |||
|  |                     properties = new Dictionary<string, object>(); | |||
|  |                 } | |||
|  |                 TDWrapper.EnableAutoTrack((TDAutoTrackEventType)events, properties, appId); | |||
|  |                 if ((events & AUTO_TRACK_EVENTS.AppCrash) != 0 && !TDPublicConfig.DisableCSharpException) | |||
|  |                 { | |||
|  |                     TDExceptionHandler.RegisterTAExceptionHandler(properties); | |||
|  |                 } | |||
|  |                 if ((events & AUTO_TRACK_EVENTS.AppSceneLoad) != 0) | |||
|  |                 { | |||
|  |                     SceneManager.sceneLoaded -= ThinkingAnalyticsAPI.OnSceneLoaded; | |||
|  |                     SceneManager.sceneLoaded += ThinkingAnalyticsAPI.OnSceneLoaded; | |||
|  |                 } | |||
|  |                 if ((events & AUTO_TRACK_EVENTS.AppSceneUnload) != 0) | |||
|  |                 { | |||
|  |                     SceneManager.sceneUnloaded -= ThinkingAnalyticsAPI.OnSceneUnloaded; | |||
|  |                     SceneManager.sceneUnloaded += ThinkingAnalyticsAPI.OnSceneUnloaded; | |||
|  |                 } | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { events, properties, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Enable auto-tracking | |||
|  |         /// </summary> | |||
|  |         /// <param name="events">auto-tracking events</param> | |||
|  |         /// <param name="eventCallback">callback for auto-tracking events (optional)</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void EnableAutoTrack(AUTO_TRACK_EVENTS events, IAutoTrackEventCallback eventCallback, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 sThinkingAnalyticsAPI._eventCallback = eventCallback; | |||
|  |                 TDWrapper.EnableAutoTrack((TDAutoTrackEventType)events, sThinkingAnalyticsAPI, appId); | |||
|  |                 if ((events & AUTO_TRACK_EVENTS.AppCrash) != 0 && !TDPublicConfig.DisableCSharpException) | |||
|  |                 { | |||
|  |                     TDExceptionHandler.RegisterTAExceptionHandler(sThinkingAnalyticsAPI); | |||
|  |                 } | |||
|  |                 if ((events & AUTO_TRACK_EVENTS.AppSceneLoad) != 0) | |||
|  |                 { | |||
|  |                     SceneManager.sceneLoaded -= ThinkingAnalyticsAPI.OnSceneLoaded; | |||
|  |                     SceneManager.sceneLoaded += ThinkingAnalyticsAPI.OnSceneLoaded; | |||
|  |                 } | |||
|  |                 if ((events & AUTO_TRACK_EVENTS.AppSceneUnload) != 0) | |||
|  |                 { | |||
|  |                     SceneManager.sceneUnloaded -= ThinkingAnalyticsAPI.OnSceneUnloaded; | |||
|  |                     SceneManager.sceneUnloaded += ThinkingAnalyticsAPI.OnSceneUnloaded; | |||
|  |                 } | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { events, eventCallback, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  | 
 | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Set properties for auto-tracking events | |||
|  |         /// </summary> | |||
|  |         /// <param name="events">auto-tracking events</param> | |||
|  |         /// <param name="properties">properties for auto-tracking events</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void SetAutoTrackProperties(AUTO_TRACK_EVENTS events, Dictionary<string, object> properties, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.SetAutoTrackProperties((TDAutoTrackEventType)events, properties, appId); | |||
|  |                 if ((events & AUTO_TRACK_EVENTS.AppCrash) != 0 && !TDPublicConfig.DisableCSharpException) | |||
|  |                 { | |||
|  |                     TDWrapper.SetAutoTrackProperties((TDAutoTrackEventType)events ,properties, appId); | |||
|  |                 } | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { events, properties, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Track a Event | |||
|  |         /// </summary> | |||
|  |         /// <param name="eventName">event name</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void Track(string eventName, string appId = "") | |||
|  |         { | |||
|  |             Track(eventName, null, appId); | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Track a Event | |||
|  |         /// </summary> | |||
|  |         /// <param name="eventName">the event name</param> | |||
|  |         /// <param name="properties">properties for the event</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void Track(string eventName, Dictionary<string, object> properties, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.Track(eventName, properties, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { eventName, properties, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Track a Event | |||
|  |         /// </summary> | |||
|  |         /// <param name="eventName">the event name</param> | |||
|  |         /// <param name="properties">properties for the event</param> | |||
|  |         /// <param name="date">date for the event</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         [Obsolete("Method is deprecated, please use Track(string eventName, Dictionary<string, object> properties, DateTime date, TimeZoneInfo timeZone, string appId = \"\") instead.")] | |||
|  |         public static void Track(string eventName, Dictionary<string, object> properties, DateTime date, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.Track(eventName, properties, date, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { eventName, properties, date, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Track a Event | |||
|  |         /// </summary> | |||
|  |         /// <param name="eventName">the event name</param> | |||
|  |         /// <param name="properties">properties for the event</param> | |||
|  |         /// <param name="date">date for the event</param> | |||
|  |         /// <param name="timeZone">time zone for the event</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void Track(string eventName, Dictionary<string, object> properties, DateTime date, TimeZoneInfo timeZone, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.Track(eventName, properties, date, timeZone, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { eventName, properties, date, timeZone, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Track a Special Event (First Event/Updatable Event/Overwritable Event) | |||
|  |         /// </summary> | |||
|  |         /// <param name="analyticsEvent">the special event</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void Track(ThinkingAnalyticsEvent analyticsEvent, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDEventModel eventModel; | |||
|  |                 if (analyticsEvent.EventType == ThinkingAnalyticsEvent.Type.UPDATABLE) | |||
|  |                 { | |||
|  |                     eventModel = new TDUpdatableEventModel(analyticsEvent.EventName, analyticsEvent.ExtraId); | |||
|  |                 } | |||
|  |                 else if (analyticsEvent.EventType == ThinkingAnalyticsEvent.Type.OVERWRITABLE) | |||
|  |                 { | |||
|  |                     eventModel = new TDUpdatableEventModel(analyticsEvent.EventName, analyticsEvent.ExtraId); | |||
|  |                 } | |||
|  |                 else | |||
|  |                 { | |||
|  |                     if (string.IsNullOrEmpty(analyticsEvent.ExtraId)) | |||
|  |                     { | |||
|  |                         eventModel = new TDFirstEventModel(analyticsEvent.EventName); | |||
|  |                     } | |||
|  |                     else | |||
|  |                     { | |||
|  |                         eventModel = new TDFirstEventModel(analyticsEvent.EventName, analyticsEvent.ExtraId); | |||
|  |                     } | |||
|  |                 } | |||
|  |                 eventModel.Properties = analyticsEvent.Properties; | |||
|  |                 eventModel.SetTime(analyticsEvent.EventTime, analyticsEvent.EventTimeZone); | |||
|  |                 TDWrapper.Track(eventModel, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { analyticsEvent, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Quickly track a Special Event | |||
|  |         /// </summary> | |||
|  |         /// <param name="eventName">the event name, 'SceneView' for scene view event, 'AppClick' for click event</param> | |||
|  |         /// <param name="properties"> event properties </param> | |||
|  |         /// <param name="appId"></param> | |||
|  |         public static void QuickTrack(string eventName, Dictionary<string, object> properties = null, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.QuickTrack(eventName, properties, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { eventName, properties, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Report events data to TE server immediately | |||
|  |         /// </summary> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void Flush(string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.Flush(appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Scenes load Delegate | |||
|  |         /// </summary> | |||
|  |         /// <param name="scene">the load scene</param> | |||
|  |         /// <param name="mode">the scene loading mode</param> | |||
|  |         public static void OnSceneLoaded(Scene scene, LoadSceneMode mode) | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.TrackSceneLoad(scene); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { scene, mode }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Scenes unload Delegate | |||
|  |         /// </summary> | |||
|  |         /// <param name="scene">the unload scene</param> | |||
|  |         public static void OnSceneUnloaded(Scene scene) | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.TrackSceneUnload(scene); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { scene }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Super Properties, refer to properties that would be uploaded by each event | |||
|  |         /// </summary> | |||
|  |         /// <param name="superProperties">super properties for events</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void SetSuperProperties(Dictionary<string, object> superProperties, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.SetSuperProperties(superProperties, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { superProperties, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Delete Property form current Super Properties | |||
|  |         /// </summary> | |||
|  |         /// <param name="property">property name</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void UnsetSuperProperty(string property, string appId  = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.UnsetSuperProperty(property, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { property, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Returns current Super Properties | |||
|  |         /// </summary> | |||
|  |         /// <returns>current super properties</returns> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static Dictionary<string, object> GetSuperProperties(string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 return TDWrapper.GetSuperProperties(appId); | |||
|  |             } | |||
|  |             return null; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Clear current Super Properties | |||
|  |         /// </summary> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void ClearSuperProperties(string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.ClearSuperProperty(appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Returns current Preset Properties | |||
|  |         /// </summary> | |||
|  |         /// <returns>current preset properties</returns> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static TDPresetProperties GetPresetProperties(string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 Dictionary<string, object> properties = TDWrapper.GetPresetProperties(appId); | |||
|  |                 TDPresetProperties presetProperties = new TDPresetProperties(properties); | |||
|  |                 return presetProperties; | |||
|  |             } | |||
|  |             return null; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Sets the Dynamic Super Properties. | |||
|  |         /// </summary> | |||
|  |         /// <param name="dynamicSuperProperties">dynamic super properties interface</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void SetDynamicSuperProperties(IDynamicSuperProperties dynamicSuperProperties, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 sThinkingAnalyticsAPI._dynamicSuperProperties = dynamicSuperProperties; | |||
|  |                 TDWrapper.SetDynamicSuperProperties(sThinkingAnalyticsAPI, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { dynamicSuperProperties, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Records Event Duration, call TimeEvent to start timing for the Event, call Track to end timing | |||
|  |         /// </summary> | |||
|  |         /// <param name="eventName">the event name</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void TimeEvent(string eventName, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.TimeEvent(eventName, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { eventName, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Sets User Properties, this will overwrite the original properties value | |||
|  |         /// </summary> | |||
|  |         /// <param name="properties">user properties</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void UserSet(Dictionary<string, object> properties, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.UserSet(properties, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { properties, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Sets User Properties, this will overwrite the original properties value | |||
|  |         /// </summary> | |||
|  |         /// <param name="properties">user properties</param> | |||
|  |         /// <param name="dateTime">date time</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void UserSet(Dictionary<string, object> properties, DateTime dateTime, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.UserSet(properties, dateTime, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { properties , dateTime, appId}; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Unsets one of User Porperties, this would not create properties that have not been created in TE | |||
|  |         /// </summary> | |||
|  |         /// <param name="property">the user property name</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void UserUnset(string property, string appId = "") | |||
|  |         { | |||
|  |             List<string> properties = new List<string>(); | |||
|  |             properties.Add(property); | |||
|  |             UserUnset(properties, appId); | |||
|  |         } | |||
|  | 
 | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Unsets some of User Porperties, this would not create properties that have not been created in TE | |||
|  |         /// </summary> | |||
|  |         /// <param name="properties">the user properties name</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void UserUnset(List<string> properties, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.UserUnset(properties, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { properties, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  | 
 | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Unsets some of User Porperties, this would not create properties that have not been created in TE | |||
|  |         /// </summary> | |||
|  |         /// <param name="properties">the user properties name</param> | |||
|  |         /// <param name="dateTime">date time</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void UserUnset(List<string> properties, DateTime dateTime, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.UserUnset(properties, dateTime, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { properties, dateTime, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Sets User Properties for Once. This message would be neglected, if such property had been set before | |||
|  |         /// </summary> | |||
|  |         /// <param name="properties">user properties</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void UserSetOnce(Dictionary<string, object> properties, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.UserSetOnce(properties, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { properties, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  | 
 | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Sets User Properties for Once. The property would be neglected, if such property had been set before | |||
|  |         /// </summary> | |||
|  |         /// <param name="properties">user properties</param> | |||
|  |         /// <param name="dateTime">date time</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void UserSetOnce(Dictionary<string, object> properties, DateTime dateTime, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.UserSetOnce(properties, dateTime, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { properties, dateTime,appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  | 
 | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Accumulates the property. If the property has not been set, it would be given a value of 0 before computing.  | |||
|  |         /// </summary> | |||
|  |         /// <param name="property">the property name</param> | |||
|  |         /// <param name="value">value of the property</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void UserAdd(string property, object value, string appId = "") | |||
|  |         { | |||
|  |             Dictionary<string, object> properties = new Dictionary<string, object>() | |||
|  |             { | |||
|  |                 { property, value } | |||
|  |             }; | |||
|  |             UserAdd(properties, appId); | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Accumulates the property. If the property has not been set, it would be given a value of 0 before computing.  | |||
|  |         /// </summary> | |||
|  |         /// <param name="properties">user properties</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void UserAdd(Dictionary<string, object> properties, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.UserAdd(properties, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { properties, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Accumulates the property, type of Number. If the property has not been set, it would be given a value of 0 before computing.  | |||
|  |         /// </summary> | |||
|  |         /// <param name="properties">user properties</param> | |||
|  |         /// <param name="dateTime">date time</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void UserAdd(Dictionary<string, object> properties, DateTime dateTime, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.UserAdd(properties, dateTime, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { properties, dateTime, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Appends the property, type of List. | |||
|  |         /// </summary> | |||
|  |         /// <param name="properties">user properties</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void UserAppend(Dictionary<string, object> properties, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.UserAppend(properties, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { properties, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Appends the property, type of List. | |||
|  |         /// </summary> | |||
|  |         /// <param name="properties">user properties</param> | |||
|  |         /// <param name="dateTime">date time</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void UserAppend(Dictionary<string, object> properties, DateTime dateTime, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.UserAppend(properties, dateTime, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { properties, dateTime, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Appends the property Uniquely, type of List. If the property has been set, it would be neglected | |||
|  |         /// </summary> | |||
|  |         /// <param name="properties">user properties</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void UserUniqAppend(Dictionary<string, object> properties, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.UserUniqAppend(properties, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { properties, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Appends the property Uniquely, type of List. If the property has been set, it would be neglected | |||
|  |         /// </summary> | |||
|  |         /// <param name="properties">user prpoerties</param> | |||
|  |         /// <param name="dateTime">date time</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void UserUniqAppend(Dictionary<string, object> properties, DateTime dateTime, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.UserUniqAppend(properties, dateTime, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { properties, dateTime, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Deletes All Properties for a user, the events triggered by the user are still exist | |||
|  |         /// </summary> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void UserDelete(string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.UserDelete(appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Deletes All Properties for a user, the events triggered by the user are still exist | |||
|  |         /// </summary> | |||
|  |         /// <param name="dateTime">date time</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void UserDelete(DateTime dateTime, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.UserDelete(dateTime, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { dateTime, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Sets Network Type for report date to TE | |||
|  |         /// </summary> | |||
|  |         /// <param name="networkType">network type, see NetworkType</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void SetNetworkType(NetworkType networkType, string appId =  "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.SetNetworkType((TDNetworkType)networkType); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { networkType, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Gets the device identifier. | |||
|  |         /// </summary> | |||
|  |         /// <returns>The device identifier.</returns> | |||
|  |         public static string GetDeviceId() | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 return TDWrapper.GetDeviceId(); | |||
|  |             }  | |||
|  |             return null; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Sets Data Report Status | |||
|  |         /// </summary> | |||
|  |         /// <param name="status">data report status, see TA_TRACK_STATUS</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void SetTrackStatus(TA_TRACK_STATUS status, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.SetTrackStatus((TDTrackStatus)status, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { status, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Stops Report Event Data, and Clear Cache Data (include unreported event data, custom distinct ID, account ID, Super Properties) | |||
|  |         /// </summary> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         [Obsolete("Method is deprecated, please use SetTrackStatus() instead.")] | |||
|  |         public static void OptOutTracking(string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.OptOutTracking(appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Stops Report Event Data, and Clear Cache Data (include unreported event data, custom distinct ID, account ID, super properties), and Delete User | |||
|  |         /// </summary> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         [Obsolete("Method is deprecated, please use SetTrackStatus() instead.")] | |||
|  |         public static void OptOutTrackingAndDeleteUser(string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.OptOutTrackingAndDeleteUser(appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Resumes Report Event Data | |||
|  |         /// </summary> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         [Obsolete("Method is deprecated, please use SetTrackStatus() instead.")] | |||
|  |         public static void OptInTracking(string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.OptInTracking(appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Enable Report Event Data | |||
|  |         /// </summary> | |||
|  |         /// <param name="enabled">Whether to enable reported data</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         [Obsolete("Method is deprecated, please use SetTrackStatus() instead.")] | |||
|  |         public static void EnableTracking(bool enabled, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.EnableTracking(enabled, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { enabled, appId }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Creats Light Instance, it has same project ID to main instance, diffent distinct ID, account ID, super properties | |||
|  |         /// </summary> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         /// <returns>light instance token </returns> | |||
|  |         public static string CreateLightInstance(string appId = "") { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 return TDWrapper.CreateLightInstance(); | |||
|  |             } | |||
|  |             return null; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Calibrate Event Time, calibrated times are used for events after that | |||
|  |         /// </summary> | |||
|  |         /// <param name="timestamp">currnt Unix timestamp, units Ms </param> | |||
|  |         public static void CalibrateTime(long timestamp) | |||
|  |         { | |||
|  |             TDWrapper.CalibrateTime(timestamp); | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Calibrate Event Time, calibrated times are used for events after that | |||
|  |         /// If NTP server is not returns in 3s, the time will not be re-calibrated | |||
|  |         /// </summary> | |||
|  |         /// <param name="ntpServer">NTP server, e.g 'time.asia.apple.com' </param> | |||
|  |         public static void CalibrateTimeWithNtp(string ntpServer) | |||
|  |         { | |||
|  |             TDWrapper.CalibrateTimeWithNtp(ntpServer); | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Cross Platform | |||
|  |         /// Share TE account system info to other platforms | |||
|  |         /// </summary> | |||
|  |         /// <param name="shareType">type of platforms, see TAThirdPartyShareType</param> | |||
|  |         /// <param name="properties">properties of platforms</param> | |||
|  |         /// <param name="appId">project ID (optional)</param> | |||
|  |         public static void EnableThirdPartySharing(TAThirdPartyShareType shareType, Dictionary<string, object> properties = null, string appId = "") | |||
|  |         { | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDWrapper.EnableThirdPartySharing((TDThirdPartyType)shareType, properties, appId); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); | |||
|  |                 object[] parameters = new object[] { shareType }; | |||
|  |                 eventCaches.Add(new Dictionary<string, object>() { | |||
|  |                     { "method", method}, | |||
|  |                     { "parameters", parameters} | |||
|  |                 }); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Gets the Local Country/Region Code | |||
|  |         /// the two-letter code defined in ISO 3166 for the country/region | |||
|  |         /// </summary> | |||
|  |         /// <returns>country/region code</returns> | |||
|  |         public static string GetLocalRegion() | |||
|  |         { | |||
|  |             return System.Globalization.RegionInfo.CurrentRegion.TwoLetterISORegionName; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Start Thinking Analytics SDK | |||
|  |         /// </summary> | |||
|  |         /// <param name="appId">project ID</param> | |||
|  |         /// <param name="serverUrl">project URL</param> | |||
|  |         public static void StartThinkingAnalytics(string appId, string serverUrl) | |||
|  |         { | |||
|  |             ThinkingAnalyticsAPI.TAMode mode = ThinkingAnalyticsAPI.TAMode.NORMAL; | |||
|  |             ThinkingAnalyticsAPI.TATimeZone timeZone = ThinkingAnalyticsAPI.TATimeZone.Local; | |||
|  |             ThinkingAnalyticsAPI.Token token = new ThinkingAnalyticsAPI.Token(appId, serverUrl, mode, timeZone); | |||
|  |             ThinkingAnalyticsAPI.StartThinkingAnalytics(token); | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Start Thinking Analytics SDK | |||
|  |         /// </summary> | |||
|  |         /// <param name="token">project setting, see ThinkingAnalyticsAPI.Token</param> | |||
|  |         public static void StartThinkingAnalytics(ThinkingAnalyticsAPI.Token token) | |||
|  |         { | |||
|  |             ThinkingAnalyticsAPI.Token[] tokens = new ThinkingAnalyticsAPI.Token[1]; | |||
|  |             tokens[0] = token; | |||
|  |             ThinkingAnalyticsAPI.StartThinkingAnalytics(tokens); | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Start Thinking Analytics SDK | |||
|  |         /// </summary> | |||
|  |         /// <param name="tokens">projects setting, see ThinkingAnalyticsAPI.Token</param> | |||
|  |         public static void StartThinkingAnalytics(Token[] tokens = null) | |||
|  |         { | |||
|  | #if DISABLE_TA | |||
|  |             tracking_enabled = false; | |||
|  | #else | |||
|  |             tracking_enabled = true; | |||
|  | #endif | |||
|  | 
 | |||
|  |             if (tracking_enabled) | |||
|  |             { | |||
|  |                 TDPublicConfig.GetPublicConfig(); | |||
|  |                 TDLog.EnableLog(sThinkingAnalyticsAPI.enableLog); | |||
|  |                 TDWrapper.EnableLog(sThinkingAnalyticsAPI.enableLog); | |||
|  |                 TDWrapper.SetVersionInfo(TDPublicConfig.LIB_VERSION); | |||
|  |                 if (tokens == null) | |||
|  |                 { | |||
|  |                     tokens = sThinkingAnalyticsAPI.tokens; | |||
|  |                 } | |||
|  |                 try | |||
|  |                 { | |||
|  |                     for (int i = 0; i < tokens.Length; i++) | |||
|  |                     { | |||
|  |                         Token token = tokens[i]; | |||
|  |                         if (!string.IsNullOrEmpty(token.appid)) | |||
|  |                         { | |||
|  |                             token.appid = token.appid.Replace(" ", ""); | |||
|  |                             if(TDLog.GetEnable()) TDLog.d("ThinkingAnalytics start with APPID: " + token.appid + ", SERVERURL: " + token.serverUrl + ", MODE: " + token.mode); | |||
|  |                             TDWrapper.ShareInstance(token.ToTDConfig(), sThinkingAnalyticsAPI); | |||
|  |                             TDWrapper.SetNetworkType((TDNetworkType)sThinkingAnalyticsAPI.networkType); | |||
|  |                         } | |||
|  |                     } | |||
|  |                 } | |||
|  |                 catch (Exception ex) | |||
|  |                 { | |||
|  |                     if(TDLog.GetEnable()) TDLog.d("ThinkingAnalytics start Error: " + ex.Message); | |||
|  |                 } | |||
|  |             } | |||
|  | 
 | |||
|  |             FlushEventCaches(); | |||
|  |         } | |||
|  | 
 | |||
|  |         #region internal | |||
|  |         private static void FlushEventCaches() | |||
|  |         { | |||
|  |             List<Dictionary<string, object>> tmpEventCaches = new List<Dictionary<string, object>>(eventCaches); | |||
|  |             eventCaches.Clear(); | |||
|  |             foreach (Dictionary<string, object> eventCache in tmpEventCaches) | |||
|  |             { | |||
|  |                 if (eventCache.ContainsKey("method") && eventCache.ContainsKey("parameters")) | |||
|  |                 { | |||
|  |                     System.Reflection.MethodBase method = (System.Reflection.MethodBase)eventCache["method"]; | |||
|  |                     object[] parameters = (object[])eventCache["parameters"]; | |||
|  |                     method.Invoke(null, parameters); | |||
|  |                 } | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         private void Awake() | |||
|  |         { | |||
|  |             if (sThinkingAnalyticsAPI == null) | |||
|  |             { | |||
|  |                 sThinkingAnalyticsAPI = this; | |||
|  |                 DontDestroyOnLoad(gameObject); | |||
|  |             }  | |||
|  |             else | |||
|  |             { | |||
|  |                 Destroy(gameObject); | |||
|  |                 return; | |||
|  |             } | |||
|  | 
 | |||
|  |             if (this.startManually == false)  | |||
|  |             { | |||
|  |                 ThinkingAnalyticsAPI.StartThinkingAnalytics(); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         private void Start() | |||
|  |         { | |||
|  |         } | |||
|  | 
 | |||
|  |         private void OnApplicationQuit() | |||
|  |         { | |||
|  |             //Scene scene = SceneManager.GetActiveScene(); | |||
|  |             //if (scene != null) | |||
|  |             //{ | |||
|  |             //    OnSceneUnloaded(scene); | |||
|  |             //} | |||
|  |         } | |||
|  | 
 | |||
|  |         private static ThinkingAnalyticsAPI sThinkingAnalyticsAPI; | |||
|  |         private static bool tracking_enabled = false; | |||
|  |         private static List<Dictionary<string, object>> eventCaches = new List<Dictionary<string, object>>(); | |||
|  |         private IDynamicSuperProperties _dynamicSuperProperties; | |||
|  |         private IAutoTrackEventCallback _eventCallback; | |||
|  |         #endregion | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Dynamically gets event properties | |||
|  |         /// </summary> | |||
|  |         /// <returns>event properties</returns> | |||
|  |         public Dictionary<string, object> GetDynamicSuperProperties() | |||
|  |         { | |||
|  |             if (this._dynamicSuperProperties != null) | |||
|  |             { | |||
|  |                 return this._dynamicSuperProperties.GetDynamicSuperProperties(); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 return null; | |||
|  |             } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Get Auto track event properties | |||
|  |         /// </summary> | |||
|  |         /// <param name="type">auto track event type</param> | |||
|  |         /// <param name="properties">event properties</param> | |||
|  |         /// <returns>event properties</returns> | |||
|  |         public Dictionary<string, object> GetAutoTrackEventProperties(int type, Dictionary<string, object> properties) | |||
|  |         { | |||
|  |             if (this._eventCallback != null) | |||
|  |             { | |||
|  |                 return this._eventCallback.AutoTrackEventCallback(type, properties); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 return null; | |||
|  |             } | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     // Auto-tracking Events Type | |||
|  |     [Obsolete("AUTO_TRACK_EVENTS is deprecated, please use ThinkingData.Analytics.TDAutoTrackEventType instead.")] | |||
|  |     public enum AUTO_TRACK_EVENTS | |||
|  |     { | |||
|  |         NONE = 0, | |||
|  |         AppStart = 1 << 0, // reporting when the app enters the foreground (ta_app_start) | |||
|  |         AppEnd = 1 << 1, // reporting when the app enters the background (ta_app_end) | |||
|  |         AppCrash = 1 << 4, // reporting when an uncaught exception occurs (ta_app_crash) | |||
|  |         AppInstall = 1 << 5, // reporting when the app is opened for the first time after installation (ta_app_install) | |||
|  |         AppSceneLoad = 1 << 6, // reporting when the scene is loaded in the app (ta_scene_loaded) | |||
|  |         AppSceneUnload = 1 << 7, // reporting when the scene is unloaded in the app (ta_scene_loaded) | |||
|  |         ALL = AppStart | AppEnd | AppInstall | AppCrash | AppSceneLoad | AppSceneUnload | |||
|  |     } | |||
|  | 
 | |||
|  |     // Data Reporting Status | |||
|  |     [Obsolete("TA_TRACK_STATUS is deprecated, please use ThinkingData.Analytics.TDTrackStatus instead.")] | |||
|  |     public enum TA_TRACK_STATUS | |||
|  |     { | |||
|  |         PAUSE = 1, // pause data reporting | |||
|  |         STOP = 2, // stop data reporting, and clear caches | |||
|  |         SAVE_ONLY = 3, // data stores in the cache, but not be reported | |||
|  |         NORMAL = 4 // resume data reporting | |||
|  |     } | |||
|  | 
 | |||
|  |     [Obsolete("TAThirdPartyShareType is deprecated, please use ThinkingData.Analytics.Utils.TDThirdPartyType instead.")] | |||
|  |     public enum TAThirdPartyShareType | |||
|  |     { | |||
|  |         NONE = 0, | |||
|  |         APPSFLYER = 1 << 0, // AppsFlyer | |||
|  |         IRONSOURCE = 1 << 1, // IronSource | |||
|  |         ADJUST = 1 << 2, // Adjust | |||
|  |         BRANCH = 1 << 3, // Branch | |||
|  |         TOPON = 1 << 4, // TopOn | |||
|  |         TRACKING = 1 << 5, // ReYun | |||
|  |         TRADPLUS = 1 << 6, // TradPlus | |||
|  |     }; | |||
|  | 
 | |||
|  |     /// <summary> | |||
|  |     /// Dynamic super properties interfaces. | |||
|  |     /// </summary> | |||
|  |     [Obsolete("IDynamicSuperProperties is deprecated, please use ThinkingData.Analytics.TDDynamicSuperPropertiesHandler instead.")] | |||
|  |     public interface IDynamicSuperProperties | |||
|  |     { | |||
|  |         /// <summary> | |||
|  |         /// Dynamically gets event properties | |||
|  |         /// </summary> | |||
|  |         /// <returns>event properties</returns> | |||
|  |         Dictionary<string, object> GetDynamicSuperProperties(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /// <summary> | |||
|  |     /// Auto track event callback interfaces. | |||
|  |     /// </summary> | |||
|  |     [Obsolete("IAutoTrackEventCallback is deprecated, please use ThinkingData.Analytics.TDAutoTrackEventHandler instead.")] | |||
|  |     public interface IAutoTrackEventCallback | |||
|  |     { | |||
|  |         /// <summary> | |||
|  |         /// Get Auto track event properties | |||
|  |         /// </summary> | |||
|  |         /// <param name="type">auto track event type</param> | |||
|  |         /// <param name="properties">event properties</param> | |||
|  |         /// <returns>event properties</returns> | |||
|  |         Dictionary<string, object> AutoTrackEventCallback(int type, Dictionary<string, object> properties); | |||
|  |     } | |||
|  | 
 | |||
|  |     /// <summary> | |||
|  |     /// Special event class for internal use, do not use this class directly. | |||
|  |     /// </summary> | |||
|  |     [Obsolete("ThinkingAnalyticsEvent is deprecated, please use ThinkingData.Analytics.TDEventModel instead.")] | |||
|  |     public class ThinkingAnalyticsEvent | |||
|  |     { | |||
|  |         public enum Type | |||
|  |         { | |||
|  |             FIRST, | |||
|  |             UPDATABLE, | |||
|  |             OVERWRITABLE | |||
|  |         } | |||
|  | 
 | |||
|  |         public ThinkingAnalyticsEvent(string eventName, Dictionary<string, object> properties) | |||
|  |         { | |||
|  |             EventName = eventName; | |||
|  |             Properties = properties; | |||
|  |         } | |||
|  | 
 | |||
|  |         public Type? EventType { get; set; } | |||
|  |         public string EventName { get; } | |||
|  |         public Dictionary<string, object> Properties { get; } | |||
|  | 
 | |||
|  |         public DateTime EventTime { get; set; } | |||
|  |         public TimeZoneInfo EventTimeZone { get; set; } | |||
|  |         public string ExtraId { get; set; } | |||
|  |     } | |||
|  | 
 | |||
|  |     /// <summary> | |||
|  |     /// First Events | |||
|  |     /// </summary> | |||
|  |     [Obsolete("TDFirstEvent is deprecated, please use ThinkingData.Analytics.TDFirstEventModel instead.")] | |||
|  |     public class TDFirstEvent : ThinkingAnalyticsEvent | |||
|  |     { | |||
|  |         public TDFirstEvent(string eventName, Dictionary<string, object> properties) : base(eventName, properties) | |||
|  |         { | |||
|  |             EventType = Type.FIRST; | |||
|  |         } | |||
|  | 
 | |||
|  |         // First Event Check ID. By default, first events ID are device ID. | |||
|  |         public void SetFirstCheckId(string firstCheckId) | |||
|  |         { | |||
|  |             ExtraId = firstCheckId; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     /// <summary> | |||
|  |     /// Updatable Events | |||
|  |     /// </summary> | |||
|  |     [Obsolete("TDUpdatableEvent is deprecated, please use ThinkingData.Analytics.TDUpdatableEventModel instead.")] | |||
|  |     public class TDUpdatableEvent : ThinkingAnalyticsEvent | |||
|  |     { | |||
|  |         public TDUpdatableEvent(string eventName, Dictionary<string, object> properties, string eventId) : base(eventName, properties) | |||
|  |         { | |||
|  |             EventType = Type.UPDATABLE; | |||
|  |             ExtraId = eventId; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     /// <summary> | |||
|  |     /// Overwritable Events | |||
|  |     /// </summary> | |||
|  |     [Obsolete("TDOverWritableEvent is deprecated, please use ThinkingData.Analytics.TDOverwritableEventModel instead.")] | |||
|  |     public class TDOverWritableEvent : ThinkingAnalyticsEvent | |||
|  |     { | |||
|  |         public TDOverWritableEvent(string eventName, Dictionary<string, object> properties, string eventId) : base(eventName, properties) | |||
|  |         { | |||
|  |             EventType = Type.OVERWRITABLE; | |||
|  |             ExtraId = eventId; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     /// <summary> | |||
|  |     /// Preset Properties | |||
|  |     /// </summary> | |||
|  |     [Obsolete("TDPresetProperties is deprecated, please use ThinkingData.Analytics.TDPresetProperties instead.")] | |||
|  |     public class TDPresetProperties | |||
|  |     { | |||
|  |         /// <summary> | |||
|  |         /// Construct TDPresetProperties instance | |||
|  |         /// </summary> | |||
|  |         /// <param name="properties">preset properties</param> | |||
|  |         public TDPresetProperties(Dictionary<string, object> properties) | |||
|  |         { | |||
|  |             properties = TDEncodeDate(properties); | |||
|  |             mPresetProperties = properties; | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Returns Preset Properties | |||
|  |         /// The key starts with "#", it is not recommended to use it directly as a user properties | |||
|  |         /// </summary> | |||
|  |         /// <returns>preset properties</returns> | |||
|  |         public Dictionary<string, object> ToEventPresetProperties() | |||
|  |         { | |||
|  |             return mPresetProperties; | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Application Version Number | |||
|  |         /// </summary> | |||
|  |         public string AppVersion | |||
|  |         { | |||
|  |             get { return (string)(mPresetProperties.ContainsKey("#app_version") ? mPresetProperties["#app_version"] : ""); } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Application Bundle Identify | |||
|  |         /// </summary> | |||
|  |         public string BundleId | |||
|  |         { | |||
|  |             get { return (string)(mPresetProperties.ContainsKey("#bundle_id") ? mPresetProperties["#bundle_id"] : ""); } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Device Network Carrier | |||
|  |         /// </summary> | |||
|  |         public string Carrier | |||
|  |         { | |||
|  |             get { return (string)(mPresetProperties.ContainsKey("#carrier") ? mPresetProperties["#carrier"] : ""); } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Device Identify | |||
|  |         /// </summary> | |||
|  |         public string DeviceId | |||
|  |         { | |||
|  |             get { return (string)(mPresetProperties.ContainsKey("#device_id") ? mPresetProperties["#device_id"] : ""); } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Device Model Name | |||
|  |         /// </summary> | |||
|  |         public string DeviceModel | |||
|  |         { | |||
|  |             get { return (string)(mPresetProperties.ContainsKey("#device_model") ? mPresetProperties["#device_model"] : ""); } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Device Hardware Manufacturer | |||
|  |         /// </summary> | |||
|  |         public string Manufacturer | |||
|  |         { | |||
|  |             get { return (string)(mPresetProperties.ContainsKey("#manufacturer") ? mPresetProperties["#manufacturer"] : ""); } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Device Network Type | |||
|  |         /// </summary> | |||
|  |         public string NetworkType | |||
|  |         { | |||
|  |             get { return (string)(mPresetProperties.ContainsKey("#network_type") ? mPresetProperties["#network_type"] : ""); } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Device System OS Name | |||
|  |         /// </summary> | |||
|  |         public string OS | |||
|  |         { | |||
|  |             get { return (string)(mPresetProperties.ContainsKey("#os") ? mPresetProperties["#os"] : ""); } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Device System OS Version Number | |||
|  |         /// </summary> | |||
|  |         public string OSVersion | |||
|  |         { | |||
|  |             get { return (string)(mPresetProperties.ContainsKey("#os_version") ? mPresetProperties["#os_version"] : ""); } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Screen Height | |||
|  |         /// </summary> | |||
|  |         public double ScreenHeight | |||
|  |         { | |||
|  |             get { return Convert.ToDouble(mPresetProperties.ContainsKey("#screen_height") ? mPresetProperties["#screen_height"] : 0); } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Screen Width | |||
|  |         /// </summary> | |||
|  |         public double ScreenWidth | |||
|  |         { | |||
|  |             get { return Convert.ToDouble(mPresetProperties.ContainsKey("#screen_width") ? mPresetProperties["#screen_width"] : 0); } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Device System Language Code | |||
|  |         /// </summary> | |||
|  |         public string SystemLanguage | |||
|  |         { | |||
|  |             get { return (string)(mPresetProperties.ContainsKey("#system_language") ? mPresetProperties["#system_language"] : ""); } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Time Zone Offset With UTC | |||
|  |         /// </summary> | |||
|  |         public double ZoneOffset | |||
|  |         { | |||
|  |             get { return Convert.ToDouble(mPresetProperties.ContainsKey("#zone_offset") ? mPresetProperties["#zone_offset"] : 0); } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Application Install Time | |||
|  |         /// </summary> | |||
|  |         public string InstallTime | |||
|  |         { | |||
|  |             get { return (string)(mPresetProperties.ContainsKey("#install_time") ? mPresetProperties["#install_time"] : ""); } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Device Disk Size | |||
|  |         /// </summary> | |||
|  |         public string Disk | |||
|  |         { | |||
|  |             get { return (string)(mPresetProperties.ContainsKey("#disk") ? mPresetProperties["#disk"] : ""); } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Device Ram Size | |||
|  |         /// </summary> | |||
|  |         public string Ram | |||
|  |         { | |||
|  |             get { return (string)(mPresetProperties.ContainsKey("#ram") ? mPresetProperties["#ram"] : ""); } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Device FPS | |||
|  |         /// </summary> | |||
|  |         public double Fps | |||
|  |         { | |||
|  |             get { return Convert.ToDouble(mPresetProperties.ContainsKey("#fps") ? mPresetProperties["#fps"] : 0); } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Device is an Simulator | |||
|  |         /// </summary> | |||
|  |         public bool Simulator | |||
|  |         { | |||
|  |             get { return (bool)(mPresetProperties.ContainsKey("#simulator") ? mPresetProperties["#simulator"] : false); } | |||
|  |         } | |||
|  | 
 | |||
|  |         private Dictionary<string, object> mPresetProperties { get; set; } | |||
|  |         private Dictionary<string, object> TDEncodeDate(Dictionary<string, object> properties) | |||
|  |         { | |||
|  |             Dictionary<string, object> mProperties = new Dictionary<string, object>(); | |||
|  |             foreach (KeyValuePair<string, object> kv in properties) | |||
|  |             { | |||
|  |                 if (kv.Value is DateTime) | |||
|  |                 { | |||
|  |                     DateTime dateTime = (DateTime)kv.Value; | |||
|  |                     mProperties.Add(kv.Key, dateTime.ToString("yyyy-MM-dd HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture)); | |||
|  |                 } | |||
|  |                 else | |||
|  |                 { | |||
|  |                     mProperties.Add(kv.Key, kv.Value); | |||
|  |                 } | |||
|  |             } | |||
|  |             return mProperties; | |||
|  |         } | |||
|  |     } | |||
|  | } |