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 | |||
|  | } |