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