using System; using System.Collections.Generic; using System.Runtime.InteropServices; using UnityEngine; namespace com.adjust.sdk { #if UNITY_ANDROID public class AdjustAndroid { private const string sdkPrefix = "unity4.38.0"; private static bool launchDeferredDeeplink = true; private static AndroidJavaClass ajcAdjust = new AndroidJavaClass("com.adjust.sdk.Adjust"); private static AndroidJavaObject ajoCurrentActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic("currentActivity"); private static DeferredDeeplinkListener onDeferredDeeplinkListener; private static AttributionChangeListener onAttributionChangedListener; private static EventTrackingFailedListener onEventTrackingFailedListener; private static EventTrackingSucceededListener onEventTrackingSucceededListener; private static SessionTrackingFailedListener onSessionTrackingFailedListener; private static SessionTrackingSucceededListener onSessionTrackingSucceededListener; private static VerificationInfoListener onVerificationInfoListener; private static DeeplinkResolutionListener onDeeplinkResolvedListener; public static void Start(AdjustConfig adjustConfig) { // Thank you, Unity 2019.2.0, for breaking this. // AndroidJavaObject ajoEnvironment = adjustConfig.environment == AdjustEnvironment.Sandbox ? // new AndroidJavaClass("com.adjust.sdk.AdjustConfig").GetStatic("ENVIRONMENT_SANDBOX") : // new AndroidJavaClass("com.adjust.sdk.AdjustConfig").GetStatic("ENVIRONMENT_PRODUCTION"); // Get environment variable. string ajoEnvironment = adjustConfig.environment == AdjustEnvironment.Production ? "production" : "sandbox"; // Create adjust config object. AndroidJavaObject ajoAdjustConfig; // Check if suppress log leve is supported. if (adjustConfig.allowSuppressLogLevel != null) { ajoAdjustConfig = new AndroidJavaObject("com.adjust.sdk.AdjustConfig", ajoCurrentActivity, adjustConfig.appToken, ajoEnvironment, adjustConfig.allowSuppressLogLevel); } else { ajoAdjustConfig = new AndroidJavaObject("com.adjust.sdk.AdjustConfig", ajoCurrentActivity, adjustConfig.appToken, ajoEnvironment); } // Check if deferred deeplink should be launched by SDK. launchDeferredDeeplink = adjustConfig.launchDeferredDeeplink; // Check log level. if (adjustConfig.logLevel != null) { AndroidJavaObject ajoLogLevel; if (adjustConfig.logLevel.Value.ToUppercaseString().Equals("SUPPRESS")) { ajoLogLevel = new AndroidJavaClass("com.adjust.sdk.LogLevel").GetStatic("SUPRESS"); } else { ajoLogLevel = new AndroidJavaClass("com.adjust.sdk.LogLevel").GetStatic(adjustConfig.logLevel.Value.ToUppercaseString()); } if (ajoLogLevel != null) { ajoAdjustConfig.Call("setLogLevel", ajoLogLevel); } } // Set unity SDK prefix. ajoAdjustConfig.Call("setSdkPrefix", sdkPrefix); // Check if user has configured the delayed start option. if (adjustConfig.delayStart != null) { ajoAdjustConfig.Call("setDelayStart", adjustConfig.delayStart); } // Check event buffering setting. if (adjustConfig.eventBufferingEnabled != null) { AndroidJavaObject ajoIsEnabled = new AndroidJavaObject("java.lang.Boolean", adjustConfig.eventBufferingEnabled.Value); ajoAdjustConfig.Call("setEventBufferingEnabled", ajoIsEnabled); } // Check COPPA setting. if (adjustConfig.coppaCompliantEnabled != null) { ajoAdjustConfig.Call("setCoppaCompliantEnabled", adjustConfig.coppaCompliantEnabled.Value); } // Check final Android attribution setting. if (adjustConfig.finalAndroidAttributionEnabled != null) { ajoAdjustConfig.Call("setFinalAttributionEnabled", adjustConfig.finalAndroidAttributionEnabled.Value); } // Check read Android IDs only once. if (adjustConfig.readDeviceInfoOnceEnabled != null) { ajoAdjustConfig.Call("setReadDeviceInfoOnceEnabled", adjustConfig.readDeviceInfoOnceEnabled.Value); } // Check Play Store Kids Apps setting. if (adjustConfig.playStoreKidsAppEnabled != null) { ajoAdjustConfig.Call("setPlayStoreKidsAppEnabled", adjustConfig.playStoreKidsAppEnabled.Value); } // Check if user enabled tracking in the background. if (adjustConfig.sendInBackground != null) { ajoAdjustConfig.Call("setSendInBackground", adjustConfig.sendInBackground.Value); } // Check if user wants to get cost data in attribution callback. if (adjustConfig.needsCost != null) { ajoAdjustConfig.Call("setNeedsCost", adjustConfig.needsCost.Value); } // Check if user wants to run preinstall campaigns. if (adjustConfig.preinstallTrackingEnabled != null) { ajoAdjustConfig.Call("setPreinstallTrackingEnabled", adjustConfig.preinstallTrackingEnabled.Value); } // Check if user has set custom preinstall file path. if (adjustConfig.preinstallFilePath != null) { ajoAdjustConfig.Call("setPreinstallFilePath", adjustConfig.preinstallFilePath); } // Check if FB app ID has been set. if (adjustConfig.fbAppId != null) { ajoAdjustConfig.Call("setFbAppId", adjustConfig.fbAppId); } // Check if user has set user agent value. if (adjustConfig.userAgent != null) { ajoAdjustConfig.Call("setUserAgent", adjustConfig.userAgent); } // Check if user has set default process name. if (!String.IsNullOrEmpty(adjustConfig.processName)) { ajoAdjustConfig.Call("setProcessName", adjustConfig.processName); } // Check if user has set default tracker token. if (adjustConfig.defaultTracker != null) { ajoAdjustConfig.Call("setDefaultTracker", adjustConfig.defaultTracker); } // Check if user has set external device identifier. if (adjustConfig.externalDeviceId != null) { ajoAdjustConfig.Call("setExternalDeviceId", adjustConfig.externalDeviceId); } // Check if user has set custom URL strategy. if (adjustConfig.urlStrategy != null) { if (adjustConfig.urlStrategy == AdjustConfig.AdjustUrlStrategyChina) { AndroidJavaObject ajoUrlStrategyChina = new AndroidJavaClass("com.adjust.sdk.AdjustConfig").GetStatic("URL_STRATEGY_CHINA"); ajoAdjustConfig.Call("setUrlStrategy", ajoUrlStrategyChina); } else if (adjustConfig.urlStrategy == AdjustConfig.AdjustUrlStrategyIndia) { AndroidJavaObject ajoUrlStrategyIndia = new AndroidJavaClass("com.adjust.sdk.AdjustConfig").GetStatic("URL_STRATEGY_INDIA"); ajoAdjustConfig.Call("setUrlStrategy", ajoUrlStrategyIndia); } else if (adjustConfig.urlStrategy == AdjustConfig.AdjustUrlStrategyCn) { AndroidJavaObject ajoUrlStrategyCn = new AndroidJavaClass("com.adjust.sdk.AdjustConfig").GetStatic("URL_STRATEGY_CN"); ajoAdjustConfig.Call("setUrlStrategy", ajoUrlStrategyCn); } else if (adjustConfig.urlStrategy == AdjustConfig.AdjustUrlStrategyCnOnly) { AndroidJavaObject ajoUrlStrategyCnOnly = new AndroidJavaClass("com.adjust.sdk.AdjustConfig").GetStatic("URL_STRATEGY_CN_ONLY"); ajoAdjustConfig.Call("setUrlStrategy", ajoUrlStrategyCnOnly); } else if (adjustConfig.urlStrategy == AdjustConfig.AdjustDataResidencyEU) { AndroidJavaObject ajoDataResidencyEU = new AndroidJavaClass("com.adjust.sdk.AdjustConfig").GetStatic("DATA_RESIDENCY_EU"); ajoAdjustConfig.Call("setUrlStrategy", ajoDataResidencyEU); } else if (adjustConfig.urlStrategy == AdjustConfig.AdjustDataResidencyTR) { AndroidJavaObject ajoDataResidencyTR = new AndroidJavaClass("com.adjust.sdk.AdjustConfig").GetStatic("DATA_RESIDENCY_TR"); ajoAdjustConfig.Call("setUrlStrategy", ajoDataResidencyTR); } else if (adjustConfig.urlStrategy == AdjustConfig.AdjustDataResidencyUS) { AndroidJavaObject ajoDataResidencyUS = new AndroidJavaClass("com.adjust.sdk.AdjustConfig").GetStatic("DATA_RESIDENCY_US"); ajoAdjustConfig.Call("setUrlStrategy", ajoDataResidencyUS); } } // Check if user has set app secret. if (IsAppSecretSet(adjustConfig)) { ajoAdjustConfig.Call("setAppSecret", adjustConfig.secretId.Value, adjustConfig.info1.Value, adjustConfig.info2.Value, adjustConfig.info3.Value, adjustConfig.info4.Value); } // Check if user has set device as known. if (adjustConfig.isDeviceKnown.HasValue) { ajoAdjustConfig.Call("setDeviceKnown", adjustConfig.isDeviceKnown.Value); } // Check if user has enabled reading of IMEI and MEID. // Obsolete method. if (adjustConfig.readImei.HasValue) { // ajoAdjustConfig.Call("setReadMobileEquipmentIdentity", adjustConfig.readImei.Value); } // Check attribution changed delagate setting. if (adjustConfig.attributionChangedDelegate != null) { onAttributionChangedListener = new AttributionChangeListener(adjustConfig.attributionChangedDelegate); ajoAdjustConfig.Call("setOnAttributionChangedListener", onAttributionChangedListener); } // Check event success delegate setting. if (adjustConfig.eventSuccessDelegate != null) { onEventTrackingSucceededListener = new EventTrackingSucceededListener(adjustConfig.eventSuccessDelegate); ajoAdjustConfig.Call("setOnEventTrackingSucceededListener", onEventTrackingSucceededListener); } // Check event failure delagate setting. if (adjustConfig.eventFailureDelegate != null) { onEventTrackingFailedListener = new EventTrackingFailedListener(adjustConfig.eventFailureDelegate); ajoAdjustConfig.Call("setOnEventTrackingFailedListener", onEventTrackingFailedListener); } // Check session success delegate setting. if (adjustConfig.sessionSuccessDelegate != null) { onSessionTrackingSucceededListener = new SessionTrackingSucceededListener(adjustConfig.sessionSuccessDelegate); ajoAdjustConfig.Call("setOnSessionTrackingSucceededListener", onSessionTrackingSucceededListener); } // Check session failure delegate setting. if (adjustConfig.sessionFailureDelegate != null) { onSessionTrackingFailedListener = new SessionTrackingFailedListener(adjustConfig.sessionFailureDelegate); ajoAdjustConfig.Call("setOnSessionTrackingFailedListener", onSessionTrackingFailedListener); } // Check deferred deeplink delegate setting. if (adjustConfig.deferredDeeplinkDelegate != null) { onDeferredDeeplinkListener = new DeferredDeeplinkListener(adjustConfig.deferredDeeplinkDelegate); ajoAdjustConfig.Call("setOnDeeplinkResponseListener", onDeferredDeeplinkListener); } // Initialise and start the SDK. ajcAdjust.CallStatic("onCreate", ajoAdjustConfig); ajcAdjust.CallStatic("onResume"); } public static void TrackEvent(AdjustEvent adjustEvent) { AndroidJavaObject ajoAdjustEvent = new AndroidJavaObject("com.adjust.sdk.AdjustEvent", adjustEvent.eventToken); // Check if user has set revenue for the event. if (adjustEvent.revenue != null) { ajoAdjustEvent.Call("setRevenue", (double)adjustEvent.revenue, adjustEvent.currency); } // Check if user has added any callback parameters to the event. if (adjustEvent.callbackList != null) { for (int i = 0; i < adjustEvent.callbackList.Count; i += 2) { string key = adjustEvent.callbackList[i]; string value = adjustEvent.callbackList[i + 1]; ajoAdjustEvent.Call("addCallbackParameter", key, value); } } // Check if user has added any partner parameters to the event. if (adjustEvent.partnerList != null) { for (int i = 0; i < adjustEvent.partnerList.Count; i += 2) { string key = adjustEvent.partnerList[i]; string value = adjustEvent.partnerList[i + 1]; ajoAdjustEvent.Call("addPartnerParameter", key, value); } } // Check if user has added transaction ID to the event. if (adjustEvent.transactionId != null) { ajoAdjustEvent.Call("setOrderId", adjustEvent.transactionId); } // Check if user has added callback ID to the event. if (adjustEvent.callbackId != null) { ajoAdjustEvent.Call("setCallbackId", adjustEvent.callbackId); } // Check if user has added product ID to the event. if (adjustEvent.productId != null) { ajoAdjustEvent.Call("setProductId", adjustEvent.productId); } // Check if user has added purchase token to the event. if (adjustEvent.purchaseToken != null) { ajoAdjustEvent.Call("setPurchaseToken", adjustEvent.purchaseToken); } // Track the event. ajcAdjust.CallStatic("trackEvent", ajoAdjustEvent); } public static bool IsEnabled() { return ajcAdjust.CallStatic("isEnabled"); } public static void SetEnabled(bool enabled) { ajcAdjust.CallStatic("setEnabled", enabled); } public static void SetOfflineMode(bool enabled) { ajcAdjust.CallStatic("setOfflineMode", enabled); } public static void SendFirstPackages() { ajcAdjust.CallStatic("sendFirstPackages"); } public static void SetDeviceToken(string deviceToken) { ajcAdjust.CallStatic("setPushToken", deviceToken, ajoCurrentActivity); } public static string GetAdid() { return ajcAdjust.CallStatic("getAdid"); } public static void GdprForgetMe() { ajcAdjust.CallStatic("gdprForgetMe", ajoCurrentActivity); } public static void DisableThirdPartySharing() { ajcAdjust.CallStatic("disableThirdPartySharing", ajoCurrentActivity); } public static AdjustAttribution GetAttribution() { try { AndroidJavaObject ajoAttribution = ajcAdjust.CallStatic("getAttribution"); if (null == ajoAttribution) { return null; } AdjustAttribution adjustAttribution = new AdjustAttribution(); adjustAttribution.trackerName = ajoAttribution.Get(AdjustUtils.KeyTrackerName) == "" ? null : ajoAttribution.Get(AdjustUtils.KeyTrackerName); adjustAttribution.trackerToken = ajoAttribution.Get(AdjustUtils.KeyTrackerToken) == "" ? null : ajoAttribution.Get(AdjustUtils.KeyTrackerToken); adjustAttribution.network = ajoAttribution.Get(AdjustUtils.KeyNetwork) == "" ? null : ajoAttribution.Get(AdjustUtils.KeyNetwork); adjustAttribution.campaign = ajoAttribution.Get(AdjustUtils.KeyCampaign) == "" ? null : ajoAttribution.Get(AdjustUtils.KeyCampaign); adjustAttribution.adgroup = ajoAttribution.Get(AdjustUtils.KeyAdgroup) == "" ? null : ajoAttribution.Get(AdjustUtils.KeyAdgroup); adjustAttribution.creative = ajoAttribution.Get(AdjustUtils.KeyCreative) == "" ? null : ajoAttribution.Get(AdjustUtils.KeyCreative); adjustAttribution.clickLabel = ajoAttribution.Get(AdjustUtils.KeyClickLabel) == "" ? null : ajoAttribution.Get(AdjustUtils.KeyClickLabel); adjustAttribution.adid = ajoAttribution.Get(AdjustUtils.KeyAdid) == "" ? null : ajoAttribution.Get(AdjustUtils.KeyAdid); adjustAttribution.costType = ajoAttribution.Get(AdjustUtils.KeyCostType) == "" ? null : ajoAttribution.Get(AdjustUtils.KeyCostType); AndroidJavaObject ajoCostAmount = ajoAttribution.Get(AdjustUtils.KeyCostAmount) == null ? null : ajoAttribution.Get(AdjustUtils.KeyCostAmount); if (ajoCostAmount == null) { adjustAttribution.costAmount = null; } else { double costAmount = ajoCostAmount.Call("doubleValue"); adjustAttribution.costAmount = costAmount; } adjustAttribution.costCurrency = ajoAttribution.Get(AdjustUtils.KeyCostCurrency) == "" ? null : ajoAttribution.Get(AdjustUtils.KeyCostCurrency); adjustAttribution.fbInstallReferrer = ajoAttribution.Get(AdjustUtils.KeyFbInstallReferrer) == "" ? null : ajoAttribution.Get(AdjustUtils.KeyFbInstallReferrer); return adjustAttribution; } catch (Exception) {} return null; } public static void AddSessionPartnerParameter(string key, string value) { if (ajcAdjust == null) { ajcAdjust = new AndroidJavaClass("com.adjust.sdk.Adjust"); } ajcAdjust.CallStatic("addSessionPartnerParameter", key, value); } public static void AddSessionCallbackParameter(string key, string value) { if (ajcAdjust == null) { ajcAdjust = new AndroidJavaClass("com.adjust.sdk.Adjust"); } ajcAdjust.CallStatic("addSessionCallbackParameter", key, value); } public static void RemoveSessionPartnerParameter(string key) { if (ajcAdjust == null) { ajcAdjust = new AndroidJavaClass("com.adjust.sdk.Adjust"); } ajcAdjust.CallStatic("removeSessionPartnerParameter", key); } public static void RemoveSessionCallbackParameter(string key) { if (ajcAdjust == null) { ajcAdjust = new AndroidJavaClass("com.adjust.sdk.Adjust"); } ajcAdjust.CallStatic("removeSessionCallbackParameter", key); } public static void ResetSessionPartnerParameters() { if (ajcAdjust == null) { ajcAdjust = new AndroidJavaClass("com.adjust.sdk.Adjust"); } ajcAdjust.CallStatic("resetSessionPartnerParameters"); } public static void ResetSessionCallbackParameters() { if (ajcAdjust == null) { ajcAdjust = new AndroidJavaClass("com.adjust.sdk.Adjust"); } ajcAdjust.CallStatic("resetSessionCallbackParameters"); } public static void AppWillOpenUrl(string url) { AndroidJavaClass ajcUri = new AndroidJavaClass("android.net.Uri"); AndroidJavaObject ajoUri = ajcUri.CallStatic("parse", url); ajcAdjust.CallStatic("appWillOpenUrl", ajoUri, ajoCurrentActivity); } public static void TrackAdRevenue(string source, string payload) { if (ajcAdjust == null) { ajcAdjust = new AndroidJavaClass("com.adjust.sdk.Adjust"); } AndroidJavaObject jsonPayload = new AndroidJavaObject("org.json.JSONObject", payload); ajcAdjust.CallStatic("trackAdRevenue", source, jsonPayload); } public static void TrackAdRevenue(AdjustAdRevenue adRevenue) { AndroidJavaObject ajoAdjustAdRevenue = new AndroidJavaObject("com.adjust.sdk.AdjustAdRevenue", adRevenue.source); // Check if user has set revenue. if (adRevenue.revenue != null) { AndroidJavaObject ajoRevenue = new AndroidJavaObject("java.lang.Double", adRevenue.revenue); ajoAdjustAdRevenue.Call("setRevenue", ajoRevenue, adRevenue.currency); } // Check if user has set ad impressions count. if (adRevenue.adImpressionsCount != null) { AndroidJavaObject ajoAdImpressionsCount = new AndroidJavaObject("java.lang.Integer", adRevenue.adImpressionsCount); ajoAdjustAdRevenue.Call("setAdImpressionsCount", ajoAdImpressionsCount); } // Check if user has set ad revenue network. if (adRevenue.adRevenueNetwork != null) { ajoAdjustAdRevenue.Call("setAdRevenueNetwork", adRevenue.adRevenueNetwork); } // Check if user has set ad revenue unit. if (adRevenue.adRevenueUnit != null) { ajoAdjustAdRevenue.Call("setAdRevenueUnit", adRevenue.adRevenueUnit); } // Check if user has set ad revenue placement. if (adRevenue.adRevenuePlacement != null) { ajoAdjustAdRevenue.Call("setAdRevenuePlacement", adRevenue.adRevenuePlacement); } // Check if user has added any callback parameters. if (adRevenue.callbackList != null) { for (int i = 0; i < adRevenue.callbackList.Count; i += 2) { string key = adRevenue.callbackList[i]; string value = adRevenue.callbackList[i + 1]; ajoAdjustAdRevenue.Call("addCallbackParameter", key, value); } } // Check if user has added any partner parameters. if (adRevenue.partnerList != null) { for (int i = 0; i < adRevenue.partnerList.Count; i += 2) { string key = adRevenue.partnerList[i]; string value = adRevenue.partnerList[i + 1]; ajoAdjustAdRevenue.Call("addPartnerParameter", key, value); } } // Track ad revenue. ajcAdjust.CallStatic("trackAdRevenue", ajoAdjustAdRevenue); } public static void TrackPlayStoreSubscription(AdjustPlayStoreSubscription subscription) { AndroidJavaObject ajoSubscription = new AndroidJavaObject("com.adjust.sdk.AdjustPlayStoreSubscription", Convert.ToInt64(subscription.price), subscription.currency, subscription.sku, subscription.orderId, subscription.signature, subscription.purchaseToken); // Check if user has set purchase time for subscription. if (subscription.purchaseTime != null) { ajoSubscription.Call("setPurchaseTime", Convert.ToInt64(subscription.purchaseTime)); } // Check if user has added any callback parameters to the subscription. if (subscription.callbackList != null) { for (int i = 0; i < subscription.callbackList.Count; i += 2) { string key = subscription.callbackList[i]; string value = subscription.callbackList[i + 1]; ajoSubscription.Call("addCallbackParameter", key, value); } } // Check if user has added any partner parameters to the subscription. if (subscription.partnerList != null) { for (int i = 0; i < subscription.partnerList.Count; i += 2) { string key = subscription.partnerList[i]; string value = subscription.partnerList[i + 1]; ajoSubscription.Call("addPartnerParameter", key, value); } } // Track the subscription. ajcAdjust.CallStatic("trackPlayStoreSubscription", ajoSubscription); } public static void TrackThirdPartySharing(AdjustThirdPartySharing thirdPartySharing) { AndroidJavaObject ajoIsEnabled; AndroidJavaObject ajoAdjustThirdPartySharing; if (thirdPartySharing.isEnabled != null) { ajoIsEnabled = new AndroidJavaObject("java.lang.Boolean", thirdPartySharing.isEnabled.Value); ajoAdjustThirdPartySharing = new AndroidJavaObject("com.adjust.sdk.AdjustThirdPartySharing", ajoIsEnabled); } else { string[] parameters = null; ajoAdjustThirdPartySharing = new AndroidJavaObject("com.adjust.sdk.AdjustThirdPartySharing", parameters); } if (thirdPartySharing.granularOptions != null) { foreach (KeyValuePair> entry in thirdPartySharing.granularOptions) { for (int i = 0; i < entry.Value.Count;) { ajoAdjustThirdPartySharing.Call("addGranularOption", entry.Key, entry.Value[i++], entry.Value[i++]); } } } if (thirdPartySharing.partnerSharingSettings != null) { foreach (KeyValuePair> entry in thirdPartySharing.partnerSharingSettings) { for (int i = 0; i < entry.Value.Count;) { ajoAdjustThirdPartySharing.Call("addPartnerSharingSetting", entry.Key, entry.Value[i++], bool.Parse(entry.Value[i++])); } } } ajcAdjust.CallStatic("trackThirdPartySharing", ajoAdjustThirdPartySharing); } public static void TrackMeasurementConsent(bool measurementConsent) { ajcAdjust.CallStatic("trackMeasurementConsent", measurementConsent); } // Android specific methods. public static void OnPause() { ajcAdjust.CallStatic("onPause"); } public static void OnResume() { ajcAdjust.CallStatic("onResume"); } public static void SetReferrer(string referrer) { ajcAdjust.CallStatic("setReferrer", referrer, ajoCurrentActivity); } public static void GetGoogleAdId(Action onDeviceIdsRead) { DeviceIdsReadListener onDeviceIdsReadProxy = new DeviceIdsReadListener(onDeviceIdsRead); ajcAdjust.CallStatic("getGoogleAdId", ajoCurrentActivity, onDeviceIdsReadProxy); } public static string GetAmazonAdId() { return ajcAdjust.CallStatic("getAmazonAdId", ajoCurrentActivity); } public static string GetSdkVersion() { string nativeSdkVersion = ajcAdjust.CallStatic("getSdkVersion"); return sdkPrefix + "@" + nativeSdkVersion; } public static void VerifyPlayStorePurchase(AdjustPlayStorePurchase purchase, Action verificationInfoCallback) { AndroidJavaObject ajoPurchase = new AndroidJavaObject("com.adjust.sdk.AdjustPurchase", purchase.productId, purchase.purchaseToken); onVerificationInfoListener = new VerificationInfoListener(verificationInfoCallback); ajcAdjust.CallStatic("verifyPurchase", ajoPurchase, onVerificationInfoListener); } public static void ProcessDeeplink(string url, Action resolvedLinkCallback) { onDeeplinkResolvedListener = new DeeplinkResolutionListener(resolvedLinkCallback); AndroidJavaClass ajcUri = new AndroidJavaClass("android.net.Uri"); AndroidJavaObject ajoUri = ajcUri.CallStatic("parse", url); ajcAdjust.CallStatic("processDeeplink", ajoUri, ajoCurrentActivity, onDeeplinkResolvedListener); } // Used for testing only. public static void SetTestOptions(Dictionary testOptions) { AndroidJavaObject ajoTestOptions = AdjustUtils.TestOptionsMap2AndroidJavaObject(testOptions, ajoCurrentActivity); ajcAdjust.CallStatic("setTestOptions", ajoTestOptions); } // Private & helper classes. private class AttributionChangeListener : AndroidJavaProxy { private Action callback; public AttributionChangeListener(Action pCallback) : base("com.adjust.sdk.OnAttributionChangedListener") { this.callback = pCallback; } // Method must be lowercase to match Android method signature. public void onAttributionChanged(AndroidJavaObject attribution) { if (callback == null) { return; } AdjustAttribution adjustAttribution = new AdjustAttribution(); adjustAttribution.trackerName = attribution.Get(AdjustUtils.KeyTrackerName) == "" ? null : attribution.Get(AdjustUtils.KeyTrackerName); adjustAttribution.trackerToken = attribution.Get(AdjustUtils.KeyTrackerToken) == "" ? null : attribution.Get(AdjustUtils.KeyTrackerToken); adjustAttribution.network = attribution.Get(AdjustUtils.KeyNetwork) == "" ? null : attribution.Get(AdjustUtils.KeyNetwork); adjustAttribution.campaign = attribution.Get(AdjustUtils.KeyCampaign) == "" ? null : attribution.Get(AdjustUtils.KeyCampaign); adjustAttribution.adgroup = attribution.Get(AdjustUtils.KeyAdgroup) == "" ? null : attribution.Get(AdjustUtils.KeyAdgroup); adjustAttribution.creative = attribution.Get(AdjustUtils.KeyCreative) == "" ? null : attribution.Get(AdjustUtils.KeyCreative); adjustAttribution.clickLabel = attribution.Get(AdjustUtils.KeyClickLabel) == "" ? null : attribution.Get(AdjustUtils.KeyClickLabel); adjustAttribution.adid = attribution.Get(AdjustUtils.KeyAdid) == "" ? null : attribution.Get(AdjustUtils.KeyAdid); adjustAttribution.costType = attribution.Get(AdjustUtils.KeyCostType) == "" ? null : attribution.Get(AdjustUtils.KeyCostType); AndroidJavaObject ajoCostAmount = attribution.Get(AdjustUtils.KeyCostAmount) == null ? null : attribution.Get(AdjustUtils.KeyCostAmount); if (ajoCostAmount == null) { adjustAttribution.costAmount = null; } else { double costAmount = ajoCostAmount.Call("doubleValue"); adjustAttribution.costAmount = costAmount; } adjustAttribution.costCurrency = attribution.Get(AdjustUtils.KeyCostCurrency) == "" ? null : attribution.Get(AdjustUtils.KeyCostCurrency); adjustAttribution.fbInstallReferrer = attribution.Get(AdjustUtils.KeyFbInstallReferrer) == "" ? null : attribution.Get(AdjustUtils.KeyFbInstallReferrer); callback(adjustAttribution); } } private class DeferredDeeplinkListener : AndroidJavaProxy { private Action callback; public DeferredDeeplinkListener(Action pCallback) : base("com.adjust.sdk.OnDeeplinkResponseListener") { this.callback = pCallback; } // Method must be lowercase to match Android method signature. public bool launchReceivedDeeplink(AndroidJavaObject deeplink) { if (callback == null) { return launchDeferredDeeplink; } string deeplinkURL = deeplink.Call("toString"); callback(deeplinkURL); return launchDeferredDeeplink; } } private class EventTrackingSucceededListener : AndroidJavaProxy { private Action callback; public EventTrackingSucceededListener(Action pCallback) : base("com.adjust.sdk.OnEventTrackingSucceededListener") { this.callback = pCallback; } // Method must be lowercase to match Android method signature. public void onFinishedEventTrackingSucceeded(AndroidJavaObject eventSuccessData) { if (callback == null) { return; } if (eventSuccessData == null) { return; } AdjustEventSuccess adjustEventSuccess = new AdjustEventSuccess(); adjustEventSuccess.Adid = eventSuccessData.Get(AdjustUtils.KeyAdid) == "" ? null : eventSuccessData.Get(AdjustUtils.KeyAdid); adjustEventSuccess.Message = eventSuccessData.Get(AdjustUtils.KeyMessage) == "" ? null : eventSuccessData.Get(AdjustUtils.KeyMessage); adjustEventSuccess.Timestamp = eventSuccessData.Get(AdjustUtils.KeyTimestamp) == "" ? null : eventSuccessData.Get(AdjustUtils.KeyTimestamp); adjustEventSuccess.EventToken = eventSuccessData.Get(AdjustUtils.KeyEventToken) == "" ? null : eventSuccessData.Get(AdjustUtils.KeyEventToken); adjustEventSuccess.CallbackId = eventSuccessData.Get(AdjustUtils.KeyCallbackId) == "" ? null : eventSuccessData.Get(AdjustUtils.KeyCallbackId); try { AndroidJavaObject ajoJsonResponse = eventSuccessData.Get(AdjustUtils.KeyJsonResponse); string jsonResponseString = ajoJsonResponse.Call("toString"); adjustEventSuccess.BuildJsonResponseFromString(jsonResponseString); } catch (Exception) { // JSON response reading failed. // Native Android SDK should send empty JSON object if none available as of v4.12.5. // Native Android SDK added special logic to send Unity friendly values as of v4.15.0. } callback(adjustEventSuccess); } } private class EventTrackingFailedListener : AndroidJavaProxy { private Action callback; public EventTrackingFailedListener(Action pCallback) : base("com.adjust.sdk.OnEventTrackingFailedListener") { this.callback = pCallback; } // Method must be lowercase to match Android method signature. public void onFinishedEventTrackingFailed(AndroidJavaObject eventFailureData) { if (callback == null) { return; } if (eventFailureData == null) { return; } AdjustEventFailure adjustEventFailure = new AdjustEventFailure(); adjustEventFailure.Adid = eventFailureData.Get(AdjustUtils.KeyAdid) == "" ? null : eventFailureData.Get(AdjustUtils.KeyAdid); adjustEventFailure.Message = eventFailureData.Get(AdjustUtils.KeyMessage) == "" ? null : eventFailureData.Get(AdjustUtils.KeyMessage); adjustEventFailure.WillRetry = eventFailureData.Get(AdjustUtils.KeyWillRetry); adjustEventFailure.Timestamp = eventFailureData.Get(AdjustUtils.KeyTimestamp) == "" ? null : eventFailureData.Get(AdjustUtils.KeyTimestamp); adjustEventFailure.EventToken = eventFailureData.Get(AdjustUtils.KeyEventToken) == "" ? null : eventFailureData.Get(AdjustUtils.KeyEventToken); adjustEventFailure.CallbackId = eventFailureData.Get(AdjustUtils.KeyCallbackId) == "" ? null : eventFailureData.Get(AdjustUtils.KeyCallbackId); try { AndroidJavaObject ajoJsonResponse = eventFailureData.Get(AdjustUtils.KeyJsonResponse); string jsonResponseString = ajoJsonResponse.Call("toString"); adjustEventFailure.BuildJsonResponseFromString(jsonResponseString); } catch (Exception) { // JSON response reading failed. // Native Android SDK should send empty JSON object if none available as of v4.12.5. // Native Android SDK added special logic to send Unity friendly values as of v4.15.0. } callback(adjustEventFailure); } } private class SessionTrackingSucceededListener : AndroidJavaProxy { private Action callback; public SessionTrackingSucceededListener(Action pCallback) : base("com.adjust.sdk.OnSessionTrackingSucceededListener") { this.callback = pCallback; } // Method must be lowercase to match Android method signature. public void onFinishedSessionTrackingSucceeded(AndroidJavaObject sessionSuccessData) { if (callback == null) { return; } if (sessionSuccessData == null) { return; } AdjustSessionSuccess adjustSessionSuccess = new AdjustSessionSuccess(); adjustSessionSuccess.Adid = sessionSuccessData.Get(AdjustUtils.KeyAdid) == "" ? null : sessionSuccessData.Get(AdjustUtils.KeyAdid); adjustSessionSuccess.Message = sessionSuccessData.Get(AdjustUtils.KeyMessage) == "" ? null : sessionSuccessData.Get(AdjustUtils.KeyMessage); adjustSessionSuccess.Timestamp = sessionSuccessData.Get(AdjustUtils.KeyTimestamp) == "" ? null : sessionSuccessData.Get(AdjustUtils.KeyTimestamp); try { AndroidJavaObject ajoJsonResponse = sessionSuccessData.Get(AdjustUtils.KeyJsonResponse); string jsonResponseString = ajoJsonResponse.Call("toString"); adjustSessionSuccess.BuildJsonResponseFromString(jsonResponseString); } catch (Exception) { // JSON response reading failed. // Native Android SDK should send empty JSON object if none available as of v4.12.5. // Native Android SDK added special logic to send Unity friendly values as of v4.15.0. } callback(adjustSessionSuccess); } } private class SessionTrackingFailedListener : AndroidJavaProxy { private Action callback; public SessionTrackingFailedListener(Action pCallback) : base("com.adjust.sdk.OnSessionTrackingFailedListener") { this.callback = pCallback; } // Method must be lowercase to match Android method signature. public void onFinishedSessionTrackingFailed(AndroidJavaObject sessionFailureData) { if (callback == null) { return; } if (sessionFailureData == null) { return; } AdjustSessionFailure adjustSessionFailure = new AdjustSessionFailure(); adjustSessionFailure.Adid = sessionFailureData.Get(AdjustUtils.KeyAdid) == "" ? null : sessionFailureData.Get(AdjustUtils.KeyAdid); adjustSessionFailure.Message = sessionFailureData.Get(AdjustUtils.KeyMessage) == "" ? null : sessionFailureData.Get(AdjustUtils.KeyMessage); adjustSessionFailure.WillRetry = sessionFailureData.Get(AdjustUtils.KeyWillRetry); adjustSessionFailure.Timestamp = sessionFailureData.Get(AdjustUtils.KeyTimestamp) == "" ? null : sessionFailureData.Get(AdjustUtils.KeyTimestamp); try { AndroidJavaObject ajoJsonResponse = sessionFailureData.Get(AdjustUtils.KeyJsonResponse); string jsonResponseString = ajoJsonResponse.Call("toString"); adjustSessionFailure.BuildJsonResponseFromString(jsonResponseString); } catch (Exception) { // JSON response reading failed. // Native Android SDK should send empty JSON object if none available as of v4.12.5. // Native Android SDK added special logic to send Unity friendly values as of v4.15.0. } callback(adjustSessionFailure); } } private class DeviceIdsReadListener : AndroidJavaProxy { private Action onPlayAdIdReadCallback; public DeviceIdsReadListener(Action pCallback) : base("com.adjust.sdk.OnDeviceIdsRead") { this.onPlayAdIdReadCallback = pCallback; } // Method must be lowercase to match Android method signature. public void onGoogleAdIdRead(string playAdId) { if (onPlayAdIdReadCallback == null) { return; } this.onPlayAdIdReadCallback(playAdId); } // Handling of null object. public void onGoogleAdIdRead(AndroidJavaObject ajoAdId) { if (ajoAdId == null) { string adId = null; this.onGoogleAdIdRead(adId); return; } this.onGoogleAdIdRead(ajoAdId.Call("toString")); } } private class VerificationInfoListener : AndroidJavaProxy { private Action callback; public VerificationInfoListener(Action pCallback) : base("com.adjust.sdk.OnPurchaseVerificationFinishedListener") { this.callback = pCallback; } public void onVerificationFinished(AndroidJavaObject verificationInfo) { AdjustPurchaseVerificationInfo purchaseVerificationInfo = new AdjustPurchaseVerificationInfo(); // verification status purchaseVerificationInfo.verificationStatus = verificationInfo.Get(AdjustUtils.KeyVerificationStatus); // status code purchaseVerificationInfo.code = verificationInfo.Get(AdjustUtils.KeyCode); // message purchaseVerificationInfo.message = verificationInfo.Get(AdjustUtils.KeyMessage); if (callback != null) { callback(purchaseVerificationInfo); } } } private class DeeplinkResolutionListener : AndroidJavaProxy { private Action callback; public DeeplinkResolutionListener(Action pCallback) : base("com.adjust.sdk.OnDeeplinkResolvedListener") { this.callback = pCallback; } public void onDeeplinkResolved(string resolvedLink) { if (callback != null) { callback(resolvedLink); } } } // Private & helper methods. private static bool IsAppSecretSet(AdjustConfig adjustConfig) { return adjustConfig.secretId.HasValue && adjustConfig.info1.HasValue && adjustConfig.info2.HasValue && adjustConfig.info3.HasValue && adjustConfig.info4.HasValue; } } #endif }