598 lines
24 KiB
C#
598 lines
24 KiB
C#
#if UNITY_ANDROID && !(UNITY_EDITOR) && !TE_DISABLE_ANDROID_JAVA
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using ThinkingAnalytics.Utils;
|
|
using UnityEngine;
|
|
|
|
namespace ThinkingAnalytics.Wrapper
|
|
{
|
|
public partial class ThinkingAnalyticsWrapper
|
|
{
|
|
private static readonly string JSON_CLASS = "org.json.JSONObject";
|
|
private static readonly AndroidJavaClass sdkClass = new AndroidJavaClass("cn.thinkingdata.android.ThinkingAnalyticsSDK");
|
|
private static readonly AndroidJavaClass configClass = new AndroidJavaClass("cn.thinkingdata.android.TDConfig");
|
|
|
|
private static readonly AndroidJavaObject unityAPIInstance = new AndroidJavaObject("cn.thinkingdata.engine.ThinkingAnalyticsUnityAPI");
|
|
|
|
private static Dictionary<string, AndroidJavaObject> light_instances = null;
|
|
|
|
/// <summary>
|
|
/// Convert Dictionary object to JSONObject in Java.
|
|
/// </summary>
|
|
/// <returns>The JSONObject instance.</returns>
|
|
/// <param name="data">The Dictionary containing some data </param>
|
|
private static AndroidJavaObject getJSONObject(Dictionary<string, object> data)
|
|
{
|
|
if (data == null)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
string dataString = serilize(data);
|
|
|
|
try
|
|
{
|
|
return new AndroidJavaObject(JSON_CLASS, dataString);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
if(TD_Log.GetEnable()) TD_Log.w("ThinkingAnalytics: unexpected exception: " + e);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private static string getTimeString(DateTime dateTime) {
|
|
long dateTimeTicksUTC = TimeZoneInfo.ConvertTimeToUtc(dateTime).Ticks;
|
|
|
|
DateTime dtFrom = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
|
|
long currentMillis = (dateTimeTicksUTC - dtFrom.Ticks) / 10000;
|
|
|
|
AndroidJavaObject date = new AndroidJavaObject("java.util.Date", currentMillis);
|
|
return getInstance(default_appId).Call<string>("getTimeString", date);
|
|
}
|
|
|
|
private static AndroidJavaObject getInstance(string appId) {
|
|
AndroidJavaObject context = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
|
|
AndroidJavaObject currentInstance;
|
|
|
|
if (string.IsNullOrEmpty(appId))
|
|
{
|
|
appId = default_appId;
|
|
}
|
|
|
|
if (light_instances != null && light_instances.ContainsKey(appId))
|
|
{
|
|
currentInstance = light_instances[appId];
|
|
}
|
|
else
|
|
{
|
|
currentInstance = sdkClass.CallStatic<AndroidJavaObject>("sharedInstance", context, appId);
|
|
}
|
|
|
|
if (currentInstance == null)
|
|
{
|
|
currentInstance = sdkClass.CallStatic<AndroidJavaObject>("sharedInstance", context, default_appId);
|
|
}
|
|
|
|
return currentInstance;
|
|
}
|
|
|
|
|
|
private static void enableLog(bool enable) {
|
|
sdkClass.CallStatic("enableTrackLog", enable);
|
|
}
|
|
private static void setVersionInfo(string libName, string version) {
|
|
sdkClass.CallStatic("setCustomerLibInfo", libName, version);
|
|
}
|
|
|
|
private static void init(ThinkingAnalyticsAPI.Token token)
|
|
{
|
|
AndroidJavaObject context = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
|
|
// AndroidJavaObject config = null;
|
|
// if (!string.IsNullOrEmpty(token.GetInstanceName()))
|
|
// {
|
|
// config = configClass.CallStatic<AndroidJavaObject>("getInstance", context, token.appid, token.serverUrl, token.GetInstanceName());
|
|
// if (string.IsNullOrEmpty(default_appId)) default_appId = token.GetInstanceName();
|
|
// }
|
|
// else
|
|
// {
|
|
// config = configClass.CallStatic<AndroidJavaObject>("getInstance", context, token.appid, token.serverUrl);
|
|
// if (string.IsNullOrEmpty(default_appId)) default_appId = token.appid;
|
|
// }
|
|
// config.Call("setModeInt", (int) token.mode);
|
|
|
|
// string timeZoneId = token.getTimeZoneId();
|
|
// if (null != timeZoneId && timeZoneId.Length > 0)
|
|
// {
|
|
// AndroidJavaObject timeZone = new AndroidJavaClass("java.util.TimeZone").CallStatic<AndroidJavaObject>("getTimeZone", timeZoneId);
|
|
// if (null != timeZone)
|
|
// {
|
|
// config.Call("setDefaultTimeZone", timeZone);
|
|
// }
|
|
// }
|
|
|
|
// if (token.enableEncrypt == true)
|
|
// {
|
|
// config.Call("enableEncrypt", true);
|
|
// AndroidJavaObject secreteKey = new AndroidJavaObject("cn.thinkingdata.android.encrypt.TDSecreteKey", token.encryptPublicKey, token.encryptVersion, "AES", "RSA");
|
|
// config.Call("setSecretKey", secreteKey);
|
|
// }
|
|
|
|
// sdkClass.CallStatic<AndroidJavaObject>("sharedInstance", config);
|
|
|
|
if (string.IsNullOrEmpty(default_appId)) default_appId = token.appid;
|
|
Dictionary<string, object> configDic = new Dictionary<string, object>();
|
|
configDic["appId"] = token.appid;
|
|
configDic["serverUrl"] = token.serverUrl;
|
|
configDic["mode"] = (int) token.mode;
|
|
if (!string.IsNullOrEmpty(token.GetInstanceName()))
|
|
{
|
|
// if (string.IsNullOrEmpty(default_appId)) default_appId = token.GetInstanceName();
|
|
configDic["instanceName"] = token.GetInstanceName();
|
|
}
|
|
else
|
|
{
|
|
// if (string.IsNullOrEmpty(default_appId)) default_appId = token.appid;
|
|
}
|
|
string timeZoneId = token.getTimeZoneId();
|
|
if (null != timeZoneId && timeZoneId.Length > 0)
|
|
{
|
|
configDic["timeZone"] = timeZoneId;
|
|
}
|
|
if (token.enableEncrypt == true)
|
|
{
|
|
configDic["enableEncrypt"] = true;
|
|
configDic["secretKey"] = new Dictionary<string, object>() {
|
|
{"publicKey", token.encryptPublicKey},
|
|
{"version", token.encryptVersion},
|
|
{"symmetricEncryption", "AES"},
|
|
{"asymmetricEncryption", "RSA"},
|
|
};
|
|
}
|
|
|
|
unityAPIInstance.Call("sharedInstance", context, TD_MiniJSON.Serialize(configDic));
|
|
}
|
|
|
|
private static void flush(string appId)
|
|
{
|
|
getInstance(appId).Call("flush");
|
|
}
|
|
|
|
private static AndroidJavaObject getDate(DateTime dateTime)
|
|
{
|
|
long dateTimeTicksUTC = TimeZoneInfo.ConvertTimeToUtc(dateTime).Ticks;
|
|
|
|
DateTime dtFrom = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
|
|
long currentMillis = (dateTimeTicksUTC - dtFrom.Ticks) / 10000;
|
|
return new AndroidJavaObject("java.util.Date", currentMillis);
|
|
}
|
|
|
|
private static void track(string eventName, Dictionary<string, object> properties, DateTime dateTime, string appId)
|
|
{
|
|
AndroidJavaObject date = getDate(dateTime);
|
|
AndroidJavaClass tzClass = new AndroidJavaClass("java.util.TimeZone");
|
|
AndroidJavaObject tz = null;
|
|
getInstance(appId).Call("track", eventName, getJSONObject(properties), date, tz);
|
|
}
|
|
|
|
private static void track(string eventName, Dictionary<string, object> properties, DateTime dateTime, TimeZoneInfo timeZone, string appId)
|
|
{
|
|
AndroidJavaObject date = getDate(dateTime);
|
|
AndroidJavaObject tz = null;
|
|
if (null != timeZone && null != timeZone.Id && timeZone.Id.Length > 0)
|
|
{
|
|
if ("Local" == timeZone.Id) {
|
|
tz = new AndroidJavaClass("java.util.TimeZone").CallStatic<AndroidJavaObject>("getDefault");
|
|
}
|
|
else {
|
|
tz = new AndroidJavaClass("java.util.TimeZone").CallStatic<AndroidJavaObject>("getTimeZone", timeZone.Id);
|
|
}
|
|
}
|
|
getInstance(appId).Call("track", eventName, getJSONObject(properties), date, tz);
|
|
}
|
|
|
|
private static void trackForAll(string eventName, Dictionary<string, object> properties)
|
|
{
|
|
string appId = "";
|
|
track(eventName, properties, appId);
|
|
}
|
|
|
|
private static void track(ThinkingAnalyticsEvent taEvent, string appId)
|
|
{
|
|
AndroidJavaObject javaEvent = null;
|
|
switch(taEvent.EventType)
|
|
{
|
|
case ThinkingAnalyticsEvent.Type.FIRST:
|
|
javaEvent = new AndroidJavaObject("cn.thinkingdata.android.TDFirstEvent",
|
|
taEvent.EventName, getJSONObject(getFinalEventProperties(taEvent.Properties)));
|
|
|
|
string extraId = taEvent.ExtraId;
|
|
if (!string.IsNullOrEmpty(extraId))
|
|
{
|
|
javaEvent.Call("setFirstCheckId", extraId);
|
|
}
|
|
|
|
break;
|
|
case ThinkingAnalyticsEvent.Type.UPDATABLE:
|
|
javaEvent = new AndroidJavaObject("cn.thinkingdata.android.TDUpdatableEvent",
|
|
taEvent.EventName, getJSONObject(getFinalEventProperties(taEvent.Properties)), taEvent.ExtraId);
|
|
break;
|
|
case ThinkingAnalyticsEvent.Type.OVERWRITABLE:
|
|
javaEvent = new AndroidJavaObject("cn.thinkingdata.android.TDOverWritableEvent",
|
|
taEvent.EventName, getJSONObject(getFinalEventProperties(taEvent.Properties)), taEvent.ExtraId);
|
|
break;
|
|
}
|
|
if (null == javaEvent) {
|
|
if(TD_Log.GetEnable()) TD_Log.w("Unexpected java event object. Returning...");
|
|
return;
|
|
}
|
|
|
|
if (taEvent.EventTime != null && taEvent.EventTime != DateTime.MinValue) {
|
|
AndroidJavaObject date = getDate(taEvent.EventTime);
|
|
AndroidJavaClass tzClass = new AndroidJavaClass("java.util.TimeZone");
|
|
AndroidJavaObject tz = null;
|
|
if (taEvent.EventTimeZone != null) {
|
|
if ("Local" == taEvent.EventTimeZone.Id) {
|
|
tz = new AndroidJavaClass("java.util.TimeZone").CallStatic<AndroidJavaObject>("getDefault");
|
|
}
|
|
else {
|
|
tz = new AndroidJavaClass("java.util.TimeZone").CallStatic<AndroidJavaObject>("getTimeZone", taEvent.EventTimeZone.Id);
|
|
}
|
|
javaEvent.Call("setEventTime", date, tz);
|
|
}
|
|
else
|
|
{
|
|
javaEvent.Call("setEventTime", date);
|
|
}
|
|
|
|
}
|
|
|
|
getInstance(appId).Call("track", javaEvent);
|
|
}
|
|
|
|
private static void track(string eventName, Dictionary<string, object> properties, string appId)
|
|
{
|
|
getInstance(appId).Call("track", eventName, getJSONObject(properties));
|
|
}
|
|
|
|
private static void setSuperProperties(Dictionary<string, object> superProperties, string appId)
|
|
{
|
|
getInstance(appId).Call("setSuperProperties", getJSONObject(superProperties));
|
|
}
|
|
|
|
private static void unsetSuperProperty(string superPropertyName, string appId)
|
|
{
|
|
getInstance(appId).Call("unsetSuperProperty", superPropertyName);
|
|
}
|
|
|
|
private static void clearSuperProperty(string appId)
|
|
{
|
|
getInstance(appId).Call("clearSuperProperties");
|
|
}
|
|
|
|
private static Dictionary<string, object> getSuperProperties(string appId)
|
|
{
|
|
Dictionary<string, object> result = null;
|
|
AndroidJavaObject superPropertyObject = getInstance(appId).Call<AndroidJavaObject>("getSuperProperties");
|
|
if (null != superPropertyObject)
|
|
{
|
|
string superPropertiesString = superPropertyObject.Call<string>("toString");
|
|
result = TD_MiniJSON.Deserialize(superPropertiesString);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static Dictionary<string, object> getPresetProperties(string appId)
|
|
{
|
|
Dictionary<string, object> result = null;
|
|
AndroidJavaObject presetPropertyObject = getInstance(appId).Call<AndroidJavaObject>("getPresetProperties").Call<AndroidJavaObject>("toEventPresetProperties");
|
|
if (null != presetPropertyObject)
|
|
{
|
|
string presetPropertiesString = presetPropertyObject.Call<string>("toString");
|
|
result = TD_MiniJSON.Deserialize(presetPropertiesString);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static void timeEvent(string eventName, string appId)
|
|
{
|
|
getInstance(appId).Call("timeEvent", eventName);
|
|
}
|
|
|
|
private static void timeEventForAll(string eventName)
|
|
{
|
|
getInstance("").Call("timeEvent", eventName);
|
|
}
|
|
|
|
private static void identify(string uniqueId, string appId)
|
|
{
|
|
getInstance(appId).Call("identify", uniqueId);
|
|
}
|
|
|
|
private static string getDistinctId(string appId)
|
|
{
|
|
return getInstance(appId).Call<string>("getDistinctId");
|
|
}
|
|
|
|
private static void login(string uniqueId, string appId)
|
|
{
|
|
getInstance(appId).Call("login", uniqueId);
|
|
}
|
|
|
|
private static void userSetOnce(Dictionary<string, object> properties, string appId)
|
|
{
|
|
getInstance(appId).Call("user_setOnce", getJSONObject(properties));
|
|
}
|
|
|
|
private static void userSetOnce(Dictionary<string, object> properties, DateTime dateTime, string appId)
|
|
{
|
|
getInstance(appId).Call("user_setOnce", getJSONObject(properties), getDate(dateTime));
|
|
}
|
|
|
|
private static void userSet(Dictionary<string, object> properties, string appId)
|
|
{
|
|
getInstance(appId).Call("user_set", getJSONObject(properties));
|
|
}
|
|
|
|
private static void userSet(Dictionary<string, object> properties, DateTime dateTime, string appId)
|
|
{
|
|
getInstance(appId).Call("user_set", getJSONObject(properties), getDate(dateTime));
|
|
}
|
|
|
|
private static void userUnset(List<string> properties, string appId)
|
|
{
|
|
userUnset(properties, DateTime.Now, appId);
|
|
}
|
|
|
|
private static void userUnset(List<string> properties, DateTime dateTime, string appId)
|
|
{
|
|
Dictionary<string, object> finalProperties = new Dictionary<string, object>();
|
|
foreach(string s in properties)
|
|
{
|
|
finalProperties.Add(s, 0);
|
|
}
|
|
|
|
getInstance(appId).Call("user_unset", getJSONObject(finalProperties), getDate(dateTime));
|
|
}
|
|
|
|
private static void userAdd(Dictionary<string, object> properties, string appId)
|
|
{
|
|
getInstance(appId).Call("user_add", getJSONObject(properties));
|
|
}
|
|
|
|
private static void userAdd(Dictionary<string, object> properties, DateTime dateTime, string appId)
|
|
{
|
|
getInstance(appId).Call("user_add", getJSONObject(properties), getDate(dateTime));
|
|
}
|
|
|
|
private static void userAppend(Dictionary<string, object> properties, string appId)
|
|
{
|
|
getInstance(appId).Call("user_append", getJSONObject(properties));
|
|
}
|
|
|
|
private static void userAppend(Dictionary<string, object> properties, DateTime dateTime, string appId)
|
|
{
|
|
getInstance(appId).Call("user_append", getJSONObject(properties), getDate(dateTime));
|
|
}
|
|
|
|
private static void userUniqAppend(Dictionary<string, object> properties, string appId)
|
|
{
|
|
getInstance(appId).Call("user_uniqAppend", getJSONObject(properties));
|
|
}
|
|
|
|
private static void userUniqAppend(Dictionary<string, object> properties, DateTime dateTime, string appId)
|
|
{
|
|
getInstance(appId).Call("user_uniqAppend", getJSONObject(properties), getDate(dateTime));
|
|
}
|
|
|
|
private static void userDelete(string appId)
|
|
{
|
|
getInstance(appId).Call("user_delete");
|
|
}
|
|
|
|
private static void userDelete(DateTime dateTime, string appId)
|
|
{
|
|
getInstance(appId).Call("user_delete", getDate(dateTime));
|
|
}
|
|
|
|
private static void logout(string appId)
|
|
{
|
|
getInstance(appId).Call("logout");
|
|
}
|
|
|
|
private static string getDeviceId()
|
|
{
|
|
return getInstance(default_appId).Call<string>("getDeviceId");
|
|
}
|
|
|
|
private static void setDynamicSuperProperties(IDynamicSuperProperties dynamicSuperProperties, string appId)
|
|
{
|
|
DynamicListenerAdapter listenerAdapter = new DynamicListenerAdapter();
|
|
if (string.IsNullOrEmpty(appId))
|
|
{
|
|
appId = default_appId;
|
|
}
|
|
unityAPIInstance.Call("setDynamicSuperPropertiesTrackerListener", appId, listenerAdapter);
|
|
}
|
|
|
|
private static void setNetworkType(ThinkingAnalyticsAPI.NetworkType networkType) {
|
|
Dictionary<string, object> properties = new Dictionary<string, object>() { };
|
|
switch (networkType)
|
|
{
|
|
case ThinkingAnalyticsAPI.NetworkType.DEFAULT:
|
|
properties["network_type"] = 0;
|
|
break;
|
|
case ThinkingAnalyticsAPI.NetworkType.WIFI:
|
|
properties["network_type"] = 1;
|
|
break;
|
|
case ThinkingAnalyticsAPI.NetworkType.ALL:
|
|
properties["network_type"] = 2;
|
|
break;
|
|
}
|
|
unityAPIInstance.Call("setNetworkType", TD_MiniJSON.Serialize(properties));
|
|
}
|
|
|
|
private static void enableAutoTrack(AUTO_TRACK_EVENTS events, Dictionary<string, object> properties, string appId)
|
|
{
|
|
if (string.IsNullOrEmpty(appId))
|
|
{
|
|
appId = default_appId;
|
|
}
|
|
Dictionary<string, object> propertiesNew = new Dictionary<string, object>() {
|
|
{ "appId", appId},
|
|
{ "autoTrackType", (int)events}
|
|
};
|
|
unityAPIInstance.Call("enableAutoTrack", TD_MiniJSON.Serialize(propertiesNew));
|
|
propertiesNew["properties"] = properties;
|
|
unityAPIInstance.Call("setAutoTrackProperties", TD_MiniJSON.Serialize(propertiesNew));
|
|
}
|
|
|
|
private static void enableAutoTrack(AUTO_TRACK_EVENTS events, IAutoTrackEventCallback eventCallback, string appId)
|
|
{
|
|
AutoTrackListenerAdapter listenerAdapter = new AutoTrackListenerAdapter();
|
|
if (string.IsNullOrEmpty(appId))
|
|
{
|
|
appId = default_appId;
|
|
}
|
|
Dictionary<string, object> properties = new Dictionary<string, object>() {
|
|
{ "appId", appId},
|
|
{ "autoTrackType", (int)events}
|
|
};
|
|
unityAPIInstance.Call("enableAutoTrack", TD_MiniJSON.Serialize(properties), listenerAdapter);
|
|
}
|
|
|
|
private static void setAutoTrackProperties(AUTO_TRACK_EVENTS events, Dictionary<string, object> properties, string appId)
|
|
{
|
|
if (string.IsNullOrEmpty(appId))
|
|
{
|
|
appId = default_appId;
|
|
}
|
|
Dictionary<string, object> propertiesNew = new Dictionary<string, object>() {
|
|
{ "appId", appId},
|
|
{ "autoTrackType", (int)events}
|
|
};
|
|
propertiesNew["properties"] = properties;
|
|
unityAPIInstance.Call("setAutoTrackProperties", TD_MiniJSON.Serialize(propertiesNew));
|
|
}
|
|
|
|
private static void setTrackStatus(TA_TRACK_STATUS status, string appId)
|
|
{
|
|
AndroidJavaClass javaClass = new AndroidJavaClass("cn.thinkingdata.android.ThinkingAnalyticsSDK$TATrackStatus");
|
|
AndroidJavaObject trackStatus;
|
|
switch (status)
|
|
{
|
|
case TA_TRACK_STATUS.PAUSE:
|
|
trackStatus = javaClass.GetStatic<AndroidJavaObject>("PAUSE");
|
|
break;
|
|
case TA_TRACK_STATUS.STOP:
|
|
trackStatus = javaClass.GetStatic<AndroidJavaObject>("STOP");
|
|
break;
|
|
case TA_TRACK_STATUS.SAVE_ONLY:
|
|
trackStatus = javaClass.GetStatic<AndroidJavaObject>("SAVE_ONLY");
|
|
break;
|
|
case TA_TRACK_STATUS.NORMAL:
|
|
default:
|
|
trackStatus = javaClass.GetStatic<AndroidJavaObject>("NORMAL");
|
|
break;
|
|
}
|
|
getInstance(appId).Call("setTrackStatus", trackStatus);
|
|
}
|
|
|
|
private static void optOutTracking(string appId)
|
|
{
|
|
getInstance(appId).Call("optOutTracking");
|
|
}
|
|
|
|
private static void optOutTrackingAndDeleteUser(string appId)
|
|
{
|
|
getInstance(appId).Call("optOutTrackingAndDeleteUser");
|
|
}
|
|
|
|
private static void optInTracking(string appId)
|
|
{
|
|
getInstance(appId).Call("optInTracking");
|
|
}
|
|
|
|
private static void enableTracking(bool enabled, string appId)
|
|
{
|
|
getInstance(appId).Call("enableTracking", enabled);
|
|
}
|
|
|
|
private static string createLightInstance()
|
|
{
|
|
string randomID = System.Guid.NewGuid().ToString("N");
|
|
AndroidJavaObject lightInstance = getInstance(default_appId).Call<AndroidJavaObject>("createLightInstance");
|
|
if (light_instances == null) {
|
|
light_instances = new Dictionary<string, AndroidJavaObject>();
|
|
}
|
|
light_instances.Add(randomID, lightInstance);
|
|
return randomID;
|
|
}
|
|
|
|
private static void calibrateTime(long timestamp)
|
|
{
|
|
sdkClass.CallStatic("calibrateTime", timestamp);
|
|
}
|
|
|
|
private static void calibrateTimeWithNtp(string ntpServer)
|
|
{
|
|
unityAPIInstance.Call("calibrateTimeWithNtp", ntpServer);
|
|
}
|
|
|
|
private static void enableThirdPartySharing(TAThirdPartyShareType shareType, Dictionary<string, object> properties, string appId)
|
|
{
|
|
Dictionary<string, object> obj = new Dictionary<string, object>() {
|
|
{ "appId", appId },
|
|
{ "type", (int)shareType }
|
|
};
|
|
obj["properties"] = properties;
|
|
unityAPIInstance.Call("enableThirdPartySharing", TD_MiniJSON.Serialize(obj));
|
|
}
|
|
|
|
//dynamic super properties
|
|
public interface IDynamicSuperPropertiesTrackerListener
|
|
{
|
|
string getDynamicSuperPropertiesString();
|
|
}
|
|
|
|
private class DynamicListenerAdapter : AndroidJavaProxy {
|
|
public DynamicListenerAdapter() : base("cn.thinkingdata.engine.ThinkingAnalyticsUnityAPI$DynamicSuperPropertiesTrackerListener") {}
|
|
public string getDynamicSuperPropertiesString()
|
|
{
|
|
Dictionary<string, object> ret;
|
|
if (ThinkingAnalyticsWrapper.mDynamicSuperProperties != null) {
|
|
ret = ThinkingAnalyticsWrapper.mDynamicSuperProperties.GetDynamicSuperProperties();
|
|
}
|
|
else {
|
|
ret = new Dictionary<string, object>();
|
|
}
|
|
return TD_MiniJSON.Serialize(ret);
|
|
}
|
|
}
|
|
|
|
//auto-tracking
|
|
public interface IAutoTrackEventTrackerListener
|
|
{
|
|
string eventCallback(int type, string appId, string properties);
|
|
}
|
|
|
|
private class AutoTrackListenerAdapter : AndroidJavaProxy {
|
|
public AutoTrackListenerAdapter() : base("cn.thinkingdata.engine.ThinkingAnalyticsUnityAPI$AutoTrackEventTrackerListener") {}
|
|
string eventCallback(int type, string appId, string properties)
|
|
{
|
|
Dictionary<string, object> ret;
|
|
if (string.IsNullOrEmpty(appId)) appId = default_appId;
|
|
if (ThinkingAnalyticsWrapper.mAutoTrackEventCallbacks.ContainsKey(appId))
|
|
{
|
|
Dictionary<string, object> propertiesDic = TD_MiniJSON.Deserialize(properties);
|
|
ret = ThinkingAnalyticsWrapper.mAutoTrackEventCallbacks[appId].AutoTrackEventCallback(type, propertiesDic);
|
|
}
|
|
else {
|
|
ret = new Dictionary<string, object>();
|
|
}
|
|
return TD_MiniJSON.Serialize(ret);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif |