401 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			401 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
| using UnityEngine;
 | |
| using System;
 | |
| using System.Collections;
 | |
| using System.Collections.Generic;
 | |
| 
 | |
| public class AndroidTenjin : BaseTenjin {
 | |
| 
 | |
| 	private const string AndroidJavaTenjinClass = "com.tenjin.android.TenjinSDK";
 | |
| 	private const string AndroidJavaTenjinAppStoreType = "com.tenjin.android.TenjinSDK$AppStoreType";
 | |
| 
 | |
| #if UNITY_ANDROID && !UNITY_EDITOR
 | |
| 	private AndroidJavaObject tenjinJava = null;
 | |
| 	private AndroidJavaObject activity = null;
 | |
| 
 | |
| 	public override void Init(string apiKey){
 | |
| 		if (Debug.isDebugBuild) {
 | |
|             Debug.Log ("Android Initializing - v"+this.SdkVersion);
 | |
| 		}
 | |
| 		ApiKey = apiKey;
 | |
| 
 | |
|         SetUnityVersionInNativeSDK();
 | |
| 
 | |
| 		initActivity();
 | |
| 		AndroidJavaClass sdk = new AndroidJavaClass (AndroidJavaTenjinClass);
 | |
| 		if (sdk == null){
 | |
| 			throw new MissingReferenceException(
 | |
| 				string.Format("AndroidTenjin failed to load {0} class", AndroidJavaTenjinClass)
 | |
| 			);
 | |
| 		}
 | |
| 		tenjinJava = sdk.CallStatic<AndroidJavaObject> ("getInstance", activity, apiKey);
 | |
| 	}
 | |
| 
 | |
| 	public override void InitWithSharedSecret(string apiKey, string sharedSecret){
 | |
| 		if (Debug.isDebugBuild) {
 | |
|             Debug.Log("Android Initializing with Shared Secret - v"+this.SdkVersion);
 | |
| 		}
 | |
| 		ApiKey = apiKey;
 | |
| 		SharedSecret = sharedSecret;
 | |
| 
 | |
|         SetUnityVersionInNativeSDK();
 | |
| 
 | |
| 		initActivity();
 | |
| 		AndroidJavaClass sdk = new AndroidJavaClass (AndroidJavaTenjinClass);
 | |
| 		if (sdk == null){
 | |
| 			throw new MissingReferenceException(
 | |
| 				string.Format("AndroidTenjin failed to load {0} class", AndroidJavaTenjinClass)
 | |
| 			);
 | |
| 		}
 | |
| 		tenjinJava = sdk.CallStatic<AndroidJavaObject> ("getInstanceWithSharedSecret", activity, apiKey, sharedSecret);
 | |
| 	}
 | |
| 
 | |
| 	public override void InitWithAppSubversion(string apiKey, int appSubversion){
 | |
| 		if (Debug.isDebugBuild) {
 | |
|             Debug.Log("Android Initializing with App Subversion: " + appSubversion + " v" +this.SdkVersion);
 | |
| 		}
 | |
| 		ApiKey = apiKey;
 | |
| 		AppSubversion = appSubversion;
 | |
| 
 | |
|         SetUnityVersionInNativeSDK();
 | |
| 
 | |
| 		initActivity();
 | |
| 		AndroidJavaClass sdk = new AndroidJavaClass (AndroidJavaTenjinClass);
 | |
| 		if (sdk == null){
 | |
| 			throw new MissingReferenceException(
 | |
| 				string.Format("AndroidTenjin failed to load {0} class", AndroidJavaTenjinClass)
 | |
| 			);
 | |
| 		}
 | |
| 		tenjinJava = sdk.CallStatic<AndroidJavaObject> ("getInstanceWithAppSubversion", activity, apiKey, appSubversion);
 | |
| 		tenjinJava.Call ("appendAppSubversion", new object[]{appSubversion});
 | |
| 	}
 | |
| 
 | |
| 	public override void InitWithSharedSecretAppSubversion(string apiKey, string sharedSecret, int appSubversion){
 | |
| 		if (Debug.isDebugBuild) {
 | |
|             Debug.Log("Android Initializing with Shared Secret + App Subversion: " + appSubversion +" v" +this.SdkVersion);
 | |
| 		}
 | |
| 		ApiKey = apiKey;
 | |
| 		SharedSecret = sharedSecret;
 | |
| 		AppSubversion = appSubversion;
 | |
| 
 | |
| 		SetUnityVersionInNativeSDK();
 | |
| 
 | |
| 		initActivity();
 | |
| 		AndroidJavaClass sdk = new AndroidJavaClass (AndroidJavaTenjinClass);
 | |
| 		if (sdk == null){
 | |
| 			throw new MissingReferenceException(
 | |
| 				string.Format("AndroidTenjin failed to load {0} class", AndroidJavaTenjinClass)
 | |
| 			);
 | |
| 		}
 | |
| 		tenjinJava = sdk.CallStatic<AndroidJavaObject> ("getInstanceWithSharedSecretAppSubversion", activity, apiKey, sharedSecret, appSubversion);
 | |
| 		tenjinJava.Call ("appendAppSubversion", new object[]{appSubversion});
 | |
| 	}
 | |
| 
 | |
|     private void SetUnityVersionInNativeSDK() {
 | |
| 		var unitySdkVersion = this.SdkVersion + "u";
 | |
| 
 | |
| 		AndroidJavaClass sdk = new AndroidJavaClass (AndroidJavaTenjinClass);
 | |
| 		if (sdk == null){
 | |
| 			throw new MissingReferenceException(
 | |
| 				string.Format("AndroidTenjin failed to load {0} class", AndroidJavaTenjinClass)
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 		sdk.CallStatic("setWrapperVersion", unitySdkVersion);
 | |
|     }
 | |
| 
 | |
| 	private void initActivity(){
 | |
| 		AndroidJavaClass javaContext = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
 | |
| 		activity = javaContext.GetStatic<AndroidJavaObject>("currentActivity");
 | |
| 	}
 | |
| 
 | |
| 	public override void Connect() {
 | |
| 		string optInOut = null;
 | |
| 		if (optIn) {
 | |
| 			optInOut = "optin";
 | |
| 		}
 | |
| 		else if (optOut) {
 | |
| 			optInOut = "optout";
 | |
| 		}
 | |
| 		object[] args = new object[]{null, optInOut};
 | |
| 		tenjinJava.Call ("connect", args);
 | |
| 	}
 | |
| 
 | |
| 	public override void Connect(string deferredDeeplink){
 | |
| 		string optInOut = null;
 | |
| 		if (optIn) {
 | |
| 			optInOut = "optin";
 | |
| 		}
 | |
| 		else if (optOut) {
 | |
| 			optInOut = "optout";
 | |
| 		}
 | |
| 		object[] args = new object[]{deferredDeeplink, optInOut};
 | |
| 		tenjinJava.Call ("connect", args);
 | |
| 	}
 | |
| 
 | |
| 	//SendEvent accepts a single eventName as a String
 | |
| 	public override void SendEvent (string eventName){
 | |
| 		object[] args = new object[]{eventName};
 | |
| 		tenjinJava.Call ("eventWithName", args);
 | |
| 	}
 | |
| 
 | |
| 	//SendEvent accepts eventName as a String and eventValue as a String
 | |
| 	public override void SendEvent (string eventName, string eventValue){
 | |
| 		object[] args = new object[]{eventName, eventValue};
 | |
| 		tenjinJava.Call ("eventWithNameAndValue", args);
 | |
| 	}
 | |
| 
 | |
| 	public override void Transaction(string productId, string currencyCode, int quantity, double unitPrice, string transactionId, string receipt, string signature){
 | |
| 
 | |
| 		transactionId = null;
 | |
| 		//if the receipt and signature have values then try to validate. if there are no values then manually log the transaction.
 | |
| 		if(receipt != null && signature != null){
 | |
| 			object[] receiptArgs = new object[]{productId, currencyCode, quantity, unitPrice, receipt, signature};
 | |
| 			if (Debug.isDebugBuild) {
 | |
| 				Debug.Log ("Android Transaction " + productId + ", " + currencyCode + ", " + quantity + ", " + unitPrice + ", " + receipt + ", " + signature);
 | |
| 			}		
 | |
| 			tenjinJava.Call ("transaction", receiptArgs);
 | |
| 		}
 | |
| 		else{
 | |
| 			object[] args = new object[]{productId, currencyCode, quantity, unitPrice};
 | |
| 			if (Debug.isDebugBuild) {
 | |
| 				Debug.Log ("Android Transaction " + productId + ", " + currencyCode + ", " + quantity + ", " + unitPrice);
 | |
| 			}
 | |
| 			tenjinJava.Call ("transaction", args);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public override void GetDeeplink(Tenjin.DeferredDeeplinkDelegate deferredDeeplinkDelegate) {
 | |
| 		DeferredDeeplinkListener onDeferredDeeplinkListener = new DeferredDeeplinkListener(deferredDeeplinkDelegate);
 | |
| 		tenjinJava.Call ("getDeeplink", onDeferredDeeplinkListener);
 | |
| 	}
 | |
| 
 | |
| 	private class DeferredDeeplinkListener : AndroidJavaProxy {
 | |
| 		private Tenjin.DeferredDeeplinkDelegate callback;
 | |
| 
 | |
| 		public DeferredDeeplinkListener(Tenjin.DeferredDeeplinkDelegate deferredDeeplinkCallback) : base("com.tenjin.android.Callback") {
 | |
| 			this.callback = deferredDeeplinkCallback;
 | |
| 		}
 | |
| 
 | |
| 		public void onSuccess(bool clickedTenjinLink, bool isFirstSession, AndroidJavaObject data) {
 | |
| 			Dictionary<string, string> deeplinkData = new Dictionary<string, string>();
 | |
| 			string adNetwork = data.Call<string>("get", "ad_network");
 | |
| 			string advertisingId = data.Call<string>("get", "advertising_id");
 | |
| 			string campaignId = data.Call<string>("get", "campaign_id");
 | |
| 			string campaignName = data.Call<string>("get", "campaign_name");
 | |
| 			string deferredDeeplink = data.Call<string>("get", "deferred_deeplink_url");
 | |
| 			string referrer = data.Call<string>("get", "referrer");
 | |
| 			string siteId = data.Call<string>("get", " site_id");
 | |
| 
 | |
| 			if (!string.IsNullOrEmpty(adNetwork)) {
 | |
| 				deeplinkData["ad_network"] = adNetwork;
 | |
| 			}
 | |
| 			if (!string.IsNullOrEmpty(advertisingId)) {
 | |
| 				deeplinkData["advertising_id"] = advertisingId;
 | |
| 			}
 | |
| 			if (!string.IsNullOrEmpty(campaignId)) {
 | |
| 				deeplinkData["campaign_id"] = campaignId;
 | |
| 			}
 | |
| 			if (!string.IsNullOrEmpty(campaignName)) {
 | |
| 				deeplinkData["campaign_name"] = campaignName;
 | |
| 			}
 | |
| 			if (!string.IsNullOrEmpty(deferredDeeplink)) {
 | |
| 				deeplinkData["deferred_deeplink_url"] = deferredDeeplink;
 | |
| 			}
 | |
| 			if (!string.IsNullOrEmpty(referrer)) {
 | |
| 				deeplinkData["referrer"] = referrer;
 | |
| 			}
 | |
| 			if (!string.IsNullOrEmpty(siteId)) {
 | |
| 				deeplinkData["site_id"] = siteId;
 | |
| 			}
 | |
| 
 | |
| 			deeplinkData.Add("clicked_tenjin_link", Convert.ToString(clickedTenjinLink));
 | |
| 			deeplinkData.Add("is_first_session", Convert.ToString(isFirstSession));
 | |
| 
 | |
| 			callback(deeplinkData);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public override void OptIn(){
 | |
| 		optIn = true;
 | |
| 		tenjinJava.Call ("optIn");
 | |
| 	}
 | |
| 
 | |
| 	public override void OptOut(){
 | |
| 		optOut = true;
 | |
| 		tenjinJava.Call ("optOut");
 | |
| 	}
 | |
| 
 | |
| 	public override void OptInParams(List<string> parameters){
 | |
| 		tenjinJava.Call ("optInParams", new object[] {parameters.ToArray()});
 | |
| 	}
 | |
| 
 | |
| 	public override void OptOutParams(List<string> parameters){
 | |
| 		tenjinJava.Call ("optOutParams", new object[] {parameters.ToArray()});
 | |
| 	}
 | |
| 
 | |
| 	public override void RegisterAppForAdNetworkAttribution(){
 | |
| 	}
 | |
| 
 | |
| 	public override void UpdateConversionValue(int conversionValue){
 | |
| 		if (Debug.isDebugBuild) {
 | |
| 			Debug.Log ("Android UpdateConversionValue");
 | |
| 		}
 | |
| 		object[] args = new object[]{conversionValue};
 | |
| 		tenjinJava.Call ("updateConversionValue", args);
 | |
| 	}
 | |
| 
 | |
| 	public override void RequestTrackingAuthorizationWithCompletionHandler(Action<int> trackingAuthorizationCallback) {
 | |
| 	}
 | |
| 
 | |
| 	public override void AppendAppSubversion (int appSubversion){
 | |
| 		object[] args = new object[]{appSubversion};
 | |
| 		tenjinJava.Call ("appendAppSubversion", args);
 | |
| 	}
 | |
| 
 | |
| 	public static AndroidJavaObject CreateJavaMapFromDictainary(IDictionary<string, string> parameters){
 | |
| 		AndroidJavaObject javaMap = new AndroidJavaObject("java.util.HashMap");
 | |
| 		IntPtr putMethod = AndroidJNIHelper.GetMethodID(
 | |
| 			javaMap.GetRawClass(), "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
 | |
| 
 | |
| 		object[] args = new object[2];
 | |
| 		foreach (KeyValuePair<string, string> kvp in parameters){
 | |
| 			using (AndroidJavaObject k = new AndroidJavaObject("java.lang.String", kvp.Key)){
 | |
| 				using (AndroidJavaObject v = new AndroidJavaObject("java.lang.String", kvp.Value)){
 | |
| 					args[0] = k;
 | |
| 					args[1] = v;
 | |
| 					AndroidJNI.CallObjectMethod(javaMap.GetRawObject(),
 | |
| 						putMethod, AndroidJNIHelper.CreateJNIArgArray(args));
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
|     	return javaMap;
 | |
|     }
 | |
| 
 | |
| 	public override void DebugLogs(){
 | |
| 		Debug.Log ("Debug logs not implemented on android");
 | |
| 	}
 | |
| 
 | |
|     public override void SubscribeMoPubImpressions()
 | |
|     {
 | |
|         Debug.Log("Subscribing to Mopub ILRD");
 | |
|         TenjinMopubIntegration.ListenForImpressions(ImpressionHandler);
 | |
|     }
 | |
| 
 | |
|     private void ImpressionHandler(string json)
 | |
|     {
 | |
|         Debug.Log($"Got ILRD impression data {json}");
 | |
|         var args = new object[] {json};
 | |
|         tenjinJava.Call ("eventAdImpressionMoPub", args);
 | |
|     }
 | |
| 
 | |
| 	public override void SetAppStoreType (AppStoreType appStoreType){
 | |
| 		object[] args = new object[]{appStoreType};
 | |
| 		AndroidJavaClass appStoreTypeClass = new AndroidJavaClass(AndroidJavaTenjinAppStoreType); 
 | |
| 		if (appStoreTypeClass != null){
 | |
| 			AndroidJavaObject tenjinAppStoreType = appStoreTypeClass.GetStatic<AndroidJavaObject>(appStoreType.ToString());
 | |
| 			if (tenjinAppStoreType != null) {
 | |
| 				tenjinJava.Call ("setAppStore", tenjinAppStoreType);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| #else
 | |
| 	public override void Init(string apiKey){
 | |
| 		Debug.Log ("Android Initializing - v"+this.SdkVersion);
 | |
| 		ApiKey = apiKey;
 | |
| 	}
 | |
| 
 | |
| 	public override void InitWithSharedSecret(string apiKey, string sharedSecret)
 | |
| 	{
 | |
| 		Debug.Log("Android Initializing with Shared Secret - v"+this.SdkVersion);
 | |
| 		ApiKey = apiKey;
 | |
| 		SharedSecret = sharedSecret;
 | |
| 	}
 | |
| 
 | |
| 	public override void InitWithAppSubversion(string apiKey, int appSubversion)
 | |
| 	{
 | |
| 		Debug.Log("Android Initializing with App Subversion: " + appSubversion + " v" +this.SdkVersion);
 | |
| 		ApiKey = apiKey;
 | |
| 		AppSubversion = appSubversion;
 | |
| 	}
 | |
| 
 | |
| 	public override void InitWithSharedSecretAppSubversion(string apiKey, string sharedSecret, int appSubversion)
 | |
| 	{
 | |
| 		Debug.Log("Android Initializing with Shared Secret + App Subversion: " + appSubversion +" v" +this.SdkVersion);
 | |
| 		ApiKey = apiKey;
 | |
| 		SharedSecret = sharedSecret;
 | |
| 		AppSubversion = appSubversion;
 | |
| 	}
 | |
| 
 | |
| 	public override void Connect(){
 | |
| 		Debug.Log ("Android Connecting");
 | |
| 	}
 | |
| 
 | |
| 	public override void Connect(string deferredDeeplink){
 | |
| 		Debug.Log ("Android Connecting with deferredDeeplink " + deferredDeeplink);
 | |
| 	}
 | |
| 
 | |
| 	public override void SendEvent (string eventName){
 | |
| 		Debug.Log ("Android Sending Event " + eventName);
 | |
| 	}
 | |
| 
 | |
| 	public override void SendEvent (string eventName, string eventValue){
 | |
| 		Debug.Log ("Android Sending Event " + eventName + " : " + eventValue);
 | |
| 	}
 | |
| 
 | |
| 	public override void Transaction(string productId, string currencyCode, int quantity, double unitPrice, string transactionId, string receipt, string signature){
 | |
| 		Debug.Log ("Android Transaction " + productId + ", " + currencyCode + ", " + quantity + ", " + unitPrice + ", " + transactionId + ", " + receipt + ", " + signature);
 | |
| 	}
 | |
| 
 | |
| 	public override void GetDeeplink(Tenjin.DeferredDeeplinkDelegate deferredDeeplinkDelegate) {
 | |
| 		Debug.Log ("Sending AndroidTenjin::GetDeeplink");
 | |
| 	}
 | |
| 
 | |
| 	public override void OptIn(){
 | |
| 		Debug.Log ("Sending AndroidTenjin::OptIn");
 | |
| 	}
 | |
| 
 | |
| 	public override void OptOut(){
 | |
| 		Debug.Log ("Sending AndroidTenjin::OptOut");
 | |
| 	}
 | |
| 
 | |
| 	public override void OptInParams(List<string> parameters){
 | |
| 		Debug.Log ("Sending AndroidTenjin::OptInParams");
 | |
| 	}
 | |
| 
 | |
| 	public override void OptOutParams(List<string> parameters){
 | |
| 		Debug.Log ("Sending AndroidTenjin::OptOutParams");
 | |
| 	}
 | |
| 
 | |
| 	public override void AppendAppSubversion(int subversion){
 | |
| 		Debug.Log("Sending AndroidTenjin::AppendAppSubversion :" + subversion);
 | |
| 	}
 | |
| 
 | |
|     public override void SubscribeMoPubImpressions()
 | |
|     {
 | |
|         Debug.Log("Sending AndroidTenjin:: SubscribeMoPubImpressions " );
 | |
|     }
 | |
|     public override void DebugLogs(){
 | |
| 	    Debug.Log ("Setting debug logs ");
 | |
|     }
 | |
| 
 | |
| 	public override void UpdateConversionValue(int conversionValue)
 | |
| 	{
 | |
| 		Debug.Log("Sending UpdateConversionValue: " + conversionValue);
 | |
| 	}
 | |
| 
 | |
| 	public override void RegisterAppForAdNetworkAttribution()
 | |
| 	{
 | |
| 		throw new NotImplementedException();
 | |
| 	}
 | |
| 
 | |
| 	public override void RequestTrackingAuthorizationWithCompletionHandler(Action<int> trackingAuthorizationCallback)
 | |
| 	{
 | |
| 		throw new NotImplementedException();
 | |
| 	}
 | |
| 
 | |
| 	public override void SetAppStoreType(AppStoreType appStoreType) {
 | |
| 		Debug.Log("Setting AndroidTenjin::SetAppStoreType: " + appStoreType);
 | |
| 	}
 | |
| #endif
 | |
| }
 |