From c3b543a4630e61f3ba3a9152340ef23983bae07c Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 5 Jan 2024 17:30:46 +0100 Subject: [PATCH 001/540] feat: add debug error params --- .../com/adjust/sdk/network/ActivityPackageSender.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index c7595eaad..c56ec56e7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -107,6 +107,8 @@ public ResponseData sendActivityPackageSync(final ActivityPackage activityPackag boolean retryToSend; ResponseData responseData; do { + addErrorParameters(activityPackage, sendingParameters); + responseData = ResponseData.buildResponseData(activityPackage, sendingParameters); @@ -118,6 +120,12 @@ public ResponseData sendActivityPackageSync(final ActivityPackage activityPackag return responseData; } + private void addErrorParameters(ActivityPackage activityPackage, Map sendingParameters) { + PackageBuilder.addLong(sendingParameters, "error_count", activityPackage.getErrorCount()); + PackageBuilder.addString(sendingParameters, "first_error", activityPackage.getFirstErrorMessage()); + PackageBuilder.addString(sendingParameters, "last_error", activityPackage.getLastErrorMessage()); + } + private boolean shouldRetryToSend(final ResponseData responseData) { if (!responseData.willRetry) { logger.debug("Will not retry with current url strategy"); From 42f83eb3905b13a5ce9b8edfcbf0ab7b3cd975b2 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 3 Apr 2024 11:11:03 +0200 Subject: [PATCH 002/540] refac:remove Ad_revenue constants from AdjustConfig.java removed constants: AD_REVENUE_APPLOVIN_MAX AD_REVENUE_MOPUB AD_REVENUE_ADMOB AD_REVENUE_IRONSOURCE AD_REVENUE_ADMOST AD_REVENUE_UNITY AD_REVENUE_HELIUM_CHARTBOOST AD_REVENUE_SOURCE_PUBLISHER AD_REVENUE_TOPON AD_REVENUE_ADX AD_REVENUE_TRADPLUS --- .../src/main/java/com/adjust/sdk/AdjustConfig.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index ca0b77f42..716857617 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -60,18 +60,6 @@ public class AdjustConfig { public static final String DATA_RESIDENCY_TR = "data_residency_tr"; public static final String DATA_RESIDENCY_US = "data_residency_us"; - public static final String AD_REVENUE_APPLOVIN_MAX = "applovin_max_sdk"; - public static final String AD_REVENUE_MOPUB = "mopub"; - public static final String AD_REVENUE_ADMOB = "admob_sdk"; - public static final String AD_REVENUE_IRONSOURCE = "ironsource_sdk"; - public static final String AD_REVENUE_ADMOST = "admost_sdk"; - public static final String AD_REVENUE_UNITY = "unity_sdk"; - public static final String AD_REVENUE_HELIUM_CHARTBOOST = "helium_chartboost_sdk"; - public static final String AD_REVENUE_SOURCE_PUBLISHER = "publisher_sdk"; - public static final String AD_REVENUE_TOPON = "topon_sdk"; - public static final String AD_REVENUE_ADX = "adx_sdk"; - public static final String AD_REVENUE_TRADPLUS = "tradplus_sdk"; - public AdjustConfig(Context context, String appToken, String environment) { init(context, appToken, environment, false); } From dcc7a153f350a1d64c184ab12471bf0ddc992712 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 3 Apr 2024 12:04:00 +0200 Subject: [PATCH 003/540] refac:remove userAgent from AdjustConfig.java --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 2 -- .../src/main/java/com/adjust/sdk/AdjustConfig.java | 9 --------- .../java/com/adjust/sdk/network/UtilNetworking.java | 10 ---------- 3 files changed, 21 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 79ba99be8..7185597f3 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -939,8 +939,6 @@ public void run() { }, DELAY_START_TIMER_NAME); } - UtilNetworking.setUserAgent(adjustConfig.userAgent); - IActivityPackageSender packageHandlerActivitySender = new ActivityPackageSender( adjustConfig.urlStrategy, diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 716857617..ddcb78051 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -31,7 +31,6 @@ public class AdjustConfig { Double delayStart; AdjustInstance.PreLaunchActions preLaunchActions; ILogger logger; - String userAgent; String pushToken; Boolean startEnabled; boolean startOffline; @@ -155,10 +154,6 @@ public void setDelayStart(double delayStart) { this.delayStart = delayStart; } - public void setUserAgent(String userAgent) { - this.userAgent = userAgent; - } - public void setAppSecret(long secretId, long info1, long info2, long info3, long info4) { this.secretId = Util.formatString("%d", secretId); this.appSecret = Util.formatString("%d%d%d%d", info1, info2, info3, info4); @@ -323,10 +318,6 @@ public ILogger getLogger() { return logger; } - public String getUserAgent() { - return userAgent; - } - public String getPushToken() { return pushToken; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java index d0d36a2cf..25e159dab 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java @@ -16,16 +16,11 @@ */ public class UtilNetworking { - private static String userAgent; private static ILogger getLogger() { return AdjustFactory.getLogger(); } - public static void setUserAgent(String userAgent) { - UtilNetworking.userAgent = userAgent; - } - public interface IConnectionOptions { void applyConnectionOptions(HttpsURLConnection connection, String clientSdk); } @@ -39,11 +34,6 @@ public void applyConnectionOptions(final HttpsURLConnection connection, connection.setRequestProperty("Client-SDK", clientSdk); connection.setConnectTimeout(Constants.ONE_MINUTE); connection.setReadTimeout(Constants.ONE_MINUTE); - - if (userAgent != null) { - connection.setRequestProperty("User-Agent", userAgent); - } - } }; } From d4c791c62512de22506857f41333cd565dfd22dc Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 3 Apr 2024 12:04:24 +0200 Subject: [PATCH 004/540] refac:remove userAgent from web-bridge --- .../sdk-plugin-webbridge/src/main/assets/adjust_config.js | 5 ----- .../java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 6 ------ .../main/java/com/adjust/testapp/AdjustCommandExecutor.java | 4 ---- 3 files changed, 15 deletions(-) diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js index 6a98021e1..94e01b4c7 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -42,7 +42,6 @@ function AdjustConfig(appToken, environment, legacy) { this.deferredDeeplinkCallbackName = null; this.deferredDeeplinkCallbackFunction = null; this.delayStart = null; - this.userAgent = null; this.secretId = null; this.info1 = null; this.info2 = null; @@ -221,10 +220,6 @@ AdjustConfig.prototype.setDelayStart = function(delayStart) { this.delayStart = delayStart; }; -AdjustConfig.prototype.setUserAgent = function(userAgent) { - this.userAgent = userAgent; -}; - AdjustConfig.prototype.setAppSecret = function(secretId, info1, info2, info3, info4) { this.secretId = secretId; this.info1 = info1; diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 4b26d0dfe..5cba15ea5 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -338,12 +338,6 @@ public boolean launchReceivedDeeplink(Uri deeplink) { adjustConfig.setDelayStart(delayStart); } - // User agent - String userAgent = AdjustBridgeUtil.fieldToString(userAgentField); - if (userAgent != null) { - adjustConfig.setUserAgent(userAgent); - } - // App secret Long secretId = AdjustBridgeUtil.fieldToLong(secretIdField); Long info1 = AdjustBridgeUtil.fieldToLong(info1Field); diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 39f1d7280..43f87fc6f 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -321,10 +321,6 @@ private void config() { adjustConfig.setSendInBackground(sendInBackground); } - if (command.containsParameter("userAgent")) { - String userAgent = command.getFirstParameterValue("userAgent"); - adjustConfig.setUserAgent(userAgent); - } if (command.containsParameter("externalDeviceId")) { String externalDeviceId = command.getFirstParameterValue("externalDeviceId"); From 550c483b581cb5532a087135ef4bbe19f0c3f4b4 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 3 Apr 2024 11:40:30 +0200 Subject: [PATCH 005/540] refac:remove trackAdRevenue overload of payload and source from Adjust.java and AdjustInstance.java --- .../src/main/java/com/adjust/sdk/Adjust.java | 11 ----------- .../main/java/com/adjust/sdk/AdjustInstance.java | 13 ------------- 2 files changed, 24 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 2df015494..3b319e2f4 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -284,17 +284,6 @@ public static void trackMeasurementConsent(final boolean consentMeasurement) { adjustInstance.trackMeasurementConsent(consentMeasurement); } - /** - * Track ad revenue from a source provider - * - * @param source Source of ad revenue information, see AdjustConfig.AD_REVENUE_* for some possible sources - * @param payload JsonObject content of the ad revenue information - */ - public static void trackAdRevenue(final String source, final JSONObject payload) { - AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.trackAdRevenue(source, payload); - } - /** * Track ad revenue from a source provider * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 354636a1f..87cd75ee8 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -484,19 +484,6 @@ public void trackMeasurementConsent(final boolean consentMeasurement) { activityHandler.trackMeasurementConsent(consentMeasurement); } - /** - * Track ad revenue from a source provider - * - * @param source Source of ad revenue information, see AdjustConfig.AD_REVENUE_* for some possible sources - * @param adRevenueJson JsonObject content of the ad revenue information - */ - public void trackAdRevenue(String source, JSONObject adRevenueJson) { - if (!checkActivityHandler("trackAdRevenue")) { - return; - } - activityHandler.trackAdRevenue(source, adRevenueJson); - } - /** * Track ad revenue from a source provider * From 6fe413ffc7464013af546bc9f5825f20173c3d02 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 3 Apr 2024 12:07:22 +0200 Subject: [PATCH 006/540] refac:remove trackAdRevenue overload by source and payload --- .../sdk-plugin-webbridge/src/main/assets/adjust.js | 6 ------ .../adjust/sdk/webbridge/AdjustBridgeInstance.java | 13 ------------- 2 files changed, 19 deletions(-) diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index ca9c7ae4d..c1bdd1291 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -19,12 +19,6 @@ var Adjust = { } }, - trackAdRevenue: function(source, payload) { - if (AdjustBridge) { - AdjustBridge.trackAdRevenue(source, payload); - } - }, - onResume: function () { if (AdjustBridge) { AdjustBridge.onResume(); diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 5cba15ea5..10aa13a39 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -500,19 +500,6 @@ public void trackEvent(String adjustEventString) { } } - @JavascriptInterface - public void trackAdRevenue(final String source, final String payload) { - try { - // payload JSON string is URL encoded - String decodedPayload = URLDecoder.decode(payload, "UTF-8"); - JSONObject jsonPayload = new JSONObject(decodedPayload); - Adjust.trackAdRevenue(source, jsonPayload); - } catch (JSONException je) { - AdjustFactory.getLogger().debug("Ad revenue payload does not seem to be a valid JSON string"); - } catch (UnsupportedEncodingException ue) { - AdjustFactory.getLogger().debug("Unable to URL decode given JSON string"); - } - } @JavascriptInterface public void onResume() { From 83a7b2d09656bf24b5f1f5151a710e7fa7123a6b Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 3 Apr 2024 12:16:56 +0200 Subject: [PATCH 007/540] refac:remove trackAdRevenue overload by source and payload in ActivityHandler.java , IActivityHandler.java PackageBuilder.java --- .../java/com/adjust/sdk/ActivityHandler.java | 25 ----- .../java/com/adjust/sdk/IActivityHandler.java | 2 - .../java/com/adjust/sdk/PackageBuilder.java | 99 ------------------- .../adjust/testapp/AdjustCommandExecutor.java | 13 --- 4 files changed, 139 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 7185597f3..36ef2531a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -706,16 +706,6 @@ public void run() { }); } - @Override - public void trackAdRevenue(final String source, final JSONObject adRevenueJson) { - executor.submit(new Runnable() { - @Override - public void run() { - trackAdRevenueI(source, adRevenueJson); - } - }); - } - @Override public void trackAdRevenue(final AdjustAdRevenue adjustAdRevenue) { executor.submit(new Runnable() { @@ -2500,21 +2490,6 @@ private void trackMeasurementConsentI(final boolean consentMeasurement) { } } - private void trackAdRevenueI(String source, JSONObject adRevenueJson) { - if (!checkActivityStateI(activityState)) { return; } - if (!isEnabledI()) { return; } - if (activityState.isGdprForgotten) { return; } - - long now = System.currentTimeMillis(); - - PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now); - packageBuilder.internalState = internalState; - - ActivityPackage adRevenuePackage = packageBuilder.buildAdRevenuePackage(source, adRevenueJson); - packageHandler.addPackage(adRevenuePackage); - packageHandler.sendFirstPackage(); - } - private void trackAdRevenueI(AdjustAdRevenue adjustAdRevenue) { if (!checkActivityStateI(activityState)) { return; } if (!isEnabledI()) { return; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index d4c527f05..ecb035737 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -75,8 +75,6 @@ public interface IActivityHandler { void trackMeasurementConsent(boolean consentMeasurement); - void trackAdRevenue(String source, JSONObject adRevenueJson); - void trackAdRevenue(AdjustAdRevenue adjustAdRevenue); void trackPlayStoreSubscription(AdjustPlayStoreSubscription subscription); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 158610ca1..7fa499d06 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -187,16 +187,6 @@ ActivityPackage buildMeasurementConsentPackage(final boolean consentMeasurement) return activityPackage; } - ActivityPackage buildAdRevenuePackage(String source, JSONObject adRevenueJson) { - Map parameters = getAdRevenueParameters(source, adRevenueJson); - ActivityPackage adRevenuePackage = getDefaultActivityPackage(ActivityKind.AD_REVENUE); - adRevenuePackage.setPath("/ad_revenue"); - adRevenuePackage.setSuffix(""); - - adRevenuePackage.setParameters(parameters); - return adRevenuePackage; - } - ActivityPackage buildAdRevenuePackage(AdjustAdRevenue adjustAdRevenue, boolean isInDelay) { Map parameters = getAdRevenueParameters(adjustAdRevenue, isInDelay); ActivityPackage adRevenuePackage = getDefaultActivityPackage(ActivityKind.AD_REVENUE); @@ -933,95 +923,6 @@ private Map getMeasurementConsentParameters( return parameters; } - private Map getAdRevenueParameters(String source, JSONObject adRevenueJson) { - Map parameters = new HashMap(); - - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); - - // Check if plugin is used and if yes, add read parameters. - if (deviceInfo.imeiParameters != null) { - parameters.putAll(deviceInfo.imeiParameters); - } - - // Check if oaid plugin is used and if yes, add the parameter - if (deviceInfo.oaidParameters != null) { - parameters.putAll(deviceInfo.oaidParameters); - } - - // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); - PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); - PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); - PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); - PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); - PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); - PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); - PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); - - if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { - logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + - "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); - PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); - } - - // Rest of the parameters. - PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); - PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); - PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); - PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); - PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); - PackageBuilder.addString(parameters, "country", deviceInfo.country); - PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); - PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); - PackageBuilder.addBoolean(parameters, "device_known", adjustConfig.deviceKnown); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); - PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); - PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); - PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); - PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); - PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); - PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); - PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); - PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); - PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); - PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); - PackageBuilder.addString(parameters, "installed_at", deviceInfo.appInstallTime); - PackageBuilder.addString(parameters, "language", deviceInfo.language); - PackageBuilder.addDuration(parameters, "last_interval", activityStateCopy.lastInterval); - PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); - PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); - PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); - PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); - PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); - PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); - PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); - PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); - PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); - PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); - PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); - PackageBuilder.addString(parameters, "source", source); - PackageBuilder.addJsonObject(parameters, "payload", adRevenueJson); - PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); - PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); - PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); - PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); - PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); - - // google play games - PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); - - injectFeatureFlagsWithParameters(parameters); - - checkDeviceIds(parameters); - return parameters; - } - private Map getAdRevenueParameters(AdjustAdRevenue adjustAdRevenue, boolean isInDelay) { Map parameters = new HashMap(); diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 43f87fc6f..40c43913a 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -89,7 +89,6 @@ public void executeCommand(final Command sentCommand) { case "disableThirdPartySharing": disableThirdPartySharing(); break; case "thirdPartySharing" : thirdPartySharing(); break; case "measurementConsent" : measurementConsent(); break; - case "trackAdRevenue": trackAdRevenue(); break; case "trackAdRevenueV2" : trackAdRevenueV2(); break; case "trackSubscription": trackSubscription(); break; case "verifyPurchase": verifyPurchase(); break; @@ -711,18 +710,6 @@ private void measurementConsent() { Adjust.trackMeasurementConsent(measurementConsent); } - private void trackAdRevenue() { - String adRevenueSource = command.getFirstParameterValue("adRevenueSource"); - String adRevenueJsonString = command.getFirstParameterValue("adRevenueJsonString"); - - try { - JSONObject adRevenueJson = new JSONObject(adRevenueJsonString); - Adjust.trackAdRevenue(adRevenueSource, adRevenueJson); - } catch (JSONException e) { - e.printStackTrace(); - } - } - private void trackAdRevenueV2() { String adRevenueSource = command.getFirstParameterValue("adRevenueSource"); AdjustAdRevenue adjustAdRevenue = new AdjustAdRevenue(adRevenueSource); From 223723ba3e43fae7e6c306d2fbcd9bd6a8c14a09 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 3 Apr 2024 11:30:52 +0200 Subject: [PATCH 008/540] refac:remove deviceKnown parameter from AdjustConfig.java --- .../src/main/java/com/adjust/sdk/AdjustConfig.java | 9 --------- .../src/main/java/com/adjust/sdk/PackageBuilder.java | 12 ------------ 2 files changed, 21 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index ddcb78051..305dc448e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -20,7 +20,6 @@ public class AdjustConfig { boolean eventBufferingEnabled; String defaultTracker; OnAttributionChangedListener onAttributionChangedListener; - Boolean deviceKnown; Class deepLinkComponent; OnEventTrackingSucceededListener onEventTrackingSucceededListener; OnEventTrackingFailedListener onEventTrackingFailedListener; @@ -122,10 +121,6 @@ public void setOnAttributionChangedListener(OnAttributionChangedListener onAttri this.onAttributionChangedListener = onAttributionChangedListener; } - public void setDeviceKnown(boolean deviceKnown) { - this.deviceKnown = deviceKnown; - } - public void setDeepLinkComponent(Class deepLinkComponent) { this.deepLinkComponent = deepLinkComponent; } @@ -274,10 +269,6 @@ public OnAttributionChangedListener getOnAttributionChangedListener() { return onAttributionChangedListener; } - public Boolean getDeviceKnown() { - return deviceKnown; - } - public Class getDeepLinkComponent() { return deepLinkComponent; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 7fa499d06..d03564b65 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -274,7 +274,6 @@ private Map getSessionParameters(boolean isInDelay) { PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); - PackageBuilder.addBoolean(parameters, "device_known", adjustConfig.deviceKnown); PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); @@ -367,7 +366,6 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "currency", event.currency); - PackageBuilder.addBoolean(parameters, "device_known", adjustConfig.deviceKnown); PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); @@ -452,7 +450,6 @@ private Map getInfoParameters(String source) { PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - PackageBuilder.addBoolean(parameters, "device_known", adjustConfig.deviceKnown); PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); PackageBuilder.addString(parameters, "environment", adjustConfig.environment); PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); @@ -527,7 +524,6 @@ private Map getClickParameters(String source) { PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "deeplink", deeplink); - PackageBuilder.addBoolean(parameters, "device_known", adjustConfig.deviceKnown); PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); @@ -624,7 +620,6 @@ private Map getAttributionParameters(String initiatedBy) { PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - PackageBuilder.addBoolean(parameters, "device_known", adjustConfig.deviceKnown); PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); @@ -689,7 +684,6 @@ private Map getGdprParameters() { PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - PackageBuilder.addBoolean(parameters, "device_known", adjustConfig.deviceKnown); PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); @@ -753,7 +747,6 @@ private Map getDisableThirdPartySharingParameters() { PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - PackageBuilder.addBoolean(parameters, "device_known", adjustConfig.deviceKnown); PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); @@ -831,7 +824,6 @@ private Map getDisableThirdPartySharingParameters() { PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - PackageBuilder.addBoolean(parameters, "device_known", adjustConfig.deviceKnown); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); @@ -900,7 +892,6 @@ private Map getMeasurementConsentParameters( PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - PackageBuilder.addBoolean(parameters, "device_known", adjustConfig.deviceKnown); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); @@ -973,7 +964,6 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); - PackageBuilder.addBoolean(parameters, "device_known", adjustConfig.deviceKnown); PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); @@ -1073,7 +1063,6 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); - PackageBuilder.addBoolean(parameters, "device_known", adjustConfig.deviceKnown); PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); @@ -1169,7 +1158,6 @@ private Map getVerificationParameters(AdjustPurchase purchase) { PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); - PackageBuilder.addBoolean(parameters, "device_known", adjustConfig.deviceKnown); PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); From de23cb2f0c37435bc5bc9c829a7c0ea5c53fe7d9 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 3 Apr 2024 12:44:06 +0200 Subject: [PATCH 009/540] refac:remove deviceKnown param useage from webBridge and test executors --- .../sdk-plugin-webbridge/src/main/assets/adjust_config.js | 5 ----- .../com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 7 ------- .../java/com/adjust/testapp/AdjustCommandExecutor.java | 6 ------ .../test-app-webbridge/src/main/assets/command_executor.js | 6 ------ .../java/com/adjust/sdk/TestActivityPackage.java | 3 --- 5 files changed, 27 deletions(-) diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js index 94e01b4c7..6bdf786a9 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -28,7 +28,6 @@ function AdjustConfig(appToken, environment, legacy) { this.externalDeviceId = null; this.attributionCallbackName = null; this.attributionCallbackFunction = null; - this.deviceKnown = null; this.needsCost = null; this.eventSuccessCallbackName = null; this.eventSuccessCallbackFunction = null; @@ -129,10 +128,6 @@ AdjustConfig.prototype.adjust_attributionCallback = function(attribution) { } }; -AdjustConfig.prototype.setDeviceKnown = function(deviceKnown) { - this.deviceKnown = deviceKnown; -}; - AdjustConfig.prototype.setNeedsCost = function(needsCost) { this.needsCost = needsCost; }; diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 10aa13a39..a62e4056f 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -152,7 +152,6 @@ public void onCreate(String adjustConfigString) { Object defaultTrackerField = jsonAdjustConfig.get("defaultTracker"); Object externalDeviceIdField = jsonAdjustConfig.get("externalDeviceId"); Object attributionCallbackNameField = jsonAdjustConfig.get("attributionCallbackName"); - Object deviceKnownField = jsonAdjustConfig.get("deviceKnown"); Object needsCostField = jsonAdjustConfig.get("needsCost"); Object eventSuccessCallbackNameField = jsonAdjustConfig.get("eventSuccessCallbackName"); Object eventFailureCallbackNameField = jsonAdjustConfig.get("eventFailureCallbackName"); @@ -260,12 +259,6 @@ public void onAttributionChanged(AdjustAttribution attribution) { }); } - // Is device known - Boolean deviceKnown = AdjustBridgeUtil.fieldToBoolean(deviceKnownField); - if (deviceKnown != null) { - adjustConfig.setDeviceKnown(deviceKnown); - } - // Needs cost Boolean needsCost = AdjustBridgeUtil.fieldToBoolean(needsCostField); if (needsCost != null) { diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 40c43913a..4903d6da5 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -296,12 +296,6 @@ private void config() { adjustConfig.setDelayStart(delayStart); } - if (command.containsParameter("deviceKnown")) { - String deviceKnownS = command.getFirstParameterValue("deviceKnown"); - boolean deviceKnown = "true".equals(deviceKnownS); - adjustConfig.setDeviceKnown(deviceKnown); - } - if (command.containsParameter("needsCost")) { String needsCostS = command.getFirstParameterValue("needsCost"); boolean needsCost = "true".equals(needsCostS); diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index be549df22..8dc17a953 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -311,12 +311,6 @@ AdjustCommandExecutor.prototype.config = function(params) { adjustConfig.setDelayStart(delayStart); } - if ('deviceKnown' in params) { - var deviceKnownS = getFirstParameterValue(params, 'deviceKnown'); - var deviceKnown = deviceKnownS == 'true'; - adjustConfig.setDeviceKnown(deviceKnown); - } - if ('needsCost' in params) { var needsCostS = getFirstParameterValue(params, 'needsCost'); var needsCost = needsCostS == 'true'; diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestActivityPackage.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestActivityPackage.java index 349c547b5..e443f8542 100644 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestActivityPackage.java +++ b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestActivityPackage.java @@ -21,7 +21,6 @@ public class TestActivityPackage { public String appToken; public String environment; public String clientSdk; - public Boolean deviceKnow; public boolean playServices; public boolean eventBufferingEnabled; public String pushToken; @@ -345,8 +344,6 @@ private void testConfig() { assertParameterEquals("app_token", appToken); // environment assertParameterEquals("environment", environment); - // device_known - testParameterBoolean("device_known", deviceKnow); // needs_attribution_data testParameterBoolean("needs_response_details", true); // play services From c3918e8d3e3fd87a4a5270670bf24b3449d0ee85 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 3 Apr 2024 11:30:52 +0200 Subject: [PATCH 010/540] refac:remove deviceKnown parameter from AdjustConfig.java --- .../java/com/adjust/sdk/PackageBuilder.java | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index d03564b65..11ee5fef5 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -914,6 +914,94 @@ private Map getMeasurementConsentParameters( return parameters; } + private Map getAdRevenueParameters(String source, JSONObject adRevenueJson) { + Map parameters = new HashMap(); + + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + + // Check if plugin is used and if yes, add read parameters. + if (deviceInfo.imeiParameters != null) { + parameters.putAll(deviceInfo.imeiParameters); + } + + // Check if oaid plugin is used and if yes, add the parameter + if (deviceInfo.oaidParameters != null) { + parameters.putAll(deviceInfo.oaidParameters); + } + + // Device identifiers. + deviceInfo.reloadPlayIds(adjustConfig); + PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); + PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); + PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); + PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); + PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); + PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); + PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); + + if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { + logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + + "fallback to non Google Play and Fire identifiers will take place"); + deviceInfo.reloadNonPlayIds(adjustConfig); + PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); + } + + // Rest of the parameters. + PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); + PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); + PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); + PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); + PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); + PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); + PackageBuilder.addString(parameters, "country", deviceInfo.country); + PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); + PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); + PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); + PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); + PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); + PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); + PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); + PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); + PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); + PackageBuilder.addString(parameters, "environment", adjustConfig.environment); + PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); + PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); + PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); + PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); + PackageBuilder.addString(parameters, "installed_at", deviceInfo.appInstallTime); + PackageBuilder.addString(parameters, "language", deviceInfo.language); + PackageBuilder.addDuration(parameters, "last_interval", activityStateCopy.lastInterval); + PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); + PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); + PackageBuilder.addBoolean(parameters, "needs_response_details", true); + PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); + PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); + PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); + PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); + PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); + PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); + PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); + PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); + PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); + PackageBuilder.addString(parameters, "source", source); + PackageBuilder.addJsonObject(parameters, "payload", adRevenueJson); + PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); + PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); + PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); + PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); + PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); + + // google play games + PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + + injectFeatureFlagsWithParameters(parameters); + + checkDeviceIds(parameters); + return parameters; + } + private Map getAdRevenueParameters(AdjustAdRevenue adjustAdRevenue, boolean isInDelay) { Map parameters = new HashMap(); From 9416c30592aa5fa7535e1ac72594637d1baaf930 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 3 Apr 2024 15:57:32 +0200 Subject: [PATCH 011/540] feat: update version number to 5.0.0 --- Adjust/build.gradle | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java | 2 +- Adjust/sdk-plugin-criteo/build.gradle | 2 +- Adjust/sdk-plugin-imei/build.gradle | 2 +- Adjust/sdk-plugin-oaid/build.gradle | 2 +- Adjust/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/sdk-plugin-sociomantic/build.gradle | 2 +- Adjust/sdk-plugin-trademob/build.gradle | 2 +- Adjust/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/sdk-plugin-webbridge/build.gradle | 2 +- Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- Adjust/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- .../androidTest/java/com/adjust/sdk/TestActivityPackage.java | 2 +- VERSION | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index e81755ce2..5e662bf3d 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 9 coreCompileSdkVersion = 34 coreTargetSdkVersion = 34 - coreVersionName = '4.38.5' + coreVersionName = '5.0.0' defaultVersionCode = 1 webbridgeMinSdkVersion = 17 samsungReferrerMinSdkVersion = 18 diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 3b319e2f4..020167fc5 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -34,7 +34,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:4.38.5"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.0.0"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 9edad21fe..4b4a876cc 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -30,7 +30,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android4.38.5"; + String CLIENT_SDK = "android5.0.0"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/Adjust/sdk-plugin-criteo/build.gradle b/Adjust/sdk-plugin-criteo/build.gradle index 96e65fca8..f27120720 100644 --- a/Adjust/sdk-plugin-criteo/build.gradle +++ b/Adjust/sdk-plugin-criteo/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:4.38.5' + // implementation 'com.adjust.sdk:adjust-android:5.0.0' } // read local properties diff --git a/Adjust/sdk-plugin-imei/build.gradle b/Adjust/sdk-plugin-imei/build.gradle index 328af7e38..b4aadc833 100644 --- a/Adjust/sdk-plugin-imei/build.gradle +++ b/Adjust/sdk-plugin-imei/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:4.38.5' + // implementation 'com.adjust.sdk:adjust-android:5.0.0' } // read local properties diff --git a/Adjust/sdk-plugin-oaid/build.gradle b/Adjust/sdk-plugin-oaid/build.gradle index b24bc4e08..3b9df27f6 100644 --- a/Adjust/sdk-plugin-oaid/build.gradle +++ b/Adjust/sdk-plugin-oaid/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:4.38.5' + // implementation 'com.adjust.sdk:adjust-android:5.0.0' implementation 'com.huawei.hms:ads-identifier:3.4.56.300' } diff --git a/Adjust/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/sdk-plugin-samsung-clouddev/build.gradle index addc30e9a..0e164d230 100644 --- a/Adjust/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/sdk-plugin-samsung-clouddev/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:4.38.5' + // implementation 'com.adjust.sdk:adjust-android:5.0.0' // Add Samsung clouddev lib. compileOnly fileTree(include: ['*.aar'], dir: 'libs') diff --git a/Adjust/sdk-plugin-samsung-referrer/build.gradle b/Adjust/sdk-plugin-samsung-referrer/build.gradle index 952dc66b2..a68fd9153 100644 --- a/Adjust/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/sdk-plugin-samsung-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:4.38.5' + // implementation 'com.adjust.sdk:adjust-android:5.0.0' // Add Samsung referrer lib via Maven. implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:3.0.1' diff --git a/Adjust/sdk-plugin-sociomantic/build.gradle b/Adjust/sdk-plugin-sociomantic/build.gradle index e7ed6a45b..f3765c246 100644 --- a/Adjust/sdk-plugin-sociomantic/build.gradle +++ b/Adjust/sdk-plugin-sociomantic/build.gradle @@ -28,7 +28,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:4.38.5' + // implementation 'com.adjust.sdk:adjust-android:5.0.0' } // read local properties diff --git a/Adjust/sdk-plugin-trademob/build.gradle b/Adjust/sdk-plugin-trademob/build.gradle index e8b223ec2..c53e19ae6 100644 --- a/Adjust/sdk-plugin-trademob/build.gradle +++ b/Adjust/sdk-plugin-trademob/build.gradle @@ -28,7 +28,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:4.38.5' + // implementation 'com.adjust.sdk:adjust-android:5.0.0' } // read local properties diff --git a/Adjust/sdk-plugin-vivo-referrer/build.gradle b/Adjust/sdk-plugin-vivo-referrer/build.gradle index ce1de2e67..513b69945 100644 --- a/Adjust/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/sdk-plugin-vivo-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:4.38.5' + // implementation 'com.adjust.sdk:adjust-android:5.0.0' } // read local properties diff --git a/Adjust/sdk-plugin-webbridge/build.gradle b/Adjust/sdk-plugin-webbridge/build.gradle index 7724169e5..39812fca6 100644 --- a/Adjust/sdk-plugin-webbridge/build.gradle +++ b/Adjust/sdk-plugin-webbridge/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:4.38.5' + // implementation 'com.adjust.sdk:adjust-android:5.0.0' } // read local properties diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index c1bdd1291..4e6d2572c 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -205,7 +205,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge4.38.5'; + return 'web-bridge5.0.0'; } }, diff --git a/Adjust/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/sdk-plugin-xiaomi-referrer/build.gradle index a3e925c03..5a5bcf2a7 100644 --- a/Adjust/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/sdk-plugin-xiaomi-referrer/build.gradle @@ -31,7 +31,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:4.38.5' + // implementation 'com.adjust.sdk:adjust-android:5.0.0' // Add xiaomi referrer lib via Maven. implementation 'com.miui.referrer:homereferrer:1.0.0.6' diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestActivityPackage.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestActivityPackage.java index e443f8542..7e63c75bc 100644 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestActivityPackage.java +++ b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestActivityPackage.java @@ -52,7 +52,7 @@ public TestActivityPackage(ActivityPackage activityPackage) { // default values appToken = "123456789012"; environment = "sandbox"; - clientSdk = "android4.38.5"; + clientSdk = "android5.0.0"; suffix = ""; attribution = new AdjustAttribution(); playServices = true; diff --git a/VERSION b/VERSION index 8f4005428..0062ac971 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.38.5 +5.0.0 From a2865a86c35453b11cc0482ef51bee3402a716b0 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 3 Apr 2024 17:36:50 +0200 Subject: [PATCH 012/540] feat: changes to report only final attribution by default --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 3 +-- .../src/main/java/com/adjust/sdk/AdjustConfig.java | 9 --------- .../src/main/assets/adjust_config.js | 5 ----- .../com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 7 ------- .../java/com/adjust/testapp/AdjustCommandExecutor.java | 6 ------ .../src/main/assets/command_executor.js | 6 ------ 6 files changed, 1 insertion(+), 35 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 36ef2531a..743d91fbd 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -471,8 +471,7 @@ public boolean updateAttributionI(AdjustAttribution attribution) { return false; } - if (adjustConfig.finalAttributionEnabled && activityState.askingAttribution) { - logger.info("Not updating intermediate attribution"); + if (activityState.askingAttribution) { return false; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 305dc448e..7cd8f2426 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -42,7 +42,6 @@ public class AdjustConfig { String preinstallFilePath; boolean playStoreKidsAppEnabled; boolean coppaCompliantEnabled; - boolean finalAttributionEnabled; String fbAppId; boolean readDeviceInfoOnceEnabled; OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; @@ -183,10 +182,6 @@ public void setCoppaCompliantEnabled(boolean coppaCompliantEnabled) { this.coppaCompliantEnabled = coppaCompliantEnabled; } - public void setFinalAttributionEnabled(boolean finalAttributionEnabled) { - this.finalAttributionEnabled = finalAttributionEnabled; - } - public void setFbAppId(String fbAppId) { this.fbAppId = fbAppId; } @@ -357,10 +352,6 @@ public boolean isCoppaCompliantEnabled() { return coppaCompliantEnabled; } - public boolean isFinalAttributionEnabled() { - return finalAttributionEnabled; - } - public String getFbAppId() { return fbAppId; } diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js index 6bdf786a9..a4c860406 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -53,7 +53,6 @@ function AdjustConfig(appToken, environment, legacy) { this.preinstallFilePath = null; this.playStoreKidsAppEnabled = null; this.coppaCompliantEnabled = null; - this.finalAttributionEnabled = null; this.fbAppId = null; this.readDeviceInfoOnceEnabled = null; } @@ -254,10 +253,6 @@ AdjustConfig.prototype.setCoppaCompliantEnabled = function(isEnabled) { this.coppaCompliantEnabled = isEnabled; }; -AdjustConfig.prototype.setFinalAttributionEnabled = function(isEnabled) { - this.finalAttributionEnabled = isEnabled; -}; - AdjustConfig.prototype.setFbAppId = function(fbAppId) { this.fbAppId = fbAppId; }; diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index a62e4056f..8fc6a353c 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -173,7 +173,6 @@ public void onCreate(String adjustConfigString) { Object preinstallFilePathField = jsonAdjustConfig.get("preinstallFilePath"); Object playStoreKidsAppEnabledField = jsonAdjustConfig.get("playStoreKidsAppEnabled"); Object coppaCompliantEnabledField = jsonAdjustConfig.get("coppaCompliantEnabled"); - Object finalAttributionEnabledField = jsonAdjustConfig.get("finalAttributionEnabled"); Object fbAppIdField = jsonAdjustConfig.get("fbAppId"); Object readDeviceInfoOnceEnabledField = jsonAdjustConfig.get("readDeviceInfoOnceEnabled"); @@ -391,12 +390,6 @@ public boolean launchReceivedDeeplink(Uri deeplink) { adjustConfig.setCoppaCompliantEnabled(coppaCompliantEnabled); } - // Final attribution config - Boolean finalAttributionEnabled = AdjustBridgeUtil.fieldToBoolean(finalAttributionEnabledField); - if (finalAttributionEnabled != null) { - adjustConfig.setFinalAttributionEnabled(finalAttributionEnabled); - } - // FB App ID String fbAppId = AdjustBridgeUtil.fieldToString(fbAppIdField); if (fbAppId != null) { diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 4903d6da5..d4b85a7c7 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -332,12 +332,6 @@ private void config() { adjustConfig.setPlayStoreKidsAppEnabled(playStoreKids); } - if (command.containsParameter("finalAttributionEnabled")) { - String finalAttributionEnabledS = command.getFirstParameterValue("finalAttributionEnabled"); - boolean finalAttributionEnabled = "true".equals(finalAttributionEnabledS); - adjustConfig.setFinalAttributionEnabled(finalAttributionEnabled); - } - if(command.containsParameter("deferredDeeplinkCallback")) { adjustConfig.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() { @Override diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index 8dc17a953..1bc9f52c6 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -346,12 +346,6 @@ AdjustCommandExecutor.prototype.config = function(params) { adjustConfig.setPlayStoreKidsAppEnabled(playStoreKids); } - if ('finalAttributionEnabled' in params) { - var finalAttributionEnabledS = getFirstParameterValue(params, 'finalAttributionEnabled'); - var finalAttributionEnabled = finalAttributionEnabledS == 'true'; - adjustConfig.setFinalAttributionEnabled(finalAttributionEnabled); - } - if ('attributionCallbackSendAll' in params) { var basePath = this.basePath; adjustConfig.setAttributionCallback(function(attribution) { From 3b4a7b6e8810a20ab940bf4c43316b81888349b3 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 4 Apr 2024 13:32:39 +0200 Subject: [PATCH 013/540] feat: add handling of state attribution parameter --- .../main/java/com/adjust/sdk/AdjustAttribution.java | 12 ++++++++++-- .../com/adjust/sdk/webbridge/AdjustBridgeUtil.java | 1 + .../src/main/assets/command_executor.js | 1 + 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java index 8846dfc96..6b612104f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java @@ -28,6 +28,7 @@ public class AdjustAttribution implements Serializable { new ObjectStreamField("costAmount", Double.class), new ObjectStreamField("costCurrency", String.class), new ObjectStreamField("fbInstallReferrer", String.class), + new ObjectStreamField("state", String.class), }; public String trackerToken; @@ -42,6 +43,7 @@ public class AdjustAttribution implements Serializable { public Double costAmount; public String costCurrency; public String fbInstallReferrer; + public String state; public static AdjustAttribution fromJson(JSONObject jsonObject, String adid, String sdkPlatform) { if (jsonObject == null) return null; @@ -62,6 +64,7 @@ public static AdjustAttribution fromJson(JSONObject jsonObject, String adid, Str attribution.costAmount = jsonObject.optDouble("cost_amount", 0); attribution.costCurrency = jsonObject.optString("cost_currency", ""); attribution.fbInstallReferrer = jsonObject.optString("fb_install_referrer", ""); + attribution.state = jsonObject.optString("state", ""); } else { // Rest of all platforms. attribution.trackerToken = jsonObject.optString("tracker_token"); @@ -76,6 +79,7 @@ public static AdjustAttribution fromJson(JSONObject jsonObject, String adid, Str attribution.costAmount = jsonObject.optDouble("cost_amount"); attribution.costCurrency = jsonObject.optString("cost_currency"); attribution.fbInstallReferrer = jsonObject.optString("fb_install_referrer"); + attribution.state = jsonObject.optString("state"); } return attribution; @@ -100,6 +104,8 @@ public boolean equals(Object other) { if (!Util.equalsDouble(costAmount, otherAttribution.costAmount)) return false; if (!Util.equalString(costCurrency, otherAttribution.costCurrency)) return false; if (!Util.equalString(fbInstallReferrer, otherAttribution.fbInstallReferrer)) return false; + // TODO: should state participate in the attribution comparison? + if (!Util.equalString(state, otherAttribution.state)) return false; return true; } @@ -118,6 +124,7 @@ public Map toMap() { if (costAmount != null) fields.put("costAmount", costAmount.toString()); if (costCurrency != null) fields.put("costCurrency", costCurrency); if (fbInstallReferrer != null) fields.put("fbInstallReferrer", fbInstallReferrer); + if (state != null) fields.put("state", state); return fields; } @@ -137,6 +144,7 @@ public int hashCode() { hashCode = Util.hashDouble(costAmount, hashCode); hashCode = Util.hashString(costCurrency, hashCode); hashCode = Util.hashString(fbInstallReferrer, hashCode); + hashCode = Util.hashString(state, hashCode); return hashCode; } @@ -144,9 +152,9 @@ public int hashCode() { @Override public String toString() { return Util.formatString( - "tt:%s tn:%s net:%s cam:%s adg:%s cre:%s cl:%s adid:%s ct:%s ca:%.2f cc:%s fir:%s", + "tt:%s tn:%s net:%s cam:%s adg:%s cre:%s cl:%s adid:%s ct:%s ca:%.2f cc:%s fir:%s st:%s", trackerToken, trackerName, network, campaign, adgroup, creative, clickLabel, - adid, costType, costAmount, costCurrency, fbInstallReferrer); + adid, costType, costAmount, costCurrency, fbInstallReferrer, state); } private void writeObject(ObjectOutputStream stream) throws IOException { diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java index da9a6a653..d5d8a61da 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java @@ -129,6 +129,7 @@ public void run() { jsonAttribution.put("costAmount", attribution.costAmount == null || attribution.costAmount.isNaN() ? 0 : attribution.costAmount); jsonAttribution.put("costCurrency", attribution.costCurrency == null ? JSONObject.NULL : attribution.costCurrency); jsonAttribution.put("fbInstallReferrer", attribution.fbInstallReferrer == null ? JSONObject.NULL : attribution.fbInstallReferrer); + jsonAttribution.put("fbInstallReferrer", attribution.state == null ? JSONObject.NULL : attribution.state); String command = "javascript:" + commandName + "(" + jsonAttribution.toString() + ");"; webView.loadUrl(command); diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index 1bc9f52c6..3a35ce7d9 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -361,6 +361,7 @@ AdjustCommandExecutor.prototype.config = function(params) { TestLibrary.addInfoToSend("costAmount", attribution.costAmount); TestLibrary.addInfoToSend("costCurrency", attribution.costCurrency); TestLibrary.addInfoToSend("fbInstallReferrer", attribution.fbInstallReferrer); + TestLibrary.addInfoToSend("state", attribution.state); TestLibrary.sendInfoToServer(basePath); }); From 46ff9eeea0c9baa75637739d8841d8b0378ae438 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 4 Apr 2024 13:50:05 +0200 Subject: [PATCH 014/540] test: adjust test_info keys for attribution tests --- .../adjust/testapp/AdjustCommandExecutor.java | 20 ++++++++++++++++++- .../src/main/assets/command_executor.js | 14 ++++++------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index d4b85a7c7..7def26a2f 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -35,7 +35,9 @@ import org.json.JSONException; import org.json.JSONObject; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static com.adjust.testapp.MainActivity.baseUrl; import static com.adjust.testapp.MainActivity.gdprUrl; @@ -355,7 +357,23 @@ public boolean launchReceivedDeeplink(Uri deeplink) { public void onAttributionChanged(AdjustAttribution attribution) { Log.d("TestApp", "attribution = " + attribution.toString()); - MainActivity.testLibrary.setInfoToSend(attribution.toMap()); + // TODO: do we wanna map actual backend param names into the toMap() method? + // MainActivity.testLibrary.setInfoToSend(attribution.toMap()); + Map fields = new HashMap<>(); + if (attribution.trackerToken != null) fields.put("tracker_token", attribution.trackerToken); + if (attribution.trackerName != null) fields.put("tracker_name", attribution.trackerName); + if (attribution.network != null) fields.put("network", attribution.network); + if (attribution.campaign != null) fields.put("campaign", attribution.campaign); + if (attribution.adgroup != null) fields.put("adgroup", attribution.adgroup); + if (attribution.creative != null) fields.put("creative", attribution.creative); + if (attribution.clickLabel != null) fields.put("click_label", attribution.clickLabel); + if (attribution.adid != null) fields.put("adid", attribution.adid); + if (attribution.costType != null) fields.put("cost_type", attribution.costType); + if (attribution.costAmount != null) fields.put("cost_amount", attribution.costAmount.toString()); + if (attribution.costCurrency != null) fields.put("cost_currency", attribution.costCurrency); + if (attribution.fbInstallReferrer != null) fields.put("fb_install_referrer", attribution.fbInstallReferrer); + if (attribution.state != null) fields.put("state", attribution.state); + MainActivity.testLibrary.setInfoToSend(fields); MainActivity.testLibrary.sendInfoToServer(localBasePath); } }); diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index 3a35ce7d9..db4b48594 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -349,18 +349,18 @@ AdjustCommandExecutor.prototype.config = function(params) { if ('attributionCallbackSendAll' in params) { var basePath = this.basePath; adjustConfig.setAttributionCallback(function(attribution) { - TestLibrary.addInfoToSend("trackerToken", attribution.trackerToken); - TestLibrary.addInfoToSend("trackerName", attribution.trackerName); + TestLibrary.addInfoToSend("tracker_token", attribution.trackerToken); + TestLibrary.addInfoToSend("tracker_name", attribution.trackerName); TestLibrary.addInfoToSend("network", attribution.network); TestLibrary.addInfoToSend("campaign", attribution.campaign); TestLibrary.addInfoToSend("adgroup", attribution.adgroup); TestLibrary.addInfoToSend("creative", attribution.creative); - TestLibrary.addInfoToSend("clickLabel", attribution.clickLabel); + TestLibrary.addInfoToSend("click_label", attribution.clickLabel); TestLibrary.addInfoToSend("adid", attribution.adid); - TestLibrary.addInfoToSend("costType", attribution.costType); - TestLibrary.addInfoToSend("costAmount", attribution.costAmount); - TestLibrary.addInfoToSend("costCurrency", attribution.costCurrency); - TestLibrary.addInfoToSend("fbInstallReferrer", attribution.fbInstallReferrer); + TestLibrary.addInfoToSend("cost_type", attribution.costType); + TestLibrary.addInfoToSend("cost_amount", attribution.costAmount); + TestLibrary.addInfoToSend("cost_currency", attribution.costCurrency); + TestLibrary.addInfoToSend("fb_install_referrer", attribution.fbInstallReferrer); TestLibrary.addInfoToSend("state", attribution.state); TestLibrary.sendInfoToServer(basePath); From 91064844e583c26c8cf204835a9dd448d091e968 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 4 Apr 2024 13:52:26 +0200 Subject: [PATCH 015/540] fix: remove reamining user agent references --- .../java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 1 - .../test-app-webbridge/src/main/assets/command_executor.js | 5 ----- 2 files changed, 6 deletions(-) diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 8fc6a353c..199c95df8 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -160,7 +160,6 @@ public void onCreate(String adjustConfigString) { Object openDeferredDeeplinkField = jsonAdjustConfig.get("openDeferredDeeplink"); Object deferredDeeplinkCallbackNameField = jsonAdjustConfig.get("deferredDeeplinkCallbackName"); Object delayStartField = jsonAdjustConfig.get("delayStart"); - Object userAgentField = jsonAdjustConfig.get("userAgent"); Object secretIdField = jsonAdjustConfig.get("secretId"); Object info1Field = jsonAdjustConfig.get("info1"); Object info2Field = jsonAdjustConfig.get("info2"); diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index db4b48594..bff3589e6 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -329,11 +329,6 @@ AdjustCommandExecutor.prototype.config = function(params) { adjustConfig.setSendInBackground(sendInBackground); } - if ('userAgent' in params) { - var userAgent = getFirstParameterValue(params, 'userAgent'); - adjustConfig.setUserAgent(userAgent); - } - if ('coppaCompliant' in params) { var coppaCompliantS = getFirstParameterValue(params, 'coppaCompliant'); var coppaCompliant = coppaCompliantS == 'true'; From c513603e99c1cc05d19bcabd55e65030b314cd1f Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 4 Apr 2024 14:08:50 +0200 Subject: [PATCH 016/540] fix: rename state attribution field inside of the web bridge --- .../main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java index d5d8a61da..1a6e7cb8e 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java @@ -129,7 +129,7 @@ public void run() { jsonAttribution.put("costAmount", attribution.costAmount == null || attribution.costAmount.isNaN() ? 0 : attribution.costAmount); jsonAttribution.put("costCurrency", attribution.costCurrency == null ? JSONObject.NULL : attribution.costCurrency); jsonAttribution.put("fbInstallReferrer", attribution.fbInstallReferrer == null ? JSONObject.NULL : attribution.fbInstallReferrer); - jsonAttribution.put("fbInstallReferrer", attribution.state == null ? JSONObject.NULL : attribution.state); + jsonAttribution.put("state", attribution.state == null ? JSONObject.NULL : attribution.state); String command = "javascript:" + commandName + "(" + jsonAttribution.toString() + ");"; webView.loadUrl(command); From cd61c31c6b38a10d181760034c4dc68c61dea31e Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 4 Apr 2024 16:36:40 +0200 Subject: [PATCH 017/540] refac: extract Huawei install referrer code to a plugin --- Adjust/example-app-java/build.gradle | 1 + .../java/com/adjust/sdk/ActivityHandler.java | 40 +++- .../com/adjust/sdk/InstallReferrerHuawei.java | 177 -------------- .../main/java/com/adjust/sdk/Reflection.java | 26 +++ Adjust/sdk-plugin-huawei-referrer/.gitignore | 2 + .../sdk-plugin-huawei-referrer/build.gradle | 220 ++++++++++++++++++ .../proguard-rules.pro | 21 ++ .../src/main/AndroidManifest.xml | 2 + .../sdk/huawei/AdjustHuaweiReferrer.java | 16 ++ .../sdk/huawei/HuaweiReferrerClient.java | 212 +++++++++++++++++ .../main/java/com/adjust/sdk/huawei/Util.java | 24 ++ .../src/main/res/values/strings.xml | 3 + Adjust/settings.gradle | 2 +- 13 files changed, 558 insertions(+), 188 deletions(-) delete mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrerHuawei.java create mode 100644 Adjust/sdk-plugin-huawei-referrer/.gitignore create mode 100644 Adjust/sdk-plugin-huawei-referrer/build.gradle create mode 100644 Adjust/sdk-plugin-huawei-referrer/proguard-rules.pro create mode 100644 Adjust/sdk-plugin-huawei-referrer/src/main/AndroidManifest.xml create mode 100644 Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java create mode 100644 Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiReferrerClient.java create mode 100644 Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/Util.java create mode 100644 Adjust/sdk-plugin-huawei-referrer/src/main/res/values/strings.xml diff --git a/Adjust/example-app-java/build.gradle b/Adjust/example-app-java/build.gradle index 5566d0799..a45d1eb63 100644 --- a/Adjust/example-app-java/build.gradle +++ b/Adjust/example-app-java/build.gradle @@ -38,4 +38,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.0.2' implementation project(':sdk-core') + implementation project(path: ':sdk-plugin-huawei-referrer') } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 743d91fbd..a82fb1793 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -37,6 +37,8 @@ import static com.adjust.sdk.Constants.ACTIVITY_STATE_FILENAME; import static com.adjust.sdk.Constants.ATTRIBUTION_FILENAME; +import static com.adjust.sdk.Constants.REFERRER_API_HUAWEI_ADS; +import static com.adjust.sdk.Constants.REFERRER_API_HUAWEI_APP_GALLERY; import static com.adjust.sdk.Constants.REFERRER_API_META; import static com.adjust.sdk.Constants.REFERRER_API_SAMSUNG; import static com.adjust.sdk.Constants.REFERRER_API_VIVO; @@ -80,7 +82,6 @@ public class ActivityHandler implements IActivityHandler { private IPurchaseVerificationHandler purchaseVerificationHandler; private SessionParameters sessionParameters; private InstallReferrer installReferrer; - private InstallReferrerHuawei installReferrerHuawei; private InstallReferrerMeta installReferrerMeta; private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; @@ -999,13 +1000,6 @@ public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referr } }); - installReferrerHuawei = new InstallReferrerHuawei(adjustConfig.context, new InstallReferrerReadListener() { - @Override - public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { - sendInstallReferrer(referrerDetails, referrerApi); - } - }); - installReferrerMeta = new InstallReferrerMeta(adjustConfig.context, adjustConfig.fbAppId, new InstallReferrerReadListener() { @Override @@ -1330,8 +1324,9 @@ private void processSessionI() { // Try to check if there's new referrer information. installReferrer.startConnection(); - installReferrerHuawei.readReferrer(); installReferrerMeta.readReferrer(); + readInstallReferrerHuaweiAds(); + readInstallReferrerHuaweiAppGallery(); readInstallReferrerSamsung(); readInstallReferrerXiaomi(); readInstallReferrerVivo(); @@ -1342,6 +1337,30 @@ private void processSessionI() { logger.verbose("Time span since last activity too short for a new subsession"); } + private void readInstallReferrerHuaweiAds() { + executor.submit(new Runnable() { + @Override + public void run() { + ReferrerDetails referrerDetails = Reflection.getHuaweiAdsReferrer(getContext(), logger); + if (referrerDetails != null) { + sendInstallReferrer(referrerDetails, REFERRER_API_HUAWEI_ADS); + } + } + }); + } + + private void readInstallReferrerHuaweiAppGallery() { + executor.submit(new Runnable() { + @Override + public void run() { + ReferrerDetails referrerDetails = Reflection.getHuaweiAppGalleryReferrer(getContext(), logger); + if (referrerDetails != null) { + sendInstallReferrer(referrerDetails, REFERRER_API_HUAWEI_APP_GALLERY); + } + } + }); + } + private void readInstallReferrerSamsung() { executor.submit(new Runnable() { @Override @@ -1847,8 +1866,9 @@ private void checkAfterNewStartI(SharedPreferencesManager sharedPreferencesManag // try to read and send the install referrer installReferrer.startConnection(); - installReferrerHuawei.readReferrer(); installReferrerMeta.readReferrer(); + readInstallReferrerHuaweiAds(); + readInstallReferrerHuaweiAppGallery(); readInstallReferrerSamsung(); readInstallReferrerXiaomi(); readInstallReferrerVivo(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrerHuawei.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrerHuawei.java deleted file mode 100644 index 990efe54f..000000000 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrerHuawei.java +++ /dev/null @@ -1,177 +0,0 @@ -package com.adjust.sdk; - -import android.content.ContentResolver; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; - -import java.util.concurrent.atomic.AtomicBoolean; - -public class InstallReferrerHuawei { - - /** - * Huawei install referrer provider content authority. - */ - private static final String REFERRER_PROVIDER_AUTHORITY = "com.huawei.appmarket.commondata"; - - /** - * Huawei install referrer provider content uri. - */ - private static final String REFERRER_PROVIDER_URI = "content://" + REFERRER_PROVIDER_AUTHORITY + "/item/5"; - - /** - * Huawei install referrer provider column index referrer. - */ - private static final int COLUMN_INDEX_REFERRER = 0; - - /** - * Huawei install referrer provider column index click time. - */ - private static final int COLUMN_INDEX_CLICK_TIME = 1; - - /** - * Huawei install referrer provider column index install time. - */ - private static final int COLUMN_INDEX_INSTALL_TIME = 2; - - /** - * Huawei install referrer provider column index track ID. - */ - private static final int COLUMN_INDEX_TRACK_ID = 4; - - /** - * Adjust logger instance. - */ - private ILogger logger; - - /** - * Application context. - */ - private Context context; - - /** - * Huawei Referrer callback. - */ - private final InstallReferrerReadListener referrerCallback; - - /** - * Boolean indicating whether service should be tried to read. - * Either because it has not yet tried, - * or it did and it was successful - * or it did, was not successful, but it should not retry - */ - private final AtomicBoolean shouldTryToRead; - - /** - * Default constructor. - * - * @param context Application context - * @param referrerCallback Callback for referrer information - */ - public InstallReferrerHuawei(final Context context, - final InstallReferrerReadListener referrerCallback) - { - this.logger = AdjustFactory.getLogger(); - this.context = context; - this.referrerCallback = referrerCallback; - this.shouldTryToRead = new AtomicBoolean(true); - } - - public void readReferrer() { - if (!shouldTryToRead.get()) { - logger.debug("Should not try to read Install referrer Huawei"); - return; - } - - if (!Util.resolveContentProvider(context, REFERRER_PROVIDER_AUTHORITY)) { - return; - } - - Cursor cursor = null; - Uri uri = Uri.parse(REFERRER_PROVIDER_URI); - ContentResolver contentResolver = context.getContentResolver(); - - String[] packageName = new String[] { context.getPackageName() }; - try { - cursor = contentResolver.query(uri, null, null, packageName, null); - - if (cursor != null && cursor.moveToFirst()) { - - String referrerHuaweiAds = cursor.getString(COLUMN_INDEX_REFERRER); - String referrerHuaweiAppGallery = cursor.getString(COLUMN_INDEX_TRACK_ID); - - logger.debug("InstallReferrerHuawei reads " + - "index_referrer[%s] index_track_id[%s]", - referrerHuaweiAds, referrerHuaweiAppGallery); - - String clickTime = cursor.getString(COLUMN_INDEX_CLICK_TIME); - String installTime = cursor.getString(COLUMN_INDEX_INSTALL_TIME); - - logger.debug("InstallReferrerHuawei reads " + - "clickTime[%s] installTime[%s]", clickTime, installTime ); - - long referrerClickTimestampSeconds = Long.parseLong(clickTime); - long installBeginTimestampSeconds = Long.parseLong(installTime); - - if (isValidReferrerHuaweiAds(referrerHuaweiAds)) { - ReferrerDetails referrerDetails = - new ReferrerDetails(referrerHuaweiAds, - referrerClickTimestampSeconds, - installBeginTimestampSeconds); - - referrerCallback.onInstallReferrerRead(referrerDetails, - Constants.REFERRER_API_HUAWEI_ADS); - } - - if (isValidReferrerHuaweiAppGallery(referrerHuaweiAppGallery)) { - ReferrerDetails referrerDetails = - new ReferrerDetails(referrerHuaweiAppGallery, - referrerClickTimestampSeconds, - installBeginTimestampSeconds); - - referrerCallback.onInstallReferrerRead(referrerDetails, - Constants.REFERRER_API_HUAWEI_APP_GALLERY); - } - - } else { - logger.debug("InstallReferrerHuawei fail to read referrer for " + - "package [%s] and content uri [%s]", - context.getPackageName(), uri.toString()); - } - } catch (Exception e) { - logger.debug("InstallReferrerHuawei error [%s]", e.getMessage()); - } finally { - if (cursor != null) { - cursor.close(); - } - } - - shouldTryToRead.set(false); - } - - private boolean isValidReferrerHuaweiAds(String referrerHuaweiAds) { - if (referrerHuaweiAds == null) { - return false; - } - - if (referrerHuaweiAds.isEmpty()) { - return false; - } - - return true; - } - - private boolean isValidReferrerHuaweiAppGallery(String referrerHuaweiAppGallery) { - if (referrerHuaweiAppGallery == null) { - return false; - } - - if (referrerHuaweiAppGallery.isEmpty()) { - return false; - } - - return true; - } - - -} diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java index 57a388e87..9c3ca3767 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java @@ -60,6 +60,32 @@ public static Boolean isPlayTrackingEnabled(Context context, Object AdvertisingI } } + public static ReferrerDetails getHuaweiAdsReferrer(Context context, ILogger logger) { + ReferrerDetails referrerDetails = null; + try { + referrerDetails = (ReferrerDetails) invokeStaticMethod("com.adjust.sdk.huawei.Util", + "getHuaweiAdsInstallReferrerDetails", + new Class[]{Context.class, ILogger.class}, + context, logger); + } catch (Exception e) { + logger.info("invoke getHuaweiAdsInstallReferrerDetails : " + e.getMessage()); + } + return referrerDetails; + } + + public static ReferrerDetails getHuaweiAppGalleryReferrer(Context context, ILogger logger) { + ReferrerDetails referrerDetails = null; + try { + referrerDetails = (ReferrerDetails) invokeStaticMethod("com.adjust.sdk.huawei.Util", + "getHuaweiAppGalleryInstallReferrerDetails", + new Class[]{Context.class, ILogger.class}, + context, logger); + } catch (Exception e) { + logger.info("invoke getHuaweiAppGalleryInstallReferrerDetails : " + e.getMessage()); + } + return referrerDetails; + } + public static ReferrerDetails getSamsungReferrer(Context context, ILogger logger) { ReferrerDetails referrerDetails = null; try { diff --git a/Adjust/sdk-plugin-huawei-referrer/.gitignore b/Adjust/sdk-plugin-huawei-referrer/.gitignore new file mode 100644 index 000000000..97873191d --- /dev/null +++ b/Adjust/sdk-plugin-huawei-referrer/.gitignore @@ -0,0 +1,2 @@ +/build +/libs diff --git a/Adjust/sdk-plugin-huawei-referrer/build.gradle b/Adjust/sdk-plugin-huawei-referrer/build.gradle new file mode 100644 index 000000000..a5d195396 --- /dev/null +++ b/Adjust/sdk-plugin-huawei-referrer/build.gradle @@ -0,0 +1,220 @@ +apply plugin: 'com.android.library' +apply plugin: 'maven-publish' +apply plugin: 'signing' + +repositories { + maven { + url "https://oss.sonatype.org/content/repositories/staging/" + } +} + +android { + compileSdkVersion rootProject.ext.coreCompileSdkVersion + publishing { + multipleVariants { + allVariants() + withJavadocJar() + } + } + defaultConfig { + minSdkVersion rootProject.ext.coreMinSdkVersion + targetSdkVersion rootProject.ext.coreTargetSdkVersion + } + namespace 'com.adjust.sdk.huawei' +} + +dependencies { + // Add SDK via module. + compileOnly project(':sdk-core') + // Add SDK via Maven. + // implementation 'com.adjust.sdk:adjust-android:5.0.0' +} + +// read local properties +File localPropsFile = project.rootProject.file('local.properties') +if (localPropsFile.exists()) { + Properties p = new Properties() + new FileInputStream(localPropsFile).withCloseable { is -> + p.load(is) + } + p.each { name, value -> + ext[name] = value + } +} + +task adjustHuaweiReferrerPluginAar(type: Copy) { + dependsOn 'assembleRelease' + + from('build/outputs/aar/') + include 'sdk-plugin-huawei-referrer-release.aar' + destinationDir file('build/libs/') + rename 'sdk-plugin-huawei-referrer-release.aar', "${project.name}.aar" + +} + +task adjustHuaweiReferrerPluginJar(type: Jar) { + dependsOn 'packageReleaseAssets' + dependsOn 'compileReleaseJavaWithJavac' + + from('build/intermediates/library_assets/release/packageReleaseAssets/out/') { + into('assets') + } + from('build/intermediates/javac/release/classes/') + + archiveFileName = project.provider { "${project.name}.jar" } +} + + +task adjustHuaweiReferrerPluginSourcesJar(type: Jar) { + setArchiveClassifier('sources') + from android.sourceSets.main.java.srcDirs +} + +artifacts { + archives adjustHuaweiReferrerPluginJar + archives adjustHuaweiReferrerPluginSourcesJar +} + +afterEvaluate { + publishing { + publications { +/* + mavenAndroidHuaweiReferrerJar(MavenPublication) { + customizePomForJar(pom) + groupId rootProject.ext.adjustGroupId + artifactId 'adjust-android-huawei-referrer' + version rootProject.ext.coreVersionName + + artifact adjustHuaweiReferrerPluginJar + artifact adjustHuaweiReferrerPluginSourcesJar + } +*/ + mavenAndroidHuaweiReferrerAar(MavenPublication) { + customizePomForAar(pom) + groupId rootProject.ext.adjustGroupId + artifactId 'adjust-android-huawei-referrer' + version rootProject.ext.coreVersionName + + artifact("$buildDir/outputs/aar/sdk-plugin-huawei-referrer-release.aar") { + builtBy tasks.getByPath("adjustHuaweiReferrerPluginAar") + } + artifact adjustHuaweiReferrerPluginSourcesJar + } + } + + repositories { + maven { + url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + if (project.hasProperty("sonatypeUsername")) { + credentials { + username sonatypeUsername + password sonatypePassword + } + } + } + } + } + signing { +// sign publishing.publications.mavenAndroidHuaweiReferrerJar + sign publishing.publications.mavenAndroidHuaweiReferrerAar + } +} + +def customizePomForJar(pom) { + pom.withXml { + def root = asNode() + + // Add all items necessary for maven central publication. + root.children().last() + { + resolveStrategy = Closure.DELEGATE_FIRST + description 'The Huawei Referrer plugin for Adjust SDK for Android' + name 'Adjust Android SDK Huawei Referrer plugin' + url 'https://github.com/adjust/android_sdk' + + organization { + name 'adjust GmbH' + url 'http://www.adjust.com' + } + licenses { + license { + name 'MIT License' + url 'http://www.opensource.org/licenses/mit-license.php' + } + } + scm { + url 'git@github.com:adjust/android_sdk.git' + connection 'scm:git:git@github.com:adjust/android_sdk.git' + developerConnection 'scm:git:git@github.com:adjust/android_sdk.git' + } + developers { + developer { + name 'Pedro Silva' + email 'pedro@adjust.com' + } + developer { + name 'Ugljesa Erceg' + email 'ugljesa@adjust.com' + } + } + } + } +} + +def customizePomForAar(pom) { + pom.withXml { + def root = asNode() + + // Add all items necessary for maven central publication. + root.children().last() + { + resolveStrategy = Closure.DELEGATE_FIRST + description 'The Huawei Referrer plugin for Adjust SDK for Android' + name 'Adjust Android SDK Huawei Referrer plugin' + url 'https://github.com/adjust/android_sdk' + + organization { + name 'adjust GmbH' + url 'http://www.adjust.com' + } + licenses { + license { + name 'MIT License' + url 'http://www.opensource.org/licenses/mit-license.php' + } + } + scm { + url 'git@github.com:adjust/android_sdk.git' + connection 'scm:git:git@github.com:adjust/android_sdk.git' + developerConnection 'scm:git:git@github.com:adjust/android_sdk.git' + } + developers { + developer { + name 'Pedro Silva' + email 'pedro@adjust.com' + } + developer { + name 'Ugljesa Erceg' + email 'ugljesa@adjust.com' + } + } + } + } +} + +model { +// tasks.generatePomFileForMavenAndroidHuaweiReferrerJarPublication { +// destination = file("${project.buildDir}/generated-pom.xml") +// } + /* TODO check if/how to replace this tasks + tasks.publishMavenAndroidHuaweiReferrerPublicationToMavenLocal { + dependsOn project.tasks.signArchives + } + tasks.publishMavenAndroidHuaweiReferrerPublicationToMavenRepository { + dependsOn project.tasks.signArchives + } + */ + tasks.generatePomFileForMavenAndroidHuaweiReferrerAarPublication { + destination = file("${project.buildDir}/generated-pom.xml") + } +} + + diff --git a/Adjust/sdk-plugin-huawei-referrer/proguard-rules.pro b/Adjust/sdk-plugin-huawei-referrer/proguard-rules.pro new file mode 100644 index 000000000..f1b424510 --- /dev/null +++ b/Adjust/sdk-plugin-huawei-referrer/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/AndroidManifest.xml b/Adjust/sdk-plugin-huawei-referrer/src/main/AndroidManifest.xml new file mode 100644 index 000000000..a2f47b605 --- /dev/null +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java new file mode 100644 index 000000000..62132efc1 --- /dev/null +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java @@ -0,0 +1,16 @@ +package com.adjust.sdk.huawei; + +import android.content.Context; + +public class AdjustHuaweiReferrer { + + static boolean shouldReadHuaweiReferrer = true; + + public static void readHuaweiReferrer(Context context) { + shouldReadHuaweiReferrer = true; + } + + public static void doNotReadHuaweiReferrer() { + shouldReadHuaweiReferrer = false; + } +} diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiReferrerClient.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiReferrerClient.java new file mode 100644 index 000000000..72c4bdd5a --- /dev/null +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiReferrerClient.java @@ -0,0 +1,212 @@ +package com.adjust.sdk.huawei; + +import android.content.ContentResolver; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; + +import com.adjust.sdk.ILogger; +import com.adjust.sdk.ReferrerDetails; + +import java.util.concurrent.atomic.AtomicBoolean; + +public class HuaweiReferrerClient { + + /** + * Huawei install referrer provider content authority. + */ + private static final String REFERRER_PROVIDER_AUTHORITY = "com.huawei.appmarket.commondata"; + + /** + * Huawei install referrer provider content uri. + */ + private static final String REFERRER_PROVIDER_URI = "content://" + REFERRER_PROVIDER_AUTHORITY + "/item/5"; + + /** + * Huawei install referrer provider column index referrer. + */ + private static final int COLUMN_INDEX_REFERRER = 0; + + /** + * Huawei install referrer provider column index click time. + */ + private static final int COLUMN_INDEX_CLICK_TIME = 1; + + /** + * Huawei install referrer provider column index install time. + */ + private static final int COLUMN_INDEX_INSTALL_TIME = 2; + + /** + * Huawei install referrer provider column index track ID. + */ + private static final int COLUMN_INDEX_TRACK_ID = 4; + + /** + * Boolean indicating whether to read HuaweiAdsReferrer. + * Either because it has not yet tried, + * or it did and it was successful + * or it did, was not successful, but it should not retry + */ + private static final AtomicBoolean shouldTryToReadHuaweiAdsReferrer = new AtomicBoolean(true); + + /** + * Boolean indicating whether to read HuaweiAdsReferrer. + * Either because it has not yet tried, + * or it did and it was successful + * or it did, was not successful, but it should not retry + */ + private static final AtomicBoolean shouldTryToReadHuaweiAppGalleryReferrer = new AtomicBoolean(true); + + public static ReferrerDetails getHuaweiAdsInstallReferrer(Context context, final ILogger logger) { + + if (!shouldTryToReadHuaweiAdsReferrer.get()) { + logger.debug("Should not try to read HuaweiAdsInstallReferrer"); + return null; + } + + if (!resolveContentProvider(context, REFERRER_PROVIDER_AUTHORITY)) { + return null; + } + + Cursor cursor = null; + + try { + Uri uri = Uri.parse(REFERRER_PROVIDER_URI); + ContentResolver contentResolver = context.getContentResolver(); + String[] packageName = new String[] { context.getPackageName() }; + cursor = contentResolver.query(uri, null, null, packageName, null); + + if (cursor != null && cursor.moveToFirst()) { + + String referrerHuaweiAds = cursor.getString(COLUMN_INDEX_REFERRER); + + logger.debug("HuaweiAdsInstallReferrer index_referrer[%s]", referrerHuaweiAds); + + String clickTime = cursor.getString(COLUMN_INDEX_CLICK_TIME); + String installTime = cursor.getString(COLUMN_INDEX_INSTALL_TIME); + + logger.debug("HuaweiAdsInstallReferrer " + + "clickTime[%s] installTime[%s]", clickTime, installTime ); + + long referrerClickTimestampSeconds = Long.parseLong(clickTime); + long installBeginTimestampSeconds = Long.parseLong(installTime); + + if (isValidHuaweiAdsInstallReferrer(referrerHuaweiAds)) { + return new ReferrerDetails(referrerHuaweiAds, + referrerClickTimestampSeconds, + installBeginTimestampSeconds); + } + + } else { + logger.debug("HuaweiAdsInstallReferrer fail to read referrer for " + + "package [%s] and content uri [%s]", + context.getPackageName(), uri.toString()); + } + + shouldTryToReadHuaweiAdsReferrer.set(false); + + } catch (Exception e) { + logger.debug("HuaweiAdsInstallReferrer error [%s]", e.getMessage()); + } finally { + if (cursor != null) { + cursor.close(); + } + } + + return null; + } + + public static ReferrerDetails getHuaweiAppGalleryInstallReferrer(Context context, final ILogger logger) { + if (!shouldTryToReadHuaweiAppGalleryReferrer.get()) { + logger.debug("Should not try to read HuaweiAppGalleryInstallReferrer"); + return null; + } + + if (!resolveContentProvider(context, REFERRER_PROVIDER_AUTHORITY)) { + return null; + } + + Cursor cursor = null; + + try { + Uri uri = Uri.parse(REFERRER_PROVIDER_URI); + ContentResolver contentResolver = context.getContentResolver(); + String[] packageName = new String[] { context.getPackageName() }; + cursor = contentResolver.query(uri, null, null, packageName, null); + + if (cursor != null && cursor.moveToFirst()) { + + String referrerHuaweiAppGallery = cursor.getString(COLUMN_INDEX_TRACK_ID); + + logger.debug("HuaweiAppGalleryInstallReferrer index_track_id[%s]", referrerHuaweiAppGallery); + + String clickTime = cursor.getString(COLUMN_INDEX_CLICK_TIME); + String installTime = cursor.getString(COLUMN_INDEX_INSTALL_TIME); + + logger.debug("HuaweiAppGalleryInstallReferrer " + + "clickTime[%s] installTime[%s]", clickTime, installTime ); + + long referrerClickTimestampSeconds = Long.parseLong(clickTime); + long installBeginTimestampSeconds = Long.parseLong(installTime); + + if (isValidHuaweiAppGalleryInstallReferrer(referrerHuaweiAppGallery)) { + return new ReferrerDetails(referrerHuaweiAppGallery, + referrerClickTimestampSeconds, + installBeginTimestampSeconds); + } + + } else { + logger.debug("HuaweiAppGalleryInstallReferrer fail to read referrer for " + + "package [%s] and content uri [%s]", + context.getPackageName(), uri.toString()); + } + + shouldTryToReadHuaweiAppGalleryReferrer.set(false); + + } catch (Exception e) { + logger.debug("HuaweiAppGalleryInstallReferrer error [%s]", e.getMessage()); + } finally { + if (cursor != null) { + cursor.close(); + } + } + + return null; + } + + private static boolean resolveContentProvider(final Context applicationContext, + final String authority) { + try { + return (applicationContext.getPackageManager() + .resolveContentProvider(authority, 0) != null); + + } catch (Exception e) { + return false; + } + } + + private static boolean isValidHuaweiAdsInstallReferrer(String referrerHuaweiAds) { + if (referrerHuaweiAds == null) { + return false; + } + + if (referrerHuaweiAds.isEmpty()) { + return false; + } + + return true; + } + + private static boolean isValidHuaweiAppGalleryInstallReferrer(String referrerHuaweiAppGallery) { + if (referrerHuaweiAppGallery == null) { + return false; + } + + if (referrerHuaweiAppGallery.isEmpty()) { + return false; + } + + return true; + } +} diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/Util.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/Util.java new file mode 100644 index 000000000..6f4cb7739 --- /dev/null +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/Util.java @@ -0,0 +1,24 @@ +package com.adjust.sdk.huawei; + +import android.content.Context; + +import com.adjust.sdk.ILogger; +import com.adjust.sdk.ReferrerDetails; + +public class Util { + public synchronized static ReferrerDetails getHuaweiAdsInstallReferrerDetails(Context context, ILogger logger) { + if (!AdjustHuaweiReferrer.shouldReadHuaweiReferrer) { + return null; + } + + return HuaweiReferrerClient.getHuaweiAdsInstallReferrer(context, logger); + } + + public synchronized static ReferrerDetails getHuaweiAppGalleryInstallReferrerDetails(Context context, ILogger logger) { + if (!AdjustHuaweiReferrer.shouldReadHuaweiReferrer) { + return null; + } + + return HuaweiReferrerClient.getHuaweiAppGalleryInstallReferrer(context, logger); + } +} diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/res/values/strings.xml b/Adjust/sdk-plugin-huawei-referrer/src/main/res/values/strings.xml new file mode 100644 index 000000000..56100320c --- /dev/null +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + AdjustPluginHuaweiReferrer + diff --git a/Adjust/settings.gradle b/Adjust/settings.gradle index cbec02925..5980cfe94 100644 --- a/Adjust/settings.gradle +++ b/Adjust/settings.gradle @@ -1,3 +1,3 @@ -include ':sdk-core', ':sdk-plugin-webbridge', ':sdk-plugin-oaid', ':sdk-plugin-sociomantic', ':sdk-plugin-trademob', ':sdk-plugin-imei', ':sdk-plugin-criteo', ':sdk-plugin-xiaomi-referrer', ':sdk-plugin-samsung-referrer', ':sdk-plugin-vivo-referrer', ':sdk-plugin-samsung-clouddev' +include ':sdk-core', ':sdk-plugin-webbridge', ':sdk-plugin-oaid', ':sdk-plugin-sociomantic', ':sdk-plugin-trademob', ':sdk-plugin-imei', ':sdk-plugin-criteo', ':sdk-plugin-xiaomi-referrer', ':sdk-plugin-samsung-referrer', ':sdk-plugin-vivo-referrer', ':sdk-plugin-samsung-clouddev', ':sdk-plugin-huawei-referrer' include ':test-options', ':test-unit', ':test-library', ':test-app-core', ':test-kotlin', ':test-app-webbridge' include ':example-app-java', ':example-app-kotlin', ':example-app-tv', ':example-app-webbridge', ':example-app-fbpixel', ':example-app-keyboard' From 6571b25985ee1c8baeec50138dac8d79b77a7626 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 5 Apr 2024 15:56:52 +0200 Subject: [PATCH 018/540] refac: clean up --- Adjust/example-app-java/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/Adjust/example-app-java/build.gradle b/Adjust/example-app-java/build.gradle index a45d1eb63..5566d0799 100644 --- a/Adjust/example-app-java/build.gradle +++ b/Adjust/example-app-java/build.gradle @@ -38,5 +38,4 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.0.2' implementation project(':sdk-core') - implementation project(path: ':sdk-plugin-huawei-referrer') } From 4d4ef1bf98a8b7a57f82cc3170af3cfd256c688d Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 10 Apr 2024 11:28:04 +0200 Subject: [PATCH 019/540] refac: add OnVivoInstallReferrerReadListener.java --- .../main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java | 4 ++++ .../sdk/vivo/OnVivoInstallReferrerReadListener.java | 8 ++++++++ 2 files changed, 12 insertions(+) create mode 100644 Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/OnVivoInstallReferrerReadListener.java diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java index 583652ceb..81065472e 100644 --- a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java +++ b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java @@ -6,6 +6,10 @@ public class AdjustVivoReferrer { static boolean shouldReadVivoReferrer = true; + public static void getVivoInstallReferrer(Context context,OnVivoInstallReferrerReadListener onVivoInstallReferrerReadListener){ + + } + public static void readVivoReferrer(Context context) { shouldReadVivoReferrer = true; } diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/OnVivoInstallReferrerReadListener.java b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/OnVivoInstallReferrerReadListener.java new file mode 100644 index 000000000..1840193ae --- /dev/null +++ b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/OnVivoInstallReferrerReadListener.java @@ -0,0 +1,8 @@ +package com.adjust.sdk.vivo; + +import com.adjust.sdk.ReferrerDetails; + +public interface OnVivoInstallReferrerReadListener { + void onVivoInstallReferrerRead(ReferrerDetails referrerDetails); + void onFailure(String message); +} From 604e1b8f43449d031fe47930bc873bd3354273fb Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 8 Apr 2024 15:56:30 +0200 Subject: [PATCH 020/540] refac: remove disable third party sharing logic --- .../java/com/adjust/sdk/ActivityHandler.java | 59 +-------------- .../src/main/java/com/adjust/sdk/Adjust.java | 10 --- .../java/com/adjust/sdk/AdjustInstance.java | 23 ------ .../java/com/adjust/sdk/IActivityHandler.java | 2 - .../java/com/adjust/sdk/PackageBuilder.java | 73 ------------------- .../adjust/sdk/SharedPreferencesManager.java | 15 ---- .../src/main/assets/adjust.js | 6 -- .../sdk/webbridge/AdjustBridgeInstance.java | 8 -- .../adjust/testapp/AdjustCommandExecutor.java | 5 -- .../src/main/assets/command_executor.js | 5 -- 10 files changed, 2 insertions(+), 204 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index a82fb1793..5eea7044d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -676,16 +676,6 @@ public void run() { }); } - @Override - public void disableThirdPartySharing() { - executor.submit(new Runnable() { - @Override - public void run() { - disableThirdPartySharingI(); - } - }); - } - @Override public void trackThirdPartySharing(final AdjustThirdPartySharing adjustThirdPartySharing) { executor.submit(new Runnable() { @@ -1188,10 +1178,7 @@ private void startI() { } else { SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(getContext()); - // check if disable third party sharing request came, then send it first - if (sharedPreferencesManager.getDisableThirdPartySharing()) { - disableThirdPartySharingI(); - } + // check if third party sharing request came, then send it first for (AdjustThirdPartySharing adjustThirdPartySharing : adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray) { @@ -1246,10 +1233,7 @@ private void startFirstSessionI() { } else { processCoppaComplianceI(); - // check if disable third party sharing request came, then send it first - if (sharedPreferencesManager.getDisableThirdPartySharing()) { - disableThirdPartySharingI(); - } + // check if third party sharing request came, then send it first for (AdjustThirdPartySharing adjustThirdPartySharing : adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray) { @@ -1279,7 +1263,6 @@ private void startFirstSessionI() { writeActivityStateI(); sharedPreferencesManager.removePushToken(); sharedPreferencesManager.removeGdprForgetMe(); - sharedPreferencesManager.removeDisableThirdPartySharing(); // check for cached deep links processCachedDeeplinkI(); @@ -1807,9 +1790,6 @@ private void setEnabledI(boolean enabled) { } else { processCoppaComplianceI(); - if (sharedPreferencesManager.getDisableThirdPartySharing()) { - disableThirdPartySharingI(); - } for (AdjustThirdPartySharing adjustThirdPartySharing : adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray) { @@ -2421,41 +2401,6 @@ private void gdprForgetMeI() { } } - private void disableThirdPartySharingI() { - // cache the disable third party sharing request, so that the request order maintains - // even this call returns before making server request - SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(getContext()); - sharedPreferencesManager.setDisableThirdPartySharing(); - - if (!checkActivityStateI(activityState)) { return; } - if (!isEnabledI()) { return; } - if (activityState.isGdprForgotten) { return; } - if (activityState.isThirdPartySharingDisabled) { return; } - if (adjustConfig.coppaCompliantEnabled) { - logger.warn("Call to disable third party sharing API ignored, already done when COPPA enabled"); - return; - } - - activityState.isThirdPartySharingDisabled = true; - writeActivityStateI(); - - long now = System.currentTimeMillis(); - PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now); - packageBuilder.internalState = internalState; - - ActivityPackage activityPackage = packageBuilder.buildDisableThirdPartySharingPackage(); - packageHandler.addPackage(activityPackage); - - // Removed the cached disable third party sharing flag. - sharedPreferencesManager.removeDisableThirdPartySharing(); - - if (adjustConfig.eventBufferingEnabled) { - logger.info("Buffered event %s", activityPackage.getSuffix()); - } else { - packageHandler.sendFirstPackage(); - } - } - private void trackThirdPartySharingI(final AdjustThirdPartySharing adjustThirdPartySharing) { if (!checkActivityStateI(activityState)) { adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray.add( diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 020167fc5..91824b97a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -262,16 +262,6 @@ public static void gdprForgetMe(final Context context) { adjustInstance.gdprForgetMe(extractApplicationContext(context)); } - /** - * Called to disable the third party sharing. - * - * @param context Application context - */ - public static void disableThirdPartySharing(final Context context) { - AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.disableThirdPartySharing(extractApplicationContext(context)); - } - public static void trackThirdPartySharing( final AdjustThirdPartySharing adjustThirdPartySharing) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 87cd75ee8..4a3735631 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -452,20 +452,6 @@ public void gdprForgetMe(final Context context) { } } - /** - * Called to disable the third party sharing. - * - * @param context Application context - */ - public void disableThirdPartySharing(final Context context) { - if (!checkActivityHandler("disable third party sharing", true)) { - saveDisableThirdPartySharing(context); - return; - } - - activityHandler.disableThirdPartySharing(); - } - public void trackThirdPartySharing(final AdjustThirdPartySharing adjustThirdPartySharing) { if (!checkActivityHandler("third party sharing", true)) { preLaunchActions.preLaunchAdjustThirdPartySharingArray.add(adjustThirdPartySharing); @@ -635,15 +621,6 @@ private void saveGdprForgetMe(final Context context) { SharedPreferencesManager.getDefaultInstance(context).setGdprForgetMe(); } - /** - * Save disable third party sharing choice to shared preferences. - * - * @param context Application context - */ - private void saveDisableThirdPartySharing(final Context context) { - SharedPreferencesManager.getDefaultInstance(context).setDisableThirdPartySharing(); - } - /** * Save deep link to shared preferences. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index ecb035737..7ad64a4de 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -69,8 +69,6 @@ public interface IActivityHandler { void gdprForgetMe(); - void disableThirdPartySharing(); - void trackThirdPartySharing(AdjustThirdPartySharing adjustThirdPartySharing); void trackMeasurementConsent(boolean consentMeasurement); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 11ee5fef5..cb66a255b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -154,16 +154,6 @@ ActivityPackage buildGdprPackage() { return gdprPackage; } - ActivityPackage buildDisableThirdPartySharingPackage() { - Map parameters = getDisableThirdPartySharingParameters(); - ActivityPackage activityPackage = getDefaultActivityPackage(ActivityKind.DISABLE_THIRD_PARTY_SHARING); - activityPackage.setPath("/disable_third_party_sharing"); - activityPackage.setSuffix(""); - - activityPackage.setParameters(parameters); - return activityPackage; - } - ActivityPackage buildThirdPartySharingPackage( final AdjustThirdPartySharing adjustThirdPartySharing) { @@ -707,69 +697,6 @@ private Map getGdprParameters() { return parameters; } - private Map getDisableThirdPartySharingParameters() { - Map parameters = new HashMap(); - - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); - - // Check if plugin is used and if yes, add read parameters. - if (deviceInfo.imeiParameters != null) { - parameters.putAll(deviceInfo.imeiParameters); - } - - // Check if oaid plugin is used and if yes, add the parameter - if (deviceInfo.oaidParameters != null) { - parameters.putAll(deviceInfo.oaidParameters); - } - - // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); - PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); - PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); - PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); - PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); - PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); - PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); - PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); - - if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { - logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + - "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); - PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); - } - - // Rest of the parameters. - PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); - PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); - PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); - PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); - PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); - PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); - PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); - PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); - PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); - PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); - PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); - PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); - PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); - PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); - PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); - - // google play games - PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); - - injectFeatureFlagsWithParameters(parameters); - - checkDeviceIds(parameters); - return parameters; - } - private Map getThirdPartySharingParameters (final AdjustThirdPartySharing adjustThirdPartySharing) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java index d3209ff03..52d2ebe00 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -37,9 +37,6 @@ public class SharedPreferencesManager { private static final String PREFS_KEY_GDPR_FORGET_ME = "gdpr_forget_me"; - private static final String PREFS_KEY_DISABLE_THIRD_PARTY_SHARING - = "disable_third_party_sharing"; - private static final String PREFS_KEY_DEEPLINK_URL = "deeplink_url"; private static final String PREFS_KEY_DEEPLINK_CLICK_TIME = "deeplink_click_time"; @@ -372,18 +369,6 @@ public synchronized void removeGdprForgetMe() { remove(PREFS_KEY_GDPR_FORGET_ME); } - public synchronized void setDisableThirdPartySharing() { - saveBoolean(PREFS_KEY_DISABLE_THIRD_PARTY_SHARING, true); - } - - public synchronized boolean getDisableThirdPartySharing() { - return getBoolean(PREFS_KEY_DISABLE_THIRD_PARTY_SHARING, false); - } - - public synchronized void removeDisableThirdPartySharing() { - remove(PREFS_KEY_DISABLE_THIRD_PARTY_SHARING); - } - public synchronized void saveDeeplink(final Uri deeplink, final long clickTime) { if (deeplink == null) { return; diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index 4e6d2572c..497bb1540 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -135,12 +135,6 @@ var Adjust = { } }, - disableThirdPartySharing: function() { - if (AdjustBridge) { - AdjustBridge.disableThirdPartySharing(); - } - }, - trackThirdPartySharing: function(adjustThirdPartySharing) { if (AdjustBridge) { AdjustBridge.trackThirdPartySharing(JSON.stringify(adjustThirdPartySharing)); diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 199c95df8..3c67b4b90 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -634,14 +634,6 @@ public void gdprForgetMe() { Adjust.gdprForgetMe(application.getApplicationContext()); } - @JavascriptInterface - public void disableThirdPartySharing() { - if (!isInitialized()) { - return; - } - Adjust.disableThirdPartySharing(application.getApplicationContext()); - } - @JavascriptInterface public void trackThirdPartySharing(String adjustThirdPartySharingString) { if (!isInitialized()) { diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 7def26a2f..5d9d343d8 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -88,7 +88,6 @@ public void executeCommand(final Command sentCommand) { case "openDeeplink": openDeeplink(); break; case "sendReferrer": sendReferrer(); break; case "gdprForgetMe": gdprForgetMe(); break; - case "disableThirdPartySharing": disableThirdPartySharing(); break; case "thirdPartySharing" : thirdPartySharing(); break; case "measurementConsent" : measurementConsent(); break; case "trackAdRevenueV2" : trackAdRevenueV2(); break; @@ -669,10 +668,6 @@ private void gdprForgetMe() { Adjust.gdprForgetMe(this.context); } - private void disableThirdPartySharing() { - Adjust.disableThirdPartySharing(this.context); - } - private void thirdPartySharing() { String isEnabledString = command.getFirstParameterValue("isEnabled"); diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index bff3589e6..fc550f2d8 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -133,7 +133,6 @@ AdjustCommandExecutor.prototype.executeCommand = function(command, idx) { case "openDeeplink" : this.openDeeplink(command.params); break; case "sendReferrer" : this.sendReferrer(command.params); break; case "gdprForgetMe" : this.gdprForgetMe(command.params); break; - case "disableThirdPartySharing" : this.disableThirdPartySharing(command.params); break; case "thirdPartySharing" : this.thirdPartySharing(command.params); break; case "measurementConsent" : this.measurementConsent(command.params); break; case "trackAdRevenue" : this.trackAdRevenue(command.params); break; @@ -549,10 +548,6 @@ AdjustCommandExecutor.prototype.gdprForgetMe = function(params) { Adjust.gdprForgetMe(); } -AdjustCommandExecutor.prototype.disableThirdPartySharing = function(params) { - Adjust.disableThirdPartySharing(); -} - AdjustCommandExecutor.prototype.thirdPartySharing = function(params) { var isEnabled = null; if ('isEnabled' in params) { From d9b0418ca4bd20f9cafd5bda228b1d64e69113c3 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 10 Apr 2024 13:21:49 +0200 Subject: [PATCH 021/540] refac: remove disable third party sharing traces --- .../sdk-core/src/main/java/com/adjust/sdk/ActivityKind.java | 4 ---- .../src/main/java/com/adjust/sdk/ActivityState.java | 6 ------ 2 files changed, 10 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityKind.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityKind.java index 09c9af098..ebee2f705 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityKind.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityKind.java @@ -30,8 +30,6 @@ public static ActivityKind fromString(String string) { return INFO; } else if ("gdpr".equals(string)) { return GDPR; - } else if ("disable_third_party_sharing".equals(string)) { - return DISABLE_THIRD_PARTY_SHARING; } else if ("ad_revenue".equals(string)) { return AD_REVENUE; } else if ("subscription".equals(string)) { @@ -62,8 +60,6 @@ public String toString() { return "info"; case GDPR: return "gdpr"; - case DISABLE_THIRD_PARTY_SHARING: - return "disable_third_party_sharing"; case AD_REVENUE: return "ad_revenue"; case SUBSCRIPTION: diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java index df170f05f..702727e39 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java @@ -27,7 +27,6 @@ public class ActivityState implements Serializable, Cloneable { new ObjectStreamField("uuid", String.class), new ObjectStreamField("enabled", boolean.class), new ObjectStreamField("isGdprForgotten", boolean.class), - new ObjectStreamField("isThirdPartySharingDisabled", boolean.class), new ObjectStreamField("askingAttribution", boolean.class), new ObjectStreamField("eventCount", int.class), new ObjectStreamField("sessionCount", int.class), @@ -74,7 +73,6 @@ public class ActivityState implements Serializable, Cloneable { protected String uuid; protected boolean enabled; protected boolean isGdprForgotten; - protected boolean isThirdPartySharingDisabled; protected boolean isThirdPartySharingDisabledForCoppa; protected boolean askingAttribution; @@ -136,7 +134,6 @@ protected ActivityState() { uuid = Util.createUuid(); enabled = true; isGdprForgotten = false; - isThirdPartySharingDisabled = false; isThirdPartySharingDisabledForCoppa = false; askingAttribution = false; eventCount = 0; // no events yet @@ -223,7 +220,6 @@ public boolean equals(Object other) { if (!Util.equalString(uuid, otherActivityState.uuid)) return false; if (!Util.equalBoolean(enabled, otherActivityState.enabled)) return false; if (!Util.equalBoolean(isGdprForgotten, otherActivityState.isGdprForgotten)) return false; - if (!Util.equalBoolean(isThirdPartySharingDisabled, otherActivityState.isThirdPartySharingDisabled)) return false; if (!Util.equalBoolean(isThirdPartySharingDisabledForCoppa, otherActivityState.isThirdPartySharingDisabledForCoppa)) return false; if (!Util.equalBoolean(askingAttribution, otherActivityState.askingAttribution)) return false; if (!Util.equalInt(eventCount, otherActivityState.eventCount)) return false; @@ -272,7 +268,6 @@ public int hashCode() { hashCode = Util.hashString(uuid, hashCode); hashCode = Util.hashBoolean(enabled, hashCode); hashCode = Util.hashBoolean(isGdprForgotten, hashCode); - hashCode = Util.hashBoolean(isThirdPartySharingDisabled, hashCode); hashCode = Util.hashBoolean(isThirdPartySharingDisabledForCoppa, hashCode); hashCode = Util.hashBoolean(askingAttribution, hashCode); hashCode = 37 * hashCode + eventCount; @@ -330,7 +325,6 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo uuid = Util.readStringField(fields, "uuid", null); enabled = Util.readBooleanField(fields, "enabled", true); isGdprForgotten = Util.readBooleanField(fields, "isGdprForgotten", false); - isThirdPartySharingDisabled = Util.readBooleanField(fields, "isThirdPartySharingDisabled", false); isThirdPartySharingDisabledForCoppa = Util.readBooleanField(fields, "isThirdPartySharingDisabledForCoppa", false); askingAttribution = Util.readBooleanField(fields, "askingAttribution", false); From 1b4162effad4d7c9e951aaf495f290dd53aa78f4 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 9 Apr 2024 09:39:44 +0200 Subject: [PATCH 022/540] refac: add setOnGooglePlayInstallReferrerReadListener to the AdjustConfig.java --- .../adjust/examples/GlobalApplication.java | 5 +++++ .../java/com/adjust/sdk/ActivityHandler.java | 1 + .../java/com/adjust/sdk/AdjustConfig.java | 14 ++++++++----- ...GooglePlayInstallReferrerReadListener.java | 5 +++++ .../java/com/adjust/sdk/ReferrerDetails.java | 20 +++++++++++++++++++ 5 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 2c569df99..d351a4b3a 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -16,10 +16,12 @@ import com.adjust.sdk.OnDeeplinkResponseListener; import com.adjust.sdk.OnEventTrackingFailedListener; import com.adjust.sdk.OnEventTrackingSucceededListener; +import com.adjust.sdk.OnGooglePlayInstallReferrerReadListener; import com.adjust.sdk.OnSessionTrackingFailedListener; import com.adjust.sdk.OnSessionTrackingSucceededListener; import com.adjust.sdk.AdjustSessionFailure; import com.adjust.sdk.AdjustSessionSuccess; +import com.adjust.sdk.ReferrerDetails; /** * Created by pfms on 17/12/14. @@ -94,6 +96,9 @@ public boolean launchReceivedDeeplink(Uri deeplink) { } }); + config.setOnGooglePlayInstallReferrerReadListener((referrerDetails, referrerApi) -> + Log.d("example", "referrerApi : " + referrerApi + " " + referrerDetails.toString())); + // Set default tracker. // config.setDefaultTracker("{YourDefaultTracker}"); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 5eea7044d..d5160fa31 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -986,6 +986,7 @@ public void run() { installReferrer = new InstallReferrer(adjustConfig.context, new InstallReferrerReadListener() { @Override public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { + adjustConfig.onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(referrerDetails,referrerApi); sendInstallReferrer(referrerDetails, referrerApi); } }); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 7cd8f2426..392dab066 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -2,8 +2,6 @@ import android.content.Context; -import java.util.List; - /** * Created by pfms on 06/11/14. */ @@ -20,6 +18,7 @@ public class AdjustConfig { boolean eventBufferingEnabled; String defaultTracker; OnAttributionChangedListener onAttributionChangedListener; + OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener; Class deepLinkComponent; OnEventTrackingSucceededListener onEventTrackingSucceededListener; OnEventTrackingFailedListener onEventTrackingFailedListener; @@ -110,7 +109,9 @@ public void setSdkPrefix(String sdkPrefix) { this.sdkPrefix = sdkPrefix; } - public void setProcessName(String processName) { this.processName = processName; } + public void setProcessName(String processName) { + this.processName = processName; + } public void setDefaultTracker(String defaultTracker) { this.defaultTracker = defaultTracker; @@ -120,6 +121,10 @@ public void setOnAttributionChangedListener(OnAttributionChangedListener onAttri this.onAttributionChangedListener = onAttributionChangedListener; } + public void setOnGooglePlayInstallReferrerReadListener(OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { + this.onGooglePlayInstallReferrerReadListener = onGooglePlayInstallReferrerReadListener; + } + public void setDeepLinkComponent(Class deepLinkComponent) { this.deepLinkComponent = deepLinkComponent; } @@ -205,8 +210,7 @@ public void setUrlStrategy(String urlStrategy) { && !urlStrategy.equals(URL_STRATEGY_CN_ONLY) && !urlStrategy.equals(DATA_RESIDENCY_EU) && !urlStrategy.equals(DATA_RESIDENCY_TR) - && !urlStrategy.equals(DATA_RESIDENCY_US)) - { + && !urlStrategy.equals(DATA_RESIDENCY_US)) { logger.warn("Unrecognised url strategy %s", urlStrategy); } this.urlStrategy = urlStrategy; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java new file mode 100644 index 000000000..b7bbf23eb --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java @@ -0,0 +1,5 @@ +package com.adjust.sdk; + +public interface OnGooglePlayInstallReferrerReadListener { + void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi); +} diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ReferrerDetails.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ReferrerDetails.java index e84beaa8a..ef2f0c770 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ReferrerDetails.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ReferrerDetails.java @@ -58,4 +58,24 @@ public ReferrerDetails(final String installReferrer, isClick); } + + public String toString() { + return Util.formatString( + " installReferrer : %s" + + " referrerClickTimestampSeconds : %d" + + " installBeginTimestampSeconds : %d" + + " referrerClickTimestampServerSeconds : %d" + + " installBeginTimestampServerSeconds : %d" + + " installVersion : %s" + + " googlePlayInstant : %s" + + " isClick: %s", + installReferrer, + referrerClickTimestampSeconds, + installBeginTimestampSeconds, + referrerClickTimestampServerSeconds, + installBeginTimestampServerSeconds, + installVersion, + googlePlayInstant, + isClick); + } } From eabe0ec380fef68474ce9e9b145fe9a2dfa0d7ea Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 9 Apr 2024 11:34:54 +0200 Subject: [PATCH 023/540] refac: move setOnSamsungInstallReferrerReadListener from AdjustConfig.java to Adjust.java --- .../java/com/adjust/examples/GlobalApplication.java | 6 +++--- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 8 +++++++- .../sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 4 ++++ .../src/main/java/com/adjust/sdk/AdjustConfig.java | 5 ----- .../src/main/java/com/adjust/sdk/AdjustInstance.java | 11 +++++++++++ .../main/java/com/adjust/sdk/IActivityHandler.java | 2 ++ 6 files changed, 27 insertions(+), 9 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index d351a4b3a..0aa108565 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -96,9 +96,6 @@ public boolean launchReceivedDeeplink(Uri deeplink) { } }); - config.setOnGooglePlayInstallReferrerReadListener((referrerDetails, referrerApi) -> - Log.d("example", "referrerApi : " + referrerApi + " " + referrerDetails.toString())); - // Set default tracker. // config.setDefaultTracker("{YourDefaultTracker}"); @@ -150,6 +147,9 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Initialise the adjust SDK. Adjust.onCreate(config); + Adjust.setOnGooglePlayInstallReferrerReadListener((referrerDetails, referrerApi) -> + Log.d("example", "referrerApi : " + referrerApi + " " + referrerDetails.toString())); + // Abort delay for the first session introduced with setDelayStart method. // Adjust.sendFirstPackages(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index d5160fa31..98211ab95 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -84,6 +84,7 @@ public class ActivityHandler implements IActivityHandler { private InstallReferrer installReferrer; private InstallReferrerMeta installReferrerMeta; private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; + private OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener; @Override public void teardown() { @@ -276,6 +277,11 @@ public SessionParameters getSessionParameters() { return sessionParameters; } + @Override + public void setOnGooglePlayInstallReferrerReadListener(OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { + this.onGooglePlayInstallReferrerReadListener = onGooglePlayInstallReferrerReadListener; + } + @Override public void init(AdjustConfig adjustConfig) { this.adjustConfig = adjustConfig; @@ -986,7 +992,7 @@ public void run() { installReferrer = new InstallReferrer(adjustConfig.context, new InstallReferrerReadListener() { @Override public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { - adjustConfig.onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(referrerDetails,referrerApi); + onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(referrerDetails,referrerApi); sendInstallReferrer(referrerDetails, referrerApi); } }); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 91824b97a..99e0c36ae 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -344,6 +344,10 @@ public static AdjustAttribution getAttribution() { return adjustInstance.getAttribution(); } + public static void setOnGooglePlayInstallReferrerReadListener(OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { + AdjustInstance adjustInstance = Adjust.getDefaultInstance(); + adjustInstance.setOnGooglePlayInstallReferrerReadListener(onGooglePlayInstallReferrerReadListener); + } /** * Called to get native SDK version string. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 392dab066..a5ee12032 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -18,7 +18,6 @@ public class AdjustConfig { boolean eventBufferingEnabled; String defaultTracker; OnAttributionChangedListener onAttributionChangedListener; - OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener; Class deepLinkComponent; OnEventTrackingSucceededListener onEventTrackingSucceededListener; OnEventTrackingFailedListener onEventTrackingFailedListener; @@ -121,10 +120,6 @@ public void setOnAttributionChangedListener(OnAttributionChangedListener onAttri this.onAttributionChangedListener = onAttributionChangedListener; } - public void setOnGooglePlayInstallReferrerReadListener(OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { - this.onGooglePlayInstallReferrerReadListener = onGooglePlayInstallReferrerReadListener; - } - public void setDeepLinkComponent(Class deepLinkComponent) { this.deepLinkComponent = deepLinkComponent; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 4a3735631..357aba38e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -51,6 +51,9 @@ public PreLaunchActions() { private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; + public OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener; + + /** * Base path for Adjust packages. */ @@ -528,6 +531,14 @@ public String getSdkVersion() { return Util.getSdkVersion(); } + public void setOnGooglePlayInstallReferrerReadListener(OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { + if (!checkActivityHandler("onPause")) { + return; + } + activityHandler.setOnGooglePlayInstallReferrerReadListener(onGooglePlayInstallReferrerReadListener); + } + + /** * Check if ActivityHandler instance is set or not. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 7ad64a4de..d5b35ffba 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -96,4 +96,6 @@ public interface IActivityHandler { SessionParameters getSessionParameters(); ActivityHandler.InternalState getInternalState(); + + void setOnGooglePlayInstallReferrerReadListener(OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener); } From 982e79cf4e1d4b4697622e319bffdbda6e91e34b Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 9 Apr 2024 13:40:14 +0200 Subject: [PATCH 024/540] refac: check Null before invoking the onInstallReferrerRead --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 98211ab95..dd54076be 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -992,7 +992,9 @@ public void run() { installReferrer = new InstallReferrer(adjustConfig.context, new InstallReferrerReadListener() { @Override public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { - onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(referrerDetails,referrerApi); + if (onGooglePlayInstallReferrerReadListener != null) { + onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(referrerDetails, referrerApi); + } sendInstallReferrer(referrerDetails, referrerApi); } }); From 175ae4a2c8b954b3b8c331c0d9268d2573f3c3a7 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 9 Apr 2024 16:01:09 +0200 Subject: [PATCH 025/540] refac: make InstallReferrerGetter individually handle inside of AdjustInstance --- .../adjust/examples/GlobalApplication.java | 9 ++++- .../java/com/adjust/sdk/ActivityHandler.java | 9 ----- .../src/main/java/com/adjust/sdk/Adjust.java | 4 +-- .../java/com/adjust/sdk/AdjustInstance.java | 35 +++++++++---------- .../java/com/adjust/sdk/IActivityHandler.java | 1 - 5 files changed, 27 insertions(+), 31 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 0aa108565..913169307 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -2,8 +2,10 @@ import android.app.Activity; import android.app.Application; +import android.content.Context; import android.net.Uri; import android.os.Bundle; +import android.os.Handler; import android.util.Log; import com.adjust.sdk.Adjust; @@ -27,10 +29,15 @@ * Created by pfms on 17/12/14. */ public class GlobalApplication extends Application { + + Context context; + @Override public void onCreate() { super.onCreate(); + + context = this; // Configure adjust SDK. String appToken = "2fm9gkqubvpc"; String environment = AdjustConfig.ENVIRONMENT_SANDBOX; @@ -147,7 +154,7 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Initialise the adjust SDK. Adjust.onCreate(config); - Adjust.setOnGooglePlayInstallReferrerReadListener((referrerDetails, referrerApi) -> + Adjust.setOnGooglePlayInstallReferrerReadListener(this, (referrerDetails, referrerApi) -> Log.d("example", "referrerApi : " + referrerApi + " " + referrerDetails.toString())); // Abort delay for the first session introduced with setDelayStart method. diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index dd54076be..5eea7044d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -84,7 +84,6 @@ public class ActivityHandler implements IActivityHandler { private InstallReferrer installReferrer; private InstallReferrerMeta installReferrerMeta; private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; - private OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener; @Override public void teardown() { @@ -277,11 +276,6 @@ public SessionParameters getSessionParameters() { return sessionParameters; } - @Override - public void setOnGooglePlayInstallReferrerReadListener(OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { - this.onGooglePlayInstallReferrerReadListener = onGooglePlayInstallReferrerReadListener; - } - @Override public void init(AdjustConfig adjustConfig) { this.adjustConfig = adjustConfig; @@ -992,9 +986,6 @@ public void run() { installReferrer = new InstallReferrer(adjustConfig.context, new InstallReferrerReadListener() { @Override public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { - if (onGooglePlayInstallReferrerReadListener != null) { - onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(referrerDetails, referrerApi); - } sendInstallReferrer(referrerDetails, referrerApi); } }); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 99e0c36ae..c49fce8d2 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -344,9 +344,9 @@ public static AdjustAttribution getAttribution() { return adjustInstance.getAttribution(); } - public static void setOnGooglePlayInstallReferrerReadListener(OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { + public static void setOnGooglePlayInstallReferrerReadListener(Context context,OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.setOnGooglePlayInstallReferrerReadListener(onGooglePlayInstallReferrerReadListener); + adjustInstance.setOnGooglePlayInstallReferrerReadListener(context ,onGooglePlayInstallReferrerReadListener); } /** * Called to get native SDK version string. diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 357aba38e..40c0fcf80 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -50,10 +50,6 @@ public PreLaunchActions() { private PreLaunchActions preLaunchActions = new PreLaunchActions(); private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; - - public OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener; - - /** * Base path for Adjust packages. */ @@ -202,9 +198,9 @@ public void appWillOpenUrl(final Uri url, final Context context) { /** * Process the deep link that has opened an app and potentially get a resolved link. * - * @param url Deep link URL to process - * @param callback Callback where either resolved or echoed deep link will be sent. - * @param context Application context + * @param url Deep link URL to process + * @param callback Callback where either resolved or echoed deep link will be sent. + * @param context Application context */ public void processDeeplink(Uri url, Context context, OnDeeplinkResolvedListener callback) { // if resolution result is not wanted, fallback to default method @@ -252,8 +248,8 @@ public void sendReferrer(final String rawReferrer, final Context context) { /** * Called to process preinstall payload information sent with SYSTEM_INSTALLER_REFERRER intent. * - * @param referrer Preinstall referrer content - * @param context Application context + * @param referrer Preinstall referrer content + * @param context Application context */ public void sendPreinstallReferrer(final String referrer, final Context context) { // Check for referrer validity. If invalid, return. @@ -531,11 +527,14 @@ public String getSdkVersion() { return Util.getSdkVersion(); } - public void setOnGooglePlayInstallReferrerReadListener(OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { - if (!checkActivityHandler("onPause")) { - return; - } - activityHandler.setOnGooglePlayInstallReferrerReadListener(onGooglePlayInstallReferrerReadListener); + public void setOnGooglePlayInstallReferrerReadListener(Context context ,OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { + InstallReferrer installReferrer = new InstallReferrer(context, new InstallReferrerReadListener() { + @Override + public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { + onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(referrerDetails, referrerApi); + } + }); + installReferrer.startConnection(); } @@ -606,8 +605,8 @@ private void saveRawReferrer(final String rawReferrer, final long clickTime, fin /** * Save preinstall referrer to shared preferences. * - * @param referrer Preinstall referrer content - * @param context Application context + * @param referrer Preinstall referrer content + * @param context Application context */ private void savePreinstallReferrer(final String referrer, final Context context) { SharedPreferencesManager.getDefaultInstance(context).savePreinstallReferrer(referrer); @@ -664,8 +663,8 @@ private boolean isInstanceEnabled() { /** * Verify in app purchase from Google Play. * - * @param purchase AdjustPurchase object to be verified - * @param callback Callback to be pinged with the verification results + * @param purchase AdjustPurchase object to be verified + * @param callback Callback to be pinged with the verification results */ public void verifyPurchase(AdjustPurchase purchase, OnPurchaseVerificationFinishedListener callback) { if (!checkActivityHandler("verifyPurchase")) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index d5b35ffba..894e5b5b9 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -97,5 +97,4 @@ public interface IActivityHandler { ActivityHandler.InternalState getInternalState(); - void setOnGooglePlayInstallReferrerReadListener(OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener); } From 525f8aac763bbbbe44b3a8fdf37eb22e01a680cb Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 9 Apr 2024 16:21:43 +0200 Subject: [PATCH 026/540] refac: add onFail method in OnGooglePlayInstallReferrerReadListener.java and InstallReferrerReadListener.java --- .../adjust/examples/GlobalApplication.java | 14 ++++++-- .../java/com/adjust/sdk/ActivityHandler.java | 11 ++++++ .../java/com/adjust/sdk/AdjustInstance.java | 5 +++ .../java/com/adjust/sdk/InstallReferrer.java | 36 +++++++++++-------- .../sdk/InstallReferrerReadListener.java | 2 ++ ...GooglePlayInstallReferrerReadListener.java | 2 ++ 6 files changed, 54 insertions(+), 16 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 913169307..cbbc714c5 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -154,8 +154,18 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Initialise the adjust SDK. Adjust.onCreate(config); - Adjust.setOnGooglePlayInstallReferrerReadListener(this, (referrerDetails, referrerApi) -> - Log.d("example", "referrerApi : " + referrerApi + " " + referrerDetails.toString())); + Adjust.setOnGooglePlayInstallReferrerReadListener(this, new OnGooglePlayInstallReferrerReadListener() { + @Override + public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { + Log.d("example", "referrerApi : " + referrerApi + referrerDetails.toString()); + } + + @Override + public void onFail(String message) { + Log.d("example", "failed : " + message); + + } + }); // Abort delay for the first session introduced with setDelayStart method. // Adjust.sendFirstPackages(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 5eea7044d..f7a590e2a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -988,6 +988,12 @@ public void run() { public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { sendInstallReferrer(referrerDetails, referrerApi); } + + @Override + public void onFail(String message) { + logger.info(message); + } + }); installReferrerMeta = new InstallReferrerMeta(adjustConfig.context, adjustConfig.fbAppId, @@ -996,6 +1002,11 @@ public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referr public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { sendInstallReferrer(referrerDetails, referrerApi); } + + @Override + public void onFail(String message) { + logger.info(message); + } }); preLaunchActionsI(adjustConfig.preLaunchActions.preLaunchActionsArray); sendReftagReferrerI(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 40c0fcf80..1b3346725 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -533,6 +533,11 @@ public void setOnGooglePlayInstallReferrerReadListener(Context context ,OnGoogle public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(referrerDetails, referrerApi); } + + @Override + public void onFail(String message) { + onGooglePlayInstallReferrerReadListener.onFail(message); + } }); installReferrer.startConnection(); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrer.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrer.java index 100079033..32dad9932 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrer.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrer.java @@ -64,8 +64,8 @@ public class InstallReferrer implements InvocationHandler { /** * Boolean indicating whether service should be tried to read. * Either because it has not yet tried, - * or it did and it was successful - * or it did, was not successful, but it should not retry + * or it did and it was successful + * or it did, was not successful, but it should not retry */ private final AtomicBoolean shouldTryToRead; @@ -101,7 +101,7 @@ public class InstallReferrer implements InvocationHandler { /** * Default constructor. * - * @param context Application context + * @param context Application context * @param referrerCallback Callback for referrer information */ public InstallReferrer(final Context context, final InstallReferrerReadListener referrerCallback) { @@ -247,15 +247,22 @@ private void startConnection(final Class listenerClass, final Object listenerPro Reflection.invokeInstanceMethod(this.referrerClient, "startConnection", new Class[]{listenerClass}, listenerProxy); } catch (InvocationTargetException ex) { - // Check for an underlying root cause in the stack trace if (Util.hasRootCause(ex)) { - logger.error("InstallReferrer encountered an InvocationTargetException %s", + String failMessage = Util.formatString("InstallReferrer encountered an InvocationTargetException %s", Util.getRootCause(ex)); + referrerCallback.onFail(failMessage); + // Check for an underlying root cause in the stack trace + logger.error(failMessage); + }else { + referrerCallback.onFail("InstallReferrer encountered an InvocationTargetException"); } + } catch (Exception ex) { - logger.error("startConnection error (%s) thrown by (%s)", + String failMessage = Util.formatString("startConnection error (%s) thrown by (%s)", ex.getMessage(), ex.getClass().getCanonicalName()); + referrerCallback.onFail(failMessage); + logger.error(failMessage); } } @@ -264,18 +271,18 @@ private void startConnection(final Class listenerClass, final Object listenerPro */ @Override public Object invoke(final Object proxy, final Method method, final Object[] args) - throws Throwable - { + throws Throwable { executor.submit(new Runnable() { @Override - public - void run() { + public void run() { try { invokeI(proxy, method, args); } catch (Throwable throwable) { - logger.error("invoke error (%s) thrown by (%s)", + String failMessage = Util.formatString("invoke error (%s) thrown by (%s)", throwable.getMessage(), throwable.getClass().getCanonicalName()); + referrerCallback.onFail(failMessage); + logger.error(failMessage); } } }); @@ -284,8 +291,7 @@ void run() { } private Object invokeI(final Object proxy, final Method method, Object[] args) - throws Throwable - { + throws Throwable { if (method == null) { logger.error("InstallReferrer invoke method null"); return null; @@ -369,7 +375,9 @@ private void onInstallReferrerSetupFinishedIntI(final int responseCode) { // Stuff successfully read, try to send it. referrerCallback.onInstallReferrerRead(installReferrerDetails, Constants.REFERRER_API_GOOGLE); } catch (Exception e) { - logger.warn("Couldn't get install referrer from client (%s). Retrying...", e.getMessage()); + String failMessage = Util.formatString("Couldn't get install referrer from client (%s). Retrying...", e.getMessage()); + referrerCallback.onFail(failMessage); + logger.warn(failMessage); retryAtEnd = true; } break; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrerReadListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrerReadListener.java index dff0121d3..3a226ed28 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrerReadListener.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrerReadListener.java @@ -2,4 +2,6 @@ public interface InstallReferrerReadListener { void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi); + void onFail(String message); + } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java index b7bbf23eb..efbc6d8b4 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java @@ -2,4 +2,6 @@ public interface OnGooglePlayInstallReferrerReadListener { void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi); + void onFail(String message); + } From 75e5439da9b745c1ffb7e2d848262005f01a2fe9 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 10 Apr 2024 11:31:06 +0200 Subject: [PATCH 027/540] refac: rename setOnGooglePlayInstallReferrerReadListener to getGooglePlayInstallReferrer remove referrerApi from onInstallReferrerRead rename onFail to onFailure --- .../main/java/com/adjust/examples/GlobalApplication.java | 9 ++++----- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 4 +--- .../src/main/java/com/adjust/sdk/AdjustInstance.java | 6 ++---- .../sdk/OnGooglePlayInstallReferrerReadListener.java | 4 ++-- 4 files changed, 9 insertions(+), 14 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index cbbc714c5..a6314ab42 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -5,7 +5,6 @@ import android.content.Context; import android.net.Uri; import android.os.Bundle; -import android.os.Handler; import android.util.Log; import com.adjust.sdk.Adjust; @@ -154,14 +153,14 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Initialise the adjust SDK. Adjust.onCreate(config); - Adjust.setOnGooglePlayInstallReferrerReadListener(this, new OnGooglePlayInstallReferrerReadListener() { + Adjust.getGooglePlayInstallReferrer(this, new OnGooglePlayInstallReferrerReadListener() { @Override - public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { - Log.d("example", "referrerApi : " + referrerApi + referrerDetails.toString()); + public void onInstallReferrerRead(ReferrerDetails referrerDetails) { + Log.d("example", "referrerApi : " + referrerDetails.toString()); } @Override - public void onFail(String message) { + public void onFailure(String message) { Log.d("example", "failed : " + message); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index c49fce8d2..5b5c48568 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -3,8 +3,6 @@ import android.content.Context; import android.net.Uri; -import org.json.JSONObject; - import java.util.Map; /** @@ -344,7 +342,7 @@ public static AdjustAttribution getAttribution() { return adjustInstance.getAttribution(); } - public static void setOnGooglePlayInstallReferrerReadListener(Context context,OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { + public static void getGooglePlayInstallReferrer(Context context, OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.setOnGooglePlayInstallReferrerReadListener(context ,onGooglePlayInstallReferrerReadListener); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 1b3346725..49b083fee 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -3,8 +3,6 @@ import android.net.Uri; import android.content.Context; -import org.json.JSONObject; - import java.util.List; import java.util.ArrayList; @@ -531,12 +529,12 @@ public void setOnGooglePlayInstallReferrerReadListener(Context context ,OnGoogle InstallReferrer installReferrer = new InstallReferrer(context, new InstallReferrerReadListener() { @Override public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { - onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(referrerDetails, referrerApi); + onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(referrerDetails); } @Override public void onFail(String message) { - onGooglePlayInstallReferrerReadListener.onFail(message); + onGooglePlayInstallReferrerReadListener.onFailure(message); } }); installReferrer.startConnection(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java index efbc6d8b4..5fe8f69bb 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java @@ -1,7 +1,7 @@ package com.adjust.sdk; public interface OnGooglePlayInstallReferrerReadListener { - void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi); - void onFail(String message); + void onInstallReferrerRead(ReferrerDetails referrerDetails); + void onFailure(String message); } From d5aeba1f00986db08e97f074b2e6cd5bb7c89d24 Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 11 Apr 2024 11:39:52 +0200 Subject: [PATCH 028/540] Refac: Remove remains of play service lib --- .../java/com/adjust/sdk/InstallReferrer.java | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrer.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrer.java index 32dad9932..f63c1d635 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrer.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrer.java @@ -94,8 +94,6 @@ public class InstallReferrer implements InvocationHandler { */ private final InstallReferrerReadListener referrerCallback; - private Object playInstallReferrer; - private ThreadExecutor executor; /** @@ -106,7 +104,6 @@ public class InstallReferrer implements InvocationHandler { */ public InstallReferrer(final Context context, final InstallReferrerReadListener referrerCallback) { this.logger = AdjustFactory.getLogger(); - this.playInstallReferrer = createInstallReferrer(context, referrerCallback, logger); this.context = context; this.shouldTryToRead = new AtomicBoolean(true); this.retries = 0; @@ -120,25 +117,10 @@ public void run() { this.executor = new SingleThreadCachedScheduler("InstallReferrer"); } - private Object createInstallReferrer(Context context, InstallReferrerReadListener referrerCallback, ILogger logger) { - return Reflection.createInstance("com.adjust.sdk.play.InstallReferrer", - new Class[]{Context.class, InstallReferrerReadListener.class, ILogger.class}, - context, referrerCallback, logger); - } - /** * Start connection with install referrer service. */ public void startConnection() { - if (this.playInstallReferrer != null) { - try { - Reflection.invokeInstanceMethod(this.playInstallReferrer, "startConnection", null); - return; - } catch (Exception e) { - logger.error("Call to Play startConnection error: %s", e.getMessage()); - } - } - if (!AdjustFactory.getTryInstallReferrer()) { return; } From 75ccd7ed61ac792ec6ff2188b107df37cfac5ffa Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 11 Apr 2024 15:11:56 +0200 Subject: [PATCH 029/540] Refac: Call referrer callback on fail paths --- .../java/com/adjust/sdk/InstallReferrer.java | 124 ++++++++++-------- 1 file changed, 68 insertions(+), 56 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrer.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrer.java index f63c1d635..40e4b644a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrer.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrer.java @@ -121,32 +121,37 @@ public void run() { * Start connection with install referrer service. */ public void startConnection() { - if (!AdjustFactory.getTryInstallReferrer()) { + if (! AdjustFactory.getTryInstallReferrer()) { + this.referrerCallback.onFail("Sdk has been configured to not try install referrer"); return; } closeReferrerClient(); - if (!shouldTryToRead.get()) { - logger.debug("Should not try to read Install referrer"); + if (! shouldTryToRead.get()) { + this.referrerCallback.onFail("Should not try to read the install referrer any longer"); return; } if (context == null) { + this.referrerCallback.onFail("Requires context to read the install referrer"); return; } this.referrerClient = createInstallReferrerClient(context); if (this.referrerClient == null) { + // this.referrerCallback.onFail called inside createInstallReferrerClient(context) return; } - Class listenerClass = getInstallReferrerStateListenerClass(); + final Class listenerClass = getInstallReferrerStateListenerClass(); if (listenerClass == null) { + // this.referrerCallback.onFail called inside getInstallReferrerStateListenerClass() return; } - Object listenerProxy = createProxyInstallReferrerStateListener(listenerClass); + final Object listenerProxy = createProxyInstallReferrerStateListener(listenerClass); if (listenerProxy == null) { + // this.referrerCallback.onFail called inside createProxyInstallReferrerStateListener(listenerClass) return; } @@ -165,14 +170,14 @@ private Object createInstallReferrerClient(final Context context) { "newBuilder", new Class[]{Context.class}, context); return Reflection.invokeInstanceMethod(builder, "build", null); - } catch (ClassNotFoundException ex) { - logger.warn("InstallReferrer not integrated in project (%s) thrown by (%s)", - ex.getMessage(), - ex.getClass().getCanonicalName()); - } catch (Exception ex) { - logger.error("createInstallReferrerClient error (%s) from (%s)", - ex.getMessage(), - ex.getClass().getCanonicalName()); + } catch (final ClassNotFoundException ex) { + this.referrerCallback.onFail( + Util.formatString("InstallReferrer not integrated in project (%s) thrown by (%s)", + ex.getMessage(), ex.getClass().getCanonicalName())); + } catch (final Exception ex) { + this.referrerCallback.onFail( + Util.formatString("createInstallReferrerClient error (%s) from (%s)", + ex.getMessage(), ex.getClass().getCanonicalName())); } return null; @@ -187,9 +192,9 @@ private Class getInstallReferrerStateListenerClass() { try { return Class.forName(PACKAGE_BASE_NAME + "api.InstallReferrerStateListener"); } catch (Exception ex) { - logger.error("getInstallReferrerStateListenerClass error (%s) from (%s)", - ex.getMessage(), - ex.getClass().getCanonicalName()); + this.referrerCallback.onFail( + Util.formatString("getInstallReferrerStateListenerClass error (%s) from (%s)", + ex.getMessage(), ex.getClass().getCanonicalName())); } return null; } @@ -209,10 +214,10 @@ private Object createProxyInstallReferrerStateListener(final Class installReferr new Class[]{installReferrerStateListenerClass}, this ); - } catch (IllegalArgumentException ex) { - logger.error("InstallReferrer proxy violating parameter restrictions"); - } catch (NullPointerException ex) { - logger.error("Null argument passed to InstallReferrer proxy"); + } catch (final IllegalArgumentException ex) { + this.referrerCallback.onFail("InstallReferrer proxy violating parameter restrictions"); + } catch (final NullPointerException ex) { + this.referrerCallback.onFail("Null argument passed to InstallReferrer proxy"); } return proxyInstance; @@ -228,23 +233,18 @@ private void startConnection(final Class listenerClass, final Object listenerPro try { Reflection.invokeInstanceMethod(this.referrerClient, "startConnection", new Class[]{listenerClass}, listenerProxy); - } catch (InvocationTargetException ex) { + } catch (final InvocationTargetException ex) { if (Util.hasRootCause(ex)) { - String failMessage = Util.formatString("InstallReferrer encountered an InvocationTargetException %s", - Util.getRootCause(ex)); - referrerCallback.onFail(failMessage); // Check for an underlying root cause in the stack trace - logger.error(failMessage); - }else { + referrerCallback.onFail( + Util.formatString("InstallReferrer encountered an InvocationTargetException %s", + Util.getRootCause(ex))); + } else { referrerCallback.onFail("InstallReferrer encountered an InvocationTargetException"); } - - } catch (Exception ex) { - String failMessage = Util.formatString("startConnection error (%s) thrown by (%s)", - ex.getMessage(), - ex.getClass().getCanonicalName()); - referrerCallback.onFail(failMessage); - logger.error(failMessage); + } catch (final Exception ex) { + referrerCallback.onFail(Util.formatString("startConnection error (%s) thrown by (%s)", + ex.getMessage(), ex.getClass().getCanonicalName())); } } @@ -259,12 +259,9 @@ public Object invoke(final Object proxy, final Method method, final Object[] arg public void run() { try { invokeI(proxy, method, args); - } catch (Throwable throwable) { - String failMessage = Util.formatString("invoke error (%s) thrown by (%s)", - throwable.getMessage(), - throwable.getClass().getCanonicalName()); - referrerCallback.onFail(failMessage); - logger.error(failMessage); + } catch (final Throwable throwable) { + referrerCallback.onFail(Util.formatString("invoke error (%s) thrown by (%s)", + throwable.getMessage(), throwable.getClass().getCanonicalName())); } } }); @@ -273,14 +270,15 @@ public void run() { } private Object invokeI(final Object proxy, final Method method, Object[] args) - throws Throwable { + throws Throwable + { if (method == null) { - logger.error("InstallReferrer invoke method null"); + this.referrerCallback.onFail("InstallReferrer invoke method null"); return null; } String methodName = method.getName(); if (methodName == null) { - logger.error("InstallReferrer invoke method name null"); + this.referrerCallback.onFail("InstallReferrer invoke method name null"); return null; } // Prints the method being invoked @@ -296,27 +294,31 @@ private Object invokeI(final Object proxy, final Method method, Object[] args) // if the method name equals some method's name then call your method if (methodName.equals("onInstallReferrerSetupFinished")) { if (args.length != 1) { - logger.error("InstallReferrer invoke onInstallReferrerSetupFinished args lenght not 1: %d", args.length); + this.referrerCallback.onFail(Util.formatString( + "InstallReferrer invoke onInstallReferrerSetupFinished args lenght not 1: %d", + args.length)); return null; } Object arg = args[0]; if (!(arg instanceof Integer)) { - logger.error("InstallReferrer invoke onInstallReferrerSetupFinished arg not int"); + this.referrerCallback.onFail("InstallReferrer invoke onInstallReferrerSetupFinished arg not int"); return null; } Integer responseCode = (Integer) arg; if (responseCode == null) { - logger.error("InstallReferrer invoke onInstallReferrerSetupFinished responseCode arg is null"); + this.referrerCallback.onFail("InstallReferrer invoke onInstallReferrerSetupFinished responseCode arg is null"); return null; } onInstallReferrerSetupFinishedIntI(responseCode); } else if (methodName.equals("onInstallReferrerServiceDisconnected")) { logger.debug("Connection to install referrer service was lost. Retrying ..."); - retryI(); + retryI("onInstallReferrerServiceDisconnected"); } + this.referrerCallback.onFail( + Util.formatString("Reflection call method name not expected: %s", methodName)); return null; } @@ -357,21 +359,24 @@ private void onInstallReferrerSetupFinishedIntI(final int responseCode) { // Stuff successfully read, try to send it. referrerCallback.onInstallReferrerRead(installReferrerDetails, Constants.REFERRER_API_GOOGLE); } catch (Exception e) { - String failMessage = Util.formatString("Couldn't get install referrer from client (%s). Retrying...", e.getMessage()); - referrerCallback.onFail(failMessage); - logger.warn(failMessage); + logger.warn( + "Couldn't get install referrer from client (%s). Retrying...", + e.getMessage()); + // retrying, so no need to referrerCallback.onFail retryAtEnd = true; } break; /** Install Referrer API not supported by the installed Play Store app. */ case STATUS_FEATURE_NOT_SUPPORTED: // API not available on the current Play Store app - logger.debug("Install Referrer API not supported by the installed Play Store app. Closing connection"); + this.referrerCallback.onFail( + "Install Referrer API not supported by the installed Play Store app. Closing connection"); break; /** Could not initiate connection to the Install Referrer service. */ case STATUS_SERVICE_UNAVAILABLE: // Connection could not be established logger.debug("Could not initiate connection to the Install Referrer service. Retrying..."); + // retrying, so no need to referrerCallback.onFail retryAtEnd = true; break; /** @@ -385,19 +390,23 @@ private void onInstallReferrerSetupFinishedIntI(final int responseCode) { case STATUS_SERVICE_DISCONNECTED: // Play Store service is not connected now - potentially transient state logger.debug("Play Store service is not connected now. Retrying..."); + // retrying, so no need to referrerCallback.onFail retryAtEnd = true; break; /** General errors caused by incorrect usage */ case STATUS_DEVELOPER_ERROR: logger.debug("Install Referrer API general errors caused by incorrect usage. Retrying..."); + // retrying, so no need to referrerCallback.onFail retryAtEnd = true; break; default: - logger.debug("Unexpected response code of install referrer response: %d. Closing connection", responseCode); + this.referrerCallback.onFail(Util.formatString( + "Unexpected response code of install referrer response: %d. Closing connection", + responseCode)); break; } if (retryAtEnd) { - retryI(); + retryI("end of onInstallReferrerSetupFinishedIntI"); } else { shouldTryToRead.set(false); closeReferrerClient(); @@ -573,15 +582,18 @@ private Boolean getBooleanGooglePlayInstantParam(final Object referrerDetails) { /** * Retry connection to install referrer service. */ - private void retryI() { - if (!shouldTryToRead.get()) { - logger.debug("Should not try to read Install referrer"); + private void retryI(final String source) { + if (! shouldTryToRead.get()) { + this.referrerCallback.onFail( + Util.formatString("Should not try to read Install referrer from %s", source)); closeReferrerClient(); return; } // Check increase retry counter if (retries + 1 > Constants.MAX_INSTALL_REFERRER_RETRIES) { - logger.debug("Limit number of retry of %d for install referrer surpassed", Constants.MAX_INSTALL_REFERRER_RETRIES); + this.referrerCallback.onFail( + Util.formatString("Limit number of retry of %d for install referrer surpassed from %s", + Constants.MAX_INSTALL_REFERRER_RETRIES, source)); return; } From 8b376fead0227448a4d03b8c5a1571960e5441b6 Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 11 Apr 2024 16:01:23 +0200 Subject: [PATCH 030/540] Fix: onFail call on wrong place --- .../src/main/java/com/adjust/sdk/InstallReferrer.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrer.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrer.java index 40e4b644a..d1f3398c9 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrer.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrer.java @@ -316,9 +316,10 @@ private Object invokeI(final Object proxy, final Method method, Object[] args) } else if (methodName.equals("onInstallReferrerServiceDisconnected")) { logger.debug("Connection to install referrer service was lost. Retrying ..."); retryI("onInstallReferrerServiceDisconnected"); + } else { + this.referrerCallback.onFail( + Util.formatString("Reflection call method name not expected: %s", methodName)); } - this.referrerCallback.onFail( - Util.formatString("Reflection call method name not expected: %s", methodName)); return null; } From d86cafe03d2f59cb9ac59ddc9ccfd50d3fe1f942 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 12 Apr 2024 11:23:23 +0200 Subject: [PATCH 031/540] refac: create GooglePlayInstallReferrerDetails.java for external api usages --- .../adjust/examples/GlobalApplication.java | 8 ++-- .../java/com/adjust/sdk/AdjustInstance.java | 4 +- .../sdk/GooglePlayInstallReferrerDetails.java | 39 +++++++++++++++++++ ...GooglePlayInstallReferrerReadListener.java | 2 +- 4 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/GooglePlayInstallReferrerDetails.java diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index a6314ab42..828e9e8f4 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -12,6 +12,9 @@ import com.adjust.sdk.AdjustConfig; import com.adjust.sdk.AdjustEventFailure; import com.adjust.sdk.AdjustEventSuccess; +import com.adjust.sdk.AdjustSessionFailure; +import com.adjust.sdk.AdjustSessionSuccess; +import com.adjust.sdk.GooglePlayInstallReferrerDetails; import com.adjust.sdk.LogLevel; import com.adjust.sdk.OnAttributionChangedListener; import com.adjust.sdk.OnDeeplinkResponseListener; @@ -20,9 +23,6 @@ import com.adjust.sdk.OnGooglePlayInstallReferrerReadListener; import com.adjust.sdk.OnSessionTrackingFailedListener; import com.adjust.sdk.OnSessionTrackingSucceededListener; -import com.adjust.sdk.AdjustSessionFailure; -import com.adjust.sdk.AdjustSessionSuccess; -import com.adjust.sdk.ReferrerDetails; /** * Created by pfms on 17/12/14. @@ -155,7 +155,7 @@ public boolean launchReceivedDeeplink(Uri deeplink) { Adjust.getGooglePlayInstallReferrer(this, new OnGooglePlayInstallReferrerReadListener() { @Override - public void onInstallReferrerRead(ReferrerDetails referrerDetails) { + public void onInstallReferrerRead(GooglePlayInstallReferrerDetails referrerDetails) { Log.d("example", "referrerApi : " + referrerDetails.toString()); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 49b083fee..3c4764803 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -529,7 +529,9 @@ public void setOnGooglePlayInstallReferrerReadListener(Context context ,OnGoogle InstallReferrer installReferrer = new InstallReferrer(context, new InstallReferrerReadListener() { @Override public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { - onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(referrerDetails); + if (referrerDetails != null) { + onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(new GooglePlayInstallReferrerDetails(referrerDetails)); + } } @Override diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/GooglePlayInstallReferrerDetails.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/GooglePlayInstallReferrerDetails.java new file mode 100644 index 000000000..5c62d8867 --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/GooglePlayInstallReferrerDetails.java @@ -0,0 +1,39 @@ +package com.adjust.sdk; + +public class GooglePlayInstallReferrerDetails { + public String installReferrer; // The referrer URL of the installed package. + public long referrerClickTimestampSeconds; // The client-side timestamp, when the referrer click happened. + public long installBeginTimestampSeconds; // The client-side timestamp, when app installation began. + public long referrerClickTimestampServerSeconds; // The server-side timestamp, when the referrer click happened. + public long installBeginTimestampServerSeconds; // The server-side timestamp, when app installation began. + public String installVersion; // The app's version at the time when the app was first installed. + public Boolean googlePlayInstant; // Indicates whether app's instant experience was launched within the past 7 days. + + GooglePlayInstallReferrerDetails(ReferrerDetails referrerDetails){ + this.installReferrer = referrerDetails.installReferrer; + this.referrerClickTimestampSeconds = referrerDetails.referrerClickTimestampSeconds; + this.installBeginTimestampSeconds = referrerDetails.installBeginTimestampSeconds; + this.referrerClickTimestampServerSeconds = referrerDetails.referrerClickTimestampServerSeconds; + this.installBeginTimestampServerSeconds = referrerDetails.installBeginTimestampServerSeconds; + this.installVersion = referrerDetails.installVersion; + this.googlePlayInstant = referrerDetails.googlePlayInstant; + } + + public String toString() { + return Util.formatString( + " installReferrer : %s" + + " referrerClickTimestampSeconds : %d" + + " installBeginTimestampSeconds : %d" + + " referrerClickTimestampServerSeconds : %d" + + " installBeginTimestampServerSeconds : %d" + + " installVersion : %s" + + " googlePlayInstant : %s", + installReferrer, + referrerClickTimestampSeconds, + installBeginTimestampSeconds, + referrerClickTimestampServerSeconds, + installBeginTimestampServerSeconds, + installVersion, + googlePlayInstant); + } +} diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java index 5fe8f69bb..011b916f1 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java @@ -1,7 +1,7 @@ package com.adjust.sdk; public interface OnGooglePlayInstallReferrerReadListener { - void onInstallReferrerRead(ReferrerDetails referrerDetails); + void onInstallReferrerRead(GooglePlayInstallReferrerDetails referrerDetails); void onFailure(String message); } From 94d6460527d619a21e65a3914aa1ca047225a2e4 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 12 Apr 2024 11:25:59 +0200 Subject: [PATCH 032/540] refac: check null before using callback --- .../java/com/adjust/sdk/AdjustInstance.java | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 3c4764803..1a83ba3f6 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -525,21 +525,23 @@ public String getSdkVersion() { return Util.getSdkVersion(); } - public void setOnGooglePlayInstallReferrerReadListener(Context context ,OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { - InstallReferrer installReferrer = new InstallReferrer(context, new InstallReferrerReadListener() { - @Override - public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { - if (referrerDetails != null) { - onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(new GooglePlayInstallReferrerDetails(referrerDetails)); + public void setOnGooglePlayInstallReferrerReadListener(Context context, OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { + if (onGooglePlayInstallReferrerReadListener != null && context != null) { + InstallReferrer installReferrer = new InstallReferrer(context, new InstallReferrerReadListener() { + @Override + public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { + if (referrerDetails != null) { + onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(new GooglePlayInstallReferrerDetails(referrerDetails)); + } } - } - @Override - public void onFail(String message) { - onGooglePlayInstallReferrerReadListener.onFailure(message); - } - }); - installReferrer.startConnection(); + @Override + public void onFail(String message) { + onGooglePlayInstallReferrerReadListener.onFailure(message); + } + }); + installReferrer.startConnection(); + } } From bbc4855f7485bdc7d1c9679be6ebdada0b2e130e Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 12 Apr 2024 11:27:27 +0200 Subject: [PATCH 033/540] refac: rename internal setOnGooglePlayInstallReferrerReadListener to getGooglePlayInstallReferrer inside of AdjustInstance.java for the sake of consistency --- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- .../sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 5b5c48568..e2bf7b0ec 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -344,7 +344,7 @@ public static AdjustAttribution getAttribution() { public static void getGooglePlayInstallReferrer(Context context, OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.setOnGooglePlayInstallReferrerReadListener(context ,onGooglePlayInstallReferrerReadListener); + adjustInstance.getGooglePlayInstallReferrer(context ,onGooglePlayInstallReferrerReadListener); } /** * Called to get native SDK version string. diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 1a83ba3f6..85747adf6 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -525,7 +525,7 @@ public String getSdkVersion() { return Util.getSdkVersion(); } - public void setOnGooglePlayInstallReferrerReadListener(Context context, OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { + public void getGooglePlayInstallReferrer(Context context, OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { if (onGooglePlayInstallReferrerReadListener != null && context != null) { InstallReferrer installReferrer = new InstallReferrer(context, new InstallReferrerReadListener() { @Override From 4805215f4942dd103808aa31fb380653bb6ba632 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 12 Apr 2024 11:55:23 +0200 Subject: [PATCH 034/540] refac: provide log in case context and callback are null --- .../java/com/adjust/sdk/AdjustInstance.java | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 85747adf6..0a0655f11 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -526,22 +526,29 @@ public String getSdkVersion() { } public void getGooglePlayInstallReferrer(Context context, OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { - if (onGooglePlayInstallReferrerReadListener != null && context != null) { - InstallReferrer installReferrer = new InstallReferrer(context, new InstallReferrerReadListener() { - @Override - public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { - if (referrerDetails != null) { - onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(new GooglePlayInstallReferrerDetails(referrerDetails)); - } + if (onGooglePlayInstallReferrerReadListener == null) { + AdjustFactory.getLogger().error("OnGooglePlayInstallReferrerReadListener can not be null"); + return; + } + if (context == null){ + AdjustFactory.getLogger().error("context can not be null"); + return; + } + InstallReferrer installReferrer = new InstallReferrer(context, new InstallReferrerReadListener() { + @Override + public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { + if (referrerDetails != null) { + onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(new GooglePlayInstallReferrerDetails(referrerDetails)); } + } + + @Override + public void onFail(String message) { + onGooglePlayInstallReferrerReadListener.onFailure(message); + } + }); + installReferrer.startConnection(); - @Override - public void onFail(String message) { - onGooglePlayInstallReferrerReadListener.onFailure(message); - } - }); - installReferrer.startConnection(); - } } From acb044c6cfb1f0ea47dfe7d626471c6b7f7dd779 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 12 Apr 2024 14:16:01 +0200 Subject: [PATCH 035/540] refac: fine tuning the style and remove unnecessary check --- .../com/adjust/examples/GlobalApplication.java | 4 ---- .../java/com/adjust/sdk/ActivityHandler.java | 4 ++-- .../src/main/java/com/adjust/sdk/Adjust.java | 6 ++++++ .../main/java/com/adjust/sdk/AdjustInstance.java | 16 ++++++++-------- .../sdk/GooglePlayInstallReferrerDetails.java | 3 +++ 5 files changed, 19 insertions(+), 14 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 828e9e8f4..8da558b65 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -29,14 +29,10 @@ */ public class GlobalApplication extends Application { - Context context; - @Override public void onCreate() { super.onCreate(); - - context = this; // Configure adjust SDK. String appToken = "2fm9gkqubvpc"; String environment = AdjustConfig.ENVIRONMENT_SANDBOX; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index f7a590e2a..91098b500 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1317,7 +1317,7 @@ private void processSessionI() { checkForPreinstallI(); // Try to check if there's new referrer information. - installReferrer.startConnection(); +// installReferrer.startConnection(); installReferrerMeta.readReferrer(); readInstallReferrerHuaweiAds(); readInstallReferrerHuaweiAppGallery(); @@ -1856,7 +1856,7 @@ private void checkAfterNewStartI(SharedPreferencesManager sharedPreferencesManag checkForPreinstallI(); // try to read and send the install referrer - installReferrer.startConnection(); +// installReferrer.startConnection(); installReferrerMeta.readReferrer(); readInstallReferrerHuaweiAds(); readInstallReferrerHuaweiAppGallery(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index e2bf7b0ec..e92818116 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -342,6 +342,12 @@ public static AdjustAttribution getAttribution() { return adjustInstance.getAttribution(); } + /** + * Called to get Google Install Referrer. + * + * @param context Application context + * @param onGooglePlayInstallReferrerReadListener Callback to obtain install referrer. + */ public static void getGooglePlayInstallReferrer(Context context, OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.getGooglePlayInstallReferrer(context ,onGooglePlayInstallReferrerReadListener); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 0a0655f11..fcaffd60f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -525,21 +525,21 @@ public String getSdkVersion() { return Util.getSdkVersion(); } - public void getGooglePlayInstallReferrer(Context context, OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { + /** + * Called to get Google Install Referrer. + * + * @param context Application context + * @param onGooglePlayInstallReferrerReadListener Callback to obtain install referrer. + */ + public void getGooglePlayInstallReferrer(final Context context, final OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { if (onGooglePlayInstallReferrerReadListener == null) { AdjustFactory.getLogger().error("OnGooglePlayInstallReferrerReadListener can not be null"); return; } - if (context == null){ - AdjustFactory.getLogger().error("context can not be null"); - return; - } InstallReferrer installReferrer = new InstallReferrer(context, new InstallReferrerReadListener() { @Override public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { - if (referrerDetails != null) { - onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(new GooglePlayInstallReferrerDetails(referrerDetails)); - } + onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(new GooglePlayInstallReferrerDetails(referrerDetails)); } @Override diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/GooglePlayInstallReferrerDetails.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/GooglePlayInstallReferrerDetails.java index 5c62d8867..04a03ce0a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/GooglePlayInstallReferrerDetails.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/GooglePlayInstallReferrerDetails.java @@ -10,6 +10,9 @@ public class GooglePlayInstallReferrerDetails { public Boolean googlePlayInstant; // Indicates whether app's instant experience was launched within the past 7 days. GooglePlayInstallReferrerDetails(ReferrerDetails referrerDetails){ + if (referrerDetails == null){ + return; + } this.installReferrer = referrerDetails.installReferrer; this.referrerClickTimestampSeconds = referrerDetails.referrerClickTimestampSeconds; this.installBeginTimestampSeconds = referrerDetails.installBeginTimestampSeconds; From 9908840a4896a4649908a9622cc433d39437b5a7 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 12 Apr 2024 14:17:12 +0200 Subject: [PATCH 036/540] refac: uncomment startConnect of reading of installReferrer --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 91098b500..f7a590e2a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1317,7 +1317,7 @@ private void processSessionI() { checkForPreinstallI(); // Try to check if there's new referrer information. -// installReferrer.startConnection(); + installReferrer.startConnection(); installReferrerMeta.readReferrer(); readInstallReferrerHuaweiAds(); readInstallReferrerHuaweiAppGallery(); @@ -1856,7 +1856,7 @@ private void checkAfterNewStartI(SharedPreferencesManager sharedPreferencesManag checkForPreinstallI(); // try to read and send the install referrer -// installReferrer.startConnection(); + installReferrer.startConnection(); installReferrerMeta.readReferrer(); readInstallReferrerHuaweiAds(); readInstallReferrerHuaweiAppGallery(); From f2aa309c1d6ec04abbe23cd01759a5d451e9631a Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 12 Apr 2024 14:35:34 +0200 Subject: [PATCH 037/540] refac: change info log on onFail to debug --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index f7a590e2a..8863d021f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -991,7 +991,7 @@ public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referr @Override public void onFail(String message) { - logger.info(message); + logger.debug(message); } }); @@ -1005,7 +1005,7 @@ public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referr @Override public void onFail(String message) { - logger.info(message); + logger.debug(message); } }); preLaunchActionsI(adjustConfig.preLaunchActions.preLaunchActionsArray); From 1b2865cf8f9065d764174ceca1fa68a9d17b3dff Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 15 Apr 2024 17:40:39 +0200 Subject: [PATCH 038/540] refac: add the VivoInstallReferrer async getter create VivoInstallReferrerDetails.java create OnVivoInstallReferrerReadListener.java callback --- .../adjust/sdk/vivo/AdjustVivoReferrer.java | 37 ++++++++++++++++++- .../OnVivoInstallReferrerReadListener.java | 4 +- .../sdk/vivo/VivoInstallReferrerDetails.java | 34 +++++++++++++++++ 3 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerDetails.java diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java index 81065472e..4730f7172 100644 --- a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java +++ b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java @@ -2,14 +2,49 @@ import android.content.Context; +import com.adjust.sdk.AdjustFactory; +import com.adjust.sdk.ReferrerDetails; +import com.adjust.sdk.scheduler.AsyncTaskExecutor; + public class AdjustVivoReferrer { static boolean shouldReadVivoReferrer = true; - public static void getVivoInstallReferrer(Context context,OnVivoInstallReferrerReadListener onVivoInstallReferrerReadListener){ + /** + * Called to get Vivo Install Referrer. + * + * @param context Application context + * @param onVivoInstallReferrerReadListener Callback to obtain install referrer. + */ + public static void getVivoInstallReferrer(final Context context, final OnVivoInstallReferrerReadListener onVivoInstallReferrerReadListener) { + new AsyncTaskExecutor() { + @Override + protected ReferrerDetails doInBackground(Context[] contexts) { + ReferrerDetails referrerDetails = null; + try { + referrerDetails = Util.getVivoInstallReferrerDetails(context, AdjustFactory.getLogger()); + } catch (Exception exception) { + if (onVivoInstallReferrerReadListener == null) { + AdjustFactory.getLogger().error("onVivoInstallReferrerReadListener can not be null"); + return null; + } + onVivoInstallReferrerReadListener.onFail(exception.getMessage()); + } + return referrerDetails; + } + @Override + protected void onPostExecute(ReferrerDetails referrerDetails) { + if (onVivoInstallReferrerReadListener == null) { + AdjustFactory.getLogger().error("onVivoInstallReferrerReadListener can not be null"); + return; + } + onVivoInstallReferrerReadListener.onVivoInstallReferrerRead(new VivoInstallReferrerDetails(referrerDetails)); + } + }.execute(context); } + public static void readVivoReferrer(Context context) { shouldReadVivoReferrer = true; } diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/OnVivoInstallReferrerReadListener.java b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/OnVivoInstallReferrerReadListener.java index 1840193ae..9d2707972 100644 --- a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/OnVivoInstallReferrerReadListener.java +++ b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/OnVivoInstallReferrerReadListener.java @@ -3,6 +3,6 @@ import com.adjust.sdk.ReferrerDetails; public interface OnVivoInstallReferrerReadListener { - void onVivoInstallReferrerRead(ReferrerDetails referrerDetails); - void onFailure(String message); + void onVivoInstallReferrerRead(VivoInstallReferrerDetails referrerDetails); + void onFail(String message); } diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerDetails.java b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerDetails.java new file mode 100644 index 000000000..69009ad68 --- /dev/null +++ b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerDetails.java @@ -0,0 +1,34 @@ +package com.adjust.sdk.vivo; + +import com.adjust.sdk.ReferrerDetails; +import com.adjust.sdk.Util; + +public class VivoInstallReferrerDetails { + + public String installReferrer; // The referrer URL of the installed package. + public long referrerClickTimestampSeconds; // The client-side timestamp, when the referrer click happened. + public long installBeginTimestampSeconds; // The client-side timestamp, when app installation began. + public String installVersion; // The app's version at the time when the app was first installed. + + VivoInstallReferrerDetails(ReferrerDetails referrerDetails){ + if (referrerDetails == null){ + return; + } + this.installReferrer = referrerDetails.installReferrer; + this.referrerClickTimestampSeconds = referrerDetails.referrerClickTimestampSeconds; + this.installBeginTimestampSeconds = referrerDetails.installBeginTimestampSeconds; + this.installVersion = referrerDetails.installVersion; + } + + public String toString() { + return Util.formatString( + " installReferrer : %s" + + " referrerClickTimestampSeconds : %d" + + " installBeginTimestampSeconds : %d" + + " installVersion : %s", + installReferrer, + referrerClickTimestampSeconds, + installBeginTimestampSeconds, + installVersion); + } +} From 9d189f370d856b5ce3cf03d5adab478dfd8d7b49 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 9 Apr 2024 09:39:44 +0200 Subject: [PATCH 039/540] refac: add setOnGooglePlayInstallReferrerReadListener to the AdjustConfig.java --- .../main/java/com/adjust/examples/GlobalApplication.java | 7 +++---- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 1 + .../src/main/java/com/adjust/sdk/AdjustConfig.java | 5 +++++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 8da558b65..2f5385d3f 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -2,7 +2,6 @@ import android.app.Activity; import android.app.Application; -import android.content.Context; import android.net.Uri; import android.os.Bundle; import android.util.Log; @@ -12,9 +11,6 @@ import com.adjust.sdk.AdjustConfig; import com.adjust.sdk.AdjustEventFailure; import com.adjust.sdk.AdjustEventSuccess; -import com.adjust.sdk.AdjustSessionFailure; -import com.adjust.sdk.AdjustSessionSuccess; -import com.adjust.sdk.GooglePlayInstallReferrerDetails; import com.adjust.sdk.LogLevel; import com.adjust.sdk.OnAttributionChangedListener; import com.adjust.sdk.OnDeeplinkResponseListener; @@ -23,6 +19,9 @@ import com.adjust.sdk.OnGooglePlayInstallReferrerReadListener; import com.adjust.sdk.OnSessionTrackingFailedListener; import com.adjust.sdk.OnSessionTrackingSucceededListener; +import com.adjust.sdk.AdjustSessionFailure; +import com.adjust.sdk.AdjustSessionSuccess; +import com.adjust.sdk.ReferrerDetails; /** * Created by pfms on 17/12/14. diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 8863d021f..f456ea2c7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -986,6 +986,7 @@ public void run() { installReferrer = new InstallReferrer(adjustConfig.context, new InstallReferrerReadListener() { @Override public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { + adjustConfig.onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(referrerDetails,referrerApi); sendInstallReferrer(referrerDetails, referrerApi); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index a5ee12032..392dab066 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -18,6 +18,7 @@ public class AdjustConfig { boolean eventBufferingEnabled; String defaultTracker; OnAttributionChangedListener onAttributionChangedListener; + OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener; Class deepLinkComponent; OnEventTrackingSucceededListener onEventTrackingSucceededListener; OnEventTrackingFailedListener onEventTrackingFailedListener; @@ -120,6 +121,10 @@ public void setOnAttributionChangedListener(OnAttributionChangedListener onAttri this.onAttributionChangedListener = onAttributionChangedListener; } + public void setOnGooglePlayInstallReferrerReadListener(OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { + this.onGooglePlayInstallReferrerReadListener = onGooglePlayInstallReferrerReadListener; + } + public void setDeepLinkComponent(Class deepLinkComponent) { this.deepLinkComponent = deepLinkComponent; } From 9c62fc877dceccdf40f3eb45db07d7c43ecd7585 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 9 Apr 2024 11:34:54 +0200 Subject: [PATCH 040/540] refac: move setOnSamsungInstallReferrerReadListener from AdjustConfig.java to Adjust.java --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 8 +++++++- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 4 ++++ .../src/main/java/com/adjust/sdk/AdjustConfig.java | 5 ----- .../src/main/java/com/adjust/sdk/AdjustInstance.java | 4 ++++ 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index f456ea2c7..2e760f51f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -84,6 +84,7 @@ public class ActivityHandler implements IActivityHandler { private InstallReferrer installReferrer; private InstallReferrerMeta installReferrerMeta; private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; + private OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener; @Override public void teardown() { @@ -276,6 +277,11 @@ public SessionParameters getSessionParameters() { return sessionParameters; } + @Override + public void setOnGooglePlayInstallReferrerReadListener(OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { + this.onGooglePlayInstallReferrerReadListener = onGooglePlayInstallReferrerReadListener; + } + @Override public void init(AdjustConfig adjustConfig) { this.adjustConfig = adjustConfig; @@ -986,7 +992,7 @@ public void run() { installReferrer = new InstallReferrer(adjustConfig.context, new InstallReferrerReadListener() { @Override public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { - adjustConfig.onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(referrerDetails,referrerApi); + onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(referrerDetails,referrerApi); sendInstallReferrer(referrerDetails, referrerApi); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index e92818116..a1c8037b8 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -342,6 +342,10 @@ public static AdjustAttribution getAttribution() { return adjustInstance.getAttribution(); } + public static void setOnGooglePlayInstallReferrerReadListener(OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { + AdjustInstance adjustInstance = Adjust.getDefaultInstance(); + adjustInstance.setOnGooglePlayInstallReferrerReadListener(onGooglePlayInstallReferrerReadListener); + } /** * Called to get Google Install Referrer. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 392dab066..a5ee12032 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -18,7 +18,6 @@ public class AdjustConfig { boolean eventBufferingEnabled; String defaultTracker; OnAttributionChangedListener onAttributionChangedListener; - OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener; Class deepLinkComponent; OnEventTrackingSucceededListener onEventTrackingSucceededListener; OnEventTrackingFailedListener onEventTrackingFailedListener; @@ -121,10 +120,6 @@ public void setOnAttributionChangedListener(OnAttributionChangedListener onAttri this.onAttributionChangedListener = onAttributionChangedListener; } - public void setOnGooglePlayInstallReferrerReadListener(OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { - this.onGooglePlayInstallReferrerReadListener = onGooglePlayInstallReferrerReadListener; - } - public void setDeepLinkComponent(Class deepLinkComponent) { this.deepLinkComponent = deepLinkComponent; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index fcaffd60f..b1a41df40 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -48,6 +48,10 @@ public PreLaunchActions() { private PreLaunchActions preLaunchActions = new PreLaunchActions(); private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; + + public OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener; + + /** * Base path for Adjust packages. */ From bc90ab8171e871938317a44a73434669310bb5fd Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 9 Apr 2024 13:40:14 +0200 Subject: [PATCH 041/540] refac: check Null before invoking the onInstallReferrerRead --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 2e760f51f..2fb25fc12 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -992,7 +992,9 @@ public void run() { installReferrer = new InstallReferrer(adjustConfig.context, new InstallReferrerReadListener() { @Override public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { - onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(referrerDetails,referrerApi); + if (onGooglePlayInstallReferrerReadListener != null) { + onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(referrerDetails, referrerApi); + } sendInstallReferrer(referrerDetails, referrerApi); } From 2128c3a8d2dd15a5007dd6fcbe246af34c9b9ec7 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 9 Apr 2024 16:01:09 +0200 Subject: [PATCH 042/540] refac: make InstallReferrerGetter individually handle inside of AdjustInstance --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 9 --------- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 4 ++-- .../src/main/java/com/adjust/sdk/AdjustInstance.java | 4 ---- 3 files changed, 2 insertions(+), 15 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 2fb25fc12..8863d021f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -84,7 +84,6 @@ public class ActivityHandler implements IActivityHandler { private InstallReferrer installReferrer; private InstallReferrerMeta installReferrerMeta; private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; - private OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener; @Override public void teardown() { @@ -277,11 +276,6 @@ public SessionParameters getSessionParameters() { return sessionParameters; } - @Override - public void setOnGooglePlayInstallReferrerReadListener(OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { - this.onGooglePlayInstallReferrerReadListener = onGooglePlayInstallReferrerReadListener; - } - @Override public void init(AdjustConfig adjustConfig) { this.adjustConfig = adjustConfig; @@ -992,9 +986,6 @@ public void run() { installReferrer = new InstallReferrer(adjustConfig.context, new InstallReferrerReadListener() { @Override public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { - if (onGooglePlayInstallReferrerReadListener != null) { - onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(referrerDetails, referrerApi); - } sendInstallReferrer(referrerDetails, referrerApi); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index a1c8037b8..801ada781 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -342,9 +342,9 @@ public static AdjustAttribution getAttribution() { return adjustInstance.getAttribution(); } - public static void setOnGooglePlayInstallReferrerReadListener(OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { + public static void setOnGooglePlayInstallReferrerReadListener(Context context,OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.setOnGooglePlayInstallReferrerReadListener(onGooglePlayInstallReferrerReadListener); + adjustInstance.setOnGooglePlayInstallReferrerReadListener(context ,onGooglePlayInstallReferrerReadListener); } /** * Called to get Google Install Referrer. diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index b1a41df40..fcaffd60f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -48,10 +48,6 @@ public PreLaunchActions() { private PreLaunchActions preLaunchActions = new PreLaunchActions(); private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; - - public OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener; - - /** * Base path for Adjust packages. */ From 5c4b25f7732640486d5bfcc7afaabf0a9e92daaa Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 9 Apr 2024 16:21:43 +0200 Subject: [PATCH 043/540] refac: add onFail method in OnGooglePlayInstallReferrerReadListener.java and InstallReferrerReadListener.java --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 4 ++-- .../src/main/java/com/adjust/sdk/AdjustInstance.java | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 8863d021f..f7a590e2a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -991,7 +991,7 @@ public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referr @Override public void onFail(String message) { - logger.debug(message); + logger.info(message); } }); @@ -1005,7 +1005,7 @@ public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referr @Override public void onFail(String message) { - logger.debug(message); + logger.info(message); } }); preLaunchActionsI(adjustConfig.preLaunchActions.preLaunchActionsArray); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index fcaffd60f..10fa17bd7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -546,6 +546,11 @@ public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referr public void onFail(String message) { onGooglePlayInstallReferrerReadListener.onFailure(message); } + + @Override + public void onFail(String message) { + onGooglePlayInstallReferrerReadListener.onFail(message); + } }); installReferrer.startConnection(); From a181523172d12202803e58383d3572556766884f Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 10 Apr 2024 11:31:06 +0200 Subject: [PATCH 044/540] refac: rename setOnGooglePlayInstallReferrerReadListener to getGooglePlayInstallReferrer remove referrerApi from onInstallReferrerRead rename onFail to onFailure --- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- .../sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 801ada781..3caaa7138 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -342,7 +342,7 @@ public static AdjustAttribution getAttribution() { return adjustInstance.getAttribution(); } - public static void setOnGooglePlayInstallReferrerReadListener(Context context,OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { + public static void getGooglePlayInstallReferrer(Context context, OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.setOnGooglePlayInstallReferrerReadListener(context ,onGooglePlayInstallReferrerReadListener); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 10fa17bd7..a058996b5 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -549,7 +549,7 @@ public void onFail(String message) { @Override public void onFail(String message) { - onGooglePlayInstallReferrerReadListener.onFail(message); + onGooglePlayInstallReferrerReadListener.onFailure(message); } }); installReferrer.startConnection(); From 16853f8e28e8ea7dcdb3301fb339f6f82867e8cd Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 12 Apr 2024 11:23:23 +0200 Subject: [PATCH 045/540] refac: create GooglePlayInstallReferrerDetails.java for external api usages --- .../main/java/com/adjust/examples/GlobalApplication.java | 6 +++--- .../src/main/java/com/adjust/sdk/AdjustInstance.java | 8 +------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 2f5385d3f..a83634f79 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -11,6 +11,9 @@ import com.adjust.sdk.AdjustConfig; import com.adjust.sdk.AdjustEventFailure; import com.adjust.sdk.AdjustEventSuccess; +import com.adjust.sdk.AdjustSessionFailure; +import com.adjust.sdk.AdjustSessionSuccess; +import com.adjust.sdk.GooglePlayInstallReferrerDetails; import com.adjust.sdk.LogLevel; import com.adjust.sdk.OnAttributionChangedListener; import com.adjust.sdk.OnDeeplinkResponseListener; @@ -19,9 +22,6 @@ import com.adjust.sdk.OnGooglePlayInstallReferrerReadListener; import com.adjust.sdk.OnSessionTrackingFailedListener; import com.adjust.sdk.OnSessionTrackingSucceededListener; -import com.adjust.sdk.AdjustSessionFailure; -import com.adjust.sdk.AdjustSessionSuccess; -import com.adjust.sdk.ReferrerDetails; /** * Created by pfms on 17/12/14. diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index a058996b5..a4a4f26fe 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -539,12 +539,7 @@ public void getGooglePlayInstallReferrer(final Context context, final OnGooglePl InstallReferrer installReferrer = new InstallReferrer(context, new InstallReferrerReadListener() { @Override public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { - onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(new GooglePlayInstallReferrerDetails(referrerDetails)); - } - - @Override - public void onFail(String message) { - onGooglePlayInstallReferrerReadListener.onFailure(message); + onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(referrerDetails); } @Override @@ -553,7 +548,6 @@ public void onFail(String message) { } }); installReferrer.startConnection(); - } From bc6b5803c97d7bd3c127fb851bdd3ff34e66d955 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 12 Apr 2024 11:27:27 +0200 Subject: [PATCH 046/540] refac: rename internal setOnGooglePlayInstallReferrerReadListener to getGooglePlayInstallReferrer inside of AdjustInstance.java for the sake of consistency --- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 3caaa7138..5340bb891 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -344,7 +344,7 @@ public static AdjustAttribution getAttribution() { public static void getGooglePlayInstallReferrer(Context context, OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.setOnGooglePlayInstallReferrerReadListener(context ,onGooglePlayInstallReferrerReadListener); + adjustInstance.getGooglePlayInstallReferrer(context ,onGooglePlayInstallReferrerReadListener); } /** * Called to get Google Install Referrer. From cf250019db919868c9e925829685f34cfa9a5dc5 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 12 Apr 2024 14:16:01 +0200 Subject: [PATCH 047/540] refac: fine tuning the style and remove unnecessary check --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 4 ++-- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 6 ++++++ .../src/main/java/com/adjust/sdk/AdjustInstance.java | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index f7a590e2a..91098b500 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1317,7 +1317,7 @@ private void processSessionI() { checkForPreinstallI(); // Try to check if there's new referrer information. - installReferrer.startConnection(); +// installReferrer.startConnection(); installReferrerMeta.readReferrer(); readInstallReferrerHuaweiAds(); readInstallReferrerHuaweiAppGallery(); @@ -1856,7 +1856,7 @@ private void checkAfterNewStartI(SharedPreferencesManager sharedPreferencesManag checkForPreinstallI(); // try to read and send the install referrer - installReferrer.startConnection(); +// installReferrer.startConnection(); installReferrerMeta.readReferrer(); readInstallReferrerHuaweiAds(); readInstallReferrerHuaweiAppGallery(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 5340bb891..e51164e5c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -342,6 +342,12 @@ public static AdjustAttribution getAttribution() { return adjustInstance.getAttribution(); } + /** + * Called to get Google Install Referrer. + * + * @param context Application context + * @param onGooglePlayInstallReferrerReadListener Callback to obtain install referrer. + */ public static void getGooglePlayInstallReferrer(Context context, OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.getGooglePlayInstallReferrer(context ,onGooglePlayInstallReferrerReadListener); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index a4a4f26fe..7b1faf1b3 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -539,7 +539,7 @@ public void getGooglePlayInstallReferrer(final Context context, final OnGooglePl InstallReferrer installReferrer = new InstallReferrer(context, new InstallReferrerReadListener() { @Override public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { - onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(referrerDetails); + onGooglePlayInstallReferrerReadListener.onInstallReferrerRead(new GooglePlayInstallReferrerDetails(referrerDetails)); } @Override From bd701c4f52e9a0ddda50749a6203bdad53bd0dee Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 12 Apr 2024 14:17:12 +0200 Subject: [PATCH 048/540] refac: uncomment startConnect of reading of installReferrer --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 91098b500..f7a590e2a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1317,7 +1317,7 @@ private void processSessionI() { checkForPreinstallI(); // Try to check if there's new referrer information. -// installReferrer.startConnection(); + installReferrer.startConnection(); installReferrerMeta.readReferrer(); readInstallReferrerHuaweiAds(); readInstallReferrerHuaweiAppGallery(); @@ -1856,7 +1856,7 @@ private void checkAfterNewStartI(SharedPreferencesManager sharedPreferencesManag checkForPreinstallI(); // try to read and send the install referrer -// installReferrer.startConnection(); + installReferrer.startConnection(); installReferrerMeta.readReferrer(); readInstallReferrerHuaweiAds(); readInstallReferrerHuaweiAppGallery(); From 8a9f2d922c4d6a1c0d802372ae18f2d71f417cdc Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 12 Apr 2024 14:35:34 +0200 Subject: [PATCH 049/540] refac: change info log on onFail to debug --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index f7a590e2a..8863d021f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -991,7 +991,7 @@ public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referr @Override public void onFail(String message) { - logger.info(message); + logger.debug(message); } }); @@ -1005,7 +1005,7 @@ public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referr @Override public void onFail(String message) { - logger.info(message); + logger.debug(message); } }); preLaunchActionsI(adjustConfig.preLaunchActions.preLaunchActionsArray); From 348fe9258c9f5f3b6d11b32821b6c1fca0d4b25c Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 16 Apr 2024 10:03:25 +0200 Subject: [PATCH 050/540] refac: check null for onVivoInstallReferrerReadListener before trying to read create a result class for passing the result --- .../adjust/sdk/vivo/AdjustVivoReferrer.java | 33 ++++++++++--------- .../sdk/vivo/VivoInstallReferrerResult.java | 14 ++++++++ 2 files changed, 32 insertions(+), 15 deletions(-) create mode 100644 Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerResult.java diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java index 4730f7172..f25a28bb2 100644 --- a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java +++ b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java @@ -17,29 +17,32 @@ public class AdjustVivoReferrer { * @param onVivoInstallReferrerReadListener Callback to obtain install referrer. */ public static void getVivoInstallReferrer(final Context context, final OnVivoInstallReferrerReadListener onVivoInstallReferrerReadListener) { - new AsyncTaskExecutor() { + if (onVivoInstallReferrerReadListener == null){ + AdjustFactory.getLogger().error("onVivoInstallReferrerReadListener can not be null"); + return; + } + + new AsyncTaskExecutor() { @Override - protected ReferrerDetails doInBackground(Context[] contexts) { - ReferrerDetails referrerDetails = null; + protected VivoInstallReferrerResult doInBackground(Context[] contexts) { + VivoInstallReferrerDetails vivoInstallReferrerDetails = null; try { - referrerDetails = Util.getVivoInstallReferrerDetails(context, AdjustFactory.getLogger()); + ReferrerDetails referrerDetails = Util.getVivoInstallReferrerDetails(context, AdjustFactory.getLogger()); + vivoInstallReferrerDetails = new VivoInstallReferrerDetails(referrerDetails); + return new VivoInstallReferrerResult(vivoInstallReferrerDetails); } catch (Exception exception) { - if (onVivoInstallReferrerReadListener == null) { - AdjustFactory.getLogger().error("onVivoInstallReferrerReadListener can not be null"); - return null; - } - onVivoInstallReferrerReadListener.onFail(exception.getMessage()); + return new VivoInstallReferrerResult(exception.getMessage()); } - return referrerDetails; } @Override - protected void onPostExecute(ReferrerDetails referrerDetails) { - if (onVivoInstallReferrerReadListener == null) { - AdjustFactory.getLogger().error("onVivoInstallReferrerReadListener can not be null"); - return; + protected void onPostExecute(VivoInstallReferrerResult vivoInstallReferrerResult) { + if (vivoInstallReferrerResult.vivoInstallReferrerDetails != null) { + onVivoInstallReferrerReadListener.onVivoInstallReferrerRead(vivoInstallReferrerResult.vivoInstallReferrerDetails); + } + if (vivoInstallReferrerResult.error != null) { + onVivoInstallReferrerReadListener.onFail(vivoInstallReferrerResult.error); } - onVivoInstallReferrerReadListener.onVivoInstallReferrerRead(new VivoInstallReferrerDetails(referrerDetails)); } }.execute(context); } diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerResult.java b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerResult.java new file mode 100644 index 000000000..f3e2046f2 --- /dev/null +++ b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerResult.java @@ -0,0 +1,14 @@ +package com.adjust.sdk.vivo; + +public class VivoInstallReferrerResult { + public String error; + public VivoInstallReferrerDetails vivoInstallReferrerDetails; + + public VivoInstallReferrerResult(VivoInstallReferrerDetails vivoInstallReferrerDetails) { + this.vivoInstallReferrerDetails = vivoInstallReferrerDetails; + } + + public VivoInstallReferrerResult(String error) { + this.error = error; + } +} From f6fdc2123c0a5d0c3915ce2002b37d45fc0756e2 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 16 Apr 2024 10:31:31 +0200 Subject: [PATCH 051/540] refac:call get vivo referrer directly --- .../src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java index f25a28bb2..a664dd855 100644 --- a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java +++ b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java @@ -27,7 +27,7 @@ public static void getVivoInstallReferrer(final Context context, final OnVivoIns protected VivoInstallReferrerResult doInBackground(Context[] contexts) { VivoInstallReferrerDetails vivoInstallReferrerDetails = null; try { - ReferrerDetails referrerDetails = Util.getVivoInstallReferrerDetails(context, AdjustFactory.getLogger()); + ReferrerDetails referrerDetails = VivoReferrerClient.getReferrer(context, AdjustFactory.getLogger()); vivoInstallReferrerDetails = new VivoInstallReferrerDetails(referrerDetails); return new VivoInstallReferrerResult(vivoInstallReferrerDetails); } catch (Exception exception) { From f8b374ffecee81f44922cebc48ea1ed5aacc1690 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 16 Apr 2024 10:38:29 +0200 Subject: [PATCH 052/540] refac:check null result before proceed to check others --- .../java/com/adjust/sdk/vivo/AdjustVivoReferrer.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java index a664dd855..e429fd9b1 100644 --- a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java +++ b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java @@ -37,11 +37,13 @@ protected VivoInstallReferrerResult doInBackground(Context[] contexts) { @Override protected void onPostExecute(VivoInstallReferrerResult vivoInstallReferrerResult) { - if (vivoInstallReferrerResult.vivoInstallReferrerDetails != null) { - onVivoInstallReferrerReadListener.onVivoInstallReferrerRead(vivoInstallReferrerResult.vivoInstallReferrerDetails); - } - if (vivoInstallReferrerResult.error != null) { - onVivoInstallReferrerReadListener.onFail(vivoInstallReferrerResult.error); + if (vivoInstallReferrerResult != null) { + if (vivoInstallReferrerResult.vivoInstallReferrerDetails != null) { + onVivoInstallReferrerReadListener.onVivoInstallReferrerRead(vivoInstallReferrerResult.vivoInstallReferrerDetails); + } + if (vivoInstallReferrerResult.error != null) { + onVivoInstallReferrerReadListener.onFail(vivoInstallReferrerResult.error); + } } } }.execute(context); From 9ca612e749e6bb24eb2e56c0cc164ff130bedcff Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 16 Apr 2024 11:29:46 +0200 Subject: [PATCH 053/540] refac: to get error in return result from VivoReferrerClient getReferrer method --- .../com/adjust/sdk/vivo/AdjustVivoReferrer.java | 8 ++------ .../src/main/java/com/adjust/sdk/vivo/Util.java | 16 +++++++++++++++- .../sdk/vivo/VivoInstallReferrerDetails.java | 7 +++++++ .../com/adjust/sdk/vivo/VivoReferrerClient.java | 17 +++++++++++------ 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java index e429fd9b1..fbeb00fd6 100644 --- a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java +++ b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java @@ -25,11 +25,8 @@ public static void getVivoInstallReferrer(final Context context, final OnVivoIns new AsyncTaskExecutor() { @Override protected VivoInstallReferrerResult doInBackground(Context[] contexts) { - VivoInstallReferrerDetails vivoInstallReferrerDetails = null; try { - ReferrerDetails referrerDetails = VivoReferrerClient.getReferrer(context, AdjustFactory.getLogger()); - vivoInstallReferrerDetails = new VivoInstallReferrerDetails(referrerDetails); - return new VivoInstallReferrerResult(vivoInstallReferrerDetails); + return VivoReferrerClient.getReferrer(context, AdjustFactory.getLogger()); } catch (Exception exception) { return new VivoInstallReferrerResult(exception.getMessage()); } @@ -40,8 +37,7 @@ protected void onPostExecute(VivoInstallReferrerResult vivoInstallReferrerResult if (vivoInstallReferrerResult != null) { if (vivoInstallReferrerResult.vivoInstallReferrerDetails != null) { onVivoInstallReferrerReadListener.onVivoInstallReferrerRead(vivoInstallReferrerResult.vivoInstallReferrerDetails); - } - if (vivoInstallReferrerResult.error != null) { + } else if (vivoInstallReferrerResult.error != null) { onVivoInstallReferrerReadListener.onFail(vivoInstallReferrerResult.error); } } diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/Util.java b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/Util.java index 38dc9cf15..a1b579c68 100644 --- a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/Util.java +++ b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/Util.java @@ -11,6 +11,20 @@ public synchronized static ReferrerDetails getVivoInstallReferrerDetails(Context return null; } - return VivoReferrerClient.getReferrer(context, logger); + VivoInstallReferrerResult vivoInstallReferrerResult = VivoReferrerClient.getReferrer(context, logger); + if (vivoInstallReferrerResult.vivoInstallReferrerDetails == null) { + return null; + } + + VivoInstallReferrerDetails vivoInstallReferrerDetails = vivoInstallReferrerResult.vivoInstallReferrerDetails; + + return new ReferrerDetails(vivoInstallReferrerDetails.installReferrer, + vivoInstallReferrerDetails.referrerClickTimestampSeconds, + vivoInstallReferrerDetails.installBeginTimestampSeconds, + -1, + -1, + vivoInstallReferrerDetails.installVersion, + null, + null); } } diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerDetails.java b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerDetails.java index 69009ad68..7b4c6dbd8 100644 --- a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerDetails.java +++ b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerDetails.java @@ -10,6 +10,13 @@ public class VivoInstallReferrerDetails { public long installBeginTimestampSeconds; // The client-side timestamp, when app installation began. public String installVersion; // The app's version at the time when the app was first installed. + public VivoInstallReferrerDetails(String installReferrer, long referrerClickTimestampSeconds, long installBeginTimestampSeconds, String installVersion) { + this.installReferrer = installReferrer; + this.referrerClickTimestampSeconds = referrerClickTimestampSeconds; + this.installBeginTimestampSeconds = installBeginTimestampSeconds; + this.installVersion = installVersion; + } + VivoInstallReferrerDetails(ReferrerDetails referrerDetails){ if (referrerDetails == null){ return; diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoReferrerClient.java b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoReferrerClient.java index ecffbbe4c..ed444b279 100644 --- a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoReferrerClient.java +++ b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoReferrerClient.java @@ -9,27 +9,32 @@ import com.adjust.sdk.ReferrerDetails; public class VivoReferrerClient { - public static ReferrerDetails getReferrer(Context context, final ILogger logger) { + public static VivoInstallReferrerResult getReferrer(Context context, final ILogger logger) { + try { Uri url = Uri.parse("content://com.vivo.appstore.provider.referrer"); Bundle resultBundle = context.getContentResolver().call(url, "read_referrer", null, null); if (resultBundle == null) { - return null; + return new VivoInstallReferrerResult("VivoReferrer read error: resultBundle null"); } String installReferrer = resultBundle.getString("install_referrer"); if (TextUtils.isEmpty(installReferrer)) { - return null; + return new VivoInstallReferrerResult("VivoReferrer read error: referrer string null"); } long clickTime = resultBundle.getLong("referrer_click_timestamp_seconds"); long installBeginTime = resultBundle.getLong("download_begin_timestamp_seconds"); String installVersion = resultBundle.getString("install_version"); - return new ReferrerDetails(installReferrer, clickTime, installBeginTime, -1, -1, installVersion, null, null); + VivoInstallReferrerDetails vivoInstallReferrerDetails = new VivoInstallReferrerDetails( + installReferrer, clickTime, installBeginTime, installVersion); + return new VivoInstallReferrerResult(vivoInstallReferrerDetails); + } catch (Exception e) { - logger.info("VivoReferrer read error" + e.getMessage()); + String error = "VivoReferrer read error: " + e.getMessage(); + logger.info(error); + return new VivoInstallReferrerResult(error); } - return null; } } From d0b38e2f6c6be97422c1dad709dafd9654629730 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 9 Apr 2024 11:04:11 +0200 Subject: [PATCH 054/540] refac: add setOnSamsungInstallReferrerReadListener to the AdjustSamsungReferrer.java --- .../sdk/samsung/AdjustSamsungReferrer.java | 5 ++++ .../OnSamsungInstallReferrerReadListener.java | 7 +++++ .../java/com/adjust/sdk/samsung/Util.java | 29 ++++++++++--------- 3 files changed, 28 insertions(+), 13 deletions(-) create mode 100644 Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java index bbd8b0d07..be1c9bb75 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java @@ -5,6 +5,11 @@ public class AdjustSamsungReferrer { static boolean shouldReadSamsungReferrer = true; + public static OnSamsungInstallReferrerReadListener onSamsungInstallReferrerReadListener; + + public static void setOnSamsungInstallReferrerReadListener(OnSamsungInstallReferrerReadListener onSamsungInstallReferrerReadListener){ + AdjustSamsungReferrer.onSamsungInstallReferrerReadListener = onSamsungInstallReferrerReadListener; + } public static void readSamsungReferrer(Context context) { shouldReadSamsungReferrer = true; diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java new file mode 100644 index 000000000..19a80af7c --- /dev/null +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java @@ -0,0 +1,7 @@ +package com.adjust.sdk.samsung; + +import com.adjust.sdk.ReferrerDetails; + +public interface OnSamsungInstallReferrerReadListener { + void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi); +} diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java index 28d292a9c..e7a36a893 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java @@ -6,19 +6,22 @@ import com.adjust.sdk.ReferrerDetails; public class Util { - public synchronized static ReferrerDetails getSamsungInstallReferrerDetails(Context context, ILogger logger) { - if (!AdjustSamsungReferrer.shouldReadSamsungReferrer) { - return null; - } + public synchronized static ReferrerDetails getSamsungInstallReferrerDetails(Context context, ILogger logger) { + if (!AdjustSamsungReferrer.shouldReadSamsungReferrer) { + return null; + } - com.samsung.android.sdk.sinstallreferrer.api.ReferrerDetails referrerDetails = - SamsungReferrerClient.getReferrer(context, logger, 3000); - if (referrerDetails == null) { - return null; - } + com.samsung.android.sdk.sinstallreferrer.api.ReferrerDetails referrerDetails = + SamsungReferrerClient.getReferrer(context, logger, 2000); + if (referrerDetails == null) { + return null; + } - return new ReferrerDetails(referrerDetails.getInstallReferrer(), - referrerDetails.getReferrerClickTimestampSeconds(), - referrerDetails.getInstallBeginTimestampSeconds()); - } + ReferrerDetails returnReferrerDetails = new ReferrerDetails(referrerDetails.getInstallReferrer(), + referrerDetails.getReferrerClickTimestampSeconds(), + referrerDetails.getInstallBeginTimestampSeconds()); + + AdjustSamsungReferrer.onSamsungInstallReferrerReadListener.onInstallReferrerRead(returnReferrerDetails, "samsung"); + return returnReferrerDetails; + } } From ddafe8806aee781222e8a59255a67ab78f8c21c4 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 9 Apr 2024 13:43:54 +0200 Subject: [PATCH 055/540] refac: check Null before invoking the onInstallReferrerRead --- .../src/main/java/com/adjust/sdk/samsung/Util.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java index e7a36a893..c42939c76 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java @@ -2,6 +2,7 @@ import android.content.Context; +import com.adjust.sdk.Adjust; import com.adjust.sdk.ILogger; import com.adjust.sdk.ReferrerDetails; @@ -21,7 +22,9 @@ public synchronized static ReferrerDetails getSamsungInstallReferrerDetails(Cont referrerDetails.getReferrerClickTimestampSeconds(), referrerDetails.getInstallBeginTimestampSeconds()); - AdjustSamsungReferrer.onSamsungInstallReferrerReadListener.onInstallReferrerRead(returnReferrerDetails, "samsung"); + if (AdjustSamsungReferrer.onSamsungInstallReferrerReadListener != null) { + AdjustSamsungReferrer.onSamsungInstallReferrerReadListener.onInstallReferrerRead(returnReferrerDetails, "samsung"); + } return returnReferrerDetails; } } From f3f5c9b12d413bfb276a1912382c2c13f361ee7c Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 10 Apr 2024 09:56:11 +0200 Subject: [PATCH 056/540] refac: make getSamsungInstallReferrerDetails works individually --- .../sdk/samsung/AdjustSamsungReferrer.java | 19 ++++++++++++++++--- .../OnSamsungInstallReferrerReadListener.java | 1 + .../java/com/adjust/sdk/samsung/Util.java | 8 +------- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java index be1c9bb75..dacdf8259 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java @@ -1,14 +1,27 @@ package com.adjust.sdk.samsung; import android.content.Context; +import android.os.Handler; +import android.os.Looper; + +import com.adjust.sdk.AdjustFactory; +import com.adjust.sdk.ReferrerDetails; + public class AdjustSamsungReferrer { static boolean shouldReadSamsungReferrer = true; - public static OnSamsungInstallReferrerReadListener onSamsungInstallReferrerReadListener; - public static void setOnSamsungInstallReferrerReadListener(OnSamsungInstallReferrerReadListener onSamsungInstallReferrerReadListener){ - AdjustSamsungReferrer.onSamsungInstallReferrerReadListener = onSamsungInstallReferrerReadListener; + public static void setOnSamsungInstallReferrerReadListener(Context context ,OnSamsungInstallReferrerReadListener onSamsungInstallReferrerReadListener){ + Handler handler = new Handler(Looper.getMainLooper()); + handler.post(() -> { + try { + ReferrerDetails referrerDetails = Util.getSamsungInstallReferrerDetails(context, AdjustFactory.getLogger()); + onSamsungInstallReferrerReadListener.onInstallReferrerRead(referrerDetails,"samsung"); + }catch (Exception exception){ + onSamsungInstallReferrerReadListener.onFail(exception.getMessage()); + } + }); } public static void readSamsungReferrer(Context context) { diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java index 19a80af7c..bca0840ef 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java @@ -4,4 +4,5 @@ public interface OnSamsungInstallReferrerReadListener { void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi); + void onFail(String message); } diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java index c42939c76..6922cb61c 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java @@ -17,14 +17,8 @@ public synchronized static ReferrerDetails getSamsungInstallReferrerDetails(Cont if (referrerDetails == null) { return null; } - - ReferrerDetails returnReferrerDetails = new ReferrerDetails(referrerDetails.getInstallReferrer(), + return new ReferrerDetails(referrerDetails.getInstallReferrer(), referrerDetails.getReferrerClickTimestampSeconds(), referrerDetails.getInstallBeginTimestampSeconds()); - - if (AdjustSamsungReferrer.onSamsungInstallReferrerReadListener != null) { - AdjustSamsungReferrer.onSamsungInstallReferrerReadListener.onInstallReferrerRead(returnReferrerDetails, "samsung"); - } - return returnReferrerDetails; } } From 2ee3d89375abd6d174f031a61a5ada8d69cc3efe Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 10 Apr 2024 10:24:11 +0200 Subject: [PATCH 057/540] refac: use Constant.java instead of string for referrerApi --- .../java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java index dacdf8259..8c42b6852 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java @@ -5,6 +5,7 @@ import android.os.Looper; import com.adjust.sdk.AdjustFactory; +import com.adjust.sdk.Constants; import com.adjust.sdk.ReferrerDetails; @@ -17,7 +18,7 @@ public static void setOnSamsungInstallReferrerReadListener(Context context ,OnSa handler.post(() -> { try { ReferrerDetails referrerDetails = Util.getSamsungInstallReferrerDetails(context, AdjustFactory.getLogger()); - onSamsungInstallReferrerReadListener.onInstallReferrerRead(referrerDetails,"samsung"); + onSamsungInstallReferrerReadListener.onInstallReferrerRead(referrerDetails, Constants.REFERRER_API_SAMSUNG); }catch (Exception exception){ onSamsungInstallReferrerReadListener.onFail(exception.getMessage()); } From aa9d9e1742aca7ba0c3711778a3d75896e34336e Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 10 Apr 2024 11:41:27 +0200 Subject: [PATCH 058/540] refac: rename setOnSamsungInstallReferrerReadListener to getSamsungInstallReferrer remove referrerApi from onInstallReferrerRead rename onFail to onFailure --- .../java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java | 7 +++---- .../sdk/samsung/OnSamsungInstallReferrerReadListener.java | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java index 8c42b6852..b399910c3 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java @@ -5,7 +5,6 @@ import android.os.Looper; import com.adjust.sdk.AdjustFactory; -import com.adjust.sdk.Constants; import com.adjust.sdk.ReferrerDetails; @@ -13,14 +12,14 @@ public class AdjustSamsungReferrer { static boolean shouldReadSamsungReferrer = true; - public static void setOnSamsungInstallReferrerReadListener(Context context ,OnSamsungInstallReferrerReadListener onSamsungInstallReferrerReadListener){ + public static void getSamsungInstallReferrer(Context context ,OnSamsungInstallReferrerReadListener onSamsungInstallReferrerReadListener){ Handler handler = new Handler(Looper.getMainLooper()); handler.post(() -> { try { ReferrerDetails referrerDetails = Util.getSamsungInstallReferrerDetails(context, AdjustFactory.getLogger()); - onSamsungInstallReferrerReadListener.onInstallReferrerRead(referrerDetails, Constants.REFERRER_API_SAMSUNG); + onSamsungInstallReferrerReadListener.onInstallReferrerRead(referrerDetails); }catch (Exception exception){ - onSamsungInstallReferrerReadListener.onFail(exception.getMessage()); + onSamsungInstallReferrerReadListener.onFailure(exception.getMessage()); } }); } diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java index bca0840ef..7cea70e97 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java @@ -3,6 +3,6 @@ import com.adjust.sdk.ReferrerDetails; public interface OnSamsungInstallReferrerReadListener { - void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi); - void onFail(String message); + void onInstallReferrerRead(ReferrerDetails referrerDetails); + void onFailure(String message); } From 4467148d9ba981db7abc0794e7815e354da12d4a Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 11 Apr 2024 11:36:20 +0200 Subject: [PATCH 059/540] refac: replace Handler with AsyncTask --- .../sdk/samsung/AdjustSamsungReferrer.java | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java index b399910c3..f2c273b5a 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java @@ -6,6 +6,7 @@ import com.adjust.sdk.AdjustFactory; import com.adjust.sdk.ReferrerDetails; +import com.adjust.sdk.scheduler.AsyncTaskExecutor; public class AdjustSamsungReferrer { @@ -13,15 +14,29 @@ public class AdjustSamsungReferrer { static boolean shouldReadSamsungReferrer = true; public static void getSamsungInstallReferrer(Context context ,OnSamsungInstallReferrerReadListener onSamsungInstallReferrerReadListener){ - Handler handler = new Handler(Looper.getMainLooper()); - handler.post(() -> { - try { - ReferrerDetails referrerDetails = Util.getSamsungInstallReferrerDetails(context, AdjustFactory.getLogger()); - onSamsungInstallReferrerReadListener.onInstallReferrerRead(referrerDetails); - }catch (Exception exception){ - onSamsungInstallReferrerReadListener.onFailure(exception.getMessage()); + + new AsyncTaskExecutor() { + @Override + protected ReferrerDetails doInBackground(Context[] contexts) { + ReferrerDetails referrerDetails=null; + try { + referrerDetails = Util.getSamsungInstallReferrerDetails(context, AdjustFactory.getLogger()); + }catch (Exception exception){ + if (onSamsungInstallReferrerReadListener != null) { + onSamsungInstallReferrerReadListener.onFailure(exception.getMessage()); + } + } + return referrerDetails; + } + + @Override + protected void onPostExecute(ReferrerDetails referrerDetails) { + if (onSamsungInstallReferrerReadListener != null){ + onSamsungInstallReferrerReadListener.onInstallReferrerRead(referrerDetails); + } } - }); + }.execute(context); + } public static void readSamsungReferrer(Context context) { From a2581f73d4188ef5295542ff659461a92a2bf3b4 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 15 Apr 2024 12:08:56 +0200 Subject: [PATCH 060/540] refac: tuning the getSamsungInstallReferrer with adding comment and make params final create SamsungInstallReferrerDetails.java --- .../sdk/samsung/AdjustSamsungReferrer.java | 56 ++++++++++--------- .../OnSamsungInstallReferrerReadListener.java | 6 +- .../SamsungInstallReferrerDetails.java | 29 ++++++++++ 3 files changed, 62 insertions(+), 29 deletions(-) create mode 100644 Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerDetails.java diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java index f2c273b5a..7a88dd996 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java @@ -1,8 +1,6 @@ package com.adjust.sdk.samsung; import android.content.Context; -import android.os.Handler; -import android.os.Looper; import com.adjust.sdk.AdjustFactory; import com.adjust.sdk.ReferrerDetails; @@ -13,30 +11,38 @@ public class AdjustSamsungReferrer { static boolean shouldReadSamsungReferrer = true; - public static void getSamsungInstallReferrer(Context context ,OnSamsungInstallReferrerReadListener onSamsungInstallReferrerReadListener){ - - new AsyncTaskExecutor() { - @Override - protected ReferrerDetails doInBackground(Context[] contexts) { - ReferrerDetails referrerDetails=null; - try { - referrerDetails = Util.getSamsungInstallReferrerDetails(context, AdjustFactory.getLogger()); - }catch (Exception exception){ - if (onSamsungInstallReferrerReadListener != null) { - onSamsungInstallReferrerReadListener.onFailure(exception.getMessage()); + /** + * Called to get Samsung Install Referrer. + * + * @param context Application context + * @param onSamsungInstallReferrerReadListener Callback to obtain install referrer. + */ + public static void getSamsungInstallReferrer(final Context context, final OnSamsungInstallReferrerReadListener onSamsungInstallReferrerReadListener) { + new AsyncTaskExecutor() { + @Override + protected ReferrerDetails doInBackground(Context[] contexts) { + ReferrerDetails referrerDetails = null; + try { + referrerDetails = Util.getSamsungInstallReferrerDetails(context, AdjustFactory.getLogger()); + } catch (Exception exception) { + if (onSamsungInstallReferrerReadListener == null) { + AdjustFactory.getLogger().error("onSamsungInstallReferrerReadListener can not be null"); + return null; + } + onSamsungInstallReferrerReadListener.onFail(exception.getMessage()); } - } - return referrerDetails; - } - - @Override - protected void onPostExecute(ReferrerDetails referrerDetails) { - if (onSamsungInstallReferrerReadListener != null){ - onSamsungInstallReferrerReadListener.onInstallReferrerRead(referrerDetails); - } - } - }.execute(context); - + return referrerDetails; + } + + @Override + protected void onPostExecute(ReferrerDetails referrerDetails) { + if (onSamsungInstallReferrerReadListener == null) { + AdjustFactory.getLogger().error("onSamsungInstallReferrerReadListener can not be null"); + return; + } + onSamsungInstallReferrerReadListener.onInstallReferrerRead(new SamsungInstallReferrerDetails(referrerDetails)); + } + }.execute(context); } public static void readSamsungReferrer(Context context) { diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java index 7cea70e97..60817857a 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java @@ -1,8 +1,6 @@ package com.adjust.sdk.samsung; -import com.adjust.sdk.ReferrerDetails; - public interface OnSamsungInstallReferrerReadListener { - void onInstallReferrerRead(ReferrerDetails referrerDetails); - void onFailure(String message); + void onInstallReferrerRead(SamsungInstallReferrerDetails referrerDetails); + void onFail(String message); } diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerDetails.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerDetails.java new file mode 100644 index 000000000..5c38daa93 --- /dev/null +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerDetails.java @@ -0,0 +1,29 @@ +package com.adjust.sdk.samsung; + +import com.adjust.sdk.ReferrerDetails; +import com.adjust.sdk.Util; + +public class SamsungInstallReferrerDetails { + public String installReferrer; // The referrer URL of the installed package. + public long referrerClickTimestampSeconds; // The client-side timestamp, when the referrer click happened. + public long installBeginTimestampSeconds; // The client-side timestamp, when app installation began. + + SamsungInstallReferrerDetails(ReferrerDetails referrerDetails){ + if (referrerDetails == null){ + return; + } + this.installReferrer = referrerDetails.installReferrer; + this.referrerClickTimestampSeconds = referrerDetails.referrerClickTimestampSeconds; + this.installBeginTimestampSeconds = referrerDetails.installBeginTimestampSeconds; + } + + public String toString() { + return Util.formatString( + " installReferrer : %s" + + " referrerClickTimestampSeconds : %d" + + " installBeginTimestampSeconds : %d", + installReferrer, + referrerClickTimestampSeconds, + installBeginTimestampSeconds); + } +} From fd9afcea94476d6976cf2c9ea7c3afc9f64d65ce Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 16 Apr 2024 14:40:55 +0200 Subject: [PATCH 061/540] refac:create SamsungInstallReferrerResult.java to handle fail scenario and passing to the onPostExecute tuning the reading of the SamsungInstallReferrerDetails --- .../sdk/samsung/AdjustSamsungReferrer.java | 32 ++++++++++--------- .../OnSamsungInstallReferrerReadListener.java | 2 +- .../SamsungInstallReferrerDetails.java | 8 ++++- .../samsung/SamsungInstallReferrerResult.java | 14 ++++++++ .../sdk/samsung/SamsungReferrerClient.java | 20 ++++++++---- .../java/com/adjust/sdk/samsung/Util.java | 15 ++++++--- 6 files changed, 64 insertions(+), 27 deletions(-) create mode 100644 Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerResult.java diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java index 7a88dd996..77060e988 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java @@ -18,29 +18,31 @@ public class AdjustSamsungReferrer { * @param onSamsungInstallReferrerReadListener Callback to obtain install referrer. */ public static void getSamsungInstallReferrer(final Context context, final OnSamsungInstallReferrerReadListener onSamsungInstallReferrerReadListener) { - new AsyncTaskExecutor() { + + if (onSamsungInstallReferrerReadListener == null){ + AdjustFactory.getLogger().error("onSamsungInstallReferrerReadListener can not be null"); + return; + } + + new AsyncTaskExecutor() { @Override - protected ReferrerDetails doInBackground(Context[] contexts) { - ReferrerDetails referrerDetails = null; + protected SamsungInstallReferrerResult doInBackground(Context[] contexts) { try { - referrerDetails = Util.getSamsungInstallReferrerDetails(context, AdjustFactory.getLogger()); + return SamsungReferrerClient.getReferrer(context, AdjustFactory.getLogger(),2000); } catch (Exception exception) { - if (onSamsungInstallReferrerReadListener == null) { - AdjustFactory.getLogger().error("onSamsungInstallReferrerReadListener can not be null"); - return null; - } - onSamsungInstallReferrerReadListener.onFail(exception.getMessage()); + return new SamsungInstallReferrerResult(exception.getMessage()); } - return referrerDetails; } @Override - protected void onPostExecute(ReferrerDetails referrerDetails) { - if (onSamsungInstallReferrerReadListener == null) { - AdjustFactory.getLogger().error("onSamsungInstallReferrerReadListener can not be null"); - return; + protected void onPostExecute(SamsungInstallReferrerResult samsungInstallReferrerResult) { + if (samsungInstallReferrerResult != null) { + if (samsungInstallReferrerResult.samsungInstallReferrerDetails != null) { + onSamsungInstallReferrerReadListener.onSamsungInstallReferrerRead(samsungInstallReferrerResult.samsungInstallReferrerDetails); + } else if (samsungInstallReferrerResult.error != null) { + onSamsungInstallReferrerReadListener.onFail(samsungInstallReferrerResult.error); + } } - onSamsungInstallReferrerReadListener.onInstallReferrerRead(new SamsungInstallReferrerDetails(referrerDetails)); } }.execute(context); } diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java index 60817857a..269ea5678 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java @@ -1,6 +1,6 @@ package com.adjust.sdk.samsung; public interface OnSamsungInstallReferrerReadListener { - void onInstallReferrerRead(SamsungInstallReferrerDetails referrerDetails); + void onSamsungInstallReferrerRead(SamsungInstallReferrerDetails referrerDetails); void onFail(String message); } diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerDetails.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerDetails.java index 5c38daa93..152d9d661 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerDetails.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerDetails.java @@ -8,7 +8,7 @@ public class SamsungInstallReferrerDetails { public long referrerClickTimestampSeconds; // The client-side timestamp, when the referrer click happened. public long installBeginTimestampSeconds; // The client-side timestamp, when app installation began. - SamsungInstallReferrerDetails(ReferrerDetails referrerDetails){ + public SamsungInstallReferrerDetails(ReferrerDetails referrerDetails){ if (referrerDetails == null){ return; } @@ -17,6 +17,12 @@ public class SamsungInstallReferrerDetails { this.installBeginTimestampSeconds = referrerDetails.installBeginTimestampSeconds; } + public SamsungInstallReferrerDetails(String installReferrer, long referrerClickTimestampSeconds, long installBeginTimestampSeconds){ + this.installReferrer = installReferrer; + this.referrerClickTimestampSeconds = referrerClickTimestampSeconds; + this.installBeginTimestampSeconds = installBeginTimestampSeconds; + } + public String toString() { return Util.formatString( " installReferrer : %s" + diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerResult.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerResult.java new file mode 100644 index 000000000..91436d613 --- /dev/null +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerResult.java @@ -0,0 +1,14 @@ +package com.adjust.sdk.samsung; + +public class SamsungInstallReferrerResult { + public String error; + public SamsungInstallReferrerDetails samsungInstallReferrerDetails; + + SamsungInstallReferrerResult(SamsungInstallReferrerDetails samsungInstallReferrerDetails) { + this.samsungInstallReferrerDetails = samsungInstallReferrerDetails; + } + + public SamsungInstallReferrerResult(String error) { + this.error = error; + } +} diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungReferrerClient.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungReferrerClient.java index 3036df7b5..49548786e 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungReferrerClient.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungReferrerClient.java @@ -13,10 +13,10 @@ public class SamsungReferrerClient { - public static ReferrerDetails getReferrer(Context context, final ILogger logger, long maxWaitTimeInMilli) { + public static SamsungInstallReferrerResult getReferrer(Context context, final ILogger logger, long maxWaitTimeInMilli) { try { final InstallReferrerClient referrerClient = InstallReferrerClient.newBuilder(context).build(); - final BlockingQueue referrerDetailsHolder = new LinkedBlockingQueue(1); + final BlockingQueue referrerDetailsHolder = new LinkedBlockingQueue(1); referrerClient.startConnection(new InstallReferrerStateListener() { @Override public void onInstallReferrerSetupFinished(int responseCode) { @@ -24,8 +24,8 @@ public void onInstallReferrerSetupFinished(int responseCode) { switch (responseCode) { case InstallReferrerClient.InstallReferrerResponse.OK: try { - ReferrerDetails details = referrerClient.getInstallReferrer(); - referrerDetailsHolder.offer(details); + SamsungInstallReferrerDetails samsungInstallReferrerDetails = getSamsungInstallReferrerDetails(referrerClient); + referrerDetailsHolder.offer(new SamsungInstallReferrerResult(samsungInstallReferrerDetails)); } catch (Exception e) { logger.error("SamsungReferrer getInstallReferrer: " + e.getMessage()); } finally { @@ -53,9 +53,17 @@ public void onInstallReferrerServiceDisconnected() { return referrerDetailsHolder.poll(maxWaitTimeInMilli, TimeUnit.MILLISECONDS); } catch (Exception e) { - logger.error("Exception while getting referrer: ", e.getMessage()); + String error = "SamsungReferrer read error: " + e.getMessage(); + logger.info(error); + return new SamsungInstallReferrerResult(error); } + } - return null; + private static SamsungInstallReferrerDetails getSamsungInstallReferrerDetails(InstallReferrerClient referrerClient) { + ReferrerDetails details = referrerClient.getInstallReferrer(); + return new SamsungInstallReferrerDetails( + details.getInstallReferrer(), + details.getReferrerClickTimestampSeconds(), + details.getInstallBeginTimestampSeconds()); } } diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java index 6922cb61c..2030f766d 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java @@ -12,13 +12,20 @@ public synchronized static ReferrerDetails getSamsungInstallReferrerDetails(Cont return null; } - com.samsung.android.sdk.sinstallreferrer.api.ReferrerDetails referrerDetails = + SamsungInstallReferrerResult referrerDetails = SamsungReferrerClient.getReferrer(context, logger, 2000); if (referrerDetails == null) { return null; } - return new ReferrerDetails(referrerDetails.getInstallReferrer(), - referrerDetails.getReferrerClickTimestampSeconds(), - referrerDetails.getInstallBeginTimestampSeconds()); + SamsungInstallReferrerDetails samsungInstallReferrerDetails = referrerDetails.samsungInstallReferrerDetails; + + return new ReferrerDetails(samsungInstallReferrerDetails.installReferrer, + samsungInstallReferrerDetails.referrerClickTimestampSeconds, + samsungInstallReferrerDetails.installBeginTimestampSeconds, + -1, + -1, + null, + null, + null); } } From a88cab9c4be9e7b3c9b6aadcd7c25ddec7e209c2 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 16 Apr 2024 18:02:12 +0200 Subject: [PATCH 062/540] refac:remove redundant constructor of SamsungReferrerClient.java offer fails while fetching SamsungInstallReferrerDetails --- .../samsung/SamsungInstallReferrerDetails.java | 11 +---------- .../sdk/samsung/SamsungReferrerClient.java | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerDetails.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerDetails.java index 152d9d661..3a02bb7c8 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerDetails.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerDetails.java @@ -8,16 +8,7 @@ public class SamsungInstallReferrerDetails { public long referrerClickTimestampSeconds; // The client-side timestamp, when the referrer click happened. public long installBeginTimestampSeconds; // The client-side timestamp, when app installation began. - public SamsungInstallReferrerDetails(ReferrerDetails referrerDetails){ - if (referrerDetails == null){ - return; - } - this.installReferrer = referrerDetails.installReferrer; - this.referrerClickTimestampSeconds = referrerDetails.referrerClickTimestampSeconds; - this.installBeginTimestampSeconds = referrerDetails.installBeginTimestampSeconds; - } - - public SamsungInstallReferrerDetails(String installReferrer, long referrerClickTimestampSeconds, long installBeginTimestampSeconds){ + SamsungInstallReferrerDetails(String installReferrer, long referrerClickTimestampSeconds, long installBeginTimestampSeconds){ this.installReferrer = installReferrer; this.referrerClickTimestampSeconds = referrerClickTimestampSeconds; this.installBeginTimestampSeconds = installBeginTimestampSeconds; diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungReferrerClient.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungReferrerClient.java index 49548786e..b3aa8d332 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungReferrerClient.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungReferrerClient.java @@ -20,6 +20,7 @@ public static SamsungInstallReferrerResult getReferrer(Context context, final IL referrerClient.startConnection(new InstallReferrerStateListener() { @Override public void onInstallReferrerSetupFinished(int responseCode) { + String error; try { switch (responseCode) { case InstallReferrerClient.InstallReferrerResponse.OK: @@ -27,20 +28,29 @@ public void onInstallReferrerSetupFinished(int responseCode) { SamsungInstallReferrerDetails samsungInstallReferrerDetails = getSamsungInstallReferrerDetails(referrerClient); referrerDetailsHolder.offer(new SamsungInstallReferrerResult(samsungInstallReferrerDetails)); } catch (Exception e) { - logger.error("SamsungReferrer getInstallReferrer: " + e.getMessage()); + error = "SamsungReferrer getInstallReferrer: " + e.getMessage(); + referrerDetailsHolder.offer(new SamsungInstallReferrerResult(error)); + logger.error(error); + } finally { referrerClient.endConnection(); } break; case InstallReferrerClient.InstallReferrerResponse.FEATURE_NOT_SUPPORTED: - logger.info("SamsungReferrer onInstallReferrerSetupFinished: FEATURE_NOT_SUPPORTED"); + error = "SamsungReferrer onInstallReferrerSetupFinished: FEATURE_NOT_SUPPORTED"; + referrerDetailsHolder.offer(new SamsungInstallReferrerResult(error)); + logger.info(error); break; case InstallReferrerClient.InstallReferrerResponse.SERVICE_UNAVAILABLE: - logger.info("SamsungReferrer onInstallReferrerSetupFinished: SERVICE_UNAVAILABLE"); + error = "SamsungReferrer onInstallReferrerSetupFinished: SERVICE_UNAVAILABLE"; + referrerDetailsHolder.offer(new SamsungInstallReferrerResult(error)); + logger.info(error); break; } } catch (Exception e) { - logger.error("SamsungReferrer onInstallReferrerSetupFinished: " + e.getMessage()); + error = "SamsungReferrer onInstallReferrerSetupFinished: " + e.getMessage(); + referrerDetailsHolder.offer(new SamsungInstallReferrerResult(error)); + logger.error(error); } } From 7e809bcb85e52a3a5a4405435fb5a5a49136434b Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 17 Apr 2024 09:08:30 +0200 Subject: [PATCH 063/540] refac:check null before creating ReferrerDetails --- .../src/main/java/com/adjust/sdk/samsung/Util.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java index 2030f766d..e1c24ecf8 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java @@ -18,7 +18,9 @@ public synchronized static ReferrerDetails getSamsungInstallReferrerDetails(Cont return null; } SamsungInstallReferrerDetails samsungInstallReferrerDetails = referrerDetails.samsungInstallReferrerDetails; - + if (samsungInstallReferrerDetails == null) { + return null; + } return new ReferrerDetails(samsungInstallReferrerDetails.installReferrer, samsungInstallReferrerDetails.referrerClickTimestampSeconds, samsungInstallReferrerDetails.installBeginTimestampSeconds, From f7e0cf2f990336bc987e4e9db2dfb49852bf8445 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 17 Apr 2024 09:12:12 +0200 Subject: [PATCH 064/540] refac:rename referrerDetails to referrerResult --- .../src/main/java/com/adjust/sdk/samsung/Util.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java index e1c24ecf8..8b9f5dd93 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java @@ -12,12 +12,12 @@ public synchronized static ReferrerDetails getSamsungInstallReferrerDetails(Cont return null; } - SamsungInstallReferrerResult referrerDetails = + SamsungInstallReferrerResult referrerResult = SamsungReferrerClient.getReferrer(context, logger, 2000); - if (referrerDetails == null) { + if (referrerResult == null) { return null; } - SamsungInstallReferrerDetails samsungInstallReferrerDetails = referrerDetails.samsungInstallReferrerDetails; + SamsungInstallReferrerDetails samsungInstallReferrerDetails = referrerResult.samsungInstallReferrerDetails; if (samsungInstallReferrerDetails == null) { return null; } From ac91e70448287f247d3e746e60ebb911543d0160 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 18 Apr 2024 10:17:40 +0200 Subject: [PATCH 065/540] refac:cover else statement in post execute --- .../main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java index 77060e988..48005165e 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java @@ -42,6 +42,8 @@ protected void onPostExecute(SamsungInstallReferrerResult samsungInstallReferrer } else if (samsungInstallReferrerResult.error != null) { onSamsungInstallReferrerReadListener.onFail(samsungInstallReferrerResult.error); } + }else { + onSamsungInstallReferrerReadListener.onFail("SamsungReferrer getInstallReferrer: samsungInstallReferrerResult is null"); } } }.execute(context); From d888dcda1ac250d3a596e9d0c26f229d3083bc7a Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 18 Apr 2024 10:19:48 +0200 Subject: [PATCH 066/540] refac:cover else statement in post execute incase referrer Detail is null --- .../main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java index 48005165e..fbe9ded1a 100644 --- a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java +++ b/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java @@ -41,6 +41,8 @@ protected void onPostExecute(SamsungInstallReferrerResult samsungInstallReferrer onSamsungInstallReferrerReadListener.onSamsungInstallReferrerRead(samsungInstallReferrerResult.samsungInstallReferrerDetails); } else if (samsungInstallReferrerResult.error != null) { onSamsungInstallReferrerReadListener.onFail(samsungInstallReferrerResult.error); + }else { + onSamsungInstallReferrerReadListener.onFail("SamsungReferrer getInstallReferrer: samsungInstallReferrerDetails is null"); } }else { onSamsungInstallReferrerReadListener.onFail("SamsungReferrer getInstallReferrer: samsungInstallReferrerResult is null"); From 8aa7fa689150c259e0627b3c932040a60c711d32 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 9 Apr 2024 13:45:10 +0200 Subject: [PATCH 067/540] refac: add OnHuaweiInstallReferrerReadListener.java and add setListener --- .../java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java | 5 +++++ .../sdk/huawei/OnHuaweiInstallReferrerReadListener.java | 7 +++++++ 2 files changed, 12 insertions(+) create mode 100644 Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java index 62132efc1..197b5eb31 100644 --- a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java @@ -5,6 +5,11 @@ public class AdjustHuaweiReferrer { static boolean shouldReadHuaweiReferrer = true; + static OnHuaweiInstallReferrerReadListener onHuaweiInstallReferrerReadListener; + + public static void setOnHuaweiInstallReferrerReadListener(OnHuaweiInstallReferrerReadListener onHuaweiInstallReferrerReadListener){ + AdjustHuaweiReferrer.onHuaweiInstallReferrerReadListener = onHuaweiInstallReferrerReadListener; + } public static void readHuaweiReferrer(Context context) { shouldReadHuaweiReferrer = true; diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java new file mode 100644 index 000000000..ed206f2a3 --- /dev/null +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java @@ -0,0 +1,7 @@ +package com.adjust.sdk.huawei; + +import com.adjust.sdk.ReferrerDetails; + +public interface OnHuaweiInstallReferrerReadListener { + void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi); +} From 3e78cd90e960f48d809da9021559f2c8dc68c089 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 10 Apr 2024 10:21:37 +0200 Subject: [PATCH 068/540] refac: add setOnHuaweiInstallReferrerReadListener for both ads and appGallery source --- .../sdk/huawei/AdjustHuaweiReferrer.java | 38 +++++++++++++++++-- .../OnHuaweiInstallReferrerReadListener.java | 4 +- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java index 197b5eb31..fbc683df8 100644 --- a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java @@ -1,14 +1,46 @@ package com.adjust.sdk.huawei; +import static com.adjust.sdk.Constants.REFERRER_API_HUAWEI_ADS; +import static com.adjust.sdk.Constants.REFERRER_API_HUAWEI_APP_GALLERY; + import android.content.Context; +import android.os.Handler; +import android.os.Looper; + +import com.adjust.sdk.Adjust; +import com.adjust.sdk.AdjustFactory; +import com.adjust.sdk.ReferrerDetails; public class AdjustHuaweiReferrer { static boolean shouldReadHuaweiReferrer = true; - static OnHuaweiInstallReferrerReadListener onHuaweiInstallReferrerReadListener; - public static void setOnHuaweiInstallReferrerReadListener(OnHuaweiInstallReferrerReadListener onHuaweiInstallReferrerReadListener){ - AdjustHuaweiReferrer.onHuaweiInstallReferrerReadListener = onHuaweiInstallReferrerReadListener; + public static void setOnHuaweiInstallReferrerReadListener(Context context, OnHuaweiInstallReferrerReadListener onHuaweiInstallReferrerReadListener){ + Handler handlerAds = new Handler(Looper.getMainLooper()); + Handler handlerAppGallery = new Handler(Looper.getMainLooper()); + handlerAds.post(new Runnable() { + @Override + public void run() { + try { + ReferrerDetails referrerDetails = Util.getHuaweiAdsInstallReferrerDetails(context, AdjustFactory.getLogger()); + onHuaweiInstallReferrerReadListener.onHuaweiAdsInstallReferrerDetailsRead(referrerDetails,REFERRER_API_HUAWEI_ADS); + }catch (Exception exception){ + onHuaweiInstallReferrerReadListener.onFail(exception.getMessage()); + } + } + }); + handlerAppGallery.post(new Runnable() { + @Override + public void run() { + try { + ReferrerDetails referrerDetails = Util.getHuaweiAppGalleryInstallReferrerDetails(context, AdjustFactory.getLogger()); + onHuaweiInstallReferrerReadListener.onHuaweiAppGalleryInstallReferrerDetailsRead(referrerDetails,REFERRER_API_HUAWEI_APP_GALLERY); + }catch (Exception exception){ + onHuaweiInstallReferrerReadListener.onFail(exception.getMessage()); + } + } + }); + } public static void readHuaweiReferrer(Context context) { diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java index ed206f2a3..8e273161a 100644 --- a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java @@ -3,5 +3,7 @@ import com.adjust.sdk.ReferrerDetails; public interface OnHuaweiInstallReferrerReadListener { - void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi); + void onHuaweiAdsInstallReferrerDetailsRead(ReferrerDetails referrerDetails, String referrerApi); + void onHuaweiAppGalleryInstallReferrerDetailsRead(ReferrerDetails referrerDetails, String referrerApi); + void onFail(String message); } From f893d3fe2b8b0dc7acc9b02e95ef3e2b5053c0bc Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 10 Apr 2024 11:38:15 +0200 Subject: [PATCH 069/540] refac: rename setOnHuaweiInstallReferrerReadListener to getHuaweiInstallReferrer remove referrerApi from onInstallReferrerRead rename onFail to onFailure --- .../com/adjust/sdk/huawei/AdjustHuaweiReferrer.java | 10 +++++----- .../huawei/OnHuaweiInstallReferrerReadListener.java | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java index fbc683df8..543a97ddc 100644 --- a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java @@ -15,7 +15,7 @@ public class AdjustHuaweiReferrer { static boolean shouldReadHuaweiReferrer = true; - public static void setOnHuaweiInstallReferrerReadListener(Context context, OnHuaweiInstallReferrerReadListener onHuaweiInstallReferrerReadListener){ + public static void getHuaweiInstallReferrer(Context context, OnHuaweiInstallReferrerReadListener onHuaweiInstallReferrerReadListener){ Handler handlerAds = new Handler(Looper.getMainLooper()); Handler handlerAppGallery = new Handler(Looper.getMainLooper()); handlerAds.post(new Runnable() { @@ -23,9 +23,9 @@ public static void setOnHuaweiInstallReferrerReadListener(Context context, OnHua public void run() { try { ReferrerDetails referrerDetails = Util.getHuaweiAdsInstallReferrerDetails(context, AdjustFactory.getLogger()); - onHuaweiInstallReferrerReadListener.onHuaweiAdsInstallReferrerDetailsRead(referrerDetails,REFERRER_API_HUAWEI_ADS); + onHuaweiInstallReferrerReadListener.onHuaweiAdsInstallReferrerDetailsRead(referrerDetails); }catch (Exception exception){ - onHuaweiInstallReferrerReadListener.onFail(exception.getMessage()); + onHuaweiInstallReferrerReadListener.onFailure(exception.getMessage()); } } }); @@ -34,9 +34,9 @@ public void run() { public void run() { try { ReferrerDetails referrerDetails = Util.getHuaweiAppGalleryInstallReferrerDetails(context, AdjustFactory.getLogger()); - onHuaweiInstallReferrerReadListener.onHuaweiAppGalleryInstallReferrerDetailsRead(referrerDetails,REFERRER_API_HUAWEI_APP_GALLERY); + onHuaweiInstallReferrerReadListener.onHuaweiAppGalleryInstallReferrerDetailsRead(referrerDetails); }catch (Exception exception){ - onHuaweiInstallReferrerReadListener.onFail(exception.getMessage()); + onHuaweiInstallReferrerReadListener.onFailure(exception.getMessage()); } } }); diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java index 8e273161a..e4554b85e 100644 --- a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java @@ -3,7 +3,7 @@ import com.adjust.sdk.ReferrerDetails; public interface OnHuaweiInstallReferrerReadListener { - void onHuaweiAdsInstallReferrerDetailsRead(ReferrerDetails referrerDetails, String referrerApi); - void onHuaweiAppGalleryInstallReferrerDetailsRead(ReferrerDetails referrerDetails, String referrerApi); - void onFail(String message); + void onHuaweiAdsInstallReferrerDetailsRead(ReferrerDetails referrerDetails); + void onHuaweiAppGalleryInstallReferrerDetailsRead(ReferrerDetails referrerDetails); + void onFailure(String message); } From 76ae12336cda26a3d3a1f6930aafa8313e06437c Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 15 Apr 2024 14:04:00 +0200 Subject: [PATCH 070/540] refac: tuning the getHuaweiInstallReferrer with adding comment and make params final create HuaweiInstallReferrerDetails.java --- .../sdk/huawei/AdjustHuaweiReferrer.java | 72 +++++++++++++------ .../huawei/HuaweiInstallReferrerDetails.java | 29 ++++++++ .../OnHuaweiInstallReferrerReadListener.java | 6 +- 3 files changed, 81 insertions(+), 26 deletions(-) create mode 100644 Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerDetails.java diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java index 543a97ddc..447564e82 100644 --- a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java @@ -1,46 +1,72 @@ package com.adjust.sdk.huawei; -import static com.adjust.sdk.Constants.REFERRER_API_HUAWEI_ADS; -import static com.adjust.sdk.Constants.REFERRER_API_HUAWEI_APP_GALLERY; - import android.content.Context; -import android.os.Handler; -import android.os.Looper; -import com.adjust.sdk.Adjust; import com.adjust.sdk.AdjustFactory; import com.adjust.sdk.ReferrerDetails; +import com.adjust.sdk.scheduler.AsyncTaskExecutor; public class AdjustHuaweiReferrer { static boolean shouldReadHuaweiReferrer = true; - public static void getHuaweiInstallReferrer(Context context, OnHuaweiInstallReferrerReadListener onHuaweiInstallReferrerReadListener){ - Handler handlerAds = new Handler(Looper.getMainLooper()); - Handler handlerAppGallery = new Handler(Looper.getMainLooper()); - handlerAds.post(new Runnable() { + /** + * Called to get Huawei Install Referrer. + * + * @param context Application context + * @param onHuaweiInstallReferrerReadListener Callback to obtain install referrer. + */ + public static void getHuaweiInstallReferrer(final Context context, final OnHuaweiInstallReferrerReadListener onHuaweiInstallReferrerReadListener) { + new AsyncTaskExecutor() { @Override - public void run() { + protected ReferrerDetails doInBackground(Context[] contexts) { + ReferrerDetails referrerDetails = null; try { - ReferrerDetails referrerDetails = Util.getHuaweiAdsInstallReferrerDetails(context, AdjustFactory.getLogger()); - onHuaweiInstallReferrerReadListener.onHuaweiAdsInstallReferrerDetailsRead(referrerDetails); - }catch (Exception exception){ - onHuaweiInstallReferrerReadListener.onFailure(exception.getMessage()); + referrerDetails = Util.getHuaweiAppGalleryInstallReferrerDetails(context, AdjustFactory.getLogger()); + } catch (Exception exception) { + if (onHuaweiInstallReferrerReadListener == null) { + AdjustFactory.getLogger().error("onHuaweiInstallReferrerReadListener can not be null"); + return null; + } + onHuaweiInstallReferrerReadListener.onFail(exception.getMessage()); + } + return referrerDetails; + } + + @Override + protected void onPostExecute(ReferrerDetails referrerDetails) { + if (onHuaweiInstallReferrerReadListener == null) { + AdjustFactory.getLogger().error("onHuaweiInstallReferrerReadListener can not be null"); + return; } + onHuaweiInstallReferrerReadListener.onHuaweiAppGalleryInstallReferrerDetailsRead(new HuaweiInstallReferrerDetails(referrerDetails)); } - }); - handlerAppGallery.post(new Runnable() { + }.execute(context); + new AsyncTaskExecutor() { @Override - public void run() { + protected ReferrerDetails doInBackground(Context[] contexts) { + ReferrerDetails referrerDetails = null; try { - ReferrerDetails referrerDetails = Util.getHuaweiAppGalleryInstallReferrerDetails(context, AdjustFactory.getLogger()); - onHuaweiInstallReferrerReadListener.onHuaweiAppGalleryInstallReferrerDetailsRead(referrerDetails); - }catch (Exception exception){ - onHuaweiInstallReferrerReadListener.onFailure(exception.getMessage()); + referrerDetails = Util.getHuaweiAdsInstallReferrerDetails(context, AdjustFactory.getLogger()); + } catch (Exception exception) { + if (onHuaweiInstallReferrerReadListener == null) { + AdjustFactory.getLogger().error("onHuaweiInstallReferrerReadListener can not be null"); + return null; + } + onHuaweiInstallReferrerReadListener.onFail(exception.getMessage()); } + return referrerDetails; } - }); + @Override + protected void onPostExecute(ReferrerDetails referrerDetails) { + if (onHuaweiInstallReferrerReadListener == null) { + AdjustFactory.getLogger().error("onHuaweiInstallReferrerReadListener can not be null"); + return; + } + onHuaweiInstallReferrerReadListener.onHuaweiAdsInstallReferrerDetailsRead(new HuaweiInstallReferrerDetails(referrerDetails)); + } + }.execute(context); } public static void readHuaweiReferrer(Context context) { diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerDetails.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerDetails.java new file mode 100644 index 000000000..f6e832a17 --- /dev/null +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerDetails.java @@ -0,0 +1,29 @@ +package com.adjust.sdk.huawei; + +import com.adjust.sdk.ReferrerDetails; +import com.adjust.sdk.Util; + +public class HuaweiInstallReferrerDetails { + public String installReferrer; // The referrer URL of the installed package. + public long referrerClickTimestampSeconds; // The client-side timestamp, when the referrer click happened. + public long installBeginTimestampSeconds; // The client-side timestamp, when app installation began. + + HuaweiInstallReferrerDetails(ReferrerDetails referrerDetails){ + if (referrerDetails == null){ + return; + } + this.installReferrer = referrerDetails.installReferrer; + this.referrerClickTimestampSeconds = referrerDetails.referrerClickTimestampSeconds; + this.installBeginTimestampSeconds = referrerDetails.installBeginTimestampSeconds;; + } + + public String toString() { + return Util.formatString( + " installReferrer : %s" + + " referrerClickTimestampSeconds : %d" + + " installBeginTimestampSeconds : %d", + installReferrer, + referrerClickTimestampSeconds, + installBeginTimestampSeconds); + } +} diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java index e4554b85e..a6cc6da86 100644 --- a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java @@ -3,7 +3,7 @@ import com.adjust.sdk.ReferrerDetails; public interface OnHuaweiInstallReferrerReadListener { - void onHuaweiAdsInstallReferrerDetailsRead(ReferrerDetails referrerDetails); - void onHuaweiAppGalleryInstallReferrerDetailsRead(ReferrerDetails referrerDetails); - void onFailure(String message); + void onHuaweiAdsInstallReferrerDetailsRead(HuaweiInstallReferrerDetails referrerDetails); + void onHuaweiAppGalleryInstallReferrerDetailsRead(HuaweiInstallReferrerDetails referrerDetails); + void onFail(String message); } From 52cc08941bb9fab4cbeb88a60bf940238d2e04a8 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 16 Apr 2024 09:48:58 +0200 Subject: [PATCH 071/540] refac: check null for onHuaweiInstallReferrerReadListener before trying to read --- .../java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java index 447564e82..ce1dafdfd 100644 --- a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java @@ -17,6 +17,10 @@ public class AdjustHuaweiReferrer { * @param onHuaweiInstallReferrerReadListener Callback to obtain install referrer. */ public static void getHuaweiInstallReferrer(final Context context, final OnHuaweiInstallReferrerReadListener onHuaweiInstallReferrerReadListener) { + if (onHuaweiInstallReferrerReadListener == null){ + AdjustFactory.getLogger().error("onHuaweiInstallReferrerReadListener can not be null"); + return; + } new AsyncTaskExecutor() { @Override protected ReferrerDetails doInBackground(Context[] contexts) { @@ -35,8 +39,7 @@ protected ReferrerDetails doInBackground(Context[] contexts) { @Override protected void onPostExecute(ReferrerDetails referrerDetails) { - if (onHuaweiInstallReferrerReadListener == null) { - AdjustFactory.getLogger().error("onHuaweiInstallReferrerReadListener can not be null"); + if (referrerDetails == null) { return; } onHuaweiInstallReferrerReadListener.onHuaweiAppGalleryInstallReferrerDetailsRead(new HuaweiInstallReferrerDetails(referrerDetails)); From bac5485989c3f79bcda7be5cb5d85e2a384bf4ca Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 17 Apr 2024 10:25:46 +0200 Subject: [PATCH 072/540] refac:adding HuaweiInstallReferrerResult refactor HuaweiReferrerClient.java to return the result class --- .../huawei/HuaweiInstallReferrerDetails.java | 7 +++ .../huawei/HuaweiInstallReferrerResult.java | 14 +++++ .../sdk/huawei/HuaweiReferrerClient.java | 55 ++++++++++++------- .../main/java/com/adjust/sdk/huawei/Util.java | 47 ++++++++++++---- 4 files changed, 90 insertions(+), 33 deletions(-) create mode 100644 Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerResult.java diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerDetails.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerDetails.java index f6e832a17..16b0de9ab 100644 --- a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerDetails.java +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerDetails.java @@ -17,6 +17,13 @@ public class HuaweiInstallReferrerDetails { this.installBeginTimestampSeconds = referrerDetails.installBeginTimestampSeconds;; } + public HuaweiInstallReferrerDetails (String installReferrer, long referrerClickTimestampSeconds, long installBeginTimestampSeconds) { + this.installReferrer = installReferrer; + this.referrerClickTimestampSeconds = referrerClickTimestampSeconds; + this.installBeginTimestampSeconds = installBeginTimestampSeconds; + + } + public String toString() { return Util.formatString( " installReferrer : %s" + diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerResult.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerResult.java new file mode 100644 index 000000000..fa3aa9fc7 --- /dev/null +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerResult.java @@ -0,0 +1,14 @@ +package com.adjust.sdk.huawei; + +public class HuaweiInstallReferrerResult { + public String error; + public HuaweiInstallReferrerDetails huaweiInstallReferrerDetails; + + HuaweiInstallReferrerResult(HuaweiInstallReferrerDetails huaweiInstallReferrerDetails) { + this.huaweiInstallReferrerDetails = huaweiInstallReferrerDetails; + } + + public HuaweiInstallReferrerResult(String error) { + this.error = error; + } +} \ No newline at end of file diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiReferrerClient.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiReferrerClient.java index 72c4bdd5a..d973aadbd 100644 --- a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiReferrerClient.java +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiReferrerClient.java @@ -7,6 +7,7 @@ import com.adjust.sdk.ILogger; import com.adjust.sdk.ReferrerDetails; +import com.adjust.sdk.Util; import java.util.concurrent.atomic.AtomicBoolean; @@ -58,15 +59,18 @@ public class HuaweiReferrerClient { */ private static final AtomicBoolean shouldTryToReadHuaweiAppGalleryReferrer = new AtomicBoolean(true); - public static ReferrerDetails getHuaweiAdsInstallReferrer(Context context, final ILogger logger) { + public static HuaweiInstallReferrerResult getHuaweiAdsInstallReferrer(Context context, final ILogger logger) { + String errorMessage = null; if (!shouldTryToReadHuaweiAdsReferrer.get()) { - logger.debug("Should not try to read HuaweiAdsInstallReferrer"); - return null; + errorMessage = "Should not try to read HuaweiAdsInstallReferrer"; + logger.info(errorMessage); + return new HuaweiInstallReferrerResult(errorMessage); } if (!resolveContentProvider(context, REFERRER_PROVIDER_AUTHORITY)) { - return null; + errorMessage = "HuaweiAdsInstallReferrer fail to resolve content provider"; + return new HuaweiInstallReferrerResult(errorMessage); } Cursor cursor = null; @@ -93,38 +97,43 @@ public static ReferrerDetails getHuaweiAdsInstallReferrer(Context context, final long installBeginTimestampSeconds = Long.parseLong(installTime); if (isValidHuaweiAdsInstallReferrer(referrerHuaweiAds)) { - return new ReferrerDetails(referrerHuaweiAds, - referrerClickTimestampSeconds, - installBeginTimestampSeconds); + HuaweiInstallReferrerDetails huaweiInstallReferrerDetails = new HuaweiInstallReferrerDetails(referrerHuaweiAds, + referrerClickTimestampSeconds, + installBeginTimestampSeconds); + return new HuaweiInstallReferrerResult(huaweiInstallReferrerDetails); } } else { - logger.debug("HuaweiAdsInstallReferrer fail to read referrer for " + + errorMessage = Util.formatString("HuaweiAdsInstallReferrer fail to read referrer for " + "package [%s] and content uri [%s]", context.getPackageName(), uri.toString()); + logger.debug(errorMessage); } shouldTryToReadHuaweiAdsReferrer.set(false); } catch (Exception e) { - logger.debug("HuaweiAdsInstallReferrer error [%s]", e.getMessage()); + errorMessage = "HuaweiAdsInstallReferrer error [" + e.getMessage() + "]"; + logger.debug(errorMessage); } finally { if (cursor != null) { cursor.close(); } } - - return null; + return new HuaweiInstallReferrerResult(errorMessage); } - public static ReferrerDetails getHuaweiAppGalleryInstallReferrer(Context context, final ILogger logger) { + public static HuaweiInstallReferrerResult getHuaweiAppGalleryInstallReferrer(Context context, final ILogger logger) { + String errorMessage = null; if (!shouldTryToReadHuaweiAppGalleryReferrer.get()) { - logger.debug("Should not try to read HuaweiAppGalleryInstallReferrer"); - return null; + errorMessage = "Should not try to read HuaweiAppGalleryInstallReferrer"; + logger.debug(errorMessage); + return new HuaweiInstallReferrerResult(errorMessage); } if (!resolveContentProvider(context, REFERRER_PROVIDER_AUTHORITY)) { - return null; + errorMessage = "HuaweiAppGalleryInstallReferrer fail to resolve content provider"; + return new HuaweiInstallReferrerResult(errorMessage); } Cursor cursor = null; @@ -151,28 +160,32 @@ public static ReferrerDetails getHuaweiAppGalleryInstallReferrer(Context context long installBeginTimestampSeconds = Long.parseLong(installTime); if (isValidHuaweiAppGalleryInstallReferrer(referrerHuaweiAppGallery)) { - return new ReferrerDetails(referrerHuaweiAppGallery, - referrerClickTimestampSeconds, - installBeginTimestampSeconds); + HuaweiInstallReferrerDetails huaweiInstallReferrerDetails = new HuaweiInstallReferrerDetails(referrerHuaweiAppGallery, + referrerClickTimestampSeconds, + installBeginTimestampSeconds); + return new HuaweiInstallReferrerResult(huaweiInstallReferrerDetails); } } else { - logger.debug("HuaweiAppGalleryInstallReferrer fail to read referrer for " + + errorMessage = Util.formatString( + "HuaweiAppGalleryInstallReferrer fail to read referrer for " + "package [%s] and content uri [%s]", context.getPackageName(), uri.toString()); + logger.debug(errorMessage); } shouldTryToReadHuaweiAppGalleryReferrer.set(false); } catch (Exception e) { - logger.debug("HuaweiAppGalleryInstallReferrer error [%s]", e.getMessage()); + errorMessage = "HuaweiAppGalleryInstallReferrer error [" + e.getMessage() + "]"; + logger.debug(errorMessage); } finally { if (cursor != null) { cursor.close(); } } - return null; + return new HuaweiInstallReferrerResult(errorMessage); } private static boolean resolveContentProvider(final Context applicationContext, diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/Util.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/Util.java index 6f4cb7739..d454ecccf 100644 --- a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/Util.java +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/Util.java @@ -6,19 +6,42 @@ import com.adjust.sdk.ReferrerDetails; public class Util { - public synchronized static ReferrerDetails getHuaweiAdsInstallReferrerDetails(Context context, ILogger logger) { - if (!AdjustHuaweiReferrer.shouldReadHuaweiReferrer) { - return null; - } + public synchronized static ReferrerDetails getHuaweiAdsInstallReferrerDetails(Context context, ILogger logger) { + if (!AdjustHuaweiReferrer.shouldReadHuaweiReferrer) { + return null; + } + HuaweiInstallReferrerResult huaweiInstallReferrerResult = HuaweiReferrerClient.getHuaweiAdsInstallReferrer(context, logger); + if (huaweiInstallReferrerResult == null) { + return null; + } + if (huaweiInstallReferrerResult.huaweiInstallReferrerDetails == null) { + return null; + } + HuaweiInstallReferrerDetails huaweiInstallReferrerDetails = huaweiInstallReferrerResult.huaweiInstallReferrerDetails; + return new ReferrerDetails( + huaweiInstallReferrerDetails.installReferrer, + huaweiInstallReferrerDetails.referrerClickTimestampSeconds, + huaweiInstallReferrerDetails.installBeginTimestampSeconds); + } - return HuaweiReferrerClient.getHuaweiAdsInstallReferrer(context, logger); - } + public synchronized static ReferrerDetails getHuaweiAppGalleryInstallReferrerDetails(Context context, ILogger logger) { + if (!AdjustHuaweiReferrer.shouldReadHuaweiReferrer) { + return null; + } - public synchronized static ReferrerDetails getHuaweiAppGalleryInstallReferrerDetails(Context context, ILogger logger) { - if (!AdjustHuaweiReferrer.shouldReadHuaweiReferrer) { - return null; - } + HuaweiInstallReferrerResult huaweiInstallReferrerResult = HuaweiReferrerClient.getHuaweiAppGalleryInstallReferrer(context, logger); + if (huaweiInstallReferrerResult == null) { + return null; + } + if (huaweiInstallReferrerResult.huaweiInstallReferrerDetails == null) { + return null; + } - return HuaweiReferrerClient.getHuaweiAppGalleryInstallReferrer(context, logger); - } + HuaweiInstallReferrerDetails huaweiInstallReferrerDetails = huaweiInstallReferrerResult.huaweiInstallReferrerDetails; + return new ReferrerDetails( + huaweiInstallReferrerDetails.installReferrer, + huaweiInstallReferrerDetails.referrerClickTimestampSeconds, + huaweiInstallReferrerDetails.installBeginTimestampSeconds + ); + } } From 21e9d6a05c5b7407a33cb51e81b7d3bbc803436f Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 18 Apr 2024 10:30:11 +0200 Subject: [PATCH 073/540] refac:make asyncTasks param from referrerDetail to result for covering fail messages --- .../sdk/huawei/AdjustHuaweiReferrer.java | 61 ++++++++++--------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java index ce1dafdfd..713fca8f7 100644 --- a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java @@ -21,53 +21,54 @@ public static void getHuaweiInstallReferrer(final Context context, final OnHuawe AdjustFactory.getLogger().error("onHuaweiInstallReferrerReadListener can not be null"); return; } - new AsyncTaskExecutor() { + new AsyncTaskExecutor() { @Override - protected ReferrerDetails doInBackground(Context[] contexts) { - ReferrerDetails referrerDetails = null; + protected HuaweiInstallReferrerResult doInBackground(Context[] contexts) { try { - referrerDetails = Util.getHuaweiAppGalleryInstallReferrerDetails(context, AdjustFactory.getLogger()); + return HuaweiReferrerClient.getHuaweiAppGalleryInstallReferrer(context, AdjustFactory.getLogger()); } catch (Exception exception) { - if (onHuaweiInstallReferrerReadListener == null) { - AdjustFactory.getLogger().error("onHuaweiInstallReferrerReadListener can not be null"); - return null; - } - onHuaweiInstallReferrerReadListener.onFail(exception.getMessage()); + return new HuaweiInstallReferrerResult(exception.getMessage()); } - return referrerDetails; } @Override - protected void onPostExecute(ReferrerDetails referrerDetails) { - if (referrerDetails == null) { - return; + protected void onPostExecute(HuaweiInstallReferrerResult huaweiInstallReferrerResult) { + if (huaweiInstallReferrerResult != null) { + if (huaweiInstallReferrerResult.huaweiInstallReferrerDetails != null) { + onHuaweiInstallReferrerReadListener.onHuaweiAppGalleryInstallReferrerDetailsRead(huaweiInstallReferrerResult.huaweiInstallReferrerDetails); + } else if (huaweiInstallReferrerResult.error != null) { + onHuaweiInstallReferrerReadListener.onFail(huaweiInstallReferrerResult.error); + }else { + onHuaweiInstallReferrerReadListener.onFail("HuaweiReferrer getInstallReferrer: huaweiInstallReferrerDetails is null"); + } + }else { + onHuaweiInstallReferrerReadListener.onFail("HuaweiReferrer getInstallReferrer: huaweiInstallReferrerResult is null"); } - onHuaweiInstallReferrerReadListener.onHuaweiAppGalleryInstallReferrerDetailsRead(new HuaweiInstallReferrerDetails(referrerDetails)); } }.execute(context); - new AsyncTaskExecutor() { + + new AsyncTaskExecutor() { @Override - protected ReferrerDetails doInBackground(Context[] contexts) { - ReferrerDetails referrerDetails = null; + protected HuaweiInstallReferrerResult doInBackground(Context[] contexts) { try { - referrerDetails = Util.getHuaweiAdsInstallReferrerDetails(context, AdjustFactory.getLogger()); + return HuaweiReferrerClient.getHuaweiAdsInstallReferrer(context, AdjustFactory.getLogger()); } catch (Exception exception) { - if (onHuaweiInstallReferrerReadListener == null) { - AdjustFactory.getLogger().error("onHuaweiInstallReferrerReadListener can not be null"); - return null; - } - onHuaweiInstallReferrerReadListener.onFail(exception.getMessage()); + return new HuaweiInstallReferrerResult(exception.getMessage()); } - return referrerDetails; } - @Override - protected void onPostExecute(ReferrerDetails referrerDetails) { - if (onHuaweiInstallReferrerReadListener == null) { - AdjustFactory.getLogger().error("onHuaweiInstallReferrerReadListener can not be null"); - return; + protected void onPostExecute(HuaweiInstallReferrerResult huaweiInstallReferrerResult) { + if (huaweiInstallReferrerResult != null) { + if (huaweiInstallReferrerResult.huaweiInstallReferrerDetails != null) { + onHuaweiInstallReferrerReadListener.onHuaweiAdsInstallReferrerDetailsRead(huaweiInstallReferrerResult.huaweiInstallReferrerDetails); + } else if (huaweiInstallReferrerResult.error != null) { + onHuaweiInstallReferrerReadListener.onFail(huaweiInstallReferrerResult.error); + }else { + onHuaweiInstallReferrerReadListener.onFail("HuaweiReferrer getInstallReferrer: huaweiInstallReferrerDetails is null"); + } + }else { + onHuaweiInstallReferrerReadListener.onFail("HuaweiReferrer getInstallReferrer: huaweiInstallReferrerResult is null"); } - onHuaweiInstallReferrerReadListener.onHuaweiAdsInstallReferrerDetailsRead(new HuaweiInstallReferrerDetails(referrerDetails)); } }.execute(context); } From eb322ac32cab3b7bb90c15b3afb5653e6005483a Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 18 Apr 2024 10:35:03 +0200 Subject: [PATCH 074/540] refac:return error result in invalid referrer --- .../main/java/com/adjust/sdk/huawei/HuaweiReferrerClient.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiReferrerClient.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiReferrerClient.java index d973aadbd..787df3f16 100644 --- a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiReferrerClient.java +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiReferrerClient.java @@ -101,6 +101,8 @@ public static HuaweiInstallReferrerResult getHuaweiAdsInstallReferrer(Context co referrerClickTimestampSeconds, installBeginTimestampSeconds); return new HuaweiInstallReferrerResult(huaweiInstallReferrerDetails); + }else { + return new HuaweiInstallReferrerResult("Invalid HuaweiAdsInstallReferrer"); } } else { @@ -164,6 +166,8 @@ public static HuaweiInstallReferrerResult getHuaweiAppGalleryInstallReferrer(Con referrerClickTimestampSeconds, installBeginTimestampSeconds); return new HuaweiInstallReferrerResult(huaweiInstallReferrerDetails); + }else { + new HuaweiInstallReferrerResult("Invalid HuaweiAppGalleryInstallReferrer"); } } else { From d4627aebfb2539a4f2cea6eb72b20dd7c89ce77f Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 18 Apr 2024 15:59:37 +0200 Subject: [PATCH 075/540] refac:separate huawei install referrer getter by their sources in getHuaweiAppGalleryInstallReferrer and getHuaweiAdsInstallReferrer --- .../com/adjust/sdk/huawei/AdjustHuaweiReferrer.java | 13 ++++++++++--- .../huawei/OnHuaweiInstallReferrerReadListener.java | 3 +-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java index 713fca8f7..fe4ed5da5 100644 --- a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java @@ -16,7 +16,7 @@ public class AdjustHuaweiReferrer { * @param context Application context * @param onHuaweiInstallReferrerReadListener Callback to obtain install referrer. */ - public static void getHuaweiInstallReferrer(final Context context, final OnHuaweiInstallReferrerReadListener onHuaweiInstallReferrerReadListener) { + public static void getHuaweiAppGalleryInstallReferrer(final Context context, final OnHuaweiInstallReferrerReadListener onHuaweiInstallReferrerReadListener) { if (onHuaweiInstallReferrerReadListener == null){ AdjustFactory.getLogger().error("onHuaweiInstallReferrerReadListener can not be null"); return; @@ -35,7 +35,7 @@ protected HuaweiInstallReferrerResult doInBackground(Context[] contexts) { protected void onPostExecute(HuaweiInstallReferrerResult huaweiInstallReferrerResult) { if (huaweiInstallReferrerResult != null) { if (huaweiInstallReferrerResult.huaweiInstallReferrerDetails != null) { - onHuaweiInstallReferrerReadListener.onHuaweiAppGalleryInstallReferrerDetailsRead(huaweiInstallReferrerResult.huaweiInstallReferrerDetails); + onHuaweiInstallReferrerReadListener.onInstallReferrerDetailsRead(huaweiInstallReferrerResult.huaweiInstallReferrerDetails); } else if (huaweiInstallReferrerResult.error != null) { onHuaweiInstallReferrerReadListener.onFail(huaweiInstallReferrerResult.error); }else { @@ -46,7 +46,13 @@ protected void onPostExecute(HuaweiInstallReferrerResult huaweiInstallReferrerRe } } }.execute(context); + } + public static void getHuaweiAdsInstallReferrer(final Context context, final OnHuaweiInstallReferrerReadListener onHuaweiInstallReferrerReadListener) { + if (onHuaweiInstallReferrerReadListener == null){ + AdjustFactory.getLogger().error("onHuaweiInstallReferrerReadListener can not be null"); + return; + } new AsyncTaskExecutor() { @Override protected HuaweiInstallReferrerResult doInBackground(Context[] contexts) { @@ -60,7 +66,7 @@ protected HuaweiInstallReferrerResult doInBackground(Context[] contexts) { protected void onPostExecute(HuaweiInstallReferrerResult huaweiInstallReferrerResult) { if (huaweiInstallReferrerResult != null) { if (huaweiInstallReferrerResult.huaweiInstallReferrerDetails != null) { - onHuaweiInstallReferrerReadListener.onHuaweiAdsInstallReferrerDetailsRead(huaweiInstallReferrerResult.huaweiInstallReferrerDetails); + onHuaweiInstallReferrerReadListener.onInstallReferrerDetailsRead(huaweiInstallReferrerResult.huaweiInstallReferrerDetails); } else if (huaweiInstallReferrerResult.error != null) { onHuaweiInstallReferrerReadListener.onFail(huaweiInstallReferrerResult.error); }else { @@ -71,6 +77,7 @@ protected void onPostExecute(HuaweiInstallReferrerResult huaweiInstallReferrerRe } } }.execute(context); + } public static void readHuaweiReferrer(Context context) { diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java index a6cc6da86..eefdfe942 100644 --- a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java @@ -3,7 +3,6 @@ import com.adjust.sdk.ReferrerDetails; public interface OnHuaweiInstallReferrerReadListener { - void onHuaweiAdsInstallReferrerDetailsRead(HuaweiInstallReferrerDetails referrerDetails); - void onHuaweiAppGalleryInstallReferrerDetailsRead(HuaweiInstallReferrerDetails referrerDetails); + void onInstallReferrerDetailsRead(HuaweiInstallReferrerDetails referrerDetails); void onFail(String message); } From 2ac1163bed77cf78fb59b9800f250a7e1c897240 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 19 Apr 2024 10:54:47 +0200 Subject: [PATCH 076/540] refac:remove redundant constructor in HuaweiInstallReferrerDetails --- .../sdk/huawei/HuaweiInstallReferrerDetails.java | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerDetails.java b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerDetails.java index 16b0de9ab..40410b966 100644 --- a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerDetails.java +++ b/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerDetails.java @@ -8,20 +8,10 @@ public class HuaweiInstallReferrerDetails { public long referrerClickTimestampSeconds; // The client-side timestamp, when the referrer click happened. public long installBeginTimestampSeconds; // The client-side timestamp, when app installation began. - HuaweiInstallReferrerDetails(ReferrerDetails referrerDetails){ - if (referrerDetails == null){ - return; - } - this.installReferrer = referrerDetails.installReferrer; - this.referrerClickTimestampSeconds = referrerDetails.referrerClickTimestampSeconds; - this.installBeginTimestampSeconds = referrerDetails.installBeginTimestampSeconds;; - } - - public HuaweiInstallReferrerDetails (String installReferrer, long referrerClickTimestampSeconds, long installBeginTimestampSeconds) { + HuaweiInstallReferrerDetails(String installReferrer, long referrerClickTimestampSeconds, long installBeginTimestampSeconds) { this.installReferrer = installReferrer; this.referrerClickTimestampSeconds = referrerClickTimestampSeconds; this.installBeginTimestampSeconds = installBeginTimestampSeconds; - } public String toString() { From 00ebf723a81b1bfba49a0381c3418c5f198b5951 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 12 Apr 2024 15:53:44 +0200 Subject: [PATCH 077/540] refac: move COPPA from config to Adjust API --- .../java/com/adjust/sdk/ActivityHandler.java | 79 ++++++++++++++++--- .../src/main/java/com/adjust/sdk/Adjust.java | 20 +++++ .../java/com/adjust/sdk/AdjustConfig.java | 9 --- .../java/com/adjust/sdk/AdjustInstance.java | 38 +++++++++ .../main/java/com/adjust/sdk/DeviceInfo.java | 12 ++- .../java/com/adjust/sdk/IActivityHandler.java | 2 + .../java/com/adjust/sdk/PackageBuilder.java | 16 ++-- .../adjust/sdk/SharedPreferencesManager.java | 27 +++++++ .../src/main/java/com/adjust/sdk/Util.java | 10 ++- .../src/main/assets/adjust.js | 12 +++ .../src/main/assets/adjust_config.js | 5 -- .../sdk/webbridge/AdjustBridgeInstance.java | 25 ++++-- .../adjust/testapp/AdjustCommandExecutor.java | 17 ++-- .../src/main/assets/command_executor.js | 16 ++-- 14 files changed, 226 insertions(+), 62 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 8863d021f..c0b0cc9a7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -772,6 +772,16 @@ public void run() { }); } + @Override + public void setCoppaCompliance(final boolean enabled) { + executor.submit(new Runnable() { + @Override + public void run() { + setCoppaCompliantEnabledI(enabled); + } + }); + } + public InternalState getInternalState() { return internalState; } @@ -819,8 +829,10 @@ public void run(ActivityHandler activityHandler) { deviceInfo.reloadPlayIds(adjustConfig); if (deviceInfo.playAdId == null) { + SharedPreferencesManager sharedPreferencesManager = + SharedPreferencesManager.getDefaultInstance(getContext()); if (!Util.canReadPlayIds(adjustConfig)) { - if (adjustConfig.coppaCompliantEnabled) { + if (sharedPreferencesManager.getCoppaCompliance()) { logger.info("Cannot read Google Play Services Advertising ID with COPPA enabled"); } @@ -833,7 +845,7 @@ public void run(ActivityHandler activityHandler) { if (deviceInfo.androidId == null) { if (!Util.canReadNonPlayIds(adjustConfig)) { - if (adjustConfig.coppaCompliantEnabled) { + if (sharedPreferencesManager.getCoppaCompliance()) { logger.info("Cannot read non Play IDs with COPPA enabled"); } @@ -2420,7 +2432,8 @@ private void trackThirdPartySharingI(final AdjustThirdPartySharing adjustThirdPa } if (!isEnabledI()) { return; } if (activityState.isGdprForgotten) { return; } - if (adjustConfig.coppaCompliantEnabled) { + SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(getContext()); + if (sharedPreferencesManager.getCoppaCompliance()) { logger.warn("Calling third party sharing API not allowed when COPPA enabled"); return; } @@ -2565,6 +2578,15 @@ private void verifyPurchaseI(final AdjustPurchase purchase, final OnPurchaseVeri purchaseVerificationHandler.sendPurchaseVerificationPackage(verificationPackage); } + private void setCoppaCompliantEnabledI(final boolean enabled) { + if (!enabled) { + enableThirdPartySharingForCoppaDisabledI(); + return; + } + + disableThirdPartySharingForCoppaEnabledI(); + } + private void gotOptOutResponseI() { activityState.isGdprForgotten = true; writeActivityStateI(); @@ -2868,12 +2890,10 @@ private void checkForInstallReferrerInfo(final SdkClickResponseData responseData } private void processCoppaComplianceI() { - if (!adjustConfig.coppaCompliantEnabled) { - resetThirdPartySharingCoppaActivityStateI(); - return; - } + boolean coppaComplianceEnabled = + SharedPreferencesManager.getDefaultInstance(getContext()).getCoppaCompliance(); - disableThirdPartySharingForCoppaEnabledI(); + setCoppaCompliantEnabledI(coppaComplianceEnabled); } private void disableThirdPartySharingForCoppaEnabledI() { @@ -2902,11 +2922,28 @@ private void disableThirdPartySharingForCoppaEnabledI() { } } - private void resetThirdPartySharingCoppaActivityStateI() { - if (activityState == null) { return; } - if (activityState.isThirdPartySharingDisabledForCoppa) { - activityState.isThirdPartySharingDisabledForCoppa = false; - writeActivityStateI(); + private void enableThirdPartySharingForCoppaDisabledI() { + if (!shouldEnableThirdPartySharingWhenCoppaDisabled()) { + return; + } + + activityState.isThirdPartySharingDisabledForCoppa = false; + writeActivityStateI(); + AdjustThirdPartySharing adjustThirdPartySharing = + new AdjustThirdPartySharing(true); + + long now = System.currentTimeMillis(); + PackageBuilder packageBuilder = new PackageBuilder( + adjustConfig, deviceInfo, activityState, sessionParameters, now); + + ActivityPackage activityPackage = + packageBuilder.buildThirdPartySharingPackage(adjustThirdPartySharing); + packageHandler.addPackage(activityPackage); + + if (adjustConfig.eventBufferingEnabled) { + logger.info("Buffered event %s", activityPackage.getSuffix()); + } else { + packageHandler.sendFirstPackage(); } } @@ -2925,4 +2962,20 @@ private boolean shouldDisableThirdPartySharingWhenCoppaEnabled() { return !activityState.isThirdPartySharingDisabledForCoppa; } + + private boolean shouldEnableThirdPartySharingWhenCoppaDisabled() { + if (activityState == null) { + return false; + } + + if (!isEnabledI()) { + return false; + } + + if (activityState.isGdprForgotten) { + return false; + } + + return activityState.isThirdPartySharingDisabledForCoppa; + } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index e51164e5c..0214a83d5 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -292,6 +292,26 @@ public static void trackPlayStoreSubscription(final AdjustPlayStoreSubscription adjustInstance.trackPlayStoreSubscription(subscription); } + /** + * Called to enable COPPA compliance. + * + * @param context Application context + */ + public static void enableCoppaCompliance(final Context context) { + AdjustInstance adjustInstance = Adjust.getDefaultInstance(); + adjustInstance.enableCoppaCompliance(context); + } + + /** + * Called to disable COPPA compliance. + * + * @param context Application context + */ + public static void disableCoppaCompliance(final Context context) { + AdjustInstance adjustInstance = Adjust.getDefaultInstance(); + adjustInstance.disableCoppaCompliance(context); + } + /** * Called to get value of Google Play Advertising Identifier. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index a5ee12032..0a5f4593c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -39,7 +39,6 @@ public class AdjustConfig { String urlStrategy; String preinstallFilePath; boolean playStoreKidsAppEnabled; - boolean coppaCompliantEnabled; String fbAppId; boolean readDeviceInfoOnceEnabled; OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; @@ -178,10 +177,6 @@ public void setPlayStoreKidsAppEnabled(boolean playStoreKidsAppEnabled) { this.playStoreKidsAppEnabled = playStoreKidsAppEnabled; } - public void setCoppaCompliantEnabled(boolean coppaCompliantEnabled) { - this.coppaCompliantEnabled = coppaCompliantEnabled; - } - public void setFbAppId(String fbAppId) { this.fbAppId = fbAppId; } @@ -347,10 +342,6 @@ public boolean isPlayStoreKidsAppEnabled() { return playStoreKidsAppEnabled; } - public boolean isCoppaCompliantEnabled() { - return coppaCompliantEnabled; - } - public String getFbAppId() { return fbAppId; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 7b1faf1b3..0c0b5d5ba 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -492,6 +492,34 @@ public void trackPlayStoreSubscription(AdjustPlayStoreSubscription subscription) activityHandler.trackPlayStoreSubscription(subscription); } + /** + * Called to enable COPPA compliance. + * + * @param context Application context + */ + public void enableCoppaCompliance(Context context) { + saveCoppaCompliance(true, context); + if (checkActivityHandler("enable coppa compliance", true)) { + if (activityHandler.isEnabled()) { + activityHandler.setCoppaCompliance(true); + } + } + } + + /** + * Called to disable COPPA compliance. + * + * @param context Application context + */ + public void disableCoppaCompliance(Context context) { + saveCoppaCompliance(false, context); + if (checkActivityHandler("disable coppa compliant", true)) { + if (activityHandler.isEnabled()) { + activityHandler.setCoppaCompliance(false); + } + } + } + /** * Called to get value of unique Adjust device identifier. * @@ -664,6 +692,16 @@ private void setSendingReferrersAsNotSent(final Context context) { SharedPreferencesManager.getDefaultInstance(context).setSendingReferrersAsNotSent(); } + /** + * Save coppa compliant state to shared preferences. + * + * @param enabled boolean indicating should COPPA be enabled (true) or not (false) + * @param context Application context + */ + private void saveCoppaCompliance(final boolean enabled, final Context context) { + SharedPreferencesManager.getDefaultInstance(context).saveCoppaCompliance(enabled); + } + /** * Check if AdjustInstance enable flag is set or not. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 3f939a42d..3d87e4282 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -500,7 +500,8 @@ private static class UtilDeviceIds { private static Map getImeiParameters(final AdjustConfig adjustConfig, final ILogger logger) { - if (adjustConfig.coppaCompliantEnabled) { + SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(adjustConfig.getContext()); + if (sharedPreferencesManager.getCoppaCompliance()) { return null; } @@ -509,14 +510,16 @@ private static Map getImeiParameters(final AdjustConfig adjustCo private static Map getOaidParameters(final AdjustConfig adjustConfig, final ILogger logger) { - if (adjustConfig.coppaCompliantEnabled) { + SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(adjustConfig.getContext()); + if (sharedPreferencesManager.getCoppaCompliance()) { return null; } return Reflection.getOaidParameters(adjustConfig.context, logger); } private static String getFireAdvertisingId(final AdjustConfig adjustConfig) { - if (adjustConfig.coppaCompliantEnabled) { + SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(adjustConfig.getContext()); + if (sharedPreferencesManager.getCoppaCompliance()) { return null; } @@ -535,7 +538,8 @@ private static String getFireAdvertisingId(final ContentResolver contentResolver return null; } private static Boolean getFireTrackingEnabled(final AdjustConfig adjustConfig) { - if (adjustConfig.coppaCompliantEnabled) { + SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(adjustConfig.getContext()); + if (sharedPreferencesManager.getCoppaCompliance()) { return null; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 894e5b5b9..77f046187 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -79,6 +79,8 @@ public interface IActivityHandler { void verifyPurchase(AdjustPurchase purchase, OnPurchaseVerificationFinishedListener callback); + void setCoppaCompliance(boolean enabled); + void gotOptOutResponse(); Context getContext(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index cb66a255b..293d640de 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -1226,10 +1226,10 @@ private ActivityPackage getDefaultActivityPackage(ActivityKind activityKind) { } private void injectFeatureFlagsWithParameters(Map parameters) { - - PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); - PackageBuilder.addBoolean(parameters, "send_in_background_enabled", adjustConfig.sendInBackground); - + SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(adjustConfig.getContext()); + if (sharedPreferencesManager.getCoppaCompliance()) { + PackageBuilder.addLong(parameters, "ff_coppa", 1); + } if (internalState != null) { PackageBuilder.addBoolean(parameters, "offline_mode_enabled", internalState.offline); if (internalState.isInForeground()) { @@ -1238,11 +1238,6 @@ private void injectFeatureFlagsWithParameters(Map parameters) { PackageBuilder.addBoolean(parameters, "background", true); } } - - if (adjustConfig.coppaCompliantEnabled) { - PackageBuilder.addLong(parameters, "ff_coppa", 1); - } - if (adjustConfig.playStoreKidsAppEnabled) { PackageBuilder.addLong(parameters, "ff_play_store_kids_app", 1); } @@ -1381,7 +1376,8 @@ private void checkDeviceIds(Map parameters) { && !parameters.containsKey("imeis") && !parameters.containsKey("meids") && !parameters.containsKey("device_ids")) { - if (adjustConfig.coppaCompliantEnabled) { + SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(adjustConfig.getContext()); + if (sharedPreferencesManager.getCoppaCompliance()) { logger.info("Missing Device IDs. COPPA enabled."); } else { logger.error("Missing Device IDs. Please check if Proguard is correctly set with Adjust SDK"); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java index 52d2ebe00..d0e22a808 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -47,6 +47,8 @@ public class SharedPreferencesManager { private static final String PREFS_KEY_PREINSTALL_SYSTEM_INSTALLER_REFERRER = "preinstall_system_installer_referrer"; + private static final String PREFS_KEY_COPPA_COMPLIANCE_ENABLED = "coppa_compliant_enabled"; + /** * Index for raw referrer string content in saved JSONArray object. */ @@ -408,6 +410,31 @@ public synchronized long getPreinstallPayloadReadStatus() { return getLong(PREFS_KEY_PREINSTALL_PAYLOAD_READ_STATUS, 0); } + /** + * Save coppa compliance state to shared preferences. + * + * @param enabled boolean indicating should COPPA be enabled (true) or not (false) + */ + public synchronized void saveCoppaCompliance(final boolean enabled) { + saveBoolean(PREFS_KEY_COPPA_COMPLIANCE_ENABLED, enabled); + } + + /** + * Get coppa compliance from shared preferences. + * + * @return Coppa compliant state + */ + public synchronized boolean getCoppaCompliance() { + return getBoolean(PREFS_KEY_COPPA_COMPLIANCE_ENABLED, false); + } + + /** + * Remove coppa compliance from shared preferences. + */ + public synchronized void removeCoppaCompliance() { + remove(PREFS_KEY_COPPA_COMPLIANCE_ENABLED); + } + /** * Remove all key-value pairs from shared preferences. */ diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index 89e828867..75e00455d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -658,11 +658,14 @@ public static boolean isEqualReferrerDetails(final ReferrerDetails referrerDetai } public static boolean canReadPlayIds(final AdjustConfig adjustConfig) { + SharedPreferencesManager sharedPreferencesManager = + SharedPreferencesManager.getDefaultInstance(adjustConfig.getContext()); + if (adjustConfig.playStoreKidsAppEnabled) { return false; } - if (adjustConfig.coppaCompliantEnabled) { + if (sharedPreferencesManager.getCoppaCompliance()) { return false; } @@ -670,11 +673,14 @@ public static boolean canReadPlayIds(final AdjustConfig adjustConfig) { } public static boolean canReadNonPlayIds(final AdjustConfig adjustConfig) { + SharedPreferencesManager sharedPreferencesManager = + SharedPreferencesManager.getDefaultInstance(adjustConfig.getContext()); + if (adjustConfig.playStoreKidsAppEnabled) { return false; } - if (adjustConfig.coppaCompliantEnabled) { + if (sharedPreferencesManager.getCoppaCompliance()) { return false; } diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index 497bb1540..3a0ea8df3 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -147,6 +147,18 @@ var Adjust = { } }, + enableCoppaCompliance: function () { + if (AdjustBridge) { + AdjustBridge.enableCoppaCompliance(); + } + }, + + disableCoppaCompliance: function () { + if (AdjustBridge) { + AdjustBridge.disableCoppaCompliance(); + } + }, + getGoogleAdId: function (callback) { if (AdjustBridge) { if (typeof callback === 'string' || callback instanceof String) { diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js index a4c860406..b3acc543b 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -52,7 +52,6 @@ function AdjustConfig(appToken, environment, legacy) { this.preinstallTrackingEnabled = null; this.preinstallFilePath = null; this.playStoreKidsAppEnabled = null; - this.coppaCompliantEnabled = null; this.fbAppId = null; this.readDeviceInfoOnceEnabled = null; } @@ -249,10 +248,6 @@ AdjustConfig.prototype.setPlayStoreKidsAppEnabled = function(isEnabled) { this.playStoreKidsAppEnabled = isEnabled; }; -AdjustConfig.prototype.setCoppaCompliantEnabled = function(isEnabled) { - this.coppaCompliantEnabled = isEnabled; -}; - AdjustConfig.prototype.setFbAppId = function(fbAppId) { this.fbAppId = fbAppId; }; diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 3c67b4b90..46d4c431f 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -171,7 +171,6 @@ public void onCreate(String adjustConfigString) { Object preinstallTrackingEnabledField = jsonAdjustConfig.get("preinstallTrackingEnabled"); Object preinstallFilePathField = jsonAdjustConfig.get("preinstallFilePath"); Object playStoreKidsAppEnabledField = jsonAdjustConfig.get("playStoreKidsAppEnabled"); - Object coppaCompliantEnabledField = jsonAdjustConfig.get("coppaCompliantEnabled"); Object fbAppIdField = jsonAdjustConfig.get("fbAppId"); Object readDeviceInfoOnceEnabledField = jsonAdjustConfig.get("readDeviceInfoOnceEnabled"); @@ -383,12 +382,6 @@ public boolean launchReceivedDeeplink(Uri deeplink) { adjustConfig.setPlayStoreKidsAppEnabled(playStoreKidsAppEnabled); } - // Coppa compliant - Boolean coppaCompliantEnabled = AdjustBridgeUtil.fieldToBoolean(coppaCompliantEnabledField); - if (coppaCompliantEnabled != null) { - adjustConfig.setCoppaCompliantEnabled(coppaCompliantEnabled); - } - // FB App ID String fbAppId = AdjustBridgeUtil.fieldToString(fbAppIdField); if (fbAppId != null) { @@ -700,6 +693,24 @@ public void trackMeasurementConsent(String consentMeasurementString) { } } + @JavascriptInterface + public void enableCoppaCompliance() { + if (!isInitialized()) { + return; + } + + Adjust.enableCoppaCompliance(application.getApplicationContext()); + } + + @JavascriptInterface + public void disableCoppaCompliance() { + if (!isInitialized()) { + return; + } + + Adjust.disableCoppaCompliance(application.getApplicationContext()); + } + @JavascriptInterface public void getGoogleAdId(final String callback) { if (!isInitialized()) { diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 5d9d343d8..1690ee6c0 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -94,6 +94,8 @@ public void executeCommand(final Command sentCommand) { case "trackSubscription": trackSubscription(); break; case "verifyPurchase": verifyPurchase(); break; case "processDeeplink" : processDeeplink(); break; + case "enableCoppaCompliance" : enableCoppaCompliance(); break; + case "disableCoppaCompliance" : disableCoppaCompliance(); break; //case "testBegin": testBegin(); break; // case "testEnd": testEnd(); break; } @@ -321,12 +323,6 @@ private void config() { adjustConfig.setExternalDeviceId(externalDeviceId); } - if (command.containsParameter("coppaCompliant")) { - String coppaCompliantS = command.getFirstParameterValue("coppaCompliant"); - boolean coppaCompliant = "true".equals(coppaCompliantS); - adjustConfig.setCoppaCompliantEnabled(coppaCompliant); - } - if (command.containsParameter("playStoreKids")) { String playStoreKidsS = command.getFirstParameterValue("playStoreKids"); boolean playStoreKids = "true".equals(playStoreKidsS); @@ -830,6 +826,15 @@ public void onDeeplinkResolved(String resolvedLink) { } }); } + + private void enableCoppaCompliance() { + Adjust.enableCoppaCompliance(context.getApplicationContext()); + } + + private void disableCoppaCompliance() { + Adjust.disableCoppaCompliance(context.getApplicationContext()); + } + /* private void testBegin() { if (command.containsParameter("teardown")) { diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index fc550f2d8..637025084 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -136,6 +136,8 @@ AdjustCommandExecutor.prototype.executeCommand = function(command, idx) { case "thirdPartySharing" : this.thirdPartySharing(command.params); break; case "measurementConsent" : this.measurementConsent(command.params); break; case "trackAdRevenue" : this.trackAdRevenue(command.params); break; + case "enableCoppaCompliance" : this.enableCoppaCompliance(command.params); break; + case "disableCoppaCompliance" : this.disableCoppaCompliance(command.params); break; break; } @@ -328,12 +330,6 @@ AdjustCommandExecutor.prototype.config = function(params) { adjustConfig.setSendInBackground(sendInBackground); } - if ('coppaCompliant' in params) { - var coppaCompliantS = getFirstParameterValue(params, 'coppaCompliant'); - var coppaCompliant = coppaCompliantS == 'true'; - adjustConfig.setCoppaCompliantEnabled(coppaCompliant); - } - if ('playStoreKids' in params) { var playStoreKidsS = getFirstParameterValue(params, 'playStoreKids'); var playStoreKids = playStoreKidsS == 'true'; @@ -648,6 +644,14 @@ AdjustCommandExecutor.prototype.sendReferrer = function(params) { Adjust.setReferrer(referrer); }; +AdjustCommandExecutor.prototype.enableCoppaCompliance = function(params) { + Adjust.enableCoppaCompliance(); +}; + +AdjustCommandExecutor.prototype.disableCoppaCompliance = function(params) { + Adjust.disableCoppaCompliance(); +}; + //Util //====================== function getValueFromKey(params, key) { From 9a63256fb2385bda6740f4c4db35b9358a0459ba Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 15 Apr 2024 15:21:29 +0200 Subject: [PATCH 078/540] refac: move writing activity state after adding package and minor renaming --- .../main/java/com/adjust/sdk/ActivityHandler.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index c0b0cc9a7..5f1f55f42 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -777,7 +777,7 @@ public void setCoppaCompliance(final boolean enabled) { executor.submit(new Runnable() { @Override public void run() { - setCoppaCompliantEnabledI(enabled); + setCoppaComplianceI(enabled); } }); } @@ -2578,7 +2578,7 @@ private void verifyPurchaseI(final AdjustPurchase purchase, final OnPurchaseVeri purchaseVerificationHandler.sendPurchaseVerificationPackage(verificationPackage); } - private void setCoppaCompliantEnabledI(final boolean enabled) { + private void setCoppaComplianceI(final boolean enabled) { if (!enabled) { enableThirdPartySharingForCoppaDisabledI(); return; @@ -2893,7 +2893,7 @@ private void processCoppaComplianceI() { boolean coppaComplianceEnabled = SharedPreferencesManager.getDefaultInstance(getContext()).getCoppaCompliance(); - setCoppaCompliantEnabledI(coppaComplianceEnabled); + setCoppaComplianceI(coppaComplianceEnabled); } private void disableThirdPartySharingForCoppaEnabledI() { @@ -2902,7 +2902,6 @@ private void disableThirdPartySharingForCoppaEnabledI() { } activityState.isThirdPartySharingDisabledForCoppa = true; - writeActivityStateI(); AdjustThirdPartySharing adjustThirdPartySharing = new AdjustThirdPartySharing(false); @@ -2915,6 +2914,8 @@ private void disableThirdPartySharingForCoppaEnabledI() { packageBuilder.buildThirdPartySharingPackage(adjustThirdPartySharing); packageHandler.addPackage(activityPackage); + writeActivityStateI(); + if (adjustConfig.eventBufferingEnabled) { logger.info("Buffered event %s", activityPackage.getSuffix()); } else { @@ -2928,7 +2929,6 @@ private void enableThirdPartySharingForCoppaDisabledI() { } activityState.isThirdPartySharingDisabledForCoppa = false; - writeActivityStateI(); AdjustThirdPartySharing adjustThirdPartySharing = new AdjustThirdPartySharing(true); @@ -2940,6 +2940,8 @@ private void enableThirdPartySharingForCoppaDisabledI() { packageBuilder.buildThirdPartySharingPackage(adjustThirdPartySharing); packageHandler.addPackage(activityPackage); + writeActivityStateI(); + if (adjustConfig.eventBufferingEnabled) { logger.info("Buffered event %s", activityPackage.getSuffix()); } else { From 77213c1abc1e7630715d5edc0f1f9207271e95fb Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 15 Apr 2024 16:01:00 +0200 Subject: [PATCH 079/540] refac: remove v2 from ad revenue naming --- .../main/java/com/adjust/testapp/AdjustCommandExecutor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 1690ee6c0..39f2db91f 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -90,7 +90,7 @@ public void executeCommand(final Command sentCommand) { case "gdprForgetMe": gdprForgetMe(); break; case "thirdPartySharing" : thirdPartySharing(); break; case "measurementConsent" : measurementConsent(); break; - case "trackAdRevenueV2" : trackAdRevenueV2(); break; + case "trackAdRevenue" : trackAdRevenue(); break; case "trackSubscription": trackSubscription(); break; case "verifyPurchase": verifyPurchase(); break; case "processDeeplink" : processDeeplink(); break; @@ -707,7 +707,7 @@ private void measurementConsent() { Adjust.trackMeasurementConsent(measurementConsent); } - private void trackAdRevenueV2() { + private void trackAdRevenue() { String adRevenueSource = command.getFirstParameterValue("adRevenueSource"); AdjustAdRevenue adjustAdRevenue = new AdjustAdRevenue(adRevenueSource); From 75af510018084871d4938b2ced9ad3d34c3a5eb7 Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 17 Apr 2024 15:27:23 +0200 Subject: [PATCH 080/540] refac: stop preventing tps tracking if coppa is enabled --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 5f1f55f42..7e646eb89 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -2432,11 +2432,6 @@ private void trackThirdPartySharingI(final AdjustThirdPartySharing adjustThirdPa } if (!isEnabledI()) { return; } if (activityState.isGdprForgotten) { return; } - SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(getContext()); - if (sharedPreferencesManager.getCoppaCompliance()) { - logger.warn("Calling third party sharing API not allowed when COPPA enabled"); - return; - } long now = System.currentTimeMillis(); PackageBuilder packageBuilder = new PackageBuilder( From 4324fb36804e0e15b4141011981ec2475e5d0f29 Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 18 Apr 2024 11:16:22 +0200 Subject: [PATCH 081/540] Refac: Merge coppa tps side effcts --- .../java/com/adjust/sdk/ActivityHandler.java | 127 +++++------------- .../java/com/adjust/sdk/ActivityState.java | 6 + 2 files changed, 40 insertions(+), 93 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 7e646eb89..47c14a7fb 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -2573,13 +2573,41 @@ private void verifyPurchaseI(final AdjustPurchase purchase, final OnPurchaseVeri purchaseVerificationHandler.sendPurchaseVerificationPackage(verificationPackage); } - private void setCoppaComplianceI(final boolean enabled) { - if (!enabled) { - enableThirdPartySharingForCoppaDisabledI(); + private void setCoppaComplianceI(final boolean coppaEnabled) { + if (activityState == null) { return; } + if (!isEnabledI()) { return; } + if (activityState.isGdprForgotten) { return; } + + if (activityState.isCoppaEnabled() && coppaEnabled) { + logger.debug("Coppa is already enabled in the activity state"); return; } + if (! activityState.isCoppaEnabled() && ! coppaEnabled) { + logger.debug("Coppa is already disabled in the activity state"); + return; + } + + activityState.setCoppa(coppaEnabled); + + // third party sharing is disabled when coppa is enabled and vice-versa + final boolean tpsEnabled = ! coppaEnabled; + final AdjustThirdPartySharing adjustThirdPartySharing = new AdjustThirdPartySharing(tpsEnabled); + + final long now = System.currentTimeMillis(); + final PackageBuilder packageBuilder = new PackageBuilder( + adjustConfig, deviceInfo, activityState, sessionParameters, now); + + final ActivityPackage activityPackage = + packageBuilder.buildThirdPartySharingPackage(adjustThirdPartySharing); + packageHandler.addPackage(activityPackage); + + writeActivityStateI(); - disableThirdPartySharingForCoppaEnabledI(); + if (adjustConfig.eventBufferingEnabled) { + logger.info("Buffered event %s", activityPackage.getSuffix()); + } else { + packageHandler.sendFirstPackage(); + } } private void gotOptOutResponseI() { @@ -2885,94 +2913,7 @@ private void checkForInstallReferrerInfo(final SdkClickResponseData responseData } private void processCoppaComplianceI() { - boolean coppaComplianceEnabled = - SharedPreferencesManager.getDefaultInstance(getContext()).getCoppaCompliance(); - - setCoppaComplianceI(coppaComplianceEnabled); - } - - private void disableThirdPartySharingForCoppaEnabledI() { - if (!shouldDisableThirdPartySharingWhenCoppaEnabled()) { - return; - } - - activityState.isThirdPartySharingDisabledForCoppa = true; - AdjustThirdPartySharing adjustThirdPartySharing = - new AdjustThirdPartySharing(false); - - long now = System.currentTimeMillis(); - PackageBuilder packageBuilder = new PackageBuilder( - adjustConfig, deviceInfo, activityState, sessionParameters, now); - packageBuilder.internalState = internalState; - - ActivityPackage activityPackage = - packageBuilder.buildThirdPartySharingPackage(adjustThirdPartySharing); - packageHandler.addPackage(activityPackage); - - writeActivityStateI(); - - if (adjustConfig.eventBufferingEnabled) { - logger.info("Buffered event %s", activityPackage.getSuffix()); - } else { - packageHandler.sendFirstPackage(); - } - } - - private void enableThirdPartySharingForCoppaDisabledI() { - if (!shouldEnableThirdPartySharingWhenCoppaDisabled()) { - return; - } - - activityState.isThirdPartySharingDisabledForCoppa = false; - AdjustThirdPartySharing adjustThirdPartySharing = - new AdjustThirdPartySharing(true); - - long now = System.currentTimeMillis(); - PackageBuilder packageBuilder = new PackageBuilder( - adjustConfig, deviceInfo, activityState, sessionParameters, now); - - ActivityPackage activityPackage = - packageBuilder.buildThirdPartySharingPackage(adjustThirdPartySharing); - packageHandler.addPackage(activityPackage); - - writeActivityStateI(); - - if (adjustConfig.eventBufferingEnabled) { - logger.info("Buffered event %s", activityPackage.getSuffix()); - } else { - packageHandler.sendFirstPackage(); - } - } - - private boolean shouldDisableThirdPartySharingWhenCoppaEnabled() { - if (activityState == null) { - return false; - } - - if (!isEnabledI()) { - return false; - } - - if (activityState.isGdprForgotten) { - return false; - } - - return !activityState.isThirdPartySharingDisabledForCoppa; - } - - private boolean shouldEnableThirdPartySharingWhenCoppaDisabled() { - if (activityState == null) { - return false; - } - - if (!isEnabledI()) { - return false; - } - - if (activityState.isGdprForgotten) { - return false; - } - - return activityState.isThirdPartySharingDisabledForCoppa; + setCoppaComplianceI( + SharedPreferencesManager.getDefaultInstance(getContext()).getCoppaCompliance()); } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java index 702727e39..35e3c6c0a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java @@ -202,6 +202,12 @@ protected boolean findOrderId(String orderId) { return orderIds.contains(orderId); } + public boolean isCoppaEnabled() { + return isThirdPartySharingDisabledForCoppa; + } + public void setCoppa(boolean enabled) { + this.isThirdPartySharingDisabledForCoppa = enabled; + } @Override public String toString() { return Util.formatString("ec:%d sc:%d ssc:%d sl:%.1f ts:%.1f la:%s uuid:%s", From a7100c60beba008e6a34c983c4a680b8e0be4300 Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 18 Apr 2024 14:56:33 +0200 Subject: [PATCH 082/540] Refac: Process coppa in order --- .../java/com/adjust/sdk/ActivityHandler.java | 41 +++++++++++-------- .../java/com/adjust/sdk/AdjustInstance.java | 6 ++- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 47c14a7fb..b7678d1f4 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1192,6 +1192,21 @@ private void preLaunchActionsI(List preLaunchActionsArray) } } + private void processPreLaunchAdjustThirdPartySharingAndCoppaComplianceI() { + for (final Object adjustThirdPartySharingOrCoppa : + adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray) + { + if (adjustThirdPartySharingOrCoppa instanceof AdjustThirdPartySharing) { + trackThirdPartySharingI((AdjustThirdPartySharing) adjustThirdPartySharingOrCoppa); + } else if (adjustThirdPartySharingOrCoppa instanceof Boolean) { + setCoppaComplianceI(((Boolean)adjustThirdPartySharingOrCoppa).booleanValue()); + } else { + processCoppaComplianceI(); + } + } + adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray.clear(); + } + private void startI() { // check if it's the first sdk start if (internalState.hasFirstSdkStartNotOcurred()) { @@ -1202,11 +1217,8 @@ private void startI() { SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(getContext()); // check if third party sharing request came, then send it first - for (AdjustThirdPartySharing adjustThirdPartySharing : - adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray) - { - trackThirdPartySharingI(adjustThirdPartySharing); - } + processPreLaunchAdjustThirdPartySharingAndCoppaComplianceI(); + if (adjustConfig.preLaunchActions.lastMeasurementConsentTracked != null) { trackMeasurementConsentI( adjustConfig.preLaunchActions. @@ -1254,14 +1266,12 @@ private void startFirstSessionI() { if (sharedPreferencesManager.getGdprForgetMe()) { gdprForgetMeI(); } else { + // preLaunchAdjustThirdPartySharing should be done *before* coppaCompliance + // since it will check for coppaCompliance inside it + processPreLaunchAdjustThirdPartySharingAndCoppaComplianceI(); + processCoppaComplianceI(); - // check if third party sharing request came, then send it first - for (AdjustThirdPartySharing adjustThirdPartySharing : - adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray) - { - trackThirdPartySharingI(adjustThirdPartySharing); - } if (adjustConfig.preLaunchActions.lastMeasurementConsentTracked != null) { trackMeasurementConsentI( adjustConfig.preLaunchActions. @@ -1811,13 +1821,12 @@ private void setEnabledI(boolean enabled) { if (sharedPreferencesManager.getGdprForgetMe()) { gdprForgetMeI(); } else { + // preLaunchAdjustThirdPartySharing should be done *before* coppaCompliance + // since it will check for coppaCompliance inside it + processPreLaunchAdjustThirdPartySharingAndCoppaComplianceI(); + processCoppaComplianceI(); - for (AdjustThirdPartySharing adjustThirdPartySharing : - adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray) - { - trackThirdPartySharingI(adjustThirdPartySharing); - } if (adjustConfig.preLaunchActions.lastMeasurementConsentTracked != null) { trackMeasurementConsentI( adjustConfig.preLaunchActions. diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 0c0b5d5ba..748502472 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -15,7 +15,7 @@ public class AdjustInstance { public static class PreLaunchActions { public List preLaunchActionsArray; - public List preLaunchAdjustThirdPartySharingArray; + public List preLaunchAdjustThirdPartySharingArray; public Boolean lastMeasurementConsentTracked; public PreLaunchActions() { @@ -503,6 +503,8 @@ public void enableCoppaCompliance(Context context) { if (activityHandler.isEnabled()) { activityHandler.setCoppaCompliance(true); } + } else { + preLaunchActions.preLaunchAdjustThirdPartySharingArray.add(Boolean.TRUE); } } @@ -517,6 +519,8 @@ public void disableCoppaCompliance(Context context) { if (activityHandler.isEnabled()) { activityHandler.setCoppaCompliance(false); } + } else { + preLaunchActions.preLaunchAdjustThirdPartySharingArray.add(Boolean.FALSE); } } From bdc8565c0f5065d83770a66176a7927ed1b91753 Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 18 Apr 2024 14:58:05 +0200 Subject: [PATCH 083/540] Refac: Inject coppa from state --- .../java/com/adjust/sdk/ActivityHandler.java | 20 ++--- .../main/java/com/adjust/sdk/DeviceInfo.java | 60 ++++++------- .../java/com/adjust/sdk/PackageBuilder.java | 84 ++++++++++--------- .../src/main/java/com/adjust/sdk/Util.java | 24 ++---- 4 files changed, 89 insertions(+), 99 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index b7678d1f4..b27153d05 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -821,21 +821,17 @@ public void run(ActivityHandler activityHandler) { readConfigFile(adjustConfig.context); - deviceInfo = new DeviceInfo(adjustConfig); + boolean coppaEnabledInState = activityState != null && activityState.isCoppaEnabled(); + + deviceInfo = new DeviceInfo(adjustConfig, coppaEnabledInState); if (adjustConfig.eventBufferingEnabled) { logger.info("Event buffering is enabled"); } - deviceInfo.reloadPlayIds(adjustConfig); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabledInState); if (deviceInfo.playAdId == null) { - SharedPreferencesManager sharedPreferencesManager = - SharedPreferencesManager.getDefaultInstance(getContext()); - if (!Util.canReadPlayIds(adjustConfig)) { - if (sharedPreferencesManager.getCoppaCompliance()) { - logger.info("Cannot read Google Play Services Advertising ID with COPPA enabled"); - } - + if (!Util.canReadPlayIds(adjustConfig, coppaEnabledInState)) { if (adjustConfig.playStoreKidsAppEnabled) { logger.info("Cannot read Google Play Services Advertising ID with play store kids app enabled"); } @@ -844,11 +840,7 @@ public void run(ActivityHandler activityHandler) { } if (deviceInfo.androidId == null) { - if (!Util.canReadNonPlayIds(adjustConfig)) { - if (sharedPreferencesManager.getCoppaCompliance()) { - logger.info("Cannot read non Play IDs with COPPA enabled"); - } - + if (! Util.canReadNonPlayIds(adjustConfig, coppaEnabledInState)) { if (adjustConfig.playStoreKidsAppEnabled) { logger.info("Cannot read non Play IDs with play store kids app enabled"); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 3d87e4282..444f7fd66 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -102,7 +102,7 @@ class DeviceInfo { String mcc; String mnc; - DeviceInfo(AdjustConfig adjustConfig) { + DeviceInfo(AdjustConfig adjustConfig, boolean coppaEnabled) { Context context = adjustConfig.context; Resources resources = context.getResources(); DisplayMetrics displayMetrics = resources.getDisplayMetrics(); @@ -140,21 +140,26 @@ class DeviceInfo { playAdId = Reflection.getSamsungCloudDevGoogleAdId(context, adjustConfig.logger); playAdIdSource = "samsung_cloud_sdk"; } - if (Util.canReadPlayIds(adjustConfig)) { + if (Util.canReadPlayIds(adjustConfig, coppaEnabled)) { appSetId = Reflection.getAppSetId(context); } } - void reloadPlayIds(final AdjustConfig adjustConfig) { - if (isSamsungCloudEnvironment != null && isSamsungCloudEnvironment) { + void reloadPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled) { + if (playIdsReadOnce && adjustConfig.readDeviceInfoOnceEnabled) { return; } - if (!Util.canReadPlayIds(adjustConfig)) { + playAdId = null; + isTrackingEnabled = null; + playAdIdSource = null; + playAdIdAttempt = -1; + + if (isSamsungCloudEnvironment != null && isSamsungCloudEnvironment) { return; } - if (playIdsReadOnce && adjustConfig.readDeviceInfoOnceEnabled) { + if (!Util.canReadPlayIds(adjustConfig, coppaEnabled)) { return; } @@ -162,11 +167,6 @@ void reloadPlayIds(final AdjustConfig adjustConfig) { String previousPlayAdId = playAdId; Boolean previousIsTrackingEnabled = isTrackingEnabled; - playAdId = null; - isTrackingEnabled = null; - playAdIdSource = null; - playAdIdAttempt = -1; - // attempt connecting to Google Play Service by own for (int serviceAttempt = 1; serviceAttempt <= 3; serviceAttempt += 1) { try { @@ -231,8 +231,8 @@ void reloadPlayIds(final AdjustConfig adjustConfig) { } } - void reloadNonPlayIds(final AdjustConfig adjustConfig) { - if (!Util.canReadNonPlayIds(adjustConfig)) { + void reloadNonPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled) { + if (!Util.canReadNonPlayIds(adjustConfig, coppaEnabled)) { return; } @@ -244,15 +244,17 @@ void reloadNonPlayIds(final AdjustConfig adjustConfig) { nonGoogleIdsReadOnce = true; } - void reloadOtherDeviceInfoParams(final AdjustConfig adjustConfig, final ILogger logger) { + void reloadOtherDeviceInfoParams(final AdjustConfig adjustConfig, + final boolean coppaEnabled, + final ILogger logger) { if (adjustConfig.readDeviceInfoOnceEnabled && otherDeviceInfoParamsReadOnce) { return; } - imeiParameters = UtilDeviceIds.getImeiParameters(adjustConfig, logger); - oaidParameters = UtilDeviceIds.getOaidParameters(adjustConfig, logger); - fireAdId = UtilDeviceIds.getFireAdvertisingId(adjustConfig); - fireTrackingEnabled = UtilDeviceIds.getFireTrackingEnabled(adjustConfig); + imeiParameters = UtilDeviceIds.getImeiParameters(adjustConfig, coppaEnabled, logger); + oaidParameters = UtilDeviceIds.getOaidParameters(adjustConfig, coppaEnabled, logger); + fireAdId = UtilDeviceIds.getFireAdvertisingId(adjustConfig, coppaEnabled); + fireTrackingEnabled = UtilDeviceIds.getFireTrackingEnabled(adjustConfig, coppaEnabled); connectivityType = UtilDeviceIds.getConnectivityType(adjustConfig.context, logger); mcc = UtilDeviceIds.getMcc(adjustConfig.context, logger); mnc = UtilDeviceIds.getMnc(adjustConfig.context, logger); @@ -498,28 +500,29 @@ private String getAppUpdateTime(PackageInfo packageInfo) { private static class UtilDeviceIds { private static Map getImeiParameters(final AdjustConfig adjustConfig, + final boolean isCoppaEnabled, final ILogger logger) { - SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(adjustConfig.getContext()); - if (sharedPreferencesManager.getCoppaCompliance()) { + if (isCoppaEnabled) { return null; } return Reflection.getImeiParameters(adjustConfig.context, logger); } private static Map getOaidParameters(final AdjustConfig adjustConfig, + final boolean isCoppaEnabled, final ILogger logger) { - SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(adjustConfig.getContext()); - if (sharedPreferencesManager.getCoppaCompliance()) { + if (isCoppaEnabled) { return null; } return Reflection.getOaidParameters(adjustConfig.context, logger); } - private static String getFireAdvertisingId(final AdjustConfig adjustConfig) { - SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(adjustConfig.getContext()); - if (sharedPreferencesManager.getCoppaCompliance()) { + private static String getFireAdvertisingId(final AdjustConfig adjustConfig, + final boolean isCoppaEnabled) + { + if (isCoppaEnabled) { return null; } @@ -537,9 +540,10 @@ private static String getFireAdvertisingId(final ContentResolver contentResolver } return null; } - private static Boolean getFireTrackingEnabled(final AdjustConfig adjustConfig) { - SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(adjustConfig.getContext()); - if (sharedPreferencesManager.getCoppaCompliance()) { + private static Boolean getFireTrackingEnabled(final AdjustConfig adjustConfig, + final boolean isCoppaEnabled) + { + if (isCoppaEnabled) { return null; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 293d640de..59bad1b9f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -43,7 +43,9 @@ public class PackageBuilder { Boolean isClick; ActivityHandler.InternalState internalState; - private class ActivityStateCopy { + boolean coppaEnabled; + + static class ActivityStateCopy { int eventCount = -1; int sessionCount = -1; int subsessionCount = -1; @@ -72,12 +74,19 @@ private class ActivityStateCopy { DeviceInfo deviceInfo, ActivityState activityState, SessionParameters sessionParameters, - long createdAt) { + long createdAt) + { this.createdAt = createdAt; this.deviceInfo = deviceInfo; this.adjustConfig = adjustConfig; this.activityStateCopy = new ActivityStateCopy(activityState); this.sessionParameters = sessionParameters; + + if (activityState != null) { + this.coppaEnabled = activityState.isCoppaEnabled(); + } else { + this.coppaEnabled = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getCoppaCompliance(); + } } ActivityPackage buildSessionPackage(boolean isInDelay) { @@ -217,7 +226,7 @@ ActivityPackage buildVerificationPackage(AdjustPurchase purchase, OnPurchaseVeri private Map getSessionParameters(boolean isInDelay) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -236,7 +245,7 @@ private Map getSessionParameters(boolean isInDelay) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -249,7 +258,7 @@ private Map getSessionParameters(boolean isInDelay) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -309,7 +318,7 @@ private Map getSessionParameters(boolean isInDelay) { public Map getEventParameters(AdjustEvent event, boolean isInDelay) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -328,7 +337,7 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -341,7 +350,7 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -405,7 +414,7 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel private Map getInfoParameters(String source) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -418,7 +427,7 @@ private Map getInfoParameters(String source) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -431,7 +440,7 @@ private Map getInfoParameters(String source) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -461,7 +470,7 @@ private Map getInfoParameters(String source) { private Map getClickParameters(String source) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -474,7 +483,7 @@ private Map getClickParameters(String source) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -487,7 +496,7 @@ private Map getClickParameters(String source) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -573,7 +582,7 @@ private Map getClickParameters(String source) { private Map getAttributionParameters(String initiatedBy) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -586,7 +595,7 @@ private Map getAttributionParameters(String initiatedBy) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -599,7 +608,7 @@ private Map getAttributionParameters(String initiatedBy) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -637,7 +646,7 @@ private Map getAttributionParameters(String initiatedBy) { private Map getGdprParameters() { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -650,7 +659,7 @@ private Map getGdprParameters() { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -663,7 +672,7 @@ private Map getGdprParameters() { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -702,7 +711,7 @@ private Map getGdprParameters() { { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -727,7 +736,7 @@ private Map getGdprParameters() { adjustThirdPartySharing.partnerSharingSettings); // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -740,7 +749,7 @@ private Map getGdprParameters() { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -778,7 +787,7 @@ private Map getMeasurementConsentParameters( { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -795,7 +804,7 @@ private Map getMeasurementConsentParameters( consentMeasurement ? "enable" : "disable"); // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -808,7 +817,7 @@ private Map getMeasurementConsentParameters( if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -932,7 +941,7 @@ private Map getAdRevenueParameters(String source, JSONObject adR private Map getAdRevenueParameters(AdjustAdRevenue adjustAdRevenue, boolean isInDelay) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -951,7 +960,7 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -964,7 +973,7 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -1031,7 +1040,7 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven private Map getSubscriptionParameters(AdjustPlayStoreSubscription subscription, boolean isInDelay) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -1044,7 +1053,7 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -1057,7 +1066,7 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -1133,7 +1142,7 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio private Map getVerificationParameters(AdjustPurchase purchase) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -1146,7 +1155,7 @@ private Map getVerificationParameters(AdjustPurchase purchase) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -1158,7 +1167,7 @@ private Map getVerificationParameters(AdjustPurchase purchase) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -1226,8 +1235,7 @@ private ActivityPackage getDefaultActivityPackage(ActivityKind activityKind) { } private void injectFeatureFlagsWithParameters(Map parameters) { - SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(adjustConfig.getContext()); - if (sharedPreferencesManager.getCoppaCompliance()) { + if (coppaEnabled) { PackageBuilder.addLong(parameters, "ff_coppa", 1); } if (internalState != null) { @@ -1377,7 +1385,7 @@ private void checkDeviceIds(Map parameters) { && !parameters.containsKey("meids") && !parameters.containsKey("device_ids")) { SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(adjustConfig.getContext()); - if (sharedPreferencesManager.getCoppaCompliance()) { + if (coppaEnabled) { logger.info("Missing Device IDs. COPPA enabled."); } else { logger.error("Missing Device IDs. Please check if Proguard is correctly set with Adjust SDK"); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index 75e00455d..bbdcd4f74 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -657,7 +657,7 @@ public static boolean isEqualReferrerDetails(final ReferrerDetails referrerDetai return false; } - public static boolean canReadPlayIds(final AdjustConfig adjustConfig) { + public static boolean canReadPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled) { SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(adjustConfig.getContext()); @@ -665,32 +665,18 @@ public static boolean canReadPlayIds(final AdjustConfig adjustConfig) { return false; } - if (sharedPreferencesManager.getCoppaCompliance()) { - return false; - } - - return true; + return ! coppaEnabled; } - public static boolean canReadNonPlayIds(final AdjustConfig adjustConfig) { - SharedPreferencesManager sharedPreferencesManager = - SharedPreferencesManager.getDefaultInstance(adjustConfig.getContext()); - + public static boolean canReadNonPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled) + { if (adjustConfig.playStoreKidsAppEnabled) { return false; } - if (sharedPreferencesManager.getCoppaCompliance()) { - return false; - } - - return true; + return ! coppaEnabled; } - - - - public static boolean isGooglePlayGamesForPC(final Context context) { PackageManager pm = context.getPackageManager(); return pm.hasSystemFeature("com.google.android.play.feature.HPE_EXPERIENCE"); From 6723ea2747d3a8423e71ee17560ac28cba294ad3 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 22 Apr 2024 14:31:14 +0200 Subject: [PATCH 084/540] refac: update logic to read play AdId for Samsung Cloud env based on COPPA status --- .../main/java/com/adjust/sdk/DeviceInfo.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 444f7fd66..78f66f97e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -92,7 +92,6 @@ class DeviceInfo { int uiMode; String appSetId; boolean isGooglePlayGamesForPC; - Boolean isSamsungCloudEnvironment; Map imeiParameters; Map oaidParameters; @@ -135,11 +134,6 @@ class DeviceInfo { appInstallTime = getAppInstallTime(packageInfo); appUpdateTime = getAppUpdateTime(packageInfo); uiMode = getDeviceUiMode(configuration); - if (Reflection.isAppRunningInSamsungCloudEnvironment(context, adjustConfig.logger)) { - isSamsungCloudEnvironment = true; - playAdId = Reflection.getSamsungCloudDevGoogleAdId(context, adjustConfig.logger); - playAdIdSource = "samsung_cloud_sdk"; - } if (Util.canReadPlayIds(adjustConfig, coppaEnabled)) { appSetId = Reflection.getAppSetId(context); } @@ -155,15 +149,18 @@ void reloadPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled) { playAdIdSource = null; playAdIdAttempt = -1; - if (isSamsungCloudEnvironment != null && isSamsungCloudEnvironment) { - return; - } - if (!Util.canReadPlayIds(adjustConfig, coppaEnabled)) { return; } Context context = adjustConfig.context; + + if (Reflection.isAppRunningInSamsungCloudEnvironment(context, adjustConfig.logger)) { + playAdId = Reflection.getSamsungCloudDevGoogleAdId(context, adjustConfig.logger); + playAdIdSource = "samsung_cloud_sdk"; + playIdsReadOnce = true; + } + String previousPlayAdId = playAdId; Boolean previousIsTrackingEnabled = isTrackingEnabled; From 0e2df67642d3d4e7466818608eec3b028480cf73 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 22 Apr 2024 14:33:17 +0200 Subject: [PATCH 085/540] refac: for COPPA reset the play AdId read earlier once --- .../sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 78f66f97e..bfc0708cd 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -141,6 +141,12 @@ class DeviceInfo { void reloadPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled) { if (playIdsReadOnce && adjustConfig.readDeviceInfoOnceEnabled) { + if (!Util.canReadPlayIds(adjustConfig, coppaEnabled)) { + playAdId = null; + isTrackingEnabled = null; + playAdIdSource = null; + playAdIdAttempt = -1; + } return; } From 262a65aecd637831fc45211c7f3106ec98c61346 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 22 Apr 2024 15:50:10 +0200 Subject: [PATCH 086/540] chore: clean up unused variable --- Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index bbdcd4f74..601053ecd 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -658,23 +658,19 @@ public static boolean isEqualReferrerDetails(final ReferrerDetails referrerDetai } public static boolean canReadPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled) { - SharedPreferencesManager sharedPreferencesManager = - SharedPreferencesManager.getDefaultInstance(adjustConfig.getContext()); - if (adjustConfig.playStoreKidsAppEnabled) { return false; } - return ! coppaEnabled; + return !coppaEnabled; } - public static boolean canReadNonPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled) - { + public static boolean canReadNonPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled) { if (adjustConfig.playStoreKidsAppEnabled) { return false; } - return ! coppaEnabled; + return !coppaEnabled; } public static boolean isGooglePlayGamesForPC(final Context context) { From cd3d77968f4d0744ae855437b5e6c9a7fc4a2e21 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 23 Apr 2024 10:19:10 +0200 Subject: [PATCH 087/540] chore: clean up unused variable --- .../sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 59bad1b9f..ef1311938 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -74,8 +74,7 @@ static class ActivityStateCopy { DeviceInfo deviceInfo, ActivityState activityState, SessionParameters sessionParameters, - long createdAt) - { + long createdAt) { this.createdAt = createdAt; this.deviceInfo = deviceInfo; this.adjustConfig = adjustConfig; @@ -1384,7 +1383,6 @@ private void checkDeviceIds(Map parameters) { && !parameters.containsKey("imeis") && !parameters.containsKey("meids") && !parameters.containsKey("device_ids")) { - SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(adjustConfig.getContext()); if (coppaEnabled) { logger.info("Missing Device IDs. COPPA enabled."); } else { From 79edc9b6a911130c3a1b1d4269c3a1aafa45df75 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 23 Apr 2024 10:24:07 +0200 Subject: [PATCH 088/540] refac: remove restriction on TPS tracking when Coppa API invoked --- .../java/com/adjust/sdk/ActivityHandler.java | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index b27153d05..c487f9729 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -2579,15 +2579,6 @@ private void setCoppaComplianceI(final boolean coppaEnabled) { if (!isEnabledI()) { return; } if (activityState.isGdprForgotten) { return; } - if (activityState.isCoppaEnabled() && coppaEnabled) { - logger.debug("Coppa is already enabled in the activity state"); - return; - } - if (! activityState.isCoppaEnabled() && ! coppaEnabled) { - logger.debug("Coppa is already disabled in the activity state"); - return; - } - activityState.setCoppa(coppaEnabled); // third party sharing is disabled when coppa is enabled and vice-versa @@ -2914,7 +2905,20 @@ private void checkForInstallReferrerInfo(final SdkClickResponseData responseData } private void processCoppaComplianceI() { - setCoppaComplianceI( - SharedPreferencesManager.getDefaultInstance(getContext()).getCoppaCompliance()); + if (activityState == null) { return; } + if (!isEnabledI()) { return; } + if (activityState.isGdprForgotten) { return; } + + boolean coppaEnabled = + SharedPreferencesManager.getDefaultInstance(getContext()).getCoppaCompliance(); + + if (activityState.isCoppaEnabled() && coppaEnabled) { + return; + } + if (! activityState.isCoppaEnabled() && ! coppaEnabled) { + return; + } + + setCoppaComplianceI(coppaEnabled); } } From d8307874b3df39fd0207305014a45a014085ede2 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 23 Apr 2024 15:37:02 +0200 Subject: [PATCH 089/540] chore: clean up code a bit --- .../java/com/adjust/sdk/ActivityHandler.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index c487f9729..b779dd0f2 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -840,7 +840,7 @@ public void run(ActivityHandler activityHandler) { } if (deviceInfo.androidId == null) { - if (! Util.canReadNonPlayIds(adjustConfig, coppaEnabledInState)) { + if (!Util.canReadNonPlayIds(adjustConfig, coppaEnabledInState)) { if (adjustConfig.playStoreKidsAppEnabled) { logger.info("Cannot read non Play IDs with play store kids app enabled"); } @@ -1186,8 +1186,7 @@ private void preLaunchActionsI(List preLaunchActionsArray) private void processPreLaunchAdjustThirdPartySharingAndCoppaComplianceI() { for (final Object adjustThirdPartySharingOrCoppa : - adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray) - { + adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray) { if (adjustThirdPartySharingOrCoppa instanceof AdjustThirdPartySharing) { trackThirdPartySharingI((AdjustThirdPartySharing) adjustThirdPartySharingOrCoppa); } else if (adjustThirdPartySharingOrCoppa instanceof Boolean) { @@ -1206,8 +1205,6 @@ private void startI() { startFirstSessionI(); return; } else { - SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(getContext()); - // check if third party sharing request came, then send it first processPreLaunchAdjustThirdPartySharingAndCoppaComplianceI(); @@ -1258,10 +1255,11 @@ private void startFirstSessionI() { if (sharedPreferencesManager.getGdprForgetMe()) { gdprForgetMeI(); } else { - // preLaunchAdjustThirdPartySharing should be done *before* coppaCompliance - // since it will check for coppaCompliance inside it + // methods below need to be executed in this order + // first call is processing pre-init actions queue + // second call is making sure to process cached and not processed pre-init action + // from the previous run (if any) processPreLaunchAdjustThirdPartySharingAndCoppaComplianceI(); - processCoppaComplianceI(); if (adjustConfig.preLaunchActions.lastMeasurementConsentTracked != null) { @@ -2582,7 +2580,7 @@ private void setCoppaComplianceI(final boolean coppaEnabled) { activityState.setCoppa(coppaEnabled); // third party sharing is disabled when coppa is enabled and vice-versa - final boolean tpsEnabled = ! coppaEnabled; + final boolean tpsEnabled = !coppaEnabled; final AdjustThirdPartySharing adjustThirdPartySharing = new AdjustThirdPartySharing(tpsEnabled); final long now = System.currentTimeMillis(); @@ -2915,7 +2913,7 @@ private void processCoppaComplianceI() { if (activityState.isCoppaEnabled() && coppaEnabled) { return; } - if (! activityState.isCoppaEnabled() && ! coppaEnabled) { + if (!activityState.isCoppaEnabled() && !coppaEnabled) { return; } From 83116c944e3ac35ae04c8c3ab9fb5d7989c2a584 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 23 Apr 2024 17:20:04 +0200 Subject: [PATCH 090/540] refac: extract meta referrer code to a plugin and added meta referrer getter --- .../java/com/adjust/sdk/ActivityHandler.java | 29 ++- .../main/java/com/adjust/sdk/Reflection.java | 13 ++ Adjust/sdk-plugin-meta-referrer/.gitignore | 2 + Adjust/sdk-plugin-meta-referrer/build.gradle | 220 ++++++++++++++++++ .../proguard-rules.pro | 21 ++ .../src/main/AndroidManifest.xml | 2 + .../adjust/sdk/meta/AdjustMetaReferrer.java | 59 +++++ .../sdk/meta/MetaInstallReferrerDetails.java | 24 ++ .../sdk/meta/MetaInstallReferrerResult.java | 14 ++ .../adjust/sdk/meta/MetaReferrerClient.java | 145 ++++++++++++ .../OnMetaInstallReferrerReadListener.java | 6 + .../main/java/com/adjust/sdk/meta/Util.java | 27 +++ .../src/main/res/values/strings.xml | 3 + Adjust/settings.gradle | 2 +- 14 files changed, 551 insertions(+), 16 deletions(-) create mode 100644 Adjust/sdk-plugin-meta-referrer/.gitignore create mode 100644 Adjust/sdk-plugin-meta-referrer/build.gradle create mode 100644 Adjust/sdk-plugin-meta-referrer/proguard-rules.pro create mode 100644 Adjust/sdk-plugin-meta-referrer/src/main/AndroidManifest.xml create mode 100644 Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/AdjustMetaReferrer.java create mode 100644 Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaInstallReferrerDetails.java create mode 100644 Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaInstallReferrerResult.java create mode 100644 Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaReferrerClient.java create mode 100644 Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/OnMetaInstallReferrerReadListener.java create mode 100644 Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/Util.java create mode 100644 Adjust/sdk-plugin-meta-referrer/src/main/res/values/strings.xml diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index b779dd0f2..9aed9ae47 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -82,7 +82,6 @@ public class ActivityHandler implements IActivityHandler { private IPurchaseVerificationHandler purchaseVerificationHandler; private SessionParameters sessionParameters; private InstallReferrer installReferrer; - private InstallReferrerMeta installReferrerMeta; private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; @Override @@ -1000,18 +999,6 @@ public void onFail(String message) { }); - installReferrerMeta = new InstallReferrerMeta(adjustConfig.context, adjustConfig.fbAppId, - new InstallReferrerReadListener() { - @Override - public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { - sendInstallReferrer(referrerDetails, referrerApi); - } - - @Override - public void onFail(String message) { - logger.debug(message); - } - }); preLaunchActionsI(adjustConfig.preLaunchActions.preLaunchActionsArray); sendReftagReferrerI(); } @@ -1330,7 +1317,7 @@ private void processSessionI() { // Try to check if there's new referrer information. installReferrer.startConnection(); - installReferrerMeta.readReferrer(); + readInstallReferrerMeta(); readInstallReferrerHuaweiAds(); readInstallReferrerHuaweiAppGallery(); readInstallReferrerSamsung(); @@ -1343,6 +1330,18 @@ private void processSessionI() { logger.verbose("Time span since last activity too short for a new subsession"); } + private void readInstallReferrerMeta() { + executor.submit(new Runnable() { + @Override + public void run() { + ReferrerDetails referrerDetails = Reflection.getMetaReferrer(getContext(), adjustConfig.fbAppId, logger); + if (referrerDetails != null) { + sendInstallReferrer(referrerDetails, REFERRER_API_META); + } + } + }); + } + private void readInstallReferrerHuaweiAds() { executor.submit(new Runnable() { @Override @@ -1868,7 +1867,7 @@ private void checkAfterNewStartI(SharedPreferencesManager sharedPreferencesManag // try to read and send the install referrer installReferrer.startConnection(); - installReferrerMeta.readReferrer(); + readInstallReferrerMeta(); readInstallReferrerHuaweiAds(); readInstallReferrerHuaweiAppGallery(); readInstallReferrerSamsung(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java index 9c3ca3767..8c0586477 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java @@ -60,6 +60,19 @@ public static Boolean isPlayTrackingEnabled(Context context, Object AdvertisingI } } + public static ReferrerDetails getMetaReferrer(Context context, String fbAppId, ILogger logger) { + ReferrerDetails referrerDetails = null; + try { + referrerDetails = (ReferrerDetails) invokeStaticMethod("com.adjust.sdk.meta.Util", + "getMetaInstallReferrerDetails", + new Class[]{Context.class, String.class, ILogger.class}, + context, fbAppId, logger); + } catch (Exception e) { + logger.info("invoke getMetaInstallReferrerDetails : " + e.getMessage()); + } + return referrerDetails; + } + public static ReferrerDetails getHuaweiAdsReferrer(Context context, ILogger logger) { ReferrerDetails referrerDetails = null; try { diff --git a/Adjust/sdk-plugin-meta-referrer/.gitignore b/Adjust/sdk-plugin-meta-referrer/.gitignore new file mode 100644 index 000000000..97873191d --- /dev/null +++ b/Adjust/sdk-plugin-meta-referrer/.gitignore @@ -0,0 +1,2 @@ +/build +/libs diff --git a/Adjust/sdk-plugin-meta-referrer/build.gradle b/Adjust/sdk-plugin-meta-referrer/build.gradle new file mode 100644 index 000000000..48158dbb5 --- /dev/null +++ b/Adjust/sdk-plugin-meta-referrer/build.gradle @@ -0,0 +1,220 @@ +apply plugin: 'com.android.library' +apply plugin: 'maven-publish' +apply plugin: 'signing' + +repositories { + maven { + url "https://oss.sonatype.org/content/repositories/staging/" + } +} + +android { + compileSdkVersion rootProject.ext.coreCompileSdkVersion + publishing { + multipleVariants { + allVariants() + withJavadocJar() + } + } + defaultConfig { + minSdkVersion rootProject.ext.coreMinSdkVersion + targetSdkVersion rootProject.ext.coreTargetSdkVersion + } + namespace 'com.adjust.sdk.meta' +} + +dependencies { + // Add SDK via module. + compileOnly project(':sdk-core') + // Add SDK via Maven. + // implementation 'com.adjust.sdk:adjust-android:5.0.0' +} + +// read local properties +File localPropsFile = project.rootProject.file('local.properties') +if (localPropsFile.exists()) { + Properties p = new Properties() + new FileInputStream(localPropsFile).withCloseable { is -> + p.load(is) + } + p.each { name, value -> + ext[name] = value + } +} + +task adjustMetaReferrerPluginAar(type: Copy) { + dependsOn 'assembleRelease' + + from('build/outputs/aar/') + include 'sdk-plugin-meta-referrer-release.aar' + destinationDir file('build/libs/') + rename 'sdk-plugin-meta-referrer-release.aar', "${project.name}.aar" + +} + +task adjustMetaReferrerPluginJar(type: Jar) { + dependsOn 'packageReleaseAssets' + dependsOn 'compileReleaseJavaWithJavac' + + from('build/intermediates/library_assets/release/packageReleaseAssets/out/') { + into('assets') + } + from('build/intermediates/javac/release/classes/') + + archiveFileName = project.provider { "${project.name}.jar" } +} + + +task adjustMetaReferrerPluginSourcesJar(type: Jar) { + setArchiveClassifier('sources') + from android.sourceSets.main.java.srcDirs +} + +artifacts { + archives adjustMetaReferrerPluginJar + archives adjustMetaReferrerPluginSourcesJar +} + +afterEvaluate { + publishing { + publications { +/* + mavenAndroidMetaReferrerJar(MavenPublication) { + customizePomForJar(pom) + groupId rootProject.ext.adjustGroupId + artifactId 'adjust-android-meta-referrer' + version rootProject.ext.coreVersionName + + artifact adjustMetaReferrerPluginJar + artifact adjustMetaReferrerPluginSourcesJar + } +*/ + mavenAndroidMetaReferrerAar(MavenPublication) { + customizePomForAar(pom) + groupId rootProject.ext.adjustGroupId + artifactId 'adjust-android-meta-referrer' + version rootProject.ext.coreVersionName + + artifact("$buildDir/outputs/aar/sdk-plugin-meta-referrer-release.aar") { + builtBy tasks.getByPath("adjustMetaReferrerPluginAar") + } + artifact adjustMetaReferrerPluginSourcesJar + } + } + + repositories { + maven { + url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + if (project.hasProperty("sonatypeUsername")) { + credentials { + username sonatypeUsername + password sonatypePassword + } + } + } + } + } + signing { +// sign publishing.publications.mavenAndroidMetaReferrerJar + sign publishing.publications.mavenAndroidMetaReferrerAar + } +} + +def customizePomForJar(pom) { + pom.withXml { + def root = asNode() + + // Add all items necessary for maven central publication. + root.children().last() + { + resolveStrategy = Closure.DELEGATE_FIRST + description 'The Meta Referrer plugin for Adjust SDK for Android' + name 'Adjust Android SDK Meta Referrer plugin' + url 'https://github.com/adjust/android_sdk' + + organization { + name 'adjust GmbH' + url 'http://www.adjust.com' + } + licenses { + license { + name 'MIT License' + url 'http://www.opensource.org/licenses/mit-license.php' + } + } + scm { + url 'git@github.com:adjust/android_sdk.git' + connection 'scm:git:git@github.com:adjust/android_sdk.git' + developerConnection 'scm:git:git@github.com:adjust/android_sdk.git' + } + developers { + developer { + name 'Pedro Silva' + email 'pedro@adjust.com' + } + developer { + name 'Ugljesa Erceg' + email 'ugljesa@adjust.com' + } + } + } + } +} + +def customizePomForAar(pom) { + pom.withXml { + def root = asNode() + + // Add all items necessary for maven central publication. + root.children().last() + { + resolveStrategy = Closure.DELEGATE_FIRST + description 'The Meta Referrer plugin for Adjust SDK for Android' + name 'Adjust Android SDK Meta Referrer plugin' + url 'https://github.com/adjust/android_sdk' + + organization { + name 'adjust GmbH' + url 'http://www.adjust.com' + } + licenses { + license { + name 'MIT License' + url 'http://www.opensource.org/licenses/mit-license.php' + } + } + scm { + url 'git@github.com:adjust/android_sdk.git' + connection 'scm:git:git@github.com:adjust/android_sdk.git' + developerConnection 'scm:git:git@github.com:adjust/android_sdk.git' + } + developers { + developer { + name 'Pedro Silva' + email 'pedro@adjust.com' + } + developer { + name 'Ugljesa Erceg' + email 'ugljesa@adjust.com' + } + } + } + } +} + +model { +// tasks.generatePomFileForMavenAndroidMetaReferrerJarPublication { +// destination = file("${project.buildDir}/generated-pom.xml") +// } + /* TODO check if/how to replace this tasks + tasks.publishMavenAndroidMetaReferrerPublicationToMavenLocal { + dependsOn project.tasks.signArchives + } + tasks.publishMavenAndroidMetaReferrerPublicationToMavenRepository { + dependsOn project.tasks.signArchives + } + */ + tasks.generatePomFileForMavenAndroidMetaReferrerAarPublication { + destination = file("${project.buildDir}/generated-pom.xml") + } +} + + diff --git a/Adjust/sdk-plugin-meta-referrer/proguard-rules.pro b/Adjust/sdk-plugin-meta-referrer/proguard-rules.pro new file mode 100644 index 000000000..f1b424510 --- /dev/null +++ b/Adjust/sdk-plugin-meta-referrer/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/AndroidManifest.xml b/Adjust/sdk-plugin-meta-referrer/src/main/AndroidManifest.xml new file mode 100644 index 000000000..a2f47b605 --- /dev/null +++ b/Adjust/sdk-plugin-meta-referrer/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/AdjustMetaReferrer.java b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/AdjustMetaReferrer.java new file mode 100644 index 000000000..099b97878 --- /dev/null +++ b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/AdjustMetaReferrer.java @@ -0,0 +1,59 @@ +package com.adjust.sdk.meta; + +import android.content.Context; + +import com.adjust.sdk.AdjustFactory; +import com.adjust.sdk.scheduler.AsyncTaskExecutor; + +public class AdjustMetaReferrer { + + static boolean shouldReadMetaReferrer = true; + + /** + * Called to get Meta Install Referrer. + * + * @param context Application context + * @param fbAppId FB App Id + * @param onMetaInstallReferrerReadListener Callback to obtain install referrer. + */ + public static void getMetaInstallReferrer(final Context context, final String fbAppId, + final OnMetaInstallReferrerReadListener onMetaInstallReferrerReadListener) { + if (onMetaInstallReferrerReadListener == null){ + AdjustFactory.getLogger().error("onMetaInstallReferrerReadListener can not be null"); + return; + } + new AsyncTaskExecutor() { + @Override + protected MetaInstallReferrerResult doInBackground(Context[] contexts) { + try { + return MetaReferrerClient.getMetaInstallReferrer(context, fbAppId, AdjustFactory.getLogger()); + } catch (Exception exception) { + return new MetaInstallReferrerResult(exception.getMessage()); + } + } + + @Override + protected void onPostExecute(MetaInstallReferrerResult metaInstallReferrerResult) { + if (metaInstallReferrerResult != null) { + if (metaInstallReferrerResult.metaInstallReferrerDetails != null) { + onMetaInstallReferrerReadListener.onInstallReferrerDetailsRead(metaInstallReferrerResult.metaInstallReferrerDetails); + } else if (metaInstallReferrerResult.error != null) { + onMetaInstallReferrerReadListener.onFail(metaInstallReferrerResult.error); + } else { + onMetaInstallReferrerReadListener.onFail("Meta Install Referrer details null"); + } + } else { + onMetaInstallReferrerReadListener.onFail("Meta Install Referrer details null"); + } + } + }.execute(context); + } + + public static void readMetaReferrer(Context context) { + shouldReadMetaReferrer = true; + } + + public static void doNotReadMetaReferrer() { + shouldReadMetaReferrer = false; + } +} diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaInstallReferrerDetails.java b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaInstallReferrerDetails.java new file mode 100644 index 000000000..1c62bdece --- /dev/null +++ b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaInstallReferrerDetails.java @@ -0,0 +1,24 @@ +package com.adjust.sdk.meta; + +import com.adjust.sdk.Util; + +public class MetaInstallReferrerDetails { + public String installReferrer; // The referrer URL of the installed package. + public long actualTimestampInSec; // The actual timestamp in seconds. + public boolean isClick; // Whether its click or not. + + MetaInstallReferrerDetails(String installReferrer, long actualTimestampInSec, boolean isClick) { + this.installReferrer = installReferrer; + this.actualTimestampInSec = actualTimestampInSec; + this.isClick = isClick; + } + + public String toString() { + return Util.formatString( + " installReferrer : %s" + + " actualTimestampInSec : %d" + + " isClick : %b", + installReferrer, + actualTimestampInSec, + isClick); + }} diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaInstallReferrerResult.java b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaInstallReferrerResult.java new file mode 100644 index 000000000..88d579be2 --- /dev/null +++ b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaInstallReferrerResult.java @@ -0,0 +1,14 @@ +package com.adjust.sdk.meta; + +public class MetaInstallReferrerResult { + public MetaInstallReferrerDetails metaInstallReferrerDetails; + public String error; + + MetaInstallReferrerResult(MetaInstallReferrerDetails metaInstallReferrerDetails) { + this.metaInstallReferrerDetails = metaInstallReferrerDetails; + } + + public MetaInstallReferrerResult(String error) { + this.error = error; + } +} diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaReferrerClient.java b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaReferrerClient.java new file mode 100644 index 000000000..99771ba21 --- /dev/null +++ b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaReferrerClient.java @@ -0,0 +1,145 @@ +package com.adjust.sdk.meta; + +import android.content.ContentResolver; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.text.TextUtils; + +import com.adjust.sdk.ILogger; +import com.adjust.sdk.Util; + +public class MetaReferrerClient { + + /** + * Facebook install referrer provider content authority. + */ + private static final String FACEBOOK_REFERRER_PROVIDER_AUTHORITY = "com.facebook.katana.provider.InstallReferrerProvider"; + + /** + * Instagram install referrer provider content authority. + */ + private static final String INSTAGRAM_REFERRER_PROVIDER_AUTHORITY = "com.instagram.contentprovider.InstallReferrerProvider"; + + /** + * Meta referrer content provider install referrer column name. + */ + private static final String COLUMN_INSTALL_REFERRER = "install_referrer"; + + /** + * Meta referrer content provider actual timestamp column name. + */ + private static final String COLUMN_ACTUAL_TIMESTAMP = "actual_timestamp"; + + /** + * Meta referrer content provider is click or impression column name. + */ + private static final String COLUMN_IS_CT = "is_ct"; + + /** + * Adjust logger instance. + */ + private ILogger logger; + + /** + * Application context. + */ + private Context context; + + /** + * FB app ID. + */ + private String fbAppId; + + public static MetaInstallReferrerResult getMetaInstallReferrer( + final Context context, final String fbAppId, final ILogger logger) { + String errorMessage = null; + + if (TextUtils.isEmpty(fbAppId)) { + errorMessage = "Can't read Meta Install referrer with null or empty FBAppId"; + logger.debug(errorMessage); + return new MetaInstallReferrerResult(errorMessage); + } + + Cursor cursor = null; + + try { + Uri providerUri = null; + + if (resolveContentProvider(context, FACEBOOK_REFERRER_PROVIDER_AUTHORITY)) { + providerUri = Uri.parse("content://" + FACEBOOK_REFERRER_PROVIDER_AUTHORITY + "/" + fbAppId); + } else if (resolveContentProvider(context, INSTAGRAM_REFERRER_PROVIDER_AUTHORITY)) { + providerUri = Uri.parse("content://" + INSTAGRAM_REFERRER_PROVIDER_AUTHORITY + "/" + fbAppId); + } else { + return new MetaInstallReferrerResult("Failed to find Meta Install Referrer content provider"); + } + + ContentResolver contentResolver = context.getContentResolver(); + + String[] projection = {COLUMN_INSTALL_REFERRER, COLUMN_IS_CT, COLUMN_ACTUAL_TIMESTAMP}; + + cursor = contentResolver.query(providerUri, projection, null, null, null); + + if (cursor == null || !cursor.moveToFirst()) { + errorMessage = Util.formatString("Fail to read Meta Install Referrer for FB AppId [%s]", fbAppId); + logger.debug(errorMessage); + return new MetaInstallReferrerResult(errorMessage); + } + + int installReferrerIndex = cursor.getColumnIndex(COLUMN_INSTALL_REFERRER); + int timestampIndex = cursor.getColumnIndex(COLUMN_ACTUAL_TIMESTAMP); + int isCTIndex = cursor.getColumnIndex(COLUMN_IS_CT); + String installReferrer = cursor.getString(installReferrerIndex); + long actualTimestampInSec = cursor.getLong(timestampIndex); // in seconds + int ctValue = cursor.getInt(isCTIndex); // 0 = VT, 1 = CT + boolean isClick = ctValue == 1; + + logger.debug("InstallReferrerMeta reads " + + "installReferrer[%s] actualTimestampInSec[%d] isClick[%b]", + installReferrer, actualTimestampInSec, isClick); + + if (isValidReferrer(installReferrer)) { + MetaInstallReferrerDetails metaInstallReferrerDetails = + new MetaInstallReferrerDetails(installReferrer, actualTimestampInSec, isClick); + + return new MetaInstallReferrerResult(metaInstallReferrerDetails); + } else { + errorMessage = "Invalid Meta Install Referrer"; + logger.debug(errorMessage); + } + + } catch (Exception e) { + errorMessage = "Meta Install Referrer error " + e.getMessage(); + logger.debug(errorMessage); + } finally { + if (cursor != null) { + cursor.close(); + } + } + + return new MetaInstallReferrerResult(errorMessage); + } + + private static boolean resolveContentProvider(final Context applicationContext, + final String authority) { + try { + return (applicationContext.getPackageManager() + .resolveContentProvider(authority, 0) != null); + + } catch (Exception e) { + return false; + } + } + + private static boolean isValidReferrer(String referrer) { + if (referrer == null) { + return false; + } + + if (referrer.isEmpty()) { + return false; + } + + return true; + } +} diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/OnMetaInstallReferrerReadListener.java b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/OnMetaInstallReferrerReadListener.java new file mode 100644 index 000000000..67a211ea7 --- /dev/null +++ b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/OnMetaInstallReferrerReadListener.java @@ -0,0 +1,6 @@ +package com.adjust.sdk.meta; + +public interface OnMetaInstallReferrerReadListener { + void onInstallReferrerDetailsRead(MetaInstallReferrerDetails referrerDetails); + void onFail(String message); +} diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/Util.java b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/Util.java new file mode 100644 index 000000000..2f945dbf1 --- /dev/null +++ b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/Util.java @@ -0,0 +1,27 @@ +package com.adjust.sdk.meta; + +import android.content.Context; + +import com.adjust.sdk.ILogger; +import com.adjust.sdk.ReferrerDetails; + +public class Util { + public synchronized static ReferrerDetails getMetaInstallReferrerDetails(Context context, String fbAppId, ILogger logger) { + if (!AdjustMetaReferrer.shouldReadMetaReferrer) { + return null; + } + + MetaInstallReferrerResult metaInstallReferrerResult = MetaReferrerClient.getMetaInstallReferrer(context, fbAppId, logger); + if (metaInstallReferrerResult == null) { + return null; + } + if (metaInstallReferrerResult.metaInstallReferrerDetails == null) { + return null; + } + MetaInstallReferrerDetails metaInstallReferrerDetails = metaInstallReferrerResult.metaInstallReferrerDetails; + return new ReferrerDetails( + metaInstallReferrerDetails.installReferrer, + metaInstallReferrerDetails.actualTimestampInSec, + metaInstallReferrerDetails.isClick); + } +} diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/res/values/strings.xml b/Adjust/sdk-plugin-meta-referrer/src/main/res/values/strings.xml new file mode 100644 index 000000000..d9171f865 --- /dev/null +++ b/Adjust/sdk-plugin-meta-referrer/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + AdjustPluginMetaReferrer + diff --git a/Adjust/settings.gradle b/Adjust/settings.gradle index 5980cfe94..14dd56931 100644 --- a/Adjust/settings.gradle +++ b/Adjust/settings.gradle @@ -1,3 +1,3 @@ -include ':sdk-core', ':sdk-plugin-webbridge', ':sdk-plugin-oaid', ':sdk-plugin-sociomantic', ':sdk-plugin-trademob', ':sdk-plugin-imei', ':sdk-plugin-criteo', ':sdk-plugin-xiaomi-referrer', ':sdk-plugin-samsung-referrer', ':sdk-plugin-vivo-referrer', ':sdk-plugin-samsung-clouddev', ':sdk-plugin-huawei-referrer' +include ':sdk-core', ':sdk-plugin-webbridge', ':sdk-plugin-oaid', ':sdk-plugin-sociomantic', ':sdk-plugin-trademob', ':sdk-plugin-imei', ':sdk-plugin-criteo', ':sdk-plugin-xiaomi-referrer', ':sdk-plugin-samsung-referrer', ':sdk-plugin-vivo-referrer', ':sdk-plugin-samsung-clouddev', ':sdk-plugin-huawei-referrer', ':sdk-plugin-meta-referrer' include ':test-options', ':test-unit', ':test-library', ':test-app-core', ':test-kotlin', ':test-app-webbridge' include ':example-app-java', ':example-app-kotlin', ':example-app-tv', ':example-app-webbridge', ':example-app-fbpixel', ':example-app-keyboard' From fdca5e19af8e1606b557c7066234aeaf72cd59e3 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 23 Apr 2024 17:24:55 +0200 Subject: [PATCH 091/540] refac: extract meta specific queries tag from manifest --- Adjust/sdk-core/src/main/AndroidManifest.xml | 6 ------ .../sdk-plugin-meta-referrer/src/main/AndroidManifest.xml | 6 ++++++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Adjust/sdk-core/src/main/AndroidManifest.xml b/Adjust/sdk-core/src/main/AndroidManifest.xml index e269d3838..683c4c09a 100644 --- a/Adjust/sdk-core/src/main/AndroidManifest.xml +++ b/Adjust/sdk-core/src/main/AndroidManifest.xml @@ -2,10 +2,4 @@ - - - - - - diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/AndroidManifest.xml b/Adjust/sdk-plugin-meta-referrer/src/main/AndroidManifest.xml index a2f47b605..436998fc3 100644 --- a/Adjust/sdk-plugin-meta-referrer/src/main/AndroidManifest.xml +++ b/Adjust/sdk-plugin-meta-referrer/src/main/AndroidManifest.xml @@ -1,2 +1,8 @@ + + + + + + From 5cda5d569c921ff42377b06c0af4f12d9aa82355 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 24 Apr 2024 10:58:48 +0200 Subject: [PATCH 092/540] refac: remove InstallReferrerMeta class from core since it moved to plugin --- .../com/adjust/sdk/InstallReferrerMeta.java | 163 ------------------ 1 file changed, 163 deletions(-) delete mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrerMeta.java diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrerMeta.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrerMeta.java deleted file mode 100644 index d7517f3bf..000000000 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/InstallReferrerMeta.java +++ /dev/null @@ -1,163 +0,0 @@ -package com.adjust.sdk; - -import android.content.ContentResolver; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.text.TextUtils; - -import java.util.concurrent.atomic.AtomicBoolean; - -public class InstallReferrerMeta { - /** - * Facebook install referrer provider content authority. - */ - private static final String FACEBOOK_REFERRER_PROVIDER_AUTHORITY = "com.facebook.katana.provider.InstallReferrerProvider"; - - /** - * Instagram install referrer provider content authority. - */ - private static final String INSTAGRAM_REFERRER_PROVIDER_AUTHORITY = "com.instagram.contentprovider.InstallReferrerProvider"; - - /** - * Meta referrer content provider install referrer column name. - */ - private static final String COLUMN_INSTALL_REFERRER = "install_referrer"; - - /** - * Meta referrer content provider actual timestamp column name. - */ - private static final String COLUMN_ACTUAL_TIMESTAMP = "actual_timestamp"; - - /** - * Meta referrer content provider is click or impression column name. - */ - private static final String COLUMN_IS_CT = "is_ct"; - - /** - * Adjust logger instance. - */ - private ILogger logger; - - /** - * Application context. - */ - private Context context; - - /** - * FB app ID. - */ - private String fbAppId; - - /** - * Huawei Referrer callback. - */ - private final InstallReferrerReadListener referrerCallback; - - /** - * Boolean indicating whether service should be tried to read. - * Either because it has not yet tried, - * or it did and it was successful - * or it did, was not successful, but it should not retry - */ - private final AtomicBoolean shouldTryToRead; - - /** - * Default constructor. - * - * @param context Application context - * @param referrerCallback Callback for referrer information - */ - public InstallReferrerMeta(final Context context, - final String fbAppId, - final InstallReferrerReadListener referrerCallback) - { - this.logger = AdjustFactory.getLogger(); - this.context = context; - this.fbAppId = fbAppId; - this.referrerCallback = referrerCallback; - this.shouldTryToRead = new AtomicBoolean(true); - } - - public void readReferrer() { - if (!shouldTryToRead.get()) { - logger.debug("Should not retry to read Install referrer Meta"); - return; - } - - if (TextUtils.isEmpty(fbAppId)) { - logger.debug("Can't read Install referrer Meta with null or empty FB app ID"); - return; - } - - Cursor cursor = null; - - try { - Uri providerUri = null; - - if (Util.resolveContentProvider(context, FACEBOOK_REFERRER_PROVIDER_AUTHORITY)) { - providerUri = Uri.parse("content://" + FACEBOOK_REFERRER_PROVIDER_AUTHORITY + "/" + fbAppId); - } else if (Util.resolveContentProvider(context, INSTAGRAM_REFERRER_PROVIDER_AUTHORITY)) { - providerUri = Uri.parse("content://" + INSTAGRAM_REFERRER_PROVIDER_AUTHORITY + "/" + fbAppId); - } else { - return; - } - - ContentResolver contentResolver = context.getContentResolver(); - - String[] projection = {COLUMN_INSTALL_REFERRER, COLUMN_IS_CT, COLUMN_ACTUAL_TIMESTAMP}; - - cursor = contentResolver.query(providerUri, projection, null, null, null); - - if (cursor == null || !cursor.moveToFirst()) { - return; - } - - int installReferrerIndex = cursor.getColumnIndex(COLUMN_INSTALL_REFERRER); - int timestampIndex = cursor.getColumnIndex(COLUMN_ACTUAL_TIMESTAMP); - int isCTIndex = cursor.getColumnIndex(COLUMN_IS_CT); - String installReferrer = cursor.getString(installReferrerIndex); - long actualTimestampInSec = cursor.getLong(timestampIndex); // in seconds - int ctValue = cursor.getInt(isCTIndex); // 0 = VT, 1 = CT - boolean isClick = ctValue == 1; - - logger.debug("InstallReferrerMeta reads " + - "installReferrer[%s] actualTimestampInSec[%d] isClick[%b]", - installReferrer, actualTimestampInSec, ctValue); - - if (isValidReferrer(installReferrer)) { - ReferrerDetails referrerDetails = - new ReferrerDetails(installReferrer, - actualTimestampInSec, - isClick); - - referrerCallback.onInstallReferrerRead(referrerDetails, - Constants.REFERRER_API_META); - } else { - logger.debug("InstallReferrerMeta invalid installReferrer"); - } - - } catch (Exception e) { - logger.debug("InstallReferrerMeta error [%s]", e.getMessage()); - } finally { - if (cursor != null) { - cursor.close(); - } - } - - shouldTryToRead.set(false); - } - - private boolean isValidReferrer(String installReferrer) { - if (installReferrer == null) { - return false; - } - - if (installReferrer.isEmpty()) { - return false; - } - - return true; - } - -} \ No newline at end of file From 4fe377b5febe7c67ee69541ae432ced3f0a40eda Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 24 Apr 2024 12:32:01 +0200 Subject: [PATCH 093/540] refac: addded logic to avoid frequent read of Meta Install referrer when invoked by SDK --- .../adjust/sdk/meta/AdjustMetaReferrer.java | 2 +- .../adjust/sdk/meta/MetaReferrerClient.java | 31 +++++++++++-------- .../main/java/com/adjust/sdk/meta/Util.java | 2 +- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/AdjustMetaReferrer.java b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/AdjustMetaReferrer.java index 099b97878..640b49e69 100644 --- a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/AdjustMetaReferrer.java +++ b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/AdjustMetaReferrer.java @@ -26,7 +26,7 @@ public static void getMetaInstallReferrer(final Context context, final String fb @Override protected MetaInstallReferrerResult doInBackground(Context[] contexts) { try { - return MetaReferrerClient.getMetaInstallReferrer(context, fbAppId, AdjustFactory.getLogger()); + return MetaReferrerClient.getMetaInstallReferrer(context, fbAppId, AdjustFactory.getLogger(), false); } catch (Exception exception) { return new MetaInstallReferrerResult(exception.getMessage()); } diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaReferrerClient.java b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaReferrerClient.java index 99771ba21..b3c4e040e 100644 --- a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaReferrerClient.java +++ b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaReferrerClient.java @@ -9,6 +9,8 @@ import com.adjust.sdk.ILogger; import com.adjust.sdk.Util; +import java.util.concurrent.atomic.AtomicBoolean; + public class MetaReferrerClient { /** @@ -37,24 +39,25 @@ public class MetaReferrerClient { private static final String COLUMN_IS_CT = "is_ct"; /** - * Adjust logger instance. - */ - private ILogger logger; - - /** - * Application context. - */ - private Context context; - - /** - * FB app ID. + * Boolean indicating whether service should be tried to read. + * Either because it has not yet tried, + * or it did and it was successful + * or it did, was not successful, but it should not retry */ - private String fbAppId; + private static final AtomicBoolean shouldTryToRead = new AtomicBoolean(true); public static MetaInstallReferrerResult getMetaInstallReferrer( - final Context context, final String fbAppId, final ILogger logger) { + final Context context, final String fbAppId, final ILogger logger, final boolean shouldAvoidFrequentRead) { String errorMessage = null; + if (shouldAvoidFrequentRead) { + if (!shouldTryToRead.get()) { + errorMessage = "Shouldn't try to read Meta Install referrer"; + logger.debug(errorMessage); + return new MetaInstallReferrerResult(errorMessage); + } + } + if (TextUtils.isEmpty(fbAppId)) { errorMessage = "Can't read Meta Install referrer with null or empty FBAppId"; logger.debug(errorMessage); @@ -99,6 +102,8 @@ public static MetaInstallReferrerResult getMetaInstallReferrer( installReferrer, actualTimestampInSec, isClick); if (isValidReferrer(installReferrer)) { + shouldTryToRead.set(false); + MetaInstallReferrerDetails metaInstallReferrerDetails = new MetaInstallReferrerDetails(installReferrer, actualTimestampInSec, isClick); diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/Util.java b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/Util.java index 2f945dbf1..c0b86fd40 100644 --- a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/Util.java +++ b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/Util.java @@ -11,7 +11,7 @@ public synchronized static ReferrerDetails getMetaInstallReferrerDetails(Context return null; } - MetaInstallReferrerResult metaInstallReferrerResult = MetaReferrerClient.getMetaInstallReferrer(context, fbAppId, logger); + MetaInstallReferrerResult metaInstallReferrerResult = MetaReferrerClient.getMetaInstallReferrer(context, fbAppId, logger, true); if (metaInstallReferrerResult == null) { return null; } From 8dc8a184cbc5c8634107b4113843dac855651c06 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 25 Apr 2024 15:00:03 +0200 Subject: [PATCH 094/540] refac: remove obsolete app secret logic --- .../java/com/adjust/sdk/ActivityPackage.java | 2 +- .../java/com/adjust/sdk/AdjustConfig.java | 15 --- .../main/java/com/adjust/sdk/Constants.java | 1 - .../java/com/adjust/sdk/PackageBuilder.java | 22 --- .../src/main/java/com/adjust/sdk/Util.java | 5 - .../sdk/network/ActivityPackageSender.java | 127 +----------------- .../src/main/assets/adjust_config.js | 13 -- .../sdk/webbridge/AdjustBridgeInstance.java | 15 --- .../adjust/testapp/AdjustCommandExecutor.java | 14 -- .../src/main/assets/command_executor.js | 11 -- 10 files changed, 4 insertions(+), 221 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityPackage.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityPackage.java index b088db476..ac240c198 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityPackage.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityPackage.java @@ -220,7 +220,7 @@ public String getExtendedString() { if (parameters != null) { builder.append("Parameters:"); SortedMap sortedParameters = new TreeMap(parameters); - List stringsToExclude = Arrays.asList("app_secret", "secret_id", "adj_signing_id"); + List stringsToExclude = Arrays.asList("secret_id", "adj_signing_id"); for (Map.Entry entry : sortedParameters.entrySet() ) { String key = entry.getKey(); if (stringsToExclude.contains(key)) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 0a5f4593c..d6212e04b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -31,8 +31,6 @@ public class AdjustConfig { String pushToken; Boolean startEnabled; boolean startOffline; - String secretId; - String appSecret; String externalDeviceId; boolean preinstallTrackingEnabled; Boolean needsCost; @@ -147,11 +145,6 @@ public void setDelayStart(double delayStart) { this.delayStart = delayStart; } - public void setAppSecret(long secretId, long info1, long info2, long info3, long info4) { - this.secretId = Util.formatString("%d", secretId); - this.appSecret = Util.formatString("%d%d%d%d", info1, info2, info3, info4); - } - @Deprecated public void setReadMobileEquipmentIdentity(boolean readMobileEquipmentIdentity) { logger.warn("This method has been deprecated and shouldn't be used anymore"); @@ -310,14 +303,6 @@ public boolean isStartOffline() { return startOffline; } - public String getSecretId() { - return secretId; - } - - public String getAppSecret() { - return appSecret; - } - public String getExternalDeviceId() { return externalDeviceId; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 4b4a876cc..73014ce18 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -62,7 +62,6 @@ public interface Constants { String REFERRER = "referrer"; String ENCODING = "UTF-8"; - String SHA256 = "SHA-256"; int MINIMAL_ERROR_STATUS_CODE = 400; String CALLBACK_PARAMETERS = "callback_params"; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index ef1311938..0a5b6c195 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -263,7 +263,6 @@ private Map getSessionParameters(boolean isInDelay) { // Rest of the parameters. PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); @@ -298,7 +297,6 @@ private Map getSessionParameters(boolean isInDelay) { PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); - PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); @@ -355,7 +353,6 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel // Rest of the parameters. PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); @@ -395,7 +392,6 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); - PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); @@ -444,7 +440,6 @@ private Map getInfoParameters(String source) { } // Rest of the parameters. - PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); @@ -454,7 +449,6 @@ private Map getInfoParameters(String source) { PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addBoolean(parameters, "needs_response_details", true); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); - PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); PackageBuilder.addString(parameters, "source", source); // google play games @@ -509,7 +503,6 @@ private Map getClickParameters(String source) { // Rest of the parameters. PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); @@ -559,7 +552,6 @@ private Map getClickParameters(String source) { PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); - PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); PackageBuilder.addString(parameters, "source", source); @@ -613,7 +605,6 @@ private Map getAttributionParameters(String initiatedBy) { // Rest of the parameters. PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); @@ -631,7 +622,6 @@ private Map getAttributionParameters(String initiatedBy) { PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); - PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); // google play games PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); @@ -677,7 +667,6 @@ private Map getGdprParameters() { // Rest of the parameters. PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); @@ -694,7 +683,6 @@ private Map getGdprParameters() { PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); - PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); // google play games PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); @@ -754,7 +742,6 @@ private Map getGdprParameters() { // Rest of the parameters. PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); @@ -770,7 +757,6 @@ private Map getGdprParameters() { PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); - PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); // google play games PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); @@ -822,7 +808,6 @@ private Map getMeasurementConsentParameters( // Rest of the parameters. PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); @@ -838,7 +823,6 @@ private Map getMeasurementConsentParameters( PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); - PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); // google play games PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); @@ -978,7 +962,6 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven // Rest of the parameters. PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); @@ -1013,7 +996,6 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); - PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); PackageBuilder.addString(parameters, "source", adjustAdRevenue.source); PackageBuilder.addDoubleWithoutRounding(parameters, "revenue", adjustAdRevenue.revenue); PackageBuilder.addString(parameters, "currency", adjustAdRevenue.currency); @@ -1077,7 +1059,6 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio // Rest of the parameters. PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); @@ -1112,7 +1093,6 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); - PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); @@ -1172,7 +1152,6 @@ private Map getVerificationParameters(AdjustPurchase purchase) { // Rest of the parameters. PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); @@ -1207,7 +1186,6 @@ private Map getVerificationParameters(AdjustPurchase purchase) { PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); - PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index 601053ecd..d8fcb4420 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -10,7 +10,6 @@ package com.adjust.sdk; import static com.adjust.sdk.Constants.ENCODING; -import static com.adjust.sdk.Constants.SHA256; import android.content.Context; import android.content.pm.PackageManager; @@ -405,10 +404,6 @@ public static int hashObject(Object value, int hashCode) { return 37 * hashCode + value.hashCode(); } - public static String sha256(final String text) { - return hash(text, SHA256); - } - public static String hash(final String text, final String method) { String hashString = null; try { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index c56ec56e7..ab5a40b49 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -152,9 +152,7 @@ private void tryToGetResponse(final ResponseData responseData) { new HashMap<>(activityPackage.getParameters()); Map sendingParameters = responseData.sendingParameters; - String authorizationHeader = buildAndExtractAuthorizationHeader( - activityPackageParameters, - activityPackage.getActivityKind()); + String authorizationHeader = buildAndExtractAuthorizationHeader(activityPackageParameters); boolean shouldUseGET = responseData.activityPackage.getActivityKind() == ActivityKind.ATTRIBUTION; @@ -556,10 +554,7 @@ private void parseResponse(final ResponseData responseData, final String respons responseData.resolvedDeeplink = UtilNetworking.extractJsonString(jsonResponse,"resolved_click_url"); } - private String buildAndExtractAuthorizationHeader(final Map parameters, - final ActivityKind activityKind) { - String activityKindString = activityKind.toString(); - + private String buildAndExtractAuthorizationHeader(final Map parameters) { String adjSigningId = extractAdjSigningId(parameters); String secretId = extractSecretId(parameters); String headersId = extractHeadersId(parameters); @@ -573,43 +568,8 @@ private String buildAndExtractAuthorizationHeader(final Map para return authorizationHeader; } - authorizationHeader = buildAuthorizationHeaderV2WithSecretId(signature, secretId, headersId, + return buildAuthorizationHeaderV2WithSecretId(signature, secretId, headersId, algorithm, nativeVersion); - if (authorizationHeader != null) { - return authorizationHeader; - } - - String appSecret = extractAppSecret(parameters); - return buildAuthorizationHeaderV1(parameters, appSecret, secretId, activityKindString); - } - - private String buildAuthorizationHeaderV1(final Map parameters, - final String appSecret, - final String secretId, - final String activityKindString) - { - // check if the secret exists and it's not empty - if (appSecret == null || appSecret.length() == 0) { - return null; - } - String appSecretName = "app_secret"; - - Map signatureDetails = getSignature(parameters, activityKindString, appSecret); - - String algorithm = "sha256"; - String signature = Util.sha256(signatureDetails.get("clear_signature")); - String fields = signatureDetails.get("fields"); - - String secretIdHeader = Util.formatString("secret_id=\"%s\"", secretId); - String signatureHeader = Util.formatString("signature=\"%s\"", signature); - String algorithmHeader = Util.formatString("algorithm=\"%s\"", algorithm); - String fieldsHeader = Util.formatString("headers=\"%s\"", fields); - - String authorizationHeader = Util.formatString("Signature %s,%s,%s,%s", - secretIdHeader, signatureHeader, algorithmHeader, fieldsHeader); - logger.verbose("authorizationHeader: %s", authorizationHeader); - - return authorizationHeader; } private String buildAuthorizationHeaderV2WithAdjSigningId(final String signature, @@ -660,87 +620,6 @@ private String buildAuthorizationHeaderV2WithSecretId(final String signature, return authorizationHeader; } - private Map getSignature(final Map parameters, - final String activityKindString, - final String appSecret) - { - String activityKindName = "activity_kind"; - String activityKindValue = activityKindString; - - String createdAtName = "created_at"; - String createdAt = parameters.get(createdAtName); - - String deviceIdentifierName = getValidIdentifier(parameters); - String deviceIdentifier = parameters.get(deviceIdentifierName); - - String sourceName = "source"; - String sourceValue = parameters.get(sourceName); - - String payloadName = "payload"; - String payloadValue = parameters.get(payloadName); - - Map signatureParams = new HashMap(); - - signatureParams.put("app_secret", appSecret); - signatureParams.put(createdAtName, createdAt); - signatureParams.put(activityKindName, activityKindValue); - signatureParams.put(deviceIdentifierName, deviceIdentifier); - - if (sourceValue != null) { - signatureParams.put(sourceName, sourceValue); - } - - if (payloadValue != null) { - signatureParams.put(payloadName, payloadValue); - } - - String fields = ""; - String clearSignature = ""; - - for (Map.Entry entry : signatureParams.entrySet()) { - if (entry.getValue() != null) { - fields += entry.getKey() + " "; - clearSignature += entry.getValue(); - } - } - - // Remove last empty space. - fields = fields.substring(0, fields.length() - 1); - - HashMap signature = new HashMap(); - - signature.put("clear_signature", clearSignature); - signature.put("fields", fields); - - return signature; - } - - private String getValidIdentifier(final Map parameters) { - String googleAdIdName = "gps_adid"; - String fireAdIdName = "fire_adid"; - String androidIdName = "android_id"; - String androidUUIDName= "android_uuid"; - - if (parameters.get(googleAdIdName) != null) { - return googleAdIdName; - } - if (parameters.get(fireAdIdName) != null) { - return fireAdIdName; - } - if (parameters.get(androidIdName) != null) { - return androidIdName; - } - if (parameters.get(androidUUIDName) != null) { - return androidUUIDName; - } - - return null; - } - - private static String extractAppSecret(final Map parameters) { - return parameters.remove("app_secret"); - } - private static String extractSecretId(final Map parameters) { return parameters.remove("secret_id"); } diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js index b3acc543b..797eb7d2b 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -41,11 +41,6 @@ function AdjustConfig(appToken, environment, legacy) { this.deferredDeeplinkCallbackName = null; this.deferredDeeplinkCallbackFunction = null; this.delayStart = null; - this.secretId = null; - this.info1 = null; - this.info2 = null; - this.info3 = null; - this.info4 = null; this.fbPixelDefaultEventToken = null; this.fbPixelMapping = []; this.urlStrategy = null; @@ -213,14 +208,6 @@ AdjustConfig.prototype.setDelayStart = function(delayStart) { this.delayStart = delayStart; }; -AdjustConfig.prototype.setAppSecret = function(secretId, info1, info2, info3, info4) { - this.secretId = secretId; - this.info1 = info1; - this.info2 = info2; - this.info3 = info3; - this.info4 = info4; -}; - AdjustConfig.prototype.setReadMobileEquipmentIdentity = function(readMobileEquipmentIdentity) {}; AdjustConfig.prototype.setFbPixelDefaultEventToken = function(fbPixelDefaultEventToken) { diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 46d4c431f..1b97d0e2a 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -160,11 +160,6 @@ public void onCreate(String adjustConfigString) { Object openDeferredDeeplinkField = jsonAdjustConfig.get("openDeferredDeeplink"); Object deferredDeeplinkCallbackNameField = jsonAdjustConfig.get("deferredDeeplinkCallbackName"); Object delayStartField = jsonAdjustConfig.get("delayStart"); - Object secretIdField = jsonAdjustConfig.get("secretId"); - Object info1Field = jsonAdjustConfig.get("info1"); - Object info2Field = jsonAdjustConfig.get("info2"); - Object info3Field = jsonAdjustConfig.get("info3"); - Object info4Field = jsonAdjustConfig.get("info4"); Object fbPixelDefaultEventTokenField = jsonAdjustConfig.get("fbPixelDefaultEventToken"); Object fbPixelMappingField = jsonAdjustConfig.get("fbPixelMapping"); Object urlStrategyField = jsonAdjustConfig.get("urlStrategy"); @@ -328,16 +323,6 @@ public boolean launchReceivedDeeplink(Uri deeplink) { adjustConfig.setDelayStart(delayStart); } - // App secret - Long secretId = AdjustBridgeUtil.fieldToLong(secretIdField); - Long info1 = AdjustBridgeUtil.fieldToLong(info1Field); - Long info2 = AdjustBridgeUtil.fieldToLong(info2Field); - Long info3 = AdjustBridgeUtil.fieldToLong(info3Field); - Long info4 = AdjustBridgeUtil.fieldToLong(info4Field); - if (secretId != null && info1 != null && info2 != null && info3 != null && info4 != null) { - adjustConfig.setAppSecret(secretId, info1, info2, info3, info4); - } - // Check Pixel Default Event Token String fbPixelDefaultEventToken = AdjustBridgeUtil.fieldToString(fbPixelDefaultEventTokenField); if (fbPixelDefaultEventToken != null && this.facebookSDKJSInterface != null) { diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 39f2db91f..550b193f8 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -279,20 +279,6 @@ private void config() { // } - if (command.parameters.containsKey("appSecret")) { - List appSecretArray = command.parameters.get("appSecret"); - try { - long secretId = Long.parseLong(appSecretArray.get(0)); - long info1 = Long.parseLong(appSecretArray.get(1)); - long info2 = Long.parseLong(appSecretArray.get(2)); - long info3 = Long.parseLong(appSecretArray.get(3)); - long info4 = Long.parseLong(appSecretArray.get(4)); - adjustConfig.setAppSecret(secretId, info1, info2, info3, info4); - } catch (Exception ignored) { - - } - } - if (command.containsParameter("delayStart")) { String delayStartS = command.getFirstParameterValue("delayStart"); double delayStart = Double.parseDouble(delayStartS); diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index 637025084..715ef2193 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -295,17 +295,6 @@ AdjustCommandExecutor.prototype.config = function(params) { adjustConfig.setExternalDeviceId(externalDeviceId); } - if ('appSecret' in params) { - var appSecretArray = getValueFromKey(params, 'appSecret'); - var secretId = appSecretArray[0].toString(); - var info1 = appSecretArray[1].toString(); - var info2 = appSecretArray[2].toString(); - var info3 = appSecretArray[3].toString(); - var info4 = appSecretArray[4].toString(); - - adjustConfig.setAppSecret(secretId, info1, info2, info3, info4); - } - if ('delayStart' in params) { var delayStartS = getFirstParameterValue(params, 'delayStart'); var delayStart = parseFloat(delayStartS); From c2f60e921a5e3212d29244aaf0a02807c09303b9 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 18 Apr 2024 12:15:28 +0200 Subject: [PATCH 095/540] refac:refactor getAdid sync to async caching the OnAdidReadListener inside of the ActivityHandler and instance create OnAdidReadListener.java --- .../com/adjust/examples/GlobalApplication.java | 14 ++++++++++++++ .../java/com/adjust/sdk/ActivityHandler.java | 17 +++++++++++++---- .../src/main/java/com/adjust/sdk/Adjust.java | 10 +++++++--- .../main/java/com/adjust/sdk/AdjustConfig.java | 1 + .../java/com/adjust/sdk/AdjustInstance.java | 12 +++++++++--- .../java/com/adjust/sdk/IActivityHandler.java | 2 +- .../java/com/adjust/sdk/OnAdidReadListener.java | 6 ++++++ 7 files changed, 51 insertions(+), 11 deletions(-) create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAdidReadListener.java diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index a83634f79..2376ff35b 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -15,6 +15,7 @@ import com.adjust.sdk.AdjustSessionSuccess; import com.adjust.sdk.GooglePlayInstallReferrerDetails; import com.adjust.sdk.LogLevel; +import com.adjust.sdk.OnAdidReadListener; import com.adjust.sdk.OnAttributionChangedListener; import com.adjust.sdk.OnDeeplinkResponseListener; import com.adjust.sdk.OnEventTrackingFailedListener; @@ -97,6 +98,19 @@ public boolean launchReceivedDeeplink(Uri deeplink) { } }); + Adjust.getAdid(new OnAdidReadListener() { + @Override + public void onAdidRead(String adid) { + Log.d("example", "Adid callback called!"); + Log.d("example", "Adid: " + adid); + } + + @Override + public void onFail(String message) { + Log.d("example", "failed : " + message); + } + }); + // Set default tracker. // config.setDefaultTracker("{YourDefaultTracker}"); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 9aed9ae47..1dd537a2f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -83,6 +83,7 @@ public class ActivityHandler implements IActivityHandler { private SessionParameters sessionParameters; private InstallReferrer installReferrer; private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; + private OnAdidReadListener onAdidReadListener; @Override public void teardown() { @@ -460,9 +461,12 @@ private void updateAdidI(final String adid) { return; } + if (onAdidReadListener != null){ + onAdidReadListener.onAdidRead(adid); + } + activityState.adid = adid; writeActivityStateI(); - return; } @Override @@ -749,11 +753,11 @@ public void run() { } @Override - public String getAdid() { + public void getAdid(OnAdidReadListener callback) { if (activityState == null) { - return null; + callback.onFail("SDK needs to be initialized before getting adid"); } - return activityState.adid; + this.onAdidReadListener = callback; } @Override @@ -879,6 +883,11 @@ public void run(ActivityHandler activityHandler) { this.cachedDeeplinkResolutionCallback = adjustConfig.cachedDeeplinkResolutionCallback; } + // cached adid read callback + if (this.onAdidReadListener == null) { + this.onAdidReadListener = adjustConfig.cachedAdidReadCallback; + } + // GDPR if (internalState.hasFirstSdkStartOcurred()) { SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(getContext()); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 0214a83d5..a244bf066 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -345,11 +345,15 @@ public static String getAmazonAdId(final Context context) { /** * Called to get value of unique Adjust device identifier. * - * @return Unique Adjust device indetifier + * @param onAdidReadListener Callback to get triggered once identifier is obtained. */ - public static String getAdid() { + public static void getAdid(final OnAdidReadListener onAdidReadListener) { + if (onAdidReadListener == null) { + AdjustFactory.getLogger().info("onAdidReadListener is null"); + return; + } AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - return adjustInstance.getAdid(); + adjustInstance.getAdid(onAdidReadListener); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index d6212e04b..b0ed24b8d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -40,6 +40,7 @@ public class AdjustConfig { String fbAppId; boolean readDeviceInfoOnceEnabled; OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; + OnAdidReadListener cachedAdidReadCallback; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 748502472..ffd21df58 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -48,6 +48,7 @@ public PreLaunchActions() { private PreLaunchActions preLaunchActions = new PreLaunchActions(); private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; + private OnAdidReadListener cachedAdidReadCallback; /** * Base path for Adjust packages. */ @@ -68,6 +69,8 @@ public PreLaunchActions() { */ private String purchaseVerificationPath; + + /** * Called upon SDK initialisation. * @@ -96,6 +99,7 @@ public void onCreate(final AdjustConfig adjustConfig) { adjustConfig.subscriptionPath = this.subscriptionPath; adjustConfig.purchaseVerificationPath = this.purchaseVerificationPath; adjustConfig.cachedDeeplinkResolutionCallback = cachedDeeplinkResolutionCallback; + adjustConfig.cachedAdidReadCallback = cachedAdidReadCallback; activityHandler = AdjustFactory.getActivityHandler(adjustConfig); setSendingReferrersAsNotSent(adjustConfig.context); @@ -529,11 +533,13 @@ public void disableCoppaCompliance(Context context) { * * @return Unique Adjust device indetifier */ - public String getAdid() { + public void getAdid(OnAdidReadListener onAdidReadListener) { if (!checkActivityHandler("getAdid")) { - return null; + onAdidReadListener.onFail("ActivityHandler is not enabled"); + this.cachedAdidReadCallback = onAdidReadListener; + return; } - return activityHandler.getAdid(); + activityHandler.getAdid(onAdidReadListener); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 77f046187..0f58737ee 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -85,7 +85,7 @@ public interface IActivityHandler { Context getContext(); - String getAdid(); + void getAdid(OnAdidReadListener onAdidReadListener); AdjustAttribution getAttribution(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAdidReadListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAdidReadListener.java new file mode 100644 index 000000000..625d2cd5c --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAdidReadListener.java @@ -0,0 +1,6 @@ +package com.adjust.sdk; + +public interface OnAdidReadListener { + void onAdidRead(String adid); + void onFail(String message); +} From 8a201ca0fff8984814d5d2ffe17d3eae8c08243b Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 18 Apr 2024 14:57:38 +0200 Subject: [PATCH 096/540] refac:make cachedOnAdidListeners to the set<> that --- .../main/java/com/adjust/sdk/ActivityHandler.java | 15 ++++++++++----- .../main/java/com/adjust/sdk/AdjustConfig.java | 5 ++++- .../main/java/com/adjust/sdk/AdjustInstance.java | 8 +++++--- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 1dd537a2f..c1a8341bc 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -30,10 +30,13 @@ import java.io.InputStream; import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.Set; import static com.adjust.sdk.Constants.ACTIVITY_STATE_FILENAME; import static com.adjust.sdk.Constants.ATTRIBUTION_FILENAME; @@ -83,7 +86,7 @@ public class ActivityHandler implements IActivityHandler { private SessionParameters sessionParameters; private InstallReferrer installReferrer; private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; - private OnAdidReadListener onAdidReadListener; + private Set onAdidReadListener = new HashSet<>(); @Override public void teardown() { @@ -461,8 +464,10 @@ private void updateAdidI(final String adid) { return; } - if (onAdidReadListener != null){ - onAdidReadListener.onAdidRead(adid); + if (onAdidReadListener != null && !onAdidReadListener.isEmpty()){ + for (OnAdidReadListener onAdidReadListener : onAdidReadListener) { + onAdidReadListener.onAdidRead(adid); + } } activityState.adid = adid; @@ -757,7 +762,7 @@ public void getAdid(OnAdidReadListener callback) { if (activityState == null) { callback.onFail("SDK needs to be initialized before getting adid"); } - this.onAdidReadListener = callback; + this.onAdidReadListener.add(callback); } @Override @@ -885,7 +890,7 @@ public void run(ActivityHandler activityHandler) { // cached adid read callback if (this.onAdidReadListener == null) { - this.onAdidReadListener = adjustConfig.cachedAdidReadCallback; + this.onAdidReadListener = adjustConfig.cachedAdidReadCallbacks; } // GDPR diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index b0ed24b8d..336c2ee4b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -2,6 +2,9 @@ import android.content.Context; +import java.util.List; +import java.util.Set; + /** * Created by pfms on 06/11/14. */ @@ -40,7 +43,7 @@ public class AdjustConfig { String fbAppId; boolean readDeviceInfoOnceEnabled; OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; - OnAdidReadListener cachedAdidReadCallback; + Set cachedAdidReadCallbacks; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index ffd21df58..19acc7566 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -3,8 +3,10 @@ import android.net.Uri; import android.content.Context; +import java.util.HashSet; import java.util.List; import java.util.ArrayList; +import java.util.Set; /** * Class used to forward instructions to SDK which user gives as part of Adjust class interface. @@ -48,7 +50,7 @@ public PreLaunchActions() { private PreLaunchActions preLaunchActions = new PreLaunchActions(); private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; - private OnAdidReadListener cachedAdidReadCallback; + private final Set cachedAdidReadCallback = new HashSet<>(); /** * Base path for Adjust packages. */ @@ -99,7 +101,7 @@ public void onCreate(final AdjustConfig adjustConfig) { adjustConfig.subscriptionPath = this.subscriptionPath; adjustConfig.purchaseVerificationPath = this.purchaseVerificationPath; adjustConfig.cachedDeeplinkResolutionCallback = cachedDeeplinkResolutionCallback; - adjustConfig.cachedAdidReadCallback = cachedAdidReadCallback; + adjustConfig.cachedAdidReadCallbacks = cachedAdidReadCallback; activityHandler = AdjustFactory.getActivityHandler(adjustConfig); setSendingReferrersAsNotSent(adjustConfig.context); @@ -536,7 +538,7 @@ public void disableCoppaCompliance(Context context) { public void getAdid(OnAdidReadListener onAdidReadListener) { if (!checkActivityHandler("getAdid")) { onAdidReadListener.onFail("ActivityHandler is not enabled"); - this.cachedAdidReadCallback = onAdidReadListener; + this.cachedAdidReadCallback.add(onAdidReadListener); return; } activityHandler.getAdid(onAdidReadListener); From a76b297763fc2083bec09e0aeccf3d7351e402ec Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 18 Apr 2024 15:54:54 +0200 Subject: [PATCH 097/540] refac:tuning the caching process of callback sets --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 6 +++++- .../sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java | 1 + .../src/main/java/com/adjust/sdk/AdjustInstance.java | 6 ++++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index c1a8341bc..eced79376 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -762,6 +762,9 @@ public void getAdid(OnAdidReadListener callback) { if (activityState == null) { callback.onFail("SDK needs to be initialized before getting adid"); } + if (activityState != null && activityState.adid != null) { + callback.onAdidRead(activityState.adid); + } this.onAdidReadListener.add(callback); } @@ -890,8 +893,9 @@ public void run(ActivityHandler activityHandler) { // cached adid read callback if (this.onAdidReadListener == null) { - this.onAdidReadListener = adjustConfig.cachedAdidReadCallbacks; + this.onAdidReadListener = new HashSet<>(); } + this.onAdidReadListener.addAll(adjustConfig.cachedAdidReadCallbacks); // GDPR if (internalState.hasFirstSdkStartOcurred()) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 336c2ee4b..2420bf957 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -2,6 +2,7 @@ import android.content.Context; +import java.util.HashSet; import java.util.List; import java.util.Set; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 19acc7566..0fb3ff9bb 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -101,7 +101,10 @@ public void onCreate(final AdjustConfig adjustConfig) { adjustConfig.subscriptionPath = this.subscriptionPath; adjustConfig.purchaseVerificationPath = this.purchaseVerificationPath; adjustConfig.cachedDeeplinkResolutionCallback = cachedDeeplinkResolutionCallback; - adjustConfig.cachedAdidReadCallbacks = cachedAdidReadCallback; + if (adjustConfig.cachedAdidReadCallbacks == null) { + adjustConfig.cachedAdidReadCallbacks = new HashSet<>(); + } + adjustConfig.cachedAdidReadCallbacks.addAll(cachedAdidReadCallback); activityHandler = AdjustFactory.getActivityHandler(adjustConfig); setSendingReferrersAsNotSent(adjustConfig.context); @@ -537,7 +540,6 @@ public void disableCoppaCompliance(Context context) { */ public void getAdid(OnAdidReadListener onAdidReadListener) { if (!checkActivityHandler("getAdid")) { - onAdidReadListener.onFail("ActivityHandler is not enabled"); this.cachedAdidReadCallback.add(onAdidReadListener); return; } From 310a0165480cba6cc828f1e5117f5ff7fc4d687c Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 19 Apr 2024 10:06:10 +0200 Subject: [PATCH 098/540] refac:make callback trigger onRead if the activity state holds the adid --- .../sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 0fb3ff9bb..4efbb934a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -543,6 +543,9 @@ public void getAdid(OnAdidReadListener onAdidReadListener) { this.cachedAdidReadCallback.add(onAdidReadListener); return; } + if (activityHandler.getActivityState() != null){ + onAdidReadListener.onAdidRead(activityHandler.getActivityState().adid); + } activityHandler.getAdid(onAdidReadListener); } From 0077176e829b8dcf748e2f939594ca2b34ddb30e Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 19 Apr 2024 14:59:06 +0200 Subject: [PATCH 099/540] refac:remove onFail method from OnAdidReadListener.java change cachedAdidCallbacks from set to arrayList clear reference of callbacks as soon as onRead fired trigger onRead on main thread --- .../adjust/examples/GlobalApplication.java | 5 --- .../java/com/adjust/sdk/ActivityHandler.java | 39 +++++++++++++------ .../java/com/adjust/sdk/AdjustConfig.java | 6 +-- .../java/com/adjust/sdk/AdjustInstance.java | 15 +++---- .../com/adjust/sdk/OnAdidReadListener.java | 1 - 5 files changed, 35 insertions(+), 31 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 2376ff35b..364dd38fd 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -104,11 +104,6 @@ public void onAdidRead(String adid) { Log.d("example", "Adid callback called!"); Log.d("example", "Adid: " + adid); } - - @Override - public void onFail(String message) { - Log.d("example", "failed : " + message); - } }); // Set default tracker. diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index eced79376..e5ab4b71b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -16,6 +16,7 @@ import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.Handler; +import android.os.Looper; import android.text.TextUtils; import com.adjust.sdk.network.ActivityPackageSender; @@ -30,13 +31,10 @@ import java.io.InputStream; import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Properties; -import java.util.Set; import static com.adjust.sdk.Constants.ACTIVITY_STATE_FILENAME; import static com.adjust.sdk.Constants.ATTRIBUTION_FILENAME; @@ -86,7 +84,7 @@ public class ActivityHandler implements IActivityHandler { private SessionParameters sessionParameters; private InstallReferrer installReferrer; private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; - private Set onAdidReadListener = new HashSet<>(); + private ArrayList onAdidReadListener = new ArrayList<>(); @Override public void teardown() { @@ -460,16 +458,18 @@ private void updateAdidI(final String adid) { return; } - if (adid.equals(activityState.adid)) { - return; - } if (onAdidReadListener != null && !onAdidReadListener.isEmpty()){ for (OnAdidReadListener onAdidReadListener : onAdidReadListener) { onAdidReadListener.onAdidRead(adid); } + onAdidReadListener = null; + adjustConfig.cachedAdidReadCallbacks = null; } + if (adid.equals(activityState.adid)) { + return; + } activityState.adid = adid; writeActivityStateI(); } @@ -760,10 +760,11 @@ public void run() { @Override public void getAdid(OnAdidReadListener callback) { if (activityState == null) { - callback.onFail("SDK needs to be initialized before getting adid"); + logger.info("SDK needs to be initialized before getting adid"); } if (activityState != null && activityState.adid != null) { callback.onAdidRead(activityState.adid); + return; } this.onAdidReadListener.add(callback); } @@ -892,10 +893,26 @@ public void run(ActivityHandler activityHandler) { } // cached adid read callback - if (this.onAdidReadListener == null) { - this.onAdidReadListener = new HashSet<>(); + // if it's not empty, we need to add it to the onAdidReadListener in case getAdid() is + // called before the sdk starts + if (this.onAdidReadListener != null && !this.onAdidReadListener.isEmpty()) { + this.onAdidReadListener.addAll(adjustConfig.cachedAdidReadCallbacks); + }else { + this.onAdidReadListener = adjustConfig.cachedAdidReadCallbacks; + } + + if (activityState != null && activityState.adid != null) { + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + for (OnAdidReadListener onAdidReadListener : onAdidReadListener) { + onAdidReadListener.onAdidRead(activityState.adid); + } + adjustConfig.cachedAdidReadCallbacks = null; + onAdidReadListener = null; + } + }); } - this.onAdidReadListener.addAll(adjustConfig.cachedAdidReadCallbacks); // GDPR if (internalState.hasFirstSdkStartOcurred()) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 2420bf957..489600772 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -2,9 +2,7 @@ import android.content.Context; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.ArrayList; /** * Created by pfms on 06/11/14. @@ -44,7 +42,7 @@ public class AdjustConfig { String fbAppId; boolean readDeviceInfoOnceEnabled; OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; - Set cachedAdidReadCallbacks; + ArrayList cachedAdidReadCallbacks; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 4efbb934a..471f528ed 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -3,10 +3,8 @@ import android.net.Uri; import android.content.Context; -import java.util.HashSet; import java.util.List; import java.util.ArrayList; -import java.util.Set; /** * Class used to forward instructions to SDK which user gives as part of Adjust class interface. @@ -50,7 +48,7 @@ public PreLaunchActions() { private PreLaunchActions preLaunchActions = new PreLaunchActions(); private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; - private final Set cachedAdidReadCallback = new HashSet<>(); + private ArrayList cachedAdidReadCallback = null; /** * Base path for Adjust packages. */ @@ -101,10 +99,7 @@ public void onCreate(final AdjustConfig adjustConfig) { adjustConfig.subscriptionPath = this.subscriptionPath; adjustConfig.purchaseVerificationPath = this.purchaseVerificationPath; adjustConfig.cachedDeeplinkResolutionCallback = cachedDeeplinkResolutionCallback; - if (adjustConfig.cachedAdidReadCallbacks == null) { - adjustConfig.cachedAdidReadCallbacks = new HashSet<>(); - } - adjustConfig.cachedAdidReadCallbacks.addAll(cachedAdidReadCallback); + adjustConfig.cachedAdidReadCallbacks = cachedAdidReadCallback; activityHandler = AdjustFactory.getActivityHandler(adjustConfig); setSendingReferrersAsNotSent(adjustConfig.context); @@ -540,12 +535,12 @@ public void disableCoppaCompliance(Context context) { */ public void getAdid(OnAdidReadListener onAdidReadListener) { if (!checkActivityHandler("getAdid")) { + if (this.cachedAdidReadCallback == null) { + this.cachedAdidReadCallback = new ArrayList(); + } this.cachedAdidReadCallback.add(onAdidReadListener); return; } - if (activityHandler.getActivityState() != null){ - onAdidReadListener.onAdidRead(activityHandler.getActivityState().adid); - } activityHandler.getAdid(onAdidReadListener); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAdidReadListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAdidReadListener.java index 625d2cd5c..35d128e4d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAdidReadListener.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAdidReadListener.java @@ -2,5 +2,4 @@ public interface OnAdidReadListener { void onAdidRead(String adid); - void onFail(String message); } From 09906f0696c10c7f7daec5706f4ccfe64ef78535 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 19 Apr 2024 15:03:50 +0200 Subject: [PATCH 100/540] refac:tuning the post to mainThread --- .../sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index e5ab4b71b..bbf2ddcc3 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -902,7 +902,7 @@ public void run(ActivityHandler activityHandler) { } if (activityState != null && activityState.adid != null) { - new Handler(Looper.getMainLooper()).post(new Runnable() { + new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { @Override public void run() { for (OnAdidReadListener onAdidReadListener : onAdidReadListener) { From 62a9893880f0879dc47a114cca73e0814822f447 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 22 Apr 2024 10:11:29 +0200 Subject: [PATCH 101/540] refac:refactoring methode comment for getAdid in AdjustInstance --- .../main/java/com/adjust/examples/GlobalApplication.java | 9 +++++++++ .../src/main/java/com/adjust/sdk/AdjustInstance.java | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 364dd38fd..046b611d1 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -157,6 +157,15 @@ public void onAdidRead(String adid) { // Initialise the adjust SDK. Adjust.onCreate(config); + // Get the adid. + Adjust.getAdid(new OnAdidReadListener() { + @Override + public void onAdidRead(String adid) { + Log.d("example", "Adid callback called!"); + Log.d("example", "Adid: " + adid); + } + }); + Adjust.getGooglePlayInstallReferrer(this, new OnGooglePlayInstallReferrerReadListener() { @Override public void onInstallReferrerRead(GooglePlayInstallReferrerDetails referrerDetails) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 471f528ed..a18e49d17 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -531,7 +531,7 @@ public void disableCoppaCompliance(Context context) { /** * Called to get value of unique Adjust device identifier. * - * @return Unique Adjust device indetifier + * @param onAdidReadListener Callback to get triggered once identifier is obtained. */ public void getAdid(OnAdidReadListener onAdidReadListener) { if (!checkActivityHandler("getAdid")) { From ef7a9e3b540e523ce999fad2ed4698b4e9acb0f1 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 23 Apr 2024 13:33:13 +0200 Subject: [PATCH 102/540] refac:check null before invoking onRead in for loops since initI is calling from another thread --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index bbf2ddcc3..bcaf94832 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -461,7 +461,9 @@ private void updateAdidI(final String adid) { if (onAdidReadListener != null && !onAdidReadListener.isEmpty()){ for (OnAdidReadListener onAdidReadListener : onAdidReadListener) { - onAdidReadListener.onAdidRead(adid); + if (onAdidReadListener != null) { + onAdidReadListener.onAdidRead(adid); + } } onAdidReadListener = null; adjustConfig.cachedAdidReadCallbacks = null; @@ -906,7 +908,9 @@ public void run(ActivityHandler activityHandler) { @Override public void run() { for (OnAdidReadListener onAdidReadListener : onAdidReadListener) { - onAdidReadListener.onAdidRead(activityState.adid); + if (onAdidReadListener != null) { + onAdidReadListener.onAdidRead(activityState.adid); + } } adjustConfig.cachedAdidReadCallbacks = null; onAdidReadListener = null; From 7a79694ba386efc882979681b931f0ccdad0463b Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 23 Apr 2024 15:14:03 +0200 Subject: [PATCH 103/540] refac:invoking onRead on updateAdid after saving/writing in activityState --- .../java/com/adjust/sdk/ActivityHandler.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index bcaf94832..cca68e4f3 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -458,22 +458,20 @@ private void updateAdidI(final String adid) { return; } + if (!adid.equals(activityState.adid)) { + activityState.adid = adid; + writeActivityStateI(); + } if (onAdidReadListener != null && !onAdidReadListener.isEmpty()){ - for (OnAdidReadListener onAdidReadListener : onAdidReadListener) { - if (onAdidReadListener != null) { - onAdidReadListener.onAdidRead(adid); + for (OnAdidReadListener listener : onAdidReadListener) { + if (listener != null) { + listener.onAdidRead(adid); } } onAdidReadListener = null; adjustConfig.cachedAdidReadCallbacks = null; } - - if (adid.equals(activityState.adid)) { - return; - } - activityState.adid = adid; - writeActivityStateI(); } @Override From b66c1e224db84f12a9dd0de904a8947518cc0363 Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 24 Apr 2024 14:58:24 +0200 Subject: [PATCH 104/540] refac: unify naming of the adid callbacks array in different places --- .../java/com/adjust/sdk/ActivityHandler.java | 23 +++++++++---------- .../java/com/adjust/sdk/AdjustInstance.java | 11 +++++---- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index cca68e4f3..e7bc57654 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -16,7 +16,6 @@ import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.Handler; -import android.os.Looper; import android.text.TextUtils; import com.adjust.sdk.network.ActivityPackageSender; @@ -84,7 +83,7 @@ public class ActivityHandler implements IActivityHandler { private SessionParameters sessionParameters; private InstallReferrer installReferrer; private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; - private ArrayList onAdidReadListener = new ArrayList<>(); + private ArrayList cachedAdidReadCallbacks = new ArrayList<>(); @Override public void teardown() { @@ -463,13 +462,13 @@ private void updateAdidI(final String adid) { writeActivityStateI(); } - if (onAdidReadListener != null && !onAdidReadListener.isEmpty()){ - for (OnAdidReadListener listener : onAdidReadListener) { + if (cachedAdidReadCallbacks != null && !cachedAdidReadCallbacks.isEmpty()) { + for (OnAdidReadListener listener : cachedAdidReadCallbacks) { if (listener != null) { listener.onAdidRead(adid); } } - onAdidReadListener = null; + cachedAdidReadCallbacks = null; adjustConfig.cachedAdidReadCallbacks = null; } } @@ -766,7 +765,7 @@ public void getAdid(OnAdidReadListener callback) { callback.onAdidRead(activityState.adid); return; } - this.onAdidReadListener.add(callback); + this.cachedAdidReadCallbacks.add(callback); } @Override @@ -895,23 +894,23 @@ public void run(ActivityHandler activityHandler) { // cached adid read callback // if it's not empty, we need to add it to the onAdidReadListener in case getAdid() is // called before the sdk starts - if (this.onAdidReadListener != null && !this.onAdidReadListener.isEmpty()) { - this.onAdidReadListener.addAll(adjustConfig.cachedAdidReadCallbacks); - }else { - this.onAdidReadListener = adjustConfig.cachedAdidReadCallbacks; + if (this.cachedAdidReadCallbacks != null && !this.cachedAdidReadCallbacks.isEmpty()) { + this.cachedAdidReadCallbacks.addAll(adjustConfig.cachedAdidReadCallbacks); + } else { + this.cachedAdidReadCallbacks = adjustConfig.cachedAdidReadCallbacks; } if (activityState != null && activityState.adid != null) { new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { @Override public void run() { - for (OnAdidReadListener onAdidReadListener : onAdidReadListener) { + for (OnAdidReadListener onAdidReadListener : cachedAdidReadCallbacks) { if (onAdidReadListener != null) { onAdidReadListener.onAdidRead(activityState.adid); } } adjustConfig.cachedAdidReadCallbacks = null; - onAdidReadListener = null; + cachedAdidReadCallbacks = null; } }); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index a18e49d17..562b7d0c9 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -48,7 +48,8 @@ public PreLaunchActions() { private PreLaunchActions preLaunchActions = new PreLaunchActions(); private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; - private ArrayList cachedAdidReadCallback = null; + + private ArrayList cachedAdidReadCallbacks = null; /** * Base path for Adjust packages. */ @@ -99,7 +100,7 @@ public void onCreate(final AdjustConfig adjustConfig) { adjustConfig.subscriptionPath = this.subscriptionPath; adjustConfig.purchaseVerificationPath = this.purchaseVerificationPath; adjustConfig.cachedDeeplinkResolutionCallback = cachedDeeplinkResolutionCallback; - adjustConfig.cachedAdidReadCallbacks = cachedAdidReadCallback; + adjustConfig.cachedAdidReadCallbacks = cachedAdidReadCallbacks; activityHandler = AdjustFactory.getActivityHandler(adjustConfig); setSendingReferrersAsNotSent(adjustConfig.context); @@ -535,10 +536,10 @@ public void disableCoppaCompliance(Context context) { */ public void getAdid(OnAdidReadListener onAdidReadListener) { if (!checkActivityHandler("getAdid")) { - if (this.cachedAdidReadCallback == null) { - this.cachedAdidReadCallback = new ArrayList(); + if (this.cachedAdidReadCallbacks == null) { + this.cachedAdidReadCallbacks = new ArrayList(); } - this.cachedAdidReadCallback.add(onAdidReadListener); + this.cachedAdidReadCallbacks.add(onAdidReadListener); return; } activityHandler.getAdid(onAdidReadListener); From 0e34dd568800645c59687ce1ce612b496e0e2e5e Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 25 Apr 2024 13:06:23 +0200 Subject: [PATCH 105/540] refac:notifying the callback from main thread style tuning the getAdid implementation --- .../java/com/adjust/sdk/ActivityHandler.java | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index e7bc57654..703ac19d2 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -463,13 +463,18 @@ private void updateAdidI(final String adid) { } if (cachedAdidReadCallbacks != null && !cachedAdidReadCallbacks.isEmpty()) { - for (OnAdidReadListener listener : cachedAdidReadCallbacks) { - if (listener != null) { - listener.onAdidRead(adid); + new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + for (OnAdidReadListener listener : cachedAdidReadCallbacks) { + if (listener != null) { + listener.onAdidRead(adid); + } + } + cachedAdidReadCallbacks = null; + adjustConfig.cachedAdidReadCallbacks = null; } - } - cachedAdidReadCallbacks = null; - adjustConfig.cachedAdidReadCallbacks = null; + }); } } @@ -758,14 +763,14 @@ public void run() { @Override public void getAdid(OnAdidReadListener callback) { - if (activityState == null) { - logger.info("SDK needs to be initialized before getting adid"); - } if (activityState != null && activityState.adid != null) { callback.onAdidRead(activityState.adid); - return; + } else { + if (activityState == null) { + logger.warn("SDK needs to be initialized before getting adid"); + } + this.cachedAdidReadCallbacks.add(callback); } - this.cachedAdidReadCallbacks.add(callback); } @Override @@ -897,7 +902,7 @@ public void run(ActivityHandler activityHandler) { if (this.cachedAdidReadCallbacks != null && !this.cachedAdidReadCallbacks.isEmpty()) { this.cachedAdidReadCallbacks.addAll(adjustConfig.cachedAdidReadCallbacks); } else { - this.cachedAdidReadCallbacks = adjustConfig.cachedAdidReadCallbacks; + this.cachedAdidReadCallbacks = new ArrayList<>(adjustConfig.cachedAdidReadCallbacks); } if (activityState != null && activityState.adid != null) { From f533ebfc52d2ea6abcbb9e76caf13f9449b7accd Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 25 Apr 2024 13:43:14 +0200 Subject: [PATCH 106/540] refac:invoking the onAdidRead on main thread inside of getAdid in ActivityHandler --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 703ac19d2..0067a2c5f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -764,7 +764,12 @@ public void run() { @Override public void getAdid(OnAdidReadListener callback) { if (activityState != null && activityState.adid != null) { - callback.onAdidRead(activityState.adid); + new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + callback.onAdidRead(activityState.adid); + } + }); } else { if (activityState == null) { logger.warn("SDK needs to be initialized before getting adid"); From 5def51f8a7d6bd8f4f7752416d3e178e10091c5c Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 25 Apr 2024 14:23:27 +0200 Subject: [PATCH 107/540] refac:tuning the web bridge according the changes from sdk-core for getAdid --- .../main/assets/AdjustExample-WebView.html | 11 ++++++++++ .../src/main/assets/adjust.js | 21 ++++++++++++++----- .../sdk/webbridge/AdjustBridgeInstance.java | 17 ++++++++------- 3 files changed, 36 insertions(+), 13 deletions(-) diff --git a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html index d4f4995c9..a6a58bf01 100755 --- a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html +++ b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html @@ -149,6 +149,14 @@

Adjust Web View SDK Demo alert('Google Play Ad Id:\n' + gpsAdid); }); } + + var btnGetAdId = document.getElementById('btnGetAdId') + btnGetAdId.onclick = function(e) { + e.preventDefault(); + Adjust.getAdid(function (adid) { + alert('Ad Id:\n' + adid); + }); + } }
@@ -182,6 +190,9 @@

Adjust Web View SDK Demo
+
+ +

diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index 3a0ea8df3..ad892120f 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -185,11 +185,21 @@ var Adjust = { } }, - getAdid: function () { - if (AdjustBridge) { - return AdjustBridge.getAdid(); - } else { - return undefined; + getAdid: function (callback) { + if (AdjustBridge) { + if (typeof callback === 'string' || callback instanceof String) { + this.getAdIdCallbackName = callback; + } else { + this.getAdIdCallbackName = 'Adjust.adjust_getAdIdCallback'; + this.getAdIdCallbackFunction = callback; + } + AdjustBridge.getAdid(this.getAdIdCallbackName); + } + }, + + adjust_getAdIdCallback: function (adId) { + if (AdjustBridge && this.getAdIdCallbackFunction) { + this.getAdIdCallbackFunction(adId); } }, @@ -223,6 +233,7 @@ var Adjust = { this.isEnabledCallbackName = undefined; this.isEnabledCallbackFunction = undefined; this.getGoogleAdIdCallbackName = undefined; + this.getAdIdCallbackName = undefined; this.getGoogleAdIdCallbackFunction = undefined; }, }; diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 1b97d0e2a..c02f3e68c 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -18,9 +18,9 @@ import com.adjust.sdk.AdjustFactory; import com.adjust.sdk.AdjustSessionFailure; import com.adjust.sdk.AdjustSessionSuccess; -import com.adjust.sdk.AdjustTestOptions; import com.adjust.sdk.AdjustThirdPartySharing; import com.adjust.sdk.LogLevel; +import com.adjust.sdk.OnAdidReadListener; import com.adjust.sdk.OnAttributionChangedListener; import com.adjust.sdk.OnDeeplinkResponseListener; import com.adjust.sdk.OnDeviceIdsRead; @@ -30,12 +30,8 @@ import com.adjust.sdk.OnSessionTrackingSucceededListener; import org.json.JSONArray; -import org.json.JSONException; import org.json.JSONObject; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; - /** * Created by uerceg on 22/07/16. */ @@ -718,11 +714,16 @@ public String getAmazonAdId() { } @JavascriptInterface - public String getAdid() { + public void getAdid(final String callback) { if (!isInitialized()) { - return null; + return; } - return Adjust.getAdid(); + Adjust.getAdid(new OnAdidReadListener() { + @Override + public void onAdidRead(String adid) { + AdjustBridgeUtil.execSingleValueCallback(webView, callback, adid); + } + }); } @JavascriptInterface From b421f6b183892f08c5e451efeaa1079b7c1fcc48 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 26 Apr 2024 13:16:32 +0200 Subject: [PATCH 108/540] refac:check if cachedAdidReadCallbacks is null initiate it --- .../sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 0067a2c5f..763333be1 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -774,6 +774,9 @@ public void run() { if (activityState == null) { logger.warn("SDK needs to be initialized before getting adid"); } + if (this.cachedAdidReadCallbacks == null) { + this.cachedAdidReadCallbacks = new ArrayList<>(); + } this.cachedAdidReadCallbacks.add(callback); } } From dc859f5f51a459574b5468aa40f2d5d9cbf0253a Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 26 Apr 2024 16:27:54 +0200 Subject: [PATCH 109/540] refac:remove unnecessary initialization --- .../sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 763333be1..577b58bf9 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -83,7 +83,7 @@ public class ActivityHandler implements IActivityHandler { private SessionParameters sessionParameters; private InstallReferrer installReferrer; private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; - private ArrayList cachedAdidReadCallbacks = new ArrayList<>(); + private ArrayList cachedAdidReadCallbacks; @Override public void teardown() { From f300f30a220b84b2b97855bb12c48c2edb56363c Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 26 Apr 2024 16:51:49 +0200 Subject: [PATCH 110/540] refac:clean up the example code remove extra call for get adid --- .../main/java/com/adjust/examples/GlobalApplication.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 046b611d1..97fa87f90 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -98,14 +98,6 @@ public boolean launchReceivedDeeplink(Uri deeplink) { } }); - Adjust.getAdid(new OnAdidReadListener() { - @Override - public void onAdidRead(String adid) { - Log.d("example", "Adid callback called!"); - Log.d("example", "Adid: " + adid); - } - }); - // Set default tracker. // config.setDefaultTracker("{YourDefaultTracker}"); From 12f7b4c8d52fdf07fc9441bcca65fae7f2c15ee2 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 2 May 2024 11:20:52 +0200 Subject: [PATCH 111/540] refac:make getGoogleAdIdCallbackFunction in adjust.js undefined on teardown --- Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index ad892120f..44499dcbd 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -233,7 +233,8 @@ var Adjust = { this.isEnabledCallbackName = undefined; this.isEnabledCallbackFunction = undefined; this.getGoogleAdIdCallbackName = undefined; - this.getAdIdCallbackName = undefined; this.getGoogleAdIdCallbackFunction = undefined; + this.getAdIdCallbackName = undefined; + this.getAdIdCallbackFunction = undefined; }, }; From da0adc71a13f8988f2df76725348b5e51baa8b8c Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 2 May 2024 14:29:01 +0200 Subject: [PATCH 112/540] chore: clean up a bit --- .../src/main/java/com/adjust/sdk/Adjust.java | 2 +- .../main/java/com/adjust/sdk/AdjustInstance.java | 2 -- .../sdk-plugin-webbridge/src/main/assets/adjust.js | 14 +++++++------- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index a244bf066..3f529f18a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -349,7 +349,7 @@ public static String getAmazonAdId(final Context context) { */ public static void getAdid(final OnAdidReadListener onAdidReadListener) { if (onAdidReadListener == null) { - AdjustFactory.getLogger().info("onAdidReadListener is null"); + AdjustFactory.getLogger().error("Callback for getting adid can't be null"); return; } AdjustInstance adjustInstance = Adjust.getDefaultInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 562b7d0c9..9dcaa8b46 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -70,8 +70,6 @@ public PreLaunchActions() { */ private String purchaseVerificationPath; - - /** * Called upon SDK initialisation. * diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index 44499dcbd..a6f191a85 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -187,14 +187,14 @@ var Adjust = { getAdid: function (callback) { if (AdjustBridge) { - if (typeof callback === 'string' || callback instanceof String) { - this.getAdIdCallbackName = callback; - } else { - this.getAdIdCallbackName = 'Adjust.adjust_getAdIdCallback'; - this.getAdIdCallbackFunction = callback; - } - AdjustBridge.getAdid(this.getAdIdCallbackName); + if (typeof callback === 'string' || callback instanceof String) { + this.getAdIdCallbackName = callback; + } else { + this.getAdIdCallbackName = 'Adjust.adjust_getAdIdCallback'; + this.getAdIdCallbackFunction = callback; } + AdjustBridge.getAdid(this.getAdIdCallbackName); + } }, adjust_getAdIdCallback: function (adId) { From 0f63959fe431b28cb56eb2108db99884e5a3c78f Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 3 May 2024 16:51:51 +0200 Subject: [PATCH 113/540] refac: move Google Play Store kids from config to Adjust API --- .../java/com/adjust/sdk/ActivityHandler.java | 17 +++--- .../src/main/java/com/adjust/sdk/Adjust.java | 20 +++++++ .../java/com/adjust/sdk/AdjustConfig.java | 9 --- .../java/com/adjust/sdk/AdjustInstance.java | 28 ++++++++++ .../main/java/com/adjust/sdk/DeviceInfo.java | 14 ++--- .../java/com/adjust/sdk/PackageBuilder.java | 55 +++++++++++-------- .../adjust/sdk/SharedPreferencesManager.java | 27 +++++++++ .../src/main/java/com/adjust/sdk/Util.java | 16 ++---- .../src/main/assets/adjust.js | 12 ++++ .../src/main/assets/adjust_config.js | 5 -- .../sdk/webbridge/AdjustBridgeInstance.java | 25 ++++++--- .../adjust/testapp/AdjustCommandExecutor.java | 16 ++++-- .../src/main/assets/command_executor.js | 16 ++++-- 13 files changed, 174 insertions(+), 86 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 577b58bf9..aa0789b4f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -846,28 +846,25 @@ public void run(ActivityHandler activityHandler) { readConfigFile(adjustConfig.context); boolean coppaEnabledInState = activityState != null && activityState.isCoppaEnabled(); + boolean playStoreKidsAppEnabled = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getPlayStoreKidsApp(); - deviceInfo = new DeviceInfo(adjustConfig, coppaEnabledInState); + deviceInfo = new DeviceInfo(adjustConfig, coppaEnabledInState, playStoreKidsAppEnabled); if (adjustConfig.eventBufferingEnabled) { logger.info("Event buffering is enabled"); } - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabledInState); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabledInState, playStoreKidsAppEnabled); if (deviceInfo.playAdId == null) { - if (!Util.canReadPlayIds(adjustConfig, coppaEnabledInState)) { - if (adjustConfig.playStoreKidsAppEnabled) { - logger.info("Cannot read Google Play Services Advertising ID with play store kids app enabled"); - } + if (!Util.canReadPlayIds(adjustConfig, coppaEnabledInState, playStoreKidsAppEnabled)) { + logger.info("Cannot read Google Play Services Advertising ID with COPPA or play store kids app enabled"); } else { logger.warn("Unable to get Google Play Services Advertising ID at start time"); } if (deviceInfo.androidId == null) { - if (!Util.canReadNonPlayIds(adjustConfig, coppaEnabledInState)) { - if (adjustConfig.playStoreKidsAppEnabled) { - logger.info("Cannot read non Play IDs with play store kids app enabled"); - } + if (! Util.canReadNonPlayIds(adjustConfig, coppaEnabledInState, playStoreKidsAppEnabled)) { + logger.info("Cannot read non Play IDs with COPPA or play store kids app enabled"); } else { logger.error("Unable to get any Device IDs. Please check if Proguard is correctly set with Adjust SDK"); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 3f529f18a..de3a7b48b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -312,6 +312,26 @@ public static void disableCoppaCompliance(final Context context) { adjustInstance.disableCoppaCompliance(context); } + /** + * Called to enable Google Play Store Kids app setting. + * + * @param context Application context + */ + public static void enablePlayStoreKidsApp(final Context context) { + AdjustInstance adjustInstance = Adjust.getDefaultInstance(); + adjustInstance.enablePlayStoreKidsApp(context); + } + + /** + * Called to disable Google Play Store Kids app setting. + * + * @param context Application context + */ + public static void disablePlayStoreKidsApp(final Context context) { + AdjustInstance adjustInstance = Adjust.getDefaultInstance(); + adjustInstance.disablePlayStoreKidsApp(context); + } + /** * Called to get value of Google Play Advertising Identifier. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 489600772..fb9a7790b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -38,7 +38,6 @@ public class AdjustConfig { Boolean needsCost; String urlStrategy; String preinstallFilePath; - boolean playStoreKidsAppEnabled; String fbAppId; boolean readDeviceInfoOnceEnabled; OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; @@ -169,10 +168,6 @@ public void setNeedsCost(boolean needsCost) { this.needsCost = needsCost; } - public void setPlayStoreKidsAppEnabled(boolean playStoreKidsAppEnabled) { - this.playStoreKidsAppEnabled = playStoreKidsAppEnabled; - } - public void setFbAppId(String fbAppId) { this.fbAppId = fbAppId; } @@ -326,10 +321,6 @@ public String getPreinstallFilePath() { return preinstallFilePath; } - public boolean isPlayStoreKidsAppEnabled() { - return playStoreKidsAppEnabled; - } - public String getFbAppId() { return fbAppId; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 9dcaa8b46..1f338a1e1 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -527,6 +527,24 @@ public void disableCoppaCompliance(Context context) { } } + /** + * Called to enable Google Play Store Kids app setting. + * + * @param context Application context + */ + public void enablePlayStoreKidsApp(Context context) { + savePlayStoreKidsApp(true, context); + } + + /** + * Called to disable Google Play Store Kids app setting. + * + * @param context Application context + */ + public void disablePlayStoreKidsApp(Context context) { + savePlayStoreKidsApp(false, context); + } + /** * Called to get value of unique Adjust device identifier. * @@ -713,6 +731,16 @@ private void saveCoppaCompliance(final boolean enabled, final Context context) { SharedPreferencesManager.getDefaultInstance(context).saveCoppaCompliance(enabled); } + /** + * Save Google play store kids app settings to shared preferences. + * + * @param enabled boolean indicating should GPSKA be enabled (true) or not (false) + * @param context Application context + */ + private void savePlayStoreKidsApp(final boolean enabled, final Context context) { + SharedPreferencesManager.getDefaultInstance(context).savePlayStoreKidsApp(enabled); + } + /** * Check if AdjustInstance enable flag is set or not. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index bfc0708cd..40d45de40 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -101,7 +101,7 @@ class DeviceInfo { String mcc; String mnc; - DeviceInfo(AdjustConfig adjustConfig, boolean coppaEnabled) { + DeviceInfo(AdjustConfig adjustConfig, boolean coppaEnabled, boolean playStoreKidsAppEnabled) { Context context = adjustConfig.context; Resources resources = context.getResources(); DisplayMetrics displayMetrics = resources.getDisplayMetrics(); @@ -134,14 +134,14 @@ class DeviceInfo { appInstallTime = getAppInstallTime(packageInfo); appUpdateTime = getAppUpdateTime(packageInfo); uiMode = getDeviceUiMode(configuration); - if (Util.canReadPlayIds(adjustConfig, coppaEnabled)) { + if (Util.canReadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled)) { appSetId = Reflection.getAppSetId(context); } } - void reloadPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled) { + void reloadPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled, boolean playStoreKidsAppEnabled) { if (playIdsReadOnce && adjustConfig.readDeviceInfoOnceEnabled) { - if (!Util.canReadPlayIds(adjustConfig, coppaEnabled)) { + if (!Util.canReadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled)) { playAdId = null; isTrackingEnabled = null; playAdIdSource = null; @@ -155,7 +155,7 @@ void reloadPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled) { playAdIdSource = null; playAdIdAttempt = -1; - if (!Util.canReadPlayIds(adjustConfig, coppaEnabled)) { + if (!Util.canReadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled)) { return; } @@ -234,8 +234,8 @@ void reloadPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled) { } } - void reloadNonPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled) { - if (!Util.canReadNonPlayIds(adjustConfig, coppaEnabled)) { + void reloadNonPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled, boolean playStoreKidsAppEnabled) { + if (!Util.canReadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled)) { return; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 0a5b6c195..908e0bfb8 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -44,6 +44,7 @@ public class PackageBuilder { ActivityHandler.InternalState internalState; boolean coppaEnabled; + boolean playStoreKidsAppEnabled; static class ActivityStateCopy { int eventCount = -1; @@ -81,11 +82,14 @@ static class ActivityStateCopy { this.activityStateCopy = new ActivityStateCopy(activityState); this.sessionParameters = sessionParameters; + SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(adjustConfig.context); + if (activityState != null) { this.coppaEnabled = activityState.isCoppaEnabled(); } else { - this.coppaEnabled = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getCoppaCompliance(); + this.coppaEnabled = sharedPreferencesManager.getCoppaCompliance(); } + this.playStoreKidsAppEnabled = sharedPreferencesManager.getPlayStoreKidsApp(); } ActivityPackage buildSessionPackage(boolean isInDelay) { @@ -244,7 +248,7 @@ private Map getSessionParameters(boolean isInDelay) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -257,7 +261,7 @@ private Map getSessionParameters(boolean isInDelay) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -334,7 +338,7 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -347,7 +351,7 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -422,7 +426,7 @@ private Map getInfoParameters(String source) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -435,7 +439,7 @@ private Map getInfoParameters(String source) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -476,7 +480,7 @@ private Map getClickParameters(String source) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -489,7 +493,7 @@ private Map getClickParameters(String source) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -586,7 +590,7 @@ private Map getAttributionParameters(String initiatedBy) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -599,7 +603,7 @@ private Map getAttributionParameters(String initiatedBy) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -648,7 +652,7 @@ private Map getGdprParameters() { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -661,7 +665,7 @@ private Map getGdprParameters() { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -723,7 +727,7 @@ private Map getGdprParameters() { adjustThirdPartySharing.partnerSharingSettings); // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -736,7 +740,7 @@ private Map getGdprParameters() { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -789,7 +793,7 @@ private Map getMeasurementConsentParameters( consentMeasurement ? "enable" : "disable"); // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -802,7 +806,7 @@ private Map getMeasurementConsentParameters( if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -943,7 +947,7 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -956,7 +960,7 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -1034,7 +1038,7 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -1047,7 +1051,7 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -1134,7 +1138,7 @@ private Map getVerificationParameters(AdjustPurchase purchase) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -1146,7 +1150,7 @@ private Map getVerificationParameters(AdjustPurchase purchase) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -1215,6 +1219,7 @@ private void injectFeatureFlagsWithParameters(Map parameters) { if (coppaEnabled) { PackageBuilder.addLong(parameters, "ff_coppa", 1); } + if (internalState != null) { PackageBuilder.addBoolean(parameters, "offline_mode_enabled", internalState.offline); if (internalState.isInForeground()) { @@ -1223,7 +1228,7 @@ private void injectFeatureFlagsWithParameters(Map parameters) { PackageBuilder.addBoolean(parameters, "background", true); } } - if (adjustConfig.playStoreKidsAppEnabled) { + if (playStoreKidsAppEnabled) { PackageBuilder.addLong(parameters, "ff_play_store_kids_app", 1); } } @@ -1363,6 +1368,8 @@ private void checkDeviceIds(Map parameters) { && !parameters.containsKey("device_ids")) { if (coppaEnabled) { logger.info("Missing Device IDs. COPPA enabled."); + } else if (playStoreKidsAppEnabled) { + logger.info("Missing Device IDs. Play store kids app enabled."); } else { logger.error("Missing Device IDs. Please check if Proguard is correctly set with Adjust SDK"); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java index d0e22a808..3111c0a0d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -49,6 +49,8 @@ public class SharedPreferencesManager { private static final String PREFS_KEY_COPPA_COMPLIANCE_ENABLED = "coppa_compliant_enabled"; + private static final String PREFS_KEY_PLAY_STORE_KIDS_APP_ENABLED = "play_store_kids_app_enabled"; + /** * Index for raw referrer string content in saved JSONArray object. */ @@ -435,6 +437,31 @@ public synchronized void removeCoppaCompliance() { remove(PREFS_KEY_COPPA_COMPLIANCE_ENABLED); } + /** + * Save Google Play Store Kids app state to shared preferences. + * + * @param enabled boolean indicating should GPSKA be enabled (true) or not (false) + */ + public synchronized void savePlayStoreKidsApp(final boolean enabled) { + saveBoolean(PREFS_KEY_PLAY_STORE_KIDS_APP_ENABLED, enabled); + } + + /** + * Get Google Play Store Kids app from shared preferences. + * + * @return Google Play Store Kids app setting + */ + public synchronized boolean getPlayStoreKidsApp() { + return getBoolean(PREFS_KEY_PLAY_STORE_KIDS_APP_ENABLED, false); + } + + /** + * Remove Google Play Store Kids app settings from shared preferences. + */ + public synchronized void removePlayStoreKidsApp() { + remove(PREFS_KEY_PLAY_STORE_KIDS_APP_ENABLED); + } + /** * Remove all key-value pairs from shared preferences. */ diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index d8fcb4420..d4afcf582 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -652,20 +652,12 @@ public static boolean isEqualReferrerDetails(final ReferrerDetails referrerDetai return false; } - public static boolean canReadPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled) { - if (adjustConfig.playStoreKidsAppEnabled) { - return false; - } - - return !coppaEnabled; + public static boolean canReadPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled, boolean playStoreKidsAppEnabled) { + return !coppaEnabled && !playStoreKidsAppEnabled; } - public static boolean canReadNonPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled) { - if (adjustConfig.playStoreKidsAppEnabled) { - return false; - } - - return !coppaEnabled; + public static boolean canReadNonPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled, boolean playStoreKidsAppEnabled) { + return !coppaEnabled && !playStoreKidsAppEnabled; } public static boolean isGooglePlayGamesForPC(final Context context) { diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index a6f191a85..a3be7bff2 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -159,6 +159,18 @@ var Adjust = { } }, + enablePlayStoreKidsApp: function () { + if (AdjustBridge) { + AdjustBridge.enablePlayStoreKidsApp(); + } + }, + + disablePlayStoreKidsApp: function () { + if (AdjustBridge) { + AdjustBridge.disablePlayStoreKidsApp(); + } + }, + getGoogleAdId: function (callback) { if (AdjustBridge) { if (typeof callback === 'string' || callback instanceof String) { diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js index 797eb7d2b..9a323db69 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -46,7 +46,6 @@ function AdjustConfig(appToken, environment, legacy) { this.urlStrategy = null; this.preinstallTrackingEnabled = null; this.preinstallFilePath = null; - this.playStoreKidsAppEnabled = null; this.fbAppId = null; this.readDeviceInfoOnceEnabled = null; } @@ -231,10 +230,6 @@ AdjustConfig.prototype.setPreinstallFilePath = function(preinstallFilePath) { this.preinstallFilePath = preinstallFilePath; }; -AdjustConfig.prototype.setPlayStoreKidsAppEnabled = function(isEnabled) { - this.playStoreKidsAppEnabled = isEnabled; -}; - AdjustConfig.prototype.setFbAppId = function(fbAppId) { this.fbAppId = fbAppId; }; diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index c02f3e68c..0fd2a03ab 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -161,7 +161,6 @@ public void onCreate(String adjustConfigString) { Object urlStrategyField = jsonAdjustConfig.get("urlStrategy"); Object preinstallTrackingEnabledField = jsonAdjustConfig.get("preinstallTrackingEnabled"); Object preinstallFilePathField = jsonAdjustConfig.get("preinstallFilePath"); - Object playStoreKidsAppEnabledField = jsonAdjustConfig.get("playStoreKidsAppEnabled"); Object fbAppIdField = jsonAdjustConfig.get("fbAppId"); Object readDeviceInfoOnceEnabledField = jsonAdjustConfig.get("readDeviceInfoOnceEnabled"); @@ -357,12 +356,6 @@ public boolean launchReceivedDeeplink(Uri deeplink) { adjustConfig.setPreinstallFilePath(preinstallFilePath); } - // PlayStore Kids app - Boolean playStoreKidsAppEnabled = AdjustBridgeUtil.fieldToBoolean(playStoreKidsAppEnabledField); - if (playStoreKidsAppEnabled != null) { - adjustConfig.setPlayStoreKidsAppEnabled(playStoreKidsAppEnabled); - } - // FB App ID String fbAppId = AdjustBridgeUtil.fieldToString(fbAppIdField); if (fbAppId != null) { @@ -692,6 +685,24 @@ public void disableCoppaCompliance() { Adjust.disableCoppaCompliance(application.getApplicationContext()); } + @JavascriptInterface + public void enablePlayStoreKidsApp() { + if (!isInitialized()) { + return; + } + + Adjust.enablePlayStoreKidsApp(application.getApplicationContext()); + } + + @JavascriptInterface + public void disablePlayStoreKidsApp() { + if (!isInitialized()) { + return; + } + + Adjust.disablePlayStoreKidsApp(application.getApplicationContext()); + } + @JavascriptInterface public void getGoogleAdId(final String callback) { if (!isInitialized()) { diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 550b193f8..ae4d48f4c 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -96,6 +96,8 @@ public void executeCommand(final Command sentCommand) { case "processDeeplink" : processDeeplink(); break; case "enableCoppaCompliance" : enableCoppaCompliance(); break; case "disableCoppaCompliance" : disableCoppaCompliance(); break; + case "enablePlayStoreKidsApp" : enablePlayStoreKidsApp(); break; + case "disablePlayStoreKidsApp" : disablePlayStoreKidsApp(); break; //case "testBegin": testBegin(); break; // case "testEnd": testEnd(); break; } @@ -309,12 +311,6 @@ private void config() { adjustConfig.setExternalDeviceId(externalDeviceId); } - if (command.containsParameter("playStoreKids")) { - String playStoreKidsS = command.getFirstParameterValue("playStoreKids"); - boolean playStoreKids = "true".equals(playStoreKidsS); - adjustConfig.setPlayStoreKidsAppEnabled(playStoreKids); - } - if(command.containsParameter("deferredDeeplinkCallback")) { adjustConfig.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() { @Override @@ -821,6 +817,14 @@ private void disableCoppaCompliance() { Adjust.disableCoppaCompliance(context.getApplicationContext()); } + private void enablePlayStoreKidsApp() { + Adjust.enablePlayStoreKidsApp(context.getApplicationContext()); + } + + private void disablePlayStoreKidsApp() { + Adjust.disablePlayStoreKidsApp(context.getApplicationContext()); + } + /* private void testBegin() { if (command.containsParameter("teardown")) { diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index 715ef2193..5cac0ccbf 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -138,6 +138,8 @@ AdjustCommandExecutor.prototype.executeCommand = function(command, idx) { case "trackAdRevenue" : this.trackAdRevenue(command.params); break; case "enableCoppaCompliance" : this.enableCoppaCompliance(command.params); break; case "disableCoppaCompliance" : this.disableCoppaCompliance(command.params); break; + case "enablePlayStoreKidsApp" : this.enablePlayStoreKidsApp(command.params); break; + case "disablePlayStoreKidsApp" : this.disablePlayStoreKidsApp(command.params); break; break; } @@ -319,12 +321,6 @@ AdjustCommandExecutor.prototype.config = function(params) { adjustConfig.setSendInBackground(sendInBackground); } - if ('playStoreKids' in params) { - var playStoreKidsS = getFirstParameterValue(params, 'playStoreKids'); - var playStoreKids = playStoreKidsS == 'true'; - adjustConfig.setPlayStoreKidsAppEnabled(playStoreKids); - } - if ('attributionCallbackSendAll' in params) { var basePath = this.basePath; adjustConfig.setAttributionCallback(function(attribution) { @@ -641,6 +637,14 @@ AdjustCommandExecutor.prototype.disableCoppaCompliance = function(params) { Adjust.disableCoppaCompliance(); }; +AdjustCommandExecutor.prototype.enablePlayStoreKidsApp = function(params) { + Adjust.enablePlayStoreKidsApp(); +}; + +AdjustCommandExecutor.prototype.disablePlayStoreKidsApp = function(params) { + Adjust.disablePlayStoreKidsApp(); +}; + //Util //====================== function getValueFromKey(params, key) { From b3f8e29cd7fd1ff90f77e716d7d4b59c341b2d09 Mon Sep 17 00:00:00 2001 From: nonelse Date: Mon, 6 May 2024 14:54:14 +0200 Subject: [PATCH 114/540] Fix: NPE on cached adid array --- .../java/com/adjust/sdk/ActivityHandler.java | 47 +++++++++---------- .../java/com/adjust/sdk/AdjustConfig.java | 2 +- .../java/com/adjust/sdk/AdjustInstance.java | 7 +-- 3 files changed, 26 insertions(+), 30 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index aa0789b4f..811676158 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -83,7 +83,7 @@ public class ActivityHandler implements IActivityHandler { private SessionParameters sessionParameters; private InstallReferrer installReferrer; private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; - private ArrayList cachedAdidReadCallbacks; + private ArrayList cachedAdidReadCallbacks = new ArrayList<>(); @Override public void teardown() { @@ -462,17 +462,19 @@ private void updateAdidI(final String adid) { writeActivityStateI(); } - if (cachedAdidReadCallbacks != null && !cachedAdidReadCallbacks.isEmpty()) { + if (! cachedAdidReadCallbacks.isEmpty()) { + final ArrayList cachedAdidReadCallbacksCopy = + new ArrayList<>(cachedAdidReadCallbacks); + + cachedAdidReadCallbacks.clear(); new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { @Override public void run() { - for (OnAdidReadListener listener : cachedAdidReadCallbacks) { - if (listener != null) { - listener.onAdidRead(adid); + for (OnAdidReadListener onAdidReadListener : cachedAdidReadCallbacksCopy) { + if (onAdidReadListener != null) { + onAdidReadListener.onAdidRead(adid); } } - cachedAdidReadCallbacks = null; - adjustConfig.cachedAdidReadCallbacks = null; } }); } @@ -774,10 +776,7 @@ public void run() { if (activityState == null) { logger.warn("SDK needs to be initialized before getting adid"); } - if (this.cachedAdidReadCallbacks == null) { - this.cachedAdidReadCallbacks = new ArrayList<>(); - } - this.cachedAdidReadCallbacks.add(callback); + cachedAdidReadCallbacks.add(callback); } } @@ -901,26 +900,26 @@ public void run(ActivityHandler activityHandler) { this.cachedDeeplinkResolutionCallback = adjustConfig.cachedDeeplinkResolutionCallback; } - // cached adid read callback - // if it's not empty, we need to add it to the onAdidReadListener in case getAdid() is - // called before the sdk starts - if (this.cachedAdidReadCallbacks != null && !this.cachedAdidReadCallbacks.isEmpty()) { - this.cachedAdidReadCallbacks.addAll(adjustConfig.cachedAdidReadCallbacks); - } else { - this.cachedAdidReadCallbacks = new ArrayList<>(adjustConfig.cachedAdidReadCallbacks); - } + cachedAdidReadCallbacks.addAll(adjustConfig.cachedAdidReadCallbacks); + adjustConfig.cachedAdidReadCallbacks.clear(); - if (activityState != null && activityState.adid != null) { + if (! cachedAdidReadCallbacks.isEmpty() + && activityState != null + && activityState.adid != null) + { + final ArrayList cachedAdidReadCallbacksCopy = + new ArrayList<>(cachedAdidReadCallbacks); + final String adidCopy = activityState.adid; + + cachedAdidReadCallbacks.clear(); new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { @Override public void run() { - for (OnAdidReadListener onAdidReadListener : cachedAdidReadCallbacks) { + for (OnAdidReadListener onAdidReadListener : cachedAdidReadCallbacksCopy) { if (onAdidReadListener != null) { - onAdidReadListener.onAdidRead(activityState.adid); + onAdidReadListener.onAdidRead(adidCopy); } } - adjustConfig.cachedAdidReadCallbacks = null; - cachedAdidReadCallbacks = null; } }); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index fb9a7790b..0a23e6f40 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -41,7 +41,7 @@ public class AdjustConfig { String fbAppId; boolean readDeviceInfoOnceEnabled; OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; - ArrayList cachedAdidReadCallbacks; + ArrayList cachedAdidReadCallbacks = new ArrayList<>(); public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 1f338a1e1..5680bdcde 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -49,7 +49,7 @@ public PreLaunchActions() { private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; - private ArrayList cachedAdidReadCallbacks = null; + private ArrayList cachedAdidReadCallbacks = new ArrayList<>(); /** * Base path for Adjust packages. */ @@ -552,10 +552,7 @@ public void disablePlayStoreKidsApp(Context context) { */ public void getAdid(OnAdidReadListener onAdidReadListener) { if (!checkActivityHandler("getAdid")) { - if (this.cachedAdidReadCallbacks == null) { - this.cachedAdidReadCallbacks = new ArrayList(); - } - this.cachedAdidReadCallbacks.add(onAdidReadListener); + cachedAdidReadCallbacks.add(onAdidReadListener); return; } activityHandler.getAdid(onAdidReadListener); From 879c0cb33ebfaba49f3153e763f29c84e49c3ae4 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 23 Apr 2024 10:43:45 +0200 Subject: [PATCH 115/540] refac:refactoring getAmazonAdId to Async add OnAmazonAdIdReadListener.java move the method implementation to AdjustInstance --- .../adjust/examples/GlobalApplication.java | 13 ++++++++++ .../src/main/java/com/adjust/sdk/Adjust.java | 22 ++++++++++------ .../java/com/adjust/sdk/AdjustInstance.java | 10 ++++++++ .../main/java/com/adjust/sdk/DeviceInfo.java | 25 ++++++++++++++----- .../adjust/sdk/OnAmazonAdIdReadListener.java | 7 ++++++ 5 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAmazonAdIdReadListener.java diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 97fa87f90..b3ffcf6b4 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -16,6 +16,7 @@ import com.adjust.sdk.GooglePlayInstallReferrerDetails; import com.adjust.sdk.LogLevel; import com.adjust.sdk.OnAdidReadListener; +import com.adjust.sdk.OnAmazonAdIdReadListener; import com.adjust.sdk.OnAttributionChangedListener; import com.adjust.sdk.OnDeeplinkResponseListener; import com.adjust.sdk.OnEventTrackingFailedListener; @@ -178,6 +179,18 @@ public void onFailure(String message) { // for applications with minSdkVersion >= 14. registerActivityLifecycleCallbacks(new AdjustLifecycleCallbacks()); + Adjust.getAmazonAdId(this, new OnAmazonAdIdReadListener() { + @Override + public void onAmazonAdIdRead(String amazonAdId) { + Log.d("example", "amazonAdId : " + amazonAdId); + } + + @Override + public void onFail(String message) { + Log.d("example", "failed : " + message); + } + }); + // Put the SDK in offline mode. // Adjust.setOfflineMode(true); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index de3a7b48b..61ee02708 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -350,16 +350,24 @@ public static void getGoogleAdId(Context context, OnDeviceIdsRead onDeviceIdRead /** * Called to get value of Amazon Advertising Identifier. * - * @param context Application context - * @return Amazon Advertising Identifier + * @param context Application context + * @param onAmazonAdIdReadListener Callback to get triggered once identifier is obtained */ - public static String getAmazonAdId(final Context context) { - Context appContext = extractApplicationContext(context); - if (appContext != null) { - return DeviceInfo.getFireAdvertisingIdBypassConditions(appContext.getContentResolver()); + public static void getAmazonAdId(final Context context,final OnAmazonAdIdReadListener onAmazonAdIdReadListener) { + if (context == null) { + String message = "context cannot be null"; + AdjustFactory.getLogger().error(message); + onAmazonAdIdReadListener.onFail(message); + return; + } + if (onAmazonAdIdReadListener == null) { + AdjustFactory.getLogger().error("onAmazonAdIdReadListener cannot be null"); + return; } - return null; + Context appContext = extractApplicationContext(context); + AdjustInstance adjustInstance = Adjust.getDefaultInstance(); + adjustInstance.getAmazonAdId(appContext, onAmazonAdIdReadListener); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 5680bdcde..445997400 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -605,6 +605,16 @@ public void onFail(String message) { } + /** + * Called to get value of Amazon Advertising Identifier. + * + * @param context Application context + * @param onAmazonAdIdReadListener Callback to get triggered once identifier is obtained + */ + public void getAmazonAdId(final Context context, final OnAmazonAdIdReadListener onAmazonAdIdReadListener) { + DeviceInfo.getFireAdvertisingIdBypassConditions(context.getContentResolver(),onAmazonAdIdReadListener); + } + /** * Check if ActivityHandler instance is set or not. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 40d45de40..11a5657af 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -264,8 +264,8 @@ void reloadOtherDeviceInfoParams(final AdjustConfig adjustConfig, otherDeviceInfoParamsReadOnce = true; } - public static String getFireAdvertisingIdBypassConditions(ContentResolver contentResolver) { - return UtilDeviceIds.getFireAdvertisingId(contentResolver); + public static void getFireAdvertisingIdBypassConditions(ContentResolver contentResolver, OnAmazonAdIdReadListener onAmazonAdIdReadListener) { + UtilDeviceIds.getFireAdvertisingIdAsync(contentResolver, onAmazonAdIdReadListener); } private String getPackageName(Context context) { @@ -503,7 +503,6 @@ private String getAppUpdateTime(PackageInfo packageInfo) { private static class UtilDeviceIds { private static Map getImeiParameters(final AdjustConfig adjustConfig, - final boolean isCoppaEnabled, final ILogger logger) { if (isCoppaEnabled) { @@ -543,15 +542,29 @@ private static String getFireAdvertisingId(final ContentResolver contentResolver } return null; } - private static Boolean getFireTrackingEnabled(final AdjustConfig adjustConfig, - final boolean isCoppaEnabled) - { + + private static void getFireAdvertisingIdAsync(final ContentResolver contentResolver,final OnAmazonAdIdReadListener onAmazonAdIdReadListener) { + if (contentResolver == null) { + onAmazonAdIdReadListener.onFail("contentResolver could not be retrieved"); + return; + } + try { + // get advertising + String amazonAdId = Settings.Secure.getString(contentResolver, "advertising_id"); + onAmazonAdIdReadListener.onAmazonAdIdRead(amazonAdId); + } catch (Exception ex) { + onAmazonAdIdReadListener.onFail(ex.getMessage()); + } + } + + private static Boolean getFireTrackingEnabled(final AdjustConfig adjustConfig, final boolean isCoppaEnabled) { if (isCoppaEnabled) { return null; } return getFireTrackingEnabled(adjustConfig.context.getContentResolver()); } + private static Boolean getFireTrackingEnabled(final ContentResolver contentResolver) { try { // get user's tracking preference diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAmazonAdIdReadListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAmazonAdIdReadListener.java new file mode 100644 index 000000000..65596d1be --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAmazonAdIdReadListener.java @@ -0,0 +1,7 @@ +package com.adjust.sdk; + +public interface OnAmazonAdIdReadListener { + + void onAmazonAdIdRead(String amazonAdId); + void onFail(String message); +} From a8a6543b4a969cd33fe4a9c90706fb9453c9b363 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 2 May 2024 11:16:52 +0200 Subject: [PATCH 116/540] refac:refactor getAmazonAdId in web-bridge --- .../main/assets/AdjustExample-WebView.html | 15 +++++++++ .../com/example/examples/MainActivity.java | 4 +-- .../src/main/assets/adjust.js | 33 +++++++++++++++++++ .../sdk/webbridge/AdjustBridgeInstance.java | 17 ++++++++-- 4 files changed, 64 insertions(+), 5 deletions(-) diff --git a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html index a6a58bf01..3d7a57882 100755 --- a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html +++ b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html @@ -150,6 +150,18 @@

Adjust Web View SDK Demo }); } + var btnGetAmazonId = document.getElementById('btnGetAmazonId') + btnGetAmazonId.onclick = function(e) { + e.preventDefault(); + Adjust.getAmazonAdId(function (gpsAdid) { + alert('Amazon Ad Id:\n' + gpsAdid); + alert('Message:\n' + message); + }, + function (message) { + alert('Message:\n' + message); + }); + } + var btnGetAdId = document.getElementById('btnGetAdId') btnGetAdId.onclick = function(e) { e.preventDefault(); @@ -193,6 +205,9 @@

Adjust Web View SDK Demo
+
+ +
diff --git a/Adjust/example-app-webbridge/src/main/java/com/example/examples/MainActivity.java b/Adjust/example-app-webbridge/src/main/java/com/example/examples/MainActivity.java index 5329d1af3..5e25d256a 100644 --- a/Adjust/example-app-webbridge/src/main/java/com/example/examples/MainActivity.java +++ b/Adjust/example-app-webbridge/src/main/java/com/example/examples/MainActivity.java @@ -23,8 +23,8 @@ protected void onCreate(Bundle savedInstanceState) { AdjustBridge.registerAndGetInstance(getApplication(), webView); try { -// webView.loadUrl("file:///android_asset/AdjustExample-WebView.html"); - webView.loadUrl("https://adjustweb.neocities.org"); + webView.loadUrl("file:///android_asset/AdjustExample-WebView.html"); +// webView.loadUrl("https://adjustweb.neocities.org"); } catch (Exception e) { e.printStackTrace(); } diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index a3be7bff2..197192987 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -215,6 +215,35 @@ var Adjust = { } }, + getAmazonAdId: function (callbackSuccess,callbackFail) { + if (AdjustBridge) { + if (typeof callbackSuccess === 'string' || callbackSuccess instanceof String) { + this.getAmazonIdCallbackSuccessName = callbackSuccess; + } else { + this.getAmazonIdCallbackSuccessName = 'Adjust.adjust_getAmazonIdCallbackSuccess'; + this.getAmazonIdCallbackSuccessFunction = callbackSuccess; + } + if (typeof callbackFail === 'string' || callbackFail instanceof String) { + this.getAmazonIdCallbackFailName = callbackFail; + } else { + this.getAmazonIdCallbackFailName = 'Adjust.adjust_getAmazonIdCallbackFail'; + this.getAmazonIdCallbackFailFunction = callbackFail; + } + AdjustBridge.getAmazonAdId(this.getAmazonIdCallbackSuccessName,this.getAmazonIdCallbackFailName); + } + }, + + adjust_getAmazonIdCallbackSuccess: function (amazonId) { + if (AdjustBridge && this.getAmazonIdCallbackSuccessFunction) { + this.getAmazonIdCallbackSuccessFunction(amazonId); + } + }, + adjust_getAmazonIdCallbackFail: function (message) { + if (AdjustBridge && this.getAmazonIdCallbackFailFunction) { + this.getAmazonIdCallbackFailName(message); + } + }, + getAttribution: function (callback) { if (AdjustBridge) { AdjustBridge.getAttribution(callback); @@ -248,5 +277,9 @@ var Adjust = { this.getGoogleAdIdCallbackFunction = undefined; this.getAdIdCallbackName = undefined; this.getAdIdCallbackFunction = undefined; + this.getAmazonIdCallbackSuccessName = undefined; + this.getAmazonIdCallbackSuccessFunction = undefined; + this.getAmazonIdCallbackFailName = undefined; + this.getAmazonIdCallbackFailFunction = undefined; }, }; diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 0fd2a03ab..e848097db 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -21,6 +21,7 @@ import com.adjust.sdk.AdjustThirdPartySharing; import com.adjust.sdk.LogLevel; import com.adjust.sdk.OnAdidReadListener; +import com.adjust.sdk.OnAmazonAdIdReadListener; import com.adjust.sdk.OnAttributionChangedListener; import com.adjust.sdk.OnDeeplinkResponseListener; import com.adjust.sdk.OnDeviceIdsRead; @@ -717,11 +718,21 @@ public void onGoogleAdIdRead(String googleAdId) { } @JavascriptInterface - public String getAmazonAdId() { + public void getAmazonAdId(final String callbackSuccess,final String callbackFail) { if (!isInitialized()) { - return null; + return; } - return Adjust.getAmazonAdId(application.getApplicationContext()); + Adjust.getAmazonAdId(application.getApplicationContext(),new OnAmazonAdIdReadListener() { + @Override + public void onAmazonAdIdRead(String adid) { + AdjustBridgeUtil.execSingleValueCallback(webView, callbackSuccess, adid); + } + + @Override + public void onFail(String message) { + AdjustBridgeUtil.execSingleValueCallback(webView, callbackFail, null); + } + }); } @JavascriptInterface From e58133e2df04315d37a01d85f4e5fa6b697f5aac Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 18 Apr 2024 14:58:05 +0200 Subject: [PATCH 117/540] Refac: Inject coppa from state --- Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 11a5657af..d2780334b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -264,8 +264,8 @@ void reloadOtherDeviceInfoParams(final AdjustConfig adjustConfig, otherDeviceInfoParamsReadOnce = true; } - public static void getFireAdvertisingIdBypassConditions(ContentResolver contentResolver, OnAmazonAdIdReadListener onAmazonAdIdReadListener) { - UtilDeviceIds.getFireAdvertisingIdAsync(contentResolver, onAmazonAdIdReadListener); + public static String getFireAdvertisingIdBypassConditions(ContentResolver contentResolver) { + return UtilDeviceIds.getFireAdvertisingId(contentResolver); } private String getPackageName(Context context) { From 95b841aa526be6faef0567d2f2494837576be422 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 23 Apr 2024 10:43:45 +0200 Subject: [PATCH 118/540] refac:refactoring getAmazonAdId to Async add OnAmazonAdIdReadListener.java move the method implementation to AdjustInstance --- Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index d2780334b..11a5657af 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -264,8 +264,8 @@ void reloadOtherDeviceInfoParams(final AdjustConfig adjustConfig, otherDeviceInfoParamsReadOnce = true; } - public static String getFireAdvertisingIdBypassConditions(ContentResolver contentResolver) { - return UtilDeviceIds.getFireAdvertisingId(contentResolver); + public static void getFireAdvertisingIdBypassConditions(ContentResolver contentResolver, OnAmazonAdIdReadListener onAmazonAdIdReadListener) { + UtilDeviceIds.getFireAdvertisingIdAsync(contentResolver, onAmazonAdIdReadListener); } private String getPackageName(Context context) { From a6296ea4cb22453e5025e08acc8edc8f9a5c4405 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 6 May 2024 12:16:43 +0200 Subject: [PATCH 119/540] refac:first need to check callback nullability --- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 61ee02708..33d4a4cb0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -354,16 +354,16 @@ public static void getGoogleAdId(Context context, OnDeviceIdsRead onDeviceIdRead * @param onAmazonAdIdReadListener Callback to get triggered once identifier is obtained */ public static void getAmazonAdId(final Context context,final OnAmazonAdIdReadListener onAmazonAdIdReadListener) { + if (onAmazonAdIdReadListener == null) { + AdjustFactory.getLogger().error("onAmazonAdIdReadListener cannot be null"); + return; + } if (context == null) { String message = "context cannot be null"; AdjustFactory.getLogger().error(message); onAmazonAdIdReadListener.onFail(message); return; } - if (onAmazonAdIdReadListener == null) { - AdjustFactory.getLogger().error("onAmazonAdIdReadListener cannot be null"); - return; - } Context appContext = extractApplicationContext(context); AdjustInstance adjustInstance = Adjust.getDefaultInstance(); From 072e2ec4a9604d06481c8fdfcf39c5bc1f5eccf7 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 6 May 2024 18:34:52 +0200 Subject: [PATCH 120/540] refac:add missing param during rebase check appContext instead of the context --- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 8 ++++---- .../sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 33d4a4cb0..370103997 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -358,14 +358,14 @@ public static void getAmazonAdId(final Context context,final OnAmazonAdIdReadLis AdjustFactory.getLogger().error("onAmazonAdIdReadListener cannot be null"); return; } - if (context == null) { - String message = "context cannot be null"; + Context appContext = extractApplicationContext(context); + + if (appContext == null) { + String message = "null context"; AdjustFactory.getLogger().error(message); onAmazonAdIdReadListener.onFail(message); return; } - - Context appContext = extractApplicationContext(context); AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.getAmazonAdId(appContext, onAmazonAdIdReadListener); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 11a5657af..cca6ca46c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -503,6 +503,7 @@ private String getAppUpdateTime(PackageInfo packageInfo) { private static class UtilDeviceIds { private static Map getImeiParameters(final AdjustConfig adjustConfig, + final boolean isCoppaEnabled, final ILogger logger) { if (isCoppaEnabled) { From 5aa35b3ee914300f139e275b9d2e0eb646e5e1f7 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 8 May 2024 10:36:36 +0200 Subject: [PATCH 121/540] refac:add async getter for reading oaid add oaid result and listener --- .../java/com/adjust/sdk/oaid/AdjustOaid.java | 71 ++++++++++++++++++- .../java/com/adjust/sdk/oaid/OaidResult.java | 9 +++ .../adjust/sdk/oaid/OnOaidReadListener.java | 8 +++ .../main/java/com/adjust/sdk/oaid/Util.java | 32 +++++---- .../java/com/adjust/testapp/MainActivity.java | 2 +- 5 files changed, 107 insertions(+), 15 deletions(-) create mode 100644 Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OaidResult.java create mode 100644 Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OnOaidReadListener.java diff --git a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/AdjustOaid.java b/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/AdjustOaid.java index a06aef0cb..ad5d1060a 100644 --- a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/AdjustOaid.java +++ b/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/AdjustOaid.java @@ -1,10 +1,19 @@ package com.adjust.sdk.oaid; +import static com.adjust.sdk.oaid.Util.*; + import android.content.Context; import android.util.Log; +import com.adjust.sdk.Adjust; +import com.adjust.sdk.AdjustFactory; +import com.adjust.sdk.ILogger; +import com.adjust.sdk.Logger; +import com.adjust.sdk.scheduler.AsyncTaskExecutor; import com.bun.miitmdid.core.MdidSdkHelper; +import java.util.Map; + public class AdjustOaid { static boolean isOaidToBeRead = false; static boolean isMsaSdkAvailable = false; @@ -18,14 +27,72 @@ public static void readOaid(Context context) { try { System.loadLibrary("msaoaidsec"); - String certificate = Util.readCertFromAssetFile(context); + String certificate = readCertFromAssetFile(context); isMsaSdkAvailable = MdidSdkHelper.InitCert(context, certificate); } catch (Throwable t) { isMsaSdkAvailable = false; - Log.d("Adjust", "Error during msa sdk initialization " + t.getMessage()); + AdjustFactory.getLogger().debug("Adjust", "Error during msa sdk initialization " + t.getMessage()); + } + } + + public static void getOaidParameters(final Context context,final OnOaidReadListener listener) { + if (listener == null) { + AdjustFactory.getLogger().error("onOaidReadListener cannot be null"); + return; + } + if (context == null) { + AdjustFactory.getLogger().error("context cannot be null"); + return; + } + readOaid(context); + + if (!isMsaSdkAvailable){ + listener.onFail("MSA SDK not available"); + return; } + + new AsyncTaskExecutor(){ + + @Override + protected OaidResult doInBackground(Context[] contexts) { + ILogger logger = AdjustFactory.getLogger(); + OaidResult oaidResult; + + if (Util.isManufacturerHuawei(logger)) { + oaidResult = getOaidParametersUsingHms(context, logger); + if (oaidResult.oaidParameters != null) { + return oaidResult; + } + oaidResult = getOaidParametersUsingMsa(context, logger); + return oaidResult; + } else { + oaidResult = getOaidParametersUsingMsa(context, logger); + if (oaidResult.oaidParameters != null) { + return oaidResult; + } + return getOaidParametersUsingHms(context, logger); + } + + } + + @Override + protected void onPostExecute(OaidResult oaidResult) { + if (oaidResult != null) { + if (oaidResult.oaidParameters != null) { + listener.onOaidRead(oaidResult.oaidParameters); + } else if (oaidResult.error != null) { + listener.onFail(oaidResult.error); + }else { + listener.onFail("OaidPlugin getOaidParameters: parameters is null"); + } + }else { + listener.onFail("OaidPlugin getOaidParameters: OaidResults is null"); + } + } + }.execute(context); } + public static void doNotReadOaid() { isOaidToBeRead = false; } diff --git a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OaidResult.java b/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OaidResult.java new file mode 100644 index 000000000..d8e56e56c --- /dev/null +++ b/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OaidResult.java @@ -0,0 +1,9 @@ +package com.adjust.sdk.oaid; + +import java.util.Map; + +public class OaidResult { + + public String error; + public Map oaidParameters; +} diff --git a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OnOaidReadListener.java b/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OnOaidReadListener.java new file mode 100644 index 000000000..aeb562691 --- /dev/null +++ b/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OnOaidReadListener.java @@ -0,0 +1,8 @@ +package com.adjust.sdk.oaid; + +import java.util.Map; + +public interface OnOaidReadListener { + void onOaidRead(Map oaidParameters); + void onFail(String message); +} diff --git a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/Util.java b/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/Util.java index 695669866..82dc2a052 100644 --- a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/Util.java +++ b/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/Util.java @@ -26,23 +26,24 @@ public synchronized static Map getOaidParameters(Context context // otherwise use the msa sdk which only gives the oaid currently if (isManufacturerHuawei(logger)) { - oaidParameters = getOaidParametersUsingHms(context, logger); + oaidParameters = getOaidParametersUsingHms(context, logger).oaidParameters; if (oaidParameters != null) { return oaidParameters; } - return getOaidParametersUsingMsa(context, logger); + oaidParameters = getOaidParametersUsingMsa(context, logger).oaidParameters; + return oaidParameters; } else { - oaidParameters = getOaidParametersUsingMsa(context, logger); + oaidParameters = getOaidParametersUsingMsa(context, logger).oaidParameters; if (oaidParameters != null) { return oaidParameters; } - return getOaidParametersUsingHms(context, logger); + return getOaidParametersUsingHms(context, logger).oaidParameters; } } - private static boolean isManufacturerHuawei(ILogger logger) { + public static boolean isManufacturerHuawei(ILogger logger) { try { String manufacturer = android.os.Build.MANUFACTURER; if (manufacturer != null && manufacturer.equalsIgnoreCase("huawei")) { @@ -54,7 +55,8 @@ private static boolean isManufacturerHuawei(ILogger logger) { return false; } - private static Map getOaidParametersUsingHms(Context context, ILogger logger) { + public static OaidResult getOaidParametersUsingHms(Context context, ILogger logger) { + OaidResult oaidResult = new OaidResult(); for (int attempt = 1; attempt <= 2; attempt += 1) { OaidInfo oaidInfo = HmsSdkClient.getOaidInfo(context, logger, 3000 * attempt); if (oaidInfo != null && oaidInfo.getOaid() != null) { @@ -63,16 +65,20 @@ private static Map getOaidParametersUsingHms(Context context, IL PackageBuilder.addBoolean(parameters, "oaid_tracking_enabled", oaidInfo.isTrackingEnabled()); PackageBuilder.addString(parameters, "oaid_src", "hms"); PackageBuilder.addLong(parameters, "oaid_attempt", attempt); - return parameters; + oaidResult.oaidParameters = parameters; + return oaidResult; } } logger.debug("Fail to read the OAID using HMS"); - return null; + oaidResult.error = "Fail to read the OAID using HMS"; + return oaidResult; } - private static Map getOaidParametersUsingMsa(Context context, ILogger logger) { + public static OaidResult getOaidParametersUsingMsa(Context context, ILogger logger) { + OaidResult oaidResult = new OaidResult(); if (!AdjustOaid.isMsaSdkAvailable) { - return null; + oaidResult.error = "MSA SDK not available"; + return oaidResult; } for (int attempt = 1; attempt <= 2; attempt += 1) { @@ -83,12 +89,14 @@ private static Map getOaidParametersUsingMsa(Context context, IL PackageBuilder.addBoolean(parameters, "oaid_tracking_enabled", oaidInfo.isTrackingEnabled()); PackageBuilder.addString(parameters, "oaid_src", "msa"); PackageBuilder.addLong(parameters, "oaid_attempt", attempt); - return parameters; + oaidResult.oaidParameters = parameters; + return oaidResult; } } logger.debug("Fail to read the OAID using MSA"); - return null; + oaidResult.error = "Fail to read the OAID using MSA"; + return oaidResult; } public static String readCertFromAssetFile(Context context) { diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java index f56cdc0ad..8a653b13a 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java @@ -36,7 +36,7 @@ protected void onCreate(Bundle savedInstanceState) { } private void startTestSession() { - // testLibrary.addTestDirectory("current/gdpr"); + testLibrary.addTestDirectory("current/retry-in"); testLibrary.startTestSession(Adjust.getSdkVersion()); } From 253b8f8bbb1f52791db90ba2b51c6f2367b01a9d Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 8 May 2024 18:21:43 +0200 Subject: [PATCH 122/540] refac:make callback only pass the oaid as the String instead of Map reuse the Util method for reading oaid --- .../java/com/adjust/sdk/oaid/AdjustOaid.java | 51 +++++++------------ .../java/com/adjust/sdk/oaid/OaidResult.java | 2 +- .../adjust/sdk/oaid/OnOaidReadListener.java | 2 +- .../main/java/com/adjust/sdk/oaid/Util.java | 36 +++++-------- .../java/com/adjust/testapp/MainActivity.java | 2 +- 5 files changed, 34 insertions(+), 59 deletions(-) diff --git a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/AdjustOaid.java b/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/AdjustOaid.java index ad5d1060a..47fd234ac 100644 --- a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/AdjustOaid.java +++ b/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/AdjustOaid.java @@ -1,14 +1,11 @@ package com.adjust.sdk.oaid; -import static com.adjust.sdk.oaid.Util.*; +import static com.adjust.sdk.oaid.Util.readCertFromAssetFile; import android.content.Context; -import android.util.Log; -import com.adjust.sdk.Adjust; import com.adjust.sdk.AdjustFactory; import com.adjust.sdk.ILogger; -import com.adjust.sdk.Logger; import com.adjust.sdk.scheduler.AsyncTaskExecutor; import com.bun.miitmdid.core.MdidSdkHelper; @@ -23,63 +20,49 @@ public static void readOaid() { } public static void readOaid(Context context) { + ILogger logger = AdjustFactory.getLogger(); readOaid(); try { System.loadLibrary("msaoaidsec"); - String certificate = readCertFromAssetFile(context); + String certificate = readCertFromAssetFile(context, logger); isMsaSdkAvailable = MdidSdkHelper.InitCert(context, certificate); } catch (Throwable t) { isMsaSdkAvailable = false; - AdjustFactory.getLogger().debug("Adjust", "Error during msa sdk initialization " + t.getMessage()); + logger.debug("Adjust", "Error during msa sdk initialization " + t.getMessage()); } } public static void getOaidParameters(final Context context,final OnOaidReadListener listener) { + ILogger logger = AdjustFactory.getLogger(); if (listener == null) { - AdjustFactory.getLogger().error("onOaidReadListener cannot be null"); + logger.error("onOaidReadListener cannot be null"); return; } if (context == null) { - AdjustFactory.getLogger().error("context cannot be null"); - return; - } - readOaid(context); - - if (!isMsaSdkAvailable){ - listener.onFail("MSA SDK not available"); + logger.error("context cannot be null"); return; } new AsyncTaskExecutor(){ - @Override protected OaidResult doInBackground(Context[] contexts) { - ILogger logger = AdjustFactory.getLogger(); - OaidResult oaidResult; - - if (Util.isManufacturerHuawei(logger)) { - oaidResult = getOaidParametersUsingHms(context, logger); - if (oaidResult.oaidParameters != null) { - return oaidResult; - } - oaidResult = getOaidParametersUsingMsa(context, logger); - return oaidResult; - } else { - oaidResult = getOaidParametersUsingMsa(context, logger); - if (oaidResult.oaidParameters != null) { - return oaidResult; - } - return getOaidParametersUsingHms(context, logger); + readOaid(context); + OaidResult oaidResult = new OaidResult(); + Map oaidParameters = Util.getOaidParameters(context, logger); + if (oaidParameters != null && !oaidParameters.isEmpty() && oaidParameters.get("oaid") != null) { + oaidResult.oaid = oaidParameters.get("oaid"); + }else { + oaidResult.error = "OaidPlugin getOaidParameters: parameters is null"; } - + return oaidResult; } @Override protected void onPostExecute(OaidResult oaidResult) { if (oaidResult != null) { - if (oaidResult.oaidParameters != null) { - listener.onOaidRead(oaidResult.oaidParameters); + if (oaidResult.oaid != null) { + listener.onOaidRead(oaidResult.oaid); } else if (oaidResult.error != null) { listener.onFail(oaidResult.error); }else { diff --git a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OaidResult.java b/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OaidResult.java index d8e56e56c..ea58d71bb 100644 --- a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OaidResult.java +++ b/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OaidResult.java @@ -5,5 +5,5 @@ public class OaidResult { public String error; - public Map oaidParameters; + public String oaid; } diff --git a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OnOaidReadListener.java b/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OnOaidReadListener.java index aeb562691..feea481ef 100644 --- a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OnOaidReadListener.java +++ b/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OnOaidReadListener.java @@ -3,6 +3,6 @@ import java.util.Map; public interface OnOaidReadListener { - void onOaidRead(Map oaidParameters); + void onOaidRead(String oaid); void onFail(String message); } diff --git a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/Util.java b/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/Util.java index 82dc2a052..692a1db69 100644 --- a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/Util.java +++ b/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/Util.java @@ -26,24 +26,23 @@ public synchronized static Map getOaidParameters(Context context // otherwise use the msa sdk which only gives the oaid currently if (isManufacturerHuawei(logger)) { - oaidParameters = getOaidParametersUsingHms(context, logger).oaidParameters; + oaidParameters = getOaidParametersUsingHms(context, logger); if (oaidParameters != null) { return oaidParameters; } - oaidParameters = getOaidParametersUsingMsa(context, logger).oaidParameters; - return oaidParameters; + return getOaidParametersUsingMsa(context, logger); } else { - oaidParameters = getOaidParametersUsingMsa(context, logger).oaidParameters; + oaidParameters = getOaidParametersUsingMsa(context, logger); if (oaidParameters != null) { return oaidParameters; } - return getOaidParametersUsingHms(context, logger).oaidParameters; + return getOaidParametersUsingHms(context, logger); } } - public static boolean isManufacturerHuawei(ILogger logger) { + private static boolean isManufacturerHuawei(ILogger logger) { try { String manufacturer = android.os.Build.MANUFACTURER; if (manufacturer != null && manufacturer.equalsIgnoreCase("huawei")) { @@ -55,8 +54,7 @@ public static boolean isManufacturerHuawei(ILogger logger) { return false; } - public static OaidResult getOaidParametersUsingHms(Context context, ILogger logger) { - OaidResult oaidResult = new OaidResult(); + private static Map getOaidParametersUsingHms(Context context, ILogger logger) { for (int attempt = 1; attempt <= 2; attempt += 1) { OaidInfo oaidInfo = HmsSdkClient.getOaidInfo(context, logger, 3000 * attempt); if (oaidInfo != null && oaidInfo.getOaid() != null) { @@ -65,20 +63,16 @@ public static OaidResult getOaidParametersUsingHms(Context context, ILogger logg PackageBuilder.addBoolean(parameters, "oaid_tracking_enabled", oaidInfo.isTrackingEnabled()); PackageBuilder.addString(parameters, "oaid_src", "hms"); PackageBuilder.addLong(parameters, "oaid_attempt", attempt); - oaidResult.oaidParameters = parameters; - return oaidResult; + return parameters; } } logger.debug("Fail to read the OAID using HMS"); - oaidResult.error = "Fail to read the OAID using HMS"; - return oaidResult; + return null; } - public static OaidResult getOaidParametersUsingMsa(Context context, ILogger logger) { - OaidResult oaidResult = new OaidResult(); + private static Map getOaidParametersUsingMsa(Context context, ILogger logger) { if (!AdjustOaid.isMsaSdkAvailable) { - oaidResult.error = "MSA SDK not available"; - return oaidResult; + return null; } for (int attempt = 1; attempt <= 2; attempt += 1) { @@ -89,17 +83,15 @@ public static OaidResult getOaidParametersUsingMsa(Context context, ILogger logg PackageBuilder.addBoolean(parameters, "oaid_tracking_enabled", oaidInfo.isTrackingEnabled()); PackageBuilder.addString(parameters, "oaid_src", "msa"); PackageBuilder.addLong(parameters, "oaid_attempt", attempt); - oaidResult.oaidParameters = parameters; - return oaidResult; + return parameters; } } logger.debug("Fail to read the OAID using MSA"); - oaidResult.error = "Fail to read the OAID using MSA"; - return oaidResult; + return null; } - public static String readCertFromAssetFile(Context context) { + public static String readCertFromAssetFile(Context context, ILogger logger) { try { String assetFileName = context.getPackageName() + ".cert.pem"; InputStream is = context.getAssets().open(assetFileName); @@ -112,7 +104,7 @@ public static String readCertFromAssetFile(Context context) { } return builder.toString(); } catch (Exception e) { - Log.e("Adjust", "readCertFromAssetFile failed"); + logger.error("readCertFromAssetFile Error reading asset file: " + e.getMessage()); return ""; } } diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java index 8a653b13a..f56cdc0ad 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java @@ -36,7 +36,7 @@ protected void onCreate(Bundle savedInstanceState) { } private void startTestSession() { - testLibrary.addTestDirectory("current/retry-in"); + // testLibrary.addTestDirectory("current/gdpr"); testLibrary.startTestSession(Adjust.getSdkVersion()); } From fa3adc348bbc4bc17b3472d40375dac7daf6fb6c Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 9 May 2024 17:39:59 +0200 Subject: [PATCH 123/540] refac: minor updates --- .../java/com/adjust/sdk/oaid/AdjustOaid.java | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/AdjustOaid.java b/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/AdjustOaid.java index 47fd234ac..c3611c4e1 100644 --- a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/AdjustOaid.java +++ b/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/AdjustOaid.java @@ -33,7 +33,7 @@ public static void readOaid(Context context) { } } - public static void getOaidParameters(final Context context,final OnOaidReadListener listener) { + public static void getOaid(final Context context, final OnOaidReadListener listener) { ILogger logger = AdjustFactory.getLogger(); if (listener == null) { logger.error("onOaidReadListener cannot be null"); @@ -50,26 +50,20 @@ protected OaidResult doInBackground(Context[] contexts) { readOaid(context); OaidResult oaidResult = new OaidResult(); Map oaidParameters = Util.getOaidParameters(context, logger); - if (oaidParameters != null && !oaidParameters.isEmpty() && oaidParameters.get("oaid") != null) { + if (oaidParameters != null && oaidParameters.get("oaid") != null) { oaidResult.oaid = oaidParameters.get("oaid"); - }else { - oaidResult.error = "OaidPlugin getOaidParameters: parameters is null"; + } else { + oaidResult.error = "Failed to read OAID"; } return oaidResult; } @Override protected void onPostExecute(OaidResult oaidResult) { - if (oaidResult != null) { - if (oaidResult.oaid != null) { - listener.onOaidRead(oaidResult.oaid); - } else if (oaidResult.error != null) { - listener.onFail(oaidResult.error); - }else { - listener.onFail("OaidPlugin getOaidParameters: parameters is null"); - } - }else { - listener.onFail("OaidPlugin getOaidParameters: OaidResults is null"); + if (oaidResult.oaid != null) { + listener.onOaidRead(oaidResult.oaid); + } else { + listener.onFail(oaidResult.error); } } }.execute(context); From 524485032c1b73a2310e5054f8aca424bd1b92e1 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 7 May 2024 10:07:20 +0200 Subject: [PATCH 124/540] feat: SigV4 API integration --- .../java/com/adjust/sdk/AdjustFactory.java | 8 -- .../java/com/adjust/sdk/AdjustInstance.java | 6 - .../java/com/adjust/sdk/AdjustSigner.java | 56 +++----- .../com/adjust/sdk/AdjustTestOptions.java | 2 - .../java/com/adjust/sdk/ResponseData.java | 6 +- .../adjust/sdk/SharedPreferencesManager.java | 35 +++++ .../sdk/network/ActivityPackageSender.java | 123 ++++++++++++++---- 7 files changed, 151 insertions(+), 85 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java index 2bb95e7a4..a6376bc73 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java @@ -287,14 +287,6 @@ public static void setTryInstallReferrer(boolean tryInstallReferrer) { AdjustFactory.tryInstallReferrer = tryInstallReferrer; } - public static void enableSigning() { - AdjustSigner.enableSigning(getLogger()); - } - - public static void disableSigning() { - AdjustSigner.disableSigning(getLogger()); - } - private static String byte2HexFormatted(byte[] arr) { StringBuilder str = new StringBuilder(arr.length * 2); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 445997400..aa74c6831 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -826,11 +826,5 @@ public void setTestOptions(AdjustTestOptions testOptions) { AdjustFactory.setPackageHandlerBackoffStrategy(BackoffStrategy.NO_WAIT); AdjustFactory.setSdkClickBackoffStrategy(BackoffStrategy.NO_WAIT); } - if (testOptions.enableSigning != null && testOptions.enableSigning) { - AdjustFactory.enableSigning(); - } - if (testOptions.disableSigning != null && testOptions.disableSigning) { - AdjustFactory.disableSigning(); - } } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustSigner.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustSigner.java index a7c0ecbaf..2d084b975 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustSigner.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustSigner.java @@ -2,6 +2,7 @@ import android.content.Context; +import java.util.HashMap; import java.util.Map; public class AdjustSigner { @@ -12,34 +13,6 @@ public class AdjustSigner { private AdjustSigner() { } - public static void enableSigning(ILogger logger) { - getSignerInstance(); - - if (signerInstance == null) { - return; - } - - try { - Reflection.invokeInstanceMethod(signerInstance, "enableSigning", null); - } catch (Exception e) { - logger.warn("Invoking Signer enableSigning() received an error [%s]", e.getMessage()); - } - } - - public static void disableSigning(ILogger logger) { - getSignerInstance(); - - if (signerInstance == null) { - return; - } - - try { - Reflection.invokeInstanceMethod(signerInstance, "disableSigning", null); - } catch (Exception e) { - logger.warn("Invoking Signer disableSigning() received an error [%s]", e.getMessage()); - } - } - public static void onResume(ILogger logger){ getSignerInstance(); @@ -54,23 +27,26 @@ public static void onResume(ILogger logger){ } } - public static void sign(Map parameters, String activityKind, String clientSdk, - Context context, ILogger logger) { + public static Map sign(final Map packageParams, + final Map extraParams, + final Context context, ILogger logger) { getSignerInstance(); - if (signerInstance == null) { - return; - } + Map outputParams = new HashMap<>(); - try { - logger.debug("Signing all the parameters"); - Reflection.invokeInstanceMethod(signerInstance, "sign", - new Class[]{Context.class, Map.class, String.class, String.class}, - context, parameters, activityKind, clientSdk); + if (signerInstance != null) { + try { + logger.debug("Signing all the parameters"); + Reflection.invokeInstanceMethod(signerInstance, "sign", + new Class[]{Context.class, Map.class, Map.class, Map.class}, + context, packageParams, extraParams, outputParams); - } catch (Exception e) { - logger.warn("Invoking Signer sign() for %s received an error [%s]", activityKind, e.getMessage()); + } catch (Exception e) { + logger.warn("Invoking Signer sign() for %s received an error [%s]", e.getMessage()); + } } + + return outputParams; } private static void getSignerInstance() { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTestOptions.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTestOptions.java index ad86b6f6a..43f6743dd 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTestOptions.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTestOptions.java @@ -23,6 +23,4 @@ public class AdjustTestOptions { public Boolean teardown; public Boolean tryInstallReferrer = false; public Boolean noBackoffWait; - public Boolean enableSigning; - public Boolean disableSigning; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ResponseData.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ResponseData.java index 95a6ea5a9..9de0903b0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ResponseData.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ResponseData.java @@ -25,7 +25,9 @@ public class ResponseData { public ActivityPackage activityPackage; public Map sendingParameters; + public Map signedParameters; public String resolvedDeeplink; + public JSONObject controlParams; protected ResponseData() { success = false; @@ -34,7 +36,8 @@ protected ResponseData() { public static ResponseData buildResponseData( ActivityPackage activityPackage, - Map sendingParameters) + Map sendingParameters, + Map signedParameters) { ResponseData responseData; ActivityKind activityKind = activityPackage.getActivityKind(); @@ -61,6 +64,7 @@ public static ResponseData buildResponseData( responseData.activityKind = activityKind; responseData.activityPackage = activityPackage; responseData.sendingParameters = sendingParameters; + responseData.signedParameters = signedParameters; return responseData; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java index 3111c0a0d..167b3b522 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -2,6 +2,7 @@ import org.json.JSONArray; import org.json.JSONException; +import org.json.JSONObject; import android.content.Context; import android.content.SharedPreferences; @@ -51,6 +52,8 @@ public class SharedPreferencesManager { private static final String PREFS_KEY_PLAY_STORE_KIDS_APP_ENABLED = "play_store_kids_app_enabled"; + private static final String PREFS_KEY_CONTROL_PARAMS = "control_params"; + /** * Index for raw referrer string content in saved JSONArray object. */ @@ -462,6 +465,38 @@ public synchronized void removePlayStoreKidsApp() { remove(PREFS_KEY_PLAY_STORE_KIDS_APP_ENABLED); } + /** + * Save control params json to shared preferences. + * + * @param controlParams Control params json to be saved + */ + public synchronized void saveControlParams(final JSONObject controlParams) { + try { + saveString(PREFS_KEY_CONTROL_PARAMS, controlParams.toString()); + } catch (Throwable t) { + remove(PREFS_KEY_CONTROL_PARAMS); + } + } + + /** + * Get saved control params json object. + * + * @return JSONObject containing control params information. Defaults to null if not found. + */ + public synchronized JSONObject getControlParamsJson() { + String controlParamsString = getString(PREFS_KEY_CONTROL_PARAMS); + + if (controlParamsString != null) { + try { + return new JSONObject(controlParamsString); + } catch (JSONException e) { + } catch (Throwable t) { + } + } + + return null; + } + /** * Remove all key-value pairs from shared preferences. */ diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index ab5a40b49..a66a1ce9f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -12,6 +12,7 @@ import com.adjust.sdk.ILogger; import com.adjust.sdk.PackageBuilder; import com.adjust.sdk.ResponseData; +import com.adjust.sdk.SharedPreferencesManager; import com.adjust.sdk.TrackingState; import com.adjust.sdk.Util; import com.adjust.sdk.scheduler.SingleThreadCachedScheduler; @@ -34,7 +35,9 @@ import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; +import java.util.StringTokenizer; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLHandshakeException; @@ -98,11 +101,7 @@ public void run() { public ResponseData sendActivityPackageSync(final ActivityPackage activityPackage, final Map sendingParameters) { - AdjustSigner.sign(activityPackage.getParameters(), - activityPackage.getActivityKind().toString(), - activityPackage.getClientSdk(), - context, - logger); + Map signedParameters = signParameters(activityPackage); boolean retryToSend; ResponseData responseData; @@ -110,7 +109,7 @@ public ResponseData sendActivityPackageSync(final ActivityPackage activityPackag addErrorParameters(activityPackage, sendingParameters); responseData = - ResponseData.buildResponseData(activityPackage, sendingParameters); + ResponseData.buildResponseData(activityPackage, sendingParameters, signedParameters); tryToGetResponse(responseData); @@ -120,10 +119,33 @@ public ResponseData sendActivityPackageSync(final ActivityPackage activityPackag return responseData; } - private void addErrorParameters(ActivityPackage activityPackage, Map sendingParameters) { - PackageBuilder.addLong(sendingParameters, "error_count", activityPackage.getErrorCount()); - PackageBuilder.addString(sendingParameters, "first_error", activityPackage.getFirstErrorMessage()); - PackageBuilder.addString(sendingParameters, "last_error", activityPackage.getLastErrorMessage()); + private Map signParameters(ActivityPackage activityPackage) { + Map extraParams = new HashMap<>(); + + extraParams.put("client_sdk", activityPackage.getClientSdk()); + extraParams.put("activity_kind", activityPackage.getActivityKind().toString()); + + String endPoint = urlStrategy.targetUrlByActivityKind(activityPackage.getActivityKind()); + extraParams.put("endpoint", endPoint); + + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(context).getControlParamsJson(); + if (controlParams != null) { + Iterator keys = controlParams.keys(); + + while (keys.hasNext()) { + String key = keys.next(); + try { + if (controlParams.get(key) instanceof String) { + extraParams.put(key, (String) controlParams.get(key)); + } + } catch (JSONException e) { + logger.error("JSONException while iterating control params"); + } + } + } + + return AdjustSigner.sign( + activityPackage.getParameters(), extraParams, context, logger); } private boolean shouldRetryToSend(final ResponseData responseData) { @@ -152,7 +174,10 @@ private void tryToGetResponse(final ResponseData responseData) { new HashMap<>(activityPackage.getParameters()); Map sendingParameters = responseData.sendingParameters; - String authorizationHeader = buildAndExtractAuthorizationHeader(activityPackageParameters); + String authorizationHeader = extractAuthorizationHeader(responseData.signedParameters); + if (authorizationHeader == null) { + authorizationHeader = buildAndExtractAuthorizationHeader(activityPackageParameters); + } boolean shouldUseGET = responseData.activityPackage.getActivityKind() == ActivityKind.ATTRIBUTION; @@ -161,10 +186,12 @@ private void tryToGetResponse(final ResponseData responseData) { urlString = generateUrlStringForGET(activityPackage.getActivityKind(), activityPackage.getPath(), activityPackageParameters, - sendingParameters); + sendingParameters, + responseData.signedParameters); } else { urlString = generateUrlStringForPOST(activityPackage.getActivityKind(), - activityPackage.getPath()); + activityPackage.getPath(), + responseData.signedParameters); } final URL url = new URL(urlString); @@ -183,7 +210,8 @@ private void tryToGetResponse(final ResponseData responseData) { } else { dataOutputStream = configConnectionForPOST(connection, activityPackageParameters, - sendingParameters); + sendingParameters, + responseData.signedParameters); } // read connection response @@ -287,10 +315,11 @@ private String errorMessage(final Throwable throwable, private String generateUrlStringForGET(final ActivityKind activityKind, final String activityPackagePath, final Map activityPackageParameters, - final Map sendingParameters) + final Map sendingParameters, + final Map signedParameters) throws MalformedURLException { - String targetUrl = urlStrategy.targetUrlByActivityKind(activityKind); + String targetUrl = extractTargetUrl(signedParameters, activityKind, urlStrategy); // extra path, if present, has the format '/X/Y' String urlWithPath = @@ -303,26 +332,32 @@ private String generateUrlStringForGET(final ActivityKind activityKind, uriBuilder.path(urlObject.getPath()); uriBuilder.appendPath(activityPackagePath); - for (final Map.Entry entry : activityPackageParameters.entrySet()) { - uriBuilder.appendQueryParameter(entry.getKey(), entry.getValue()); + logger.debug("Making request to url: %s", uriBuilder.toString()); + + if (!signedParameters.isEmpty()) { + for (final Map.Entry entry : signedParameters.entrySet()) { + uriBuilder.appendQueryParameter(entry.getKey(), entry.getValue()); + } + } else { + for (final Map.Entry entry : activityPackageParameters.entrySet()) { + uriBuilder.appendQueryParameter(entry.getKey(), entry.getValue()); + } } if (sendingParameters != null) { - for (final Map.Entry entry: sendingParameters.entrySet()) { + for (final Map.Entry entry : sendingParameters.entrySet()) { uriBuilder.appendQueryParameter(entry.getKey(), entry.getValue()); } } - logger.debug("Making request to url: %s", uriBuilder.toString()); - return uriBuilder.build().toString(); } private String generateUrlStringForPOST(final ActivityKind activityKind, - final String activityPackagePath) + final String activityPackagePath, + final Map signedParameters) { - String targetUrl = - urlStrategy.targetUrlByActivityKind(activityKind); + String targetUrl = extractTargetUrl(signedParameters, activityKind, urlStrategy); // extra path, if present, has the format '/X/Y' String urlWithPath = @@ -363,7 +398,8 @@ private DataOutputStream configConnectionForGET(final HttpsURLConnection connect private DataOutputStream configConnectionForPOST(final HttpsURLConnection connection, final Map activityPackageParameters, - final Map sendingParameters) + final Map sendingParameters, + final Map signedParameters) throws ProtocolException, UnsupportedEncodingException, IOException @@ -380,7 +416,8 @@ private DataOutputStream configConnectionForPOST(final HttpsURLConnection connec // build POST body final String postBodyString = generatePOSTBodyString( activityPackageParameters, - sendingParameters); + sendingParameters, + signedParameters); logger.debug("Post body: %s", postBodyString); @@ -397,7 +434,8 @@ private DataOutputStream configConnectionForPOST(final HttpsURLConnection connec } private String generatePOSTBodyString(final Map parameters, - final Map sendingParameters) + final Map sendingParameters, + final Map signedParameters) throws UnsupportedEncodingException { if (parameters.isEmpty()) { @@ -406,7 +444,12 @@ private String generatePOSTBodyString(final Map parameters, final StringBuilder postStringBuilder = new StringBuilder(); - injectParametersToPOSTStringBuilder(parameters, postStringBuilder); + if (!signedParameters.isEmpty()) { + injectParametersToPOSTStringBuilder(signedParameters, postStringBuilder); + } else { + injectParametersToPOSTStringBuilder(parameters, postStringBuilder); + } + injectParametersToPOSTStringBuilder(sendingParameters, postStringBuilder); // delete last added & @@ -492,6 +535,10 @@ Integer readConnectionResponse(final HttpsURLConnection connection, parseResponse(responseData, responseString); + if (responseData.controlParams != null) { + SharedPreferencesManager.getDefaultInstance(context).saveControlParams(responseData.controlParams); + } + final String responseMessage = responseData.message; if (responseMessage == null) { return responseCode; @@ -517,6 +564,12 @@ private void parseResponse(final ResponseData responseData, final String respons // convert string response to JSON object try { jsonResponse = new JSONObject(responseString); + + //TODO: remove after testing + String controlJson = "{\"i am a string\": \"wow, me too!\"}\n" + "}"; + JSONObject jsonObject = new JSONObject(controlJson); + jsonResponse.put("control_params", jsonObject); + } catch (final JSONException jsonException) { String errorMessage = errorMessage(jsonException, "Failed to parse JSON response", @@ -552,6 +605,7 @@ private void parseResponse(final ResponseData responseData, final String respons Util.getSdkPrefixPlatform(clientSdk)); responseData.resolvedDeeplink = UtilNetworking.extractJsonString(jsonResponse,"resolved_click_url"); + responseData.controlParams = jsonResponse.optJSONObject("control_params"); } private String buildAndExtractAuthorizationHeader(final Map parameters) { @@ -644,5 +698,18 @@ private static String extractAdjSigningId(final Map parameters) return parameters.remove("adj_signing_id"); } + private static String extractAuthorizationHeader(final Map parameters) { + return parameters.remove("Authorization"); + } + private static String extractTargetUrl(final Map parameters, + final ActivityKind activityKind, + final UrlStrategy urlStrategy) { + String targetUrl = parameters.remove("endpoint"); + if (targetUrl != null) { + return targetUrl; + } + + return urlStrategy.targetUrlByActivityKind(activityKind); + } } From f2c763004509839ce35e0275c4443c8fcc386146 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 8 May 2024 17:27:55 +0200 Subject: [PATCH 125/540] feat: extract client sdk and activity kind --- .../sdk/network/ActivityPackageSender.java | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index a66a1ce9f..d286acf67 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -177,8 +177,12 @@ private void tryToGetResponse(final ResponseData responseData) { String authorizationHeader = extractAuthorizationHeader(responseData.signedParameters); if (authorizationHeader == null) { authorizationHeader = buildAndExtractAuthorizationHeader(activityPackageParameters); + } else { + logger.verbose("authorizationHeader: %s", authorizationHeader); } + extractActivityKind(responseData.signedParameters); + boolean shouldUseGET = responseData.activityPackage.getActivityKind() == ActivityKind.ATTRIBUTION; final String urlString; @@ -198,8 +202,10 @@ private void tryToGetResponse(final ResponseData responseData) { final HttpsURLConnection connection = httpsURLConnectionProvider.generateHttpsURLConnection(url); + String clientSdk = extractClientSdk(responseData.signedParameters, activityPackage); + // get and apply connection options (default or for tests) - connectionOptions.applyConnectionOptions(connection, activityPackage.getClientSdk()); + connectionOptions.applyConnectionOptions(connection, clientSdk); if (authorizationHeader != null) { connection.setRequestProperty("Authorization", authorizationHeader); @@ -565,11 +571,6 @@ private void parseResponse(final ResponseData responseData, final String respons try { jsonResponse = new JSONObject(responseString); - //TODO: remove after testing - String controlJson = "{\"i am a string\": \"wow, me too!\"}\n" + "}"; - JSONObject jsonObject = new JSONObject(controlJson); - jsonResponse.put("control_params", jsonObject); - } catch (final JSONException jsonException) { String errorMessage = errorMessage(jsonException, "Failed to parse JSON response", @@ -702,6 +703,18 @@ private static String extractAuthorizationHeader(final Map param return parameters.remove("Authorization"); } + private static String extractActivityKind(final Map parameters) { + return parameters.remove("activity_kind"); + } + + private static String extractClientSdk(final Map parameters, ActivityPackage activityPackage) { + String clientSdk = parameters.remove("client_sdk"); + if (clientSdk != null) { + return clientSdk; + } + return activityPackage.getClientSdk(); + } + private static String extractTargetUrl(final Map parameters, final ActivityKind activityKind, final UrlStrategy urlStrategy) { From 5a3576aee0d9710a348f1173f53b947cf95a58bb Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 13 May 2024 15:40:42 +0200 Subject: [PATCH 126/540] refac: extract client sdk before to avoid adding in request url --- .../main/java/com/adjust/sdk/SharedPreferencesManager.java | 1 - .../java/com/adjust/sdk/network/ActivityPackageSender.java | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java index 167b3b522..6700820ad 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -474,7 +474,6 @@ public synchronized void saveControlParams(final JSONObject controlParams) { try { saveString(PREFS_KEY_CONTROL_PARAMS, controlParams.toString()); } catch (Throwable t) { - remove(PREFS_KEY_CONTROL_PARAMS); } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index d286acf67..201526ad7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -181,6 +181,8 @@ private void tryToGetResponse(final ResponseData responseData) { logger.verbose("authorizationHeader: %s", authorizationHeader); } + String clientSdk = extractClientSdk(responseData.signedParameters, activityPackage); + extractActivityKind(responseData.signedParameters); boolean shouldUseGET = @@ -202,8 +204,6 @@ private void tryToGetResponse(final ResponseData responseData) { final HttpsURLConnection connection = httpsURLConnectionProvider.generateHttpsURLConnection(url); - String clientSdk = extractClientSdk(responseData.signedParameters, activityPackage); - // get and apply connection options (default or for tests) connectionOptions.applyConnectionOptions(connection, clientSdk); From 9edc08b18af1048ae88ed682155972faca96987f Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 15 May 2024 09:33:35 +0200 Subject: [PATCH 127/540] refac: remove obsolete authorisation header building logic --- .../sdk/network/ActivityPackageSender.java | 97 +------------------ 1 file changed, 1 insertion(+), 96 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index 201526ad7..7ef0bdce5 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -37,7 +37,6 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; -import java.util.StringTokenizer; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLHandshakeException; @@ -175,11 +174,7 @@ private void tryToGetResponse(final ResponseData responseData) { Map sendingParameters = responseData.sendingParameters; String authorizationHeader = extractAuthorizationHeader(responseData.signedParameters); - if (authorizationHeader == null) { - authorizationHeader = buildAndExtractAuthorizationHeader(activityPackageParameters); - } else { - logger.verbose("authorizationHeader: %s", authorizationHeader); - } + logger.verbose("authorizationHeader: %s", authorizationHeader); String clientSdk = extractClientSdk(responseData.signedParameters, activityPackage); @@ -609,96 +604,6 @@ private void parseResponse(final ResponseData responseData, final String respons responseData.controlParams = jsonResponse.optJSONObject("control_params"); } - private String buildAndExtractAuthorizationHeader(final Map parameters) { - String adjSigningId = extractAdjSigningId(parameters); - String secretId = extractSecretId(parameters); - String headersId = extractHeadersId(parameters); - String signature = extractSignature(parameters); - String algorithm = extractAlgorithm(parameters); - String nativeVersion = extractNativeVersion(parameters); - - String authorizationHeader = buildAuthorizationHeaderV2WithAdjSigningId(signature, adjSigningId, - headersId, algorithm, nativeVersion); - if (authorizationHeader != null) { - return authorizationHeader; - } - - return buildAuthorizationHeaderV2WithSecretId(signature, secretId, headersId, - algorithm, nativeVersion); - } - - private String buildAuthorizationHeaderV2WithAdjSigningId(final String signature, - final String adjSigningId, - final String headersId, - final String algorithm, - final String nativeVersion) - { - if (adjSigningId == null || signature == null || headersId == null) { - return null; - } - - String signatureHeader = Util.formatString("signature=\"%s\"", signature); - String adjSigningIdHeader = Util.formatString("adj_signing_id=\"%s\"", adjSigningId); - String idHeader = Util.formatString("headers_id=\"%s\"", headersId); - String algorithmHeader = Util.formatString("algorithm=\"%s\"", algorithm != null ? algorithm : "adj1"); - String nativeVersionHeader = Util.formatString("native_version=\"%s\"", nativeVersion != null ? nativeVersion : ""); - - String authorizationHeader = Util.formatString("Signature %s,%s,%s,%s,%s", - signatureHeader, adjSigningIdHeader, algorithmHeader, idHeader, nativeVersionHeader); - - logger.verbose("authorizationHeader: %s", authorizationHeader); - - return authorizationHeader; - } - - private String buildAuthorizationHeaderV2WithSecretId(final String signature, - final String secretId, - final String headersId, - final String algorithm, - final String nativeVersion) - { - if (secretId == null || signature == null || headersId == null) { - return null; - } - - String signatureHeader = Util.formatString("signature=\"%s\"", signature); - String secretIdHeader = Util.formatString("secret_id=\"%s\"", secretId); - String idHeader = Util.formatString("headers_id=\"%s\"", headersId); - String algorithmHeader = Util.formatString("algorithm=\"%s\"", algorithm != null ? algorithm : "adj1"); - String nativeVersionHeader = Util.formatString("native_version=\"%s\"", nativeVersion != null ? nativeVersion : ""); - - String authorizationHeader = Util.formatString("Signature %s,%s,%s,%s,%s", - signatureHeader, secretIdHeader, algorithmHeader, idHeader, nativeVersionHeader); - - logger.verbose("authorizationHeader: %s", authorizationHeader); - - return authorizationHeader; - } - - private static String extractSecretId(final Map parameters) { - return parameters.remove("secret_id"); - } - - private static String extractSignature(final Map parameters) { - return parameters.remove("signature"); - } - - private static String extractAlgorithm(final Map parameters) { - return parameters.remove("algorithm"); - } - - private static String extractNativeVersion(final Map parameters) { - return parameters.remove("native_version"); - } - - private static String extractHeadersId(final Map parameters) { - return parameters.remove("headers_id"); - } - - private static String extractAdjSigningId(final Map parameters) { - return parameters.remove("adj_signing_id"); - } - private static String extractAuthorizationHeader(final Map parameters) { return parameters.remove("Authorization"); } From ce8e6e75ab3af2b9ec1cf5fcfb6be7deaec292f6 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 15 May 2024 09:44:25 +0200 Subject: [PATCH 128/540] refac: check for null and emptiness for each map --- .../adjust/sdk/network/ActivityPackageSender.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index 7ef0bdce5..41cfe6816 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -439,19 +439,17 @@ private String generatePOSTBodyString(final Map parameters, final Map signedParameters) throws UnsupportedEncodingException { - if (parameters.isEmpty()) { - return null; - } - final StringBuilder postStringBuilder = new StringBuilder(); - if (!signedParameters.isEmpty()) { + if (signedParameters!= null && !signedParameters.isEmpty()) { injectParametersToPOSTStringBuilder(signedParameters, postStringBuilder); - } else { + } else if (parameters != null && !parameters.isEmpty()){ injectParametersToPOSTStringBuilder(parameters, postStringBuilder); } - injectParametersToPOSTStringBuilder(sendingParameters, postStringBuilder); + if (sendingParameters != null && !sendingParameters.isEmpty()) { + injectParametersToPOSTStringBuilder(sendingParameters, postStringBuilder); + } // delete last added & if (postStringBuilder.length() > 0 From 67d1a9f00947644d8abf6083d4ca807090d40b63 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 15 May 2024 11:23:57 +0200 Subject: [PATCH 129/540] refac: merge sending params to package params before signing --- .../sdk/network/ActivityPackageSender.java | 57 ++++++++----------- 1 file changed, 24 insertions(+), 33 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index 41cfe6816..171e90f57 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -100,7 +100,7 @@ public void run() { public ResponseData sendActivityPackageSync(final ActivityPackage activityPackage, final Map sendingParameters) { - Map signedParameters = signParameters(activityPackage); + Map signedParameters = signParameters(activityPackage, sendingParameters); boolean retryToSend; ResponseData responseData; @@ -118,7 +118,11 @@ public ResponseData sendActivityPackageSync(final ActivityPackage activityPackag return responseData; } - private Map signParameters(ActivityPackage activityPackage) { + private Map signParameters(final ActivityPackage activityPackage, + final Map sendingParameters) { + Map packageParams = new HashMap<>(activityPackage.getParameters()); + packageParams.putAll(sendingParameters); + Map extraParams = new HashMap<>(); extraParams.put("client_sdk", activityPackage.getClientSdk()); @@ -143,8 +147,7 @@ private Map signParameters(ActivityPackage activityPackage) { } } - return AdjustSigner.sign( - activityPackage.getParameters(), extraParams, context, logger); + return AdjustSigner.sign(packageParams, extraParams, context, logger); } private boolean shouldRetryToSend(final ResponseData responseData) { @@ -176,10 +179,6 @@ private void tryToGetResponse(final ResponseData responseData) { String authorizationHeader = extractAuthorizationHeader(responseData.signedParameters); logger.verbose("authorizationHeader: %s", authorizationHeader); - String clientSdk = extractClientSdk(responseData.signedParameters, activityPackage); - - extractActivityKind(responseData.signedParameters); - boolean shouldUseGET = responseData.activityPackage.getActivityKind() == ActivityKind.ATTRIBUTION; final String urlString; @@ -335,19 +334,21 @@ private String generateUrlStringForGET(final ActivityKind activityKind, logger.debug("Making request to url: %s", uriBuilder.toString()); - if (!signedParameters.isEmpty()) { + if (signedParameters != null && !signedParameters.isEmpty()) { for (final Map.Entry entry : signedParameters.entrySet()) { uriBuilder.appendQueryParameter(entry.getKey(), entry.getValue()); } } else { - for (final Map.Entry entry : activityPackageParameters.entrySet()) { - uriBuilder.appendQueryParameter(entry.getKey(), entry.getValue()); + if (activityPackageParameters != null) { + for (final Map.Entry entry : activityPackageParameters.entrySet()) { + uriBuilder.appendQueryParameter(entry.getKey(), entry.getValue()); + } } - } - if (sendingParameters != null) { - for (final Map.Entry entry : sendingParameters.entrySet()) { - uriBuilder.appendQueryParameter(entry.getKey(), entry.getValue()); + if (sendingParameters != null) { + for (final Map.Entry entry : sendingParameters.entrySet()) { + uriBuilder.appendQueryParameter(entry.getKey(), entry.getValue()); + } } } @@ -443,12 +444,14 @@ private String generatePOSTBodyString(final Map parameters, if (signedParameters!= null && !signedParameters.isEmpty()) { injectParametersToPOSTStringBuilder(signedParameters, postStringBuilder); - } else if (parameters != null && !parameters.isEmpty()){ - injectParametersToPOSTStringBuilder(parameters, postStringBuilder); - } + } else { + if (parameters != null && !parameters.isEmpty()){ + injectParametersToPOSTStringBuilder(parameters, postStringBuilder); + } - if (sendingParameters != null && !sendingParameters.isEmpty()) { - injectParametersToPOSTStringBuilder(sendingParameters, postStringBuilder); + if (sendingParameters != null && !sendingParameters.isEmpty()) { + injectParametersToPOSTStringBuilder(sendingParameters, postStringBuilder); + } } // delete last added & @@ -603,19 +606,7 @@ private void parseResponse(final ResponseData responseData, final String respons } private static String extractAuthorizationHeader(final Map parameters) { - return parameters.remove("Authorization"); - } - - private static String extractActivityKind(final Map parameters) { - return parameters.remove("activity_kind"); - } - - private static String extractClientSdk(final Map parameters, ActivityPackage activityPackage) { - String clientSdk = parameters.remove("client_sdk"); - if (clientSdk != null) { - return clientSdk; - } - return activityPackage.getClientSdk(); + return parameters.remove("authorization"); } private static String extractTargetUrl(final Map parameters, From cac99a448489833d3952b6eced9f47bfba602d59 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 15 May 2024 16:28:23 +0200 Subject: [PATCH 130/540] refac: cleanup references stuff --- .../sdk/network/ActivityPackageSender.java | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index 171e90f57..0c76a460b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -128,8 +128,8 @@ private Map signParameters(final ActivityPackage activityPackage extraParams.put("client_sdk", activityPackage.getClientSdk()); extraParams.put("activity_kind", activityPackage.getActivityKind().toString()); - String endPoint = urlStrategy.targetUrlByActivityKind(activityPackage.getActivityKind()); - extraParams.put("endpoint", endPoint); + String endpoint = urlStrategy.targetUrlByActivityKind(activityPackage.getActivityKind()); + extraParams.put("endpoint", endpoint); JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(context).getControlParamsJson(); if (controlParams != null) { @@ -171,11 +171,6 @@ private void tryToGetResponse(final ResponseData responseData) { DataOutputStream dataOutputStream = null; try { - ActivityPackage activityPackage = responseData.activityPackage; - Map activityPackageParameters = - new HashMap<>(activityPackage.getParameters()); - Map sendingParameters = responseData.sendingParameters; - String authorizationHeader = extractAuthorizationHeader(responseData.signedParameters); logger.verbose("authorizationHeader: %s", authorizationHeader); @@ -183,14 +178,14 @@ private void tryToGetResponse(final ResponseData responseData) { responseData.activityPackage.getActivityKind() == ActivityKind.ATTRIBUTION; final String urlString; if (shouldUseGET) { - urlString = generateUrlStringForGET(activityPackage.getActivityKind(), - activityPackage.getPath(), - activityPackageParameters, - sendingParameters, + urlString = generateUrlStringForGET(responseData.activityPackage.getActivityKind(), + responseData.activityPackage.getPath(), + responseData.activityPackage.getParameters(), + responseData.sendingParameters, responseData.signedParameters); } else { - urlString = generateUrlStringForPOST(activityPackage.getActivityKind(), - activityPackage.getPath(), + urlString = generateUrlStringForPOST(responseData.activityPackage.getActivityKind(), + responseData.activityPackage.getPath(), responseData.signedParameters); } @@ -209,8 +204,8 @@ private void tryToGetResponse(final ResponseData responseData) { dataOutputStream = configConnectionForGET(connection); } else { dataOutputStream = configConnectionForPOST(connection, - activityPackageParameters, - sendingParameters, + responseData.activityPackage.getParameters(), + responseData.sendingParameters, responseData.signedParameters); } From 9af51a0d6597d8820e49260ffc2960bd32baf04e Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 7 May 2024 13:55:07 +0200 Subject: [PATCH 131/540] refac:add retry in mechanism depends on back of strategy and reties for sdkClick package, PurchaseVerification package and main queue --- .../java/com/adjust/sdk/PackageHandler.java | 44 ++++++++-------- .../sdk/PurchaseVerificationHandler.java | 37 +++++++++++--- .../java/com/adjust/sdk/SdkClickHandler.java | 51 +++++++++++++++++-- 3 files changed, 100 insertions(+), 32 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java index cda86689d..bec645e87 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java @@ -172,32 +172,36 @@ public void run() { } }; - if (responseData.activityPackage == null) { - runnable.run(); - return; - } - int retries = responseData.activityPackage.increaseRetries(); - long waitTimeMilliSeconds; + if (responseData.retryIn != null) { + long retryIn = responseData.retryIn; + scheduler.schedule(runnable, retryIn); + }else { + if (responseData.activityPackage == null) { + runnable.run(); + return; + } - SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(context); + int retries = responseData.activityPackage.increaseRetries(); + long waitTimeMilliSeconds; - if (responseData.activityPackage.getActivityKind() == - ActivityKind.SESSION && !sharedPreferencesManager.getInstallTracked()) - { - waitTimeMilliSeconds = Util.getWaitingTime(retries, backoffStrategyForInstallSession); - } else { - waitTimeMilliSeconds = Util.getWaitingTime(retries, backoffStrategy); - } + SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(context); + + if (responseData.activityPackage.getActivityKind() == + ActivityKind.SESSION && !sharedPreferencesManager.getInstallTracked()) { + waitTimeMilliSeconds = Util.getWaitingTime(retries, backoffStrategyForInstallSession); + } else { + waitTimeMilliSeconds = Util.getWaitingTime(retries, backoffStrategy); + } - double waitTimeSeconds = waitTimeMilliSeconds / 1000.0; - String secondsString = Util.SecondsDisplayFormat.format(waitTimeSeconds); + double waitTimeSeconds = waitTimeMilliSeconds / 1000.0; + String secondsString = Util.SecondsDisplayFormat.format(waitTimeSeconds); - totalWaitTimeSeconds += waitTimeSeconds; + totalWaitTimeSeconds += waitTimeSeconds; - logger.verbose("Waiting for %s seconds before retrying the %d time", secondsString, retries); - scheduler.schedule(runnable, waitTimeMilliSeconds); - responseData.activityPackage.setWaitBeforeSendTimeSeconds(responseData.activityPackage.getWaitBeforeSendTimeSeconds() + waitTimeSeconds); + logger.verbose("Waiting for %s seconds before retrying the %d time", secondsString, retries); + scheduler.schedule(runnable, waitTimeMilliSeconds); + responseData.activityPackage.setWaitBeforeSendTimeSeconds(responseData.activityPackage.getWaitBeforeSendTimeSeconds() + waitTimeSeconds); } // interrupt the sending loop after the current request has finished diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PurchaseVerificationHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PurchaseVerificationHandler.java index 2f4ea0737..487e12fa3 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PurchaseVerificationHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PurchaseVerificationHandler.java @@ -60,6 +60,8 @@ public class PurchaseVerificationHandler implements IPurchaseVerificationHandler private IActivityPackageSender activityPackageSender; + private long lastPackageRetryInMilli= 0L; + /** * PurchaseVerificationHandler constructor. * @@ -189,17 +191,13 @@ public void run() { } }; - if (retries <= 0) { + long waitTimeMilliSeconds = waitTime(retries); + if (waitTimeMilliSeconds > 0) { + scheduler.schedule(runnable, waitTimeMilliSeconds); + } else { runnable.run(); - return; } - long waitTimeMilliSeconds = Util.getWaitingTime(retries, backoffStrategy); - double waitTimeSeconds = waitTimeMilliSeconds / MILLISECONDS_TO_SECONDS_DIVISOR; - String secondsString = Util.SecondsDisplayFormat.format(waitTimeSeconds); - - logger.verbose("Waiting for %s seconds before retrying purchase_verification for the %d time", secondsString, retries); - scheduler.schedule(runnable, waitTimeMilliSeconds); } /** @@ -225,6 +223,9 @@ private void sendPurchaseVerificationPackageI(final ActivityPackage purchaseVeri retrySendingI(purchaseVerificationPackage); return; } + + lastPackageRetryInMilli = 0L; + if (activityHandler == null) { return; } @@ -257,4 +258,24 @@ private void retrySendingI(final ActivityPackage purchaseVerificationPackage) { logger.error("Retrying purchase_verification package for the %d time", retries); sendPurchaseVerificationPackage(purchaseVerificationPackage); } + + /** + * calculate wait time (runs within scheduled executor). + * @param retries count of retries + * @return calculated wait time depends on the number of retry in and backoff strategy + */ + private long waitTime(int retries) { + if (lastPackageRetryInMilli > 0) { + return lastPackageRetryInMilli; + } + if (retries > 0) { + long waitTimeMilliSeconds = Util.getWaitingTime(retries, backoffStrategy); + double waitTimeSeconds = waitTimeMilliSeconds / MILLISECONDS_TO_SECONDS_DIVISOR; + String secondsString = Util.SecondsDisplayFormat.format(waitTimeSeconds); + logger.verbose("Waiting for %s seconds before retrying sdk_click for the %d time", secondsString, retries); + return waitTimeMilliSeconds; + } + + return 0L; + } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java index e2fbf1e4b..579671b55 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -73,6 +73,8 @@ public class SdkClickHandler implements ISdkClickHandler { private IActivityPackageSender activityPackageSender; + private long lastPackageRetryInMilli = 0L; + /** * SdkClickHandler constructor. * @@ -289,6 +291,18 @@ public void run() { } }; + // extract into method + // check first for local retryIn var -> return millisecond of it, if present + // do the same cal as before with the retries and return that + // if not null -> wait for; else, don't wait and run + + long waitTimeMilliSeconds = waitTime(retries); + if (waitTimeMilliSeconds > 0) { + scheduler.schedule(runnable, waitTimeMilliSeconds); + } else { + runnable.run(); + } +/* if (retries <= 0) { runnable.run(); return; @@ -301,6 +315,7 @@ public void run() { logger.verbose("Waiting for %s seconds before retrying sdk_click for the %d time", secondsString, retries); scheduler.schedule(runnable, waitTimeMilliSeconds); + */ } /** @@ -366,10 +381,12 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { SdkClickResponseData sdkClickResponseData = (SdkClickResponseData)responseData; if (sdkClickResponseData.willRetry) { - retrySendingI(sdkClickPackage); + retrySendingI(sdkClickPackage, sdkClickResponseData.retryIn); return; } + lastPackageRetryInMilli = 0L; + if (activityHandler == null) { return; } @@ -439,11 +456,16 @@ private Map generateSendingParametersI() { * Retry sending of the sdk_click package passed as the parameter (runs within scheduled executor). * * @param sdkClickPackage sdk_click package to be retried. + * @param retryIn */ - private void retrySendingI(final ActivityPackage sdkClickPackage) { - int retries = sdkClickPackage.increaseRetries(); + private void retrySendingI(final ActivityPackage sdkClickPackage, Long retryIn) { + if (retryIn!= null && retryIn > 0) { + lastPackageRetryInMilli = retryIn; + } else { + int retries = sdkClickPackage.increaseRetries(); - logger.error("Retrying sdk_click package for the %d time", retries); + logger.error("Retrying sdk_click package for the %d time", retries); + } sendSdkClick(sdkClickPackage); } @@ -464,4 +486,25 @@ private void logErrorMessageI(final ActivityPackage sdkClickPackage, logger.error(finalMessage); } + + /** + * calculate wait time (runs within scheduled executor). + * @param retries count of retries + * @return calculated wait time depends on the number of retry in and backoff strategy + */ + private long waitTime(int retries) { + if (lastPackageRetryInMilli > 0) { + return lastPackageRetryInMilli; + } + if (retries > 0) { + long waitTimeMilliSeconds = Util.getWaitingTime(retries, backoffStrategy); + double waitTimeSeconds = waitTimeMilliSeconds / MILLISECONDS_TO_SECONDS_DIVISOR; + String secondsString = Util.SecondsDisplayFormat.format(waitTimeSeconds); + logger.verbose("Waiting for %s seconds before retrying sdk_click for the %d time", secondsString, retries); + return waitTimeMilliSeconds; + } + + return 0L; + } + } From 0c0014f6772ea63a94f6f647906223892ed0e7e1 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 13 May 2024 11:55:02 +0200 Subject: [PATCH 132/540] style:clean up the comments --- .../java/com/adjust/sdk/SdkClickHandler.java | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java index 579671b55..3f6a1b0ea 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -291,31 +291,12 @@ public void run() { } }; - // extract into method - // check first for local retryIn var -> return millisecond of it, if present - // do the same cal as before with the retries and return that - // if not null -> wait for; else, don't wait and run - long waitTimeMilliSeconds = waitTime(retries); if (waitTimeMilliSeconds > 0) { scheduler.schedule(runnable, waitTimeMilliSeconds); } else { runnable.run(); } -/* - if (retries <= 0) { - runnable.run(); - return; - } - - long waitTimeMilliSeconds = Util.getWaitingTime(retries, backoffStrategy); - double waitTimeSeconds = waitTimeMilliSeconds / MILLISECONDS_TO_SECONDS_DIVISOR; - String secondsString = Util.SecondsDisplayFormat.format(waitTimeSeconds); - - logger.verbose("Waiting for %s seconds before retrying sdk_click for the %d time", secondsString, retries); - - scheduler.schedule(runnable, waitTimeMilliSeconds); - */ } /** From f03dbcdfc410e560cd4ddcc5c4e33e82d096d93e Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 17 May 2024 14:28:38 +0200 Subject: [PATCH 133/540] Refac: Early return --- .../java/com/adjust/sdk/PackageHandler.java | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java index bec645e87..f3929b3e8 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java @@ -172,36 +172,37 @@ public void run() { } }; - if (responseData.retryIn != null) { long retryIn = responseData.retryIn; scheduler.schedule(runnable, retryIn); - }else { - if (responseData.activityPackage == null) { - runnable.run(); - return; - } + return; + } + + if (responseData.activityPackage == null) { + runnable.run(); + return; + } - int retries = responseData.activityPackage.increaseRetries(); - long waitTimeMilliSeconds; + int retries = responseData.activityPackage.increaseRetries(); + long waitTimeMilliSeconds; - SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(context); + SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(context); - if (responseData.activityPackage.getActivityKind() == - ActivityKind.SESSION && !sharedPreferencesManager.getInstallTracked()) { - waitTimeMilliSeconds = Util.getWaitingTime(retries, backoffStrategyForInstallSession); - } else { - waitTimeMilliSeconds = Util.getWaitingTime(retries, backoffStrategy); - } + if (responseData.activityPackage.getActivityKind() == + ActivityKind.SESSION && !sharedPreferencesManager.getInstallTracked()) { + waitTimeMilliSeconds = Util.getWaitingTime(retries, backoffStrategyForInstallSession); + } else { + waitTimeMilliSeconds = Util.getWaitingTime(retries, backoffStrategy); + } - double waitTimeSeconds = waitTimeMilliSeconds / 1000.0; - String secondsString = Util.SecondsDisplayFormat.format(waitTimeSeconds); + double waitTimeSeconds = waitTimeMilliSeconds / 1000.0; + String secondsString = Util.SecondsDisplayFormat.format(waitTimeSeconds); - totalWaitTimeSeconds += waitTimeSeconds; + totalWaitTimeSeconds += waitTimeSeconds; - logger.verbose("Waiting for %s seconds before retrying the %d time", secondsString, retries); - scheduler.schedule(runnable, waitTimeMilliSeconds); - responseData.activityPackage.setWaitBeforeSendTimeSeconds(responseData.activityPackage.getWaitBeforeSendTimeSeconds() + waitTimeSeconds); + logger.verbose("Waiting for %s seconds before retrying the %d time", secondsString, retries); + scheduler.schedule(runnable, waitTimeMilliSeconds); + responseData.activityPackage.setWaitBeforeSendTimeSeconds(responseData.activityPackage.getWaitBeforeSendTimeSeconds() + waitTimeSeconds); } // interrupt the sending loop after the current request has finished From 18fd797362b120b8151316443ad9ff3e0e94ca78 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 17 May 2024 14:29:06 +0200 Subject: [PATCH 134/540] Chore: Remove not possible check --- .../src/main/java/com/adjust/sdk/PackageHandler.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java index f3929b3e8..59f81a57d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java @@ -178,11 +178,6 @@ public void run() { return; } - if (responseData.activityPackage == null) { - runnable.run(); - return; - } - int retries = responseData.activityPackage.increaseRetries(); long waitTimeMilliSeconds; From 0f5044e2b05ca958fbb2c693598f4480420d9553 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 17 May 2024 14:46:40 +0200 Subject: [PATCH 135/540] Fix: Missing retry handling --- .../adjust/sdk/PurchaseVerificationHandler.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PurchaseVerificationHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PurchaseVerificationHandler.java index 487e12fa3..76fd397bf 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PurchaseVerificationHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PurchaseVerificationHandler.java @@ -220,7 +220,7 @@ private void sendPurchaseVerificationPackageI(final ActivityPackage purchaseVeri = (PurchaseVerificationResponseData)responseData; if (purchaseVerificationResponseData.willRetry) { - retrySendingI(purchaseVerificationPackage); + retrySendingI(purchaseVerificationPackage, responseData.retryIn); return; } @@ -253,9 +253,14 @@ private Map generateSendingParametersI() { * * @param purchaseVerificationPackage purchase_verification package to be retried. */ - private void retrySendingI(final ActivityPackage purchaseVerificationPackage) { - int retries = purchaseVerificationPackage.increaseRetries(); - logger.error("Retrying purchase_verification package for the %d time", retries); + private void retrySendingI(final ActivityPackage purchaseVerificationPackage, Long retryIn) { + if (retryIn != null && retryIn > 0) { + lastPackageRetryInMilli = retryIn; + } else { + int retries = purchaseVerificationPackage.increaseRetries(); + logger.error("Retrying purchase_verification package for the %d time", retries); + } + sendPurchaseVerificationPackage(purchaseVerificationPackage); } @@ -272,7 +277,9 @@ private long waitTime(int retries) { long waitTimeMilliSeconds = Util.getWaitingTime(retries, backoffStrategy); double waitTimeSeconds = waitTimeMilliSeconds / MILLISECONDS_TO_SECONDS_DIVISOR; String secondsString = Util.SecondsDisplayFormat.format(waitTimeSeconds); - logger.verbose("Waiting for %s seconds before retrying sdk_click for the %d time", secondsString, retries); + logger.verbose( + "Waiting for %s seconds before retrying purchase_verification for the %d time", + secondsString, retries); return waitTimeMilliSeconds; } From 0beb4bcbc4ae1040a673816bd0df72d9ba3372b2 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 17 May 2024 14:47:01 +0200 Subject: [PATCH 136/540] Style: white spaces --- .../src/main/java/com/adjust/sdk/SdkClickHandler.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java index 3f6a1b0ea..bf4b8db07 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -440,7 +440,7 @@ private Map generateSendingParametersI() { * @param retryIn */ private void retrySendingI(final ActivityPackage sdkClickPackage, Long retryIn) { - if (retryIn!= null && retryIn > 0) { + if (retryIn != null && retryIn > 0) { lastPackageRetryInMilli = retryIn; } else { int retries = sdkClickPackage.increaseRetries(); @@ -475,8 +475,9 @@ private void logErrorMessageI(final ActivityPackage sdkClickPackage, */ private long waitTime(int retries) { if (lastPackageRetryInMilli > 0) { - return lastPackageRetryInMilli; + return lastPackageRetryInMilli; } + if (retries > 0) { long waitTimeMilliSeconds = Util.getWaitingTime(retries, backoffStrategy); double waitTimeSeconds = waitTimeMilliSeconds / MILLISECONDS_TO_SECONDS_DIVISOR; From 6c0812ffd86627e084dc0eeae63c6edf654c42f1 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 9 May 2024 19:06:03 +0200 Subject: [PATCH 137/540] feat: add signature lib dependency --- Adjust/sdk-core/build.gradle | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Adjust/sdk-core/build.gradle b/Adjust/sdk-core/build.gradle index 8bbfac067..4d72f4974 100644 --- a/Adjust/sdk-core/build.gradle +++ b/Adjust/sdk-core/build.gradle @@ -207,6 +207,14 @@ def customizePomForAar(pom) { email 'ugljesa@adjust.com' } } + dependencies { + dependency { + groupId 'com.adjust.signature' + artifactId 'adjust-android-signature' + version '4+' + scope 'compile' + } + } } } } From 8be21c4cefa068a4841dc03e34786c11434ab961 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 16 May 2024 14:52:24 +0200 Subject: [PATCH 138/540] fix: signature dependency major version --- Adjust/sdk-core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/build.gradle b/Adjust/sdk-core/build.gradle index 4d72f4974..3cc88a8c1 100644 --- a/Adjust/sdk-core/build.gradle +++ b/Adjust/sdk-core/build.gradle @@ -211,7 +211,7 @@ def customizePomForAar(pom) { dependency { groupId 'com.adjust.signature' artifactId 'adjust-android-signature' - version '4+' + version '3+' scope 'compile' } } From 5b9a3492825685e2cbfca0ea632ca56b0e5a163f Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 10 May 2024 09:58:10 +0200 Subject: [PATCH 139/540] refac: remove adid from attribution --- .../main/java/com/adjust/sdk/AdjustAttribution.java | 10 ++-------- .../com/adjust/sdk/webbridge/AdjustBridgeUtil.java | 1 - .../java/com/adjust/testapp/AdjustCommandExecutor.java | 1 - .../src/main/assets/command_executor.js | 1 - 4 files changed, 2 insertions(+), 11 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java index 6b612104f..16f65ca55 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java @@ -38,7 +38,6 @@ public class AdjustAttribution implements Serializable { public String adgroup; public String creative; public String clickLabel; - public String adid; public String costType; public Double costAmount; public String costCurrency; @@ -59,7 +58,6 @@ public static AdjustAttribution fromJson(JSONObject jsonObject, String adid, Str attribution.adgroup = jsonObject.optString("adgroup", ""); attribution.creative = jsonObject.optString("creative", ""); attribution.clickLabel = jsonObject.optString("click_label", ""); - attribution.adid = adid != null ? adid : ""; attribution.costType = jsonObject.optString("cost_type", ""); attribution.costAmount = jsonObject.optDouble("cost_amount", 0); attribution.costCurrency = jsonObject.optString("cost_currency", ""); @@ -74,7 +72,6 @@ public static AdjustAttribution fromJson(JSONObject jsonObject, String adid, Str attribution.adgroup = jsonObject.optString("adgroup"); attribution.creative = jsonObject.optString("creative"); attribution.clickLabel = jsonObject.optString("click_label"); - attribution.adid = adid; attribution.costType = jsonObject.optString("cost_type"); attribution.costAmount = jsonObject.optDouble("cost_amount"); attribution.costCurrency = jsonObject.optString("cost_currency"); @@ -99,7 +96,6 @@ public boolean equals(Object other) { if (!Util.equalString(adgroup, otherAttribution.adgroup)) return false; if (!Util.equalString(creative, otherAttribution.creative)) return false; if (!Util.equalString(clickLabel, otherAttribution.clickLabel)) return false; - if (!Util.equalString(adid, otherAttribution.adid)) return false; if (!Util.equalString(costType, otherAttribution.costType)) return false; if (!Util.equalsDouble(costAmount, otherAttribution.costAmount)) return false; if (!Util.equalString(costCurrency, otherAttribution.costCurrency)) return false; @@ -119,7 +115,6 @@ public Map toMap() { if (adgroup != null) fields.put("adgroup", adgroup); if (creative != null) fields.put("creative", creative); if (clickLabel != null) fields.put("clickLabel", clickLabel); - if (adid != null) fields.put("adid", adid); if (costType != null) fields.put("costType", costType); if (costAmount != null) fields.put("costAmount", costAmount.toString()); if (costCurrency != null) fields.put("costCurrency", costCurrency); @@ -139,7 +134,6 @@ public int hashCode() { hashCode = Util.hashString(adgroup, hashCode); hashCode = Util.hashString(creative, hashCode); hashCode = Util.hashString(clickLabel, hashCode); - hashCode = Util.hashString(adid, hashCode); hashCode = Util.hashString(costType, hashCode); hashCode = Util.hashDouble(costAmount, hashCode); hashCode = Util.hashString(costCurrency, hashCode); @@ -152,9 +146,9 @@ public int hashCode() { @Override public String toString() { return Util.formatString( - "tt:%s tn:%s net:%s cam:%s adg:%s cre:%s cl:%s adid:%s ct:%s ca:%.2f cc:%s fir:%s st:%s", + "tt:%s tn:%s net:%s cam:%s adg:%s cre:%s cl:%s ct:%s ca:%.2f cc:%s fir:%s st:%s", trackerToken, trackerName, network, campaign, adgroup, creative, clickLabel, - adid, costType, costAmount, costCurrency, fbInstallReferrer, state); + costType, costAmount, costCurrency, fbInstallReferrer, state); } private void writeObject(ObjectOutputStream stream) throws IOException { diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java index 1a6e7cb8e..8009df920 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java @@ -124,7 +124,6 @@ public void run() { jsonAttribution.put("creative", attribution.creative == null ? JSONObject.NULL : attribution.creative); jsonAttribution.put("adgroup", attribution.adgroup == null ? JSONObject.NULL : attribution.adgroup); jsonAttribution.put("clickLabel", attribution.clickLabel == null ? JSONObject.NULL : attribution.clickLabel); - jsonAttribution.put("adid", attribution.adid == null ? JSONObject.NULL : attribution.adid); jsonAttribution.put("costType", attribution.costType == null ? JSONObject.NULL : attribution.costType); jsonAttribution.put("costAmount", attribution.costAmount == null || attribution.costAmount.isNaN() ? 0 : attribution.costAmount); jsonAttribution.put("costCurrency", attribution.costCurrency == null ? JSONObject.NULL : attribution.costCurrency); diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index ae4d48f4c..e51b2b114 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -344,7 +344,6 @@ public void onAttributionChanged(AdjustAttribution attribution) { if (attribution.adgroup != null) fields.put("adgroup", attribution.adgroup); if (attribution.creative != null) fields.put("creative", attribution.creative); if (attribution.clickLabel != null) fields.put("click_label", attribution.clickLabel); - if (attribution.adid != null) fields.put("adid", attribution.adid); if (attribution.costType != null) fields.put("cost_type", attribution.costType); if (attribution.costAmount != null) fields.put("cost_amount", attribution.costAmount.toString()); if (attribution.costCurrency != null) fields.put("cost_currency", attribution.costCurrency); diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index 5cac0ccbf..3244b8dd8 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -331,7 +331,6 @@ AdjustCommandExecutor.prototype.config = function(params) { TestLibrary.addInfoToSend("adgroup", attribution.adgroup); TestLibrary.addInfoToSend("creative", attribution.creative); TestLibrary.addInfoToSend("click_label", attribution.clickLabel); - TestLibrary.addInfoToSend("adid", attribution.adid); TestLibrary.addInfoToSend("cost_type", attribution.costType); TestLibrary.addInfoToSend("cost_amount", attribution.costAmount); TestLibrary.addInfoToSend("cost_currency", attribution.costCurrency); From 78617e4f5460f7e5dd50af8aa3017a7956d10c98 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 10 May 2024 17:16:17 +0200 Subject: [PATCH 140/540] refac: remove `state` from attribution equals method --- .../src/main/java/com/adjust/sdk/AdjustAttribution.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java index 16f65ca55..67e1e5dc4 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java @@ -23,7 +23,6 @@ public class AdjustAttribution implements Serializable { new ObjectStreamField("adgroup", String.class), new ObjectStreamField("creative", String.class), new ObjectStreamField("clickLabel", String.class), - new ObjectStreamField("adid", String.class), new ObjectStreamField("costType", String.class), new ObjectStreamField("costAmount", Double.class), new ObjectStreamField("costCurrency", String.class), @@ -100,8 +99,6 @@ public boolean equals(Object other) { if (!Util.equalsDouble(costAmount, otherAttribution.costAmount)) return false; if (!Util.equalString(costCurrency, otherAttribution.costCurrency)) return false; if (!Util.equalString(fbInstallReferrer, otherAttribution.fbInstallReferrer)) return false; - // TODO: should state participate in the attribution comparison? - if (!Util.equalString(state, otherAttribution.state)) return false; return true; } From baf2e4f6900789880a511d52c81c65becdb1d09b Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 14 May 2024 23:36:52 +0200 Subject: [PATCH 141/540] refac: remove state from attribution --- .../main/java/com/adjust/sdk/AdjustAttribution.java | 10 ++-------- .../com/adjust/sdk/webbridge/AdjustBridgeUtil.java | 1 - .../java/com/adjust/testapp/AdjustCommandExecutor.java | 1 - .../src/main/assets/command_executor.js | 1 - 4 files changed, 2 insertions(+), 11 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java index 67e1e5dc4..3642c779a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java @@ -27,7 +27,6 @@ public class AdjustAttribution implements Serializable { new ObjectStreamField("costAmount", Double.class), new ObjectStreamField("costCurrency", String.class), new ObjectStreamField("fbInstallReferrer", String.class), - new ObjectStreamField("state", String.class), }; public String trackerToken; @@ -41,7 +40,6 @@ public class AdjustAttribution implements Serializable { public Double costAmount; public String costCurrency; public String fbInstallReferrer; - public String state; public static AdjustAttribution fromJson(JSONObject jsonObject, String adid, String sdkPlatform) { if (jsonObject == null) return null; @@ -61,7 +59,6 @@ public static AdjustAttribution fromJson(JSONObject jsonObject, String adid, Str attribution.costAmount = jsonObject.optDouble("cost_amount", 0); attribution.costCurrency = jsonObject.optString("cost_currency", ""); attribution.fbInstallReferrer = jsonObject.optString("fb_install_referrer", ""); - attribution.state = jsonObject.optString("state", ""); } else { // Rest of all platforms. attribution.trackerToken = jsonObject.optString("tracker_token"); @@ -75,7 +72,6 @@ public static AdjustAttribution fromJson(JSONObject jsonObject, String adid, Str attribution.costAmount = jsonObject.optDouble("cost_amount"); attribution.costCurrency = jsonObject.optString("cost_currency"); attribution.fbInstallReferrer = jsonObject.optString("fb_install_referrer"); - attribution.state = jsonObject.optString("state"); } return attribution; @@ -116,7 +112,6 @@ public Map toMap() { if (costAmount != null) fields.put("costAmount", costAmount.toString()); if (costCurrency != null) fields.put("costCurrency", costCurrency); if (fbInstallReferrer != null) fields.put("fbInstallReferrer", fbInstallReferrer); - if (state != null) fields.put("state", state); return fields; } @@ -135,7 +130,6 @@ public int hashCode() { hashCode = Util.hashDouble(costAmount, hashCode); hashCode = Util.hashString(costCurrency, hashCode); hashCode = Util.hashString(fbInstallReferrer, hashCode); - hashCode = Util.hashString(state, hashCode); return hashCode; } @@ -143,9 +137,9 @@ public int hashCode() { @Override public String toString() { return Util.formatString( - "tt:%s tn:%s net:%s cam:%s adg:%s cre:%s cl:%s ct:%s ca:%.2f cc:%s fir:%s st:%s", + "tt:%s tn:%s net:%s cam:%s adg:%s cre:%s cl:%s ct:%s ca:%.2f cc:%s fir:%s", trackerToken, trackerName, network, campaign, adgroup, creative, clickLabel, - costType, costAmount, costCurrency, fbInstallReferrer, state); + costType, costAmount, costCurrency, fbInstallReferrer); } private void writeObject(ObjectOutputStream stream) throws IOException { diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java index 8009df920..a48c45dfb 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java @@ -128,7 +128,6 @@ public void run() { jsonAttribution.put("costAmount", attribution.costAmount == null || attribution.costAmount.isNaN() ? 0 : attribution.costAmount); jsonAttribution.put("costCurrency", attribution.costCurrency == null ? JSONObject.NULL : attribution.costCurrency); jsonAttribution.put("fbInstallReferrer", attribution.fbInstallReferrer == null ? JSONObject.NULL : attribution.fbInstallReferrer); - jsonAttribution.put("state", attribution.state == null ? JSONObject.NULL : attribution.state); String command = "javascript:" + commandName + "(" + jsonAttribution.toString() + ");"; webView.loadUrl(command); diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index e51b2b114..acc9bcfd5 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -348,7 +348,6 @@ public void onAttributionChanged(AdjustAttribution attribution) { if (attribution.costAmount != null) fields.put("cost_amount", attribution.costAmount.toString()); if (attribution.costCurrency != null) fields.put("cost_currency", attribution.costCurrency); if (attribution.fbInstallReferrer != null) fields.put("fb_install_referrer", attribution.fbInstallReferrer); - if (attribution.state != null) fields.put("state", attribution.state); MainActivity.testLibrary.setInfoToSend(fields); MainActivity.testLibrary.sendInfoToServer(localBasePath); } diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index 3244b8dd8..1b4bc6a49 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -335,7 +335,6 @@ AdjustCommandExecutor.prototype.config = function(params) { TestLibrary.addInfoToSend("cost_amount", attribution.costAmount); TestLibrary.addInfoToSend("cost_currency", attribution.costCurrency); TestLibrary.addInfoToSend("fb_install_referrer", attribution.fbInstallReferrer); - TestLibrary.addInfoToSend("state", attribution.state); TestLibrary.sendInfoToServer(basePath); }); From 9e35091093bfc33f931d1aba1b753ecbb2a87ea2 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 17 May 2024 11:35:56 +0200 Subject: [PATCH 142/540] refac:remove test-unit module --- Adjust/settings.gradle | 2 +- Adjust/test-unit/build.gradle | 29 - .../java/com/adjust/sdk/ApplicationTest.java | 13 - .../java/com/adjust/sdk/AssertUtil.java | 143 - .../com/adjust/sdk/MockActivityHandler.java | 151 - .../adjust/sdk/MockAttributionHandler.java | 60 - .../adjust/sdk/MockHttpsURLConnection.java | 366 -- .../java/com/adjust/sdk/MockLogger.java | 198 - .../com/adjust/sdk/MockPackageHandler.java | 73 - .../com/adjust/sdk/MockRequestHandler.java | 40 - .../com/adjust/sdk/MockSdkClickHandler.java | 45 - .../java/com/adjust/sdk/ResponseType.java | 8 - .../sdk/StateActivityHandlerConstructor.java | 21 - .../adjust/sdk/StateActivityHandlerInit.java | 31 - .../java/com/adjust/sdk/StateDelegates.java | 12 - .../java/com/adjust/sdk/StateEndSession.java | 13 - .../java/com/adjust/sdk/StateEvent.java | 13 - .../java/com/adjust/sdk/StateSession.java | 34 - .../com/adjust/sdk/TestActivityHandler.java | 3468 ----------------- .../com/adjust/sdk/TestActivityPackage.java | 476 --- .../adjust/sdk/TestAttributionHandler.java | 465 --- .../com/adjust/sdk/TestPackageHandler.java | 581 --- .../com/adjust/sdk/TestRequestHandler.java | 221 -- .../com/adjust/sdk/TestSdkClickHandler.java | 328 -- Adjust/test-unit/src/main/AndroidManifest.xml | 35 - .../com/adjust/sdk/test/UnitTestActivity.java | 38 - .../main/res/drawable-hdpi/ic_launcher.png | Bin 9397 -> 0 bytes .../main/res/drawable-mdpi/ic_launcher.png | Bin 5237 -> 0 bytes .../main/res/drawable-xhdpi/ic_launcher.png | Bin 14383 -> 0 bytes .../main/res/drawable-xxhdpi/ic_launcher.png | Bin 19388 -> 0 bytes .../main/res/layout/activity_unit_test.xml | 16 - .../src/main/res/menu/menu_unit_test.xml | 8 - .../src/main/res/values-w820dp/dimens.xml | 6 - .../test-unit/src/main/res/values/dimens.xml | 5 - .../test-unit/src/main/res/values/strings.xml | 8 - 35 files changed, 1 insertion(+), 6906 deletions(-) delete mode 100644 Adjust/test-unit/build.gradle delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/ApplicationTest.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/AssertUtil.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockActivityHandler.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockAttributionHandler.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockHttpsURLConnection.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockLogger.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockPackageHandler.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockRequestHandler.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockSdkClickHandler.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/ResponseType.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateActivityHandlerConstructor.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateActivityHandlerInit.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateDelegates.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateEndSession.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateEvent.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateSession.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestActivityPackage.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestAttributionHandler.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestPackageHandler.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestRequestHandler.java delete mode 100644 Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestSdkClickHandler.java delete mode 100644 Adjust/test-unit/src/main/AndroidManifest.xml delete mode 100644 Adjust/test-unit/src/main/java/com/adjust/sdk/test/UnitTestActivity.java delete mode 100644 Adjust/test-unit/src/main/res/drawable-hdpi/ic_launcher.png delete mode 100644 Adjust/test-unit/src/main/res/drawable-mdpi/ic_launcher.png delete mode 100644 Adjust/test-unit/src/main/res/drawable-xhdpi/ic_launcher.png delete mode 100644 Adjust/test-unit/src/main/res/drawable-xxhdpi/ic_launcher.png delete mode 100644 Adjust/test-unit/src/main/res/layout/activity_unit_test.xml delete mode 100644 Adjust/test-unit/src/main/res/menu/menu_unit_test.xml delete mode 100644 Adjust/test-unit/src/main/res/values-w820dp/dimens.xml delete mode 100644 Adjust/test-unit/src/main/res/values/dimens.xml delete mode 100644 Adjust/test-unit/src/main/res/values/strings.xml diff --git a/Adjust/settings.gradle b/Adjust/settings.gradle index 14dd56931..9c17cf0b7 100644 --- a/Adjust/settings.gradle +++ b/Adjust/settings.gradle @@ -1,3 +1,3 @@ include ':sdk-core', ':sdk-plugin-webbridge', ':sdk-plugin-oaid', ':sdk-plugin-sociomantic', ':sdk-plugin-trademob', ':sdk-plugin-imei', ':sdk-plugin-criteo', ':sdk-plugin-xiaomi-referrer', ':sdk-plugin-samsung-referrer', ':sdk-plugin-vivo-referrer', ':sdk-plugin-samsung-clouddev', ':sdk-plugin-huawei-referrer', ':sdk-plugin-meta-referrer' -include ':test-options', ':test-unit', ':test-library', ':test-app-core', ':test-kotlin', ':test-app-webbridge' +include ':test-options', ':test-library', ':test-app-core', ':test-kotlin', ':test-app-webbridge' include ':example-app-java', ':example-app-kotlin', ':example-app-tv', ':example-app-webbridge', ':example-app-fbpixel', ':example-app-keyboard' diff --git a/Adjust/test-unit/build.gradle b/Adjust/test-unit/build.gradle deleted file mode 100644 index c784750b6..000000000 --- a/Adjust/test-unit/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -apply plugin: 'com.android.library' - -android { - compileSdk 34 - - defaultConfig { - minSdkVersion 9 - targetSdkVersion 34 - } - defaultConfig { - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - namespace 'com.adjust.sdk.test' -} - -repositories { - mavenCentral() -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.31' - androidTestImplementation 'androidx.test:runner:1.4.0' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' - implementation 'com.google.code.gson:gson:2.8.6' - implementation 'com.google.android.gms:play-services-ads-identifier:17.1.0' - - testImplementation project(path: ':sdk-core') -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/ApplicationTest.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/ApplicationTest.java deleted file mode 100644 index 77072ab2c..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/ApplicationTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.adjust.sdk; - -import android.app.Application; -import android.test.ApplicationTestCase; - -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/AssertUtil.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/AssertUtil.java deleted file mode 100644 index b3a637dcf..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/AssertUtil.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.adjust.sdk; - -import android.net.Uri; - -import junit.framework.Assert; - -import java.util.Locale; - -import static com.adjust.sdk.LogLevel.ASSERT; -import static com.adjust.sdk.LogLevel.DEBUG; -import static com.adjust.sdk.LogLevel.ERROR; -import static com.adjust.sdk.LogLevel.INFO; -import static com.adjust.sdk.LogLevel.VERBOSE; -import static com.adjust.sdk.LogLevel.WARN; - -/** - * Created by pfms on 09/01/15. - */ -public class AssertUtil { - private MockLogger mockLogger; - - public AssertUtil(MockLogger mockLogger) { - this.mockLogger = mockLogger; - } - - public String test(String message, Object... parameters) { - MockLogger.ContainsReturn containsTestMessage = mockLogger.containsTestMessage(String.format(Locale.US, message, parameters)); - Assert.assertTrue(mockLogger.toString(), containsTestMessage.containsMessage); - return containsTestMessage.matchMessage; - } - - public String verbose(String message, Object... parameters) { - MockLogger.ContainsReturn containsVerboseMessage = mockLogger.containsMessage(VERBOSE, String.format(Locale.US, message, parameters)); - Assert.assertTrue(mockLogger.toString(), containsVerboseMessage.containsMessage); - return containsVerboseMessage.matchMessage; - } - - public String debug(String message, Object... parameters) { - MockLogger.ContainsReturn containsDebugMessage = mockLogger.containsMessage(DEBUG, String.format(Locale.US, message, parameters)); - Assert.assertTrue(mockLogger.toString(), containsDebugMessage.containsMessage); - return containsDebugMessage.matchMessage; - } - - public String info(String message, Object... parameters) { - MockLogger.ContainsReturn containsInfoMessage = mockLogger.containsMessage(INFO, String.format(Locale.US, message, parameters)); - Assert.assertTrue(mockLogger.toString(), containsInfoMessage.containsMessage); - return containsInfoMessage.matchMessage; - } - - public String warn(String message, Object... parameters) { - MockLogger.ContainsReturn containsWarnMessage = mockLogger.containsMessage(WARN, String.format(Locale.US, message, parameters)); - Assert.assertTrue(mockLogger.toString(), containsWarnMessage.containsMessage); - return containsWarnMessage.matchMessage; - } - - public String error(String message, Object... parameters) { - MockLogger.ContainsReturn containsErrorMessage = mockLogger.containsMessage(ERROR, String.format(Locale.US, message, parameters)); - Assert.assertTrue(mockLogger.toString(), containsErrorMessage.containsMessage); - return containsErrorMessage.matchMessage; - } - - public String Assert(String message, Object... parameters) { - MockLogger.ContainsReturn containsAssertMessage = mockLogger.containsMessage(ASSERT, String.format(Locale.US, message, parameters)); - Assert.assertTrue(mockLogger.toString(), containsAssertMessage.containsMessage); - return containsAssertMessage.matchMessage; - } - - public void notInTest(String message, Object... parameters) { - MockLogger.ContainsReturn containsTestMessage = mockLogger.containsTestMessage(String.format(Locale.US, message, parameters)); - Assert.assertFalse(mockLogger.toString(), containsTestMessage.containsMessage); - } - - public void notInVerbose(String message, Object... parameters) { - MockLogger.ContainsReturn containsVerboseMessage = mockLogger.containsMessage(VERBOSE, String.format(Locale.US, message, parameters)); - Assert.assertFalse(mockLogger.toString(), containsVerboseMessage.containsMessage); - } - - public void notInDebug(String message, Object... parameters) { - MockLogger.ContainsReturn containsDebugMessage = mockLogger.containsMessage(DEBUG, String.format(Locale.US, message, parameters)); - Assert.assertFalse(mockLogger.toString(), containsDebugMessage.containsMessage); - } - - public void notInInfo(String message, Object... parameters) { - MockLogger.ContainsReturn containsInfoMessage = mockLogger.containsMessage(INFO, String.format(Locale.US, message, parameters)); - Assert.assertFalse(mockLogger.toString(), containsInfoMessage.containsMessage); - } - - public void notInWarn(String message, Object... parameters) { - MockLogger.ContainsReturn containsWarnMessage = mockLogger.containsMessage(WARN, String.format(Locale.US, message, parameters)); - Assert.assertFalse(mockLogger.toString(), containsWarnMessage.containsMessage); - } - - public void notInError(String message, Object... parameters) { - MockLogger.ContainsReturn containsErrorMessage = mockLogger.containsMessage(ERROR, String.format(Locale.US, message, parameters)); - Assert.assertFalse(mockLogger.toString(), containsErrorMessage.containsMessage); - } - - public void notInAssert(String message, Object... parameters) { - MockLogger.ContainsReturn containsAssertMessage = mockLogger.containsMessage(ASSERT, String.format(Locale.US, message, parameters)); - Assert.assertFalse(mockLogger.toString(), containsAssertMessage.containsMessage); - } - - public void isNull(Object object) { - Assert.assertNull(mockLogger.toString(), object); - } - - public void isNotNull(Object object) { - Assert.assertNotNull(mockLogger.toString(), object); - } - - public void isTrue(boolean value) { - Assert.assertTrue(mockLogger.toString(), value); - } - - public void isFalse(boolean value) { - Assert.assertFalse(mockLogger.toString(), value); - } - - public void isEqual(String expected, String actual) { - Assert.assertEquals(mockLogger.toString(), expected, actual); - } - - public void isEqual(boolean expected, boolean actual) { - Assert.assertEquals(mockLogger.toString(), expected, actual); - } - - public void isEqual(int expected, int actual) { - Assert.assertEquals(mockLogger.toString(), expected, actual); - } - - public void isEqual(Uri expected, Uri actual) { - Assert.assertEquals(mockLogger.toString(), expected, actual); - } - - public void fail() { - Assert.fail(mockLogger.toString()); - } - - public void fail(String extraMessage) { - Assert.fail(extraMessage + "\n" + mockLogger.toString()); - } - -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockActivityHandler.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockActivityHandler.java deleted file mode 100644 index 84662e9ef..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockActivityHandler.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.adjust.sdk; - -import android.net.Uri; - - -/** - * Created by pfms on 09/01/15. - */ -public class MockActivityHandler implements IActivityHandler { - private MockLogger testLogger; - private String prefix = "ActivityHandler "; - private AdjustConfig config; - private ResponseData lastResponseData; - - public MockActivityHandler(MockLogger testLogger) { - this.testLogger = testLogger; - } - - @Override - public void init(AdjustConfig config) { - testLogger.test(prefix + "init"); - this.config = config; - } - - @Override - public void onResume() { - testLogger.test(prefix + "onResume"); - } - - @Override - public void onPause() { - testLogger.test(prefix + "onPause"); - } - - @Override - public void trackEvent(AdjustEvent event) { - testLogger.test(prefix + "trackEvent, " + event); - } - - @Override - public void finishedTrackingActivity(ResponseData responseData) { - testLogger.test(prefix + "finishedTrackingActivity, " + responseData); - this.lastResponseData = responseData; - } - - @Override - public void setEnabled(boolean enabled) { - testLogger.test(prefix + "setEnabled, " + enabled); - } - - @Override - public boolean isEnabled() { - testLogger.test(prefix + "isEnabled"); - return false; - } - - @Override - public void readOpenUrl(Uri url, long clickTime) { - testLogger.test(prefix + "readOpenUrl, " + url + ". ClickTime, " + clickTime); - } - - @Override - public boolean updateAttributionI(AdjustAttribution attribution) { - testLogger.test(prefix + "updateAttributionI, " + attribution); - return false; - } - - @Override - public void launchEventResponseTasks(EventResponseData eventResponseData) { - testLogger.test(prefix + "launchEventResponseTasks, " + eventResponseData); - this.lastResponseData = eventResponseData; - } - - @Override - public void launchSessionResponseTasks(SessionResponseData sessionResponseData) { - testLogger.test(prefix + "launchSessionResponseTasks, " + sessionResponseData); - this.lastResponseData = sessionResponseData; - } - - @Override - public void launchSdkClickResponseTasks(SdkClickResponseData sdkClickResponseData) { - testLogger.test(prefix + "launchSdkClickResponseTasks, " + sdkClickResponseData); - this.lastResponseData = sdkClickResponseData; - } - - @Override - public void launchAttributionResponseTasks(AttributionResponseData attributionResponseData) { - testLogger.test(prefix + "launchAttributionResponseTasks, " + attributionResponseData); - this.lastResponseData = attributionResponseData; - } - - @Override - public void sendReferrer(String referrer, long clickTime) { - testLogger.test(prefix + "sendReferrer, " + referrer + ". ClickTime, " + clickTime); - } - - @Override - public void setOfflineMode(boolean enabled) { - testLogger.test(prefix + "setOfflineMode, " + enabled); - } - - @Override - public void setAskingAttribution(boolean askingAttribution) { - testLogger.test(prefix + "setAskingAttribution, " + askingAttribution); - } - - @Override - public void sendFirstPackages() { - testLogger.test(prefix + "sendFirstPackages"); - } - - @Override - public void addSessionCallbackParameter(String key, String value) { - testLogger.test(prefix + "addSessionCallbackParameter key, " + key + ", value, " + value); - } - - @Override - public void addSessionPartnerParameter(String key, String value) { - testLogger.test(prefix + "addSessionPartnerParameter key, " + key + ", value, " + value); - } - - @Override - public void removeSessionCallbackParameter(String key) { - testLogger.test(prefix + "removeSessionCallbackParameter, " + key); - } - - @Override - public void removeSessionPartnerParameter(String key) { - testLogger.test(prefix + "removeSessionPartnerParameter, " + key); - } - - @Override - public void resetSessionCallbackParameters() { - testLogger.test(prefix + "resetSessionCallbackParameters"); - } - - @Override - public void resetSessionPartnerParameters() { - testLogger.test(prefix + "resetSessionPartnerParameters"); - } - - @Override - public void teardown(boolean deleteState) { - testLogger.test(prefix + "teardown deleteState, " + deleteState); - } - - @Override - public void setPushToken(String token) { - testLogger.test(prefix + "setPushToken token, " + token); - } -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockAttributionHandler.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockAttributionHandler.java deleted file mode 100644 index cc4e23c44..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockAttributionHandler.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.adjust.sdk; - -/** - * Created by pfms on 09/01/15. - */ -public class MockAttributionHandler implements IAttributionHandler { - private MockLogger testLogger; - private String prefix = "AttributionHandler "; - IActivityHandler activityHandler; - ActivityPackage attributionPackage; - SessionResponseData lastSessionResponseData; - SdkClickResponseData lastSdkClickResponseData; - - public MockAttributionHandler(MockLogger testLogger) { - this.testLogger = testLogger; - } - - @Override - public void init(IActivityHandler activityHandler, - ActivityPackage attributionPackage, - boolean startsSending) { - testLogger.test(prefix + "init, startsSending: " + startsSending); - this.activityHandler = activityHandler; - this.attributionPackage = attributionPackage; - } - - @Override - public void getAttribution() { - testLogger.test(prefix + "getAttribution"); - } - - @Override - public void checkSessionResponse(SessionResponseData sessionResponseData) { - testLogger.test(prefix + "checkSessionResponse"); - - this.lastSessionResponseData = sessionResponseData; - } - - @Override - public void checkSdkClickResponse(SdkClickResponseData sdkClickResponseData) { - testLogger.test(prefix + "checkSdkClickResponse"); - - this.lastSdkClickResponseData = sdkClickResponseData; - } - - @Override - public void pauseSending() { - testLogger.test(prefix + "pauseSending"); - } - - @Override - public void resumeSending() { - testLogger.test(prefix + "resumeSending"); - } - - @Override - public void teardown() { - testLogger.test(prefix + "teardown"); - } -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockHttpsURLConnection.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockHttpsURLConnection.java deleted file mode 100644 index bcd512adc..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockHttpsURLConnection.java +++ /dev/null @@ -1,366 +0,0 @@ -package com.adjust.sdk; - -import android.os.SystemClock; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.net.ProtocolException; -import java.net.URL; -import java.nio.charset.Charset; -import java.security.Permission; -import java.security.cert.Certificate; -import java.util.List; -import java.util.Map; - -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLPeerUnverifiedException; - -/** - * Created by pfms on 20/08/15. - */ -public class MockHttpsURLConnection extends HttpsURLConnection { - - private MockLogger testLogger; - private String prefix = "MockHttpsURLConnection "; - private ByteArrayOutputStream outputStream; - public ResponseType responseType; - public boolean timeout; - public Long waitingTime; - - protected MockHttpsURLConnection(URL url) { - super(url); - } - - public MockHttpsURLConnection(URL url, MockLogger mockLogger) { - this(url); - this.testLogger = mockLogger; - } - - public InputStream getInputStream() throws IOException { - testLogger.test(prefix + "getInputStream, responseType: " + responseType); - - if (timeout) { - SystemClock.sleep(10000); - } - - if (waitingTime != null) { - SystemClock.sleep(waitingTime); - } - - if (responseType == ResponseType.CLIENT_PROTOCOL_EXCEPTION) { - throw new IOException ("testResponseError"); - } else if (responseType == ResponseType.WRONG_JSON) { - return getMockResponse("not a json response"); - } else if (responseType == ResponseType.EMPTY_JSON) { - return getMockResponse("{ }"); - } else if (responseType == ResponseType.MESSAGE) { - return getMockResponse("{ \"message\" : \"response OK\"}"); - } - return null; - } - - public InputStream getErrorStream() { - testLogger.test(prefix + "getErrorStream, responseType: " + responseType); - try { - if (responseType == ResponseType.INTERNAL_SERVER_ERROR) { - return getMockResponse("{ \"message\": \"testResponseError\"}"); - } - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - private InputStream getMockResponse(String response) - throws IOException { - - InputStream stream = new ByteArrayInputStream(response.getBytes(Charset.forName("UTF-8"))); - - return stream; - } - - - public String readRequest() { - String out = null; - try { - out = new String(outputStream.toByteArray(), "UTF-8"); - } catch (UnsupportedEncodingException e) { - testLogger.test("readRequest, UnsupportedEncodingException " + e.getMessage()); - } - return out; - } - - @Override - public void disconnect() { - testLogger.test(prefix + "disconnect"); - } - - @Override - public boolean usingProxy() { - testLogger.test(prefix + "usingProxy"); - return false; - } - - @Override - public void connect() throws IOException { - testLogger.test(prefix + "connect"); - } - - public Permission getPermission() throws IOException { - testLogger.test(prefix + "getPermission"); - return null; - } - - public String getRequestMethod() { - testLogger.test(prefix + "getRequestMethod"); - return null; - } - - public int getResponseCode() throws IOException { - testLogger.test(prefix + "getResponseCode"); - if (responseType == ResponseType.INTERNAL_SERVER_ERROR) { - return HttpsURLConnection.HTTP_INTERNAL_ERROR; - } else { - return HttpsURLConnection.HTTP_OK; - } - } - - public String getResponseMessage() throws IOException { - testLogger.test(prefix + "getResponseMessage"); - return null; - } - - public void setRequestMethod(String method) throws ProtocolException { - testLogger.test(prefix + "setRequestMethod, method " + method); - super.setRequestMethod(method); - } - - public String getContentEncoding() { - testLogger.test(prefix + "getContentEncoding"); - return null; - } - - public boolean getInstanceFollowRedirects() { - testLogger.test(prefix + "getInstanceFollowRedirects"); - return false; - } - - public void setInstanceFollowRedirects(boolean followRedirects) { - testLogger.test(prefix + "setInstanceFollowRedirects, followRedirects " + followRedirects); - } - - public long getHeaderFieldDate(String field, long defaultValue) { - testLogger.test(prefix + "getHeaderFieldDate, field " + field + ", defaultValue " + defaultValue); - return 0; - } - - public void setFixedLengthStreamingMode(long contentLength) { - testLogger.test(prefix + "setFixedLengthStreamingMode, contentLength " + contentLength); - } - - public void setFixedLengthStreamingMode(int contentLength) { - testLogger.test(prefix + "setFixedLengthStreamingMode, contentLength " + contentLength); - } - - public void setChunkedStreamingMode(int chunkLength) { - testLogger.test(prefix + "setChunkedStreamingMode, chunkLength " + chunkLength); - } - - public boolean getAllowUserInteraction() { - testLogger.test(prefix + "getAllowUserInteraction"); - return false; - } - - public Object getContent() throws IOException { - testLogger.test(prefix + "getReferrer"); - return null; - } - - public Object getContent(Class[] types) throws IOException { - testLogger.test(prefix + "getReferrer, types " + types); - return null; - } - - public int getContentLength() { - testLogger.test(prefix + "getContentLength"); - return 0; - } - - public String getContentType() { - testLogger.test(prefix + "getContentLength"); - return null; - } - - public long getDate() { - testLogger.test(prefix + "getDate"); - return 0; - } - - public boolean getDefaultUseCaches() { - testLogger.test(prefix + "getDefaultUseCaches"); - return false; - } - - public boolean getDoInput() { - testLogger.test(prefix + "getDoInput"); - return false; - } - - public boolean getDoOutput() { - testLogger.test(prefix + "getDoOutput"); - return false; - } - - public long getExpiration() { - testLogger.test(prefix + "getExpiration"); - return 0; - } - - public String getHeaderField(int pos) { - testLogger.test(prefix + "getHeaderField, pos " + pos); - return null; - } - - public Map> getHeaderFields() { - testLogger.test(prefix + "getHeaderFields"); - return null; - } - - public Map> getRequestProperties() { - testLogger.test(prefix + "getRequestProperties"); - return null; - } - - public void addRequestProperty(String field, String newValue) { - testLogger.test(prefix + "addRequestProperty, field " + field + ", newValue " + newValue); - } - - public String getHeaderField(String key) { - testLogger.test(prefix + "getHeaderField, key " + key); - return null; - } - - public int getHeaderFieldInt(String field, int defaultValue) { - testLogger.test(prefix + "getHeaderFieldInt, field " + field + ", defaultValue " + defaultValue); - return 0; - } - - public String getHeaderFieldKey(int posn) { - testLogger.test(prefix + "getHeaderFieldKey, " + posn); - return null; - } - - public long getIfModifiedSince() { - testLogger.test(prefix + "getIfModifiedSince"); - return 0; - } - - public long getLastModified() { - testLogger.test(prefix + "getLastModified"); - return 0; - } - - public OutputStream getOutputStream() throws IOException { - testLogger.test(prefix + "getOutputStream"); - outputStream = new ByteArrayOutputStream(); - return outputStream; - } - - public String getRequestProperty(String field) { - testLogger.test(prefix + "getRequestProperty, field " + field); - return null; - } - - public URL getURL() { - testLogger.test(prefix + "getURL"); - return this.url; - } - - public void setURL(URL url) { - testLogger.test(prefix + "setURL, " + url); - - } - - public boolean getUseCaches() { - testLogger.test(prefix + "getUseCaches"); - return false; - } - - public void setAllowUserInteraction(boolean newValue) { - testLogger.test(prefix + "setAllowUserInteraction, newValue " + newValue); - } - - public void setDefaultUseCaches(boolean newValue) { - testLogger.test(prefix + "setDefaultUseCaches, newValue " + newValue); - } - - public void setDoInput(boolean newValue) { - testLogger.test(prefix + "setDoInput, newValue " + newValue); - super.setDoInput(newValue); - } - - public void setDoOutput(boolean newValue) { - testLogger.test(prefix + "setDoOutput, newValue " + newValue); - super.setDoOutput(newValue); - } - - public void setIfModifiedSince(long newValue) { - testLogger.test(prefix + "setIfModifiedSince, newValue " + newValue); - } - - public void setRequestProperty(String field, String newValue) { - testLogger.test(prefix + "setRequestProperty, field " + field + ", newValue " + newValue); - super.setRequestProperty(field, newValue); - } - - public void setUseCaches(boolean newValue) { - testLogger.test(prefix + "setUseCaches, newValue " + newValue); - super.setUseCaches(newValue); - } - - public void setConnectTimeout(int timeoutMillis) { - testLogger.test(prefix + "setConnectTimeout, timeoutMillis " + timeoutMillis); - super.setConnectTimeout(timeoutMillis); - } - - public int getConnectTimeout() { - testLogger.test(prefix + "getConnectTimeout"); - return 0; - } - - public void setReadTimeout(int timeoutMillis) { - testLogger.test(prefix + "setReadTimeout, timeoutMillis " + timeoutMillis); - } - - public int getReadTimeout() { - testLogger.test(prefix + "getReadTimeout"); - return 0; - } - - public String toString() { - testLogger.test(prefix + "toString"); - return null; - } - - @Override - public String getCipherSuite() { - testLogger.test(prefix + "getCipherSuite"); - return null; - } - - @Override - public Certificate[] getLocalCertificates() { - testLogger.test(prefix + "getLocalCertificates"); - return new Certificate[0]; - } - - @Override - public Certificate[] getServerCertificates() throws SSLPeerUnverifiedException { - testLogger.test(prefix + "getServerCertificates"); - return new Certificate[0]; - } -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockLogger.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockLogger.java deleted file mode 100644 index 18ad6292a..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockLogger.java +++ /dev/null @@ -1,198 +0,0 @@ -package com.adjust.sdk; - -import android.util.Log; -import android.util.SparseArray; - -import com.adjust.sdk.ILogger; -import com.adjust.sdk.LogLevel; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; - -import static com.adjust.sdk.Constants.LOGTAG; - -public class MockLogger implements ILogger { - - private StringBuffer logBuffer; - private SparseArray> logMap; - public static final int TEST_LEVEL = 6; - public static final int CHECK_LEVEL = 7; - private long startTime; - private long lastTime; - - public class ContainsReturn { - boolean containsMessage; - String matchMessage; - ContainsReturn(boolean containsMessage, String matchMessage) { - this.containsMessage = containsMessage; - this.matchMessage = matchMessage; - } - } - - public MockLogger() { - reset(); - } - - public void reset() { - startTime = System.currentTimeMillis(); - lastTime = startTime; - - logBuffer = new StringBuffer(); - logMap = new SparseArray>(8); - logMap.put(LogLevel.VERBOSE.getAndroidLogLevel(), new ArrayList()); - logMap.put(LogLevel.DEBUG.getAndroidLogLevel(), new ArrayList()); - logMap.put(LogLevel.INFO.getAndroidLogLevel(), new ArrayList()); - logMap.put(LogLevel.WARN.getAndroidLogLevel(), new ArrayList()); - logMap.put(LogLevel.ERROR.getAndroidLogLevel(), new ArrayList()); - logMap.put(LogLevel.ASSERT.getAndroidLogLevel(), new ArrayList()); - logMap.put(TEST_LEVEL, new ArrayList()); - logMap.put(CHECK_LEVEL, new ArrayList()); - - test("Logger reset"); - } - - @Override - public String toString() { - String logging = logBuffer.toString(); - //Log.v("TestLogger ", logging); - return logging; - } - - @Override - public void setLogLevel(LogLevel logLevel, boolean isProductionEnvironment) { - test("MockLogger setLogLevel: " + logLevel + ", isProductionEnvironment: " + isProductionEnvironment); - } - - @Override - public void setLogLevelString(String logLevelString, boolean isProductionEnvironment) { - test("MockLogger setLogLevelString: " + logLevelString + ", isProductionEnvironment: " + isProductionEnvironment); - } - - private void logMessage(String message, Integer iLoglevel, String messagePrefix, int priority) { - long now = System.currentTimeMillis(); - long milliSecondsPassed = now - startTime; - long lastTimePassed = now - lastTime; - lastTime = now; - - List prefixedList = logMap.get(iLoglevel); - prefixedList.add(message); - - String longMessage = String.format("%d %d %s %s", milliSecondsPassed, lastTimePassed, messagePrefix, message); - Log.println(priority, LOGTAG, longMessage); - - String logBufferMessage = String.format("%s%s", longMessage, System.getProperty("line.separator")); - logBuffer.append(logBufferMessage); - //String sList = Arrays.toString(prefixedList.toArray()); - //String logBufferList = String.format("In %s", sList); - //logBuffer.append(logBufferList); - } - - @Override - public void verbose(String message, Object... parameters) { - logMessage(String.format(Locale.US, message, parameters), - LogLevel.VERBOSE.getAndroidLogLevel(), - "v", - Log.VERBOSE); - } - - @Override - public void debug(String message, Object... parameters) { - logMessage(String.format(Locale.US, message, parameters), - LogLevel.DEBUG.getAndroidLogLevel(), - "d", - Log.DEBUG); - } - - @Override - public void info(String message, Object... parameters) { - logMessage(String.format(Locale.US, message, parameters), - LogLevel.INFO.getAndroidLogLevel(), - "i", - Log.INFO); - } - - @Override - public void warn(String message, Object... parameters) { - logMessage(String.format(Locale.US, message, parameters), - LogLevel.WARN.getAndroidLogLevel(), - "w", - Log.WARN); - } - - @Override - public void warnInProduction(String message, Object... parameters) { - logMessage(String.format(Locale.US, message, parameters), - LogLevel.WARN.getAndroidLogLevel(), - "w", - Log.WARN); - } - - @Override - public void error(String message, Object... parameters) { - logMessage(String.format(Locale.US, message, parameters), - LogLevel.ERROR.getAndroidLogLevel(), - "e", - Log.ERROR); - } - - @Override - public void Assert(String message, Object... parameters) { - logMessage(String.format(Locale.US, message, parameters), - LogLevel.ASSERT.getAndroidLogLevel(), - "a", - Log.ASSERT); - } - - @Override - public void lockLogLevel() { - test("MockLogger lockLogLevel"); - } - - public void test(String message) { - logMessage(message, TEST_LEVEL, "t", Log.VERBOSE); - } - - private void check(String message) { - logMessage(message, CHECK_LEVEL, "c", Log.VERBOSE); - } - - private ContainsReturn mapContainsMessage(int level, String beginsWith) { - ArrayList list = logMap.get(level); - @SuppressWarnings("unchecked") - ArrayList listCopy = new ArrayList(list); - String sList = Arrays.toString(list.toArray()); - for (String log : list) { - listCopy.remove(0); - if (log.startsWith(beginsWith)) { - String foundMessage = String.format(Locale.US, "%s found", log); - //Log.println(Log.ASSERT, LOGTAG, foundMessage); - check(foundMessage); - logMap.put(level, listCopy); - return new ContainsReturn(true, log); - } - } - String notFoundMessage = String.format(Locale.US, "%s is not in %s", beginsWith, sList); - check(notFoundMessage); - //Log.println(Log.ASSERT, LOGTAG, notFoundMessage); - - return new ContainsReturn(false, null); - } - - public ContainsReturn containsMessage(LogLevel level, String beginsWith) { - return mapContainsMessage(level.getAndroidLogLevel(), beginsWith); - } - - public ContainsReturn containsTestMessage(String beginsWith) { - return mapContainsMessage(TEST_LEVEL, beginsWith); - } - - public void printLogMap(int level) { - ArrayList list = logMap.get(level); - String sList = Arrays.toString(list.toArray()); - - String message = String.format(Locale.US, "list level %d: %s", level, sList); - check(message); - } -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockPackageHandler.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockPackageHandler.java deleted file mode 100644 index 2c9742f40..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockPackageHandler.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.adjust.sdk; - -import android.content.Context; - -import java.util.ArrayList; -import java.util.List; - -public class MockPackageHandler implements IPackageHandler { - private MockLogger testLogger; - private String prefix = "PackageHandler "; - IActivityHandler activityHandler; - List queue; - Context context; - - public MockPackageHandler(MockLogger testLogger) { - this.testLogger = testLogger; - } - - @Override - public void init(IActivityHandler activityHandler, Context context, boolean startsSending) { - testLogger.test(prefix + "init, startsSending: " + startsSending); - this.activityHandler = activityHandler; - this.context = context; - this.queue = new ArrayList(); - } - - @Override - public void addPackage(ActivityPackage pack) { - testLogger.test(prefix + "addPackage"); - queue.add(pack); - } - - @Override - public void sendFirstPackage() { - testLogger.test(prefix + "sendFirstPackage"); - /* - if (activityHandler != null) { - activityHandler.finishedTrackingActivity(jsonResponse); - } - */ - } - - @Override - public void sendNextPackage(ResponseData responseData) { - testLogger.test(prefix + "sendNextPackage, " + responseData); - } - - @Override - public void closeFirstPackage(ResponseData responseData, ActivityPackage activityPackage) { - testLogger.test(prefix + "closeFirstPackage, responseData" + responseData); - testLogger.test(prefix + "closeFirstPackage, activityPackage" + activityPackage); - } - - @Override - public void pauseSending() { - testLogger.test(prefix + "pauseSending"); - } - - @Override - public void resumeSending() { - testLogger.test(prefix + "resumeSending"); - } - - @Override - public void updatePackages(SessionParameters sessionParameters) { - testLogger.test(prefix + "updatePackages, sessionParameters" + sessionParameters); - } - - @Override - public void teardown(boolean deleteState) { - testLogger.test(prefix + "teardown deleteState, " + deleteState); - } -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockRequestHandler.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockRequestHandler.java deleted file mode 100644 index 6605fa762..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockRequestHandler.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.adjust.sdk; - -public class MockRequestHandler implements IRequestHandler { - private MockLogger testLogger; - private String prefix = "RequestHandler "; - IPackageHandler packageHandler; - - public MockRequestHandler(MockLogger testLogger) { - this.testLogger = testLogger; - } - - @Override - public void init(IPackageHandler packageHandler) { - testLogger.test(prefix + "init"); - this.packageHandler = packageHandler; - } - - @Override - public void sendPackage(ActivityPackage activityPackage, int queueSize) { - testLogger.test(prefix + "sendPackage, activityPackage " + activityPackage); - testLogger.test(prefix + "sendPackage, queueSize " + queueSize); - - /* - // respond successfully to the package handler - if (packageHandler != null && !errorNextSend) { - packageHandler.sendNextPackage(); - } - - if (packageHandler != null && errorNextSend) { - testLogger.test(packageHandler.getFailureMessage()); - packageHandler.closeFirstPackage(); - } - */ - } - - @Override - public void teardown() { - testLogger.test(prefix + "teardown"); - } -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockSdkClickHandler.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockSdkClickHandler.java deleted file mode 100644 index 9ab5bc517..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/MockSdkClickHandler.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.adjust.sdk; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by pfms on 01/04/16. - */ -public class MockSdkClickHandler implements ISdkClickHandler { - private MockLogger testLogger; - private String prefix = "SdkClickHandler "; - List queue; - IActivityHandler activityHandler; - - public MockSdkClickHandler(MockLogger testLogger) { - this.testLogger = testLogger; - queue = new ArrayList(); - } - @Override - public void init(IActivityHandler activityHandler, boolean startsSending) { - this.activityHandler = activityHandler; - testLogger.test(prefix + "init, startsSending: " + startsSending); - } - - @Override - public void pauseSending() { - testLogger.test(prefix + "pauseSending"); - } - - @Override - public void resumeSending() { - testLogger.test(prefix + "resumeSending"); - } - - @Override - public void sendSdkClick(ActivityPackage sdkClick) { - testLogger.test(prefix + "sendSdkClick"); - queue.add(sdkClick); - } - - @Override - public void teardown() { - testLogger.test(prefix + "teardown"); - } -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/ResponseType.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/ResponseType.java deleted file mode 100644 index 0f95969de..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/ResponseType.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.adjust.sdk; - -/** - * Created by pfms on 28/01/15. - */ -public enum ResponseType { - NULL, CLIENT_PROTOCOL_EXCEPTION, INTERNAL_SERVER_ERROR, WRONG_JSON, EMPTY_JSON, MESSAGE; -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateActivityHandlerConstructor.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateActivityHandlerConstructor.java deleted file mode 100644 index 96f8be57f..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateActivityHandlerConstructor.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.adjust.sdk; - -import com.adjust.sdk.ActivityHandler; -import com.adjust.sdk.AdjustConfig; -import com.adjust.sdk.IRunActivityHandler; -import com.adjust.sdk.LogLevel; - -import java.util.List; - -/** - * Created by pfms on 09/08/2016. - */ -public class StateActivityHandlerConstructor { - AdjustConfig config; - boolean startEnabled = true; - boolean isToUpdatePackages = false; - - StateActivityHandlerConstructor(AdjustConfig config) { - this.config = config; - } -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateActivityHandlerInit.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateActivityHandlerInit.java deleted file mode 100644 index 2eb32d315..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateActivityHandlerInit.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.adjust.sdk; - -import com.adjust.sdk.ActivityHandler; - -/** - * Created by pfms on 09/08/2016. - */ -public class StateActivityHandlerInit { - ActivityHandler.InternalState internalState; - boolean startEnabled = true; - boolean updatePackages = false; - boolean startsSending = false; - boolean sdkClickHandlerAlsoStartsPaused = true; - String defaultTracker = null; - String pushToken = null; - boolean eventBufferingIsEnabled = false; - boolean sendInBackgroundConfigured = false; - boolean delayStartConfigured = false; - boolean activityStateAlreadyCreated = false; - String sendReferrer = null; - String readActivityState = null; - String readAttribution = null; - String readCallbackParameters = null; - String readPartnerParameters = null; - int foregroundTimerStart = 60; - int foregroundTimerCycle = 60; - - StateActivityHandlerInit(ActivityHandler activityHandler) { - internalState = activityHandler.getInternalState(); - } -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateDelegates.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateDelegates.java deleted file mode 100644 index cbe6fb746..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateDelegates.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.adjust.sdk; - -/** - * Created by pfms on 15/08/2016. - */ -public class StateDelegates { - boolean attributionDelegatePresent; - boolean eventSuccessDelegatePresent; - boolean eventFailureDelegatePresent; - boolean sessionSuccessDelegatePresent; - boolean sessionFailureDelegatePresent; -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateEndSession.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateEndSession.java deleted file mode 100644 index d0a4e71a6..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateEndSession.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.adjust.sdk; - -/** - * Created by pfms on 11/08/2016. - */ -public class StateEndSession { - boolean pausing = true; - boolean updateActivityState = true; - boolean eventBufferingEnabled = false; - boolean checkOnPause = false; - boolean foregroundAlreadySuspended = false; - boolean backgroundTimerStarts = false; -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateEvent.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateEvent.java deleted file mode 100644 index 57933092c..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateEvent.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.adjust.sdk; - -/** - * Created by pfms on 11/08/2016. - */ -public class StateEvent { - String bufferedSuffix = null; - Integer backgroundTimerStarts = null; - String activityStateSuffix = null; - String orderId = null; - boolean duplicatedOrderId = false; - boolean disabled = false; -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateSession.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateSession.java deleted file mode 100644 index b081aefa6..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/StateSession.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.adjust.sdk; - -/** - * Created by pfms on 09/08/2016. - */ -public class StateSession { - boolean toSend = true; - int sessionCount = 1; - int subsessionCount = 1; - SessionType sessionType = null; - int eventCount = 0; - Boolean getAttributionIsCalled = null; - boolean eventBufferingIsEnabled = false; - boolean foregroundTimerStarts = true; - boolean foregroundTimerAlreadyStarted = false; - boolean sendInBackgroundConfigured = false; - boolean sdkClickHandlerAlsoStartsPaused = true; - boolean startSubsession = true; - boolean disabled = false; - String delayStart = null; - boolean activityStateAlreadyCreated = false; - - public enum SessionType { - NEW_SESSION, - NEW_SUBSESSION, - TIME_TRAVEL, - NONSESSION, - DISABLED, - } - - StateSession(SessionType sessionType) { - this.sessionType = sessionType; - } -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java deleted file mode 100644 index a15daf343..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java +++ /dev/null @@ -1,3468 +0,0 @@ -package com.adjust.sdk; - -import android.content.Context; -import android.content.SharedPreferences; -import android.content.pm.PackageManager; -import android.net.Uri; -import android.os.SystemClock; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; -import android.test.mock.MockContext; -import android.test.suitebuilder.annotation.LargeTest; - -import org.json.JSONException; -import org.json.JSONObject; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.ArrayList; -import java.util.HashMap; - -/** - * Created by pfms on 08/08/2016. - */ -@RunWith(AndroidJUnit4.class) -@LargeTest -public class TestActivityHandler { - protected MockLogger mockLogger; - protected MockPackageHandler mockPackageHandler; - protected MockAttributionHandler mockAttributionHandler; - protected MockSdkClickHandler mockSdkClickHandler; - protected com.adjust.sdk.test.UnitTestActivity activity; - protected Context context; - protected AssertUtil assertUtil; - - @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule(com.adjust.sdk.test.UnitTestActivity.class); - - @Before - public void setUp() { - mockLogger = new MockLogger(); - mockPackageHandler = new MockPackageHandler(mockLogger); - mockAttributionHandler = new MockAttributionHandler(mockLogger); - mockSdkClickHandler = new MockSdkClickHandler(mockLogger); - assertUtil = new AssertUtil(mockLogger); - - AdjustFactory.setLogger(mockLogger); - AdjustFactory.setPackageHandler(mockPackageHandler); - AdjustFactory.setAttributionHandler(mockAttributionHandler); - AdjustFactory.setSdkClickHandler(mockSdkClickHandler); - - //activity = launchActivity(null); - activity = mActivityRule.getActivity(); - context = activity.getApplicationContext(); - - // deleting state to simulate fresh install - mockLogger.test("Was AdjustActivityState deleted? " + ActivityHandler.deleteActivityState(context)); - mockLogger.test("Was Attribution deleted? " + ActivityHandler.deleteAttribution(context)); - mockLogger.test("Was Session Callback Parameters deleted? " + ActivityHandler.deleteSessionCallbackParameters(context)); - mockLogger.test("Was Session Partner Parameters deleted? " + ActivityHandler.deleteSessionPartnerParameters(context)); - - // check the server url - assertUtil.isEqual(Constants.BASE_URL, "https://app.adjust.com"); - } - - @After - public void tearDown() { - AdjustFactory.setPackageHandler(null); - AdjustFactory.setAttributionHandler(null); - AdjustFactory.setSdkClickHandler(null); - AdjustFactory.setLogger(null); - AdjustFactory.setTimerInterval(-1); - AdjustFactory.setTimerStart(-1); - AdjustFactory.setSessionInterval(-1); - AdjustFactory.setSubsessionInterval(-1); - - SharedPreferences settings = context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = settings.edit(); - editor.clear(); - editor.apply(); - - activity = null; - context = null; - } - - @Test - public void testFirstSession() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testFirstSession"); - - // create the config to start the session - AdjustConfig config = getConfig(); - - // start activity handler with config - ActivityHandler activityHandler = startAndCheckFirstSession(config); - - // checking the default values of the first session package - // should only have one package - assertUtil.isEqual(1, mockPackageHandler.queue.size()); - - ActivityPackage activityPackage = mockPackageHandler.queue.get(0); - - // create activity package test - TestActivityPackage testActivityPackage = new TestActivityPackage(activityPackage); - - // set first session - testActivityPackage.testSessionPackage(1); - } - - @Test - public void testEventsBuffered() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testEventsBuffered"); - - // create the config to start the session - AdjustConfig config = getConfig(); - - // buffer events - config.setEventBufferingEnabled(true); - - // set default tracker - config.setDefaultTracker("default1234tracker"); - - // create handler and start the first session - ActivityHandler activityHandler = getActivityHandler(config); - - SystemClock.sleep(1500); - - // test init values - StateActivityHandlerInit initState = new StateActivityHandlerInit(activityHandler); - - initState.eventBufferingIsEnabled = true; - initState.defaultTracker = "default1234tracker"; - - StateSession stateSession = new StateSession(StateSession.SessionType.NEW_SESSION); - stateSession.eventBufferingIsEnabled = true; - - checkInitAndStart(activityHandler, initState, stateSession); - - // create the first Event - AdjustEvent firstEvent = new AdjustEvent("event1"); - - // add callback parameters - firstEvent.addCallbackParameter("keyCall", "valueCall"); - firstEvent.addCallbackParameter("keyCall", "valueCall2"); - firstEvent.addCallbackParameter("fooCall", "barCall"); - - // add partner paramters - firstEvent.addPartnerParameter("keyPartner", "valuePartner"); - firstEvent.addPartnerParameter("keyPartner", "valuePartner2"); - firstEvent.addPartnerParameter("fooPartner", "barPartner"); - - // check that callback parameter was overwritten - assertUtil.warn("Key keyCall was overwritten"); - - // check that partner parameter was overwritten - assertUtil.warn("Key keyPartner was overwritten"); - - // add revenue - firstEvent.setRevenue(0.001, "EUR"); - - // set order id - firstEvent.setOrderId("orderIdTest"); - - // track event - activityHandler.trackEvent(firstEvent); - - SystemClock.sleep(1500); - - StateEvent stateEvent1 = new StateEvent(); - stateEvent1.orderId = "orderIdTest"; - stateEvent1.bufferedSuffix = "(0.00100 EUR, 'event1')"; - stateEvent1.activityStateSuffix = "ec:1"; - - checkEvent(stateEvent1); - - // create the second Event - AdjustEvent secondEvent = new AdjustEvent("event2"); - - // set order id - secondEvent.setOrderId("orderIdTest"); - - // track second event - activityHandler.trackEvent(secondEvent); - - SystemClock.sleep(1500); - - StateEvent stateEvent2 = new StateEvent(); - stateEvent2.duplicatedOrderId = true; - stateEvent2.orderId = "orderIdTest"; - - checkEvent(stateEvent2); - - // create third Event - AdjustEvent thirdEvent = new AdjustEvent("event3"); - - // set order id - thirdEvent.setOrderId("otherOrderId"); - - // add empty revenue - thirdEvent.setRevenue(0, "USD"); - - // track third event - activityHandler.trackEvent(thirdEvent); - - SystemClock.sleep(1500); - - StateEvent stateEvent3 = new StateEvent(); - stateEvent3.orderId = "otherOrderId"; - stateEvent3.bufferedSuffix = "(0.00000 USD, 'event3')"; - stateEvent3.activityStateSuffix = "ec:2"; - - checkEvent(stateEvent3); - - // create a forth Event object without revenue - AdjustEvent forthEvent = new AdjustEvent("event4"); - - // track third event - activityHandler.trackEvent(forthEvent); - - SystemClock.sleep(1500); - - StateEvent stateEvent4 = new StateEvent(); - stateEvent4.bufferedSuffix = "'event4'"; - stateEvent4.activityStateSuffix = "ec:3"; - - checkEvent(stateEvent4); - - // check the number of activity packages - // 1 session + 3 events - assertUtil.isEqual(4, mockPackageHandler.queue.size()); - - ActivityPackage firstSessionPackage = mockPackageHandler.queue.get(0); - - // create activity package test - TestActivityPackage testFirstSessionPackage = new TestActivityPackage(firstSessionPackage); - testFirstSessionPackage.eventBufferingEnabled = true; - testFirstSessionPackage.defaultTracker = "default1234tracker"; - - // set first session - testFirstSessionPackage.testSessionPackage(1); - - // first event - ActivityPackage firstEventPackage = mockPackageHandler.queue.get(1); - - // create event package test - TestActivityPackage testFirstEventPackage = new TestActivityPackage(firstEventPackage); - - // set event test parameters - testFirstEventPackage.eventCount = "1"; - testFirstEventPackage.suffix = "(0.00100 EUR, 'event1')"; - testFirstEventPackage.revenueString = "0.00100"; - testFirstEventPackage.currency = "EUR"; - testFirstEventPackage.callbackParams = "{\"keyCall\":\"valueCall2\",\"fooCall\":\"barCall\"}"; - testFirstEventPackage.partnerParams = "{\"keyPartner\":\"valuePartner2\",\"fooPartner\":\"barPartner\"}"; - testFirstEventPackage.eventBufferingEnabled = true; - - // test first event - testFirstEventPackage.testEventPackage("event1"); - - // second event - ActivityPackage secondEventPackage = mockPackageHandler.queue.get(2); - - // create event package test - TestActivityPackage testSecondEventPackage = new TestActivityPackage(secondEventPackage); - - // set event test parameters - testSecondEventPackage.eventCount = "2"; - testSecondEventPackage.suffix = "(0.00000 USD, 'event3')"; - testSecondEventPackage.revenueString = "0.00000"; - testSecondEventPackage.currency = "USD"; - testSecondEventPackage.eventBufferingEnabled = true; - - // test second event - testSecondEventPackage.testEventPackage("event3"); - - // third event - ActivityPackage thirdEventPackage = mockPackageHandler.queue.get(3); - - // create event package test - TestActivityPackage testThirdEventPackage = new TestActivityPackage(thirdEventPackage); - - // set event test parameters - testThirdEventPackage.eventCount = "3"; - testThirdEventPackage.suffix = "'event4'"; - testThirdEventPackage.eventBufferingEnabled = true; - - // test third event - testThirdEventPackage.testEventPackage("event4"); - } - - @Test - public void testEventsNotBuffered() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testEventsNotBuffered"); - - // create the config to start the session - AdjustConfig config = getConfig(); - - // start activity handler with config - ActivityHandler activityHandler = startAndCheckFirstSession(config); - - // create the first Event - AdjustEvent firstEvent = new AdjustEvent("event1"); - - // track event - activityHandler.trackEvent(firstEvent); - - SystemClock.sleep(1500); - - StateEvent stateEvent = new StateEvent(); - checkEvent(stateEvent); - } - - @Test - public void testEventBeforeStart() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testEventBeforeStart"); - - // create the config to start the session - AdjustConfig config = getConfig(); - - // create the first Event - AdjustEvent firstEvent = new AdjustEvent("event1"); - - // create handler and start the first session - ActivityHandler activityHandler = getActivityHandler(config); - - // track event - activityHandler.trackEvent(firstEvent); - - SystemClock.sleep(1500); - - // test init values - checkInitTests(activityHandler); - - // does not start the activity because it was started by the track event - - // test session - StateSession stateSession= new StateSession(StateSession.SessionType.NEW_SESSION); - // does not start session - stateSession.startSubsession = false; - stateSession.toSend = false; - - checkStartInternal(stateSession); - - StateEvent stateEvent = new StateEvent(); - checkEvent(stateEvent); - } - - @Test - public void testChecks() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testChecks"); - - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testChecks"); - - // config with null app token - AdjustConfig nullAppTokenConfig = new AdjustConfig(context, null, AdjustConfig.ENVIRONMENT_SANDBOX); - - assertUtil.error("Missing App Token"); - assertUtil.isFalse(nullAppTokenConfig.isValid()); - - // config with wrong size app token - AdjustConfig oversizeAppTokenConfig = new AdjustConfig(context, "1234567890123", AdjustConfig.ENVIRONMENT_SANDBOX); - - assertUtil.error("Malformed App Token '1234567890123'"); - assertUtil.isFalse(oversizeAppTokenConfig.isValid()); - - // config with null environment - AdjustConfig nullEnvironmentConfig = new AdjustConfig(context, "123456789012", null); - - assertUtil.error("Missing environment"); - assertUtil.isFalse(nullEnvironmentConfig.isValid()); - - // config with wrong environment - AdjustConfig wrongEnvironmentConfig = new AdjustConfig(context, "123456789012", "Other"); - - assertUtil.error("Unknown environment 'Other'"); - assertUtil.isFalse(wrongEnvironmentConfig.isValid()); - - // config with null context - AdjustConfig nullContextConfig = new AdjustConfig(null, "123456789012", AdjustConfig.ENVIRONMENT_SANDBOX); - - assertUtil.error("Missing context"); - assertUtil.isFalse(nullContextConfig.isValid()); - - // config without internet permission - Context mockContext = new MockContext() { - @Override - public int checkCallingOrSelfPermission(String permission) { - return PackageManager.PERMISSION_DENIED; - } - }; - AdjustConfig mockContextConfig = new AdjustConfig(mockContext, "123456789012", AdjustConfig.ENVIRONMENT_SANDBOX); - - assertUtil.error("Missing permission: INTERNET"); - assertUtil.isFalse(mockContextConfig.isValid()); - - // config without access wifi state permission - // TODO - - // start with null config - ActivityHandler nullConfigactivityHandler = ActivityHandler.getInstance(null); - - assertUtil.error("AdjustConfig missing"); - assertUtil.isNull(nullConfigactivityHandler); - - ActivityHandler invalidConfigactivityHandler = ActivityHandler.getInstance(nullAppTokenConfig); - - assertUtil.error("AdjustConfig not initialized correctly"); - assertUtil.isNull(invalidConfigactivityHandler); - - // event with null event token - AdjustEvent nullEventToken = new AdjustEvent(null); - - assertUtil.error("Missing Event Token"); - assertUtil.isFalse(nullEventToken.isValid()); - - // event with wrong size - AdjustEvent wrongEventTokenSize = new AdjustEvent("eventXX"); - - assertUtil.error("Malformed Event Token 'eventXX'"); - assertUtil.isFalse(wrongEventTokenSize.isValid()); - - // event - AdjustEvent event = new AdjustEvent("event1"); - - // event with negative revenue - event.setRevenue(-0.001, "EUR"); - - assertUtil.error("Invalid amount -0.001"); - - // event with null currency - event.setRevenue(0, null); - - assertUtil.error("Currency must be set with revenue"); - - // event with empty currency - event.setRevenue(0, ""); - - assertUtil.error("Currency is empty"); - - // callback parameter null key - event.addCallbackParameter(null, "callValue"); - - assertUtil.error("Callback parameter key is missing"); - - // callback parameter empty key - event.addCallbackParameter("", "callValue"); - - assertUtil.error("Callback parameter key is empty"); - - // callback parameter null value - event.addCallbackParameter("keyCall", null); - - assertUtil.error("Callback parameter value is missing"); - - // callback parameter empty value - event.addCallbackParameter("keyCall", ""); - - assertUtil.error("Callback parameter value is empty"); - - // partner parameter null key - event.addPartnerParameter(null, "callValue"); - - assertUtil.error("Partner parameter key is missing"); - - // partner parameter empty key - event.addPartnerParameter("", "callValue"); - - assertUtil.error("Partner parameter key is empty"); - - // partner parameter null value - event.addPartnerParameter("keyCall", null); - - assertUtil.error("Partner parameter value is missing"); - - // partner parameter empty value - event.addPartnerParameter("keyCall", ""); - - assertUtil.error("Partner parameter value is empty"); - - // create the config with wrong process name - AdjustConfig configWrongProcess = new AdjustConfig(context, "123456789012", AdjustConfig.ENVIRONMENT_SANDBOX); - configWrongProcess.setProcessName("com.wrong.process"); - - // create handler and start the first session - ActivityHandler.getInstance(configWrongProcess); - - assertUtil.info("Skipping initialization in background process (com.adjust.sdk.test.test)"); - - // create the config with correct process name - AdjustConfig configCorrectProcess = new AdjustConfig(context, "123456789012", AdjustConfig.ENVIRONMENT_SANDBOX); - configCorrectProcess.setProcessName("com.adjust.sdk.test.test"); - - // create handler and start the first session - ActivityHandler.getInstance(configCorrectProcess); - - assertUtil.notInInfo("Skipping initialization in background process"); - - // create the config to start the session - AdjustConfig config = getConfig(); - - // create handler and start the first session - ActivityHandler activityHandler = startAndCheckFirstSession(config); - - // track null event - activityHandler.trackEvent(null); - SystemClock.sleep(1000); - - assertUtil.error("Event missing"); - - activityHandler.trackEvent(nullEventToken); - SystemClock.sleep(1000); - - assertUtil.error("Event not initialized correctly"); - - activityHandler.resetSessionCallbackParameters(); - activityHandler.resetSessionPartnerParameters(); - - activityHandler.removeSessionCallbackParameter(null); - activityHandler.removeSessionCallbackParameter(""); - activityHandler.removeSessionCallbackParameter("nonExistent"); - - activityHandler.removeSessionPartnerParameter(null); - activityHandler.removeSessionPartnerParameter(""); - activityHandler.removeSessionPartnerParameter("nonExistent"); - - activityHandler.addSessionCallbackParameter(null, "value"); - activityHandler.addSessionCallbackParameter("", "value"); - - activityHandler.addSessionCallbackParameter("key", null); - activityHandler.addSessionCallbackParameter("key", ""); - - activityHandler.addSessionPartnerParameter(null, "value"); - activityHandler.addSessionPartnerParameter("", "value"); - - activityHandler.addSessionPartnerParameter("key", null); - activityHandler.addSessionPartnerParameter("key", ""); - - activityHandler.removeSessionCallbackParameter("nonExistent"); - activityHandler.removeSessionPartnerParameter("nonExistent"); - - SystemClock.sleep(1500); - - assertUtil.warn("Session Callback parameters are not set"); - assertUtil.warn("Session Partner parameters are not set"); - - assertUtil.error("Session Callback parameter key is missing"); - assertUtil.error("Session Callback parameter key is empty"); - assertUtil.warn("Session Callback parameters are not set"); - - assertUtil.error("Session Partner parameter key is missing"); - assertUtil.error("Session Partner parameter key is empty"); - assertUtil.warn("Session Partner parameters are not set"); - - assertUtil.error("Session Callback parameter key is missing"); - assertUtil.error("Session Callback parameter key is empty"); - assertUtil.error("Session Callback parameter value is missing"); - assertUtil.error("Session Callback parameter value is empty"); - - assertUtil.error("Session Partner parameter key is missing"); - assertUtil.error("Session Partner parameter key is empty"); - assertUtil.error("Session Partner parameter value is missing"); - assertUtil.error("Session Partner parameter value is empty"); - - assertUtil.warn("Session Callback parameters are not set"); - assertUtil.warn("Session Partner parameters are not set"); - } - - @Test - public void testSessions() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testSessions"); - - // adjust the session intervals for testing - AdjustFactory.setSessionInterval(4000); - - // create the config to start the session - AdjustConfig config = getConfig(); - - // start activity handler with config - ActivityHandler activityHandler = startAndCheckFirstSession(config); - - // end subsession - stopActivity(activityHandler); - - SystemClock.sleep(2000); - - // test the end of the subsession - checkEndSession(); - - // start a subsession - resumeActivity(activityHandler); - - SystemClock.sleep(2000); - - // test the new sub session - StateSession secondSubsession = new StateSession(StateSession.SessionType.NEW_SUBSESSION); - secondSubsession.subsessionCount = 2; - checkStartInternal(secondSubsession); - - stopActivity(activityHandler); - - SystemClock.sleep(5000); - - // test the end of the subsession - checkEndSession(); - - // trigger a new session - activityHandler.onResume(); - - SystemClock.sleep(1500); - - // new session - StateSession secondSession = new StateSession(StateSession.SessionType.NEW_SESSION); - secondSession.sessionCount = 2; - checkStartInternal(secondSession); - - // stop and start the activity with little interval - // so it won't trigger a sub session - stopActivity(activityHandler); - resumeActivity(activityHandler); - - SystemClock.sleep(1500); - - // test the end of the subsession - StateEndSession stateEndSession = new StateEndSession(); - stateEndSession.pausing = false; - - checkEndSession(stateEndSession); - - // test non sub session - StateSession nonSessionState = new StateSession(StateSession.SessionType.NONSESSION); - checkStartInternal(nonSessionState); - - // 2 session packages - assertUtil.isEqual(2, mockPackageHandler.queue.size()); - - ActivityPackage firstSessionActivityPackage = mockPackageHandler.queue.get(0); - - // create activity package test - TestActivityPackage testFirstSessionActivityPackage = new TestActivityPackage(firstSessionActivityPackage); - - // test first session - testFirstSessionActivityPackage.testSessionPackage(1); - - // get second session package - ActivityPackage secondSessionActivityPackage = mockPackageHandler.queue.get(1); - - // create second session test package - TestActivityPackage testSecondSessionActivityPackage = new TestActivityPackage(secondSessionActivityPackage); - - // check if it saved the second subsession in the new package - testSecondSessionActivityPackage.subsessionCount = 2; - - // test second session - testSecondSessionActivityPackage.testSessionPackage(2); - } - - @Test - public void testDisable() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testDisable"); - - // adjust the session intervals for testing - AdjustFactory.setSessionInterval(4000); - - // create the config to start the session - AdjustConfig config = getConfig(); - - // create handler and start the first session - ActivityHandler activityHandler = getActivityHandler(config); - - // check that it is enabled - assertUtil.isTrue(activityHandler.isEnabled()); - - // disable sdk - activityHandler.setEnabled(false); - - SystemClock.sleep(1000); - - // check that it is disabled - assertUtil.isFalse(activityHandler.isEnabled()); - - // not writing activity state because it set enable does not start the sdk - assertUtil.notInDebug("Wrote Activity state"); - - StateActivityHandlerInit stateActivityHandlerInit = new StateActivityHandlerInit(activityHandler); - stateActivityHandlerInit.startsSending = false; - stateActivityHandlerInit.startEnabled = false; - - checkInitTests(stateActivityHandlerInit); - - // check if message the disable of the SDK - assertUtil.info("Handlers will start as paused due to the SDK being disabled"); - - checkHandlerStatus(true); - - // start the sdk - // foreground timer does not start because it's paused - resumeActivity(activityHandler); - AdjustEvent firstEvent = new AdjustEvent("event1"); - - activityHandler.trackEvent(firstEvent); - SystemClock.sleep(1500); - - // check initial created session - StateSession initialSessionDisabled = new StateSession(StateSession.SessionType.DISABLED); - initialSessionDisabled.toSend = false; - initialSessionDisabled.foregroundTimerStarts = false; - - checkStartInternal(initialSessionDisabled); - - // and failed event - StateEvent stateFailedEvent = new StateEvent(); - stateFailedEvent.disabled = true; - - checkEvent(stateFailedEvent); - - // try to pause session - stopActivity(activityHandler); - SystemClock.sleep(1500); - - StateEndSession stateEndSession = new StateEndSession(); - stateEndSession.checkOnPause = true; - stateEndSession.foregroundAlreadySuspended = true; - - checkEndSession(stateEndSession); - - SystemClock.sleep(4000); - - // try to generate a new session - resumeActivity(activityHandler); - - SystemClock.sleep(1500); - - StateSession sessionDisabled = new StateSession(StateSession.SessionType.DISABLED); - sessionDisabled.toSend = false; - sessionDisabled.foregroundTimerStarts = false; - sessionDisabled.disabled = true; - - checkStartInternal(sessionDisabled); - - // only the first session package should be sent - assertUtil.isEqual(0, mockPackageHandler.queue.size()); - - // put in offline mode - activityHandler.setOfflineMode(true); - - // wait to update status - SystemClock.sleep(1500); - - // pausing due to offline mode - assertUtil.info("Pausing handlers to put SDK offline mode"); - - // after pausing, even when it's already paused - // tries to update the status - checkHandlerStatus(true); - - // re-enable the SDK - activityHandler.setEnabled(true); - - // wait to update status - SystemClock.sleep(1500); - - // check that it is enabled - assertUtil.isTrue(activityHandler.isEnabled()); - - // check message of SDK still paused - assertUtil.info("Handlers remain paused"); - - // wait to generate a new session - SystemClock.sleep(5000); - - // even though it will remained paused, - // it will update the status to paused - checkHandlerStatus(true); - - // generate a new session - resumeActivity(activityHandler); - AdjustEvent secondEvent = new AdjustEvent("event2"); - - activityHandler.trackEvent(secondEvent); - - SystemClock.sleep(1500); - - // difference from the first session is that now the foreground timer starts - StateSession sessionOffline = new StateSession(StateSession.SessionType.NEW_SESSION); - sessionOffline.toSend = false; - sessionOffline.foregroundTimerStarts = true; - sessionOffline.foregroundTimerAlreadyStarted = false; - - checkStartInternal(sessionOffline); - - // and the event does not fail - StateEvent stateEvent = new StateEvent(); - - checkEvent(stateEvent); - - // it should have the second session and the event - assertUtil.isEqual(2, mockPackageHandler.queue.size()); - - ActivityPackage secondSessionPackage = mockPackageHandler.queue.get(0); - - // create activity package test - TestActivityPackage testSecondSessionPackage = new TestActivityPackage(secondSessionPackage); - - // set the sub sessions - testSecondSessionPackage.subsessionCount = 1; - - // test second session - testSecondSessionPackage.testSessionPackage(2); - - ActivityPackage eventPackage = mockPackageHandler.queue.get(1); - - // create activity package test - TestActivityPackage testEventPackage = new TestActivityPackage(eventPackage); - - testEventPackage.suffix = "'event2'"; - - // test event - testEventPackage.testEventPackage("event2"); - - // end the session - stopActivity(activityHandler); - - SystemClock.sleep(1500); - - checkEndSession(); - - // put in online mode - activityHandler.setOfflineMode(false); - - SystemClock.sleep(1500); - - // message that is finally resuming - assertUtil.info("Resuming handlers to put SDK in online mode"); - - SystemClock.sleep(5000); - - // after un-pausing the sdk, tries to update the handlers - // it is still paused because it's on the background - checkHandlerStatus(true); - - resumeActivity(activityHandler); - - SystemClock.sleep(1500); - - StateSession thirdSessionStarting = new StateSession(StateSession.SessionType.NEW_SESSION); - thirdSessionStarting.sessionCount = 3; - thirdSessionStarting.eventCount = 1; - checkStartInternal(thirdSessionStarting); - } - - @Test - public void testOpenUrl() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testOpenUrl"); - - // create the config to start the session - AdjustConfig config = getConfig(); - - // start activity handler with config - ActivityHandler activityHandler = startAndCheckFirstSession(config); - - Uri attributions = Uri.parse("AdjustTests://example.com/path/inApp?adjust_tracker=trackerValue&other=stuff&adjust_campaign=campaignValue&adjust_adgroup=adgroupValue&adjust_creative=creativeValue"); - Uri extraParams = Uri.parse("AdjustTests://example.com/path/inApp?adjust_foo=bar&other=stuff&adjust_key=value"); - Uri mixed = Uri.parse("AdjustTests://example.com/path/inApp?adjust_foo=bar&other=stuff&adjust_campaign=campaignValue&adjust_adgroup=adgroupValue&adjust_creative=creativeValue"); - Uri encodedSeparators = Uri.parse("AdjustTests://example.com/path/inApp?adjust_foo=b%26a%3B%3Dr&adjust_campaign=campaign%3DValue%26&other=stuff"); - Uri emptyQueryString = Uri.parse("AdjustTests://"); - Uri emptyString = Uri.parse(""); - Uri nullUri = null; - Uri single = Uri.parse("AdjustTests://example.com/path/inApp?adjust_foo"); - Uri prefix = Uri.parse("AdjustTests://example.com/path/inApp?adjust_=bar"); - Uri incomplete = Uri.parse("AdjustTests://example.com/path/inApp?adjust_foo="); - - long now = System.currentTimeMillis(); - - activityHandler.readOpenUrl(attributions, now); - activityHandler.readOpenUrl(extraParams, now); - activityHandler.readOpenUrl(mixed, now); - activityHandler.readOpenUrl(encodedSeparators, now); - activityHandler.readOpenUrl(emptyQueryString, now); - activityHandler.readOpenUrl(emptyString, now); - activityHandler.readOpenUrl(nullUri, now); - activityHandler.readOpenUrl(single, now); - activityHandler.readOpenUrl(prefix, now); - activityHandler.readOpenUrl(incomplete, now); - - SystemClock.sleep(1000); - - assertUtil.verbose("Url to parse (%s)", attributions); - assertUtil.test("SdkClickHandler sendSdkClick"); - - assertUtil.verbose("Url to parse (%s)", extraParams); - assertUtil.test("SdkClickHandler sendSdkClick"); - - assertUtil.verbose("Url to parse (%s)", mixed); - assertUtil.test("SdkClickHandler sendSdkClick"); - - assertUtil.verbose("Url to parse (%s)", encodedSeparators); - assertUtil.test("SdkClickHandler sendSdkClick"); - - assertUtil.verbose("Url to parse (%s)", emptyQueryString); - assertUtil.test("SdkClickHandler sendSdkClick"); - - assertUtil.verbose("Url to parse (%s)", single); - assertUtil.test("SdkClickHandler sendSdkClick"); - - assertUtil.verbose("Url to parse (%s)", prefix); - assertUtil.test("SdkClickHandler sendSdkClick"); - - assertUtil.verbose("Url to parse (%s)", incomplete); - assertUtil.test("SdkClickHandler sendSdkClick"); - - // check that it did not send any other click package - assertUtil.notInTest("SdkClickHandler sendSdkClick"); - - // 8 clicks - assertUtil.isEqual(8, mockSdkClickHandler.queue.size()); - - // get the click package - ActivityPackage attributionClickPackage = mockSdkClickHandler.queue.get(0); - - // create activity package test - TestActivityPackage testAttributionClickPackage = new TestActivityPackage(attributionClickPackage); - - // create the attribution - AdjustAttribution firstAttribution = new AdjustAttribution(); - firstAttribution.trackerName = "trackerValue"; - firstAttribution.campaign = "campaignValue"; - firstAttribution.adgroup = "adgroupValue"; - firstAttribution.creative = "creativeValue"; - - // and set it - testAttributionClickPackage.attribution = firstAttribution; - - testAttributionClickPackage.deeplink = attributions.toString(); - - // test the first deeplink - testAttributionClickPackage.testClickPackage("deeplink"); - - // get the click package - ActivityPackage extraParamsClickPackage = mockSdkClickHandler.queue.get(1); - - // create activity package test - TestActivityPackage testExtraParamsClickPackage = new TestActivityPackage(extraParamsClickPackage); - - // other deep link parameters - testExtraParamsClickPackage.otherParameters = "{\"key\":\"value\",\"foo\":\"bar\"}"; - - testExtraParamsClickPackage.deeplink = extraParams.toString(); - - // test the second deeplink - testExtraParamsClickPackage.testClickPackage("deeplink"); - - // get the click package - ActivityPackage mixedClickPackage = mockSdkClickHandler.queue.get(2); - - // create activity package test - TestActivityPackage testMixedClickPackage = new TestActivityPackage(mixedClickPackage); - - // create the attribution - AdjustAttribution secondAttribution = new AdjustAttribution(); - secondAttribution.campaign = "campaignValue"; - secondAttribution.adgroup = "adgroupValue"; - secondAttribution.creative = "creativeValue"; - - // and set it - testMixedClickPackage.attribution = secondAttribution; - - // other deep link parameters - testMixedClickPackage.otherParameters = "{\"foo\":\"bar\"}"; - - testMixedClickPackage.deeplink = mixed.toString(); - - // test the third deeplink - testMixedClickPackage.testClickPackage("deeplink"); - - // get the click package - ActivityPackage encodedClickPackage = mockSdkClickHandler.queue.get(3); - - // create activity package test - TestActivityPackage testEncodedClickPackage = new TestActivityPackage(encodedClickPackage); - - // create the attribution - AdjustAttribution thirdAttribution = new AdjustAttribution(); - thirdAttribution.campaign = "campaign=Value&"; - - // and set it - testEncodedClickPackage.attribution = thirdAttribution; - - // other deep link parameters - testEncodedClickPackage.otherParameters = "{\"foo\":\"b&a;=r\"}"; - - testEncodedClickPackage.deeplink = encodedSeparators.toString(); - - // test the third deeplink - testEncodedClickPackage.testClickPackage("deeplink"); - - // get the click package - ActivityPackage emptyQueryStringClickPackage = mockSdkClickHandler.queue.get(4); - - // create activity package test - TestActivityPackage testEmptyQueryStringClickPackage = new TestActivityPackage(emptyQueryStringClickPackage); - - testEmptyQueryStringClickPackage.deeplink = emptyQueryString.toString(); - - testEmptyQueryStringClickPackage.testClickPackage("deeplink"); - - // get the click package - ActivityPackage singleClickPackage = mockSdkClickHandler.queue.get(5); - - // create activity package test - TestActivityPackage testSingleClickPackage = new TestActivityPackage(singleClickPackage); - - testSingleClickPackage.deeplink = single.toString(); - - testSingleClickPackage.testClickPackage("deeplink"); - - // get the click package - ActivityPackage prefixClickPackage = mockSdkClickHandler.queue.get(6); - - // create activity package test - TestActivityPackage testPrefixClickPackage = new TestActivityPackage(prefixClickPackage); - - testPrefixClickPackage.deeplink = prefix.toString(); - - testPrefixClickPackage.testClickPackage("deeplink"); - - // get the click package - ActivityPackage incompleteClickPackage = mockSdkClickHandler.queue.get(7); - - // create activity package test - TestActivityPackage testIncompleteClickPackage = new TestActivityPackage(incompleteClickPackage ); - - testIncompleteClickPackage.deeplink = incomplete.toString(); - - testIncompleteClickPackage.testClickPackage("deeplink"); - } - - @Test - public void testAttributionDelegate() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testAttributionDelegate"); - - // create the config to start the session - AdjustConfig config = getConfig(); - - config.setOnAttributionChangedListener(new OnAttributionChangedListener() { - @Override - public void onAttributionChanged(AdjustAttribution attribution) { - mockLogger.test("onAttributionChanged: " + attribution); - } - }); - - StateDelegates attributionDelegatePresent = new StateDelegates(); - attributionDelegatePresent.attributionDelegatePresent = true; - checkFinishTasks(config, attributionDelegatePresent); - } - - @Test - public void testSuccessDelegates() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testSuccessDelegates"); - - // create the config to start the session - AdjustConfig config = getConfig(); - - config.setOnEventTrackingSucceededListener(new OnEventTrackingSucceededListener() { - @Override - public void onFinishedEventTrackingSucceeded(AdjustEventSuccess eventSuccessResponseData) { - mockLogger.test("onFinishedEventTrackingSucceeded: " + eventSuccessResponseData); - } - }); - - config.setOnSessionTrackingSucceededListener(new OnSessionTrackingSucceededListener() { - @Override - public void onFinishedSessionTrackingSucceeded(AdjustSessionSuccess sessionSuccessResponseData) { - mockLogger.test("onFinishedSessionTrackingSucceeded: " + sessionSuccessResponseData); - } - }); - - StateDelegates successDelegatesPresent = new StateDelegates(); - successDelegatesPresent.eventSuccessDelegatePresent = true; - successDelegatesPresent.sessionSuccessDelegatePresent = true; - - checkFinishTasks(config, successDelegatesPresent); - } - - @Test - public void testFailureDelegates() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testFailureDelegates"); - - // create the config to start the session - AdjustConfig config = getConfig(); - - config.setOnEventTrackingFailedListener(new OnEventTrackingFailedListener() { - @Override - public void onFinishedEventTrackingFailed(AdjustEventFailure eventFailureResponseData) { - mockLogger.test("onFinishedEventTrackingFailed: " + eventFailureResponseData); - } - }); - - config.setOnSessionTrackingFailedListener(new OnSessionTrackingFailedListener() { - @Override - public void onFinishedSessionTrackingFailed(AdjustSessionFailure failureResponseData) { - mockLogger.test("onFinishedSessionTrackingFailed: " + failureResponseData); - } - }); - - StateDelegates failureDelegatesPresent = new StateDelegates(); - failureDelegatesPresent.sessionFailureDelegatePresent = true; - failureDelegatesPresent.eventFailureDelegatePresent = true; - - checkFinishTasks(config, failureDelegatesPresent); - } - - private void checkFinishTasks(AdjustConfig config, - StateDelegates stateDelegates) - { - ActivityHandler activityHandler = startAndCheckFirstSession(config); - - // test first session package - ActivityPackage firstSessionPackage = mockPackageHandler.queue.get(0); - - // create activity package test - TestActivityPackage testActivityPackage = new TestActivityPackage(firstSessionPackage); - - // set first session - testActivityPackage.testSessionPackage(1); - - long now = System.currentTimeMillis(); - String dateString = Util.dateFormatter.format(now); - - // simulate a successful session - SessionResponseData successSessionResponseData = (SessionResponseData) ResponseData.buildResponseData(firstSessionPackage); - successSessionResponseData.success = true; - successSessionResponseData.message = "Session successfully tracked"; - successSessionResponseData.timestamp = dateString; - successSessionResponseData.adid = "adidValue"; - - activityHandler.finishedTrackingActivity(successSessionResponseData); - SystemClock.sleep(1000); - - // attribution handler should always receive the session response - assertUtil.test("AttributionHandler checkSessionResponse"); - - // attribution handler does not receive sdk click - assertUtil.notInTest("AttributionHandler checkSdkClickResponse"); - - // the first session does not trigger the event response delegate - assertUtil.notInDebug("Launching success event tracking listener"); - assertUtil.notInDebug("Launching failed event tracking listener"); - - activityHandler.launchSessionResponseTasks(successSessionResponseData); - SystemClock.sleep(1000); - - // if present, the first session triggers the success session delegate - if (stateDelegates.sessionSuccessDelegatePresent) { - assertUtil.debug("Launching success session tracking listener"); - assertUtil.test("onFinishedSessionTrackingSucceeded: Session Success msg:Session successfully tracked time:" + dateString + " adid:adidValue json:null"); - } else { - assertUtil.notInDebug("Launching success session tracking delegate"); - assertUtil.notInTest("onFinishedSessionTrackingSucceeded: Session Success "); - } - // it doesn't trigger the failure session delegate - assertUtil.notInDebug("Launching failed session tracking listener"); - - // simulate a failure session - SessionResponseData failureSessionResponseData = (SessionResponseData)ResponseData.buildResponseData(firstSessionPackage); - failureSessionResponseData.success = false; - failureSessionResponseData.message = "Session failure tracked"; - failureSessionResponseData.timestamp = dateString; - failureSessionResponseData.adid = "adidValue"; - - activityHandler.launchSessionResponseTasks(failureSessionResponseData); - SystemClock.sleep(1000); - - // it doesn't trigger the success session delegate - assertUtil.notInDebug("Launching success session tracking listener"); - - // if present, the first session triggers the failure session delegate - if (stateDelegates.sessionFailureDelegatePresent) { - assertUtil.debug("Launching failed session tracking listener"); - assertUtil.test("onFinishedSessionTrackingFailed: Session Failure msg:Session failure tracked time:" + dateString+ " adid:adidValue retry:false json:null"); - } else { - assertUtil.notInDebug("Launching failed session tracking listener"); - assertUtil.notInTest("onFinishedSessionTrackingFailed: Session Failure "); - } - - // test success event response data - activityHandler.trackEvent(new AdjustEvent("abc123")); - SystemClock.sleep(1000); - - ActivityPackage eventPackage = mockPackageHandler.queue.get(1); - EventResponseData eventSuccessResponseData = (EventResponseData)ResponseData.buildResponseData(eventPackage); - eventSuccessResponseData.success = true; - eventSuccessResponseData.message = "Event successfully tracked"; - eventSuccessResponseData.timestamp = dateString; - eventSuccessResponseData.adid = "adidValue"; - - activityHandler.finishedTrackingActivity(eventSuccessResponseData); - SystemClock.sleep(1000); - - // attribution handler should never receive the event response - assertUtil.notInTest("AttributionHandler checkSessionResponse"); - - // if present, the success event triggers the success event delegate - if (stateDelegates.eventSuccessDelegatePresent) { - assertUtil.debug("Launching success event tracking listener"); - assertUtil.test("onFinishedEventTrackingSucceeded: Event Success msg:Event successfully tracked time:" + dateString + " adid:adidValue event:abc123 json:null"); - } else { - assertUtil.notInDebug("Launching success event tracking listener"); - assertUtil.notInTest("onFinishedEventTrackingSucceeded: Event Success "); - } - // it doesn't trigger the failure event delegate - assertUtil.notInDebug("Launching failed event tracking listener"); - - // test failure event response data - EventResponseData eventFailureResponseData = (EventResponseData)ResponseData.buildResponseData(eventPackage); - eventFailureResponseData.success = false; - eventFailureResponseData.message = "Event failure tracked"; - eventFailureResponseData.timestamp = dateString; - eventFailureResponseData.adid = "adidValue"; - - activityHandler.finishedTrackingActivity(eventFailureResponseData); - SystemClock.sleep(1000); - - // attribution handler should never receive the event response - assertUtil.notInTest("AttributionHandler checkSessionResponse"); - - // if present, the failure event triggers the failure event delegate - if (stateDelegates.eventFailureDelegatePresent) { - assertUtil.debug("Launching failed event tracking listener"); - assertUtil.test("onFinishedEventTrackingFailed: Event Failure msg:Event failure tracked time:" + dateString + " adid:adidValue event:abc123 retry:false json:null"); - } else { - assertUtil.notInDebug("Launching failed event tracking listener"); - assertUtil.notInTest("onFinishedEventTrackingFailed: Event Failure "); - } - // it doesn't trigger the success event delegate - assertUtil.notInDebug("Launching success event tracking listener"); - - // test click - Uri attributions = Uri.parse("AdjustTests://example.com/path/inApp?adjust_tracker=trackerValue&other=stuff&adjust_campaign=campaignValue&adjust_adgroup=adgroupValue&adjust_creative=creativeValue"); - - activityHandler.readOpenUrl(attributions, now); - SystemClock.sleep(1000); - - assertUtil.test("SdkClickHandler sendSdkClick"); - - // test sdk_click response data - ActivityPackage sdkClickPackage = mockSdkClickHandler.queue.get(0); - SdkClickResponseData sdkClickResponseData = (SdkClickResponseData) ResponseData.buildResponseData(sdkClickPackage); - - activityHandler.finishedTrackingActivity(sdkClickResponseData); - SystemClock.sleep(1000); - - // attribution handler receives the click response - assertUtil.test("AttributionHandler checkSdkClickResponse"); - - // attribution handler does not receive session response - assertUtil.notInTest("AttributionHandler checkSessionResponse"); - - // it doesn't trigger the any event delegate - assertUtil.notInDebug("Launching success event tracking listener"); - assertUtil.notInDebug("Launching failed event tracking listener"); - } - - @Test - public void testLaunchDeepLink() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testLaunchDeepLink"); - - // create the config to start the session - AdjustConfig config = getConfig(); - - // start activity handler with config - ActivityHandler activityHandler = startAndCheckFirstSession(config); - - ResponseData responseDataNull = null; - - activityHandler.finishedTrackingActivity(responseDataNull); - SystemClock.sleep(1500); - - // if the response is null - assertUtil.notInTest("AttributionHandler checkAttribution"); - assertUtil.notInError("Unable to open deferred deep link"); - assertUtil.notInInfo("Open deferred deep link"); - - // test success session response data - SessionResponseData sessionResponseDeeplink = (SessionResponseData) ResponseData.buildResponseData(mockPackageHandler.queue.get(0)); - try { - sessionResponseDeeplink.jsonResponse = new JSONObject("{ " + - "\"deeplink\" : \"adjustTestSchema://\" }"); - } catch (JSONException e) { - assertUtil.fail(e.getMessage()); - } - - activityHandler.launchSessionResponseTasks((SessionResponseData) sessionResponseDeeplink); - SystemClock.sleep(1500); - - // check that it was unable to open the url - assertUtil.notInError("Unable to open deferred deep link"); - assertUtil.notInInfo("Open deferred deep link"); - - // test attribution response - AttributionResponseData attributionResponseDeeplink = (AttributionResponseData)ResponseData.buildResponseData(mockAttributionHandler.attributionPackage); - attributionResponseDeeplink.deeplink = Uri.parse("adjustTestSchema://"); - - activityHandler.launchAttributionResponseTasks(attributionResponseDeeplink); - SystemClock.sleep(1500); - - assertUtil.info("Deferred deeplink received (adjustTestSchema://)"); - assertUtil.notInError("Unable to open deferred deep link (adjustTestSchema://)"); - assertUtil.info("Open deferred deep link (adjustTestSchema://)"); - - // checking the default values of the first session package - // should only have one package - assertUtil.isEqual(1, mockPackageHandler.queue.size()); - - AttributionResponseData attributionResponseWrongDeeplink = (AttributionResponseData)ResponseData.buildResponseData(mockAttributionHandler.attributionPackage); - attributionResponseWrongDeeplink.deeplink = Uri.parse("wrongDeeplink://"); - - activityHandler.launchAttributionResponseTasks(attributionResponseWrongDeeplink); - SystemClock.sleep(1500); - - assertUtil.info("Deferred deeplink received (wrongDeeplink://)"); - assertUtil.error("Unable to open deferred deep link (wrongDeeplink://)"); - assertUtil.notInInfo("Open deferred deep link (wrongDeeplink://)"); - } - - @Test - public void testNotLaunchDeeplinkCallback() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testNotLaunchDeeplinkCallback"); - - // create the config to start the session - AdjustConfig config = getConfig(); - - config.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() { - @Override - public boolean launchReceivedDeeplink(Uri deeplink) { - mockLogger.test("launchReceivedDeeplink, " + deeplink); - return false; - } - }); - - // start activity handler with config - ActivityHandler activityHandler = startAndCheckFirstSession(config); - - // test attribution response - AttributionResponseData attributionResponseDeeplink = (AttributionResponseData)ResponseData.buildResponseData(mockAttributionHandler.attributionPackage); - attributionResponseDeeplink.deeplink = Uri.parse("adjustTestSchema://"); - - activityHandler.launchAttributionResponseTasks(attributionResponseDeeplink); - SystemClock.sleep(1500); - - // received the deferred deeplink - assertUtil.info("Deferred deeplink received (adjustTestSchema://)"); - // but it did not try to launch it - assertUtil.test("launchReceivedDeeplink, adjustTestSchema://"); - assertUtil.notInError("Unable to open deferred deep link (adjustTestSchema://)"); - assertUtil.notInInfo("Open deferred deep link (adjustTestSchema://)"); - } - - @Test - public void testDeeplinkCallback() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testDeeplinkCallback"); - - // create the config to start the session - AdjustConfig config = getConfig(); - - config.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() { - @Override - public boolean launchReceivedDeeplink(Uri deeplink) { - mockLogger.test("launchReceivedDeeplink, " + deeplink); - return true; - } - }); - - // start activity handler with config - ActivityHandler activityHandler = startAndCheckFirstSession(config); - - // set package handler to respond with a valid attribution - AttributionResponseData attributionResponseDeeplink = (AttributionResponseData)ResponseData.buildResponseData(mockAttributionHandler.attributionPackage); - attributionResponseDeeplink.deeplink = Uri.parse("adjustTestSchema://"); - - activityHandler.launchAttributionResponseTasks(attributionResponseDeeplink); - SystemClock.sleep(2000); - - // received the deferred deeplink - assertUtil.info("Deferred deeplink received (adjustTestSchema://)"); - // and it did launch it - assertUtil.test("launchReceivedDeeplink, adjustTestSchema://"); - assertUtil.notInError("Unable to open deferred deep link (adjustTestSchema://)"); - assertUtil.info("Open deferred deep link (adjustTestSchema://)"); - } - - @Test - public void testUpdateAttribution() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testUpdateAttribution"); - - // create the config to start the session - AdjustConfig config = getConfig(); - - // start activity handler with config - ActivityHandler firstActivityHandler = startAndCheckFirstSession(config); - - JSONObject nullJsonObject = null; - AdjustAttribution nullAttribution = AdjustAttribution.fromJson(nullJsonObject, null); //XXX - - // check if Attribution wasn't built - assertUtil.isNull(nullAttribution); - - // check that it does not update a null attribution - assertUtil.isFalse(firstActivityHandler.updateAttributionI(nullAttribution)); - - // create an empty attribution - JSONObject emptyJsonResponse = null; - try { - emptyJsonResponse = new JSONObject("{ }"); - } catch (JSONException e) { - assertUtil.fail(e.getMessage()); - } - AdjustAttribution emptyAttribution = AdjustAttribution.fromJson(emptyJsonResponse, null); // XXX - - // check that updates attribution - assertUtil.isTrue(firstActivityHandler.updateAttributionI(emptyAttribution)); - assertUtil.debug("Wrote Attribution: tt:null tn:null net:null cam:null adg:null cre:null cl:null"); - - emptyAttribution = AdjustAttribution.fromJson(emptyJsonResponse, null); // XXX - - // test first session package - ActivityPackage firstSessionPackage = mockPackageHandler.queue.get(0); - - // simulate a session response with attribution data - SessionResponseData sessionResponseDataWithAttribution = (SessionResponseData)ResponseData.buildResponseData(firstSessionPackage); - sessionResponseDataWithAttribution.attribution = emptyAttribution; - - // check that it does not update the attribution - firstActivityHandler.launchSessionResponseTasks(sessionResponseDataWithAttribution); - SystemClock.sleep(1000); - assertUtil.notInDebug("Wrote Attribution"); - - // end session - firstActivityHandler.onPause(); - SystemClock.sleep(1000); - - checkEndSession(); - - // create the new config - config = getConfig(); - - config.setOnAttributionChangedListener(new OnAttributionChangedListener() { - @Override - public void onAttributionChanged(AdjustAttribution attribution) { - mockLogger.test("restartActivityHandler onAttributionChanged: " + attribution); - } - }); - - ActivityHandler restartActivityHandler = getActivityHandler(config); - - SystemClock.sleep(1500); - - StateActivityHandlerInit restartActivityHandlerInit = new StateActivityHandlerInit(restartActivityHandler); - restartActivityHandlerInit.activityStateAlreadyCreated = true; - restartActivityHandlerInit.readActivityState = "ec:0 sc:1 ssc:1"; - restartActivityHandlerInit.readAttribution = "tt:null tn:null net:null cam:null adg:null cre:null cl:null"; - - // test init values - checkInitTests(restartActivityHandlerInit); - - resumeActivity(restartActivityHandler); - - SystemClock.sleep(2000); - - StateSession firstRestart = new StateSession(StateSession.SessionType.NEW_SUBSESSION); - firstRestart.subsessionCount = 2; - firstRestart.foregroundTimerAlreadyStarted = false; - checkStartInternal(firstRestart); - - // check that it does not update the attribution after the restart - assertUtil.isFalse(restartActivityHandler.updateAttributionI(emptyAttribution)); - assertUtil.notInDebug("Wrote Attribution"); - - // new attribution - JSONObject firstAttributionJson = null; - try { - firstAttributionJson = new JSONObject("{ " + - "\"tracker_token\" : \"ttValue\" , " + - "\"tracker_name\" : \"tnValue\" , " + - "\"network\" : \"nValue\" , " + - "\"campaign\" : \"cpValue\" , " + - "\"adgroup\" : \"aValue\" , " + - "\"creative\" : \"ctValue\" , " + - "\"click_label\" : \"clValue\" }"); - } catch (JSONException e) { - assertUtil.fail(e.getMessage()); - } - AdjustAttribution firstAttribution = AdjustAttribution.fromJson(firstAttributionJson, null); // XXX - - //check that it updates - sessionResponseDataWithAttribution.attribution = firstAttribution; - restartActivityHandler.launchSessionResponseTasks(sessionResponseDataWithAttribution); - SystemClock.sleep(1000); - - assertUtil.debug("Wrote Attribution: tt:ttValue tn:tnValue net:nValue cam:cpValue adg:aValue cre:ctValue cl:clValue"); - assertUtil.test("restartActivityHandler onAttributionChanged: tt:ttValue tn:tnValue net:nValue cam:cpValue adg:aValue cre:ctValue cl:clValue"); - - // test first session package - ActivityPackage attributionPackage = mockAttributionHandler.attributionPackage; - // simulate a session response with attribution data - AttributionResponseData attributionResponseDataWithAttribution = (AttributionResponseData)ResponseData.buildResponseData(attributionPackage); - - attributionResponseDataWithAttribution.attribution = firstAttribution; - // check that it does not update the attribution - restartActivityHandler.launchAttributionResponseTasks(attributionResponseDataWithAttribution); - SystemClock.sleep(1000); - - assertUtil.notInDebug("Wrote Attribution"); - - // end session - restartActivityHandler.onPause(); - SystemClock.sleep(1000); - - checkEndSession(); - - config = getConfig(); - - config.setOnAttributionChangedListener(new OnAttributionChangedListener() { - @Override - public void onAttributionChanged(AdjustAttribution attribution) { - mockLogger.test("secondRestartActivityHandler onAttributionChanged: " + attribution); - } - }); - - ActivityHandler secondRestartActivityHandler = getActivityHandler(config);; - - SystemClock.sleep(1500); - - StateActivityHandlerInit secondrestartActivityHandlerInit = new StateActivityHandlerInit(secondRestartActivityHandler); - secondrestartActivityHandlerInit.activityStateAlreadyCreated = true; - secondrestartActivityHandlerInit.readActivityState = "ec:0 sc:1 ssc:2"; - secondrestartActivityHandlerInit.readAttribution = "tt:ttValue tn:tnValue net:nValue cam:cpValue adg:aValue cre:ctValue cl:clValue"; - - SystemClock.sleep(2000); - - // test init values - checkInitTests(secondrestartActivityHandlerInit); - - resumeActivity(secondRestartActivityHandler); - - SystemClock.sleep(2000); - - StateSession secondRestart = new StateSession(StateSession.SessionType.NEW_SUBSESSION); - secondRestart.subsessionCount = 3; - secondRestart.foregroundTimerAlreadyStarted = false; - - checkStartInternal(secondRestart); - - // check that it does not update the attribution after the restart - assertUtil.isFalse(secondRestartActivityHandler.updateAttributionI(firstAttribution)); - assertUtil.notInDebug("Wrote Attribution"); - - // new attribution - JSONObject secondAttributionJson = null; - try { - secondAttributionJson = new JSONObject("{ " + - "\"tracker_token\" : \"ttValue2\" , " + - "\"tracker_name\" : \"tnValue2\" , " + - "\"network\" : \"nValue2\" , " + - "\"campaign\" : \"cpValue2\" , " + - "\"adgroup\" : \"aValue2\" , " + - "\"creative\" : \"ctValue2\" , " + - "\"click_label\" : \"clValue2\" }"); - } catch (JSONException e) { - assertUtil.fail(e.getMessage()); - } - AdjustAttribution secondAttribution = AdjustAttribution.fromJson(secondAttributionJson, null); // XXX - - //check that it updates - attributionResponseDataWithAttribution.attribution = secondAttribution; - secondRestartActivityHandler.launchAttributionResponseTasks(attributionResponseDataWithAttribution); - SystemClock.sleep(2000); - - assertUtil.debug("Wrote Attribution: tt:ttValue2 tn:tnValue2 net:nValue2 cam:cpValue2 adg:aValue2 cre:ctValue2 cl:clValue2"); - - // check that it launch the saved attribute - assertUtil.test("secondRestartActivityHandler onAttributionChanged: tt:ttValue2 tn:tnValue2 net:nValue2 cam:cpValue2 adg:aValue2 cre:ctValue2 cl:clValue2"); - - // check that it does not update the attribution - assertUtil.isFalse(secondRestartActivityHandler.updateAttributionI(secondAttribution)); - assertUtil.notInDebug("Wrote Attribution"); - } - - @Test - public void testOfflineMode() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testOfflineMode"); - - // adjust the session intervals for testing - AdjustFactory.setSessionInterval(2000); - AdjustFactory.setSubsessionInterval(500); - - // create the config to start the session - AdjustConfig config = getConfig(); - - // start activity handler with config - ActivityHandler activityHandler = getActivityHandler(config); - - // put SDK offline - activityHandler.setOfflineMode(true); - - SystemClock.sleep(1000); - - ActivityHandler.InternalState internalState = activityHandler.getInternalState(); - - // check if it's offline before the sdk starts - assertUtil.isTrue(internalState.isOffline()); - - SystemClock.sleep(1500); - - // not writing activity state because it set enable does not start the sdk - assertUtil.notInDebug("Wrote Activity state"); - - // test init values - checkInitTests(activityHandler); - - // check if message the disable of the SDK - assertUtil.info("Handlers will start paused due to SDK being offline"); - - // check change from set offline mode - checkHandlerStatus(true); - - // start the sdk - // foreground timer starts because it's offline, not disabled - resumeActivity(activityHandler); - - SystemClock.sleep(2500); - - // test first session start - StateSession firstSessionStartPaused = new StateSession(StateSession.SessionType.NEW_SESSION); - firstSessionStartPaused.toSend = false; - firstSessionStartPaused.foregroundTimerStarts = true; - - // check session that is paused - checkStartInternal(firstSessionStartPaused); - - stopActivity(activityHandler); - SystemClock.sleep(1500); - - // test end session of offline - StateEndSession stateOfflineEndSession = new StateEndSession(); - stateOfflineEndSession.checkOnPause = true; - stateOfflineEndSession.updateActivityState = false; // update too late on the session - checkEndSession(stateOfflineEndSession); - - // disable the SDK in the background - activityHandler.setEnabled(false); - - SystemClock.sleep(1000); - - // check that it is disabled - assertUtil.isFalse(activityHandler.isEnabled()); - - // writing activity state after disabling - assertUtil.debug("Wrote Activity state: ec:0 sc:1 ssc:1"); - - // check if message the disable of the SDK - assertUtil.info("Pausing handlers due to SDK being disabled"); - - // start a session while offline and disabled - SystemClock.sleep(2500); - - // check handler status update of disable - checkHandlerStatus(true); - - // try to start new session disabled - resumeActivity(activityHandler); - SystemClock.sleep(1500); - - // session not created for being disabled - // foreground timer does not start because it's offline, not disabled - StateSession sessionDisabled = new StateSession(StateSession.SessionType.DISABLED); - sessionDisabled.toSend = false; - sessionDisabled.foregroundTimerStarts = false; - sessionDisabled.disabled = true; - - checkStartInternal(sessionDisabled); - - // put SDK back online - activityHandler.setOfflineMode(false); - - SystemClock.sleep(1500); - - assertUtil.info("Handlers remain paused"); - - // test the update status, still paused - checkHandlerStatus(true); - - // try to do activities while SDK disabled - resumeActivity(activityHandler); - activityHandler.trackEvent(new AdjustEvent("event1")); - - SystemClock.sleep(2500); - - // check that timer was not executed - checkForegroundTimerFired(false); - - // session not created for being disabled - // foreground timer does not start because it's offline, not disabled - checkStartInternal(sessionDisabled); - - // end the session - stopActivity(activityHandler); - - SystemClock.sleep(1000); - - StateEndSession stateDisableEndSession = new StateEndSession(); - stateDisableEndSession.checkOnPause = true; - stateDisableEndSession.foregroundAlreadySuspended = true; // did not start timer disabled - stateDisableEndSession.updateActivityState = false; // update too late on the session - checkEndSession(stateDisableEndSession); - - // enable the SDK again - activityHandler.setEnabled(true); - - SystemClock.sleep(1000); - - // check that is enabled - assertUtil.isTrue(activityHandler.isEnabled()); - - assertUtil.debug("Wrote Activity state"); - - assertUtil.info("Resuming handlers due to SDK being enabled"); - - SystemClock.sleep(2500); - - // it is still paused because it's on the background - checkHandlerStatus(true); - - resumeActivity(activityHandler); - - SystemClock.sleep(1500); - - StateSession secondSessionState = new StateSession(StateSession.SessionType.NEW_SESSION); - secondSessionState.sessionCount = 2; - // test that is not paused anymore - checkStartInternal(secondSessionState); - } - - @Test - public void testSendReferrer() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testSendReferrer"); - - // create the config to start the session - AdjustConfig config = getConfig(); - - long now = System.currentTimeMillis(); - - String referrerBeforeLaunch = "referrerBeforeLaunch"; - - SharedPreferences settings = context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = settings.edit(); - editor.putString(Constants.REFERRER_PREFKEY, referrerBeforeLaunch); - editor.putLong(Constants.REFERRER_CLICKTIME_PREFKEY, now); - editor.apply(); - - // start activity handler with config - ActivityHandler activityHandler = getActivityHandler(config); - - SystemClock.sleep(1500); - - // test init values - StateActivityHandlerInit stateActivityHandlerInit = new StateActivityHandlerInit(activityHandler); - //stateActivityHandlerInit.sendReferrer = referrerBeforeLaunch; - checkInitTests(stateActivityHandlerInit); - - resumeActivity(activityHandler); - - SystemClock.sleep(1500); - - // test session - checkFirstSession(); - - String reftag = "adjust_reftag=referrerValue"; - String extraParams = "adjust_foo=bar&other=stuff&adjust_key=value"; - String mixed = "adjust_foo=bar&other=stuff&adjust_reftag=referrerValue"; - String encodedSeparators = "adjust_foo=b%26a%3B%3Dr&adjust_reftag=referrer%3DValue%26&other=stuff"; - String empty = ""; - String nullString = null; - String single = "adjust_foo"; - String prefix = "adjust_=bar"; - String incomplete = "adjust_foo="; - - activityHandler.sendReferrer(reftag, now); - activityHandler.sendReferrer(extraParams, now); - activityHandler.sendReferrer(mixed, now); - activityHandler.sendReferrer(encodedSeparators, now); - activityHandler.sendReferrer(empty, now); - activityHandler.sendReferrer(nullString, now); - activityHandler.sendReferrer(single, now); - activityHandler.sendReferrer(prefix, now); - activityHandler.sendReferrer(incomplete, now); - SystemClock.sleep(2000); - - assertUtil.verbose("Referrer to parse (%s)", reftag); - assertUtil.test("SdkClickHandler sendSdkClick"); - - assertUtil.verbose("Referrer to parse (%s)", extraParams); - assertUtil.test("SdkClickHandler sendSdkClick"); - - assertUtil.verbose("Referrer to parse (%s)", mixed); - assertUtil.test("SdkClickHandler sendSdkClick"); - - assertUtil.verbose("Referrer to parse (%s)", encodedSeparators); - assertUtil.test("SdkClickHandler sendSdkClick"); - - assertUtil.verbose("Referrer to parse (%s)", single); - assertUtil.test("SdkClickHandler sendSdkClick"); - - assertUtil.verbose("Referrer to parse (%s)", prefix); - assertUtil.test("SdkClickHandler sendSdkClick"); - - assertUtil.verbose("Referrer to parse (%s)", incomplete); - assertUtil.test("SdkClickHandler sendSdkClick"); - - // 7 click - assertUtil.isEqual(8, mockSdkClickHandler.queue.size()); - - ActivityPackage referrerBeforeLaunchPacakge = mockSdkClickHandler.queue.get(0); - - TestActivityPackage referrerBeforeLaunchTest = new TestActivityPackage(referrerBeforeLaunchPacakge); - - referrerBeforeLaunchTest.referrer = referrerBeforeLaunch; - - referrerBeforeLaunchTest.testClickPackage("reftag", true); - - ActivityPackage reftagClickPackage = mockSdkClickHandler.queue.get(1); - - TestActivityPackage reftagClickPackageTest = new TestActivityPackage(reftagClickPackage); - - reftagClickPackageTest.reftag = "referrerValue"; - reftagClickPackageTest.referrer = reftag; - - reftagClickPackageTest.testClickPackage("reftag"); - - // get the click package - ActivityPackage extraParamsClickPackage = mockSdkClickHandler.queue.get(2); - - // create activity package test - TestActivityPackage testExtraParamsClickPackage = new TestActivityPackage(extraParamsClickPackage); - - // other deep link parameters - testExtraParamsClickPackage.otherParameters = "{\"key\":\"value\",\"foo\":\"bar\"}"; - - testExtraParamsClickPackage.referrer = extraParams; - - // test the second deeplink - testExtraParamsClickPackage.testClickPackage("reftag"); - - // get the click package - ActivityPackage mixedClickPackage = mockSdkClickHandler.queue.get(3); - - // create activity package test - TestActivityPackage testMixedClickPackage = new TestActivityPackage(mixedClickPackage); - - testMixedClickPackage.reftag = "referrerValue"; - testMixedClickPackage.referrer = mixed; - - // other deep link parameters - testMixedClickPackage.otherParameters = "{\"foo\":\"bar\"}"; - - // test the third deeplink - testMixedClickPackage.testClickPackage("reftag"); - - // get the click package - ActivityPackage encodedClickPackage = mockSdkClickHandler.queue.get(4); - - // create activity package test - TestActivityPackage testEncodedClickPackage = new TestActivityPackage(encodedClickPackage); - - testEncodedClickPackage.reftag = "referrer=Value&"; - testEncodedClickPackage.referrer = encodedSeparators; - - // other deep link parameters - testEncodedClickPackage.otherParameters = "{\"foo\":\"b&a;=r\"}"; - - // test the third deeplink - testMixedClickPackage.testClickPackage("reftag"); - - // get the click package - ActivityPackage singleClickPackage = mockSdkClickHandler.queue.get(5); - - // create activity package test - TestActivityPackage testSingleClickPackage = new TestActivityPackage(singleClickPackage); - - testSingleClickPackage.referrer = single; - - testSingleClickPackage.testClickPackage("reftag"); - - // get the click package - ActivityPackage prefixClickPackage = mockSdkClickHandler.queue.get(6); - - // create activity package test - TestActivityPackage testPrefixClickPackage = new TestActivityPackage(prefixClickPackage); - - testPrefixClickPackage.referrer = prefix; - - testPrefixClickPackage.testClickPackage("reftag"); - - // get the click package - ActivityPackage incompleteClickPackage = mockSdkClickHandler.queue.get(7); - - // create activity package test - TestActivityPackage testIncompleteClickPackage = new TestActivityPackage(incompleteClickPackage); - - testIncompleteClickPackage.referrer = incomplete; - - testIncompleteClickPackage.testClickPackage("reftag"); - } - - @Test - public void testCheckAttributionState() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testCheckAttributionState"); - - // if it's the first launch - //if (internalState.isFirstLaunch()) { - // if (internalState.hasSessionResponseNotBeenProcessed()) { - // return; - // } - //} - //if (attribution != null && !activityState.askingAttribution) { - // return; - //} - //attributionHandler.getAttribution(); - - AdjustFactory.setSessionInterval(4000); - - // create the config to start the session - AdjustConfig config = getConfig(); - - config.setOnAttributionChangedListener(new OnAttributionChangedListener() { - @Override - public void onAttributionChanged(AdjustAttribution attribution) { - mockLogger.test("onAttributionChanged " + attribution); - } - }); - - // start activity handler with config - ActivityHandler activityHandler = getActivityHandler(config); - - SystemClock.sleep(1500); - - // test init values - checkInitTests(activityHandler); - - resumeActivity(activityHandler); - - SystemClock.sleep(1500); - - // it's first launch - // session response has not been processed - // attribution is null - // -> not called - - StateSession newSessionState = new StateSession(StateSession.SessionType.NEW_SESSION); - newSessionState.getAttributionIsCalled = false; - checkStartInternal(newSessionState); - - ActivityPackage firstSessionPackage = mockPackageHandler.queue.get(0); - - // trigger a new sub session - activityHandler.onResume(); - SystemClock.sleep(2000); - - // does not call because the session has not been processed - checkSubSession(1, 2, false); - - // it's first launch - // session response has been processed - // attribution is null - // -> called - - // simulate a successful session - SessionResponseData successSessionResponseData = (SessionResponseData) ResponseData.buildResponseData(firstSessionPackage); - successSessionResponseData.success = true; - successSessionResponseData.message = "Session successfully tracked"; - successSessionResponseData.adid = "adidValue"; - - activityHandler.launchSessionResponseTasks(successSessionResponseData); - - // trigger a new sub session - activityHandler.onResume(); - SystemClock.sleep(2000); - - // does call because the session has been processed - checkSubSession(1, 3, true); - - // it's first launch - // session response has been processed - // attribution is not null - // askingAttribution is false - // -> not called - - // save the new attribution - successSessionResponseData.attribution = new AdjustAttribution(); - successSessionResponseData.attribution.trackerName = "trackerName"; - activityHandler.launchSessionResponseTasks(successSessionResponseData); - - activityHandler.setAskingAttribution(false); - - // trigger a new sub session - activityHandler.onResume(); - SystemClock.sleep(2000); - - // does call because the session has been processed - checkSubSession(1, 4, false); - - // it's first launch - // session response has been processed - // attribution is not null - // askingAttribution is true - // -> called - - activityHandler.setAskingAttribution(true); - - // trigger a new sub session - activityHandler.onResume(); - SystemClock.sleep(2000); - - // does call because the session has been processed - checkSubSession(1, 5, true); - - // it's not first launch - // attribution is null - // -> called - - // finish activity handler - activityHandler.teardown(false); - // delete attribution - ActivityHandler.deleteAttribution(context); - - // start new activity handler - SystemClock.sleep(5000); - activityHandler = getActivityHandler(config); - - SystemClock.sleep(1500); - - // test init values - StateActivityHandlerInit stateActivityHandlerInit = new StateActivityHandlerInit(activityHandler); - stateActivityHandlerInit.readActivityState = "ec:0 sc:1 ssc:5"; - - checkInitTests(stateActivityHandlerInit); - - resumeActivity(activityHandler); - - SystemClock.sleep(1500); - - newSessionState = new StateSession(StateSession.SessionType.NEW_SESSION); - newSessionState.getAttributionIsCalled = true; - newSessionState.sessionCount = 2; - checkStartInternal(newSessionState); - - // it's not first launch - // attribution is not null - // askingAttribution is true - // -> called - - // save the new attribution - successSessionResponseData.attribution = new AdjustAttribution(); - successSessionResponseData.attribution.trackerName = "trackerName"; - activityHandler.launchSessionResponseTasks(successSessionResponseData); - - activityHandler.setAskingAttribution(true); - - // trigger a new sub session - activityHandler.onResume(); - SystemClock.sleep(2000); - - // does call because the session has been processed - checkSubSession(2, 2, true); - - // it's not first launch - // attribution is not null - // askingAttribution is false - // -> not called - - activityHandler.setAskingAttribution(false); - - // trigger a new sub session - activityHandler.onResume(); - SystemClock.sleep(2000); - - // does call because the session has been processed - checkSubSession(2, 3, false); - } - - @Test - public void testForegroundTimer() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testForegroundTimer"); - - AdjustFactory.setTimerInterval(4000); - AdjustFactory.setTimerStart(4000); - - // create the config to start the session - AdjustConfig config = getConfig(); - - // start activity handler with config - ActivityHandler activityHandler = getActivityHandler(config); - - SystemClock.sleep(1500); - - // test init values - StateActivityHandlerInit stateActivityHandlerInit = new StateActivityHandlerInit(activityHandler); - stateActivityHandlerInit.foregroundTimerStart = 4; - stateActivityHandlerInit.foregroundTimerCycle = 4; - checkInitTests(stateActivityHandlerInit); - - resumeActivity(activityHandler); - - SystemClock.sleep(1500); - - // test session - checkFirstSession(); - - // wait enough to fire the first cycle - SystemClock.sleep(3000); - - checkForegroundTimerFired(true); - - // end subsession to stop timer - activityHandler.onPause(); - - // wait enough for a new cycle - SystemClock.sleep(6000); - - // start a new session - activityHandler.onResume(); - - SystemClock.sleep(1000); - - // check that not enough time passed to fire again - checkForegroundTimerFired(false); - } - - @Test - public void testSendBackground() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testSendBackground"); - - AdjustFactory.setTimerInterval(4000); - - // create the config to start the session - AdjustConfig config = getConfig(); - - // enable send in the background - config.setSendInBackground(true); - - // create activity handler without starting - ActivityHandler activityHandler = getActivityHandler(config); - - SystemClock.sleep(1500); - - // handlers start sending - StateActivityHandlerInit stateActivityHandlerInit = new StateActivityHandlerInit(activityHandler); - stateActivityHandlerInit.startsSending = true; - stateActivityHandlerInit.sendInBackgroundConfigured = true; - stateActivityHandlerInit.foregroundTimerCycle = 4; - checkInitTests(stateActivityHandlerInit); - - resumeActivity(activityHandler); - - SystemClock.sleep(1500); - - // test session - StateSession newStateSession= new StateSession(StateSession.SessionType.NEW_SESSION); - newStateSession.sendInBackgroundConfigured = true; - newStateSession.toSend = true; - checkStartInternal(newStateSession); - - // end subsession - // background timer starts - stopActivity(activityHandler); - - SystemClock.sleep(1500); - - // session end does not pause the handlers - StateEndSession stateEndSession1 = new StateEndSession(); - stateEndSession1.pausing = false; - stateEndSession1.checkOnPause = true; - stateEndSession1.backgroundTimerStarts = true; - checkEndSession(stateEndSession1); - - // end subsession again - // to test if background timer starts again - stopActivity(activityHandler); - - SystemClock.sleep(1500); - - // session end does not pause the handlers - StateEndSession stateEndSession2 = new StateEndSession(); - stateEndSession2.pausing = false; - stateEndSession2.checkOnPause = true; - stateEndSession2.foregroundAlreadySuspended = true; - checkEndSession(stateEndSession2); - - // wait for background timer launch - SystemClock.sleep(3000); - - // background timer fired - assertUtil.test("PackageHandler sendFirstPackage"); - - // wait enough time - SystemClock.sleep(3000); - - // check that background timer does not fire again - assertUtil.notInTest("PackageHandler sendFirstPackage"); - - activityHandler.trackEvent(new AdjustEvent("abc123")); - - SystemClock.sleep(1000); - - StateEvent stateEvent = new StateEvent(); - stateEvent.backgroundTimerStarts = 4; - checkEvent(stateEvent); - - // disable and enable the sdk while in the background - activityHandler.setEnabled(false); - - SystemClock.sleep(1000); - - // check that it is disabled - assertUtil.isFalse(activityHandler.isEnabled()); - - // check if message the disable of the SDK - assertUtil.info("Pausing handlers due to SDK being disabled"); - - SystemClock.sleep(1000); - - // handlers being paused because of the disable - checkHandlerStatus(true); - - activityHandler.setEnabled(true); - - SystemClock.sleep(1000); - - // check that it is enabled - assertUtil.isTrue(activityHandler.isEnabled()); - - // check if message the enable of the SDK - assertUtil.info("Resuming handlers due to SDK being enabled"); - - SystemClock.sleep(1000); - - // handlers being resumed because of the enable - // even in the background because of the sendInBackground option - checkHandlerStatus(false); - - // set offline and online the sdk while in the background - activityHandler.setOfflineMode(true); - - SystemClock.sleep(1000); - - ActivityHandler.InternalState internalState = activityHandler.getInternalState(); - - // check that it is offline - assertUtil.isTrue(internalState.isOffline()); - - // check if message the offline of the SDK - assertUtil.info("Pausing handlers to put SDK offline mode"); - - SystemClock.sleep(1000); - - // handlers being paused because of the offline - checkHandlerStatus(true); - - activityHandler.setOfflineMode(false); - - SystemClock.sleep(1000); - - // check that it is online - assertUtil.isTrue(internalState.isOnline()); - - // check if message the online of the SDK - assertUtil.info("Resuming handlers to put SDK in online mode"); - - SystemClock.sleep(1000); - - // handlers being resumed because of the online - // even in the background because of the sendInBackground option - checkHandlerStatus(false); - } - - @Test - public void testSessionParameters() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testSessionParameters"); - - // create the config to start the session - AdjustConfig config = getConfig(); - - // create handler and start the first session - config.preLaunchActionsArray = new ArrayList(); - config.preLaunchActionsArray.add(new IRunActivityHandler() { - @Override - public void run(ActivityHandler activityHandler) { - // - activityHandler.addSessionCallbackParameterI("cKey", "cValue"); - activityHandler.addSessionCallbackParameterI("cFoo", "cBar"); - - activityHandler.addSessionCallbackParameterI("cKey", "cValue2"); - activityHandler.resetSessionCallbackParametersI(); - - activityHandler.addSessionCallbackParameterI("cKey", "cValue"); - activityHandler.addSessionCallbackParameterI("cFoo", "cBar"); - activityHandler.removeSessionCallbackParameterI("cKey"); - - // - activityHandler.addSessionPartnerParameterI("pKey", "pValue"); - activityHandler.addSessionPartnerParameterI("pFoo", "pBar"); - - activityHandler.addSessionPartnerParameterI("pKey", "pValue2"); - activityHandler.resetSessionPartnerParametersI(); - - activityHandler.addSessionPartnerParameterI("pKey", "pValue"); - activityHandler.addSessionPartnerParameterI("pFoo", "pBar"); - activityHandler.removeSessionPartnerParameterI("pKey"); - } - }); - - ActivityHandler activityHandler = getActivityHandler(config); - - SystemClock.sleep(1500); - - // test init values - checkInitTests(activityHandler); - - checkSessionParameters(); - - resumeActivity(activityHandler); - - AdjustEvent firstEvent = new AdjustEvent("event1"); - activityHandler.trackEvent(firstEvent); - - SystemClock.sleep(1500); - - // test session - checkFirstSession(); - - StateEvent stateEvent1 = new StateEvent(); - checkEvent(stateEvent1); - - // 1 session + 1 event - assertUtil.isEqual(2, mockPackageHandler.queue.size()); - - // get the session package - ActivityPackage firstSessionPackage = mockPackageHandler.queue.get(0); - - // create event package test - TestActivityPackage testFirstSessionPackage = new TestActivityPackage(firstSessionPackage); - - // set event test parameters - testFirstSessionPackage.callbackParams = "{\"cFoo\":\"cBar\"}"; - testFirstSessionPackage.partnerParams = "{\"pFoo\":\"pBar\"}"; - - testFirstSessionPackage.testSessionPackage(1); - - // get the event - ActivityPackage firstEventPackage = mockPackageHandler.queue.get(1); - - // create event package test - TestActivityPackage testFirstEventPackage = new TestActivityPackage(firstEventPackage); - - // set event test parameters - testFirstEventPackage.eventCount = "1"; - testFirstEventPackage.suffix = "'event1'"; - testFirstEventPackage.callbackParams = "{\"cFoo\":\"cBar\"}"; - testFirstEventPackage.partnerParams = "{\"pFoo\":\"pBar\"}"; - - testFirstEventPackage.testEventPackage("event1"); - - // end current session - stopActivity(activityHandler); - SystemClock.sleep(1000); - - checkEndSession(); - activityHandler.teardown(false); - activityHandler = null; - - AdjustConfig newConfig = getConfig(); - ActivityHandler restartActivityHandler = getActivityHandler(newConfig); - - SystemClock.sleep(1500); - - // start new one - // delay start not configured because activity state is already created - StateActivityHandlerInit restartActivityHandlerInit = new StateActivityHandlerInit(restartActivityHandler); - restartActivityHandlerInit.activityStateAlreadyCreated = true; - restartActivityHandlerInit.readActivityState = "ec:1 sc:1"; - restartActivityHandlerInit.readCallbackParameters = "{cFoo=cBar}"; - restartActivityHandlerInit.readPartnerParameters = "{pFoo=pBar}"; - - // test init values - checkInitTests(restartActivityHandlerInit); - - resumeActivity(restartActivityHandler); - - SystemClock.sleep(1500); - - StateSession stateRestartSession = new StateSession(StateSession.SessionType.NEW_SUBSESSION); - stateRestartSession.subsessionCount = 2; - stateRestartSession.eventCount = 1; - - checkStartInternal(stateRestartSession); - - // create the second Event - AdjustEvent secondEvent = new AdjustEvent("event2"); - secondEvent.addCallbackParameter("ceFoo", "ceBar"); - secondEvent.addPartnerParameter("peFoo", "peBar"); - - restartActivityHandler.trackEvent(secondEvent); - - AdjustEvent thirdEvent = new AdjustEvent("event3"); - thirdEvent.addCallbackParameter("cFoo", "ceBar"); - thirdEvent.addPartnerParameter("pFoo", "peBar"); - - restartActivityHandler.trackEvent(thirdEvent); - - SystemClock.sleep(1500); - - // 2 events - assertUtil.isEqual(2, mockPackageHandler.queue.size()); - - // get the event - ActivityPackage secondEventPackage = mockPackageHandler.queue.get(0); - - // create event package test - TestActivityPackage testSecondEventPackage = new TestActivityPackage(secondEventPackage); - - // set event test parameters - testSecondEventPackage.eventCount = "2"; - testSecondEventPackage.suffix = "'event2'"; - testSecondEventPackage.callbackParams = "{\"ceFoo\":\"ceBar\",\"cFoo\":\"cBar\"}"; - testSecondEventPackage.partnerParams = "{\"peFoo\":\"peBar\",\"pFoo\":\"pBar\"}"; - - testSecondEventPackage.testEventPackage("event2"); - - // get the event - ActivityPackage thirdEventPackage = mockPackageHandler.queue.get(1); - - // create event package test - TestActivityPackage testThirdEventPackage = new TestActivityPackage(thirdEventPackage); - - // set event test parameters - testThirdEventPackage.eventCount = "3"; - testThirdEventPackage.suffix = "'event3'"; - testThirdEventPackage.callbackParams = "{\"cFoo\":\"ceBar\"}"; - testThirdEventPackage.partnerParams = "{\"pFoo\":\"peBar\"}"; - - testThirdEventPackage.testEventPackage("event3"); - } - - private void checkSessionParameters() { - // - assertUtil.debug("Wrote Session Callback parameters: {cKey=cValue}"); - assertUtil.debug("Wrote Session Callback parameters: {cKey=cValue, cFoo=cBar}"); - - assertUtil.warn("Key cKey will be overwritten"); - assertUtil.debug("Wrote Session Callback parameters: {cKey=cValue2, cFoo=cBar}"); - - assertUtil.debug("Wrote Session Callback parameters: null"); - - assertUtil.debug("Wrote Session Callback parameters: {cKey=cValue}"); - assertUtil.debug("Wrote Session Callback parameters: {cKey=cValue, cFoo=cBar}"); - - assertUtil.debug("Key cKey will be removed"); - assertUtil.debug("Wrote Session Callback parameters: {cFoo=cBar}"); - - // - assertUtil.debug("Wrote Session Partner parameters: {pKey=pValue}"); - assertUtil.debug("Wrote Session Partner parameters: {pKey=pValue, pFoo=pBar}"); - - assertUtil.warn("Key pKey will be overwritten"); - assertUtil.debug("Wrote Session Partner parameters: {pKey=pValue2, pFoo=pBar}"); - - assertUtil.debug("Wrote Session Partner parameters: null"); - - assertUtil.debug("Wrote Session Partner parameters: {pKey=pValue}"); - assertUtil.debug("Wrote Session Partner parameters: {pKey=pValue, pFoo=pBar}"); - - assertUtil.debug("Key pKey will be removed"); - assertUtil.debug("Wrote Session Partner parameters: {pFoo=pBar}"); - } - - @Test - public void testDelayStartTimerFirst() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testDelayStartTimerFirst"); - - // create the config to start the session - AdjustConfig config = getConfig(); - - config.setDelayStart(4); - - config.preLaunchActionsArray = new ArrayList(); - config.preLaunchActionsArray.add(new IRunActivityHandler() { - @Override - public void run(ActivityHandler activityHandler) { - activityHandler.addSessionCallbackParameterI("scpKey", "scpValue"); - activityHandler.addSessionPartnerParameterI("sppKey", "sppValue"); - } - }); - - // create handler and start the first session - // start activity handler with config - ActivityHandler activityHandler = getActivityHandler(config); - - SystemClock.sleep(1500); - - // test init values - StateActivityHandlerInit stateActivityHandlerInit = new StateActivityHandlerInit(activityHandler); - stateActivityHandlerInit.delayStartConfigured = true; - checkInitTests(stateActivityHandlerInit); - - resumeActivity(activityHandler); - resumeActivity(activityHandler); - - SystemClock.sleep(1000); - - StateSession newStateSession = new StateSession(StateSession.SessionType.NEW_SESSION); - // delay start means it starts paused - newStateSession.toSend = false; - // sdk click handler does not start paused - newStateSession.sdkClickHandlerAlsoStartsPaused = false; - // delay configured - newStateSession.delayStart = "4.0"; - - checkStartInternal(newStateSession); - - // change state session for non session - StateSession nonSession = new StateSession(StateSession.SessionType.NONSESSION); - // delay already processed - nonSession.delayStart = null; - nonSession.toSend = false; - nonSession.sdkClickHandlerAlsoStartsPaused = false; - nonSession.foregroundTimerAlreadyStarted = true; - - checkStartInternal(nonSession); - - // create the first Event object with callback and partner parameters - AdjustEvent firstEvent = new AdjustEvent("event1"); - - firstEvent.addCallbackParameter("keyCall", "valueCall"); - firstEvent.addPartnerParameter("keyPartner", "valuePartner"); - - activityHandler.trackEvent(firstEvent); - - SystemClock.sleep(1000); - - StateEvent stateEvent = new StateEvent(); - checkEvent(stateEvent); - - SystemClock.sleep(4000); - - assertUtil.verbose("Delay Start timer fired"); - - checkSendFirstPackages(true, activityHandler.getInternalState(), true, false); - - activityHandler.sendFirstPackages(); - SystemClock.sleep(1000); - - checkSendFirstPackages(false, activityHandler.getInternalState(), true, false); - - // 1 session + 1 event - assertUtil.isEqual(2, mockPackageHandler.queue.size()); - - // get the first event - ActivityPackage firstEventPackage = mockPackageHandler.queue.get(1); - - // create event package test - TestActivityPackage testFirstEventPackage = new TestActivityPackage(firstEventPackage); - - // set event test parameters - testFirstEventPackage.eventCount = "1"; - testFirstEventPackage.savedCallbackParameters = new HashMap(1); - testFirstEventPackage.savedCallbackParameters.put("keyCall", "valueCall"); - testFirstEventPackage.savedPartnerParameters = new HashMap(1); - testFirstEventPackage.savedPartnerParameters.put("keyPartner", "valuePartner"); - testFirstEventPackage.suffix = "'event1'"; - - // test first event - testFirstEventPackage.testEventPackage("event1"); - } - - @Test - public void testDelayStartSendFirst() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testDelayStartSendFirst"); - - // create the config to start the session - AdjustConfig config = getConfig(); - - config.setDelayStart(5); - - // start activity handler with config - ActivityHandler activityHandler = getActivityHandler(config); - - SystemClock.sleep(1500); - - // test init values - StateActivityHandlerInit stateActivityHandlerInit = new StateActivityHandlerInit(activityHandler); - stateActivityHandlerInit.delayStartConfigured = true; - checkInitTests(stateActivityHandlerInit); - - resumeActivity(activityHandler); - resumeActivity(activityHandler); - - SystemClock.sleep(1000); - - StateSession newStateSession = new StateSession(StateSession.SessionType.NEW_SESSION); - // delay start means it starts paused - newStateSession.toSend = false; - // sdk click handler does not start paused - newStateSession.sdkClickHandlerAlsoStartsPaused = false; - // delay configured - newStateSession.delayStart = "5.0"; - - checkStartInternal(newStateSession); - - // change state session for non session - StateSession nonSession = new StateSession(StateSession.SessionType.NONSESSION); - // delay already processed - nonSession.delayStart = null; - nonSession.toSend = false; - nonSession.sdkClickHandlerAlsoStartsPaused = false; - nonSession.foregroundTimerAlreadyStarted = true; - - checkStartInternal(nonSession); - - activityHandler.sendFirstPackages(); - - SystemClock.sleep(3000); - - assertUtil.notInVerbose("Delay Start timer fired"); - - checkSendFirstPackages(true,activityHandler.getInternalState(), true, false); - - activityHandler.sendFirstPackages(); - SystemClock.sleep(1000); - - checkSendFirstPackages(false,activityHandler.getInternalState(), true, false); - } - - @Test - public void testPushToken() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testPushToken"); - - AdjustConfig config = getConfig(); - // set the push token before the sdk starts - config.pushToken = "preStartPushToken"; - - // start activity handler with config - ActivityHandler activityHandler = getActivityHandler(config); - - SystemClock.sleep(1500); - - // test init values - StateActivityHandlerInit stateActivityHandlerInit = new StateActivityHandlerInit(activityHandler); - stateActivityHandlerInit.pushToken = "preStartPushToken"; - checkInitTests(stateActivityHandlerInit); - - resumeActivity(activityHandler); - - SystemClock.sleep(1500); - - // test session - checkFirstSession(); - - // create the first Event - AdjustEvent firstEvent = new AdjustEvent("event1"); - - // track event - activityHandler.trackEvent(firstEvent); - - SystemClock.sleep(1500); - - // checking the default values of the first session package - assertUtil.isEqual(2, mockPackageHandler.queue.size()); - - ActivityPackage activityPackage = mockPackageHandler.queue.get(0); - - // create activity package test - TestActivityPackage testActivityPackage = new TestActivityPackage(activityPackage); - testActivityPackage.pushToken = "preStartPushToken"; - - // set first session - testActivityPackage.testSessionPackage(1); - - // first event - ActivityPackage firstEventPackage = mockPackageHandler.queue.get(1); - - // create event package test - TestActivityPackage testFirstEventPackage = new TestActivityPackage(firstEventPackage); - - // set event test parameters - testFirstEventPackage.eventCount = "1"; - testFirstEventPackage.suffix = "'event1'"; - testFirstEventPackage.pushToken = "preStartPushToken"; - - // test first event - testFirstEventPackage.testEventPackage("event1"); - - // try to update with the same push token - activityHandler.setPushToken("preStartPushToken"); - SystemClock.sleep(1500); - - // should not have added a new package either in the package handler - assertUtil.isEqual(2, mockPackageHandler.queue.size()); - - // nor the click handler - assertUtil.notInTest("SdkClickHandler sendSdkClick"); - assertUtil.isEqual(0, mockSdkClickHandler.queue.size()); - - // update with new push token - activityHandler.setPushToken("newPushToken"); - SystemClock.sleep(1500); - - // check it was added to sdk click handler - assertUtil.notInTest("SdkClickHandler sendSdkClick"); - assertUtil.isEqual(0, mockSdkClickHandler.queue.size()); - - // check that info package was added - assertUtil.test("PackageHandler addPackage"); - - // check that event was sent to package handler - assertUtil.test("PackageHandler sendFirstPackage"); - - // checking that the info package was added - assertUtil.isEqual(3, mockPackageHandler.queue.size()); - - // get the click package - ActivityPackage sdkInfoPackage = mockPackageHandler.queue.get(2); - - // create activity package test - TestActivityPackage testInfoPackage = new TestActivityPackage(sdkInfoPackage); - - testInfoPackage.pushToken = "newPushToken"; - - // test the first deeplink - testInfoPackage.testInfoPackage("push"); - } - - @Test - public void testUpdateStart() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testUpdateStart"); - - // create the config to start the session - AdjustConfig config = getConfig(); - - config.setDelayStart(10.1); - - ActivityHandler activityHandler = getActivityHandler(config); - SystemClock.sleep(1500); - - // test init values - StateActivityHandlerInit stateActivityHandlerInit = new StateActivityHandlerInit(activityHandler); - stateActivityHandlerInit.delayStartConfigured = true; - checkInitTests(stateActivityHandlerInit); - - resumeActivity(activityHandler); - SystemClock.sleep(1000); - - StateSession newStateSession = new StateSession(StateSession.SessionType.NEW_SESSION); - // delay start means it starts paused - newStateSession.toSend = false; - // sdk click handler does not start paused - newStateSession.sdkClickHandlerAlsoStartsPaused = false; - // delay configured - newStateSession.delayStart = "10.0"; - - stopActivity(activityHandler); - SystemClock.sleep(1000); - - StateEndSession stateEndSession = new StateEndSession(); - checkEndSession(stateEndSession); - - activityHandler.teardown(false); - activityHandler = null; - - SystemClock.sleep(1000); - - ActivityHandler restartActivityHandler = getActivityHandler(config); - - SystemClock.sleep(1500); - - // start new one - // delay start not configured because activity state is already created - StateActivityHandlerInit restartActivityHandlerInit = new StateActivityHandlerInit(restartActivityHandler); - restartActivityHandlerInit.activityStateAlreadyCreated = true; - restartActivityHandlerInit.readActivityState = "ec:0 sc:1"; - restartActivityHandlerInit.updatePackages = true; - - // test init values - checkInitTests(restartActivityHandlerInit); - - resumeActivity(restartActivityHandler); - - SystemClock.sleep(1500); - - StateSession stateRestartSession = new StateSession(StateSession.SessionType.NEW_SUBSESSION); - stateRestartSession.activityStateAlreadyCreated = true; - stateRestartSession.subsessionCount = 2; - - checkStartInternal(stateRestartSession); - } - - @Test - public void testLogLevel() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testLogLevel"); - - AdjustConfig config = getConfig(); - - config.setLogLevel(LogLevel.VERBOSE); - config.setLogLevel(LogLevel.DEBUG); - config.setLogLevel(LogLevel.INFO); - config.setLogLevel(LogLevel.WARN); - config.setLogLevel(LogLevel.ERROR); - config.setLogLevel(LogLevel.ASSERT); - - assertUtil.test("MockLogger setLogLevel: " + LogLevel.VERBOSE + ", isProductionEnvironment: false"); - assertUtil.test("MockLogger setLogLevel: " + LogLevel.DEBUG + ", isProductionEnvironment: false"); - assertUtil.test("MockLogger setLogLevel: " + LogLevel.INFO + ", isProductionEnvironment: false"); - assertUtil.test("MockLogger setLogLevel: " + LogLevel.WARN + ", isProductionEnvironment: false"); - assertUtil.test("MockLogger setLogLevel: " + LogLevel.ERROR + ", isProductionEnvironment: false"); - assertUtil.test("MockLogger setLogLevel: " + LogLevel.ASSERT + ", isProductionEnvironment: false"); - - config.setLogLevel(LogLevel.SUPRESS); - - // chooses Assert because config object was not configured to allow suppress - //assertUtil.test("MockLogger setLogLevel: " + LogLevel.ASSERT); - // changed when log in production was introduced - assertUtil.test("MockLogger setLogLevel: " + LogLevel.SUPRESS + ", isProductionEnvironment: false"); - - // init log level with assert because it was not configured to allow suppress - config = getConfig("production", "123456789012", false, context); - - config.setLogLevel(LogLevel.SUPRESS); - - // chooses Assert because config object was not configured to allow suppress - //assertUtil.test("MockLogger setLogLevel: " + LogLevel.ASSERT); - // changed when log in production was introduced - assertUtil.test("MockLogger setLogLevel: " + LogLevel.SUPRESS + ", isProductionEnvironment: true"); - - // init with info because it's sandbox - config = getConfig("sandbox", "123456789012", true, context); - - config.setLogLevel(LogLevel.SUPRESS); - // chooses Supress because config object was configured to allow suppress - assertUtil.test("MockLogger setLogLevel: " + LogLevel.SUPRESS + ", isProductionEnvironment: false"); - - // init with info because it's sandbox - config = getConfig("production", "123456789012", true, context); - - config.setLogLevel(LogLevel.ASSERT); - - // chooses Supress because config object was configured to allow suppress - //assertUtil.test("MockLogger setLogLevel: " + LogLevel.SUPRESS); - // changed when log in production was introduced - assertUtil.test("MockLogger setLogLevel: " + LogLevel.ASSERT + ", isProductionEnvironment: true"); - } - - @Test - public void testTeardown() { - // assert test name to read better in logcat - mockLogger.Assert("TestActivityHandler testTeardown"); - - // change the timer defaults - AdjustFactory.setTimerInterval(4000); - - // create the config to start the session - AdjustConfig config = getConfig(); - - config.setDelayStart(4); - - // enable send in the background - config.setSendInBackground(true); - - // start activity handler with config - ActivityHandler activityHandler = getActivityHandler(config); - - SystemClock.sleep(1500); - - // handlers start sending - StateActivityHandlerInit stateActivityHandlerInit = new StateActivityHandlerInit(activityHandler); - stateActivityHandlerInit.startsSending = false; - stateActivityHandlerInit.sendInBackgroundConfigured = true; - stateActivityHandlerInit.foregroundTimerCycle = 4; - stateActivityHandlerInit.delayStartConfigured = true; - stateActivityHandlerInit.sdkClickHandlerAlsoStartsPaused = false; - checkInitTests(stateActivityHandlerInit); - - resumeActivity(activityHandler); - - SystemClock.sleep(1500); - - // test session - StateSession newStateSession= new StateSession(StateSession.SessionType.NEW_SESSION); - newStateSession.sendInBackgroundConfigured = true; - newStateSession.toSend = false; - newStateSession.sdkClickHandlerAlsoStartsPaused = false; - newStateSession.delayStart = "4.0"; - checkStartInternal(newStateSession); - - activityHandler.teardown(false); - - assertUtil.test("PackageHandler teardown deleteState, false"); - assertUtil.test("AttributionHandler teardown"); - assertUtil.test("SdkClickHandler teardown"); - - activityHandler.teardown(false); - - assertUtil.notInTest("PackageHandler teardown deleteState, false"); - assertUtil.notInTest("AttributionHandler teardown"); - assertUtil.notInTest("SdkClickHandler teardown"); - } - - private AdjustConfig getConfig() { - return getConfig("sandbox", "123456789012", false, context); - } - - private AdjustConfig getConfig(String environment, - String appToken, - boolean allowSupressLogLevel, - Context context) - { - AdjustConfig adjustConfig = null; - - if (allowSupressLogLevel) { - adjustConfig = new AdjustConfig(context, appToken, environment, allowSupressLogLevel); - } else { - adjustConfig = new AdjustConfig(context, appToken, environment); - } - - if (adjustConfig != null) { - if (environment == "sandbox") { - assertUtil.test("MockLogger setLogLevel: " + LogLevel.INFO + ", isProductionEnvironment: " + false); - assertUtil.warn("SANDBOX: Adjust is running in Sandbox mode. Use this setting for testing. Don't forget to set the environment to `production` before publishing!"); - } else if (environment == "production" && !allowSupressLogLevel) { - assertUtil.test("MockLogger setLogLevel: " + LogLevel.INFO + ", isProductionEnvironment: " + true); - assertUtil.warn("PRODUCTION: Adjust is running in Production mode. Use this setting only for the build that you want to publish. Set the environment to `sandbox` if you want to test your app!"); - } else if (environment == "production" && allowSupressLogLevel) { - assertUtil.test("MockLogger setLogLevel: " + LogLevel.SUPRESS + ", isProductionEnvironment: " + true); - assertUtil.warn("PRODUCTION: Adjust is running in Production mode. Use this setting only for the build that you want to publish. Set the environment to `sandbox` if you want to test your app!"); - } else { - assertUtil.fail(); - } - } - - return adjustConfig; - } - - private ActivityHandler startAndCheckFirstSession(AdjustConfig config) { - // start activity handler with config - ActivityHandler activityHandler = getActivityHandler(config); - - SystemClock.sleep(1500); - - startAndCheckFirstSession(activityHandler); - - return activityHandler; - } - - private void startAndCheckFirstSession(ActivityHandler activityHandler) { - // test init values - checkInitTests(activityHandler); - - resumeActivity(activityHandler); - - SystemClock.sleep(1500); - - // test session - checkFirstSession(); - } - - private ActivityHandler getActivityHandler(AdjustConfig config) { - ActivityHandler activityHandler = ActivityHandler.getInstance(config); - - if (activityHandler != null) { - assertUtil.test("MockLogger lockLogLevel"); - - ActivityHandler.InternalState internalState = activityHandler.getInternalState(); - // test default values - assertUtil.isTrue(internalState.isEnabled()); - assertUtil.isTrue(internalState.isOnline()); - assertUtil.isTrue(internalState.isInBackground()); - assertUtil.isTrue(internalState.isNotInDelayedStart()); - assertUtil.isFalse(internalState.itHasToUpdatePackages()); - } - - return activityHandler; - } - - private void checkInitAndStart(ActivityHandler activityHandler, StateActivityHandlerInit initState, StateSession stateSession) { - checkInitTests(initState); - - resumeActivity(activityHandler); - - SystemClock.sleep(1500); - - checkStartInternal(stateSession); - } - - private void checkInitTests(ActivityHandler activityHandler) { - StateActivityHandlerInit stateActivityHandlerInit = new StateActivityHandlerInit(activityHandler); - checkInitTests(stateActivityHandlerInit); - } - - private void checkInitTests(StateActivityHandlerInit sInit) { - checkReadFile(sInit.readAttribution, "Attribution"); - checkReadFile(sInit.readActivityState, "Activity state"); - checkReadFile(sInit.readCallbackParameters, "Session Callback parameters"); - checkReadFile(sInit.readPartnerParameters, "Session Partner parameters"); - - // check values read from activity state - assertUtil.isEqual(sInit.internalState.isEnabled(), sInit.startEnabled); - //assertUtil.isEqual(sInit.internalState.itHasToUpdatePackages(), sInit.updatePackages); - - // check event buffering - if (sInit.eventBufferingIsEnabled) { - assertUtil.info("Event buffering is enabled"); - } else { - assertUtil.notInInfo("Event buffering is enabled"); - } - - // check Google play is set - assertUtil.info("Google Play Services Advertising ID read correctly at start time"); - - // check default tracker - if (sInit.defaultTracker != null) { - assertUtil.info("Default tracker: '%s'", sInit.defaultTracker); - } else { - assertUtil.notInInfo("Default tracker: "); - } - - // check push token - if (sInit.pushToken != null) { - assertUtil.info("Push token: '%s'", sInit.pushToken); - } else { - assertUtil.notInInfo("Push token: "); - } - - // check foreground timer was created - assertUtil.verbose("Foreground timer configured to fire after "+ sInit.foregroundTimerStart - + ".0 seconds of starting and cycles every " + sInit.foregroundTimerCycle + ".0 seconds"); - - // check background timer was created - if (sInit.sendInBackgroundConfigured) { - assertUtil.info("Send in background configured"); - } else { - assertUtil.notInInfo("Send in background configured"); - } - - if (sInit.delayStartConfigured) { - assertUtil.info("Delay start configured"); - assertUtil.isTrue(sInit.internalState.isInDelayedStart()); - } else { - assertUtil.notInInfo("Delay start configured"); - assertUtil.isFalse(sInit.internalState.isInDelayedStart()); - } - - if (sInit.startsSending) { - assertUtil.test("PackageHandler init, startsSending: true"); - assertUtil.test("AttributionHandler init, startsSending: true"); - assertUtil.test("SdkClickHandler init, startsSending: true"); - } else { - assertUtil.test("PackageHandler init, startsSending: false"); - assertUtil.test("AttributionHandler init, startsSending: false"); - if (sInit.sdkClickHandlerAlsoStartsPaused) { - assertUtil.test("SdkClickHandler init, startsSending: false"); - } else { - assertUtil.test("SdkClickHandler init, startsSending: true"); - } - } - - if (sInit.updatePackages) { - checkUpdatePackages(sInit.internalState, sInit.activityStateAlreadyCreated); - } else { - assertUtil.notInTest("PackageHandler updatePackages"); - } - - if (sInit.sendReferrer != null) { - assertUtil.verbose("Referrer to parse (%s)", sInit.sendReferrer); - assertUtil.test("SdkClickHandler sendSdkClick"); - } else { - assertUtil.notInVerbose("Referrer to parse "); - assertUtil.notInTest("SdkClickHandler sendSdkClick"); - } - } - - private void checkReadFile(String fileLog, String objectName) { - if (fileLog == null) { - assertUtil.debug(objectName + " file not found"); - } else { - assertUtil.debug("Read "+ objectName +": " + fileLog); - } - } - - private void resumeActivity(ActivityHandler activityHandler) { - // start activity - activityHandler.onResume(); - - ActivityHandler.InternalState internalState = activityHandler.getInternalState(); - - // comes to the foreground - assertUtil.isTrue(internalState.isInForeground()); - } - - private void checkFirstSession() { - StateSession newStateSession= new StateSession(StateSession.SessionType.NEW_SESSION); - checkStartInternal(newStateSession); - } - - private void checkSubSession(int sessionCount, int subsessionCount, boolean getAttributionIsCalled) { - StateSession subSessionState = new StateSession(StateSession.SessionType.NEW_SUBSESSION); - subSessionState.sessionCount = sessionCount; - subSessionState.subsessionCount = subsessionCount; - subSessionState.getAttributionIsCalled = getAttributionIsCalled; - subSessionState.foregroundTimerAlreadyStarted = true; - checkStartInternal(subSessionState); - } - - private void checkFurtherSessions(int sessionCount, boolean getAttributionIsCalled) { - StateSession subSessionState = new StateSession(StateSession.SessionType.NEW_SESSION); - subSessionState.sessionCount = sessionCount; - subSessionState.getAttributionIsCalled = getAttributionIsCalled; - subSessionState.foregroundTimerAlreadyStarted = true; - checkStartInternal(subSessionState); - } - - private void checkStartInternal(StateSession stateSession) - { - // check delay start - checkDelayStart(stateSession); - - // check onResume - checkOnResume(stateSession); - - // update Handlers Status - checkHandlerStatus((stateSession.disabled ? null : !stateSession.toSend), stateSession.eventBufferingIsEnabled, stateSession.sdkClickHandlerAlsoStartsPaused); - - // process Session - switch (stateSession.sessionType) { - case NEW_SESSION: - // if the package was build, it was sent to the Package Handler - assertUtil.test("PackageHandler addPackage"); - - // after adding, the activity handler ping the Package handler to send the package - assertUtil.test("PackageHandler sendFirstPackage"); - - // writes activity state - assertUtil.debug("Wrote Activity state: " + - "ec:" + stateSession.eventCount + " sc:" + stateSession.sessionCount + " ssc:" + stateSession.subsessionCount); - break; - case NEW_SUBSESSION: - // test the subsession message - assertUtil.verbose("Started subsession " + stateSession.subsessionCount + " of session " + stateSession.sessionCount); - // writes activity state - assertUtil.debug("Wrote Activity state: " + - "ec:" + stateSession.eventCount + " sc:" + stateSession.sessionCount + " ssc:" + stateSession.subsessionCount); - break; - case NONSESSION: - // stopped for a short time, not enough for a new sub subsession - assertUtil.verbose("Time span since last activity too short for a new subsession"); - // does not writes activity state - assertUtil.notInDebug("Wrote Activity state: "); - break; - case TIME_TRAVEL: - assertUtil.error("Time travel!"); - // writes activity state - assertUtil.debug("Wrote Activity state: " + - "ec:" + stateSession.eventCount + " sc:" + stateSession.sessionCount + " ssc:" + stateSession.subsessionCount); - break; - case DISABLED: - assertUtil.notInTest("PackageHandler addPackage"); - assertUtil.notInVerbose("Started subsession "); - assertUtil.notInVerbose("Time span since last activity too short for a new subsession"); - assertUtil.notInError("Time travel!"); - break; - } - - /* - // after processing the session, writes the activity state - if (stateSession.sessionType != stateSession.sessionType.NONSESSION && - stateSession.sessionType != stateSession.sessionType.DISABLED) - { - assertUtil.debug("Wrote Activity state: " + - "ec:" + stateSession.eventCount + " sc:" + stateSession.sessionCount + " ssc:" + stateSession.subsessionCount); - } else { - - } - */ - // check Attribution State - if (stateSession.getAttributionIsCalled != null) { - if (stateSession.getAttributionIsCalled) { - assertUtil.test("AttributionHandler getAttribution"); - } else { - assertUtil.notInTest("AttributionHandler getAttribution"); - } - } - } - - private void checkDelayStart(StateSession stateSession) { - if (stateSession.delayStart == null) { - assertUtil.notInWarn("Waiting"); - return; - } - - if (stateSession.delayStart.equals("10.1")) { - assertUtil.warn("Delay start of 10.1 seconds bigger than max allowed value of 10.0 seconds"); - stateSession.delayStart = "10.0"; - } - - assertUtil.info("Waiting " + stateSession.delayStart + " seconds before starting first session"); - - assertUtil.verbose("Delay Start timer starting. Launching in " + stateSession.delayStart + " seconds"); - - if (stateSession.activityStateAlreadyCreated) { - assertUtil.verbose("Wrote Activity state"); - } - } - - private void checkOnResume(StateSession stateSession) { - if (!stateSession.startSubsession) { - assertUtil.notInVerbose("Background timer canceled"); - assertUtil.notInVerbose("Foreground timer is already started"); - assertUtil.notInVerbose("Foreground timer starting"); - assertUtil.notInVerbose("Subsession start"); - return; - } - // TODO check delay start - - // stops background timer - if (stateSession.sendInBackgroundConfigured) { - assertUtil.verbose("Background timer canceled"); - } else { - assertUtil.notInVerbose("Background timer canceled"); - } - - // start foreground timer - if (stateSession.foregroundTimerStarts) { - if (stateSession.foregroundTimerAlreadyStarted) { - assertUtil.verbose("Foreground timer is already started"); - } else { - assertUtil.verbose("Foreground timer starting"); - } - } else { - assertUtil.notInVerbose("Foreground timer is already started"); - assertUtil.notInVerbose("Foreground timer starting"); - } - - // starts the subsession - assertUtil.verbose("Subsession start"); - } - - private void checkHandlerStatus(Boolean pausing) { - checkHandlerStatus(pausing, false, true); - } - - private void checkHandlerStatus(Boolean pausing, boolean eventBufferingEnabled, boolean sdkClickHandlerAlsoPauses) { - if (pausing == null) { - assertUtil.notInTest("AttributionHandler pauseSending"); - assertUtil.notInTest("PackageHandler pauseSending"); - assertUtil.notInTest("SdkClickHandler pauseSending"); - assertUtil.notInTest("AttributionHandler resumeSending"); - assertUtil.notInTest("PackageHandler resumeSending"); - assertUtil.notInTest("SdkClickHandler resumeSending"); - return; - } - if (pausing) { - assertUtil.test("AttributionHandler pauseSending"); - assertUtil.test("PackageHandler pauseSending"); - if (sdkClickHandlerAlsoPauses) { - assertUtil.test("SdkClickHandler pauseSending"); - } else { - assertUtil.test("SdkClickHandler resumeSending"); - } - } else { - assertUtil.test("AttributionHandler resumeSending"); - assertUtil.test("PackageHandler resumeSending"); - assertUtil.test("SdkClickHandler resumeSending"); - if (!eventBufferingEnabled) { - assertUtil.test("PackageHandler sendFirstPackage"); - } - } - } - - private void checkEvent(StateEvent stateEvent) { - if (stateEvent.disabled) { - assertUtil.notInInfo("Skipping duplicated order ID "); - assertUtil.notInVerbose("Added order ID "); - assertUtil.notInTest("PackageHandler addPackage"); - assertUtil.notInInfo("Buffered event "); - assertUtil.notInTest("PackageHandler sendFirstPackage"); - return; - } - if (stateEvent.duplicatedOrderId) { - // dropping duplicate transaction id - assertUtil.info("Skipping duplicated order ID '" + stateEvent.orderId + "'"); - // check that event package was not added - assertUtil.notInTest("PackageHandler addPackage"); - return; - } - - if (stateEvent.orderId != null) { - // check order id was added - assertUtil.verbose("Added order ID '" + stateEvent.orderId + "'"); - } else { - // check order id was not added - assertUtil.notInVerbose("Added order ID"); - } - - // check that event package was added - assertUtil.test("PackageHandler addPackage"); - - if(stateEvent.bufferedSuffix != null) { - // check that event was buffered - assertUtil.info("Buffered event " + stateEvent.bufferedSuffix); - - // and not sent to package handler - assertUtil.notInTest("PackageHandler sendFirstPackage"); - } else { - // check that event was sent to package handler - assertUtil.test("PackageHandler sendFirstPackage"); - // and not buffered - assertUtil.notInInfo("Buffered event"); - } - - if (stateEvent.backgroundTimerStarts != null) { - // does not fire background timer - assertUtil.verbose("Background timer starting. Launching in " + stateEvent.backgroundTimerStarts + ".0 seconds"); - } else { - // does not fire background timer - assertUtil.notInVerbose("Background timer starting"); - } - - // after tracking the event it should write the activity state - if (stateEvent.activityStateSuffix != null) { - assertUtil.debug("Wrote Activity state: " + stateEvent.activityStateSuffix); - } else { - assertUtil.debug("Wrote Activity state"); - } - } - - private void stopActivity(ActivityHandler activityHandler) { - // stop activity - activityHandler.onPause(); - - ActivityHandler.InternalState internalState = activityHandler.getInternalState(); - - // goes to the background - assertUtil.isTrue(internalState.isInBackground()); - } - - private void checkEndSession() { - StateEndSession stateEndSession = new StateEndSession(); - checkEndSession(stateEndSession); - } - - private void checkEndSession(StateEndSession stateEndSession) - { - if (stateEndSession.checkOnPause) { - checkOnPause(stateEndSession.foregroundAlreadySuspended, stateEndSession.backgroundTimerStarts); - } - - if (stateEndSession.pausing) { - checkHandlerStatus(stateEndSession.pausing, stateEndSession.eventBufferingEnabled, true); - } - - if (stateEndSession.updateActivityState) { - assertUtil.debug("Wrote Activity state: "); - } else { - assertUtil.notInDebug("Wrote Activity state: "); - } - } - - private void checkOnPause(boolean foregroundAlreadySuspended, - boolean backgroundTimerStarts) { - // stop foreground timer - if (foregroundAlreadySuspended) { - assertUtil.verbose("Foreground timer is already suspended"); - } else { - assertUtil.verbose("Foreground timer suspended"); - } - - // start background timer - if (backgroundTimerStarts) { - assertUtil.verbose("Background timer starting."); - } else { - assertUtil.notInVerbose("Background timer starting."); - } - - // starts the subsession - assertUtil.verbose("Subsession end"); - } - - private void checkForegroundTimerFired(boolean timerFired) { - // timer fired - if (timerFired) { - assertUtil.verbose("Foreground timer fired"); - } else { - assertUtil.notInVerbose("Foreground timer fired"); - } - } - - private void checkSendFirstPackages(boolean delayStart, - ActivityHandler.InternalState internalState, - boolean activityStateCreated, - boolean pausing) - { - if (!delayStart) { - assertUtil.info("Start delay expired or never configured"); - // did not update package - assertUtil.notInTest("PackageHandler updatePackages"); - return; - } - assertUtil.notInInfo("Start delay expired or never configured"); - - // update packages - checkUpdatePackages(internalState, activityStateCreated); - - // no longer is in delay start - assertUtil.isFalse(internalState.delayStart); - - // cancel timer - assertUtil.verbose("Delay Start timer canceled"); - - checkHandlerStatus(pausing, false, false); - } - - private void checkUpdatePackages(ActivityHandler.InternalState internalState, - boolean activityStateCreated) { - // update packages - assertUtil.test("PackageHandler updatePackages"); - assertUtil.isFalse(internalState.updatePackages); - if (activityStateCreated) { - assertUtil.debug("Wrote Activity state"); - } else { - assertUtil.notInDebug("Wrote Activity state"); - } - - } -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestActivityPackage.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestActivityPackage.java deleted file mode 100644 index 7e63c75bc..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestActivityPackage.java +++ /dev/null @@ -1,476 +0,0 @@ -package com.adjust.sdk; - -import com.adjust.sdk.ActivityKind; -import com.adjust.sdk.ActivityPackage; -import com.adjust.sdk.AdjustAttribution; -import com.adjust.sdk.Constants; -import com.google.gson.JsonElement; -import com.google.gson.JsonParser; - -import junit.framework.Assert; - -import java.util.Map; - -/** - * Created by pfms on 09/01/15. - */ -public class TestActivityPackage { - - private ActivityPackage activityPackage; - private Map parameters; - public String appToken; - public String environment; - public String clientSdk; - public boolean playServices; - public boolean eventBufferingEnabled; - public String pushToken; - // session - public Integer sessionCount; - public String defaultTracker; - public Integer subsessionCount; - // event - public String eventToken; - public String eventCount; - public String suffix; - public String revenueString; - public String currency; - public String callbackParams; - public String partnerParams; - public Map savedCallbackParameters; - public Map savedPartnerParameters; - // click - public String reftag; - public String otherParameters; - public AdjustAttribution attribution; - public String referrer; - public String deeplink; - - public TestActivityPackage(ActivityPackage activityPackage) { - this.activityPackage = activityPackage; - parameters = activityPackage.getParameters(); - - // default values - appToken = "123456789012"; - environment = "sandbox"; - clientSdk = "android5.0.0"; - suffix = ""; - attribution = new AdjustAttribution(); - playServices = true; - } - - public void testSessionPackage(int sessionCount) { - // set the session count - this.sessionCount = sessionCount; - - // test default package attributes - testDefaultAttributes("/session", ActivityKind.SESSION, "session"); - - // check default parameters - testDefaultParameters(); - - // session parameters - // last_interval - if (sessionCount == 1) { - assertParameterNull("last_interval"); - } else { - assertParameterNotNull("last_interval"); - } - // default_tracker - assertParameterEquals("default_tracker", defaultTracker); - // callback_params - assertJsonParameterEquals("callback_params", callbackParams); - // partner_params - assertJsonParameterEquals("partner_params", partnerParams); - } - - public void testEventPackage(String eventToken) { - // set the event token - this.eventToken = eventToken; - - // test default package attributes - testDefaultAttributes("/event", ActivityKind.EVENT, "event"); - - // check default parameters - testDefaultParameters(); - - // event parameters - // event_count - if (eventCount == null) { - assertParameterNotNull("event_count"); - } else { - assertParameterEquals("event_count", eventCount); - } - // event_token - assertParameterEquals("event_token", eventToken); - // revenue and currency must come together - if (parameters.get("revenue") != null && - parameters.get("currency") == null) { - assertFail(); - } - if (parameters.get("revenue") == null && - parameters.get("currency") != null) { - assertFail(); - } - // revenue - assertParameterEquals("revenue", revenueString); - // currency - assertParameterEquals("currency", currency); - // callback_params - assertJsonParameterEquals("callback_params", callbackParams); - // partner_params - assertJsonParameterEquals("partner_params", partnerParams); - - // saved callback parameters - if (savedCallbackParameters == null) { - Assert.assertNull(activityPackage.getExtendedString(), - activityPackage.getCallbackParameters()); - } else { - Assert.assertTrue(activityPackage.getExtendedString(), - savedCallbackParameters.equals(activityPackage.getCallbackParameters())); - } - // saved partner parameters - if (savedPartnerParameters == null) { - Assert.assertNull(activityPackage.getExtendedString(), - activityPackage.getPartnerParameters()); - } else { - Assert.assertTrue(activityPackage.getExtendedString(), - savedPartnerParameters.equals(activityPackage.getPartnerParameters())); - } - } - - public void testClickPackage(String source) { - testClickPackage(source, true); - } - - public void testClickPackage(String source, boolean hasActivityState) { - // test default package attributes - testDefaultAttributes("/sdk_click", ActivityKind.CLICK, "click"); - - // check device ids parameters - testDefaultParameters(hasActivityState); - - // click parameters - // source - assertParameterEquals("source", source); - - // referrer - assertParameterEquals(Constants.REFTAG, reftag); - - if (source == Constants.REFTAG) { - assertParameterEquals("referrer", referrer); - assertParameterNull("deeplink"); - } else if (source == Constants.DEEPLINK) { - assertParameterEquals("deeplink", deeplink); - assertParameterNull("referrer"); - } else { - assertFail(); - } - - // params - assertJsonParameterEquals("params", otherParameters); - - // click_time - // TODO add string click time to compare - assertParameterNotNull("click_time"); - - // attributions - if (attribution != null) { - // tracker - assertParameterEquals("tracker", attribution.trackerName); - // campaign - assertParameterEquals("campaign", attribution.campaign); - // adgroup - assertParameterEquals("adgroup", attribution.adgroup); - // creative - assertParameterEquals("creative", attribution.creative); - } - } - - public void testInfoPackage(String source) { - // test default package attributes - testDefaultAttributes("/sdk_info", ActivityKind.INFO, "info"); - - // check device ids parameters - testDeviceIdsParameters(); - - // click parameters - // source - assertParameterEquals("source", source); - - if (source == Constants.PUSH) { - } else { - assertFail(); - } - } - - public void testAttributionPackage() { - // test default package attributes - testDefaultAttributes("attribution", ActivityKind.ATTRIBUTION, "attribution"); - - testDeviceIdsParameters(); - } - - public static void testQueryStringRequest(String queryStringRequest, Integer queueSize) { - String[] queryPairs = queryStringRequest.split("&"); - boolean wasSentAtFound = false; - boolean wasQueueSizeFound = false; - int queueSizeFound = -1; - - for (String pair : queryPairs) { - String[] pairComponents = pair.split("="); - String key = pairComponents[0]; - String value = pairComponents[1]; - if (key.equals("sent_at")) { - wasSentAtFound = true; - } - if (key.equals("queue_size")) { - wasQueueSizeFound = true; - queueSizeFound = Integer.parseInt(value); - } - } - if (!wasSentAtFound) { - Assert.fail(queryStringRequest); - } - - if (queueSize == null) { - Assert.assertFalse(queryStringRequest, wasQueueSizeFound); - return; - } - - if (!wasQueueSizeFound) { - Assert.fail(queryStringRequest); - } else { - Assert.assertEquals(queryStringRequest, - queueSize.intValue(), queueSizeFound); - } - } - - private void testDefaultAttributes(String path, ActivityKind activityKind, String activityKindString) { - // check the Sdk version is being tested - assertEquals(activityPackage.getClientSdk(), clientSdk); - // check the path - assertEquals(activityPackage.getPath(), path); - // test activity kind - // check the activity kind - assertEquals(activityPackage.getActivityKind(), activityKind); - // the conversion from activity kind to String - assertEquals(activityPackage.getActivityKind().toString(), activityKindString); - // the conversion from String to activity kind - assertEquals(activityPackage.getActivityKind(), ActivityKind.fromString(activityKindString)); - // test suffix - assertEquals(activityPackage.getSuffix(), suffix); - } - - private void testDefaultParameters() { - testDefaultParameters(true); - } - - private void testDefaultParameters(boolean hasActivityState) { - testDeviceInfo(); - testConfig(); - if (hasActivityState) { - testActivityState(); - } else { - testWithoutActivityState(); - } - testCreatedAt(); - } - - private void testDeviceIdsParameters() { - testDeviceInfoIds(); - testConfig(); - testCreatedAt(); - } - - private void testCreatedAt() { - // created_at - assertParameterNotNull("created_at"); - } - - private void testDeviceInfo() { - testDeviceInfoIds(); - // fb_id - //assertParameterNotNull("fb_id"); - // package_name - assertParameterNotNull("package_name"); - // app_version - // device_type - assertParameterNotNull("device_type"); - // device_name - assertParameterNotNull("device_name"); - // device_manufacturer - assertParameterNotNull("device_manufacturer"); - // os_name - assertParameterEquals("os_name", "android"); - // os_version - assertParameterNotNull("os_version"); - // language - assertParameterNotNull("language"); - // country - assertParameterNotNull("country"); - // screen_size - assertParameterNotNull("screen_size"); - // screen_format - assertParameterNotNull("screen_format"); - // screen_density - assertParameterNotNull("screen_density"); - // display_width - assertParameterNotNull("display_width"); - // display_height - assertParameterNotNull("display_height"); - // hardware_name - assertParameterNotNull("hardware_name"); - // cpu_type - assertParameterNotNull("cpu_type"); - // os_build - assertParameterNotNull("os_build"); - // vm_isa - assertParameterNotNull("vm_isa"); - } - - private void testDeviceInfoIds() { - // play services - if (playServices) { - // android_id - assertParameterNull("android_id"); - } else { - // android_id - assertParameterNotNull("android_id"); - } - } - - private void testConfig() { - // app_token - assertParameterEquals("app_token", appToken); - // environment - assertParameterEquals("environment", environment); - // needs_attribution_data - testParameterBoolean("needs_response_details", true); - // play services - if (playServices) { - // gps_adid - assertParameterNotNull("gps_adid"); - // tracking_enabled - assertParameterNotNull("tracking_enabled"); - } else { - // gps_adid - assertParameterNull("gps_adid"); - // tracking_enabled - assertParameterNull("tracking_enabled"); - } - // event_buffering_enabled - testParameterBoolean("event_buffering_enabled", eventBufferingEnabled); - // push_token - assertParameterEquals("push_token", pushToken); - } - - private void testWithoutActivityState() { - // android_uuid - assertParameterNull("android_uuid"); - // session_count - assertParameterNull("session_count"); - // subsession_count - assertParameterNull("subsession_count"); - // session_length - assertParameterNull("session_length"); - // time_spent - assertParameterNull("time_spent"); - } - - private void testActivityState() { - testActivityStateIds(); - // session_count - if (sessionCount == null) { - assertParameterNotNull("session_count"); - } else { - assertParameterEquals("session_count", sessionCount); - } - // first session - if (sessionCount != null && sessionCount == 1) { - // subsession_count - assertParameterNull("subsession_count"); - // session_length - assertParameterNull("session_length"); - // time_spent - assertParameterNull("time_spent"); - } else { - // subsession_count - if (subsessionCount == null) - assertParameterNotNull("subsession_count"); - else - assertParameterEquals("subsession_count", subsessionCount); - // session_length - assertParameterNotNull("session_length"); - // time_spent - assertParameterNotNull("time_spent"); - } - } - - private void testActivityStateIds() { - // android_uuid - assertParameterNotNull("android_uuid"); - } - - private void assertParameterNotNull(String parameterName) { - Assert.assertNotNull(activityPackage.getExtendedString(), - parameters.get(parameterName)); - } - - private void assertParameterNull(String parameterName) { - Assert.assertNull(activityPackage.getExtendedString(), - parameters.get(parameterName)); - } - - private void assertParameterEquals(String parameterName, String value) { - if (value == null) { - assertParameterNull(parameterName); - return; - } - - Assert.assertEquals(activityPackage.getExtendedString(), - value, parameters.get(parameterName)); - } - - private void assertJsonParameterEquals(String parameterName, String value) { - if (value == null) { - assertParameterNull(parameterName); - return; - } - - JsonParser parser = new JsonParser(); - JsonElement e1 = parser.parse(value); - JsonElement e2 = parser.parse(parameters.get(parameterName)); - - assertEquals(e1, e2); - } - - private void assertParameterEquals(String parameterName, int value) { - Assert.assertEquals(activityPackage.getExtendedString(), - value, Integer.parseInt(parameters.get(parameterName))); - } - - - private void assertEquals(String field, String value) { - Assert.assertEquals(activityPackage.getExtendedString(), - value, field); - } - - private void assertEquals(Object field, Object value) { - Assert.assertEquals(activityPackage.getExtendedString(), - value, field); - } - - private void assertFail() { - Assert.fail(activityPackage.getExtendedString()); - } - - private void testParameterBoolean(String parameterName, Boolean value) { - if (value == null) { - assertParameterNull(parameterName); - } else if (value) { - assertParameterEquals(parameterName, "1"); - } else { - assertParameterEquals(parameterName, "0"); - } - } -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestAttributionHandler.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestAttributionHandler.java deleted file mode 100644 index 95ca96751..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestAttributionHandler.java +++ /dev/null @@ -1,465 +0,0 @@ -package com.adjust.sdk; - -import android.content.Context; -import android.net.Uri; -import android.os.SystemClock; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; -import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.LargeTest; - -import com.adjust.sdk.test.*; - -import org.json.JSONException; -import org.json.JSONObject; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** - * Created by pfms on 28/01/15. - */ -@RunWith(AndroidJUnit4.class) -@LargeTest -public class TestAttributionHandler{ - private MockLogger mockLogger; - private MockActivityHandler mockActivityHandler; - private MockHttpsURLConnection mockHttpsURLConnection; - private AssertUtil assertUtil; - private com.adjust.sdk.test.UnitTestActivity activity; - private Context context; - private ActivityPackage attributionPackage; - private ActivityPackage firstSessionPackage; - private ActivityPackage sdkClickPackage; - - @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule(com.adjust.sdk.test.UnitTestActivity.class); - - @Before - public void setUp() { - mockLogger = new MockLogger(); - mockActivityHandler = new MockActivityHandler(mockLogger); - mockHttpsURLConnection = new MockHttpsURLConnection(null, mockLogger); - - assertUtil = new AssertUtil(mockLogger); - - AdjustFactory.setLogger(mockLogger); - AdjustFactory.setActivityHandler(mockActivityHandler); - AdjustFactory.setHttpsURLConnection(mockHttpsURLConnection); - - activity = mActivityRule.getActivity(); - context = activity.getApplicationContext(); - - savePackages(); - - mockLogger.reset(); - } - - private void savePackages() { - MockAttributionHandler mockAttributionHandler = new MockAttributionHandler(mockLogger); - MockPackageHandler mockPackageHandler = new MockPackageHandler(mockLogger); - MockSdkClickHandler mockSdkClickHandler = new MockSdkClickHandler(mockLogger); - - AdjustFactory.setAttributionHandler(mockAttributionHandler); - AdjustFactory.setPackageHandler(mockPackageHandler); - AdjustFactory.setSdkClickHandler(mockSdkClickHandler); - - // deleting the activity state file to simulate a first session - boolean activityStateDeleted = ActivityHandler.deleteActivityState(context); - boolean attributionDeleted = ActivityHandler.deleteAttribution(context); - - // create the config to start the session - AdjustConfig config = new AdjustConfig(context, "123456789012", AdjustConfig.ENVIRONMENT_SANDBOX); - - // start activity handler with config - ActivityHandler activityHandler = ActivityHandler.getInstance(config); - - if (activityHandler != null) { - activityHandler.onResume(); - } - - Uri attributions = Uri.parse("AdjustTests://example.com/path/inApp?adjust_tracker=trackerValue&other=stuff&adjust_campaign=campaignValue&adjust_adgroup=adgroupValue&adjust_creative=creativeValue"); - long now = System.currentTimeMillis(); - - activityHandler.readOpenUrl(attributions, now); - - SystemClock.sleep(3000); - - ActivityPackage attributionPackage = activityHandler.getAttributionPackageI(); - - TestActivityPackage attributionPackageTest = new TestActivityPackage(attributionPackage); - - attributionPackageTest.testAttributionPackage(); - - this.firstSessionPackage = mockPackageHandler.queue.get(0); - - this.sdkClickPackage = mockSdkClickHandler.queue.get(0); - - this.attributionPackage = attributionPackage; - - AdjustFactory.setAttributionHandler(null); - AdjustFactory.setPackageHandler(null); - AdjustFactory.setSdkClickHandler(null); - } - - @After - public void tearDown() { - AdjustFactory.setHttpsURLConnection(null); - AdjustFactory.setActivityHandler(null); - AdjustFactory.setLogger(null); - - activity = null; - context = null; - } - - @Test - public void testGetAttribution() { - // assert test name to read better in logcat - mockLogger.Assert("TestAttributionHandler testGetAttribution"); - - AttributionHandler attributionHandler = new AttributionHandler(mockActivityHandler, - attributionPackage, true); - - // test null client - nullClientTest(attributionHandler); - - // test client exception - clientExceptionTest(attributionHandler); - - // test wrong json response - wrongJsonTest(attributionHandler); - - // test empty response - emptyJsonResponseTest(attributionHandler); - - // test server error - serverErrorTest(attributionHandler); - - // test ok response with message - okMessageTest(attributionHandler); - } - - @Test - public void testCheckSessionResponse() { - // assert test name to read better in logcat - mockLogger.Assert("TestAttributionHandler testCheckSessionResponse"); - - AttributionHandler attributionHandler = new AttributionHandler(mockActivityHandler, - attributionPackage, true); - - // new attribution - JSONObject attributionJson = null; - try { - attributionJson = new JSONObject("{ " + - "\"tracker_token\" : \"ttValue\" , " + - "\"tracker_name\" : \"tnValue\" , " + - "\"network\" : \"nValue\" , " + - "\"campaign\" : \"cpValue\" , " + - "\"adgroup\" : \"aValue\" , " + - "\"creative\" : \"ctValue\" , " + - "\"click_label\" : \"clValue\" }"); - } catch (JSONException e) { - assertUtil.fail(e.getMessage()); - } - - SessionResponseData sessionResponseData = (SessionResponseData) ResponseData.buildResponseData(firstSessionPackage); - sessionResponseData.jsonResponse = attributionJson; - - attributionHandler.checkSessionResponse(sessionResponseData); - - SystemClock.sleep(1000); - - // updated set askingAttribution to false - assertUtil.test("ActivityHandler setAskingAttribution, false"); - - // it did not update to true - assertUtil.notInTest("ActivityHandler setAskingAttribution, true"); - - // and waiting for query - assertUtil.notInDebug("Waiting to query attribution"); - - // check attribution was called without ask_in - assertUtil.test("ActivityHandler launchSessionResponseTasks, message:null timestamp:null json:{\"tracker_token\":\"ttValue\",\"tracker_name\":\"tnValue\",\"network\":\"nValue\",\"campaign\":\"cpValue\",\"adgroup\":\"aValue\",\"creative\":\"ctValue\",\"click_label\":\"clValue\"}"); - } - - @Test - public void testCheckSdkClickResponse() { - // assert test name to read better in logcat - mockLogger.Assert("TestAttributionHandler testCheckSdkClickResponse"); - - AttributionHandler attributionHandler = new AttributionHandler(mockActivityHandler, - attributionPackage, true); - - // new attribution - JSONObject attributionJson = null; - try { - attributionJson = new JSONObject("{ " + - "\"tracker_token\" : \"ttValue\" , " + - "\"tracker_name\" : \"tnValue\" , " + - "\"network\" : \"nValue\" , " + - "\"campaign\" : \"cpValue\" , " + - "\"adgroup\" : \"aValue\" , " + - "\"creative\" : \"ctValue\" , " + - "\"click_label\" : \"clValue\" }"); - } catch (JSONException e) { - assertUtil.fail(e.getMessage()); - } - - SdkClickResponseData sdkClickResponseData = (SdkClickResponseData) ResponseData.buildResponseData(sdkClickPackage); - sdkClickResponseData.jsonResponse = attributionJson; - - attributionHandler.checkSdkClickResponse(sdkClickResponseData); - - SystemClock.sleep(1000); - - // updated set askingAttribution to false - assertUtil.test("ActivityHandler setAskingAttribution, false"); - - // it did not update to true - assertUtil.notInTest("ActivityHandler setAskingAttribution, true"); - - // and waiting for query - assertUtil.notInDebug("Waiting to query attribution"); - - // check attribution was called without ask_in - assertUtil.test("ActivityHandler launchSdkClickResponseTasks, message:null timestamp:null json:{\"tracker_token\":\"ttValue\",\"tracker_name\":\"tnValue\",\"network\":\"nValue\",\"campaign\":\"cpValue\",\"adgroup\":\"aValue\",\"creative\":\"ctValue\",\"click_label\":\"clValue\"}"); - } - - @Test - public void testAskIn() { - // assert test name to read better in logcat - mockLogger.Assert("TestAttributionHandler testAskIn"); - - AttributionHandler attributionHandler = new AttributionHandler(mockActivityHandler, - attributionPackage, true); - - String response = "Response: { \"ask_in\" : 4000 }"; - - JSONObject askIn4sJson = null; - try { - askIn4sJson = new JSONObject("{ \"ask_in\" : 4000 }"); - } catch (JSONException e) { - assertUtil.fail(e.getMessage()); - } - - mockHttpsURLConnection.responseType = ResponseType.MESSAGE; - - SessionResponseData sessionResponseData = (SessionResponseData)ResponseData.buildResponseData(firstSessionPackage); - sessionResponseData.jsonResponse = askIn4sJson; - - attributionHandler.checkSessionResponse(sessionResponseData); - - // sleep enough not to trigger the timer - SystemClock.sleep(1000); - - // change the response to avoid a cycle; - mockHttpsURLConnection.responseType = ResponseType.MESSAGE; - - // check attribution was called with ask_in - assertUtil.notInTest("ActivityHandler updateAttribution"); - - // it did update to true - assertUtil.test("ActivityHandler setAskingAttribution, true"); - - // and waited to for query - assertUtil.debug("Waiting to query attribution in 4.0 seconds"); - - SystemClock.sleep(2000); - - JSONObject askIn5sJson = null; - try { - askIn5sJson = new JSONObject("{ \"ask_in\" : 5000 }"); - } catch (JSONException e) { - assertUtil.fail(e.getMessage()); - } - - sessionResponseData.jsonResponse = askIn5sJson; - attributionHandler.checkSessionResponse(sessionResponseData); - - // sleep enough not to trigger the old timer - SystemClock.sleep(3000); - - // it did update to true - assertUtil.test("ActivityHandler setAskingAttribution, true"); - - // and waited to for query - assertUtil.debug("Waiting to query attribution in 5.0 seconds"); - - // it was been waiting for 1000 + 2000 + 3000 = 6 seconds - // check that the mock http client was not called because the original clock was reseted - assertUtil.notInTest("HttpClient execute"); - - // check that it was finally called after 6 seconds after the second ask_in - SystemClock.sleep(4000); - - okMessageTestLogs(attributionHandler); - - //requestTest(mockHttpClient.lastRequest); - } - - @Test - public void testPause() { - // assert test name to read better in logcat - mockLogger.Assert("TestAttributionHandler testPause"); - - AttributionHandler attributionHandler = new AttributionHandler(mockActivityHandler, - attributionPackage, false); - - mockHttpsURLConnection.responseType = ResponseType.MESSAGE; - - attributionHandler.getAttribution(); - - SystemClock.sleep(1000); - - // check that the activity handler is paused - assertUtil.debug("Attribution handler is paused"); - - // and it did not call the http client - //assertUtil.isNull(mockHttpClient.lastRequest); - - assertUtil.notInTest("MockHttpsURLConnection getInputStream"); - } - - @Test - public void testDeeplink() { - // assert test name to read better in logcat - mockLogger.Assert("TestAttributionHandler testDeeplink"); - - AttributionHandler attributionHandler = new AttributionHandler(mockActivityHandler, - attributionPackage, true); - - JSONObject responseJson = new JSONObject(); - - SessionResponseData sessionResponseDeeplink = (SessionResponseData) ResponseData.buildResponseData(firstSessionPackage); - try { - JSONObject internalAttributionJson = new JSONObject(); - internalAttributionJson.put("deeplink", "testDeeplinkAttribution://"); - - responseJson.put("deeplink", "testDeeplinkRoot://"); - responseJson.put("attribution", internalAttributionJson); - - //sessionResponseDeeplink.jsonResponse = new JSONObject("{ " + - // "\"deeplink\" : \"testDeeplinkRoot://\" }"); - - } catch (JSONException e) { - assertUtil.fail(e.getMessage()); - } - - sessionResponseDeeplink.jsonResponse = responseJson; - attributionHandler.checkSessionResponse(sessionResponseDeeplink); - SystemClock.sleep(2000); - - assertUtil.test("ActivityHandler setAskingAttribution, false"); - - assertUtil.test("ActivityHandler launchSessionResponseTasks, message:null timestamp:null " + - "json:{\"deeplink\":\"testDeeplinkRoot:\\/\\/\",\"attribution\":{\"deeplink\":\"testDeeplinkAttribution:\\/\\/\"}}"); - - AttributionResponseData attributionResponseDeeplink = (AttributionResponseData)ResponseData.buildResponseData(attributionPackage); - - attributionResponseDeeplink.jsonResponse = responseJson; - attributionHandler.checkAttributionResponse(attributionResponseDeeplink); - SystemClock.sleep(2000); - - assertUtil.test("ActivityHandler setAskingAttribution, false"); - - assertUtil.test("ActivityHandler launchAttributionResponseTasks, message:null timestamp:null " + - "json:{\"deeplink\":\"testDeeplinkRoot:\\/\\/\",\"attribution\":{\"deeplink\":\"testDeeplinkAttribution:\\/\\/\"}}"); - - assertUtil.isEqual(attributionResponseDeeplink.deeplink, Uri.parse("testDeeplinkAttribution://")); - } - - private void nullClientTest(AttributionHandler attributionHandler) { - startGetAttributionTest(attributionHandler, null); - - // check response was not logged - assertUtil.notInVerbose("Response"); - } - - private void clientExceptionTest(AttributionHandler attributionHandler) { - startGetAttributionTest(attributionHandler, ResponseType.CLIENT_PROTOCOL_EXCEPTION); - - // check the client error - assertUtil.error("Failed to get attribution (testResponseError)"); - } - - private void wrongJsonTest(AttributionHandler attributionHandler) { - startGetAttributionTest(attributionHandler, ResponseType.WRONG_JSON); - - // check that the mock http client was called - assertUtil.test("MockHttpsURLConnection getInputStream"); - - assertUtil.verbose("Response: not a json response"); - - assertUtil.error("Failed to parse json response. (Value not of type java.lang.String cannot be converted to JSONObject)"); - } - - private void emptyJsonResponseTest(AttributionHandler attributionHandler) { - startGetAttributionTest(attributionHandler, ResponseType.EMPTY_JSON); - - // check that the mock http client was called - assertUtil.test("MockHttpsURLConnection getInputStream"); - - assertUtil.verbose("Response: { }"); - - assertUtil.info("No message found"); - - // check attribution was called without ask_in - assertUtil.test("ActivityHandler setAskingAttribution, false"); - - assertUtil.test("ActivityHandler launchAttributionResponseTasks, message:null timestamp:null json:{}"); - } - - private void serverErrorTest(AttributionHandler attributionHandler) { - startGetAttributionTest(attributionHandler, ResponseType.INTERNAL_SERVER_ERROR); - - // check that the mock http client was called - assertUtil.test("MockHttpsURLConnection getErrorStream"); - - // the response logged - assertUtil.verbose("Response: { \"message\": \"testResponseError\"}"); - - // the message in the response - assertUtil.error("testResponseError"); - - // check attribution was called without ask_in - assertUtil.test("ActivityHandler setAskingAttribution, false"); - - assertUtil.test("ActivityHandler launchAttributionResponseTasks, message:testResponseError timestamp:null json:{\"message\":\"testResponseError\"}"); - } - - private void okMessageTest(AttributionHandler attributionHandler) { - startGetAttributionTest(attributionHandler, ResponseType.MESSAGE); - - okMessageTestLogs(attributionHandler); - } - - private void okMessageTestLogs(AttributionHandler attributionHandler) { - /* - TestActivityPackage.testQueryStringRequest(attributionHandler.lastUrlUsed.getQuery(), null); - - // check that the mock http client was called - assertUtil.test("MockHttpsURLConnection getInputStream"); - - // the response logged - assertUtil.verbose("Response: { \"message\" : \"response OK\"}"); - - // the message in the response - assertUtil.info("response OK"); - - assertUtil.test("ActivityHandler setAskingAttribution, false"); - - // check attribution was called without ask_in - assertUtil.test("ActivityHandler launchAttributionResponseTasks, message:response OK timestamp:null json:{\"message\":\"response OK\"}"); - */ - } - - private void startGetAttributionTest(AttributionHandler attributionHandler, ResponseType responseType) { - mockHttpsURLConnection.responseType = responseType; - - attributionHandler.getAttribution(); - - SystemClock.sleep(1000); - } -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestPackageHandler.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestPackageHandler.java deleted file mode 100644 index 6744213c5..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestPackageHandler.java +++ /dev/null @@ -1,581 +0,0 @@ -package com.adjust.sdk; - -import android.content.Context; -import android.os.SystemClock; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; -import android.test.suitebuilder.annotation.LargeTest; - -import com.adjust.sdk.test.*; - -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Created by pfms on 22/08/2016. - */ -@RunWith(AndroidJUnit4.class) -@LargeTest -public class TestPackageHandler { - private MockLogger mockLogger; - private MockActivityHandler mockActivityHandler; - protected MockRequestHandler mockRequestHandler; - private AssertUtil assertUtil; - private com.adjust.sdk.test.UnitTestActivity activity; - private Context context; - - @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule(com.adjust.sdk.test.UnitTestActivity.class); - - @Before - public void setUp() { - mockLogger = new MockLogger(); - mockActivityHandler = new MockActivityHandler(mockLogger); - mockRequestHandler = new MockRequestHandler(mockLogger); - - assertUtil = new AssertUtil(mockLogger); - - AdjustFactory.setLogger(mockLogger); - AdjustFactory.setRequestHandler(mockRequestHandler); - - activity = mActivityRule.getActivity(); - context = activity.getApplicationContext(); - } - - @After - public void tearDown() { - AdjustFactory.setRequestHandler(null); - AdjustFactory.setLogger(null); - } - - @Test - public void testAddPackage() { - // assert test name to read better in logcat - mockLogger.Assert("TestPackageHandler testAddPackage"); - - PackageHandler packageHandler = startPackageHandler(); - - ActivityPackage firstClickPackage = createClickPackage("FirstPackage"); - - packageHandler.addPackage(firstClickPackage); - - SystemClock.sleep(1000); - - addPackageTests(1, "clickFirstPackage"); - - PackageHandler secondPackageHandler = addSecondPackageTest(null); - - ActivityPackage secondClickPackage = createClickPackage("ThirdPackage"); - - secondPackageHandler.addPackage(secondClickPackage); - - SystemClock.sleep(1000); - - addPackageTests(3, "clickThirdPackage"); - - // send the first click package/ first package - secondPackageHandler.sendFirstPackage(); - SystemClock.sleep(1000); - - assertUtil.test("RequestHandler sendPackage, activityPackage clickFirstPackage"); - assertUtil.test("RequestHandler sendPackage, queueSize 2"); - - // send the second click package/ third package - secondPackageHandler.sendNextPackage(null); - SystemClock.sleep(1000); - - assertUtil.test("RequestHandler sendPackage, activityPackage unknownSecondPackage"); - assertUtil.test("RequestHandler sendPackage, queueSize 1"); - - // send the unknow package/ second package - secondPackageHandler.sendNextPackage(null); - SystemClock.sleep(1000); - - assertUtil.test("RequestHandler sendPackage, activityPackage clickThirdPackage"); - assertUtil.test("RequestHandler sendPackage, queueSize 0"); - } - - @Test - public void testSendFirst() { - // assert test name to read better in logcat - mockLogger.Assert("TestPackageHandler testSendFirst"); - - PackageHandler packageHandler = startPackageHandler(); - - packageHandler.sendFirstPackage(); - SystemClock.sleep(1000); - - sendFirstTests(SendFirstState.EMPTY_QUEUE, null, null); - - addAndSendFirstPackageTest(packageHandler); - - // try to send when it is still sending - packageHandler.sendFirstPackage(); - SystemClock.sleep(1000); - - sendFirstTests(SendFirstState.IS_SENDING, null, null); - - // try to send paused - packageHandler.pauseSending(); - packageHandler.sendFirstPackage(); - SystemClock.sleep(1000); - - sendFirstTests(SendFirstState.PAUSED, null, null); - - // unpause, it's still sending - packageHandler.resumeSending(); - packageHandler.sendFirstPackage(); - SystemClock.sleep(1000); - - sendFirstTests(SendFirstState.IS_SENDING, null, null); - - // verify that both paused and isSending are reset with a new session - PackageHandler secondSessionPackageHandler = new PackageHandler(mockActivityHandler, context, true); - - secondSessionPackageHandler.sendFirstPackage(); - SystemClock.sleep(1000); - - // send the package to request handler - sendFirstTests(SendFirstState.SEND, "unknownFirstPackage", 0); - } - - @Test - public void testSendNext() { - // assert test name to read better in logcat - mockLogger.Assert("TestPackageHandler testSendNext"); - - // init package handler - PackageHandler packageHandler = startPackageHandler(); - - // add and send the first package - addAndSendFirstPackageTest(packageHandler); - - // try to send when it is still sending - packageHandler.sendFirstPackage(); - SystemClock.sleep(1000); - - sendFirstTests(SendFirstState.IS_SENDING, null, null); - - // add a second package - addSecondPackageTest(packageHandler); - - //send next package - packageHandler.sendNextPackage(null); - SystemClock.sleep(2000); - - assertUtil.debug("Package handler wrote 1 packages"); - - // try to send the second package - sendFirstTests(SendFirstState.SEND, "unknownSecondPackage", 0); - } - - @Test - public void testCloseFirstPackage() { - // assert test name to read better in logcat - mockLogger.Assert("TestPackageHandler testCloseFirstPackage"); - AdjustFactory.setPackageHandlerBackoffStrategy(BackoffStrategy.NO_WAIT); - - PackageHandler packageHandler = startPackageHandler(); - - addAndSendFirstPackageTest(packageHandler); - - // try to send when it is still sending - packageHandler.sendFirstPackage(); - SystemClock.sleep(1000); - - sendFirstTests(SendFirstState.IS_SENDING, null, null); - - //send next package - ActivityPackage activityPackage = new ActivityPackage(ActivityKind.UNKNOWN); - ResponseData unknownResponseData = ResponseData.buildResponseData(activityPackage); - packageHandler.closeFirstPackage(unknownResponseData, null); - SystemClock.sleep(2000); - - assertUtil.test("ActivityHandler finishedTrackingActivity, message:null timestamp:null json:null"); - assertUtil.verbose("Package handler can send"); - - assertUtil.notInDebug("Package handler wrote"); - - // tries to send the next package after sleeping - sendFirstTests(SendFirstState.SEND, "unknownFirstPackage", 0); - } - - @Test - public void testBackoffJitter() { - // assert test name to read better in logcat - mockLogger.Assert("TestPackageHandler testBackoffJitter"); - - AdjustFactory.setPackageHandlerBackoffStrategy(BackoffStrategy.TEST_WAIT); - - PackageHandler packageHandler = startPackageHandler(); - - ActivityPackage activityPackage = new ActivityPackage(ActivityKind.UNKNOWN); - ResponseData unknownResponseData = ResponseData.buildResponseData(activityPackage); - Pattern pattern = Pattern.compile("Waiting for (\\d+\\.\\d) seconds before retrying the (\\d+) time"); - - // 1st - packageHandler.closeFirstPackage(unknownResponseData, activityPackage); - SystemClock.sleep(1500); - - String matchingString = assertUtil.verbose("Waiting for "); - // Waiting for 0.1 seconds before retrying the 1 time - - checkSleeping(pattern, matchingString, 0.1, 0.2, 1, 0.5, 1); - - // 2nd - packageHandler.closeFirstPackage(unknownResponseData, activityPackage); - SystemClock.sleep(1500); - - matchingString = assertUtil.verbose("Waiting for "); - - checkSleeping(pattern, matchingString, 0.2, 0.4, 1, 0.5, 2); - - // 3rd - packageHandler.closeFirstPackage(unknownResponseData, activityPackage); - SystemClock.sleep(1500); - - matchingString = assertUtil.verbose("Waiting for "); - - checkSleeping(pattern, matchingString, 0.4, 0.8, 1, 0.5, 3); - - // 4th - packageHandler.closeFirstPackage(unknownResponseData, activityPackage); - SystemClock.sleep(1500); - - matchingString = assertUtil.verbose("Waiting for "); - - checkSleeping(pattern, matchingString, 0.8, 1.6, 1, 0.5, 4); - - // 5th - packageHandler.closeFirstPackage(unknownResponseData, activityPackage); - SystemClock.sleep(1500); - - matchingString = assertUtil.verbose("Waiting for "); - - checkSleeping(pattern, matchingString, 1.6, 3.2, 1, 0.5, 5); - - // 6th - packageHandler.closeFirstPackage(unknownResponseData, activityPackage); - SystemClock.sleep(1500); - - matchingString = assertUtil.verbose("Waiting for "); - - checkSleeping(pattern, matchingString, 6.4, 12.8, 1, 0.5, 6); - } - - @Test - public void testUpdate() { - // assert test name to read better in logcat - mockLogger.Assert("TestPackageHandler testUpdate"); - - List delayPackages = createDelayPackages(); - - ActivityPackage firstSessionPackage = delayPackages.get(0); - ActivityPackage firstEventPackage = delayPackages.get(1); - ActivityPackage secondEventPackage = delayPackages.get(2); - - // create event package test - TestActivityPackage testFirstSessionPackage = new TestActivityPackage(firstSessionPackage); - - testFirstSessionPackage.testSessionPackage(1); - - // create event package test - TestActivityPackage testFirstEventPackage = new TestActivityPackage(firstEventPackage); - - // set event test parameters - testFirstEventPackage.eventCount = "1"; - testFirstEventPackage.suffix = "'event1'"; - testFirstEventPackage.savedCallbackParameters = new HashMap(1); - testFirstEventPackage.savedCallbackParameters.put("ceFoo", "ceBar"); - testFirstEventPackage.savedPartnerParameters = new HashMap(1); - testFirstEventPackage.savedPartnerParameters.put("peFoo", "peBar"); - - // test first event - testFirstEventPackage.testEventPackage("event1"); - - // create event package test - TestActivityPackage testSecondEventPackage = new TestActivityPackage(secondEventPackage); - - // set event test parameters - testSecondEventPackage.eventCount = "2"; - testSecondEventPackage.suffix = "'event2'"; - testSecondEventPackage.savedCallbackParameters = new HashMap(1); - testSecondEventPackage.savedCallbackParameters.put("scpKey", "ceBar"); - testSecondEventPackage.savedPartnerParameters = new HashMap(1); - testSecondEventPackage.savedPartnerParameters.put("sppKey", "peBar"); - - // test second event - testSecondEventPackage.testEventPackage("event2"); - - // initialize Package Handler - IPackageHandler packageHandler = startPackageHandler(); - - sendFirstTests(SendFirstState.EMPTY_QUEUE, null, null); - - packageHandler.addPackage(firstSessionPackage); - packageHandler.addPackage(firstEventPackage); - packageHandler.addPackage(secondEventPackage); - - SystemClock.sleep(1000); - - addPackageTests(1, "session"); - - addPackageTests(2, "event'event1'"); - - addPackageTests(3, "event'event2'"); - - packageHandler.updatePackages(null); - - SystemClock.sleep(1000); - - assertUtil.notInDebug("Updating package handler queue"); - - SessionParameters emptySessionParameters = new SessionParameters(); - packageHandler.updatePackages(emptySessionParameters); - - SystemClock.sleep(1000); - - assertUtil.debug("Updating package handler queue"); - - assertUtil.verbose("Session callback parameters: null"); - assertUtil.verbose("Session partner parameters: null"); - - // writes the non-updated packages - assertUtil.debug("Wrote Package queue: [session, event'event1', event'event2']"); - assertUtil.debug("Package handler wrote 3 packages"); - - SessionParameters sessionParameters = new SessionParameters(); - sessionParameters.callbackParameters = new HashMap(1); - sessionParameters.callbackParameters.put("scpKey", "scpValue"); - sessionParameters.partnerParameters = new HashMap(1); - sessionParameters.partnerParameters.put("sppKey", "sppValue"); - - packageHandler.updatePackages(sessionParameters); - - SystemClock.sleep(1000); - - assertUtil.debug("Updating package handler queue"); - - assertUtil.verbose("Session callback parameters: {scpKey=scpValue}"); - assertUtil.verbose("Session partner parameters: {sppKey=sppValue}"); - - assertUtil.warn("Key scpKey with value scpValue from Callback parameter was replaced by value ceBar"); - assertUtil.warn("Key sppKey with value sppValue from Partner parameter was replaced by value peBar"); - assertUtil.debug("Package handler wrote 3 packages"); - - testFirstSessionPackage.callbackParams = "{scpKey=scpValue}"; - testFirstSessionPackage.partnerParams = "{sppKey=sppValue}"; - testFirstSessionPackage.testSessionPackage(1); - - testFirstEventPackage.callbackParams = "{scpKey=scpValue, ceFoo=ceBar}"; - testFirstEventPackage.partnerParams = "{sppKey=sppValue, peFoo=peBar}"; - - testFirstEventPackage.testEventPackage("event1"); - - testSecondEventPackage.callbackParams = "{scpKey=ceBar}"; - testSecondEventPackage.partnerParams = "{sppKey=peBar}"; - - testSecondEventPackage.testEventPackage("event2"); - } - - private List createDelayPackages() { - MockPackageHandler mockPackageHandler = new MockPackageHandler(mockLogger); - AdjustFactory.setPackageHandler(mockPackageHandler); - - MockSdkClickHandler mockSdkClickHandler = new MockSdkClickHandler(mockLogger); - AdjustFactory.setSdkClickHandler(mockSdkClickHandler); - - MockAttributionHandler mockAttributionHandler = new MockAttributionHandler(mockLogger); - AdjustFactory.setAttributionHandler(mockAttributionHandler); - - AdjustFactory.setSessionInterval(-1); - AdjustFactory.setSubsessionInterval(-1); - AdjustFactory.setTimerInterval(-1); - AdjustFactory.setTimerStart(-1); - - ActivityHandler.deleteActivityState(context); - ActivityHandler.deleteAttribution(context); - ActivityHandler.deleteSessionCallbackParameters(context); - ActivityHandler.deleteSessionPartnerParameters(context); - - AdjustConfig config = new AdjustConfig(context, "123456789012", "sandbox"); - - config.setDelayStart(4); - - IActivityHandler activityHandler = ActivityHandler.getInstance(config); - - activityHandler.addSessionCallbackParameter("scpKey", "scpValue"); - activityHandler.addSessionPartnerParameter("sppKey", "sppValue"); - - activityHandler.onResume(); - - AdjustEvent firstEvent = new AdjustEvent("event1"); - firstEvent.addCallbackParameter("ceFoo", "ceBar"); - firstEvent.addPartnerParameter("peFoo", "peBar"); - activityHandler.trackEvent(firstEvent); - - AdjustEvent secondEvent = new AdjustEvent("event2"); - secondEvent.addCallbackParameter("scpKey", "ceBar"); - secondEvent.addPartnerParameter("sppKey", "peBar"); - activityHandler.trackEvent(secondEvent); - - SystemClock.sleep(3000); - - ActivityPackage firstSessionPackage = mockPackageHandler.queue.get(0); - ActivityPackage firstEventPackage = mockPackageHandler.queue.get(1); - ActivityPackage secondEventPackage = mockPackageHandler.queue.get(2); - - mockLogger.reset(); - - return Arrays.asList(firstSessionPackage, firstEventPackage, secondEventPackage); - } - - private void checkSleeping(Pattern pattern, - String sleepingLog, - double minRange, - double maxRange, - long maxCeiling, - double minCeiling, - int numberRetries) - { - Matcher matcher = pattern.matcher(sleepingLog); - - if (!matcher.matches()) { - assertUtil.fail(); - } - Double sleepingTime = Double.valueOf(matcher.group(1)); - - boolean failsCeiling = sleepingTime > maxCeiling; - assertUtil.isFalse(failsCeiling); - - if (maxRange < maxCeiling) { - boolean failsMinRange = sleepingTime < minRange; - assertUtil.isFalse(failsMinRange); - } else { - boolean failsMinRange = sleepingTime < minCeiling ; - assertUtil.isFalse(failsMinRange); - } - - if (maxRange < maxCeiling) { - boolean failsMaxRange = sleepingTime > maxRange; - assertUtil.isFalse(failsMaxRange); - } else { - boolean failsMaxRange = sleepingTime > maxCeiling; - assertUtil.isFalse(failsMaxRange); - } - - Integer retryTime = Integer.valueOf(matcher.group(2)); - assertUtil.isEqual(numberRetries, retryTime); - } - - private PackageHandler startPackageHandler() { - // delete package queue for fresh start - deletePackageQueue(); - - PackageHandler packageHandler = new PackageHandler(mockActivityHandler, context, true); - - SystemClock.sleep(1000); - - assertUtil.debug("Package queue file not found"); - - return packageHandler; - } - - private PackageHandler addSecondPackageTest(PackageHandler packageHandler) { - if (packageHandler == null) { - packageHandler = new PackageHandler(mockActivityHandler, context, true); - - SystemClock.sleep(1000); - - // check that it can read the previously saved package - assertUtil.debug("Package handler read 1 packages"); - } - - ActivityPackage secondActivityPackage = createUnknowPackage("SecondPackage"); - - packageHandler.addPackage(secondActivityPackage); - - SystemClock.sleep(1000); - - addPackageTests(2, "unknownSecondPackage"); - - return packageHandler; - } - - private void addPackageTests(int packageNumber, String packageString) { - assertUtil.debug("Added package " + packageNumber + " (" + packageString + ")"); - - assertUtil.debug("Package handler wrote " + packageNumber + " packages"); - } - - private void addAndSendFirstPackageTest(PackageHandler packageHandler) { - // add a package - ActivityPackage activityPackage = createUnknowPackage("FirstPackage"); - - // send the first package - packageHandler.addPackage(activityPackage); - - packageHandler.sendFirstPackage(); - SystemClock.sleep(2000); - - addPackageTests(1, "unknownFirstPackage"); - - sendFirstTests(SendFirstState.SEND, "unknownFirstPackage", 0); - } - - private enum SendFirstState { - EMPTY_QUEUE, PAUSED, IS_SENDING, SEND - } - - private void sendFirstTests(SendFirstState sendFirstState, String packageString, Integer queueSize) { - if (sendFirstState == SendFirstState.PAUSED) { - assertUtil.debug("Package handler is paused"); - } else { - assertUtil.notInDebug("Package handler is paused"); - } - - if (sendFirstState == SendFirstState.IS_SENDING) { - assertUtil.verbose("Package handler is already sending"); - } else { - assertUtil.notInVerbose("Package handler is already sending"); - } - - if (sendFirstState == SendFirstState.SEND) { - assertUtil.test("RequestHandler sendPackage, activityPackage " + packageString); - assertUtil.test("RequestHandler sendPackage, queueSize " + queueSize); - } else { - assertUtil.notInTest("RequestHandler sendPackage"); - } - } - - private void deletePackageQueue() { - boolean packageQueueDeleted = PackageHandler.deletePackageQueue(context); - - mockLogger.test("Was PackageQueue deleted? " + packageQueueDeleted); - } - - private ActivityPackage createUnknowPackage(String suffix) { - ActivityPackage activityPackage = new ActivityPackage(ActivityKind.UNKNOWN); - activityPackage.setSuffix(suffix); - - return activityPackage; - } - - private ActivityPackage createClickPackage(String suffix) { - ActivityPackage activityPackage = new ActivityPackage(ActivityKind.CLICK); - activityPackage.setSuffix(suffix); - - return activityPackage; - } - -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestRequestHandler.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestRequestHandler.java deleted file mode 100644 index b3f8dbb54..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestRequestHandler.java +++ /dev/null @@ -1,221 +0,0 @@ -package com.adjust.sdk; - -import android.content.Context; -import android.os.SystemClock; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; -import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.LargeTest; - -import com.adjust.sdk.test.*; - -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** - * Created by pfms on 30/01/15. - */ -@RunWith(AndroidJUnit4.class) -@LargeTest -public class TestRequestHandler { - private MockLogger mockLogger; - private MockPackageHandler mockPackageHandler; - private MockHttpsURLConnection mockHttpsURLConnection; - private AssertUtil assertUtil; - private com.adjust.sdk.test.UnitTestActivity activity; - private Context context; - - private ActivityPackage sessionPackage; - private RequestHandler requestHandler; - - @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule(com.adjust.sdk.test.UnitTestActivity.class); - - @Before - public void setUp() throws Exception { - mockLogger = new MockLogger(); - mockPackageHandler = new MockPackageHandler(mockLogger); - mockHttpsURLConnection = new MockHttpsURLConnection(null, mockLogger); - - assertUtil = new AssertUtil(mockLogger); - - AdjustFactory.setLogger(mockLogger); - AdjustFactory.setPackageHandler(mockPackageHandler); - AdjustFactory.setHttpsURLConnection(mockHttpsURLConnection); - - activity = mActivityRule.getActivity(); - context = activity.getApplicationContext(); - - sessionPackage = getSessionPackage(); - } - - @After - public void tearDown() throws Exception { - AdjustFactory.setHttpsURLConnection(null); - AdjustFactory.setPackageHandler(null); - AdjustFactory.setLogger(null); - } - - @Test - public void testSend() { - // assert test name to read better in logcat - mockLogger.Assert("TestRequestHandler testSend"); - - requestHandler = new RequestHandler(mockPackageHandler); - - nullResponseTest(); - - clientExceptionTest(); - - serverErrorTest(); - - wrongJsonTest(); - - emptyJsonTest(); - - messageTest(); - } - -/* configure local test server - public void testTimeout() { - // assert test name to read better in logcat - mockLogger.Assert("TestRequestHandler testTimeout"); - - mockHttpsURLConnection.responseType = ResponseType.EMPTY_JSON; - - mockHttpsURLConnection.timeout = true; - - requestHandler = new RequestHandler(mockPackageHandler); - - requestHandler.sendPackage(sessionPackage); - - SystemClock.sleep(15000); - - assertUtil.fail(); - } -*/ - - private void nullResponseTest() { - mockHttpsURLConnection.responseType = null; - - requestHandler.sendPackage(sessionPackage, -1); - SystemClock.sleep(1000); - - assertUtil.test("MockHttpsURLConnection getInputStream, responseType: null"); - - assertUtil.error("Failed to read response. (null)"); - - assertUtil.error("Failed to track session. (Runtime exception: java.lang.NullPointerException)"); - - assertUtil.test("PackageHandler sendNextPackage"); - } - - private void clientExceptionTest() { - mockHttpsURLConnection.responseType = ResponseType.CLIENT_PROTOCOL_EXCEPTION; - - requestHandler.sendPackage(sessionPackage, -1); - SystemClock.sleep(1000); - - assertUtil.test("MockHttpsURLConnection getInputStream, responseType: CLIENT_PROTOCOL_EXCEPTION"); - - assertUtil.error("Failed to track session. (Request failed: java.io.IOException: testResponseError) Will retry later"); - - assertUtil.test("PackageHandler closeFirstPackage"); - } - - private void serverErrorTest() { - mockHttpsURLConnection.responseType = ResponseType.INTERNAL_SERVER_ERROR; - - requestHandler.sendPackage(sessionPackage, -1); - SystemClock.sleep(1000); - - assertUtil.test("MockHttpsURLConnection getErrorStream, responseType: INTERNAL_SERVER_ERROR"); - - assertUtil.verbose("Response: { \"message\": \"testResponseError\"}"); - - assertUtil.error("testResponseError"); - - assertUtil.test("PackageHandler sendNextPackage, message:testResponseError timestamp:null json:{\"message\":\"testResponseError\"}"); - } - - private void wrongJsonTest() { - mockHttpsURLConnection.responseType = ResponseType.WRONG_JSON; - - requestHandler.sendPackage(sessionPackage, -1); - SystemClock.sleep(1000); - - assertUtil.test("MockHttpsURLConnection getInputStream, responseType: WRONG_JSON"); - - assertUtil.verbose("Response: not a json response"); - - assertUtil.error("Failed to parse json response. (Value not of type java.lang.String cannot be converted to JSONObject)"); - - assertUtil.test("PackageHandler closeFirstPackage"); - } - - private void emptyJsonTest() { - mockHttpsURLConnection.responseType = ResponseType.EMPTY_JSON; - - requestHandler.sendPackage(sessionPackage, -1); - SystemClock.sleep(1000); - - assertUtil.test("MockHttpsURLConnection getInputStream, responseType: EMPTY_JSON"); - - assertUtil.verbose("Response: { }"); - - assertUtil.info("No message found"); - - assertUtil.test("PackageHandler sendNextPackage, message:null timestamp:null json:{}"); - } - - private void messageTest() { - mockHttpsURLConnection.responseType = ResponseType.MESSAGE; - - requestHandler.sendPackage(sessionPackage, 1); - SystemClock.sleep(1000); - - TestActivityPackage.testQueryStringRequest(mockHttpsURLConnection.readRequest(), 1); - - assertUtil.test("MockHttpsURLConnection getInputStream, responseType: MESSAGE"); - - assertUtil.verbose("Response: { \"message\" : \"response OK\"}"); - - assertUtil.info("response OK"); - - assertUtil.test("PackageHandler sendNextPackage, message:response OK timestamp:null json:{\"message\":\"response OK\"}"); - } - - private ActivityPackage getSessionPackage() { - MockAttributionHandler mockAttributionHandler = new MockAttributionHandler(mockLogger); - MockSdkClickHandler mockSdkClickHandler = new MockSdkClickHandler(mockLogger); - - AdjustFactory.setAttributionHandler(mockAttributionHandler); - AdjustFactory.setSdkClickHandler(mockSdkClickHandler); - - // deleting the activity state file to simulate a first session - boolean activityStateDeleted = ActivityHandler.deleteActivityState(context); - boolean attributionDeleted = ActivityHandler.deleteAttribution(context); - - mockLogger.test("Was AdjustActivityState deleted? " + activityStateDeleted); - - // deleting the attribution file to simulate a first session - mockLogger.test("Was Attribution deleted? " + attributionDeleted); - - // create the config to start the session - AdjustConfig config = new AdjustConfig(context, "123456789012", AdjustConfig.ENVIRONMENT_SANDBOX); - - // start activity handler with config - ActivityHandler activityHandler = ActivityHandler.getInstance(config); - activityHandler.onResume(); - SystemClock.sleep(3000); - - ActivityPackage sessionPackage = mockPackageHandler.queue.get(0); - - mockLogger.reset(); - - return sessionPackage; - } -} diff --git a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestSdkClickHandler.java b/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestSdkClickHandler.java deleted file mode 100644 index 8d4f57913..000000000 --- a/Adjust/test-unit/src/androidTest/java/com/adjust/sdk/TestSdkClickHandler.java +++ /dev/null @@ -1,328 +0,0 @@ -package com.adjust.sdk; - -import android.content.Context; -import android.net.Uri; -import android.os.SystemClock; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; -import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.LargeTest; - -import com.adjust.sdk.test.*; - -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** - * Created by pfms on 14/04/16. - */ -@RunWith(AndroidJUnit4.class) -@LargeTest -public class TestSdkClickHandler { - private MockLogger mockLogger; - private AssertUtil assertUtil; - private MockHttpsURLConnection mockHttpsURLConnection; - private com.adjust.sdk.test.UnitTestActivity activity; - private Context context; - private ActivityPackage sdkClickPackage; - private MockActivityHandler mockActivityHandler; - - @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule(com.adjust.sdk.test.UnitTestActivity.class); - - @Before - public void setUp() { - mockLogger = new MockLogger(); - mockHttpsURLConnection = new MockHttpsURLConnection(null, mockLogger); - mockActivityHandler = new MockActivityHandler(mockLogger); - - assertUtil = new AssertUtil(mockLogger); - - AdjustFactory.setLogger(mockLogger); - AdjustFactory.setHttpsURLConnection(mockHttpsURLConnection); - - activity = mActivityRule.getActivity(); - context = activity.getApplicationContext(); - sdkClickPackage = getClickPackage(); - } - - @After - public void tearDown() { - AdjustFactory.setHttpsURLConnection(null); - AdjustFactory.setLogger(null); - } - - private ActivityPackage getClickPackage() { - MockSdkClickHandler mockSdkClickHandler = new MockSdkClickHandler(mockLogger); - MockAttributionHandler mockAttributionHandler = new MockAttributionHandler(mockLogger); - MockPackageHandler mockPackageHandler = new MockPackageHandler(mockLogger); - - AdjustFactory.setPackageHandler(mockPackageHandler); - AdjustFactory.setSdkClickHandler(mockSdkClickHandler); - AdjustFactory.setAttributionHandler(mockAttributionHandler); - - // create the config to start the session - AdjustConfig config = new AdjustConfig(context, "123456789012", AdjustConfig.ENVIRONMENT_SANDBOX); - - // start activity handler with config - ActivityHandler activityHandler = ActivityHandler.getInstance(config); - activityHandler.onResume(); - activityHandler.readOpenUrl(Uri.parse("AdjustTests://"), System.currentTimeMillis()); - SystemClock.sleep(2000); - - ActivityPackage sdkClickPackage = mockSdkClickHandler.queue.get(0); - mockLogger.reset(); - - return sdkClickPackage; - } - - @Test - public void testPaused() { - sdkClickPackage.setClientSdk("Test-First-Click"); - ActivityPackage secondSdkClickPackage = getClickPackage(); - secondSdkClickPackage.setClientSdk("Test-Second-Click"); - - AdjustFactory.setSdkClickBackoffStrategy(BackoffStrategy.NO_WAIT); - - // assert test name to read better in logcat - mockLogger.Assert("TestRequestHandler testPaused"); - - SdkClickHandler sdkClickHandler = new SdkClickHandler(mockActivityHandler, false); - - mockHttpsURLConnection.responseType = ResponseType.CLIENT_PROTOCOL_EXCEPTION; - - sdkClickHandler.sendSdkClick(sdkClickPackage); - SystemClock.sleep(1000); - - // added first click package to the queue - assertUtil.debug("Added sdk_click 1"); - - assertUtil.verbose("Path: /sdk_click\n" + - "ClientSdk: Test-First-Click"); - - // but not send because it's paused - assertUtil.notInTest("MockHttpsURLConnection getInputStream"); - - // send second sdk click - sdkClickHandler.sendSdkClick(secondSdkClickPackage); - SystemClock.sleep(1000); - - // added second click package to the queue - assertUtil.debug("Added sdk_click 2"); - - assertUtil.verbose("Path: /sdk_click\n" + - "ClientSdk: Test-Second-Click"); - - // wait two seconds before sending - mockHttpsURLConnection.waitingTime = 2000L; - - // try to send first package - checkSendFirstPackage(sdkClickHandler, 1); - // and then the second - checkSendSecondPackage(sdkClickHandler, 1); - - // try to send first package again - checkSendFirstPackage(sdkClickHandler, 2); - // and then the second again - checkSendSecondPackage(sdkClickHandler, 2); - } - - private void checkSendFirstPackage(SdkClickHandler sdkClickHandler, int retries) { - // try to send the first package - sdkClickHandler.resumeSending(); - - SystemClock.sleep(1000); - - // prevent sending next again - sdkClickHandler.pauseSending(); - - SystemClock.sleep(2000); - - // check that it tried to send the first package - assertUtil.test("MockHttpsURLConnection setRequestProperty, field Client-SDK, newValue Test-First-Click"); - - // and that it will try to send it again - assertUtil.error("Retrying sdk_click package for the " + retries + " time"); - - // first package added again on the end of the queue - assertUtil.debug("Added sdk_click 2"); - - assertUtil.verbose("Path: /sdk_click\n" + - "ClientSdk: Test-First-Click"); - - // does not continue to send because it was paused - assertUtil.notInTest("MockHttpsURLConnection setRequestProperty"); - } - - private void checkSendSecondPackage(SdkClickHandler sdkClickHandler, int retries) { - // try to send the second package that is at the start of the queue - sdkClickHandler.resumeSending(); - - SystemClock.sleep(1000); - - // prevent sending next again - sdkClickHandler.pauseSending(); - - SystemClock.sleep(2000); - - // check that it tried to send the second package - assertUtil.test("MockHttpsURLConnection setRequestProperty, field Client-SDK, newValue Test-Second-Click"); - - // and that it will try to send it again - assertUtil.error("Retrying sdk_click package for the " + retries + " time"); - - // second package added again on the end of the queue - assertUtil.debug("Added sdk_click 2"); - - assertUtil.verbose("Path: /sdk_click\n" + - "ClientSdk: Test-Second-Click"); - - // does not continue to send because it was paused - assertUtil.notInTest("MockHttpsURLConnection setRequestProperty"); - } - - @Test - public void testNullResponse() { - // assert test name to read better in logcat - mockLogger.Assert("TestRequestHandler testNullResponse"); - - AdjustFactory.setSdkClickBackoffStrategy(BackoffStrategy.NO_WAIT); - - SdkClickHandler sdkClickHandler = new SdkClickHandler(mockActivityHandler, true); - - mockHttpsURLConnection.responseType = null; - - sdkClickHandler.sendSdkClick(sdkClickPackage); - - SystemClock.sleep(1000); - - assertUtil.debug("Added sdk_click 1"); - - assertUtil.test("MockHttpsURLConnection getInputStream, responseType: null"); - - assertUtil.error("Failed to read response. (null)"); - - assertUtil.error("Failed to track click. (Sdk_click runtime exception: java.lang.NullPointerException)"); - - // does not to try to retry - assertUtil.notInError("Retrying sdk_click package for the"); - assertUtil.notInDebug("Added sdk_click"); - } - - @Test - public void testClientException() { - // assert test name to read better in logcat - mockLogger.Assert("TestRequestHandler testClientException"); - - AdjustFactory.setSdkClickBackoffStrategy(BackoffStrategy.NO_WAIT); - - SdkClickHandler sdkClickHandler = new SdkClickHandler(mockActivityHandler, true); - - mockHttpsURLConnection.responseType = ResponseType.CLIENT_PROTOCOL_EXCEPTION; - - sdkClickHandler.sendSdkClick(sdkClickPackage); - SystemClock.sleep(1000); - - assertUtil.test("MockHttpsURLConnection getInputStream, responseType: CLIENT_PROTOCOL_EXCEPTION"); - - assertUtil.error("Failed to track click. (Sdk_click request failed. Will retry later: java.io.IOException: testResponseError)"); - - // tries to retry - assertUtil.error("Retrying sdk_click package for the 1 time"); - - // adds to end of the queue - assertUtil.debug("Added sdk_click"); - } - - @Test - public void testServerError() { - // assert test name to read better in logcat - mockLogger.Assert("TestRequestHandler testServerError"); - - AdjustFactory.setSdkClickBackoffStrategy(BackoffStrategy.NO_WAIT); - - SdkClickHandler sdkClickHandler = new SdkClickHandler(mockActivityHandler, true); - - mockHttpsURLConnection.responseType = ResponseType.INTERNAL_SERVER_ERROR; - - sdkClickHandler.sendSdkClick(sdkClickPackage); - SystemClock.sleep(1000); - - assertUtil.test("MockHttpsURLConnection getErrorStream, responseType: INTERNAL_SERVER_ERROR"); - - assertUtil.verbose("Response: { \"message\": \"testResponseError\"}"); - - assertUtil.error("testResponseError"); - } - - @Test - public void testWrongJson() { - // assert test name to read better in logcat - mockLogger.Assert("TestRequestHandler testWrongJson"); - - AdjustFactory.setSdkClickBackoffStrategy(BackoffStrategy.NO_WAIT); - - SdkClickHandler sdkClickHandler = new SdkClickHandler(mockActivityHandler, true); - - mockHttpsURLConnection.responseType = ResponseType.WRONG_JSON; - - sdkClickHandler.sendSdkClick(sdkClickPackage); - SystemClock.sleep(1000); - - assertUtil.test("MockHttpsURLConnection getInputStream, responseType: WRONG_JSON"); - - assertUtil.verbose("Response: not a json response"); - - assertUtil.error("Failed to parse json response. (Value not of type java.lang.String cannot be converted to JSONObject)"); - } - - @Test - public void testEmptyJson() { - // assert test name to read better in logcat - mockLogger.Assert("TestRequestHandler testWrongJson"); - - AdjustFactory.setSdkClickBackoffStrategy(BackoffStrategy.NO_WAIT); - - SdkClickHandler sdkClickHandler = new SdkClickHandler(mockActivityHandler, true); - - mockHttpsURLConnection.responseType = ResponseType.EMPTY_JSON; - - sdkClickHandler.sendSdkClick(sdkClickPackage); - SystemClock.sleep(1000); - - assertUtil.test("MockHttpsURLConnection getInputStream, responseType: EMPTY_JSON"); - - assertUtil.verbose("Response: { }"); - - assertUtil.info("No message found"); - } - - @Test - public void testMessage() { - // assert test name to read better in logcat - mockLogger.Assert("TestRequestHandler testWrongJson"); - - AdjustFactory.setSdkClickBackoffStrategy(BackoffStrategy.NO_WAIT); - - SdkClickHandler sdkClickHandler = new SdkClickHandler(mockActivityHandler, true); - - mockHttpsURLConnection.responseType = ResponseType.MESSAGE; - - sdkClickHandler.sendSdkClick(sdkClickPackage); - SystemClock.sleep(1000); - - TestActivityPackage.testQueryStringRequest(mockHttpsURLConnection.readRequest(), null); - - assertUtil.test("MockHttpsURLConnection getInputStream, responseType: MESSAGE"); - - assertUtil.verbose("Response: { \"message\" : \"response OK\"}"); - - assertUtil.info("response OK"); - - // sends response to activity handler to be checked - assertUtil.test("ActivityHandler finishedTrackingActivity, message:response OK timestamp:null json:{\"message\":\"response OK\"}"); - } -} diff --git a/Adjust/test-unit/src/main/AndroidManifest.xml b/Adjust/test-unit/src/main/AndroidManifest.xml deleted file mode 100644 index 88a0de621..000000000 --- a/Adjust/test-unit/src/main/AndroidManifest.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Adjust/test-unit/src/main/java/com/adjust/sdk/test/UnitTestActivity.java b/Adjust/test-unit/src/main/java/com/adjust/sdk/test/UnitTestActivity.java deleted file mode 100644 index 4f18fadda..000000000 --- a/Adjust/test-unit/src/main/java/com/adjust/sdk/test/UnitTestActivity.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.adjust.sdk.test; - -import android.app.Activity; -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuItem; - -public class UnitTestActivity extends Activity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_unit_test); - } - - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.menu_unit_test, menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - // Handle action bar item clicks here. The action bar will - // automatically handle clicks on the Home/Up button, so long - // as you specify a parent activity in AndroidManifest.xml. - int id = item.getItemId(); - - //noinspection SimplifiableIfStatement - if (id == R.id.action_settings) { - return true; - } - - return super.onOptionsItemSelected(item); - } -} diff --git a/Adjust/test-unit/src/main/res/drawable-hdpi/ic_launcher.png b/Adjust/test-unit/src/main/res/drawable-hdpi/ic_launcher.png deleted file mode 100644 index 96a442e5b8e9394ccf50bab9988cb2316026245d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9397 zcmV;mBud+fP)L`9r|n3#ts(U@pVoQ)(ZPc(6i z8k}N`MvWQ78F(rhG(?6FnFXYo>28{yZ}%O}TvdDT_5P?j=iW=V`8=UNc_}`JbG!ST zs@lK(TWkH+P**sB$A`cEY%Y53cQ}1&6`x-M$Cz&{o9bLU^M-%^mY?+vedlvt$RT-^ zu|w7}IaWaljBq#|I%Mpo!Wc2bbZF3KF9|D%wZe{YFM=hJAv$>j>nhx`=Wis#KG!cJA5x!4)f) zezMz1?Vn$GnZNjbFXH(pK83nn!^3=+^*kTTs5rV9Dq^XS(IKO!mKt5!dSmb3IVCxZ z8TTk5IE)F1V29$G7v#j9d-hy&_pdg8?kT4)zqr>?`}I%W>(?GO%*C&}?Fp|bI*~2&KZ$%^B6R&1~2kA{`CWy+>F-x=z-f{_&vyu_3yp{jtw(*syi% zu3t2|4{c~LJXRt2m>rMg2V_kLltCZ<`m>qcI?BPP?6hf``|e!rZEFszeYQ3f-*nAS zZ+h1$mFwy+7156lkB(k6)!1fUbJCxgIBK38$jj5cC$r&YXN)nr#PY=tJaLc?C_o?j+8H3Q>891JJ9&$l-r+-SG#q)*;r52% z@nlKflb65o%s*Jt)!pw1k{vIoQIvoJ0Y&Msiw0X!qJ)_47G*?aJ6bJFLh_4b$5&1k5wN>du*>6#i7R9T8; z7>EHOV=ue7mo77SJPwER4(A+s?n0JjYK)b}Om6n>ke?0JR=jTI+RFBg_iwb7k%n*2 zR_M0DJ9x+0zxba4(B1y^JQ_Nj6dlP5PGXvSq8fF#mxrFYj3d9(V#jJwt+IqU9+8+D z6C6Us1OI$d8OF!3+Hm1 zW5in zXV^%U35HooOpSmeqlG6e0kUMYNonKp1vr|My9}4-WO+uOxe_c-o&}%voNYHkqtle% z5yQ_^oozSUUNu30EQSAl!Q%(%3G1NXENSMjCL*Vx-Td2~rk(}d z8pT!HZe>1r5EGuz`pgsg@^yQEi=BIa#meLq0!?{TZ}q#}=7UC9_l=w|wv+pP!g4#! zRys6EN$Jv}#U47$k&)pDzvks}LGfPku6P9p!56Py)~1)W(11n7n}`Wx!=;_JTiu#d zpCqx=hEk@t4sp?!j{W}wP@V-=Pd=T^>6IKBy;#mLA7hCe{V7B3@I7Ipa}L`MbF|YQ z)$BNWsiEnoNHrtJli|n8cOnn4NyF=8MbVxgof0>Uv%wM_j94a;8(LMjlL~E(99gJ*2%JtNtAkD@j;^ za~Y~&j6uY{=Rv5S4joH*RW_m9N{ZSN0HhAwFyJNok zS9kx$>wMf%tUi&Eb`6u0lWJ|k?A-42(lp2UmS(PrAc(24wexRiHUieMwf$o%m6$xs zp#-SdBUu2D5`v;(9-sm&kN2M74c&AvKe_v@tQ|dzJ2qSgQHpnUP(iQ?J%Il;Jdyp# z7}cpq6Kdm+FS~zS4Eo;fuO=DFP*UlpO|_CNt5&NUqBvQWxmg7#ARvMf=%#H@p%RZ` zjK$hMbNb+vVP3UlkfIt&ptJ<00Ic{Ka+lF+&w;OEs1O2#V8~O|R*Gq9TIgM&UqM&bZOXBwnbC? zDr))NR&g>lwVgcmnx`K1$)PTTw3m}-T11^ZkY{}jQ@lGD$XzJIcVFkYBBW=o_}TUU zt@yd{Jz;@~72x#!RG(#ira6}v-*J#<{@@^OI-Q2T^}=IKLubsa&V-%WwlF1s7fz~u zMdQTV7SnRet#^`VO0V7H(?59X{uy+S`(sorO@2-+qioUdo9+6r4#|jb=?t50oh42R z{}I>Krut|YKkOc|O|M>y#(3YA;I(i+MiHSfwbJA$jIUr$Y2i|u)*>@2eUYk`j4C5r z>61dKu!AqM_E7#DoDzbd-bfT%AYXUUB{SS|{b{`5^?wz1{PVQgTlvyqOX8(#GTz(U zNPhnj>$lC`xaD56`TjW&uW8p~qikP*F8kHFM0frzdk%UNGjb1O$%uLK`0-)2UsZ3L z#+j+CI_8k4VslL%$aVR@joX>M-@odbX!os$xY$HDIOCokY?{Q0v2kQErf|ZlN>D9w zC+2}E&?rDdi#%))$p%P4C_xGXu=@U~_<|V4L|{>TP$XBp$5pCPXLzK3!;gP>7=QNi zkNOur`>xY=@VSpB#LsN9JKpOz({ANcdv>?K+D_*_HZ<;9>kplj^Ph5!e&&a#?(3vK z_Q@}D_M5kGcx^AuaI~qKYUnb1Mj-n;MURXa)+x7~e2gbMW|gw?5Rg zTOMlo>6zIJ$VNVgn(@kTSL0eP)nR35IHpoHM2W#h6cNmTm@-9`dFJ$;k(S`7Lg@RY zp!hNmb9un!O4Wt05ANDGirv(B14gW| zwjP}C9bK{J`qZ_S2o)b`RonR-b8~y8)$H0`+gg6>#^wu8eCp9xA9B>>8(KRizI?+^ zAJ#i>*({qM-c4gBB~5dzg(wj!HA`hkh!aDl5>u&J;>2K#Ax2)2wt|L!9X;(=*jy!`r4_FhCBoRxNjXNv(~jGQ|%<}%K6RimaBJcP0v}oCgRN3B;oiM)opj? zXm;;tv3q-yy}NqMOr^~3&1lW$w3}UK_IT2sCrkYx5$&6e2A%g;QZUX~A&L!2rFd0p z5%men@^zN_Xw2|v%*c2|wQfkN4r6u&k;LxYY+w3{KY#cie)!iz>(yAgt=&-+Sy2V& z9BJxI+VMKQ%dvY~x>gmEijj3ss_*NAT(8d1@DQ6e&#Ln&6Qk>wHrh>;V2nvomC`8& z(w?`?*_^3u-TJrMzv2~7dH(XLJvUOXk4U8oW6Ol)YsawhIB{GdvIzu1hzMTrE)cvB z%2GxMpaF89<9uF(?cfN(BNR?wwWvCZ6e62+G_{$+;`yjgLj{(^z*zzwd;K3RElb*%=??P zm+lLY0@Y}^kVdMYX5M)YJ~8h=i(S{q#NfU0xPTao4WPDQL=Y_;vg=p%iay1_`<0Ga zMG&<(pOU+bI2u9_g8IJBTqGX*3@G$Zc`pj0f@)vd2?Aj`ms>DHg>;w~p}HXV(*VJX zphd;fht9qL3E)D8h$$A;SGl22Ygv>`iU=A)z=1ZYN$|2`*$`R)?KD>$tw_e9h_x~eX_udS~Q%yz?48i*aIa+_wx|j{B zsG7mwZ)6M3dmvgMC3K-66;ML(9o2xU!F8+qF)>v{1;ip)6v_I)6law|rd_Dx2oV|n z(Qm_PUnTTuKFG)w%s|)lS!w~Lm$k|Al=0djocyHU;>1H=!N}0E0lSV^b2^6~^lUco zyoH+|_!li3#euHd4TJS8=CLaHG9H8g&h3Xm z#>BkpUBAmae(#)qO3)ZMG3irM=5IzA^s+)w86=tIMT{&?Awux<(k2>U#n`c&@Z?u= z%=#BoO-9Nc^?)hz*YW~~tU8rLR-MZBJsY_7fp2r~mY>q-O;L%5Fp?}V6CK=F(18U3 znxB8ZR0TT{)T64RDt!+yFgp!JXGP0|It0Hz2Em#YfRv>O>8A?J=Sz!nq<|{&mW=?~ zDQT{S6PH0|jwy37t+0Ob6izz)JdRlNEUbyk>-K?}FOT=Dj9SuS_0nTFd+A^D?Bo83 zTkicXcW=IuZoZd(Dl;&#`LI;_s?e;OH9quf?*XuV0O$Qh0j~HWKpA|PXV4&b2zs z@W5<)dtovIRZ@gvsi$^s;v05(XwF3$lJ;wzYfE`46fnT7>!qt|hWHRE>yQP)i8= zVbC|O{Ud6%kwGcch>>|pE-=?cW;TDR0lE5Nw7l66lr-zIYT3bj^ujCn$b0{ZO;gwK z#}}W(*T3~in$6ZCpbB98pftPTo;!K>U;H*7_}t4m;;4i9#^2t`pS<=jsnx198);d3 z-M6Mx{7-c0A-jhJQ`5mBy8TBnfbr2~sER5E5oz}=so34cg)GYarRWi8w#W$%G{?Z*4xDb#LX1B1 zg!4G{m~*)H_J8J^SNt`XU-fxjea`>p_$Qyn*Dn18*WdPCp8oWw^XU)%kfRQHMgfQh z1j_ua@O4G%QK;&YH3Y9(q!hkgOUCkcVH5N0Ug(EPX%H6qCfPqg))qrd#ec^47dBu- z=sRkmjGS>3K(tfRTo;zCXO-74hV;y1!vCN}v|w?AWR$YpYXs@Dr?iNLKD9s|2)0aHY!TKTYhwMI z7b#54h!H6rUU9+xnL$g6h?t?Li5guXPY1g)$bI$~rHWP%QkYJ6Y-U^0C(@*$ruN2*zn0QRBOeVpgMFbT%k!Dn1*u#%J^y)enX1K;0~ z%3Q zP(b%}P!Loj6M{v96(Qa~K!bq-V-P89U_K)0zHC_F#L==3IPh2hHG6&?rxvQ%|EljR zfGIDyu=rIrl1dyjuMfwuh?pXZmARwNZ?GbW;5BH5D#nN|WbGm+UGAh7_AcG>4&|{0 zrg?k@h8zm!0A|5Zo%X%g|2tBPKHHB6`~4h?I@bepDe6?^f8w zBnzfOf|j{kR5m6BLRr0$!RZ$PHSk*)tyjkws*DpyHIiiL*8o(Smx(OKT7@D&Y3OI^ zEUMtKa2*SLjt(eJsZsLsrgV`A+xL(~JN#JU6+L)gCe%VuSNbCzTr09w>eZ#779SKV z)m)@#TNVy|q3Tz_U`^7MY`l}`GU~OlQi|*cprX?tm@tIV+8kOGkaa=9Y<{N|RZ)ns zHlgnz2S%qwK9wXjest~Ux$YNNA{0?6Xpv{_mqYt8D`g&7Yb~>lX+HP&AK<=+Zl_kO z6a2g`^4=9W92GQ3e9Mk6?DlzlkIM`iOzwk*5L81TcuyYkI-<3^@49_+^XC7&N}SL1 zh$kIBxb`9+v}acfV?FQ zN#04eHe0*j{pz=zOj3#EHLrT3e)O;3xqpCWrl$e)PcD9jQ4P-8_zyZg^M7i|*kOuj znsvlwNUsy5+01^P_sqMOjXjxKwHn4)$87t-MWZZ*5Dbit4|D9vL+spsJ0JPd?{Ms) zFW^<@yqjZ=IvG%$ck_Cu9|b8CvoV%5P5IZWzs>i4`~`N+-p`7a6RbLHJ;nxtSB#Mb z`1I552=9DrYWFNZ{-=Mt;SVo5@3cmv`IZT@@>#~zCe-=qENxsn+uHfL`e?SbT3IQ_ zt~e)Lcirs_S5^X#?hDYmgV%8QQDe+?>*1&0e^BnaeZz(&D~3<)#QuUL8h*NlXgtr| z&a{_Z)o9FK_U5<0!E3N|yY1P2g%J9s*?!zF78+NSb%!ix)tbQ09oO&|U$~Bwk35^- zec9VN^xz{043e^xD}WEmzh8d^-~Pd8**bEfd+I?HuO~n4SksoN8LRPUy={E<@BjRMUh?X71Xaey>t^$&Eq2B7)u_r$ z|IQwpG52G!F$J5fRo1LqLB7iKz_!bI@27skX~+Eze|Y}IBuRp?hR7z|eA~7B<99#7 zrX4r2a_tCDUb_}Cg)g!OEVeJ5AEVRyb!9~f4OL68qhZZRP0l*>MdkxvxXeGWx$T>+ zI^X!wnYQDnwK9?i)j)eLXJU2Cw>~>R?72@MecvT7;h~2gATow_cbc)$Ws+xNSB{++ zo^tTp^y*(-Y-XF=$XyoBJnMN9+p!Qrep1)%ym_v7zZH{;u~L>T=4XP!f^?uC4ULUR zdl`>x+DVkHVd;|9#N*oubBFQEyRT#UK^0c7T}l)eEEFS)qvZl%f>#I;iCwAWb=kW0 z(e#lm51o?d>D|kgtTscVQCNDAXMAjxSX&{_Qf)T((wMHWWLbz6WpPXP0(3_SBWwI19Vx?$i6WUqP$4O|wjNbYzst$z{58`cBhm z&F(N-KeXFzo#aC|6BbC($As#B8X=}ggpDyQUp|Q>9cG$47#>TQn%T(eHA`5se7KnZ zF_dj_6NN0xS-oZ%Nj%PTpK=MC zw*4IMGls_v)mokI)Dph*pD<)7prEF|j6I$2=XF=Ua3z;BN^yt&H@G%7& zWnL7*e0S9svjSP>kuc;VCbZXUN3G7D8`G@!Qnjt=p=7yC?QH0tsa@RsuPMLj@wf-c z|LV)H$Auga+MTAU#>)eeuh_L`!qC=Ls|{m}Cy)|w6#aP}w6_-ya~9LF z{dQAPa-|&ME858gIK=}lVK7MLT~Oye&UM9y?0X=8Qmvb*)=X}iv%Me)Gqav+FWdGT zuk&#ak~?2Kzf}w)xZuKGx%+`1?Ecoq?*H@EjFm%C6OT577vWKoJB z$A^sIasm!5TGOFFGmHkKNTE7KW3nveUq1bt4Uj)!1_6BJ zU6=EoPrjVdk+pQX+j-GTpQS&&^43tT43kuRlvE8fGdYc!1|m)3WCuwlqB>NeQc0** zYE&wTj*QpuPLfJ)j2$(`sI@k@oR!^9d(3&Kd6r3*<)pooPNzq=)1%#NQ;nAsF*5VR zOYXQC;B^4*Sik--jy?J`uDj-! zSep}9YT4*SOrT2I6MF4H+EZFRPh+}^b4@i8OYk9Y&86o*Y4(`Ax1W4#tX^5m6LjZPb61LF2?qBy?B_?1YE!nej)R5c8qG`2s_uF`Cu+ z`X_$#2Ur#!Pw0WVd60fYG8A#y55LDyJ!Yt$5G6Efb<6Nr%-BTC_|llMB?%*A5%rOX z`fyBbD5g@4Ns^)P;F7zjv{t6u?k1J0kR*v#Dhair3iXjH^^qz=!xd`vm`W`oN-Wj_ zNML7~t!rRbc|9I0mUjpEgOJ9XGg2;vjDZ;b~V638P!uVuejytg~ci-I(n9#M6AR=mQG0YjoLKGPgFp(jS4Pn7UJR)Et z-8ZsqWsRLXri#f_BSeWIat3P+Q3Td1#ws={2CLGpDdvrgP#KD7 z&SnaR^#_Bsq;Xt;kyI^}iX~1WYzdHamc$tH1#Mz6f<2(WuH^s%^yXK78Gyg}{;LNA zoW%$)#R!a0wv&q%qj%+~i3^k&1jY!ljfi82Vr$~W5G6u&$Wp0VqR3*bDIWLE4Y64K ze08)CmeFrq2>QGFSDAk%Rhs}$r*rJVNuoO(~AJ!PG{T~d_i(dQ;OsQc+q&twwlJV|`Bv$N}R$K=uxCPyc!RBBXfRjRcZi5yAQk|YKj*>d`|Xw~ckP!!SW%^gsH z4oDR1AJt?S?}B;<&e0TPFsNAMQwxCt69o{uA>=K^qd1+MST3tptj8GHnN(upgb*ji zq`i%b+{{=o7ByB78@8!x_Gs&uqLOKv_6{gO2b4jbc8YT@EEzqBp!v_c?XXFx9Dq zb{!I|Nu<;4kZbyl3*LDg#$f7`nKwT9p9|2|t&fmAe64Of^c3TKI%Q?_^+uxaj|?xL zw5U4G#YlpQDngbfM)q85qt=DJt|y5nG){VqE;V8I&WBCAH+|pe@QT+};^BWB8(lGB zqe!DD7GqI`0pj%h;hm z;n?F&(5YS1X4{T?Hf24&;~ic?rDC*Zgk;*ga9b~Je`?R%gBQy3U5$!cEi-#s>T+d# zWH}Mbv|6p1R<`wiiPB32Gn*u}EQxC^LGJIR?H}~g*|#s5IQY`pJzcYP=0El5RWIen z8*k;5(^qldFJ}(enhxl1pnB_vPi5uu!@1|-9|Owd=%J>WPwQ>dkLW|!5WV<$<73Xb z{0CRJT1OpP567)vYea*J7*!3_M-nC`C)l*@dKzsw^5El5v)K$c-nf?sZ)?i>Gc=yt zg{xL=urnv{!j}h=hh{KFAjIS@=h9C!xJWW@nmR0Ns^Wrk)72_X;&VM@qLNZyn;-h1m-)j4PH{!#b7fObo=TF+Xw z)_t{JRqgNW{e9m)=MZ*rJl6A%IHK!gcqM)U)>TjF8ytMTRLpN39jns9J?@oOe47l4 z1dw7d06;*nuu_+V$6Qs4K>#PCRHVFExV^duw#+4>?(j) z*AHP%*L5@qEpM#j?*@5nOq@HlBR^5M@^_J9)U!&MV7N?QAAfFbdJaGWPgRws)6~+R z-NrZmx0V*7Od$!{dkY1w*wll3j_1b``)C%NHS6N>yBU998+?y%)4SU2YA} zA%$NKSGVi)4!sVH=l1lla~XcBLKrfnO2~CXCa>$GlX_p?dYsM`3%)hidhs()bzlDL zr7zEG>kK#SwpW`1YyR;!pa1&-`0t?)V)3FnK7V~pCo%hYIQUj+f?7Oh#@-(|a?XKA zr;?n->{Mx?{fOYn3n4;UD5a5kBx9Z>DQ1SETOzUjjZ`HF0&e`i-6T<17qM|ec7?fBc z;0k&%hz+o?+KMG>1)PSqUSqTR@!luCa_YiGo3TkPUp^w8T}r$YFf$gPyy|ZYU`={9 z3c4MNG|FgE6ETxVuw_~St-lefEMgF+NTdzZD8wWJ0s<69@frs3IxH*_A4`(dIZhJT z)TwApTxD36oOSS>-?;UKV^n{)k!mFpfWRL3*Rxl@V_bS?f`4@I!*C2lX%(H}L=`CT z0BxGtLQ@`yX#0U)3`bO@9NHBjM^*Gw64K=(1QdKEK*p+u<&qTSoUzKhfO`4Wz>@z)uK^Aw6m!k{QPq@f~bd?t)6?} z1bJ=k7!E&fDxUmP-(QVQ?F@i8a-dv4%Gg64haX`yNv^E%Ea<=YJ4SdqH4e{1~Sk?qbu|M;*f zbqpYh(szvQ9ev=Amrj8q0@9+|SbxTQw)=Lr&Hm@e_hY2mXXchai5dBmusvCYf%>!X zK>#8PKtTjx&+y*EIR|SkT*`=|2>VPq0kb=fM~F#u|GG<9sj?zc-#-8BqmC*-%N5t% z3v1um65bJjO9}`JV*qzjs9O-*vCma1qq%z0=Thg*sPtm8u4CiyU5H^JCTU0mH2?_M zGn{jci{Y)p`kvomV&MR6*th{{opqpyh3Ux4m)!GykUSWKMk@t>>SyNTwj2L%XZ{Nn z>Xv_j0zm+HA-wSFCJ4n;tqux{Z<*M!+ghP`mh}};q{({$d;y{&M#518E{~{H2e(KJ+~I! z(QA0${wLzt8F#!r1DoX%bYVIIT!6Y1 zJctN_2;>9AahjEz5Cm@p&;a2*ykj`$0UrSH$QJ^n3By@S!UCJh5jS2|HIuruyXF34 zRDv0v?9yEOYVFWR0jftU~yzAQIFKu_~N!vxLSpD zIxEmBpAwnRC3gEyg%Yon(xeEA2t*11fhfB~8i^HvMIcQOp5dF9V>l7DZ+tS31TC`?6B2!P-{Ai`NS%8sfWFCh_# z2!sJ<26G0;dxnUBNT3Wrj-j+52u(2zc*4ieoxAxfi_hFMD8$Dt*t4hHU+Z6a>y4`) z-dgRJ&wT2GICjQeJ24|X4P=?_kA+q7QY|L{F) z>E#!CslTU!sFuPzhBSJAZ4?NAGFdr600O~tQ;`JDd9Vkv#1X>KptUV8Q)hHgp)4=n zf7k1aF8a|v_e`5zKCDz~Nuz3ARYohScS~Kpws!0=fL0XBO0`T-YycqYn}yY@ZV?g2 zlnDnM86|@t(hM=mC6W&G)j}8N_Fwtr#>s`2R4qD9xuZ_o&BU=o5&`up5LX5DnnxN7 z(!|510_PdtJ9u$`Fq8(A0!#>KLogu_1c1^6@0sdRitRngzWe^er2PiAMIqpkE7Xj4 zqSD0i@PNn2cHaUJ;)tnGEM^?Y2OX%5fOPNhi#0IY;la!zy_Gm@B#Lw#(Mo_^%= znu44{7-|HeMy{k$Y%?&%Kq&>KG_*4CK85oRio&-@sE4y2Y3h;2*%j9ragC&24JaC` z`!uzlS%RjYWaMg=C2{s!Ax`QU03w3c0Yn(2{;azYNJdU3mn!CrxI&4*JCC^T#}y}2 zA`QzFa=EsmQ0RGvftbU zQ>{c90A|-98)Xj4nT0b0yyJf8t%xIraRd)QQ&z*I6o?d@PmrXe$eT_q-0f@}wCCAq zEl$Ss8*j&&jkjWZGSHg|Kx;aNPWFa9~0$jGSbWOU>XjH6xDc0w(iTEtcE6dO3#5TC{ScvW=I(b=Nv*)M5VtC-7j0@OiMO};u|K_aA+ua&Wy|G z0O?p6>sL7#>4bE^@$`cedW&;pHYGbq)cE=gVUygN~?!_hF|0teV`9}~ml+s!M!x_o7(s*;* zCVc-VU&If8em*{M)JJgGyiZ}QGSUDFC<*}~u!v@1)yzPXBMKoDa!^zNBmjHLN~pCo z86Fi-BjwE?n=_NmIA?K7liV3M;v_;xTNl23?ow=ga}EA*-%{NFA9)Ej6(HYiJs85m`CL9ANNz_7Wfw>}W{H&o zhy)^>0cdZXg2B-WvL1};5P}FJQvqpeDFK{}*W_F4Q?l}yJ$-+C<-Fxs|HfnZ?SC!9 z1CQT|j+S@fx%Cg={YRgO&z2Z>i~diz*O?*BnAkIbU{QcAP}Z33z=$xNR5+KgfMs35xDG&i*Vb0Kg44zZ^zZ& zc>uXE4-p1))`B-&1MC}R(r5-n0MAaC)!S!3D{E#4D+*c5&ME_7bO-`vnhuJ0%rG^y z*MSI{U{o_J!WqGvFVAW?BdzlmMhBQRZ2?B+Z$U21!?_gN1W=^F4PGQ^jHW1{`Cb9o zLx~8DXBkZ|AhymqMH-oHxQxU~>&7f9WD8o#QYOvxW(yKUdVH3~XXbxdwyFjxt+lAv zZaWSag=@ z=8P$&K}1lbY?iX@ee4?s0wKUBJ964=H$0STaA3T?n~R$9CTTo$W*+}*eEXdRL>ghx z0ulvhz0Z>9A)>e;5?WE{3wn~(Mxl@k5Z8vY60)g)Z7AM`NMj7L0~nqG?*MV$0cj#* zg?t%+Zb&IZs~iSLH{&P2T8vGbH$W*3fW~XQxiirODk4xy!&-;m-f<)T^zbbx6J$2bI!+g&Q(Tb>mTpfw(MhPbbX*24YD+xC~pjzlg4B?I0>ZG1eo;$GZ-@3q)Ayc(TT%9uB8CcO9K>t$rJ4+!Ga!{2blb3*{mJ?rAx;e_@g zW=}sb8SURhsg02gkr06Qo;))H{@ois2J0*E-a_ku;$#FwS}J2z^z{y5!Tf{u-m?$! zW7XmPw~xK}Y|U*DV-zVxM2Z?xn6(ROnxdy?JIXW%Qzy=WHv^~-wPRiPJ(xPPjP?m_ zU@!3AH)Mt2y@NuFGk%)cvT4gxH~;vV!~gKarE2vv&(f8P@Ag++xft8kE4o&xvN3^V zhgKTPzIFc&iMV*lvDmVC6ReMr3kzh>qKs;xT2uwI^KCQwiCuxGcI>;nX1mYH6|D_I zV?e$kJ`M5;L7M=zY84}cF$$#|Dx-Bwp4xT+U;&*D<@0j8tMo%x5%Tg?~5R?T=3cv%@lt|5rbf!U~$$KWHR3?Xk zu&I|c5%P}XIIb@4XrJ=aC`y!W*}^Y88R7A}hVa+MJ05U+?`P+M8rvjM6j3edroqA2 zxm4Kuj7oLnm$`fxbar$}K3^bGfWT*$Wd5R*hEfJ52%w-LATTp*YNZ}ksTNg7J=bnd z-Pkqa!RO=D(kYB&|Wjqg0rvF8kum{NfucTYqrP z`5U%u**G!G6{S=zQMp`3K3_yWUyzoz^2Q(tmC>3+s5Oq`4(BY=)S@2MFgiNo;u?&k zg`0}`37-~9P0%vHiA@+H2!cEy8o#>wuOImB)G_Pj7yce!TXGVt#ORn z(=jFB*q2Zp6$}lGp?}+$um^#4QjKaSEI75c$z6AAYL348>#uKEccl>fFbuUZ0R$d} zZ~}6sT!$|qC`YPurgrtQ76=RC$YS~T-}$t1r_YJ6x+vSq`|xwOl@gGLU>BhcFBv~FMie-ahi$Rz-LINpu0Hu~Za`}LYEdk2y0hQVU6k7}mB|~9e!x(}I6ii4k;VvE0 z?|KG+Oj%0Bi3m(dlp;$c5Cu`1CM@ypLV(%bX9 zr_WVSKiJ10x1!vdPr`gLXF?@f1r%~#N8UkH?XgO1p%e>?-DLnfb z=86?7j~f~sKElT8lSw^&-{|PJ_Z)D@o-cw6^yvN1aY@hS38meM!r|M7s_XW%93Aak za$IUh=gpcu=jzR`4$^18^F8_11#h4-#Jd^}{s&{CB`(>qac=+s03~!qSaf7zbY(hY za%Ew3WdJfTF)=MLIW00WR4_R@Gcr0eGA%GSIxsM(l48sN001R)MObuXVRU6WZEs|0 vW_bWIFflPLFgYzTHdHV-Ix;spGd3+SH##sdcWUue00000NkvXXu0mjfB?gph diff --git a/Adjust/test-unit/src/main/res/drawable-xhdpi/ic_launcher.png b/Adjust/test-unit/src/main/res/drawable-xhdpi/ic_launcher.png deleted file mode 100644 index 71c6d760f05183ef8a47c614d8d13380c8528499..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14383 zcmV+~IMBz5P)>IR{Zx9EA~4K?jU8DyU!%BVu|c#=(H1 zIAFva(2=Yn8AKWhO=@Vm>As!A%_mpwu-+fLs?Ir051^0kZ=Q9(`cB=t=bYMm<@H-@ z?@QQC#}7(lHuiOKOg-hI-&yJQ@X z>38Dx`mgcs{{O@!m2+^EdNUPDF+a6!8!8*d@!BI^jeED=gH;btqEI5d{e*jVDP7bq z{q~MSBE(fsoQg6}7k95+Ji!s3$poDp-qlOkXAwnM{3JB1P1P!!MLkm@C24>Si7~v(J@mNzG-t<6(_#~IP~Z}QN`;~#%u^^ zBv=E1KsZ>EXwWhEA%MjWSj+&p1YiKMScFGKjPH_0g9QS9!hVpahud$BNHq6km8f&$y)VmTQ`qJPd+?0zVd*nDN_N;fDC>PCKgkkd- zF&a`~zS4LCy*S)Om}M0r157c%Vz&|}g=6?|;XWKwAQT*MxQ#H?lrYWC!I5q;pTUZZ zoF|S^mMxt;_qPCIXf(txX5a0Ww;uk~=vd{jwJXPI%UbvK`FqRT9{O`bUiO)BJM_2% z(XOY!tbcIB+EHv;)4J*BV9|&y5&#Sa0{{$SB&foHK?p!lAcP=9mJn^Q zEdF4f`u+CiwmYVjr%WuN^Du#n`yU&B^3IJzBL_Zu-$?zTyBfz|`{R*^-t)z|a`kd+ z3q1~f(k6y5Nm3x1Yb_kKdg+KYV*sjIe!V z{5>Bz^<6`n@li*u;}T2+4lyJ`2oxNk906cBFdVfoiU|zCpa} z1i&zeF@X)3#Clk0*p&E|Ev$2}*1}l_W2{Z$7(q~!&ar*`feE?ciQuhsm(q`Gl}fN+ z@eJbtu1z-J9Kjlg^G?2Vm(yjpIN`_LzXAXv^r3($xF(p5y?b9P1*F-Cr~YXsj=g)| zS$n>$x7f>y=ZgXCM@>wqVLVI>hXL%1sn{O{%!kA@0KEW80E%#MFwm*p_a{B zD)9ll)VtgP1B?cSF@g0+Q1@mB1{Ma^85pZ!tc5iO#u!-ZV6}xY4oPBJCzg_?K&wta zn%L5Rj?vAeG*Bm!j&+Mc0?>)WhhMvFm(gdJCt~yENoevA*5h{EDh@*#(_{(r%m&=? zu|e$lr34M$iU-{w?Joo(Y{qhgD4~QIkSM}}!O$?MLZbI-s18e=OF&ai&7-M0rh0zYyI+(=47^@pK8?@?t)yRhO zzs%pSswcJ+l9+kcqH%0n*9V;dpM3NE&pVBFsSjxAt=MWGLVz-sxL2ty_6bwL*y%l( z^9>+yo3UI7lth3j7{MAa0$2!WSj1?ejxkiQ4K<7-K?@ef2cKYAaNFUg(T{h&499@8 zfO7ildBY909A~mi5d(n62vetXrh7` z4HzV;U3Zyv?>JqX@EIcrL17PGz;pl_gtaW`qV2(}?K z7!zhaTCssiN~pzE)ZG|bt^v&&Iw!VCuMKp5YG@e$;~cE9-qBhIYucx?3~Lx{30fye zS{fl{!|4FcxRUz?fTWbfM0}x+#ep9=eVP@JqE)w;wWx(pTzXQP1!_hCDgS-E@^?9S!F42HJ_S_#uc_5Su zs5YV8=8;EdD(d~XBf)i7k@eOjOu}f!6L8G}mPQ{ykK7Z1=*K{C7^dQQG~*hqW*BXt zwShMNOtkjDYl9@w(22=Uqtnw^7;U{qm`pPmt+!FL;E8XQ{Y&G*#ZExj-eADv1EkRiA9p=HbW9mXn&pE zx6s<=(T*{$-anb}*Q^f2@NW}!Ypi#4-44eZ5;wFGR z2l-#ffa_PC34p;4_~V9Ch1H=Mop@k2T=ZsZ95ER2~w$V2Qwf@K~R83 zvJIQ6w*fXxCEOy(CETXcuAvj1GDN3@H|;ZhZ>JU*V<1q%=E-}pVf-!#5kQI%P6I0* zTLpFk*7~tCJ3&MYqC=<6ZM^c6Z@7>dv20Zp<}9uM?_~fH0U)$$1VND)+d76o^q=A^ zEr^rEHJg*7*_`x*)CPi!7_L8n$2VUEYYnzlmg6rQKZCm73TFhg)~N(r7^9)J_GT#Y z=E!J+L>qrUGe4>H>r4xD=7=p^O5i)6{5&4r@Eg=yoNE;R%JeoxjiXN3-XX0XM8Z3x+2kseod+K#}a>@yV^%M}^*#iQp1F zAst%zV+r1|H5(QIra@x@LRv&YFN9=BDFGr7sAH&E#DX-22b|;do=c^e;n;zlgR|aA zyY$*QZ{k|5CRq1iVqyY?LIkChclb`g8G$6Wu3oE&%0x0;uh6maSl?4UGb=(U=b9CT zAAD)W^Fp)dRRgSbAYouM5g5E}`|w<2-3dk;YPD)2(M=f5sbl0cDunQcOk3Ku&N5x^1FSJ=M3mZon=-*VILENo0tgU=eUPES)PX*zAoL7o z=^+bdICcU=mYo}9XOEjc^IkZoMNjft0EE-uvH$-*2E<7n^$EZlD+Y?kfE~ZUXxp14 zEf*&Z@EgTT(Y7k=$iK(SA|BR=ybI5Z(;@VwCMZ!$sa_=8wT7h@fN5QG4U zvlvfCab)odtTZ3MLn~IoCYzzuBK6l5SDPdEd-X-eRX!@EFbu5#2NG>lLPR;HL-}yh z`_wi&MC5}HqLgS1BLC{41#goav%lv!HA~s6mwsoR&nay7yEk7xf5)QejjzT(&AaOVO#?>xa{z!6%4qPn@N-<8|7}ThG@fYqze_s}1$89iq|O`10Jds> zYaEiem4=mV>361M;_0g=f=i>8)OmJ>lG;J1CPwF4k%DWP#OL>1TN^ShV9rgEXOi~~ zo@v>AmuiBAwT9R;XvwTawOIhrs)H{7(gpbBM@FC!BA{L{Kms92D$+oBAOK+VhGBg7 zc3)5U{+-ADeGFL39|7~7nBW-O`9f^QpHak8ybYhG0{W>$Q)!!B3u9_nx2~CC?^LgC zw{LpU1qHTp&{+jz9CbniodoVWt?PyotcB^iXFaoWV!JN0<83{suyab>OdC2+=C-z^ z*N%~DOvW?==a`rY)^SNHJ^KfD&w!Ai3aa?hC9_FWO<7cBACBb`&gR+lG2YO;P7w)N z$40Dvd?O~u8W0k=P_IuBrh5qCR6NJtRo;Uu{YcZwM}hWjy#XVYoCUvLpd zn?q7ah~9Dw)-ffue$<-Vr!$MGYy)F7V6=nL-sT&_xx^dO37}>6x)aZ_usS8a%cMPf zzwKh0F>OY;)b6|VyE8_(G-_&JBaQvN3G>W?H+4=hAT(PCWA*%fj=K_LBQ@Gqt;@M| z0ZT|@FlvE~(|`wNGT+_rM8!xctgZCX?71^U5PB0x1YCU0kH~j9c;9A zYgg6?07kd90N`nW-cG@|S^K;O3l@!{FPe@H@;ShX>*$mw_$j6^H?+9E=;4JzVe!A@_?7{ll9hUq1mbgaVweTVAJ>>5RxDy zfyg`1+@W^8a!MHF63fmz-L`Zicf>A}NqK&zoP2oG6*0z51&Nt7Xq#*6oY5hmlvF>Uo>Ti(<_Xtp)F~;ksPsCeiHJgq7 zn$5=R4m)V>q0WihPCt1@ef7GAsEk=IlmzNki#xB|p40kiCCT4D^jduClFfL-Sv@e^ zq6;hk={{Bbz?2dOzty0|8!a3{^g%#iL_dXUZG5(F%43_g;A~0i{de7X?|+~1_Lqu} z|7ndFoN~|&f4=+SEz(T;R$MDCC9*6F4U%CCGKx{`Arwmi!h%2$3aF4ga|D3|00Km= zqm;J_I=921Ib{Opzk;3UNYv8Prgq*kOu|TFhq%dTH7uHSz{U}59Kkd~#0`PT>R4;r z*3qB6=(O->fBDloG%$^<-m+w9!-M}_oKl}V(7!?8r*DX#7%u# zqiRa;J8#t~r@W!xW`h%=JMerO17z636 z>Mb-fJc&3q&`AQ4jHsXxMuey+Q78!%N`#<5P)Z>xNCcroSP&p$2q6&!5-MaMt^Vc| zPeWE~7&-y0wP4542_uOu;-<%xlGq|?IJ|60S##{G0sLlSv?cqe2e#FWpP2z*0cQeKM=O$hoZYsudfZqvbY?RiHsquN31R{S z0>CNg*igOhM72^+CdV655EMRErtjZ%@l}86Iq1lP-m}kvi!p0H>ql3u3HDgW*t#yn z)(sXTTY<6dEliBY7#@kytXt?9ND{yq_^zwxbnKYQFtUpAP7eV{38;XeLZDCx5EUhQ z`T~@D6^gwAJ^dOzQ=dY)M{-|ZKNTkJ85`G@zCy6ewr-p}R9j}CAtu5EK^OvzHZ~P& zv|0v9lWAf^^R`XRg8}?z+r}m>+`HE&c+bRu=EMLn8`!d8f@lwkiS6ouM!Z2XVnZZ} zg!InY5u5{zwn$nAjYgtc4ab!+w-}&k-kf6x*RNUKSE+8n)c*Nu!QvU%V{eOMG!^U^ z^=1XFra|0vXw`w*q(;4(pjowO)HLd~1dUpPxMh*F99k`pjQY$u%^949O_Q+9JP83v zMUYBBDFGFD^A;5(!h-Z#6%nF>M4==R6@+I-Kv03VcSd^?Rj)d7Y^-%mlES^`(fP~X z`^AHcjk>1VWK1eFkTUTo1_RDGXzjddYd9n=qGp}>?Ju|ouQ_`GKKQD?;zM6O@R=Fl zbO;b5X+)SoAHa`qeOsYf6CCRVQYe6QZgVrcYP3V#vZz-yRmNighLdVfZ>5UU7AU}H@0rcd5CEg?Gc!Pt!ZA}W!(}(TI#qBn!3=VaL7hz@xpV7?oe3bJ zdJa5tR(}-sRpORy7`8oOBALjM3)zi_o|!!u`^Dj6v?Eq9p-V)oXiw-F^3s( zGX_Y(8W2ebDg9`PDDC6-s_6;lnFH5NW$#Km9BhYhfe8eO#59oT7@;ad$pDTmIw`?u z19cu|KzBaC$g^SR+Cs(-IW&>YlaNb@;PybeXpvLjKQB`Nk&PJuv}<(Jc}K$MQ>Gn| z$j(4JpIye)lw2u7sf`AlXgf>mCCs`G>9a1yW_B=TopzMlh^Axq!)1v$X<=+~8x#*> z-jo->B!r2|b{Jy-R_(+sBeLrzen!~LbaDsrokMPDIlX2NOL%&ue{6q$N8;E;CZA#w zaXtGW05mJzGXFnoKn@VMO;}oV$|Z`snBY<(k#9wosn*!G84wn5zQ5Mn^z?hY4@jTm z+FIb!=Tn-Mwc{J2UW1DA?tu3mx$H*`L^tI?Z91X>{FLJiu_yR&#Cwa5{Qs25|buw&r+a zojE^m|EX=`vJ8(D3BP!vJblLWa-a&W_FxFPjn3@1OY0pXv$fncA!a}d1?L=MU4hmH z1LeJN+<~vh{tHh=Pia~%2s5VciBpgLERGs~6PB<3Z#=sGT1+;!BMM6hgJMd2(`B1G zCAU+_^WY|py4pS^P4t{`%*u!2sbEo;eeC!O-<3yz@6H1}2KFo(&|%a3@0C;vsQnCX zzb};*4=WJ>mMS1Aq-4&K#Y{ajtx0_W5yE!VDZ{PF;$ZANesHv+rAR|EeqT*t+X5T3LfYMTmlO%4pjaGG=pN&O+S| zMsyICJZwfp6nV*ZkR4H2Zk*HWP9M^FIM;pe=}?3SQi=9Bog~@tlSH0yWISNUd4!S) z2{Tyhn4Pu649X_!Z6KweNkh-{b0j3?N1!?Da?|o37v?^|T#kh>!=~ zUj1WZoFtOH{yC1AWgdBTa-i*yI|7N!S>st4(B@EHIuvcKXb&N-H!g^JRGvOpLO^F|o(F{~cf1z(-Y(%2 zIFgPtZS5lWj)P}*sTax1NZK z6_m6>1a0l;kd}PHOh`-<{iOw1IQT+b^!>Ns%y%A!>;Lc@z)46U(~gGc42^aj)>#k{ zq*SO^8~DLbzkyTE+zXfe_>0(Q?kSKc!dQdOfFf;8L=g0#RG6NVh#>LU(5>X0>7I92 zMvR=HnWJ{8>B(MgHx#t9k|bmL)J0xB0T3t#$Z?KMba1{SBkYj6Ac$1ZzS*5McNWBv zI^7xl2jC4SeG?a5a4qI7nTpSU`*k?yBQM2Wci-$WAt6#mSUlU20dUL=DJ1Ik27YtZ z6?oHm$KaAHK7gZ+J_J50^Tlr|C9HAy{Y_Wm zSJz&Qr#9b%Lk>I!A9>$ZIPS1hA%wtWWgPXYfeYFhaCd@5I}DR}-Npw)A_}u`)@SBf zCeUFOoC6R*$*?2(Nyp3G<9-?g-uR-+ap6y2;E_lGBs!em4){nH@zV)p4N&L`gR?9& zjhHe%r0_yBo&*3`XAr0eFFxu`IO@QE#!bt9u>+An5<56z-;4V+ z3C)tn6uTmcdOXoX5arHbvK_{DV2IPJub;JAZdhnw&H4z9oLyZGouSK;XW z-+;HA@nI}kvZw#7wZ4fLz+aZ#fh&IXpLlfbAF#(>3-G~rei<)1;*A*SpOrI>h;pE@ zv$&r})|o>S?SV3bo#j|c(FO&&61G&xkY&~kcs+I6#Ib+2;SSn7GXwg2r)496ps>M= zI)J{6xw$lVG9pt{-(^4mEC8FosUyiD+3mnOQBNO9wHYxubs^4t`4@4*p>M)X_kIW0 z-E;-s@$sMIWk;WbH=KSh7A{w#>;o zN+}=20uVx2fUFPAkcVM;5u`%}DXmsXNdiCuxOz6X9A4QWjN3`Jz5^qCb~|^*zIf{^ zFUE<7zZKWtekrcH;hVT^*_Bv4=TQ9h;Tth9vw#nr_bI&mgnz}%X^XogUW)&DJ$jCa zb_hSa)S|$*!XWiIl;xzkx8|JaT|&mlg{a+%p9M9~;sg94+Tj$7E=07WD$^DFrbJ@^ zLQ$!dt3y|I$UePy+>!P0(_-UpMx@zo%7}%t55c)-eiyGe;a&LNl^?^hzg~;ePk$rM zKI@AZoH{QhssWMABf0`z++;^%uafT zm}kV@W7=tFoDd?X4~aCx$`Gbbsofz=aE_UX5EY^V5rI2805Ubrq^%3YdJcIOrP;7! z3u85w%sm`0I^th2cX0`?dBr&xoH`H2Bw%(BLOm_xeERpbr8PgSc0 zr0O1Mra4`5n1OlOrSlwXW4=3LzdM_x5RhpK9)&%1BGf4j>pN?qS?2+zgUudntxx-; z2)ca*x79vpBA$~1>~JuMgl~&63@NEyxqA+u1%Otofkva|%@lX~HqL!nXVFPW!Oo>E z8qYB9_MAM(Xmr*vmc4e9e5VZPTpWQk3T~I&IOlYyA8l6$JpKQBskgK1zm0pelY8Fa2xLiE_7`ioC6%Bo zLCq`xfE~cb6q;iJfOQh3~E(;W$QhLqV%s3Q#Pd=|I0WrxYP z{m9>^18IQ$_kEnuZjVWCWOEWE(V?pVV488gW)ddnI+4hoJf5?%E5TXT8qyPXR6fXP4Cm>~aQT~4j z8T^cv|JtYelpFKR-nQA^q8;*?1Gx4Y8y>s7AOR5*)4CvSmvGFs)m^mjC_2 z(^0QKOGy#{nstk!801$Rf4EeYqKzB0-dRD;S!bQi2;DJ5z%e_c8F7>AI;QmiP>6aM zP{Dw2}f>-}+^|?~^CtC%^tW>h&t5^x5olDZ)IH8OjJRrNZ`+E%^H7pTOB4 zd>L-N`!^^Si@t^+(BX_TEXQM8k?IE=u~JgC^q7X}`E;Wy!Dc{(G*b)iw{X1QFST{U2Bp$xAj>lInhY-&J4ZZj7hcNxrSt!yX_njL)g!;Jp z>g0s@X9!sigGg)J63+QGw8juyExB0>s5)t7qvpPS)G;$3zWJ(ED3zw#vY7_s>hL=q zrZ@@OOS8egIcv$%`Pj5>3_rg56ZqrpKfxLQ{9e5L#s7k0v6xoT9Au8|WKMYJqMt1{ zl~O`Vh0(F?xcc`$!f&ttE+*@nF=N&M=Jw7(5F$lqvj*f8OUN-Sh7vun7E~w%4Anr= zto=$BsaTuTUo3}n=9Ef)Pq`#XP}3FY=A^WVS=WpwKODw;-F)t+PY{>?$6a=^au67d zD0&VWaLq68#@+YbjHm~0*#mbHK=(E)!CB+m-L~3jIdJv)GM*R|wb6c2AMKOX;j*et zkZ4rRw>Phz_>>b<6#yuyxWBvrf&yf%dU@1}4!a3PSYXUuI2DH;y#%U%8!r3R`|!R` zy#jx_?YACb71F~U&UK0W4l!1WfcmOfv(>=QfBS8md;ZDz@$Wu|zCn!x4q1qqb9+$g zZ!gH$5tO1GmOruMdZXE>UGVV_!3igw!xi=B@QK4?YtEmn4FA5>sy(W8^ATfOH&|Ey z=t%v+7dk_~?U`8<{pFbs0M32Wr6?9kxb5l<&#nRQIsbJ0||h!8Pz&|T}y%N2P2E8mafjyef|-+GMNnIb?L7UiI1 zfFy}=Q$4R`fm%d zeLdXL!=wW9DnY&f`RQ}6x@e!*Lrw1o?)omw`!76^ozqYe$-Va8!*1HR38%h&0bY3Q z3wNrmJJoNat{I(=7_D2kO@LaNTG1co!8*pkG&FK`~JDG;YJ*A=mN}`-3J*m zWI%rTQa}g-0j2!91V(2Ucsn`+$aisrw<2F zz(N2Z3n47#FPee<4w;4Z{yQXJ7XL(^U#w+TVe)CAma7wwnA&` zNEq|A-|fw(op>-#J7IrRDn~F0ZP*45>`>~nSTg+}%$dFiuDo<;r*wYCH0J#OJQcSt zy8(MI+7HD-8A53M*B9=`8RyO=Ye51bw22vE%&s;S);TO$v?mtru~68!=z`E3;AH*& zYP?n%H!6h827}nA{zB3uKmd>TzJ`AaMa-k;?_UkDrOJvbK_zCGqG zS_LkU%CBS;J1kY&ktmtD%F}%AScAn1!`rH8H4Wx0=*Pr(4Xvs`-_#<6wCM`TZ0%Xc zGcvoL<}P`1$bR{h)*8e`L~=G@3Z`1Es%^t-Rwx;~xY`;XE(e1!PIGm#g`0n~>A8^Z zS&zRHO5FLeeB0%??zeX$Dg6~Lp5Mj_)1LKZ3X`Rw+)CR1vh9DUz34tQm3ct0m>)7j`{o*_J`~IhWHtD(n@@Liu zIJfs&uKV^1Yquf(mfpYqG4sR>4^bYXo%SD_(3%E{zF1W8SQ#SnDmYJ(pMhr_w6?cnyrMj9+v}s zdu(OaS81acCULxf94EpU$AU`~1yd2KUJyrMr@*WL4&ZD`C|1a`X_f#Kh!uzeND4s| zK!^~6B1joRsRATLkTQax2!sL%5r`rXhX99Qr{J7|(*o8guu~3BS#4X=*qQ+8$AU0? z%kc2J-wEmyM;vj2tJfdHjVmfR<&b~DPcOaYd866$zIE{}*FTIGzIX zSQwP#o{JW_&%XCsocNlB*mrOaEXMKhJS=J!VWPSbjxDB7St7QL zuB38tx;^Q*vuECT>rYp09eupF+#7IM2&owLAPW0Y2>PH@(RW6BY|`UFWWjJCB1Z&H zyY$mMK&0y#gdk*#yJbgdwG)G~a8AS67>TZPyTsKTCFNtdIGT-hjvvsZUMqUN&zJUgsK2R0ZCC1 zp(;?IN))ORML~%IRiHvtLaA6rp-@B=MF^t+Dj*2u;JAf2nMAcViqX-n*tBs2#Cmj8MC|07kNe(W+0 z$d2>B{7TH3GaqB46PPl!k3R6`%lVJXzB~Q)yRLm=<*NIqwHlV2bwf$)7i*C4n`{J; zL=Z`Yp@32fg<=s>f%~VH?+-#XDM(EbLKcM}_Bn-O9lIrsMy+IxL!y&>3*#g+3ui(IzkR{wpI^Sq=(EfJ zhs>8gdL6#`%d_!+-uDZ9``70J0KzDAK_s|XR#1u%MgltBpTQ)))uh#MXjVDhhMo}x z7Ol8pbwj>u`8}KOKmH7arD@<0ply@je?RlTrd)mfFK>SA$p;T4NGAjdAMPrTiYf^y zebf|20x}?k5s_d{65FZ|&KR&O?p=+s%~NpjOCnS^7ZAtIT}pglH~kwcsnS&bTbS2@EKBEdP1Bn0PBgumxA@4T2xe)}9)BAIuB z`>yAoU4F-Iqsea3fD8i2@b^|SPErX{fj|_c8z~hf3h7zuktp^kL`5&LA_dWe^hEsn z$Nmbf8IB9+EzII`PP&GcF4?yZLL&v*Sf&}V3R3hl5(o|k;nk!v?nz)7gBm@m5MkF0!SIyT4SR6 z+ViGBn--t;wncE%0#EU+9-Y~5?gPSQ2=9tbG}TKf6@A2H8% z>^2`zES69#^kHb|N%;0vvVw?h+QdlA;B5aOmu_urvpO*#IYJ;E*ITP%1OTH9KtU?v z*PgPEWOhzU)d~W|5RQXTLInaUkRG&{{iLudV|?5HV-I`rAPkF$qB07F9z=z*D@46$ z#^V&*;ct_`q_IY9cqHcj8M~GKyEhZ=Db7bweU05~;Tkbz8g3t6MgPu>i~DmseyDp`}_M6@#}p zXMfV)Gjmp{)C=okM?$bv3W5}@WzneDMI{*#QpBGh-n{vHhaI+`KtbF6j_*gSx_c9W z-KGIj5=JH-!%=)57S4Ey+p=XuY#)2#8;yGF)x*PEme(qpgc(o)&r$);PznPIt{}8d zwiw%Ze^OlW?nYeT-o65yW$q~~M%-$`I*lZ0V%4fgU92aBl;S24Brj?tTYeNL6SXib zik{Md>?ux@g|Jr=gt4x5j}xuaO{4tjB}?}cebXhMwDcWVH#C7;ezj${GGLd((VfRt zk9-#Q-SPlV*!Ln_bI+U5)Z1lTW81Xb3Xz(2VlkR}Tp{XTq+}==Zd0OL_f1xZZYqaM z$80m8n72X(f|FK)sZ-~pS{cEdh5fK@9HXNXsMa@O!Mwwz3}Rcbi!oxB&F?QSIIdWj zx>(6VaVGmk*5<(bg6N3tnEv$EiVjmlm zKuU#5Wh;L1&Bp-%AN|S+IN+dtu>8SW;MiEQQXoi>G#VR3kNlOA0hCa%=}ubL{Rw#g z8>O^z*aor(V1b*ij4|}&n%zkb0KoqRbb1&ct<2Ko0000bbVXQnWMOn=I%9HWVRU5x zGB7bQEigGPGBQ*!IXW{kIx{jYFgH3dFsPDZ%m4rYC3HntbYx+4WjbwdWNBu305UK! pF)c7TEipD!FgH3fH###mEigAaFfey&@l*f+002ovPDHLkV1iQC3p)S+ diff --git a/Adjust/test-unit/src/main/res/drawable-xxhdpi/ic_launcher.png b/Adjust/test-unit/src/main/res/drawable-xxhdpi/ic_launcher.png deleted file mode 100644 index 4df18946442ed763bd52cf3adca31617848656fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19388 zcmV)wK$O3UP)Px#AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;wH)0002_L%V+f000SaNLh0L02dMf02dMgXP?qi002pU zNkl|h&1u(8czNZ4@#f$#wV0)!Ag z0v`kdaZJA80Etb`em&5Y!E zUqa2Vr|;XhZ+9(EpYxohs)2tf|4`1N(7CR_lTdd#*A@G}sSVM&uD}@-3icHIEogT9 zb{>Rw-DkC7JJ-J|`dnAwG>h+a4T1&`?>~PbW?^0Atb+3d+gG~!HYm6UI6D8r#W>H6 zwno(1UHZ#kb`pT9jweMCgp$4I_j^Yl9Tqx59L1_@ipE2`9YIt*07QrZBrAJ*y<Z$tDT`3MX%djE2uvg_2DFw!uERrrpiu}Kng&7(Pi`f z%{4psj+%BfOWY=!RJ}WRO`2o z1*lMUb-KNH?&zVBdgsT!`NuFndHUV=K5Xy1^CUJ_i+==wl8z4RzOBnn0#H>3{Umz- zJ8!?|-doh)PR40G9!>P(O27BZe{#*QZ=5VJw-_$~=%T3#W&y^7A}+TCP6c*@eYkbX zEh#tuyAV{f0OeIzB7&}!V(yLqg{i5VYjyy87Tbm<1bYOzN_?=_Fp<^suwJ*73eyMxn(;qx~m)0aA@M^#l zYA-dSa!UZjq^Q&D$K91({r>LVgZ{2vbN!{I{$OFD*X#E>z4^IbZ`aD8x3X){UtZ~T z=NCHNI8iZ+#B9Y&C55I`YJ(>R(A&MQw>;c1o&RzDE8e~}87-YSxp^L`r1ToZlp9B7s?t=6zSdt7cTYYmXc19TWt(`$<{E}iO}u#@-KBz)6%` zL?%f`XV<^)z~5c{yk~##nJ=5XO6y1lb3OWrw_f$@Kla+2{^{Ieygb|}2tW=1y?zw! z+qcj;`sgqkZRK{fRm98Zsq=pBS6=+|7ro$V*Is(b1y5UET)J@3n_EfZ?tG-1N=WLa8FhMS||@e^yS2k(C1;k!O^!|k{I{%?K$P9Ce{EF3M&_w@WqQXD%xOpDx_ zvc8cBdU;mNecPL#f6bN8kH7Dcht}=p#t0AGInnR?{bRonCE#pgHvwb-40Zr`fE_^6 zX4KbPGJODxy@B308AS^}|9j8)(+jUuOLOz{h!fD?{`t}W{I-Ah#XnG*iuw6YL8545 zb6kj^`-bnh{F)#7!LRw+Yp%ZPWxJR5U#h4Fz(BB$9Gl3oCI*?XWWo>-6bLaibxEN^ zG3H34iv)8J5GFR`M^79(aMNvfe)K>5^7}q;+YPIC12DVy4)l1O7vo`}mUeX()=y^9 z$4`9wyN8p_3ywazE{7i2qWAyd+S@<={)4}(6m2ofNdQAQ31qPYK(rG9R1s1D0|3ha z_B`jsmp$)We|+ITt?cdaU~W#bEY-jK=DWW0k^9yUrxUw=`P1k2zU8;x@Vb{=_w3g% z&t0$w&@ecHq1x!q8tBa z^MQB#=X<^<>F9Bu*<%1g_2s$Swk|sjK)%kN2zLR@N3q&t3ZDNbKXUDlKJQiP^>Yh- z=?}Ve|D78T{_Zb4@N4h-tMB;EXFv6sFNoAGvN$T6@&zvFq>8afJv;?nTmWDm07Ec_ z#RwJ?Fmf1dVhfKV!#cQx58y{vz$Kh43<@a(hCe(c-d`DZV9 z>D7CF_IIB88xP;V#;Yecap1FC>JNV9(Dw{SoA;U=#{jGW7{RIA)AeJW)4|wjB_yX_ z3axZ{`uuDn3;*gjzv91LaE0uPlO8U(RLiTcdOh`V1yZ@kZs2yMNYOm5Mi-X>h+uFG zV?2Zu$6+uo8FvJNE(wV0(>w-PYml3q6?d`Fy+mb``QrG=`_r}6&H43{ zLpgkKNbmdo)wh4} zSO4XLU;e6>@8?SfD=Lu-ctR(XhQczQg%}rsv4$<&g%KVFK5BM1suuZ{64z>zJqk&)^&X3U8@H^{H{lSK2Fp| zk@F(}Jom}4L%5GGJIx9U!wHoWaBd;#4L1vZ){FP;`{O_Rz8}3{ZwDvjCPmVRp^;j` zRp{X=Sghd$K7t8Opo1kW;pymMHwfLTFu?2p#DGFX zDpoYfPhxp@f~P-s3Cf(G+;aWu^47-WWYW=bp4rfkv}2?Xu(SL?K+~_10O;@D*I!;= zP1SGy{;U7#+uriszqq%5MURowkRC;sc4Gz4LW12`!{=}Up9dkqA}+%sE=7VRxS+Uq z5B1<^RS(YL90RaOv4s?yurO5>1PW3LLxIDM2*4I#harf#dqv&sM{qFzp?XQ02cWB;a zH`EvOQThy4@HDL8D^OsB!}ugJjL^sVn8W$#VgU<|<+K`;Shj0v`oVgm+wHL?P#J~K*5QvpUwFiCYxMC!jq z009W3jLq!+r$ohkbt>Xdg!ZldLMHu23PT($du?q?@I#?*dlORS91PzNE1``y>U{O@I zl)I@5X&L0mF@i0vFwcoBZ2gHXm@TZeu-1TWdCW4bwGg%?x%O&I%5w!pX1ORtJ$#q? z_|JXkr+#p8B{3VT`6_@hoJqf}z0%uV0)>vl4uJmN^9H+)9Uk>QclZbX_?mssxC%(* z1RbE0xCaZk4D+}EW31yi?m~iP5Hu7z(C9+EzXmB%Y+{5pq}V`?F$$zG$YIOPATNQH zS9VtY55bW@!m!j*h^16x0u~AOfC!h;NdOSB5$-LROP=$R3!d>e?|k^L=a=G6o;Enq zwgeBby#drV*L%D6_Et_D9Y;6Z`(1B)*2UL8i=-nP^e7$29q3>e=5Zkm3{K!4D0HCE zg@r|g9t46MDRPXEVOUC)6butM2y1YJ=DGy77DF1~VG)S+rn>`A1)x*yDfOP7ytJ{F#eedN*Ztf}pZV<9Kzf|g zP#wb;V8IyR0w^Td#1UlJLX1TeNXy)N4TAy(DGVkhpRo;z0-%DB1aN9Q4#Q(CTuL1& zEiVrcZUV-Z-v$1miW>>Q%oT_h_sBK7_pWT+a>LOtM6puLVo>{rwq4n-0II_kgpSfQ zpQm>4uitvzYrp-QUi@QP7A%v|C-DGAIEDl(C15fPaRh`e1O$s5ga`tLK?aKy7N&%N zqkpwU*ZRx{ciyCycB-s`CK-P%ed!c^m#?j@|4UjHtffM4;UtDQ3Wf%uQ&Qax z6zl>I6WKx`1_lNhCde^CfdUp>ZtgrAP-0Vla^Km;cU+#!!VWwffTskAlQbSgD8C1+ z6)+PDW0B?~M7umaqHn<+lh&b90N)5}MhS+p26w2^0oPdyBg| zOPgz1{LUL+_tr~xUwR=EsT?_mIEt}Zbsl2s!hkU@P9o1z%*(Ton2V4VTbS@MfCyF$ zga9e+&V~K|GG3ddUxq$8!h2073+xh<@CE~CJCo!20?7s3<<#<26z7=|?#wy-e9 zI^T?Sdt)rDamP*J&as6%=C=A=Hg$NyZ)}~^G1f^HYb@sD%W>Yq3t%O8^%H@J#cQ7a zHpH|HVX8=V)d@seYmJwEgWm7VRzo=Abn9lL7p8!*X+U`v&04*^6BwCeNR3Sa%o zH(vJ2@s>%5s6ErQ90G6-&N9TVJ+n5dKloc7WY=kr&q9_VCXhvX+ zMNeHkeYNt5UQZu@ur8%V0EQMw!oO?j6iT1+`%sGceZ_g4>SF6a1<_a=KLEp7tD$cE zyK*s#qJRjMTUm9drIb<{&v;?-LjdCboF1T_Mzk%Y&~^e)MV_Nrb=Qt(`e*%L(y z*Pk=FL7wHvvI!>XCh~k#4w|=ufX&IHjf)8wL>iB5-GEVcq#Ed20yR}u8%V}F@R-6@ zD$AYE4K?OBwzUeYEwM6W!6|NiJ%rDXd81|jC&ynV_G zUViZlM@|a)sP8!k53qdzXQK7izTFW>!b)^J=ynz$!eCZ_wa({4j(xaA7+lUzT?Lfpd-<^@B;Yb~>$5kq#_AVlLoIQ{N&;Vr^0;Qz#e+viFD~N-M)O<()7KTy@<_Ejc zPXvWA5DS0^B#!$yKa_&7^D()5lL7>LFV?RH@QzMbbtfYpp{c^oi6q(%00II6y}6#o z&-=Nul~RFAT=_xqt5Pvo6a?0N2Xe6kp;k3e zTS6W*Wy+yQ02zi;0k~wBv6W+$BL!0z#RBYCE+|qM2M4~y+&hh zx5%hKlLwtMHMXq)q$3rZobj@6IR7~;1~3J&wXl+wGk7exS7#YuAYB>QEWg_p@;yM0uTm~0*C`CziYzj!y08*7?Uy}dO>+E7|rESIm z;3~2YhzN;T?7KL5?(Lt!^;)aAT*%@7Y5;{uP;p1a06GiH$rYv$5M@w`N-iTVc2)ku z0l|TXLvmX7VGH^L(TkOAkqUc|Rv@ecm+JMnOrWMR+&RABdzwG#9l(>u;qL zDIy{f5oW1pL%PkUhA>*q{&EAT0fJ!PemZ=&acf_lHyK%Z%2mrtAO*07KtserNFY>$ z#!Dfm#<-MDts1chTN^N?G%7`uv(lvcT{xH(j>7m<%e?ohtupJq^(1Hji9^ohe*-Te zQSmH6kXJ1Z6Ar8j5E2oSEH3osN0ae!)XVgt+(*kR{bbj!x#ZZ9Ew#Bdso31yd`!Fd z&&k@!Nw%??=5Q;3gxQW~1fsJAP?$YftvMLSI^Ml^E}k27G=!8m2_Tb6W=?FpaxTr z3Rsl~9HHuRr|}Gl#2iSgN~fU#uBIyVjS-NjQeQe5D@^G2BZ%Z!+SQrgcmRTW>AYla zp_3$0)LUI0nYGpN+}FJ3+NZqYYo2!DVt=u}F&<7n`k{Ls{?G?L^AHhXu%HJJH5qLc z6Vy|O{8*e8h|UH;jr0ouajzeDckP<%J@W9H96q!ms28dvxP+(_K(c$^oKDBZWVn_2 z)wonCBRC&xBSjBUvc^TGh*`*ig{nEBrTB4vA#!TVapC{@4#*cID!$yB*8}1x7fE0t#>X@n>Um^335~cdUK*H-6%?zkTx!58gdk zh`XcBVzV3geVF_B-G8n(JPC;j5N+B~OhKT4DgE zh=yxx=DyE<{?PS5^#kwxi^Go`Jv_hIQJd@8u&j98>BNg!RxJF`PrdOcE`Ij$Z(Z0^ z2y;eJq@c6{DKAAz$wFS*1fSc-Q4{N`>Mg5Z{5f8;p$V2ICkmuT03ez1+0hw4)!AEK z^_~T8N|2up&9(oB4Nw$>B4bQO1|kKram;t!#Q*jB_kZyZv{oZ)Ih|kZBwHJqyyF8u z@WWsK>Z|`HV_hr?um}@~PU2pSv4Mh(6q!-hD2z6QZv5cZ@BY8v|CwK#Ta0$zvn>)4%*@-}{=czv3sf&SQfDIdWJqPq2mKe1Meckg^L> zq$_gsM>gO7FTd%3{>O#o4sWhy!}8iat<@e8USaNCdg+ym&-v;%?0VJW9(!Tj0R{^| zZ=lib#fTG)IF6unZHf^As)}(T@c9Jbn$hejS{+D(rguOZ0oj=V0&3udJcyg*x*g25 zMo{F8G-ae?gLKT8Yysn;!TM2k&lhf5{qV#0uiZ+-2LW0ak&RwIQIm1bfAaAk`1db( z${_&QqiByt#P)FMj{${-6GQ zRE)RGI?iByqB8|hwc`59?*8)XiE;AT`+w$bmtER<*;rC*P*6hiY7XZiLKnwyKORj# zk32OPjYd3~j79Ohe&j%M;D=xP;cx5DaXKEF34mBfYS|iIdd2H5ef9HRcEOuC8=Rl5 zt-$6HAPh@GSlWU_Bj`?s-n?LbF+q0_q0?1}6GD^#Q3Q|@DCPDJP_<)-9;@{&M1}sJ zT9t($sR38>8mbppV3#$(7BB@+i=7QFeVUizBX{&Hf#*VfMed7nRUwp?~@A|_iQbS{S3yu>#ZYgxS94I8s@xoGP zuzF%l@4fANe|g`f(aR3Uxg+v(|fwvZyX{BM8zWncf2mp}JM4t^o#!}n&A78|s&wuU?J{v7fQC^Gl7 z7KO{jQJN4%geX=>x)C}(jc#9|Kd+EvizdE1rq@{tEUiUqqz%vi-Xs{QvIy;ypio?_GyJ*6T-u@u;wuUaNli@S#U! zW%q*KqyqWm5k!%OQW4lPilRW4WyrG}X=;$A1+vs&GB$cL6yE<7`WFEHyf>$KYn>;7 z1PY&>Ck#LyM4E__&GoGNb#J=rIp3No@}XR zl2%fw4txeeOc-$Uyr9ZiAWExJ3Nn<^u5U^+(&b45Ac2m6G>dS{7e9!>0%2uuLKk0h zAz(J`rPtzT?!7CziN(gdckf%=+T6GxSu>VsqO(-c=@ig91`(C2(V!>{ilRV~7sxY< zB4cDJA)9C!Zf)+q;Nsm^9yxsCwh|BRJeMa2K)penjEA|r{PpL*;o!l$F-cc7mDW6w zqenyr1Pu`aTR~A+~ok>jYO^)BDEj--}O9Mn(T6ue|sv$BrF^S-DZ2 zKYuk|_lh^-(91p!lUt0oa%`N;apK4j#~z*F=%F!=KRUtj!zngS=Ga=d7;OTRQI0$n z*sNSj%&Qg#zO0MC3t&ZH1yCB$0z?rZ?hra1Mt_dbo70$Iim|k-gT-A5<`*N(FUJ_n zN9gt=DD8Mqk*BzFu$S(+ZGAC`l6}UEC-aNl<>A%@(MbTJk&Z0lB!||jjsuERS(2tO zC<;cNS)>z-@g}gf#t_&AYY?uu|G3K;tFS22F@QLtrHdXt_#jAus;3zmZn-~Q`ZcJU zwP13KJTEXA8x%RPxt`+WiR?T818b06a`}0et({oMaC8_OOUEJH1z@1GLDK2s@=LD7 zGp_0(qg6l^5EwU51}IWsJW4SdW*84MOoj%dVUFQehS64rt*s1`VS#jFkfmIymprv7 za=(gLU=bNdh`od&I4J@Es#JARtPm#(QRMbsRd%`>oqmK~U!ymOkaRRUJ&j)9t5A(7 zcIwmmNr~3Y5J^*uY+{h73|j!;4tjl!&Gjwh#TdKx4K6r*XnasdG+-+*1*pgwN-2m~ zC|w7ft6;7b7~}ehErG29M7!)qHv>3)*T<6vpbAJLr4!5cR65o$CarR8h}=?e|%7+Px(ZQ>Y?xxrHrl+w^D zLKG#4q8LfsLpNE(+};H7`7vT0Bhejb9YK+*Cj0n*PDs=<;j7#mpj-wfgB1f7H=o{c z2Fp3P%zyTAF(Psa^yO3@V{8QoYo(krWKa|qMPaHbMR{sVHC(60I&P)FrUNiw4Wr0Y zWLbtRwO|H1-Dm~Cqfw-~PMwzhT&<8s4hoe87)W6WLNc|I3L^)=X@KZVRTzo$)M*Hj zh|{;!KC6uDK)f~L=aUEdzi!<8+i%o(XzgTVA>#tp0Hh4GBItl@qrI|(KL9I&vqYD0Zd!>|kPW6gPBRXS^!=2|A3g+3r} zzE|riT2$aF%5@csj8Ww7{32uIDT6I309r>X3DZPE@3zkw_u-RSaX#;xGKJWBO753O z0#!f)6oq~f3cYjH0F;NS*iq?Z^G^gr1Ec{VVIpCI6{o8q3Zwv~7)mQBWudf!RyEmm z#1~LXRgOfT|D!4Zc?rV~TvA8*oB7aE*V{+$%Te*kUR4|nfr^+)<3QuMC-hZXhtHKR z=Z{rRL~q>{1U3=C1hEVjTP|2dCpKl0YcWWSOZwNC)2t4eN2hLL?CNn;H?(aAfhr| zwd5;x;57hC%OtNHLbJjcje!U~&_Nt4a2P_+h<{a5p|SX8ur?6;6c#Eb5}I1B zJ=Zd=DQcvMln?8ytjb2aygN)PMZtm9`J~0d>PRIZzTzxmE3OkFjRGOm_@a&}21WZ& zX;Fw}12DO#6OeN1fy*KG^ALo}m3_SGp>oY1@^UzcRX~ELEO-v6RX1rKtWuI^3`iq? z$nV>dsRBXSS5g*aEQ==EuI|Lpx_)LRZ zXRN|X$w6#U=qk&&eyTmnsZs|BdJdI-E}N@dJk^S@2wMeK?g{lRS1zL&ssx5xWy60T z0L4o;@{+5Tc2#t9mei@;%~KuUNb#T<9_e6^+dy)9Cpb6QDli4N^^0Fsp!AwIh@<&7 zDFxL?{15NpheF6ny(uu&DvVj|<97T!Q2_E)p?YzzI*}_7Jp$EuIuJ;SVBl0Kf!Gw* zFay>lK@q`q0EnQtw3WQt5+{-TeVuCZ63BzPM7mc4b)*zQjRKHO1FO;f9DMBu-%6E( z6sqe`D$6Xgizcw@-wAx)v;@EPI+@vt9UZBtQIFu7VVi=y$A*NgbG92f0$&~gRZGHI z7){~g+`&hoN>qhu4K1&&5J9za4IP(|;DKVN))XjkbqUJp7G*C6mQKPzhHdE6Ab)B@x=pLCTG~+E zNhPQn^ro&l8i{1oXj`?LBGUe{p=liMy}Ae_O+z9Dk$SK+c~6+V0hVj@IqN#-`|V-Mprckwnn>Dl0>Qj#bbddtW=01 z)ao;=O!L9Q^x#&yyD3$|z9&UxJ~UDLI`!loN<8gtVy&8xXKW0w9*es z5R+-EHs2_Klp=x!Y{3>11!S|u3`43@iS#npC(xkO?)Bhi(neo9_a|h@GwK^23nkB# zs%xDe8lkfi*rx8`8{0exE+vpwq^B|gLg{`Au!n&5&-(wrBGXKR32fpq*YkKkVVfBGBcfWZMB5v4J7=3>gLn^ z*QkHkPhnkx8#?fnff@ycDa&{II#ZGo%|2oyXUu_47eJvV5&&ck7jEiF^OR|Q+x$E9 z>xnph4gf`N43$$^+G4)hJ?GyotKrD+rh5PYKmNQA`X!fHB6Ez8F z=qhhMShXiMJinZEQH8PUaSw@f(6L@e1@WwqIEKk!66n@2alYB1{>ZetkW>Bb8`*gB zn;>X_Gn5Ga@33>4&g1}O^?b6aYLa-rYJHDZ-%dFyTlMw$KNl)Y0KhGPO;s%$BELdV z-54Mk;IiXb039jiuIJ475Ph{}681#c3GF94s7LGmvv}C4q-R6PRDh6X9opatpM2j0 zZeAw@LUn2o>#BHFL(_ULNv@9oXiX8dAL+0u;ZqFMk{WgU+`0~I0~K~!Qs`{_KmY(! zNZ}Vcs3mW0K{XUao2QhY6;+aljAcfUM^p(NFWG7fzPgqV+E$YX;UjCaD_s-&;G6cN z->7yt;(=VLIEueU^Si0bg_3v*%r$tc2dtE`u5D7czpArPbGB@YTQwf2#*sobvBVtAzKR#R+Ce zvMFxDEjR@veinF|Kxwk8@L_13*eH!*oElDdfZ0U}b?N#DFIB6@n)mtagIVYhcmSOl zi9YMO@oY;DR62pHRkh@?Ya~^7l}|YN>(x=osZ}qejDOWXoxW~^CjsqYlg6me7^t?2 zdrThGJhy?#5M+%A{|qUGdf=sXeCki(H5sm;AI7~kR}?RM9L-SBZWyR?C)c1S`g0+(hy3pW~iO0zu#ZVSO8 zQcfLc_srufXS2|_<3N@zh2})nl7KW<0mEq`;FVYv$`Gl-pKYK`0k0w90-YZYR9KxE z&XJ}DXvz2LI!#p6q%`mW&C*Ma-_96SG(mG}H6no_QJwT?uWZ*OU}OQvoS(uo>SWmcWQHu%J8 zN})53#`_ON&IOSQdab3hS~}Q!f17z*0V3buT?8-ewZ&h9+nMs{wSc+oT1eGEYZl47k5$4Pu1)xboW)NQIKOO~PkVfS_)r zVKQrhsmBeXv$4Vi0E*0*+UoMpi5q10?|cXw77)ZnHN6#9t%DL0Psd*>e%Tm%K@eRn zuUn^W)bgZ07W&?*-=C_Htvb&39o6@4fTtmSLbWOt>!1oqp=1qi86?EPcafWw0i~eB zNhOVdc8eD^)oh~;ej$Y~Gl?$mR~Tyu%>k=2|ETp;1f3d^PXLI@^vohRE=j-9BVmJU z-_a~7)cOhy+2b9E;q|Eb-OQHCV;pNsuId9-Dz?t^X`gdy?o?HIT5VPn8c0Ef-Po3{ zjl{j+e$`M2AbfVO(L5UtBmj`5rXW(a>TMIaHka||1lOYKztSV^vztyCGN=zs4P?(rA&BCLPMZYh3V@Azyq2_K^f(%dQ>YFHGVf6bpb!D@fJMHXZ5z9 zv$4Vi1mu~u&XL%1@Xi8E_(#ht?5(h(Fx(LT{&~ZD&O`!LH&cp`XU5d4!pn3&w#0f( zjP)HxryA+@ghB*>X{n#K3I^b&=mbBk9+2vpk*U6zImj|=G^=Y909z%?&};#~Qm>mF z*2mw>k3p%Ti{S9AaemBlR?&E+71A`fp$$JpPTM>pRAJ4U5&#srwP8Y7WuAv8PpQFr zK?nb&lb=u3N(U91Q32oUG`nJcP(vTo%qP1=mS+Mothh{rsr>^98d3SUyn^ztMVQey z%}|CkfLTku%8__R1R6L?4x|)GmKJtuFdoahS|cB`ds|#I-dk=#Cs4_CDpD%$QLFTQ z`I0$5MpF`}&Gm7LN>(Sg2IDb$V=60hMw=T}8n?jMQ1fjf-q3H>|5Ak{nu4vZQ(F&$ z>r?XeC}s@8<1S|;BFU6lq_Li3~UW#ve;6os8RQ(H>u5x$KFfO{u~ zs!tM7ouSz75#M_au@-c6ICq{}bqu8}!u!>it}fRCOL*A*Os3Rg%B|ao@1Lec5G;Gt><2Ve ze^>`^)q4rleq0`JIjeLIMTE&XH;&FyBZ}Ib0^FS4*#t#Jb_f8hu`-pQ)@t5N-XOub z!KFiIWnF{WKR#8Qt0@FzCYYKksJgUq6XAFASax(}oDdOtWm93L6+n^|g(Xn^a=@CcwmP=ywdFw2h)5L+v+UR9m>$GRfCtuA zm{8yL-Asd_<~OrJG~xRU`)XtmSOo zO;bvwrE=c?SwL#J7 zl$Nw_XoLEE;qpyA=Y#{fakc>2>glZ-@8eT$&y`hGPNzM^s1~_#Z__Kk5B)(7Y_0pW zF45?0ZVqJCZxR5r%}dZ!Pu1S%^t8vQHFhBns?=F%!-|U9~M1gjwU=rpH zg(5lpjenZLfp4@vcrs`Dr%u&Vfs|-SqVV@KdV2b0ENIcDJK;$ zivh#{FeFse+@`#hUn#bdK+Wk*zMj4hY=JG;t>H3MkH4Jh@-B|Vxm17xLV2Zs!%8YwFn(wVRRrW#+KWPBZtI~QPX8byU?v%&2MX`Va^Hp`BOc@Dtbf5+y>#B@;PR@iX;+G<;Nx`YdEmy2r~L7rKRhX(m5 z*}DI(V|R9v!~!s#WFT61pi~SO?wL~PGdW+V0vcO`yR=S1>!jAL+L8u9Wh1xOFKSDj zPK~Vpb3oU?v8T3)5(0c>KhJx2s>vMzJm?Ju}z2Od{Hch;}2QUC`JC zO)CH|gY$XhlP<FE#*(J1)<0Zqb)*_C3ZZ@_3EMM_bkR+BAo<466p>P zy31h7L8Kdo0?!ys+aTF(y)ymDbz2Ar(@DyW&f$A6qbup7O2iXLu& z9&Q2h;noC19Rv3!8>^J!Pki*YzlDA(p7z4w&vug`_V2lZRRk~!VzDqq0g)WJNyTPE zkciR|+gm<7{P6>~AG(8xh9cr$cX`@8NI%{aTV3h9Ua^Hrv$5iI;r8Wy`Wr@DDbIJV z6mXxi5il7u(ve_16ih~h$xtI3CSr@2N5i4sJkovlXFl=3A1bYE6l-e=tH1u6ulwe1 zcRpekGCTsv)T`0MN9*eplJH$$;oo(2AFC;k=hzI%;ISsthu!&YebxTHMRh`}t^DlY zpTWkx1|c11$S2Xshwk3^-#SvMH9XW>@k95YIQYoj@}ZUevWugQOQIyw-OhkI$$%oA zkcg1s38m@K9DZ=~1MmLb2Y>d_hfm%^pbZh(05C@VzSPqyXC;9Eu!^vAe_vr`zLPx5w zh9`=s2SAIkQ7Y>C+0M1kv5a;30V1jltyyaWIXw80qK3=A+6M<3nUO)N$t>_Rq)7mR z5Ij>>RZC3~WO_c0G_N=9Z<3-M>=eMrS{^B-`l~0`%sYPTj!TAi~)< zCPSn)t>qEi6QC7Q7eL0AGab`3%PB>XlQi|T8B$He_(2b)QiC`(_|FufngWMB&hJj; zYx0PvveQBfwH>9ONumWIr}Ko@z)7OKJf0T09Ro;+5G$o3rAd{(Bes@{bZq_kdHLJ$ zHQ%Q#eSouH-X#PP11R#$rbN_>6Ws%)leLZUNnUj+K9MF)IyyInOiaNkAZghc0g#9w z2asi{SsQd|pUatXZ#-61r)so^Jsb#6hU+1le!|-(H4rRRITI<8kUq z^TK#pE!tc>%t!CTx%VV2LTu<5+~mR#L|pDO09pjvT2|IJl18`$OSqkp_c<(QJ2TZk zRNe%%aJ*=eXC^AIuK|!)NMVKDOBWGt`y^fGvCJ;ek-~V{7ww3^#5aKjU&HR@h?!$~VM=BZqq`(qPL_i_p;f zN!D_tBbq;XWW4_D7hLv+wAkXp43$U@ke`uCe)eId%7S_04eW%+rpv6E8mF4Q5wvjT zblGy(5@9nuRSoB1!@KQNP3dB)-z8=ZU<$!xT!=7bpM2lyuc{;;StFaM`AcYi`*8@j z@SHPV%4JqL>lMmcl?fYQ(0mGJofj78VU6STz!x95_sGK=H+Pqk=NFlVC25C^$AtZME$5TG#|lZ=3L_`HwKe8g`D> zoROsl>6nGZsA9bE7r8yS9+4iGk~}28;r>+lj!y_^!tz8)pmrq%vqk5r#3lhy##luP z{gX$=4_@=!i@$L^9$8~k#cWZ}4Xe3L6(*qIGd#%-u|l(JIo0L0t>4U&XeGJLGVvR( zpR%3}^S-v~d`@)r>Ps%8<3>>Aj4WkjsYQ{yKvxnEM(_W_M}JNy#n2SI4rfJ$&cAa~ zo(urB%j0GE9vMn26&*XeI@-T)-(+Qf?}ek$mKCsaZ~P+&tMc8U?y61&xWB7Z2@iy_ z2GWpBUZylT4Sfl9Hxj4lk(*N(BmmhlU;<8PTcwYXYRZA>Ze_?yE7+O zk4BpoP!2>wAS6)Kae+ft<$#o%Ex}Z7Tv~HADGdfyYQ9-T@Wlbp4Zf=WM)_JZ|K3;k zGCdXiUYFVXgg62ZNw#YLoDs)HLmumW2rz1XS}bRqD{0WbG{&>^b6j%WzGznP=ze&7fq?*1e( zAaPlr7$h---DgPT>cvqN9cM!&pj_14XO}B&rQ1*ReV@Z`eB`eV{O>4IBWrjSzz9v} z-#gi#GPAjyzlb~_S|>jWxKA+&1R>_En6cng(Yx=SkIMPABqwvByIo^ zLm>i@OKSi$2o7Kn_cuzZ0ns362Ld<`1W^Q(*8yS>#ZK}efl>*G{1&@o6oab!M^zmN zC74+|5S9RCt4gp%AkrW(3l$P4qQrELeDr^<{_D?u^1)9;ks2BYo*|qi>s8k|1y6g> zwnOpyL<2|w^Z?Aov0i53#Ypv5UjJRs`u_R7Td&T{h7tx8MM#nX<_5bl-(Nw}>4HeW zV!%>>#X!VD;5N@W!zfhf3h+d{3f7XU_oW+wyeomc#3)sqx89^qyKSbiFs$W9wkESd zVN$l7lF|iPLz4&Z$p7?xfAYmYixZl##hSIejv72|@9{Ywun2BKJFak+<;Jp(K(5mY>eQ4?(DM}SO$5JOW3TK5p^E~2P|SSQd?1g#?>r9~-4 zq4ZJ8gT)_HwWHhT8bcuBBpQn?rCbgx87xv1oFXeG7;X-+zBa__u`xDI7LtxEJ$hep z!$bESzrEAdn|a13^3?hiix4S0U->0>E09 z+T#G$P^&A?bfBwYdW#kVEBj>X*3}YijW%hfEHlL-3YVh*a<~C%@imdWk8nGHR_I-HWlp;NjAiJxEU~R*$5~f7;^P(2J z72b@QANR5V=#{f!=b_SFf~F3Jjl8 z>>iEoQEU_6IQlwMm70IIpSz#?ICq7Mi*3o-6eTaa2v;Y6ef`3mXcw>iSN_$v!i^>f zpsL?kbuwTpFt$?&$6s}AR8^@REY7xyEjUJeWtOz*|9vDNm z{Q$c-it&%!+zf)bdF(mga=(rojI1Laa`FW#c+i}JYL*#Ue{rRrebA#AmU`w7V_HUW zeN>Mmf5X;i!NG94^)@UjPES^zExk#!0ZYx-;YH%7j02=FcDe`QHtgIl4D$Y#%u_H( zAc>@N*eRvOD8V?Hyi5u}sXQFi>QK5ifxthsc4^6ajU)dF;ksgC;iB?Quh$up+Yyip zvuC*TR7`x>O6*y)e?q?H&Qo7!V0h>dZuHT)(GWmY=rKc~6m%|Q#{B5Hs(LS}Gg$2z z17e`{N@^vMHeWk%Zs+mQ@N9HG^zwO8b_?6Yl#f_}iGx5?j&pGK$%dO`e#Fcdb;^P_Jy7SJK2jiU!knKJEj{j^=?{gvP|zIJvmGaJ0LZxHyP_fX1pA@O9_3lbg=%Mk^K zW*p@fimf@VROqZ(D_=gb4Id%i6Fg;-h)7T6mU1_)&D2B7&D9VNZopQ2NCT5QwHT;v z(|G4<%4!!2@%?=y=P}Wm000|`nxU4M`&!TBn=dk|<5;I9j~_J0C(jyyo5qQ=?kDFY z?R9vtJv!p~7U`|c3OyEFmML*0LCpx0P_3e}2%+5UZSy-AdCMLrXP}LDDyha>85a4R%Z4u&ADo&S|{Y(7wNXbcJw`pQjTlrHaca&@UB^Bs`VjrX{C|5*}BN9Jp zZAZA}kbQq7nJE-~e?5wKtYlFGu(OrxJ#VExD94{4ul(-kqD`uCg?LX(>cN6}#}i(0 z^aZ_4UgZ_v(nsVErq|eaTwqyN^<*4ZItNalbe>-g*ib~oT$G;R@oHaeKc*bBZ)ea} zYW}yA{RL*1?S>FbkSlfQU{e~ipSzPZRf6#r5QQdj6ghheMs(`d4dn+EaarHhjxqaf zgTK#U`KZ!o<{xeyk1?^-5sn!T8EV{d*Cf}6>wMLch)9nG5@2#ok2Iw;3&#?;-$`a+ zS57={KkD>xZ%Gj?X2eFvXQEL@&RbxuI4exUv~R+`pG^&mZO*qT z)>9F+qV z?dP36KYkDx;wZ@4QXZn9Y+aL}Nwh*& z+(Z2&YR!csV*&aP*q?uWdZ=g>YvAI>hetp3$+>swRcesoi$dOwviQ?`FAo%}*Yjg7 z6PNUZr-W|nXHsi#n!jEzU&>Srh!{S++~lu!Qvbc|8ntLF1s3-}A=U4b^xY$P6}FPH z|A;e=k<0Jg)n^q2ixV*sz&$GbsjwXnc!Vg8`4o08Fu!S3%$ue7d@8Li*L67)wE7db zd~GOpeQ)-aAFZid2BtVSPZT&IqJedXbwIyhtPW$(Bv9p8Z4#r1$7pi$uM$X?rVJQM zV_oa1LfxV<`^LlT5BP@NNd<#Dy9Q>i|J>q5s_Z;evts}~i4tr?65cmC?;$c?u}>QAdT zGBl2LncX;1kXfE^TF_4+azantNH~Mna^QB74AjNb*g7ro>E7xVJnVPjZT%8);ytsc zA>M5jp<;l$&|IhEu~69d=3sAnXhC0oQ_z;+<+RBg+Dn%GQaQs}xXSuSlD|yW8$I_4 zKGWOpecVh3KXvcc8AQCKXPY;s%}G_}UiKv6=zJqiK*q`dLxe~q&Iw1*^@FEB-YAN% z#%(08A%}IcAuTTyxnQqMv4LU>Ix&M7aTDfYh0*a#y1y5MrT4nW3|7AvG3|{#op5JB zZI&qN>r<4>f!N;berv<2ms@HsBoR_^iGPn@fxq7P^G8not6xh=Ye_t&x%!FL9>GS> zr@MC_UbJZb<3X42quWNGPSke#Ud{_<9+s`?1JLBvPKmrU`#Y>;-|WyIGzYzl z;bzz6w(l5Tms|MrlW3O)Q&#VcK^Fqn(D{_wZ&wHb#@$ zCbd+T$M~v5g4Xbf?>C!;f?T)T9V(l@?3&GAu71)SY}jfbs~m7x9)s>yDpS^6YMoyv zXoY=t*$C?!neh<+TJvI2HBycBQ9gCPk^Pixp?98{Pw@sOP}kfO$DZ<2#eX`eH-s&< z7qqCaL#PJo-Zexx~6xkH{GZw zCc!5lphQbH2*&madGEpUZ|CTwUK>rjR96lPv&e-DaW<|`ZT@urL0eCP-AWd80b26& zcAyI%rM_P2Msh+;9WHW$A)Z|y|6q_iYn(pql!xBlIKSIcYd?`+))d(>R4u{5w9Y;4 z&Bt2fIA@#Y2*7aTLFjCb4jC7^TU4m2} zv>h1UNRQ)v7kg>x-1p5lBi+X@nfG(4jPESBs~Apa(7&aNT%}Bkyik2o34dHIUH{YL z**g{8V;Hxi7PUs+j-F~we5@_#o5rAEz21K|$-6koV00aV*BgQynhM)C;qCV0UO0|P;7pn4D+rcyuzmRw(k`H+26EglR%2C_dcS5K7~}*L_rV_*p^v<@IGuq07)S5&#aC>Abr0Kbg?0k fedym91iL@%p^iY2K86jjF~HQs0{hVDO4NS<0ONux diff --git a/Adjust/test-unit/src/main/res/layout/activity_unit_test.xml b/Adjust/test-unit/src/main/res/layout/activity_unit_test.xml deleted file mode 100644 index b4e91d10a..000000000 --- a/Adjust/test-unit/src/main/res/layout/activity_unit_test.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/Adjust/test-unit/src/main/res/menu/menu_unit_test.xml b/Adjust/test-unit/src/main/res/menu/menu_unit_test.xml deleted file mode 100644 index e2e0db43e..000000000 --- a/Adjust/test-unit/src/main/res/menu/menu_unit_test.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - diff --git a/Adjust/test-unit/src/main/res/values-w820dp/dimens.xml b/Adjust/test-unit/src/main/res/values-w820dp/dimens.xml deleted file mode 100644 index 63fc81644..000000000 --- a/Adjust/test-unit/src/main/res/values-w820dp/dimens.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - 64dp - diff --git a/Adjust/test-unit/src/main/res/values/dimens.xml b/Adjust/test-unit/src/main/res/values/dimens.xml deleted file mode 100644 index 47c822467..000000000 --- a/Adjust/test-unit/src/main/res/values/dimens.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - 16dp - 16dp - diff --git a/Adjust/test-unit/src/main/res/values/strings.xml b/Adjust/test-unit/src/main/res/values/strings.xml deleted file mode 100644 index 5ac683268..000000000 --- a/Adjust/test-unit/src/main/res/values/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - Test - Hello world! - Settings - - From 5ecfd40499def392d4ad48a6821788d694912214 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 22 May 2024 14:51:10 +0200 Subject: [PATCH 143/540] refac:remove test-kotlin module --- Adjust/settings.gradle | 2 +- Adjust/test-kotlin/.gitignore | 1 - Adjust/test-kotlin/build.gradle | 30 ---- Adjust/test-kotlin/proguard-rules.pro | 21 --- .../sdk/test/ExampleInstrumentedTest.kt | 24 --- .../test-kotlin/src/main/AndroidManifest.xml | 21 --- .../java/com/adjust/sdk/test/MainActivity.kt | 11 -- .../drawable-v24/ic_launcher_foreground.xml | 34 ---- .../res/drawable/ic_launcher_background.xml | 170 ------------------ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 - .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 2963 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 4905 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2060 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 2783 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4490 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 6895 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 6387 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 10413 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 9128 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 15132 -> 0 bytes .../src/main/res/values/colors.xml | 6 - .../src/main/res/values/strings.xml | 3 - .../src/main/res/values/styles.xml | 8 - .../java/com/adjust/sdk/test/SchedulerTest.kt | 105 ----------- 25 files changed, 1 insertion(+), 445 deletions(-) delete mode 100644 Adjust/test-kotlin/.gitignore delete mode 100644 Adjust/test-kotlin/build.gradle delete mode 100644 Adjust/test-kotlin/proguard-rules.pro delete mode 100644 Adjust/test-kotlin/src/androidTest/java/com/adjust/sdk/test/ExampleInstrumentedTest.kt delete mode 100644 Adjust/test-kotlin/src/main/AndroidManifest.xml delete mode 100644 Adjust/test-kotlin/src/main/java/com/adjust/sdk/test/MainActivity.kt delete mode 100644 Adjust/test-kotlin/src/main/res/drawable-v24/ic_launcher_foreground.xml delete mode 100644 Adjust/test-kotlin/src/main/res/drawable/ic_launcher_background.xml delete mode 100644 Adjust/test-kotlin/src/main/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 Adjust/test-kotlin/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 Adjust/test-kotlin/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 Adjust/test-kotlin/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 Adjust/test-kotlin/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 Adjust/test-kotlin/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 Adjust/test-kotlin/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 Adjust/test-kotlin/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 Adjust/test-kotlin/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 Adjust/test-kotlin/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 Adjust/test-kotlin/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 Adjust/test-kotlin/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 Adjust/test-kotlin/src/main/res/values/colors.xml delete mode 100644 Adjust/test-kotlin/src/main/res/values/strings.xml delete mode 100644 Adjust/test-kotlin/src/main/res/values/styles.xml delete mode 100644 Adjust/test-kotlin/src/test/java/com/adjust/sdk/test/SchedulerTest.kt diff --git a/Adjust/settings.gradle b/Adjust/settings.gradle index 9c17cf0b7..e72702e56 100644 --- a/Adjust/settings.gradle +++ b/Adjust/settings.gradle @@ -1,3 +1,3 @@ include ':sdk-core', ':sdk-plugin-webbridge', ':sdk-plugin-oaid', ':sdk-plugin-sociomantic', ':sdk-plugin-trademob', ':sdk-plugin-imei', ':sdk-plugin-criteo', ':sdk-plugin-xiaomi-referrer', ':sdk-plugin-samsung-referrer', ':sdk-plugin-vivo-referrer', ':sdk-plugin-samsung-clouddev', ':sdk-plugin-huawei-referrer', ':sdk-plugin-meta-referrer' -include ':test-options', ':test-library', ':test-app-core', ':test-kotlin', ':test-app-webbridge' +include ':test-options', ':test-library', ':test-app-core', ':test-app-webbridge' include ':example-app-java', ':example-app-kotlin', ':example-app-tv', ':example-app-webbridge', ':example-app-fbpixel', ':example-app-keyboard' diff --git a/Adjust/test-kotlin/.gitignore b/Adjust/test-kotlin/.gitignore deleted file mode 100644 index 796b96d1c..000000000 --- a/Adjust/test-kotlin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/Adjust/test-kotlin/build.gradle b/Adjust/test-kotlin/build.gradle deleted file mode 100644 index eee979035..000000000 --- a/Adjust/test-kotlin/build.gradle +++ /dev/null @@ -1,30 +0,0 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -android { - compileSdk 34 - - defaultConfig { - applicationId "com.adjust.sdk.test" - targetSdkVersion 34 - minSdkVersion 9 - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - namespace 'com.adjust.sdk.test' -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.31' - androidTestImplementation 'androidx.test:runner:1.4.0' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' - - testImplementation project(path: ':sdk-core') -} diff --git a/Adjust/test-kotlin/proguard-rules.pro b/Adjust/test-kotlin/proguard-rules.pro deleted file mode 100644 index f1b424510..000000000 --- a/Adjust/test-kotlin/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/Adjust/test-kotlin/src/androidTest/java/com/adjust/sdk/test/ExampleInstrumentedTest.kt b/Adjust/test-kotlin/src/androidTest/java/com/adjust/sdk/test/ExampleInstrumentedTest.kt deleted file mode 100644 index 835fa8f15..000000000 --- a/Adjust/test-kotlin/src/androidTest/java/com/adjust/sdk/test/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.adjust.sdk.test - -import android.support.test.InstrumentationRegistry -import android.support.test.runner.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getTargetContext() - assertEquals("com.adjust.sdk.test", appContext.packageName) - } -} diff --git a/Adjust/test-kotlin/src/main/AndroidManifest.xml b/Adjust/test-kotlin/src/main/AndroidManifest.xml deleted file mode 100644 index bdb1e58ce..000000000 --- a/Adjust/test-kotlin/src/main/AndroidManifest.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Adjust/test-kotlin/src/main/java/com/adjust/sdk/test/MainActivity.kt b/Adjust/test-kotlin/src/main/java/com/adjust/sdk/test/MainActivity.kt deleted file mode 100644 index 74176cd4b..000000000 --- a/Adjust/test-kotlin/src/main/java/com/adjust/sdk/test/MainActivity.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.adjust.sdk.test - -import android.app.Activity -import android.os.Bundle - -class MainActivity : Activity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - } -} diff --git a/Adjust/test-kotlin/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Adjust/test-kotlin/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 1f6bb2906..000000000 --- a/Adjust/test-kotlin/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - diff --git a/Adjust/test-kotlin/src/main/res/drawable/ic_launcher_background.xml b/Adjust/test-kotlin/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 0d025f9bf..000000000 --- a/Adjust/test-kotlin/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Adjust/test-kotlin/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Adjust/test-kotlin/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cfe5..000000000 --- a/Adjust/test-kotlin/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Adjust/test-kotlin/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Adjust/test-kotlin/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cfe5..000000000 --- a/Adjust/test-kotlin/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Adjust/test-kotlin/src/main/res/mipmap-hdpi/ic_launcher.png b/Adjust/test-kotlin/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 898f3ed59ac9f3248734a00e5902736c9367d455..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2963 zcmV;E3vBd>P)a+K}1d8+^p? z!e{m!F(8(%L-Or7x3OYORF&;mRAm8a^;km%J=s!AdNyc=+ezQqUM;oHYO18U%`T}O zHf$ra^L^sklEoIeAKmbOvX~v2@Y|vHs<^3JwwH?D$4l*XnPNs zMOqozmbkT?^lZ?$DjQ9%E0x+GsV=1PwZ&39Y}iI-$Fb3d%nsk+qrN@cV=OmQMEdF% z)iHMl(4Yu=cIkixWXtwMIV=>BvDSrHg8?)+vLJKozy*}$iE>&gGGonlG0cJhG&DRv ztzkg-AO(q)B7~G^EwE#tK@nqmJ}!(Bqtf z=eN{I?X#P!Xx=uL)D9cAk=b!~&@H~6S)=a?R4fDdP{-5E5X_!5&FwFJ^7&W2WS z;CnxBCOsSU^v-%(vad;MPukr;&+ciI+F`>sGCPiqHe`1A1|N0p^<|#<+iECwOG@y7 zBF$;;0YAhxtqK7O0SW;M0SW;ckbsQ#9QTYyC*g`2j%bA%1Zh^g9=9l*Cy!I^{_p2$PP2>j_D2AybM$NwY}iJ(ZH9O3 zlM8g4+dw;}V{dlY2EM^Z-Q(AmcmO|Ub1&3EFTS>iuHC#rcNo$wkB3@5c#lSunxsQ) zaA7tLFV3Oxk}X2`9qVL6?4fcq?f>Yk0E0IEcm0~^P5ovLLV$&D9ibbZTOt4ivg_<= zu^#q8tYJktl(egXwj4c3u6N&}S3mj_9pv5y{gQvL;&nM}TeNE{4K3O%_QAdpCAswa z`Ev>!oQREY9uPqL)g(QPVc1U`Q3An`+x_7g8edZ^0zdcpXNv7^!ZsgV{ugB){w+5&3-Wlp}yI7?tN)6*ST)-XSL4g8_rtDVlw+a zE+K|#(tV!KfQE22d-}7B(mLkHukIp4?na@q?%@4Kb%u!@F-ww?o?tn_Ohb zPi3Do`yL?Y$rDPYtEV;|250yzpS^rZT*TflAZ&YqC;by2Ul7NTZHKmC)9NA6Vv+>C%^1XhNlp5*!7zxTTKfHTPhe?@XbH=VzWEuCcmX z@L_&qCB;=(Xi;-D&DvT)kGOiMQ0&YQTezdH&j4D;U@#9&WiZClJThS7w)OHH^fIT| z+jn{&5bhMbynmM$P<0U*%ksp0WUy)=J!n9~WJ&YNn$e3{jMFOW6n~uqMHg+M3FY|#>(q)ZF;RS(xqTh>S1Ez_jfFig z#ivbPnZ26mv{5wdB5SFYrUNM5D?g-OsiZZK?hPof9gqf&7m!5-C=d>yOsw<)(t*G@h5zIY2saaEx|99pU%^#gvdI(Qqf>)zFjf zN}5zm9~oT`PmH~EF012{9eT8?4piYolF(86uiGy`^r#V4yu7SA-c zjm})#d$(Kx2|Yn~i19Fr<)Gs+1XaUIJs~G>kg>3 zkQ$CqUj*cb1ORzHKmZ`Ab2^0!}Qkq&-DC(S~W*1GV zw9}L-zX}y4ZLblxEO1qhqE9Q-IY{NmR+w+RDpB;$@R(PRjCP|D$yJ+BvI$!mIbb<+GQ3MGKxUdIY{N`DOv%} zWA){tEw8M2f!r&ugC6C5AMVXM=w7ej#c_{G;Obab=fD={ut@71RLCd*b?Y1+R_HMR zqYNuWxFqU^Yq9YB)SmxVgNKR;UMH207l5qNItP~xUO*YTsayf1g`)yAJoRV6f2$Fh z|A1cNgyW)@1ZJ!8eBC7gN$MOgAgg|zqX4pYgkw{E4wcr09u#3tt$JW@xgr2dT0piE zfSguooznr3CR>T88cu6RII0io!Z)mN2S3C%toVr+P`0PTJ>8yo4OoHX161h;q+jRY zs$2o2lgirxY2o-j$>c;3w)BT<1fb;PVV(V`cL*zHj5+On;kX@;0)6rF-I?1)gyZtM6}?#ji{u+_Jz`IW9a=87nIA3aK2~3iFMS zzYP&fCXLEibCzR_6R~#sKN@)HB>);Za`ud*QCaKG8jEwqgoknK7rwW`Cq?RYYE5r+ zh-YUqJ082>*;EG`_lhV^vHEM7d+5Y#e$d^rC*jx{U%h3B^nU%7N|*y`o4g{@w;KP-89>&W#h zTBB2vTk*S|My+4jYTPKdk6yR3b?nAfcd`FeC@gttYuGBEl9wuf8`rOD9VP6`bhNxR znvXql-3ssVUSXfvcf^2L5R-^4E-s=g|M$Wm!?BMl!51d{AS*7Ggjwh^YsbK?6jgCA5T=(9$oK{{z$fCe9x5IJ^J=002ov JPDHLkV1g@XpTGbB diff --git a/Adjust/test-kotlin/src/main/res/mipmap-hdpi/ic_launcher_round.png b/Adjust/test-kotlin/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index dffca3601eba7bf5f409bdd520820e2eb5122c75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4905 zcmV+^6V~jBP)sCJ+Khgs=qzz9*aFfTF@MBLc!81jy1$_D*`qMnYCeSOOSS zh~l6kD7e75FgOnvP=_arGNJ+k0uBt2?%a3It*Y+o?&`L?*#fV=?@xECZq+^KuXD~l z_tdQ>JOSF%q}x5h@>Id>gloHZ!fr_@%N)Qad* zI}<}@Poh`#X29>b50CkB%{yWf?z(t0rQf48W{j1a($$IrZ9{N{@#9Wqx}%DM^fL-m z`X#_s9{BwX>^};}KMtudHpmMyRCq34!+|XCtnqeli6}6}7JiE;H+GAtDViHuQ~X9` zP0^{y>Ov~ufreT-w7!yx_c;QOV>|0UxJK{lqSx`7cx`b!OLV*;Ez4q9Y_XdB$PKk4 z+Aq(kmz%WbOV3IpYsa0#_Vd?)>*2Lc zn) zvVw}USbx|rlL2LMl<$^rb@TnK-;J83fd3GKh6#=C5WlXv83lKz{0$(8x1g-%;q}$b z1=&8M<_eQZO4eJk#nshu9TsZZ11Z~hVkpt8oA4831ZP3Fj3C~EG*%gSnciYD-cpkI zj{J=o1Bg-kJrjfz${Js8D?vh>vJwR{=4)c@ZtTqt#tHRR<9b9ew~kVG6oc8(lNE=Pu>)F6HIf=`kIH3oJBkSO2;+SnG--LDU5kx zC0($63w`LN)znoR#GhW@M5n&8!EGBnj_usF!G5qm>{qhQ`sdB#K+CoQF7f-se z?#7!W#vF7jw48A-)Ulxz@0b)?7iKWQI+fE6Ud#Le4H#? z*wIeM>mtaY-X;WO^yfR4Adp*W)N+A4Yv~TqOy)a5g8AjAEfJ4acRWELKhbNNKrc!( z&!ze1YQkhsw=A3()t7B^pu2=1)CJq>k}s1bv-{fV>=i+J^=8Lh=Pn_L(@77X+QqLi zSM!u0YfVL$I)-o^+D$g^8iKevTQlfM$k z8A}@MLX0cd>SIdp0%mtcJaTy&g94$WW9QB?a!}a+T)Rd$eDM!(fgHCnNCsx!svv{S z@9-MjC~sfoKOK+dN>{)_sV(mjhof{qxwvX-7Df1DQTI(g)o z>s6XRhgIhE&g6I!q!Sxz>EW}#SnudH5WeBSekYPp`9~Vp)1-G^r@B46=-SWs(Z;X8 z02evPKG%G)Nf*Dpl|HNSeWdw0`U#|(mpohWGktDRF;Bo`A2K9T}=|{(p(X*E>(aYDag2maC6ay^+ zk7K(%-yfyPJKv6-`qy{#2oNV$%o|*T^A7!TivIn?ahqEKj{ka& z1#*R?@}3aHxtTmO=~U-w(|Xu(B2EmI8B50EvnOk9*GGbcJZK_}E{D#X@`(&j@%hg` zvgc+#V--FuV!3MbUy#-AgE($~;1gULUsw`94gkTgN-nwH+_TiyxD=9t>#{5GHSR=+VC|3HUj>p$m zF=5TOh#WCVpZxG0Mfs)VLU~bclwVS}a)Tud>)$I3M@i?-ZEb;CNQ$OT?W!i>WPgI2K-%bDAV3iV{YFpxIA_D~#F;z7mA_2ToA0 zz;J#$$gz?H{f~tykIYwsN^&ofDHEcc3HtMs_ksmo_H~%=S!trXzdzzq@XJ@P(yd>A zNh?17fF3z>nk9kWDu3|gPt>$~7yTPdOfi9U)o%B9hiOkpO1&hgnGv)+?=lcH(3zlF z)1$73Anp4*+{T@4Fog)rOQR%n2^~~bNRNp!ZBKCK-@noL+ER9Y8^~8Se*UT3c%b7TLtsqf14?X2rJH|pTWGz8-n&h;14Ov z#z`fWWiO*ed){^1em`8ly%A*0PxH#fdX?ndqyYz250dgaflgvo+ zJV{-K7`Kl9diHm3hJcly zengd6QU#LyA&GQLke(wb%#d-6v?HDD3F1f!>{yWg5#|xN?9J0WD7v z;l~T-X%q||!6msgyeyyoVe>kdc~D4&(TwHYfu@{&z(qUzHQHR6u}wE)#*5x&(o-7O zw@7jXJiKu=?N?bq2i6qRnT;Fhz}ixmnKagt?l)w-)BzP^3@k~*Wp97@gTqNpbZPR zy$S@S*a*rO5riY0Ud8DORwP?Adna(v!QOi8<4{14v_(t!#gLwrT(JX4+=L_$A%|pc zXmt?{(xut$cSLlVo(30Y+4jMCjtGY2uwS_m`dG?inGHD{f(#luthNkXB!$a+a>Yn- zK~O4(yi`tCXd{2}Q7v*n=1Z+W<4npgXvmO$@_f~4uO9n2kmNBzD-1S*B*<|l$eA1@ z#7YnNRI?n@&u)dVc}PLoFRSt;=(FF*KZU}pY9KTJIT}LH;AkK9+f+gq?~2G z5#)j#B*jLMG&xp+>KqBOk%JavBS>X$J^3kS)@II(S5WsDjsv%=Is#fvo%C=}VJ79C zu4XlR`eZez2+jdtZkwl~W8jW?O+mCNa{m8IZH0?IgmNQbXlLF4NHs~k~IN5KqX9?a!NuC1W) zYsz_4m;p2B(rNZ|bq7KTK$6gs(A^{fuF@Y|C$u<+ zeYYY3Gn!;AyU4%y;QbOj@OvR}OAX~1e60jYkYi7fGch)Tw9J(lK@#LJf(#;pbZHir zB&II7NTQ;~GF=lByQEr3##lyCO%LAbWBIf<~=H3(^R#^&aTfo7d6DH>o+Z>qt5T4kD_BN0|i~wM{;) zQDk{ivKxY=^BgNdF34d7nZyJ+lfx0Dp`+JSH331CES`Ogv=4}5y2Zs^=PLgRUr*8)xq~v8}M$U zLOie%h{Y~;4ui@DJqJtzG0(xF97ij3CmS@3983s@mls%CJveFs=+cwd>4yDCfvm&e z!5#1cb>BZeo;3I6^_Foju7YH-rfKy08n55>!E;8!9e--mI{HXM9UTG5-bio}4&^qi zE~isoTuo;*ZeZWBo`Vxk8!8zvL!O6k1VIoUEds_IbStzRBxm^3Gm}w=_OY=YZzMUw zCMRKGc;U#1X^+ec$Xs%Pdmk&k3F4CX?~8#O4uI@BY`Kmq!J0Uv+5@a9tSpblLOV))hr-m%u%E*xX4>hBnb`e#B{kyo18?4;4dFUw7M^53Rybu z824~aV-c4}JY7hR>xV*sAg3fy6mLS7LnaNbD2_RfLpjc^aO!{=GM5BGo|C6yB@D9o z>0^ok{idSKZKI>_xtZixNop4pgLk193Gf?Ao}Iaq1y@!>f+5tPYW8ZSJw77VrMS#< zkU%RzE|Nf;cya`#HnR*FQxeQ`<~;c>Y2!DH$r^KWEyp=Wij2g!i9-MbcG4!}i^_bU5@kB8)I8_7rlg4C4#@0J#r1#qtCFoLQJrO9E% zt`s&x4TB&q*Dj{y&(q&hhKJ${y!SHMP)2fle^N(DLRef11H>ps$3G)mFl*0{%0f#} zK?dh~_$b?`;>l7qyL_2N&lj^qc}_^Fh@jk*X2^mq@ZAj7%2fh^%)qQAA zZ3@z-Q#;=6kf<1C_wHkrQ^se@o}KxQJaxedR`bDn4a5ufwojD_f5pWfSc3vWaa8IF z!+Z?HAa-6lxNq{aCuDPGysez_-`RL=-eMvHI(P2D`bHVO)$w1e0^WP&R`mBpOFQKR>_w07I2s zIwmM1dOoD+-D@HOzvDhQc0abkw){E0*){N5cul3$g6n-PcZs4>q4bV;KlnN~%kbn}!V8maBKN?~PDN77Zj6xT>KxccMrJYVYoo)adu8>W% zmv*U9KCo@D{=sCEstjFGl{%?R9Bd_S;`C@G{FNG~X;+5Z0h*dJ1r|5g4wB8=?S#Zy zt3sAsXM@aL)nWAyCYz08&uXYp$}38nkeVvA0^C`|ts22ve2Y2>mf~J~_Til&y|FUz z%#l)O^+i>bDr7NsoiC}@GN^5^{=sAkPSF?VF#7ysBZm@DnF?;le_~|Un-B}Itc2u|IlX``0V1M3jKlcCTY73+_+5_^1 zO|_7<%PEyPhbqxCEnFv#uom}FdO$lY%`OKi#h<5Co8ZPBFZA{I!|wAx!c?aisEfxs z?T$*AUTc9D8_Hpt%L37MoudCVml+QIa-Q{X>F$I{4t=051yd2KXJy7g2ho;dPy9%m z&|3%hK)bgG?)N=_y3^l5BAU(HpEX16sc+%jjdr-wd5e*w`^js6LDPj(u<}q7%axih zoQB@MKIp*y%l0*noe!-3>L8Nvz`X|#;P=}%;m-Yg;Pd%Hg6jXkc0~S4=WWP7_Qlvb zG1>9)E0=~O9SWcSdXd@th$;|?3QV+Z@1bR;tdb%M2ko%(GTA+u#e@F7$5Mb+;mB`4 z!xVgv{Jp95%Y!hpT7-)jrQ~&IJFY@h`L?H{0L^~?0CJaZ z{tZjr)sT1m=#VQw^-Fg;S$l@ofMbuY0uykS+-JWJI=h~`ci}FY$50ATJ+%wA zO77DqVS>075^y6_kJfo$5r(}BH#(lkaYNw(n&Hbh&XQd-lYhgIk-UdHhZ4HzOR6cX9O(7$kLq}D}u9EB; z-dhHFDZZ<8Lc2GP(}(AKLrJ-Oau&a1s?6Nk^&FO z6KSRZhEqx_SQs6S0+Eca!Fb^G1gONmI zC+HbyhfVOuc?OI&h7uoNn}=`c_>iW5NO1q-GUX8K1^!Zxzl z4XfveR)GIBSo>}=cI+IH9~|U>#(X~teA-&84{aZTo0BMk;yjBqEL^gX=_9kDnP=}a z`+sm4^17nldnZj&U`51GznG$gf}Fz|OlbvM2~cNtN6bbO;LjW>4doDpXIHr_#-WEK zTp3oTSyarnG|L?64R(Lh#u7IM@+CF;0?j-dAKR%u-gp$bMThf`Y=V%QniZFqb4;b% z+^sU^c~$y+58W}2ds$fqbXadxS)oD}YcBF8+Kmro`dqK7bh9_jZo>N(2|7ZqH?6u% zs@LZQps|*E)s_+u&N{X0R(-hsYauy#KI0bVpUP;&tcc8vw<4D;UKP1mLj0?AU!cHb ztdAKWi}A~qZL?OzGg+1b@q^keUNsrViJ`HuE@E!RO5*b9*&nDxR@U?Q6pMIaj1kMY qJl2nQa+aK&iDQb84*TpHAJ>1BQ$$nT?9A!_0000+Hy9+Dw zQlg?UKB$_cZ8RBMYcyI%jkQf{#wz1Xr!PxQ>w~B~cKP~!=iIw{_rdOp7tZhwZ1+g(AXy-HL10DFmbXNx@L~ z3H0wQYEpsnp{iIyzhEeKgc((i$;}oAoqHl}Yb`&gx~}ISy|wl# zwdwQ;nvEgzkAnwYj%g}=Nide26RJwsNTUEE)Q2P-5}7cQ3Z84R%7rdvN4sQKhOlPcRnSrOp+WGP}nNJgfkDx!pMkypKGe90p51ezT#4MxAxQ zN3CC+fuRy0nP8u@+)%h}@FHZ>vWFTTCD?*bPf|6Oz4#LAYDsH*sO<_ z+8Vve2|wE19JrkK!TNc*tzkb>2=OxIfDS8-yiLEA$m0k(kQf0ZJlj+Q&+pg*@-o6x zTdEi#&vL>m?`;jX+>v0bbWnM`S<~tiA>-z6^m&Xo6y=iH&}dMDp40vqOvn?CbR0P3 z0YX_`z8klIalWefMaf}lN@-MvK>)C@OTMQsvEFV1j6zbmglN3)tDNw{&IYft@#yp|U;GYg&z^)Rt7d@u#0Bpe zimnOEmq&Tef~aWH7SjqERa#-iBMX%jZKUfNcy71bp|`IOKD_d0nA~D<-XkQV*jewl zx|K$GjP@M*^t)>e04FWS7-Uwy|!6q{ICob5gfvYaErq&g;Btk^VqnotOu zSN-|V;a*P<^rDbv9KD!YExR|ex)jop)as*$VeKa$K-3I_~rZ#$8n0D;V;;rwan!I2{& zEnl34toAlI^wpPe zlye)Ao4ycY%W~JdLaI0e(MHvF%G1SkH=uyAXf{=!ABS!n#lZ@o8CZ4XFmw8#1n{&R zVs(YP+3GCIkwRjs%TCiYQa(?iP=b^m$jib}=-N*{ggXx&44S-zukU>W+LOO#ZOZ!~ zOnukpUM6x&FsRNVXIChVTfbhB(rD_SHz|4}839cXjAmbiVtspfigR#uEFjIMj@si>Ore+Oei$<1cCarcfF2@0*j682U1A9rp; zlE=d6(}XYz#@Cd03QHCwxdi0=G&$N_{=Yy1XfbK~!v(L-Fa7gxu<_$VaOSVq1CpmY z8$Ujb&-~r%UfZSfpfHyQ7GTlb5>~#R>JqSaSxPVhD7~ea?b-3_j}BnQxCvh0zmvuF zfymQ6C7Oj$o(rpg(e8EsF8b6fI~#$e4S@tKotNPf@Ro97lv&dmNB}MOzKDHx{Td^7 z^e>kK&H&X>w(nxk__|+v<^;uhpfq|w0oCgN2n*&Uy98ur#zdLa9sUH2!{g=78$;%} z1L1P#zaX{-%}ARM>G(3`OF*1abzPV`HC~?1g-^B_&(OXN<=~`T0!1J)ouwb`hnx4h z9=m{>-*my^gYQ9FLp5Z*znzJYxJcY)*bL{8bEG_x3mc;?*yV2q=Kg#a+Xvy`pEue zJ2#<55|A&7Ku(lOR2IUxb#E82l~|riL@t>>J=|1!XP{(Gfq7D*RSSuh3Wmux1H9O5 zbzVzIvg#nSb+dS_bpfB9xub!%!Jvc0T8>$5O?a$?#5xXzQ6&nfaS6~B@Yl=oyt`5J zUi|^Lo>^h?bXpN!k$b{#I*o}Gg+L0KqjiNap+>{bdB$Wh1B{gdNt&z zkU*wl;*p0Tp96`fH`Pew34JvBLf)EFl)AaU3W$CXzIJ5}*_hmnyplOlgkJ%5dN1-^ zfYFOQ7f|g*o(nK@@|F3Nh4!=hOBWWfJjm^}QhYrdl{|g|c5+Shdb>Od$s<#GvjwI% znqg*ZJ*3tdIBXmlNOJbhCP>{}#ZfQ82y=FCgS0Is7aB~A{A+vOWk<4kG8-CsBA>N) z2Ro)Vo9)zRim|LCBI$`F-!JxDQG~E+nVNaMkGbGoHB3M|cbfqm?Jyjr6ln%D z61dqAY5B-YX2WN|HS&_#uo&dO1ZLdVcx6-*l>@yGiUd^twKIQ z1myy3dN1;B0z4enBibGcLp_=&v^1A84wc`CetouQG9=$!N7f##SDg2(;-$ z`!;UT3E!5cpgGLm)#4Fpf{Qj}^JF&E4%N%lmmNV4&oVB`hy6ytSLkp=a!l^3{cMD2 zTZ1ifMFW4}K)*?$c>mDR24g)rEZIEGUiM-d`ALieTX6^VNp)73C?Y9z`9d?=c(?d1 zs~_K-`cOc>&%IHK9z-;#Xp`TMv(d*wB}E%mPIu_y`4;N)(a6iqDI;Sfv%{G`Tq?Y? z`XY5qua{3ZRrAk6vM-O$&0Shch^Vh+#oUI{16*NgkrFgmFX!!x!YeN2Yr^QVW|_o)XG(ZcBN)a|R?) zB#;P8w$4loZCthCwyD)Kv~>DA|AHfFa+EnB3aXYkonv5irz&0+e_1c`|f ziIC%^3DMCrgrvlo!j#n640IkHIfLEfbrQs9Mtu8!_VBgvQKZl*M~Z$T%?|zlVT_2; lV%Z2*hu);6rydA(}wUDXPCF_W1vnaRBK zeoR6LNsxyaZGA2++G?*?dRwg0Dq5+E#aFEgnub(`IsNLD^CGWJ)s74L)DOcaT_gD&woh@MDDT7paS^E*rkp>8F->o#K*x;hPkb-{g{@G1-RXg&d5PhrJUf$gT>-Kc2+T~(?$>*Yu zT4h`0W>J$pZ%Azsi;{nVW%G=At*)awy8+_t6`#e`RGh(2zZ43)n*13}cE8;I5R%*` z|5tXk`=>gMs>q*$@(4m8?`JI1Q?{ zRHAd+JgRmHP9yV))rP7q3IO??4XSoJ$5!Su*=~JDub(K$fM<8yf*a-K*Qz zPelO^(`|+V_|-0Wk_vz*qdO0>?1mS)wM$Y29FC;)bEP-uAW0uG0ct9EO#m6#%K0RZ z39?+K6Wk5gE*|+^5I8uFyX{ALNYa2Nz%T`Hn@(}pU9*C57Xtylz}>iUsV2Z#2;ejg zaNoZ2a>iW@1kiDtzFVLPa8^~&DQ^ARm5e)008Ic*fO8jsh19y~Ki*W3-Qpae2p0nv zo(NXL_4n_CukY&uHM^BPt?*wD_pyjn&Gy=Rcfp3fUR68tMLx;5n(a64-U;9T#U52V zit5Q{QE!`~T|s99zY=X$w0cfmaNYW#0DU9B1CnnlE=a4Z9-s@!Y^>p_bSr_8-_-*O#n>*O#n>*O#n>*O#n@Ra~B|fQ*l9(%QQf9xcJEvaY~>ll!7d& zeMy*!>i>NLUU=_aXnXb`eD~hF-~w+IsQDzK^0wEj+D$`WSMKSA3v0K*aIW*wzx){v z|Lq;P{lJ5=b}1e+^O;s(t?biT$yLHOtC&t(07^{x))^Qyf&6nz%;wDIf6##eu8#&sKFHx$9)9f0Z%(CUS$4kJ%h zh7xEzhK3iU_R;u@KbYx|2=~79C&+BFEBd6;PpcBt&P}D2M4-D$&W5VeCtg1)xQ^3! z9dwsT*;DBzpVRTKQar!Iz)wS)Y_}P!pfNfWp?4YK(O3Tre#~%m=I?&-Fr?${tJVhS z>=lrTBvW+|8iS#2`i=IfwE<-R;44R%@X>{!`|u$=e(U6DgfD8a!sD+U6_7w8>_2iC zX4F|kjj91=H`?IFhx(x5cTdB<7oUfx-gpfTz4Im<`TO4(Xq$f9`@-{Je(C_+`S?TZ z4vcpQ8~0gw-iMFABs?!xhr3^RjtMxadO=JCss=`ts28z5FLd@+WjRbPjd{sS);z$b0hGtE^P}he^1i z7>H-yd;^|7eoS~C1QmcUcehUNIDmRU&%AkT#6+Jh?!%J56dPSF5W|cS2~^FD7Wvd} zT-c21)vi6B=%lT`_GJe6+|LDhTUPB z>Kqr7@|jIF1GGeZq0h@xpIiwP1yjb9Y*zKO!2wZMbhJU|{xvrEbS+BPy11i`MdHh_ zU@6%x@Ok(Gv{}~ZjMb!kP=K2@70hm|8K6>-+veseAW{OYUZ4qdx&3t8|MsoFVo&7r zBR|p`^0RB9Ym&QOBA13Klxzr>w7U5`YSn4T7nW@sCeFfg|s|3n!5j{|JLH@6H|aVdjq+q(_^fRXaK3P8tZdo9e@(iRu< zt#-^$ANe`N*~%uK05m~D0gxI2h64{X!b14LJ-fp52WMNa-_Ungz>n!?42H)aRu9tf zZn@BbcY(EZVhL~!%>xXh%jx{h69NHlePI7Nbyew@+aBx-lTRSu!x_l?#;y+Fs_qPn zFzyAQVd36CK07Sp-tGSwzO%a%W;so;wyOnR9>!fGhokSm2Wxk>z$}*;zO!cs^F5s7 zdN4|kx0C?4Z8H;L+zUX*9sl^`u!*Ba_}GaL;N;-QdrRble38%L9&`MolaSM3!@FQJ z6G4Z0_?!g@Oi9v1(0V6LNg6>3G$lEgO-Tm6-~7mZF&SDOz2J<8TOPaz5~@oX5^WXm zRgCN}thFfSJHcV(r^j|mGB%U)4;_7J+>jr_V@F?x)tyaH)Y%AYx|-ou6lC4*?Vr!2 zJS|H}beRSgvSlfiJk7T%A+RjP#kOg-=>Ybx$D05Lj~|1XcHQh<^OqD2_9kucVwoaqihgiFwGD}j~1T8KAq z9 z0*J_$7eGipRXI8<3eY7Ipjr$(pS5fpOv=;6o~r=0)r#cH3Lrr~6QEWsz)#GN7h+$5Xou}0dN}v_c^boY%{;YZ{WV+0(M1QNN9kM;!AOnLO zA!aO<$`pxu4!x90Kzr3RkuIy=J+gW&=9H=qA z_U>+&-|S@9p4AWyTLkr1J{JXz;e*%scI*>vDKlk)jL}tnO0kitDO+6 z?2}J&RYIn-a{R1}qm0E@ZB`_oFkdWy1o&B&jg?@V^{!r@`-SP05aqg;X(mq$fxs-TLGNGl11do^z)ej zbyh|4sl+n@Iva%o$n^8W0w|C#6u>A?ev|-N<5GZdoFLuJoL?^%Ksv}8B7j1W6%fFy zNPbv=Zjk_D@+X75dvA_6E6 zFN6iKm8nL!k^)EsSvqW^!UD*VZ;KXSB0MP{62Yt>fJB5F5ujW(!es*ZyvoB1VF6kp z*=dv~|NIJ2T%dOv2k0&0@pc1G%QTb_ih|Yb=$T%62%3bDw82d2XhH;WDF$Wp8)|TS zO9Yk>O2SA)vS<#MrV(i-iw4q$z#0HWxD;ejKcAgz2+A3z)@+3bosdkEd0g z;D&1#CpZiz#?%|L1R`t^3D6uAKsmytNfdzqGC|f*0VK$e7Qk*e$z8qXvXKiA`1=hV zmpdyx!B&1`%>9K46G0ec(a5T#01`o#KmdgZm-_e-0c6Mz|AmPOGO9|Ba#>%@WZZ2W z>Ho;wdKvvm*|hl5+kCX*InGgW8c#HK{=|ok`9yjeW-XboyKLmQg9WCdk*LNJcD!Wm8!M{^|rzMI;*ms)i5}x+Az2Z&!25I4rWwWL}BX? zEOKufEUd2?%)sM9ARn2w5R42L+weM@-Ge!fsOt>oIm=qnPh6z`_Ydz*&dt4=I7*o{ zE1hu`!$e9>O-f74pc5eSr(Br2T9<$6_jJqiuh$jk6-OgwWnppRih^SC?_wkr78Flg zxdOMJdh#qTEon9)Lx{AD zp})x??JVrlV(c?%q&{ae4u}ilB*0A^Hwr0^^>G9BT>K=*lpq(QLcEr=q$MqBNlRMN c(!@yr22-Ey)4s~&`~Uy|07*qoM6N<$g6%nSQUCw| diff --git a/Adjust/test-kotlin/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/Adjust/test-kotlin/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 14ed0af35023e4f1901cf03487b6c524257b8483..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6895 zcmVBruHaWfboaZ^`J@5OTb59uN+UwfO z>5DKPj6xxy*f-15A^38Hcw8gS)fY>m7X^~)>WdY`i-Y7Ev5tB;lGU`#+aci!MOUUM zD}qsF_F|N>IHn{!fdYTV_wX|;<46$x9(d2I{>ArDOEMG+AD^=P{ywF-GrY99`C;pd zTVmI*ebJ{Z?*lK5{2OnL{2bsnz#klb&V^vTF8LL3idsEt+KcA+ISDVmw89n=b3!uh}YH8Am2dcyFwO zP>3sYL|70%XiHU}0Zo+(MxFf$fG{c^GK8Lk0nm!?MOUlH=$7@wQ=P+?afrb30+O<` ziTG*r2zL#G;JREn?w(KwKTW>kAG@~nvD;BDbNA6Sw3X7nOleNtO`EFE_iw7?Nk@V% z2nn}DI|Z-=FUSS{e!iMKGH%z#^FftGb+nGAxybACovek#YjQ#vb&d*p+t1kJZ`xQz z;u|ZlH|p$>-hl#GilOt>$n{u0Xl)T;>j-tlI@@Z?Wzp-=)#G34?74swCQ~ERfdKmc zFhPnTvx5a7>%ShCv+=IbEiP%zhTLzjnoMn+{p#7s56cR+1Ip9!b!Tb z`Sm7~BP+1z^;S0iG7&)FAn@&x7D5ZD8A|Rn^8#NH904lXb|d*p^Im_M3cx}s7!4)T z9gHH`t8+}w++;htxjC@gx{~KPlVjj*{S_ks3$9(+#6u-Jl&IAP3pu!CJwK#M5t6c_ z>9wdD74a&~(E(Zk#1U@ZTtm|Z&dTxVSzAiRZr?zO5>r03qKN!s*CrAGLWn8vUzShH zLj>)tEVfOD(e%jX+M_)bim*#E5_p?Gy16VcdB?_AS3UnYnfh>x4oMP&MNjS{^B>++6>|-QpN0X@X6L&Y0v_nr&QpJ?Nedk76e$t+1QRS1iuh%{F%%f!H-mR|< zQLG8Eng=h6w*&uot15mDdp?pMw_z>mzOGmllD0RJTU#1Lm&egEdG8hyS)~+JzIUCL zOasw+)T%|5zrIFI%imD16;(cBT?v`6d!z2=P1Pi}_cC zaY){_eM2i&Osq}6Oy>Y2JfPjfx74>{k`N|n!sM^n$$Li~8z=DouS%NFPq=6oaadk$ z0*u&FPkPm9z)j6IfM-M)d8(pgV+4M-S4t-d{CpIET*U$q-ZNqpnS{w$epknMM*J)< zPm6>bel7I#uL*$fN%fSIg0yd#CHM7kuV;h_C^iY@0i^Gty9+J2aLrPcO&e_I4V!m|%QLzX;!0D_phPA9;f z54Vuq!_U%`L{EsIT^4|j0x3HRvX(Vc4%<2x@Oh2+Dn;)>o2t)Xj~&>w&Vc`00uyVP z+rjjLt~xt1(^VjmUESy@cLz5nC)L@%fx;yxhQ-ro#ptR%A^-9B0u$XgK)sha_CY+|f}c==vHJ zIsE14R^;ECC&mE-m5-zZK z+8{Cl>U!wJC$s|y>+%=$e8oRsp!aOoBrJ@MF;SPkbU$$FNuOD87#(v%q_;vE<)g{{ z)}HI>svC+uv;Os$twg|H_&AuO>#CKsTo>rM<9BT$m9M@;K7t9+k|;62$@KkG-xKZ2 zhe^_oMi>opdhOmo+KXR&YGro*f{q}Ep3j$aj{uxYnw$E)-`r`v*$LKBT)@uM9ye4J z-Q#1bNUOU9;6>Q;!8^3)TN3u@@%O2>^UtqNkTbvkW<`=Kz-yfT?N{=`iBIXo`W%cP zOF@78`!8CjaFJ~gEr7rbg{*#HA!~+a`8W%{Bz>w?4Y=;y{O2FrCCt!4 zuy^g+qyHvTAKvPoK+M_<8JLnR5|X`g3r*75jg0vjI+5}2Tc>@aBLzSo8U5@X@4sm^ z5-ujt+fn`dMM}KeB4Jx*2>uVv&wPi8j_zvT3~}C%Z`$&>zV&72aX)=W3XlNt!|X?Q zQm^Au32^rJ-)S6xb54f}0OiA!vY*2j%^E_@&@x*=87F{e-s!CjZ|nOe1f`XR>1IGiFlvUuJSK*t=o+=Yf5Tc5TadL2IQF() zEi;A4K7Fc758(rGN!uFr7=1be_I@-cIEM1amN~NnsQVQ zGnAj7{i)NE&jag-b#>GhG`pj=Hqeb+VmN|mT#uW%u2aZ9WP0=nqgD1a!xX1#>7~!l<@*A zoYvP%oqLK3P?~FShX9z1Sqj6ovlDNLrBCj+nMZO-0B}XA0IJ;6%pJ)C?Fk@Zmdxqz ztUAO8CbdHVQ=%<(ai;xq23`ZNh1c{dOsDraC(;Gp_x{_&8?%}28UgCOUzsT>BkT#_$;_WV*qs7k zaPyN$mvj4DM~Poi24V76Q+NQ14?o+kc?17edH8v_RvLR<5W!E8Nw&XzRMg*N-BY$S zuzP*nCBWq5k(6tj0?eD4;4Tw{lUUiyM?|NRtpotF6fZvOQYu;~fC>eGYcU+!A^_gI z>|g&+Jh5H^5!z*f#wXumUx4XTZuC;;xMdO!D9;DmFW!WFarO)uTvuikAf~*Cy!Q2% z?KVMgd~=fYTB|S$Fu1;)-b?J?fAZ6hBmmb%3fCA#XxAj1GG?%S0g^}b05|kYcetUL z-fe4Y`Q-Vtqy|P!>5)U^_~}z_aa-{kcrCnU&C4&rJ`sE|B!wvbkd_OtElu>j6jNVj3Vxd?2fw$+FBYCS|S$=CYSc<5Xi_2*; z&gOy)`=+1ggA3j5q=$gF`8aHR>b`OQ}eQ6h8^930& zTfz6uT#6in{r9oABIe_L$ArY#I_=r^EJ;?q_OB~WfagCwZZ1HRKmdgU5x6DEkfO}< zfwzyo4LP-t+{?-ekO2Z@S_?o$$g;aAA0l1(9&md- z<=AWj7QQA=_Jw~#d#mJ4?b#K9JJqf<0gnCn1538001ANs_@tzj2-yZ49YM<%;c8eY z$FZH)D*9o-^{baHqyo6OF>A<%3Ni|8q&>{r+d^jT-r}%~5L31_lEnvhk3OrL;pn_Wlg^IkA4rJe+-a^UwY7R5qH&49$;zI8q6 zuFa?QWFa#_X%0VCHo0|kEkwel#20?HhOE_Boonzd$ROVHrqv>s49lswR{|TU1x4L9 zYWUdAHK)eyY$D^fHyXs|f^6qRnrJT@3q;P}(?aHg7lc1M1q}7Ow>ObxkL;#qWh{6p zNoJ@q2lV_2;LW5yv5(xor2$M!4PBBnq0SsoCnSIMQwPW-xK9!YXN?9Ewl1gu%s7*t+Bg35~wxOdVL z_!J6maK$|`wmvrlW(J|R4Qp6SZiZ11h`rAlpa;f+xk}ztOG1=6^mika+17v_cwJcm znb@*{glqHQ_Z$<{mdK^Ro{!{5S13qeX|4t2CTLg$Yx3A^XhS&(#Cr%31fKxLk>AE+jwroWIAJqGD8O53ik6ycRr{+uucnefYQ1B=j?lwCZCL0Z!rfHSi)rM z13-u*5X=u3)NR;&OIH(34)$~;+?LI^bTx53U>L*(G1V#y+YdHhk;R@Ll=i?+OkCd- z%3*SEKUbcW_h90>pZQtm|g{tib$ zTp&#%&A4L)t+45A(Dt7dVJl9s;bIyEC|u)|eC+Xd1+WujnF-*8d}{%+%uSDM1z{$R z&7_>g#s<0G`%Nz|CMXD((fWe2kIJa1h~| z1dux=-=+ZA>r1lqv|jhme3Ej-a^{v(vpkqY`fO7a6BRX#kuLv&l7`Q~y7ROYB*UHn z+5!+@oj?G`=>;nRoTL}fw?`M#BtWKv2$vOLIJmo103=_5DFBm)B`<7DKe~FO@{*5NG})#;LV$p z^ny_Ujoc~u*wc9ddR8e}^0QYE$@Iz9$PLF)hny$v0ZvsH#-G7`E%D3)bN6Cny)?Oo z+qSv+;8rB2z(RmV8v@wL?N9-lEd{Wj+o1w%wGhA#`MdzbHr2Go)TqJbTt%3<(;lIm zAUDzU378K1rVR-b78b-Utqt;cXu%;L^r5#m;S(UOxMfca@Vp&7^2Kf$-2R72FCZ2X z4Uz3AJnS1&!MHIBQ6xl$8R)*9=6bq&fnGYy#$XFui~gt_LO97NkaamPlJi zG}q~I`=rPHvkwCoH&ISlZaVxMHavs*`M}$I$W4lzSC%}s2RCQw@i<@HvgZtV*b$z$ z1usHku}*8?kXySDgM-1OS3 zUTf%8r$G=$z>}u%up?*XVrolC&vhjv5k$Ci$41h-vY7O&P;e-=MkR~*S`E2p?^e2R z2iI-Qp)^O8l4dnAv4*)FoLKDvZ9bYE?D@AANMDDx52qZkTzGY)>9HjOKPle;xH&j= z@eBOKOmjv`Hyzps*NFnc=^TJ|TSRUrK%GPVdOzN?a*|%a6f$NpF_~t|=CiIQ=k0*a z_gF9s&CV^f?WRfhqJP7Z2i@Zm5rN+@gx^9pm|1YoJ~}B;5wdmmL}=@&iPu5z8@0Jc zAb{iaf=vM&M7XvE5Rxy|@!k$I=PsOZhtM{&ZTGnpnJdqF)xt#!N9$N6F zgblJ1XdAJum&oim79o@gW2kW(w3Y;Pl=9zrpi`& z!mJaI$>Fh;R0Qh?H=tA~fP;NIicACUUhq}tw&EHtE`c(si%&^rOkR(5#=6rsU|XEx(9YvlOxt7`7r?j;Y@Ha zPS9~Uq=Rp`VM6r6xi!r4g~#X|fyA-jV9L%Fxb&&yzc@|W8V$kHtq`T!J->k$fwT9f zIY8D*dwEf&fqFE>)T?2)4Pu@N7f&9Xf6RBr>&*6g&&!c~>&O}H zr#}qk$lyMl5QDrSl9VKmNn_^Ee2iK3e)M7{i32${3oSk1TC7gGkDd~w?cAO{}c+|2tHX7 zU#BJGcQlcR%3^u|EI#sS6Kjh|H*En;OH2Zj6;&!Hp+#ASkepSggI6tnD`?^Do&Mky z_(gS3!Fy7-66*lojXxVy`EzxYFjw%47oscmr^CW}fN#x@ih)QBU|84q*gJzJCZ~13 zcV=bGip38P%u7EKDP8$aq&)5O$o!1&t}Dv=F{)U027y0E7G!>hpM_^Fehd{2TmRyarwi zugRJiU+!L#tDSf;g80yf8j!fq&|tdLATY2y^~;e|A@Du?49j3d&XV1QyT&!b+bIYy pii9&6o*bz{@b60mWOsVP{|BB8eXZ|AYE1wD002ovPDHLkV1li`I!yoo diff --git a/Adjust/test-kotlin/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Adjust/test-kotlin/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index b0907cac3bfd8fbfdc46e1108247f0a1055387ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6387 zcma($WmFVQySpr~^b#u_OG=0|(kva)DP1B+cP_AmARxJ*NC=Wrg0zUl5(`L)gp{N- z(%_OG?|Z*r_s2c=$2@ap&UtF)$(eXP9W_!SdLjS-K&qjxY;ZTH{xb;h@8E{&N(%r$ z+p3|gU=%dFmq%!1q&9_NsUvvk-GvvZjaIJ%uU(o!Ypc=Wv%E8e<<)SFdRM{tz(T@!nKT{;0jT2A&dgKu3 zk|GDUX<&73+f+CnZza0G4g29@hmNkl+2wP#$0yi6=u-4CD#*a8LxJLG9KlkveQ7v} z>E#)-tL=xh89y&5li1I!>Zzc!_i6V~nKP^5-+!69FtnX*f=*tr+cf&UpZtLBY|wv< zJ6r*Z5374 zi$7+B3A@szy#|*$Tb~kkzc_N~h3;oe8q95K$w@e#5FRGcF}wXTR}t#^!OnNc>Z52w zu23YrlIQY7UrLLcFSW5ctMBzwrTz=X-m{1Y!*LWUbO~;u&&q8Lu;wlGFqO2h4olL; z{rpPfr}7f=Z)eZhFw1_ITpft-VzPF1CHv-W>u;OCBJBEOEn$HmTpFjX=xN6-H5#V{ zn6Si;q3V*@lFMd>H8;M}vOp8McQcJ}^bBfV`1xb0g0`9ZZa9(wb+L_RGO6wD&I8ouM<}YVDFU ztMSz*yMDz3AkS0YO)3_lYDarEUyj?A#9s@-ln${-1Op^nD7zREi=%4Hy%V?=YS7G`L@>`3kHM4eAD%)t@F};|C zfj?B^Kox-WuPMuDp2=LPZU3Obgnl7{dD>|>*A`fn-0|^8uAHJz;<)tkTXA8lI&dHt&xG(4Il=e~QNN6o9YD7H{TR?17eM>#Z8#Y@_=7fZ?HkZX8i|mEGs5mR`uBi^ zzFh5AG^3EMyvpx(a*)!eOI1?nPTn?v0Ly$)KlQ16Xfrzh+}+Ua_I!5XU@ciwrAZ>O z<7!MU$n6`x${EB6YH$hWOMuSEw+72Lb~rgO*Yp26LGdNp*;^;HAD@(SAr(Dk;j7w! zQ>!M4rxUFYn7E?v7)2q)2rJ2%PY>A>-1O7bY~nt&n)jYnG$(iR#hvlih1p}c)I+|I zy^C;=uIJImfY zL~pm6t6Zw8FiOIY<1>EBS(<5`Cv8DBcZEpTCQ{@@-|2$Bhi;6H?Pofq1Z%b2@)&at zUA{9iaqi62D1|=T{xTe3Czr|z52P;M7EB|V-ss{qspYc0Cj~hUUURef8?i5H?e;kA z<~qW5`JIc(rCLz_oJ~>x8O2IVR%>+7%}`TBSQt%i+m+4tV?z0(?5cf&1v8cNlz7Lg z%ZS>-e!({r)+sH_1+QJvE5BqOgmfK_$X*P0*x6beoRN|0FV zBu+T9^1E5}1I>g&wC|Bn^{(R$!_A@+E4<}3n|QMU=H|GuQZRAZ+zSZ}SS{MNj&mi0 zRY+fp&8IQn-}zGeIVj+qntrIP-IpXF?2xAoyT|i)X+@HL$+|t{#ZAvBrd?L!=9aLy z%@CY;X7U41O6VpHq<1UBk2vi~afo_h1Xrb{vQ%cE|Fvi8EjFCP^~ zabJnB#=NPyBD*BaNSQW*VI+TbEmlu2&HD<4U_UQNUR_`K~u~XWideSoLc(k)vEtG^CT* zG`Zdarw^M&6C=~oi^6W#WL!BMe{E&Gg9Arbg2gg;cO^sJ#+L$ zWBP!R+lcV(p-B#aK<&Ly>?*3fngF)TwSRSmGJ!zET{Brabip#AUPyChm}S9IFG!l{ z%+I_?Cl?zVm9nbGSU`Ksi%z1{vEPpxnv}!StZLIR4yl9y>GM~KIIbNdVs|xsuCpX=J#rE`8<@v*FO%Lb)=#c`~s7W#9EDhRI!G*VBK(y z5D`)jJo4o1={q}Kg%YGhdH~@PGate(xi{(OiQn~MMSZM;!kHNh*1-e<+YS5-j3b?2 zq7SYPWMn1a!^Gqxr4d1gZ5G`QQ(&4Ag*OcnWO}~9rz5xeE3Ycol5cj$@jggn@8x2* z)UpG-U2|Av7a)Hi=b^@SNp#`PEDfswF$nyx&rD*+4SF}`_U48`=1VnBn}aEm{Funk zSWQuC>r8yUkd_D(dKEqo`7i}}{#+a?O4 zDIg~&^q#d5-Ji>``G%gDDzV<~+=*qePTy_lbVjK?!d`>ygnhxwtyL65_G4A=A}{Dh zq;iS@h|Y-wJdeGj1b{KBTkst|klERM7*Hwy#ZO<~Q$5~GzC~WjZHz>=z3~>oAVbbv zzmgOw2JQ#Kv)GT9dwrXGJKz5(Jw%&rYPjfi;TI|dyVJrvaZ*ivGRT;i>R6}8B>7*j zbJi0%9UfLcYKp+TU9qXLSp`rm`)3(g6YOdHa4cv2Y)-JCPZ&g1Z*%F~T@dw@_HA~- zxeq6NeOi{(yh(ziMZ)4yIfDP6nhTg;)$=9N_-{KO!ZB@c@e$(SVH`%0b3YF`lgX)? zmPOF$H%(2yD*LrQ;d*vDgW=s=2h+1RYg?DCXa2gXNT~W+Hu+pBZ$bO8IlS+nqXw^| zBM2iS@v_S^5P@J5V0gw2hamKs7Wro(xWlv)U$%_D)AA{;Mb;l$7?FOK*2{U?f_M(W z4#aOFFlOC*Grkxzi#w)?qgNP48e=dJ*`EYNKfLm6BlZ-j@VMi+{0T>$Y6e%gC|6;v z4=~J;U-H`Rv(<}l7sEXpm?7;(jXl{O>aLca zP;<5GjkKb?74YTOqJAtFKzq|v(-+j{(@?GPIKVS95tsog!>*S60XwAsnYHqG)dW<#@2UIte}({hi5+*r;^rQeDpKps%Ql|LRink z=CR6^g!&1h1Ks5JplDey{0{E~MNPgvQNeH21%lrCFFh~_7#;b73>@zaFo0B}hXo(J z#OVP*a2!ZeK|x0LfazsE0=vAP5xpQ58{e}Xtzn5B`l%b)PM2PI{UmZ`}XbW%4eE=4-VAbQ|zojxNh6BnLDzTlx-stKQP0|=pi5R7qw0g}ivih_z$ zN`Pc6h9K3P5vFz^s^};EaGwq5yEdpH4Um!3Lju85e*w5hg)|yEkihSklp#pqhWjij zaK_T%_)PG>g`7N9$25qwhR3WB{&pp8G2;J-#qe6%xdFHO2AeceqW`Q#`J1X4*a>V4 z;Y4EVTMA!^vxOA;$ZDCt!CPots~0yn*Erio(G!n)@W*|^D_=Wy;f*k=tF~9Zmr)dn zCzfODoJ@UXXs>1NP-A4#YmmhGXavn<+z_gJ`>cZaGo@Iz2J)=M7{{ zJ;n45y6T86%gls;?`*1bFl=sXf1H<+2AiBU`}H6YM=+eFPoz%Sg=s>Dva{ls1mJO? zTWP*i(U7Ec^3%Z$g`f%l##*mSt_wOa-d&(0A0@(ms#pY$P8SX-ZAVg)> zpsk00`SNH__*AQ#=>~|-wScS`e>RBCs6NsQ18sz`Q({qI(fOQUY10Mt%YO^v{>w>TEBSR zi>oS_n(}3A8W+^iWG~}cr3Bv#s3W>CFUJm0ejS>=V^X>!UmDV@|xH@hWB5yhc zuXagN9&cY%tMFc@?PqIxYmy+OSGU`O5gvK2Yaic7tFAiaz`*T*dLafG4tz~<{L=*n z1iRA9k6#TYhCWcSFW6P4&4yOea4q&Fy6Mbkfl&!{&@KmDXMWs7;2Q2bRU~gBtDs>o zNeUgzt#lWV4oq=C=5{Id0)=a+u5HaCtDZwXnX5u!bO%{LbXF-L40}KeG4lG*uU{E_AOMMd4ch=Q9&rc=;3fB`I@EFBuF!XcuT783*FH`4zO zxZ=AOG#fzwnh^u6!|A7Fqf5u{$IesB&EF?V9g5dyhcmbVh)|M3^!U*}qJEYbGFaK2 z#0I`dWniJzl~+;sJs^jty%7`^Yv#{r+=Q<#CleH22pEWpQ)lwX9b5uv064&fPlS+b zqZM<&o~(2`QgUJ$O29zuo%|4(uP+zAeibd;jfc(zz|+6+9EUrZ?#^|ymX-knV0Dsz zFn=Bg(*p-JjWR}+{_C#CZ~dR&on|-C9&{&ij%~0x9gtgIMPCkr_rc{WE_}pL*bCnZ z3d?M3AYq3)iUS7jPOFD3m9DVG)E&SJ1*`YXzZQib9R(``({n~0aGXEhgZnJU3vy*N zlEAeqef_?@nqICTH{?wuZFw#7F{`&i?NLpf<7G2noyziDxMHBmK=Z&P8jf>~^fSVF zFmD1h)DVg7D8erkb}OkfElv2i`s#7j5-;7~&l>SlgLRqNM90B`oFJ!3Z!I+~g7^$B zkD<7Y^U2QID5DVT!a*uS%0aL5KAD#Lk5^|WCC!!OQcFyxCl$386q*ohKGP#?pNL0_ zG0d|NfxU%N?);5-{u0rA@S7+4>7&sDwppXmJaj`?8D#?9@k90l(a-Vg>E`q1zXh9B zEsyo)21!OKE@yf_^P?a!d>O%I$~z&Bg| z{KuO5lVh07O|keMJh@ks$3EfHm`nFk6qNS&_PxPbKN1c~Ds8?;y>OzV;B0$XVQ=LQx12PJ2~x!&?qm%Tl)eivoas}<)&`&84*`tT{?ou45c+RPjX;imIsuwmXJs;5Klbii3#Q0kSLKcW+Y@xKcRce+GJ-RTlpMp(c)D`xrv zd|#_rj!Bm<&cad=Pq($+uKOY#CGCK-8EXOLAo{LJ2l({+_%87YR(e2EErULI*gm@X z*m6LuczdHTQHH`3=)x;unt9KH-4duW3nu}xk&Cu4-DS4wjNG}S$tO5H_$l1*S3Go6 z0HH1rN4WcDUK${}+a@ICZ(ZC#*`6h6EK7)q2OePook_w)c5%-9AxwoT6E*>!XDxpM zy_C$yP!`aN2TiCVLn_z`_E((J%LUYuw%2%(GBL3Cve+5zmepidD|^#$=@2Wfp!?NR zUpV2SwaMg68}9+`X#n-Ust|TK-Qk@HXu7dM*@>KO~@YA_S!geT; zxLp>TbIo9^WI=ZuT?ErRN;LqRSZX$7)+{MdSSiDnSdSwQ+6Yqb#nF393O_Ow-rRZD z1MtC55vP=~4kwe+$#2C8b3Q6*<^!T_D^X($HS$*Ns2(pd5~m<_QgfsetRt77rwh}yjg#yx`@p|%;RnzvAN8~6i5D;EQg*azSU-+F9W;M>-%sM=r4J zY%}@{t+!2883WSGMgw_85U#I}O75Rr0Q_D5;Du8|l@ zHWBq-r2&(pezi>6+daPx-qwVIQ3A6$h}GxIH72G*;HeRgyXKy?Uf!HvVg$M3Vs?lo j7HB*8-{6~e<}KKy%g|C8?m&3=nE}vH(NX@WXdCq(XawjJ diff --git a/Adjust/test-kotlin/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/Adjust/test-kotlin/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index d8ae03154975f397f8ed1b84f2d4bf9783ecfa26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10413 zcmV;eC{ovnP){+^kJY@_qlWNt)byXXcl4&di)UgOL4U zf7l=Phy7uH*dML-fsqKMr;DlfM>yz|;&bpF`{OQzgo8jbktkySeg~64fbWuHz_H+% zO2F)JwJEE@HLSkR79_Z#oHbogc3dx%o7^AeCk{b5(&1F_9NvTf!DryJ`XFJT+JS0q z&?sCD-y=8K2W2PRhjJ3<`jzFS2UeBViE9@x1RKUQCZdv7kl1SX?3WZMS(_}*GPxT+MhW0P|fyhZ+Qq30&o zK&_A(Oze8$+U<`PdXPq;v4_f|Urm8qVAY042UnGp45})9cTiQyEh4N`WieG?WwHFJ zL%SQEJASBPNL8tfyeEVAm>Ttneh$6^dT@7TL)6K`4dZuI$Q8$@YC7*NxE8o3xHh;( z)oY%paC7#DbzBq#z7eX{hBSaAFX=&XZgM%%7vkI`tW*yCO_Yg=`yqnAa-v2eeE;?> zc{iKw z56$?22D^!CP)@={l~{!+p^?NV4J00s5s~K!m``K3Z^mK!w_^!uRBfLTqF!aWIQ-yF z+-+mFw$C)OYiVHDrh2UxX&Im_YA#t%&~JYj4^H@@?c?sN*|d{1z)fXCWK#h&a-j`x zMSwIVr!Zx+>*mUE)45>nPAFTm4uSn)0ywG_n3eP}spMCtk;WQXTc!Xa#?G<8~9?@D4_J^SH8;MHSdkm@M;{c4Zl4~|K=yFf32q2}KbIxDWFpb1y zO+OA&=Iq3=s^1(B1GFU0ED0TN)1GUEzJjf&cITr}~_843H9IFf?D zpy-;D=W+{Ha$5$7>!~TGM>3^{(aM!hTwS-Zu6}T3B@Ohtm!x|WXwD0DS$2Sg4MHki zT4wy)C@!)S)O94Q^ENX$IJLgcuiK`aOAMYnR<7i>43I*17(|~2Z^{a28-tFl06j}G z1E(L_b%g+AG(2{IghMo@X493&wrmJ$)etG%R?khj1IO;za&76!!+2C}`5mZmW7T)d zdc5TLAso7|4x4fu(6j?P@#13#aX@*#Nyh;YpF8maDO(w~k+R(hKe!7&`(pji{+WqG zRNJD}1i%xZuq*IN{U@la2#gbNVFCfAchs zIJDcO;{ZH`Z=Jz5RkkxH?-ZOri>KGuU75U|b7#sb@!GV{ltwd6tl0 z`-tj|)YKcR-o#ogdg%auyuQ|?Hi%I3R1^-|ZB z3w@dmquBHyVR{7VswXIVTX$?MPH4+9kb2qjlDK$t-RcV{VoZD69&BtHN{89>gQ~qP zJ3uX1wj2^zXGt+iUU`JHjaZ|tY;IN^;K@-L=fQS>Y@uwVEi&RUN?2Y*+sNids}(cC z+40kwrYD*P3GD#2c-goFwX_(F;ug=ctyz2p&FRs8BZP#KW)rz1wGkz3b++zpGX3NIKL+e&!v|_Kf@T~~axF4tuT$cD=XZI()UWvicEV_jFqjbw^Y;_9AkJsqs?mSQ_V zHd!_~?Uk)r`5Rg=yAOj%Y^~TwjIt7{g{Gt00kYMyk+w^ZgMfMuZBvVP>lJ}>TFiaQ z6}$vw71{x^*|Ko~^_rD(w0N!+0&330f%Q3TNHV+~AX_dQo92j#JW0ofEat`()+cpU zNK-<*Wh>c%oF}ld7(cPM7T>>P3+`N++2#S7TwjYH+FeDL-}5iew@%rhE!V8XXvx!0 zTFweF>(f3j`6XB-!?_??289+P$hL!oDad&d`knUqYw_}zU&NQL{fPhk`)_>p#vk~F zOaH-9ClAxr#e^P5nv&DV0je~`L#5{FGh$URTHx9AYn@Acj8H9 z-fn2Xa=Bbhm#_bhv)?!+_&C~>bovC&J9ipS=gMNVj42zRq^}*vKi$01ti15vyd!%p zUA9JO)5+CkcwA~i2(aSSaRpH~0l2>#}`U$mAt<;*`UUpCUF!4<_g zFf*C<$Rf;^y{H)XiCNlB=(vxmae|1Pqx`~~S}Rm0li_pUevNx<%Eh8q90Q566YDZZYFMh0VeMrAMOVe1 z|Lz;ye`{f@1!x?J0yCotz`^}fMr`Fm4fEt{bxGcZ@CDfQlmg-(RljEY}^PEkElrDm9b@vQz3{qdC=2bx32OI6ixaob7Peg<(shE$A37*Y0*ydf7hWB3l zfOPA%yE6dnF4t(NpuypoFMj$Fe(uB} zYGE`j2L$`WNWctZJGzc_^Y7cZ=&iGKe5Qp4N#!&iijDjXjTz(3xiMo>J=mmazv7G# zF};w)79FkiA@1zpCm-spe1PcGSD#bY2j6kZTSF>x2d*b>5aJ1Q0i#dXZr;STA6&qX z?AfNYN-*H~;g8?zcE?0p{`DpSKBZ+x+2NX#R$#Yh=T4y^j8P-g+?ON+%kpw5Ksi!b zOAq(oLt>AA{_iWD?hG2?wJ$%XV>2K8a2fw~=WnZlqj?=Lg8tUGU(+#}_pV&l`FXI2 z2R{CgjGSMfif5%=Dvs=1Gg5Q<1A2u%ogU0AeaR=a7WglGq9Gm z05rN_()Itp2xw&&&f%Gd_t?ff9{`jo#qQFme-Q@S8}7!~yjOSWsy>00CD&oc8BE zFMG|E_M?KjbKQ9%c|x42azM)$4)-h1zrz4(v;}}*K(PA#cWCU;R^U~Jl3;7>rw{Cu!{8QN zl(B*ZEn!VUSbEKv??13(3(hAM`|DqSwpn--f-*wJC6w9N`i?w)2q&I8VbU?i)Rp5$ zpRbmO?ySVUW0vO8F+m{!u@5;7*qFB&61$hYbWjGt9T07-U^P?#05ata{Vwd{2a}a; z(QWDK-j|R#Z<>+y4)Emu^ECb8n$m7_4%f@(9^8ck*T(DwCIkV5Cej$Fy(m5INbk)B z81_|%Sz$1T#tN3wg#Zy2eKhpDFrV~OEAFZrs~>OtfgjpaWmJ8GEc7e5$ z<-7`0<%3Bl$~A83zX=m=j13)K`E?&RU1#)%u;U-p*j;=g6-ytEUsw>Kreg^;rRu)?wAO})#2n1X6G=;eY zbpY#7JLDu;AE2T%dC;~}?3TFl3JMDHXKYCH0n`pX@o;Z)fS+3mpgvpH+sc<*x z1F}9*_-oA}DzIg@@Ei1s?3sQ04(rg@i;xN56+FJ0yx!{~|Zn%b_xqcb^P%5t(dMXW@Ug}*T&pN4~-o|+0Y3PH&pF}W=|bT0Q%e706_}svCls?Dd?;u zzf`BxSd7-LQcApTHC}%70KMPb((ph|^QvQq=sA_wK%P6L#o@{e=S=Dp9Q*VlcFK&` z3z4}2a!ZM6K#x2yjjU$pQYbW-n|+%|^QNhAEZ%^{+o;|Dp_Dctk{ReEnaG1N7!M zUvln?NB+f`^cqb${^jex;SpPlIV(gVl3I2ghz8NCZ=kUwM+yh%k@0;{mh_r60fM<7 zQyUMG(-U4kq8@)Rcpf7Gs5P<|e4I7+Y4)N_=QfSdz}A0i8M z<9|WJh7HjV5X(eFBM0>$=J8u=0pwnoia*!0$bca|pm_&(<4!rrxI=n8_RLDeAtY}2 z=*KHo>(0ZuLTbvfXLb_qK-^8I+%| zUdG%Cl=sFd>;Oyj@<24U&RhVc(aBVo=p`QzCVUthI@4N3$j=WxTE)7Iqpe%ok|sRnzE-FFFLy4v@Ojy zAh^N;M6&#AA&{i2o>0u#PM074u4E9~0hJ6dw^~A0!+7s~xzzXy*t&$}*`nH~ad24Swg^YQW%SiNd)(;TZ&v!xo_w?$uA?IrfP_|`m zEQFQk^)0w$mv+7L-8Z=N`c!^^cB=rCZUjVG+>M2OQ>B-YZ>N5giD0_7nBKcn9Z(nY zVT8K$EKGZqvp|-)wRvDgk=|8G?b5E#u3g0gVLJp(fT}bAG6o{JwYgv&4v1g=CLIIv zMIDs;tm=7)QDC4e`P->SW@4!&?~R8=%fD+wwQ%fNlz;`*m_7f4lZg zPs+CxK;6mf8GGySjQUzZnze5S&OQAymYz5)_&eH^bn*y2)>B%~UnfXQkL<$*XJ5rj zUfj!-MX2_vYu16CIG-E`Qa)zv+b&q$i!-$Vw2cR#ICW+4KtvPw2|#OCVb?j+tDrN5 z?)7#T8bCM2K|x)hC)UY#!K_emE(FoWtx~UdHXaJ8k-wu&kn8+J-4;A-Q@)_j>(YJY zg?Mu97A%3iAvFK5B_WJYJ=Uk;DLX5%Z$S!1DXUc!tzD^_ios5qQXIOg3I}f~YCb`# zRk6GpUA2J+pg4XtgGkD)Rv#BBbDlJQ4i`ZC2o9iC;vkyV;Ys8tPL2MM0+eN;g~p)} z0w6LgK%2DyWB@z>N{>Q5fDD62D?moT1F($VrU{S^crr8~0`~=JA&cjHO4_~;Wq@Nr zWEemQNj!S?^ny4@yn0cIMFA2Bk;MTr5FUPj42OpoAS2;v4v+wNsNimoCijJ&noYkkmt8oOdws$f#{!w*f?U)Jch8E3A=KN%$ z+~TWqXo1Kw0L2&$j}jo#@V*79M#G~7Xtyqagu%lBw2>bmUGSvS8y4j#ei=rgkL1%f z@7Ap&y`32$qxTGRKt41A?~MHXhN9HfKQK2YxA^)%Jnqcg06k8QB}t7j8Xmm>352H! zplw$Td3)1=B;S71raVS|C4XCE+i!)Y)YsxC zwr{1D2jEFPc?7RGyqCV#udVzd$BRCC0H?lu6o-;y!s{o=UxTz0REZZH+>J9|JAt3s zzmvYE+Eq#889~}zMJ*4&lX>bSjy`sXzE)_;9zIn!*Yltns(4batkeI%Q%T*?_v-l- zwzrm3eQo2^eRVjbFzZgQkn!Qr)?Qv-9>(^*n!7QC+Pie_+=cw@9hkfB2xJx-vh}yA zTVn@TmEvJ#1=R8YJWubbp>9m4%JS)VG&LMlUV!KB-HunhxDSsc$As6z%h&U3vo;k{ zO$HcWI*2C`VCj2X3Q12&RYlshwMk%k0G`!-Fx?$J^uSaSsW%wXr8mn$ z;~AVgF)0R8iD^b{(GvruXp?%J)1xrGDF!ki=FyCE)MFsSVjfM6Au&)Wu}Bi=^k|QH z6l$achszhr(CFcFXd8EPGdXzH1jvCdyxFM(++21qTCwm28srMxgw9+m)jJWN4erJ$ zfHVLZMJ&MMe#UxB{gzxExlj?R><7D^?>gd zIsvP#Th0rRf$)HO7NyhMYMKBt93Bp!1R5YW1IR#lv;!2+Z+#M@Fq;1OKH8?<-rZ>% zn<;qKH8R~3_2@bhB`p7*PXFr}owme&VS;Ayb&TsY1IP$?02pEJib{@y9PbYJ9-F0^9DWM#x0cd9E8d{Nhwu7<=K>8+N^$ZNE0c0dR zf&mgRx77?FBjITdP&~i&$sz#7EWzl}kQ~~U7Pda>u@Fr0w?{q5-~J?^euK+yOKh+@ zK-wS@FtV&4AYl`uO#r1C4No(GOn|2epc(>Df)>{$ZJ_HW%?-am+He4COHWJ0KH7U^ zJ}zBh%m57^@+5I(e{q>?{I1NR0BKHp2%Oha0+beGG(36%GGJC+2~b6`N$@BEs@DQg zX1pBgOSE*}Efmy$I&DJ>^}KXhp?36ES5Hqr^0%LO&a^z*cv>b}Ee=pNt0)6z*0lp< zSV{&gYQPJSfhidrK-D||#TlBCfycn$tyX}D>xy2C#ZNx60osnWp*w3+F|xu#VTHJL zgq)pW3H*WRxp}YA%HipiSp^_NAR?fQ+R6uz;rTqg02z_b!w-<*@IW1C1t<%~d{$u5 ztf~K`ZN{~oH)~6)SfAzrbq8wx0#N79V@ObTnO>*{L{8A*)}e#1H3DaS0kwz1l{q{-VIh)6$u;94s{*9U z5~XMZ$oNb`HGoXWBy0kx#3Xo{0hGz&9?~NdEngrPj~y9BU6+T4KW#fJ1kU3zQ!wON-a=10NQ87wwb%6LRQHnNzVok~O}hUVsF`(;T3r*TuC}N0kXv5o)1FlPiM+Bqt}hut8}4Q~S}Hl}cCEA^@pEl%fTo9TnOE z5;!qR0U`~r9Ux&7qZFX$wE$!QJWT-AasYwrihB-=rayj^whh-tom(<6q$B9d zZUq^P7R@|EduBNavK9kK0a0o+4?xA*0Wx4#9hQ{S4v_F!bx8Vx+?{3s83>O8AUKu; z7R5-2!lIdB=SZ6jp>5M1b)#+7g073t3W?bexF?D1dr=>Y&`=aP=RG=KRF>NSOQy95 zK)et|<53k_05UKoLpwl*rDX5|WCT1=*3s1jpuM#X5*RF;GwnaH88>Ycu5CP3rYl6q zMjop1khimkM{gLVb|XErK`9BJ!`9JjPoHdbLU(bm z;eEj(uqd?P&>oz1`XpVG5SEpLMGg41O+(c*@m(RvVTLqR$Rvb$EPmC{;Fw=5eU(@q zfM-E*{{K4m?)@;dfs>DWA9{;2*ESMcghxGlkqgj#6g@N7fPjz(bJITSk)MJkc}X&3 zx1n||Scj*RSZZ`#x$)as6IUTgi=&nY;DLm932`IpiqozPb@`WM;c2AddJtCz%c<}x zlTT7LK>|GFFhd$DOoH+&LAOZEBO#raL9xrfVDKn#VxV-BG6@wi5acWy8uM^nb<*3C zF2kbP(>^3_>j4H&AJ*e?wdPcXIU#bR%Y(SN^(B7;+qG*q9Lts!hUfDDKvSRB0+0c->J*@QZ2-mV0!U8Bd1526=;cl}bkQ8tzni+Ng#wO^Uu3(L_tPcUJ2^F{|sY8r}6)1CKU{y0Ag40i>Wq#8V$DMynRd zXk`mr#M7(*DR#7h*J;LQ680?4Yz~kS`8@mp>4Aq_pJ?eknRs%@Ca6=I+r!mym(~ss zA4IM+m~%${$kj2BJP&es;J(Eua`v~}s5PX5=yquq0SGoEfnRZ&amirK05UQetT{mO z+VYs?G@CFn3XA4Hby++zco~HU>eLzaW&yLSEe#Z!GbVCj-N~NF)fFHbEb;NWAI%Ow z1wNeH15|rvqs0JH3^oD)2Bu^v0V+y2DU+}Xpi&+1NE_($Rg19bsnD~MPM#C!sK1x% zAX=wf-MX~Km`A83YRASRU?Q&vfoLGi&p=!xesa=!(en8>x#^F@M!Hf~mK6a~LS$G< zhHij_&#Ef{sw!;`4kW-spbWV@OXl1ZKNeC#V@a6X;(mxdSet;y4)0u*1N9VQ6mnIhyQEZyBO%Gb%x{I6!oXH>p9h>Ks5dJOCM%k^un0ed6UHP%Pb8m@^LR*1I5nOkq_hdUc^+S%FHIjIFJs_SQx=R!_ z{|}V3f?1%o4b%2-m&4)?76nK(Cekx8+8iL`lEGk!m8tc$a$f-|$Uu0~PAo}G2sF?{mwdqxbK&cGQ$%gni}UaT%W z>{iFH*vN(TF1pf6baWg*dmhXpN!;AVi65PqEqZ491+;wOpOAS+8#RZ)#91aeU3opr zM1U0TES(RaEFAz5U^3zeEO9c{qvEDbq@;7OZ2q63IpG(?4?U1W%5uNL;yAjv45nq} z!0F2Bz~yd^b&Rz}5@xDhSt1nNKIG>}ewB_*u5Bn$utQM)S>h>^Dn$#P{*b_Qi}v2A zWlB&7DvMeu3e}jpavVlt4oQvyTVrcNloqGbjn8N#ujME$ULBYWcGoQFO`)jyw?y-1 zd?*fmxYA*8|JiWuY&?g$Do4)Z__4Bjv$8v>bkFVZm;oftBGK_9@@pl%lXjej!A!LC zh#}9ohCi{{ZQ-mp-B&KY>P}({57N+{xyjh8FctPfr+T!$Mn30oz09XHQwIB^dljb1 z$^SVOsXW(wZ+)uVGjE;TvtW(PvtX@k@RmZ^+(Uch12(V6o&_nG{11DO9u@4h`w=yp@yLR7+-F_P_1>{dzv%Vc z{4?EWO|R#D_cC>41Q@6rEpfZPY}Qsw(iu+VtM zk?VfLxt-`8D*o)6RH0G0sdlU^c5qq%Bu%TN3R6ec{q<$PcmS#o?ctDy1vk>p({m{8 zE>kOk6c$U>a;ZxBKlm)ODnpQ`%TPxJEO2ZmdS9GBJEt$ZhK?H0Xj&UPI5rAX2R88L z$%0cK7N~Y(7NHkw?B3M1K;whO01!A0WE#NW=*IvFVBhg)$LPV1*_EBco1N2*U4tE( zRtl2?YqWMOIBn0yR9sp7qyVcUb1gnBpzXq7P*oT9KOgqljw+zIvtzojb2zbcN;KS) z9hz1SlqysTupC)~JF~`b&#VTY6#sW--*Hp{MHLo1Fn0-5nsA9VKvNapXEcv<*FF9Z XdJ+W}DiIkV00000NkvXXu0mjfKBlg6 diff --git a/Adjust/test-kotlin/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/Adjust/test-kotlin/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 2c18de9e66108411737e910f5c1972476f03ddbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9128 zcmb`NcT^K!5btji2)!5SAPPuNq)Ls56s4*38hVo^(nUfO6%ZAH(6N9hNR=iCp@USV zNUs_|I-wKc#ou}5-}laWIcKxU$(_yIot@8o_s%{sGSH@@=As4w(CO-E-X`sF|29fE z>HYT9T?zm$_~>e0H4dIw&!!4C9vSZxNlr9*d^_s#H!1R~WS_6MVYz@X@%G!e zXHz-tb|VivQj`iFZDUWNj>i`*9rwT8VC9f`)ww2)D0tG&WBFX^J|oMigqUy#_eV)Q z<3?;pz6pkr(;Z)thNWZ3Tu^XIU(m2~K2{iFEAS`~Gy5VW_tC>i*Cl0kv`b9xtW+!e zPD_a1*)E4YGCWy+8(ZVrP7}Y9URLg*>8E8fyY^0u;VQCkoBQJ<_5zdXl(d!zb~b;b z)6|dkG)>oK`*erN6Q98nTc z*T4b)onLqyA@?UYxy_MYQjd+D&|e(Pm(0oT&BjWQ4@?kFIoB**?M#(;rSUW9SnG<- zSt-|WaL6iG_P3uZd9eIpr{TtNWC*$Hh2Qz?uBS}bIbRfO#e{zRE!IEy&YexD%F}@N zL-y@k#YdI*GK@^S9Mw$gu9^2z1mSnEkrdxz+MPN|ZNhhS)_oYvhM)cLTYGn3J-&{3 z*gO%dE$+F=!pgEJp;TQOxUvmXY0MZXd)l&aIQ@q%&TOO4FwrA~ak$>;=zXV4zzr%` z=0~OcyNxrVAu`L~2ctf1)jOUXrl5QhI{u_3cR4;2>t?n_c`o(TMz?xA14+Wh$Va%BY0&2$WKO9mM2sYf3h-OCY*=ZOJ$Ngw)1D_iorRZXHQZi4&2K7qT927nQC0Lrg3 z(#lL522bDvLQQ|!4#s}u&v;Yf6v=QytSm1*VR`JzNHPFHGlJ!`WMgHC3lNnE^`=*0 zy?^9tJWsJlLSn+d=%5(DNQYCcv%)omexK}hyZmUHWQF=7JRFKXB_b-*?UD4{x!=dVwazRjll3YN!e1GQ6{ViI{ zhkd)N+MWKT`q_V0)j;tA_oAca{;nI(Y$Pb7t7Zgb7)DUREOEf@igE4Q;TqcgkX-wd zJ;8G+7!?>DALr#bk)GNchOvQs{BBN~iU1F0&RMR&ou$CHl>C|ZrZ@PkAenI@K>Al% zQ7|N8uxRTq4vM*lnm?oa%}HLn-3G$yJC_b75?=65k%LM)%(H@{N`65=i4pdO>Mz+= zLeav25B?f086=X6O6;%!2@%ZP1|;Nvbnj_2aSc+8ZOx$k{x3Drh^ zc*UWh!@lFm$>1}Uo>u2rUqXSar;=W-2Mqo41Pl(rQD;>HWC;@e#W@Z29HUt(caNqC zC&6BqG(7E8;B^rX*m6|Ejm>-6L>RWQs{?%J*!{N&Cn3FMX$DmBS8~(Emio*Dj(^J_ zk~mE@d*561epZk|Er>78iC#q_4Sp0Y3GD6B@JKKrmyoJG4WGBh)HqTZZw>kH>(OJH zlp#iE)N?g*Z@4^*MV+s+H!!1LJlIN*`JxC#o-v0{2|BS}}kDUMqX8%d%;Zo1pF*{G_rVrzNd`M2ya!T0DJTesuRVwL9u7n&PS ze_~l@1G?`(riUCq#<3T)^gi`sw~pk^JSP})C#_iBKTD*{^N7d0$A0wJ3#IRYe;0q4 zA*$YJb_LE1lo-`!M^fB~U00SLiLywh>%-_CXgSb{ju=7v+FzB+78O;y>TeZvRv&RoWxTLP?d+9Zi&Ypua2+{3 z?&P=TOQKt{%~L~p0$j8^;iia9j_>fKovkcwq%sUQ@nh>Z!)%cfJ0$;z4CPrz6I0OU z@+^ZT$qbq`@V*LyaM7l>CZ1ZQo!IplAN5a81(Tt~ztAbYc(d{@u2@?f2YdnGcoX!#60Ixw-Nvix#$k1X*NJg)beTLqL8^6*<{2f@@ns|Q}RjZ!$JIHK8NbS8xrmu#@ z6ulfiVr7xxNb~dV#acSrSX_pQm;bUeyjdV!{OZy#M4(A` zwu81?V`O!?oZ`D{REMi+x!1hB*6Cy(I?k8T%kET=uKQWo39E}=ca$my=uHTEyP8y z54Nz1YH*)(w%#ztIo^C*PQOjte`Hel~gpFN_jZaXoFZnUzuu<)94E6T<5ZU?s4>c zpU3Uo@d?+!hgYmVil!6X(ly;KNm*OwbI8{z3v|%I_4HT>Nt&7^q0@@SPXaA`iAvAR zSr*v1muELwpeL3wqu$P7L5q4m)-N%|J6fE`4!V+xyrOkr+X2!LT$k#tFYksHJH=n z3F!I2Qe4B5pnFmAer;+($yQcgD*uHlDurPx@2dd)1-RjhQe(5`*~SLS`q|S9v+`3~ zQ>IMi+hcTX^%}_YWT=}koWlGSwSH~mOvRNJ&Sfrc>H__ux(6*kTUubhdoQN>V2}J< zR)ymBx4g=I%zlp1J+QjI7joltSLskIt}qG%d@lfB@0(d>+A&l+Glwv&La86NxDmfT zNv>`p7eT?@iBSF8R6M^wCx1D;HRt!F#6s8>2mF;&B-MF;2m~@G4CaiZ!p=4aG-$V0 zYR+PtSNvY$YwW0OPYxL-i+8&!G0&s(?(IcQ&Iv2 z0Nx*-7_~pZT6#2L-so8nF7QMgH5}#22w+dCGMyllm->HAO8q%eYuJ_BHB7343cyG+ zgo9$W05T7{CPl`Zw^P=q+#rx_`T2%M zMCeCJLfZT%fI{csusPnQ7Xv@XSzVNmPU{iX2w134>~=VfgQ82*rq^p^97wA647vgT`a# z85e!NpbSl#8uA*dnopv4RMby4F4MY{UFn^r{Li3l%Ume;QtBh5?8wCixw0*zSQ${* z6)@M`djm|Nz;H2K_j1ACvx90`pqKN#`9b8Cd=@J|$6R{ZYc5yw){(D1GtABWH=Zy` z-HxQuV(8LOB`UjI4iAOJ34LY@KVEmPb@XIC)FfA6m5B&*8T*hQyR{mweAL1#*kA9n z;O}eZUE%DcD;yjrQM!F!8~hPzPrCH2Fvr-ItjJE$$pV*gv9>ye(q2lsB=uQP$h%X% zlekK6q~fP4niGy&O9mR~_I;)G@;?e;L8#rja{}{3_rR(d$+fAsX?PiFx`2ashkOGP zw9A><#);kE3G}H}!W&WxH1$sg*P@*n!{=#L{PK)y~GHI;RsgpA$#8cpY~ zct*9kjG$l!k{*0T43n={dVV!idt6Zw;lPW%!2K;#E>?J>D|V%r^A`&*)MdYZJT>jL z*;x5TTDFevc8OARtqyN`Wyt;0MTTO-DDG|wtNxUqM1$~ye0&&wUtZ&eqI0=0|Y{WT*|Ia1An)J!bjzf9y3P874R^|FamuD zD47YqkS6Zsd3^fEq_zq1i3zN7fM#ldxb7Z@0Y;<&n|qFI`e8q;TO3t$s`geh?U*oK zp&F$0CKJFD-a%BYO^4KA!5J4T1f9rK@Izkpt4qui#^S_s8AE_pvL7$dKQ z*TXfMJYx+MCq$g?pCj@15ZQdjbAm~v`@A?MCg`$$;e!iKvcv423 z^QOF{_mgOGh3-cDZ={Gyr z_&&UYqVw>f(5K`SHp~Mm5XB0N9$~=XOXd$uQNj=bO95ChnZX9K@n&#T?vXPDfqt07xJZVvBuujM>H*4hP6HvbJ~#$K=z-vNQnRCryVz5?3YqR02@1#K{#%aX?h4VQ45b zcmM<+1V?|eCnx}P7(IWh<1mpP1d4*Z4r1WAfB;C4dhrfKPC^**Pz;nD$YOJ0I9i3T zdQ`v*UjtnCM$WL`J8L<$;~1_X+Oyzj(IKG(tLOn!YS8Vny{ z@>lc1XCA-~hhrD7h1@0O)T))gw+GcvsVwxcnaCv{EQzu|qcwKGyiwb`TTP(}njGXHh$KxOryTWq$B1F6I8!hh2O<$rL^FOXZoKME=~3M&0eN93bd- zfpL<(mU)+asMc@#Mvb?Ws^Rw;E;iny$Mb$bu)1ovt0lOm4f(~cAmY<65o0ePN*$EX zrmHUhGI1J_t=@d`{#mmFd?eV^Q&jw>g^;Pf)7JHdLzQB*87{77?Kto0xMvGjC=&M5EOW+c zXpXOY6|Uf)0am19ZLde+hX5J6c11*#mSinvk^A4NWc#m5P)?v~|Bppv*0~T;-^rI9{w3{`~5)bC}`nF?zGx z#@S`#(Q@kl-1Fmze)A@u^#@9=c>MA>$*eslP^G`Zvb5N|sKK{mQ*V?4eX_x+nT?*N zalRRl;P=w1HG57g+d^AJQCZh4&g{?mbJZuj*>jJpGL#!`*C>{MRd4-HML#+BNUG#EHx5`rs8QUMda13u9eMG(lKCYTHCS2gO0L&PIU zkkI-^jv5$aR|blKRsJ6xJ^?au7%A7>eD6+l!ALkEL&*RPl442Nll#UeUv)cn5=YV~ zP)$eQ=SZYMG+hSAy@o*c95}KXP7(~*M%`ovFuZos#RM5t0XkRn?DdjD!7zh+HMGoz6C^Gk*}xdzg{VaE0-2L4An_I# z_)DVjA|u=a+{fkuUkWg+!HA~@f87&ENbQ{u_}}LPin9T}}BZ5K1W#~XT5z0gcc+cy7@$?+tH6Ta*1qVBL@ zBwd%m=LAwRv8~~Cx3MfLmwax@N%=M`ciGYizcDPi#Qug{`#^)V(iZGpR*3ayNFiWv zCT;%Yg?Tn;SO3Pvyu6Dolgt$Pq@8;O(nD{uHM<__6!t9UUP@K#N73GQB){T~9Hpci z<4P6T>Kb;ktBMTne4`e~@)E&sIdENQj5G9OYu`7~bvsRTeRl1z?i^aI{)?VNlekCC zXJKVy+B;Z0|Abe1cpfcW)93y`*4%NW#+1!-OVtut{#3Q5fvBQ-b<*gu4x4f6pmz-x)Q8wc+4G^!kGq??b_{28Zdu9+dS0=wgR`1Va^@f*j96v zE?=;Q{AtjKXi>F3-EkrPfL<`s@S z(Cl$t|NBt^_k;7j{U(%~9iLt{7g5yFfhq?^mE$`_Z>W$9l{seeXUdzmz8$X$3_fz0 zNc_d*naeGkU7&S83}C%)Owd-QTjWCq)4F3puS?Y*tOH3*JX`9t7=HyB%;}BFw)~fX zP3M8Ef?E#|5Tf;EuVktd)#&vh7trJcyxkI{{O|eok{tE^hzi3_4LW$*rN)J?Qmy@$ z@GmJ)5nOLC0(h_C(Ayd(aO3hP5pxuMsRZfvoFgBCNNrsu!(1gLl_W1XDWi)1KiM4& z4TFIN4Z44?71-@F^TGn<^DjNF#jfDTD;qdJ36mB3{oK$>kk1T9x32)H^4{v<&J$?GFZQeeKn zog^e?9JHCkaVAg{99*Xytpn)yWZ-y+!;hT(I=Fwaat_Fckc87LJ*r7!)y;@7k^fUK zxl{eySNWG_U%a8X+L`q+Pwk<%iyJN!iw;Q%=1>$p(4~A8CwtPS13^pt$BA_79TEm3 z!hx@gB4KmstaCTszUdc8*ch3y0f@{;*awP0cxYg(J0u?XLQsFzBA;#(`vHd`I*lBM z;(99!j{626=)R8+$DgEz-MfuzaGI&_b*%9#-BUQaw^>IHgp<=gob@UA0r`@#>-qw0 zpfFP4HZ?#}t^J2jFG?J|6<^ALo3?t>Oz5`IuInteCESw+$NTFo3L77A?}>NbqA$vz z-v81kRTwtLT8^1Hkf#X&iRsn`fKmr-Mu&N{*qwp;$qBXyT}BAQ@L;wB^UWEXX)3_b zh&*ke8czIhFd!IxCi_N!jnrKGIQpfPR2xJo1%*JNF^PvDwB;>G~7@ zQVZ23Q}9_P0C|)?QPY(DS0!&Y!!b^`S|XCy zKNy*Kil!;HIXgI}+mn{ko*V0S7_|JPJm`{p{nOe9Vi^>B;a*toh zNY>_;v-=$AgIA44ebwp@a!75wJN7K9j;+SW z8uoQjVUb03=55d=@#Y_9`Fs=Ut|9xs?0ce>@0mn&q+oSJdb^!tTO8;mb$%l));(4- zKPebA@3lPn z@G1otTd9DCo-AAllf-ruy4anJn=H{RXLG>6j;g|@m(&__Lzek=U-sRZzRO1lOrtOJ zm+5k9slTfFKsku7%a$T6ENphjA3uy9eG=kh6ii90n}D&mc!E$-XY)ycsx6qljq9PY zpDzzbG!`4}xmvrE+7f*Jx351b!!}L5XmvDjt;&0$*g9U$nbVZwscA2!5>S?vG~K*d zPzXIIrnkt|yfEO5^dk>cVc0*&Hh$%zYA8nPL(Hwwk?vVuZpJ+&#LxCsujZ^dalGUq zk8X*2y(traI^+1KZEu-(_j%t<)w?tI>hVd#CUfisw!-|mSM{#>X=67C83>oRW^)Nc z_@hYvV5!q}p#c+`qTV9*kqk5GkA6Z;&)MXHw7m;gzS)ito45k#Ejt_oX>5cfTLfXUX@_N^+#UicK@ zbUwcCAj!Nyi??H{sraN8NiTB?aleSuG-iy_c^*{zg2xn*m1e+7rBnP~o!PuP9z$Gcf(C!4f_G&|`v9JI zHr460gE4qwW4yYiYMyx4c#(d_<1JDCcBZLe=D9DE4fC#q8)2D2Dpnaszf0h1)i*7) zxyKd8y*&dyiKySsH2Uj5(~gfdkoWmaI$)6ycN3CquawfZ+R8$$x+k;L>%Fd*;XYy0 zkq~3{maC~f(~h3ZUsXWo-EodvK!+KO{DW8g|IOnpPq%l@9Ky`Dd0%sz0@6$Ox`Aei I20H400LcNok^lez diff --git a/Adjust/test-kotlin/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/Adjust/test-kotlin/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index beed3cdd2c32af5114a7dc70b9ef5b698eb8797e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15132 zcmZvDWmr_-8||54h>`B@4yC)hOQZ#cM!EzfhmdZRPLWXQlpaz*O1gvrk&^D_^84TW z@jlOq4`=WFp4extwb#3MjEilFPELs0YL1Js)Fn* zzr}qsbfZ_wbNOa4S@vf>;bE~>+%RD!>v%IFV#WTd^7(B=#T|Xno7mV6xS4f=u6692 zQq~7{i;;}Y46D{(Y+R?~SpnS3W=+e#JKDJX-SSUi>9(#}mwE5Tv-r0dn5ZY||9_k1 zWM~Q&Gt=O&6oAqZ3T;9&9$g)JWBOFs0NWF6vYJZJ24_?zn}`jXIHjr$^?F69z!2p< zy%t?XyTRP;!zMXPY^&6kR$$J?UW%?3bCC4XDqr@?ukqAzCEf6lUi%~QE1bZLYf8h# zNIFjy{z&gk+iBasaZQZklPN%Bhl~H-pewWJX`t_4w;I)?=gcrEWq1%u$-pwhg=Fn& zj3nJfbY`j%G4F^8@$CZRg?Lweh*w;b>{2YdOIAi*x9?W^yUNovn|q?NJ#6TPeU_fVowC-#v9#b~gYH6zAw5m28>MUeJ4Tj* znIVgljj#XhW$ zhiz?z_2X4xbgPrk6@%1I-IDPigjXj6D_rk=N!MHKhrgxgN|sX9wAG{r8mKBc5uYx! zD6;oWKPFPVaeKY+;_tfGk8dnA3*mxhD6c6ylsqfXvWFU-T3PF_*(Y_!aR4ycp@UiK zL{0B(1-*H{F=ezF{RJj(g)4PzJx50@A1Bg2>XU|TM&*KjHze0G!vbN}?9#L0`)Mh& zSDg1vm!sTu701b=n&--{Q{n2DpuDb{%No!D^gwg^bAW&J!~L20v4&-T0QrdY*80B?ozklkW% z0rk7=VB9&#oB_RdT&RhUD^ z<%mehua9i+?=)hn7$VmdJdx(xObB8b; zd)9+r z`yz+r{dSM5hDz=4ys1#(+WoWqC+KtBRNG8x2R zkNK+s#C-E*)s>kZCpyIRfB`}hQ6FwUXyKlgYs)!v{kjY>{yEe5^Qr5JEe^d*zcU@; zK#oE%1w&_PZ%A@P#G}S>`1qbU0tkHPO<2-5_Uhe0Y6$FovD9c;Ov~qVD?l$$zpcmn z8BGk}4~3UeEkzOUc<9FqtY1TqoY%qGS&?kSM=O3g}NY85}H(VQS~6J6eJsX=%$ zf%etV-q-i9X(#Qm$6xDNs6>@0-*1b4*6TC?1v|R@FkpbQLy%N<#0-I&1swvEMn?Y( zQKWmqz2#a=uq>R|^cdhnkaB3z*DB@@Q=Jpj%9EBXLuo{WDl~W0E}qH^aARnpD#`Dn zAO=+iepMRRSE1j%9nTDc{=3ACQK(De^37Zvsl54F9`aO8G+M-hmV$3r9l|3HavVov z=cO%-IOVsvo}L%}Jm> zX9gR60KV3P&h$KA;XH%c12K@uFzJy5i9S6?U7BKXLk4&WhD>E$HbfP_Ojp5OF9rfm zT$`)n#dWaGB<22Cl)AZ@Gv7i0;!*>IUJv7##H1X4+Wx!Jki<;jka&jGH6W2$nzJ4> z6yD|%yOMzcBZj~}DSWA5Qj5Q$P>edSrrCzs=X;k&irN=Q9KBAfO4RZ>klxjm*H%`2m5c(y7Pw zcP@DyYA!WftG!MB6T>V!I>_ym+&LEFyikRHI`-j@U5hGl(;JWZbO|orN^1|6{D4+0 z>5k@1pQ`!&UM0WB;(#4ds`}Zu6)B_YebI)X)jZRhJn}_frc0jF4SFi~JHS=t;knPP z&yEu(+8%qK>YIlcGahTfF6Ze^7edgT$J`6#2qm|n26OTFDY|d8s~3hl zpLtuXp@mq2GW8<6|E)D{#yU2)#iuPY!=|5Hmo-<*yo(QYr$3HQqx#%vtHjS|I7NiRxC6lDQq< zTXIalFx_Ncd(TZ(!iRaFymyh~tc4h-VJo_vaMKP(y_b-@V9j{@6aA&=*?g2r3#HBa z-Q(IP$--;P*a%%PO{^%D$`G{5nl&>sUgEN|s^PG}Jh>ISvD%;O|psp}p`-pKAK?pbIHTV?a9?u}(q*GCDRrVm> z0lC9`wd;C96R!Yg%?DnK2`W*_@jf%9IPnwdr@BgGxWS)z)J>cDasy)mt3Y7)p=txP zM)#~H^+!85n&7b%$l{U`iUrdD?1+BT#+yClM)OQek##8!6GFE0paMGl~ znJT5wR_VzqeBv^?U47rJ0!hXwG=8QSN^}EyUNDp2J?(D#FGFgCo^@;lRCMe2zczB^ zM%9XHn3ccHp;wqZ^Uy8mD<>D6R1W$5gqQ>%@AfWuiX0~?SIt2=9&6BS)f-v(V+-C6 zBfbm+ypV$sk2v=A1#JUeO~Sbved*o%-1Huvn%MCF?%m%fP5;xCPP|-(b1@laO;e4- zd6?k_0KN;j`6NXEVgi#X0MXBw38O@O`lZ=y4(f@Vx@QT9*Vpgk{{$@lzYwyh%?NrN zGtU^kn)F6?fKBPA{djTaw^L#(7F&HK0b>+C#os)3 zXBq#MC^QE6lzK^4733pD>UE36G;-{`GpU&0a|`(V-vTwp@G~>2EL6F$*&3YMPp-<3 z$pGu8`_-xR9b-}m{9;+irLXejrTbK_!ep%zGnh;U{^iGo^_=F2)RW>Gnr99OXB*dm zfO+ugGg0L-0>cKR_lG&~a#|_x2{kD1`&ncdCyi6M^Lm931EU`O+-XCCFYRAnjs5f6 zUa^V+z|fk5UB$rN`lRE$u7^I~$Cjw-;Cp6f)HA(2LU;};f)pd4T8-D?I2up+3G(m$&;vg0~+JOD};L`gqqk*eJg+xpbq{T}SE4${0xj>in~=ldQi1rE&?>CiYw2 z#vg0Xtv2hPZfP@t{cR}nkn`imMzN%Ni-Y?Fuhn*~A(k1`mx6vQI)vLRy&;WKU0n}B z@ZJ|)Fn=>TPu!<>B>2~#eYSLuW5D_)A)V?!{Y4XguE!i#eiyl1d{uE|RTBFea zM(g%RB^85qT#!n$qYwxcyR1CEXmt{nlJiLD0Zs8{OI%+d`MxVXSwT?e&2t6`t3 za4o!LrCv}!1now|E(qC6Hf>E@-0qF^3NbW7_qjxU<9CDT$8j)VXDt{8H;2Pzmw@Nb zJ}1NB7;d^GlLw5^EU`sTe0n9Pg~GmQIXwnxEAeh@zS%X#f?&FG!fvUXW1I^%m4Huq zFb9-|D>sEz%pg}Dy}4S#5$%jBg@1FfhQKlNSk?MlP{oDv8s=i*#C%7KTfKRpT((!vAA*0?h5%4doY~|3yq_DA32&6T2RHbNq-AItD)b&W z5)Ng>T|a!hlRxqb6(lwy3n#TR>Q{5$zoTQ(7Yp23btrx0L6lb;lMIld_ZsBm;X65W zhL~-DK~O*?iR1lG`e>ZDti=^0@Hu{22rk-ri$|Mhlfjx zz}x1wtNp{S65T4sftJev1F_{RMAe{B#a1+VB3lE#HN&bH7Rc8 z9d*c27p;2oA4ZYZSk)abazBuwEu8=L?5J?TG~{R3V8o868I?F z#Lt>o_|ohZd7psYl9Vtz6-np(@R&^Q6yKF@# zKK_Phwv=G^eE6%t(B0N4(**az{Z$|8Nab8SLz)m@0bPk@Wo;!3I&BJu}Fl z{}e^!Iy||DQ~DlD9=@%{OB>I8fpV4ZTC})4v8^-k&+wR4`hMI|wtCe3@xtk*M_gV& zT7}a{1ERd3c8RiWPPBvInQ4k+GPxSExF}CJt9v>(EoD>AsA|3ioYaprn4PVQ}7|zFbK2=iyU{SL8K#I2+N-*;IUC zGNwTD;XDPHkYcjzxc(jT?|J#?A9c3l*&Jc_`dkI4Rs7QC{PM6ty6TzkxCMvgm=@WZ zf59SoAflkydVV7?TYoT5`U(N`-HxGa2z_V)YRIz`HRRE3`12J1-lEtmojvMCPtH+1 z)V=IiqG9TR@`K%FOk2#6!1{1OD;*%xRAYo%)EDc|<)I;%EXi}?^()_B6K`pYE*`4Sg)tmZ&*^v8jAGJgK-rh(nO znii&AGyPojK+Ee9+EI?hH-rm&m>=`lAO7{E>D1JKm7n{&r&z%Cwi})WQZ*k0bJ6u=B0Pn1}ek~+ch_lXwn zuc_uu@YRZb$iGWq5BG|g|^Wd_oh(t2hEHAQ>~0CE_L3eNN1(NZ={TZ z*Q&K4gY{whUfZO+x8Pi73^^HTU(N+4u|z~}-7IGjQufEje1K4zazaTk96zyU#Oomt z{bZ_BZ#I(ren>G~3QNkj-ElHS()&+TCR+bjq4vO-*_o`jyU7mwVd?J!edfIxKubK~ znqmum7Gd^m1|fh?4|kW$?Yo6*!cTvq_fNlm%+Olmz3Wf^I(4mQ zO~z#3)9fPojD(VbPK-c6xq)}DM$borMa#X!P?x0&SBqzQG-BST1On6bd~bfeDWpmL zg;dMkgsT6muQ^9L>bR6T?+9!G07EA3XvMR&Q}8^MSfgNeA zEzFXFyts}my(yK#E3|dx>wH+PW-82HFn_p_ z{;sH%Izw2f?je+3ZGMKbJJ%-MUk6I$Q3lW`X#vZ{OC+X9zuDb|vQX4W2a2z2W*Oj)w$<7+lPbGYqEE4!Y z5j4*J(;o`UAc^wryi7M1qZAX{UySopT5y$cT@|8wdo0j-F+*z55(QN4-0X9E2(%0w z->Pj3_BQrPW?JjaUyorsqkqgQ;wow+pkug_qLB3byas`FE+^x`c+_Iv!A2o)GczmY zAV6d5;m~?7FDJ}pHp;5ORZwuDRq(s2BNghbg+aq0nsM$z_3LiUp~h}O&p9WQTkF%8 zM=j%0_<0RSBT*koU?wS=bWkoexJwQclztyKASoPa^=_gN4ebgz`-%PQ4pC%-=4Vq0 zfe#O}LUsDlrtPI4qXRa|3{g~nzfS$+u@EI(83`y$`zM*F4ZrP)V>J3FyYXx}ZGKDg zcnAHvt{Rs*n3G9nWAYgvN_?47{`Qg%8)$u7L&yUCg=`X~0xo?Nm zOT?BaawiXVZT^N9@PB8m9mlRme!pMhW#CUp&O)q1Ff49V5&%z22#hJ2F`M#8APaP0 z$_Rp4aJOUiQWa7(@mp|%WL)nG$d&Zv_rF<$bdOHX?n0#JYw}R-L?73ZR{Dh~d)_hC zut16KfP{BGRQ-I6p%4Q2bsb~&j&!tu<3}y`>iw3ht$>i661@OYn_Xr&XV#5d@S|oP zA@W{))lxW_UJQXd+s5{jYwPj)u*;o$QivH&LtwNF#bMPtindqcy_Sg_0jNOW`lS26z`VMFkJaH+Sv!=ug__rdCdmKpW)`?T6Ob{o>w!vsy+D z-B>}mgAw_|pUbN&6M&;nPF~<=LStpG+Z5n5r71uf?m?gQ-F4dx9x_V$5%CbECK$Gw zzJ2<^i95T446#0C`xOGneN913e!;7o!R%C)^uMCe0=Tn<*P?H{k7Z&~3QPz=NJW=T zj3CEU61-h1U6W|>zbw|;d_CCnt>k5|J0cEO>N_La+8&pSKU3E{M-On-Vw%ehQ{LlX zxIB8%LF!fTxKT!H6<|d62Qh9ehYjV*#xl%&Z~JpAI7ZChyU6I`b9k!^*geM*&r!)0 z`P_*C_$(P{7dfN3zXX2lZVtYo4StL|JW2|=e>3xO1G$K#=;n=dYTEcI0n01mkFdT* zZlxjCcP7Y5aQ>oPVpawo8YKRl#hc>oIaxO{*fKmVk?3H*sQ8bIy$$PNS zm^QUJj;!T<|8X&Tmhjigq?%e(ppMY%uLMndna;mU(!hA{kXVc%0H6AUgIMB;Y2q3as&sY398#kE0 zW83CIlm!|%OO&SzQ41d zS$iN9BrRi!79O=xyI?ngbQV~+RpO` zgt2WYwEdm=V<3qZ)gKkzTAP9Zf$LsE<)l0?cLpV{+UkiYYIQGnS~Bad;H{xUx0IA93P!Z$Ub zRs}&&XlPF1+UESgi+B-d`JNY2Bfq~xE9@Kpnx?;#;mg;m75vQ*?*d4Tztw|nTLS^Y zH-`iqEf>b-r);F3Q~_D`cZH$BGWu)siXg~pRDs3)1|az7kgqJm2#$NR_{p2Y23-4BY)ULyBEa^$KdzDc9uq0^ACB~H-gaD=Y4z@9VVD}V$kHmZY*Zd--RR|Y0w6WlPWsSq`9?!a)pOu312EGz zk4m+W%p>D^0mr(5WfHSjGm4$@-XbLhSU&;M=<@H`iuaG1?)qq49eVAA5|f{k5V){} z8uBYG8s*=a?&=i4q?=aPx<^%phdi8kO`X$JJFg~83BLUMcYF-+MJbGo^^{rW9Z@->vG69q4q3;`%j1PYG2lz1;eHLUAMDldZP&8yIZ=zAT!_W^5Gh_b#n%EiU zZ%Fin+oCFPL;K`A8?8xGtUp%fnKU^o)jCC>R2*P%Cfi#_LmHjMEJxhmc}|a?*)R;# zbyHfgLFFpb00`ZaHUnRQmT#aiiK}x0gu+pd23%n_RUjE4QhiC3{(j_k)DA`~jo|p# z#u5J(u73}=8;tpFvdM1RcA}^T|4=?G_T`x+6LdEhUm=K9erRBQI z%4?gf+wXzRB%6mX!*t}t3Kv1nsQ~!hZbTr0bFyUkaDfV!snDh2##9g(Hhul2EW747 zgi;TxQ%{3b>Mc4N=|y#vIG(4HW=>NnpTpmFun$Rj02m`#o`ex0ONfET z4F{r7@emkC;R~!#dbkG?-M#lhIS+y-buu?tP{T}iowTIQI|Q3D*0|PFM=K&Z8(ngl zIFhy237n_38l?NRLR4+dQiB2V$&rEkfgtk?a6l=H7ExIM41_<)P%KaggZNGFqMZAL zMY&tS8=|yPYSZZFA&!dSI@Tu^@(_*Fml5a%4cZC)7jK+63+eEuZ3PCX_~(AjQOo`= zNPnlQ)GVKn42^BzfT?X|&6O%hoWj^?UbjQVlhMl_0`x{xa=q49T>Mx-$^2R5#O^pn z>2!Sz?&CdJ65j%GFWASd4pIV3tzxpdURHySx^q=6dVRBZ3a7`JP?PSBjkcQPh@?pe)x&( zA66UTKY_1wx3-Ur8yZU zi(!nn?u&oDM9#cLFP7RGZ@liCG@JKro%!fz2GqHc@fk04klM@5*ths6nRZJ%lI|p) ztyuO1VIcggf?H~xX6i7k&p4~V9`G>zjntUEflyoQ^SD~$lBIr*#v)di`!hHHzZ~Wd zJ-QNEBRBq)fz4l2#_xXm8YV8KB%v!-2Is(P`1=|D+zIhS-F?ZUgd{4ZvFP};cKr74 zvi0T|HHv$hL!f3guj8b`g!f?>1v>B0gS~UEbJ?|HOB?fc^jFhtGDY1pfHBHP3X70`g0Pl;1%{(WPrw) zLA={hi)#y_&B|CHDe{&@tUa4*`Gx7EV=fZARJ1+2VgS0L3UZC@{Wc`R>bF^Y|J_=) z6@zu_xnjZE0yN`sSuL5S5%*$tR?_Sn;IN zk+q_-5?}{FkQtG0br0boxa+}qf_r@ocNJU^!H6bY#l--XDfxMU;d>>l#G-kxw=U|n z4oX{wIsAKre7G+PF-;OsE5di0T5MG_-(T zhUl%sTLJ_I(vT32H{#nS1y2{d~Bk*>z;1fMDT#15#7$-u6_Yo!o9QuS!|5#-{ zC0)T!;?6@2clqJa$)sMARqIYV;r+ zk0)L=B>56L%h)=EE^|VE0=oK*K#|t8- zuPFs$^fLQzLGuZ2ZmXe@id)*N@}ZDUnL1)Z8A52hime?+&Bx7u|5)K3ImXEMUQge< zM`(Zo{DDFnt^k6F1jF&@18xC^>12aHE)&2k zs@Nwb?4XI^>w*cbU-d#dTM%R#VlaWL2MW8>deH&l@xZNi1uJB>M`h5y{I|JcKhaAgcz;0;FDw2<~EhliI5igwCTS&^FLFZSoB$eD>H zD10LcRu|WoR}}rm2%pHJGsgh+eOu9q0~qG^b(v)v%8_%bfYg<>q0IYcTAhF-kNC49 zGRJPK;g!YDNi0#B-0xu-ox&gG{wQ(DTXtXWgzKH6KjnvR?85x$A$ZN+G0#8>XkFb9 z9zWb_5-`)TxAZ%jIz@ik!2)usZWY?tyjjOd<;04s^5^fjU8zy`7I$70NYN82zW6h| z$X=NbEUMsfM*!<{`)e40n^{H-)`KJX!(mZdv-cC!9L+JvSVnSO(VKcNP;t?UGtk!b zSPgVYsnD9ejE;FGyPg{6YW6R5Q$rGiy%J(H)2LXP4eT;Slga?wulT3;iy&;Ia=@Rj z!U(jtPyK}8ZWprMhYw6rMgQS66{Y=o_anEEOn1Vj*{8icX-1vaY{+vNoJDFj0{pO( zMG_NH%h3QMU|oF!Z9ocohL5ayn*Z36RiYk>2PU&{vAU1j? zkRdJ8tizF;3llfJ+zh|bK4_O(7pI-9w^Y4gTB0F9sU?J)5ad=AE{p>o;579Jw#@~5OWbag~+3Mnyph?f@wbwu8 z=fB{(_w#nycZtQsdzOuJ=!+1W3GvhPtLJ9m8OpCA&1MCEcLm9=MUSexJUgvMnqDuz zd3!`HT>912mxR#8IDT6FH+LT`QmrCDq@~pdJ?clm$SLSgUD~0uNXRqN&U+KZqw7Df zzDBzgap!mUAGRk7ciu7Jh?&{>=jdQn1ag0rfaz2*?e8k)dfhWih%4+tNn18&)E9RC<4z zeXoG((fW36d;|?kq_y=zW+bjMr=HBC9G6~Oz67sXY9iWf{^(T=lY^M^#K>_LyRTd# zP2auGUqc^`u^ubR5w4Vs@kxf)dChil)2=KRi>a|4o@pNTPdUTmaKG~`#_vwS6!#k6 z{+4VvCc;c#xdy8hCDR;Cl~`TpA&O_}1i*3^LT54QK|MZcr> z_WFbw0$>}L+Ody2Uo6A7WL7!Jjsi|{&4b%5B5BgX4~e|uY}|YIqYsLi98Q<{`IYRM zg6GJnsy+;=)vhXW#}ZcT6Xz)uFQxpe`U{DB-KsDH#Ubr*#odC)p9`{S*v9t${JC%W zNwRP4qvDI=x+u!)g-*90R-vYQbpgwWYEHiCSSi3znGDt6hfK_&?&t8e#l%}MMpBFl zxE>$Q97^qR@(KeM*(xar8JyGv7=1lKpu)}4U@!(Ggn@EP+h#cPr~OUH-`QqXhlhNd zjl-d^u9-i0$Gp!aVs!#8LeIRnr-PZYrSHxBwm7LpU-rGj%`%3{jJ$YGlC;!ih7QtL z?Zt!uX4Po`%PTiH$H>#58o08=3zvG`f%ntyD#+pAjuhI>e65GIil-1!j zY|&2)#*BgVwZTom3H=~rSH4u71~5Evh9-a_APuJ-&g8=GsZ%XZ`qc>;Jya=i6~{(4 zze`0_$3fz?k)M$&6Q&2k9O@)|ms0J}WX+PQI!AD_7a~rK?MmT=*{6>HgTC8@7F?wW zQvP*i_&d*0XyEkG>uvdgHGS``HxH~dcZ(_r(SdxGqHQ%PTNR$W9pbwF`p%+Ykchrg zd;ZKP$e_{BKpcRu)<0Yc9BtI9zz>QDE10>pjI*RY^gW>ul4rjnPF^nE9*z_fjWPsx z;rz(NO!21+*w8E;HQ$iEs5?KQdY&WrS6@)|)f2@QGGUNb`pZ9QAe|~5VNk^MzNK=| z;9mAK2uc9Z4dpSjUqcHr9b7A0l!Z0R|#ihlchp@I~KLoS?6Doh)_ zu=K%3UGOn9lpxZdn;Jp5l_rCG^PfI$I}&ztJSpaMC0Dy0lkx;${plYda`3~ne*P2} z9ns|~NVrt6b{V?dJkGZr?$|N@3Us`o=$|_;^#S3=1iixlG*FRl!;~WTtHWQYrv4vi zfe1%Iyo&Usa1;vcWijV9f7lG3%s-7n>1JhqP#>q+%Q)cm8&5xe%t7J#7D4;Pq!ZrW z*g^ioamw?yQzmW9rs}H{8t5HMq^f8a;yr5&UFlvWAEjU8sr=MHK{6`(@8X=pB5QW2 z)rThuRkfKID&7*$00)V;uz|kjA&u<%qJ(-ftQI~Y0{FUqmAQ!dX>BIlbU4uR1a+&@ zkmj#sFi6@RVdl;od8!Nb$k?GwV+%UZN9AD$I^SFxGhyZiYBo6^FlHMmi!Ic%74vOR zTbAhK$tdDL$9G>b!@nzjgEd46*Yv8FuSvFht22=+*rv|+4$3b zZ!3S9Pw}ln%eG1#?EZ^BG{yxDUxw|9&~c^5s(?Zdx-((jv z13BIiNg7v<)1Ffv6D%?fSr_TBhX^49!*M=iw(6`RQc?jsR0}$}pNjkz<6%^oMiYn`-l$ug_5e zS1DRhObQInw-Hk}ce)nOJZ9INf!2B`WzZ4KR@X3E!~FpiZ)K(=-8Jv@E0_O7vHoC^ z*mjWnD^9@x&n<51a}BtoDA5<;<}xSCC+OaWNZ$ME3m&cIdTfwC4Zm$M?e4xF(O$|$ zrSzuPFiN2WDjj&+{!K)`jnAnWe@$`zFB!7C_VUHc>G-^C$sIK&2Yo??dG8%0cY(-P z1rmXM{)O0gYP&rAn2vYb`0|l9nE3ECc_<5>4C^-IkP5A?DipVEh9TOz&DpiYx%6@C z#Dno^dc`iX8XU-yP(<05{clKW%B~$F$=^>896~*gwp&*&IxfA9fhpjF$7_{qs|GRM zLX+R8N{JxU6-9q%_r?JeOsI^WN_t7?pj&xEkHMow{;zu80jt}tvI zFD>(I?F<}NeZm5#`PrYw0M)P3Kz3*VPJFh2r$Th$n@AOsr`1dhA9WkD|k=MnY0PQDYtoFoJo3AVzoQ(6}uJ5 zwBXm2)hE`7bwu6b&XTa}cPj9p2ZnQpcF_$!1-P{a=mYqW?0lIKJ;w@^$6in|X0*YF`$DQZHSS134zF#>yPW_`4AM znjWs@7CMvwH&w=voOp3Nmp*fLCy%HIhrP5`8tIG_zpnAcnl=|XlAwc5huL$3P(55h z>c_yBe?U^0$VIy65!`OulJGuDnbnWNi(Y(X%(q+=wc|?Q2Wu_JnDJ&$*`0Aw!ZUIi zLNC5ADY4@dQNnc>jc?!5JbOc?nNQyEX>`M5$mfqT$&v=S?+6QQU0tZYtev?)e4p?- zY{z1l6g8L;7w5*j(|auG#MUb~C2FLD6F18@z+LutDU_~ID;*L^^u`B!#;k#f{-zo9?Ko4_oPY}^K;S}Z+?xf&NYM^|v z*pkvo9N^|^q7*<0z0x+Hj+W+}ccPQ$H(-$H-?fpVpC<>uExt9k+(1qEU9M}vo%HvX0RkxaW5 z=KK>pm4^BzfJRm1U%B1g>RZ@jDfLn$`jQ>x1y$v|mymsRDCL?c!YkXHKGa-HgE^c< z&YfRD-oQYl9&jEJOV>1l30cc7hM{sP6OEbF4?M=-nqywL<U9Y?sIr@s$(G5wcSm@dzPD$+RR=zaQD*X%5`4WL^3uN+b)z#*3hP*#P%bC@!UE zZ>`)nYW}1sbTh`W{0WJAY;H1vzX&xGt4PFK9HgIS)leN-3# diff --git a/Adjust/test-kotlin/src/main/res/values/colors.xml b/Adjust/test-kotlin/src/main/res/values/colors.xml deleted file mode 100644 index 69b22338c..000000000 --- a/Adjust/test-kotlin/src/main/res/values/colors.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - #008577 - #00574B - #D81B60 - diff --git a/Adjust/test-kotlin/src/main/res/values/strings.xml b/Adjust/test-kotlin/src/main/res/values/strings.xml deleted file mode 100644 index 7a6b55c64..000000000 --- a/Adjust/test-kotlin/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - test-unit-kotlin - diff --git a/Adjust/test-kotlin/src/main/res/values/styles.xml b/Adjust/test-kotlin/src/main/res/values/styles.xml deleted file mode 100644 index e84bc5ec1..000000000 --- a/Adjust/test-kotlin/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - diff --git a/Adjust/test-kotlin/src/test/java/com/adjust/sdk/test/SchedulerTest.kt b/Adjust/test-kotlin/src/test/java/com/adjust/sdk/test/SchedulerTest.kt deleted file mode 100644 index 20d6d63c9..000000000 --- a/Adjust/test-kotlin/src/test/java/com/adjust/sdk/test/SchedulerTest.kt +++ /dev/null @@ -1,105 +0,0 @@ -package com.adjust.sdk.test - -import com.adjust.sdk.scheduler.* -import org.junit.Assert -import org.junit.Test -import java.util.concurrent.TimeUnit - -class SchedulerTest { - @Test - fun threadExecutor_submitsVarious_executesInOrder() { - val threadExecutor: ThreadExecutor = SingleThreadCachedScheduler("s") - var s = ""; - threadExecutor.submit { s += "a" } - threadExecutor.submit { s += "b" } - threadExecutor.submit { s += "c" } - Thread.sleep(1000) - Assert.assertEquals("abc", s) - } - - @Test - fun threadScheduler_schedulesVariousDelayed_executesInDelayedOrder() { - val threadScheduler: ThreadScheduler = SingleThreadCachedScheduler("s") - var s = ""; - threadScheduler.submit { s += "a" } - threadScheduler.schedule ({ s += "e"}, 500) - threadScheduler.submit { s += "b" } - threadScheduler.schedule ({ s += "d"}, 250) - threadScheduler.submit { s += "c" } - Thread.sleep(1000) - Assert.assertEquals("abcde", s) - } - - @Test - fun futureScheduler_ScheduleAndWaitWithKeepAlive() { - // arrange - val futureScheduler: FutureScheduler = SingleThreadFutureScheduler("s", true) - - // act - var s = ""; - val scheduledFuture = futureScheduler.scheduleFuture({ s += "a" }, 500) - - val withDelay = scheduledFuture.getDelay(TimeUnit.MILLISECONDS) - val isNotDone = scheduledFuture.isDone - val isNotCanceledBefore = scheduledFuture.isCancelled - // wait for finish - scheduledFuture.get() - - val noDelay = scheduledFuture.getDelay(TimeUnit.MILLISECONDS) - val isDone = scheduledFuture.isDone - val isNotCanceledBeforeAfter = scheduledFuture.isCancelled - - // assert - // before finish - Assert.assertTrue(withDelay > 0L) - Assert.assertTrue(withDelay < 500L) - Assert.assertTrue(noDelay <= 0L) - Assert.assertFalse(isNotDone) - - // after finish - Assert.assertEquals("a", s) - Assert.assertTrue(isDone) - Assert.assertFalse(isNotCanceledBefore) - Assert.assertFalse(isNotCanceledBeforeAfter) - } - - @Test - fun futureScheduler_ScheduleAndCancelWithKeepAlive() { - // arrange - val futureScheduler: FutureScheduler = SingleThreadFutureScheduler("s", true) - - // act - var s = ""; - val scheduledFuture = futureScheduler.scheduleFuture({ s += "a" }, 500) - - // cancel - scheduledFuture.cancel(false) - - val isDone = scheduledFuture.isDone - val isCancelled = scheduledFuture.isCancelled - - // assert - Assert.assertEquals("", s) - Assert.assertTrue(isDone) - Assert.assertTrue(isCancelled) - } - - @Test - fun futureScheduler_ScheduleWithFixedDelayWithKeepAlive() { - // arrange - val futureScheduler: FutureScheduler = SingleThreadFutureScheduler("s", true) - - // act - var s = ""; - val scheduledFuture = futureScheduler.scheduleFutureWithFixedDelay({ s += "a" }, 500, 500) - - Thread.sleep(650) - val s1 = s - Thread.sleep(650) - - // assert - Assert.assertEquals("a", s1) - Assert.assertEquals("aa", s) - } - -} \ No newline at end of file From 42f13148d1f3af1f010f042a43ed78e81b0cbebf Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 13 May 2024 18:33:36 +0200 Subject: [PATCH 144/540] style:refactor session to global --- .../adjust/examples/GlobalApplication.java | 16 +- .../examples/keyboard/GlobalApplication.java | 16 +- .../com/adjust/examples/GlobalApplication.kt | 16 +- .../adjust/examples/GlobalApplication.java | 16 +- .../java/com/adjust/sdk/ActivityHandler.java | 210 +++++++++--------- .../src/main/java/com/adjust/sdk/Adjust.java | 24 +- .../java/com/adjust/sdk/AdjustInstance.java | 48 ++-- .../com/adjust/sdk/AttributionHandler.java | 3 +- .../main/java/com/adjust/sdk/Constants.java | 4 +- ...nParameters.java => GlobalParameters.java} | 18 +- .../java/com/adjust/sdk/IActivityHandler.java | 16 +- .../java/com/adjust/sdk/IPackageHandler.java | 2 +- .../java/com/adjust/sdk/PackageBuilder.java | 26 +-- .../java/com/adjust/sdk/PackageFactory.java | 28 +-- .../java/com/adjust/sdk/PackageHandler.java | 24 +- .../java/com/adjust/sdk/SdkClickHandler.java | 4 +- .../sdk/webbridge/AdjustBridgeInstance.java | 12 +- .../adjust/testapp/AdjustCommandExecutor.java | 15 +- 18 files changed, 246 insertions(+), 252 deletions(-) rename Adjust/sdk-core/src/main/java/com/adjust/sdk/{SessionParameters.java => GlobalParameters.java} (53%) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index b3ffcf6b4..a75f6546e 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -118,24 +118,24 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // config.setPreinstallTrackingEnabled(true); // Add session callback parameters. - Adjust.addSessionCallbackParameter("sc_foo", "sc_bar"); - Adjust.addSessionCallbackParameter("sc_key", "sc_value"); + Adjust.addGlobalCallbackParameter("sc_foo", "sc_bar"); + Adjust.addGlobalCallbackParameter("sc_key", "sc_value"); // Add session partner parameters. - Adjust.addSessionPartnerParameter("sp_foo", "sp_bar"); - Adjust.addSessionPartnerParameter("sp_key", "sp_value"); + Adjust.addGlobalPartnerParameter("sp_foo", "sp_bar"); + Adjust.addGlobalPartnerParameter("sp_key", "sp_value"); // Remove session callback parameters. - Adjust.removeSessionCallbackParameter("sc_foo"); + Adjust.removeGlobalCallbackParameter("sc_foo"); // Remove session partner parameters. - Adjust.removeSessionPartnerParameter("sp_key"); + Adjust.removeGlobalPartnerParameter("sp_key"); // Remove all session callback parameters. - Adjust.resetSessionCallbackParameters(); + Adjust.resetGlobalCallbackParameters(); // Remove all session partner parameters. - Adjust.resetSessionPartnerParameters(); + Adjust.resetGlobalPartnerParameters(); // Enable IMEI reading ONLY IF: // - IMEI plugin is added to your app. diff --git a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java index 2b90a7d97..49ff34fa9 100644 --- a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java +++ b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java @@ -110,24 +110,24 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // config.setDelayStart(7); // Add session callback parameters. - Adjust.addSessionCallbackParameter("sc_foo", "sc_bar"); - Adjust.addSessionCallbackParameter("sc_key", "sc_value"); + Adjust.addGlobalCallbackParameter("sc_foo", "sc_bar"); + Adjust.addGlobalCallbackParameter("sc_key", "sc_value"); // Add session partner parameters. - Adjust.addSessionPartnerParameter("sp_foo", "sp_bar"); - Adjust.addSessionPartnerParameter("sp_key", "sp_value"); + Adjust.addGlobalPartnerParameter("sp_foo", "sp_bar"); + Adjust.addGlobalPartnerParameter("sp_key", "sp_value"); // Remove session callback parameters. - Adjust.removeSessionCallbackParameter("sc_foo"); + Adjust.removeGlobalCallbackParameter("sc_foo"); // Remove session partner parameters. - Adjust.removeSessionPartnerParameter("sp_key"); + Adjust.removeGlobalPartnerParameter("sp_key"); // Remove all session callback parameters. - Adjust.resetSessionCallbackParameters(); + Adjust.resetGlobalCallbackParameters(); // Remove all session partner parameters. - Adjust.resetSessionPartnerParameters(); + Adjust.resetGlobalPartnerParameters(); // Enable IMEI reading ONLY IF: // - IMEI plugin is added to your app. diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt index c72ffad12..d1bf3dbcd 100644 --- a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt +++ b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt @@ -78,24 +78,24 @@ class GlobalApplication : Application() { // config.setPreinstallTrackingEnabled(true); // Add session callback parameters. - Adjust.addSessionCallbackParameter("sc_foo", "sc_bar") - Adjust.addSessionCallbackParameter("sc_key", "sc_value") + Adjust.addGlobalCallbackParameter("sc_foo", "sc_bar") + Adjust.addGlobalCallbackParameter("sc_key", "sc_value") // Add session partner parameters. - Adjust.addSessionPartnerParameter("sp_foo", "sp_bar") - Adjust.addSessionPartnerParameter("sp_key", "sp_value") + Adjust.addGlobalPartnerParameter("sp_foo", "sp_bar") + Adjust.addGlobalPartnerParameter("sp_key", "sp_value") // Remove session callback parameters. - Adjust.removeSessionCallbackParameter("sc_foo") + Adjust.removeGlobalCallbackParameter("sc_foo") // Remove session partner parameters. - Adjust.removeSessionPartnerParameter("sp_key") + Adjust.removeGlobalPartnerParameter("sp_key") // Remove all session callback parameters. - Adjust.resetSessionCallbackParameters() + Adjust.resetGlobalCallbackParameters() // Remove all session partner parameters. - Adjust.resetSessionPartnerParameters() + Adjust.resetGlobalPartnerParameters() // Enable IMEI reading ONLY IF: // - IMEI plugin is added to your app. diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java index d5512d289..e88c8f466 100755 --- a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java @@ -107,24 +107,24 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // config.setDelayStart(7); // Add session callback parameters. - Adjust.addSessionCallbackParameter("sc_foo", "sc_bar"); - Adjust.addSessionCallbackParameter("sc_key", "sc_value"); + Adjust.addGlobalCallbackParameter("sc_foo", "sc_bar"); + Adjust.addGlobalCallbackParameter("sc_key", "sc_value"); // Add session partner parameters. - Adjust.addSessionPartnerParameter("sp_foo", "sp_bar"); - Adjust.addSessionPartnerParameter("sp_key", "sp_value"); + Adjust.addGlobalPartnerParameter("sp_foo", "sp_bar"); + Adjust.addGlobalPartnerParameter("sp_key", "sp_value"); // Remove session callback parameters. - Adjust.removeSessionCallbackParameter("sc_foo"); + Adjust.removeGlobalCallbackParameter("sc_foo"); // Remove session partner parameters. - Adjust.removeSessionPartnerParameter("sp_key"); + Adjust.removeGlobalPartnerParameter("sp_key"); // Remove all session callback parameters. - Adjust.resetSessionCallbackParameters(); + Adjust.resetGlobalCallbackParameters(); // Remove all session partner parameters. - Adjust.resetSessionPartnerParameters(); + Adjust.resetGlobalPartnerParameters(); // Initialise the adjust SDK. Adjust.onCreate(config); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 811676158..664c9b7b2 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -43,8 +43,8 @@ import static com.adjust.sdk.Constants.REFERRER_API_SAMSUNG; import static com.adjust.sdk.Constants.REFERRER_API_VIVO; import static com.adjust.sdk.Constants.REFERRER_API_XIAOMI; -import static com.adjust.sdk.Constants.SESSION_CALLBACK_PARAMETERS_FILENAME; -import static com.adjust.sdk.Constants.SESSION_PARTNER_PARAMETERS_FILENAME; +import static com.adjust.sdk.Constants.GLOBAL_CALLBACK_PARAMETERS_FILENAME; +import static com.adjust.sdk.Constants.GLOBAL_PARTNER_PARAMETERS_FILENAME; public class ActivityHandler implements IActivityHandler { private static long FOREGROUND_TIMER_INTERVAL; @@ -58,9 +58,9 @@ public class ActivityHandler implements IActivityHandler { private static final String FOREGROUND_TIMER_NAME = "Foreground timer"; private static final String BACKGROUND_TIMER_NAME = "Background timer"; private static final String DELAY_START_TIMER_NAME = "Delay Start timer"; - private static final String SESSION_CALLBACK_PARAMETERS_NAME = "Session Callback parameters"; - private static final String SESSION_PARTNER_PARAMETERS_NAME = "Session Partner parameters"; - private static final String SESSION_PARAMETERS_NAME = "Session parameters"; + private static final String GLOBAL_CALLBACK_PARAMETERS_NAME = "Global Callback parameters"; + private static final String GLOBAL_PARTNER_PARAMETERS_NAME = "Global Partner parameters"; + private static final String GLOBAL_PARAMETERS_NAME = "Global parameters"; private ThreadExecutor executor; private IPackageHandler packageHandler; @@ -80,7 +80,7 @@ public class ActivityHandler implements IActivityHandler { private IAttributionHandler attributionHandler; private ISdkClickHandler sdkClickHandler; private IPurchaseVerificationHandler purchaseVerificationHandler; - private SessionParameters sessionParameters; + private GlobalParameters globalParameters; private InstallReferrer installReferrer; private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; private ArrayList cachedAdidReadCallbacks = new ArrayList<>(); @@ -111,18 +111,18 @@ public void teardown() { if (purchaseVerificationHandler != null) { purchaseVerificationHandler.teardown(); } - if (sessionParameters != null) { - if (sessionParameters.callbackParameters != null) { - sessionParameters.callbackParameters.clear(); + if (globalParameters != null) { + if (globalParameters.callbackParameters != null) { + globalParameters.callbackParameters.clear(); } - if (sessionParameters.partnerParameters != null) { - sessionParameters.partnerParameters.clear(); + if (globalParameters.partnerParameters != null) { + globalParameters.partnerParameters.clear(); } } teardownActivityStateS(); teardownAttributionS(); - teardownAllSessionParametersS(); + teardownAllGlobalParametersS(); packageHandler = null; logger = null; @@ -136,14 +136,14 @@ public void teardown() { attributionHandler = null; sdkClickHandler = null; purchaseVerificationHandler = null; - sessionParameters = null; + globalParameters = null; } static void deleteState(Context context) { deleteActivityState(context); deleteAttribution(context); - deleteSessionCallbackParameters(context); - deleteSessionPartnerParameters(context); + deleteGlobalCallbackParameters(context); + deleteGlobalPartnerParameters(context); SharedPreferencesManager.getDefaultInstance(context).clear(); } @@ -272,8 +272,8 @@ public ActivityState getActivityState() { } @Override - public SessionParameters getSessionParameters() { - return sessionParameters; + public GlobalParameters getGlobalParameters() { + return globalParameters; } @Override @@ -601,61 +601,61 @@ public void run() { } @Override - public void addSessionCallbackParameter(final String key, final String value) { + public void addGlobalCallbackParameter(final String key, final String value) { executor.submit(new Runnable() { @Override public void run() { - addSessionCallbackParameterI(key, value); + addGlobalCallbackParameterI(key, value); } }); } @Override - public void addSessionPartnerParameter(final String key, final String value) { + public void addGlobalPartnerParameter(final String key, final String value) { executor.submit(new Runnable() { @Override public void run() { - addSessionPartnerParameterI(key, value); + addGlobalPartnerParameterI(key, value); } }); } @Override - public void removeSessionCallbackParameter(final String key) { + public void removeGlobalCallbackParameter(final String key) { executor.submit(new Runnable() { @Override public void run() { - removeSessionCallbackParameterI(key); + removeGlobalCallbackParameterI(key); } }); } @Override - public void removeSessionPartnerParameter(final String key) { + public void removeGlobalPartnerParameter(final String key) { executor.submit(new Runnable() { @Override public void run() { - removeSessionPartnerParameterI(key); + removeGlobalPartnerParameterI(key); } }); } @Override - public void resetSessionCallbackParameters() { + public void resetGlobalCallbackParameters() { executor.submit(new Runnable() { @Override public void run() { - resetSessionCallbackParametersI(); + resetGlobalCallbackParametersI(); } }); } @Override - public void resetSessionPartnerParameters() { + public void resetGlobalPartnerParameters() { executor.submit(new Runnable() { @Override public void run() { - resetSessionPartnerParametersI(); + resetGlobalPartnerParametersI(); } }); } @@ -821,9 +821,9 @@ private void initI() { readAttributionI(adjustConfig.context); readActivityStateI(adjustConfig.context); - sessionParameters = new SessionParameters(); - readSessionCallbackParametersI(adjustConfig.context); - readSessionPartnerParametersI(adjustConfig.context); + globalParameters = new GlobalParameters(); + readGlobalCallbackParametersI(adjustConfig.context); + readGlobalPartnerParametersI(adjustConfig.context); if (adjustConfig.startEnabled != null) { adjustConfig.preLaunchActions.preLaunchActionsArray.add(new IRunActivityHandler() { @@ -1521,7 +1521,7 @@ private void trackEventI(AdjustEvent event) { activityState.eventCount++; updateActivityStateI(now); - PackageBuilder eventBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now); + PackageBuilder eventBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, globalParameters, now); eventBuilder.internalState = internalState; ActivityPackage eventPackage = eventBuilder.buildEventPackage(event, internalState.isInDelayedStart()); packageHandler.addPackage(eventPackage); @@ -2039,7 +2039,7 @@ private void sendInstallReferrerI(ReferrerDetails referrerDetails, String referr activityState, adjustConfig, deviceInfo, - sessionParameters, + globalParameters, internalState); sdkClickHandler.sendSdkClick(sdkClickPackage); @@ -2073,7 +2073,7 @@ private void readOpenUrlI(Uri url, long clickTime) { activityState, adjustConfig, deviceInfo, - sessionParameters, + globalParameters, internalState); if (sdkClickPackage == null) { @@ -2151,17 +2151,17 @@ public static boolean deleteAttribution(Context context) { return context.deleteFile(ATTRIBUTION_FILENAME); } - public static boolean deleteSessionCallbackParameters(Context context) { - return context.deleteFile(SESSION_CALLBACK_PARAMETERS_FILENAME); + public static boolean deleteGlobalCallbackParameters(Context context) { + return context.deleteFile(GLOBAL_CALLBACK_PARAMETERS_FILENAME); } - public static boolean deleteSessionPartnerParameters(Context context) { - return context.deleteFile(SESSION_PARTNER_PARAMETERS_FILENAME); + public static boolean deleteGlobalPartnerParameters(Context context) { + return context.deleteFile(GLOBAL_PARTNER_PARAMETERS_FILENAME); } private void transferSessionPackageI(long now) { PackageBuilder builder = new PackageBuilder(adjustConfig, deviceInfo, activityState, - sessionParameters, now); + globalParameters, now); builder.internalState = internalState; ActivityPackage sessionPackage = builder.buildSessionPackage(internalState.isInDelayedStart()); packageHandler.addPackage(sessionPackage); @@ -2288,7 +2288,7 @@ private void sendFirstPackagesI() { private void updatePackagesI() { // update activity packages - packageHandler.updatePackages(sessionParameters); + packageHandler.updatePackages(globalParameters); // no longer needs to update packages internalState.updatePackages = false; if (activityState != null) { @@ -2305,15 +2305,15 @@ private boolean isToUpdatePackagesI() { } } - public void addSessionCallbackParameterI(String key, String value) { - if (!Util.isValidParameter(key, "key", "Session Callback")) return; - if (!Util.isValidParameter(value, "value", "Session Callback")) return; + public void addGlobalCallbackParameterI(String key, String value) { + if (!Util.isValidParameter(key, "key", "Global Callback")) return; + if (!Util.isValidParameter(value, "value", "Global Callback")) return; - if (sessionParameters.callbackParameters == null) { - sessionParameters.callbackParameters = new LinkedHashMap(); + if (globalParameters.callbackParameters == null) { + globalParameters.callbackParameters = new LinkedHashMap(); } - String oldValue = sessionParameters.callbackParameters.get(key); + String oldValue = globalParameters.callbackParameters.get(key); if (value.equals(oldValue)) { logger.verbose("Key %s already present with the same value", key); @@ -2324,20 +2324,20 @@ public void addSessionCallbackParameterI(String key, String value) { logger.warn("Key %s will be overwritten", key); } - sessionParameters.callbackParameters.put(key, value); + globalParameters.callbackParameters.put(key, value); - writeSessionCallbackParametersI(); + writeGlobalCallbackParametersI(); } - public void addSessionPartnerParameterI(String key, String value) { - if (!Util.isValidParameter(key, "key", "Session Partner")) return; - if (!Util.isValidParameter(value, "value", "Session Partner")) return; + public void addGlobalPartnerParameterI(String key, String value) { + if (!Util.isValidParameter(key, "key", "Global Partner")) return; + if (!Util.isValidParameter(value, "value", "Global Partner")) return; - if (sessionParameters.partnerParameters == null) { - sessionParameters.partnerParameters = new LinkedHashMap(); + if (globalParameters.partnerParameters == null) { + globalParameters.partnerParameters = new LinkedHashMap(); } - String oldValue = sessionParameters.partnerParameters.get(key); + String oldValue = globalParameters.partnerParameters.get(key); if (value.equals(oldValue)) { logger.verbose("Key %s already present with the same value", key); @@ -2348,20 +2348,20 @@ public void addSessionPartnerParameterI(String key, String value) { logger.warn("Key %s will be overwritten", key); } - sessionParameters.partnerParameters.put(key, value); + globalParameters.partnerParameters.put(key, value); - writeSessionPartnerParametersI(); + writeGlobalPartnerParametersI(); } - public void removeSessionCallbackParameterI(String key) { + public void removeGlobalCallbackParameterI(String key) { if (!Util.isValidParameter(key, "key", "Session Callback")) return; - if (sessionParameters.callbackParameters == null) { + if (globalParameters.callbackParameters == null) { logger.warn("Session Callback parameters are not set"); return; } - String oldValue = sessionParameters.callbackParameters.remove(key); + String oldValue = globalParameters.callbackParameters.remove(key); if (oldValue == null) { logger.warn("Key %s does not exist", key); @@ -2370,18 +2370,18 @@ public void removeSessionCallbackParameterI(String key) { logger.debug("Key %s will be removed", key); - writeSessionCallbackParametersI(); + writeGlobalCallbackParametersI(); } - public void removeSessionPartnerParameterI(String key) { + public void removeGlobalPartnerParameterI(String key) { if (!Util.isValidParameter(key, "key", "Session Partner")) return; - if (sessionParameters.partnerParameters == null) { + if (globalParameters.partnerParameters == null) { logger.warn("Session Partner parameters are not set"); return; } - String oldValue = sessionParameters.partnerParameters.remove(key); + String oldValue = globalParameters.partnerParameters.remove(key); if (oldValue == null) { logger.warn("Key %s does not exist", key); @@ -2390,27 +2390,27 @@ public void removeSessionPartnerParameterI(String key) { logger.debug("Key %s will be removed", key); - writeSessionPartnerParametersI(); + writeGlobalPartnerParametersI(); } - public void resetSessionCallbackParametersI() { - if (sessionParameters.callbackParameters == null) { + public void resetGlobalCallbackParametersI() { + if (globalParameters.callbackParameters == null) { logger.warn("Session Callback parameters are not set"); } - sessionParameters.callbackParameters = null; + globalParameters.callbackParameters = null; - writeSessionCallbackParametersI(); + writeGlobalCallbackParametersI(); } - public void resetSessionPartnerParametersI() { - if (sessionParameters.partnerParameters == null) { + public void resetGlobalPartnerParametersI() { + if (globalParameters.partnerParameters == null) { logger.warn("Session Partner parameters are not set"); } - sessionParameters.partnerParameters = null; + globalParameters.partnerParameters = null; - writeSessionPartnerParametersI(); + writeGlobalPartnerParametersI(); } private void setPushTokenI(String token) { @@ -2426,7 +2426,7 @@ private void setPushTokenI(String token) { writeActivityStateI(); long now = System.currentTimeMillis(); - PackageBuilder infoPackageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now); + PackageBuilder infoPackageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, globalParameters, now); infoPackageBuilder.internalState = internalState; ActivityPackage infoPackage = infoPackageBuilder.buildInfoPackage(Constants.PUSH); @@ -2451,7 +2451,7 @@ private void gdprForgetMeI() { writeActivityStateI(); long now = System.currentTimeMillis(); - PackageBuilder gdprPackageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now); + PackageBuilder gdprPackageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, globalParameters, now); gdprPackageBuilder.internalState = internalState; ActivityPackage gdprPackage = gdprPackageBuilder.buildGdprPackage(); @@ -2478,7 +2478,7 @@ private void trackThirdPartySharingI(final AdjustThirdPartySharing adjustThirdPa long now = System.currentTimeMillis(); PackageBuilder packageBuilder = new PackageBuilder( - adjustConfig, deviceInfo, activityState, sessionParameters, now); + adjustConfig, deviceInfo, activityState, globalParameters, now); packageBuilder.internalState = internalState; ActivityPackage activityPackage = @@ -2502,7 +2502,7 @@ private void trackMeasurementConsentI(final boolean consentMeasurement) { long now = System.currentTimeMillis(); PackageBuilder packageBuilder = new PackageBuilder( - adjustConfig, deviceInfo, activityState, sessionParameters, now); + adjustConfig, deviceInfo, activityState, globalParameters, now); packageBuilder.internalState = internalState; ActivityPackage activityPackage = @@ -2524,7 +2524,7 @@ private void trackAdRevenueI(AdjustAdRevenue adjustAdRevenue) { long now = System.currentTimeMillis(); - PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now); + PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, globalParameters, now); packageBuilder.internalState = internalState; ActivityPackage adRevenuePackage = packageBuilder.buildAdRevenuePackage(adjustAdRevenue, internalState.isInDelayedStart()); @@ -2539,7 +2539,7 @@ private void trackSubscriptionI(final AdjustPlayStoreSubscription subscription) long now = System.currentTimeMillis(); - PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now); + PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, globalParameters, now); packageBuilder.internalState = internalState; ActivityPackage subscriptionPackage = packageBuilder.buildSubscriptionPackage(subscription, internalState.isInDelayedStart()); @@ -2599,7 +2599,7 @@ private void verifyPurchaseI(final AdjustPurchase purchase, final OnPurchaseVeri } long now = System.currentTimeMillis(); - PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now); + PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, globalParameters, now); packageBuilder.internalState = internalState; ActivityPackage verificationPackage = packageBuilder.buildVerificationPackage(purchase, callback); @@ -2629,7 +2629,7 @@ private void setCoppaComplianceI(final boolean coppaEnabled) { final long now = System.currentTimeMillis(); final PackageBuilder packageBuilder = new PackageBuilder( - adjustConfig, deviceInfo, activityState, sessionParameters, now); + adjustConfig, deviceInfo, activityState, globalParameters, now); final ActivityPackage activityPackage = packageBuilder.buildThirdPartySharingPackage(adjustThirdPartySharing); @@ -2674,28 +2674,28 @@ private void readAttributionI(Context context) { } @SuppressWarnings("unchecked") - private void readSessionCallbackParametersI(Context context) { + private void readGlobalCallbackParametersI(Context context) { try { - sessionParameters.callbackParameters = Util.readObject(context, - SESSION_CALLBACK_PARAMETERS_FILENAME, - SESSION_CALLBACK_PARAMETERS_NAME, + globalParameters.callbackParameters = Util.readObject(context, + GLOBAL_CALLBACK_PARAMETERS_FILENAME, + GLOBAL_CALLBACK_PARAMETERS_NAME, (Class>)(Class)Map.class); } catch (Exception e) { - logger.error("Failed to read %s file (%s)", SESSION_CALLBACK_PARAMETERS_NAME, e.getMessage()); - sessionParameters.callbackParameters = null; + logger.error("Failed to read %s file (%s)", GLOBAL_CALLBACK_PARAMETERS_NAME, e.getMessage()); + globalParameters.callbackParameters = null; } } @SuppressWarnings("unchecked") - private void readSessionPartnerParametersI(Context context) { + private void readGlobalPartnerParametersI(Context context) { try { - sessionParameters.partnerParameters = Util.readObject(context, - SESSION_PARTNER_PARAMETERS_FILENAME, - SESSION_PARTNER_PARAMETERS_NAME, + globalParameters.partnerParameters = Util.readObject(context, + GLOBAL_PARTNER_PARAMETERS_FILENAME, + GLOBAL_PARTNER_PARAMETERS_NAME, (Class>)(Class)Map.class); } catch (Exception e) { - logger.error("Failed to read %s file (%s)", SESSION_PARTNER_PARAMETERS_NAME, e.getMessage()); - sessionParameters.partnerParameters = null; + logger.error("Failed to read %s file (%s)", GLOBAL_PARTNER_PARAMETERS_NAME, e.getMessage()); + globalParameters.partnerParameters = null; } } @@ -2735,30 +2735,30 @@ private void teardownAttributionS() { } } - private void writeSessionCallbackParametersI() { - synchronized (SessionParameters.class) { - if (sessionParameters == null) { + private void writeGlobalCallbackParametersI() { + synchronized (GlobalParameters.class) { + if (globalParameters == null) { return; } - Util.writeObject(sessionParameters.callbackParameters, adjustConfig.context, SESSION_CALLBACK_PARAMETERS_FILENAME, SESSION_CALLBACK_PARAMETERS_NAME); + Util.writeObject(globalParameters.callbackParameters, adjustConfig.context, GLOBAL_CALLBACK_PARAMETERS_FILENAME, GLOBAL_CALLBACK_PARAMETERS_NAME); } } - private void writeSessionPartnerParametersI() { - synchronized (SessionParameters.class) { - if (sessionParameters == null) { + private void writeGlobalPartnerParametersI() { + synchronized (GlobalParameters.class) { + if (globalParameters == null) { return; } - Util.writeObject(sessionParameters.partnerParameters, adjustConfig.context, SESSION_PARTNER_PARAMETERS_FILENAME, SESSION_PARTNER_PARAMETERS_NAME); + Util.writeObject(globalParameters.partnerParameters, adjustConfig.context, GLOBAL_PARTNER_PARAMETERS_FILENAME, GLOBAL_PARTNER_PARAMETERS_NAME); } } - private void teardownAllSessionParametersS() { - synchronized (SessionParameters.class) { - if (sessionParameters == null) { + private void teardownAllGlobalParametersS() { + synchronized (GlobalParameters.class) { + if (globalParameters == null) { return; } - sessionParameters = null; + globalParameters = null; } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 370103997..e937d886b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -176,9 +176,9 @@ public static void sendFirstPackages() { * @param key Global callback parameter key * @param value Global callback parameter value */ - public static void addSessionCallbackParameter(String key, String value) { + public static void addGlobalCallbackParameter(String key, String value) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.addSessionCallbackParameter(key, value); + adjustInstance.addGlobalCallbackParameter(key, value); } /** @@ -187,9 +187,9 @@ public static void addSessionCallbackParameter(String key, String value) { * @param key Global partner parameter key * @param value Global partner parameter value */ - public static void addSessionPartnerParameter(String key, String value) { + public static void addGlobalPartnerParameter(String key, String value) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.addSessionPartnerParameter(key, value); + adjustInstance.addGlobalPartnerParameter(key, value); } /** @@ -197,9 +197,9 @@ public static void addSessionPartnerParameter(String key, String value) { * * @param key Global callback parameter key */ - public static void removeSessionCallbackParameter(String key) { + public static void removeGlobalCallbackParameter(String key) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.removeSessionCallbackParameter(key); + adjustInstance.removeGlobalCallbackParameter(key); } /** @@ -207,25 +207,25 @@ public static void removeSessionCallbackParameter(String key) { * * @param key Global partner parameter key */ - public static void removeSessionPartnerParameter(String key) { + public static void removeGlobalPartnerParameter(String key) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.removeSessionPartnerParameter(key); + adjustInstance.removeGlobalPartnerParameter(key); } /** * Called to remove all added global callback parameters. */ - public static void resetSessionCallbackParameters() { + public static void resetGlobalCallbackParameters() { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.resetSessionCallbackParameters(); + adjustInstance.resetGlobalCallbackParameters(); } /** * Called to remove all added global partner parameters. */ - public static void resetSessionPartnerParameters() { + public static void resetGlobalPartnerParameters() { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.resetSessionPartnerParameters(); + adjustInstance.resetGlobalPartnerParameters(); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index aa74c6831..ec21ba376 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -297,16 +297,16 @@ public void sendFirstPackages() { * @param key Global callback parameter key * @param value Global callback parameter value */ - public void addSessionCallbackParameter(final String key, final String value) { - if (checkActivityHandler("adding session callback parameter", true)) { - activityHandler.addSessionCallbackParameter(key, value); + public void addGlobalCallbackParameter(final String key, final String value) { + if (checkActivityHandler("adding global callback parameter", true)) { + activityHandler.addGlobalCallbackParameter(key, value); return; } preLaunchActions.preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(final ActivityHandler activityHandler) { - activityHandler.addSessionCallbackParameterI(key, value); + activityHandler.addGlobalCallbackParameterI(key, value); } }); } @@ -317,15 +317,15 @@ public void run(final ActivityHandler activityHandler) { * @param key Global partner parameter key * @param value Global partner parameter value */ - public void addSessionPartnerParameter(final String key, final String value) { - if (checkActivityHandler("adding session partner parameter", true)) { - activityHandler.addSessionPartnerParameter(key, value); + public void addGlobalPartnerParameter(final String key, final String value) { + if (checkActivityHandler("adding global partner parameter", true)) { + activityHandler.addGlobalPartnerParameter(key, value); return; } preLaunchActions.preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(final ActivityHandler activityHandler) { - activityHandler.addSessionPartnerParameterI(key, value); + activityHandler.addGlobalPartnerParameterI(key, value); } }); } @@ -335,15 +335,15 @@ public void run(final ActivityHandler activityHandler) { * * @param key Global callback parameter key */ - public void removeSessionCallbackParameter(final String key) { - if (checkActivityHandler("removing session callback parameter", true)) { - activityHandler.removeSessionCallbackParameter(key); + public void removeGlobalCallbackParameter(final String key) { + if (checkActivityHandler("removing global callback parameter", true)) { + activityHandler.removeGlobalCallbackParameter(key); return; } preLaunchActions.preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(final ActivityHandler activityHandler) { - activityHandler.removeSessionCallbackParameterI(key); + activityHandler.removeGlobalCallbackParameterI(key); } }); } @@ -353,15 +353,15 @@ public void run(final ActivityHandler activityHandler) { * * @param key Global partner parameter key */ - public void removeSessionPartnerParameter(final String key) { - if (checkActivityHandler("removing session partner parameter", true)) { - activityHandler.removeSessionPartnerParameter(key); + public void removeGlobalPartnerParameter(final String key) { + if (checkActivityHandler("removing global partner parameter", true)) { + activityHandler.removeGlobalPartnerParameter(key); return; } preLaunchActions.preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(final ActivityHandler activityHandler) { - activityHandler.removeSessionPartnerParameterI(key); + activityHandler.removeGlobalPartnerParameterI(key); } }); } @@ -369,15 +369,15 @@ public void run(final ActivityHandler activityHandler) { /** * Called to remove all added global callback parameters. */ - public void resetSessionCallbackParameters() { - if (checkActivityHandler("resetting session callback parameters", true)) { - activityHandler.resetSessionCallbackParameters(); + public void resetGlobalCallbackParameters() { + if (checkActivityHandler("resetting global callback parameters", true)) { + activityHandler.resetGlobalCallbackParameters(); return; } preLaunchActions.preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(final ActivityHandler activityHandler) { - activityHandler.resetSessionCallbackParametersI(); + activityHandler.resetGlobalCallbackParametersI(); } }); } @@ -385,15 +385,15 @@ public void run(final ActivityHandler activityHandler) { /** * Called to remove all added global partner parameters. */ - public void resetSessionPartnerParameters() { - if (checkActivityHandler("resetting session partner parameters", true)) { - activityHandler.resetSessionPartnerParameters(); + public void resetGlobalPartnerParameters() { + if (checkActivityHandler("resetting global partner parameters", true)) { + activityHandler.resetGlobalPartnerParameters(); return; } preLaunchActions.preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(final ActivityHandler activityHandler) { - activityHandler.resetSessionPartnerParametersI(); + activityHandler.resetGlobalPartnerParametersI(); } }); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java index 407429ba4..bc5b4539c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java @@ -19,7 +19,6 @@ import java.lang.ref.WeakReference; import java.util.HashMap; -import java.util.List; import java.util.Map; public class AttributionHandler implements IAttributionHandler, @@ -261,7 +260,7 @@ private ActivityPackage buildAndGetAttributionPackage(ActivityHandler.InternalSt activityHandler.getAdjustConfig(), activityHandler.getDeviceInfo(), activityHandler.getActivityState(), - activityHandler.getSessionParameters(), + activityHandler.getGlobalParameters(), now); packageBuilder.internalState = internalState; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 73014ce18..571153fbc 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -47,8 +47,8 @@ public interface Constants { String ACTIVITY_STATE_FILENAME = "AdjustIoActivityState"; String ATTRIBUTION_FILENAME = "AdjustAttribution"; - String SESSION_CALLBACK_PARAMETERS_FILENAME = "AdjustSessionCallbackParameters"; - String SESSION_PARTNER_PARAMETERS_FILENAME = "AdjustSessionPartnerParameters"; + String GLOBAL_CALLBACK_PARAMETERS_FILENAME = "AdjustGlobalCallbackParameters"; + String GLOBAL_PARTNER_PARAMETERS_FILENAME = "AdjustGlobalPartnerParameters"; String MALFORMED = "malformed"; String SMALL = "small"; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SessionParameters.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/GlobalParameters.java similarity index 53% rename from Adjust/sdk-core/src/main/java/com/adjust/sdk/SessionParameters.java rename to Adjust/sdk-core/src/main/java/com/adjust/sdk/GlobalParameters.java index a49a81912..71f300dc9 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SessionParameters.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/GlobalParameters.java @@ -6,7 +6,7 @@ /** * Created by pfms on 29/07/2016. */ -public class SessionParameters { +public class GlobalParameters { Map callbackParameters; Map partnerParameters; @@ -15,10 +15,10 @@ public boolean equals(Object other) { if (other == this) return true; if (other == null) return false; if (getClass() != other.getClass()) return false; - SessionParameters otherSessionParameters = (SessionParameters) other; + GlobalParameters otherGlobalParameters = (GlobalParameters) other; - if (!Util.equalObject(callbackParameters, otherSessionParameters.callbackParameters)) return false; - if (!Util.equalObject(partnerParameters, otherSessionParameters.partnerParameters)) return false; + if (!Util.equalObject(callbackParameters, otherGlobalParameters.callbackParameters)) return false; + if (!Util.equalObject(partnerParameters, otherGlobalParameters.partnerParameters)) return false; return true; } @@ -31,14 +31,14 @@ public int hashCode() { return hashCode; } - public SessionParameters deepCopy() { - SessionParameters newSessionParameters = new SessionParameters(); + public GlobalParameters deepCopy() { + GlobalParameters newGlobalParameters = new GlobalParameters(); if (this.callbackParameters != null) { - newSessionParameters.callbackParameters = new HashMap(this.callbackParameters); + newGlobalParameters.callbackParameters = new HashMap(this.callbackParameters); } if (this.partnerParameters != null) { - newSessionParameters.partnerParameters = new HashMap(this.partnerParameters); + newGlobalParameters.partnerParameters = new HashMap(this.partnerParameters); } - return newSessionParameters; + return newGlobalParameters; } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 0f58737ee..85128cb62 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -3,8 +3,6 @@ import android.content.Context; import android.net.Uri; -import org.json.JSONObject; - /** * Created by pfms on 15/12/14. */ @@ -51,17 +49,17 @@ public interface IActivityHandler { void sendFirstPackages(); - void addSessionCallbackParameter(String key, String value); + void addGlobalCallbackParameter(String key, String value); - void addSessionPartnerParameter(String key, String value); + void addGlobalPartnerParameter(String key, String value); - void removeSessionCallbackParameter(String key); + void removeGlobalCallbackParameter(String key); - void removeSessionPartnerParameter(String key); + void removeGlobalPartnerParameter(String key); - void resetSessionCallbackParameters(); + void resetGlobalCallbackParameters(); - void resetSessionPartnerParameters(); + void resetGlobalPartnerParameters(); void teardown(); @@ -95,7 +93,7 @@ public interface IActivityHandler { ActivityState getActivityState(); - SessionParameters getSessionParameters(); + GlobalParameters getGlobalParameters(); ActivityHandler.InternalState getInternalState(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IPackageHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IPackageHandler.java index 46ab4d532..dd137b051 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IPackageHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IPackageHandler.java @@ -18,7 +18,7 @@ void init(IActivityHandler activityHandler, void resumeSending(); - void updatePackages(SessionParameters sessionParameters); + void updatePackages(GlobalParameters globalParameters); void flush(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 908e0bfb8..951cfe020 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -22,7 +22,7 @@ public class PackageBuilder { private DeviceInfo deviceInfo; private AdjustConfig adjustConfig; private ActivityStateCopy activityStateCopy; - private SessionParameters sessionParameters; + private GlobalParameters globalParameters; long clickTimeInSeconds = -1; long clickTimeInMilliseconds = -1; @@ -74,13 +74,13 @@ static class ActivityStateCopy { PackageBuilder(AdjustConfig adjustConfig, DeviceInfo deviceInfo, ActivityState activityState, - SessionParameters sessionParameters, + GlobalParameters globalParameters, long createdAt) { this.createdAt = createdAt; this.deviceInfo = deviceInfo; this.adjustConfig = adjustConfig; this.activityStateCopy = new ActivityStateCopy(activityState); - this.sessionParameters = sessionParameters; + this.globalParameters = globalParameters; SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(adjustConfig.context); @@ -243,8 +243,8 @@ private Map getSessionParameters(boolean isInDelay) { // Callback and partner parameters. if (!isInDelay) { - PackageBuilder.addMapJson(parameters, "callback_params", this.sessionParameters.callbackParameters); - PackageBuilder.addMapJson(parameters, "partner_params", this.sessionParameters.partnerParameters); + PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); + PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); } // Device identifiers. @@ -333,8 +333,8 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel // Callback and partner parameters. if (!isInDelay) { - PackageBuilder.addMapJson(parameters, "callback_params", Util.mergeParameters(this.sessionParameters.callbackParameters, event.callbackParameters, "Callback")); - PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.sessionParameters.partnerParameters, event.partnerParameters, "Partner")); + PackageBuilder.addMapJson(parameters, "callback_params", Util.mergeParameters(this.globalParameters.callbackParameters, event.callbackParameters, "Callback")); + PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.globalParameters.partnerParameters, event.partnerParameters, "Partner")); } // Device identifiers. @@ -510,7 +510,7 @@ private Map getClickParameters(String source) { PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); - PackageBuilder.addMapJson(parameters, "callback_params", this.sessionParameters.callbackParameters); + PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); PackageBuilder.addDateInMilliseconds(parameters, "click_time", clickTimeInMilliseconds); PackageBuilder.addDateInSeconds(parameters, "click_time", clickTimeInSeconds); PackageBuilder.addDateInSeconds(parameters, "click_time_server", clickTimeServerInSeconds); @@ -547,7 +547,7 @@ private Map getClickParameters(String source) { PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addMapJson(parameters, "params", extraParameters); - PackageBuilder.addMapJson(parameters, "partner_params", this.sessionParameters.partnerParameters); + PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "raw_referrer", rawReferrer); PackageBuilder.addString(parameters, "referrer", referrer); @@ -942,8 +942,8 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven // Callback and partner parameters. if (!isInDelay) { - PackageBuilder.addMapJson(parameters, "callback_params", Util.mergeParameters(this.sessionParameters.callbackParameters, adjustAdRevenue.callbackParameters, "Callback")); - PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.sessionParameters.partnerParameters, adjustAdRevenue.partnerParameters, "Partner")); + PackageBuilder.addMapJson(parameters, "callback_params", Util.mergeParameters(this.globalParameters.callbackParameters, adjustAdRevenue.callbackParameters, "Callback")); + PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.globalParameters.partnerParameters, adjustAdRevenue.partnerParameters, "Partner")); } // Device identifiers. @@ -1057,8 +1057,8 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio // Callback and partner parameters. if (!isInDelay) { - PackageBuilder.addMapJson(parameters, "callback_params", Util.mergeParameters(this.sessionParameters.callbackParameters, subscription.getCallbackParameters(), "Callback")); - PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.sessionParameters.partnerParameters, subscription.getPartnerParameters(), "Partner")); + PackageBuilder.addMapJson(parameters, "callback_params", Util.mergeParameters(this.globalParameters.callbackParameters, subscription.getCallbackParameters(), "Callback")); + PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.globalParameters.partnerParameters, subscription.getPartnerParameters(), "Partner")); } // Rest of the parameters. diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java index 568529575..84e124186 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java @@ -20,11 +20,11 @@ public class PackageFactory { private static final String ADJUST_PREFIX = "adjust_"; public static ActivityPackage buildReftagSdkClickPackage(final String rawReferrer, - final long clickTime, - final ActivityState activityState, - final AdjustConfig adjustConfig, - final DeviceInfo deviceInfo, - final SessionParameters sessionParameters, + final long clickTime, + final ActivityState activityState, + final AdjustConfig adjustConfig, + final DeviceInfo deviceInfo, + final GlobalParameters globalParameters, final ActivityHandler.InternalState internalState) { if (rawReferrer == null || rawReferrer.length() == 0) { return null; @@ -57,7 +57,7 @@ public static ActivityPackage buildReftagSdkClickPackage(final String rawReferre activityState, adjustConfig, deviceInfo, - sessionParameters, + globalParameters, internalState); if (clickPackageBuilder == null) { @@ -78,7 +78,7 @@ public static ActivityPackage buildDeeplinkSdkClickPackage(final Uri url, final ActivityState activityState, final AdjustConfig adjustConfig, final DeviceInfo deviceInfo, - final SessionParameters sessionParameters, + final GlobalParameters globalParameters, final ActivityHandler.InternalState internalState) { if (url == null) { return null; @@ -117,7 +117,7 @@ public static ActivityPackage buildDeeplinkSdkClickPackage(final Uri url, activityState, adjustConfig, deviceInfo, - sessionParameters, + globalParameters, internalState); if (clickPackageBuilder == null) { @@ -137,7 +137,7 @@ public static ActivityPackage buildInstallReferrerSdkClickPackage(final Referrer final ActivityState activityState, final AdjustConfig adjustConfig, final DeviceInfo deviceInfo, - final SessionParameters sessionParameters, + final GlobalParameters globalParameters, final ActivityHandler.InternalState internalState) { long now = System.currentTimeMillis(); @@ -145,7 +145,7 @@ public static ActivityPackage buildInstallReferrerSdkClickPackage(final Referrer adjustConfig, deviceInfo, activityState, - sessionParameters, + globalParameters, now); clickPackageBuilder.internalState = internalState; @@ -169,7 +169,7 @@ public static ActivityPackage buildPreinstallSdkClickPackage(final String preins final ActivityState activityState, final AdjustConfig adjustConfig, final DeviceInfo deviceInfo, - final SessionParameters sessionParameters) { + final GlobalParameters globalParameters) { if (preinstallPayload == null || preinstallPayload.length() == 0) { return null; } @@ -180,7 +180,7 @@ public static ActivityPackage buildPreinstallSdkClickPackage(final String preins adjustConfig, deviceInfo, activityState, - sessionParameters, + globalParameters, now); clickPackageBuilder.preinstallPayload = preinstallPayload; @@ -196,7 +196,7 @@ private static PackageBuilder queryStringClickPackageBuilder( final ActivityState activityState, final AdjustConfig adjustConfig, final DeviceInfo deviceInfo, - final SessionParameters sessionParameters, + final GlobalParameters globalParameters, final ActivityHandler.InternalState internalState) { if (queryList == null) { return null; @@ -227,7 +227,7 @@ private static PackageBuilder queryStringClickPackageBuilder( adjustConfig, deviceInfo, activityState, - sessionParameters, + globalParameters, now); builder.internalState = internalState; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java index 59f81a57d..6b56061db 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java @@ -213,17 +213,17 @@ public void resumeSending() { } @Override - public void updatePackages(SessionParameters sessionParameters) { - final SessionParameters sessionParametersCopy; - if (sessionParameters != null) { - sessionParametersCopy = sessionParameters.deepCopy(); + public void updatePackages(GlobalParameters globalParameters) { + final GlobalParameters globalParametersCopy; + if (globalParameters != null) { + globalParametersCopy = globalParameters.deepCopy(); } else { - sessionParametersCopy = null; + globalParametersCopy = null; } scheduler.submit(new Runnable() { @Override public void run() { - updatePackagesI(sessionParametersCopy); + updatePackagesI(globalParametersCopy); } }); } @@ -322,25 +322,25 @@ private void sendNextI() { sendFirstI(); } - public void updatePackagesI(SessionParameters sessionParameters) { - if (sessionParameters == null) { + public void updatePackagesI(GlobalParameters globalParameters) { + if (globalParameters == null) { return; } logger.debug("Updating package handler queue"); - logger.verbose("Session callback parameters: %s", sessionParameters.callbackParameters); - logger.verbose("Session partner parameters: %s", sessionParameters.partnerParameters); + logger.verbose("Session callback parameters: %s", globalParameters.callbackParameters); + logger.verbose("Session partner parameters: %s", globalParameters.partnerParameters); for (ActivityPackage activityPackage : packageQueue) { Map parameters = activityPackage.getParameters(); // callback parameters - Map mergedCallbackParameters = Util.mergeParameters(sessionParameters.callbackParameters, + Map mergedCallbackParameters = Util.mergeParameters(globalParameters.callbackParameters, activityPackage.getCallbackParameters(), "Callback"); PackageBuilder.addMapJson(parameters, CALLBACK_PARAMETERS, mergedCallbackParameters); // partner parameters - Map mergedPartnerParameters = Util.mergeParameters(sessionParameters.partnerParameters, + Map mergedPartnerParameters = Util.mergeParameters(globalParameters.partnerParameters, activityPackage.getPartnerParameters(), "Partner"); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java index bf4b8db07..fa604a802 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -179,7 +179,7 @@ public void run() { activityHandler.getActivityState(), activityHandler.getAdjustConfig(), activityHandler.getDeviceInfo(), - activityHandler.getSessionParameters(), + activityHandler.getGlobalParameters(), activityHandler.getInternalState()); // Send referrer sdk_click package. @@ -217,7 +217,7 @@ public void run() { activityHandler.getActivityState(), activityHandler.getAdjustConfig(), activityHandler.getDeviceInfo(), - activityHandler.getSessionParameters()); + activityHandler.getGlobalParameters()); // Send preinstall info sdk_click package. sendSdkClick(sdkClickPackage); diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index e848097db..ec8e704ba 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -542,7 +542,7 @@ public void addSessionCallbackParameter(String key, String value) { if (!isInitialized()) { return; } - Adjust.addSessionCallbackParameter(key, value); + Adjust.addGlobalCallbackParameter(key, value); } @JavascriptInterface @@ -550,7 +550,7 @@ public void addSessionPartnerParameter(String key, String value) { if (!isInitialized()) { return; } - Adjust.addSessionPartnerParameter(key, value); + Adjust.addGlobalPartnerParameter(key, value); } @JavascriptInterface @@ -558,7 +558,7 @@ public void removeSessionCallbackParameter(String key) { if (!isInitialized()) { return; } - Adjust.removeSessionCallbackParameter(key); + Adjust.removeGlobalCallbackParameter(key); } @JavascriptInterface @@ -566,7 +566,7 @@ public void removeSessionPartnerParameter(String key) { if (!isInitialized()) { return; } - Adjust.removeSessionPartnerParameter(key); + Adjust.removeGlobalPartnerParameter(key); } @JavascriptInterface @@ -574,7 +574,7 @@ public void resetSessionCallbackParameters() { if (!isInitialized()) { return; } - Adjust.resetSessionCallbackParameters(); + Adjust.resetGlobalCallbackParameters(); } @JavascriptInterface @@ -582,7 +582,7 @@ public void resetSessionPartnerParameters() { if (!isInitialized()) { return; } - Adjust.resetSessionPartnerParameters(); + Adjust.resetGlobalPartnerParameters(); } @JavascriptInterface diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index acc9bcfd5..c2aab1743 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -32,9 +32,6 @@ import com.adjust.sdk.OnSessionTrackingSucceededListener; import com.adjust.test_options.TestConnectionOptions; -import org.json.JSONException; -import org.json.JSONObject; - import java.util.HashMap; import java.util.List; import java.util.Map; @@ -570,7 +567,7 @@ private void addSessionCallbackParameter() { for (int i = 0; i keys = command.parameters.get("key"); for (int i = 0; i keys = command.parameters.get("key"); for (int i = 0; i Date: Mon, 13 May 2024 18:53:58 +0200 Subject: [PATCH 145/540] style:clean up the comments of global parameters --- .../main/java/com/adjust/examples/GlobalApplication.java | 6 +++--- .../com/adjust/examples/keyboard/GlobalApplication.java | 6 +++--- .../src/main/java/com/adjust/examples/GlobalApplication.kt | 6 +++--- .../main/java/com/adjust/examples/GlobalApplication.java | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index a75f6546e..838a83854 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -121,20 +121,20 @@ public boolean launchReceivedDeeplink(Uri deeplink) { Adjust.addGlobalCallbackParameter("sc_foo", "sc_bar"); Adjust.addGlobalCallbackParameter("sc_key", "sc_value"); - // Add session partner parameters. + // Add global partner parameters. Adjust.addGlobalPartnerParameter("sp_foo", "sp_bar"); Adjust.addGlobalPartnerParameter("sp_key", "sp_value"); // Remove session callback parameters. Adjust.removeGlobalCallbackParameter("sc_foo"); - // Remove session partner parameters. + // Remove global partner parameters. Adjust.removeGlobalPartnerParameter("sp_key"); // Remove all session callback parameters. Adjust.resetGlobalCallbackParameters(); - // Remove all session partner parameters. + // Remove all global partner parameters. Adjust.resetGlobalPartnerParameters(); // Enable IMEI reading ONLY IF: diff --git a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java index 49ff34fa9..567bf4e85 100644 --- a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java +++ b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java @@ -113,20 +113,20 @@ public boolean launchReceivedDeeplink(Uri deeplink) { Adjust.addGlobalCallbackParameter("sc_foo", "sc_bar"); Adjust.addGlobalCallbackParameter("sc_key", "sc_value"); - // Add session partner parameters. + // Add global partner parameters. Adjust.addGlobalPartnerParameter("sp_foo", "sp_bar"); Adjust.addGlobalPartnerParameter("sp_key", "sp_value"); // Remove session callback parameters. Adjust.removeGlobalCallbackParameter("sc_foo"); - // Remove session partner parameters. + // Remove global partner parameters. Adjust.removeGlobalPartnerParameter("sp_key"); // Remove all session callback parameters. Adjust.resetGlobalCallbackParameters(); - // Remove all session partner parameters. + // Remove all global partner parameters. Adjust.resetGlobalPartnerParameters(); // Enable IMEI reading ONLY IF: diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt index d1bf3dbcd..77ba2b759 100644 --- a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt +++ b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt @@ -81,20 +81,20 @@ class GlobalApplication : Application() { Adjust.addGlobalCallbackParameter("sc_foo", "sc_bar") Adjust.addGlobalCallbackParameter("sc_key", "sc_value") - // Add session partner parameters. + // Add global partner parameters. Adjust.addGlobalPartnerParameter("sp_foo", "sp_bar") Adjust.addGlobalPartnerParameter("sp_key", "sp_value") // Remove session callback parameters. Adjust.removeGlobalCallbackParameter("sc_foo") - // Remove session partner parameters. + // Remove global partner parameters. Adjust.removeGlobalPartnerParameter("sp_key") // Remove all session callback parameters. Adjust.resetGlobalCallbackParameters() - // Remove all session partner parameters. + // Remove all global partner parameters. Adjust.resetGlobalPartnerParameters() // Enable IMEI reading ONLY IF: diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java index e88c8f466..bd39b240f 100755 --- a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java @@ -110,20 +110,20 @@ public boolean launchReceivedDeeplink(Uri deeplink) { Adjust.addGlobalCallbackParameter("sc_foo", "sc_bar"); Adjust.addGlobalCallbackParameter("sc_key", "sc_value"); - // Add session partner parameters. + // Add global partner parameters. Adjust.addGlobalPartnerParameter("sp_foo", "sp_bar"); Adjust.addGlobalPartnerParameter("sp_key", "sp_value"); // Remove session callback parameters. Adjust.removeGlobalCallbackParameter("sc_foo"); - // Remove session partner parameters. + // Remove global partner parameters. Adjust.removeGlobalPartnerParameter("sp_key"); // Remove all session callback parameters. Adjust.resetGlobalCallbackParameters(); - // Remove all session partner parameters. + // Remove all global partner parameters. Adjust.resetGlobalPartnerParameters(); // Initialise the adjust SDK. From c0c14c066a1ed1bd4881854781e0fac25b0484ae Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 17 May 2024 11:40:47 +0200 Subject: [PATCH 146/540] refac:rename reset* to remove to keep in synced with ios --- .../java/com/adjust/examples/GlobalApplication.java | 4 ++-- .../adjust/examples/keyboard/GlobalApplication.java | 4 ++-- .../java/com/adjust/examples/GlobalApplication.kt | 4 ++-- .../java/com/adjust/examples/GlobalApplication.java | 4 ++-- .../main/java/com/adjust/sdk/ActivityHandler.java | 12 ++++++------ .../src/main/java/com/adjust/sdk/Adjust.java | 8 ++++---- .../src/main/java/com/adjust/sdk/AdjustInstance.java | 12 ++++++------ .../main/java/com/adjust/sdk/IActivityHandler.java | 4 ++-- .../adjust/sdk/webbridge/AdjustBridgeInstance.java | 4 ++-- .../com/adjust/testapp/AdjustCommandExecutor.java | 4 ++-- 10 files changed, 30 insertions(+), 30 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 838a83854..992f3c149 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -132,10 +132,10 @@ public boolean launchReceivedDeeplink(Uri deeplink) { Adjust.removeGlobalPartnerParameter("sp_key"); // Remove all session callback parameters. - Adjust.resetGlobalCallbackParameters(); + Adjust.removeGlobalCallbackParameters(); // Remove all global partner parameters. - Adjust.resetGlobalPartnerParameters(); + Adjust.removeGlobalPartnerParameters(); // Enable IMEI reading ONLY IF: // - IMEI plugin is added to your app. diff --git a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java index 567bf4e85..165be0686 100644 --- a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java +++ b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java @@ -124,10 +124,10 @@ public boolean launchReceivedDeeplink(Uri deeplink) { Adjust.removeGlobalPartnerParameter("sp_key"); // Remove all session callback parameters. - Adjust.resetGlobalCallbackParameters(); + Adjust.removeGlobalCallbackParameters(); // Remove all global partner parameters. - Adjust.resetGlobalPartnerParameters(); + Adjust.removeGlobalPartnerParameters(); // Enable IMEI reading ONLY IF: // - IMEI plugin is added to your app. diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt index 77ba2b759..3bee6cd5d 100644 --- a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt +++ b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt @@ -92,10 +92,10 @@ class GlobalApplication : Application() { Adjust.removeGlobalPartnerParameter("sp_key") // Remove all session callback parameters. - Adjust.resetGlobalCallbackParameters() + Adjust.removeGlobalCallbackParameters() // Remove all global partner parameters. - Adjust.resetGlobalPartnerParameters() + Adjust.removeGlobalPartnerParameters() // Enable IMEI reading ONLY IF: // - IMEI plugin is added to your app. diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java index bd39b240f..9e64281c3 100755 --- a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java @@ -121,10 +121,10 @@ public boolean launchReceivedDeeplink(Uri deeplink) { Adjust.removeGlobalPartnerParameter("sp_key"); // Remove all session callback parameters. - Adjust.resetGlobalCallbackParameters(); + Adjust.removeGlobalCallbackParameters(); // Remove all global partner parameters. - Adjust.resetGlobalPartnerParameters(); + Adjust.removeGlobalPartnerParameters(); // Initialise the adjust SDK. Adjust.onCreate(config); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 664c9b7b2..d60c66c94 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -641,21 +641,21 @@ public void run() { } @Override - public void resetGlobalCallbackParameters() { + public void removeGlobalCallbackParameters() { executor.submit(new Runnable() { @Override public void run() { - resetGlobalCallbackParametersI(); + removeGlobalCallbackParametersI(); } }); } @Override - public void resetGlobalPartnerParameters() { + public void removeGlobalPartnerParameters() { executor.submit(new Runnable() { @Override public void run() { - resetGlobalPartnerParametersI(); + removeGlobalPartnerParametersI(); } }); } @@ -2393,7 +2393,7 @@ public void removeGlobalPartnerParameterI(String key) { writeGlobalPartnerParametersI(); } - public void resetGlobalCallbackParametersI() { + public void removeGlobalCallbackParametersI() { if (globalParameters.callbackParameters == null) { logger.warn("Session Callback parameters are not set"); } @@ -2403,7 +2403,7 @@ public void resetGlobalCallbackParametersI() { writeGlobalCallbackParametersI(); } - public void resetGlobalPartnerParametersI() { + public void removeGlobalPartnerParametersI() { if (globalParameters.partnerParameters == null) { logger.warn("Session Partner parameters are not set"); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index e937d886b..1006652c7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -215,17 +215,17 @@ public static void removeGlobalPartnerParameter(String key) { /** * Called to remove all added global callback parameters. */ - public static void resetGlobalCallbackParameters() { + public static void removeGlobalCallbackParameters() { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.resetGlobalCallbackParameters(); + adjustInstance.removeGlobalCallbackParameters(); } /** * Called to remove all added global partner parameters. */ - public static void resetGlobalPartnerParameters() { + public static void removeGlobalPartnerParameters() { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.resetGlobalPartnerParameters(); + adjustInstance.removeGlobalPartnerParameters(); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index ec21ba376..8dc575e3d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -369,15 +369,15 @@ public void run(final ActivityHandler activityHandler) { /** * Called to remove all added global callback parameters. */ - public void resetGlobalCallbackParameters() { + public void removeGlobalCallbackParameters() { if (checkActivityHandler("resetting global callback parameters", true)) { - activityHandler.resetGlobalCallbackParameters(); + activityHandler.removeGlobalCallbackParameters(); return; } preLaunchActions.preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(final ActivityHandler activityHandler) { - activityHandler.resetGlobalCallbackParametersI(); + activityHandler.removeGlobalCallbackParametersI(); } }); } @@ -385,15 +385,15 @@ public void run(final ActivityHandler activityHandler) { /** * Called to remove all added global partner parameters. */ - public void resetGlobalPartnerParameters() { + public void removeGlobalPartnerParameters() { if (checkActivityHandler("resetting global partner parameters", true)) { - activityHandler.resetGlobalPartnerParameters(); + activityHandler.removeGlobalPartnerParameters(); return; } preLaunchActions.preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(final ActivityHandler activityHandler) { - activityHandler.resetGlobalPartnerParametersI(); + activityHandler.removeGlobalPartnerParametersI(); } }); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 85128cb62..e2c122b5f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -57,9 +57,9 @@ public interface IActivityHandler { void removeGlobalPartnerParameter(String key); - void resetGlobalCallbackParameters(); + void removeGlobalCallbackParameters(); - void resetGlobalPartnerParameters(); + void removeGlobalPartnerParameters(); void teardown(); diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index ec8e704ba..66003cec2 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -574,7 +574,7 @@ public void resetSessionCallbackParameters() { if (!isInitialized()) { return; } - Adjust.resetGlobalCallbackParameters(); + Adjust.removeGlobalCallbackParameters(); } @JavascriptInterface @@ -582,7 +582,7 @@ public void resetSessionPartnerParameters() { if (!isInitialized()) { return; } - Adjust.resetGlobalPartnerParameters(); + Adjust.removeGlobalPartnerParameters(); } @JavascriptInterface diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index c2aab1743..9f4f3a502 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -604,11 +604,11 @@ private void removeSessionPartnerParameter() { } private void resetSessionCallbackParameters() { - Adjust.resetGlobalCallbackParameters(); + Adjust.removeGlobalCallbackParameters(); } private void resetSessionPartnerParameters() { - Adjust.resetGlobalPartnerParameters(); + Adjust.removeGlobalPartnerParameters(); } private void setPushToken() { From 456f7a99fb7ee61a51eb61082bfe06cf94a33ad4 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 22 May 2024 14:59:38 +0200 Subject: [PATCH 147/540] refac:rename session to global inside of AdjustBridgeInstance.java --- .../adjust/sdk/webbridge/AdjustBridgeInstance.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 66003cec2..39bee3bd4 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -538,7 +538,7 @@ public void sendFirstPackages() { } @JavascriptInterface - public void addSessionCallbackParameter(String key, String value) { + public void addGlobalCallbackParameter(String key, String value) { if (!isInitialized()) { return; } @@ -546,7 +546,7 @@ public void addSessionCallbackParameter(String key, String value) { } @JavascriptInterface - public void addSessionPartnerParameter(String key, String value) { + public void addGlobalPartnerParameter(String key, String value) { if (!isInitialized()) { return; } @@ -554,7 +554,7 @@ public void addSessionPartnerParameter(String key, String value) { } @JavascriptInterface - public void removeSessionCallbackParameter(String key) { + public void removeGlobalCallbackParameter(String key) { if (!isInitialized()) { return; } @@ -562,7 +562,7 @@ public void removeSessionCallbackParameter(String key) { } @JavascriptInterface - public void removeSessionPartnerParameter(String key) { + public void removeGlobalPartnerParameter(String key) { if (!isInitialized()) { return; } @@ -570,7 +570,7 @@ public void removeSessionPartnerParameter(String key) { } @JavascriptInterface - public void resetSessionCallbackParameters() { + public void resetGlobalCallbackParameters() { if (!isInitialized()) { return; } @@ -578,7 +578,7 @@ public void resetSessionCallbackParameters() { } @JavascriptInterface - public void resetSessionPartnerParameters() { + public void resetGlobalPartnerParameters() { if (!isInitialized()) { return; } From dde9ce1fb85a8767c2999de713a3f1e6a631c71d Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 22 May 2024 15:08:33 +0200 Subject: [PATCH 148/540] refac:rename session to global inside of Adjust.js - AdjustCommandExecutor.java and command_executor.js --- .../src/main/assets/adjust.js | 24 ++++++------- .../sdk/webbridge/AdjustBridgeInstance.java | 4 +-- .../adjust/testapp/AdjustCommandExecutor.java | 24 ++++++------- .../src/main/assets/command_executor.js | 36 +++++++++---------- 4 files changed, 44 insertions(+), 44 deletions(-) diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index 197192987..2edea921a 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -87,39 +87,39 @@ var Adjust = { } }, - addSessionCallbackParameter: function(key, value) { + addGlobalCallbackParameter: function(key, value) { if (AdjustBridge) { - AdjustBridge.addSessionCallbackParameter(key, value); + AdjustBridge.addGlobalCallbackParameter(key, value); } }, - addSessionPartnerParameter: function(key, value) { + addGlobalPartnerParameter: function(key, value) { if (AdjustBridge) { - AdjustBridge.addSessionPartnerParameter(key, value); + AdjustBridge.addGlobalPartnerParameter(key, value); } }, - removeSessionCallbackParameter: function(key) { + removeGlobalCallbackParameter: function(key) { if (AdjustBridge) { - AdjustBridge.removeSessionCallbackParameter(key); + AdjustBridge.removeGlobalCallbackParameter(key); } }, - removeSessionPartnerParameter: function(key) { + removeGlobalPartnerParameter: function(key) { if (AdjustBridge) { - AdjustBridge.removeSessionPartnerParameter(key); + AdjustBridge.removeGlobalPartnerParameter(key); } }, - resetSessionCallbackParameters: function() { + removeGlobalCallbackParameters: function() { if (AdjustBridge) { - AdjustBridge.resetSessionCallbackParameters(); + AdjustBridge.removeGlobalCallbackParameters(); } }, - resetSessionPartnerParameters: function() { + removeGlobalPartnerParameters: function() { if (AdjustBridge) { - AdjustBridge.resetSessionPartnerParameters(); + AdjustBridge.removeGlobalPartnerParameters(); } }, diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 39bee3bd4..93557017b 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -570,7 +570,7 @@ public void removeGlobalPartnerParameter(String key) { } @JavascriptInterface - public void resetGlobalCallbackParameters() { + public void removeGlobalCallbackParameters() { if (!isInitialized()) { return; } @@ -578,7 +578,7 @@ public void resetGlobalCallbackParameters() { } @JavascriptInterface - public void resetGlobalPartnerParameters() { + public void removeGlobalPartnerParameters() { if (!isInitialized()) { return; } diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 9f4f3a502..7a06e060d 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -74,12 +74,12 @@ public void executeCommand(final Command sentCommand) { case "setReferrer": setReferrer(); break; case "setOfflineMode": setOfflineMode(); break; case "sendFirstPackages": sendFirstPackages(); break; - case "addSessionCallbackParameter": addSessionCallbackParameter(); break; - case "addSessionPartnerParameter": addSessionPartnerParameter(); break; - case "removeSessionCallbackParameter": removeSessionCallbackParameter(); break; - case "removeSessionPartnerParameter": removeSessionPartnerParameter(); break; - case "resetSessionCallbackParameters": resetSessionCallbackParameters(); break; - case "resetSessionPartnerParameters": resetSessionPartnerParameters(); break; + case "addGlobalCallbackParameter": addGlobalCallbackParameter(); break; + case "addGlobalPartnerParameter": addGlobalPartnerParameter(); break; + case "removeGlobalCallbackParameter": removeGlobalCallbackParameter(); break; + case "removeGlobalPartnerParameter": removeGlobalPartnerParameter(); break; + case "removeGlobalCallbackParameters": removeGlobalCallbackParameters(); break; + case "removeGlobalPartnerParameters": removeGlobalPartnerParameters(); break; case "setPushToken": setPushToken(); break; // case "teardown": teardown(); break; case "openDeeplink": openDeeplink(); break; @@ -561,7 +561,7 @@ private void sendFirstPackages() { Adjust.sendFirstPackages(); } - private void addSessionCallbackParameter() { + private void addGlobalCallbackParameter() { if (command.containsParameter("KeyValue")) { List keyValuePairs = command.parameters.get("KeyValue"); for (int i = 0; i keyValuePairs = command.parameters.get("KeyValue"); for (int i = 0; i keys = command.parameters.get("key"); for (int i = 0; i keys = command.parameters.get("key"); for (int i = 0; i Date: Wed, 22 May 2024 15:30:03 +0200 Subject: [PATCH 149/540] refac:rename session to global for removeGlobalPartnerParameters in command_executor.js --- Adjust/test-app-webbridge/src/main/assets/command_executor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index 144789a70..170d85587 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -609,7 +609,7 @@ AdjustCommandExecutor.prototype.removeGlobalCallbackParameters = function(params }; AdjustCommandExecutor.prototype.removeGlobalPartnerParameters = function(params) { - Adjust.removeSessionPartnerParameters(); + Adjust.removeGlobalPartnerParameters(); }; AdjustCommandExecutor.prototype.setPushToken = function(params) { From 5e722e36964205164213b3f68dfe0d63c7cb3ddf Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 22 May 2024 09:07:10 +0200 Subject: [PATCH 150/540] refac: remove delay start feature --- .../adjust/examples/GlobalApplication.java | 6 - .../examples/keyboard/GlobalApplication.java | 6 - .../com/adjust/examples/GlobalApplication.kt | 6 - .../adjust/examples/GlobalApplication.java | 6 - .../java/com/adjust/sdk/ActivityHandler.java | 111 +----------------- .../src/main/java/com/adjust/sdk/Adjust.java | 19 --- .../java/com/adjust/sdk/AdjustConfig.java | 14 --- .../java/com/adjust/sdk/AdjustFactory.java | 9 -- .../java/com/adjust/sdk/AdjustInstance.java | 23 ---- .../java/com/adjust/sdk/IActivityHandler.java | 2 - .../java/com/adjust/sdk/PackageBuilder.java | 60 ++++------ .../src/main/assets/adjust.js | 6 - .../src/main/assets/adjust_config.js | 5 - .../sdk/webbridge/AdjustBridgeInstance.java | 15 --- .../adjust/testapp/AdjustCommandExecutor.java | 11 -- .../src/main/assets/command_executor.js | 11 -- 16 files changed, 29 insertions(+), 281 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 992f3c149..85e1da546 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -111,9 +111,6 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Enable event buffering. // config.setEventBufferingEnabled(true); - // Delay first session. - // config.setDelayStart(7); - // Allow tracking preinstall // config.setPreinstallTrackingEnabled(true); @@ -172,9 +169,6 @@ public void onFailure(String message) { } }); - // Abort delay for the first session introduced with setDelayStart method. - // Adjust.sendFirstPackages(); - // Register onResume and onPause events of all activities // for applications with minSdkVersion >= 14. registerActivityLifecycleCallbacks(new AdjustLifecycleCallbacks()); diff --git a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java index 165be0686..1cc5bf8a8 100644 --- a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java +++ b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java @@ -106,9 +106,6 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Enable event buffering. // config.setEventBufferingEnabled(true); - // Delay first session. - // config.setDelayStart(7); - // Add session callback parameters. Adjust.addGlobalCallbackParameter("sc_foo", "sc_bar"); Adjust.addGlobalCallbackParameter("sc_key", "sc_value"); @@ -142,9 +139,6 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Initialise the adjust SDK. Adjust.onCreate(config); - // Abort delay for the first session introduced with setDelayStart method. - // Adjust.sendFirstPackages(); - // Register onResume and onPause events of all activities // for applications with minSdkVersion >= 14. registerActivityLifecycleCallbacks(new AdjustLifecycleCallbacks()); diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt index 3bee6cd5d..a13bb6f67 100644 --- a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt +++ b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt @@ -71,9 +71,6 @@ class GlobalApplication : Application() { // Enable event buffering. // config.setEventBufferingEnabled(true); - // Delay first session. - // config.setDelayStart(7); - // Allow tracking preinstall // config.setPreinstallTrackingEnabled(true); @@ -110,9 +107,6 @@ class GlobalApplication : Application() { // Initialise the adjust SDK. Adjust.onCreate(config) - // Abort delay for the first session introduced with setDelayStart method. - // Adjust.sendFirstPackages(); - // Register onResume and onPause events of all activities // for applications with minSdkVersion >= 14. registerActivityLifecycleCallbacks(AdjustLifecycleCallbacks()) diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java index 9e64281c3..3c76809e1 100755 --- a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java @@ -103,9 +103,6 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Enable event buffering. // config.setEventBufferingEnabled(true); - // Delay first session. - // config.setDelayStart(7); - // Add session callback parameters. Adjust.addGlobalCallbackParameter("sc_foo", "sc_bar"); Adjust.addGlobalCallbackParameter("sc_key", "sc_value"); @@ -129,9 +126,6 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Initialise the adjust SDK. Adjust.onCreate(config); - // Abort delay for the first session introduced with setDelayStart method. - // Adjust.sendFirstPackages(); - // Register onResume and onPause events of all activities // for applications with minSdkVersion >= 14. registerActivityLifecycleCallbacks(new AdjustLifecycleCallbacks()); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index d60c66c94..5e45583d1 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -68,7 +68,6 @@ public class ActivityHandler implements IActivityHandler { private ILogger logger; private TimerCycle foregroundTimer; private TimerOnce backgroundTimer; - private TimerOnce delayStartTimer; private InternalState internalState; private String basePath; private String gdprPath; @@ -93,9 +92,6 @@ public void teardown() { if (foregroundTimer != null) { foregroundTimer.teardown(); } - if (delayStartTimer != null) { - delayStartTimer.teardown(); - } if (executor != null) { executor.teardown(); } @@ -129,7 +125,6 @@ public void teardown() { foregroundTimer = null; executor = null; backgroundTimer = null; - delayStartTimer = null; internalState = null; deviceInfo = null; adjustConfig = null; @@ -152,7 +147,6 @@ public class InternalState { boolean enabled; boolean offline; boolean background; - boolean delayStart; boolean updatePackages; boolean firstLaunch; boolean sessionResponseProcessed; @@ -183,14 +177,6 @@ public boolean isInForeground() { return !background; } - public boolean isInDelayedStart() { - return delayStart; - } - - public boolean isNotInDelayedStart() { - return !delayStart; - } - public boolean itHasToUpdatePackages() { return updatePackages; } @@ -237,8 +223,6 @@ private ActivityHandler(AdjustConfig adjustConfig) { internalState.offline = adjustConfig.startOffline; // in the background by default internalState.background = true; - // delay start not configured by default - internalState.delayStart = false; // does not need to update packages by default internalState.updatePackages = false; // does not have the session response by default @@ -327,8 +311,6 @@ public void onResume() { executor.submit(new Runnable() { @Override public void run() { - delayStartI(); - stopBackgroundTimerI(); startForegroundTimerI(); @@ -590,16 +572,6 @@ public void run() { }); } - @Override - public void sendFirstPackages () { - executor.submit(new Runnable() { - @Override - public void run() { - sendFirstPackagesI(); - } - }); - } - @Override public void addGlobalCallbackParameter(final String key, final String value) { executor.submit(new Runnable() { @@ -952,21 +924,6 @@ public void run() { }, BACKGROUND_TIMER_NAME); } - // configure delay start timer - if (internalState.hasFirstSdkStartNotOcurred() && - adjustConfig.delayStart != null && - adjustConfig.delayStart > 0.0) - { - logger.info("Delay start configured"); - internalState.delayStart = true; - delayStartTimer = new TimerOnce(new Runnable() { - @Override - public void run() { - sendFirstPackages(); - } - }, DELAY_START_TIMER_NAME); - } - IActivityPackageSender packageHandlerActivitySender = new ActivityPackageSender( adjustConfig.urlStrategy, @@ -1523,7 +1480,7 @@ private void trackEventI(AdjustEvent event) { PackageBuilder eventBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, globalParameters, now); eventBuilder.internalState = internalState; - ActivityPackage eventPackage = eventBuilder.buildEventPackage(event, internalState.isInDelayedStart()); + ActivityPackage eventPackage = eventBuilder.buildEventPackage(event); packageHandler.addPackage(eventPackage); if (adjustConfig.eventBufferingEnabled) { @@ -2163,7 +2120,7 @@ private void transferSessionPackageI(long now) { PackageBuilder builder = new PackageBuilder(adjustConfig, deviceInfo, activityState, globalParameters, now); builder.internalState = internalState; - ActivityPackage sessionPackage = builder.buildSessionPackage(internalState.isInDelayedStart()); + ActivityPackage sessionPackage = builder.buildSessionPackage(); packageHandler.addPackage(sessionPackage); packageHandler.sendFirstPackage(); } @@ -2229,63 +2186,6 @@ private void backgroundTimerFiredI() { } } - private void delayStartI() { - // it's not configured to start delayed or already finished - if (internalState.isNotInDelayedStart()) { - return; - } - - // the delay has already started - if (isToUpdatePackagesI()) { - return; - } - - // check against max start delay - double delayStartSeconds = adjustConfig.delayStart != null ? adjustConfig.delayStart : 0.0; - long maxDelayStartMilli = AdjustFactory.getMaxDelayStart(); - - long delayStartMilli = (long)(delayStartSeconds * 1000); - if (delayStartMilli > maxDelayStartMilli) { - double maxDelayStartSeconds = maxDelayStartMilli / 1000; - String delayStartFormatted = Util.SecondsDisplayFormat.format(delayStartSeconds); - String maxDelayStartFormatted = Util.SecondsDisplayFormat.format(maxDelayStartSeconds); - - logger.warn("Delay start of %s seconds bigger than max allowed value of %s seconds", delayStartFormatted, maxDelayStartFormatted); - delayStartMilli = maxDelayStartMilli; - delayStartSeconds = maxDelayStartSeconds; - } - - String delayStartFormatted = Util.SecondsDisplayFormat.format(delayStartSeconds); - logger.info("Waiting %s seconds before starting first session", delayStartFormatted); - - delayStartTimer.startIn(delayStartMilli); - - internalState.updatePackages = true; - - if (activityState != null) { - activityState.updatePackages = true; - writeActivityStateI(); - } - } - - private void sendFirstPackagesI() { - if (internalState.isNotInDelayedStart()) { - logger.info("Start delay expired or never configured"); - return; - } - - // update packages in queue - updatePackagesI(); - // no longer is in delay start - internalState.delayStart = false; - // cancel possible still running timer if it was called by user - delayStartTimer.cancel(); - // and release timer - delayStartTimer = null; - // update the status and try to send first package - updateHandlersStatusAndSendI(); - } - private void updatePackagesI() { // update activity packages packageHandler.updatePackages(globalParameters); @@ -2527,7 +2427,7 @@ private void trackAdRevenueI(AdjustAdRevenue adjustAdRevenue) { PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, globalParameters, now); packageBuilder.internalState = internalState; - ActivityPackage adRevenuePackage = packageBuilder.buildAdRevenuePackage(adjustAdRevenue, internalState.isInDelayedStart()); + ActivityPackage adRevenuePackage = packageBuilder.buildAdRevenuePackage(adjustAdRevenue); packageHandler.addPackage(adRevenuePackage); packageHandler.sendFirstPackage(); } @@ -2542,7 +2442,7 @@ private void trackSubscriptionI(final AdjustPlayStoreSubscription subscription) PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, globalParameters, now); packageBuilder.internalState = internalState; - ActivityPackage subscriptionPackage = packageBuilder.buildSubscriptionPackage(subscription, internalState.isInDelayedStart()); + ActivityPackage subscriptionPackage = packageBuilder.buildSubscriptionPackage(subscription); packageHandler.addPackage(subscriptionPackage); packageHandler.sendFirstPackage(); } @@ -2826,8 +2726,7 @@ private boolean pausedI(boolean sdkClickHandlerOnly) { } // other handlers are paused if either: return internalState.isOffline() || // it's offline - !isEnabledI() || // is disabled - internalState.isInDelayedStart(); // is in delayed start + !isEnabledI(); // is disabled } private boolean toSendI() { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 1006652c7..f41f5ef18 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -162,14 +162,6 @@ public static void setOfflineMode(boolean enabled) { adjustInstance.setOfflineMode(enabled); } - /** - * Called if SDK initialisation was delayed and you would like to stop waiting for timer. - */ - public static void sendFirstPackages() { - AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.sendFirstPackages(); - } - /** * Called to add global callback parameter that will be sent with each session and event. * @@ -228,17 +220,6 @@ public static void removeGlobalPartnerParameters() { adjustInstance.removeGlobalPartnerParameters(); } - /** - * Called to set user's push notifications token. - * - * @param token Push notifications token - * @deprecated use {@link #setPushToken(String, Context)} instead. - */ - public static void setPushToken(String token) { - AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.setPushToken(token); - } - /** * Called to set user's push notifications token. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 0a23e6f40..32ca6e657 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -27,7 +27,6 @@ public class AdjustConfig { OnSessionTrackingFailedListener onSessionTrackingFailedListener; OnDeeplinkResponseListener onDeeplinkResponseListener; boolean sendInBackground; - Double delayStart; AdjustInstance.PreLaunchActions preLaunchActions; ILogger logger; String pushToken; @@ -143,15 +142,6 @@ public void setOnDeeplinkResponseListener(OnDeeplinkResponseListener onDeeplinkR this.onDeeplinkResponseListener = onDeeplinkResponseListener; } - public void setDelayStart(double delayStart) { - this.delayStart = delayStart; - } - - @Deprecated - public void setReadMobileEquipmentIdentity(boolean readMobileEquipmentIdentity) { - logger.warn("This method has been deprecated and shouldn't be used anymore"); - } - public void setExternalDeviceId(String externalDeviceId) { this.externalDeviceId = externalDeviceId; } @@ -277,10 +267,6 @@ public boolean isSendInBackground() { return sendInBackground; } - public Double getDelayStart() { - return delayStart; - } - public AdjustInstance.PreLaunchActions getPreLaunchActions() { return preLaunchActions; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java index a6376bc73..923488819 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java @@ -24,7 +24,6 @@ public class AdjustFactory { private static BackoffStrategy sdkClickBackoffStrategy = null; private static BackoffStrategy packageHandlerBackoffStrategy = null; private static BackoffStrategy installSessionBackoffStrategy = null; - private static long maxDelayStart = -1; private static String baseUrl = null; private static String gdprUrl = null; private static String subscriptionUrl = null; @@ -172,13 +171,6 @@ public static IPurchaseVerificationHandler getPurchaseVerificationHandler( return purchaseVerificationHandler; } - public static long getMaxDelayStart() { - if (maxDelayStart == -1) { - return Constants.ONE_SECOND * 10; // 10 seconds - } - return maxDelayStart; - } - public static String getBaseUrl() { return AdjustFactory.baseUrl; } @@ -326,7 +318,6 @@ public static void teardown(Context context) { subsessionInterval = -1; sdkClickBackoffStrategy = null; packageHandlerBackoffStrategy = null; - maxDelayStart = -1; baseUrl = Constants.BASE_URL; gdprUrl = Constants.GDPR_URL; subscriptionUrl = Constants.SUBSCRIPTION_URL; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 8dc575e3d..e0fff0831 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -281,16 +281,6 @@ public void setOfflineMode(final boolean enabled) { } } - /** - * Called if SDK initialisation was delayed and you would like to stop waiting for timer. - */ - public void sendFirstPackages() { - if (!checkActivityHandler("sendFirstPackages")) { - return; - } - activityHandler.sendFirstPackages(); - } - /** * Called to add global callback parameter that will be sent with each session and event. * @@ -410,19 +400,6 @@ public void teardown() { activityHandler = null; } - /** - * Called to set user's push notifications token. - * - * @param token Push notifications token - */ - public void setPushToken(final String token) { - if (!checkActivityHandler("push token", true)) { - this.pushToken = token; - } else { - activityHandler.setPushToken(token, false); - } - } - /** * Called to set user's push notifications token. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index e2c122b5f..5cd61ff6e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -47,8 +47,6 @@ public interface IActivityHandler { void setAskingAttribution(boolean askingAttribution); - void sendFirstPackages(); - void addGlobalCallbackParameter(String key, String value); void addGlobalPartnerParameter(String key, String value); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 951cfe020..a0b8ab00c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -92,8 +92,8 @@ static class ActivityStateCopy { this.playStoreKidsAppEnabled = sharedPreferencesManager.getPlayStoreKidsApp(); } - ActivityPackage buildSessionPackage(boolean isInDelay) { - Map parameters = getSessionParameters(isInDelay); + ActivityPackage buildSessionPackage() { + Map parameters = getSessionParameters(); ActivityPackage sessionPackage = getDefaultActivityPackage(ActivityKind.SESSION); sessionPackage.setPath("/session"); sessionPackage.setSuffix(""); @@ -102,18 +102,16 @@ ActivityPackage buildSessionPackage(boolean isInDelay) { return sessionPackage; } - ActivityPackage buildEventPackage(AdjustEvent event, boolean isInDelay) { - Map parameters = getEventParameters(event, isInDelay); + ActivityPackage buildEventPackage(AdjustEvent event) { + Map parameters = getEventParameters(event); ActivityPackage eventPackage = getDefaultActivityPackage(ActivityKind.EVENT); eventPackage.setPath("/event"); eventPackage.setSuffix(getEventSuffix(event)); eventPackage.setParameters(parameters); - if (isInDelay) { - eventPackage.setCallbackParameters(event.callbackParameters); - eventPackage.setPartnerParameters(event.partnerParameters); - } + eventPackage.setCallbackParameters(event.callbackParameters); + eventPackage.setPartnerParameters(event.partnerParameters); return eventPackage; } @@ -189,24 +187,22 @@ ActivityPackage buildMeasurementConsentPackage(final boolean consentMeasurement) return activityPackage; } - ActivityPackage buildAdRevenuePackage(AdjustAdRevenue adjustAdRevenue, boolean isInDelay) { - Map parameters = getAdRevenueParameters(adjustAdRevenue, isInDelay); + ActivityPackage buildAdRevenuePackage(AdjustAdRevenue adjustAdRevenue) { + Map parameters = getAdRevenueParameters(adjustAdRevenue); ActivityPackage adRevenuePackage = getDefaultActivityPackage(ActivityKind.AD_REVENUE); adRevenuePackage.setPath("/ad_revenue"); adRevenuePackage.setSuffix(""); adRevenuePackage.setParameters(parameters); - if (isInDelay) { - adRevenuePackage.setCallbackParameters(adjustAdRevenue.callbackParameters); - adRevenuePackage.setPartnerParameters(adjustAdRevenue.partnerParameters); - } + adRevenuePackage.setCallbackParameters(adjustAdRevenue.callbackParameters); + adRevenuePackage.setPartnerParameters(adjustAdRevenue.partnerParameters); return adRevenuePackage; } - ActivityPackage buildSubscriptionPackage(AdjustPlayStoreSubscription subscription, boolean isInDelay) { - Map parameters = getSubscriptionParameters(subscription, isInDelay); + ActivityPackage buildSubscriptionPackage(AdjustPlayStoreSubscription subscription) { + Map parameters = getSubscriptionParameters(subscription); ActivityPackage subscriptionPackage = getDefaultActivityPackage(ActivityKind.SUBSCRIPTION); subscriptionPackage.setPath("/v2/purchase"); subscriptionPackage.setSuffix(""); @@ -226,7 +222,7 @@ ActivityPackage buildVerificationPackage(AdjustPurchase purchase, OnPurchaseVeri return purchaseVerificationPackage; } - private Map getSessionParameters(boolean isInDelay) { + private Map getSessionParameters() { Map parameters = new HashMap(); deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); @@ -242,10 +238,8 @@ private Map getSessionParameters(boolean isInDelay) { } // Callback and partner parameters. - if (!isInDelay) { - PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); - PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); - } + PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); + PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); // Device identifiers. deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); @@ -316,7 +310,7 @@ private Map getSessionParameters(boolean isInDelay) { return parameters; } - public Map getEventParameters(AdjustEvent event, boolean isInDelay) { + public Map getEventParameters(AdjustEvent event) { Map parameters = new HashMap(); deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); @@ -332,10 +326,8 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel } // Callback and partner parameters. - if (!isInDelay) { - PackageBuilder.addMapJson(parameters, "callback_params", Util.mergeParameters(this.globalParameters.callbackParameters, event.callbackParameters, "Callback")); - PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.globalParameters.partnerParameters, event.partnerParameters, "Partner")); - } + PackageBuilder.addMapJson(parameters, "callback_params", Util.mergeParameters(this.globalParameters.callbackParameters, event.callbackParameters, "Callback")); + PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.globalParameters.partnerParameters, event.partnerParameters, "Partner")); // Device identifiers. deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); @@ -925,7 +917,7 @@ private Map getAdRevenueParameters(String source, JSONObject adR return parameters; } - private Map getAdRevenueParameters(AdjustAdRevenue adjustAdRevenue, boolean isInDelay) { + private Map getAdRevenueParameters(AdjustAdRevenue adjustAdRevenue) { Map parameters = new HashMap(); deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); @@ -941,10 +933,8 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven } // Callback and partner parameters. - if (!isInDelay) { - PackageBuilder.addMapJson(parameters, "callback_params", Util.mergeParameters(this.globalParameters.callbackParameters, adjustAdRevenue.callbackParameters, "Callback")); - PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.globalParameters.partnerParameters, adjustAdRevenue.partnerParameters, "Partner")); - } + PackageBuilder.addMapJson(parameters, "callback_params", Util.mergeParameters(this.globalParameters.callbackParameters, adjustAdRevenue.callbackParameters, "Callback")); + PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.globalParameters.partnerParameters, adjustAdRevenue.partnerParameters, "Partner")); // Device identifiers. deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); @@ -1022,7 +1012,7 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven return parameters; } - private Map getSubscriptionParameters(AdjustPlayStoreSubscription subscription, boolean isInDelay) { + private Map getSubscriptionParameters(AdjustPlayStoreSubscription subscription) { Map parameters = new HashMap(); deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); @@ -1056,10 +1046,8 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio } // Callback and partner parameters. - if (!isInDelay) { - PackageBuilder.addMapJson(parameters, "callback_params", Util.mergeParameters(this.globalParameters.callbackParameters, subscription.getCallbackParameters(), "Callback")); - PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.globalParameters.partnerParameters, subscription.getPartnerParameters(), "Partner")); - } + PackageBuilder.addMapJson(parameters, "callback_params", Util.mergeParameters(this.globalParameters.callbackParameters, subscription.getCallbackParameters(), "Callback")); + PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.globalParameters.partnerParameters, subscription.getPartnerParameters(), "Partner")); // Rest of the parameters. PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index 2edea921a..366c41c42 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -81,12 +81,6 @@ var Adjust = { } }, - sendFirstPackages: function() { - if (AdjustBridge) { - AdjustBridge.sendFirstPackages(); - } - }, - addGlobalCallbackParameter: function(key, value) { if (AdjustBridge) { AdjustBridge.addGlobalCallbackParameter(key, value); diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js index 9a323db69..f65e3c21b 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -40,7 +40,6 @@ function AdjustConfig(appToken, environment, legacy) { this.openDeferredDeeplink = null; this.deferredDeeplinkCallbackName = null; this.deferredDeeplinkCallbackFunction = null; - this.delayStart = null; this.fbPixelDefaultEventToken = null; this.fbPixelMapping = []; this.urlStrategy = null; @@ -203,10 +202,6 @@ AdjustConfig.prototype.adjust_deferredDeeplinkCallback = function(deeplink) { } }; -AdjustConfig.prototype.setDelayStart = function(delayStart) { - this.delayStart = delayStart; -}; - AdjustConfig.prototype.setReadMobileEquipmentIdentity = function(readMobileEquipmentIdentity) {}; AdjustConfig.prototype.setFbPixelDefaultEventToken = function(fbPixelDefaultEventToken) { diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 93557017b..98b09149b 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -156,7 +156,6 @@ public void onCreate(String adjustConfigString) { Object sessionFailureCallbackNameField = jsonAdjustConfig.get("sessionFailureCallbackName"); Object openDeferredDeeplinkField = jsonAdjustConfig.get("openDeferredDeeplink"); Object deferredDeeplinkCallbackNameField = jsonAdjustConfig.get("deferredDeeplinkCallbackName"); - Object delayStartField = jsonAdjustConfig.get("delayStart"); Object fbPixelDefaultEventTokenField = jsonAdjustConfig.get("fbPixelDefaultEventToken"); Object fbPixelMappingField = jsonAdjustConfig.get("fbPixelMapping"); Object urlStrategyField = jsonAdjustConfig.get("urlStrategy"); @@ -313,12 +312,6 @@ public boolean launchReceivedDeeplink(Uri deeplink) { }); } - // Delay start - Double delayStart = AdjustBridgeUtil.fieldToDouble(delayStartField); - if (delayStart != null) { - adjustConfig.setDelayStart(delayStart); - } - // Check Pixel Default Event Token String fbPixelDefaultEventToken = AdjustBridgeUtil.fieldToString(fbPixelDefaultEventTokenField); if (fbPixelDefaultEventToken != null && this.facebookSDKJSInterface != null) { @@ -529,14 +522,6 @@ public void setOfflineMode(String isOfflineString) { } } - @JavascriptInterface - public void sendFirstPackages() { - if (!isInitialized()) { - return; - } - Adjust.sendFirstPackages(); - } - @JavascriptInterface public void addGlobalCallbackParameter(String key, String value) { if (!isInitialized()) { diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 7a06e060d..897d2f912 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -73,7 +73,6 @@ public void executeCommand(final Command sentCommand) { case "setEnabled": setEnabled(); break; case "setReferrer": setReferrer(); break; case "setOfflineMode": setOfflineMode(); break; - case "sendFirstPackages": sendFirstPackages(); break; case "addGlobalCallbackParameter": addGlobalCallbackParameter(); break; case "addGlobalPartnerParameter": addGlobalPartnerParameter(); break; case "removeGlobalCallbackParameter": removeGlobalCallbackParameter(); break; @@ -278,12 +277,6 @@ private void config() { // } - if (command.containsParameter("delayStart")) { - String delayStartS = command.getFirstParameterValue("delayStart"); - double delayStart = Double.parseDouble(delayStartS); - adjustConfig.setDelayStart(delayStart); - } - if (command.containsParameter("needsCost")) { String needsCostS = command.getFirstParameterValue("needsCost"); boolean needsCost = "true".equals(needsCostS); @@ -557,10 +550,6 @@ private void setOfflineMode() { Adjust.setOfflineMode(enabled); } - private void sendFirstPackages() { - Adjust.sendFirstPackages(); - } - private void addGlobalCallbackParameter() { if (command.containsParameter("KeyValue")) { List keyValuePairs = command.parameters.get("KeyValue"); diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index 170d85587..e05bc9fc9 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -122,7 +122,6 @@ AdjustCommandExecutor.prototype.executeCommand = function(command, idx) { case "setEnabled" : this.setEnabled(command.params); break; case "setReferrer" : this.setReferrer(command.params); break; case "setOfflineMode" : this.setOfflineMode(command.params); break; - case "sendFirstPackages" : this.sendFirstPackages(command.params); break; case "addGlobalCallbackParameter" : this.addGlobalCallbackParameter(command.params); break; case "addGlobalPartnerParameter" : this.addGlobalPartnerParameter(command.params); break; case "removeGlobalCallbackParameter" : this.removeGlobalCallbackParameter(command.params); break; @@ -297,12 +296,6 @@ AdjustCommandExecutor.prototype.config = function(params) { adjustConfig.setExternalDeviceId(externalDeviceId); } - if ('delayStart' in params) { - var delayStartS = getFirstParameterValue(params, 'delayStart'); - var delayStart = parseFloat(delayStartS); - adjustConfig.setDelayStart(delayStart); - } - if ('needsCost' in params) { var needsCostS = getFirstParameterValue(params, 'needsCost'); var needsCost = needsCostS == 'true'; @@ -519,10 +512,6 @@ AdjustCommandExecutor.prototype.setOfflineMode = function(params) { Adjust.setOfflineMode(enabled); }; -AdjustCommandExecutor.prototype.sendFirstPackages = function(params) { - Adjust.sendFirstPackages(); -}; - AdjustCommandExecutor.prototype.gdprForgetMe = function(params) { Adjust.gdprForgetMe(); } From fb2dbc88196f8bd08bc86c6539e28a5f5cd35402 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 22 May 2024 13:06:25 +0200 Subject: [PATCH 151/540] refac: clean up remainings of delay start logic --- .../java/com/adjust/sdk/ActivityHandler.java | 32 ------------- .../java/com/adjust/sdk/ActivityState.java | 7 --- .../java/com/adjust/sdk/IPackageHandler.java | 2 - .../java/com/adjust/sdk/PackageHandler.java | 46 ------------------- 4 files changed, 87 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 5e45583d1..f49068a4d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -147,7 +147,6 @@ public class InternalState { boolean enabled; boolean offline; boolean background; - boolean updatePackages; boolean firstLaunch; boolean sessionResponseProcessed; boolean firstSdkStart; @@ -177,10 +176,6 @@ public boolean isInForeground() { return !background; } - public boolean itHasToUpdatePackages() { - return updatePackages; - } - public boolean isFirstLaunch() { return firstLaunch; } @@ -223,8 +218,6 @@ private ActivityHandler(AdjustConfig adjustConfig) { internalState.offline = adjustConfig.startOffline; // in the background by default internalState.background = true; - // does not need to update packages by default - internalState.updatePackages = false; // does not have the session response by default internalState.sessionResponseProcessed = false; // does not have first start by default @@ -808,7 +801,6 @@ public void run(ActivityHandler activityHandler) { if (internalState.hasFirstSdkStartOcurred()) { internalState.enabled = activityState.enabled; - internalState.updatePackages = activityState.updatePackages; internalState.firstLaunch = false; } else { internalState.firstLaunch = true; // first launch if activity state is null @@ -984,10 +976,6 @@ public void run() { toSendI(true), purchaseVerificationHandlerActivitySender); - if (isToUpdatePackagesI()) { - updatePackagesI(); - } - installReferrer = new InstallReferrer(adjustConfig.context, new InstallReferrerReadListener() { @Override public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { @@ -1270,7 +1258,6 @@ private void startFirstSessionI() { activityState.resetSessionAttributes(now); activityState.enabled = internalState.isEnabled(); - activityState.updatePackages = internalState.itHasToUpdatePackages(); writeActivityStateI(); sharedPreferencesManager.removePushToken(); @@ -2186,25 +2173,6 @@ private void backgroundTimerFiredI() { } } - private void updatePackagesI() { - // update activity packages - packageHandler.updatePackages(globalParameters); - // no longer needs to update packages - internalState.updatePackages = false; - if (activityState != null) { - activityState.updatePackages = false; - writeActivityStateI(); - } - } - - private boolean isToUpdatePackagesI() { - if (activityState != null) { - return activityState.updatePackages; - } else { - return internalState.itHasToUpdatePackages(); - } - } - public void addGlobalCallbackParameterI(String key, String value) { if (!Util.isValidParameter(key, "key", "Global Callback")) return; if (!Util.isValidParameter(value, "value", "Global Callback")) return; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java index 35e3c6c0a..47910188d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java @@ -35,7 +35,6 @@ public class ActivityState implements Serializable, Cloneable { new ObjectStreamField("timeSpent", long.class), new ObjectStreamField("lastActivity", long.class), new ObjectStreamField("lastInterval", long.class), - new ObjectStreamField("updatePackages", boolean.class), new ObjectStreamField("orderIds", (Class>)(Class) LinkedList.class), new ObjectStreamField("pushToken", String.class), new ObjectStreamField("adid", String.class), @@ -88,8 +87,6 @@ public class ActivityState implements Serializable, Cloneable { protected long lastInterval; - protected boolean updatePackages; - protected LinkedList orderIds; protected String pushToken; @@ -143,7 +140,6 @@ protected ActivityState() { timeSpent = -1; // this information will be collected and attached to the next session lastActivity = -1; lastInterval = -1; - updatePackages = false; orderIds = null; pushToken = null; adid = null; @@ -234,7 +230,6 @@ public boolean equals(Object other) { if (!Util.equalLong(sessionLength, otherActivityState.sessionLength)) return false; if (!Util.equalLong(timeSpent, otherActivityState.timeSpent)) return false; if (!Util.equalLong(lastInterval, otherActivityState.lastInterval)) return false; - if (!Util.equalBoolean(updatePackages, otherActivityState.updatePackages)) return false; if (!Util.equalObject(orderIds, otherActivityState.orderIds)) return false; if (!Util.equalString(pushToken, otherActivityState.pushToken)) return false; if (!Util.equalString(adid, otherActivityState.adid)) return false; @@ -282,7 +277,6 @@ public int hashCode() { hashCode = Util.hashLong(sessionLength, hashCode); hashCode = Util.hashLong(timeSpent, hashCode); hashCode = Util.hashLong(lastInterval, hashCode); - hashCode = Util.hashBoolean(updatePackages, hashCode); hashCode = Util.hashObject(orderIds, hashCode); hashCode = Util.hashString(pushToken, hashCode); hashCode = Util.hashString(adid, hashCode); @@ -334,7 +328,6 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo isThirdPartySharingDisabledForCoppa = Util.readBooleanField(fields, "isThirdPartySharingDisabledForCoppa", false); askingAttribution = Util.readBooleanField(fields, "askingAttribution", false); - updatePackages = Util.readBooleanField(fields, "updatePackages", false); orderIds = Util.readObjectField(fields, "orderIds", null); pushToken = Util.readStringField(fields, "pushToken", null); adid = Util.readStringField(fields, "adid", null); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IPackageHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IPackageHandler.java index dd137b051..bd447e60b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IPackageHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IPackageHandler.java @@ -18,8 +18,6 @@ void init(IActivityHandler activityHandler, void resumeSending(); - void updatePackages(GlobalParameters globalParameters); - void flush(); void teardown(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java index 6b56061db..6d66f1950 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java @@ -22,8 +22,6 @@ import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; -import static com.adjust.sdk.Constants.CALLBACK_PARAMETERS; -import static com.adjust.sdk.Constants.PARTNER_PARAMETERS; // persistent public class PackageHandler implements IPackageHandler, @@ -212,22 +210,6 @@ public void resumeSending() { paused = false; } - @Override - public void updatePackages(GlobalParameters globalParameters) { - final GlobalParameters globalParametersCopy; - if (globalParameters != null) { - globalParametersCopy = globalParameters.deepCopy(); - } else { - globalParametersCopy = null; - } - scheduler.submit(new Runnable() { - @Override - public void run() { - updatePackagesI(globalParametersCopy); - } - }); - } - @Override public void flush() { scheduler.submit(new Runnable() { @@ -322,34 +304,6 @@ private void sendNextI() { sendFirstI(); } - public void updatePackagesI(GlobalParameters globalParameters) { - if (globalParameters == null) { - return; - } - - logger.debug("Updating package handler queue"); - logger.verbose("Session callback parameters: %s", globalParameters.callbackParameters); - logger.verbose("Session partner parameters: %s", globalParameters.partnerParameters); - - for (ActivityPackage activityPackage : packageQueue) { - Map parameters = activityPackage.getParameters(); - // callback parameters - Map mergedCallbackParameters = Util.mergeParameters(globalParameters.callbackParameters, - activityPackage.getCallbackParameters(), - "Callback"); - - PackageBuilder.addMapJson(parameters, CALLBACK_PARAMETERS, mergedCallbackParameters); - // partner parameters - Map mergedPartnerParameters = Util.mergeParameters(globalParameters.partnerParameters, - activityPackage.getPartnerParameters(), - "Partner"); - - PackageBuilder.addMapJson(parameters, PARTNER_PARAMETERS, mergedPartnerParameters); - } - - writePackageQueueI(); - } - private void flushI() { packageQueue.clear(); writePackageQueueI(); From d20f36dc628753e1fb9e7b1c9ea89f62acefa510 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 20 May 2024 14:56:02 +0200 Subject: [PATCH 152/540] chore: remove Trademob plugin support --- Adjust/sdk-plugin-trademob/.gitignore | 1 - Adjust/sdk-plugin-trademob/build.gradle | 214 ------------------ .../src/main/AndroidManifest.xml | 1 - .../adjust/sdk/trademob/AdjustTrademob.java | 128 ----------- .../com/adjust/sdk/trademob/TrademobItem.java | 13 -- Adjust/settings.gradle | 2 +- 6 files changed, 1 insertion(+), 358 deletions(-) delete mode 100644 Adjust/sdk-plugin-trademob/.gitignore delete mode 100644 Adjust/sdk-plugin-trademob/build.gradle delete mode 100644 Adjust/sdk-plugin-trademob/src/main/AndroidManifest.xml delete mode 100644 Adjust/sdk-plugin-trademob/src/main/java/com/adjust/sdk/trademob/AdjustTrademob.java delete mode 100644 Adjust/sdk-plugin-trademob/src/main/java/com/adjust/sdk/trademob/TrademobItem.java diff --git a/Adjust/sdk-plugin-trademob/.gitignore b/Adjust/sdk-plugin-trademob/.gitignore deleted file mode 100644 index 796b96d1c..000000000 --- a/Adjust/sdk-plugin-trademob/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/Adjust/sdk-plugin-trademob/build.gradle b/Adjust/sdk-plugin-trademob/build.gradle deleted file mode 100644 index c53e19ae6..000000000 --- a/Adjust/sdk-plugin-trademob/build.gradle +++ /dev/null @@ -1,214 +0,0 @@ -apply plugin: 'com.android.library' -apply plugin: 'maven-publish' -apply plugin: 'signing' - -repositories { - maven { - url "https://oss.sonatype.org/content/repositories/staging/" - } -} - -android { - compileSdk rootProject.ext.coreCompileSdkVersion - publishing { - multipleVariants { - allVariants() - withJavadocJar() - } - } - defaultConfig { - minSdkVersion rootProject.ext.coreMinSdkVersion - targetSdkVersion rootProject.ext.coreTargetSdkVersion - } - namespace 'com.adjust.sdk.trademob' -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - // Add SDK via module. - compileOnly project(':sdk-core') - // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.0' -} - -// read local properties -File localPropsFile = project.rootProject.file('local.properties') -if (localPropsFile.exists()) { - Properties p = new Properties() - new FileInputStream(localPropsFile).withCloseable { is -> - p.load(is) - } - p.each { name, value -> - ext[name] = value - } -} - -task adjustTrademobAndroidAar(type: Copy) { - dependsOn 'assembleRelease' - - from('build/outputs/aar/') - include 'sdk-plugin-trademob-release.aar' - destinationDir file('build/libs/') - rename 'sdk-plugin-trademob-release.aar', "${project.name}.aar" - -} - -task adjustTrademobAndroidJar(type: Jar) { - dependsOn 'compileReleaseJavaWithJavac' - - from('build/intermediates/javac/release/classes/') - archiveFileName = project.provider { "${project.name}.jar" } -} - - -task adjustTrademobAndroidSourcesJar(type: Jar) { - setArchiveClassifier('sources') - from android.sourceSets.main.java.srcDirs -} - -artifacts { - archives adjustTrademobAndroidJar - archives adjustTrademobAndroidSourcesJar -} - -afterEvaluate { - publishing { - publications { -/* - mavenAndroidTrademobJar(MavenPublication) { - customizePomForJar(pom) - groupId rootProject.ext.adjustGroupId - artifactId 'adjust-android-trademob' - version rootProject.ext.coreVersionName - - artifact adjustTrademobAndroidJar - artifact adjustTrademobAndroidSourcesJar - } -*/ - mavenAndroidTrademobAar(MavenPublication) { - customizePomForAar(pom) - groupId rootProject.ext.adjustGroupId - artifactId 'adjust-android-trademob' - version rootProject.ext.coreVersionName - - artifact("$buildDir/outputs/aar/sdk-plugin-trademob-release.aar") { - builtBy tasks.getByPath("adjustTrademobAndroidAar") - } - artifact adjustTrademobAndroidSourcesJar - } - } - - repositories { - maven { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" - if (project.hasProperty("sonatypeUsername")) { - credentials { - username sonatypeUsername - password sonatypePassword - } - } - } - } - } - signing { -// sign publishing.publications.mavenAndroidTrademobJar - sign publishing.publications.mavenAndroidTrademobAar - } -} - -def customizePomForJar(pom) { - pom.withXml { - def root = asNode() - - // Add all items necessary for maven central publication. - root.children().last() + { - resolveStrategy = Closure.DELEGATE_FIRST - description 'The Trademob plugin for Adjust SDK for Android' - name 'Adjust Android SDK Trademob plugin' - url 'https://github.com/adjust/android_sdk' - - organization { - name 'adjust GmbH' - url 'http://www.adjust.com' - } - licenses { - license { - name 'MIT License' - url 'http://www.opensource.org/licenses/mit-license.php' - } - } - scm { - url 'git@github.com:adjust/android_sdk.git' - connection 'scm:git:git@github.com:adjust/android_sdk.git' - developerConnection 'scm:git:git@github.com:adjust/android_sdk.git' - } - developers { - developer { - name 'Pedro Silva' - email 'pedro@adjust.com' - } - developer { - name 'Ugljesa Erceg' - email 'ugljesa@adjust.com' - } - } - } - } -} - -def customizePomForAar(pom) { - pom.withXml { - def root = asNode() - - // Add all items necessary for maven central publication. - root.children().last() + { - resolveStrategy = Closure.DELEGATE_FIRST - description 'The Trademob plugin for Adjust SDK for Android' - name 'Adjust Android SDK Trademob plugin' - url 'https://github.com/adjust/android_sdk' - - organization { - name 'adjust GmbH' - url 'http://www.adjust.com' - } - licenses { - license { - name 'MIT License' - url 'http://www.opensource.org/licenses/mit-license.php' - } - } - scm { - url 'git@github.com:adjust/android_sdk.git' - connection 'scm:git:git@github.com:adjust/android_sdk.git' - developerConnection 'scm:git:git@github.com:adjust/android_sdk.git' - } - developers { - developer { - name 'Pedro Silva' - email 'pedro@adjust.com' - } - developer { - name 'Ugljesa Erceg' - email 'ugljesa@adjust.com' - } - } - } - } -} - -model { -// tasks.generatePomFileForMavenAndroidTrademobJarPublication { -// destination = file("${project.buildDir}/generated-pom.xml") -// } - /* TODO check if/how to replace this tasks - tasks.publishMavenAndroidTrademobPublicationToMavenLocal { - dependsOn project.tasks.signArchives - } - tasks.publishMavenAndroidTrademobPublicationToMavenRepository { - dependsOn project.tasks.signArchives - } - */ - tasks.generatePomFileForMavenAndroidTrademobAarPublication { - destination = file("${project.buildDir}/generated-pom.xml") - } -} diff --git a/Adjust/sdk-plugin-trademob/src/main/AndroidManifest.xml b/Adjust/sdk-plugin-trademob/src/main/AndroidManifest.xml deleted file mode 100644 index 94cbbcfc3..000000000 --- a/Adjust/sdk-plugin-trademob/src/main/AndroidManifest.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Adjust/sdk-plugin-trademob/src/main/java/com/adjust/sdk/trademob/AdjustTrademob.java b/Adjust/sdk-plugin-trademob/src/main/java/com/adjust/sdk/trademob/AdjustTrademob.java deleted file mode 100644 index 26867ca88..000000000 --- a/Adjust/sdk-plugin-trademob/src/main/java/com/adjust/sdk/trademob/AdjustTrademob.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.adjust.sdk.trademob; - -import com.adjust.sdk.AdjustEvent; -import com.adjust.sdk.AdjustFactory; -import com.adjust.sdk.ILogger; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; - - -public class AdjustTrademob { - - private static int MAX_LISTING_ITEMS_COUNT = 5; - - private static ILogger logger = AdjustFactory.getLogger(); - - public static void injectViewItemIntoEvent(AdjustEvent event, String itemId, Map metadata) { - event.addPartnerParameter("tm_item", itemId); - String jsonMetadata = stringifyMetadata(metadata); - event.addPartnerParameter("tm_md", jsonMetadata); - } - - public static void injectViewListingIntoEvent(AdjustEvent event, List itemIds, Map metadata) { - String jsonItems = stringifyItemIds(itemIds); - event.addPartnerParameter("tm_item", jsonItems); - String jsonMetadata = stringifyMetadata(metadata); - event.addPartnerParameter("tm_md", jsonMetadata); - } - - public static void injectAddToBasketIntoEvent(AdjustEvent event, List items, Map metadata) { - String jsonMetadata = stringifyMetadata(metadata); - event.addPartnerParameter("tm_md", jsonMetadata); - String jsonItems = stringifyItems(items); - event.addPartnerParameter("tm_item", jsonItems); - } - - public static void injectCheckoutIntoEvent(AdjustEvent event, List items, Map metadata) { - String jsonMetadata = stringifyMetadata(metadata); - event.addPartnerParameter("tm_md", jsonMetadata); - String jsonItems = stringifyItems(items); - event.addPartnerParameter("tm_item", jsonItems); - } - - private static String stringifyItemIds(List itemIds) { - if (itemIds == null) { - logger.warn("TM View Listing item ids list is null. Empty ids array will be sent."); - itemIds = new ArrayList(); - } - StringBuffer tmViewList = new StringBuffer("["); - int itemsSize = itemIds.size(); - int i = 0; - - while (i < itemsSize) { - String itemId = itemIds.get(i); - String itemString = String.format(Locale.US, "\"%s\"", itemId); - tmViewList.append(itemString); - - i++; - - if (i == itemsSize || i >= MAX_LISTING_ITEMS_COUNT) { - break; - } - - tmViewList.append(","); - } - - tmViewList.append("]"); - - return tmViewList.toString(); - } - - private static String stringifyItems(List items) { - if (items == null) { - logger.warn("TM View Listing item ids list is empty. Empty items will be sent."); - items = new ArrayList(); - } - - StringBuffer itemsStrBuffer = new StringBuffer("["); - int itemsSize = items.size(); - - for (int i = 0; i < itemsSize; ) { - TrademobItem item = items.get(i); - String itemString = String.format(Locale.US, "{\"id\":\"%s\",\"price\":%f,\"quantity\":%d}", - item.itemId, - item.price, - item.quantity); - itemsStrBuffer.append(itemString); - - i++; - - if (i == itemsSize || i >= MAX_LISTING_ITEMS_COUNT) { - break; - } - - itemsStrBuffer.append(","); - } - - itemsStrBuffer.append("]"); - - return itemsStrBuffer.toString(); - } - - private static String stringifyMetadata(Map metadata) { - - if(null == metadata) { - return "{}"; - } - String res = "{"; - - Iterator> iterator = metadata.entrySet().iterator(); - - while(iterator.hasNext()) { - Map.Entry entry = iterator.next(); - String key = "\"".concat(entry.getKey()).concat("\""); - String value = "\"".concat(entry.getValue()).concat("\""); - res = res.concat(key).concat(":").concat(value); - - if (iterator.hasNext()) { - res = res.concat(","); - } - } - - return res.concat("}"); - } -} diff --git a/Adjust/sdk-plugin-trademob/src/main/java/com/adjust/sdk/trademob/TrademobItem.java b/Adjust/sdk-plugin-trademob/src/main/java/com/adjust/sdk/trademob/TrademobItem.java deleted file mode 100644 index 483c1a334..000000000 --- a/Adjust/sdk-plugin-trademob/src/main/java/com/adjust/sdk/trademob/TrademobItem.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.adjust.sdk.trademob; - -public class TrademobItem { - float price; - int quantity; - String itemId; - - public TrademobItem(String itemId, int quantity, float price) { - this.price = price; - this.quantity = quantity; - this.itemId = itemId; - } -} diff --git a/Adjust/settings.gradle b/Adjust/settings.gradle index e72702e56..26181006b 100644 --- a/Adjust/settings.gradle +++ b/Adjust/settings.gradle @@ -1,3 +1,3 @@ -include ':sdk-core', ':sdk-plugin-webbridge', ':sdk-plugin-oaid', ':sdk-plugin-sociomantic', ':sdk-plugin-trademob', ':sdk-plugin-imei', ':sdk-plugin-criteo', ':sdk-plugin-xiaomi-referrer', ':sdk-plugin-samsung-referrer', ':sdk-plugin-vivo-referrer', ':sdk-plugin-samsung-clouddev', ':sdk-plugin-huawei-referrer', ':sdk-plugin-meta-referrer' +include ':sdk-core', ':sdk-plugin-webbridge', ':sdk-plugin-oaid', ':sdk-plugin-imei', ':sdk-plugin-xiaomi-referrer', ':sdk-plugin-samsung-referrer', ':sdk-plugin-vivo-referrer', ':sdk-plugin-samsung-clouddev', ':sdk-plugin-huawei-referrer', ':sdk-plugin-meta-referrer' include ':test-options', ':test-library', ':test-app-core', ':test-app-webbridge' include ':example-app-java', ':example-app-kotlin', ':example-app-tv', ':example-app-webbridge', ':example-app-fbpixel', ':example-app-keyboard' From 11c595b3cb873c40170aa41247fb7ed434e40fc8 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 20 May 2024 14:57:04 +0200 Subject: [PATCH 153/540] chore: remove Sociomantic plugin support --- Adjust/sdk-plugin-sociomantic/.gitignore | 1 - Adjust/sdk-plugin-sociomantic/build.gradle | 216 --------- .../src/main/AndroidManifest.xml | 1 - .../sdk/sociomantic/AdjustSociomantic.java | 425 ------------------ 4 files changed, 643 deletions(-) delete mode 100644 Adjust/sdk-plugin-sociomantic/.gitignore delete mode 100644 Adjust/sdk-plugin-sociomantic/build.gradle delete mode 100644 Adjust/sdk-plugin-sociomantic/src/main/AndroidManifest.xml delete mode 100644 Adjust/sdk-plugin-sociomantic/src/main/java/com/adjust/sdk/sociomantic/AdjustSociomantic.java diff --git a/Adjust/sdk-plugin-sociomantic/.gitignore b/Adjust/sdk-plugin-sociomantic/.gitignore deleted file mode 100644 index 796b96d1c..000000000 --- a/Adjust/sdk-plugin-sociomantic/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/Adjust/sdk-plugin-sociomantic/build.gradle b/Adjust/sdk-plugin-sociomantic/build.gradle deleted file mode 100644 index f3765c246..000000000 --- a/Adjust/sdk-plugin-sociomantic/build.gradle +++ /dev/null @@ -1,216 +0,0 @@ -apply plugin: 'com.android.library' -apply plugin: 'maven-publish' -apply plugin: 'signing' - -repositories { - maven { - url "https://oss.sonatype.org/content/repositories/staging/" - } -} - -android { - compileSdk rootProject.ext.coreCompileSdkVersion - publishing { - multipleVariants { - allVariants() - withJavadocJar() - } - } - defaultConfig { - minSdkVersion rootProject.ext.coreMinSdkVersion - targetSdkVersion rootProject.ext.coreTargetSdkVersion - } - namespace 'com.adjust.sdk.sociomantic' -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - // Add SDK via module. - compileOnly project(':sdk-core') - // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.0' -} - -// read local properties -File localPropsFile = project.rootProject.file('local.properties') -if (localPropsFile.exists()) { - Properties p = new Properties() - new FileInputStream(localPropsFile).withCloseable { is -> - p.load(is) - } - p.each { name, value -> - ext[name] = value - } -} - -task adjustSociomanticAndroidAar(type: Copy) { - dependsOn 'assembleRelease' - - from('build/outputs/aar/') - include 'sdk-plugin-sociomantic-release.aar' - destinationDir file('build/libs/') - rename 'sdk-plugin-sociomantic-release.aar', "${project.name}.aar" - -} - -task adjustSociomanticAndroidJar(type: Jar) { - dependsOn 'compileReleaseJavaWithJavac' - from('build/intermediates/javac/release/classes/') - archiveFileName = project.provider { "${project.name}.jar" } -} - -task adjustSociomanticAndroidSourcesJar(type: Jar) { - setArchiveClassifier('sources') - from android.sourceSets.main.java.srcDirs -} - -artifacts { - archives adjustSociomanticAndroidJar - archives adjustSociomanticAndroidSourcesJar -} - -afterEvaluate { - publishing { - publications { -/* - mavenAndroidSociomanticJar(MavenPublication) { - customizePomForJar(pom) - groupId rootProject.ext.adjustGroupId - artifactId 'adjust-android-sociomantic' - version rootProject.ext.coreVersionName - - artifact adjustSociomanticAndroidJar - artifact adjustSociomanticAndroidSourcesJar - } -*/ - mavenAndroidSociomanticAar(MavenPublication) { - customizePomForAar(pom) - groupId rootProject.ext.adjustGroupId - artifactId 'adjust-android-sociomantic' - version rootProject.ext.coreVersionName - - artifact("$buildDir/outputs/aar/sdk-plugin-sociomantic-release.aar") { - builtBy tasks.getByPath("adjustSociomanticAndroidAar") - } - artifact adjustSociomanticAndroidSourcesJar - } - } - - repositories { - maven { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" - if (project.hasProperty("sonatypeUsername")) { - credentials { - username sonatypeUsername - password sonatypePassword - } - } - } - } - } - signing { -// sign publishing.publications.mavenAndroidSociomanticJar - sign publishing.publications.mavenAndroidSociomanticAar - } -} - -def customizePomForJar(pom) { - pom.withXml { - def root = asNode() - - // Add all items necessary for maven central publication - root.children().last() + { - resolveStrategy = Closure.DELEGATE_FIRST - description 'The Sociomantic plugin for Adjust SDK for Android' - name 'Adjust Android SDK Sociomantic plugin' - url 'https://github.com/adjust/android_sdk' - - organization { - name 'adjust GmbH' - url 'http://www.adjust.com' - } - licenses { - license { - name 'MIT License' - url 'http://www.opensource.org/licenses/mit-license.php' - } - } - scm { - url 'git@github.com:adjust/android_sdk.git' - connection 'scm:git:git@github.com:adjust/android_sdk.git' - developerConnection 'scm:git:git@github.com:adjust/android_sdk.git' - } - developers { - developer { - name 'Pedro Silva' - email 'pedro@adjust.com' - } - - developer { - name 'Ugljesa Erceg' - email 'ugljesa@adjust.com' - } - } - } - } -} - -def customizePomForAar(pom) { - pom.withXml { - def root = asNode() - - // Add all items necessary for maven central publication - root.children().last() + { - resolveStrategy = Closure.DELEGATE_FIRST - description 'The Sociomantic plugin for Adjust SDK for Android' - name 'Adjust Android SDK Sociomantic plugin' - url 'https://github.com/adjust/android_sdk' - - organization { - name 'adjust GmbH' - url 'http://www.adjust.com' - } - licenses { - license { - name 'MIT License' - url 'http://www.opensource.org/licenses/mit-license.php' - } - } - scm { - url 'git@github.com:adjust/android_sdk.git' - connection 'scm:git:git@github.com:adjust/android_sdk.git' - developerConnection 'scm:git:git@github.com:adjust/android_sdk.git' - } - developers { - developer { - name 'Pedro Silva' - email 'pedro@adjust.com' - } - - developer { - name 'Ugljesa Erceg' - email 'ugljesa@adjust.com' - } - } - } - } -} - -model { -// tasks.generatePomFileForMavenAndroidSociomanticJarPublication { -// destination = file("${project.buildDir}/generated-pom.xml") -// } - /* TODO check if/how to replace this tasks - tasks.publishMavenAndroidSociomanticPublicationToMavenLocal { - dependsOn project.tasks.signArchives - } - tasks.publishMavenAndroidSociomanticPublicationToMavenRepository { - dependsOn project.tasks.signArchives - } - */ - tasks.generatePomFileForMavenAndroidSociomanticAarPublication { - destination = file("${project.buildDir}/generated-pom.xml") - } -} - - diff --git a/Adjust/sdk-plugin-sociomantic/src/main/AndroidManifest.xml b/Adjust/sdk-plugin-sociomantic/src/main/AndroidManifest.xml deleted file mode 100644 index 94cbbcfc3..000000000 --- a/Adjust/sdk-plugin-sociomantic/src/main/AndroidManifest.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Adjust/sdk-plugin-sociomantic/src/main/java/com/adjust/sdk/sociomantic/AdjustSociomantic.java b/Adjust/sdk-plugin-sociomantic/src/main/java/com/adjust/sdk/sociomantic/AdjustSociomantic.java deleted file mode 100644 index 0141861d6..000000000 --- a/Adjust/sdk-plugin-sociomantic/src/main/java/com/adjust/sdk/sociomantic/AdjustSociomantic.java +++ /dev/null @@ -1,425 +0,0 @@ -package com.adjust.sdk.sociomantic; - -import com.adjust.sdk.AdjustEvent; -import com.adjust.sdk.AdjustFactory; -import com.adjust.sdk.ILogger; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -/** - * AdjustSociomantic Class - * Created by Nicolas Brugneaux nicolas.brugneaux@sociomantic.com on 01/04/15. - */ -public abstract class AdjustSociomantic { - - public final static String SCMCategory = "category"; - public final static String SCMProducts = "products"; - public final static String SCMProductName = "fn"; - public final static String SCMSalePrice = "price"; - public final static String SCMAmount = "amount"; - public final static String SCMCurrency = "currency"; - public final static String SCMProductURL = "url"; - public final static String SCMProductImageURL = "photo"; - public final static String SCMBrand = "brand"; - public final static String SCMDescription = "description"; - public final static String SCMTimestamp = "date"; - public final static String SCMValidityTimestamp = "valid"; - public final static String SCMQuantity = "quantity"; - public final static String SCMScore = "score"; - public final static String SCMProductID = "identifier"; - public final static String SCMActionConfirmed = "confirmed"; - public final static String SCMCustomerAgeGroup = "agegroup"; - public final static String SCMCustomerEducation = "education"; - public final static String SCMCustomerGender = "gender"; - public final static String SCMCustomerID = "identifier"; - public final static String SCMCustomerMHash = "mhash"; - public final static String SCMCustomerSegment = "segment"; - public final static String SCMCustomerTargeting = "targeting"; - public final static String SCMTransaction = "transaction"; - - private final static List productAliases = Arrays.asList( - SCMCategory, - SCMProductName, - SCMSalePrice, - SCMAmount, - SCMCurrency, - SCMProductURL, - SCMProductImageURL, - SCMBrand, - SCMDescription, - SCMTimestamp, - SCMValidityTimestamp, - SCMQuantity, - SCMScore - ); - - private final static List basketAliases = Arrays.asList( - SCMProductID, - SCMAmount, - SCMCurrency, - SCMQuantity - ); - - private final static List saleAliases = Arrays.asList( - SCMAmount, - SCMCurrency - ); - - private final static List customerAliases = Arrays.asList( - SCMCustomerAgeGroup, - SCMCustomerEducation, - SCMCustomerGender, - SCMCustomerID, - SCMCustomerMHash, - SCMCustomerSegment, - SCMCustomerTargeting - ); - - private static String adpanId; - - private static ILogger logger = AdjustFactory.getLogger(); - - public static void injectPartnerIdInSociomanticEvents(String newAdpanId) { - adpanId = newAdpanId; - } - - public static void injectCustomerDataIntoEvent(AdjustEvent event, Map customerData) { - if (null == event) { - logger.error("Event object is required."); - return; - } - if (null == customerData) { - logger.error("Customer data is required."); - return; - } - - Map data = new HashMap(); - - for (Entry entry: customerData.entrySet()) { - if (!customerAliases.contains(entry.getKey())) { - logger.warn("Key must belong to the customer Aliases, entry: %s was discarded", entry.getKey()); - } - else { - data.put(entry.getKey(), entry.getValue()); - } - } - - String dob = stringify(data); - - addPartnerParameter(event, "socio_dob", dob); - } - - public static void injectHomePageIntoEvent(AdjustEvent event) { - if (null == event) { - logger.error("Event object is required."); - } - addPartnerParameter(event); - } - - public static void injectViewListingIntoEvent(AdjustEvent event, List categories) { - injectViewListingIntoEvent(event, categories, null); - } - public static void injectViewListingIntoEvent(AdjustEvent event, List categories, String date) { - if (null == event) { - logger.error("Event object is required."); - return; - } - if (null == categories) { - logger.error("Categories list is required."); - return; - } - - Map co = new HashMap(); - - if (null != date) { - co.put(SCMTimestamp, date); - } - - co.put(SCMCategory, categories); - - addPartnerParameter(event, "socio_co", stringify(co)); - } - - public static void injectProductIntoEvent(AdjustEvent event, String productId) { - injectProductIntoEvent(event, productId, null); - } - public static void injectProductIntoEvent(AdjustEvent event, String productId, Map parameters) { - if (null == event) { - logger.error("Event object is required."); - return; - } - if (null == productId || "".equals(productId)) { - logger.error("Product ID is required."); - return; - } - - Map>> po = new HashMap>>(1); - List> productList; - Map product; - - if (null != parameters) { - product = filter(parameters, productAliases); - } - else { - product = new HashMap(); - } - - product.put(SCMProductID, productId); - productList = Arrays.asList(product); - po.put(SCMProducts, productList); - addPartnerParameter(event, "socio_po", stringify(po)); - } - - public static void injectCartIntoEvent(AdjustEvent event, List products) { - if (null == event) { - logger.error("Event object is required."); - return; - } - if (null == products) { - logger.error("Products list is required."); - return; - } - - Map>> po = new HashMap>>(1); - List> productList = new ArrayList>(); - - for (Object product: products) { - Map _product = new HashMap(); - - if (product instanceof String) { - _product.put(SCMProductID, product); - } - else if (product instanceof Map) { - _product = filter((Map) product, basketAliases); - } - - if (!_product.isEmpty()) { - productList.add(_product); - } - } - - if (!productList.isEmpty()) { - po.put(SCMProducts, productList); - addPartnerParameter(event, "socio_po", stringify(po)); - } - } - - public static void injectConfirmedTransactionIntoEvent(AdjustEvent event, String transactionID, List products) { - injectTransactionIntoEvent(event, transactionID, products, null, Boolean.TRUE); - } - public static void injectConfirmedTransactionIntoEvent(AdjustEvent event, String transactionID, List products, Map parameters) { - injectTransactionIntoEvent(event, transactionID, products, parameters, Boolean.TRUE); - } - - public static void injectTransactionIntoEvent(AdjustEvent event, String transactionID, List products) { - injectTransactionIntoEvent(event, transactionID, products, null, Boolean.FALSE); - } - public static void injectTransactionIntoEvent(AdjustEvent event, String transactionID, List products, Map parameters) { - injectTransactionIntoEvent(event, transactionID, products, parameters, Boolean.FALSE); - } - private static void injectTransactionIntoEvent(AdjustEvent event, String transactionID, List products, Map parameters, Boolean confirmed) { - if (null == event) { - logger.error("Event object is required."); - return; - } - if (null == transactionID || "".equals(transactionID)) { - logger.error("Transaction ID is required."); - return; - } - if (null == products) { - logger.error("Products list is required."); - return; - } - - Map> to = new HashMap>(1); - Map>> po = new HashMap>>(1); - List> productList = new ArrayList>(); - - for (Object product: products) { - Map _product = new HashMap(); - - if (product instanceof String) { - _product.put(SCMProductID, product); - } - else if (product instanceof Map) { - _product = filter((Map) product, basketAliases); - } - - if (!_product.isEmpty()) { - productList.add(_product); - } - } - - if (!productList.isEmpty()) { - po.put(SCMProducts, productList); - addPartnerParameter(event, "socio_po", stringify(po)); - } - - if (null != parameters) { - to.put(SCMTransaction, filter(parameters, saleAliases)); - } - else { - to.put(SCMTransaction, new HashMap()); - } - - if (confirmed) { - to.get(SCMTransaction).put(SCMActionConfirmed, "true"); - } - - to.get(SCMTransaction).put(SCMTransaction, transactionID); - - addPartnerParameter(event, "socio_to", stringify(to)); - } - - public static void injectLeadIntoEvent(AdjustEvent event, String leadID) { - injectLeadIntoEvent(event, leadID, Boolean.FALSE); - } - public static void injectLeadIntoEvent(AdjustEvent event, String leadID, Boolean confirmed) { - - if (null == event) { - logger.error("Event object is required."); - return; - } - if (null == leadID || "".equals(leadID)) { - logger.error("Lead ID is required."); - return; - } - - Map> to = new HashMap>(1); - to.put(SCMTransaction, new HashMap()); - - if (confirmed) { - to.get(SCMTransaction).put(SCMActionConfirmed, "true"); - } - - to.get(SCMTransaction).put(SCMTransaction, leadID); - - addPartnerParameter(event, "socio_to", stringify(to)); - } - - //////////////////////////////////////////////////////////////////////////////////////////////// - // private methods used internally - //////////////////////////////////////////////////////////////////////////////////////////////// - - private static void addPartnerParameter(AdjustEvent event) { - addPartnerParameter(event, null, null); - } - private static void addPartnerParameter(AdjustEvent event, String parameter, String json) { - if (null == adpanId) { - logger.error("The adpanId must be set before sending any sociomantic event. No parameter has been added."); - return; - } - - if (null != parameter && null != json) - { - event.addPartnerParameter(parameter, json); - } - - event.addPartnerParameter("socio_aid", adpanId); - } - - private static Map filter(Map parameters, List aliases) { - - Map filtered = new HashMap(); - - for(Entry entry: parameters.entrySet()) { - String key = entry.getKey(); - Object value = entry.getValue(); - if (!aliases.contains(key)) { - logger.error("Key must correspond to as Sociomantic alias => ".concat(key)); - } - else { - if (key.equals(SCMCategory)) { - if (value instanceof String || value instanceof String[]) { - filtered.put(key, Arrays.asList(value)); - } else if (value instanceof List) { - filtered.put(key, filterStringArray((List) value)); - } - } - else { - filtered.put(key, value); - } - } - } - return filtered; - } - - private static List filterStringArray(List list) { - - List filtered = new ArrayList(); - for (Object item: list) { - if (item instanceof String) { - filtered.add((String) item); - } - else { - logger.error("All values should be strings"); - } - } - return filtered; - } - - private static String stringify(Object o) { - if (o == null) { - return "null"; - } - - if (o instanceof String) { - return "\"".concat((String) o).concat("\""); - } - - if (o instanceof Integer || o instanceof Long || o instanceof Double) { - return o.toString(); - } - - if (o instanceof Boolean) { - return (Boolean) o ? "true" : "false"; - } - - if (o instanceof List) { - String res = "["; - List list = (List) o; - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - Object item = iterator.next(); - res = res.concat(stringify(item)); - - if (iterator.hasNext()) { - res = res.concat(","); - } - } - - return res.concat("]"); - } - - if (o instanceof Map) { - String res = "{"; - Map map = (Map) o; - Iterator> iterator = map.entrySet().iterator(); - - while(iterator.hasNext()) { - Entry entry = iterator.next(); - - res = res.concat(stringify(entry.getKey())) - .concat(":") - .concat(stringify(entry.getValue())); - - if (iterator.hasNext()) { - res = res.concat(","); - } - } - - return res.concat("}"); - } - - logger.error("Could not parse the object ".concat(o.toString().concat(" into a JSON string, returned empty string."))); - return ""; - - } -} From 1121fa90e49947a68e202bdd222329ab329df33b Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 20 May 2024 14:59:57 +0200 Subject: [PATCH 154/540] chore: remove Criteo plugin support --- Adjust/sdk-plugin-criteo/.gitignore | 1 - Adjust/sdk-plugin-criteo/build.gradle | 216 ---------------- .../src/main/AndroidManifest.xml | 1 - .../com/adjust/sdk/criteo/AdjustCriteo.java | 236 ------------------ .../com/adjust/sdk/criteo/CriteoProduct.java | 16 -- 5 files changed, 470 deletions(-) delete mode 100644 Adjust/sdk-plugin-criteo/.gitignore delete mode 100644 Adjust/sdk-plugin-criteo/build.gradle delete mode 100644 Adjust/sdk-plugin-criteo/src/main/AndroidManifest.xml delete mode 100644 Adjust/sdk-plugin-criteo/src/main/java/com/adjust/sdk/criteo/AdjustCriteo.java delete mode 100644 Adjust/sdk-plugin-criteo/src/main/java/com/adjust/sdk/criteo/CriteoProduct.java diff --git a/Adjust/sdk-plugin-criteo/.gitignore b/Adjust/sdk-plugin-criteo/.gitignore deleted file mode 100644 index 796b96d1c..000000000 --- a/Adjust/sdk-plugin-criteo/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/Adjust/sdk-plugin-criteo/build.gradle b/Adjust/sdk-plugin-criteo/build.gradle deleted file mode 100644 index f27120720..000000000 --- a/Adjust/sdk-plugin-criteo/build.gradle +++ /dev/null @@ -1,216 +0,0 @@ -apply plugin: 'com.android.library' -apply plugin: 'maven-publish' -apply plugin: 'signing' - -repositories { - maven { - url "https://oss.sonatype.org/content/repositories/staging/" - } -} - -android { - compileSdk rootProject.ext.coreCompileSdkVersion - - publishing { - multipleVariants { - allVariants() - withJavadocJar() - } - } - defaultConfig { - minSdkVersion rootProject.ext.coreMinSdkVersion - targetSdkVersion rootProject.ext.coreTargetSdkVersion - } - namespace 'com.adjust.sdk.criteo' -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - - // Add SDK via module. - compileOnly project(':sdk-core') - // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.0' -} - -// read local properties -File localPropsFile = project.rootProject.file('local.properties') -if (localPropsFile.exists()) { - Properties p = new Properties() - new FileInputStream(localPropsFile).withCloseable { is -> - p.load(is) - } - p.each { name, value -> - ext[name] = value - } -} - -task adjustCriteoAndroidAar(type: Copy) { - dependsOn 'assembleRelease' - - from('build/outputs/aar/') - include 'sdk-plugin-criteo-release.aar' - destinationDir file('build/libs/') - rename 'sdk-plugin-criteo-release.aar', "${project.name}.aar" - -} - -task adjustCriteoAndroidJar(type: Jar) { - dependsOn 'compileReleaseJavaWithJavac' - from('build/intermediates/javac/release/classes/') - archiveFileName = project.provider { "${project.name}.jar" } -} - -task adjustCriteoAndroidSourcesJar(type: Jar) { - setArchiveClassifier('sources') - from android.sourceSets.main.java.srcDirs -} - -artifacts { - archives adjustCriteoAndroidJar - archives adjustCriteoAndroidSourcesJar -} - -afterEvaluate { - publishing { - publications { -/* - mavenAndroidCriteoJar(MavenPublication) { - customizePomForJar(pom) - groupId rootProject.ext.adjustGroupId - artifactId 'adjust-android-criteo' - version rootProject.ext.coreVersionName - - artifact adjustCriteoAndroidJar - artifact adjustCriteoAndroidSourcesJar - } -*/ - mavenAndroidCriteoAar(MavenPublication) { - customizePomForAar(pom) - groupId rootProject.ext.adjustGroupId - artifactId 'adjust-android-criteo' - version rootProject.ext.coreVersionName - - artifact("$buildDir/outputs/aar/sdk-plugin-criteo-release.aar") { - builtBy tasks.getByPath("adjustCriteoAndroidAar") - } - artifact adjustCriteoAndroidSourcesJar - } - } - - repositories { - maven { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" - if (project.hasProperty("sonatypeUsername")) { - credentials { - username sonatypeUsername - password sonatypePassword - } - } - } - } - } - signing { -// sign publishing.publications.mavenAndroidCriteoJar - sign publishing.publications.mavenAndroidCriteoAar - } -} - -def customizePomForJar(pom) { - pom.withXml { - def root = asNode() - - // Add all items necessary for maven central publication - root.children().last() + { - resolveStrategy = Closure.DELEGATE_FIRST - description 'The Criteo plugin for Adjust SDK for Android' - name 'Adjust Android SDK Criteo plugin' - url 'https://github.com/adjust/android_sdk' - - organization { - name 'adjust GmbH' - url 'http://www.adjust.com' - } - licenses { - license { - name 'MIT License' - url 'http://www.opensource.org/licenses/mit-license.php' - } - } - scm { - url 'git@github.com:adjust/android_sdk.git' - connection 'scm:git:git@github.com:adjust/android_sdk.git' - developerConnection 'scm:git:git@github.com:adjust/android_sdk.git' - } - developers { - developer { - name 'Pedro Silva' - email 'pedro@adjust.com' - } - developer { - name 'Ugljesa Erceg' - email 'ugljesa@adjust.com' - } - } - } - } -} - -def customizePomForAar(pom) { - pom.withXml { - def root = asNode() - - // Add all items necessary for maven central publication - root.children().last() + { - resolveStrategy = Closure.DELEGATE_FIRST - description 'The Criteo plugin for Adjust SDK for Android' - name 'Adjust Android SDK Criteo plugin' - url 'https://github.com/adjust/android_sdk' - - organization { - name 'adjust GmbH' - url 'http://www.adjust.com' - } - licenses { - license { - name 'MIT License' - url 'http://www.opensource.org/licenses/mit-license.php' - } - } - scm { - url 'git@github.com:adjust/android_sdk.git' - connection 'scm:git:git@github.com:adjust/android_sdk.git' - developerConnection 'scm:git:git@github.com:adjust/android_sdk.git' - } - developers { - developer { - name 'Pedro Silva' - email 'pedro@adjust.com' - } - developer { - name 'Ugljesa Erceg' - email 'ugljesa@adjust.com' - } - } - } - } -} - -model { -// tasks.generatePomFileForMavenAndroidCriteoJarPublication { -// destination = file("${project.buildDir}/generated-pom.xml") -// } - /* TODO check if/how to replace this tasks - tasks.publishMavenAndroidCriteoPublicationToMavenLocal { - dependsOn project.tasks.signArchives - } - tasks.publishMavenAndroidCriteoPublicationToMavenRepository { - dependsOn project.tasks.signArchives - } - */ - tasks.generatePomFileForMavenAndroidCriteoAarPublication { - destination = file("${project.buildDir}/generated-pom.xml") - } -} - - diff --git a/Adjust/sdk-plugin-criteo/src/main/AndroidManifest.xml b/Adjust/sdk-plugin-criteo/src/main/AndroidManifest.xml deleted file mode 100644 index 94cbbcfc3..000000000 --- a/Adjust/sdk-plugin-criteo/src/main/AndroidManifest.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Adjust/sdk-plugin-criteo/src/main/java/com/adjust/sdk/criteo/AdjustCriteo.java b/Adjust/sdk-plugin-criteo/src/main/java/com/adjust/sdk/criteo/AdjustCriteo.java deleted file mode 100644 index 03b8f7fa1..000000000 --- a/Adjust/sdk-plugin-criteo/src/main/java/com/adjust/sdk/criteo/AdjustCriteo.java +++ /dev/null @@ -1,236 +0,0 @@ -package com.adjust.sdk.criteo; - -import android.net.Uri; - -import com.adjust.sdk.AdjustEvent; -import com.adjust.sdk.AdjustFactory; -import com.adjust.sdk.ILogger; - -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - -/** - * Created by pfms on 24/02/15. - */ -public class AdjustCriteo { - private static ILogger logger = AdjustFactory.getLogger(); - private static int MAX_VIEW_LISTING_PRODUCTS = 3; - private static String hashEmailInternal; - private static String checkInDateInternal; - private static String checkOutDateInternal; - private static String partnerIdInternal; - private static String userSegmentInternal; - private static String customerIdInternal; - - public static void injectViewListingIntoEvent(AdjustEvent event, List productIds) { - String jsonProducts = createCriteoVLFromProducts(productIds); - event.addPartnerParameter("criteo_p", jsonProducts); - - injectOptionalParams(event); - } - - public static void injectViewProductIntoEvent(AdjustEvent event, String productId) { - event.addPartnerParameter("criteo_p", productId); - - injectOptionalParams(event); - } - - public static void injectCartIntoEvent(AdjustEvent event, List products) { - String jsonProducts = createCriteoVBFromProducts(products); - - event.addPartnerParameter("criteo_p", jsonProducts); - - injectOptionalParams(event); - } - - public static void injectTransactionConfirmedIntoEvent(AdjustEvent event, List products, String transactionId, String newCustomer) { - String jsonProducts = createCriteoVBFromProducts(products); - - event.addPartnerParameter("transaction_id", transactionId); - event.addPartnerParameter("criteo_p", jsonProducts); - event.addPartnerParameter("new_customer", newCustomer); - - injectOptionalParams(event); - } - - public static void injectUserLevelIntoEvent(AdjustEvent event, long uiLevel) { - event.addPartnerParameter("ui_level", String.valueOf(uiLevel)); - - injectOptionalParams(event); - } - - public static void injectUserStatusIntoEvent(AdjustEvent event, String uiStatus) { - event.addPartnerParameter("ui_status", uiStatus); - - injectOptionalParams(event); - } - - public static void injectAchievementUnlockedIntoEvent(AdjustEvent event, String uiAchievement) { - event.addPartnerParameter("ui_achievmnt", uiAchievement); - - injectOptionalParams(event); - } - - public static void injectCustomEventIntoEvent(AdjustEvent event, String uiData) { - event.addPartnerParameter("ui_data", uiData); - - injectOptionalParams(event); - } - - public static void injectCustomEvent2IntoEvent(AdjustEvent event, String uiData2, long uiData3) { - event.addPartnerParameter("ui_data2", uiData2); - event.addPartnerParameter("ui_data3", String.valueOf(uiData3)); - - injectOptionalParams(event); - } - - public static void injectHashedEmailIntoCriteoEvents(String hashEmail) { - hashEmailInternal = hashEmail; - } - - public static void injectViewSearchDatesIntoCriteoEvents(String checkInDate, String checkOutDate) { - checkInDateInternal = checkInDate; - checkOutDateInternal = checkOutDate; - } - - public static void injectPartnerIdIntoCriteoEvents(String partnerId) { - partnerIdInternal = partnerId; - } - - public static void injectUserSegmentIntoCriteoEvents(String userSegment) { - userSegmentInternal = userSegment; - } - - public static void injectCustomerIdIntoCriteoEvents(String customerId) { - customerIdInternal = customerId; - } - - public static void injectDeeplinkIntoEvent(AdjustEvent event, Uri url) { - if (url == null) { - return; - } - - event.addPartnerParameter("criteo_deeplink", url.toString()); - - injectOptionalParams(event); - } - - private static void injectOptionalParams(AdjustEvent event) { - injectHashEmail(event); - injectSearchDates(event); - injectPartnerId(event); - injectUserSegment(event); - injectCustomerId(event); - } - - private static void injectHashEmail(AdjustEvent event) { - if (hashEmailInternal == null || hashEmailInternal.isEmpty()) { - return; - } - - event.addPartnerParameter("criteo_email_hash", hashEmailInternal); - } - - private static void injectSearchDates(AdjustEvent event) { - if (checkInDateInternal == null || checkInDateInternal.isEmpty() || - checkOutDateInternal == null || checkOutDateInternal.isEmpty()) { - return; - } - - event.addPartnerParameter("din", checkInDateInternal); - event.addPartnerParameter("dout", checkOutDateInternal); - } - - private static void injectPartnerId(AdjustEvent event) { - if (partnerIdInternal == null || partnerIdInternal.isEmpty()) { - return; - } - - event.addPartnerParameter("criteo_partner_id", partnerIdInternal); - } - - private static void injectUserSegment(AdjustEvent event) { - if (userSegmentInternal == null || userSegmentInternal.isEmpty()) { - return; - } - - event.addPartnerParameter("user_segment", userSegmentInternal); - } - - private static void injectCustomerId(AdjustEvent event) { - if (customerIdInternal == null || customerIdInternal.isEmpty()) { - return; - } - event.addPartnerParameter("customer_id", customerIdInternal); - } - - private static String createCriteoVLFromProducts(List productIds) { - if (productIds == null) { - logger.warn("Criteo View Listing product ids list is null. It will sent as empty."); - productIds = new ArrayList(); - } - StringBuffer criteoVLValue = new StringBuffer("["); - int productIdsSize = productIds.size(); - - if (productIdsSize > MAX_VIEW_LISTING_PRODUCTS) { - logger.warn("Criteo View Listing should only have at most 3 product ids. The rest will be discarded."); - } - for (int i = 0; i < productIdsSize; ) { - String productID = productIds.get(i); - String productString = String.format(Locale.US, "\"%s\"", productID); - criteoVLValue.append(productString); - - i++; - - if (i == productIdsSize || i >= MAX_VIEW_LISTING_PRODUCTS) { - break; - } - - criteoVLValue.append(","); - } - criteoVLValue.append("]"); - String result = null; - try { - result = URLEncoder.encode(criteoVLValue.toString(),"UTF-8"); - } catch (UnsupportedEncodingException e) { - logger.error("error converting criteo product ids (%s)", e.getMessage()); - } - return result; - } - - private static String createCriteoVBFromProducts(List products) { - if (products == null) { - logger.warn("Criteo Event product list is empty. It will sent as empty."); - products = new ArrayList(); - } - StringBuffer criteoVBValue = new StringBuffer("["); - int productsSize = products.size(); - for (int i = 0; i < productsSize; ) { - CriteoProduct criteoProduct = products.get(i); - String productString = String.format(Locale.US, "{\"i\":\"%s\",\"pr\":%f,\"q\":%d}", - criteoProduct.productID, - criteoProduct.price, - criteoProduct.quantity); - criteoVBValue.append(productString); - - i++; - - if (i == productsSize) { - break; - } - - criteoVBValue.append(","); - } - criteoVBValue.append("]"); - String result = null; - try { - result = URLEncoder.encode(criteoVBValue.toString(),"UTF-8"); - } catch (UnsupportedEncodingException e) { - logger.error("error converting criteo products (%s)", e.getMessage()); - } - return result; - } -} diff --git a/Adjust/sdk-plugin-criteo/src/main/java/com/adjust/sdk/criteo/CriteoProduct.java b/Adjust/sdk-plugin-criteo/src/main/java/com/adjust/sdk/criteo/CriteoProduct.java deleted file mode 100644 index 519cc6826..000000000 --- a/Adjust/sdk-plugin-criteo/src/main/java/com/adjust/sdk/criteo/CriteoProduct.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.adjust.sdk.criteo; - -/** - * Created by pfms on 24/02/15. - */ -public class CriteoProduct { - float price; - int quantity; - String productID; - - public CriteoProduct(float price, int quantity, String productID) { - this.price = price; - this.quantity = quantity; - this.productID = productID; - } -} From db29ede2282edf12c6bf70ae6d4f20c48530d194 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 22 May 2024 17:14:00 +0200 Subject: [PATCH 155/540] chore: remove `Adjust/plugin` directory --- .../com/adjust/sdk/plugin/AdjustCriteo.java | 236 ---------- .../com/adjust/sdk/plugin/CriteoProduct.java | 16 - .../adjust/sdk/plugin/AdjustSociomantic.java | 425 ------------------ .../com/adjust/sdk/plugin/AdjustTrademob.java | 129 ------ .../com/adjust/sdk/plugin/TrademobItem.java | 13 - 5 files changed, 819 deletions(-) delete mode 100644 Adjust/plugin/Criteo/com/adjust/sdk/plugin/AdjustCriteo.java delete mode 100644 Adjust/plugin/Criteo/com/adjust/sdk/plugin/CriteoProduct.java delete mode 100644 Adjust/plugin/Sociomantic/com/adjust/sdk/plugin/AdjustSociomantic.java delete mode 100644 Adjust/plugin/Trademob/com/adjust/sdk/plugin/AdjustTrademob.java delete mode 100644 Adjust/plugin/Trademob/com/adjust/sdk/plugin/TrademobItem.java diff --git a/Adjust/plugin/Criteo/com/adjust/sdk/plugin/AdjustCriteo.java b/Adjust/plugin/Criteo/com/adjust/sdk/plugin/AdjustCriteo.java deleted file mode 100644 index 024cd678f..000000000 --- a/Adjust/plugin/Criteo/com/adjust/sdk/plugin/AdjustCriteo.java +++ /dev/null @@ -1,236 +0,0 @@ -package com.adjust.sdk.plugin; - -import android.net.Uri; - -import com.adjust.sdk.AdjustEvent; -import com.adjust.sdk.AdjustFactory; -import com.adjust.sdk.ILogger; - -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - -/** - * Created by pfms on 24/02/15. - */ -public class AdjustCriteo { - private static ILogger logger = AdjustFactory.getLogger(); - private static int MAX_VIEW_LISTING_PRODUCTS = 3; - private static String hashEmailInternal; - private static String checkInDateInternal; - private static String checkOutDateInternal; - private static String partnerIdInternal; - private static String userSegmentInternal; - private static String customerIdInternal; - - public static void injectViewListingIntoEvent(AdjustEvent event, List productIds) { - String jsonProducts = createCriteoVLFromProducts(productIds); - event.addPartnerParameter("criteo_p", jsonProducts); - - injectOptionalParams(event); - } - - public static void injectViewProductIntoEvent(AdjustEvent event, String productId) { - event.addPartnerParameter("criteo_p", productId); - - injectOptionalParams(event); - } - - public static void injectCartIntoEvent(AdjustEvent event, List products) { - String jsonProducts = createCriteoVBFromProducts(products); - - event.addPartnerParameter("criteo_p", jsonProducts); - - injectOptionalParams(event); - } - - public static void injectTransactionConfirmedIntoEvent(AdjustEvent event, List products, String transactionId, String newCustomer) { - String jsonProducts = createCriteoVBFromProducts(products); - - event.addPartnerParameter("transaction_id", transactionId); - event.addPartnerParameter("criteo_p", jsonProducts); - event.addPartnerParameter("new_customer", newCustomer); - - injectOptionalParams(event); - } - - public static void injectUserLevelIntoEvent(AdjustEvent event, long uiLevel) { - event.addPartnerParameter("ui_level", String.valueOf(uiLevel)); - - injectOptionalParams(event); - } - - public static void injectUserStatusIntoEvent(AdjustEvent event, String uiStatus) { - event.addPartnerParameter("ui_status", uiStatus); - - injectOptionalParams(event); - } - - public static void injectAchievementUnlockedIntoEvent(AdjustEvent event, String uiAchievement) { - event.addPartnerParameter("ui_achievmnt", uiAchievement); - - injectOptionalParams(event); - } - - public static void injectCustomEventIntoEvent(AdjustEvent event, String uiData) { - event.addPartnerParameter("ui_data", uiData); - - injectOptionalParams(event); - } - - public static void injectCustomEvent2IntoEvent(AdjustEvent event, String uiData2, long uiData3) { - event.addPartnerParameter("ui_data2", uiData2); - event.addPartnerParameter("ui_data3", String.valueOf(uiData3)); - - injectOptionalParams(event); - } - - public static void injectHashedEmailIntoCriteoEvents(String hashEmail) { - hashEmailInternal = hashEmail; - } - - public static void injectViewSearchDatesIntoCriteoEvents(String checkInDate, String checkOutDate) { - checkInDateInternal = checkInDate; - checkOutDateInternal = checkOutDate; - } - - public static void injectPartnerIdIntoCriteoEvents(String partnerId) { - partnerIdInternal = partnerId; - } - - public static void injectUserSegmentIntoCriteoEvents(String userSegment) { - userSegmentInternal = userSegment; - } - - public static void injectCustomerIdIntoCriteoEvents(String customerId) { - customerIdInternal = customerId; - } - - public static void injectDeeplinkIntoEvent(AdjustEvent event, Uri url) { - if (url == null) { - return; - } - - event.addPartnerParameter("criteo_deeplink", url.toString()); - - injectOptionalParams(event); - } - - private static void injectOptionalParams(AdjustEvent event) { - injectHashEmail(event); - injectSearchDates(event); - injectPartnerId(event); - injectUserSegment(event); - injectCustomerId(event); - } - - private static void injectHashEmail(AdjustEvent event) { - if (hashEmailInternal == null || hashEmailInternal.isEmpty()) { - return; - } - - event.addPartnerParameter("criteo_email_hash", hashEmailInternal); - } - - private static void injectSearchDates(AdjustEvent event) { - if (checkInDateInternal == null || checkInDateInternal.isEmpty() || - checkOutDateInternal == null || checkOutDateInternal.isEmpty()) { - return; - } - - event.addPartnerParameter("din", checkInDateInternal); - event.addPartnerParameter("dout", checkOutDateInternal); - } - - private static void injectPartnerId(AdjustEvent event) { - if (partnerIdInternal == null || partnerIdInternal.isEmpty()) { - return; - } - - event.addPartnerParameter("criteo_partner_id", partnerIdInternal); - } - - private static void injectUserSegment(AdjustEvent event) { - if (userSegmentInternal == null || userSegmentInternal.isEmpty()) { - return; - } - - event.addPartnerParameter("user_segment", userSegmentInternal); - } - - private static void injectCustomerId(AdjustEvent event) { - if (customerIdInternal == null || customerIdInternal.isEmpty()) { - return; - } - event.addPartnerParameter("customer_id", customerIdInternal); - } - - private static String createCriteoVLFromProducts(List productIds) { - if (productIds == null) { - logger.warn("Criteo View Listing product ids list is null. It will sent as empty."); - productIds = new ArrayList(); - } - StringBuffer criteoVLValue = new StringBuffer("["); - int productIdsSize = productIds.size(); - - if (productIdsSize > MAX_VIEW_LISTING_PRODUCTS) { - logger.warn("Criteo View Listing should only have at most 3 product ids. The rest will be discarded."); - } - for (int i = 0; i < productIdsSize; ) { - String productID = productIds.get(i); - String productString = String.format(Locale.US, "\"%s\"", productID); - criteoVLValue.append(productString); - - i++; - - if (i == productIdsSize || i >= MAX_VIEW_LISTING_PRODUCTS) { - break; - } - - criteoVLValue.append(","); - } - criteoVLValue.append("]"); - String result = null; - try { - result = URLEncoder.encode(criteoVLValue.toString(),"UTF-8"); - } catch (UnsupportedEncodingException e) { - logger.error("error converting criteo product ids (%s)", e.getMessage()); - } - return result; - } - - private static String createCriteoVBFromProducts(List products) { - if (products == null) { - logger.warn("Criteo Event product list is empty. It will sent as empty."); - products = new ArrayList(); - } - StringBuffer criteoVBValue = new StringBuffer("["); - int productsSize = products.size(); - for (int i = 0; i < productsSize; ) { - CriteoProduct criteoProduct = products.get(i); - String productString = String.format(Locale.US, "{\"i\":\"%s\",\"pr\":%f,\"q\":%d}", - criteoProduct.productID, - criteoProduct.price, - criteoProduct.quantity); - criteoVBValue.append(productString); - - i++; - - if (i == productsSize) { - break; - } - - criteoVBValue.append(","); - } - criteoVBValue.append("]"); - String result = null; - try { - result = URLEncoder.encode(criteoVBValue.toString(),"UTF-8"); - } catch (UnsupportedEncodingException e) { - logger.error("error converting criteo products (%s)", e.getMessage()); - } - return result; - } -} diff --git a/Adjust/plugin/Criteo/com/adjust/sdk/plugin/CriteoProduct.java b/Adjust/plugin/Criteo/com/adjust/sdk/plugin/CriteoProduct.java deleted file mode 100644 index d85746c03..000000000 --- a/Adjust/plugin/Criteo/com/adjust/sdk/plugin/CriteoProduct.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.adjust.sdk.plugin; - -/** - * Created by pfms on 24/02/15. - */ -public class CriteoProduct { - float price; - int quantity; - String productID; - - public CriteoProduct(float price, int quantity, String productID) { - this.price = price; - this.quantity = quantity; - this.productID = productID; - } -} diff --git a/Adjust/plugin/Sociomantic/com/adjust/sdk/plugin/AdjustSociomantic.java b/Adjust/plugin/Sociomantic/com/adjust/sdk/plugin/AdjustSociomantic.java deleted file mode 100644 index b9ef8e43b..000000000 --- a/Adjust/plugin/Sociomantic/com/adjust/sdk/plugin/AdjustSociomantic.java +++ /dev/null @@ -1,425 +0,0 @@ -package com.adjust.sdk.plugin; - -import com.adjust.sdk.AdjustEvent; -import com.adjust.sdk.AdjustFactory; -import com.adjust.sdk.ILogger; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -/** - * AdjustSociomantic Class - * Created by Nicolas Brugneaux nicolas.brugneaux@sociomantic.com on 01/04/15. - */ -public abstract class AdjustSociomantic { - - public final static String SCMCategory = "category"; - public final static String SCMProducts = "products"; - public final static String SCMProductName = "fn"; - public final static String SCMSalePrice = "price"; - public final static String SCMAmount = "amount"; - public final static String SCMCurrency = "currency"; - public final static String SCMProductURL = "url"; - public final static String SCMProductImageURL = "photo"; - public final static String SCMBrand = "brand"; - public final static String SCMDescription = "description"; - public final static String SCMTimestamp = "date"; - public final static String SCMValidityTimestamp = "valid"; - public final static String SCMQuantity = "quantity"; - public final static String SCMScore = "score"; - public final static String SCMProductID = "identifier"; - public final static String SCMActionConfirmed = "confirmed"; - public final static String SCMCustomerAgeGroup = "agegroup"; - public final static String SCMCustomerEducation = "education"; - public final static String SCMCustomerGender = "gender"; - public final static String SCMCustomerID = "identifier"; - public final static String SCMCustomerMHash = "mhash"; - public final static String SCMCustomerSegment = "segment"; - public final static String SCMCustomerTargeting = "targeting"; - public final static String SCMTransaction = "transaction"; - - private final static List productAliases = Arrays.asList( - SCMCategory, - SCMProductName, - SCMSalePrice, - SCMAmount, - SCMCurrency, - SCMProductURL, - SCMProductImageURL, - SCMBrand, - SCMDescription, - SCMTimestamp, - SCMValidityTimestamp, - SCMQuantity, - SCMScore - ); - - private final static List basketAliases = Arrays.asList( - SCMProductID, - SCMAmount, - SCMCurrency, - SCMQuantity - ); - - private final static List saleAliases = Arrays.asList( - SCMAmount, - SCMCurrency - ); - - private final static List customerAliases = Arrays.asList( - SCMCustomerAgeGroup, - SCMCustomerEducation, - SCMCustomerGender, - SCMCustomerID, - SCMCustomerMHash, - SCMCustomerSegment, - SCMCustomerTargeting - ); - - private static String adpanId; - - private static ILogger logger = AdjustFactory.getLogger(); - - public static void injectPartnerIdInSociomanticEvents(String newAdpanId) { - adpanId = newAdpanId; - } - - public static void injectCustomerDataIntoEvent(AdjustEvent event, Map customerData) { - if (null == event) { - logger.error("Event object is required."); - return; - } - if (null == customerData) { - logger.error("Customer data is required."); - return; - } - - Map data = new HashMap(); - - for (Entry entry: customerData.entrySet()) { - if (!customerAliases.contains(entry.getKey())) { - logger.warn("Key must belong to the customer Aliases, entry: %s was discarded", entry.getKey()); - } - else { - data.put(entry.getKey(), entry.getValue()); - } - } - - String dob = stringify(data); - - addPartnerParameter(event, "socio_dob", dob); - } - - public static void injectHomePageIntoEvent(AdjustEvent event) { - if (null == event) { - logger.error("Event object is required."); - } - addPartnerParameter(event); - } - - public static void injectViewListingIntoEvent(AdjustEvent event, List categories) { - injectViewListingIntoEvent(event, categories, null); - } - public static void injectViewListingIntoEvent(AdjustEvent event, List categories, String date) { - if (null == event) { - logger.error("Event object is required."); - return; - } - if (null == categories) { - logger.error("Categories list is required."); - return; - } - - Map co = new HashMap(); - - if (null != date) { - co.put(SCMTimestamp, date); - } - - co.put(SCMCategory, categories); - - addPartnerParameter(event, "socio_co", stringify(co)); - } - - public static void injectProductIntoEvent(AdjustEvent event, String productId) { - injectProductIntoEvent(event, productId, null); - } - public static void injectProductIntoEvent(AdjustEvent event, String productId, Map parameters) { - if (null == event) { - logger.error("Event object is required."); - return; - } - if (null == productId || "".equals(productId)) { - logger.error("Product ID is required."); - return; - } - - Map>> po = new HashMap>>(1); - List> productList; - Map product; - - if (null != parameters) { - product = filter(parameters, productAliases); - } - else { - product = new HashMap(); - } - - product.put(SCMProductID, productId); - productList = Arrays.asList(product); - po.put(SCMProducts, productList); - addPartnerParameter(event, "socio_po", stringify(po)); - } - - public static void injectCartIntoEvent(AdjustEvent event, List products) { - if (null == event) { - logger.error("Event object is required."); - return; - } - if (null == products) { - logger.error("Products list is required."); - return; - } - - Map>> po = new HashMap>>(1); - List> productList = new ArrayList>(); - - for (Object product: products) { - Map _product = new HashMap(); - - if (product instanceof String) { - _product.put(SCMProductID, product); - } - else if (product instanceof Map) { - _product = filter((Map) product, basketAliases); - } - - if (!_product.isEmpty()) { - productList.add(_product); - } - } - - if (!productList.isEmpty()) { - po.put(SCMProducts, productList); - addPartnerParameter(event, "socio_po", stringify(po)); - } - } - - public static void injectConfirmedTransactionIntoEvent(AdjustEvent event, String transactionID, List products) { - injectTransactionIntoEvent(event, transactionID, products, null, Boolean.TRUE); - } - public static void injectConfirmedTransactionIntoEvent(AdjustEvent event, String transactionID, List products, Map parameters) { - injectTransactionIntoEvent(event, transactionID, products, parameters, Boolean.TRUE); - } - - public static void injectTransactionIntoEvent(AdjustEvent event, String transactionID, List products) { - injectTransactionIntoEvent(event, transactionID, products, null, Boolean.FALSE); - } - public static void injectTransactionIntoEvent(AdjustEvent event, String transactionID, List products, Map parameters) { - injectTransactionIntoEvent(event, transactionID, products, parameters, Boolean.FALSE); - } - private static void injectTransactionIntoEvent(AdjustEvent event, String transactionID, List products, Map parameters, Boolean confirmed) { - if (null == event) { - logger.error("Event object is required."); - return; - } - if (null == transactionID || "".equals(transactionID)) { - logger.error("Transaction ID is required."); - return; - } - if (null == products) { - logger.error("Products list is required."); - return; - } - - Map> to = new HashMap>(1); - Map>> po = new HashMap>>(1); - List> productList = new ArrayList>(); - - for (Object product: products) { - Map _product = new HashMap(); - - if (product instanceof String) { - _product.put(SCMProductID, product); - } - else if (product instanceof Map) { - _product = filter((Map) product, basketAliases); - } - - if (!_product.isEmpty()) { - productList.add(_product); - } - } - - if (!productList.isEmpty()) { - po.put(SCMProducts, productList); - addPartnerParameter(event, "socio_po", stringify(po)); - } - - if (null != parameters) { - to.put(SCMTransaction, filter(parameters, saleAliases)); - } - else { - to.put(SCMTransaction, new HashMap()); - } - - if (confirmed) { - to.get(SCMTransaction).put(SCMActionConfirmed, "true"); - } - - to.get(SCMTransaction).put(SCMTransaction, transactionID); - - addPartnerParameter(event, "socio_to", stringify(to)); - } - - public static void injectLeadIntoEvent(AdjustEvent event, String leadID) { - injectLeadIntoEvent(event, leadID, Boolean.FALSE); - } - public static void injectLeadIntoEvent(AdjustEvent event, String leadID, Boolean confirmed) { - - if (null == event) { - logger.error("Event object is required."); - return; - } - if (null == leadID || "".equals(leadID)) { - logger.error("Lead ID is required."); - return; - } - - Map> to = new HashMap>(1); - to.put(SCMTransaction, new HashMap()); - - if (confirmed) { - to.get(SCMTransaction).put(SCMActionConfirmed, "true"); - } - - to.get(SCMTransaction).put(SCMTransaction, leadID); - - addPartnerParameter(event, "socio_to", stringify(to)); - } - - //////////////////////////////////////////////////////////////////////////////////////////////// - // private methods used internally - //////////////////////////////////////////////////////////////////////////////////////////////// - - private static void addPartnerParameter(AdjustEvent event) { - addPartnerParameter(event, null, null); - } - private static void addPartnerParameter(AdjustEvent event, String parameter, String json) { - if (null == adpanId) { - logger.error("The adpanId must be set before sending any sociomantic event. No parameter has been added."); - return; - } - - if (null != parameter && null != json) - { - event.addPartnerParameter(parameter, json); - } - - event.addPartnerParameter("socio_aid", adpanId); - } - - private static Map filter(Map parameters, List aliases) { - - Map filtered = new HashMap(); - - for(Entry entry: parameters.entrySet()) { - String key = entry.getKey(); - Object value = entry.getValue(); - if (!aliases.contains(key)) { - logger.error("Key must correspond to as Sociomantic alias => ".concat(key)); - } - else { - if (key.equals(SCMCategory)) { - if (value instanceof String || value instanceof String[]) { - filtered.put(key, Arrays.asList(value)); - } else if (value instanceof List) { - filtered.put(key, filterStringArray((List) value)); - } - } - else { - filtered.put(key, value); - } - } - } - return filtered; - } - - private static List filterStringArray(List list) { - - List filtered = new ArrayList(); - for (Object item: list) { - if (item instanceof String) { - filtered.add((String) item); - } - else { - logger.error("All values should be strings"); - } - } - return filtered; - } - - private static String stringify(Object o) { - if (o == null) { - return "null"; - } - - if (o instanceof String) { - return "\"".concat((String) o).concat("\""); - } - - if (o instanceof Integer || o instanceof Long || o instanceof Double) { - return o.toString(); - } - - if (o instanceof Boolean) { - return (Boolean) o ? "true" : "false"; - } - - if (o instanceof List) { - String res = "["; - List list = (List) o; - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - Object item = iterator.next(); - res = res.concat(stringify(item)); - - if (iterator.hasNext()) { - res = res.concat(","); - } - } - - return res.concat("]"); - } - - if (o instanceof Map) { - String res = "{"; - Map map = (Map) o; - Iterator> iterator = map.entrySet().iterator(); - - while(iterator.hasNext()) { - Entry entry = iterator.next(); - - res = res.concat(stringify(entry.getKey())) - .concat(":") - .concat(stringify(entry.getValue())); - - if (iterator.hasNext()) { - res = res.concat(","); - } - } - - return res.concat("}"); - } - - logger.error("Could not parse the object ".concat(o.toString().concat(" into a JSON string, returned empty string."))); - return ""; - - } -} diff --git a/Adjust/plugin/Trademob/com/adjust/sdk/plugin/AdjustTrademob.java b/Adjust/plugin/Trademob/com/adjust/sdk/plugin/AdjustTrademob.java deleted file mode 100644 index 24e7bf0d1..000000000 --- a/Adjust/plugin/Trademob/com/adjust/sdk/plugin/AdjustTrademob.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.adjust.sdk.plugin; - - -import com.adjust.sdk.AdjustEvent; -import com.adjust.sdk.AdjustFactory; -import com.adjust.sdk.ILogger; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; - - -public class AdjustTrademob { - - private static int MAX_LISTING_ITEMS_COUNT = 5; - - private static ILogger logger = AdjustFactory.getLogger(); - - public static void injectViewItemIntoEvent(AdjustEvent event, String itemId, Map metadata) { - event.addPartnerParameter("tm_item", itemId); - String jsonMetadata = stringifyMetadata(metadata); - event.addPartnerParameter("tm_md", jsonMetadata); - } - - public static void injectViewListingIntoEvent(AdjustEvent event, List itemIds, Map metadata) { - String jsonItems = stringifyItemIds(itemIds); - event.addPartnerParameter("tm_item", jsonItems); - String jsonMetadata = stringifyMetadata(metadata); - event.addPartnerParameter("tm_md", jsonMetadata); - } - - public static void injectAddToBasketIntoEvent(AdjustEvent event, List items, Map metadata) { - String jsonMetadata = stringifyMetadata(metadata); - event.addPartnerParameter("tm_md", jsonMetadata); - String jsonItems = stringifyItems(items); - event.addPartnerParameter("tm_item", jsonItems); - } - - public static void injectCheckoutIntoEvent(AdjustEvent event, List items, Map metadata) { - String jsonMetadata = stringifyMetadata(metadata); - event.addPartnerParameter("tm_md", jsonMetadata); - String jsonItems = stringifyItems(items); - event.addPartnerParameter("tm_item", jsonItems); - } - - private static String stringifyItemIds(List itemIds) { - if (itemIds == null) { - logger.warn("TM View Listing item ids list is null. Empty ids array will be sent."); - itemIds = new ArrayList(); - } - StringBuffer tmViewList = new StringBuffer("["); - int itemsSize = itemIds.size(); - int i = 0; - - while (i < itemsSize) { - String itemId = itemIds.get(i); - String itemString = String.format(Locale.US, "\"%s\"", itemId); - tmViewList.append(itemString); - - i++; - - if (i == itemsSize || i >= MAX_LISTING_ITEMS_COUNT) { - break; - } - - tmViewList.append(","); - } - - tmViewList.append("]"); - - return tmViewList.toString(); - } - - private static String stringifyItems(List items) { - if (items == null) { - logger.warn("TM View Listing item ids list is empty. Empty items will be sent."); - items = new ArrayList(); - } - - StringBuffer itemsStrBuffer = new StringBuffer("["); - int itemsSize = items.size(); - - for (int i = 0; i < itemsSize; ) { - TrademobItem item = items.get(i); - String itemString = String.format(Locale.US, "{\"id\":\"%s\",\"price\":%f,\"quantity\":%d}", - item.itemId, - item.price, - item.quantity); - itemsStrBuffer.append(itemString); - - i++; - - if (i == itemsSize || i >= MAX_LISTING_ITEMS_COUNT) { - break; - } - - itemsStrBuffer.append(","); - } - - itemsStrBuffer.append("]"); - - return itemsStrBuffer.toString(); - } - - private static String stringifyMetadata(Map metadata) { - - if(null == metadata) { - return "{}"; - } - String res = "{"; - - Iterator> iterator = metadata.entrySet().iterator(); - - while(iterator.hasNext()) { - Map.Entry entry = iterator.next(); - String key = "\"".concat(entry.getKey()).concat("\""); - String value = "\"".concat(entry.getValue()).concat("\""); - res = res.concat(key).concat(":").concat(value); - - if (iterator.hasNext()) { - res = res.concat(","); - } - } - - return res.concat("}"); - } -} diff --git a/Adjust/plugin/Trademob/com/adjust/sdk/plugin/TrademobItem.java b/Adjust/plugin/Trademob/com/adjust/sdk/plugin/TrademobItem.java deleted file mode 100644 index c9897fa6f..000000000 --- a/Adjust/plugin/Trademob/com/adjust/sdk/plugin/TrademobItem.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.adjust.sdk.plugin; - -public class TrademobItem { - float price; - int quantity; - String itemId; - - public TrademobItem(String itemId, int quantity, float price) { - this.price = price; - this.quantity = quantity; - this.itemId = itemId; - } -} From 2ce65e7d591c4d4f4e8d552897ac1a4fac5e1e34 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 20 May 2024 14:47:44 +0200 Subject: [PATCH 156/540] refac: remove billing store info from subscription --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 4 ++-- .../java/com/adjust/sdk/AdjustPlayStoreSubscription.java | 6 ------ .../src/main/java/com/adjust/sdk/PackageBuilder.java | 1 - .../main/java/com/adjust/testapp/AdjustCommandExecutor.java | 4 ++-- 4 files changed, 4 insertions(+), 11 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index f49068a4d..5136309cd 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -690,7 +690,7 @@ public void trackPlayStoreSubscription(final AdjustPlayStoreSubscription subscri executor.submit(new Runnable() { @Override public void run() { - trackSubscriptionI(subscription); + trackPlayStoreSubscriptionI(subscription); } }); } @@ -2400,7 +2400,7 @@ private void trackAdRevenueI(AdjustAdRevenue adjustAdRevenue) { packageHandler.sendFirstPackage(); } - private void trackSubscriptionI(final AdjustPlayStoreSubscription subscription) { + private void trackPlayStoreSubscriptionI(final AdjustPlayStoreSubscription subscription) { if (!checkActivityStateI(activityState)) { return; } if (!isEnabledI()) { return; } if (activityState.isGdprForgotten) { return; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustPlayStoreSubscription.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustPlayStoreSubscription.java index 7ee70db57..db4b24144 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustPlayStoreSubscription.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustPlayStoreSubscription.java @@ -10,7 +10,6 @@ public class AdjustPlayStoreSubscription { private String orderId; // [M] transaction_id private String signature; // [M] receipt private String purchaseToken; // [M] purchase_token - private String billingStore; // [M] billing_store private long purchaseTime; // [O] transaction_date private Map callbackParameters; // [O] callback_params private Map partnerParameters; // [O] partner_params @@ -32,7 +31,6 @@ public AdjustPlayStoreSubscription(final long price, // default values this.purchaseTime = -1; - this.billingStore = "GooglePlay"; } long getPrice() { @@ -59,10 +57,6 @@ String getSignature() { return signature; } - String getBillingStore() { - return billingStore; - } - String getPurchaseToken() { return purchaseToken; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index a0b8ab00c..0e49285a4 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -1092,7 +1092,6 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); // subscription specific parameters - PackageBuilder.addString(parameters, "billing_store", subscription.getBillingStore()); PackageBuilder.addString(parameters, "currency", subscription.getCurrency()); PackageBuilder.addString(parameters, "product_id", subscription.getSku()); PackageBuilder.addString(parameters, "purchase_token", subscription.getPurchaseToken()); diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 897d2f912..04a5b874a 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -87,7 +87,7 @@ public void executeCommand(final Command sentCommand) { case "thirdPartySharing" : thirdPartySharing(); break; case "measurementConsent" : measurementConsent(); break; case "trackAdRevenue" : trackAdRevenue(); break; - case "trackSubscription": trackSubscription(); break; + case "trackSubscription": trackPlayStoreSubscription(); break; case "verifyPurchase": verifyPurchase(); break; case "processDeeplink" : processDeeplink(); break; case "enableCoppaCompliance" : enableCoppaCompliance(); break; @@ -725,7 +725,7 @@ private void trackAdRevenue() { Adjust.trackAdRevenue(adjustAdRevenue); } - private void trackSubscription() { + private void trackPlayStoreSubscription() { long price = Long.parseLong(command.getFirstParameterValue("revenue")); String currency = command.getFirstParameterValue("currency"); long purchaseTime = Long.parseLong(command.getFirstParameterValue("transactionDate")); From 49791b3dc98893b3e87226159efc2f58324611f3 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 17 May 2024 11:24:04 +0200 Subject: [PATCH 157/540] refac: rename appWillOpenUrl to processDeeplink & original processDeeplink to processAndResolveDeeplink --- .../com/adjust/examples/MainActivity.java | 2 +- .../com/adjust/examples/ServiceActivity.java | 2 +- .../examples/keyboard/MainActivity.java | 2 +- .../java/com/adjust/examples/MainActivity.kt | 2 +- .../com/adjust/examples/ServiceActivity.kt | 2 +- .../com/adjust/examples/MainActivity.java | 2 +- .../java/com/adjust/sdk/ActivityHandler.java | 12 ++++---- .../src/main/java/com/adjust/sdk/Adjust.java | 21 +++----------- .../java/com/adjust/sdk/AdjustInstance.java | 29 +++++-------------- .../java/com/adjust/sdk/IActivityHandler.java | 4 +-- .../src/main/assets/adjust.js | 6 ---- .../sdk/webbridge/AdjustBridgeInstance.java | 12 -------- .../adjust/testapp/AdjustCommandExecutor.java | 4 +-- .../java/com/adjust/testapp/MainActivity.java | 2 +- .../src/main/assets/command_executor.js | 5 ---- .../testappwebbridge/MainActivity.java | 12 -------- 16 files changed, 29 insertions(+), 90 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java index 5ca6f5bd5..5b9f0efe6 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java @@ -34,7 +34,7 @@ protected void onCreate(Bundle savedInstanceState) { Intent intent = getIntent(); Uri data = intent.getData(); - Adjust.appWillOpenUrl(data, getApplicationContext()); + Adjust.processDeeplink(data, getApplicationContext()); // Adjust UI according to SDK state. btnEnableDisableSDK = (Button) findViewById(R.id.btnEnableDisableSDK); diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/ServiceActivity.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/ServiceActivity.java index fe363b5d0..4c651ecce 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/ServiceActivity.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/ServiceActivity.java @@ -19,7 +19,7 @@ protected void onCreate(Bundle savedInstanceState) { Intent intent = getIntent(); Uri data = intent.getData(); - Adjust.appWillOpenUrl(data, getApplicationContext()); + Adjust.processDeeplink(data, getApplicationContext()); } public void onServiceClick(View v) { diff --git a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/MainActivity.java b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/MainActivity.java index 65a15b090..90dd1caba 100644 --- a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/MainActivity.java +++ b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/MainActivity.java @@ -24,7 +24,7 @@ protected void onCreate(Bundle savedInstanceState) { Intent intent = getIntent(); Uri data = intent.getData(); - Adjust.appWillOpenUrl(data, getApplicationContext()); + Adjust.processDeeplink(data, getApplicationContext()); } @Override diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt index 7124f3fab..c02e6f8a5 100644 --- a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt +++ b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt @@ -22,7 +22,7 @@ class MainActivity : AppCompatActivity() { val intent = intent val data = intent.data - Adjust.appWillOpenUrl(data, applicationContext) + Adjust.processDeeplink(data, applicationContext) // Adjust UI according to SDK state. btnEnableDisableSDK = findViewById(R.id.btnEnableDisableSDK) as Button diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/ServiceActivity.kt b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/ServiceActivity.kt index 279274bd1..ba0f11615 100644 --- a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/ServiceActivity.kt +++ b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/ServiceActivity.kt @@ -15,7 +15,7 @@ class ServiceActivity : AppCompatActivity() { val intent = intent val data = intent.data - Adjust.appWillOpenUrl(data, applicationContext) + Adjust.processDeeplink(data, applicationContext) } fun onServiceClick(v: View) { diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java b/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java index f97bb6c06..2fc451714 100755 --- a/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java +++ b/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java @@ -28,7 +28,7 @@ protected void onCreate(Bundle savedInstanceState) { Intent intent = getIntent(); Uri data = intent.getData(); - Adjust.appWillOpenUrl(data, getApplicationContext()); + Adjust.processDeeplink(data, getApplicationContext()); // Adjust UI according to SDK state. btnEnableDisableSDK = (Button) findViewById(R.id.btnEnableDisableSDK); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 5136309cd..e04c55f88 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -408,21 +408,21 @@ private boolean isEnabledI() { } @Override - public void readOpenUrl(final Uri url, final long clickTime) { + public void processDeeplink(final Uri url, final long clickTime) { executor.submit(new Runnable() { @Override public void run() { - readOpenUrlI(url, clickTime); + processDeeplinkI(url, clickTime); } }); } - public void readOpenUrl(final Uri url, final long clickTime, final OnDeeplinkResolvedListener callback) { + public void processAndResolveDeeplink(final Uri url, final long clickTime, final OnDeeplinkResolvedListener callback) { this.cachedDeeplinkResolutionCallback = callback; executor.submit(new Runnable() { @Override public void run() { - readOpenUrlI(url, clickTime); + processDeeplinkI(url, clickTime); } }); } @@ -1437,7 +1437,7 @@ private void processCachedDeeplinkI() { return; } - readOpenUrl(Uri.parse(cachedDeeplinkUrl), cachedDeeplinkClickTime); + processDeeplink(Uri.parse(cachedDeeplinkUrl), cachedDeeplinkClickTime); sharedPreferencesManager.removeDeeplink(); } @@ -2001,7 +2001,7 @@ private boolean isValidReferrerDetails(final ReferrerDetails referrerDetails) { return referrerDetails.installReferrer.length() != 0; } - private void readOpenUrlI(Uri url, long clickTime) { + private void processDeeplinkI(Uri url, long clickTime) { if (!isEnabledI()) { return; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index f41f5ef18..a84890421 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -105,28 +105,15 @@ public static boolean isAdjustUninstallDetectionPayload(Map payl return Util.isAdjustUninstallDetectionPayload(payload); } - /** - * Called to process deep link. - * - * @param url Deep link URL to process - * - * @deprecated Use {@link #appWillOpenUrl(Uri, Context)}} instead. - */ - @Deprecated - public static void appWillOpenUrl(Uri url) { - AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.appWillOpenUrl(url); - } - /** * Called to process deep link. * * @param url Deep link URL to process * @param context Application context */ - public static void appWillOpenUrl(Uri url, Context context) { + public static void processDeeplink(Uri url, Context context) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.appWillOpenUrl(url, extractApplicationContext(context)); + adjustInstance.processDeeplink(url, extractApplicationContext(context)); } /** @@ -136,9 +123,9 @@ public static void appWillOpenUrl(Uri url, Context context) { * @param callback Callback where either resolved or echoed deep link will be sent. * @param context Application context */ - public static void processDeeplink(Uri url, Context context, OnDeeplinkResolvedListener callback) { + public static void processAndResolveDeeplink(Uri url, Context context, OnDeeplinkResolvedListener callback) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.processDeeplink(url, extractApplicationContext(context), callback); + adjustInstance.processAndResolveDeeplink(url, extractApplicationContext(context), callback); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index e0fff0831..81ca1fa67 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -160,26 +160,13 @@ public boolean isEnabled() { return activityHandler.isEnabled(); } - /** - * Called to process deep link. - * - * @param url Deep link URL to process - */ - public void appWillOpenUrl(final Uri url) { - if (!checkActivityHandler("appWillOpenUrl")) { - return; - } - long clickTime = System.currentTimeMillis(); - activityHandler.readOpenUrl(url, clickTime); - } - /** * Called to process deep link. * * @param url Deep link URL to process * @param context Application context */ - public void appWillOpenUrl(final Uri url, final Context context) { + public void processDeeplink(final Uri url, final Context context) { // Check for deep link validity. If invalid, return. if (url == null || url.toString().length() == 0) { AdjustFactory.getLogger().warn( @@ -188,12 +175,12 @@ public void appWillOpenUrl(final Uri url, final Context context) { } long clickTime = System.currentTimeMillis(); - if (!checkActivityHandler("appWillOpenUrl", true)) { + if (!checkActivityHandler("processDeeplink", true)) { saveDeeplink(url, clickTime, context); return; } - activityHandler.readOpenUrl(url, clickTime); + activityHandler.processDeeplink(url, clickTime); } /** @@ -203,23 +190,23 @@ public void appWillOpenUrl(final Uri url, final Context context) { * @param callback Callback where either resolved or echoed deep link will be sent. * @param context Application context */ - public void processDeeplink(Uri url, Context context, OnDeeplinkResolvedListener callback) { + public void processAndResolveDeeplink(Uri url, Context context, OnDeeplinkResolvedListener callback) { // if resolution result is not wanted, fallback to default method if (callback == null) { - appWillOpenUrl(url, context); + processDeeplink(url, context); return; } // if deep link processing is triggered prior to SDK being initialized long clickTime = System.currentTimeMillis(); - if (!checkActivityHandler("processDeeplink", true)) { + if (!checkActivityHandler("processAndResolveDeeplink", true)) { saveDeeplink(url, clickTime, context); this.cachedDeeplinkResolutionCallback = callback; return; } // if deep link processing was triggered with SDK being initialized - activityHandler.readOpenUrl(url, clickTime, callback); + activityHandler.processAndResolveDeeplink(url, clickTime, callback); } /** @@ -689,7 +676,7 @@ private void saveGdprForgetMe(final Context context) { * Save deep link to shared preferences. * * @param deeplink Deeplink Uri object - * @param clickTime Time when appWillOpenUrl(Uri, Context) method was called + * @param clickTime Time when processDeeplink(Uri, Context) method was called * @param context Application context */ private void saveDeeplink(final Uri deeplink, final long clickTime, final Context context) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 5cd61ff6e..8ca99d51f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -21,9 +21,9 @@ public interface IActivityHandler { boolean isEnabled(); - void readOpenUrl(Uri url, long clickTime); + void processDeeplink(Uri url, long clickTime); - void readOpenUrl(Uri url, long clickTime, OnDeeplinkResolvedListener callback); + void processAndResolveDeeplink(Uri url, long clickTime, OnDeeplinkResolvedListener callback); boolean updateAttributionI(AdjustAttribution attribution); diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index 366c41c42..14c2ba3c7 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -63,12 +63,6 @@ var Adjust = { } }, - appWillOpenUrl: function (url) { - if (AdjustBridge) { - AdjustBridge.appWillOpenUrl(url); - } - }, - setReferrer: function (referrer) { if (AdjustBridge) { AdjustBridge.setReferrer(referrer); diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 98b09149b..bf89ce9bc 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -491,18 +491,6 @@ public boolean isEnabled() { return Adjust.isEnabled(); } - @JavascriptInterface - public void appWillOpenUrl(String deeplinkString) { - if (!isInitialized()) { - return; - } - Uri deeplink = null; - if (deeplinkString != null) { - deeplink = Uri.parse(deeplinkString); - } - Adjust.appWillOpenUrl(deeplink, application.getApplicationContext()); - } - @JavascriptInterface public void setReferrer(String referrer) { if (!isInitialized()) { diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 04a5b874a..d00714405 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -617,7 +617,7 @@ private void teardown() throws NullPointerException { private void openDeeplink() { String deeplink = command.getFirstParameterValue("deeplink"); - Adjust.appWillOpenUrl(Uri.parse(deeplink), this.context); + Adjust.processDeeplink(Uri.parse(deeplink), this.context); } private void sendReferrer() { @@ -784,7 +784,7 @@ private void processDeeplink() { String deeplink = command.getFirstParameterValue("deeplink"); Uri deeplinkUri = Uri.parse(deeplink); final String localBasePath = basePath; - Adjust.processDeeplink(deeplinkUri, context, new OnDeeplinkResolvedListener() { + Adjust.processAndResolveDeeplink(deeplinkUri, context, new OnDeeplinkResolvedListener() { @Override public void onDeeplinkResolved(String resolvedLink) { MainActivity.testLibrary.addInfoToSend("resolved_link", resolvedLink); diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java index f56cdc0ad..49ae619e1 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java @@ -25,7 +25,7 @@ protected void onCreate(Bundle savedInstanceState) { Intent intent = getIntent(); Uri deeplinkData = intent.getData(); if (deeplinkData != null) { - Adjust.appWillOpenUrl(deeplinkData, getApplicationContext()); + Adjust.processDeeplink(deeplinkData, getApplicationContext()); return; } diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index e05bc9fc9..06859da58 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -606,11 +606,6 @@ AdjustCommandExecutor.prototype.setPushToken = function(params) { Adjust.setPushToken(token); }; -AdjustCommandExecutor.prototype.openDeeplink = function(params) { - var deeplink = getFirstParameterValue(params, "deeplink"); - Adjust.appWillOpenUrl(deeplink); -}; - AdjustCommandExecutor.prototype.sendReferrer = function(params) { var referrer = getFirstParameterValue(params, 'referrer'); Adjust.setReferrer(referrer); diff --git a/Adjust/test-app-webbridge/src/main/java/com/example/testappwebbridge/MainActivity.java b/Adjust/test-app-webbridge/src/main/java/com/example/testappwebbridge/MainActivity.java index 0c0c16a16..5d0f916fa 100644 --- a/Adjust/test-app-webbridge/src/main/java/com/example/testappwebbridge/MainActivity.java +++ b/Adjust/test-app-webbridge/src/main/java/com/example/testappwebbridge/MainActivity.java @@ -49,22 +49,10 @@ public boolean onConsoleMessage(ConsoleMessage consoleMessage) { Log.d("testappwebbridge", "loadUrl, exception: " + e.getMessage()); e.printStackTrace(); } - - // Check if deferred deep link was received - Intent intent = getIntent(); - Uri deeplinkData = intent.getData(); - if (deeplinkData != null) { - Adjust.appWillOpenUrl(deeplinkData, getApplicationContext()); - } } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); - - Uri deeplink = intent.getData(); - if (deeplink != null) { - Adjust.appWillOpenUrl(deeplink, getApplicationContext()); - } } } From 3fb3af20c6c8f722d2109349661ba0de01412181 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 23 May 2024 09:27:10 +0200 Subject: [PATCH 158/540] chore: add `Override` annotation for processAndResolveDeeplink method --- .../sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index e04c55f88..0abeb0d4d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -417,6 +417,7 @@ public void run() { }); } + @Override public void processAndResolveDeeplink(final Uri url, final long clickTime, final OnDeeplinkResolvedListener callback) { this.cachedDeeplinkResolutionCallback = callback; executor.submit(new Runnable() { From ff343aab34fcfa10efcdcd9719d541d8b7354b77 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 22 May 2024 13:35:26 +0200 Subject: [PATCH 159/540] refac: remove eventBuffering from AdjustConfig.java --- .../adjust/examples/GlobalApplication.java | 3 -- .../examples/keyboard/GlobalApplication.java | 3 -- .../com/adjust/examples/GlobalApplication.kt | 2 - .../adjust/examples/GlobalApplication.java | 3 -- .../main/assets/AdjustExample-WebView.html | 1 - .../java/com/adjust/sdk/ActivityHandler.java | 47 ++++--------------- .../java/com/adjust/sdk/AdjustConfig.java | 13 ----- .../java/com/adjust/sdk/PackageBuilder.java | 11 ----- .../src/main/assets/adjust_config.js | 5 -- .../sdk/webbridge/AdjustBridgeInstance.java | 7 --- .../adjust/testapp/AdjustCommandExecutor.java | 5 -- .../src/main/assets/command_executor.js | 6 --- 12 files changed, 8 insertions(+), 98 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 85e1da546..ba76ccf5e 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -108,9 +108,6 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Allow to send in the background. config.setSendInBackground(true); - // Enable event buffering. - // config.setEventBufferingEnabled(true); - // Allow tracking preinstall // config.setPreinstallTrackingEnabled(true); diff --git a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java index 1cc5bf8a8..37b46609b 100644 --- a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java +++ b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java @@ -103,9 +103,6 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Allow to send in the background. config.setSendInBackground(true); - // Enable event buffering. - // config.setEventBufferingEnabled(true); - // Add session callback parameters. Adjust.addGlobalCallbackParameter("sc_foo", "sc_bar"); Adjust.addGlobalCallbackParameter("sc_key", "sc_value"); diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt index a13bb6f67..e26d1f522 100644 --- a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt +++ b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt @@ -68,8 +68,6 @@ class GlobalApplication : Application() { // Allow to send in the background. config.setSendInBackground(true) - // Enable event buffering. - // config.setEventBufferingEnabled(true); // Allow tracking preinstall // config.setPreinstallTrackingEnabled(true); diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java index 3c76809e1..0778692cf 100755 --- a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java @@ -100,9 +100,6 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Allow to send in the background. config.setSendInBackground(true); - // Enable event buffering. - // config.setEventBufferingEnabled(true); - // Add session callback parameters. Adjust.addGlobalCallbackParameter("sc_foo", "sc_bar"); Adjust.addGlobalCallbackParameter("sc_key", "sc_value"); diff --git a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html index 3d7a57882..9770368d4 100755 --- a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html +++ b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html @@ -64,7 +64,6 @@

Adjust Web View SDK Demo adjustConfig.setLogLevel(AdjustConfig.LogLevelVerbose); // adjustConfig.setOpenDeferredDeeplink(true); // adjustConfig.setSendInBackground(true); - // adjustConfig.setEventBufferingEnabled(false); adjustConfig.setAttributionCallback(attributionCallback); adjustConfig.setEventSuccessCallback(eventSuccessCallback); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 0abeb0d4d..48678e7e4 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -814,10 +814,6 @@ public void run(ActivityHandler activityHandler) { deviceInfo = new DeviceInfo(adjustConfig, coppaEnabledInState, playStoreKidsAppEnabled); - if (adjustConfig.eventBufferingEnabled) { - logger.info("Event buffering is enabled"); - } - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabledInState, playStoreKidsAppEnabled); if (deviceInfo.playAdId == null) { if (!Util.canReadPlayIds(adjustConfig, coppaEnabledInState, playStoreKidsAppEnabled)) { @@ -1471,11 +1467,7 @@ private void trackEventI(AdjustEvent event) { ActivityPackage eventPackage = eventBuilder.buildEventPackage(event); packageHandler.addPackage(eventPackage); - if (adjustConfig.eventBufferingEnabled) { - logger.info("Buffered event %s", eventPackage.getSuffix()); - } else { - packageHandler.sendFirstPackage(); - } + packageHandler.sendFirstPackage(); // if it is in the background and it can send, start the background timer if (adjustConfig.sendInBackground && internalState.isInBackground()) { @@ -2036,11 +2028,8 @@ private void updateHandlersStatusAndSendI() { } resumeSendingI(); - - // if event buffering is not enabled - if (!adjustConfig.eventBufferingEnabled || - // or if it's the first launch and it hasn't received the session response - (internalState.isFirstLaunch() && internalState.hasSessionResponseNotBeenProcessed())) + // if it's the first launch and it hasn't received the session response + if ((internalState.isFirstLaunch() && internalState.hasSessionResponseNotBeenProcessed())) { // try to send packageHandler.sendFirstPackage(); @@ -2304,11 +2293,7 @@ private void setPushTokenI(String token) { // If push token was cached, remove it. SharedPreferencesManager.getDefaultInstance(getContext()).removePushToken(); - if (adjustConfig.eventBufferingEnabled) { - logger.info("Buffered event %s", infoPackage.getSuffix()); - } else { - packageHandler.sendFirstPackage(); - } + packageHandler.sendFirstPackage(); } private void gdprForgetMeI() { @@ -2329,11 +2314,7 @@ private void gdprForgetMeI() { // If GDPR choice was cached, remove it. SharedPreferencesManager.getDefaultInstance(getContext()).removeGdprForgetMe(); - if (adjustConfig.eventBufferingEnabled) { - logger.info("Buffered event %s", gdprPackage.getSuffix()); - } else { - packageHandler.sendFirstPackage(); - } + packageHandler.sendFirstPackage(); } private void trackThirdPartySharingI(final AdjustThirdPartySharing adjustThirdPartySharing) { @@ -2354,11 +2335,7 @@ private void trackThirdPartySharingI(final AdjustThirdPartySharing adjustThirdPa packageBuilder.buildThirdPartySharingPackage(adjustThirdPartySharing); packageHandler.addPackage(activityPackage); - if (adjustConfig.eventBufferingEnabled) { - logger.info("Buffered event %s", activityPackage.getSuffix()); - } else { - packageHandler.sendFirstPackage(); - } + packageHandler.sendFirstPackage(); } private void trackMeasurementConsentI(final boolean consentMeasurement) { @@ -2378,11 +2355,7 @@ private void trackMeasurementConsentI(final boolean consentMeasurement) { packageBuilder.buildMeasurementConsentPackage(consentMeasurement); packageHandler.addPackage(activityPackage); - if (adjustConfig.eventBufferingEnabled) { - logger.info("Buffered event %s", activityPackage.getSuffix()); - } else { - packageHandler.sendFirstPackage(); - } + packageHandler.sendFirstPackage(); } private void trackAdRevenueI(AdjustAdRevenue adjustAdRevenue) { @@ -2506,11 +2479,7 @@ private void setCoppaComplianceI(final boolean coppaEnabled) { writeActivityStateI(); - if (adjustConfig.eventBufferingEnabled) { - logger.info("Buffered event %s", activityPackage.getSuffix()); - } else { - packageHandler.sendFirstPackage(); - } + packageHandler.sendFirstPackage(); } private void gotOptOutResponseI() { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 32ca6e657..2d4a3cd8c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -17,7 +17,6 @@ public class AdjustConfig { String environment; String processName; String sdkPrefix; - boolean eventBufferingEnabled; String defaultTracker; OnAttributionChangedListener onAttributionChangedListener; Class deepLinkComponent; @@ -81,18 +80,10 @@ private void init(Context context, String appToken, String environment, boolean this.environment = environment; // default values - this.eventBufferingEnabled = false; this.sendInBackground = false; this.preinstallTrackingEnabled = false; } - public void setEventBufferingEnabled(Boolean eventBufferingEnabled) { - if (eventBufferingEnabled == null) { - this.eventBufferingEnabled = false; - return; - } - this.eventBufferingEnabled = eventBufferingEnabled; - } public void setSendInBackground(boolean sendInBackground) { this.sendInBackground = sendInBackground; @@ -227,10 +218,6 @@ public String getSdkPrefix() { return sdkPrefix; } - public boolean isEventBufferingEnabled() { - return eventBufferingEnabled; - } - public String getDefaultTracker() { return defaultTracker; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 0e49285a4..122938e99 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -277,7 +277,6 @@ private Map getSessionParameters() { PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); @@ -367,7 +366,6 @@ public Map getEventParameters(AdjustEvent event) { PackageBuilder.addString(parameters, "environment", adjustConfig.environment); PackageBuilder.addString(parameters, "event_callback_id", event.callbackId); PackageBuilder.addLong(parameters, "event_count", activityStateCopy.eventCount); - PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); PackageBuilder.addString(parameters, "event_token", event.eventToken); PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); @@ -441,7 +439,6 @@ private Map getInfoParameters(String source) { PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addBoolean(parameters, "needs_response_details", true); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); @@ -519,7 +516,6 @@ private Map getClickParameters(String source) { PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); PackageBuilder.addBoolean(parameters, "google_play_instant", googlePlayInstant); @@ -610,7 +606,6 @@ private Map getAttributionParameters(String initiatedBy) { PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addString(parameters, "initiated_by", initiatedBy); PackageBuilder.addBoolean(parameters, "needs_response_details", true); @@ -672,7 +667,6 @@ private Map getGdprParameters() { PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addBoolean(parameters, "needs_response_details", true); PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); @@ -746,7 +740,6 @@ private Map getGdprParameters() { PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addBoolean(parameters, "needs_response_details", true); PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); @@ -812,7 +805,6 @@ private Map getMeasurementConsentParameters( PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addBoolean(parameters, "needs_response_details", true); PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); @@ -972,7 +964,6 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); @@ -1067,7 +1058,6 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); @@ -1159,7 +1149,6 @@ private Map getVerificationParameters(AdjustPurchase purchase) { PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js index f65e3c21b..e698cb9bc 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -19,7 +19,6 @@ function AdjustConfig(appToken, environment, legacy) { } } - this.eventBufferingEnabled = null; this.sendInBackground = null; this.logLevel = null; this.sdkPrefix = null; @@ -72,10 +71,6 @@ AdjustConfig.prototype.getBridge = function() { return this.bridge; }; -AdjustConfig.prototype.setEventBufferingEnabled = function(isEnabled) { - this.eventBufferingEnabled = isEnabled; -}; - AdjustConfig.prototype.setSendInBackground = function(isEnabled) { this.sendInBackground = isEnabled; }; diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index bf89ce9bc..c6806ed58 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -141,7 +141,6 @@ public void onCreate(String adjustConfigString) { Object appTokenField = jsonAdjustConfig.get("appToken"); Object environmentField = jsonAdjustConfig.get("environment"); Object allowSuppressLogLevelField = jsonAdjustConfig.get("allowSuppressLogLevel"); - Object eventBufferingEnabledField = jsonAdjustConfig.get("eventBufferingEnabled"); Object sendInBackgroundField = jsonAdjustConfig.get("sendInBackground"); Object logLevelField = jsonAdjustConfig.get("logLevel"); Object sdkPrefixField = jsonAdjustConfig.get("sdkPrefix"); @@ -179,12 +178,6 @@ public void onCreate(String adjustConfigString) { return; } - // Event buffering - Boolean eventBufferingEnabled = AdjustBridgeUtil.fieldToBoolean(eventBufferingEnabledField); - if (eventBufferingEnabled != null) { - adjustConfig.setEventBufferingEnabled(eventBufferingEnabled); - } - // Send in the background Boolean sendInBackground = AdjustBridgeUtil.fieldToBoolean(sendInBackgroundField); if (sendInBackground != null) { diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index d00714405..4c14d634e 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -283,11 +283,6 @@ private void config() { adjustConfig.setNeedsCost(needsCost); } - if (command.containsParameter("eventBufferingEnabled")) { - String eventBufferingEnabledS = command.getFirstParameterValue("eventBufferingEnabled"); - boolean eventBufferingEnabled = "true".equals(eventBufferingEnabledS); - adjustConfig.setEventBufferingEnabled(eventBufferingEnabled); - } if (command.containsParameter("sendInBackground")) { String sendInBackgroundS = command.getFirstParameterValue("sendInBackground"); diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index 06859da58..0a6e70d61 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -302,12 +302,6 @@ AdjustCommandExecutor.prototype.config = function(params) { adjustConfig.setNeedsCost(needsCost); } - if ('eventBufferingEnabled' in params) { - var eventBufferingEnabledS = getFirstParameterValue(params, 'eventBufferingEnabled'); - var eventBufferingEnabled = eventBufferingEnabledS == 'true'; - adjustConfig.setEventBufferingEnabled(eventBufferingEnabled); - } - if ('sendInBackground' in params) { var sendInBackgroundS = getFirstParameterValue(params, 'sendInBackground'); var sendInBackground = sendInBackgroundS == 'true'; From 38c10ad211e64d46adb743c49c445ce2b8ec68b5 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 13 May 2024 17:37:39 +0200 Subject: [PATCH 160/540] style:refactor isEnabled to async getter --- .../src/main/AndroidManifest.xml | 4 +- .../com/adjust/examples/MainActivity.java | 59 +++++++++++++------ .../com/adjust/examples/MainActivity.java | 56 ++++++++++++------ .../main/assets/AdjustExample-WebView.html | 9 +-- .../java/com/adjust/sdk/ActivityHandler.java | 5 ++ .../src/main/java/com/adjust/sdk/Adjust.java | 8 ++- .../java/com/adjust/sdk/AdjustInstance.java | 7 ++- .../java/com/adjust/sdk/IActivityHandler.java | 1 + .../com/adjust/sdk/OnIsEnabledListener.java | 5 ++ .../sdk/webbridge/AdjustBridgeInstance.java | 29 ++++++--- 10 files changed, 126 insertions(+), 57 deletions(-) create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/OnIsEnabledListener.java diff --git a/Adjust/example-app-java/src/main/AndroidManifest.xml b/Adjust/example-app-java/src/main/AndroidManifest.xml index 3e10e6500..e8ed52227 100644 --- a/Adjust/example-app-java/src/main/AndroidManifest.xml +++ b/Adjust/example-app-java/src/main/AndroidManifest.xml @@ -16,7 +16,9 @@ android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" - android:theme="@style/AppTheme"> + android:theme="@style/AppTheme" + tools:remove="android:appComponentFactory" + tools:targetApi="p" > Adjust Web View SDK Demo var btnIsSdkEnabled = document.getElementById('btnIsSdkEnabled') btnIsSdkEnabled.onclick = function(e) { e.preventDefault(); - alert('Is SDK enabled? ' + Adjust.isEnabled()); + Adjust.isEnabled(function (isEnabled){ + alert('Is SDK enabled? ' + isEnabled); + }); } var btnGetGoogleAdId = document.getElementById('btnGetGoogleAdId') @@ -152,9 +154,8 @@

Adjust Web View SDK Demo var btnGetAmazonId = document.getElementById('btnGetAmazonId') btnGetAmazonId.onclick = function(e) { e.preventDefault(); - Adjust.getAmazonAdId(function (gpsAdid) { - alert('Amazon Ad Id:\n' + gpsAdid); - alert('Message:\n' + message); + Adjust.getAmazonAdId(function (amazonAdid) { + alert('Amazon Ad Id:\n' + amazonAdid); }, function (message) { alert('Message:\n' + message); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 48678e7e4..2d535f208 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -399,6 +399,11 @@ public boolean isEnabled() { return isEnabledI(); } + @Override + public void getIsEnabled(OnIsEnabledListener onIsEnabledListener) { + onIsEnabledListener.onIsEnabledRead(isEnabledI()); + } + private boolean isEnabledI() { if (activityState != null) { return activityState.enabled; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index a84890421..d6baef4ce 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -91,9 +91,13 @@ public static void setEnabled(boolean enabled) { * * @return boolean indicating whether SDK is enabled or not */ - public static boolean isEnabled() { + public static void isEnabled(final OnIsEnabledListener isEnabledListener) { + if (isEnabledListener == null) { + AdjustFactory.getLogger().error("Callback for getting isEnabled can't be null"); + return; + } AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - return adjustInstance.isEnabled(); + adjustInstance.isEnabled(isEnabledListener); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 81ca1fa67..71b07fb39 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -153,11 +153,12 @@ public void setEnabled(final boolean enabled) { * * @return boolean indicating whether SDK is enabled or not */ - public boolean isEnabled() { + public void isEnabled(OnIsEnabledListener isEnabledListener) { if (!checkActivityHandler("isEnabled")) { - return isInstanceEnabled(); + isEnabledListener.onIsEnabledRead(isInstanceEnabled()); + return; } - return activityHandler.isEnabled(); + activityHandler.getIsEnabled(isEnabledListener); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 8ca99d51f..6ebd58285 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -20,6 +20,7 @@ public interface IActivityHandler { void setEnabled(boolean enabled); boolean isEnabled(); + void getIsEnabled(OnIsEnabledListener onIsEnabledListener); void processDeeplink(Uri url, long clickTime); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnIsEnabledListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnIsEnabledListener.java new file mode 100644 index 000000000..2f98b7dc4 --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnIsEnabledListener.java @@ -0,0 +1,5 @@ +package com.adjust.sdk; + +public interface OnIsEnabledListener { + void onIsEnabledRead(boolean isEnabled); +} diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index c6806ed58..96d4c87f0 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -27,6 +27,7 @@ import com.adjust.sdk.OnDeviceIdsRead; import com.adjust.sdk.OnEventTrackingFailedListener; import com.adjust.sdk.OnEventTrackingSucceededListener; +import com.adjust.sdk.OnIsEnabledListener; import com.adjust.sdk.OnSessionTrackingFailedListener; import com.adjust.sdk.OnSessionTrackingSucceededListener; @@ -472,17 +473,27 @@ public void isEnabled(String callback) { if (!isInitialized()) { return; } - boolean isEnabled = Adjust.isEnabled(); - AdjustBridgeUtil.execSingleValueCallback(webView, callback, String.valueOf(isEnabled)); + Adjust.isEnabled(new OnIsEnabledListener() { + @Override + public void onIsEnabledRead(boolean isEnabled) { + AdjustBridgeUtil.execSingleValueCallback(webView, callback, String.valueOf(isEnabled)); + } + }); } - @JavascriptInterface - public boolean isEnabled() { - if (!isInitialized()) { - return false; - } - return Adjust.isEnabled(); - } +// @JavascriptInterface +// public boolean isEnabled() { +// if (!isInitialized()) { +// return false; +// } +// +// Adjust.isEnabled(new OnIsEnabledListener() { +// @Override +// public void onIsEnabledRead(boolean isEnabled) { +// +// } +// }); +// } @JavascriptInterface public void setReferrer(String referrer) { From 61d4cbf518faa245149863c71df86e169a71d4f2 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 13 May 2024 18:49:18 +0200 Subject: [PATCH 161/540] style:submit getIsEnabled in executor --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 2d535f208..0e10bc9c4 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -401,7 +401,12 @@ public boolean isEnabled() { @Override public void getIsEnabled(OnIsEnabledListener onIsEnabledListener) { - onIsEnabledListener.onIsEnabledRead(isEnabledI()); + executor.submit(new Runnable() { + @Override + public void run() { + onIsEnabledListener.onIsEnabledRead(isEnabledI()); + } + }); } private boolean isEnabledI() { From 88329a23b54bd2c3cec0c78ab93c1c61f30def4d Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 15 May 2024 11:18:05 +0200 Subject: [PATCH 162/540] refac:rename getIsEnabled to isEnabled --- .../sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java | 2 +- .../sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java | 2 +- .../sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 0e10bc9c4..3057a21db 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -400,7 +400,7 @@ public boolean isEnabled() { } @Override - public void getIsEnabled(OnIsEnabledListener onIsEnabledListener) { + public void isEnabled(OnIsEnabledListener onIsEnabledListener) { executor.submit(new Runnable() { @Override public void run() { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 71b07fb39..baa8824d7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -158,7 +158,7 @@ public void isEnabled(OnIsEnabledListener isEnabledListener) { isEnabledListener.onIsEnabledRead(isInstanceEnabled()); return; } - activityHandler.getIsEnabled(isEnabledListener); + activityHandler.isEnabled(isEnabledListener); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 6ebd58285..2f72384e6 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -20,7 +20,7 @@ public interface IActivityHandler { void setEnabled(boolean enabled); boolean isEnabled(); - void getIsEnabled(OnIsEnabledListener onIsEnabledListener); + void isEnabled(OnIsEnabledListener onIsEnabledListener); void processDeeplink(Uri url, long clickTime); From 4f4d344527bc82acfcc556917bb0eabf1c67d7c6 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 21 May 2024 14:58:52 +0200 Subject: [PATCH 163/540] refac: read enabled from activity state file if sdk is not initialized --- .../java/com/adjust/examples/MainActivity.java | 6 +++--- .../src/main/java/com/adjust/sdk/Adjust.java | 4 ++-- .../main/java/com/adjust/sdk/AdjustInstance.java | 4 ++-- .../src/main/java/com/adjust/sdk/Util.java | 14 ++++++++++++++ .../adjust/sdk/webbridge/AdjustBridgeInstance.java | 2 +- 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java b/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java index 15a3b6da1..ffb6e278b 100755 --- a/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java +++ b/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java @@ -47,7 +47,7 @@ public void onIsEnabledRead(boolean isEnabled) { btnEnableDisableSDK.setText(R.string.txt_enable_sdk); } } - }); + }, getApplicationContext()); } @@ -107,7 +107,7 @@ public void onIsEnabledRead(boolean isEnabled) { ((Button) v).setText(R.string.txt_disable_sdk); } } - }); + }, getApplicationContext()); } @@ -123,7 +123,7 @@ public void onIsEnabledRead(boolean isEnabled) { Toast.LENGTH_SHORT).show(); } } - }); + }, getApplicationContext()); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index d6baef4ce..400e7b377 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -91,13 +91,13 @@ public static void setEnabled(boolean enabled) { * * @return boolean indicating whether SDK is enabled or not */ - public static void isEnabled(final OnIsEnabledListener isEnabledListener) { + public static void isEnabled(final OnIsEnabledListener isEnabledListener, final Context context) { if (isEnabledListener == null) { AdjustFactory.getLogger().error("Callback for getting isEnabled can't be null"); return; } AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.isEnabled(isEnabledListener); + adjustInstance.isEnabled(isEnabledListener, context); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index baa8824d7..fb4c450a0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -153,9 +153,9 @@ public void setEnabled(final boolean enabled) { * * @return boolean indicating whether SDK is enabled or not */ - public void isEnabled(OnIsEnabledListener isEnabledListener) { + public void isEnabled(final OnIsEnabledListener isEnabledListener, final Context context) { if (!checkActivityHandler("isEnabled")) { - isEnabledListener.onIsEnabledRead(isInstanceEnabled()); + isEnabledListener.onIsEnabledRead(Util.isEnabledFromActivityStateFile(context)); return; } activityHandler.isEnabled(isEnabledListener); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index d4afcf582..8ba6a4ccc 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -9,6 +9,7 @@ package com.adjust.sdk; +import static com.adjust.sdk.Constants.ACTIVITY_STATE_FILENAME; import static com.adjust.sdk.Constants.ENCODING; import android.content.Context; @@ -721,4 +722,17 @@ private static boolean isEqualMetaReferrerDetails(final ReferrerDetails referrer && Util.equalString(referrerDetails.installReferrer, activityState.installReferrerMeta) && Util.equalBoolean(referrerDetails.isClick, activityState.isClickMeta); } + + public static boolean isEnabledFromActivityStateFile(final Context context) { + ActivityState activityState = Util.readObject( + context, + Constants.ACTIVITY_STATE_FILENAME, + "Activity state", + ActivityState.class); + if (activityState == null) { + return true; + } else { + return activityState.enabled; + } + } } \ No newline at end of file diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 96d4c87f0..d0ac8b0e6 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -478,7 +478,7 @@ public void isEnabled(String callback) { public void onIsEnabledRead(boolean isEnabled) { AdjustBridgeUtil.execSingleValueCallback(webView, callback, String.valueOf(isEnabled)); } - }); + }, application.getApplicationContext()); } // @JavascriptInterface From a8af07e11c563dd598b7e68ada84f69d2c9ae751 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 22 May 2024 12:44:59 +0200 Subject: [PATCH 164/540] refac:change isEnabled function signature move context as first param extract application context inside the function --- .../com/adjust/examples/MainActivity.java | 6 +-- .../java/com/adjust/examples/MainActivity.kt | 45 +++++++++++-------- .../com/adjust/examples/MainActivity.java | 12 ++--- .../src/main/java/com/adjust/sdk/Adjust.java | 12 +++-- .../java/com/adjust/sdk/AdjustInstance.java | 5 ++- .../sdk/webbridge/AdjustBridgeInstance.java | 4 +- 6 files changed, 49 insertions(+), 35 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java index ca8c7a23c..5ba6f3b41 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java @@ -45,7 +45,7 @@ protected void onCreate(Bundle savedInstanceState) { public void onResume() { super.onResume(); - Adjust.isEnabled(new OnIsEnabledListener() { + Adjust.isEnabled(this,new OnIsEnabledListener() { @Override public void onIsEnabledRead(boolean isEnabled) { if (isEnabled) { @@ -124,7 +124,7 @@ public void onEnableDisableOfflineModeClick(View v) { } public void onEnableDisableSDKClick(View v) { - Adjust.isEnabled(new OnIsEnabledListener() { + Adjust.isEnabled(this,new OnIsEnabledListener() { @Override public void onIsEnabledRead(boolean isEnabled) { if (isEnabled) { @@ -141,7 +141,7 @@ public void onIsEnabledRead(boolean isEnabled) { public void onIsSDKEnabledClick(View v) { - Adjust.isEnabled(new OnIsEnabledListener() { + Adjust.isEnabled(this,new OnIsEnabledListener() { @Override public void onIsEnabledRead(boolean isEnabled) { if (isEnabled) { diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt index c02e6f8a5..f398c07e1 100644 --- a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt +++ b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt @@ -11,6 +11,7 @@ import android.widget.Toast import com.adjust.sdk.Adjust import com.adjust.sdk.AdjustEvent +import com.adjust.sdk.OnIsEnabledListener class MainActivity : AppCompatActivity() { @@ -31,11 +32,13 @@ class MainActivity : AppCompatActivity() { public override fun onResume() { super.onResume() - if (Adjust.isEnabled()) { - btnEnableDisableSDK!!.setText(R.string.txt_disable_sdk) - } else { - btnEnableDisableSDK!!.setText(R.string.txt_enable_sdk) - } + Adjust.isEnabled(this, OnIsEnabledListener { + if (it) { + btnEnableDisableSDK!!.setText(R.string.txt_disable_sdk) + } else { + btnEnableDisableSDK!!.setText(R.string.txt_enable_sdk) + } + }) } override fun onCreateOptionsMenu(menu: Menu): Boolean { @@ -103,23 +106,27 @@ class MainActivity : AppCompatActivity() { } fun onEnableDisableSDKClick(v: View) { - if (Adjust.isEnabled()) { - Adjust.setEnabled(false) - (v as Button).setText(R.string.txt_enable_sdk) - } else { - Adjust.setEnabled(true) - (v as Button).setText(R.string.txt_disable_sdk) - } + Adjust.isEnabled(this, OnIsEnabledListener { + if (it) { + Adjust.setEnabled(false) + (v as Button).setText(R.string.txt_enable_sdk) + } else { + Adjust.setEnabled(true) + (v as Button).setText(R.string.txt_disable_sdk) + } + }) } fun onIsSDKEnabledClick(v: View) { - if (Adjust.isEnabled()) { - Toast.makeText(applicationContext, R.string.txt_sdk_is_enabled, - Toast.LENGTH_SHORT).show() - } else { - Toast.makeText(applicationContext, R.string.txt_sdk_is_disabled, - Toast.LENGTH_SHORT).show() - } + Adjust.isEnabled(this,OnIsEnabledListener { + if (it) { + Toast.makeText(applicationContext, R.string.txt_sdk_is_enabled, + Toast.LENGTH_SHORT).show() + } else { + Toast.makeText(applicationContext, R.string.txt_sdk_is_disabled, + Toast.LENGTH_SHORT).show() + } + }) } fun onFireIntentClick(v: View) { diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java b/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java index ffb6e278b..8deb57a4c 100755 --- a/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java +++ b/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java @@ -38,7 +38,7 @@ protected void onCreate(Bundle savedInstanceState) { @Override public void onResume() { super.onResume(); - Adjust.isEnabled(new OnIsEnabledListener() { + Adjust.isEnabled(this, new OnIsEnabledListener() { @Override public void onIsEnabledRead(boolean isEnabled) { if (isEnabled) { @@ -47,7 +47,7 @@ public void onIsEnabledRead(boolean isEnabled) { btnEnableDisableSDK.setText(R.string.txt_enable_sdk); } } - }, getApplicationContext()); + }); } @@ -96,7 +96,7 @@ public void onEnableDisableOfflineModeClick(View v) { } public void onEnableDisableSDKClick(View v) { - Adjust.isEnabled(new OnIsEnabledListener() { + Adjust.isEnabled( getApplicationContext(),new OnIsEnabledListener() { @Override public void onIsEnabledRead(boolean isEnabled) { if (isEnabled) { @@ -107,12 +107,12 @@ public void onIsEnabledRead(boolean isEnabled) { ((Button) v).setText(R.string.txt_disable_sdk); } } - }, getApplicationContext()); + }); } public void onIsSDKEnabledClick(View v) { - Adjust.isEnabled(new OnIsEnabledListener() { + Adjust.isEnabled(getApplicationContext(),new OnIsEnabledListener() { @Override public void onIsEnabledRead(boolean isEnabled) { if (isEnabled) { @@ -123,7 +123,7 @@ public void onIsEnabledRead(boolean isEnabled) { Toast.LENGTH_SHORT).show(); } } - }, getApplicationContext()); + }); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 400e7b377..18b46147c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -89,15 +89,21 @@ public static void setEnabled(boolean enabled) { /** * Get information if SDK is enabled or not. * - * @return boolean indicating whether SDK is enabled or not + * @param context Application context + * @param isEnabledListener Callback to get triggered once information is obtained */ - public static void isEnabled(final OnIsEnabledListener isEnabledListener, final Context context) { + public static void isEnabled( final Context context, final OnIsEnabledListener isEnabledListener) { + if (context == null) { + AdjustFactory.getLogger().error("null context"); + return; + } if (isEnabledListener == null) { AdjustFactory.getLogger().error("Callback for getting isEnabled can't be null"); return; } + AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.isEnabled(isEnabledListener, context); + adjustInstance.isEnabled(extractApplicationContext(context),isEnabledListener); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index fb4c450a0..da1ca5125 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -151,9 +151,10 @@ public void setEnabled(final boolean enabled) { /** * Get information if SDK is enabled or not. * - * @return boolean indicating whether SDK is enabled or not + * @param context Application context + * @param isEnabledListener Callback to get triggered once information is obtained */ - public void isEnabled(final OnIsEnabledListener isEnabledListener, final Context context) { + public void isEnabled( final Context context, final OnIsEnabledListener isEnabledListener) { if (!checkActivityHandler("isEnabled")) { isEnabledListener.onIsEnabledRead(Util.isEnabledFromActivityStateFile(context)); return; diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index d0ac8b0e6..f12045447 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -473,12 +473,12 @@ public void isEnabled(String callback) { if (!isInitialized()) { return; } - Adjust.isEnabled(new OnIsEnabledListener() { + Adjust.isEnabled(application.getApplicationContext(),new OnIsEnabledListener() { @Override public void onIsEnabledRead(boolean isEnabled) { AdjustBridgeUtil.execSingleValueCallback(webView, callback, String.valueOf(isEnabled)); } - }, application.getApplicationContext()); + }); } // @JavascriptInterface From b763ee9b3ebebcc23e576788e6828f1b403f8b2e Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 22 May 2024 15:50:32 +0200 Subject: [PATCH 165/540] chore: clean up style a bit --- .../src/main/java/com/adjust/examples/MainActivity.java | 6 +++--- .../src/main/java/com/adjust/examples/MainActivity.kt | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 4 ++-- .../src/main/java/com/adjust/sdk/AdjustInstance.java | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java index 5ba6f3b41..eb7e5b276 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java @@ -45,7 +45,7 @@ protected void onCreate(Bundle savedInstanceState) { public void onResume() { super.onResume(); - Adjust.isEnabled(this,new OnIsEnabledListener() { + Adjust.isEnabled(this, new OnIsEnabledListener() { @Override public void onIsEnabledRead(boolean isEnabled) { if (isEnabled) { @@ -124,7 +124,7 @@ public void onEnableDisableOfflineModeClick(View v) { } public void onEnableDisableSDKClick(View v) { - Adjust.isEnabled(this,new OnIsEnabledListener() { + Adjust.isEnabled(this, new OnIsEnabledListener() { @Override public void onIsEnabledRead(boolean isEnabled) { if (isEnabled) { @@ -141,7 +141,7 @@ public void onIsEnabledRead(boolean isEnabled) { public void onIsSDKEnabledClick(View v) { - Adjust.isEnabled(this,new OnIsEnabledListener() { + Adjust.isEnabled(this, new OnIsEnabledListener() { @Override public void onIsEnabledRead(boolean isEnabled) { if (isEnabled) { diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt index f398c07e1..0ce510043 100644 --- a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt +++ b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt @@ -118,7 +118,7 @@ class MainActivity : AppCompatActivity() { } fun onIsSDKEnabledClick(v: View) { - Adjust.isEnabled(this,OnIsEnabledListener { + Adjust.isEnabled(this, OnIsEnabledListener { if (it) { Toast.makeText(applicationContext, R.string.txt_sdk_is_enabled, Toast.LENGTH_SHORT).show() diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 18b46147c..c9fef42b7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -92,7 +92,7 @@ public static void setEnabled(boolean enabled) { * @param context Application context * @param isEnabledListener Callback to get triggered once information is obtained */ - public static void isEnabled( final Context context, final OnIsEnabledListener isEnabledListener) { + public static void isEnabled(final Context context, final OnIsEnabledListener isEnabledListener) { if (context == null) { AdjustFactory.getLogger().error("null context"); return; @@ -103,7 +103,7 @@ public static void isEnabled( final Context context, final OnIsEnabledListener i } AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.isEnabled(extractApplicationContext(context),isEnabledListener); + adjustInstance.isEnabled(extractApplicationContext(context), isEnabledListener); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index da1ca5125..7dd57957c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -154,7 +154,7 @@ public void setEnabled(final boolean enabled) { * @param context Application context * @param isEnabledListener Callback to get triggered once information is obtained */ - public void isEnabled( final Context context, final OnIsEnabledListener isEnabledListener) { + public void isEnabled(final Context context, final OnIsEnabledListener isEnabledListener) { if (!checkActivityHandler("isEnabled")) { isEnabledListener.onIsEnabledRead(Util.isEnabledFromActivityStateFile(context)); return; From ad8a1e389973b9257b42296274d8f622d069fa71 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 22 May 2024 16:33:03 +0200 Subject: [PATCH 166/540] refac:load activityState on background thread inside of isEnabled function --- .../main/java/com/adjust/sdk/AdjustInstance.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 7dd57957c..2aab4258f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -3,6 +3,8 @@ import android.net.Uri; import android.content.Context; +import com.adjust.sdk.scheduler.AsyncTaskExecutor; + import java.util.List; import java.util.ArrayList; @@ -156,7 +158,17 @@ public void setEnabled(final boolean enabled) { */ public void isEnabled(final Context context, final OnIsEnabledListener isEnabledListener) { if (!checkActivityHandler("isEnabled")) { - isEnabledListener.onIsEnabledRead(Util.isEnabledFromActivityStateFile(context)); + new AsyncTaskExecutor(){ + @Override + protected Boolean doInBackground(Context... contexts) { + return Util.isEnabledFromActivityStateFile(contexts[0]); + } + + @Override + protected void onPostExecute(Boolean isEnabled) { + isEnabledListener.onIsEnabledRead(isEnabled); + } + }.execute(context); return; } activityHandler.isEnabled(isEnabledListener); From 467e760dd3e8cd1a3f7fa7b28da35d34504e739e Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 24 May 2024 15:22:19 +0200 Subject: [PATCH 167/540] clean:remove commented lines --- .../adjust/sdk/webbridge/AdjustBridgeInstance.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index f12045447..7cd2d7297 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -481,20 +481,6 @@ public void onIsEnabledRead(boolean isEnabled) { }); } -// @JavascriptInterface -// public boolean isEnabled() { -// if (!isInitialized()) { -// return false; -// } -// -// Adjust.isEnabled(new OnIsEnabledListener() { -// @Override -// public void onIsEnabledRead(boolean isEnabled) { -// -// } -// }); -// } - @JavascriptInterface public void setReferrer(String referrer) { if (!isInitialized()) { From 6cc0fe04154ace2cbf515a52b312bb44d6028da6 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 27 May 2024 13:47:51 +0200 Subject: [PATCH 168/540] refac: add async getter to obtaining XiaomiInstallReferrerDetails using OnXiaomiInstallReferrerReadListener --- .../sdk/xiaomi/AdjustXiaomiReferrer.java | 43 +++++++++++++++++++ .../OnXiaomiInstallReferrerReadListener.java | 7 +++ .../main/java/com/adjust/sdk/xiaomi/Util.java | 16 +++---- .../xiaomi/XiaomiInstallReferrerDetails.java | 23 ++++++++++ .../xiaomi/XiaomiInstallReferrerResult.java | 15 +++++++ .../sdk/xiaomi/XiaomiReferrerClient.java | 27 +++++++----- 6 files changed, 113 insertions(+), 18 deletions(-) create mode 100644 Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/OnXiaomiInstallReferrerReadListener.java create mode 100644 Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiInstallReferrerDetails.java create mode 100644 Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiInstallReferrerResult.java diff --git a/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/AdjustXiaomiReferrer.java b/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/AdjustXiaomiReferrer.java index 1690a1983..7a7574d71 100644 --- a/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/AdjustXiaomiReferrer.java +++ b/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/AdjustXiaomiReferrer.java @@ -2,6 +2,9 @@ import android.content.Context; +import com.adjust.sdk.AdjustFactory; +import com.adjust.sdk.scheduler.AsyncTaskExecutor; + public class AdjustXiaomiReferrer { static boolean shouldReadXiaomiReferrer = true; @@ -13,4 +16,44 @@ public static void readXiaomiReferrer(Context context) { public static void doNotReadXiaomiReferrer() { shouldReadXiaomiReferrer = false; } + + /** + * Read Xiaomi Install Referrer + * @param context Application context + * @param onXiaomiInstallReferrerReadListener Callback to obtain install referrer. + */ + public static void getXiaomiInstallReferrer(final Context context, final OnXiaomiInstallReferrerReadListener onXiaomiInstallReferrerReadListener) { + + if (onXiaomiInstallReferrerReadListener == null){ + AdjustFactory.getLogger().error("onXiaomiInstallReferrerReadListener can not be null"); + return; + } + + new AsyncTaskExecutor() { + @Override + protected XiaomiInstallReferrerResult doInBackground(Context[] contexts) { + try { + return XiaomiReferrerClient.getReferrer(context, AdjustFactory.getLogger(),2000); + } catch (Exception exception) { + return new XiaomiInstallReferrerResult(exception.getMessage()); + } + } + + @Override + protected void onPostExecute(XiaomiInstallReferrerResult xiaomiInstallReferrerResult) { + if (xiaomiInstallReferrerResult != null) { + if (xiaomiInstallReferrerResult.xiaomiInstallReferrerDetails != null) { + onXiaomiInstallReferrerReadListener.onXiaomiInstallReferrerRead(xiaomiInstallReferrerResult.xiaomiInstallReferrerDetails); + } else if (xiaomiInstallReferrerResult.error != null) { + onXiaomiInstallReferrerReadListener.onFail(xiaomiInstallReferrerResult.error); + }else { + onXiaomiInstallReferrerReadListener.onFail("XiaomiReferrer getInstallReferrer: xiaomiInstallReferrerDetails is null"); + } + }else { + onXiaomiInstallReferrerReadListener.onFail("XiaomiReferrer getInstallReferrer: xiaomiInstallReferrerResult is null"); + } + } + }.execute(context); + } + } diff --git a/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/OnXiaomiInstallReferrerReadListener.java b/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/OnXiaomiInstallReferrerReadListener.java new file mode 100644 index 000000000..4953a9181 --- /dev/null +++ b/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/OnXiaomiInstallReferrerReadListener.java @@ -0,0 +1,7 @@ +package com.adjust.sdk.xiaomi; + +public interface OnXiaomiInstallReferrerReadListener { + + void onXiaomiInstallReferrerRead(XiaomiInstallReferrerDetails referrerDetails); + void onFail(String message); +} diff --git a/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/Util.java b/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/Util.java index 35f071b6f..e6c4271bc 100644 --- a/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/Util.java +++ b/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/Util.java @@ -12,16 +12,16 @@ public synchronized static ReferrerDetails getXiaomiInstallReferrerDetails(Conte return null; } - GetAppsReferrerDetails getAppsReferrerDetails = XiaomiReferrerClient.getReferrer(context, logger, 3000); - if (getAppsReferrerDetails == null) { + XiaomiInstallReferrerDetails xiaomiInstallReferrerDetails = XiaomiReferrerClient.getReferrer(context, logger, 3000).xiaomiInstallReferrerDetails; + if (xiaomiInstallReferrerDetails == null) { return null; } - return new ReferrerDetails(getAppsReferrerDetails.getInstallReferrer(), - getAppsReferrerDetails.getReferrerClickTimestampSeconds(), - getAppsReferrerDetails.getInstallBeginTimestampSeconds(), - getAppsReferrerDetails.getReferrerClickTimestampServerSeconds(), - getAppsReferrerDetails.getInstallBeginTimestampServerSeconds(), - getAppsReferrerDetails.getInstallVersion(), null, null); + return new ReferrerDetails(xiaomiInstallReferrerDetails.installReferrer, + xiaomiInstallReferrerDetails.referrerClickTimestampSeconds, + xiaomiInstallReferrerDetails.installBeginTimestampSeconds, + xiaomiInstallReferrerDetails.referrerClickTimestampServerSeconds, + xiaomiInstallReferrerDetails.installBeginTimestampServerSeconds, + xiaomiInstallReferrerDetails.installVersion, null, null); } } diff --git a/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiInstallReferrerDetails.java b/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiInstallReferrerDetails.java new file mode 100644 index 000000000..161b838f5 --- /dev/null +++ b/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiInstallReferrerDetails.java @@ -0,0 +1,23 @@ +package com.adjust.sdk.xiaomi; + +import com.miui.referrer.api.GetAppsReferrerDetails; + +public class XiaomiInstallReferrerDetails { + + public String installReferrer; // The referrer URL of the installed package. + public long referrerClickTimestampSeconds; // The client-side timestamp, when the referrer click happened. + public long installBeginTimestampSeconds; // The client-side timestamp, when app installation began. + public long installBeginTimestampServerSeconds; // The server-side timestamp, when app installation began. + public long referrerClickTimestampServerSeconds; // The server-side timestamp, when the referrer click happened. + public String installVersion; // The app's version at the time when the app was first installed. + + public XiaomiInstallReferrerDetails(GetAppsReferrerDetails getAppsReferrerDetails) { + this.installReferrer = getAppsReferrerDetails.getInstallReferrer(); + this.referrerClickTimestampSeconds = getAppsReferrerDetails.getReferrerClickTimestampSeconds(); + this.installBeginTimestampSeconds = getAppsReferrerDetails.getInstallBeginTimestampSeconds(); + this.installBeginTimestampServerSeconds = getAppsReferrerDetails.getInstallBeginTimestampServerSeconds(); + this.referrerClickTimestampServerSeconds = getAppsReferrerDetails.getReferrerClickTimestampServerSeconds(); + this.installVersion = getAppsReferrerDetails.getInstallVersion(); + } + +} diff --git a/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiInstallReferrerResult.java b/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiInstallReferrerResult.java new file mode 100644 index 000000000..be128d54b --- /dev/null +++ b/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiInstallReferrerResult.java @@ -0,0 +1,15 @@ +package com.adjust.sdk.xiaomi; + +public class XiaomiInstallReferrerResult { + + public String error; + public XiaomiInstallReferrerDetails xiaomiInstallReferrerDetails; + + XiaomiInstallReferrerResult(XiaomiInstallReferrerDetails xiaomiInstallReferrerDetails) { + this.xiaomiInstallReferrerDetails = xiaomiInstallReferrerDetails; + } + + public XiaomiInstallReferrerResult(String error) { + this.error = error; + } +} diff --git a/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiReferrerClient.java b/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiReferrerClient.java index cbdbdfa07..ef5b6a80f 100644 --- a/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiReferrerClient.java +++ b/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiReferrerClient.java @@ -14,10 +14,10 @@ public class XiaomiReferrerClient { - public static GetAppsReferrerDetails getReferrer(Context context, final ILogger logger, long maxWaitTimeInMilli) { + public static XiaomiInstallReferrerResult getReferrer(Context context, final ILogger logger, long maxWaitTimeInMilli) { try { final GetAppsReferrerClient referrerClient = new GetAppsReferrerClient.Builder(context).build(); - final BlockingQueue referrerDetailsHolder = new LinkedBlockingQueue(1); + final BlockingQueue referrerDetailsHolder = new LinkedBlockingQueue(1); referrerClient.startConnection(new GetAppsReferrerStateListener() { @Override public void onGetAppsReferrerSetupFinished(int responseCode) { @@ -25,21 +25,29 @@ public void onGetAppsReferrerSetupFinished(int responseCode) { switch (responseCode) { case GetAppsReferrerResponse.OK: try { - GetAppsReferrerDetails getAppsReferrerDetails = referrerClient.getInstallReferrer(); - referrerDetailsHolder.offer(getAppsReferrerDetails); + XiaomiInstallReferrerDetails xiaomiInstallReferrerDetails = new XiaomiInstallReferrerDetails(referrerClient.getInstallReferrer()); + referrerDetailsHolder.offer(new XiaomiInstallReferrerResult(xiaomiInstallReferrerDetails)); } catch (Exception e) { - logger.error("XiaomiReferrer getInstallReferrer: " + e.getMessage()); + String message = "XiaomiReferrer getInstallReferrer: " + e.getMessage(); + logger.error(message); + referrerDetailsHolder.offer(new XiaomiInstallReferrerResult(message)); } break; case GetAppsReferrerResponse.FEATURE_NOT_SUPPORTED: - logger.info("XiaomiReferrer onGetAppsReferrerSetupFinished: FEATURE_NOT_SUPPORTED"); + String message = "XiaomiReferrer onGetAppsReferrerSetupFinished: FEATURE_NOT_SUPPORTED"; + logger.info(message); + referrerDetailsHolder.offer(new XiaomiInstallReferrerResult(message)); break; case GetAppsReferrerResponse.SERVICE_UNAVAILABLE: - logger.info("XiaomiReferrer onGetAppsReferrerSetupFinished: SERVICE_UNAVAILABLE"); + String message1 = "XiaomiReferrer onGetAppsReferrerSetupFinished: SERVICE_UNAVAILABLE"; + logger.info(message1); + referrerDetailsHolder.offer(new XiaomiInstallReferrerResult(message1)); break; } } catch (Exception e) { - logger.error("XiaomiReferrer onGetAppsReferrerSetupFinished: " + e.getMessage()); + String message = "XiaomiReferrer onGetAppsReferrerSetupFinished: " + e.getMessage(); + logger.error(message); + referrerDetailsHolder.offer(new XiaomiInstallReferrerResult(message)); } } @@ -52,8 +60,7 @@ public void onGetAppsServiceDisconnected() { } catch (Exception e) { logger.error("Exception while getting referrer: ", e.getMessage()); + return new XiaomiInstallReferrerResult(e.getMessage()); } - - return null; } } From cba9e2acbcfabfcd7f2924939c9326dd8671528c Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 27 May 2024 16:24:26 +0200 Subject: [PATCH 169/540] refac: udpate max wait time --- .../java/com/adjust/sdk/xiaomi/AdjustXiaomiReferrer.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/AdjustXiaomiReferrer.java b/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/AdjustXiaomiReferrer.java index 7a7574d71..81224af71 100644 --- a/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/AdjustXiaomiReferrer.java +++ b/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/AdjustXiaomiReferrer.java @@ -33,7 +33,7 @@ public static void getXiaomiInstallReferrer(final Context context, final OnXiaom @Override protected XiaomiInstallReferrerResult doInBackground(Context[] contexts) { try { - return XiaomiReferrerClient.getReferrer(context, AdjustFactory.getLogger(),2000); + return XiaomiReferrerClient.getReferrer(context, AdjustFactory.getLogger(),3000); } catch (Exception exception) { return new XiaomiInstallReferrerResult(exception.getMessage()); } @@ -46,10 +46,10 @@ protected void onPostExecute(XiaomiInstallReferrerResult xiaomiInstallReferrerRe onXiaomiInstallReferrerReadListener.onXiaomiInstallReferrerRead(xiaomiInstallReferrerResult.xiaomiInstallReferrerDetails); } else if (xiaomiInstallReferrerResult.error != null) { onXiaomiInstallReferrerReadListener.onFail(xiaomiInstallReferrerResult.error); - }else { + } else { onXiaomiInstallReferrerReadListener.onFail("XiaomiReferrer getInstallReferrer: xiaomiInstallReferrerDetails is null"); } - }else { + } else { onXiaomiInstallReferrerReadListener.onFail("XiaomiReferrer getInstallReferrer: xiaomiInstallReferrerResult is null"); } } From 8d5c2d76b0b81d6bd10ce32eee491403156c6e11 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 27 May 2024 16:31:02 +0200 Subject: [PATCH 170/540] chore: alligning error handling of all referrers --- .../src/main/java/com/adjust/sdk/meta/AdjustMetaReferrer.java | 2 +- .../src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/AdjustMetaReferrer.java b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/AdjustMetaReferrer.java index 640b49e69..3c3e6b3d1 100644 --- a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/AdjustMetaReferrer.java +++ b/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/AdjustMetaReferrer.java @@ -43,7 +43,7 @@ protected void onPostExecute(MetaInstallReferrerResult metaInstallReferrerResult onMetaInstallReferrerReadListener.onFail("Meta Install Referrer details null"); } } else { - onMetaInstallReferrerReadListener.onFail("Meta Install Referrer details null"); + onMetaInstallReferrerReadListener.onFail("Meta Install Referrer result null"); } } }.execute(context); diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java index fbeb00fd6..e76c2933c 100644 --- a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java +++ b/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java @@ -39,7 +39,11 @@ protected void onPostExecute(VivoInstallReferrerResult vivoInstallReferrerResult onVivoInstallReferrerReadListener.onVivoInstallReferrerRead(vivoInstallReferrerResult.vivoInstallReferrerDetails); } else if (vivoInstallReferrerResult.error != null) { onVivoInstallReferrerReadListener.onFail(vivoInstallReferrerResult.error); + } else { + onVivoInstallReferrerReadListener.onFail("VivoReferrer getInstallReferrer: xiaomiInstallReferrerDetails is null"); } + } else { + onVivoInstallReferrerReadListener.onFail("VivoReferrer getInstallReferrer: vivoInstallReferrerResult is null"); } } }.execute(context); From 56a769c4842b7a4f996f058068f93d4b6daaaf41 Mon Sep 17 00:00:00 2001 From: nonelse Date: Mon, 22 Apr 2024 15:03:29 +0200 Subject: [PATCH 171/540] Build: Update Min sdk value to 21 --- Adjust/build.gradle | 6 +++--- Adjust/example-app-fbpixel/build.gradle | 2 +- Adjust/example-app-java/build.gradle | 2 +- Adjust/example-app-keyboard/build.gradle | 2 +- Adjust/example-app-kotlin/build.gradle | 2 +- Adjust/example-app-webbridge/build.gradle | 2 +- Adjust/test-app-core/build.gradle | 2 +- Adjust/test-app-webbridge/build.gradle | 2 +- Adjust/test-library/build.gradle | 2 +- Adjust/test-options/build.gradle | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 5e662bf3d..54ab560ce 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -6,13 +6,13 @@ subprojects { ext { // Android config. - coreMinSdkVersion = 9 + coreMinSdkVersion = 21 coreCompileSdkVersion = 34 coreTargetSdkVersion = 34 coreVersionName = '5.0.0' defaultVersionCode = 1 - webbridgeMinSdkVersion = 17 - samsungReferrerMinSdkVersion = 18 + webbridgeMinSdkVersion = 21 + samsungReferrerMinSdkVersion = 21 vivoReferrerMinSdkVersion = 23 samsungCloudDevMinSdkVersion = 23 diff --git a/Adjust/example-app-fbpixel/build.gradle b/Adjust/example-app-fbpixel/build.gradle index c29018403..0a45c9e67 100644 --- a/Adjust/example-app-fbpixel/build.gradle +++ b/Adjust/example-app-fbpixel/build.gradle @@ -5,7 +5,7 @@ android { defaultConfig { applicationId "com.adjust.examples" - minSdkVersion 17 + minSdkVersion 21 targetSdkVersion 34 versionCode 1 versionName "1.0" diff --git a/Adjust/example-app-java/build.gradle b/Adjust/example-app-java/build.gradle index 5566d0799..31dcdb40d 100644 --- a/Adjust/example-app-java/build.gradle +++ b/Adjust/example-app-java/build.gradle @@ -11,7 +11,7 @@ android { defaultConfig { applicationId "com.adjust.examples" - minSdkVersion 14 + minSdkVersion 21 targetSdkVersion 34 versionCode 1 versionName "1.0" diff --git a/Adjust/example-app-keyboard/build.gradle b/Adjust/example-app-keyboard/build.gradle index 839e17c16..622c1d309 100644 --- a/Adjust/example-app-keyboard/build.gradle +++ b/Adjust/example-app-keyboard/build.gradle @@ -11,7 +11,7 @@ android { defaultConfig { applicationId "com.adjust.examples.keyboard" - minSdkVersion 14 + minSdkVersion 21 targetSdkVersion 34 versionCode 1 versionName "1.0" diff --git a/Adjust/example-app-kotlin/build.gradle b/Adjust/example-app-kotlin/build.gradle index 73c671771..c2d6fb129 100644 --- a/Adjust/example-app-kotlin/build.gradle +++ b/Adjust/example-app-kotlin/build.gradle @@ -5,7 +5,7 @@ android { defaultConfig { applicationId "com.adjust.examples" - minSdkVersion 14 + minSdkVersion 21 targetSdkVersion 34 versionCode 1 versionName "1.0" diff --git a/Adjust/example-app-webbridge/build.gradle b/Adjust/example-app-webbridge/build.gradle index 839abf3ea..bb9bd3f62 100644 --- a/Adjust/example-app-webbridge/build.gradle +++ b/Adjust/example-app-webbridge/build.gradle @@ -5,7 +5,7 @@ android { defaultConfig { applicationId "com.example.examples" - minSdkVersion 17 + minSdkVersion 21 targetSdkVersion 34 versionCode 1 versionName "1.0" diff --git a/Adjust/test-app-core/build.gradle b/Adjust/test-app-core/build.gradle index 86aeebad4..9f0267c5f 100644 --- a/Adjust/test-app-core/build.gradle +++ b/Adjust/test-app-core/build.gradle @@ -5,7 +5,7 @@ android { defaultConfig { applicationId "com.adjust.testapp" - minSdkVersion 14 + minSdkVersion 21 targetSdkVersion 34 versionCode 1 versionName "1.0" diff --git a/Adjust/test-app-webbridge/build.gradle b/Adjust/test-app-webbridge/build.gradle index dd83f91e0..b570c788b 100644 --- a/Adjust/test-app-webbridge/build.gradle +++ b/Adjust/test-app-webbridge/build.gradle @@ -5,7 +5,7 @@ android { defaultConfig { applicationId "com.example.testappwebbridge" - minSdkVersion 17 + minSdkVersion 21 targetSdkVersion 34 versionCode 1 versionName "1.0" diff --git a/Adjust/test-library/build.gradle b/Adjust/test-library/build.gradle index dc397ace7..7325cca91 100644 --- a/Adjust/test-library/build.gradle +++ b/Adjust/test-library/build.gradle @@ -4,7 +4,7 @@ android { compileSdk 34 defaultConfig { - minSdkVersion 9 + minSdkVersion 21 targetSdkVersion 34 } namespace 'com.adjust.test_library' diff --git a/Adjust/test-options/build.gradle b/Adjust/test-options/build.gradle index d1a07df46..013e782cb 100644 --- a/Adjust/test-options/build.gradle +++ b/Adjust/test-options/build.gradle @@ -6,7 +6,7 @@ android { compileSdk 34 defaultConfig { - minSdkVersion 9 + minSdkVersion 21 targetSdkVersion 34 } namespace 'com.adjust.test_options' From 85b193b96e2cb80bc13fa707c69e5fc5d94eac57 Mon Sep 17 00:00:00 2001 From: nonelse Date: Mon, 22 Apr 2024 15:11:54 +0200 Subject: [PATCH 172/540] Build: Add propagation free annotation dependency --- Adjust/sdk-core/build.gradle | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Adjust/sdk-core/build.gradle b/Adjust/sdk-core/build.gradle index 3cc88a8c1..550122a6c 100644 --- a/Adjust/sdk-core/build.gradle +++ b/Adjust/sdk-core/build.gradle @@ -41,6 +41,15 @@ if (localPropsFile.exists()) { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) + /* + * according to https://developer.android.com/studio/write/annotations + * If you use annotations in your own library module, + * the annotations are included as part of the Android Archive (AAR) artifact + * in XML format in the annotations.zip file. + * Adding the support-annotations dependency does not introduce a dependency + * for any downstream users of your library. + */ + implementation 'com.android.support:support-annotations:28.0.0' } task adjustCoreAarRelease(type: Copy) { From 23277b861d0e084ec544652198ee7ee0a14c512f Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 23 Apr 2024 10:46:44 +0200 Subject: [PATCH 173/540] Feat: Add system lifecycle classes --- Adjust/sdk-core/src/main/AndroidManifest.xml | 6 + .../java/com/adjust/sdk/SystemLifecycle.java | 140 ++++++++++++++++++ .../sdk/SystemLifecycleContentProvider.java | 53 +++++++ 3 files changed, 199 insertions(+) create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/SystemLifecycle.java create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/SystemLifecycleContentProvider.java diff --git a/Adjust/sdk-core/src/main/AndroidManifest.xml b/Adjust/sdk-core/src/main/AndroidManifest.xml index 683c4c09a..c3010ea11 100644 --- a/Adjust/sdk-core/src/main/AndroidManifest.xml +++ b/Adjust/sdk-core/src/main/AndroidManifest.xml @@ -2,4 +2,10 @@ + + + diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SystemLifecycle.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SystemLifecycle.java new file mode 100644 index 000000000..1901cbf11 --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SystemLifecycle.java @@ -0,0 +1,140 @@ +package com.adjust.sdk; + +import android.app.Activity; +import android.app.Application; +import android.content.Context; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.util.concurrent.CopyOnWriteArrayList; + +public class SystemLifecycle implements Application.ActivityLifecycleCallbacks +{ + public interface SystemLifecycleCallback { + void onActivityLifecycle(final boolean foregroundOrElseBackground); + } + + public static class SystemLifecycleCache implements SystemLifecycleCallback { + public volatile @Nullable Boolean foregroundOrElseBackgroundCache = null; + + @Override + public void onActivityLifecycle(final boolean foregroundOrElseBackground) { + this.foregroundOrElseBackgroundCache = foregroundOrElseBackground; + } + } + + // region Injected dependencies + private @Nullable Application application; + + private volatile @NonNull SystemLifecycleCallback callback; + // endregion + + // region Internal variables + private static volatile SystemLifecycle instance; + // CopyOnWrite to allow iterating and mutation in different threads + public @NonNull final CopyOnWriteArrayList logMessageList; + private final @NonNull SystemLifecycleCache callbackCache; + // endregion + + // region Instantiation + public SystemLifecycle() { + this.application = null; + this.callbackCache = new SystemLifecycleCache(); + this.callback = callbackCache; + this.logMessageList = new CopyOnWriteArrayList<>(); + } + + @NonNull + public static SystemLifecycle getSingletonInstance() { + @Nullable SystemLifecycle localInstance = instance; + if (localInstance == null) { + synchronized (SystemLifecycle.class) { + localInstance = instance; + if (localInstance == null) { + localInstance = new SystemLifecycle(); + instance = localInstance; + } + } + } + return localInstance; + } + + @NonNull + public static SystemLifecycle getInstanceAndClearSingleton() { + @NonNull final SystemLifecycle instanceToReturn = getSingletonInstance(); + synchronized (SystemLifecycle.class) { + instance = null; + } + return instanceToReturn; + } + // endregion + + // region Application.ActivityLifecycleCallbacks + @Override public void onActivityResumed(@NonNull final Activity activity) { + callback.onActivityLifecycle(true); + } + + @Override public void onActivityPaused(@NonNull final Activity activity) { + callback.onActivityLifecycle(false); + } + // region Unused + @Override + public void onActivityCreated(@NonNull final Activity activity, + @Nullable final Bundle savedInstanceState) + { } + + @Override public void onActivityStarted(@NonNull final Activity activity) { } + + @Override public void onActivityStopped(@NonNull final Activity activity) { } + + @Override + public void onActivitySaveInstanceState(@NonNull final Activity activity, + @NonNull final Bundle outState) + { } + + @Override public void onActivityDestroyed(@NonNull final Activity activity) { } + // endregion + // endregion + + // region Public API + // synchronized to prevent double registering + public synchronized void registerActivityLifecycleCallbacks( + @Nullable final Context context) + { + if (application != null) { + logMessageList.add("Cannot register activity lifecycle callbacks more than once"); + return; + } + + if (context == null) { + logMessageList.add("Cannot register activity lifecycle callbacks without context"); + return; + } + + @Nullable final Context applicationContext = context.getApplicationContext(); + if (! (applicationContext instanceof Application)) { + logMessageList.add( + "Cannot register activity lifecycle callbacks without application context as Application"); + return; + } + + logMessageList.add("Registering activity lifecycle callbacks"); + + application = (Application) applicationContext; + application.registerActivityLifecycleCallbacks(this); + } + + public void overwriteCallback( + @NonNull final SystemLifecycleCallback systemLifecycleCallback) + { + this.callback = systemLifecycleCallback; + } + + @Nullable + public Boolean foregroundOrElseBackgroundCached() { + return callbackCache.foregroundOrElseBackgroundCache; + } + // endregion +} diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SystemLifecycleContentProvider.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SystemLifecycleContentProvider.java new file mode 100644 index 000000000..8b2169715 --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SystemLifecycleContentProvider.java @@ -0,0 +1,53 @@ +package com.adjust.sdk; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.database.Cursor; +import android.net.Uri; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public class SystemLifecycleContentProvider extends ContentProvider { + // region ContentProvider + @Override public boolean onCreate() { + SystemLifecycle.getSingletonInstance(). + registerActivityLifecycleCallbacks(getContext()); + + return false; + } + + @Nullable @Override public Cursor query(@NonNull final Uri uri, + @Nullable final String[] projection, + @Nullable final String selection, + @Nullable final String[] selectionArgs, + @Nullable final String sortOrder) + { + return null; + } + + @Nullable @Override public String getType(@NonNull final Uri uri) { + return null; + } + + @Nullable @Override + public Uri insert(@NonNull final Uri uri, @Nullable final ContentValues values) { + return null; + } + + @Override public int delete(@NonNull final Uri uri, + @Nullable final String selection, + @Nullable final String[] selectionArgs) + { + return 0; + } + + @Override public int update(@NonNull final Uri uri, + @Nullable final ContentValues values, + @Nullable final String selection, + @Nullable final String[] selectionArgs) + { + return 0; + } + // endregion +} From 63ba110e0e14e0a1207e816f95b6ed95442f7c31 Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 23 Apr 2024 10:49:20 +0200 Subject: [PATCH 174/540] Feat: Hook system lifecycle to sdk --- .../java/com/adjust/sdk/ActivityHandler.java | 128 ++++++++++++------ .../java/com/adjust/sdk/AdjustFactory.java | 8 ++ .../java/com/adjust/sdk/AdjustInstance.java | 5 + .../com/adjust/sdk/AdjustTestOptions.java | 1 + .../java/com/adjust/sdk/SystemLifecycle.java | 9 -- 5 files changed, 97 insertions(+), 54 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 3057a21db..163395b16 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -9,6 +9,17 @@ package com.adjust.sdk; +import static com.adjust.sdk.Constants.ACTIVITY_STATE_FILENAME; +import static com.adjust.sdk.Constants.ATTRIBUTION_FILENAME; +import static com.adjust.sdk.Constants.GLOBAL_CALLBACK_PARAMETERS_FILENAME; +import static com.adjust.sdk.Constants.GLOBAL_PARTNER_PARAMETERS_FILENAME; +import static com.adjust.sdk.Constants.REFERRER_API_HUAWEI_ADS; +import static com.adjust.sdk.Constants.REFERRER_API_HUAWEI_APP_GALLERY; +import static com.adjust.sdk.Constants.REFERRER_API_META; +import static com.adjust.sdk.Constants.REFERRER_API_SAMSUNG; +import static com.adjust.sdk.Constants.REFERRER_API_VIVO; +import static com.adjust.sdk.Constants.REFERRER_API_XIAOMI; + import android.app.ActivityManager; import android.content.Context; import android.content.Intent; @@ -18,6 +29,9 @@ import android.os.Handler; import android.text.TextUtils; +import androidx.annotation.NonNull; + +import com.adjust.sdk.SystemLifecycle.SystemLifecycleCallback; import com.adjust.sdk.network.ActivityPackageSender; import com.adjust.sdk.network.IActivityPackageSender; import com.adjust.sdk.network.UtilNetworking; @@ -35,18 +49,9 @@ import java.util.Map; import java.util.Properties; -import static com.adjust.sdk.Constants.ACTIVITY_STATE_FILENAME; -import static com.adjust.sdk.Constants.ATTRIBUTION_FILENAME; -import static com.adjust.sdk.Constants.REFERRER_API_HUAWEI_ADS; -import static com.adjust.sdk.Constants.REFERRER_API_HUAWEI_APP_GALLERY; -import static com.adjust.sdk.Constants.REFERRER_API_META; -import static com.adjust.sdk.Constants.REFERRER_API_SAMSUNG; -import static com.adjust.sdk.Constants.REFERRER_API_VIVO; -import static com.adjust.sdk.Constants.REFERRER_API_XIAOMI; -import static com.adjust.sdk.Constants.GLOBAL_CALLBACK_PARAMETERS_FILENAME; -import static com.adjust.sdk.Constants.GLOBAL_PARTNER_PARAMETERS_FILENAME; - -public class ActivityHandler implements IActivityHandler { +public class ActivityHandler + implements IActivityHandler, SystemLifecycleCallback +{ private static long FOREGROUND_TIMER_INTERVAL; private static long FOREGROUND_TIMER_START; private static long BACKGROUND_TIMER_INTERVAL; @@ -83,6 +88,7 @@ public class ActivityHandler implements IActivityHandler { private InstallReferrer installReferrer; private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; private ArrayList cachedAdidReadCallbacks = new ArrayList<>(); + private SystemLifecycle systemLifecycle; @Override public void teardown() { @@ -146,11 +152,11 @@ static void deleteState(Context context) { public class InternalState { boolean enabled; boolean offline; - boolean background; boolean firstLaunch; boolean sessionResponseProcessed; boolean firstSdkStart; boolean preinstallHasBeenRead; + Boolean foregroundOrElseBackground; public boolean isEnabled() { return enabled; @@ -169,11 +175,13 @@ public boolean isOnline() { } public boolean isInBackground() { - return background; + return foregroundOrElseBackground != null + && ! foregroundOrElseBackground.booleanValue(); } public boolean isInForeground() { - return !background; + return foregroundOrElseBackground != null + && foregroundOrElseBackground.booleanValue(); } public boolean isFirstLaunch() { @@ -201,6 +209,28 @@ public boolean hasPreinstallBeenRead() { } } + // region SystemLifecycleCallback + @Override public void onActivityLifecycle(final boolean foregroundOrElseBackground) { + executor.submit(() -> { + if (internalState.foregroundOrElseBackground != null + && internalState.foregroundOrElseBackground.booleanValue() + == foregroundOrElseBackground) + { + return; + } + // received foregroundOrElseBackground is strictly different from internal state one + + this.internalState.foregroundOrElseBackground = foregroundOrElseBackground; + + if (foregroundOrElseBackground) { + onResumeI(); + } else { + onPauseI(); + } + }); + } + // endregion + private ActivityHandler(AdjustConfig adjustConfig) { init(adjustConfig); @@ -216,8 +246,6 @@ private ActivityHandler(AdjustConfig adjustConfig) { internalState.enabled = adjustConfig.startEnabled != null ? adjustConfig.startEnabled : true; // online by default internalState.offline = adjustConfig.startOffline; - // in the background by default - internalState.background = true; // does not have the session response by default internalState.sessionResponseProcessed = false; // does not have first start by default @@ -225,12 +253,7 @@ private ActivityHandler(AdjustConfig adjustConfig) { // preinstall has not been read by default internalState.preinstallHasBeenRead = false; - executor.submit(new Runnable() { - @Override - public void run() { - initI(); - } - }); + executor.submit(() -> initI()); } @Override @@ -299,38 +322,30 @@ public static ActivityHandler getInstance(AdjustConfig adjustConfig) { @Override public void onResume() { - internalState.background = false; - - executor.submit(new Runnable() { - @Override - public void run() { - stopBackgroundTimerI(); + onActivityLifecycle(true); + } + public void onResumeI() { + stopBackgroundTimerI(); - startForegroundTimerI(); + startForegroundTimerI(); - logger.verbose("Subsession start"); + logger.verbose("Subsession start"); - startI(); - } - }); + startI(); } @Override public void onPause() { - internalState.background = true; - - executor.submit(new Runnable() { - @Override - public void run() { - stopForegroundTimerI(); + onActivityLifecycle(false); + } + public void onPauseI() { + stopForegroundTimerI(); - startBackgroundTimerI(); + startBackgroundTimerI(); - logger.verbose("Subsession end"); + logger.verbose("Subsession end"); - endI(); - } - }); + endI(); } @Override @@ -998,6 +1013,29 @@ public void onFail(String message) { preLaunchActionsI(adjustConfig.preLaunchActions.preLaunchActionsArray); sendReftagReferrerI(); + + bootstrapLifecycleI(); + } + + private void bootstrapLifecycleI() { + this.systemLifecycle = SystemLifecycle.getSingletonInstance(); + + for (@NonNull final String message : systemLifecycle.logMessageList) { + logger.debug("Lifecycle: %s", message); + } + + systemLifecycle.overwriteCallback(this); + + if (AdjustFactory.isSystemLifecycleBootstrapIgnored()) { + return; + } + + this.internalState.foregroundOrElseBackground = + systemLifecycle.foregroundOrElseBackgroundCached(); + + if (internalState.isInForeground()) { + onResumeI(); + } } private void checkForPreinstallI() { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java index 923488819..46ac9819e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java @@ -31,6 +31,7 @@ public class AdjustFactory { private static UtilNetworking.IConnectionOptions connectionOptions = null; private static UtilNetworking.IHttpsURLConnectionProvider httpsURLConnectionProvider = null; private static boolean tryInstallReferrer = true; + private static boolean ignoreSystemLifecycleBootstrap = false; public static class URLGetConnection { HttpsURLConnection httpsURLConnection; @@ -279,6 +280,13 @@ public static void setTryInstallReferrer(boolean tryInstallReferrer) { AdjustFactory.tryInstallReferrer = tryInstallReferrer; } + public static void ignoreSystemLifecycleBootstrap() { + AdjustFactory.ignoreSystemLifecycleBootstrap = true; + } + public static boolean isSystemLifecycleBootstrapIgnored() { + return AdjustFactory.ignoreSystemLifecycleBootstrap; + } + private static String byte2HexFormatted(byte[] arr) { StringBuilder str = new StringBuilder(arr.length * 2); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 2aab4258f..157642944 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -804,5 +804,10 @@ public void setTestOptions(AdjustTestOptions testOptions) { AdjustFactory.setPackageHandlerBackoffStrategy(BackoffStrategy.NO_WAIT); AdjustFactory.setSdkClickBackoffStrategy(BackoffStrategy.NO_WAIT); } + if (testOptions.ignoreSystemLifecycleBootstrap != null + && testOptions.ignoreSystemLifecycleBootstrap.booleanValue()) + { + AdjustFactory.ignoreSystemLifecycleBootstrap(); + } } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTestOptions.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTestOptions.java index 43f6743dd..e9858ea29 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTestOptions.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTestOptions.java @@ -23,4 +23,5 @@ public class AdjustTestOptions { public Boolean teardown; public Boolean tryInstallReferrer = false; public Boolean noBackoffWait; + public Boolean ignoreSystemLifecycleBootstrap = true; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SystemLifecycle.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SystemLifecycle.java index 1901cbf11..96a6fe4b6 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SystemLifecycle.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SystemLifecycle.java @@ -60,15 +60,6 @@ public static SystemLifecycle getSingletonInstance() { } return localInstance; } - - @NonNull - public static SystemLifecycle getInstanceAndClearSingleton() { - @NonNull final SystemLifecycle instanceToReturn = getSingletonInstance(); - synchronized (SystemLifecycle.class) { - instance = null; - } - return instanceToReturn; - } // endregion // region Application.ActivityLifecycleCallbacks From 7d711870ce9c704148fcec5f0b81d08a85aec8d9 Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 23 Apr 2024 14:37:09 +0200 Subject: [PATCH 175/540] Test: Fix tests --- .../src/main/java/com/adjust/sdk/AdjustFactory.java | 6 ++++-- .../main/java/com/adjust/sdk/AdjustInstance.java | 7 +++---- .../com/adjust/testapp/AdjustCommandExecutor.java | 13 +++++++++++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java index 46ac9819e..86db131b1 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java @@ -280,8 +280,10 @@ public static void setTryInstallReferrer(boolean tryInstallReferrer) { AdjustFactory.tryInstallReferrer = tryInstallReferrer; } - public static void ignoreSystemLifecycleBootstrap() { - AdjustFactory.ignoreSystemLifecycleBootstrap = true; + public static void setIgnoreSystemLifecycleBootstrap( + final boolean ignoreSystemLifecycleBootstrap) + { + AdjustFactory.ignoreSystemLifecycleBootstrap = ignoreSystemLifecycleBootstrap; } public static boolean isSystemLifecycleBootstrapIgnored() { return AdjustFactory.ignoreSystemLifecycleBootstrap; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 157642944..f3ec17b6e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -804,10 +804,9 @@ public void setTestOptions(AdjustTestOptions testOptions) { AdjustFactory.setPackageHandlerBackoffStrategy(BackoffStrategy.NO_WAIT); AdjustFactory.setSdkClickBackoffStrategy(BackoffStrategy.NO_WAIT); } - if (testOptions.ignoreSystemLifecycleBootstrap != null - && testOptions.ignoreSystemLifecycleBootstrap.booleanValue()) - { - AdjustFactory.ignoreSystemLifecycleBootstrap(); + if (testOptions.ignoreSystemLifecycleBootstrap != null) { + AdjustFactory.setIgnoreSystemLifecycleBootstrap( + testOptions.ignoreSystemLifecycleBootstrap.booleanValue()); } } } diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 4c14d634e..ba7d32405 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -14,6 +14,7 @@ import com.adjust.sdk.AdjustEvent; import com.adjust.sdk.AdjustEventFailure; import com.adjust.sdk.AdjustEventSuccess; +import com.adjust.sdk.AdjustFactory; import com.adjust.sdk.AdjustPurchase; import com.adjust.sdk.AdjustPurchaseVerificationResult; import com.adjust.sdk.AdjustSessionFailure; @@ -165,6 +166,18 @@ private void testOptions() { testOptions.noBackoffWait = noBackoffWaitBoolean; } } + if (command.containsParameter("doNotIgnoreSystemLifecycleBootstrap")) { + String doNotIgnoreSystemLifecycleBootstrapString = + command.getFirstParameterValue("doNotIgnoreSystemLifecycleBootstrap"); + Boolean doNotIgnoreSystemLifecycleBootstrap = + Util.strictParseStringToBoolean(doNotIgnoreSystemLifecycleBootstrapString); + if (doNotIgnoreSystemLifecycleBootstrap != null + && doNotIgnoreSystemLifecycleBootstrap.booleanValue()) + { + testOptions.ignoreSystemLifecycleBootstrap = false; + } + } + boolean useTestConnectionOptions = false; if (command.containsParameter("teardown")) { List teardownOptions = command.parameters.get("teardown"); From 81653174dead4f0461891b33a3b59288eeaacb40 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 26 Apr 2024 11:06:57 +0200 Subject: [PATCH 176/540] Refac: Use full path for content provider --- Adjust/sdk-core/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/AndroidManifest.xml b/Adjust/sdk-core/src/main/AndroidManifest.xml index c3010ea11..648a2271d 100644 --- a/Adjust/sdk-core/src/main/AndroidManifest.xml +++ b/Adjust/sdk-core/src/main/AndroidManifest.xml @@ -4,7 +4,7 @@ From afa1e4c068819c7864c3a68f00be3275bb587558 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 26 Apr 2024 11:12:10 +0200 Subject: [PATCH 177/540] Fix: Remove and organise debugging leftovers --- .../com/adjust/testapp/AdjustCommandExecutor.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index ba7d32405..94d0422d1 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -1,5 +1,8 @@ package com.adjust.testapp; +import static com.adjust.testapp.MainActivity.baseUrl; +import static com.adjust.testapp.MainActivity.gdprUrl; + import android.content.Context; import android.net.Uri; import android.os.Handler; @@ -14,20 +17,19 @@ import com.adjust.sdk.AdjustEvent; import com.adjust.sdk.AdjustEventFailure; import com.adjust.sdk.AdjustEventSuccess; -import com.adjust.sdk.AdjustFactory; +import com.adjust.sdk.AdjustPlayStoreSubscription; import com.adjust.sdk.AdjustPurchase; import com.adjust.sdk.AdjustPurchaseVerificationResult; import com.adjust.sdk.AdjustSessionFailure; import com.adjust.sdk.AdjustSessionSuccess; -import com.adjust.sdk.AdjustPlayStoreSubscription; import com.adjust.sdk.AdjustTestOptions; import com.adjust.sdk.AdjustThirdPartySharing; import com.adjust.sdk.LogLevel; import com.adjust.sdk.OnAttributionChangedListener; +import com.adjust.sdk.OnDeeplinkResolvedListener; import com.adjust.sdk.OnDeeplinkResponseListener; import com.adjust.sdk.OnEventTrackingFailedListener; import com.adjust.sdk.OnEventTrackingSucceededListener; -import com.adjust.sdk.OnDeeplinkResolvedListener; import com.adjust.sdk.OnPurchaseVerificationFinishedListener; import com.adjust.sdk.OnSessionTrackingFailedListener; import com.adjust.sdk.OnSessionTrackingSucceededListener; @@ -37,9 +39,6 @@ import java.util.List; import java.util.Map; -import static com.adjust.testapp.MainActivity.baseUrl; -import static com.adjust.testapp.MainActivity.gdprUrl; - /** * Created by nonelse on 10.03.17. */ From 4b7d26515a79de00a1a8acff62ca4d19c1e2cccf Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 22 May 2024 14:36:45 +0200 Subject: [PATCH 178/540] Chore: Replace deprecated library --- Adjust/sdk-core/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/build.gradle b/Adjust/sdk-core/build.gradle index 550122a6c..fc6635e71 100644 --- a/Adjust/sdk-core/build.gradle +++ b/Adjust/sdk-core/build.gradle @@ -46,10 +46,10 @@ dependencies { * If you use annotations in your own library module, * the annotations are included as part of the Android Archive (AAR) artifact * in XML format in the annotations.zip file. - * Adding the support-annotations dependency does not introduce a dependency + * Adding the androidx.annotation dependency doesn't introduce a dependency * for any downstream users of your library. */ - implementation 'com.android.support:support-annotations:28.0.0' + implementation 'androidx.annotation:annotation:1.8.0' } task adjustCoreAarRelease(type: Copy) { From fac6449106deaa1a27dca9cddd9cc7e2717084d7 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 16 May 2024 14:31:57 +0200 Subject: [PATCH 179/540] feat: event deduplication reloaded --- .../java/com/adjust/sdk/ActivityHandler.java | 24 ++++++---- .../java/com/adjust/sdk/ActivityState.java | 48 ++++++++++++------- .../java/com/adjust/sdk/AdjustConfig.java | 9 ++++ .../main/java/com/adjust/sdk/AdjustEvent.java | 9 ++++ .../java/com/adjust/sdk/PackageBuilder.java | 3 +- .../src/main/assets/adjust_config.js | 5 ++ .../src/main/assets/adjust_event.js | 5 ++ .../sdk/webbridge/AdjustBridgeInstance.java | 15 +++++- .../sdk/webbridge/AdjustBridgeUtil.java | 13 +++++ .../adjust/testapp/AdjustCommandExecutor.java | 9 ++++ .../src/main/assets/command_executor.js | 11 +++++ 11 files changed, 124 insertions(+), 27 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 163395b16..3d127d0d5 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -816,6 +816,10 @@ private void initI() { readGlobalCallbackParametersI(adjustConfig.context); readGlobalPartnerParametersI(adjustConfig.context); + if (activityState != null) { + activityState.setEventDeduplicationIdsMaxSize(adjustConfig.getEventDeduplicationIdsMaxSize()); + } + if (adjustConfig.startEnabled != null) { adjustConfig.preLaunchActions.preLaunchActionsArray.add(new IRunActivityHandler() { @Override @@ -1263,6 +1267,8 @@ private void startFirstSessionI() { activityState = new ActivityState(); internalState.firstSdkStart = true; + activityState.setEventDeduplicationIdsMaxSize(adjustConfig.getEventDeduplicationIdsMaxSize()); + // still update handlers status updateHandlersStatusAndSendI(); @@ -1502,8 +1508,8 @@ private void trackEventI(AdjustEvent event) { if (!checkActivityStateI(activityState)) return; if (!isEnabledI()) return; if (!checkEventI(event)) return; - if (!checkOrderIdI(event.orderId)) return; if (activityState.isGdprForgotten) return; + if (!shouldProcessEventI(event.deduplicationId)) return; long now = System.currentTimeMillis(); @@ -2662,18 +2668,18 @@ private boolean checkEventI(AdjustEvent event) { return true; } - private boolean checkOrderIdI(String orderId) { - if (orderId == null || orderId.isEmpty()) { - return true; // no order ID given + private boolean shouldProcessEventI(String deduplicationId) { + if (deduplicationId == null || deduplicationId.isEmpty()) { + return true; // no deduplication ID given } - if (activityState.findOrderId(orderId)) { - logger.info("Skipping duplicated order ID '%s'", orderId); - return false; // order ID found -> used already + if (activityState.eventDeduplicationIdExists(deduplicationId)) { + logger.info("Skipping duplicate event with deduplication ID '%s'", deduplicationId); + return false; // deduplication ID found -> used already } - activityState.addOrderId(orderId); - logger.verbose("Added order ID '%s'", orderId); + activityState.addDeduplicationId(deduplicationId); + logger.verbose("Added deduplication ID '%s'", deduplicationId); // activity state will get written by caller return true; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java index 47910188d..66aaa6682 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java @@ -20,7 +20,7 @@ public class ActivityState implements Serializable, Cloneable { private static final long serialVersionUID = 9039439291143138148L; - private static final int ORDER_ID_MAXCOUNT = 10; + private static final int EVENT_DEDUPLICATION_IDS_MAX_SIZE = 10; private transient ILogger logger; @SuppressWarnings("unchecked") private static final ObjectStreamField[] serialPersistentFields = { @@ -35,7 +35,7 @@ public class ActivityState implements Serializable, Cloneable { new ObjectStreamField("timeSpent", long.class), new ObjectStreamField("lastActivity", long.class), new ObjectStreamField("lastInterval", long.class), - new ObjectStreamField("orderIds", (Class>)(Class) LinkedList.class), + new ObjectStreamField("eventDeduplicationIds", (Class>)(Class) LinkedList.class), new ObjectStreamField("pushToken", String.class), new ObjectStreamField("adid", String.class), new ObjectStreamField("clickTime", long.class), @@ -87,7 +87,8 @@ public class ActivityState implements Serializable, Cloneable { protected long lastInterval; - protected LinkedList orderIds; + protected LinkedList eventDeduplicationIds; + protected int eventDeduplicationIdsMaxSize = EVENT_DEDUPLICATION_IDS_MAX_SIZE; protected String pushToken; protected String adid; @@ -140,7 +141,7 @@ protected ActivityState() { timeSpent = -1; // this information will be collected and attached to the next session lastActivity = -1; lastInterval = -1; - orderIds = null; + eventDeduplicationIds = null; pushToken = null; adid = null; clickTime = 0; @@ -180,22 +181,32 @@ protected void resetSessionAttributes(long now) { lastInterval = -1; } - protected void addOrderId(String orderId) { - if (orderIds == null) { - orderIds = new LinkedList(); + protected void addDeduplicationId(String deduplicationId) { + if (eventDeduplicationIdsMaxSize == 0) { + return; } - if (orderIds.size() >= ORDER_ID_MAXCOUNT) { - orderIds.removeLast(); + if (eventDeduplicationIds == null) { + eventDeduplicationIds = new LinkedList(); + } else { + while (eventDeduplicationIds.size() >= eventDeduplicationIdsMaxSize) { + eventDeduplicationIds.removeLast(); + } } - orderIds.addFirst(orderId); + eventDeduplicationIds.addFirst(deduplicationId); } - protected boolean findOrderId(String orderId) { - if (orderIds == null) { + protected boolean eventDeduplicationIdExists(String deduplicationId) { + if (eventDeduplicationIds == null) { return false; } - return orderIds.contains(orderId); + return eventDeduplicationIds.contains(deduplicationId); + } + + protected void setEventDeduplicationIdsMaxSize(Integer size) { + if (size != null && size >= 0) { + eventDeduplicationIdsMaxSize = size; + } } public boolean isCoppaEnabled() { @@ -230,7 +241,7 @@ public boolean equals(Object other) { if (!Util.equalLong(sessionLength, otherActivityState.sessionLength)) return false; if (!Util.equalLong(timeSpent, otherActivityState.timeSpent)) return false; if (!Util.equalLong(lastInterval, otherActivityState.lastInterval)) return false; - if (!Util.equalObject(orderIds, otherActivityState.orderIds)) return false; + if (!Util.equalObject(eventDeduplicationIds, otherActivityState.eventDeduplicationIds)) return false; if (!Util.equalString(pushToken, otherActivityState.pushToken)) return false; if (!Util.equalString(adid, otherActivityState.adid)) return false; if (!Util.equalLong(clickTime, otherActivityState.clickTime)) return false; @@ -277,7 +288,7 @@ public int hashCode() { hashCode = Util.hashLong(sessionLength, hashCode); hashCode = Util.hashLong(timeSpent, hashCode); hashCode = Util.hashLong(lastInterval, hashCode); - hashCode = Util.hashObject(orderIds, hashCode); + hashCode = Util.hashObject(eventDeduplicationIds, hashCode); hashCode = Util.hashString(pushToken, hashCode); hashCode = Util.hashString(adid, hashCode); hashCode = Util.hashLong(clickTime, hashCode); @@ -328,7 +339,10 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo isThirdPartySharingDisabledForCoppa = Util.readBooleanField(fields, "isThirdPartySharingDisabledForCoppa", false); askingAttribution = Util.readBooleanField(fields, "askingAttribution", false); - orderIds = Util.readObjectField(fields, "orderIds", null); + eventDeduplicationIds = Util.readObjectField(fields, "eventDeduplicationIds", null); + if (eventDeduplicationIds == null) { + eventDeduplicationIds = Util.readObjectField(fields, "orderIds", null); + } pushToken = Util.readStringField(fields, "pushToken", null); adid = Util.readStringField(fields, "adid", null); @@ -369,6 +383,8 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo if (uuid == null) { uuid = Util.createUuid(); } + + eventDeduplicationIdsMaxSize = EVENT_DEDUPLICATION_IDS_MAX_SIZE; } private void writeObject(ObjectOutputStream stream) throws IOException { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 2d4a3cd8c..9519d599f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -40,6 +40,7 @@ public class AdjustConfig { boolean readDeviceInfoOnceEnabled; OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; ArrayList cachedAdidReadCallbacks = new ArrayList<>(); + Integer eventDeduplicationIdsMaxSize; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; @@ -182,6 +183,10 @@ public void setReadDeviceInfoOnceEnabled(boolean readDeviceInfoOnceEnabled) { this.readDeviceInfoOnceEnabled = readDeviceInfoOnceEnabled; } + public void setEventDeduplicationIdsMaxSize(Integer eventDeduplicationIdsMaxSize) { + this.eventDeduplicationIdsMaxSize = eventDeduplicationIdsMaxSize; + } + public String getBasePath() { return basePath; } @@ -230,6 +235,10 @@ public Class getDeepLinkComponent() { return deepLinkComponent; } + public Integer getEventDeduplicationIdsMaxSize() { + return eventDeduplicationIdsMaxSize; + } + public OnEventTrackingSucceededListener getOnEventTrackingSucceededListener() { return onEventTrackingSucceededListener; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustEvent.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustEvent.java index 00da98923..3f59f5749 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustEvent.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustEvent.java @@ -13,6 +13,7 @@ public class AdjustEvent { Map callbackParameters; Map partnerParameters; String orderId; + String deduplicationId; String callbackId; String productId; String purchaseToken; @@ -66,6 +67,10 @@ public void setOrderId(String orderId) { this.orderId = orderId; } + public void setDeduplicationId(String deduplicationId) { + this.deduplicationId = deduplicationId; + } + public void setCallbackId(String callbackId) { this.callbackId = callbackId; } @@ -106,6 +111,10 @@ public String getOrderId() { return orderId; } + public String getDeduplicationId() { + return deduplicationId; + } + public String getCallbackId() { return callbackId; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 122938e99..2d0bcbcf2 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -382,7 +382,8 @@ public Map getEventParameters(AdjustEvent event) { PackageBuilder.addString(parameters, "purchase_token", event.purchaseToken); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addDouble(parameters, "revenue", event.revenue); - PackageBuilder.addString(parameters, "deduplication_id", event.orderId); + PackageBuilder.addString(parameters, "order_id", event.orderId); + PackageBuilder.addString(parameters, "deduplication_id", event.deduplicationId); PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js index e698cb9bc..024c47c00 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -46,6 +46,7 @@ function AdjustConfig(appToken, environment, legacy) { this.preinstallFilePath = null; this.fbAppId = null; this.readDeviceInfoOnceEnabled = null; + this.eventDeduplicationIdsMaxSize = null; } AdjustConfig.EnvironmentSandbox = 'sandbox'; @@ -227,3 +228,7 @@ AdjustConfig.prototype.setFbAppId = function(fbAppId) { AdjustConfig.prototype.setReadDeviceInfoOnceEnabled = function(isEnabled) { this.readDeviceInfoOnceEnabled = isEnabled; }; + +AdjustConfig.prototype.setEventDeduplicationIdsMaxSize = function(eventDeduplicationIdsMaxSize) { + this.eventDeduplicationIdsMaxSize = eventDeduplicationIdsMaxSize; +}; diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_event.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_event.js index 576a1ee3c..ce58b22b5 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_event.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_event.js @@ -5,6 +5,7 @@ function AdjustEvent(eventToken) { this.callbackParameters = []; this.partnerParameters = []; this.orderId = null; + this.deduplicationId = null; this.callbackId = null; } @@ -27,6 +28,10 @@ AdjustEvent.prototype.setOrderId = function(orderId) { this.orderId = orderId; }; +AdjustEvent.prototype.setDeduplicationId = function(deduplicationId) { + this.deduplicationId = deduplicationId; +}; + AdjustEvent.prototype.setCallbackId = function(callbackId) { this.callbackId = callbackId; }; diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 7cd2d7297..de4352f2c 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -163,6 +163,7 @@ public void onCreate(String adjustConfigString) { Object preinstallFilePathField = jsonAdjustConfig.get("preinstallFilePath"); Object fbAppIdField = jsonAdjustConfig.get("fbAppId"); Object readDeviceInfoOnceEnabledField = jsonAdjustConfig.get("readDeviceInfoOnceEnabled"); + Object eventDeduplicationIdsMaxSizeField = jsonAdjustConfig.get("eventDeduplicationIdsMaxSize"); String appToken = AdjustBridgeUtil.fieldToString(appTokenField); String environment = AdjustBridgeUtil.fieldToString(environmentField); @@ -356,6 +357,11 @@ public boolean launchReceivedDeeplink(Uri deeplink) { adjustConfig.setReadDeviceInfoOnceEnabled(readDeviceInfoOnceEnabled); } + Integer eventDeduplicationIdsMaxSize = AdjustBridgeUtil.fieldToInteger(eventDeduplicationIdsMaxSizeField); + if (eventDeduplicationIdsMaxSize != null) { + adjustConfig.setEventDeduplicationIdsMaxSize(eventDeduplicationIdsMaxSize); + } + // Manually call onResume() because web view initialisation will happen a bit delayed. // With this delay, it will miss lifecycle callback onResume() initial firing. Adjust.onCreate(adjustConfig); @@ -385,6 +391,7 @@ public void trackEvent(String adjustEventString) { Object callbackParametersField = jsonAdjustEvent.get("callbackParameters"); Object partnerParametersField = jsonAdjustEvent.get("partnerParameters"); Object orderIdField = jsonAdjustEvent.get("orderId"); + Object deduplicationIdField = jsonAdjustEvent.get("deduplicationId"); Object callbackIdField = jsonAdjustEvent.get("callbackId"); String eventToken = AdjustBridgeUtil.fieldToString(eventTokenField); @@ -421,12 +428,18 @@ public void trackEvent(String adjustEventString) { } } - // Revenue deduplication + // Order id String orderId = AdjustBridgeUtil.fieldToString(orderIdField); if (orderId != null) { adjustEvent.setOrderId(orderId); } + // Revenue deduplication + String deduplicationId = AdjustBridgeUtil.fieldToString(deduplicationIdField); + if (deduplicationId != null) { + adjustEvent.setDeduplicationId(deduplicationId); + } + // Callback id String callbackId = AdjustBridgeUtil.fieldToString(callbackIdField); if (callbackId != null) { diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java index a48c45dfb..e0c0f2b4a 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java @@ -103,6 +103,19 @@ public static Long fieldToLong(Object field) { } } + public static Integer fieldToInteger(Object field) { + if (field == null) { + return null; + } + + String fieldString = field.toString(); + try { + return Integer.parseInt(fieldString); + } catch (Exception e) { + return null; + } + } + public static void execAttributionCallbackCommand(final WebView webView, final String commandName, final AdjustAttribution attribution) { if (webView == null) { diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 94d0422d1..57ab81e35 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -302,6 +302,11 @@ private void config() { adjustConfig.setSendInBackground(sendInBackground); } + if (command.containsParameter("eventDeduplicationIdsMaxSize")) { + String eventDeduplicationIdsMaxSizeS = command.getFirstParameterValue("eventDeduplicationIdsMaxSize"); + int eventDeduplicationIdsMaxSize = Integer.parseInt(eventDeduplicationIdsMaxSizeS); + adjustConfig.setEventDeduplicationIdsMaxSize(eventDeduplicationIdsMaxSize); + } if (command.containsParameter("externalDeviceId")) { String externalDeviceId = command.getFirstParameterValue("externalDeviceId"); @@ -504,6 +509,10 @@ private void event() throws NullPointerException { String orderId = command.getFirstParameterValue("orderId"); adjustEvent.setOrderId(orderId); } + if (command.parameters.containsKey("deduplicationId")) { + String deduplicationId = command.getFirstParameterValue("deduplicationId"); + adjustEvent.setDeduplicationId(deduplicationId); + } if (command.parameters.containsKey("callbackId")) { String callbackId = command.getFirstParameterValue("callbackId"); adjustEvent.setCallbackId(callbackId); diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index 0a6e70d61..10838b925 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -308,6 +308,12 @@ AdjustCommandExecutor.prototype.config = function(params) { adjustConfig.setSendInBackground(sendInBackground); } + if ('eventDeduplicationIdsMaxSize' in params) { + var eventDeduplicationIdsMaxSizeS = getFirstParameterValue(params, 'eventDeduplicationIdsMaxSize'); + var eventDeduplicationIdsMaxSize = parseInt(eventDeduplicationIdsMaxSizeS); + adjustConfig.setEventDeduplicationIdsMaxSize(eventDeduplicationIdsMaxSize); + } + if ('attributionCallbackSendAll' in params) { var basePath = this.basePath; adjustConfig.setAttributionCallback(function(attribution) { @@ -453,6 +459,11 @@ AdjustCommandExecutor.prototype.event = function(params) { adjustEvent.setOrderId(orderId); } + if ('deduplicationId' in params) { + var deduplicationId = getFirstParameterValue(params, 'deduplicationId'); + adjustEvent.setDeduplicationId(deduplicationId); + } + if ('callbackId' in params) { var callbackId = getFirstParameterValue(params, 'callbackId'); adjustEvent.setCallbackId(callbackId); From 32c22b140c5b0c602d16e340e85b6c1793caf308 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 29 May 2024 10:24:05 +0200 Subject: [PATCH 180/540] Refac: Move init to constructor --- .../sdk-core/src/main/java/com/adjust/sdk/ActivityState.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java index 66aaa6682..c3e14070e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java @@ -88,7 +88,7 @@ public class ActivityState implements Serializable, Cloneable { protected long lastInterval; protected LinkedList eventDeduplicationIds; - protected int eventDeduplicationIdsMaxSize = EVENT_DEDUPLICATION_IDS_MAX_SIZE; + protected int eventDeduplicationIdsMaxSize; protected String pushToken; protected String adid; @@ -171,6 +171,7 @@ protected ActivityState() { installReferrerMeta = null; clickTimeMeta = 0; isClickMeta = null; + eventDeduplicationIdsMaxSize = EVENT_DEDUPLICATION_IDS_MAX_SIZE; } protected void resetSessionAttributes(long now) { From 116856617dbb19c185a23cc6645c66e174c00283 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 29 May 2024 10:28:46 +0200 Subject: [PATCH 181/540] Chore: Revert order id state reading --- .../src/main/java/com/adjust/sdk/ActivityState.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java index c3e14070e..17e5f8867 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java @@ -35,7 +35,7 @@ public class ActivityState implements Serializable, Cloneable { new ObjectStreamField("timeSpent", long.class), new ObjectStreamField("lastActivity", long.class), new ObjectStreamField("lastInterval", long.class), - new ObjectStreamField("eventDeduplicationIds", (Class>)(Class) LinkedList.class), + new ObjectStreamField("orderIds", (Class>)(Class) LinkedList.class), new ObjectStreamField("pushToken", String.class), new ObjectStreamField("adid", String.class), new ObjectStreamField("clickTime", long.class), @@ -340,10 +340,7 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo isThirdPartySharingDisabledForCoppa = Util.readBooleanField(fields, "isThirdPartySharingDisabledForCoppa", false); askingAttribution = Util.readBooleanField(fields, "askingAttribution", false); - eventDeduplicationIds = Util.readObjectField(fields, "eventDeduplicationIds", null); - if (eventDeduplicationIds == null) { - eventDeduplicationIds = Util.readObjectField(fields, "orderIds", null); - } + eventDeduplicationIds = Util.readObjectField(fields, "orderIds", null); pushToken = Util.readStringField(fields, "pushToken", null); adid = Util.readStringField(fields, "adid", null); From a853bb539aa4e5195a4c18b915dba3b62720951b Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 27 May 2024 11:19:23 +0200 Subject: [PATCH 182/540] refac: remove setPushToken methode - remove UrlStrategyConstants - remove setUrlStrategy methode --- .../src/main/assets/adjust.js | 6 ------ .../src/main/assets/adjust_config.js | 13 ------------- .../sdk/webbridge/AdjustBridgeInstance.java | 16 ---------------- 3 files changed, 35 deletions(-) diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index 14c2ba3c7..25784fb58 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -111,12 +111,6 @@ var Adjust = { } }, - setPushToken: function(token) { - if (AdjustBridge) { - AdjustBridge.setPushToken(token); - } - }, - gdprForgetMe: function() { if (AdjustBridge) { AdjustBridge.gdprForgetMe(); diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js index 024c47c00..e5cf2658e 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -41,7 +41,6 @@ function AdjustConfig(appToken, environment, legacy) { this.deferredDeeplinkCallbackFunction = null; this.fbPixelDefaultEventToken = null; this.fbPixelMapping = []; - this.urlStrategy = null; this.preinstallTrackingEnabled = null; this.preinstallFilePath = null; this.fbAppId = null; @@ -52,14 +51,6 @@ function AdjustConfig(appToken, environment, legacy) { AdjustConfig.EnvironmentSandbox = 'sandbox'; AdjustConfig.EnvironmentProduction = 'production'; -AdjustConfig.UrlStrategyIndia = "url_strategy_india"; -AdjustConfig.UrlStrategyChina = "url_strategy_china"; -AdjustConfig.UrlStrategyCn = "url_strategy_cn"; -AdjustConfig.UrlStrategyCnOnly = "url_strategy_cn_only"; -AdjustConfig.DataResidencyEU = "data_residency_eu"; -AdjustConfig.DataResidencyTR = "data_residency_tr"; -AdjustConfig.DataResidencyUS = "data_residency_us"; - AdjustConfig.LogLevelVerbose = 'VERBOSE', AdjustConfig.LogLevelDebug = 'DEBUG', AdjustConfig.LogLevelInfo = 'INFO', @@ -209,10 +200,6 @@ AdjustConfig.prototype.addFbPixelMapping = function(fbEventNameKey, adjEventToke this.fbPixelMapping.push(adjEventTokenValue); }; -AdjustConfig.prototype.setUrlStrategy = function(urlStrategy) { - this.urlStrategy = urlStrategy; -}; - AdjustConfig.prototype.setPreinstallTrackingEnabled = function(preinstallTrackingEnabled) { this.preinstallTrackingEnabled = preinstallTrackingEnabled; }; diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index de4352f2c..f2452defe 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -158,7 +158,6 @@ public void onCreate(String adjustConfigString) { Object deferredDeeplinkCallbackNameField = jsonAdjustConfig.get("deferredDeeplinkCallbackName"); Object fbPixelDefaultEventTokenField = jsonAdjustConfig.get("fbPixelDefaultEventToken"); Object fbPixelMappingField = jsonAdjustConfig.get("fbPixelMapping"); - Object urlStrategyField = jsonAdjustConfig.get("urlStrategy"); Object preinstallTrackingEnabledField = jsonAdjustConfig.get("preinstallTrackingEnabled"); Object preinstallFilePathField = jsonAdjustConfig.get("preinstallFilePath"); Object fbAppIdField = jsonAdjustConfig.get("fbAppId"); @@ -327,12 +326,6 @@ public boolean launchReceivedDeeplink(Uri deeplink) { AdjustFactory.getLogger().error("AdjustBridgeInstance.configureFbPixel: %s", e.getMessage()); } - // Set url strategy - String urlStrategy = AdjustBridgeUtil.fieldToString(urlStrategyField); - if (urlStrategy != null) { - adjustConfig.setUrlStrategy(urlStrategy); - } - // Preinstall tracking Boolean preinstallTrackingEnabled = AdjustBridgeUtil.fieldToBoolean(preinstallTrackingEnabledField); if (preinstallTrackingEnabled != null) { @@ -561,15 +554,6 @@ public void removeGlobalPartnerParameters() { Adjust.removeGlobalPartnerParameters(); } - @JavascriptInterface - public void setPushToken(String pushToken) { - if (!isInitialized()) { - return; - } - - Adjust.setPushToken(pushToken, application.getApplicationContext()); - } - @JavascriptInterface public void gdprForgetMe() { if (!isInitialized()) { From f76e36fdbd63dc3afd9a0a886ab56669ebc39ea6 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 27 May 2024 13:53:56 +0200 Subject: [PATCH 183/540] refac:remove orderId from web-bridge and command_executor.js --- .../sdk-plugin-webbridge/src/main/assets/adjust_event.js | 5 ----- .../com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 7 ------- .../test-app-webbridge/src/main/assets/command_executor.js | 5 ----- 3 files changed, 17 deletions(-) diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_event.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_event.js index ce58b22b5..190f05913 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_event.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_event.js @@ -4,7 +4,6 @@ function AdjustEvent(eventToken) { this.currency = null; this.callbackParameters = []; this.partnerParameters = []; - this.orderId = null; this.deduplicationId = null; this.callbackId = null; } @@ -24,10 +23,6 @@ AdjustEvent.prototype.addPartnerParameter = function(key, value) { this.partnerParameters.push(value); }; -AdjustEvent.prototype.setOrderId = function(orderId) { - this.orderId = orderId; -}; - AdjustEvent.prototype.setDeduplicationId = function(deduplicationId) { this.deduplicationId = deduplicationId; }; diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index f2452defe..b69d24187 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -383,7 +383,6 @@ public void trackEvent(String adjustEventString) { Object currencyField = jsonAdjustEvent.get("currency"); Object callbackParametersField = jsonAdjustEvent.get("callbackParameters"); Object partnerParametersField = jsonAdjustEvent.get("partnerParameters"); - Object orderIdField = jsonAdjustEvent.get("orderId"); Object deduplicationIdField = jsonAdjustEvent.get("deduplicationId"); Object callbackIdField = jsonAdjustEvent.get("callbackId"); @@ -421,12 +420,6 @@ public void trackEvent(String adjustEventString) { } } - // Order id - String orderId = AdjustBridgeUtil.fieldToString(orderIdField); - if (orderId != null) { - adjustEvent.setOrderId(orderId); - } - // Revenue deduplication String deduplicationId = AdjustBridgeUtil.fieldToString(deduplicationIdField); if (deduplicationId != null) { diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index 10838b925..e4d3bda53 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -454,11 +454,6 @@ AdjustCommandExecutor.prototype.event = function(params) { } } - if ('orderId' in params) { - var orderId = getFirstParameterValue(params, 'orderId'); - adjustEvent.setOrderId(orderId); - } - if ('deduplicationId' in params) { var deduplicationId = getFirstParameterValue(params, 'deduplicationId'); adjustEvent.setDeduplicationId(deduplicationId); From 220bded3f1dc6694bce9866657993149bfa29900 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 24 May 2024 10:48:52 +0200 Subject: [PATCH 184/540] refac:refactor getSdkVersion to async --- .../main/assets/AdjustExample-WebView.html | 11 ++++++++++ .../src/main/java/com/adjust/sdk/Adjust.java | 10 +++++++--- .../java/com/adjust/sdk/AdjustInstance.java | 6 +++--- .../adjust/sdk/OnSdkVersionReadListener.java | 5 +++++ .../src/main/assets/adjust.js | 20 +++++++++++++++---- .../sdk/webbridge/AdjustBridgeInstance.java | 19 ++++++++++++++++-- .../java/com/adjust/testapp/MainActivity.java | 9 ++++++++- 7 files changed, 67 insertions(+), 13 deletions(-) create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/OnSdkVersionReadListener.java diff --git a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html index 77ae5169f..27d2f0286 100755 --- a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html +++ b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html @@ -169,6 +169,14 @@

Adjust Web View SDK Demo alert('Ad Id:\n' + adid); }); } + + var btnGetSdkVersion = document.getElementById('btnGetSdkVersion') + btnGetSdkVersion.onclick = function(e) { + e.preventDefault(); + Adjust.getSdkVersion(function (sdkVersion) { + alert('SDK version:\n' + sdkVersion); + }); + } }
@@ -208,6 +216,9 @@

Adjust Web View SDK Demo
+
+ +

diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index c9fef42b7..15afc97bf 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -395,11 +395,15 @@ public static void getGooglePlayInstallReferrer(Context context, OnGooglePlayIns /** * Called to get native SDK version string. * - * @return Native SDK version string. + * @param onSdkVersionReadListener Callback to get triggered once SDK version is obtained */ - public static String getSdkVersion() { + public static void getSdkVersion(final OnSdkVersionReadListener onSdkVersionReadListener) { + if (onSdkVersionReadListener == null) { + AdjustFactory.getLogger().error("onSdkVersionReadListener cannot be null"); + return; + } AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - return adjustInstance.getSdkVersion(); + adjustInstance.getSdkVersion(onSdkVersionReadListener); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index f3ec17b6e..b7e1022a1 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -551,10 +551,10 @@ public AdjustAttribution getAttribution() { /** * Called to get native SDK version string. * - * @return Native SDK version string. + * @param onSdkVersionReadListener Callback to get triggered once SDK version is obtained. */ - public String getSdkVersion() { - return Util.getSdkVersion(); + public void getSdkVersion(OnSdkVersionReadListener onSdkVersionReadListener) { + onSdkVersionReadListener.onSdkVersionRead(Util.getSdkVersion()); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnSdkVersionReadListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnSdkVersionReadListener.java new file mode 100644 index 000000000..7732e1de4 --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnSdkVersionReadListener.java @@ -0,0 +1,5 @@ +package com.adjust.sdk; + +public interface OnSdkVersionReadListener { + void onSdkVersionRead(String sdkVersion); +} diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index 25784fb58..1d8015309 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -232,11 +232,21 @@ var Adjust = { } }, - getSdkVersion: function () { + getSdkVersion: function (callback) { if (AdjustBridge) { - return this.getSdkPrefix() + '@' + AdjustBridge.getSdkVersion(); - } else { - return undefined; + if (typeof callback === 'string' || callback instanceof String) { + this.getSdkVersionCallbackName = callback; + } else { + this.getSdkVersionCallbackName = 'Adjust.adjust_getSdkVersionCallback'; + this.getSdkVersionCallbackFunction = callback; + } + AdjustBridge.getSdkVersion(this.getSdkVersionCallbackName); + } + }, + + adjust_getSdkVersionCallback: function (sdkVersion) { + if (AdjustBridge && this.getSdkVersionCallbackFunction) { + this.getSdkVersionCallbackFunction(sdkVersion); } }, @@ -263,5 +273,7 @@ var Adjust = { this.getAmazonIdCallbackSuccessFunction = undefined; this.getAmazonIdCallbackFailName = undefined; this.getAmazonIdCallbackFailFunction = undefined; + this.getSdkVersionCallbackFunction = undefined; + this.getSdkVersionCallbackName = undefined; }, }; diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index b69d24187..3a249b39f 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -28,6 +28,7 @@ import com.adjust.sdk.OnEventTrackingFailedListener; import com.adjust.sdk.OnEventTrackingSucceededListener; import com.adjust.sdk.OnIsEnabledListener; +import com.adjust.sdk.OnSdkVersionReadListener; import com.adjust.sdk.OnSessionTrackingFailedListener; import com.adjust.sdk.OnSessionTrackingSucceededListener; @@ -55,6 +56,8 @@ public class AdjustBridgeInstance { private boolean shouldDeferredDeeplinkBeLaunched = true; private FacebookSDKJSInterface facebookSDKJSInterface = null; + private String adjustSdkPrefix = null; + AdjustBridgeInstance() {} AdjustBridgeInstance(Application application, WebView webView) { @@ -209,6 +212,7 @@ public void onCreate(String adjustConfigString) { String sdkPrefix = AdjustBridgeUtil.fieldToString(sdkPrefixField); if (sdkPrefix != null) { adjustConfig.setSdkPrefix(sdkPrefix); + adjustSdkPrefix = sdkPrefix; } // Main process name @@ -711,8 +715,19 @@ public void getAttribution(final String callback) { } @JavascriptInterface - public String getSdkVersion() { - return Adjust.getSdkVersion(); + public void getSdkVersion(final String callback) { + if (!isInitialized()) { + return; + } + Adjust.getSdkVersion(new OnSdkVersionReadListener() { + @Override + public void onSdkVersionRead(String sdkVersion) { + if (adjustSdkPrefix != null && adjustSdkPrefix.length() > 0) { + sdkVersion = adjustSdkPrefix + "@" + sdkVersion; + } + AdjustBridgeUtil.execSingleValueCallback(webView, callback, sdkVersion); + } + }); } @JavascriptInterface diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java index 49ae619e1..4341bcf29 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java @@ -7,6 +7,7 @@ import androidx.appcompat.app.AppCompatActivity; import com.adjust.sdk.Adjust; +import com.adjust.sdk.OnSdkVersionReadListener; import com.adjust.test.TestLibrary; public class MainActivity extends AppCompatActivity { @@ -38,6 +39,12 @@ protected void onCreate(Bundle savedInstanceState) { private void startTestSession() { // testLibrary.addTestDirectory("current/gdpr"); - testLibrary.startTestSession(Adjust.getSdkVersion()); + Adjust.getSdkVersion(new OnSdkVersionReadListener() { + @Override + public void onSdkVersionRead(String sdkVersion) { + testLibrary.startTestSession(sdkVersion); + } + }); + } } From c8daea8cf4984e98703401c933146b963493a232 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 27 May 2024 09:59:26 +0200 Subject: [PATCH 185/540] clean:fire callback on main thread --- .../src/main/java/com/adjust/sdk/AdjustInstance.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index b7e1022a1..062dde2ea 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -2,6 +2,8 @@ import android.net.Uri; import android.content.Context; +import android.os.Handler; +import android.os.Looper; import com.adjust.sdk.scheduler.AsyncTaskExecutor; @@ -554,7 +556,12 @@ public AdjustAttribution getAttribution() { * @param onSdkVersionReadListener Callback to get triggered once SDK version is obtained. */ public void getSdkVersion(OnSdkVersionReadListener onSdkVersionReadListener) { - onSdkVersionReadListener.onSdkVersionRead(Util.getSdkVersion()); + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + onSdkVersionReadListener.onSdkVersionRead(Util.getSdkVersion()); + } + }); } /** From c9b7ea38623492552e0388c34fff28ef98c817ea Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 21 May 2024 14:58:52 +0200 Subject: [PATCH 186/540] refac: read enabled from activity state file if sdk is not initialized --- .../src/main/java/com/adjust/examples/MainActivity.java | 6 +++--- .../java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java b/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java index 8deb57a4c..8a22dc786 100755 --- a/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java +++ b/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java @@ -47,7 +47,7 @@ public void onIsEnabledRead(boolean isEnabled) { btnEnableDisableSDK.setText(R.string.txt_enable_sdk); } } - }); + }, getApplicationContext()); } @@ -107,7 +107,7 @@ public void onIsEnabledRead(boolean isEnabled) { ((Button) v).setText(R.string.txt_disable_sdk); } } - }); + }, getApplicationContext()); } @@ -123,7 +123,7 @@ public void onIsEnabledRead(boolean isEnabled) { Toast.LENGTH_SHORT).show(); } } - }); + }, getApplicationContext()); } diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 3a249b39f..4b9221dc6 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -481,7 +481,7 @@ public void isEnabled(String callback) { public void onIsEnabledRead(boolean isEnabled) { AdjustBridgeUtil.execSingleValueCallback(webView, callback, String.valueOf(isEnabled)); } - }); + }, application.getApplicationContext()); } @JavascriptInterface From c65a8cf8d2464ed15e853c53ce7e06c68623bcc5 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 22 May 2024 12:44:59 +0200 Subject: [PATCH 187/540] refac:change isEnabled function signature move context as first param extract application context inside the function --- .../src/main/java/com/adjust/examples/MainActivity.java | 6 +++--- .../java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java b/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java index 8a22dc786..8deb57a4c 100755 --- a/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java +++ b/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java @@ -47,7 +47,7 @@ public void onIsEnabledRead(boolean isEnabled) { btnEnableDisableSDK.setText(R.string.txt_enable_sdk); } } - }, getApplicationContext()); + }); } @@ -107,7 +107,7 @@ public void onIsEnabledRead(boolean isEnabled) { ((Button) v).setText(R.string.txt_disable_sdk); } } - }, getApplicationContext()); + }); } @@ -123,7 +123,7 @@ public void onIsEnabledRead(boolean isEnabled) { Toast.LENGTH_SHORT).show(); } } - }, getApplicationContext()); + }); } diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 4b9221dc6..3a249b39f 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -481,7 +481,7 @@ public void isEnabled(String callback) { public void onIsEnabledRead(boolean isEnabled) { AdjustBridgeUtil.execSingleValueCallback(webView, callback, String.valueOf(isEnabled)); } - }, application.getApplicationContext()); + }); } @JavascriptInterface From f3da3cd9a5b86d8504bcfb6f4b26ad0d678e2ac2 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 24 May 2024 10:48:52 +0200 Subject: [PATCH 188/540] refac:refactor getSdkVersion to async --- .../main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 3a249b39f..1c9554fbf 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -27,6 +27,7 @@ import com.adjust.sdk.OnDeviceIdsRead; import com.adjust.sdk.OnEventTrackingFailedListener; import com.adjust.sdk.OnEventTrackingSucceededListener; +import com.adjust.sdk.OnSdkVersionReadListener; import com.adjust.sdk.OnIsEnabledListener; import com.adjust.sdk.OnSdkVersionReadListener; import com.adjust.sdk.OnSessionTrackingFailedListener; From fa48b78bcea1f1bee0865fd8703b844398b07285 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 29 May 2024 10:44:41 +0200 Subject: [PATCH 189/540] refac:make fetching the sdkVersion on BG and post on main thread using asyncTask --- .../main/java/com/adjust/sdk/AdjustInstance.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 062dde2ea..4d45b3afb 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -556,12 +556,17 @@ public AdjustAttribution getAttribution() { * @param onSdkVersionReadListener Callback to get triggered once SDK version is obtained. */ public void getSdkVersion(OnSdkVersionReadListener onSdkVersionReadListener) { - new Handler(Looper.getMainLooper()).post(new Runnable() { + new AsyncTaskExecutor() { @Override - public void run() { - onSdkVersionReadListener.onSdkVersionRead(Util.getSdkVersion()); + protected String doInBackground(Void... voids) { + return Util.getSdkVersion(); } - }); + + @Override + protected void onPostExecute(String sdkVersion) { + onSdkVersionReadListener.onSdkVersionRead(sdkVersion); + } + }.execute(); } /** From 6bbb308282ad38fabb167fcf2b8550ed49c041ef Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 27 May 2024 15:06:03 +0200 Subject: [PATCH 190/540] feat: add beta version information into http header --- .../src/main/java/com/adjust/sdk/network/UtilNetworking.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java index 25e159dab..ab3805b4c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java @@ -32,6 +32,7 @@ public void applyConnectionOptions(final HttpsURLConnection connection, final String clientSdk) { connection.setRequestProperty("Client-SDK", clientSdk); + connection.setRequestProperty("Beta-Version", "1"); connection.setConnectTimeout(Constants.ONE_MINUTE); connection.setReadTimeout(Constants.ONE_MINUTE); } From b0551a56bf04cd1e96c7e7f37ca7b7446ef5a14f Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 22 May 2024 19:09:41 +0200 Subject: [PATCH 191/540] refac: rename setReadDeviceInfoOnceEnabled and logic around it --- .../src/main/java/com/adjust/sdk/AdjustConfig.java | 10 +++++----- .../src/main/java/com/adjust/sdk/DeviceInfo.java | 8 ++++---- .../src/main/assets/adjust_config.js | 6 +++--- .../com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 9519d599f..0613589cb 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -37,7 +37,7 @@ public class AdjustConfig { String urlStrategy; String preinstallFilePath; String fbAppId; - boolean readDeviceInfoOnceEnabled; + boolean shouldReadDeviceIdsOnce; OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; ArrayList cachedAdidReadCallbacks = new ArrayList<>(); Integer eventDeduplicationIdsMaxSize; @@ -179,8 +179,8 @@ public void setUrlStrategy(String urlStrategy) { this.urlStrategy = urlStrategy; } - public void setReadDeviceInfoOnceEnabled(boolean readDeviceInfoOnceEnabled) { - this.readDeviceInfoOnceEnabled = readDeviceInfoOnceEnabled; + public void readDeviceIdsOnce(boolean shouldReadDeviceIdsOnce) { + this.shouldReadDeviceIdsOnce = shouldReadDeviceIdsOnce; } public void setEventDeduplicationIdsMaxSize(Integer eventDeduplicationIdsMaxSize) { @@ -307,8 +307,8 @@ public String getFbAppId() { return fbAppId; } - public boolean isReadDeviceInfoOnceEnabled() { - return readDeviceInfoOnceEnabled; + public boolean shouldReadDeviceIdsOnce() { + return shouldReadDeviceIdsOnce; } private void setLogLevel(LogLevel logLevel, String environment) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index cca6ca46c..8d7a23183 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -65,7 +65,7 @@ class DeviceInfo { Boolean isTrackingEnabled; private boolean nonGoogleIdsReadOnce = false; private boolean playIdsReadOnce = false; - private boolean otherDeviceInfoParamsReadOnce = false; + private boolean otherDeviceIdsParamsReadOnce = false; String androidId; String fbAttributionId; String clientSdk; @@ -140,7 +140,7 @@ class DeviceInfo { } void reloadPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled, boolean playStoreKidsAppEnabled) { - if (playIdsReadOnce && adjustConfig.readDeviceInfoOnceEnabled) { + if (playIdsReadOnce && adjustConfig.shouldReadDeviceIdsOnce) { if (!Util.canReadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled)) { playAdId = null; isTrackingEnabled = null; @@ -250,7 +250,7 @@ void reloadNonPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled, boo void reloadOtherDeviceInfoParams(final AdjustConfig adjustConfig, final boolean coppaEnabled, final ILogger logger) { - if (adjustConfig.readDeviceInfoOnceEnabled && otherDeviceInfoParamsReadOnce) { + if (adjustConfig.shouldReadDeviceIdsOnce && otherDeviceIdsParamsReadOnce) { return; } @@ -262,7 +262,7 @@ void reloadOtherDeviceInfoParams(final AdjustConfig adjustConfig, mcc = UtilDeviceIds.getMcc(adjustConfig.context, logger); mnc = UtilDeviceIds.getMnc(adjustConfig.context, logger); - otherDeviceInfoParamsReadOnce = true; + otherDeviceIdsParamsReadOnce = true; } public static void getFireAdvertisingIdBypassConditions(ContentResolver contentResolver, OnAmazonAdIdReadListener onAmazonAdIdReadListener) { UtilDeviceIds.getFireAdvertisingIdAsync(contentResolver, onAmazonAdIdReadListener); diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js index e5cf2658e..34b7931cb 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -44,7 +44,7 @@ function AdjustConfig(appToken, environment, legacy) { this.preinstallTrackingEnabled = null; this.preinstallFilePath = null; this.fbAppId = null; - this.readDeviceInfoOnceEnabled = null; + this.shouldReadDeviceIdsOnce = null; this.eventDeduplicationIdsMaxSize = null; } @@ -212,8 +212,8 @@ AdjustConfig.prototype.setFbAppId = function(fbAppId) { this.fbAppId = fbAppId; }; -AdjustConfig.prototype.setReadDeviceInfoOnceEnabled = function(isEnabled) { - this.readDeviceInfoOnceEnabled = isEnabled; +AdjustConfig.prototype.readDeviceIdsOnce = function(isEnabled) { + this.shouldReadDeviceIdsOnce = isEnabled; }; AdjustConfig.prototype.setEventDeduplicationIdsMaxSize = function(eventDeduplicationIdsMaxSize) { diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 1c9554fbf..11dc0c024 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -165,7 +165,7 @@ public void onCreate(String adjustConfigString) { Object preinstallTrackingEnabledField = jsonAdjustConfig.get("preinstallTrackingEnabled"); Object preinstallFilePathField = jsonAdjustConfig.get("preinstallFilePath"); Object fbAppIdField = jsonAdjustConfig.get("fbAppId"); - Object readDeviceInfoOnceEnabledField = jsonAdjustConfig.get("readDeviceInfoOnceEnabled"); + Object shouldReadDeviceIdsOnceField = jsonAdjustConfig.get("shouldReadDeviceIdsOnce"); Object eventDeduplicationIdsMaxSizeField = jsonAdjustConfig.get("eventDeduplicationIdsMaxSize"); String appToken = AdjustBridgeUtil.fieldToString(appTokenField); @@ -350,9 +350,9 @@ public boolean launchReceivedDeeplink(Uri deeplink) { } // read device info once - Boolean readDeviceInfoOnceEnabled = AdjustBridgeUtil.fieldToBoolean(readDeviceInfoOnceEnabledField); - if (readDeviceInfoOnceEnabled != null) { - adjustConfig.setReadDeviceInfoOnceEnabled(readDeviceInfoOnceEnabled); + Boolean shouldReadDeviceIdsOnce = AdjustBridgeUtil.fieldToBoolean(shouldReadDeviceIdsOnceField); + if (shouldReadDeviceIdsOnce != null) { + adjustConfig.readDeviceIdsOnce(shouldReadDeviceIdsOnce); } Integer eventDeduplicationIdsMaxSize = AdjustBridgeUtil.fieldToInteger(eventDeduplicationIdsMaxSizeField); From 7c522ae0b077b25c38c297c2b231b9e68b2d5a3a Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 24 May 2024 14:14:36 +0200 Subject: [PATCH 192/540] refac: in sync with iOS implementation --- .../sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java | 5 +++-- Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js | 4 ++-- .../java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 0613589cb..a92697e09 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -83,6 +83,7 @@ private void init(Context context, String appToken, String environment, boolean // default values this.sendInBackground = false; this.preinstallTrackingEnabled = false; + this.shouldReadDeviceIdsOnce = false; } @@ -179,8 +180,8 @@ public void setUrlStrategy(String urlStrategy) { this.urlStrategy = urlStrategy; } - public void readDeviceIdsOnce(boolean shouldReadDeviceIdsOnce) { - this.shouldReadDeviceIdsOnce = shouldReadDeviceIdsOnce; + public void readDeviceIdsOnce() { + this.shouldReadDeviceIdsOnce = true; } public void setEventDeduplicationIdsMaxSize(Integer eventDeduplicationIdsMaxSize) { diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js index 34b7931cb..e6c2133a0 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -212,8 +212,8 @@ AdjustConfig.prototype.setFbAppId = function(fbAppId) { this.fbAppId = fbAppId; }; -AdjustConfig.prototype.readDeviceIdsOnce = function(isEnabled) { - this.shouldReadDeviceIdsOnce = isEnabled; +AdjustConfig.prototype.readDeviceIdsOnce = function() { + this.shouldReadDeviceIdsOnce = true; }; AdjustConfig.prototype.setEventDeduplicationIdsMaxSize = function(eventDeduplicationIdsMaxSize) { diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 11dc0c024..ffab1f0b7 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -351,8 +351,8 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // read device info once Boolean shouldReadDeviceIdsOnce = AdjustBridgeUtil.fieldToBoolean(shouldReadDeviceIdsOnceField); - if (shouldReadDeviceIdsOnce != null) { - adjustConfig.readDeviceIdsOnce(shouldReadDeviceIdsOnce); + if (shouldReadDeviceIdsOnce != null && shouldReadDeviceIdsOnce.booleanValue()) { + adjustConfig.readDeviceIdsOnce(); } Integer eventDeduplicationIdsMaxSize = AdjustBridgeUtil.fieldToInteger(eventDeduplicationIdsMaxSizeField); From 5ca7cb82d103571b4899cbb8eb6770b3725f1d70 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 29 May 2024 14:41:31 +0200 Subject: [PATCH 193/540] Fix: Revert back orderIds field name to match serialPersistentFields --- .../java/com/adjust/sdk/ActivityState.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java index 17e5f8867..8d7242e3d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java @@ -87,7 +87,7 @@ public class ActivityState implements Serializable, Cloneable { protected long lastInterval; - protected LinkedList eventDeduplicationIds; + protected LinkedList orderIds; protected int eventDeduplicationIdsMaxSize; protected String pushToken; @@ -141,7 +141,7 @@ protected ActivityState() { timeSpent = -1; // this information will be collected and attached to the next session lastActivity = -1; lastInterval = -1; - eventDeduplicationIds = null; + orderIds = null; pushToken = null; adid = null; clickTime = 0; @@ -187,21 +187,21 @@ protected void addDeduplicationId(String deduplicationId) { return; } - if (eventDeduplicationIds == null) { - eventDeduplicationIds = new LinkedList(); + if (orderIds == null) { + orderIds = new LinkedList(); } else { - while (eventDeduplicationIds.size() >= eventDeduplicationIdsMaxSize) { - eventDeduplicationIds.removeLast(); + while (orderIds.size() >= eventDeduplicationIdsMaxSize) { + orderIds.removeLast(); } } - eventDeduplicationIds.addFirst(deduplicationId); + orderIds.addFirst(deduplicationId); } protected boolean eventDeduplicationIdExists(String deduplicationId) { - if (eventDeduplicationIds == null) { + if (orderIds == null) { return false; } - return eventDeduplicationIds.contains(deduplicationId); + return orderIds.contains(deduplicationId); } protected void setEventDeduplicationIdsMaxSize(Integer size) { @@ -242,7 +242,7 @@ public boolean equals(Object other) { if (!Util.equalLong(sessionLength, otherActivityState.sessionLength)) return false; if (!Util.equalLong(timeSpent, otherActivityState.timeSpent)) return false; if (!Util.equalLong(lastInterval, otherActivityState.lastInterval)) return false; - if (!Util.equalObject(eventDeduplicationIds, otherActivityState.eventDeduplicationIds)) return false; + if (!Util.equalObject(orderIds, otherActivityState.orderIds)) return false; if (!Util.equalString(pushToken, otherActivityState.pushToken)) return false; if (!Util.equalString(adid, otherActivityState.adid)) return false; if (!Util.equalLong(clickTime, otherActivityState.clickTime)) return false; @@ -289,7 +289,7 @@ public int hashCode() { hashCode = Util.hashLong(sessionLength, hashCode); hashCode = Util.hashLong(timeSpent, hashCode); hashCode = Util.hashLong(lastInterval, hashCode); - hashCode = Util.hashObject(eventDeduplicationIds, hashCode); + hashCode = Util.hashObject(orderIds, hashCode); hashCode = Util.hashString(pushToken, hashCode); hashCode = Util.hashString(adid, hashCode); hashCode = Util.hashLong(clickTime, hashCode); @@ -340,7 +340,7 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo isThirdPartySharingDisabledForCoppa = Util.readBooleanField(fields, "isThirdPartySharingDisabledForCoppa", false); askingAttribution = Util.readBooleanField(fields, "askingAttribution", false); - eventDeduplicationIds = Util.readObjectField(fields, "orderIds", null); + orderIds = Util.readObjectField(fields, "orderIds", null); pushToken = Util.readStringField(fields, "pushToken", null); adid = Util.readStringField(fields, "adid", null); From 976dc823c37e45647d534923afd3f6bb2489cbec Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 15 May 2024 12:49:24 +0200 Subject: [PATCH 194/540] refac:refactor getAttribution to Async --- .../adjust/examples/GlobalApplication.java | 12 +++++++++ .../java/com/adjust/sdk/ActivityHandler.java | 26 +++++++++++++++++-- .../src/main/java/com/adjust/sdk/Adjust.java | 8 ++++-- .../java/com/adjust/sdk/AdjustConfig.java | 1 + .../java/com/adjust/sdk/AdjustInstance.java | 9 ++++--- .../java/com/adjust/sdk/IActivityHandler.java | 2 +- .../adjust/sdk/OnAttributionReadListener.java | 5 ++++ .../sdk/webbridge/AdjustBridgeInstance.java | 10 +++++-- 8 files changed, 63 insertions(+), 10 deletions(-) create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAttributionReadListener.java diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index ba76ccf5e..144241e99 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -18,6 +18,7 @@ import com.adjust.sdk.OnAdidReadListener; import com.adjust.sdk.OnAmazonAdIdReadListener; import com.adjust.sdk.OnAttributionChangedListener; +import com.adjust.sdk.OnAttributionReadListener; import com.adjust.sdk.OnDeeplinkResponseListener; import com.adjust.sdk.OnEventTrackingFailedListener; import com.adjust.sdk.OnEventTrackingSucceededListener; @@ -144,6 +145,17 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Initialise the adjust SDK. Adjust.onCreate(config); + + + + Adjust.getAttribution(new OnAttributionReadListener() { + @Override + public void onAttributionRead(AdjustAttribution attribution) { + Log.d("exampleAttribution", "Attribution callback called!"); + Log.d("exampleAttribution", "Attribution: " + attribution.toString()); + } + }); + // Get the adid. Adjust.getAdid(new OnAdidReadListener() { @Override diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 3d127d0d5..46b8eeb87 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -89,6 +89,7 @@ public class ActivityHandler private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; private ArrayList cachedAdidReadCallbacks = new ArrayList<>(); private SystemLifecycle systemLifecycle; + private ArrayList cachedAttributionReadCallbacks = new ArrayList<>(); @Override public void teardown() { @@ -487,6 +488,23 @@ public boolean updateAttributionI(AdjustAttribution attribution) { return false; } + if (! cachedAttributionReadCallbacks.isEmpty()) { + final ArrayList cachedAttributionReadCallbacksCopy = + new ArrayList<>(cachedAttributionReadCallbacks); + + cachedAttributionReadCallbacks.clear(); + new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + for (OnAttributionReadListener onAttributionReadListener : cachedAttributionReadCallbacksCopy) { + if (onAttributionReadListener != null) { + onAttributionReadListener.onAttributionRead(attribution); + } + } + } + }); + } + if (activityState.askingAttribution) { return false; } @@ -497,6 +515,7 @@ public boolean updateAttributionI(AdjustAttribution attribution) { this.attribution = attribution; writeAttributionI(); + return true; } @@ -772,8 +791,8 @@ public void run() { } @Override - public AdjustAttribution getAttribution() { - return attribution; + public void getAttribution(OnAttributionReadListener onAttributionReadListener) { + cachedAttributionReadCallbacks.add(onAttributionReadListener); } @Override @@ -893,6 +912,9 @@ public void run(ActivityHandler activityHandler) { cachedAdidReadCallbacks.addAll(adjustConfig.cachedAdidReadCallbacks); adjustConfig.cachedAdidReadCallbacks.clear(); + cachedAttributionReadCallbacks.addAll(adjustConfig.cachedAttributionReadCallbacks); + adjustConfig.cachedAttributionReadCallbacks.clear(); + if (! cachedAdidReadCallbacks.isEmpty() && activityState != null && activityState.adid != null) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 15afc97bf..2898c96db 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -367,9 +367,13 @@ public static void getAdid(final OnAdidReadListener onAdidReadListener) { * * @return AdjustAttribution object with current attribution value */ - public static AdjustAttribution getAttribution() { + public static void getAttribution(OnAttributionReadListener attributionReadListener) { + if (attributionReadListener == null) { + AdjustFactory.getLogger().error("Callback for getting attribution can't be null"); + return; + } AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - return adjustInstance.getAttribution(); + adjustInstance.getAttribution(attributionReadListener); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index a92697e09..04d5c6cd9 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -41,6 +41,7 @@ public class AdjustConfig { OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; ArrayList cachedAdidReadCallbacks = new ArrayList<>(); Integer eventDeduplicationIdsMaxSize; + ArrayList cachedAttributionReadCallbacks = new ArrayList<>(); public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 4d45b3afb..528a8b2c1 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -54,6 +54,7 @@ public PreLaunchActions() { private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; private ArrayList cachedAdidReadCallbacks = new ArrayList<>(); + private ArrayList cachedAttributionReadCallbacks = new ArrayList<>(); /** * Base path for Adjust packages. */ @@ -103,6 +104,7 @@ public void onCreate(final AdjustConfig adjustConfig) { adjustConfig.purchaseVerificationPath = this.purchaseVerificationPath; adjustConfig.cachedDeeplinkResolutionCallback = cachedDeeplinkResolutionCallback; adjustConfig.cachedAdidReadCallbacks = cachedAdidReadCallbacks; + adjustConfig.cachedAttributionReadCallbacks = cachedAttributionReadCallbacks; activityHandler = AdjustFactory.getActivityHandler(adjustConfig); setSendingReferrersAsNotSent(adjustConfig.context); @@ -543,11 +545,12 @@ public void getAdid(OnAdidReadListener onAdidReadListener) { * * @return AdjustAttribution object with current attribution value */ - public AdjustAttribution getAttribution() { + public void getAttribution(OnAttributionReadListener attributionReadListener) { if (!checkActivityHandler("getAttribution")) { - return null; + cachedAttributionReadCallbacks.add(attributionReadListener); + return; } - return activityHandler.getAttribution(); + activityHandler.getAttribution(attributionReadListener); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 2f72384e6..51e8b6752 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -84,7 +84,7 @@ public interface IActivityHandler { void getAdid(OnAdidReadListener onAdidReadListener); - AdjustAttribution getAttribution(); + void getAttribution(OnAttributionReadListener onAttributionReadListener); AdjustConfig getAdjustConfig(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAttributionReadListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAttributionReadListener.java new file mode 100644 index 000000000..3ac276b43 --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAttributionReadListener.java @@ -0,0 +1,5 @@ +package com.adjust.sdk; + +public interface OnAttributionReadListener { + void onAttributionRead(AdjustAttribution attribution); +} diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index ffab1f0b7..0814dabe1 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -23,6 +23,7 @@ import com.adjust.sdk.OnAdidReadListener; import com.adjust.sdk.OnAmazonAdIdReadListener; import com.adjust.sdk.OnAttributionChangedListener; +import com.adjust.sdk.OnAttributionReadListener; import com.adjust.sdk.OnDeeplinkResponseListener; import com.adjust.sdk.OnDeviceIdsRead; import com.adjust.sdk.OnEventTrackingFailedListener; @@ -711,8 +712,13 @@ public void getAttribution(final String callback) { if (!isInitialized()) { return; } - AdjustAttribution attribution = Adjust.getAttribution(); - AdjustBridgeUtil.execAttributionCallbackCommand(webView, callback, attribution); + Adjust.getAttribution(new OnAttributionReadListener() { + @Override + public void onAttributionRead(AdjustAttribution attribution) { + AdjustBridgeUtil.execAttributionCallbackCommand(webView, callback, attribution); + } + + }); } @JavascriptInterface From 6890f557f21760e9fca258a4e744385b5b897bf7 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 15 May 2024 13:37:49 +0200 Subject: [PATCH 195/540] refac:add invoke attributionRead if its exist --- .../src/main/assets/AdjustExample-WebView.html | 15 +++++++++++++++ .../java/com/adjust/sdk/ActivityHandler.java | 11 ++++++++++- .../src/main/assets/adjust.js | 18 ++++++++++++++++-- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html index 27d2f0286..045235919 100755 --- a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html +++ b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html @@ -177,6 +177,20 @@

Adjust Web View SDK Demo alert('SDK version:\n' + sdkVersion); }); } + + var btnGetAttribution = document.getElementById('btnGetAttribution') + btnGetAttribution.onclick = function(e) { + e.preventDefault(); + Adjust.getAttribution(function (attribution) { + alert('Tracker token = ' + attribution.trackerToken + '\n' + + 'Tracker name = ' + attribution.trackerName + '\n' + + 'Network = ' + attribution.network + '\n' + + 'Campaign = ' + attribution.campaign + '\n' + + 'Adgroup = ' + attribution.adgroup + '\n' + + 'Creative = ' + attribution.creative + '\n' + + 'Click label = ' + attribution.clickLabel); + }); + } }
@@ -218,6 +232,7 @@

Adjust Web View SDK Demo

+
diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 46b8eeb87..25dae9dee 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -792,7 +792,16 @@ public void run() { @Override public void getAttribution(OnAttributionReadListener onAttributionReadListener) { - cachedAttributionReadCallbacks.add(onAttributionReadListener); + if (attribution != null) { + new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + onAttributionReadListener.onAttributionRead(attribution); + } + }); + }else { + cachedAttributionReadCallbacks.add(onAttributionReadListener); + } } @Override diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index 1d8015309..7a4084d39 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -227,8 +227,20 @@ var Adjust = { }, getAttribution: function (callback) { - if (AdjustBridge) { - AdjustBridge.getAttribution(callback); + if (AdjustBridge) { + if (typeof callback === 'string' || callback instanceof String) { + this.getAttributionCallbackName = callback; + } else { + this.getAttributionCallbackName = 'Adjust.adjust_getAttributionCallback'; + this.getAttributionCallbackFunction = callback; + } + AdjustBridge.getAttribution(this.getAttributionCallbackName); + } + }, + + adjust_getAttributionCallback: function (attribution) { + if (AdjustBridge && this.getAttributionCallbackFunction) { + this.getAttributionCallbackFunction(attribution); } }, @@ -269,6 +281,8 @@ var Adjust = { this.getGoogleAdIdCallbackFunction = undefined; this.getAdIdCallbackName = undefined; this.getAdIdCallbackFunction = undefined; + this.getAttributionCallbackName = undefined; + this.getAttributionCallbackFunction = undefined; this.getAmazonIdCallbackSuccessName = undefined; this.getAmazonIdCallbackSuccessFunction = undefined; this.getAmazonIdCallbackFailName = undefined; From f270cbea0606fd6e70655e080118a17344c35dd8 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 16 May 2024 11:51:49 +0200 Subject: [PATCH 196/540] style:cleaning the log --- .../src/main/java/com/adjust/examples/GlobalApplication.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 144241e99..78c0845ec 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -151,8 +151,8 @@ public boolean launchReceivedDeeplink(Uri deeplink) { Adjust.getAttribution(new OnAttributionReadListener() { @Override public void onAttributionRead(AdjustAttribution attribution) { - Log.d("exampleAttribution", "Attribution callback called!"); - Log.d("exampleAttribution", "Attribution: " + attribution.toString()); + Log.d("example", "Attribution callback called!"); + Log.d("example", "Attribution: " + attribution.toString()); } }); From 645bdcd407091816bde02ec76be88b51c97446b7 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 17 May 2024 12:54:27 +0200 Subject: [PATCH 197/540] refac:refactor function comments invoke callback after check of askIn flag --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 8 ++++---- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- .../src/main/java/com/adjust/sdk/AdjustInstance.java | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 25dae9dee..ea044903a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -488,6 +488,10 @@ public boolean updateAttributionI(AdjustAttribution attribution) { return false; } + if (activityState.askingAttribution) { + return false; + } + if (! cachedAttributionReadCallbacks.isEmpty()) { final ArrayList cachedAttributionReadCallbacksCopy = new ArrayList<>(cachedAttributionReadCallbacks); @@ -505,10 +509,6 @@ public void run() { }); } - if (activityState.askingAttribution) { - return false; - } - if (attribution.equals(this.attribution)) { return false; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 2898c96db..00e921ce3 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -365,7 +365,7 @@ public static void getAdid(final OnAdidReadListener onAdidReadListener) { /** * Called to get user's current attribution value. * - * @return AdjustAttribution object with current attribution value + * @param attributionReadListener Callback to get triggered once attribution is obtained */ public static void getAttribution(OnAttributionReadListener attributionReadListener) { if (attributionReadListener == null) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 528a8b2c1..0192ee184 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -543,7 +543,7 @@ public void getAdid(OnAdidReadListener onAdidReadListener) { /** * Called to get user's current attribution value. * - * @return AdjustAttribution object with current attribution value + * @param attributionReadListener Callback to get triggered once attribution is obtained. */ public void getAttribution(OnAttributionReadListener attributionReadListener) { if (!checkActivityHandler("getAttribution")) { From befb2a1206f15792f3dd5ea0a5a98b9f09509ebd Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 29 May 2024 11:30:41 +0200 Subject: [PATCH 198/540] refac:handle attributionCallback in initI - ActivityHandler.java clean up the initI regards the adid and attribution callbacks --- .../java/com/adjust/sdk/ActivityHandler.java | 79 +++++++++++++------ 1 file changed, 53 insertions(+), 26 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index ea044903a..8f31adc89 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -918,32 +918,8 @@ public void run(ActivityHandler activityHandler) { this.cachedDeeplinkResolutionCallback = adjustConfig.cachedDeeplinkResolutionCallback; } - cachedAdidReadCallbacks.addAll(adjustConfig.cachedAdidReadCallbacks); - adjustConfig.cachedAdidReadCallbacks.clear(); - - cachedAttributionReadCallbacks.addAll(adjustConfig.cachedAttributionReadCallbacks); - adjustConfig.cachedAttributionReadCallbacks.clear(); - - if (! cachedAdidReadCallbacks.isEmpty() - && activityState != null - && activityState.adid != null) - { - final ArrayList cachedAdidReadCallbacksCopy = - new ArrayList<>(cachedAdidReadCallbacks); - final String adidCopy = activityState.adid; - - cachedAdidReadCallbacks.clear(); - new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { - @Override - public void run() { - for (OnAdidReadListener onAdidReadListener : cachedAdidReadCallbacksCopy) { - if (onAdidReadListener != null) { - onAdidReadListener.onAdidRead(adidCopy); - } - } - } - }); - } + handleAdidCallbackI(); + handleAttributionCallbackI(); // GDPR if (internalState.hasFirstSdkStartOcurred()) { @@ -1052,6 +1028,57 @@ public void onFail(String message) { bootstrapLifecycleI(); } + private void handleAttributionCallbackI() { + cachedAttributionReadCallbacks.addAll(adjustConfig.cachedAttributionReadCallbacks); + adjustConfig.cachedAttributionReadCallbacks.clear(); + + if (! cachedAttributionReadCallbacks.isEmpty() + && attribution != null) + { + final ArrayList cachedAttributionReadCallbacksCopy = + new ArrayList<>(cachedAttributionReadCallbacks); + final AdjustAttribution attributionCopy = attribution; + + cachedAttributionReadCallbacks.clear(); + new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + for (OnAttributionReadListener onAttributionReadListener : cachedAttributionReadCallbacksCopy) { + if (onAttributionReadListener != null) { + onAttributionReadListener.onAttributionRead(attributionCopy); + } + } + } + }); + } + } + + private void handleAdidCallbackI() { + cachedAdidReadCallbacks.addAll(adjustConfig.cachedAdidReadCallbacks); + adjustConfig.cachedAdidReadCallbacks.clear(); + + if (! cachedAdidReadCallbacks.isEmpty() + && activityState != null + && activityState.adid != null) + { + final ArrayList cachedAdidReadCallbacksCopy = + new ArrayList<>(cachedAdidReadCallbacks); + final String adidCopy = activityState.adid; + + cachedAdidReadCallbacks.clear(); + new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + for (OnAdidReadListener onAdidReadListener : cachedAdidReadCallbacksCopy) { + if (onAdidReadListener != null) { + onAdidReadListener.onAdidRead(adidCopy); + } + } + } + }); + } + } + private void bootstrapLifecycleI() { this.systemLifecycle = SystemLifecycle.getSingletonInstance(); From 5d8eb511e4ecfdf24b53455ac8abe460c9c23189 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 15 May 2024 13:37:49 +0200 Subject: [PATCH 199/540] refac:add invoke attributionRead if its exist --- .../src/main/assets/AdjustExample-WebView.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html index 045235919..823d6f169 100755 --- a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html +++ b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html @@ -232,6 +232,8 @@

Adjust Web View SDK Demo
+
+
From 1940e0e8af1074f4100b5199027122611242df9e Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 29 May 2024 14:50:58 +0200 Subject: [PATCH 200/540] refac:add context as input param for getAttribution --- .../main/java/com/adjust/examples/GlobalApplication.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 6 +++++- .../java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 78c0845ec..d87f87ea1 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -148,7 +148,7 @@ public boolean launchReceivedDeeplink(Uri deeplink) { - Adjust.getAttribution(new OnAttributionReadListener() { + Adjust.getAttribution(this, new OnAttributionReadListener() { @Override public void onAttributionRead(AdjustAttribution attribution) { Log.d("example", "Attribution callback called!"); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 00e921ce3..4616aabb6 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -367,11 +367,15 @@ public static void getAdid(final OnAdidReadListener onAdidReadListener) { * * @param attributionReadListener Callback to get triggered once attribution is obtained */ - public static void getAttribution(OnAttributionReadListener attributionReadListener) { + public static void getAttribution(final Context context, final OnAttributionReadListener attributionReadListener) { if (attributionReadListener == null) { AdjustFactory.getLogger().error("Callback for getting attribution can't be null"); return; } + if (context == null) { + AdjustFactory.getLogger().error("null context"); + return; + } AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.getAttribution(attributionReadListener); } diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 0814dabe1..563893e38 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -712,7 +712,7 @@ public void getAttribution(final String callback) { if (!isInitialized()) { return; } - Adjust.getAttribution(new OnAttributionReadListener() { + Adjust.getAttribution(application, new OnAttributionReadListener() { @Override public void onAttributionRead(AdjustAttribution attribution) { AdjustBridgeUtil.execAttributionCallbackCommand(webView, callback, attribution); From fd5c5053059f95c59303826572a2c1fb1db1e2a5 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 29 May 2024 14:52:20 +0200 Subject: [PATCH 201/540] refac:clean up the function comment --- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 4616aabb6..3c5f6cdf0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -365,6 +365,7 @@ public static void getAdid(final OnAdidReadListener onAdidReadListener) { /** * Called to get user's current attribution value. * + * @param context Application context * @param attributionReadListener Callback to get triggered once attribution is obtained */ public static void getAttribution(final Context context, final OnAttributionReadListener attributionReadListener) { From 8792bae152178a8a3d3990c1124a562e97e266e7 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 29 May 2024 14:51:28 +0200 Subject: [PATCH 202/540] Test: Add test server commands --- .../adjust/testapp/AdjustCommandExecutor.java | 34 +++++++++++++++++++ .../src/main/assets/command_executor.js | 20 +++++++++++ 2 files changed, 54 insertions(+) diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 57ab81e35..69afd2f15 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -2,6 +2,7 @@ import static com.adjust.testapp.MainActivity.baseUrl; import static com.adjust.testapp.MainActivity.gdprUrl; +import static com.adjust.testapp.MainActivity.testLibrary; import android.content.Context; import android.net.Uri; @@ -26,6 +27,7 @@ import com.adjust.sdk.AdjustThirdPartySharing; import com.adjust.sdk.LogLevel; import com.adjust.sdk.OnAttributionChangedListener; +import com.adjust.sdk.OnAttributionReadListener; import com.adjust.sdk.OnDeeplinkResolvedListener; import com.adjust.sdk.OnDeeplinkResponseListener; import com.adjust.sdk.OnEventTrackingFailedListener; @@ -94,6 +96,7 @@ public void executeCommand(final Command sentCommand) { case "disableCoppaCompliance" : disableCoppaCompliance(); break; case "enablePlayStoreKidsApp" : enablePlayStoreKidsApp(); break; case "disablePlayStoreKidsApp" : disablePlayStoreKidsApp(); break; + case "attributionGetter" : attributionGetter(); break; //case "testBegin": testBegin(); break; // case "testEnd": testEnd(); break; } @@ -825,6 +828,37 @@ private void disablePlayStoreKidsApp() { Adjust.disablePlayStoreKidsApp(context.getApplicationContext()); } + private void attributionGetter() { + Adjust.getAttribution(context, attribution -> { + Map fields = new HashMap<>(); + if (attribution.trackerToken != null) + fields.put("tracker_token", attribution.trackerToken); + if (attribution.trackerName != null) + fields.put("tracker_name", attribution.trackerName); + if (attribution.network != null) + fields.put("network", attribution.network); + if (attribution.campaign != null) + fields.put("campaign", attribution.campaign); + if (attribution.adgroup != null) + fields.put("adgroup", attribution.adgroup); + if (attribution.creative != null) + fields.put("creative", attribution.creative); + if (attribution.clickLabel != null) + fields.put("click_label", attribution.clickLabel); + if (attribution.costType != null) + fields.put("cost_type", attribution.costType); + if (attribution.costAmount != null) + fields.put("cost_amount", attribution.costAmount.toString()); + if (attribution.costCurrency != null) + fields.put("cost_currency", attribution.costCurrency); + if (attribution.fbInstallReferrer != null) + fields.put("fb_install_referrer", attribution.fbInstallReferrer); + + MainActivity.testLibrary.setInfoToSend(fields); + MainActivity.testLibrary.sendInfoToServer(basePath); + }); + } + /* private void testBegin() { if (command.containsParameter("teardown")) { diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index e4d3bda53..f1faf7385 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -139,6 +139,7 @@ AdjustCommandExecutor.prototype.executeCommand = function(command, idx) { case "disableCoppaCompliance" : this.disableCoppaCompliance(command.params); break; case "enablePlayStoreKidsApp" : this.enablePlayStoreKidsApp(command.params); break; case "disablePlayStoreKidsApp" : this.disablePlayStoreKidsApp(command.params); break; + case "attributionGetter" : this.attributionGetter(command.params); break; break; } @@ -627,6 +628,25 @@ AdjustCommandExecutor.prototype.disablePlayStoreKidsApp = function(params) { Adjust.disablePlayStoreKidsApp(); }; +AdjustCommandExecutor.prototype.attributionGetter = function(params) { + var basePath = this.basePath; + Adjust.getAttribution(function(attribution) { + TestLibrary.addInfoToSend("tracker_token", attribution.trackerToken); + TestLibrary.addInfoToSend("tracker_name", attribution.trackerName); + TestLibrary.addInfoToSend("network", attribution.network); + TestLibrary.addInfoToSend("campaign", attribution.campaign); + TestLibrary.addInfoToSend("adgroup", attribution.adgroup); + TestLibrary.addInfoToSend("creative", attribution.creative); + TestLibrary.addInfoToSend("click_label", attribution.clickLabel); + TestLibrary.addInfoToSend("cost_type", attribution.costType); + TestLibrary.addInfoToSend("cost_amount", attribution.costAmount); + TestLibrary.addInfoToSend("cost_currency", attribution.costCurrency); + TestLibrary.addInfoToSend("fb_install_referrer", attribution.fbInstallReferrer); + + TestLibrary.sendInfoToServer(basePath); + }); +}; + //Util //====================== function getValueFromKey(params, key) { From feb34571cd35ebf7dfb8d00c7301d777079022ef Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 29 May 2024 15:32:03 +0200 Subject: [PATCH 203/540] refac:remove context from getAttribution since it has no usage of context --- .../main/java/com/adjust/examples/GlobalApplication.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 7 +------ .../com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 2 +- .../java/com/adjust/testapp/AdjustCommandExecutor.java | 2 +- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index d87f87ea1..78c0845ec 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -148,7 +148,7 @@ public boolean launchReceivedDeeplink(Uri deeplink) { - Adjust.getAttribution(this, new OnAttributionReadListener() { + Adjust.getAttribution(new OnAttributionReadListener() { @Override public void onAttributionRead(AdjustAttribution attribution) { Log.d("example", "Attribution callback called!"); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 3c5f6cdf0..7b53320bb 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -365,18 +365,13 @@ public static void getAdid(final OnAdidReadListener onAdidReadListener) { /** * Called to get user's current attribution value. * - * @param context Application context * @param attributionReadListener Callback to get triggered once attribution is obtained */ - public static void getAttribution(final Context context, final OnAttributionReadListener attributionReadListener) { + public static void getAttribution(final OnAttributionReadListener attributionReadListener) { if (attributionReadListener == null) { AdjustFactory.getLogger().error("Callback for getting attribution can't be null"); return; } - if (context == null) { - AdjustFactory.getLogger().error("null context"); - return; - } AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.getAttribution(attributionReadListener); } diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 563893e38..0814dabe1 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -712,7 +712,7 @@ public void getAttribution(final String callback) { if (!isInitialized()) { return; } - Adjust.getAttribution(application, new OnAttributionReadListener() { + Adjust.getAttribution(new OnAttributionReadListener() { @Override public void onAttributionRead(AdjustAttribution attribution) { AdjustBridgeUtil.execAttributionCallbackCommand(webView, callback, attribution); diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 69afd2f15..f17c9af3d 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -829,7 +829,7 @@ private void disablePlayStoreKidsApp() { } private void attributionGetter() { - Adjust.getAttribution(context, attribution -> { + Adjust.getAttribution(attribution -> { Map fields = new HashMap<>(); if (attribution.trackerToken != null) fields.put("tracker_token", attribution.trackerToken); From dfdc13ddbacefb78712a5844a18db273d6d156ba Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 27 Feb 2024 09:47:32 +0100 Subject: [PATCH 204/540] Test: Small refac and add fingerprint --- Adjust/test-app-core/build.gradle | 2 +- .../java/com/adjust/testapp/MainActivity.java | 6 +- .../testappwebbridge/TestLibraryBridge.java | 2 +- .../main/java/com/adjust/test/Networking.java | 347 ++++++++++++++++++ .../java/com/adjust/test/TestLibrary.java | 45 +-- .../src/main/java/com/adjust/test/Utils.java | 12 +- .../java/com/adjust/test/UtilsNetworking.java | 270 -------------- 7 files changed, 378 insertions(+), 306 deletions(-) create mode 100644 Adjust/test-library/src/main/java/com/adjust/test/Networking.java delete mode 100644 Adjust/test-library/src/main/java/com/adjust/test/UtilsNetworking.java diff --git a/Adjust/test-app-core/build.gradle b/Adjust/test-app-core/build.gradle index 9f0267c5f..65922e155 100644 --- a/Adjust/test-app-core/build.gradle +++ b/Adjust/test-app-core/build.gradle @@ -19,7 +19,7 @@ android { } dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) implementation 'androidx.appcompat:appcompat:1.3.1' implementation "androidx.constraintlayout:constraintlayout:2.1.1" implementation 'com.google.android.gms:play-services-ads-identifier:17.1.0' diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java index 4341bcf29..d0a7662f8 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java @@ -30,14 +30,16 @@ protected void onCreate(Bundle savedInstanceState) { return; } - testLibrary = new TestLibrary(baseUrl, controlUrl, new CommandListener(this.getApplicationContext())); + testLibrary = new TestLibrary(baseUrl, controlUrl, this.getApplicationContext(), + new CommandListener(this.getApplicationContext())); // testLibrary.doNotExitAfterEnd(); startTestSession(); } private void startTestSession() { - // testLibrary.addTestDirectory("current/gdpr"); + //testLibrary.addTestDirectory("app-secret"); + //testLibrary.addTest("Test_Event_Params"); Adjust.getSdkVersion(new OnSdkVersionReadListener() { @Override diff --git a/Adjust/test-app-webbridge/src/main/java/com/example/testappwebbridge/TestLibraryBridge.java b/Adjust/test-app-webbridge/src/main/java/com/example/testappwebbridge/TestLibraryBridge.java index bd2327392..0f3a9fb04 100644 --- a/Adjust/test-app-webbridge/src/main/java/com/example/testappwebbridge/TestLibraryBridge.java +++ b/Adjust/test-app-webbridge/src/main/java/com/example/testappwebbridge/TestLibraryBridge.java @@ -40,7 +40,7 @@ public static void startTestSession(String clientSdk) { } private static void initTestLibrary() { - TestLibraryBridge.testLibrary = new TestLibrary(baseUrl, controlUrl, new ICommandRawJsonListener() { + TestLibraryBridge.testLibrary = new TestLibrary(baseUrl, controlUrl, application, new ICommandRawJsonListener() { @Override public void executeCommand(String json) { Log.d("testappwebbridge", String.format("execRawTestCommandCallback %s, %d", json, order)); diff --git a/Adjust/test-library/src/main/java/com/adjust/test/Networking.java b/Adjust/test-library/src/main/java/com/adjust/test/Networking.java new file mode 100644 index 000000000..da9a690a2 --- /dev/null +++ b/Adjust/test-library/src/main/java/com/adjust/test/Networking.java @@ -0,0 +1,347 @@ +package com.adjust.test; + +import static com.adjust.test.Constants.ONE_MINUTE; +import static com.adjust.test.Utils.debug; +import static com.adjust.test.Utils.error; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.Signature; +import android.os.Build; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.math.BigInteger; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.URL; +import java.net.URLEncoder; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +public class Networking { + public static class Response { + public String response = null; + public Integer responseCode = null; + public Map> headerFields = null; + } + + // region Injected dependencies + private final String baseUrl; + private final Context context; + // endregion + + // region Internal variables + private TrustManager[] trustAllCerts; + private HostnameVerifier hostnameVerifier;; + private String fingerprint; + // endregion + + public String clientSdk; + public String testNames; + + // region Instantiation and Dependencies + public Networking(final String baseUrl, final Context context) { + this.baseUrl = baseUrl; + this.context = context; + this.fingerprint = fingerprint(context); + + trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + debug("getAcceptedIssuers"); + + return null; + } + + public void checkClientTrusted( + java.security.cert.X509Certificate[] certs, String authType) { + debug("checkClientTrusted"); + } + + public void checkServerTrusted( + java.security.cert.X509Certificate[] certs, String authType) { + debug("checkServerTrusted"); + } + } + }; + hostnameVerifier = new HostnameVerifier() { + @Override + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + } + // endregion + + // region Public API + public Response sendPost(String path) { + return sendPost(path, null, null); + } + public Response sendPost(String path, String base) { + return sendPost(path, base, null); + } + public Response sendPost(String path, Map postBody) { + return sendPost(path, null, postBody); + } + public Response sendPost(String path, String base, Map postBody) { + String merged = base == null ? path : base + path; + String targetURL = baseUrl + merged; + + try { + HttpsURLConnection connection = createPOSTHttpsURLConnection( + targetURL, postBody); + Response response = readHttpResponse(connection); + debug("Response: %s", response.response); + + response.headerFields= connection.getHeaderFields(); + debug("Headers: %s", response.headerFields); + + return response; + } catch (IOException e) { + error(e.getMessage()); + } catch (Exception e) { + error(e.getMessage()); + } + return null; + } + // endregion + + // region Internal Methods + private HttpsURLConnection createPOSTHttpsURLConnection( + String urlString, + Map postBody) + throws IOException + { + DataOutputStream wr = null; + HttpsURLConnection connection = null; + + try { + debug("POST request: %s", urlString); + URL url = new URL(urlString); + connection = (HttpsURLConnection) url.openConnection(); + + applyConnectionOptions(connection); + + connection.setRequestMethod("POST"); + connection.setUseCaches(false); + connection.setDoInput(true); + connection.setDoOutput(true); + + if (postBody != null && postBody.size() > 0) { + wr = new DataOutputStream(connection.getOutputStream()); + wr.writeBytes(getPostDataString(postBody)); + } + + return connection; + } catch (Exception e) { + throw e; + } finally { + try { + if (wr != null) { + wr.flush(); + wr.close(); + } + } catch (Exception e) { + } + } + } + + private void applyConnectionOptions(HttpsURLConnection connection) { + if (clientSdk != null) { + connection.setRequestProperty("Client-SDK", clientSdk); + } + if (testNames != null) { + connection.setRequestProperty("Test-Names", testNames); + } + if (fingerprint != null) { + connection.setRequestProperty("Fingerprint", fingerprint); + } + + //Inject local ip address for Jenkins script + connection.setRequestProperty("Local-Ip", getIPAddress(true)); + + connection.setConnectTimeout(ONE_MINUTE); + connection.setReadTimeout(ONE_MINUTE); + try { + SSLContext sc = SSLContext.getInstance("TLS"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + connection.setSSLSocketFactory(sc.getSocketFactory()); + + connection.setHostnameVerifier(hostnameVerifier); + debug("applyConnectionOptions"); + } catch (Exception e) { + debug("applyConnectionOptions %s", e.getMessage()); + } + } + + private static String getIPAddress(boolean useIPv4) { + try { + List interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); + for (NetworkInterface intf : interfaces) { + List addrs = Collections.list(intf.getInetAddresses()); + for (InetAddress addr : addrs) { + if (!addr.isLoopbackAddress()) { + String sAddr = addr.getHostAddress(); + boolean isIPv4 = sAddr.indexOf(':') < 0; + + if (useIPv4) { + if (isIPv4) + return sAddr; + } else { + if (!isIPv4) { + int delim = sAddr.indexOf('%'); // drop ip6 zone suffix + return delim < 0 ? sAddr.toUpperCase() : sAddr.substring(0, delim).toUpperCase(); + } + } + } + } + } + } catch (Exception ex) { + error("Failed to read ip address (%s)", ex.getMessage()); + } + + return ""; + } + + private static String getPostDataString(Map body) throws + UnsupportedEncodingException + { + StringBuilder result = new StringBuilder(); + + for (Map.Entry entry : body.entrySet()) { + String encodedName = URLEncoder.encode(entry.getKey(), Constants.ENCODING); + String value = entry.getValue(); + String encodedValue = value != null ? URLEncoder.encode(value, Constants.ENCODING) : ""; + + if (result.length() > 0) { + result.append("&"); + } + + result.append(encodedName); + result.append("="); + result.append(encodedValue); + } + + return result.toString(); + } + + static Response readHttpResponse(HttpsURLConnection connection) throws Exception { + StringBuffer sb = new StringBuffer(); + Response response = new Response(); + + try { + connection.connect(); + + response.responseCode = connection.getResponseCode(); + InputStream inputStream; + + if (response.responseCode >= 400) { + inputStream = connection.getErrorStream(); + } else { + inputStream = connection.getInputStream(); + } + + InputStreamReader inputStreamReader = new InputStreamReader(inputStream); + BufferedReader bufferedReader = new BufferedReader(inputStreamReader); + + String line; + + while ((line = bufferedReader.readLine()) != null) { + sb.append(line); + } + } catch (Exception e) { + error("Failed to read response. (%s)", e.getMessage()); + throw e; + } finally { + if (connection != null) { + connection.disconnect(); + } + } + + response.response = sb.toString(); + return response; + } + + private static String fingerprint(final Context context) { + if (context == null) { + return null; + } + + final PackageManager packageManager = context.getPackageManager(); + final String packageName = context.getPackageName(); + + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + final PackageInfo packageInfo = packageManager.getPackageInfo( + packageName, PackageManager.GET_SIGNING_CERTIFICATES); + if (packageInfo == null || packageInfo.signingInfo == null) { + return null; + } + if (packageInfo.signingInfo.hasMultipleSigners()){ + return signatureDigestList(packageInfo.signingInfo.getApkContentsSigners()); + } + else{ + return signatureDigestList(packageInfo.signingInfo.getSigningCertificateHistory()); + } + } + else { + @SuppressLint("PackageManagerGetSignatures") + final PackageInfo packageInfo = packageManager.getPackageInfo( + packageName, PackageManager.GET_SIGNATURES); + return signatureDigestList(packageInfo.signatures); + } + + } catch (PackageManager.NameNotFoundException e) { + return null; + } + } + + private static String signatureDigest(final Signature signature) { + if (signature == null) { + return null; + } + + try { + //return toHex( + //MessageDigest.getInstance("SHA1").digest(signature.toByteArray())); + final byte[] signatureByteArray = signature.toByteArray(); + final MessageDigest md = MessageDigest.getInstance("SHA1"); + final byte[] digest = md.digest(signatureByteArray); + final String hex = toHex(digest); + return hex.toLowerCase(); + //return BaseEncoding.base16().lowerCase().encode(digest); + } catch (final NoSuchAlgorithmException e) { + return null; + } + } + private static String signatureDigestList(final Signature[] sigList) { + for (final Signature signature: sigList) { + return signatureDigest(signature); + } + return null; + } + + public static String toHex(final byte[] bytes) { + return String.format("%0" + (bytes.length << 1) + "X", + new BigInteger(1, bytes)); + } + + // endregion +} diff --git a/Adjust/test-library/src/main/java/com/adjust/test/TestLibrary.java b/Adjust/test-library/src/main/java/com/adjust/test/TestLibrary.java index 5a85c0c81..e52dad324 100644 --- a/Adjust/test-library/src/main/java/com/adjust/test/TestLibrary.java +++ b/Adjust/test-library/src/main/java/com/adjust/test/TestLibrary.java @@ -1,5 +1,6 @@ package com.adjust.test; +import android.content.Context; import android.os.SystemClock; import com.adjust.test.ws.ControlWebSocketClient; @@ -24,7 +25,6 @@ import static com.adjust.test.Constants.WAIT_FOR_SLEEP; import static com.adjust.test.Utils.debug; import static com.adjust.test.Utils.error; -import static com.adjust.test.UtilsNetworking.sendPostI; /** @@ -32,8 +32,8 @@ */ public class TestLibrary { - static String baseUrl; - static String controlUrl; + private String controlUrl; + private Networking networking; private Gson gson = new Gson(); private BlockingQueue waitControlQueue; private ControlWebSocketClient controlClient; @@ -49,24 +49,24 @@ public class TestLibrary { private StringBuilder currentTestNames = new StringBuilder(); private boolean exitAfterEnd = true; - public TestLibrary(String baseUrl, String controlUrl, ICommandRawJsonListener commandRawJsonListener) { - this(baseUrl, controlUrl); + public TestLibrary(String baseUrl, String controlUrl, Context context, ICommandRawJsonListener commandRawJsonListener) { + this(baseUrl, controlUrl, context); this.commandRawJsonListener = commandRawJsonListener; } - public TestLibrary(String baseUrl, String controlUrl, ICommandJsonListener commandJsonListener) { - this(baseUrl, controlUrl); + public TestLibrary(String baseUrl, String controlUrl, Context context, ICommandJsonListener commandJsonListener) { + this(baseUrl, controlUrl, context); this.commandJsonListener = commandJsonListener; } - public TestLibrary(String baseUrl, String controlUrl, ICommandListener commandListener) { - this(baseUrl, controlUrl); + public TestLibrary(String baseUrl, String controlUrl, Context context, ICommandListener commandListener) { + this(baseUrl, controlUrl, context); this.commandListener = commandListener; } - private TestLibrary(String baseUrl, String controlUrl) { - this.baseUrl = baseUrl; + private TestLibrary(String baseUrl, String controlUrl, Context context) { this.controlUrl = controlUrl; + this.networking = new Networking(baseUrl, context); debug("> base url: \t%s", baseUrl); debug("> control url: \t%s", controlUrl); this.initializeWebSocket(controlUrl); @@ -115,7 +115,7 @@ public void startTestSession(final String clientSdk) { // reconnect web socket client if disconnected if (!this.controlClient.isOpen()) { debug("reconnecting web socket client ..."); - this.initializeWebSocket(controlUrl); + this.initializeWebSocket(this.controlUrl); // wait for WS to reconnect SystemClock.sleep(ONE_SECOND); } @@ -141,8 +141,7 @@ public void cancelTestAndGetNext() { executor.submit(new Runnable() { @Override public void run() { - UtilsNetworking.HttpResponse httpResponse = sendPostI(Utils.appendBasePath(currentBasePath, "/end_test_read_next")); - readResponseI(httpResponse); + readResponseI(networking.sendPost("/end_test_read_next", currentBasePath)); } }); } @@ -168,21 +167,24 @@ public void run() { } private void startTestSessionI(String clientSdk) { - UtilsNetworking.HttpResponse httpResponse = sendPostI("/init_session", clientSdk, currentTestNames.toString()); - this.testSessionId = httpResponse.headerFields.get(TEST_SESSION_ID_HEADER).get(0); + networking.clientSdk = clientSdk; + networking.testNames = currentTestNames.toString(); + Networking.Response response = networking.sendPost("/init_session"); + + this.testSessionId = response.headerFields.get(TEST_SESSION_ID_HEADER).get(0); // set test session ID on the web socket object in Test Server, so it can be uniquely identified this.controlClient.sendInitTestSessionSignal(this.testSessionId); debug("starting new test session with ID: " + this.testSessionId); - readResponseI(httpResponse); + readResponseI(response); } private void sendInfoToServerI(String basePath) { - UtilsNetworking.HttpResponse httpResponse = sendPostI(Utils.appendBasePath(basePath, "/test_info"), null, infoToServer); + Networking.Response response = networking.sendPost("/test_info", basePath, infoToServer); infoToServer = null; - readResponseI(httpResponse); + readResponseI(response); } - public void readResponseI(UtilsNetworking.HttpResponse httpResponse) { + public void readResponseI(Networking.Response httpResponse) { if (httpResponse == null) { debug("httpResponse is null"); return; @@ -298,8 +300,7 @@ private void resetTestI(Map> params) { } private void endTestReadNextI() { - UtilsNetworking.HttpResponse httpResponse = sendPostI(Utils.appendBasePath(currentBasePath, "/end_test_read_next")); - readResponseI(httpResponse); + readResponseI(networking.sendPost("/end_test_read_next", currentBasePath)); } private void endTestSessionI() { diff --git a/Adjust/test-library/src/main/java/com/adjust/test/Utils.java b/Adjust/test-library/src/main/java/com/adjust/test/Utils.java index 050697581..7cd004f49 100644 --- a/Adjust/test-library/src/main/java/com/adjust/test/Utils.java +++ b/Adjust/test-library/src/main/java/com/adjust/test/Utils.java @@ -1,18 +1,17 @@ package com.adjust.test; +import static com.adjust.test.Constants.LOGTAG; + import android.util.Log; import java.util.Arrays; import java.util.Locale; -import static com.adjust.test.Constants.LOGTAG; - /** * Created by nonelse on 11.03.17. */ public class Utils { - public static void debug(String message, Object... parameters) { try { Log.d(LOGTAG, String.format(Locale.US, message, parameters)); @@ -30,11 +29,4 @@ public static void error(String message, Object... parameters) { , message, Arrays.toString(parameters))); } } - - public static String appendBasePath(String basePath, String path) { - if (basePath == null) { - return path; - } - return basePath + path; - } } diff --git a/Adjust/test-library/src/main/java/com/adjust/test/UtilsNetworking.java b/Adjust/test-library/src/main/java/com/adjust/test/UtilsNetworking.java deleted file mode 100644 index ab622f9b9..000000000 --- a/Adjust/test-library/src/main/java/com/adjust/test/UtilsNetworking.java +++ /dev/null @@ -1,270 +0,0 @@ -package com.adjust.test; - -import java.io.BufferedReader; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.URL; -import java.net.URLEncoder; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSession; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; - -import static com.adjust.test.Constants.ONE_MINUTE; -import static com.adjust.test.Utils.debug; -import static com.adjust.test.Utils.error; - -/** - * Created by uerceg on 03/04/2017. - */ - -public class UtilsNetworking { - static ConnectionOptions connectionOptions; - static TrustManager[] trustAllCerts; - static HostnameVerifier hostnameVerifier; - - public static UtilsNetworking.HttpResponse sendPostI(String path) { - return sendPostI(path, null, null, null); - } - - public static UtilsNetworking.HttpResponse sendPostI(String path, String clientSdk) { - return sendPostI(path, clientSdk, null, null); - } - - public static UtilsNetworking.HttpResponse sendPostI(String path, String clientSdk, String testNames) { - return sendPostI(path, clientSdk, testNames, null); - } - - public static UtilsNetworking.HttpResponse sendPostI(String path, String clientSdk, Map postBody) { - return sendPostI(path, clientSdk, null, postBody); - } - - public static UtilsNetworking.HttpResponse sendPostI(String path, String clientSdk, String testNames, Map postBody) { - String targetURL = TestLibrary.baseUrl + path; - - try { - connectionOptions.clientSdk = clientSdk; - connectionOptions.testNames = testNames; - - HttpsURLConnection connection = createPOSTHttpsURLConnection( - targetURL, postBody, connectionOptions); - UtilsNetworking.HttpResponse httpResponse = readHttpResponse(connection); - debug("Response: %s", httpResponse.response); - - httpResponse.headerFields= connection.getHeaderFields(); - debug("Headers: %s", httpResponse.headerFields); - - return httpResponse; - } catch (IOException e) { - error(e.getMessage()); - } catch (Exception e) { - error(e.getMessage()); - } - return null; - } - - private static String getPostDataString(Map body) throws UnsupportedEncodingException { - StringBuilder result = new StringBuilder(); - - for (Map.Entry entry : body.entrySet()) { - String encodedName = URLEncoder.encode(entry.getKey(), Constants.ENCODING); - String value = entry.getValue(); - String encodedValue = value != null ? URLEncoder.encode(value, Constants.ENCODING) : ""; - - if (result.length() > 0) { - result.append("&"); - } - - result.append(encodedName); - result.append("="); - result.append(encodedValue); - } - - return result.toString(); - } - - static { - trustAllCerts = new TrustManager[]{ - new X509TrustManager() { - public java.security.cert.X509Certificate[] getAcceptedIssuers() { - debug("getAcceptedIssuers"); - - return null; - } - - public void checkClientTrusted( - java.security.cert.X509Certificate[] certs, String authType) { - debug("checkClientTrusted"); - } - - public void checkServerTrusted( - java.security.cert.X509Certificate[] certs, String authType) { - debug("checkServerTrusted"); - } - } - }; - hostnameVerifier = new HostnameVerifier() { - @Override - public boolean verify(String hostname, SSLSession session) { - return true; - } - }; - connectionOptions = new ConnectionOptions(); - } - - public static class HttpResponse { - public String response = null; - public Integer responseCode = null; - public Map> headerFields = null; - } - - public interface IConnectionOptions { - void applyConnectionOptions(HttpsURLConnection connection); - } - - static class ConnectionOptions implements IConnectionOptions { - public String clientSdk; - public String testNames; - - @Override - public void applyConnectionOptions(HttpsURLConnection connection) { - if (clientSdk != null) { - connection.setRequestProperty("Client-SDK", clientSdk); - } - if (testNames != null) { - connection.setRequestProperty("Test-Names", testNames); - } - //Inject local ip address for Jenkins script - connection.setRequestProperty("Local-Ip", getIPAddress(true)); - - connection.setConnectTimeout(ONE_MINUTE); - connection.setReadTimeout(ONE_MINUTE); - try { - SSLContext sc = SSLContext.getInstance("TLS"); - sc.init(null, trustAllCerts, new java.security.SecureRandom()); - connection.setSSLSocketFactory(sc.getSocketFactory()); - - connection.setHostnameVerifier(hostnameVerifier); - debug("applyConnectionOptions"); - } catch (Exception e) { - debug("applyConnectionOptions %s", e.getMessage()); - } - } - } - - static HttpsURLConnection createPOSTHttpsURLConnection(String urlString, - Map postBody, - IConnectionOptions connectionOptions) - throws IOException - { - DataOutputStream wr = null; - HttpsURLConnection connection = null; - - try { - debug("POST request: %s", urlString); - URL url = new URL(urlString); - connection = (HttpsURLConnection) url.openConnection(); - - connectionOptions.applyConnectionOptions(connection); - - connection.setRequestMethod("POST"); - connection.setUseCaches(false); - connection.setDoInput(true); - connection.setDoOutput(true); - - if (postBody != null && postBody.size() > 0) { - wr = new DataOutputStream(connection.getOutputStream()); - wr.writeBytes(getPostDataString(postBody)); - } - - return connection; - } catch (Exception e) { - throw e; - } finally { - try { - if (wr != null) { - wr.flush(); - wr.close(); - } - } catch (Exception e) { - } - } - } - - static HttpResponse readHttpResponse(HttpsURLConnection connection) throws Exception { - StringBuffer sb = new StringBuffer(); - HttpResponse httpResponse = new HttpResponse(); - - try { - connection.connect(); - - httpResponse.responseCode = connection.getResponseCode(); - InputStream inputStream; - - if (httpResponse.responseCode >= 400) { - inputStream = connection.getErrorStream(); - } else { - inputStream = connection.getInputStream(); - } - - InputStreamReader inputStreamReader = new InputStreamReader(inputStream); - BufferedReader bufferedReader = new BufferedReader(inputStreamReader); - - String line; - - while ((line = bufferedReader.readLine()) != null) { - sb.append(line); - } - } catch (Exception e) { - error("Failed to read response. (%s)", e.getMessage()); - throw e; - } finally { - if (connection != null) { - connection.disconnect(); - } - } - - httpResponse.response = sb.toString(); - return httpResponse; - } - - static String getIPAddress(boolean useIPv4) { - try { - List interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); - for (NetworkInterface intf : interfaces) { - List addrs = Collections.list(intf.getInetAddresses()); - for (InetAddress addr : addrs) { - if (!addr.isLoopbackAddress()) { - String sAddr = addr.getHostAddress(); - boolean isIPv4 = sAddr.indexOf(':') < 0; - - if (useIPv4) { - if (isIPv4) - return sAddr; - } else { - if (!isIPv4) { - int delim = sAddr.indexOf('%'); // drop ip6 zone suffix - return delim < 0 ? sAddr.toUpperCase() : sAddr.substring(0, delim).toUpperCase(); - } - } - } - } - } - } catch (Exception ex) { - error("Failed to read ip address (%s)", ex.getMessage()); - } - - return ""; - } -} From 6eb90377e6b91be57790303ea08c093c1c7f18cc Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 28 May 2024 11:57:51 +0200 Subject: [PATCH 205/540] feat: add control params in all request to BE --- .../java/com/adjust/sdk/PackageBuilder.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 2d0bcbcf2..2f7fedc88 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -303,6 +303,10 @@ private Map getSessionParameters() { // google play games PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -395,6 +399,10 @@ public Map getEventParameters(AdjustEvent event) { // google play games PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -448,6 +456,10 @@ private Map getInfoParameters(String source) { // google play games PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -557,6 +569,10 @@ private Map getClickParameters(String source) { // google play games PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -618,6 +634,10 @@ private Map getAttributionParameters(String initiatedBy) { // google play games PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -678,6 +698,10 @@ private Map getGdprParameters() { // google play games PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -751,6 +775,10 @@ private Map getGdprParameters() { // google play games PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -816,6 +844,10 @@ private Map getMeasurementConsentParameters( // google play games PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -998,6 +1030,10 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven // google play games PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -1094,6 +1130,10 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio // google play games PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -1180,6 +1220,10 @@ private Map getVerificationParameters(AdjustPurchase purchase) { // google play games PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); From 3a3a93bf67ce6afb1f2c4728519cc0242a9ffb14 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 29 May 2024 15:52:38 +0200 Subject: [PATCH 206/540] refac:clean up the Adjust.java and check the callback nullability as like as the other getters --- .../src/main/java/com/adjust/sdk/Adjust.java | 35 ++++++++++++++----- .../java/com/adjust/sdk/AdjustInstance.java | 20 ++++------- .../src/main/java/com/adjust/sdk/Util.java | 8 ++++- 3 files changed, 41 insertions(+), 22 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 7b53320bb..f4aaed7a2 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -316,13 +316,16 @@ public static void disablePlayStoreKidsApp(final Context context) { * @param context Application context * @param onDeviceIdRead Callback to get triggered once identifier is obtained */ - public static void getGoogleAdId(Context context, OnDeviceIdsRead onDeviceIdRead) { - Context appContext = null; - if (context != null) { - appContext = context.getApplicationContext(); + public static void getGoogleAdId(final Context context,final OnDeviceIdsRead onDeviceIdRead) { + if (onDeviceIdRead == null) { + AdjustFactory.getLogger().error("onDeviceIdRead cannot be null"); + return; } - - Util.getGoogleAdId(appContext, onDeviceIdRead); + if (context == null) { + AdjustFactory.getLogger().error("null context"); + return; + } + Util.getGoogleAdId(context.getApplicationContext(), onDeviceIdRead); } /** @@ -382,7 +385,15 @@ public static void getAttribution(final OnAttributionReadListener attributionRea * @param context Application context * @param onGooglePlayInstallReferrerReadListener Callback to obtain install referrer. */ - public static void getGooglePlayInstallReferrer(Context context, OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { + public static void getGooglePlayInstallReferrer(final Context context, final OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { + if (onGooglePlayInstallReferrerReadListener == null) { + AdjustFactory.getLogger().error("onGooglePlayInstallReferrerReadListener cannot be null"); + return; + } + if (context == null) { + AdjustFactory.getLogger().error("null context"); + return; + } AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.getGooglePlayInstallReferrer(context ,onGooglePlayInstallReferrerReadListener); } @@ -416,7 +427,15 @@ public static void getSdkVersion(final OnSdkVersionReadListener onSdkVersionRead * @param purchase AdjustPurchase object to be tracked * @param callback Callback to obtain verification results */ - public static void verifyPurchase(final AdjustPurchase purchase, OnPurchaseVerificationFinishedListener callback) { + public static void verifyPurchase(final AdjustPurchase purchase, final OnPurchaseVerificationFinishedListener callback) { + if (callback == null) { + AdjustFactory.getLogger().error("callback cannot be null"); + return; + } + if (purchase == null) { + AdjustFactory.getLogger().error("purchase cannot be null"); + return; + } AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.verifyPurchase(purchase, callback); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 0192ee184..d5e27de2d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -558,7 +558,7 @@ public void getAttribution(OnAttributionReadListener attributionReadListener) { * * @param onSdkVersionReadListener Callback to get triggered once SDK version is obtained. */ - public void getSdkVersion(OnSdkVersionReadListener onSdkVersionReadListener) { + public void getSdkVersion(final OnSdkVersionReadListener onSdkVersionReadListener) { new AsyncTaskExecutor() { @Override protected String doInBackground(Void... voids) { @@ -579,10 +579,6 @@ protected void onPostExecute(String sdkVersion) { * @param onGooglePlayInstallReferrerReadListener Callback to obtain install referrer. */ public void getGooglePlayInstallReferrer(final Context context, final OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { - if (onGooglePlayInstallReferrerReadListener == null) { - AdjustFactory.getLogger().error("OnGooglePlayInstallReferrerReadListener can not be null"); - return; - } InstallReferrer installReferrer = new InstallReferrer(context, new InstallReferrerReadListener() { @Override public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referrerApi) { @@ -756,15 +752,13 @@ private boolean isInstanceEnabled() { * @param purchase AdjustPurchase object to be verified * @param callback Callback to be pinged with the verification results */ - public void verifyPurchase(AdjustPurchase purchase, OnPurchaseVerificationFinishedListener callback) { + public void verifyPurchase(final AdjustPurchase purchase, final OnPurchaseVerificationFinishedListener callback) { if (!checkActivityHandler("verifyPurchase")) { - if (callback != null) { - AdjustPurchaseVerificationResult result = new AdjustPurchaseVerificationResult( - "not_verified", - 100, - "SDK needs to be initialized before making purchase verification request"); - callback.onVerificationFinished(result); - } + AdjustPurchaseVerificationResult result = new AdjustPurchaseVerificationResult( + "not_verified", + 100, + "SDK needs to be initialized before making purchase verification request"); + callback.onVerificationFinished(result); return; } activityHandler.verifyPurchase(purchase, callback); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index 8ba6a4ccc..86f49232c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -152,7 +152,13 @@ private static R runSyncInPlayAdIdSchedulerWithTimeout(final Context context return null; } - public static void getGoogleAdId(Context context, final OnDeviceIdsRead onDeviceIdRead) { + /** + * Called to get value of Google Play Advertising Identifier. + * + * @param context Application context + * @param onDeviceIdRead Callback to get triggered once identifier is obtained + */ + public static void getGoogleAdId(final Context context, final OnDeviceIdsRead onDeviceIdRead) { new AsyncTaskExecutor() { @Override protected String doInBackground(Context... params) { From cfa8e98813f0b777987225ced71bea99ac71eb27 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 30 May 2024 10:44:07 +0200 Subject: [PATCH 207/540] refac:refactor setOfflineMode to switchToOfflineMode and switchBackToOnlineMode --- .../main/assets/AdjustExample-FbPixel.html | 4 ++-- .../adjust/examples/GlobalApplication.java | 2 +- .../com/adjust/examples/MainActivity.java | 8 ++----- .../examples/keyboard/GlobalApplication.java | 2 +- .../com/adjust/examples/GlobalApplication.kt | 2 +- .../java/com/adjust/examples/MainActivity.kt | 4 ++-- .../adjust/examples/GlobalApplication.java | 2 +- .../com/adjust/examples/MainActivity.java | 4 ++-- .../main/assets/AdjustExample-WebView.html | 4 ++-- .../src/main/java/com/adjust/sdk/Adjust.java | 15 ++++++++---- .../java/com/adjust/sdk/AdjustInstance.java | 23 +++++++++++++------ .../src/main/assets/adjust.js | 10 ++++++-- .../sdk/webbridge/AdjustBridgeInstance.java | 14 +++++++---- .../adjust/testapp/AdjustCommandExecutor.java | 8 ++++--- .../src/main/assets/command_executor.js | 6 ++++- 15 files changed, 68 insertions(+), 40 deletions(-) diff --git a/Adjust/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html b/Adjust/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html index 25ee126d7..d9456d4ef 100755 --- a/Adjust/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html +++ b/Adjust/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html @@ -87,13 +87,13 @@

Adjust Facebook Pixel Dem var btnEnableOfflineMode = document.getElementById('btnEnableOfflineMode') btnEnableOfflineMode.onclick = function(e) { e.preventDefault(); - Adjust.setOfflineMode(true); + Adjust.switchToOfflineMode(); } var btnDisableOfflineMode = document.getElementById('btnDisableOfflineMode') btnDisableOfflineMode.onclick = function(e) { e.preventDefault(); - Adjust.setOfflineMode(false); + Adjust.switchToOnlineMode(); } var btnEnableSdk = document.getElementById('btnEnableSdk') diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 78c0845ec..3fb2a4879 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -195,7 +195,7 @@ public void onFail(String message) { }); // Put the SDK in offline mode. - // Adjust.setOfflineMode(true); + // Adjust.switchToOfflineMode(); // Disable the SDK // Adjust.setEnabled(false); diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java index eb7e5b276..10f881a7c 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java @@ -6,7 +6,6 @@ import androidx.appcompat.app.AppCompatActivity; -import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -15,10 +14,7 @@ import com.adjust.sdk.Adjust; import com.adjust.sdk.AdjustEvent; -import com.adjust.sdk.AdjustPurchase; -import com.adjust.sdk.AdjustPurchaseVerificationResult; import com.adjust.sdk.OnIsEnabledListener; -import com.adjust.sdk.OnPurchaseVerificationFinishedListener; public class MainActivity extends AppCompatActivity { private static final String EVENT_TOKEN_SIMPLE = "g3mfiw"; @@ -115,10 +111,10 @@ public void onTrackPartnerEventClick(View v) { public void onEnableDisableOfflineModeClick(View v) { if (((Button) v).getText().equals( getApplicationContext().getResources().getString(R.string.txt_enable_offline_mode))) { - Adjust.setOfflineMode(true); + Adjust.switchToOfflineMode(); ((Button) v).setText(R.string.txt_disable_offline_mode); } else { - Adjust.setOfflineMode(false); + Adjust.switchBackToOnlineMode(); ((Button) v).setText(R.string.txt_enable_offline_mode); } } diff --git a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java index 37b46609b..29590a538 100644 --- a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java +++ b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java @@ -141,7 +141,7 @@ public boolean launchReceivedDeeplink(Uri deeplink) { registerActivityLifecycleCallbacks(new AdjustLifecycleCallbacks()); // Put the SDK in offline mode. - // Adjust.setOfflineMode(true); + // Adjust.switchToOfflineMode(); // Disable the SDK // Adjust.setEnabled(false); diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt index e26d1f522..232fc9334 100644 --- a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt +++ b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt @@ -110,7 +110,7 @@ class GlobalApplication : Application() { registerActivityLifecycleCallbacks(AdjustLifecycleCallbacks()) // Put the SDK in offline mode. - // Adjust.setOfflineMode(true); + // Adjust.switchToOfflineMode(); // Disable the SDK // Adjust.setEnabled(false); diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt index 0ce510043..2aa17de04 100644 --- a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt +++ b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt @@ -97,10 +97,10 @@ class MainActivity : AppCompatActivity() { fun onEnableDisableOfflineModeClick(v: View) { if ((v as Button).text == applicationContext.resources.getString(R.string.txt_enable_offline_mode)) { - Adjust.setOfflineMode(true) + Adjust.switchToOfflineMode() v.setText(R.string.txt_disable_offline_mode) } else { - Adjust.setOfflineMode(false) + Adjust.switchBackToOnlineMode() v.setText(R.string.txt_enable_offline_mode) } } diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java index 0778692cf..7d50a689c 100755 --- a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java @@ -128,7 +128,7 @@ public boolean launchReceivedDeeplink(Uri deeplink) { registerActivityLifecycleCallbacks(new AdjustLifecycleCallbacks()); // Put the SDK in offline mode. - // Adjust.setOfflineMode(true); + // Adjust.switchToOfflineMode(); // Disable the SDK // Adjust.setEnabled(false); diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java b/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java index 8deb57a4c..a05955ab1 100755 --- a/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java +++ b/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java @@ -87,10 +87,10 @@ public void onTrackPartnerEventClick(View v) { public void onEnableDisableOfflineModeClick(View v) { if (((Button) v).getText().equals( getApplicationContext().getResources().getString(R.string.txt_enable_offline_mode))) { - Adjust.setOfflineMode(true); + Adjust.switchToOfflineMode(); ((Button) v).setText(R.string.txt_disable_offline_mode); } else { - Adjust.setOfflineMode(false); + Adjust.switchBackToOnlineMode(); ((Button) v).setText(R.string.txt_enable_offline_mode); } } diff --git a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html index 823d6f169..626f9fc61 100755 --- a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html +++ b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html @@ -114,13 +114,13 @@

Adjust Web View SDK Demo var btnEnableOfflineMode = document.getElementById('btnEnableOfflineMode') btnEnableOfflineMode.onclick = function(e) { e.preventDefault(); - Adjust.setOfflineMode(true); + Adjust.switchToOfflineMode(); } var btnDisableOfflineMode = document.getElementById('btnDisableOfflineMode') btnDisableOfflineMode.onclick = function(e) { e.preventDefault(); - Adjust.setOfflineMode(false); + Adjust.switchToOnlineMode(); } var btnEnableSdk = document.getElementById('btnEnableSdk') diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index f4aaed7a2..cc65b6a91 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -150,13 +150,20 @@ public static void setReferrer(String referrer, Context context) { } /** - * Called to set SDK to offline or online mode. + * Called to set SDK to offline mode. * - * @param enabled boolean indicating should SDK be in offline mode (true) or not (false) */ - public static void setOfflineMode(boolean enabled) { + public static void switchToOfflineMode() { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.setOfflineMode(enabled); + adjustInstance.switchToOfflineMode(); + } + /** + * Called to set SDK to online mode. + * + */ + public static void switchBackToOnlineMode() { + AdjustInstance adjustInstance = Adjust.getDefaultInstance(); + adjustInstance.switchBackToOnlineMode(); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index d5e27de2d..a8fb5e74a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -2,8 +2,6 @@ import android.net.Uri; import android.content.Context; -import android.os.Handler; -import android.os.Looper; import com.adjust.sdk.scheduler.AsyncTaskExecutor; @@ -276,13 +274,24 @@ public void sendPreinstallReferrer(final String referrer, final Context context) /** * Called to set SDK to offline or online mode. * - * @param enabled boolean indicating should SDK be in offline mode (true) or not (false) */ - public void setOfflineMode(final boolean enabled) { - if (!checkActivityHandler(enabled, "offline mode", "online mode")) { - this.startOffline = enabled; + public void switchToOfflineMode() { + if (!checkActivityHandler(true, "offline mode", "online mode")) { + this.startOffline = true; } else { - activityHandler.setOfflineMode(enabled); + activityHandler.setOfflineMode(true); + } + } + + /** + * Called to set SDK to online or online mode. + * + */ + public void switchBackToOnlineMode() { + if (!checkActivityHandler(false, "offline mode", "online mode")) { + this.startOffline = false; + } else { + activityHandler.setOfflineMode(false); } } diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index 7a4084d39..5ef9a77df 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -69,9 +69,15 @@ var Adjust = { } }, - setOfflineMode: function(isOffline) { + switchToOfflineMode: function() { if (AdjustBridge) { - AdjustBridge.setOfflineMode(isOffline); + AdjustBridge.switchToOfflineMode(); + } + }, + + switchBackToOnlineMode: function() { + if (AdjustBridge) { + AdjustBridge.switchBackToOnlineMode(); } }, diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 0814dabe1..26ac8dd1c 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -30,7 +30,6 @@ import com.adjust.sdk.OnEventTrackingSucceededListener; import com.adjust.sdk.OnSdkVersionReadListener; import com.adjust.sdk.OnIsEnabledListener; -import com.adjust.sdk.OnSdkVersionReadListener; import com.adjust.sdk.OnSessionTrackingFailedListener; import com.adjust.sdk.OnSessionTrackingSucceededListener; @@ -495,14 +494,19 @@ public void setReferrer(String referrer) { } @JavascriptInterface - public void setOfflineMode(String isOfflineString) { + public void switchToOfflineMode() { if (!isInitialized()) { return; } - Boolean isOffline = AdjustBridgeUtil.fieldToBoolean(isOfflineString); - if (isOffline != null) { - Adjust.setOfflineMode(isOffline); + Adjust.switchToOfflineMode(); + } + + @JavascriptInterface + public void switchBackToOnlineMode() { + if (!isInitialized()) { + return; } + Adjust.switchBackToOnlineMode(); } @JavascriptInterface diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index f17c9af3d..27f1b4870 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -2,7 +2,6 @@ import static com.adjust.testapp.MainActivity.baseUrl; import static com.adjust.testapp.MainActivity.gdprUrl; -import static com.adjust.testapp.MainActivity.testLibrary; import android.content.Context; import android.net.Uri; @@ -27,7 +26,6 @@ import com.adjust.sdk.AdjustThirdPartySharing; import com.adjust.sdk.LogLevel; import com.adjust.sdk.OnAttributionChangedListener; -import com.adjust.sdk.OnAttributionReadListener; import com.adjust.sdk.OnDeeplinkResolvedListener; import com.adjust.sdk.OnDeeplinkResponseListener; import com.adjust.sdk.OnEventTrackingFailedListener; @@ -566,7 +564,11 @@ private void setEnabled() { private void setOfflineMode() { Boolean enabled = Boolean.valueOf(command.getFirstParameterValue("enabled")); - Adjust.setOfflineMode(enabled); + if (enabled) { + Adjust.switchToOfflineMode(); + }else { + Adjust.switchBackToOnlineMode(); + } } private void addGlobalCallbackParameter() { diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index f1faf7385..dd2fe1068 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -510,7 +510,11 @@ AdjustCommandExecutor.prototype.setEnabled = function(params) { AdjustCommandExecutor.prototype.setOfflineMode = function(params) { var enabled = getFirstParameterValue(params, "enabled") == 'true'; - Adjust.setOfflineMode(enabled); + if (enabled){ + Adjust.switchToOfflineMode() + }else{ + Adjust.switchBackToOnlineMode() + } }; AdjustCommandExecutor.prototype.gdprForgetMe = function(params) { From 0691cce2e8275a35758d53fe151ac234a60b4484 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 30 May 2024 11:11:00 +0200 Subject: [PATCH 208/540] refac:rename onCreate to initSdk --- .../src/main/java/com/adjust/examples/GlobalApplication.java | 2 +- .../java/com/adjust/examples/keyboard/GlobalApplication.java | 2 +- .../src/main/java/com/adjust/examples/GlobalApplication.kt | 2 +- .../src/main/java/com/adjust/examples/GlobalApplication.java | 2 +- .../src/main/assets/AdjustExample-WebView.html | 4 ++-- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 4 ++-- .../sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java | 2 +- Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js | 4 ++-- .../java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 4 ++-- .../main/java/com/adjust/testapp/AdjustCommandExecutor.java | 2 +- Adjust/test-app-webbridge/src/main/assets/command_executor.js | 2 +- 11 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 3fb2a4879..ebe1f85b0 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -143,7 +143,7 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // AdjustOaid.readOaid(); // Initialise the adjust SDK. - Adjust.onCreate(config); + Adjust.initSdk(config); diff --git a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java index 29590a538..d95ddf3e9 100644 --- a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java +++ b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java @@ -134,7 +134,7 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // AdjustOaid.readOaid(); // Initialise the adjust SDK. - Adjust.onCreate(config); + Adjust.initSdk(config); // Register onResume and onPause events of all activities // for applications with minSdkVersion >= 14. diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt index 232fc9334..c920a8d8b 100644 --- a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt +++ b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt @@ -103,7 +103,7 @@ class GlobalApplication : Application() { // AdjustOaid.readOaid() // Initialise the adjust SDK. - Adjust.onCreate(config) + Adjust.initSdk(config) // Register onResume and onPause events of all activities // for applications with minSdkVersion >= 14. diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java index 7d50a689c..bdeeba078 100755 --- a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java @@ -121,7 +121,7 @@ public boolean launchReceivedDeeplink(Uri deeplink) { Adjust.removeGlobalPartnerParameters(); // Initialise the adjust SDK. - Adjust.onCreate(config); + Adjust.initSdk(config); // Register onResume and onPause events of all activities // for applications with minSdkVersion >= 14. diff --git a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html index 626f9fc61..73ddfbdd0 100755 --- a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html +++ b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html @@ -72,7 +72,7 @@

Adjust Web View SDK Demo adjustConfig.setSessionFailureCallback(sessionFailureCallback); adjustConfig.setDeferredDeeplinkCallback(deferredDeeplinkCallback); - Adjust.onCreate(adjustConfig); + Adjust.initSdk(adjustConfig); window.onload = function() { var btnTrackSimpleEvent = document.getElementById('btnTrackSimpleEvent') @@ -120,7 +120,7 @@

Adjust Web View SDK Demo var btnDisableOfflineMode = document.getElementById('btnDisableOfflineMode') btnDisableOfflineMode.onclick = function(e) { e.preventDefault(); - Adjust.switchToOnlineMode(); + Adjust.switchBackToOnlineMode(); } var btnEnableSdk = document.getElementById('btnEnableSdk') diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index cc65b6a91..49b30ef60 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -45,9 +45,9 @@ public static synchronized AdjustInstance getDefaultInstance() { * * @param adjustConfig AdjustConfig object used for SDK initialisation */ - public static void onCreate(AdjustConfig adjustConfig) { + public static void initSdk(AdjustConfig adjustConfig) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.onCreate(adjustConfig); + adjustInstance.initSdk(adjustConfig); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index a8fb5e74a..743bf8f25 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -78,7 +78,7 @@ public PreLaunchActions() { * * @param adjustConfig AdjustConfig object used for SDK initialisation */ - public void onCreate(final AdjustConfig adjustConfig) { + public void initSdk(final AdjustConfig adjustConfig) { if (adjustConfig == null) { AdjustFactory.getLogger().error("AdjustConfig missing"); return; diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index 5ef9a77df..bf33fdae8 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -1,11 +1,11 @@ var Adjust = { - onCreate: function (adjustConfig) { + initSdk: function (adjustConfig) { if (adjustConfig && !adjustConfig.getSdkPrefix()) { adjustConfig.setSdkPrefix(this.getSdkPrefix()); } this.adjustConfig = adjustConfig; if (AdjustBridge) { - AdjustBridge.onCreate(JSON.stringify(adjustConfig)); + AdjustBridge.initSdk(JSON.stringify(adjustConfig)); } }, diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 26ac8dd1c..18df25c05 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -129,7 +129,7 @@ public void registerFacebookSDKJSInterface() { } @JavascriptInterface - public void onCreate(String adjustConfigString) { + public void initSdk(String adjustConfigString) { // Initialise SDK only if it's not already initialised. if (isInitialized) { AdjustBridgeUtil.getLogger().warn("Adjust bridge is already initialized. Ignoring further attempts"); @@ -362,7 +362,7 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Manually call onResume() because web view initialisation will happen a bit delayed. // With this delay, it will miss lifecycle callback onResume() initial firing. - Adjust.onCreate(adjustConfig); + Adjust.initSdk(adjustConfig); Adjust.onResume(); isInitialized = true; diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 27f1b4870..7230a40bf 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -462,7 +462,7 @@ private void start() { AdjustConfig adjustConfig = savedConfigs.get(configNumber); //adjustConfig.setBasePath(basePath); - Adjust.onCreate(adjustConfig); + Adjust.initSdk(adjustConfig); this.savedConfigs.remove(0); } diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index dd2fe1068..59683f81d 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -409,7 +409,7 @@ AdjustCommandExecutor.prototype.start = function(params) { } var adjustConfig = this.savedConfigs[configNumber]; - Adjust.onCreate(adjustConfig); + Adjust.initSdk(adjustConfig); delete this.savedConfigs[0]; }; From 9e97ee2fc75785139b804e71b919d28e9dcd9fde Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 30 May 2024 11:22:53 +0200 Subject: [PATCH 209/540] refac:Refactor Adjust.setEnabled(boolean) to Adjust.disable() and Adjust.enable() --- .../main/assets/AdjustExample-FbPixel.html | 4 ++-- .../adjust/examples/GlobalApplication.java | 2 +- .../com/adjust/examples/MainActivity.java | 4 ++-- .../com/adjust/examples/ServiceExample.java | 4 ++-- .../examples/keyboard/GlobalApplication.java | 2 +- .../com/adjust/examples/GlobalApplication.kt | 2 +- .../java/com/adjust/examples/MainActivity.kt | 4 ++-- .../com/adjust/examples/ServiceExample.kt | 4 ++-- .../adjust/examples/GlobalApplication.java | 2 +- .../com/adjust/examples/MainActivity.java | 4 ++-- .../main/assets/AdjustExample-WebView.html | 4 ++-- .../src/main/java/com/adjust/sdk/Adjust.java | 15 +++++++++---- .../java/com/adjust/sdk/AdjustInstance.java | 21 +++++++++++++------ .../src/main/assets/adjust.js | 10 +++++++-- .../sdk/webbridge/AdjustBridgeInstance.java | 13 ++++++++---- .../adjust/testapp/AdjustCommandExecutor.java | 6 +++++- .../src/main/assets/command_executor.js | 6 +++++- 17 files changed, 71 insertions(+), 36 deletions(-) diff --git a/Adjust/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html b/Adjust/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html index d9456d4ef..8d694f936 100755 --- a/Adjust/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html +++ b/Adjust/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html @@ -99,13 +99,13 @@

Adjust Facebook Pixel Dem var btnEnableSdk = document.getElementById('btnEnableSdk') btnEnableSdk.onclick = function(e) { e.preventDefault() - Adjust.setEnabled(true) + Adjust.enable() } var btnDisableSdk = document.getElementById('btnDisableSdk') btnDisableSdk.onclick = function(e) { e.preventDefault(); - Adjust.setEnabled(false); + Adjust.disable(); } var btnIsSdkEnabled = document.getElementById('btnIsSdkEnabled') diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index ebe1f85b0..7c94a43bd 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -198,7 +198,7 @@ public void onFail(String message) { // Adjust.switchToOfflineMode(); // Disable the SDK - // Adjust.setEnabled(false); + // Adjust.disable(); // Send push notification token. // Adjust.setPushToken("token"); diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java index 10f881a7c..d41d0c41f 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java @@ -124,10 +124,10 @@ public void onEnableDisableSDKClick(View v) { @Override public void onIsEnabledRead(boolean isEnabled) { if (isEnabled) { - Adjust.setEnabled(false); + Adjust.disable(); ((Button) v).setText(R.string.txt_enable_sdk); } else { - Adjust.setEnabled(true); + Adjust.enable(); ((Button) v).setText(R.string.txt_disable_sdk); } } diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/ServiceExample.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/ServiceExample.java index 4dfad7ded..6df8a69ed 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/ServiceExample.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/ServiceExample.java @@ -42,10 +42,10 @@ public int onStartCommand(Intent intent, int flags, int startId) { Log.d("example", "ServiceExample onStartCommand"); if (flip) { - Adjust.setEnabled(false); + Adjust.disable(); flip = false; } else { - Adjust.setEnabled(true); + Adjust.enable(); flip = true; } diff --git a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java index d95ddf3e9..215e64d07 100644 --- a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java +++ b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java @@ -144,7 +144,7 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Adjust.switchToOfflineMode(); // Disable the SDK - // Adjust.setEnabled(false); + // Adjust.disable(); // Send push notification token. // Adjust.setPushToken("token"); diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt index c920a8d8b..624fec504 100644 --- a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt +++ b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt @@ -113,7 +113,7 @@ class GlobalApplication : Application() { // Adjust.switchToOfflineMode(); // Disable the SDK - // Adjust.setEnabled(false); + // Adjust.disable(); // Send push notification token. // Adjust.setPushToken("token"); diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt index 2aa17de04..c6d44bf04 100644 --- a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt +++ b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt @@ -108,10 +108,10 @@ class MainActivity : AppCompatActivity() { fun onEnableDisableSDKClick(v: View) { Adjust.isEnabled(this, OnIsEnabledListener { if (it) { - Adjust.setEnabled(false) + Adjust.disable() (v as Button).setText(R.string.txt_enable_sdk) } else { - Adjust.setEnabled(true) + Adjust.enable() (v as Button).setText(R.string.txt_disable_sdk) } }) diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/ServiceExample.kt b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/ServiceExample.kt index b5dea7831..2b661b707 100644 --- a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/ServiceExample.kt +++ b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/ServiceExample.kt @@ -31,10 +31,10 @@ class ServiceExample : Service() { Log.d("example", "ServiceExample onStartCommand") if (flip) { - Adjust.setEnabled(false) + Adjust.disable() flip = false } else { - Adjust.setEnabled(true) + Adjust.enable() flip = true } diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java index bdeeba078..03d739ad9 100755 --- a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java @@ -131,7 +131,7 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Adjust.switchToOfflineMode(); // Disable the SDK - // Adjust.setEnabled(false); + // Adjust.disable(); // Send push notification token. // Adjust.setPushToken("token"); diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java b/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java index a05955ab1..15a990207 100755 --- a/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java +++ b/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java @@ -100,10 +100,10 @@ public void onEnableDisableSDKClick(View v) { @Override public void onIsEnabledRead(boolean isEnabled) { if (isEnabled) { - Adjust.setEnabled(false); + Adjust.disable(); ((Button) v).setText(R.string.txt_enable_sdk); } else { - Adjust.setEnabled(true); + Adjust.enable(); ((Button) v).setText(R.string.txt_disable_sdk); } } diff --git a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html index 73ddfbdd0..ca50acab6 100755 --- a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html +++ b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html @@ -126,13 +126,13 @@

Adjust Web View SDK Demo var btnEnableSdk = document.getElementById('btnEnableSdk') btnEnableSdk.onclick = function(e) { e.preventDefault() - Adjust.setEnabled(true) + Adjust.enable(); } var btnDisableSdk = document.getElementById('btnDisableSdk') btnDisableSdk.onclick = function(e) { e.preventDefault(); - Adjust.setEnabled(false); + Adjust.disable(); } var btnIsSdkEnabled = document.getElementById('btnIsSdkEnabled') diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 49b30ef60..2d7750567 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -77,13 +77,20 @@ public static void onPause() { } /** - * Called to disable/enable SDK. + * Called to enable SDK. * - * @param enabled boolean indicating whether SDK should be enabled or disabled */ - public static void setEnabled(boolean enabled) { + public static void enable() { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.setEnabled(enabled); + adjustInstance.enable(); + } + /** + * Called to disable SDK. + * + */ + public static void disable() { + AdjustInstance adjustInstance = Adjust.getDefaultInstance(); + adjustInstance.disable(); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 743bf8f25..f0193db0c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -141,14 +141,23 @@ public void onPause() { } /** - * Called to disable/enable SDK. + * Called to enable SDK. * - * @param enabled boolean indicating whether SDK should be enabled or disabled */ - public void setEnabled(final boolean enabled) { - this.startEnabled = enabled; - if (checkActivityHandler(enabled, "enabled mode", "disabled mode")) { - activityHandler.setEnabled(enabled); + public void enable() { + this.startEnabled = true; + if (checkActivityHandler(true, "enabled mode", "disabled mode")) { + activityHandler.setEnabled(true); + } + } + /** + * Called to disable SDK. + * + */ + public void disable() { + this.startEnabled = false; + if (checkActivityHandler(false, "enabled mode", "disabled mode")) { + activityHandler.setEnabled(false); } } diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index bf33fdae8..b38737c74 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -31,9 +31,15 @@ var Adjust = { } }, - setEnabled: function (enabled) { + enable: function () { if (AdjustBridge) { - AdjustBridge.setEnabled(enabled); + AdjustBridge.enable(); + } + }, + + disable: function () { + if (AdjustBridge) { + AdjustBridge.disable(); } }, diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 18df25c05..1246316b2 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -462,14 +462,19 @@ public void onPause() { } @JavascriptInterface - public void setEnabled(String isEnabledString) { + public void enable() { if (!isInitialized()) { return; } - Boolean isEnabled = AdjustBridgeUtil.fieldToBoolean(isEnabledString); - if (isEnabled != null) { - Adjust.setEnabled(isEnabled); + Adjust.enable(); + } + + @JavascriptInterface + public void disable() { + if (!isInitialized()) { + return; } + Adjust.disable(); } @JavascriptInterface diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 7230a40bf..fbc8cde77 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -559,7 +559,11 @@ private void resume() { private void setEnabled() { Boolean enabled = Boolean.valueOf(command.getFirstParameterValue("enabled")); - Adjust.setEnabled(enabled); + if (enabled){ + Adjust.enable(); + }else { + Adjust.disable(); + } } private void setOfflineMode() { diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index 59683f81d..66a823d00 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -505,7 +505,11 @@ AdjustCommandExecutor.prototype.resume = function(params) { AdjustCommandExecutor.prototype.setEnabled = function(params) { var enabled = getFirstParameterValue(params, "enabled") == 'true'; - Adjust.setEnabled(enabled); + if(enabled){ + Adjust.enable(); + }else{ + Adjust.disable(); + } }; AdjustCommandExecutor.prototype.setOfflineMode = function(params) { From 98459d55f5434b79bd26226efc4d61f223b1a029 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 30 May 2024 11:55:44 +0200 Subject: [PATCH 210/540] refac:tuning the log if the callback is null in verifyPurchase --- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 2d7750567..a0995767e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -443,11 +443,7 @@ public static void getSdkVersion(final OnSdkVersionReadListener onSdkVersionRead */ public static void verifyPurchase(final AdjustPurchase purchase, final OnPurchaseVerificationFinishedListener callback) { if (callback == null) { - AdjustFactory.getLogger().error("callback cannot be null"); - return; - } - if (purchase == null) { - AdjustFactory.getLogger().error("purchase cannot be null"); + AdjustFactory.getLogger().error("Purchase verification aborted because verification callback is null"); return; } AdjustInstance adjustInstance = Adjust.getDefaultInstance(); From 87ece21a1e91dbb0b4464721f0de051c335de959 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 30 May 2024 11:57:18 +0200 Subject: [PATCH 211/540] fix: switchBackToOnlineMode in AdjustExample-FbPixel.html --- .../src/main/assets/AdjustExample-FbPixel.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html b/Adjust/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html index 8d694f936..a49547f07 100755 --- a/Adjust/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html +++ b/Adjust/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html @@ -93,7 +93,7 @@

Adjust Facebook Pixel Dem var btnDisableOfflineMode = document.getElementById('btnDisableOfflineMode') btnDisableOfflineMode.onclick = function(e) { e.preventDefault(); - Adjust.switchToOnlineMode(); + Adjust.switchBackToOnlineMode(); } var btnEnableSdk = document.getElementById('btnEnableSdk') From c95c50f3c50c0800aed89e4a3b3ef1a6c3dbb5be Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 28 May 2024 13:41:02 +0200 Subject: [PATCH 212/540] refac:refactor setUrlStrategy and dataResidency remove UrlStrategy Constants remove DataResidency Constants rename URL_CHINA to URL_WORLD --- .../adjust/examples/GlobalApplication.java | 10 + .../main/assets/AdjustExample-WebView.html | 2 + .../java/com/adjust/sdk/ActivityHandler.java | 14 +- .../java/com/adjust/sdk/AdjustConfig.java | 36 ++-- .../main/java/com/adjust/sdk/Constants.java | 5 + .../sdk/network/ActivityPackageSender.java | 7 +- .../com/adjust/sdk/network/UrlStrategy.java | 190 +++++++----------- .../src/main/assets/adjust_config.js | 9 + .../sdk/webbridge/AdjustBridgeInstance.java | 17 ++ 9 files changed, 149 insertions(+), 141 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 7c94a43bd..852fa8cf5 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -26,6 +26,9 @@ import com.adjust.sdk.OnSessionTrackingFailedListener; import com.adjust.sdk.OnSessionTrackingSucceededListener; +import java.util.ArrayList; +import java.util.List; + /** * Created by pfms on 17/12/14. */ @@ -62,6 +65,13 @@ public void onFinishedEventTrackingSucceeded(AdjustEventSuccess eventSuccessResp } }); + List urlStrategy = new ArrayList<>(); + urlStrategy.add("adjust.com"); + urlStrategy.add("adjust.cn"); + urlStrategy.add("eu.adjust.com"); + + config.setUrlStrategy(urlStrategy , false, false); + // Set event failure tracking delegate. config.setOnEventTrackingFailedListener(new OnEventTrackingFailedListener() { @Override diff --git a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html index ca50acab6..bca5cfab1 100755 --- a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html +++ b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html @@ -72,6 +72,8 @@

Adjust Web View SDK Demo adjustConfig.setSessionFailureCallback(sessionFailureCallback); adjustConfig.setDeferredDeeplinkCallback(deferredDeeplinkCallback); + + Adjust.initSdk(adjustConfig); window.onload = function() { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 8f31adc89..5b9d4ecc4 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -952,6 +952,7 @@ public void run() { IActivityPackageSender packageHandlerActivitySender = new ActivityPackageSender( adjustConfig.urlStrategy, + adjustConfig.useSubdomains, adjustConfig.basePath, adjustConfig.gdprPath, adjustConfig.subscriptionPath, @@ -967,6 +968,7 @@ public void run() { IActivityPackageSender attributionHandlerActivitySender = new ActivityPackageSender( adjustConfig.urlStrategy, + adjustConfig.useSubdomains, adjustConfig.basePath, adjustConfig.gdprPath, adjustConfig.subscriptionPath, @@ -982,6 +984,7 @@ public void run() { IActivityPackageSender sdkClickHandlerActivitySender = new ActivityPackageSender( adjustConfig.urlStrategy, + adjustConfig.useSubdomains, adjustConfig.basePath, adjustConfig.gdprPath, adjustConfig.subscriptionPath, @@ -997,6 +1000,7 @@ public void run() { IActivityPackageSender purchaseVerificationHandlerActivitySender = new ActivityPackageSender( adjustConfig.urlStrategy, + adjustConfig.useSubdomains, adjustConfig.basePath, adjustConfig.gdprPath, adjustConfig.subscriptionPath, @@ -2507,10 +2511,12 @@ private void verifyPurchaseI(final AdjustPurchase purchase, final OnPurchaseVeri return; } // from this moment on we know that we can ping client callback in case of error - if (adjustConfig.urlStrategy != null && - (adjustConfig.urlStrategy.equals(AdjustConfig.DATA_RESIDENCY_EU) || - adjustConfig.urlStrategy.equals(AdjustConfig.DATA_RESIDENCY_US) || - adjustConfig.urlStrategy.equals(AdjustConfig.DATA_RESIDENCY_TR))) { +// if (adjustConfig.urlStrategy != null && +// (adjustConfig.urlStrategy.equals(AdjustConfig.DATA_RESIDENCY_EU) || +// adjustConfig.urlStrategy.equals(AdjustConfig.DATA_RESIDENCY_US) || +// adjustConfig.urlStrategy.equals(AdjustConfig.DATA_RESIDENCY_TR))) { +// + if (adjustConfig.isDataResidency != null && adjustConfig.isDataResidency) { logger.warn("Purchase verification not available for data residency users right now"); return; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 04d5c6cd9..a47e6c9f2 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -3,6 +3,7 @@ import android.content.Context; import java.util.ArrayList; +import java.util.List; /** * Created by pfms on 06/11/14. @@ -34,7 +35,9 @@ public class AdjustConfig { String externalDeviceId; boolean preinstallTrackingEnabled; Boolean needsCost; - String urlStrategy; + List urlStrategy; + Boolean useSubdomains; + Boolean isDataResidency; String preinstallFilePath; String fbAppId; boolean shouldReadDeviceIdsOnce; @@ -46,14 +49,6 @@ public class AdjustConfig { public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; - public static final String URL_STRATEGY_INDIA = "url_strategy_india"; - public static final String URL_STRATEGY_CHINA = "url_strategy_china"; - public static final String URL_STRATEGY_CN = "url_strategy_cn"; - public static final String URL_STRATEGY_CN_ONLY = "url_strategy_cn_only"; - public static final String DATA_RESIDENCY_EU = "data_residency_eu"; - public static final String DATA_RESIDENCY_TR = "data_residency_tr"; - public static final String DATA_RESIDENCY_US = "data_residency_us"; - public AdjustConfig(Context context, String appToken, String environment) { init(context, appToken, environment, false); } @@ -164,21 +159,20 @@ public boolean isValid() { return true; } - public void setUrlStrategy(String urlStrategy) { - if (urlStrategy == null || urlStrategy.isEmpty()) { + public void setUrlStrategy(List domains, Boolean useSubdomains ,Boolean isDataResidency) { + if (domains == null || domains.isEmpty()) { logger.error("Invalid url strategy"); return; } - if (!urlStrategy.equals(URL_STRATEGY_INDIA) - && !urlStrategy.equals(URL_STRATEGY_CHINA) - && !urlStrategy.equals(URL_STRATEGY_CN) - && !urlStrategy.equals(URL_STRATEGY_CN_ONLY) - && !urlStrategy.equals(DATA_RESIDENCY_EU) - && !urlStrategy.equals(DATA_RESIDENCY_TR) - && !urlStrategy.equals(DATA_RESIDENCY_US)) { - logger.warn("Unrecognised url strategy %s", urlStrategy); + if (useSubdomains == null) { + useSubdomains = false; + } + if (isDataResidency == null) { + isDataResidency = false; } - this.urlStrategy = urlStrategy; + this.urlStrategy = domains; + this.useSubdomains = useSubdomains; + this.isDataResidency = isDataResidency; } public void readDeviceIdsOnce() { @@ -297,7 +291,7 @@ public Boolean getNeedsCost() { return needsCost; } - public String getUrlStrategy() { + public List getUrlStrategy() { return urlStrategy; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 571153fbc..90e8ffee0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -28,6 +28,11 @@ public interface Constants { String SUBSCRIPTION_URL = "https://subscription.adjust.com"; String PURCHASE_VERIFICATION_URL = "https://ssrv.adjust.com"; + String BASE_URL_FORMAT = "https://app.%s"; + String GDPR_URL_FORMAT = "https://gdpr.%s"; + String SUBSCRIPTION_URL_FORMAT = "https://subscription.%s"; + String PURCHASE_VERIFICATION_URL_FORMAT = "https://ssrv.%s"; + String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; String CLIENT_SDK = "android5.0.0"; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index 0c76a460b..39f75298f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -36,6 +36,7 @@ import java.net.URLEncoder; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import javax.net.ssl.HttpsURLConnection; @@ -55,7 +56,8 @@ public class ActivityPackageSender implements IActivityPackageSender { private IConnectionOptions connectionOptions; private Context context; - public ActivityPackageSender(final String adjustUrlStrategy, + public ActivityPackageSender(final List adjustUrlStrategy, + final Boolean useSubdomains, final String basePath, final String gdprPath, final String subscriptionPath, @@ -77,7 +79,8 @@ public ActivityPackageSender(final String adjustUrlStrategy, AdjustFactory.getGdprUrl(), AdjustFactory.getSubscriptionUrl(), AdjustFactory.getPurchaseVerificationUrl(), - adjustUrlStrategy); + adjustUrlStrategy, + useSubdomains); httpsURLConnectionProvider = AdjustFactory.getHttpsURLConnectionProvider(); connectionOptions = AdjustFactory.getConnectionOptions(); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java index ae434da78..4671972bc 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java @@ -3,48 +3,16 @@ import com.adjust.sdk.ActivityKind; import com.adjust.sdk.Constants; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; -import static com.adjust.sdk.AdjustConfig.DATA_RESIDENCY_TR; -import static com.adjust.sdk.AdjustConfig.DATA_RESIDENCY_US; -import static com.adjust.sdk.AdjustConfig.URL_STRATEGY_CHINA; -import static com.adjust.sdk.AdjustConfig.URL_STRATEGY_CN; -import static com.adjust.sdk.AdjustConfig.URL_STRATEGY_CN_ONLY; -import static com.adjust.sdk.AdjustConfig.URL_STRATEGY_INDIA; -import static com.adjust.sdk.AdjustConfig.DATA_RESIDENCY_EU; - public class UrlStrategy { - private static final String BASE_URL_INDIA = "https://app.adjust.net.in"; - private static final String GDPR_URL_INDIA = "https://gdpr.adjust.net.in"; - private static final String SUBSCRIPTION_URL_INDIA = "https://subscription.adjust.net.in"; - private static final String PURCHASE_VERIFICATION_URL_INDIA = "https://ssrv.adjust.net.in"; - - private static final String BASE_URL_CHINA = "https://app.adjust.world"; - private static final String GDPR_URL_CHINA = "https://gdpr.adjust.world"; - private static final String SUBSCRIPTION_URL_CHINA = "https://subscription.adjust.world"; - private static final String PURCHASE_VERIFICATION_URL_CHINA = "https://ssrv.adjust.world"; - - private static final String BASE_URL_CN = "https://app.adjust.cn"; - private static final String GDPR_URL_CN = "https://gdpr.adjust.cn"; - private static final String SUBSCRIPTION_URL_CN = "https://subscription.adjust.cn"; - private static final String PURCHASE_VERIFICATION_URL_CN = "https://ssrv.adjust.cn"; - - private static final String BASE_URL_EU = "https://app.eu.adjust.com"; - private static final String GDPR_URL_EU = "https://gdpr.eu.adjust.com"; - private static final String SUBSCRIPTION_URL_EU = "https://subscription.eu.adjust.com"; - private static final String PURCHASE_VERIFICATION_URL_EU = "https://ssrv.eu.adjust.com"; - - private static final String BASE_URL_TR = "https://app.tr.adjust.com"; - private static final String GDPR_URL_TR = "https://gdpr.tr.adjust.com"; - private static final String SUBSCRIPTION_URL_TR = "https://subscription.tr.adjust.com"; - private static final String PURCHASE_VERIFICATION_URL_TR = "https://ssrv.tr.adjust.com"; - - private static final String BASE_URL_US = "https://app.us.adjust.com"; - private static final String GDPR_URL_US = "https://gdpr.us.adjust.com"; - private static final String SUBSCRIPTION_URL_US = "https://subscription.us.adjust.com"; - private static final String PURCHASE_VERIFICATION_URL_US = "https://ssrv.us.adjust.com"; + private static final String BASE_URL_WORLD = "https://app.adjust.world"; + private static final String GDPR_URL_WORLD = "https://gdpr.adjust.world"; + private static final String SUBSCRIPTION_URL_WORLD = "https://subscription.adjust.world"; + private static final String PURCHASE_VERIFICATION_URL_WORLD = "https://ssrv.adjust.world"; private final String baseUrlOverwrite; private final String gdprUrlOverwrite; @@ -64,17 +32,18 @@ public UrlStrategy(final String baseUrlOverwrite, final String gdprUrlOverwrite, final String subscriptionUrlOverwrite, final String purchaseVerificationUrlOverwrite, - final String adjustUrlStrategy) + final List adjustUrlStrategy, + final Boolean useSubdomains) { this.baseUrlOverwrite = baseUrlOverwrite; this.gdprUrlOverwrite = gdprUrlOverwrite; this.subscriptionUrlOverwrite = subscriptionUrlOverwrite; this.purchaseVerificationUrlOverwrite = purchaseVerificationUrlOverwrite; - baseUrlChoicesList = baseUrlChoices(adjustUrlStrategy); - gdprUrlChoicesList = gdprUrlChoices(adjustUrlStrategy); - subscriptionUrlChoicesList = subscriptionUrlChoices(adjustUrlStrategy); - purchaseVerificationUrlChoicesList = purchaseVerificationUrlChoices(adjustUrlStrategy); + baseUrlChoicesList = baseUrlChoices(adjustUrlStrategy, useSubdomains); + gdprUrlChoicesList = gdprUrlChoices(adjustUrlStrategy, useSubdomains); + subscriptionUrlChoicesList = subscriptionUrlChoices(adjustUrlStrategy, useSubdomains); + purchaseVerificationUrlChoicesList = purchaseVerificationUrlChoices(adjustUrlStrategy, useSubdomains); wasLastAttemptSuccess = false; choiceIndex = 0; @@ -154,84 +123,77 @@ public String targetUrlByActivityKind(final ActivityKind activityKind) { } } - private static List baseUrlChoices(final String urlStrategy) { - if (URL_STRATEGY_INDIA.equals(urlStrategy)) { - return Arrays.asList(BASE_URL_INDIA, Constants.BASE_URL); - } else if (URL_STRATEGY_CHINA.equals(urlStrategy)) { - return Arrays.asList(BASE_URL_CHINA, Constants.BASE_URL); - } else if (URL_STRATEGY_CN.equals(urlStrategy)) { - return Arrays.asList(BASE_URL_CN, Constants.BASE_URL); - } else if (URL_STRATEGY_CN_ONLY.equals(urlStrategy)) { - return Arrays.asList(BASE_URL_CN); - } else if (DATA_RESIDENCY_EU.equals(urlStrategy)) { - return Collections.singletonList(BASE_URL_EU); - } else if (DATA_RESIDENCY_TR.equals(urlStrategy)) { - return Collections.singletonList(BASE_URL_TR); - } else if (DATA_RESIDENCY_US.equals(urlStrategy)) { - return Collections.singletonList(BASE_URL_US); - } else { - return Arrays.asList(Constants.BASE_URL, BASE_URL_INDIA, BASE_URL_CHINA); + private static List baseUrlChoices(final List urlStrategy,final Boolean useSubdomains) { + + if (urlStrategy == null || urlStrategy.isEmpty()) { + return Arrays.asList(Constants.BASE_URL, BASE_URL_WORLD); + } + if (useSubdomains != null && useSubdomains){ + List baseUrls = new ArrayList<>(); + for (String url : urlStrategy) { + baseUrls.add(String.format(Constants.BASE_URL_FORMAT, url)); + } + return baseUrls; + }else { + List baseUrls = new ArrayList<>(); + for (String url : urlStrategy) { + baseUrls.add(String.format("https://%s", url)); + } + return baseUrls; } } - private static List gdprUrlChoices(final String urlStrategy) { - if (URL_STRATEGY_INDIA.equals(urlStrategy)) { - return Arrays.asList(GDPR_URL_INDIA, Constants.GDPR_URL); - } else if (URL_STRATEGY_CHINA.equals(urlStrategy)) { - return Arrays.asList(GDPR_URL_CHINA, Constants.GDPR_URL); - } else if (URL_STRATEGY_CN.equals(urlStrategy)) { - return Arrays.asList(GDPR_URL_CN, Constants.GDPR_URL); - } else if (URL_STRATEGY_CN_ONLY.equals(urlStrategy)) { - return Arrays.asList(GDPR_URL_CN); - } else if (DATA_RESIDENCY_EU.equals(urlStrategy)) { - return Collections.singletonList(GDPR_URL_EU); - } else if (DATA_RESIDENCY_TR.equals(urlStrategy)) { - return Collections.singletonList(GDPR_URL_TR); - } else if (DATA_RESIDENCY_US.equals(urlStrategy)) { - return Collections.singletonList(GDPR_URL_US); - } else { - return Arrays.asList(Constants.GDPR_URL, GDPR_URL_INDIA, GDPR_URL_CHINA); + private static List gdprUrlChoices(final List urlStrategy,final Boolean useSubdomains) { + if (urlStrategy == null || urlStrategy.isEmpty()) { + return Arrays.asList(Constants.GDPR_URL, GDPR_URL_WORLD); + } + if (useSubdomains != null && useSubdomains){ + List baseUrls = new ArrayList<>(); + for (String url : urlStrategy) { + baseUrls.add(String.format(Constants.GDPR_URL_FORMAT, url)); + } + return baseUrls; + }else { + List baseUrls = new ArrayList<>(); + for (String url : urlStrategy) { + baseUrls.add(String.format("https://%s", url)); + } + return baseUrls; } } - private static List subscriptionUrlChoices(final String urlStrategy) { - if (URL_STRATEGY_INDIA.equals(urlStrategy)) { - return Arrays.asList(SUBSCRIPTION_URL_INDIA, Constants.SUBSCRIPTION_URL); - } else if (URL_STRATEGY_CHINA.equals(urlStrategy)) { - return Arrays.asList(SUBSCRIPTION_URL_CHINA, Constants.SUBSCRIPTION_URL); - } else if (URL_STRATEGY_CN.equals(urlStrategy)) { - return Arrays.asList(SUBSCRIPTION_URL_CN, Constants.SUBSCRIPTION_URL); - } else if (URL_STRATEGY_CN_ONLY.equals(urlStrategy)) { - return Arrays.asList(SUBSCRIPTION_URL_CN); - } else if (DATA_RESIDENCY_EU.equals(urlStrategy)) { - return Collections.singletonList(SUBSCRIPTION_URL_EU); - } else if (DATA_RESIDENCY_TR.equals(urlStrategy)) { - return Collections.singletonList(SUBSCRIPTION_URL_TR); - } else if (DATA_RESIDENCY_US.equals(urlStrategy)) { - return Collections.singletonList(SUBSCRIPTION_URL_US); - } else { - return Arrays.asList(Constants.SUBSCRIPTION_URL, - SUBSCRIPTION_URL_INDIA, - SUBSCRIPTION_URL_CHINA); + private static List subscriptionUrlChoices(final List urlStrategy,final Boolean useSubdomains) { + if (urlStrategy == null || urlStrategy.isEmpty()) { + return Arrays.asList(Constants.SUBSCRIPTION_URL, SUBSCRIPTION_URL_WORLD); + } + if (useSubdomains != null && useSubdomains){ + List baseUrls = new ArrayList<>(); + for (String url : urlStrategy) { + baseUrls.add(String.format(Constants.SUBSCRIPTION_URL_FORMAT, url)); + } + return baseUrls; + }else { + List baseUrls = new ArrayList<>(); + for (String url : urlStrategy) { + baseUrls.add(String.format("https://%s", url)); + } + return baseUrls; } } - private static List purchaseVerificationUrlChoices(final String urlStrategy) { - if (URL_STRATEGY_INDIA.equals(urlStrategy)) { - return Arrays.asList(PURCHASE_VERIFICATION_URL_INDIA, Constants.PURCHASE_VERIFICATION_URL); - } else if (URL_STRATEGY_CHINA.equals(urlStrategy)) { - return Arrays.asList(PURCHASE_VERIFICATION_URL_CHINA, Constants.PURCHASE_VERIFICATION_URL); - } else if (URL_STRATEGY_CN.equals(urlStrategy)) { - return Arrays.asList(PURCHASE_VERIFICATION_URL_CN, Constants.PURCHASE_VERIFICATION_URL); - } else if (URL_STRATEGY_CN_ONLY.equals(urlStrategy)) { - return Arrays.asList(PURCHASE_VERIFICATION_URL_CN); - } else if (DATA_RESIDENCY_EU.equals(urlStrategy)) { - return Collections.singletonList(PURCHASE_VERIFICATION_URL_EU); - } else if (DATA_RESIDENCY_TR.equals(urlStrategy)) { - return Collections.singletonList(PURCHASE_VERIFICATION_URL_TR); - } else if (DATA_RESIDENCY_US.equals(urlStrategy)) { - return Collections.singletonList(PURCHASE_VERIFICATION_URL_US); - } else { - return Arrays.asList(Constants.PURCHASE_VERIFICATION_URL, - PURCHASE_VERIFICATION_URL_INDIA, - PURCHASE_VERIFICATION_URL_CHINA); + private static List purchaseVerificationUrlChoices(final List urlStrategy,final Boolean useSubdomains) { + if (urlStrategy == null || urlStrategy.isEmpty()) { + return Arrays.asList(Constants.PURCHASE_VERIFICATION_URL, PURCHASE_VERIFICATION_URL_WORLD); + } + if (useSubdomains != null && useSubdomains){ + List baseUrls = new ArrayList<>(); + for (String url : urlStrategy) { + baseUrls.add(String.format(Constants.PURCHASE_VERIFICATION_URL_FORMAT, url)); + } + return baseUrls; + }else { + List baseUrls = new ArrayList<>(); + for (String url : urlStrategy) { + baseUrls.add(String.format("https://%s", url)); + } + return baseUrls; } } } diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js index e6c2133a0..a536c97e2 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -41,6 +41,9 @@ function AdjustConfig(appToken, environment, legacy) { this.deferredDeeplinkCallbackFunction = null; this.fbPixelDefaultEventToken = null; this.fbPixelMapping = []; + this.urlStrategy = []; + this.useSubDomain = null; + this.isDataResidency = null; this.preinstallTrackingEnabled = null; this.preinstallFilePath = null; this.fbAppId = null; @@ -200,6 +203,12 @@ AdjustConfig.prototype.addFbPixelMapping = function(fbEventNameKey, adjEventToke this.fbPixelMapping.push(adjEventTokenValue); }; +AdjustConfig.prototype.setUrlStrategy = function(urlStrategy, useSubDomain , isDataResidency) { + this.urlStrategy = urlStrategy; + this.useSubDomain = useSubDomain; + this.isDataResidency = isDataResidency; +}; + AdjustConfig.prototype.setPreinstallTrackingEnabled = function(preinstallTrackingEnabled) { this.preinstallTrackingEnabled = preinstallTrackingEnabled; }; diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 1246316b2..b3b89855e 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -36,6 +36,10 @@ import org.json.JSONArray; import org.json.JSONObject; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + /** * Created by uerceg on 22/07/16. */ @@ -162,6 +166,9 @@ public void initSdk(String adjustConfigString) { Object deferredDeeplinkCallbackNameField = jsonAdjustConfig.get("deferredDeeplinkCallbackName"); Object fbPixelDefaultEventTokenField = jsonAdjustConfig.get("fbPixelDefaultEventToken"); Object fbPixelMappingField = jsonAdjustConfig.get("fbPixelMapping"); + Object urlStrategyField = jsonAdjustConfig.get("urlStrategy"); + Object useSubDomainField = jsonAdjustConfig.get("useSubDomain"); + Object isDataResidencyField = jsonAdjustConfig.get("isDataResidency"); Object preinstallTrackingEnabledField = jsonAdjustConfig.get("preinstallTrackingEnabled"); Object preinstallFilePathField = jsonAdjustConfig.get("preinstallFilePath"); Object fbAppIdField = jsonAdjustConfig.get("fbAppId"); @@ -331,6 +338,16 @@ public boolean launchReceivedDeeplink(Uri deeplink) { AdjustFactory.getLogger().error("AdjustBridgeInstance.configureFbPixel: %s", e.getMessage()); } + // Set url strategy + String[] urlStrategyArray = AdjustBridgeUtil.jsonArrayToArray((JSONArray) urlStrategyField); + List urlStrategy = Arrays.asList(urlStrategyArray); + + Boolean useSubDomain = AdjustBridgeUtil.fieldToBoolean(useSubDomainField); + Boolean isDataResidency = AdjustBridgeUtil.fieldToBoolean(isDataResidencyField); + if (urlStrategy != null && !urlStrategy.isEmpty() && useSubDomain != null && isDataResidency != null) { + adjustConfig.setUrlStrategy(urlStrategy,useSubDomain,isDataResidency); + } + // Preinstall tracking Boolean preinstallTrackingEnabled = AdjustBridgeUtil.fieldToBoolean(preinstallTrackingEnabledField); if (preinstallTrackingEnabled != null) { From 661e21dad8539b7a791b0856a60294ea6dd1eadc Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 28 May 2024 13:55:17 +0200 Subject: [PATCH 213/540] refac: commenting out the usage of url strategy in example-app --- .../java/com/adjust/examples/GlobalApplication.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 852fa8cf5..e8e8b6e13 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -65,12 +65,12 @@ public void onFinishedEventTrackingSucceeded(AdjustEventSuccess eventSuccessResp } }); - List urlStrategy = new ArrayList<>(); - urlStrategy.add("adjust.com"); - urlStrategy.add("adjust.cn"); - urlStrategy.add("eu.adjust.com"); - - config.setUrlStrategy(urlStrategy , false, false); +// List urlStrategy = new ArrayList<>(); +// urlStrategy.add("adjust.com"); +// urlStrategy.add("adjust.cn"); +// urlStrategy.add("eu.adjust.com"); +// +// config.setUrlStrategy(urlStrategy , true, false); // Set event failure tracking delegate. config.setOnEventTrackingFailedListener(new OnEventTrackingFailedListener() { From b4032e0783ae12854ee32f2b498286f587916f7c Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 28 May 2024 14:20:25 +0200 Subject: [PATCH 214/540] refac:avoiding of have default value for useSubdomains and isDataResidency flags --- .../main/java/com/adjust/examples/GlobalApplication.java | 3 ++- .../sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index e8e8b6e13..3ff7c24c3 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -65,11 +65,12 @@ public void onFinishedEventTrackingSucceeded(AdjustEventSuccess eventSuccessResp } }); + + // Set url strategy // List urlStrategy = new ArrayList<>(); // urlStrategy.add("adjust.com"); // urlStrategy.add("adjust.cn"); // urlStrategy.add("eu.adjust.com"); -// // config.setUrlStrategy(urlStrategy , true, false); // Set event failure tracking delegate. diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index a47e6c9f2..a225508c7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -165,10 +165,12 @@ public void setUrlStrategy(List domains, Boolean useSubdomains ,Boolean return; } if (useSubdomains == null) { - useSubdomains = false; + logger.error("useSubdomains cannot be null"); + return; } if (isDataResidency == null) { - isDataResidency = false; + logger.error("isDataResidency cannot be null"); + return; } this.urlStrategy = domains; this.useSubdomains = useSubdomains; From e37632ca5dc41e9bbf04c77b69bc4c2481828704 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 28 May 2024 14:21:46 +0200 Subject: [PATCH 215/540] refac:avoiding of have default value for useSubdomains and isDataResidency flags --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 5b9d4ecc4..cd57b81f4 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -2511,11 +2511,6 @@ private void verifyPurchaseI(final AdjustPurchase purchase, final OnPurchaseVeri return; } // from this moment on we know that we can ping client callback in case of error -// if (adjustConfig.urlStrategy != null && -// (adjustConfig.urlStrategy.equals(AdjustConfig.DATA_RESIDENCY_EU) || -// adjustConfig.urlStrategy.equals(AdjustConfig.DATA_RESIDENCY_US) || -// adjustConfig.urlStrategy.equals(AdjustConfig.DATA_RESIDENCY_TR))) { -// if (adjustConfig.isDataResidency != null && adjustConfig.isDataResidency) { logger.warn("Purchase verification not available for data residency users right now"); return; From d0c91e218528f013b945c0e139d4c0ebe728f046 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 28 May 2024 17:43:05 +0200 Subject: [PATCH 216/540] refac:use primitive boolean for setUrlStrategy clean up the UrlStrategy.java class fire purchaseVerification callback onFail when the isDataResidency is true --- .../java/com/adjust/sdk/ActivityHandler.java | 7 +- .../java/com/adjust/sdk/AdjustConfig.java | 14 +--- .../sdk/network/ActivityPackageSender.java | 2 +- .../com/adjust/sdk/network/UrlStrategy.java | 75 +++++++++---------- 4 files changed, 47 insertions(+), 51 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index cd57b81f4..aaa25f29b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -2511,8 +2511,13 @@ private void verifyPurchaseI(final AdjustPurchase purchase, final OnPurchaseVeri return; } // from this moment on we know that we can ping client callback in case of error - if (adjustConfig.isDataResidency != null && adjustConfig.isDataResidency) { + if (adjustConfig.isDataResidency) { logger.warn("Purchase verification not available for data residency users right now"); + AdjustPurchaseVerificationResult result = new AdjustPurchaseVerificationResult( + "not_verified", + 109, + "Purchase verification not available for data residency users right now"); + callback.onVerificationFinished(result); return; } if (!checkActivityStateI(activityState)) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index a225508c7..3a1d65cdb 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -36,8 +36,8 @@ public class AdjustConfig { boolean preinstallTrackingEnabled; Boolean needsCost; List urlStrategy; - Boolean useSubdomains; - Boolean isDataResidency; + boolean useSubdomains; + boolean isDataResidency; String preinstallFilePath; String fbAppId; boolean shouldReadDeviceIdsOnce; @@ -159,19 +159,11 @@ public boolean isValid() { return true; } - public void setUrlStrategy(List domains, Boolean useSubdomains ,Boolean isDataResidency) { + public void setUrlStrategy(List domains, boolean useSubdomains, boolean isDataResidency) { if (domains == null || domains.isEmpty()) { logger.error("Invalid url strategy"); return; } - if (useSubdomains == null) { - logger.error("useSubdomains cannot be null"); - return; - } - if (isDataResidency == null) { - logger.error("isDataResidency cannot be null"); - return; - } this.urlStrategy = domains; this.useSubdomains = useSubdomains; this.isDataResidency = isDataResidency; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index 39f75298f..dd2ff6414 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -57,7 +57,7 @@ public class ActivityPackageSender implements IActivityPackageSender { private Context context; public ActivityPackageSender(final List adjustUrlStrategy, - final Boolean useSubdomains, + final boolean useSubdomains, final String basePath, final String gdprPath, final String subscriptionPath, diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java index 4671972bc..4ca814e0d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java @@ -5,7 +5,6 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; public class UrlStrategy { @@ -14,6 +13,9 @@ public class UrlStrategy { private static final String SUBSCRIPTION_URL_WORLD = "https://subscription.adjust.world"; private static final String PURCHASE_VERIFICATION_URL_WORLD = "https://ssrv.adjust.world"; + private final List adjustUrlStrategy; + private final boolean useSubdomains; + private final String baseUrlOverwrite; private final String gdprUrlOverwrite; private final String subscriptionUrlOverwrite; @@ -33,17 +35,20 @@ public UrlStrategy(final String baseUrlOverwrite, final String subscriptionUrlOverwrite, final String purchaseVerificationUrlOverwrite, final List adjustUrlStrategy, - final Boolean useSubdomains) + final boolean useSubdomains) { + this.adjustUrlStrategy = adjustUrlStrategy; + this.useSubdomains = useSubdomains; + this.baseUrlOverwrite = baseUrlOverwrite; this.gdprUrlOverwrite = gdprUrlOverwrite; this.subscriptionUrlOverwrite = subscriptionUrlOverwrite; this.purchaseVerificationUrlOverwrite = purchaseVerificationUrlOverwrite; - baseUrlChoicesList = baseUrlChoices(adjustUrlStrategy, useSubdomains); - gdprUrlChoicesList = gdprUrlChoices(adjustUrlStrategy, useSubdomains); - subscriptionUrlChoicesList = subscriptionUrlChoices(adjustUrlStrategy, useSubdomains); - purchaseVerificationUrlChoicesList = purchaseVerificationUrlChoices(adjustUrlStrategy, useSubdomains); + baseUrlChoicesList = baseUrlChoices(); + gdprUrlChoicesList = gdprUrlChoices(); + subscriptionUrlChoicesList = subscriptionUrlChoices(); + purchaseVerificationUrlChoicesList = purchaseVerificationUrlChoices(); wasLastAttemptSuccess = false; choiceIndex = 0; @@ -123,77 +128,71 @@ public String targetUrlByActivityKind(final ActivityKind activityKind) { } } - private static List baseUrlChoices(final List urlStrategy,final Boolean useSubdomains) { + private List baseUrlChoices() { - if (urlStrategy == null || urlStrategy.isEmpty()) { + if (adjustUrlStrategy == null || adjustUrlStrategy.isEmpty()) { return Arrays.asList(Constants.BASE_URL, BASE_URL_WORLD); } - if (useSubdomains != null && useSubdomains){ + if (useSubdomains) { List baseUrls = new ArrayList<>(); - for (String url : urlStrategy) { + for (String url : adjustUrlStrategy) { baseUrls.add(String.format(Constants.BASE_URL_FORMAT, url)); } return baseUrls; }else { List baseUrls = new ArrayList<>(); - for (String url : urlStrategy) { + for (String url : adjustUrlStrategy) { baseUrls.add(String.format("https://%s", url)); } return baseUrls; } } - private static List gdprUrlChoices(final List urlStrategy,final Boolean useSubdomains) { - if (urlStrategy == null || urlStrategy.isEmpty()) { + private List gdprUrlChoices() { + if (adjustUrlStrategy == null || adjustUrlStrategy.isEmpty()) { return Arrays.asList(Constants.GDPR_URL, GDPR_URL_WORLD); } - if (useSubdomains != null && useSubdomains){ - List baseUrls = new ArrayList<>(); - for (String url : urlStrategy) { + List baseUrls = new ArrayList<>(); + if (useSubdomains) { + for (String url : adjustUrlStrategy) { baseUrls.add(String.format(Constants.GDPR_URL_FORMAT, url)); } - return baseUrls; }else { - List baseUrls = new ArrayList<>(); - for (String url : urlStrategy) { + for (String url : adjustUrlStrategy) { baseUrls.add(String.format("https://%s", url)); } - return baseUrls; } + return baseUrls; } - private static List subscriptionUrlChoices(final List urlStrategy,final Boolean useSubdomains) { - if (urlStrategy == null || urlStrategy.isEmpty()) { + private List subscriptionUrlChoices() { + if (adjustUrlStrategy == null || adjustUrlStrategy.isEmpty()) { return Arrays.asList(Constants.SUBSCRIPTION_URL, SUBSCRIPTION_URL_WORLD); } - if (useSubdomains != null && useSubdomains){ - List baseUrls = new ArrayList<>(); - for (String url : urlStrategy) { + List baseUrls = new ArrayList<>(); + if (useSubdomains) { + for (String url : adjustUrlStrategy) { baseUrls.add(String.format(Constants.SUBSCRIPTION_URL_FORMAT, url)); } - return baseUrls; }else { - List baseUrls = new ArrayList<>(); - for (String url : urlStrategy) { + for (String url : adjustUrlStrategy) { baseUrls.add(String.format("https://%s", url)); } - return baseUrls; } + return baseUrls; } - private static List purchaseVerificationUrlChoices(final List urlStrategy,final Boolean useSubdomains) { - if (urlStrategy == null || urlStrategy.isEmpty()) { + private List purchaseVerificationUrlChoices() { + if (adjustUrlStrategy == null || adjustUrlStrategy.isEmpty()) { return Arrays.asList(Constants.PURCHASE_VERIFICATION_URL, PURCHASE_VERIFICATION_URL_WORLD); } - if (useSubdomains != null && useSubdomains){ - List baseUrls = new ArrayList<>(); - for (String url : urlStrategy) { + List baseUrls = new ArrayList<>(); + if (useSubdomains){ + for (String url : adjustUrlStrategy) { baseUrls.add(String.format(Constants.PURCHASE_VERIFICATION_URL_FORMAT, url)); } - return baseUrls; }else { - List baseUrls = new ArrayList<>(); - for (String url : urlStrategy) { + for (String url : adjustUrlStrategy) { baseUrls.add(String.format("https://%s", url)); } - return baseUrls; } + return baseUrls; } } From 4e4b67a39fbfe02acc1444317735ee5e66628565 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 29 May 2024 11:08:05 +0200 Subject: [PATCH 217/540] refac:use Constants.java for no subdomain formats --- .../main/java/com/adjust/sdk/Constants.java | 2 ++ .../com/adjust/sdk/network/UrlStrategy.java | 35 ++++++++++++------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 90e8ffee0..6b3ff6050 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -33,6 +33,8 @@ public interface Constants { String SUBSCRIPTION_URL_FORMAT = "https://subscription.%s"; String PURCHASE_VERIFICATION_URL_FORMAT = "https://ssrv.%s"; + String BASE_URL_NO_SUB_DOMAIN_FORMAT = "https://%s"; + String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; String CLIENT_SDK = "android5.0.0"; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java index 4ca814e0d..4f1c73f63 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java @@ -1,7 +1,16 @@ package com.adjust.sdk.network; +import static com.adjust.sdk.Constants.BASE_URL; +import static com.adjust.sdk.Constants.BASE_URL_FORMAT; +import static com.adjust.sdk.Constants.BASE_URL_NO_SUB_DOMAIN_FORMAT; +import static com.adjust.sdk.Constants.GDPR_URL; +import static com.adjust.sdk.Constants.GDPR_URL_FORMAT; +import static com.adjust.sdk.Constants.PURCHASE_VERIFICATION_URL; +import static com.adjust.sdk.Constants.PURCHASE_VERIFICATION_URL_FORMAT; +import static com.adjust.sdk.Constants.SUBSCRIPTION_URL; +import static com.adjust.sdk.Constants.SUBSCRIPTION_URL_FORMAT; + import com.adjust.sdk.ActivityKind; -import com.adjust.sdk.Constants; import java.util.ArrayList; import java.util.Arrays; @@ -131,66 +140,66 @@ public String targetUrlByActivityKind(final ActivityKind activityKind) { private List baseUrlChoices() { if (adjustUrlStrategy == null || adjustUrlStrategy.isEmpty()) { - return Arrays.asList(Constants.BASE_URL, BASE_URL_WORLD); + return Arrays.asList(BASE_URL, BASE_URL_WORLD); } if (useSubdomains) { List baseUrls = new ArrayList<>(); for (String url : adjustUrlStrategy) { - baseUrls.add(String.format(Constants.BASE_URL_FORMAT, url)); + baseUrls.add(String.format(BASE_URL_FORMAT, url)); } return baseUrls; }else { List baseUrls = new ArrayList<>(); for (String url : adjustUrlStrategy) { - baseUrls.add(String.format("https://%s", url)); + baseUrls.add(String.format(BASE_URL_NO_SUB_DOMAIN_FORMAT, url)); } return baseUrls; } } private List gdprUrlChoices() { if (adjustUrlStrategy == null || adjustUrlStrategy.isEmpty()) { - return Arrays.asList(Constants.GDPR_URL, GDPR_URL_WORLD); + return Arrays.asList(GDPR_URL, GDPR_URL_WORLD); } List baseUrls = new ArrayList<>(); if (useSubdomains) { for (String url : adjustUrlStrategy) { - baseUrls.add(String.format(Constants.GDPR_URL_FORMAT, url)); + baseUrls.add(String.format(GDPR_URL_FORMAT, url)); } }else { for (String url : adjustUrlStrategy) { - baseUrls.add(String.format("https://%s", url)); + baseUrls.add(String.format(BASE_URL_NO_SUB_DOMAIN_FORMAT, url)); } } return baseUrls; } private List subscriptionUrlChoices() { if (adjustUrlStrategy == null || adjustUrlStrategy.isEmpty()) { - return Arrays.asList(Constants.SUBSCRIPTION_URL, SUBSCRIPTION_URL_WORLD); + return Arrays.asList(SUBSCRIPTION_URL, SUBSCRIPTION_URL_WORLD); } List baseUrls = new ArrayList<>(); if (useSubdomains) { for (String url : adjustUrlStrategy) { - baseUrls.add(String.format(Constants.SUBSCRIPTION_URL_FORMAT, url)); + baseUrls.add(String.format(SUBSCRIPTION_URL_FORMAT, url)); } }else { for (String url : adjustUrlStrategy) { - baseUrls.add(String.format("https://%s", url)); + baseUrls.add(String.format(BASE_URL_NO_SUB_DOMAIN_FORMAT, url)); } } return baseUrls; } private List purchaseVerificationUrlChoices() { if (adjustUrlStrategy == null || adjustUrlStrategy.isEmpty()) { - return Arrays.asList(Constants.PURCHASE_VERIFICATION_URL, PURCHASE_VERIFICATION_URL_WORLD); + return Arrays.asList(PURCHASE_VERIFICATION_URL, PURCHASE_VERIFICATION_URL_WORLD); } List baseUrls = new ArrayList<>(); if (useSubdomains){ for (String url : adjustUrlStrategy) { - baseUrls.add(String.format(Constants.PURCHASE_VERIFICATION_URL_FORMAT, url)); + baseUrls.add(String.format(PURCHASE_VERIFICATION_URL_FORMAT, url)); } }else { for (String url : adjustUrlStrategy) { - baseUrls.add(String.format("https://%s", url)); + baseUrls.add(String.format(BASE_URL_NO_SUB_DOMAIN_FORMAT, url)); } } return baseUrls; From 3fb51afc1b55d14188810621cf07cf6f5190c7be Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 29 May 2024 11:43:42 +0200 Subject: [PATCH 218/540] refac:rename list urlStrategy to urlStrategyDomains --- .../java/com/adjust/sdk/ActivityHandler.java | 8 ++--- .../java/com/adjust/sdk/AdjustConfig.java | 8 ++--- .../sdk/network/ActivityPackageSender.java | 4 +-- .../com/adjust/sdk/network/UrlStrategy.java | 30 +++++++++---------- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index aaa25f29b..d34a22cfb 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -951,7 +951,7 @@ public void run() { IActivityPackageSender packageHandlerActivitySender = new ActivityPackageSender( - adjustConfig.urlStrategy, + adjustConfig.urlStrategyDomains, adjustConfig.useSubdomains, adjustConfig.basePath, adjustConfig.gdprPath, @@ -967,7 +967,7 @@ public void run() { IActivityPackageSender attributionHandlerActivitySender = new ActivityPackageSender( - adjustConfig.urlStrategy, + adjustConfig.urlStrategyDomains, adjustConfig.useSubdomains, adjustConfig.basePath, adjustConfig.gdprPath, @@ -983,7 +983,7 @@ public void run() { IActivityPackageSender sdkClickHandlerActivitySender = new ActivityPackageSender( - adjustConfig.urlStrategy, + adjustConfig.urlStrategyDomains, adjustConfig.useSubdomains, adjustConfig.basePath, adjustConfig.gdprPath, @@ -999,7 +999,7 @@ public void run() { IActivityPackageSender purchaseVerificationHandlerActivitySender = new ActivityPackageSender( - adjustConfig.urlStrategy, + adjustConfig.urlStrategyDomains, adjustConfig.useSubdomains, adjustConfig.basePath, adjustConfig.gdprPath, diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 3a1d65cdb..d9e103b6c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -35,7 +35,7 @@ public class AdjustConfig { String externalDeviceId; boolean preinstallTrackingEnabled; Boolean needsCost; - List urlStrategy; + List urlStrategyDomains; boolean useSubdomains; boolean isDataResidency; String preinstallFilePath; @@ -164,7 +164,7 @@ public void setUrlStrategy(List domains, boolean useSubdomains, boolean logger.error("Invalid url strategy"); return; } - this.urlStrategy = domains; + this.urlStrategyDomains = domains; this.useSubdomains = useSubdomains; this.isDataResidency = isDataResidency; } @@ -285,8 +285,8 @@ public Boolean getNeedsCost() { return needsCost; } - public List getUrlStrategy() { - return urlStrategy; + public List getUrlStrategyDomains() { + return urlStrategyDomains; } public String getPreinstallFilePath() { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index dd2ff6414..ae692200a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -56,7 +56,7 @@ public class ActivityPackageSender implements IActivityPackageSender { private IConnectionOptions connectionOptions; private Context context; - public ActivityPackageSender(final List adjustUrlStrategy, + public ActivityPackageSender(final List urlStrategyDomains, final boolean useSubdomains, final String basePath, final String gdprPath, @@ -79,7 +79,7 @@ public ActivityPackageSender(final List adjustUrlStrategy, AdjustFactory.getGdprUrl(), AdjustFactory.getSubscriptionUrl(), AdjustFactory.getPurchaseVerificationUrl(), - adjustUrlStrategy, + urlStrategyDomains, useSubdomains); httpsURLConnectionProvider = AdjustFactory.getHttpsURLConnectionProvider(); connectionOptions = AdjustFactory.getConnectionOptions(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java index 4f1c73f63..56c909f0a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java @@ -22,7 +22,7 @@ public class UrlStrategy { private static final String SUBSCRIPTION_URL_WORLD = "https://subscription.adjust.world"; private static final String PURCHASE_VERIFICATION_URL_WORLD = "https://ssrv.adjust.world"; - private final List adjustUrlStrategy; + private final List urlStrategyDomains; private final boolean useSubdomains; private final String baseUrlOverwrite; @@ -43,10 +43,10 @@ public UrlStrategy(final String baseUrlOverwrite, final String gdprUrlOverwrite, final String subscriptionUrlOverwrite, final String purchaseVerificationUrlOverwrite, - final List adjustUrlStrategy, + final List urlStrategyDomains, final boolean useSubdomains) { - this.adjustUrlStrategy = adjustUrlStrategy; + this.urlStrategyDomains = urlStrategyDomains; this.useSubdomains = useSubdomains; this.baseUrlOverwrite = baseUrlOverwrite; @@ -139,66 +139,66 @@ public String targetUrlByActivityKind(final ActivityKind activityKind) { private List baseUrlChoices() { - if (adjustUrlStrategy == null || adjustUrlStrategy.isEmpty()) { + if (urlStrategyDomains == null || urlStrategyDomains.isEmpty()) { return Arrays.asList(BASE_URL, BASE_URL_WORLD); } if (useSubdomains) { List baseUrls = new ArrayList<>(); - for (String url : adjustUrlStrategy) { + for (String url : urlStrategyDomains) { baseUrls.add(String.format(BASE_URL_FORMAT, url)); } return baseUrls; }else { List baseUrls = new ArrayList<>(); - for (String url : adjustUrlStrategy) { + for (String url : urlStrategyDomains) { baseUrls.add(String.format(BASE_URL_NO_SUB_DOMAIN_FORMAT, url)); } return baseUrls; } } private List gdprUrlChoices() { - if (adjustUrlStrategy == null || adjustUrlStrategy.isEmpty()) { + if (urlStrategyDomains == null || urlStrategyDomains.isEmpty()) { return Arrays.asList(GDPR_URL, GDPR_URL_WORLD); } List baseUrls = new ArrayList<>(); if (useSubdomains) { - for (String url : adjustUrlStrategy) { + for (String url : urlStrategyDomains) { baseUrls.add(String.format(GDPR_URL_FORMAT, url)); } }else { - for (String url : adjustUrlStrategy) { + for (String url : urlStrategyDomains) { baseUrls.add(String.format(BASE_URL_NO_SUB_DOMAIN_FORMAT, url)); } } return baseUrls; } private List subscriptionUrlChoices() { - if (adjustUrlStrategy == null || adjustUrlStrategy.isEmpty()) { + if (urlStrategyDomains == null || urlStrategyDomains.isEmpty()) { return Arrays.asList(SUBSCRIPTION_URL, SUBSCRIPTION_URL_WORLD); } List baseUrls = new ArrayList<>(); if (useSubdomains) { - for (String url : adjustUrlStrategy) { + for (String url : urlStrategyDomains) { baseUrls.add(String.format(SUBSCRIPTION_URL_FORMAT, url)); } }else { - for (String url : adjustUrlStrategy) { + for (String url : urlStrategyDomains) { baseUrls.add(String.format(BASE_URL_NO_SUB_DOMAIN_FORMAT, url)); } } return baseUrls; } private List purchaseVerificationUrlChoices() { - if (adjustUrlStrategy == null || adjustUrlStrategy.isEmpty()) { + if (urlStrategyDomains == null || urlStrategyDomains.isEmpty()) { return Arrays.asList(PURCHASE_VERIFICATION_URL, PURCHASE_VERIFICATION_URL_WORLD); } List baseUrls = new ArrayList<>(); if (useSubdomains){ - for (String url : adjustUrlStrategy) { + for (String url : urlStrategyDomains) { baseUrls.add(String.format(PURCHASE_VERIFICATION_URL_FORMAT, url)); } }else { - for (String url : adjustUrlStrategy) { + for (String url : urlStrategyDomains) { baseUrls.add(String.format(BASE_URL_NO_SUB_DOMAIN_FORMAT, url)); } } From 1a3db7c23cacbaac1a3e1d540a0ec9b48bdc11d9 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 23 May 2024 00:10:26 +0200 Subject: [PATCH 219/540] feat: add verify and track feature --- .../java/com/adjust/sdk/ActivityHandler.java | 79 ++++++++++++++ .../src/main/java/com/adjust/sdk/Adjust.java | 11 ++ .../java/com/adjust/sdk/AdjustInstance.java | 20 ++++ .../java/com/adjust/sdk/IActivityHandler.java | 2 + .../java/com/adjust/sdk/PackageBuilder.java | 101 ++++++++++++++++++ 5 files changed, 213 insertions(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index d34a22cfb..1087ac5fa 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -814,6 +814,16 @@ public void run() { }); } + @Override + public void verifyAndTrack(AdjustEvent event, OnPurchaseVerificationFinishedListener callback) { + executor.submit(new Runnable() { + @Override + public void run() { + verifyAndTrackI(event, callback); + } + }); + } + @Override public void setCoppaCompliance(final boolean enabled) { executor.submit(new Runnable() { @@ -2576,6 +2586,75 @@ private void verifyPurchaseI(final AdjustPurchase purchase, final OnPurchaseVeri purchaseVerificationHandler.sendPurchaseVerificationPackage(verificationPackage); } + private void verifyAndTrackI(final AdjustEvent event, final OnPurchaseVerificationFinishedListener callback) { + if (callback == null) { + logger.warn("Purchase verification aborted because verification callback is null"); + return; + } + // from this moment on we know that we can ping client callback in case of error + if (adjustConfig.urlStrategy != null && + (adjustConfig.urlStrategy.equals(AdjustConfig.DATA_RESIDENCY_EU) || + adjustConfig.urlStrategy.equals(AdjustConfig.DATA_RESIDENCY_US) || + adjustConfig.urlStrategy.equals(AdjustConfig.DATA_RESIDENCY_TR))) { + logger.warn("Purchase verification not available for data residency users right now"); + return; + } + if (!checkActivityStateI(activityState)) { + AdjustPurchaseVerificationResult result = new AdjustPurchaseVerificationResult( + "not_verified", + 102, + "Purchase verification aborted because SDK is still not initialized"); + callback.onVerificationFinished(result); + logger.warn("Purchase verification aborted because SDK is still not initialized"); + return; + } + if (!isEnabledI()) { + AdjustPurchaseVerificationResult result = new AdjustPurchaseVerificationResult( + "not_verified", + 103, + "Purchase verification aborted because SDK is disabled"); + callback.onVerificationFinished(result); + logger.warn("Purchase verification aborted because SDK is disabled"); + return; + } + if (activityState.isGdprForgotten) { + AdjustPurchaseVerificationResult result = new AdjustPurchaseVerificationResult( + "not_verified", + 104, + "Purchase verification aborted because user is GDPR forgotten"); + callback.onVerificationFinished(result); + logger.warn("Purchase verification aborted because user is GDPR forgotten"); + return; + } + if (event == null) { + logger.warn("Purchase verification aborted because event instance is null"); + AdjustPurchaseVerificationResult verificationResult = + new AdjustPurchaseVerificationResult( + "not_verified", + 106, + "Purchase verification aborted because event instance is null"); + callback.onVerificationFinished(verificationResult); + return; + } + + long now = System.currentTimeMillis(); + PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, globalParameters, now); + ActivityPackage verificationPackage = packageBuilder.buildVerificationPackage(event, callback); + if (verificationPackage == null) { + logger.warn("Purchase verification aborted because verification package is null"); + AdjustPurchaseVerificationResult verificationResult = + new AdjustPurchaseVerificationResult( + "not_verified", + 107, + "Purchase verification aborted because verification package is null"); + callback.onVerificationFinished(verificationResult); + return; + } + purchaseVerificationHandler.sendPurchaseVerificationPackage(verificationPackage); + // TODO: TBD if this is the right timing + trackEventI(event); + } + private void setCoppaComplianceI(final boolean coppaEnabled) { if (activityState == null) { return; } if (!isEnabledI()) { return; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index a0995767e..13a0d6f55 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -450,6 +450,17 @@ public static void verifyPurchase(final AdjustPurchase purchase, final OnPurchas adjustInstance.verifyPurchase(purchase, callback); } + /** + * Verify in app purchase from Google Play and track Adjust event associated with it. + * + * @param event AdjustEvent object to be tracked + * @param callback Callback to obtain verification results + */ + public static void verifyAndTrack(final AdjustEvent event, OnPurchaseVerificationFinishedListener callback) { + AdjustInstance adjustInstance = Adjust.getDefaultInstance(); + adjustInstance.verifyAndTrack(event, callback); + } + /** * Used for testing purposes only. Do NOT use this method. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index f0193db0c..cee5705de 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -782,6 +782,26 @@ public void verifyPurchase(final AdjustPurchase purchase, final OnPurchaseVerifi activityHandler.verifyPurchase(purchase, callback); } + /** + * Verify in app purchase from Google Play and track Adjust event associated with it. + * + * @param event AdjustEvent to be tracked + * @param callback Callback to be pinged with the verification results + */ + public void verifyAndTrack(AdjustEvent event, OnPurchaseVerificationFinishedListener callback) { + if (!checkActivityHandler("verifyAndTrack")) { + if (callback != null) { + AdjustPurchaseVerificationResult result = new AdjustPurchaseVerificationResult( + "not_verified", + 100, + "SDK needs to be initialized before making purchase verification request"); + callback.onVerificationFinished(result); + } + return; + } + activityHandler.verifyAndTrack(event, callback); + } + /** * Used for testing purposes only. Do NOT use this method. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 51e8b6752..bd707e985 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -76,6 +76,8 @@ public interface IActivityHandler { void verifyPurchase(AdjustPurchase purchase, OnPurchaseVerificationFinishedListener callback); + void verifyAndTrack(AdjustEvent event, OnPurchaseVerificationFinishedListener callback); + void setCoppaCompliance(boolean enabled); void gotOptOutResponse(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 2f7fedc88..082302299 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -222,6 +222,17 @@ ActivityPackage buildVerificationPackage(AdjustPurchase purchase, OnPurchaseVeri return purchaseVerificationPackage; } + ActivityPackage buildVerificationPackage(AdjustEvent event, OnPurchaseVerificationFinishedListener callback) { + Map parameters = getVerificationParameters(event); + ActivityPackage purchaseVerificationPackage = getDefaultActivityPackage(ActivityKind.PURCHASE_VERIFICATION); + purchaseVerificationPackage.setPath("/verify"); + purchaseVerificationPackage.setSuffix(""); + purchaseVerificationPackage.setPurchaseVerificationCallback(callback); + + purchaseVerificationPackage.setParameters(parameters); + return purchaseVerificationPackage; + } + private Map getSessionParameters() { Map parameters = new HashMap(); @@ -1230,6 +1241,96 @@ private Map getVerificationParameters(AdjustPurchase purchase) { return parameters; } + private Map getVerificationParameters(AdjustEvent event) { + Map parameters = new HashMap(); + + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); + + // Check if plugin is used and if yes, add read parameters. + if (deviceInfo.imeiParameters != null) { + parameters.putAll(deviceInfo.imeiParameters); + } + + // Check if oaid plugin is used and if yes, add the parameter + if (deviceInfo.oaidParameters != null) { + parameters.putAll(deviceInfo.oaidParameters); + } + + // Device identifiers. + deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); + PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); + PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); + PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); + PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); + PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); + + if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { + logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + + "fallback to non Google Play and Fire identifiers will take place"); + deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); + } + + // Rest of the parameters. + PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); + PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); + PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); + PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); + PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); + PackageBuilder.addString(parameters, "country", deviceInfo.country); + PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); + PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); + PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); + PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); + PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); + PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); + PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); + PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); + PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); + PackageBuilder.addString(parameters, "environment", adjustConfig.environment); + PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); + PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); + PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); + PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); + PackageBuilder.addString(parameters, "installed_at", deviceInfo.appInstallTime); + PackageBuilder.addString(parameters, "language", deviceInfo.language); + PackageBuilder.addDuration(parameters, "last_interval", activityStateCopy.lastInterval); + PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); + PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); + PackageBuilder.addBoolean(parameters, "needs_response_details", true); + PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); + PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); + PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); + PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); + PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); + PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); + PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); + PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); + PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); + PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); + PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); + PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); + PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); + + // purchase verification specific parameters + PackageBuilder.addString(parameters, "product_id", event.getProductId()); + PackageBuilder.addString(parameters, "purchase_token", event.getPurchaseToken()); + PackageBuilder.addString(parameters, "event_token", event.getEventToken()); + PackageBuilder.addString(parameters, "currency", event.getCurrency()); + PackageBuilder.addDouble(parameters, "revenue", event.getRevenue()); + + // google play games + PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + + injectFeatureFlagsWithParameters(parameters); + + checkDeviceIds(parameters); + return parameters; + } + private ActivityPackage getDefaultActivityPackage(ActivityKind activityKind) { ActivityPackage activityPackage = new ActivityPackage(activityKind); activityPackage.setClientSdk(deviceInfo.clientSdk); From 6ce28af2cd25fb1bb1c2ee8500ae5eec7d999dd8 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 30 May 2024 17:18:58 +0200 Subject: [PATCH 220/540] refac: rename verifyAndTrack to verifyAndTrackPlayStorePurchase --- .../main/java/com/adjust/sdk/ActivityHandler.java | 12 +++++------- .../src/main/java/com/adjust/sdk/Adjust.java | 4 ++-- .../src/main/java/com/adjust/sdk/AdjustInstance.java | 4 ++-- .../main/java/com/adjust/sdk/IActivityHandler.java | 2 +- .../src/main/java/com/adjust/sdk/PackageBuilder.java | 1 - 5 files changed, 10 insertions(+), 13 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 1087ac5fa..ceb435219 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -815,11 +815,11 @@ public void run() { } @Override - public void verifyAndTrack(AdjustEvent event, OnPurchaseVerificationFinishedListener callback) { + public void verifyAndTrackPlayStorePurchase(AdjustEvent event, OnPurchaseVerificationFinishedListener callback) { executor.submit(new Runnable() { @Override public void run() { - verifyAndTrackI(event, callback); + verifyAndTrackPlayStorePurchaseI(event, callback); } }); } @@ -2586,16 +2586,14 @@ private void verifyPurchaseI(final AdjustPurchase purchase, final OnPurchaseVeri purchaseVerificationHandler.sendPurchaseVerificationPackage(verificationPackage); } - private void verifyAndTrackI(final AdjustEvent event, final OnPurchaseVerificationFinishedListener callback) { + private void verifyAndTrackPlayStorePurchaseI(final AdjustEvent event, + final OnPurchaseVerificationFinishedListener callback) { if (callback == null) { logger.warn("Purchase verification aborted because verification callback is null"); return; } // from this moment on we know that we can ping client callback in case of error - if (adjustConfig.urlStrategy != null && - (adjustConfig.urlStrategy.equals(AdjustConfig.DATA_RESIDENCY_EU) || - adjustConfig.urlStrategy.equals(AdjustConfig.DATA_RESIDENCY_US) || - adjustConfig.urlStrategy.equals(AdjustConfig.DATA_RESIDENCY_TR))) { + if (adjustConfig.isDataResidency) { logger.warn("Purchase verification not available for data residency users right now"); return; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 13a0d6f55..d9f451c17 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -456,9 +456,9 @@ public static void verifyPurchase(final AdjustPurchase purchase, final OnPurchas * @param event AdjustEvent object to be tracked * @param callback Callback to obtain verification results */ - public static void verifyAndTrack(final AdjustEvent event, OnPurchaseVerificationFinishedListener callback) { + public static void verifyAndTrackPlayStorePurchase(final AdjustEvent event, OnPurchaseVerificationFinishedListener callback) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.verifyAndTrack(event, callback); + adjustInstance.verifyAndTrackPlayStorePurchase(event, callback); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index cee5705de..d0dcc8239 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -788,7 +788,7 @@ public void verifyPurchase(final AdjustPurchase purchase, final OnPurchaseVerifi * @param event AdjustEvent to be tracked * @param callback Callback to be pinged with the verification results */ - public void verifyAndTrack(AdjustEvent event, OnPurchaseVerificationFinishedListener callback) { + public void verifyAndTrackPlayStorePurchase(AdjustEvent event, OnPurchaseVerificationFinishedListener callback) { if (!checkActivityHandler("verifyAndTrack")) { if (callback != null) { AdjustPurchaseVerificationResult result = new AdjustPurchaseVerificationResult( @@ -799,7 +799,7 @@ public void verifyAndTrack(AdjustEvent event, OnPurchaseVerificationFinishedList } return; } - activityHandler.verifyAndTrack(event, callback); + activityHandler.verifyAndTrackPlayStorePurchase(event, callback); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index bd707e985..bc0da7e1b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -76,7 +76,7 @@ public interface IActivityHandler { void verifyPurchase(AdjustPurchase purchase, OnPurchaseVerificationFinishedListener callback); - void verifyAndTrack(AdjustEvent event, OnPurchaseVerificationFinishedListener callback); + void verifyAndTrackPlayStorePurchase(AdjustEvent event, OnPurchaseVerificationFinishedListener callback); void setCoppaCompliance(boolean enabled); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 082302299..3b5e45d2b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -1291,7 +1291,6 @@ private Map getVerificationParameters(AdjustEvent event) { PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); From 30288867639858b3b48223816b9bd2f9cc4e2d67 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 30 May 2024 17:22:03 +0200 Subject: [PATCH 221/540] refac: rename verifyPurchase to verifyPlayStorePurchase --- .../main/java/com/adjust/sdk/ActivityHandler.java | 12 +++++++++--- .../src/main/java/com/adjust/sdk/Adjust.java | 5 +++-- .../src/main/java/com/adjust/sdk/AdjustInstance.java | 5 +++-- .../main/java/com/adjust/sdk/IActivityHandler.java | 2 +- .../com/adjust/testapp/AdjustCommandExecutor.java | 2 +- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index ceb435219..0e390ea44 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -805,11 +805,11 @@ public void run() { } @Override - public void verifyPurchase(final AdjustPurchase purchase, final OnPurchaseVerificationFinishedListener callback) { + public void verifyPlayStorePurchase(final AdjustPurchase purchase, final OnPurchaseVerificationFinishedListener callback) { executor.submit(new Runnable() { @Override public void run() { - verifyPurchaseI(purchase, callback); + verifyPlayStorePurchaseI(purchase, callback); } }); } @@ -2515,7 +2515,8 @@ private void trackPlayStoreSubscriptionI(final AdjustPlayStoreSubscription subsc packageHandler.sendFirstPackage(); } - private void verifyPurchaseI(final AdjustPurchase purchase, final OnPurchaseVerificationFinishedListener callback) { + private void verifyPlayStorePurchaseI(final AdjustPurchase purchase, + final OnPurchaseVerificationFinishedListener callback) { if (callback == null) { logger.warn("Purchase verification aborted because verification callback is null"); return; @@ -2595,6 +2596,11 @@ private void verifyAndTrackPlayStorePurchaseI(final AdjustEvent event, // from this moment on we know that we can ping client callback in case of error if (adjustConfig.isDataResidency) { logger.warn("Purchase verification not available for data residency users right now"); + AdjustPurchaseVerificationResult result = new AdjustPurchaseVerificationResult( + "not_verified", + 109, + "Purchase verification not available for data residency users right now"); + callback.onVerificationFinished(result); return; } if (!checkActivityStateI(activityState)) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index d9f451c17..dcfa34897 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -441,13 +441,14 @@ public static void getSdkVersion(final OnSdkVersionReadListener onSdkVersionRead * @param purchase AdjustPurchase object to be tracked * @param callback Callback to obtain verification results */ - public static void verifyPurchase(final AdjustPurchase purchase, final OnPurchaseVerificationFinishedListener callback) { + public static void verifyPlayStorePurchase(final AdjustPurchase purchase, + final OnPurchaseVerificationFinishedListener callback) { if (callback == null) { AdjustFactory.getLogger().error("Purchase verification aborted because verification callback is null"); return; } AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.verifyPurchase(purchase, callback); + adjustInstance.verifyPlayStorePurchase(purchase, callback); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index d0dcc8239..21a1370cc 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -770,7 +770,8 @@ private boolean isInstanceEnabled() { * @param purchase AdjustPurchase object to be verified * @param callback Callback to be pinged with the verification results */ - public void verifyPurchase(final AdjustPurchase purchase, final OnPurchaseVerificationFinishedListener callback) { + public void verifyPlayStorePurchase(final AdjustPurchase purchase, + final OnPurchaseVerificationFinishedListener callback) { if (!checkActivityHandler("verifyPurchase")) { AdjustPurchaseVerificationResult result = new AdjustPurchaseVerificationResult( "not_verified", @@ -779,7 +780,7 @@ public void verifyPurchase(final AdjustPurchase purchase, final OnPurchaseVerifi callback.onVerificationFinished(result); return; } - activityHandler.verifyPurchase(purchase, callback); + activityHandler.verifyPlayStorePurchase(purchase, callback); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index bc0da7e1b..33aa51b9b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -74,7 +74,7 @@ public interface IActivityHandler { void trackPlayStoreSubscription(AdjustPlayStoreSubscription subscription); - void verifyPurchase(AdjustPurchase purchase, OnPurchaseVerificationFinishedListener callback); + void verifyPlayStorePurchase(AdjustPurchase purchase, OnPurchaseVerificationFinishedListener callback); void verifyAndTrackPlayStorePurchase(AdjustEvent event, OnPurchaseVerificationFinishedListener callback); diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index fbc8cde77..0b0e1bf42 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -794,7 +794,7 @@ private void verifyPurchase() { final String localBasePath = basePath; AdjustPurchase purchase = new AdjustPurchase(sku, purchaseToken); - Adjust.verifyPurchase(purchase, new OnPurchaseVerificationFinishedListener() { + Adjust.verifyPlayStorePurchase(purchase, new OnPurchaseVerificationFinishedListener() { @Override public void onVerificationFinished(AdjustPurchaseVerificationResult result) { MainActivity.testLibrary.addInfoToSend("verification_status", result.getVerificationStatus()); From 562c5f95ab672724de7f7cbe566015c44144393f Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 30 May 2024 17:23:19 +0200 Subject: [PATCH 222/540] refac: rename AdjustPurchase to AdjustPlayStorePurchase --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 4 ++-- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- .../sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java | 2 +- .../sdk/{AdjustPurchase.java => AdjustPlayStorePurchase.java} | 4 ++-- .../src/main/java/com/adjust/sdk/IActivityHandler.java | 2 +- .../sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java | 4 ++-- .../main/java/com/adjust/testapp/AdjustCommandExecutor.java | 4 ++-- 7 files changed, 11 insertions(+), 11 deletions(-) rename Adjust/sdk-core/src/main/java/com/adjust/sdk/{AdjustPurchase.java => AdjustPlayStorePurchase.java} (71%) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 0e390ea44..5ab47ade9 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -805,7 +805,7 @@ public void run() { } @Override - public void verifyPlayStorePurchase(final AdjustPurchase purchase, final OnPurchaseVerificationFinishedListener callback) { + public void verifyPlayStorePurchase(final AdjustPlayStorePurchase purchase, final OnPurchaseVerificationFinishedListener callback) { executor.submit(new Runnable() { @Override public void run() { @@ -2515,7 +2515,7 @@ private void trackPlayStoreSubscriptionI(final AdjustPlayStoreSubscription subsc packageHandler.sendFirstPackage(); } - private void verifyPlayStorePurchaseI(final AdjustPurchase purchase, + private void verifyPlayStorePurchaseI(final AdjustPlayStorePurchase purchase, final OnPurchaseVerificationFinishedListener callback) { if (callback == null) { logger.warn("Purchase verification aborted because verification callback is null"); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index dcfa34897..2284059ae 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -441,7 +441,7 @@ public static void getSdkVersion(final OnSdkVersionReadListener onSdkVersionRead * @param purchase AdjustPurchase object to be tracked * @param callback Callback to obtain verification results */ - public static void verifyPlayStorePurchase(final AdjustPurchase purchase, + public static void verifyPlayStorePurchase(final AdjustPlayStorePurchase purchase, final OnPurchaseVerificationFinishedListener callback) { if (callback == null) { AdjustFactory.getLogger().error("Purchase verification aborted because verification callback is null"); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 21a1370cc..530bd0e2f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -770,7 +770,7 @@ private boolean isInstanceEnabled() { * @param purchase AdjustPurchase object to be verified * @param callback Callback to be pinged with the verification results */ - public void verifyPlayStorePurchase(final AdjustPurchase purchase, + public void verifyPlayStorePurchase(final AdjustPlayStorePurchase purchase, final OnPurchaseVerificationFinishedListener callback) { if (!checkActivityHandler("verifyPurchase")) { AdjustPurchaseVerificationResult result = new AdjustPurchaseVerificationResult( diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustPurchase.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustPlayStorePurchase.java similarity index 71% rename from Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustPurchase.java rename to Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustPlayStorePurchase.java index 25e32ed1d..20361f446 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustPurchase.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustPlayStorePurchase.java @@ -1,10 +1,10 @@ package com.adjust.sdk; -public class AdjustPurchase { +public class AdjustPlayStorePurchase { private final String productId; private final String purchaseToken; - public AdjustPurchase(final String productId, final String purchaseToken) { + public AdjustPlayStorePurchase(final String productId, final String purchaseToken) { this.productId = productId; this.purchaseToken = purchaseToken; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 33aa51b9b..a61b57d8e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -74,7 +74,7 @@ public interface IActivityHandler { void trackPlayStoreSubscription(AdjustPlayStoreSubscription subscription); - void verifyPlayStorePurchase(AdjustPurchase purchase, OnPurchaseVerificationFinishedListener callback); + void verifyPlayStorePurchase(AdjustPlayStorePurchase purchase, OnPurchaseVerificationFinishedListener callback); void verifyAndTrackPlayStorePurchase(AdjustEvent event, OnPurchaseVerificationFinishedListener callback); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 3b5e45d2b..3cada16bb 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -211,7 +211,7 @@ ActivityPackage buildSubscriptionPackage(AdjustPlayStoreSubscription subscriptio return subscriptionPackage; } - ActivityPackage buildVerificationPackage(AdjustPurchase purchase, OnPurchaseVerificationFinishedListener callback) { + ActivityPackage buildVerificationPackage(AdjustPlayStorePurchase purchase, OnPurchaseVerificationFinishedListener callback) { Map parameters = getVerificationParameters(purchase); ActivityPackage purchaseVerificationPackage = getDefaultActivityPackage(ActivityKind.PURCHASE_VERIFICATION); purchaseVerificationPackage.setPath("/verify"); @@ -1151,7 +1151,7 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio return parameters; } - private Map getVerificationParameters(AdjustPurchase purchase) { + private Map getVerificationParameters(AdjustPlayStorePurchase purchase) { Map parameters = new HashMap(); deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 0b0e1bf42..3a1613ac8 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -18,7 +18,7 @@ import com.adjust.sdk.AdjustEventFailure; import com.adjust.sdk.AdjustEventSuccess; import com.adjust.sdk.AdjustPlayStoreSubscription; -import com.adjust.sdk.AdjustPurchase; +import com.adjust.sdk.AdjustPlayStorePurchase; import com.adjust.sdk.AdjustPurchaseVerificationResult; import com.adjust.sdk.AdjustSessionFailure; import com.adjust.sdk.AdjustSessionSuccess; @@ -793,7 +793,7 @@ private void verifyPurchase() { String purchaseToken = command.getFirstParameterValue("purchaseToken"); final String localBasePath = basePath; - AdjustPurchase purchase = new AdjustPurchase(sku, purchaseToken); + AdjustPlayStorePurchase purchase = new AdjustPlayStorePurchase(sku, purchaseToken); Adjust.verifyPlayStorePurchase(purchase, new OnPurchaseVerificationFinishedListener() { @Override public void onVerificationFinished(AdjustPurchaseVerificationResult result) { From a630f4629149320a9af4fee0f9bf7af8c23e9a78 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 30 May 2024 17:24:09 +0200 Subject: [PATCH 223/540] chore: remove todo comment --- .../sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 5ab47ade9..08081c42f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -2655,7 +2655,6 @@ private void verifyAndTrackPlayStorePurchaseI(final AdjustEvent event, return; } purchaseVerificationHandler.sendPurchaseVerificationPackage(verificationPackage); - // TODO: TBD if this is the right timing trackEventI(event); } From 2396f5205d27bf0143469e6aefe29088d5568864 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 30 May 2024 19:15:48 +0200 Subject: [PATCH 224/540] fix: remove remainings of the event buffering removal --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 08081c42f..2ed704297 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -2154,12 +2154,9 @@ private void updateHandlersStatusAndSendI() { } resumeSendingI(); - // if it's the first launch and it hasn't received the session response - if ((internalState.isFirstLaunch() && internalState.hasSessionResponseNotBeenProcessed())) - { - // try to send - packageHandler.sendFirstPackage(); - } + + // try to send + packageHandler.sendFirstPackage(); } private void pauseSendingI() { From d74fb1923579a31e2397eb776e73eea1875d9dcd Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 31 May 2024 10:06:07 +0200 Subject: [PATCH 225/540] refac: rename deeplink to deferred deeplink listener --- .../com/adjust/examples/GlobalApplication.java | 7 ++----- .../examples/keyboard/GlobalApplication.java | 4 ++-- .../java/com/adjust/examples/GlobalApplication.kt | 2 +- .../com/adjust/examples/GlobalApplication.java | 4 ++-- .../main/java/com/adjust/sdk/ActivityHandler.java | 4 ++-- .../src/main/java/com/adjust/sdk/AdjustConfig.java | 14 +++++--------- ...ava => OnDeferredDeeplinkResponseListener.java} | 2 +- .../adjust/sdk/webbridge/AdjustBridgeInstance.java | 5 ++--- .../com/adjust/testapp/AdjustCommandExecutor.java | 6 +++--- 9 files changed, 20 insertions(+), 28 deletions(-) rename Adjust/sdk-core/src/main/java/com/adjust/sdk/{OnDeeplinkResponseListener.java => OnDeferredDeeplinkResponseListener.java} (72%) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 3ff7c24c3..bba4d8d60 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -19,16 +19,13 @@ import com.adjust.sdk.OnAmazonAdIdReadListener; import com.adjust.sdk.OnAttributionChangedListener; import com.adjust.sdk.OnAttributionReadListener; -import com.adjust.sdk.OnDeeplinkResponseListener; +import com.adjust.sdk.OnDeferredDeeplinkResponseListener; import com.adjust.sdk.OnEventTrackingFailedListener; import com.adjust.sdk.OnEventTrackingSucceededListener; import com.adjust.sdk.OnGooglePlayInstallReferrerReadListener; import com.adjust.sdk.OnSessionTrackingFailedListener; import com.adjust.sdk.OnSessionTrackingSucceededListener; -import java.util.ArrayList; -import java.util.List; - /** * Created by pfms on 17/12/14. */ @@ -101,7 +98,7 @@ public void onFinishedSessionTrackingFailed(AdjustSessionFailure sessionFailureR }); // Evaluate deferred deep link to be launched. - config.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() { + config.setOnDeferredDeeplinkResponseListener(new OnDeferredDeeplinkResponseListener() { @Override public boolean launchReceivedDeeplink(Uri deeplink) { Log.d("example", "Deferred deep link callback called!"); diff --git a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java index 215e64d07..5f49819b3 100644 --- a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java +++ b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java @@ -13,7 +13,7 @@ import com.adjust.sdk.AdjustEventSuccess; import com.adjust.sdk.LogLevel; import com.adjust.sdk.OnAttributionChangedListener; -import com.adjust.sdk.OnDeeplinkResponseListener; +import com.adjust.sdk.OnDeferredDeeplinkResponseListener; import com.adjust.sdk.OnEventTrackingFailedListener; import com.adjust.sdk.OnEventTrackingSucceededListener; import com.adjust.sdk.OnSessionTrackingFailedListener; @@ -84,7 +84,7 @@ public void onFinishedSessionTrackingFailed(AdjustSessionFailure sessionFailureR }); // Evaluate deferred deep link to be launched. - config.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() { + config.setOnDeferredDeeplinkResponseListener(new OnDeferredDeeplinkResponseListener() { @Override public boolean launchReceivedDeeplink(Uri deeplink) { Log.d("example", "Deferred deep link callback called!"); diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt index 624fec504..d5f00cd6f 100644 --- a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt +++ b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt @@ -52,7 +52,7 @@ class GlobalApplication : Application() { } // Evaluate deferred deep link to be launched. - config.setOnDeeplinkResponseListener { deeplink -> + config.setOnDeferredDeeplinkResponseListener { deeplink -> Log.d("example", "Deferred deep link callback called!") Log.d("example", "Deep link URL: $deeplink") diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java index 03d739ad9..7b61ce37f 100755 --- a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java @@ -13,7 +13,7 @@ import com.adjust.sdk.AdjustEventSuccess; import com.adjust.sdk.LogLevel; import com.adjust.sdk.OnAttributionChangedListener; -import com.adjust.sdk.OnDeeplinkResponseListener; +import com.adjust.sdk.OnDeferredDeeplinkResponseListener; import com.adjust.sdk.OnEventTrackingFailedListener; import com.adjust.sdk.OnEventTrackingSucceededListener; import com.adjust.sdk.OnSessionTrackingFailedListener; @@ -81,7 +81,7 @@ public void onFinishedSessionTrackingFailed(AdjustSessionFailure sessionFailureR }); // Evaluate deferred deep link to be launched. - config.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() { + config.setOnDeferredDeeplinkResponseListener(new OnDeferredDeeplinkResponseListener() { @Override public boolean launchReceivedDeeplink(Uri deeplink) { Log.d("example", "Deferred deep link callback called!"); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 2ed704297..dc4582d17 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1842,8 +1842,8 @@ public void run() { return; } boolean toLaunchDeeplink = true; - if (adjustConfig.onDeeplinkResponseListener != null) { - toLaunchDeeplink = adjustConfig.onDeeplinkResponseListener.launchReceivedDeeplink(deeplink); + if (adjustConfig.onDeferredDeeplinkResponseListener != null) { + toLaunchDeeplink = adjustConfig.onDeferredDeeplinkResponseListener.launchReceivedDeeplink(deeplink); } if (toLaunchDeeplink) { launchDeeplinkMain(deeplinkIntent, deeplink); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index d9e103b6c..6bf30716b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -25,7 +25,7 @@ public class AdjustConfig { OnEventTrackingFailedListener onEventTrackingFailedListener; OnSessionTrackingSucceededListener onSessionTrackingSucceededListener; OnSessionTrackingFailedListener onSessionTrackingFailedListener; - OnDeeplinkResponseListener onDeeplinkResponseListener; + OnDeferredDeeplinkResponseListener onDeferredDeeplinkResponseListener; boolean sendInBackground; AdjustInstance.PreLaunchActions preLaunchActions; ILogger logger; @@ -107,10 +107,6 @@ public void setOnAttributionChangedListener(OnAttributionChangedListener onAttri this.onAttributionChangedListener = onAttributionChangedListener; } - public void setDeepLinkComponent(Class deepLinkComponent) { - this.deepLinkComponent = deepLinkComponent; - } - public void setOnEventTrackingSucceededListener(OnEventTrackingSucceededListener onEventTrackingSucceededListener) { this.onEventTrackingSucceededListener = onEventTrackingSucceededListener; } @@ -127,8 +123,8 @@ public void setOnSessionTrackingFailedListener(OnSessionTrackingFailedListener o this.onSessionTrackingFailedListener = onSessionTrackingFailedListener; } - public void setOnDeeplinkResponseListener(OnDeeplinkResponseListener onDeeplinkResponseListener) { - this.onDeeplinkResponseListener = onDeeplinkResponseListener; + public void setOnDeferredDeeplinkResponseListener(OnDeferredDeeplinkResponseListener onDeferredDeeplinkResponseListener) { + this.onDeferredDeeplinkResponseListener = onDeferredDeeplinkResponseListener; } public void setExternalDeviceId(String externalDeviceId) { @@ -245,8 +241,8 @@ public OnSessionTrackingFailedListener getOnSessionTrackingFailedListener() { return onSessionTrackingFailedListener; } - public OnDeeplinkResponseListener getOnDeeplinkResponseListener() { - return onDeeplinkResponseListener; + public OnDeferredDeeplinkResponseListener getOnDeeplinkResponseListener() { + return onDeferredDeeplinkResponseListener; } public boolean isSendInBackground() { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnDeeplinkResponseListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnDeferredDeeplinkResponseListener.java similarity index 72% rename from Adjust/sdk-core/src/main/java/com/adjust/sdk/OnDeeplinkResponseListener.java rename to Adjust/sdk-core/src/main/java/com/adjust/sdk/OnDeferredDeeplinkResponseListener.java index 6075055ad..70762d87a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnDeeplinkResponseListener.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnDeferredDeeplinkResponseListener.java @@ -5,6 +5,6 @@ /** * Created by pfms on 22/03/16. */ -public interface OnDeeplinkResponseListener { +public interface OnDeferredDeeplinkResponseListener { boolean launchReceivedDeeplink(Uri deeplink); } diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index b3b89855e..6c114caaa 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -24,7 +24,7 @@ import com.adjust.sdk.OnAmazonAdIdReadListener; import com.adjust.sdk.OnAttributionChangedListener; import com.adjust.sdk.OnAttributionReadListener; -import com.adjust.sdk.OnDeeplinkResponseListener; +import com.adjust.sdk.OnDeferredDeeplinkResponseListener; import com.adjust.sdk.OnDeviceIdsRead; import com.adjust.sdk.OnEventTrackingFailedListener; import com.adjust.sdk.OnEventTrackingSucceededListener; @@ -38,7 +38,6 @@ import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; /** * Created by uerceg on 22/07/16. @@ -309,7 +308,7 @@ public void onFinishedSessionTrackingFailed(AdjustSessionFailure failureResponse // Deferred deeplink callback final String deferredDeeplinkCallbackName = AdjustBridgeUtil.fieldToString(deferredDeeplinkCallbackNameField); if (deferredDeeplinkCallbackName != null) { - adjustConfig.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() { + adjustConfig.setOnDeferredDeeplinkResponseListener(new OnDeferredDeeplinkResponseListener() { @Override public boolean launchReceivedDeeplink(Uri deeplink) { AdjustBridgeUtil.execSingleValueCallback(webView, deferredDeeplinkCallbackName, deeplink.toString()); diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 3a1613ac8..3b178053a 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -27,7 +27,7 @@ import com.adjust.sdk.LogLevel; import com.adjust.sdk.OnAttributionChangedListener; import com.adjust.sdk.OnDeeplinkResolvedListener; -import com.adjust.sdk.OnDeeplinkResponseListener; +import com.adjust.sdk.OnDeferredDeeplinkResponseListener; import com.adjust.sdk.OnEventTrackingFailedListener; import com.adjust.sdk.OnEventTrackingSucceededListener; import com.adjust.sdk.OnPurchaseVerificationFinishedListener; @@ -315,7 +315,7 @@ private void config() { } if(command.containsParameter("deferredDeeplinkCallback")) { - adjustConfig.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() { + adjustConfig.setOnDeferredDeeplinkResponseListener(new OnDeferredDeeplinkResponseListener() { @Override public boolean launchReceivedDeeplink(Uri deeplink) { if (deeplink == null) { @@ -439,7 +439,7 @@ public void onFinishedEventTrackingFailed(AdjustEventFailure eventFailureRespons String launchDeferredDeeplinkS = command.getFirstParameterValue("deferredDeeplinkCallback"); final boolean launchDeferredDeeplink = "true".equals(launchDeferredDeeplinkS); final String localBasePath = basePath; - adjustConfig.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() { + adjustConfig.setOnDeferredDeeplinkResponseListener(new OnDeferredDeeplinkResponseListener() { @Override public boolean launchReceivedDeeplink(Uri deeplink) { Log.d("TestApp", "deferred_deep_link = " + deeplink.toString()); From 615dc655c0798e69fd2078776f61aa24d40a9a9d Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 30 May 2024 20:52:21 +0200 Subject: [PATCH 226/540] feat: use continue_in in package queue --- .../java/com/adjust/sdk/PackageHandler.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java index 6d66f1950..b23a34167 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java @@ -138,7 +138,7 @@ public void onResponseDataCallback(final ResponseData responseData) { scheduler.submit(new Runnable() { @Override public void run() { - sendNextI(); + sendNextI(responseData.continueIn); } }); @@ -286,7 +286,7 @@ private Map generateSendingParametersI() { return sendingParameters; } - private void sendNextI() { + private void sendNextI(Long previousResponseContinueIn) { isRetrying = false; retryStartedAtTimeMilliSeconds = 0; @@ -299,9 +299,25 @@ private void sendNextI() { packageQueue.remove(0); writePackageQueueI(); - isSending.set(false); - logger.verbose("Package handler can send"); - sendFirstI(); + + if (previousResponseContinueIn != null) { + Runnable runnable = new Runnable() { + @Override + public void run() { + logger.verbose("Package handler finished waiting to continue"); + isSending.set(false); + sendFirstPackage(); + } + }; + + logger.verbose("Waiting for %d seconds before continuing for next package in continue_in", previousResponseContinueIn / 1000.0); + scheduler.schedule(runnable, previousResponseContinueIn); + + } else { + logger.verbose("Package handler can send"); + isSending.set(false); + sendFirstI(); + } } private void flushI() { From 71a6c75805d5f2014559d566d133f58f47ccef78 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 30 May 2024 22:21:44 +0200 Subject: [PATCH 227/540] fix: check for continueIn value --- .../sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java index b23a34167..02785193e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java @@ -300,7 +300,7 @@ private void sendNextI(Long previousResponseContinueIn) { packageQueue.remove(0); writePackageQueueI(); - if (previousResponseContinueIn != null) { + if (previousResponseContinueIn != null && previousResponseContinueIn > 0) { Runnable runnable = new Runnable() { @Override public void run() { From b8c38297cbf7bba490b5c0b5e6a6f245cf9105f7 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 31 May 2024 13:06:04 +0200 Subject: [PATCH 228/540] refac: clean up adjust config api and its usage --- .../adjust/examples/GlobalApplication.java | 111 +--------- .../examples/keyboard/GlobalApplication.java | 2 +- .../com/adjust/examples/GlobalApplication.kt | 49 +---- .../adjust/examples/GlobalApplication.java | 2 +- .../main/assets/AdjustExample-WebView.html | 4 - .../java/com/adjust/sdk/ActivityHandler.java | 16 +- .../java/com/adjust/sdk/AdjustConfig.java | 202 +++++++++--------- .../main/java/com/adjust/sdk/DeviceInfo.java | 4 +- .../java/com/adjust/sdk/PackageBuilder.java | 20 +- .../src/main/assets/adjust.js | 53 ++--- .../src/main/assets/adjust_config.js | 24 +-- .../sdk/webbridge/AdjustBridgeInstance.java | 46 ++-- .../adjust/testapp/AdjustCommandExecutor.java | 23 +- .../src/main/assets/command_executor.js | 25 ++- 14 files changed, 213 insertions(+), 368 deletions(-) diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index bba4d8d60..25babb14c 100644 --- a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -30,7 +30,6 @@ * Created by pfms on 17/12/14. */ public class GlobalApplication extends Application { - @Override public void onCreate() { super.onCreate(); @@ -62,14 +61,6 @@ public void onFinishedEventTrackingSucceeded(AdjustEventSuccess eventSuccessResp } }); - - // Set url strategy -// List urlStrategy = new ArrayList<>(); -// urlStrategy.add("adjust.com"); -// urlStrategy.add("adjust.cn"); -// urlStrategy.add("eu.adjust.com"); -// config.setUrlStrategy(urlStrategy , true, false); - // Set event failure tracking delegate. config.setOnEventTrackingFailedListener(new OnEventTrackingFailedListener() { @Override @@ -108,17 +99,8 @@ public boolean launchReceivedDeeplink(Uri deeplink) { } }); - // Set default tracker. - // config.setDefaultTracker("{YourDefaultTracker}"); - - // Set process name. - // config.setProcessName("com.adjust.examples"); - // Allow to send in the background. - config.setSendInBackground(true); - - // Allow tracking preinstall - // config.setPreinstallTrackingEnabled(true); + config.enableSendingInBackground(); // Add session callback parameters. Adjust.addGlobalCallbackParameter("sc_foo", "sc_bar"); @@ -152,96 +134,5 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Initialise the adjust SDK. Adjust.initSdk(config); - - - - - Adjust.getAttribution(new OnAttributionReadListener() { - @Override - public void onAttributionRead(AdjustAttribution attribution) { - Log.d("example", "Attribution callback called!"); - Log.d("example", "Attribution: " + attribution.toString()); - } - }); - - // Get the adid. - Adjust.getAdid(new OnAdidReadListener() { - @Override - public void onAdidRead(String adid) { - Log.d("example", "Adid callback called!"); - Log.d("example", "Adid: " + adid); - } - }); - - Adjust.getGooglePlayInstallReferrer(this, new OnGooglePlayInstallReferrerReadListener() { - @Override - public void onInstallReferrerRead(GooglePlayInstallReferrerDetails referrerDetails) { - Log.d("example", "referrerApi : " + referrerDetails.toString()); - } - - @Override - public void onFailure(String message) { - Log.d("example", "failed : " + message); - - } - }); - - // Register onResume and onPause events of all activities - // for applications with minSdkVersion >= 14. - registerActivityLifecycleCallbacks(new AdjustLifecycleCallbacks()); - - Adjust.getAmazonAdId(this, new OnAmazonAdIdReadListener() { - @Override - public void onAmazonAdIdRead(String amazonAdId) { - Log.d("example", "amazonAdId : " + amazonAdId); - } - - @Override - public void onFail(String message) { - Log.d("example", "failed : " + message); - } - }); - - // Put the SDK in offline mode. - // Adjust.switchToOfflineMode(); - - // Disable the SDK - // Adjust.disable(); - - // Send push notification token. - // Adjust.setPushToken("token"); - } - - // You can use this class if your app is for Android 4.0 or higher - private static final class AdjustLifecycleCallbacks implements ActivityLifecycleCallbacks { - @Override - public void onActivityResumed(Activity activity) { - Adjust.onResume(); - } - - @Override - public void onActivityPaused(Activity activity) { - Adjust.onPause(); - } - - @Override - public void onActivityStopped(Activity activity) { - } - - @Override - public void onActivitySaveInstanceState(Activity activity, Bundle outState) { - } - - @Override - public void onActivityDestroyed(Activity activity) { - } - - @Override - public void onActivityCreated(Activity activity, Bundle savedInstanceState) { - } - - @Override - public void onActivityStarted(Activity activity) { - } } } diff --git a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java index 5f49819b3..b0919b818 100644 --- a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java +++ b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java @@ -101,7 +101,7 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // config.setProcessName("com.adjust.examples"); // Allow to send in the background. - config.setSendInBackground(true); + config.enableSendingInBackground(true); // Add session callback parameters. Adjust.addGlobalCallbackParameter("sc_foo", "sc_bar"); diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt index d5f00cd6f..5204dcad4 100644 --- a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt +++ b/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt @@ -1,8 +1,6 @@ package com.adjust.examples -import android.app.Activity import android.app.Application -import android.os.Bundle import android.util.Log import com.adjust.sdk.Adjust import com.adjust.sdk.AdjustConfig @@ -59,18 +57,8 @@ class GlobalApplication : Application() { true } - // Set default tracker. - // config.setDefaultTracker("{YourDefaultTracker}"); - - // Set process name. - // config.setProcessName("com.adjust.examples"); - // Allow to send in the background. - config.setSendInBackground(true) - - - // Allow tracking preinstall - // config.setPreinstallTrackingEnabled(true); + config.enableSendingInBackground() // Add session callback parameters. Adjust.addGlobalCallbackParameter("sc_foo", "sc_bar") @@ -104,40 +92,5 @@ class GlobalApplication : Application() { // Initialise the adjust SDK. Adjust.initSdk(config) - - // Register onResume and onPause events of all activities - // for applications with minSdkVersion >= 14. - registerActivityLifecycleCallbacks(AdjustLifecycleCallbacks()) - - // Put the SDK in offline mode. - // Adjust.switchToOfflineMode(); - - // Disable the SDK - // Adjust.disable(); - - // Send push notification token. - // Adjust.setPushToken("token"); - - } - - // You can use this class if your app is for Android 4.0 or higher - private class AdjustLifecycleCallbacks : Application.ActivityLifecycleCallbacks { - override fun onActivityResumed(activity: Activity) { - Adjust.onResume() - } - - override fun onActivityPaused(activity: Activity) { - Adjust.onPause() - } - - override fun onActivityStopped(activity: Activity) {} - - override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} - - override fun onActivityDestroyed(activity: Activity) {} - - override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {} - - override fun onActivityStarted(activity: Activity) {} } } diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java index 7b61ce37f..d4dccd525 100755 --- a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java @@ -98,7 +98,7 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // config.setProcessName("com.adjust.examples"); // Allow to send in the background. - config.setSendInBackground(true); + config.enableSendingInBackground(true); // Add session callback parameters. Adjust.addGlobalCallbackParameter("sc_foo", "sc_bar"); diff --git a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html index bca5cfab1..845ab2c2a 100755 --- a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html +++ b/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html @@ -62,8 +62,6 @@

Adjust Web View SDK Demo var adjustConfig = new AdjustConfig('2fm9gkqubvpc', AdjustConfig.EnvironmentSandbox); adjustConfig.setLogLevel(AdjustConfig.LogLevelVerbose); - // adjustConfig.setOpenDeferredDeeplink(true); - // adjustConfig.setSendInBackground(true); adjustConfig.setAttributionCallback(attributionCallback); adjustConfig.setEventSuccessCallback(eventSuccessCallback); @@ -72,8 +70,6 @@

Adjust Web View SDK Demo adjustConfig.setSessionFailureCallback(sessionFailureCallback); adjustConfig.setDeferredDeeplinkCallback(deferredDeeplinkCallback); - - Adjust.initSdk(adjustConfig); window.onload = function() { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index dc4582d17..9a5be54f4 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -948,7 +948,7 @@ public void run() { }, FOREGROUND_TIMER_START, FOREGROUND_TIMER_INTERVAL, FOREGROUND_TIMER_NAME); // create background timer - if (adjustConfig.sendInBackground) { + if (adjustConfig.isSendingInBackgroundEnabled) { logger.info("Send in background configured"); backgroundTimer = new TimerOnce(new Runnable() { @@ -1122,7 +1122,7 @@ private void checkForPreinstallI() { // sending preinstall referrer doesn't require preinstall tracking flag to be enabled sendPreinstallReferrerI(); - if (!adjustConfig.preinstallTrackingEnabled) return; + if (!adjustConfig.isPreinstallTrackingEnabled) return; if (internalState.hasPreinstallBeenRead()) return; if (deviceInfo.packageName == null || deviceInfo.packageName.isEmpty()) { @@ -1596,7 +1596,7 @@ private void trackEventI(AdjustEvent event) { packageHandler.sendFirstPackage(); // if it is in the background and it can send, start the background timer - if (adjustConfig.sendInBackground && internalState.isInBackground()) { + if (adjustConfig.isSendingInBackgroundEnabled && internalState.isInBackground()) { startBackgroundTimerI(); } @@ -1855,15 +1855,9 @@ public void run() { private Intent createDeeplinkIntentI(Uri deeplink) { Intent mapIntent; - if (adjustConfig.deepLinkComponent == null) { - mapIntent = new Intent(Intent.ACTION_VIEW, deeplink); - } else { - mapIntent = new Intent(Intent.ACTION_VIEW, deeplink, adjustConfig.context, adjustConfig.deepLinkComponent); - } + mapIntent = new Intent(Intent.ACTION_VIEW, deeplink); mapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - mapIntent.setPackage(adjustConfig.context.getPackageName()); - return mapIntent; } @@ -2875,7 +2869,7 @@ private boolean toSendI(boolean sdkClickHandlerOnly) { } // has the option to send in the background -> is to send - if (adjustConfig.sendInBackground) { + if (adjustConfig.isSendingInBackgroundEnabled) { return true; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 6bf30716b..63d7efbc6 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -20,27 +20,26 @@ public class AdjustConfig { String sdkPrefix; String defaultTracker; OnAttributionChangedListener onAttributionChangedListener; - Class deepLinkComponent; OnEventTrackingSucceededListener onEventTrackingSucceededListener; OnEventTrackingFailedListener onEventTrackingFailedListener; OnSessionTrackingSucceededListener onSessionTrackingSucceededListener; OnSessionTrackingFailedListener onSessionTrackingFailedListener; OnDeferredDeeplinkResponseListener onDeferredDeeplinkResponseListener; - boolean sendInBackground; + boolean isSendingInBackgroundEnabled; AdjustInstance.PreLaunchActions preLaunchActions; ILogger logger; String pushToken; Boolean startEnabled; boolean startOffline; String externalDeviceId; - boolean preinstallTrackingEnabled; - Boolean needsCost; + boolean isPreinstallTrackingEnabled; + boolean isCostDataInAttributionEnabled; List urlStrategyDomains; boolean useSubdomains; boolean isDataResidency; String preinstallFilePath; String fbAppId; - boolean shouldReadDeviceIdsOnce; + boolean isDeviceIdsReadingOnceEnabled; OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; ArrayList cachedAdidReadCallbacks = new ArrayList<>(); Integer eventDeduplicationIdsMaxSize; @@ -77,20 +76,20 @@ private void init(Context context, String appToken, String environment, boolean this.environment = environment; // default values - this.sendInBackground = false; - this.preinstallTrackingEnabled = false; - this.shouldReadDeviceIdsOnce = false; - } - - - public void setSendInBackground(boolean sendInBackground) { - this.sendInBackground = sendInBackground; + this.isSendingInBackgroundEnabled = false; + this.isPreinstallTrackingEnabled = false; + this.isDeviceIdsReadingOnceEnabled = false; + this.isCostDataInAttributionEnabled = false; } public void setLogLevel(LogLevel logLevel) { setLogLevel(logLevel, environment); } + private void setLogLevel(LogLevel logLevel, String environment) { + logger.setLogLevel(logLevel, AdjustConfig.ENVIRONMENT_PRODUCTION.equals(environment)); + } + public void setSdkPrefix(String sdkPrefix) { this.sdkPrefix = sdkPrefix; } @@ -103,74 +102,70 @@ public void setDefaultTracker(String defaultTracker) { this.defaultTracker = defaultTracker; } - public void setOnAttributionChangedListener(OnAttributionChangedListener onAttributionChangedListener) { - this.onAttributionChangedListener = onAttributionChangedListener; + public void setExternalDeviceId(String externalDeviceId) { + this.externalDeviceId = externalDeviceId; } - public void setOnEventTrackingSucceededListener(OnEventTrackingSucceededListener onEventTrackingSucceededListener) { - this.onEventTrackingSucceededListener = onEventTrackingSucceededListener; + public void setPreinstallFilePath(String preinstallFilePath) { + this.preinstallFilePath = preinstallFilePath; } - public void setOnEventTrackingFailedListener(OnEventTrackingFailedListener onEventTrackingFailedListener) { - this.onEventTrackingFailedListener = onEventTrackingFailedListener; + public void setFbAppId(String fbAppId) { + this.fbAppId = fbAppId; } - public void setOnSessionTrackingSucceededListener(OnSessionTrackingSucceededListener onSessionTrackingSucceededListener) { - this.onSessionTrackingSucceededListener = onSessionTrackingSucceededListener; + public void setEventDeduplicationIdsMaxSize(Integer eventDeduplicationIdsMaxSize) { + this.eventDeduplicationIdsMaxSize = eventDeduplicationIdsMaxSize; } - public void setOnSessionTrackingFailedListener(OnSessionTrackingFailedListener onSessionTrackingFailedListener) { - this.onSessionTrackingFailedListener = onSessionTrackingFailedListener; + public void setUrlStrategy(List domains, boolean useSubdomains, boolean isDataResidency) { + if (domains == null || domains.isEmpty()) { + logger.error("Invalid URL strategy domains array"); + return; + } + this.urlStrategyDomains = domains; + this.useSubdomains = useSubdomains; + this.isDataResidency = isDataResidency; } - public void setOnDeferredDeeplinkResponseListener(OnDeferredDeeplinkResponseListener onDeferredDeeplinkResponseListener) { - this.onDeferredDeeplinkResponseListener = onDeferredDeeplinkResponseListener; + public void enablePreinstallTracking() { + this.isPreinstallTrackingEnabled = true; } - public void setExternalDeviceId(String externalDeviceId) { - this.externalDeviceId = externalDeviceId; + public void enableCostDataInAttribution() { + this.isCostDataInAttributionEnabled = true; } - public void setPreinstallTrackingEnabled(boolean preinstallTrackingEnabled) { - this.preinstallTrackingEnabled = preinstallTrackingEnabled; + public void enableSendingInBackground() { + this.isSendingInBackgroundEnabled = true; } - public void setPreinstallFilePath(String preinstallFilePath) { - this.preinstallFilePath = preinstallFilePath; + public void enableDeviceIdsReadingOnce() { + this.isDeviceIdsReadingOnceEnabled = true; } - public void setNeedsCost(boolean needsCost) { - this.needsCost = needsCost; + public void setOnAttributionChangedListener(OnAttributionChangedListener onAttributionChangedListener) { + this.onAttributionChangedListener = onAttributionChangedListener; } - public void setFbAppId(String fbAppId) { - this.fbAppId = fbAppId; + public void setOnEventTrackingSucceededListener(OnEventTrackingSucceededListener onEventTrackingSucceededListener) { + this.onEventTrackingSucceededListener = onEventTrackingSucceededListener; } - public boolean isValid() { - if (!checkAppToken(appToken)) return false; - if (!checkEnvironment(environment)) return false; - if (!checkContext(context)) return false; - - return true; + public void setOnEventTrackingFailedListener(OnEventTrackingFailedListener onEventTrackingFailedListener) { + this.onEventTrackingFailedListener = onEventTrackingFailedListener; } - public void setUrlStrategy(List domains, boolean useSubdomains, boolean isDataResidency) { - if (domains == null || domains.isEmpty()) { - logger.error("Invalid url strategy"); - return; - } - this.urlStrategyDomains = domains; - this.useSubdomains = useSubdomains; - this.isDataResidency = isDataResidency; + public void setOnSessionTrackingSucceededListener(OnSessionTrackingSucceededListener onSessionTrackingSucceededListener) { + this.onSessionTrackingSucceededListener = onSessionTrackingSucceededListener; } - public void readDeviceIdsOnce() { - this.shouldReadDeviceIdsOnce = true; + public void setOnSessionTrackingFailedListener(OnSessionTrackingFailedListener onSessionTrackingFailedListener) { + this.onSessionTrackingFailedListener = onSessionTrackingFailedListener; } - public void setEventDeduplicationIdsMaxSize(Integer eventDeduplicationIdsMaxSize) { - this.eventDeduplicationIdsMaxSize = eventDeduplicationIdsMaxSize; + public void setOnDeferredDeeplinkResponseListener(OnDeferredDeeplinkResponseListener onDeferredDeeplinkResponseListener) { + this.onDeferredDeeplinkResponseListener = onDeferredDeeplinkResponseListener; } public String getBasePath() { @@ -213,92 +208,84 @@ public String getDefaultTracker() { return defaultTracker; } - public OnAttributionChangedListener getOnAttributionChangedListener() { - return onAttributionChangedListener; - } - - public Class getDeepLinkComponent() { - return deepLinkComponent; - } - - public Integer getEventDeduplicationIdsMaxSize() { - return eventDeduplicationIdsMaxSize; + public String getPushToken() { + return pushToken; } - public OnEventTrackingSucceededListener getOnEventTrackingSucceededListener() { - return onEventTrackingSucceededListener; + public Boolean getStartEnabled() { + return startEnabled; } - public OnEventTrackingFailedListener getOnEventTrackingFailedListener() { - return onEventTrackingFailedListener; + public boolean isStartOffline() { + return startOffline; } - public OnSessionTrackingSucceededListener getOnSessionTrackingSucceededListener() { - return onSessionTrackingSucceededListener; + public String getExternalDeviceId() { + return externalDeviceId; } - public OnSessionTrackingFailedListener getOnSessionTrackingFailedListener() { - return onSessionTrackingFailedListener; + public boolean isPreinstallTrackingEnabled() { + return isPreinstallTrackingEnabled; } - public OnDeferredDeeplinkResponseListener getOnDeeplinkResponseListener() { - return onDeferredDeeplinkResponseListener; + public Boolean getCostDataInAttributionEnabled() { + return isCostDataInAttributionEnabled; } - public boolean isSendInBackground() { - return sendInBackground; + public boolean isSendingInBackgroundEnabled() { + return isSendingInBackgroundEnabled; } - public AdjustInstance.PreLaunchActions getPreLaunchActions() { - return preLaunchActions; + public Integer getEventDeduplicationIdsMaxSize() { + return eventDeduplicationIdsMaxSize; } - public ILogger getLogger() { - return logger; + public List getUrlStrategyDomains() { + return urlStrategyDomains; } - public String getPushToken() { - return pushToken; + public String getPreinstallFilePath() { + return preinstallFilePath; } - public Boolean getStartEnabled() { - return startEnabled; + public String getFbAppId() { + return fbAppId; } - public boolean isStartOffline() { - return startOffline; + public boolean isDeviceIdsReadingOnceEnabled() { + return isDeviceIdsReadingOnceEnabled; } - public String getExternalDeviceId() { - return externalDeviceId; + public OnAttributionChangedListener getOnAttributionChangedListener() { + return onAttributionChangedListener; } - public boolean isPreinstallTrackingEnabled() { - return preinstallTrackingEnabled; + public OnEventTrackingSucceededListener getOnEventTrackingSucceededListener() { + return onEventTrackingSucceededListener; } - public Boolean getNeedsCost() { - return needsCost; + public OnEventTrackingFailedListener getOnEventTrackingFailedListener() { + return onEventTrackingFailedListener; } - public List getUrlStrategyDomains() { - return urlStrategyDomains; + public OnSessionTrackingSucceededListener getOnSessionTrackingSucceededListener() { + return onSessionTrackingSucceededListener; } - public String getPreinstallFilePath() { - return preinstallFilePath; + public OnSessionTrackingFailedListener getOnSessionTrackingFailedListener() { + return onSessionTrackingFailedListener; } - public String getFbAppId() { - return fbAppId; + public OnDeferredDeeplinkResponseListener getOnDeeplinkResponseListener() { + return onDeferredDeeplinkResponseListener; } - public boolean shouldReadDeviceIdsOnce() { - return shouldReadDeviceIdsOnce; + public AdjustInstance.PreLaunchActions getPreLaunchActions() { + return preLaunchActions; } - private void setLogLevel(LogLevel logLevel, String environment) { - logger.setLogLevel(logLevel, AdjustConfig.ENVIRONMENT_PRODUCTION.equals(environment)); + public ILogger getLogger() { + return logger; } private boolean checkContext(Context context) { @@ -352,4 +339,17 @@ private boolean checkEnvironment(String environment) { logger.error("Unknown environment '%s'", environment); return false; } + + public boolean isValid() { + if (!checkAppToken(appToken)) { + return false; + } + if (!checkEnvironment(environment)) { + return false; + } + if (!checkContext(context)) { + return false; + } + return true; + } } \ No newline at end of file diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 8d7a23183..25e8c8756 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -140,7 +140,7 @@ class DeviceInfo { } void reloadPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled, boolean playStoreKidsAppEnabled) { - if (playIdsReadOnce && adjustConfig.shouldReadDeviceIdsOnce) { + if (playIdsReadOnce && adjustConfig.isDeviceIdsReadingOnceEnabled) { if (!Util.canReadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled)) { playAdId = null; isTrackingEnabled = null; @@ -250,7 +250,7 @@ void reloadNonPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled, boo void reloadOtherDeviceInfoParams(final AdjustConfig adjustConfig, final boolean coppaEnabled, final ILogger logger) { - if (adjustConfig.shouldReadDeviceIdsOnce && otherDeviceIdsParamsReadOnce) { + if (adjustConfig.isDeviceIdsReadingOnceEnabled && otherDeviceIdsParamsReadOnce) { return; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 3cada16bb..535088de4 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -280,7 +280,7 @@ private Map getSessionParameters() { PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); @@ -371,7 +371,7 @@ public Map getEventParameters(AdjustEvent event) { PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "currency", event.currency); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); @@ -457,7 +457,7 @@ private Map getInfoParameters(String source) { PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); PackageBuilder.addString(parameters, "environment", adjustConfig.environment); PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addBoolean(parameters, "needs_response_details", true); @@ -532,7 +532,7 @@ private Map getClickParameters(String source) { PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "deeplink", deeplink); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); @@ -629,7 +629,7 @@ private Map getAttributionParameters(String initiatedBy) { PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); @@ -694,7 +694,7 @@ private Map getGdprParameters() { PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); @@ -1000,7 +1000,7 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); @@ -1098,7 +1098,7 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); @@ -1193,7 +1193,7 @@ private Map getVerificationParameters(AdjustPlayStorePurchase pu PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); @@ -1283,7 +1283,7 @@ private Map getVerificationParameters(AdjustEvent event) { PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index b38737c74..841c1ef4a 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -209,34 +209,35 @@ var Adjust = { } }, - getAmazonAdId: function (callbackSuccess,callbackFail) { - if (AdjustBridge) { - if (typeof callbackSuccess === 'string' || callbackSuccess instanceof String) { - this.getAmazonIdCallbackSuccessName = callbackSuccess; - } else { - this.getAmazonIdCallbackSuccessName = 'Adjust.adjust_getAmazonIdCallbackSuccess'; - this.getAmazonIdCallbackSuccessFunction = callbackSuccess; - } - if (typeof callbackFail === 'string' || callbackFail instanceof String) { - this.getAmazonIdCallbackFailName = callbackFail; - } else { - this.getAmazonIdCallbackFailName = 'Adjust.adjust_getAmazonIdCallbackFail'; - this.getAmazonIdCallbackFailFunction = callbackFail; - } - AdjustBridge.getAmazonAdId(this.getAmazonIdCallbackSuccessName,this.getAmazonIdCallbackFailName); + getAmazonAdId: function (callbackSuccess,callbackFail) { + if (AdjustBridge) { + if (typeof callbackSuccess === 'string' || callbackSuccess instanceof String) { + this.getAmazonIdCallbackSuccessName = callbackSuccess; + } else { + this.getAmazonIdCallbackSuccessName = 'Adjust.adjust_getAmazonIdCallbackSuccess'; + this.getAmazonIdCallbackSuccessFunction = callbackSuccess; } - }, - - adjust_getAmazonIdCallbackSuccess: function (amazonId) { - if (AdjustBridge && this.getAmazonIdCallbackSuccessFunction) { - this.getAmazonIdCallbackSuccessFunction(amazonId); - } - }, - adjust_getAmazonIdCallbackFail: function (message) { - if (AdjustBridge && this.getAmazonIdCallbackFailFunction) { - this.getAmazonIdCallbackFailName(message); + if (typeof callbackFail === 'string' || callbackFail instanceof String) { + this.getAmazonIdCallbackFailName = callbackFail; + } else { + this.getAmazonIdCallbackFailName = 'Adjust.adjust_getAmazonIdCallbackFail'; + this.getAmazonIdCallbackFailFunction = callbackFail; + } + AdjustBridge.getAmazonAdId(this.getAmazonIdCallbackSuccessName,this.getAmazonIdCallbackFailName); } - }, + }, + + adjust_getAmazonIdCallbackSuccess: function (amazonId) { + if (AdjustBridge && this.getAmazonIdCallbackSuccessFunction) { + this.getAmazonIdCallbackSuccessFunction(amazonId); + } + }, + + adjust_getAmazonIdCallbackFail: function (message) { + if (AdjustBridge && this.getAmazonIdCallbackFailFunction) { + this.getAmazonIdCallbackFailName(message); + } + }, getAttribution: function (callback) { if (AdjustBridge) { diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js index a536c97e2..f8aa13dbe 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -19,7 +19,7 @@ function AdjustConfig(appToken, environment, legacy) { } } - this.sendInBackground = null; + this.isSendingInBackgroundEnabled = null; this.logLevel = null; this.sdkPrefix = null; this.processName = null; @@ -27,7 +27,7 @@ function AdjustConfig(appToken, environment, legacy) { this.externalDeviceId = null; this.attributionCallbackName = null; this.attributionCallbackFunction = null; - this.needsCost = null; + this.isCostDataInAttributionEnabled = null; this.eventSuccessCallbackName = null; this.eventSuccessCallbackFunction = null; this.eventFailureCallbackName = null; @@ -36,7 +36,7 @@ function AdjustConfig(appToken, environment, legacy) { this.sessionSuccessCallbackFunction = null; this.sessionFailureCallbackName = null; this.sessionFailureCallbackFunction = null; - this.openDeferredDeeplink = null; + this.isOpeningDeferredDeeplinkEnabled = null; this.deferredDeeplinkCallbackName = null; this.deferredDeeplinkCallbackFunction = null; this.fbPixelDefaultEventToken = null; @@ -44,7 +44,7 @@ function AdjustConfig(appToken, environment, legacy) { this.urlStrategy = []; this.useSubDomain = null; this.isDataResidency = null; - this.preinstallTrackingEnabled = null; + this.isPreinstallTrackingEnabled = null; this.preinstallFilePath = null; this.fbAppId = null; this.shouldReadDeviceIdsOnce = null; @@ -66,8 +66,8 @@ AdjustConfig.prototype.getBridge = function() { return this.bridge; }; -AdjustConfig.prototype.setSendInBackground = function(isEnabled) { - this.sendInBackground = isEnabled; +AdjustConfig.prototype.enableSendingInBackground = function() { + this.isSendingInBackgroundEnabled = true; }; AdjustConfig.prototype.setLogLevel = function(logLevel) { @@ -109,8 +109,8 @@ AdjustConfig.prototype.adjust_attributionCallback = function(attribution) { } }; -AdjustConfig.prototype.setNeedsCost = function(needsCost) { - this.needsCost = needsCost; +AdjustConfig.prototype.enableCostDataInAttribution = function() { + this.isCostDataInAttributionEnabled = true; }; AdjustConfig.prototype.setEventSuccessCallback = function(callback) { @@ -173,8 +173,8 @@ AdjustConfig.prototype.adjust_sessionFailureCallback = function(sessionFailure) } }; -AdjustConfig.prototype.setOpenDeferredDeeplink = function(shouldOpen) { - this.openDeferredDeeplink = shouldOpen; +AdjustConfig.prototype.disableDeferredDeeplinkOpening = function() { + this.isOpeningDeferredDeeplinkEnabled = false; }; AdjustConfig.prototype.setDeferredDeeplinkCallback = function(callback) { @@ -209,8 +209,8 @@ AdjustConfig.prototype.setUrlStrategy = function(urlStrategy, useSubDomain , isD this.isDataResidency = isDataResidency; }; -AdjustConfig.prototype.setPreinstallTrackingEnabled = function(preinstallTrackingEnabled) { - this.preinstallTrackingEnabled = preinstallTrackingEnabled; +AdjustConfig.prototype.enablePreinstallTracking = function() { + this.isPreinstallTrackingEnabled = true; }; AdjustConfig.prototype.setPreinstallFilePath = function(preinstallFilePath) { diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 6c114caaa..2b757907a 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -57,7 +57,7 @@ public class AdjustBridgeInstance { private WebView webView; private Application application; private boolean isInitialized = false; - private boolean shouldDeferredDeeplinkBeLaunched = true; + private boolean isOpeningDeferredDeeplinkEnabled = true; private FacebookSDKJSInterface facebookSDKJSInterface = null; private String adjustSdkPrefix = null; @@ -149,26 +149,26 @@ public void initSdk(String adjustConfigString) { Object appTokenField = jsonAdjustConfig.get("appToken"); Object environmentField = jsonAdjustConfig.get("environment"); Object allowSuppressLogLevelField = jsonAdjustConfig.get("allowSuppressLogLevel"); - Object sendInBackgroundField = jsonAdjustConfig.get("sendInBackground"); + Object isSendingInBackgroundEnabledField = jsonAdjustConfig.get("isSendingInBackgroundEnabled"); Object logLevelField = jsonAdjustConfig.get("logLevel"); Object sdkPrefixField = jsonAdjustConfig.get("sdkPrefix"); Object processNameField = jsonAdjustConfig.get("processName"); Object defaultTrackerField = jsonAdjustConfig.get("defaultTracker"); Object externalDeviceIdField = jsonAdjustConfig.get("externalDeviceId"); Object attributionCallbackNameField = jsonAdjustConfig.get("attributionCallbackName"); - Object needsCostField = jsonAdjustConfig.get("needsCost"); + Object isCostDataInAttributionEnabledField = jsonAdjustConfig.get("isCostDataInAttributionEnabled"); Object eventSuccessCallbackNameField = jsonAdjustConfig.get("eventSuccessCallbackName"); Object eventFailureCallbackNameField = jsonAdjustConfig.get("eventFailureCallbackName"); Object sessionSuccessCallbackNameField = jsonAdjustConfig.get("sessionSuccessCallbackName"); Object sessionFailureCallbackNameField = jsonAdjustConfig.get("sessionFailureCallbackName"); - Object openDeferredDeeplinkField = jsonAdjustConfig.get("openDeferredDeeplink"); + Object isOpeningDeferredDeeplinkEnabledField = jsonAdjustConfig.get("isOpeningDeferredDeeplinkEnabled"); Object deferredDeeplinkCallbackNameField = jsonAdjustConfig.get("deferredDeeplinkCallbackName"); Object fbPixelDefaultEventTokenField = jsonAdjustConfig.get("fbPixelDefaultEventToken"); Object fbPixelMappingField = jsonAdjustConfig.get("fbPixelMapping"); Object urlStrategyField = jsonAdjustConfig.get("urlStrategy"); Object useSubDomainField = jsonAdjustConfig.get("useSubDomain"); Object isDataResidencyField = jsonAdjustConfig.get("isDataResidency"); - Object preinstallTrackingEnabledField = jsonAdjustConfig.get("preinstallTrackingEnabled"); + Object isPreinstallTrackingEnabledField = jsonAdjustConfig.get("isPreinstallTrackingEnabled"); Object preinstallFilePathField = jsonAdjustConfig.get("preinstallFilePath"); Object fbAppIdField = jsonAdjustConfig.get("fbAppId"); Object shouldReadDeviceIdsOnceField = jsonAdjustConfig.get("shouldReadDeviceIdsOnce"); @@ -190,9 +190,11 @@ public void initSdk(String adjustConfigString) { } // Send in the background - Boolean sendInBackground = AdjustBridgeUtil.fieldToBoolean(sendInBackgroundField); - if (sendInBackground != null) { - adjustConfig.setSendInBackground(sendInBackground); + Boolean isSendingInBackgroundEnabled = AdjustBridgeUtil.fieldToBoolean(isSendingInBackgroundEnabledField); + if (isSendingInBackgroundEnabled != null) { + if (isSendingInBackgroundEnabled) { + adjustConfig.enableSendingInBackground(); + } } // Log level @@ -252,9 +254,11 @@ public void onAttributionChanged(AdjustAttribution attribution) { } // Needs cost - Boolean needsCost = AdjustBridgeUtil.fieldToBoolean(needsCostField); - if (needsCost != null) { - adjustConfig.setNeedsCost(needsCost); + Boolean isCostDataInAttributionEnabled = AdjustBridgeUtil.fieldToBoolean(isCostDataInAttributionEnabledField); + if (isCostDataInAttributionEnabled != null) { + if (isCostDataInAttributionEnabled) { + adjustConfig.enableCostDataInAttribution(); + } } // Event success callback @@ -300,9 +304,9 @@ public void onFinishedSessionTrackingFailed(AdjustSessionFailure failureResponse } // Should deferred deep link be opened? - Boolean openDeferredDeeplink = AdjustBridgeUtil.fieldToBoolean(openDeferredDeeplinkField); - if (openDeferredDeeplink != null) { - shouldDeferredDeeplinkBeLaunched = openDeferredDeeplink; + Boolean isOpeningDeferredDeeplinkEnabled = AdjustBridgeUtil.fieldToBoolean(isOpeningDeferredDeeplinkEnabledField); + if (isOpeningDeferredDeeplinkEnabled != null) { + this.isOpeningDeferredDeeplinkEnabled = isOpeningDeferredDeeplinkEnabled; } // Deferred deeplink callback @@ -312,7 +316,7 @@ public void onFinishedSessionTrackingFailed(AdjustSessionFailure failureResponse @Override public boolean launchReceivedDeeplink(Uri deeplink) { AdjustBridgeUtil.execSingleValueCallback(webView, deferredDeeplinkCallbackName, deeplink.toString()); - return shouldDeferredDeeplinkBeLaunched; + return isOpeningDeferredDeeplinkEnabled; } }); } @@ -348,9 +352,11 @@ public boolean launchReceivedDeeplink(Uri deeplink) { } // Preinstall tracking - Boolean preinstallTrackingEnabled = AdjustBridgeUtil.fieldToBoolean(preinstallTrackingEnabledField); - if (preinstallTrackingEnabled != null) { - adjustConfig.setPreinstallTrackingEnabled(preinstallTrackingEnabled); + Boolean isPreinstallTrackingEnabled = AdjustBridgeUtil.fieldToBoolean(isPreinstallTrackingEnabledField); + if (isPreinstallTrackingEnabled != null) { + if (isPreinstallTrackingEnabled) { + adjustConfig.enablePreinstallTracking(); + } } // Preinstall secondary file path @@ -368,7 +374,7 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // read device info once Boolean shouldReadDeviceIdsOnce = AdjustBridgeUtil.fieldToBoolean(shouldReadDeviceIdsOnceField); if (shouldReadDeviceIdsOnce != null && shouldReadDeviceIdsOnce.booleanValue()) { - adjustConfig.readDeviceIdsOnce(); + adjustConfig.enableDeviceIdsReadingOnce(); } Integer eventDeduplicationIdsMaxSize = AdjustBridgeUtil.fieldToInteger(eventDeduplicationIdsMaxSizeField); @@ -770,7 +776,7 @@ public void fbPixelEvent(String pixelId, String event_name, String jsonString) { @JavascriptInterface public void teardown() { isInitialized = false; - shouldDeferredDeeplinkBeLaunched = true; + isOpeningDeferredDeeplinkEnabled = true; } public void setWebView(WebView webView) { diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 3b178053a..371b9092c 100644 --- a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -284,23 +284,20 @@ private void config() { adjustConfig.setDefaultTracker(defaultTracker); } -// if (command.containsParameter("externalDeviceId")) { -// String externalDeviceId = command.getFirstParameterValue("externalDeviceId"); -// adjustConfig.setExternalDeviceId(externalDeviceId); -// } - - if (command.containsParameter("needsCost")) { - String needsCostS = command.getFirstParameterValue("needsCost"); - boolean needsCost = "true".equals(needsCostS); - adjustConfig.setNeedsCost(needsCost); + String isCostDataInAttributionEnabledS = command.getFirstParameterValue("needsCost"); + boolean isCostDataInAttributionEnabled = "true".equals(isCostDataInAttributionEnabledS); + if (isCostDataInAttributionEnabled) { + adjustConfig.enableCostDataInAttribution(); + } } - if (command.containsParameter("sendInBackground")) { - String sendInBackgroundS = command.getFirstParameterValue("sendInBackground"); - boolean sendInBackground = "true".equals(sendInBackgroundS); - adjustConfig.setSendInBackground(sendInBackground); + String isSendingInBackgroundEnabledS = command.getFirstParameterValue("sendInBackground"); + boolean isSendingInBackgroundEnabled = "true".equals(isSendingInBackgroundEnabledS); + if (isSendingInBackgroundEnabled) { + adjustConfig.enableSendingInBackground(); + } } if (command.containsParameter("eventDeduplicationIdsMaxSize")) { diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index 66a823d00..3b4df1d21 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -298,15 +298,19 @@ AdjustCommandExecutor.prototype.config = function(params) { } if ('needsCost' in params) { - var needsCostS = getFirstParameterValue(params, 'needsCost'); - var needsCost = needsCostS == 'true'; - adjustConfig.setNeedsCost(needsCost); + var isCostDataInAttributionEnabledS = getFirstParameterValue(params, 'needsCost'); + var isCostDataInAttributionEnabled = isCostDataInAttributionEnabledS == 'true'; + if (isCostDataInAttributionEnabled == true) { + adjustConfig.enableCostDataInAttribution(); + } } if ('sendInBackground' in params) { - var sendInBackgroundS = getFirstParameterValue(params, 'sendInBackground'); - var sendInBackground = sendInBackgroundS == 'true'; - adjustConfig.setSendInBackground(sendInBackground); + var isSendingInBackgroundEnabledS = getFirstParameterValue(params, 'sendInBackground'); + var isSendingInBackgroundEnabled = isSendingInBackgroundEnabledS == 'true'; + if (isSendingInBackgroundEnabled == true) { + adjustConfig.enableSendingInBackground(); + } } if ('eventDeduplicationIdsMaxSize' in params) { @@ -390,9 +394,12 @@ AdjustCommandExecutor.prototype.config = function(params) { if ('deferredDeeplinkCallback' in params) { var basePath = this.basePath; - var openDeeplinkS = getFirstParameterValue(params, 'deferredDeeplinkCallback'); - var openDeeplink = openDeeplinkS == 'true'; - adjustConfig.setOpenDeferredDeeplink(openDeeplink); + var isOpeningDeferredDeeplinkEnabledS = getFirstParameterValue(params, 'deferredDeeplinkCallback'); + var isOpeningDeferredDeeplinkEnabled = isOpeningDeferredDeeplinkEnabledS == 'true'; + if (isOpeningDeferredDeeplinkEnabled == false) { + adjustConfig.disableDeferredDeeplinkOpening(); + } + adjustConfig.setDeferredDeeplinkCallback(function(deeplink) { TestLibrary.addInfoToSend("deeplink", deeplink); TestLibrary.sendInfoToServer(basePath); From 51e589890788616ddb385cb793d0cde421295aa0 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 31 May 2024 13:37:07 +0200 Subject: [PATCH 229/540] fix: fix getSdkVersion logic in web bridge --- .../src/main/assets/adjust.js | 16 ++++++++-------- .../sdk/webbridge/AdjustBridgeInstance.java | 3 --- .../src/main/assets/AdjustTestApp-WebView.html | 4 +++- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index 841c1ef4a..553434cb3 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -259,19 +259,19 @@ var Adjust = { getSdkVersion: function (callback) { if (AdjustBridge) { - if (typeof callback === 'string' || callback instanceof String) { - this.getSdkVersionCallbackName = callback; - } else { - this.getSdkVersionCallbackName = 'Adjust.adjust_getSdkVersionCallback'; - this.getSdkVersionCallbackFunction = callback; - } - AdjustBridge.getSdkVersion(this.getSdkVersionCallbackName); + if (typeof callback === 'string' || callback instanceof String) { + this.getSdkVersionCallbackName = callback; + } else { + this.getSdkVersionCallbackName = 'Adjust.adjust_getSdkVersionCallback'; + this.getSdkVersionCallbackFunction = callback; } + AdjustBridge.getSdkVersion(this.getSdkVersionCallbackName); + } }, adjust_getSdkVersionCallback: function (sdkVersion) { if (AdjustBridge && this.getSdkVersionCallbackFunction) { - this.getSdkVersionCallbackFunction(sdkVersion); + this.getSdkVersionCallbackFunction(this.getSdkPrefix() + '@' + sdkVersion); } }, diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 2b757907a..fa186f672 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -760,9 +760,6 @@ public void getSdkVersion(final String callback) { Adjust.getSdkVersion(new OnSdkVersionReadListener() { @Override public void onSdkVersionRead(String sdkVersion) { - if (adjustSdkPrefix != null && adjustSdkPrefix.length() > 0) { - sdkVersion = adjustSdkPrefix + "@" + sdkVersion; - } AdjustBridgeUtil.execSingleValueCallback(webView, callback, sdkVersion); } }); diff --git a/Adjust/test-app-webbridge/src/main/assets/AdjustTestApp-WebView.html b/Adjust/test-app-webbridge/src/main/assets/AdjustTestApp-WebView.html index e4a0ed006..846e4880d 100755 --- a/Adjust/test-app-webbridge/src/main/assets/AdjustTestApp-WebView.html +++ b/Adjust/test-app-webbridge/src/main/assets/AdjustTestApp-WebView.html @@ -22,7 +22,9 @@

Adjust Web View SDK Test

window.onload = function() { // TestLibrary.addTestDirectory('current/user-agent'); // TestLibrary.addTest('current/deeplink-deferred/Test_DeferredDeeplink_callback_false'); - TestLibrary.startTestSession(Adjust.getSdkVersion()); + Adjust.getSdkVersion(function(sdkVersion) { + TestLibrary.startTestSession(sdkVersion); + }); }
From 5c951568445dec249aee8bb57a8c1c8bc1a8908c Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 31 May 2024 14:05:20 +0200 Subject: [PATCH 230/540] chore: fix code alignment --- .../test-app-webbridge/src/main/assets/command_executor.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/test-app-webbridge/src/main/assets/command_executor.js index 3b4df1d21..9d4c934a3 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -293,9 +293,9 @@ AdjustCommandExecutor.prototype.config = function(params) { } if ('externalDeviceId' in params) { - var externalDeviceId = getFirstParameterValue(params, 'externalDeviceId'); - adjustConfig.setExternalDeviceId(externalDeviceId); - } + var externalDeviceId = getFirstParameterValue(params, 'externalDeviceId'); + adjustConfig.setExternalDeviceId(externalDeviceId); + } if ('needsCost' in params) { var isCostDataInAttributionEnabledS = getFirstParameterValue(params, 'needsCost'); From 17deacd13c1c26e88e2a2fee2a8bc5e55d026283 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 31 May 2024 14:30:46 +0200 Subject: [PATCH 231/540] feat: add signature library missing check --- .../src/main/java/com/adjust/sdk/AdjustInstance.java | 4 ++++ .../src/main/java/com/adjust/sdk/AdjustSigner.java | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 530bd0e2f..07fd57515 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -79,6 +79,10 @@ public PreLaunchActions() { * @param adjustConfig AdjustConfig object used for SDK initialisation */ public void initSdk(final AdjustConfig adjustConfig) { + if (!AdjustSigner.isPresent()) { + AdjustFactory.getLogger().error("Missing signature library, SDK can't be initialised"); + return; + } if (adjustConfig == null) { AdjustFactory.getLogger().error("AdjustConfig missing"); return; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustSigner.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustSigner.java index 2d084b975..18c62fb0a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustSigner.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustSigner.java @@ -13,6 +13,16 @@ public class AdjustSigner { private AdjustSigner() { } + public static boolean isPresent() { + getSignerInstance(); + + if (signerInstance != null) { + return true; + } + + return false; + } + public static void onResume(ILogger logger){ getSignerInstance(); From b293cc0073da921b072acbe3bc6ee30b5e837c07 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 31 May 2024 14:34:28 +0200 Subject: [PATCH 232/540] feat: update version to 5.0.0-SNAPSHOT --- Adjust/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 54ab560ce..a9495314e 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 34 coreTargetSdkVersion = 34 - coreVersionName = '5.0.0' + coreVersionName = '5.0.0-SNAPSHOT' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 From b50c8d1aac67426ea7e266ed2e9838e19e0ae346 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 31 May 2024 14:57:08 +0200 Subject: [PATCH 233/540] fix: fix usage of enableSendingInBackground in examples --- .../examples/keyboard/GlobalApplication.java | 2 +- .../com/adjust/examples/GlobalApplication.java | 2 +- .../testappwebbridge/ExampleUnitTest.java | 17 ----------------- 3 files changed, 2 insertions(+), 19 deletions(-) delete mode 100644 Adjust/test-app-webbridge/src/test/java/com/example/testappwebbridge/ExampleUnitTest.java diff --git a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java index b0919b818..04dac06e8 100644 --- a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java +++ b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java @@ -101,7 +101,7 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // config.setProcessName("com.adjust.examples"); // Allow to send in the background. - config.enableSendingInBackground(true); + config.enableSendingInBackground(); // Add session callback parameters. Adjust.addGlobalCallbackParameter("sc_foo", "sc_bar"); diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java index d4dccd525..93284e4f1 100755 --- a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java @@ -98,7 +98,7 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // config.setProcessName("com.adjust.examples"); // Allow to send in the background. - config.enableSendingInBackground(true); + config.enableSendingInBackground(); // Add session callback parameters. Adjust.addGlobalCallbackParameter("sc_foo", "sc_bar"); diff --git a/Adjust/test-app-webbridge/src/test/java/com/example/testappwebbridge/ExampleUnitTest.java b/Adjust/test-app-webbridge/src/test/java/com/example/testappwebbridge/ExampleUnitTest.java deleted file mode 100644 index 020b2e22e..000000000 --- a/Adjust/test-app-webbridge/src/test/java/com/example/testappwebbridge/ExampleUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.testappwebbridge; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see Testing documentation - */ -public class ExampleUnitTest { - @Test - public void addition_isCorrect() { - assertEquals(4, 2 + 2); - } -} \ No newline at end of file From adb00f3f46241e8974dfb2d064b1bfd37af3deda Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 31 May 2024 15:16:45 +0200 Subject: [PATCH 234/540] fix: remove activityLifeCycle registration in example tv and keyboard --- .../examples/keyboard/GlobalApplication.java | 43 +------------------ .../adjust/examples/GlobalApplication.java | 42 +----------------- 2 files changed, 4 insertions(+), 81 deletions(-) diff --git a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java index 04dac06e8..55f30b016 100644 --- a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java +++ b/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java @@ -1,9 +1,7 @@ package com.adjust.examples.keyboard; -import android.app.Activity; import android.app.Application; import android.net.Uri; -import android.os.Bundle; import android.util.Log; import com.adjust.sdk.Adjust; @@ -11,6 +9,8 @@ import com.adjust.sdk.AdjustConfig; import com.adjust.sdk.AdjustEventFailure; import com.adjust.sdk.AdjustEventSuccess; +import com.adjust.sdk.AdjustSessionFailure; +import com.adjust.sdk.AdjustSessionSuccess; import com.adjust.sdk.LogLevel; import com.adjust.sdk.OnAttributionChangedListener; import com.adjust.sdk.OnDeferredDeeplinkResponseListener; @@ -18,8 +18,6 @@ import com.adjust.sdk.OnEventTrackingSucceededListener; import com.adjust.sdk.OnSessionTrackingFailedListener; import com.adjust.sdk.OnSessionTrackingSucceededListener; -import com.adjust.sdk.AdjustSessionFailure; -import com.adjust.sdk.AdjustSessionSuccess; /** * Created by pfms on 17/12/14. @@ -136,10 +134,6 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Initialise the adjust SDK. Adjust.initSdk(config); - // Register onResume and onPause events of all activities - // for applications with minSdkVersion >= 14. - registerActivityLifecycleCallbacks(new AdjustLifecycleCallbacks()); - // Put the SDK in offline mode. // Adjust.switchToOfflineMode(); @@ -149,37 +143,4 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Send push notification token. // Adjust.setPushToken("token"); } - - // You can use this class if your app is for Android 4.0 or higher - private static final class AdjustLifecycleCallbacks implements ActivityLifecycleCallbacks { - @Override - public void onActivityResumed(Activity activity) { - Adjust.onResume(); - } - - @Override - public void onActivityPaused(Activity activity) { - Adjust.onPause(); - } - - @Override - public void onActivityStopped(Activity activity) { - } - - @Override - public void onActivitySaveInstanceState(Activity activity, Bundle outState) { - } - - @Override - public void onActivityDestroyed(Activity activity) { - } - - @Override - public void onActivityCreated(Activity activity, Bundle savedInstanceState) { - } - - @Override - public void onActivityStarted(Activity activity) { - } - } } diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java index 93284e4f1..ff6dce7d4 100755 --- a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java @@ -1,9 +1,7 @@ package com.adjust.examples; -import android.app.Activity; import android.app.Application; import android.net.Uri; -import android.os.Bundle; import android.util.Log; import com.adjust.sdk.Adjust; @@ -11,6 +9,8 @@ import com.adjust.sdk.AdjustConfig; import com.adjust.sdk.AdjustEventFailure; import com.adjust.sdk.AdjustEventSuccess; +import com.adjust.sdk.AdjustSessionFailure; +import com.adjust.sdk.AdjustSessionSuccess; import com.adjust.sdk.LogLevel; import com.adjust.sdk.OnAttributionChangedListener; import com.adjust.sdk.OnDeferredDeeplinkResponseListener; @@ -18,8 +18,6 @@ import com.adjust.sdk.OnEventTrackingSucceededListener; import com.adjust.sdk.OnSessionTrackingFailedListener; import com.adjust.sdk.OnSessionTrackingSucceededListener; -import com.adjust.sdk.AdjustSessionFailure; -import com.adjust.sdk.AdjustSessionSuccess; public class GlobalApplication extends Application { @Override @@ -123,10 +121,6 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Initialise the adjust SDK. Adjust.initSdk(config); - // Register onResume and onPause events of all activities - // for applications with minSdkVersion >= 14. - registerActivityLifecycleCallbacks(new AdjustLifecycleCallbacks()); - // Put the SDK in offline mode. // Adjust.switchToOfflineMode(); @@ -137,36 +131,4 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // Adjust.setPushToken("token"); } - // You can use this class if your app is for Android 4.0 or higher - private static final class AdjustLifecycleCallbacks implements ActivityLifecycleCallbacks { - @Override - public void onActivityResumed(Activity activity) { - Adjust.onResume(); - } - - @Override - public void onActivityPaused(Activity activity) { - Adjust.onPause(); - } - - @Override - public void onActivityStopped(Activity activity) { - } - - @Override - public void onActivitySaveInstanceState(Activity activity, Bundle outState) { - } - - @Override - public void onActivityDestroyed(Activity activity) { - } - - @Override - public void onActivityCreated(Activity activity, Bundle savedInstanceState) { - } - - @Override - public void onActivityStarted(Activity activity) { - } - } } From 3e2646fed32eb6019148182619fb1ea3822f5a38 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 31 May 2024 16:07:37 +0200 Subject: [PATCH 235/540] fix: renaming the local variable isOpeningDeferredDeeplinkEnabled --- .../java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index fa186f672..9a8ef1281 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -304,9 +304,9 @@ public void onFinishedSessionTrackingFailed(AdjustSessionFailure failureResponse } // Should deferred deep link be opened? - Boolean isOpeningDeferredDeeplinkEnabled = AdjustBridgeUtil.fieldToBoolean(isOpeningDeferredDeeplinkEnabledField); - if (isOpeningDeferredDeeplinkEnabled != null) { - this.isOpeningDeferredDeeplinkEnabled = isOpeningDeferredDeeplinkEnabled; + Boolean isOpeningDeferredDeeplinkEnabledObject = AdjustBridgeUtil.fieldToBoolean(isOpeningDeferredDeeplinkEnabledField); + if (isOpeningDeferredDeeplinkEnabledObject != null) { + isOpeningDeferredDeeplinkEnabled = isOpeningDeferredDeeplinkEnabledObject; } // Deferred deeplink callback From ef38c6f7be709d13400b7f5e3f41c7ae8d8beab1 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 31 May 2024 16:43:13 +0200 Subject: [PATCH 236/540] fix: add snapshot url for publishing task --- Adjust/sdk-plugin-huawei-referrer/build.gradle | 7 ++++++- Adjust/sdk-plugin-imei/build.gradle | 7 ++++++- Adjust/sdk-plugin-meta-referrer/build.gradle | 7 ++++++- Adjust/sdk-plugin-oaid/build.gradle | 7 ++++++- Adjust/sdk-plugin-samsung-clouddev/build.gradle | 7 ++++++- Adjust/sdk-plugin-samsung-referrer/build.gradle | 7 ++++++- Adjust/sdk-plugin-vivo-referrer/build.gradle | 7 ++++++- Adjust/sdk-plugin-xiaomi-referrer/build.gradle | 8 ++++++-- 8 files changed, 48 insertions(+), 9 deletions(-) diff --git a/Adjust/sdk-plugin-huawei-referrer/build.gradle b/Adjust/sdk-plugin-huawei-referrer/build.gradle index a5d195396..7b73ed803 100644 --- a/Adjust/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/sdk-plugin-huawei-referrer/build.gradle @@ -104,7 +104,12 @@ afterEvaluate { repositories { maven { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { + println "Using Maven SNAPSHOT repository for publishing" + url "https://oss.sonatype.org/content/repositories/snapshots/" + } else { + url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + } if (project.hasProperty("sonatypeUsername")) { credentials { username sonatypeUsername diff --git a/Adjust/sdk-plugin-imei/build.gradle b/Adjust/sdk-plugin-imei/build.gradle index b4aadc833..998017363 100644 --- a/Adjust/sdk-plugin-imei/build.gradle +++ b/Adjust/sdk-plugin-imei/build.gradle @@ -106,7 +106,12 @@ afterEvaluate { repositories { maven { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { + println "Using Maven SNAPSHOT repository for publishing" + url "https://oss.sonatype.org/content/repositories/snapshots/" + } else { + url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + } if (project.hasProperty("sonatypeUsername")) { credentials { username sonatypeUsername diff --git a/Adjust/sdk-plugin-meta-referrer/build.gradle b/Adjust/sdk-plugin-meta-referrer/build.gradle index 48158dbb5..d323d77c1 100644 --- a/Adjust/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/sdk-plugin-meta-referrer/build.gradle @@ -104,7 +104,12 @@ afterEvaluate { repositories { maven { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { + println "Using Maven SNAPSHOT repository for publishing" + url "https://oss.sonatype.org/content/repositories/snapshots/" + } else { + url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + } if (project.hasProperty("sonatypeUsername")) { credentials { username sonatypeUsername diff --git a/Adjust/sdk-plugin-oaid/build.gradle b/Adjust/sdk-plugin-oaid/build.gradle index 3b9df27f6..e31469172 100644 --- a/Adjust/sdk-plugin-oaid/build.gradle +++ b/Adjust/sdk-plugin-oaid/build.gradle @@ -110,7 +110,12 @@ afterEvaluate { repositories { maven { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { + println "Using Maven SNAPSHOT repository for publishing" + url "https://oss.sonatype.org/content/repositories/snapshots/" + } else { + url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + } if (project.hasProperty("sonatypeUsername")) { credentials { username sonatypeUsername diff --git a/Adjust/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/sdk-plugin-samsung-clouddev/build.gradle index 0e164d230..9cdbec696 100644 --- a/Adjust/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/sdk-plugin-samsung-clouddev/build.gradle @@ -107,7 +107,12 @@ afterEvaluate { repositories { maven { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { + println "Using Maven SNAPSHOT repository for publishing" + url "https://oss.sonatype.org/content/repositories/snapshots/" + } else { + url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + } if (project.hasProperty("sonatypeUsername")) { credentials { username sonatypeUsername diff --git a/Adjust/sdk-plugin-samsung-referrer/build.gradle b/Adjust/sdk-plugin-samsung-referrer/build.gradle index a68fd9153..a5016793e 100644 --- a/Adjust/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/sdk-plugin-samsung-referrer/build.gradle @@ -107,7 +107,12 @@ afterEvaluate { repositories { maven { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { + println "Using Maven SNAPSHOT repository for publishing" + url "https://oss.sonatype.org/content/repositories/snapshots/" + } else { + url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + } if (project.hasProperty("sonatypeUsername")) { credentials { username sonatypeUsername diff --git a/Adjust/sdk-plugin-vivo-referrer/build.gradle b/Adjust/sdk-plugin-vivo-referrer/build.gradle index 513b69945..4b371257c 100644 --- a/Adjust/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/sdk-plugin-vivo-referrer/build.gradle @@ -107,7 +107,12 @@ afterEvaluate { repositories { maven { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { + println "Using Maven SNAPSHOT repository for publishing" + url "https://oss.sonatype.org/content/repositories/snapshots/" + } else { + url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + } if (project.hasProperty("sonatypeUsername")) { credentials { username sonatypeUsername diff --git a/Adjust/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/sdk-plugin-xiaomi-referrer/build.gradle index 5a5bcf2a7..5363a9800 100644 --- a/Adjust/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/sdk-plugin-xiaomi-referrer/build.gradle @@ -108,8 +108,12 @@ afterEvaluate { } repositories { - maven { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { + println "Using Maven SNAPSHOT repository for publishing" + url "https://oss.sonatype.org/content/repositories/snapshots/" + } else { + url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + } if (project.hasProperty("sonatypeUsername")) { credentials { username sonatypeUsername From d3c7603dcf15e471bfb9f29b51bd06d8ab28e02f Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 31 May 2024 16:50:41 +0200 Subject: [PATCH 237/540] fix: missing maven --- Adjust/sdk-plugin-xiaomi-referrer/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/Adjust/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/sdk-plugin-xiaomi-referrer/build.gradle index 5363a9800..221be585e 100644 --- a/Adjust/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/sdk-plugin-xiaomi-referrer/build.gradle @@ -108,6 +108,7 @@ afterEvaluate { } repositories { + maven { if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { println "Using Maven SNAPSHOT repository for publishing" url "https://oss.sonatype.org/content/repositories/snapshots/" From a663464895211d04d05242f8d85543f5f1f8b022 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 5 Jun 2024 13:48:56 +0200 Subject: [PATCH 238/540] clea:remove duplicate functions that hot added in rebase --- .../src/main/java/com/adjust/sdk/Adjust.java | 10 --- .../java/com/adjust/sdk/PackageBuilder.java | 88 ------------------- 2 files changed, 98 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 2284059ae..bf454bbc6 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -411,16 +411,6 @@ public static void getGooglePlayInstallReferrer(final Context context, final OnG AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.getGooglePlayInstallReferrer(context ,onGooglePlayInstallReferrerReadListener); } - /** - * Called to get Google Install Referrer. - * - * @param context Application context - * @param onGooglePlayInstallReferrerReadListener Callback to obtain install referrer. - */ - public static void getGooglePlayInstallReferrer(Context context, OnGooglePlayInstallReferrerReadListener onGooglePlayInstallReferrerReadListener) { - AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.getGooglePlayInstallReferrer(context ,onGooglePlayInstallReferrerReadListener); - } /** * Called to get native SDK version string. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 535088de4..59570a160 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -865,94 +865,6 @@ private Map getMeasurementConsentParameters( return parameters; } - private Map getAdRevenueParameters(String source, JSONObject adRevenueJson) { - Map parameters = new HashMap(); - - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); - - // Check if plugin is used and if yes, add read parameters. - if (deviceInfo.imeiParameters != null) { - parameters.putAll(deviceInfo.imeiParameters); - } - - // Check if oaid plugin is used and if yes, add the parameter - if (deviceInfo.oaidParameters != null) { - parameters.putAll(deviceInfo.oaidParameters); - } - - // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); - PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); - PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); - PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); - PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); - PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); - PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); - PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); - - if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { - logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + - "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); - PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); - } - - // Rest of the parameters. - PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); - PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); - PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); - PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); - PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); - PackageBuilder.addString(parameters, "country", deviceInfo.country); - PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); - PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.needsCost); - PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); - PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); - PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); - PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); - PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); - PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); - PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); - PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); - PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); - PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); - PackageBuilder.addString(parameters, "installed_at", deviceInfo.appInstallTime); - PackageBuilder.addString(parameters, "language", deviceInfo.language); - PackageBuilder.addDuration(parameters, "last_interval", activityStateCopy.lastInterval); - PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); - PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); - PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); - PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); - PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); - PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); - PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); - PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); - PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); - PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); - PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); - PackageBuilder.addString(parameters, "source", source); - PackageBuilder.addJsonObject(parameters, "payload", adRevenueJson); - PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); - PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); - PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); - PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); - PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); - - // google play games - PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); - - injectFeatureFlagsWithParameters(parameters); - - checkDeviceIds(parameters); - return parameters; - } - private Map getAdRevenueParameters(AdjustAdRevenue adjustAdRevenue) { Map parameters = new HashMap(); From 14233b88d6e9802a0bedee543f8b84d783acc4d5 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 26 Jun 2024 14:23:36 +0200 Subject: [PATCH 239/540] style:Project restructure, grouping of plugin and examples --- .../example-app-fbpixel/.gitignore | 0 .../example-app-fbpixel/build.gradle | 2 +- .../example-app-fbpixel/proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../main/assets/AdjustExample-FbPixel.html | 0 .../com/adjust/examples/MainActivity.java | 0 .../drawable-v24/ic_launcher_foreground.xml | 0 .../res/drawable/ic_launcher_background.xml | 0 .../src/main/res/layout/activity_main.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../res/mipmap-hdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../res/mipmap-mdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../res/mipmap-xhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin .../src/main/res/values/colors.xml | 0 .../src/main/res/values/strings.xml | 0 .../src/main/res/values/styles.xml | 0 .../main/res/xml/network_security_config.xml | 0 .../example-app-java/build.gradle | 0 .../example-app-java/proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../adjust/examples/GlobalApplication.java | 0 .../com/adjust/examples/MainActivity.java | 0 .../com/adjust/examples/ServiceActivity.java | 0 .../com/adjust/examples/ServiceExample.java | 0 .../src/main/res/layout/activity_main.xml | 0 .../src/main/res/layout/activity_service.xml | 0 .../src/main/res/menu/menu_main.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../src/main/res/values-w820dp/dimens.xml | 0 .../src/main/res/values/dimens.xml | 0 .../src/main/res/values/strings.xml | 0 .../src/main/res/values/styles.xml | 0 .../example-app-keyboard/build.gradle | 0 .../example-app-keyboard/proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../examples/keyboard/GlobalApplication.java | 0 .../keyboard/KeyboardInputMethodService.java | 0 .../examples/keyboard/MainActivity.java | 0 .../src/main/res/layout/activity_main.xml | 0 .../src/main/res/layout/key_preview.xml | 0 .../src/main/res/layout/keyboard_view.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../src/main/res/values-w820dp/dimens.xml | 0 .../src/main/res/values/colors.xml | 0 .../src/main/res/values/dimens.xml | 0 .../src/main/res/values/strings.xml | 0 .../src/main/res/values/styles.xml | 0 .../src/main/res/xml/keyboard.xml | 0 .../src/main/res/xml/method.xml | 0 .../example-app-kotlin/.gitignore | 0 .../example-app-kotlin/build.gradle | 0 .../example-app-kotlin/proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../com/adjust/examples/GlobalApplication.kt | 0 .../java/com/adjust/examples/MainActivity.kt | 0 .../com/adjust/examples/ServiceActivity.kt | 0 .../com/adjust/examples/ServiceExample.kt | 0 .../src/main/res/layout/activity_main.xml | 0 .../src/main/res/layout/activity_service.xml | 0 .../src/main/res/menu/menu_main.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../src/main/res/values-w820dp/dimens.xml | 0 .../src/main/res/values/dimens.xml | 0 .../src/main/res/values/strings.xml | 0 .../src/main/res/values/styles.xml | 0 .../example-app-tv/build.gradle | 0 .../example-app-tv/proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../adjust/examples/GlobalApplication.java | 0 .../com/adjust/examples/MainActivity.java | 0 .../src/main/res/layout/activity_main.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../src/main/res/values-w820dp/dimens.xml | 0 .../src/main/res/values/dimens.xml | 0 .../src/main/res/values/strings.xml | 0 .../src/main/res/values/styles.xml | 0 .../example-app-webbridge/.gitignore | 0 .../example-app-webbridge/build.gradle | 2 +- .../example-app-webbridge/proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../main/assets/AdjustExample-WebView.html | 0 .../com/example/examples/MainActivity.java | 0 .../drawable-v24/ic_launcher_foreground.xml | 0 .../res/drawable/ic_launcher_background.xml | 0 .../src/main/res/layout/activity_main.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../res/mipmap-hdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../res/mipmap-mdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../res/mipmap-xhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin .../src/main/res/values/colors.xml | 0 .../src/main/res/values/strings.xml | 0 .../src/main/res/values/styles.xml | 0 .../main/res/xml/network_security_config.xml | 0 .../sdk-plugin-huawei-referrer/.gitignore | 0 .../sdk-plugin-huawei-referrer/build.gradle | 0 .../proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../sdk/huawei/AdjustHuaweiReferrer.java | 0 .../huawei/HuaweiInstallReferrerDetails.java | 0 .../huawei/HuaweiInstallReferrerResult.java | 0 .../sdk/huawei/HuaweiReferrerClient.java | 0 .../OnHuaweiInstallReferrerReadListener.java | 0 .../main/java/com/adjust/sdk/huawei/Util.java | 0 .../src/main/res/values/strings.xml | 0 .../{ => plugins}/sdk-plugin-imei/.gitignore | 0 .../sdk-plugin-imei/build.gradle | 0 .../sdk-plugin-imei/proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../java/com/adjust/sdk/imei/AdjustImei.java | 0 .../com/adjust/sdk/imei/TelephonyIdsUtil.java | 0 .../main/java/com/adjust/sdk/imei/Util.java | 0 .../src/main/res/values/strings.xml | 0 .../sdk-plugin-meta-referrer/.gitignore | 0 .../sdk-plugin-meta-referrer/build.gradle | 0 .../proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../adjust/sdk/meta/AdjustMetaReferrer.java | 0 .../sdk/meta/MetaInstallReferrerDetails.java | 0 .../sdk/meta/MetaInstallReferrerResult.java | 0 .../adjust/sdk/meta/MetaReferrerClient.java | 0 .../OnMetaInstallReferrerReadListener.java | 0 .../main/java/com/adjust/sdk/meta/Util.java | 0 .../src/main/res/values/strings.xml | 0 .../{ => plugins}/sdk-plugin-oaid/.gitignore | 0 .../sdk-plugin-oaid/build.gradle | 0 .../sdk-plugin-oaid/libs/oaid_sdk_2.0.0.aar | Bin .../sdk-plugin-oaid/proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../java/com/adjust/sdk/oaid/AdjustOaid.java | 0 .../com/adjust/sdk/oaid/HmsSdkClient.java | 0 .../com/adjust/sdk/oaid/MsaSdkClient.java | 0 .../java/com/adjust/sdk/oaid/OaidInfo.java | 0 .../java/com/adjust/sdk/oaid/OaidResult.java | 0 .../adjust/sdk/oaid/OnOaidReadListener.java | 0 .../main/java/com/adjust/sdk/oaid/Util.java | 0 .../src/main/res/values/strings.xml | 0 .../sdk-plugin-samsung-clouddev/.gitignore | 0 .../sdk-plugin-samsung-clouddev/build.gradle | 0 .../proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../clouddev/AdjustSamsungCloudDev.java | 0 .../clouddev/SamsungCloudDevClient.java | 0 .../com/adjust/sdk/samsung/clouddev/Util.java | 0 .../src/main/res/values/strings.xml | 0 .../sdk-plugin-samsung-referrer/.gitignore | 0 .../sdk-plugin-samsung-referrer/build.gradle | 0 .../proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../sdk/samsung/AdjustSamsungReferrer.java | 0 .../OnSamsungInstallReferrerReadListener.java | 0 .../SamsungInstallReferrerDetails.java | 0 .../samsung/SamsungInstallReferrerResult.java | 0 .../sdk/samsung/SamsungReferrerClient.java | 0 .../java/com/adjust/sdk/samsung/Util.java | 0 .../src/main/res/values/strings.xml | 0 .../sdk-plugin-vivo-referrer/.gitignore | 0 .../sdk-plugin-vivo-referrer/build.gradle | 0 .../proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../adjust/sdk/vivo/AdjustVivoReferrer.java | 0 .../OnVivoInstallReferrerReadListener.java | 0 .../main/java/com/adjust/sdk/vivo/Util.java | 0 .../sdk/vivo/VivoInstallReferrerDetails.java | 0 .../sdk/vivo/VivoInstallReferrerResult.java | 0 .../adjust/sdk/vivo/VivoReferrerClient.java | 0 .../src/main/res/values/strings.xml | 0 .../sdk-plugin-webbridge/.gitignore | 0 .../sdk-plugin-webbridge/build.gradle | 0 .../sdk-plugin-webbridge/proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../src/main/assets/adjust.js | 0 .../src/main/assets/adjust_config.js | 0 .../src/main/assets/adjust_event.js | 0 .../main/assets/adjust_third_party_sharing.js | 0 .../adjust/sdk/webbridge/AdjustBridge.java | 0 .../sdk/webbridge/AdjustBridgeInstance.java | 0 .../sdk/webbridge/AdjustBridgeUtil.java | 0 .../sdk/webbridge/FacebookSDKJSInterface.java | 0 .../sdk-plugin-xiaomi-referrer/.gitignore | 0 .../sdk-plugin-xiaomi-referrer/build.gradle | 0 .../proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../sdk/xiaomi/AdjustXiaomiReferrer.java | 0 .../OnXiaomiInstallReferrerReadListener.java | 0 .../main/java/com/adjust/sdk/xiaomi/Util.java | 0 .../xiaomi/XiaomiInstallReferrerDetails.java | 0 .../xiaomi/XiaomiInstallReferrerResult.java | 0 .../sdk/xiaomi/XiaomiReferrerClient.java | 0 .../src/main/res/values/strings.xml | 0 Adjust/settings.gradle | 26 ++++++++++++++++-- Adjust/{ => tests}/test-app-core/.gitignore | 0 Adjust/{ => tests}/test-app-core/build.gradle | 4 +-- .../test-app-core/proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../adjust/testapp/AdjustCommandExecutor.java | 0 .../main/java/com/adjust/testapp/Command.java | 0 .../com/adjust/testapp/CommandListener.java | 0 .../java/com/adjust/testapp/MainActivity.java | 0 .../main/java/com/adjust/testapp/Util.java | 0 .../drawable-v24/ic_launcher_foreground.xml | 0 .../res/drawable/ic_launcher_background.xml | 0 .../src/main/res/layout/activity_main.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../res/mipmap-hdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../res/mipmap-mdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../res/mipmap-xhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin .../src/main/res/values/colors.xml | 0 .../src/main/res/values/strings.xml | 0 .../src/main/res/values/styles.xml | 0 .../{ => tests}/test-app-webbridge/.gitignore | 0 .../test-app-webbridge/build.gradle | 6 ++-- .../test-app-webbridge/proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../main/assets/AdjustTestApp-WebView.html | 0 .../src/main/assets/command_executor.js | 0 .../src/main/assets/test_library.js | 0 .../testappwebbridge/MainActivity.java | 0 .../testappwebbridge/TestLibraryBridge.java | 0 .../drawable-v24/ic_launcher_foreground.xml | 0 .../res/drawable/ic_launcher_background.xml | 0 .../src/main/res/layout/activity_main.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../res/mipmap-hdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../res/mipmap-mdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../res/mipmap-xhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin .../src/main/res/values/colors.xml | 0 .../src/main/res/values/strings.xml | 0 .../src/main/res/values/styles.xml | 0 Adjust/{ => tests}/test-library/.gitignore | 0 Adjust/{ => tests}/test-library/build.gradle | 0 .../test-library/proguard-rules.pro | 0 .../test-library/src/main/AndroidManifest.xml | 0 .../main/java/com/adjust/test/Constants.java | 0 .../com/adjust/test/ICommandJsonListener.java | 0 .../com/adjust/test/ICommandListener.java | 0 .../adjust/test/ICommandRawJsonListener.java | 0 .../java/com/adjust/test/IOnExitListener.java | 0 .../main/java/com/adjust/test/Networking.java | 0 .../java/com/adjust/test/TestCommand.java | 0 .../java/com/adjust/test/TestLibrary.java | 0 .../src/main/java/com/adjust/test/Utils.java | 0 .../com/adjust/test/ws/ControlSignal.java | 0 .../test/ws/ControlWebSocketClient.java | 0 .../java/com/adjust/test/ws/SignalType.java | 0 .../src/main/res/values/strings.xml | 0 Adjust/{ => tests}/test-options/.gitignore | 0 Adjust/{ => tests}/test-options/build.gradle | 0 .../test-options/consumer-rules.pro | 0 .../test-options/proguard-rules.pro | 0 .../test-options/src/main/AndroidManifest.xml | 0 .../adjust/test_options/TLSSocketFactory.java | 0 .../test_options/TestConnectionOptions.java | 0 296 files changed, 30 insertions(+), 10 deletions(-) rename Adjust/{ => examples}/example-app-fbpixel/.gitignore (100%) rename Adjust/{ => examples}/example-app-fbpixel/build.gradle (94%) rename Adjust/{ => examples}/example-app-fbpixel/proguard-rules.pro (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/AndroidManifest.xml (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/java/com/adjust/examples/MainActivity.java (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/res/drawable-v24/ic_launcher_foreground.xml (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/res/drawable/ic_launcher_background.xml (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/res/layout/activity_main.xml (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/res/mipmap-hdpi/ic_launcher_round.png (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/res/mipmap-mdpi/ic_launcher_round.png (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/res/mipmap-xhdpi/ic_launcher_round.png (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/res/mipmap-xxhdpi/ic_launcher_round.png (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/res/values/colors.xml (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/res/values/strings.xml (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/res/values/styles.xml (100%) rename Adjust/{ => examples}/example-app-fbpixel/src/main/res/xml/network_security_config.xml (100%) rename Adjust/{ => examples}/example-app-java/build.gradle (100%) rename Adjust/{ => examples}/example-app-java/proguard-rules.pro (100%) rename Adjust/{ => examples}/example-app-java/src/main/AndroidManifest.xml (100%) rename Adjust/{ => examples}/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java (100%) rename Adjust/{ => examples}/example-app-java/src/main/java/com/adjust/examples/MainActivity.java (100%) rename Adjust/{ => examples}/example-app-java/src/main/java/com/adjust/examples/ServiceActivity.java (100%) rename Adjust/{ => examples}/example-app-java/src/main/java/com/adjust/examples/ServiceExample.java (100%) rename Adjust/{ => examples}/example-app-java/src/main/res/layout/activity_main.xml (100%) rename Adjust/{ => examples}/example-app-java/src/main/res/layout/activity_service.xml (100%) rename Adjust/{ => examples}/example-app-java/src/main/res/menu/menu_main.xml (100%) rename Adjust/{ => examples}/example-app-java/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-java/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-java/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-java/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-java/src/main/res/values-w820dp/dimens.xml (100%) rename Adjust/{ => examples}/example-app-java/src/main/res/values/dimens.xml (100%) rename Adjust/{ => examples}/example-app-java/src/main/res/values/strings.xml (100%) rename Adjust/{ => examples}/example-app-java/src/main/res/values/styles.xml (100%) rename Adjust/{ => examples}/example-app-keyboard/build.gradle (100%) rename Adjust/{ => examples}/example-app-keyboard/proguard-rules.pro (100%) rename Adjust/{ => examples}/example-app-keyboard/src/main/AndroidManifest.xml (100%) rename Adjust/{ => examples}/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java (100%) rename Adjust/{ => examples}/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/KeyboardInputMethodService.java (100%) rename Adjust/{ => examples}/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/MainActivity.java (100%) rename Adjust/{ => examples}/example-app-keyboard/src/main/res/layout/activity_main.xml (100%) rename Adjust/{ => examples}/example-app-keyboard/src/main/res/layout/key_preview.xml (100%) rename Adjust/{ => examples}/example-app-keyboard/src/main/res/layout/keyboard_view.xml (100%) rename Adjust/{ => examples}/example-app-keyboard/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-keyboard/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-keyboard/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-keyboard/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-keyboard/src/main/res/values-w820dp/dimens.xml (100%) rename Adjust/{ => examples}/example-app-keyboard/src/main/res/values/colors.xml (100%) rename Adjust/{ => examples}/example-app-keyboard/src/main/res/values/dimens.xml (100%) rename Adjust/{ => examples}/example-app-keyboard/src/main/res/values/strings.xml (100%) rename Adjust/{ => examples}/example-app-keyboard/src/main/res/values/styles.xml (100%) rename Adjust/{ => examples}/example-app-keyboard/src/main/res/xml/keyboard.xml (100%) rename Adjust/{ => examples}/example-app-keyboard/src/main/res/xml/method.xml (100%) rename Adjust/{ => examples}/example-app-kotlin/.gitignore (100%) rename Adjust/{ => examples}/example-app-kotlin/build.gradle (100%) rename Adjust/{ => examples}/example-app-kotlin/proguard-rules.pro (100%) rename Adjust/{ => examples}/example-app-kotlin/src/main/AndroidManifest.xml (100%) rename Adjust/{ => examples}/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt (100%) rename Adjust/{ => examples}/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt (100%) rename Adjust/{ => examples}/example-app-kotlin/src/main/java/com/adjust/examples/ServiceActivity.kt (100%) rename Adjust/{ => examples}/example-app-kotlin/src/main/java/com/adjust/examples/ServiceExample.kt (100%) rename Adjust/{ => examples}/example-app-kotlin/src/main/res/layout/activity_main.xml (100%) rename Adjust/{ => examples}/example-app-kotlin/src/main/res/layout/activity_service.xml (100%) rename Adjust/{ => examples}/example-app-kotlin/src/main/res/menu/menu_main.xml (100%) rename Adjust/{ => examples}/example-app-kotlin/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-kotlin/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-kotlin/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-kotlin/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-kotlin/src/main/res/values-w820dp/dimens.xml (100%) rename Adjust/{ => examples}/example-app-kotlin/src/main/res/values/dimens.xml (100%) rename Adjust/{ => examples}/example-app-kotlin/src/main/res/values/strings.xml (100%) rename Adjust/{ => examples}/example-app-kotlin/src/main/res/values/styles.xml (100%) rename Adjust/{ => examples}/example-app-tv/build.gradle (100%) rename Adjust/{ => examples}/example-app-tv/proguard-rules.pro (100%) rename Adjust/{ => examples}/example-app-tv/src/main/AndroidManifest.xml (100%) rename Adjust/{ => examples}/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java (100%) rename Adjust/{ => examples}/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java (100%) rename Adjust/{ => examples}/example-app-tv/src/main/res/layout/activity_main.xml (100%) rename Adjust/{ => examples}/example-app-tv/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-tv/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-tv/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-tv/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-tv/src/main/res/values-w820dp/dimens.xml (100%) rename Adjust/{ => examples}/example-app-tv/src/main/res/values/dimens.xml (100%) rename Adjust/{ => examples}/example-app-tv/src/main/res/values/strings.xml (100%) rename Adjust/{ => examples}/example-app-tv/src/main/res/values/styles.xml (100%) rename Adjust/{ => examples}/example-app-webbridge/.gitignore (100%) rename Adjust/{ => examples}/example-app-webbridge/build.gradle (94%) rename Adjust/{ => examples}/example-app-webbridge/proguard-rules.pro (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/AndroidManifest.xml (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/assets/AdjustExample-WebView.html (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/java/com/example/examples/MainActivity.java (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/res/drawable-v24/ic_launcher_foreground.xml (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/res/drawable/ic_launcher_background.xml (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/res/layout/activity_main.xml (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher_round.png (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher_round.png (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher_round.png (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher_round.png (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/res/values/colors.xml (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/res/values/strings.xml (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/res/values/styles.xml (100%) rename Adjust/{ => examples}/example-app-webbridge/src/main/res/xml/network_security_config.xml (100%) rename Adjust/{ => plugins}/sdk-plugin-huawei-referrer/.gitignore (100%) rename Adjust/{ => plugins}/sdk-plugin-huawei-referrer/build.gradle (100%) rename Adjust/{ => plugins}/sdk-plugin-huawei-referrer/proguard-rules.pro (100%) rename Adjust/{ => plugins}/sdk-plugin-huawei-referrer/src/main/AndroidManifest.xml (100%) rename Adjust/{ => plugins}/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java (100%) rename Adjust/{ => plugins}/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerDetails.java (100%) rename Adjust/{ => plugins}/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerResult.java (100%) rename Adjust/{ => plugins}/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiReferrerClient.java (100%) rename Adjust/{ => plugins}/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java (100%) rename Adjust/{ => plugins}/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/Util.java (100%) rename Adjust/{ => plugins}/sdk-plugin-huawei-referrer/src/main/res/values/strings.xml (100%) rename Adjust/{ => plugins}/sdk-plugin-imei/.gitignore (100%) rename Adjust/{ => plugins}/sdk-plugin-imei/build.gradle (100%) rename Adjust/{ => plugins}/sdk-plugin-imei/proguard-rules.pro (100%) rename Adjust/{ => plugins}/sdk-plugin-imei/src/main/AndroidManifest.xml (100%) rename Adjust/{ => plugins}/sdk-plugin-imei/src/main/java/com/adjust/sdk/imei/AdjustImei.java (100%) rename Adjust/{ => plugins}/sdk-plugin-imei/src/main/java/com/adjust/sdk/imei/TelephonyIdsUtil.java (100%) rename Adjust/{ => plugins}/sdk-plugin-imei/src/main/java/com/adjust/sdk/imei/Util.java (100%) rename Adjust/{ => plugins}/sdk-plugin-imei/src/main/res/values/strings.xml (100%) rename Adjust/{ => plugins}/sdk-plugin-meta-referrer/.gitignore (100%) rename Adjust/{ => plugins}/sdk-plugin-meta-referrer/build.gradle (100%) rename Adjust/{ => plugins}/sdk-plugin-meta-referrer/proguard-rules.pro (100%) rename Adjust/{ => plugins}/sdk-plugin-meta-referrer/src/main/AndroidManifest.xml (100%) rename Adjust/{ => plugins}/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/AdjustMetaReferrer.java (100%) rename Adjust/{ => plugins}/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaInstallReferrerDetails.java (100%) rename Adjust/{ => plugins}/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaInstallReferrerResult.java (100%) rename Adjust/{ => plugins}/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaReferrerClient.java (100%) rename Adjust/{ => plugins}/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/OnMetaInstallReferrerReadListener.java (100%) rename Adjust/{ => plugins}/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/Util.java (100%) rename Adjust/{ => plugins}/sdk-plugin-meta-referrer/src/main/res/values/strings.xml (100%) rename Adjust/{ => plugins}/sdk-plugin-oaid/.gitignore (100%) rename Adjust/{ => plugins}/sdk-plugin-oaid/build.gradle (100%) rename Adjust/{ => plugins}/sdk-plugin-oaid/libs/oaid_sdk_2.0.0.aar (100%) rename Adjust/{ => plugins}/sdk-plugin-oaid/proguard-rules.pro (100%) rename Adjust/{ => plugins}/sdk-plugin-oaid/src/main/AndroidManifest.xml (100%) rename Adjust/{ => plugins}/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/AdjustOaid.java (100%) rename Adjust/{ => plugins}/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/HmsSdkClient.java (100%) rename Adjust/{ => plugins}/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/MsaSdkClient.java (100%) rename Adjust/{ => plugins}/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OaidInfo.java (100%) rename Adjust/{ => plugins}/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OaidResult.java (100%) rename Adjust/{ => plugins}/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OnOaidReadListener.java (100%) rename Adjust/{ => plugins}/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/Util.java (100%) rename Adjust/{ => plugins}/sdk-plugin-oaid/src/main/res/values/strings.xml (100%) rename Adjust/{ => plugins}/sdk-plugin-samsung-clouddev/.gitignore (100%) rename Adjust/{ => plugins}/sdk-plugin-samsung-clouddev/build.gradle (100%) rename Adjust/{ => plugins}/sdk-plugin-samsung-clouddev/proguard-rules.pro (100%) rename Adjust/{ => plugins}/sdk-plugin-samsung-clouddev/src/main/AndroidManifest.xml (100%) rename Adjust/{ => plugins}/sdk-plugin-samsung-clouddev/src/main/java/com/adjust/sdk/samsung/clouddev/AdjustSamsungCloudDev.java (100%) rename Adjust/{ => plugins}/sdk-plugin-samsung-clouddev/src/main/java/com/adjust/sdk/samsung/clouddev/SamsungCloudDevClient.java (100%) rename Adjust/{ => plugins}/sdk-plugin-samsung-clouddev/src/main/java/com/adjust/sdk/samsung/clouddev/Util.java (100%) rename Adjust/{ => plugins}/sdk-plugin-samsung-clouddev/src/main/res/values/strings.xml (100%) rename Adjust/{ => plugins}/sdk-plugin-samsung-referrer/.gitignore (100%) rename Adjust/{ => plugins}/sdk-plugin-samsung-referrer/build.gradle (100%) rename Adjust/{ => plugins}/sdk-plugin-samsung-referrer/proguard-rules.pro (100%) rename Adjust/{ => plugins}/sdk-plugin-samsung-referrer/src/main/AndroidManifest.xml (100%) rename Adjust/{ => plugins}/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java (100%) rename Adjust/{ => plugins}/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java (100%) rename Adjust/{ => plugins}/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerDetails.java (100%) rename Adjust/{ => plugins}/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerResult.java (100%) rename Adjust/{ => plugins}/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungReferrerClient.java (100%) rename Adjust/{ => plugins}/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java (100%) rename Adjust/{ => plugins}/sdk-plugin-samsung-referrer/src/main/res/values/strings.xml (100%) rename Adjust/{ => plugins}/sdk-plugin-vivo-referrer/.gitignore (100%) rename Adjust/{ => plugins}/sdk-plugin-vivo-referrer/build.gradle (100%) rename Adjust/{ => plugins}/sdk-plugin-vivo-referrer/proguard-rules.pro (100%) rename Adjust/{ => plugins}/sdk-plugin-vivo-referrer/src/main/AndroidManifest.xml (100%) rename Adjust/{ => plugins}/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java (100%) rename Adjust/{ => plugins}/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/OnVivoInstallReferrerReadListener.java (100%) rename Adjust/{ => plugins}/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/Util.java (100%) rename Adjust/{ => plugins}/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerDetails.java (100%) rename Adjust/{ => plugins}/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerResult.java (100%) rename Adjust/{ => plugins}/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoReferrerClient.java (100%) rename Adjust/{ => plugins}/sdk-plugin-vivo-referrer/src/main/res/values/strings.xml (100%) rename Adjust/{ => plugins}/sdk-plugin-webbridge/.gitignore (100%) rename Adjust/{ => plugins}/sdk-plugin-webbridge/build.gradle (100%) rename Adjust/{ => plugins}/sdk-plugin-webbridge/proguard-rules.pro (100%) rename Adjust/{ => plugins}/sdk-plugin-webbridge/src/main/AndroidManifest.xml (100%) rename Adjust/{ => plugins}/sdk-plugin-webbridge/src/main/assets/adjust.js (100%) rename Adjust/{ => plugins}/sdk-plugin-webbridge/src/main/assets/adjust_config.js (100%) rename Adjust/{ => plugins}/sdk-plugin-webbridge/src/main/assets/adjust_event.js (100%) rename Adjust/{ => plugins}/sdk-plugin-webbridge/src/main/assets/adjust_third_party_sharing.js (100%) rename Adjust/{ => plugins}/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridge.java (100%) rename Adjust/{ => plugins}/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java (100%) rename Adjust/{ => plugins}/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java (100%) rename Adjust/{ => plugins}/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/FacebookSDKJSInterface.java (100%) rename Adjust/{ => plugins}/sdk-plugin-xiaomi-referrer/.gitignore (100%) rename Adjust/{ => plugins}/sdk-plugin-xiaomi-referrer/build.gradle (100%) rename Adjust/{ => plugins}/sdk-plugin-xiaomi-referrer/proguard-rules.pro (100%) rename Adjust/{ => plugins}/sdk-plugin-xiaomi-referrer/src/main/AndroidManifest.xml (100%) rename Adjust/{ => plugins}/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/AdjustXiaomiReferrer.java (100%) rename Adjust/{ => plugins}/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/OnXiaomiInstallReferrerReadListener.java (100%) rename Adjust/{ => plugins}/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/Util.java (100%) rename Adjust/{ => plugins}/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiInstallReferrerDetails.java (100%) rename Adjust/{ => plugins}/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiInstallReferrerResult.java (100%) rename Adjust/{ => plugins}/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiReferrerClient.java (100%) rename Adjust/{ => plugins}/sdk-plugin-xiaomi-referrer/src/main/res/values/strings.xml (100%) rename Adjust/{ => tests}/test-app-core/.gitignore (100%) rename Adjust/{ => tests}/test-app-core/build.gradle (88%) rename Adjust/{ => tests}/test-app-core/proguard-rules.pro (100%) rename Adjust/{ => tests}/test-app-core/src/main/AndroidManifest.xml (100%) rename Adjust/{ => tests}/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java (100%) rename Adjust/{ => tests}/test-app-core/src/main/java/com/adjust/testapp/Command.java (100%) rename Adjust/{ => tests}/test-app-core/src/main/java/com/adjust/testapp/CommandListener.java (100%) rename Adjust/{ => tests}/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java (100%) rename Adjust/{ => tests}/test-app-core/src/main/java/com/adjust/testapp/Util.java (100%) rename Adjust/{ => tests}/test-app-core/src/main/res/drawable-v24/ic_launcher_foreground.xml (100%) rename Adjust/{ => tests}/test-app-core/src/main/res/drawable/ic_launcher_background.xml (100%) rename Adjust/{ => tests}/test-app-core/src/main/res/layout/activity_main.xml (100%) rename Adjust/{ => tests}/test-app-core/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename Adjust/{ => tests}/test-app-core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) rename Adjust/{ => tests}/test-app-core/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename Adjust/{ => tests}/test-app-core/src/main/res/mipmap-hdpi/ic_launcher_round.png (100%) rename Adjust/{ => tests}/test-app-core/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename Adjust/{ => tests}/test-app-core/src/main/res/mipmap-mdpi/ic_launcher_round.png (100%) rename Adjust/{ => tests}/test-app-core/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename Adjust/{ => tests}/test-app-core/src/main/res/mipmap-xhdpi/ic_launcher_round.png (100%) rename Adjust/{ => tests}/test-app-core/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename Adjust/{ => tests}/test-app-core/src/main/res/mipmap-xxhdpi/ic_launcher_round.png (100%) rename Adjust/{ => tests}/test-app-core/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename Adjust/{ => tests}/test-app-core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png (100%) rename Adjust/{ => tests}/test-app-core/src/main/res/values/colors.xml (100%) rename Adjust/{ => tests}/test-app-core/src/main/res/values/strings.xml (100%) rename Adjust/{ => tests}/test-app-core/src/main/res/values/styles.xml (100%) rename Adjust/{ => tests}/test-app-webbridge/.gitignore (100%) rename Adjust/{ => tests}/test-app-webbridge/build.gradle (84%) rename Adjust/{ => tests}/test-app-webbridge/proguard-rules.pro (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/AndroidManifest.xml (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/assets/AdjustTestApp-WebView.html (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/assets/command_executor.js (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/assets/test_library.js (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/java/com/example/testappwebbridge/MainActivity.java (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/java/com/example/testappwebbridge/TestLibraryBridge.java (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/res/drawable-v24/ic_launcher_foreground.xml (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/res/drawable/ic_launcher_background.xml (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/res/layout/activity_main.xml (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher_round.png (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher_round.png (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher_round.png (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher_round.png (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/res/values/colors.xml (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/res/values/strings.xml (100%) rename Adjust/{ => tests}/test-app-webbridge/src/main/res/values/styles.xml (100%) rename Adjust/{ => tests}/test-library/.gitignore (100%) rename Adjust/{ => tests}/test-library/build.gradle (100%) rename Adjust/{ => tests}/test-library/proguard-rules.pro (100%) rename Adjust/{ => tests}/test-library/src/main/AndroidManifest.xml (100%) rename Adjust/{ => tests}/test-library/src/main/java/com/adjust/test/Constants.java (100%) rename Adjust/{ => tests}/test-library/src/main/java/com/adjust/test/ICommandJsonListener.java (100%) rename Adjust/{ => tests}/test-library/src/main/java/com/adjust/test/ICommandListener.java (100%) rename Adjust/{ => tests}/test-library/src/main/java/com/adjust/test/ICommandRawJsonListener.java (100%) rename Adjust/{ => tests}/test-library/src/main/java/com/adjust/test/IOnExitListener.java (100%) rename Adjust/{ => tests}/test-library/src/main/java/com/adjust/test/Networking.java (100%) rename Adjust/{ => tests}/test-library/src/main/java/com/adjust/test/TestCommand.java (100%) rename Adjust/{ => tests}/test-library/src/main/java/com/adjust/test/TestLibrary.java (100%) rename Adjust/{ => tests}/test-library/src/main/java/com/adjust/test/Utils.java (100%) rename Adjust/{ => tests}/test-library/src/main/java/com/adjust/test/ws/ControlSignal.java (100%) rename Adjust/{ => tests}/test-library/src/main/java/com/adjust/test/ws/ControlWebSocketClient.java (100%) rename Adjust/{ => tests}/test-library/src/main/java/com/adjust/test/ws/SignalType.java (100%) rename Adjust/{ => tests}/test-library/src/main/res/values/strings.xml (100%) rename Adjust/{ => tests}/test-options/.gitignore (100%) rename Adjust/{ => tests}/test-options/build.gradle (100%) rename Adjust/{ => tests}/test-options/consumer-rules.pro (100%) rename Adjust/{ => tests}/test-options/proguard-rules.pro (100%) rename Adjust/{ => tests}/test-options/src/main/AndroidManifest.xml (100%) rename Adjust/{ => tests}/test-options/src/main/java/com/adjust/test_options/TLSSocketFactory.java (100%) rename Adjust/{ => tests}/test-options/src/main/java/com/adjust/test_options/TestConnectionOptions.java (100%) diff --git a/Adjust/example-app-fbpixel/.gitignore b/Adjust/examples/example-app-fbpixel/.gitignore similarity index 100% rename from Adjust/example-app-fbpixel/.gitignore rename to Adjust/examples/example-app-fbpixel/.gitignore diff --git a/Adjust/example-app-fbpixel/build.gradle b/Adjust/examples/example-app-fbpixel/build.gradle similarity index 94% rename from Adjust/example-app-fbpixel/build.gradle rename to Adjust/examples/example-app-fbpixel/build.gradle index 0a45c9e67..2fc022ec1 100644 --- a/Adjust/example-app-fbpixel/build.gradle +++ b/Adjust/examples/example-app-fbpixel/build.gradle @@ -34,5 +34,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.0.2' implementation project(':sdk-core') - implementation project(':sdk-plugin-webbridge') + implementation project(':plugins:sdk-plugin-webbridge') } diff --git a/Adjust/example-app-fbpixel/proguard-rules.pro b/Adjust/examples/example-app-fbpixel/proguard-rules.pro similarity index 100% rename from Adjust/example-app-fbpixel/proguard-rules.pro rename to Adjust/examples/example-app-fbpixel/proguard-rules.pro diff --git a/Adjust/example-app-fbpixel/src/main/AndroidManifest.xml b/Adjust/examples/example-app-fbpixel/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/example-app-fbpixel/src/main/AndroidManifest.xml rename to Adjust/examples/example-app-fbpixel/src/main/AndroidManifest.xml diff --git a/Adjust/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html b/Adjust/examples/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html similarity index 100% rename from Adjust/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html rename to Adjust/examples/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html diff --git a/Adjust/example-app-fbpixel/src/main/java/com/adjust/examples/MainActivity.java b/Adjust/examples/example-app-fbpixel/src/main/java/com/adjust/examples/MainActivity.java similarity index 100% rename from Adjust/example-app-fbpixel/src/main/java/com/adjust/examples/MainActivity.java rename to Adjust/examples/example-app-fbpixel/src/main/java/com/adjust/examples/MainActivity.java diff --git a/Adjust/example-app-fbpixel/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Adjust/examples/example-app-fbpixel/src/main/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from Adjust/example-app-fbpixel/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to Adjust/examples/example-app-fbpixel/src/main/res/drawable-v24/ic_launcher_foreground.xml diff --git a/Adjust/example-app-fbpixel/src/main/res/drawable/ic_launcher_background.xml b/Adjust/examples/example-app-fbpixel/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from Adjust/example-app-fbpixel/src/main/res/drawable/ic_launcher_background.xml rename to Adjust/examples/example-app-fbpixel/src/main/res/drawable/ic_launcher_background.xml diff --git a/Adjust/example-app-fbpixel/src/main/res/layout/activity_main.xml b/Adjust/examples/example-app-fbpixel/src/main/res/layout/activity_main.xml similarity index 100% rename from Adjust/example-app-fbpixel/src/main/res/layout/activity_main.xml rename to Adjust/examples/example-app-fbpixel/src/main/res/layout/activity_main.xml diff --git a/Adjust/example-app-fbpixel/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Adjust/examples/example-app-fbpixel/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from Adjust/example-app-fbpixel/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to Adjust/examples/example-app-fbpixel/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/Adjust/example-app-fbpixel/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Adjust/examples/example-app-fbpixel/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from Adjust/example-app-fbpixel/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to Adjust/examples/example-app-fbpixel/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/Adjust/example-app-fbpixel/src/main/res/mipmap-hdpi/ic_launcher.png b/Adjust/examples/example-app-fbpixel/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-fbpixel/src/main/res/mipmap-hdpi/ic_launcher.png rename to Adjust/examples/example-app-fbpixel/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/Adjust/example-app-fbpixel/src/main/res/mipmap-hdpi/ic_launcher_round.png b/Adjust/examples/example-app-fbpixel/src/main/res/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from Adjust/example-app-fbpixel/src/main/res/mipmap-hdpi/ic_launcher_round.png rename to Adjust/examples/example-app-fbpixel/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/Adjust/example-app-fbpixel/src/main/res/mipmap-mdpi/ic_launcher.png b/Adjust/examples/example-app-fbpixel/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-fbpixel/src/main/res/mipmap-mdpi/ic_launcher.png rename to Adjust/examples/example-app-fbpixel/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/Adjust/example-app-fbpixel/src/main/res/mipmap-mdpi/ic_launcher_round.png b/Adjust/examples/example-app-fbpixel/src/main/res/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from Adjust/example-app-fbpixel/src/main/res/mipmap-mdpi/ic_launcher_round.png rename to Adjust/examples/example-app-fbpixel/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/Adjust/example-app-fbpixel/src/main/res/mipmap-xhdpi/ic_launcher.png b/Adjust/examples/example-app-fbpixel/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-fbpixel/src/main/res/mipmap-xhdpi/ic_launcher.png rename to Adjust/examples/example-app-fbpixel/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/Adjust/example-app-fbpixel/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/Adjust/examples/example-app-fbpixel/src/main/res/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from Adjust/example-app-fbpixel/src/main/res/mipmap-xhdpi/ic_launcher_round.png rename to Adjust/examples/example-app-fbpixel/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/Adjust/example-app-fbpixel/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Adjust/examples/example-app-fbpixel/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-fbpixel/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to Adjust/examples/example-app-fbpixel/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/Adjust/example-app-fbpixel/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/Adjust/examples/example-app-fbpixel/src/main/res/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from Adjust/example-app-fbpixel/src/main/res/mipmap-xxhdpi/ic_launcher_round.png rename to Adjust/examples/example-app-fbpixel/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/Adjust/example-app-fbpixel/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/Adjust/examples/example-app-fbpixel/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-fbpixel/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to Adjust/examples/example-app-fbpixel/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/Adjust/example-app-fbpixel/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/Adjust/examples/example-app-fbpixel/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from Adjust/example-app-fbpixel/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png rename to Adjust/examples/example-app-fbpixel/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/Adjust/example-app-fbpixel/src/main/res/values/colors.xml b/Adjust/examples/example-app-fbpixel/src/main/res/values/colors.xml similarity index 100% rename from Adjust/example-app-fbpixel/src/main/res/values/colors.xml rename to Adjust/examples/example-app-fbpixel/src/main/res/values/colors.xml diff --git a/Adjust/example-app-fbpixel/src/main/res/values/strings.xml b/Adjust/examples/example-app-fbpixel/src/main/res/values/strings.xml similarity index 100% rename from Adjust/example-app-fbpixel/src/main/res/values/strings.xml rename to Adjust/examples/example-app-fbpixel/src/main/res/values/strings.xml diff --git a/Adjust/example-app-fbpixel/src/main/res/values/styles.xml b/Adjust/examples/example-app-fbpixel/src/main/res/values/styles.xml similarity index 100% rename from Adjust/example-app-fbpixel/src/main/res/values/styles.xml rename to Adjust/examples/example-app-fbpixel/src/main/res/values/styles.xml diff --git a/Adjust/example-app-fbpixel/src/main/res/xml/network_security_config.xml b/Adjust/examples/example-app-fbpixel/src/main/res/xml/network_security_config.xml similarity index 100% rename from Adjust/example-app-fbpixel/src/main/res/xml/network_security_config.xml rename to Adjust/examples/example-app-fbpixel/src/main/res/xml/network_security_config.xml diff --git a/Adjust/example-app-java/build.gradle b/Adjust/examples/example-app-java/build.gradle similarity index 100% rename from Adjust/example-app-java/build.gradle rename to Adjust/examples/example-app-java/build.gradle diff --git a/Adjust/example-app-java/proguard-rules.pro b/Adjust/examples/example-app-java/proguard-rules.pro similarity index 100% rename from Adjust/example-app-java/proguard-rules.pro rename to Adjust/examples/example-app-java/proguard-rules.pro diff --git a/Adjust/example-app-java/src/main/AndroidManifest.xml b/Adjust/examples/example-app-java/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/example-app-java/src/main/AndroidManifest.xml rename to Adjust/examples/example-app-java/src/main/AndroidManifest.xml diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java similarity index 100% rename from Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java rename to Adjust/examples/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java b/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/MainActivity.java similarity index 100% rename from Adjust/example-app-java/src/main/java/com/adjust/examples/MainActivity.java rename to Adjust/examples/example-app-java/src/main/java/com/adjust/examples/MainActivity.java diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/ServiceActivity.java b/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/ServiceActivity.java similarity index 100% rename from Adjust/example-app-java/src/main/java/com/adjust/examples/ServiceActivity.java rename to Adjust/examples/example-app-java/src/main/java/com/adjust/examples/ServiceActivity.java diff --git a/Adjust/example-app-java/src/main/java/com/adjust/examples/ServiceExample.java b/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/ServiceExample.java similarity index 100% rename from Adjust/example-app-java/src/main/java/com/adjust/examples/ServiceExample.java rename to Adjust/examples/example-app-java/src/main/java/com/adjust/examples/ServiceExample.java diff --git a/Adjust/example-app-java/src/main/res/layout/activity_main.xml b/Adjust/examples/example-app-java/src/main/res/layout/activity_main.xml similarity index 100% rename from Adjust/example-app-java/src/main/res/layout/activity_main.xml rename to Adjust/examples/example-app-java/src/main/res/layout/activity_main.xml diff --git a/Adjust/example-app-java/src/main/res/layout/activity_service.xml b/Adjust/examples/example-app-java/src/main/res/layout/activity_service.xml similarity index 100% rename from Adjust/example-app-java/src/main/res/layout/activity_service.xml rename to Adjust/examples/example-app-java/src/main/res/layout/activity_service.xml diff --git a/Adjust/example-app-java/src/main/res/menu/menu_main.xml b/Adjust/examples/example-app-java/src/main/res/menu/menu_main.xml similarity index 100% rename from Adjust/example-app-java/src/main/res/menu/menu_main.xml rename to Adjust/examples/example-app-java/src/main/res/menu/menu_main.xml diff --git a/Adjust/example-app-java/src/main/res/mipmap-hdpi/ic_launcher.png b/Adjust/examples/example-app-java/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-java/src/main/res/mipmap-hdpi/ic_launcher.png rename to Adjust/examples/example-app-java/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/Adjust/example-app-java/src/main/res/mipmap-mdpi/ic_launcher.png b/Adjust/examples/example-app-java/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-java/src/main/res/mipmap-mdpi/ic_launcher.png rename to Adjust/examples/example-app-java/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/Adjust/example-app-java/src/main/res/mipmap-xhdpi/ic_launcher.png b/Adjust/examples/example-app-java/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-java/src/main/res/mipmap-xhdpi/ic_launcher.png rename to Adjust/examples/example-app-java/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/Adjust/example-app-java/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Adjust/examples/example-app-java/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-java/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to Adjust/examples/example-app-java/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/Adjust/example-app-java/src/main/res/values-w820dp/dimens.xml b/Adjust/examples/example-app-java/src/main/res/values-w820dp/dimens.xml similarity index 100% rename from Adjust/example-app-java/src/main/res/values-w820dp/dimens.xml rename to Adjust/examples/example-app-java/src/main/res/values-w820dp/dimens.xml diff --git a/Adjust/example-app-java/src/main/res/values/dimens.xml b/Adjust/examples/example-app-java/src/main/res/values/dimens.xml similarity index 100% rename from Adjust/example-app-java/src/main/res/values/dimens.xml rename to Adjust/examples/example-app-java/src/main/res/values/dimens.xml diff --git a/Adjust/example-app-java/src/main/res/values/strings.xml b/Adjust/examples/example-app-java/src/main/res/values/strings.xml similarity index 100% rename from Adjust/example-app-java/src/main/res/values/strings.xml rename to Adjust/examples/example-app-java/src/main/res/values/strings.xml diff --git a/Adjust/example-app-java/src/main/res/values/styles.xml b/Adjust/examples/example-app-java/src/main/res/values/styles.xml similarity index 100% rename from Adjust/example-app-java/src/main/res/values/styles.xml rename to Adjust/examples/example-app-java/src/main/res/values/styles.xml diff --git a/Adjust/example-app-keyboard/build.gradle b/Adjust/examples/example-app-keyboard/build.gradle similarity index 100% rename from Adjust/example-app-keyboard/build.gradle rename to Adjust/examples/example-app-keyboard/build.gradle diff --git a/Adjust/example-app-keyboard/proguard-rules.pro b/Adjust/examples/example-app-keyboard/proguard-rules.pro similarity index 100% rename from Adjust/example-app-keyboard/proguard-rules.pro rename to Adjust/examples/example-app-keyboard/proguard-rules.pro diff --git a/Adjust/example-app-keyboard/src/main/AndroidManifest.xml b/Adjust/examples/example-app-keyboard/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/example-app-keyboard/src/main/AndroidManifest.xml rename to Adjust/examples/example-app-keyboard/src/main/AndroidManifest.xml diff --git a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java b/Adjust/examples/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java similarity index 100% rename from Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java rename to Adjust/examples/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java diff --git a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/KeyboardInputMethodService.java b/Adjust/examples/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/KeyboardInputMethodService.java similarity index 100% rename from Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/KeyboardInputMethodService.java rename to Adjust/examples/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/KeyboardInputMethodService.java diff --git a/Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/MainActivity.java b/Adjust/examples/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/MainActivity.java similarity index 100% rename from Adjust/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/MainActivity.java rename to Adjust/examples/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/MainActivity.java diff --git a/Adjust/example-app-keyboard/src/main/res/layout/activity_main.xml b/Adjust/examples/example-app-keyboard/src/main/res/layout/activity_main.xml similarity index 100% rename from Adjust/example-app-keyboard/src/main/res/layout/activity_main.xml rename to Adjust/examples/example-app-keyboard/src/main/res/layout/activity_main.xml diff --git a/Adjust/example-app-keyboard/src/main/res/layout/key_preview.xml b/Adjust/examples/example-app-keyboard/src/main/res/layout/key_preview.xml similarity index 100% rename from Adjust/example-app-keyboard/src/main/res/layout/key_preview.xml rename to Adjust/examples/example-app-keyboard/src/main/res/layout/key_preview.xml diff --git a/Adjust/example-app-keyboard/src/main/res/layout/keyboard_view.xml b/Adjust/examples/example-app-keyboard/src/main/res/layout/keyboard_view.xml similarity index 100% rename from Adjust/example-app-keyboard/src/main/res/layout/keyboard_view.xml rename to Adjust/examples/example-app-keyboard/src/main/res/layout/keyboard_view.xml diff --git a/Adjust/example-app-keyboard/src/main/res/mipmap-hdpi/ic_launcher.png b/Adjust/examples/example-app-keyboard/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-keyboard/src/main/res/mipmap-hdpi/ic_launcher.png rename to Adjust/examples/example-app-keyboard/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/Adjust/example-app-keyboard/src/main/res/mipmap-mdpi/ic_launcher.png b/Adjust/examples/example-app-keyboard/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-keyboard/src/main/res/mipmap-mdpi/ic_launcher.png rename to Adjust/examples/example-app-keyboard/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/Adjust/example-app-keyboard/src/main/res/mipmap-xhdpi/ic_launcher.png b/Adjust/examples/example-app-keyboard/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-keyboard/src/main/res/mipmap-xhdpi/ic_launcher.png rename to Adjust/examples/example-app-keyboard/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/Adjust/example-app-keyboard/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Adjust/examples/example-app-keyboard/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-keyboard/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to Adjust/examples/example-app-keyboard/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/Adjust/example-app-keyboard/src/main/res/values-w820dp/dimens.xml b/Adjust/examples/example-app-keyboard/src/main/res/values-w820dp/dimens.xml similarity index 100% rename from Adjust/example-app-keyboard/src/main/res/values-w820dp/dimens.xml rename to Adjust/examples/example-app-keyboard/src/main/res/values-w820dp/dimens.xml diff --git a/Adjust/example-app-keyboard/src/main/res/values/colors.xml b/Adjust/examples/example-app-keyboard/src/main/res/values/colors.xml similarity index 100% rename from Adjust/example-app-keyboard/src/main/res/values/colors.xml rename to Adjust/examples/example-app-keyboard/src/main/res/values/colors.xml diff --git a/Adjust/example-app-keyboard/src/main/res/values/dimens.xml b/Adjust/examples/example-app-keyboard/src/main/res/values/dimens.xml similarity index 100% rename from Adjust/example-app-keyboard/src/main/res/values/dimens.xml rename to Adjust/examples/example-app-keyboard/src/main/res/values/dimens.xml diff --git a/Adjust/example-app-keyboard/src/main/res/values/strings.xml b/Adjust/examples/example-app-keyboard/src/main/res/values/strings.xml similarity index 100% rename from Adjust/example-app-keyboard/src/main/res/values/strings.xml rename to Adjust/examples/example-app-keyboard/src/main/res/values/strings.xml diff --git a/Adjust/example-app-keyboard/src/main/res/values/styles.xml b/Adjust/examples/example-app-keyboard/src/main/res/values/styles.xml similarity index 100% rename from Adjust/example-app-keyboard/src/main/res/values/styles.xml rename to Adjust/examples/example-app-keyboard/src/main/res/values/styles.xml diff --git a/Adjust/example-app-keyboard/src/main/res/xml/keyboard.xml b/Adjust/examples/example-app-keyboard/src/main/res/xml/keyboard.xml similarity index 100% rename from Adjust/example-app-keyboard/src/main/res/xml/keyboard.xml rename to Adjust/examples/example-app-keyboard/src/main/res/xml/keyboard.xml diff --git a/Adjust/example-app-keyboard/src/main/res/xml/method.xml b/Adjust/examples/example-app-keyboard/src/main/res/xml/method.xml similarity index 100% rename from Adjust/example-app-keyboard/src/main/res/xml/method.xml rename to Adjust/examples/example-app-keyboard/src/main/res/xml/method.xml diff --git a/Adjust/example-app-kotlin/.gitignore b/Adjust/examples/example-app-kotlin/.gitignore similarity index 100% rename from Adjust/example-app-kotlin/.gitignore rename to Adjust/examples/example-app-kotlin/.gitignore diff --git a/Adjust/example-app-kotlin/build.gradle b/Adjust/examples/example-app-kotlin/build.gradle similarity index 100% rename from Adjust/example-app-kotlin/build.gradle rename to Adjust/examples/example-app-kotlin/build.gradle diff --git a/Adjust/example-app-kotlin/proguard-rules.pro b/Adjust/examples/example-app-kotlin/proguard-rules.pro similarity index 100% rename from Adjust/example-app-kotlin/proguard-rules.pro rename to Adjust/examples/example-app-kotlin/proguard-rules.pro diff --git a/Adjust/example-app-kotlin/src/main/AndroidManifest.xml b/Adjust/examples/example-app-kotlin/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/example-app-kotlin/src/main/AndroidManifest.xml rename to Adjust/examples/example-app-kotlin/src/main/AndroidManifest.xml diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt b/Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt similarity index 100% rename from Adjust/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt rename to Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt b/Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt similarity index 100% rename from Adjust/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt rename to Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/ServiceActivity.kt b/Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/ServiceActivity.kt similarity index 100% rename from Adjust/example-app-kotlin/src/main/java/com/adjust/examples/ServiceActivity.kt rename to Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/ServiceActivity.kt diff --git a/Adjust/example-app-kotlin/src/main/java/com/adjust/examples/ServiceExample.kt b/Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/ServiceExample.kt similarity index 100% rename from Adjust/example-app-kotlin/src/main/java/com/adjust/examples/ServiceExample.kt rename to Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/ServiceExample.kt diff --git a/Adjust/example-app-kotlin/src/main/res/layout/activity_main.xml b/Adjust/examples/example-app-kotlin/src/main/res/layout/activity_main.xml similarity index 100% rename from Adjust/example-app-kotlin/src/main/res/layout/activity_main.xml rename to Adjust/examples/example-app-kotlin/src/main/res/layout/activity_main.xml diff --git a/Adjust/example-app-kotlin/src/main/res/layout/activity_service.xml b/Adjust/examples/example-app-kotlin/src/main/res/layout/activity_service.xml similarity index 100% rename from Adjust/example-app-kotlin/src/main/res/layout/activity_service.xml rename to Adjust/examples/example-app-kotlin/src/main/res/layout/activity_service.xml diff --git a/Adjust/example-app-kotlin/src/main/res/menu/menu_main.xml b/Adjust/examples/example-app-kotlin/src/main/res/menu/menu_main.xml similarity index 100% rename from Adjust/example-app-kotlin/src/main/res/menu/menu_main.xml rename to Adjust/examples/example-app-kotlin/src/main/res/menu/menu_main.xml diff --git a/Adjust/example-app-kotlin/src/main/res/mipmap-hdpi/ic_launcher.png b/Adjust/examples/example-app-kotlin/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-kotlin/src/main/res/mipmap-hdpi/ic_launcher.png rename to Adjust/examples/example-app-kotlin/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/Adjust/example-app-kotlin/src/main/res/mipmap-mdpi/ic_launcher.png b/Adjust/examples/example-app-kotlin/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-kotlin/src/main/res/mipmap-mdpi/ic_launcher.png rename to Adjust/examples/example-app-kotlin/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/Adjust/example-app-kotlin/src/main/res/mipmap-xhdpi/ic_launcher.png b/Adjust/examples/example-app-kotlin/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-kotlin/src/main/res/mipmap-xhdpi/ic_launcher.png rename to Adjust/examples/example-app-kotlin/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/Adjust/example-app-kotlin/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Adjust/examples/example-app-kotlin/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-kotlin/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to Adjust/examples/example-app-kotlin/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/Adjust/example-app-kotlin/src/main/res/values-w820dp/dimens.xml b/Adjust/examples/example-app-kotlin/src/main/res/values-w820dp/dimens.xml similarity index 100% rename from Adjust/example-app-kotlin/src/main/res/values-w820dp/dimens.xml rename to Adjust/examples/example-app-kotlin/src/main/res/values-w820dp/dimens.xml diff --git a/Adjust/example-app-kotlin/src/main/res/values/dimens.xml b/Adjust/examples/example-app-kotlin/src/main/res/values/dimens.xml similarity index 100% rename from Adjust/example-app-kotlin/src/main/res/values/dimens.xml rename to Adjust/examples/example-app-kotlin/src/main/res/values/dimens.xml diff --git a/Adjust/example-app-kotlin/src/main/res/values/strings.xml b/Adjust/examples/example-app-kotlin/src/main/res/values/strings.xml similarity index 100% rename from Adjust/example-app-kotlin/src/main/res/values/strings.xml rename to Adjust/examples/example-app-kotlin/src/main/res/values/strings.xml diff --git a/Adjust/example-app-kotlin/src/main/res/values/styles.xml b/Adjust/examples/example-app-kotlin/src/main/res/values/styles.xml similarity index 100% rename from Adjust/example-app-kotlin/src/main/res/values/styles.xml rename to Adjust/examples/example-app-kotlin/src/main/res/values/styles.xml diff --git a/Adjust/example-app-tv/build.gradle b/Adjust/examples/example-app-tv/build.gradle similarity index 100% rename from Adjust/example-app-tv/build.gradle rename to Adjust/examples/example-app-tv/build.gradle diff --git a/Adjust/example-app-tv/proguard-rules.pro b/Adjust/examples/example-app-tv/proguard-rules.pro similarity index 100% rename from Adjust/example-app-tv/proguard-rules.pro rename to Adjust/examples/example-app-tv/proguard-rules.pro diff --git a/Adjust/example-app-tv/src/main/AndroidManifest.xml b/Adjust/examples/example-app-tv/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/example-app-tv/src/main/AndroidManifest.xml rename to Adjust/examples/example-app-tv/src/main/AndroidManifest.xml diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/examples/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java similarity index 100% rename from Adjust/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java rename to Adjust/examples/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java diff --git a/Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java b/Adjust/examples/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java similarity index 100% rename from Adjust/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java rename to Adjust/examples/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java diff --git a/Adjust/example-app-tv/src/main/res/layout/activity_main.xml b/Adjust/examples/example-app-tv/src/main/res/layout/activity_main.xml similarity index 100% rename from Adjust/example-app-tv/src/main/res/layout/activity_main.xml rename to Adjust/examples/example-app-tv/src/main/res/layout/activity_main.xml diff --git a/Adjust/example-app-tv/src/main/res/mipmap-hdpi/ic_launcher.png b/Adjust/examples/example-app-tv/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-tv/src/main/res/mipmap-hdpi/ic_launcher.png rename to Adjust/examples/example-app-tv/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/Adjust/example-app-tv/src/main/res/mipmap-mdpi/ic_launcher.png b/Adjust/examples/example-app-tv/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-tv/src/main/res/mipmap-mdpi/ic_launcher.png rename to Adjust/examples/example-app-tv/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/Adjust/example-app-tv/src/main/res/mipmap-xhdpi/ic_launcher.png b/Adjust/examples/example-app-tv/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-tv/src/main/res/mipmap-xhdpi/ic_launcher.png rename to Adjust/examples/example-app-tv/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/Adjust/example-app-tv/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Adjust/examples/example-app-tv/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-tv/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to Adjust/examples/example-app-tv/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/Adjust/example-app-tv/src/main/res/values-w820dp/dimens.xml b/Adjust/examples/example-app-tv/src/main/res/values-w820dp/dimens.xml similarity index 100% rename from Adjust/example-app-tv/src/main/res/values-w820dp/dimens.xml rename to Adjust/examples/example-app-tv/src/main/res/values-w820dp/dimens.xml diff --git a/Adjust/example-app-tv/src/main/res/values/dimens.xml b/Adjust/examples/example-app-tv/src/main/res/values/dimens.xml similarity index 100% rename from Adjust/example-app-tv/src/main/res/values/dimens.xml rename to Adjust/examples/example-app-tv/src/main/res/values/dimens.xml diff --git a/Adjust/example-app-tv/src/main/res/values/strings.xml b/Adjust/examples/example-app-tv/src/main/res/values/strings.xml similarity index 100% rename from Adjust/example-app-tv/src/main/res/values/strings.xml rename to Adjust/examples/example-app-tv/src/main/res/values/strings.xml diff --git a/Adjust/example-app-tv/src/main/res/values/styles.xml b/Adjust/examples/example-app-tv/src/main/res/values/styles.xml similarity index 100% rename from Adjust/example-app-tv/src/main/res/values/styles.xml rename to Adjust/examples/example-app-tv/src/main/res/values/styles.xml diff --git a/Adjust/example-app-webbridge/.gitignore b/Adjust/examples/example-app-webbridge/.gitignore similarity index 100% rename from Adjust/example-app-webbridge/.gitignore rename to Adjust/examples/example-app-webbridge/.gitignore diff --git a/Adjust/example-app-webbridge/build.gradle b/Adjust/examples/example-app-webbridge/build.gradle similarity index 94% rename from Adjust/example-app-webbridge/build.gradle rename to Adjust/examples/example-app-webbridge/build.gradle index bb9bd3f62..c681a5251 100644 --- a/Adjust/example-app-webbridge/build.gradle +++ b/Adjust/examples/example-app-webbridge/build.gradle @@ -32,5 +32,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.0.2' implementation project(':sdk-core') - implementation project(':sdk-plugin-webbridge') + implementation project(':plugins:sdk-plugin-webbridge') } diff --git a/Adjust/example-app-webbridge/proguard-rules.pro b/Adjust/examples/example-app-webbridge/proguard-rules.pro similarity index 100% rename from Adjust/example-app-webbridge/proguard-rules.pro rename to Adjust/examples/example-app-webbridge/proguard-rules.pro diff --git a/Adjust/example-app-webbridge/src/main/AndroidManifest.xml b/Adjust/examples/example-app-webbridge/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/example-app-webbridge/src/main/AndroidManifest.xml rename to Adjust/examples/example-app-webbridge/src/main/AndroidManifest.xml diff --git a/Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html b/Adjust/examples/example-app-webbridge/src/main/assets/AdjustExample-WebView.html similarity index 100% rename from Adjust/example-app-webbridge/src/main/assets/AdjustExample-WebView.html rename to Adjust/examples/example-app-webbridge/src/main/assets/AdjustExample-WebView.html diff --git a/Adjust/example-app-webbridge/src/main/java/com/example/examples/MainActivity.java b/Adjust/examples/example-app-webbridge/src/main/java/com/example/examples/MainActivity.java similarity index 100% rename from Adjust/example-app-webbridge/src/main/java/com/example/examples/MainActivity.java rename to Adjust/examples/example-app-webbridge/src/main/java/com/example/examples/MainActivity.java diff --git a/Adjust/example-app-webbridge/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Adjust/examples/example-app-webbridge/src/main/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from Adjust/example-app-webbridge/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to Adjust/examples/example-app-webbridge/src/main/res/drawable-v24/ic_launcher_foreground.xml diff --git a/Adjust/example-app-webbridge/src/main/res/drawable/ic_launcher_background.xml b/Adjust/examples/example-app-webbridge/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from Adjust/example-app-webbridge/src/main/res/drawable/ic_launcher_background.xml rename to Adjust/examples/example-app-webbridge/src/main/res/drawable/ic_launcher_background.xml diff --git a/Adjust/example-app-webbridge/src/main/res/layout/activity_main.xml b/Adjust/examples/example-app-webbridge/src/main/res/layout/activity_main.xml similarity index 100% rename from Adjust/example-app-webbridge/src/main/res/layout/activity_main.xml rename to Adjust/examples/example-app-webbridge/src/main/res/layout/activity_main.xml diff --git a/Adjust/example-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Adjust/examples/example-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from Adjust/example-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to Adjust/examples/example-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/Adjust/example-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Adjust/examples/example-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from Adjust/example-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to Adjust/examples/example-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/Adjust/example-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher.png b/Adjust/examples/example-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher.png rename to Adjust/examples/example-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/Adjust/example-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher_round.png b/Adjust/examples/example-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from Adjust/example-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher_round.png rename to Adjust/examples/example-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/Adjust/example-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher.png b/Adjust/examples/example-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher.png rename to Adjust/examples/example-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/Adjust/example-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher_round.png b/Adjust/examples/example-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from Adjust/example-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher_round.png rename to Adjust/examples/example-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/Adjust/example-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher.png b/Adjust/examples/example-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher.png rename to Adjust/examples/example-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/Adjust/example-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/Adjust/examples/example-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from Adjust/example-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher_round.png rename to Adjust/examples/example-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/Adjust/example-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Adjust/examples/example-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to Adjust/examples/example-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/Adjust/example-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/Adjust/examples/example-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from Adjust/example-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher_round.png rename to Adjust/examples/example-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/Adjust/example-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/Adjust/examples/example-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from Adjust/example-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to Adjust/examples/example-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/Adjust/example-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/Adjust/examples/example-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from Adjust/example-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png rename to Adjust/examples/example-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/Adjust/example-app-webbridge/src/main/res/values/colors.xml b/Adjust/examples/example-app-webbridge/src/main/res/values/colors.xml similarity index 100% rename from Adjust/example-app-webbridge/src/main/res/values/colors.xml rename to Adjust/examples/example-app-webbridge/src/main/res/values/colors.xml diff --git a/Adjust/example-app-webbridge/src/main/res/values/strings.xml b/Adjust/examples/example-app-webbridge/src/main/res/values/strings.xml similarity index 100% rename from Adjust/example-app-webbridge/src/main/res/values/strings.xml rename to Adjust/examples/example-app-webbridge/src/main/res/values/strings.xml diff --git a/Adjust/example-app-webbridge/src/main/res/values/styles.xml b/Adjust/examples/example-app-webbridge/src/main/res/values/styles.xml similarity index 100% rename from Adjust/example-app-webbridge/src/main/res/values/styles.xml rename to Adjust/examples/example-app-webbridge/src/main/res/values/styles.xml diff --git a/Adjust/example-app-webbridge/src/main/res/xml/network_security_config.xml b/Adjust/examples/example-app-webbridge/src/main/res/xml/network_security_config.xml similarity index 100% rename from Adjust/example-app-webbridge/src/main/res/xml/network_security_config.xml rename to Adjust/examples/example-app-webbridge/src/main/res/xml/network_security_config.xml diff --git a/Adjust/sdk-plugin-huawei-referrer/.gitignore b/Adjust/plugins/sdk-plugin-huawei-referrer/.gitignore similarity index 100% rename from Adjust/sdk-plugin-huawei-referrer/.gitignore rename to Adjust/plugins/sdk-plugin-huawei-referrer/.gitignore diff --git a/Adjust/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle similarity index 100% rename from Adjust/sdk-plugin-huawei-referrer/build.gradle rename to Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle diff --git a/Adjust/sdk-plugin-huawei-referrer/proguard-rules.pro b/Adjust/plugins/sdk-plugin-huawei-referrer/proguard-rules.pro similarity index 100% rename from Adjust/sdk-plugin-huawei-referrer/proguard-rules.pro rename to Adjust/plugins/sdk-plugin-huawei-referrer/proguard-rules.pro diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/AndroidManifest.xml b/Adjust/plugins/sdk-plugin-huawei-referrer/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/sdk-plugin-huawei-referrer/src/main/AndroidManifest.xml rename to Adjust/plugins/sdk-plugin-huawei-referrer/src/main/AndroidManifest.xml diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java b/Adjust/plugins/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java similarity index 100% rename from Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java rename to Adjust/plugins/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/AdjustHuaweiReferrer.java diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerDetails.java b/Adjust/plugins/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerDetails.java similarity index 100% rename from Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerDetails.java rename to Adjust/plugins/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerDetails.java diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerResult.java b/Adjust/plugins/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerResult.java similarity index 100% rename from Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerResult.java rename to Adjust/plugins/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiInstallReferrerResult.java diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiReferrerClient.java b/Adjust/plugins/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiReferrerClient.java similarity index 100% rename from Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiReferrerClient.java rename to Adjust/plugins/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/HuaweiReferrerClient.java diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java b/Adjust/plugins/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java similarity index 100% rename from Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java rename to Adjust/plugins/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/OnHuaweiInstallReferrerReadListener.java diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/Util.java b/Adjust/plugins/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/Util.java similarity index 100% rename from Adjust/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/Util.java rename to Adjust/plugins/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/Util.java diff --git a/Adjust/sdk-plugin-huawei-referrer/src/main/res/values/strings.xml b/Adjust/plugins/sdk-plugin-huawei-referrer/src/main/res/values/strings.xml similarity index 100% rename from Adjust/sdk-plugin-huawei-referrer/src/main/res/values/strings.xml rename to Adjust/plugins/sdk-plugin-huawei-referrer/src/main/res/values/strings.xml diff --git a/Adjust/sdk-plugin-imei/.gitignore b/Adjust/plugins/sdk-plugin-imei/.gitignore similarity index 100% rename from Adjust/sdk-plugin-imei/.gitignore rename to Adjust/plugins/sdk-plugin-imei/.gitignore diff --git a/Adjust/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle similarity index 100% rename from Adjust/sdk-plugin-imei/build.gradle rename to Adjust/plugins/sdk-plugin-imei/build.gradle diff --git a/Adjust/sdk-plugin-imei/proguard-rules.pro b/Adjust/plugins/sdk-plugin-imei/proguard-rules.pro similarity index 100% rename from Adjust/sdk-plugin-imei/proguard-rules.pro rename to Adjust/plugins/sdk-plugin-imei/proguard-rules.pro diff --git a/Adjust/sdk-plugin-imei/src/main/AndroidManifest.xml b/Adjust/plugins/sdk-plugin-imei/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/sdk-plugin-imei/src/main/AndroidManifest.xml rename to Adjust/plugins/sdk-plugin-imei/src/main/AndroidManifest.xml diff --git a/Adjust/sdk-plugin-imei/src/main/java/com/adjust/sdk/imei/AdjustImei.java b/Adjust/plugins/sdk-plugin-imei/src/main/java/com/adjust/sdk/imei/AdjustImei.java similarity index 100% rename from Adjust/sdk-plugin-imei/src/main/java/com/adjust/sdk/imei/AdjustImei.java rename to Adjust/plugins/sdk-plugin-imei/src/main/java/com/adjust/sdk/imei/AdjustImei.java diff --git a/Adjust/sdk-plugin-imei/src/main/java/com/adjust/sdk/imei/TelephonyIdsUtil.java b/Adjust/plugins/sdk-plugin-imei/src/main/java/com/adjust/sdk/imei/TelephonyIdsUtil.java similarity index 100% rename from Adjust/sdk-plugin-imei/src/main/java/com/adjust/sdk/imei/TelephonyIdsUtil.java rename to Adjust/plugins/sdk-plugin-imei/src/main/java/com/adjust/sdk/imei/TelephonyIdsUtil.java diff --git a/Adjust/sdk-plugin-imei/src/main/java/com/adjust/sdk/imei/Util.java b/Adjust/plugins/sdk-plugin-imei/src/main/java/com/adjust/sdk/imei/Util.java similarity index 100% rename from Adjust/sdk-plugin-imei/src/main/java/com/adjust/sdk/imei/Util.java rename to Adjust/plugins/sdk-plugin-imei/src/main/java/com/adjust/sdk/imei/Util.java diff --git a/Adjust/sdk-plugin-imei/src/main/res/values/strings.xml b/Adjust/plugins/sdk-plugin-imei/src/main/res/values/strings.xml similarity index 100% rename from Adjust/sdk-plugin-imei/src/main/res/values/strings.xml rename to Adjust/plugins/sdk-plugin-imei/src/main/res/values/strings.xml diff --git a/Adjust/sdk-plugin-meta-referrer/.gitignore b/Adjust/plugins/sdk-plugin-meta-referrer/.gitignore similarity index 100% rename from Adjust/sdk-plugin-meta-referrer/.gitignore rename to Adjust/plugins/sdk-plugin-meta-referrer/.gitignore diff --git a/Adjust/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle similarity index 100% rename from Adjust/sdk-plugin-meta-referrer/build.gradle rename to Adjust/plugins/sdk-plugin-meta-referrer/build.gradle diff --git a/Adjust/sdk-plugin-meta-referrer/proguard-rules.pro b/Adjust/plugins/sdk-plugin-meta-referrer/proguard-rules.pro similarity index 100% rename from Adjust/sdk-plugin-meta-referrer/proguard-rules.pro rename to Adjust/plugins/sdk-plugin-meta-referrer/proguard-rules.pro diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/AndroidManifest.xml b/Adjust/plugins/sdk-plugin-meta-referrer/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/sdk-plugin-meta-referrer/src/main/AndroidManifest.xml rename to Adjust/plugins/sdk-plugin-meta-referrer/src/main/AndroidManifest.xml diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/AdjustMetaReferrer.java b/Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/AdjustMetaReferrer.java similarity index 100% rename from Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/AdjustMetaReferrer.java rename to Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/AdjustMetaReferrer.java diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaInstallReferrerDetails.java b/Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaInstallReferrerDetails.java similarity index 100% rename from Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaInstallReferrerDetails.java rename to Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaInstallReferrerDetails.java diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaInstallReferrerResult.java b/Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaInstallReferrerResult.java similarity index 100% rename from Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaInstallReferrerResult.java rename to Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaInstallReferrerResult.java diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaReferrerClient.java b/Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaReferrerClient.java similarity index 100% rename from Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaReferrerClient.java rename to Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaReferrerClient.java diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/OnMetaInstallReferrerReadListener.java b/Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/OnMetaInstallReferrerReadListener.java similarity index 100% rename from Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/OnMetaInstallReferrerReadListener.java rename to Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/OnMetaInstallReferrerReadListener.java diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/Util.java b/Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/Util.java similarity index 100% rename from Adjust/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/Util.java rename to Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/Util.java diff --git a/Adjust/sdk-plugin-meta-referrer/src/main/res/values/strings.xml b/Adjust/plugins/sdk-plugin-meta-referrer/src/main/res/values/strings.xml similarity index 100% rename from Adjust/sdk-plugin-meta-referrer/src/main/res/values/strings.xml rename to Adjust/plugins/sdk-plugin-meta-referrer/src/main/res/values/strings.xml diff --git a/Adjust/sdk-plugin-oaid/.gitignore b/Adjust/plugins/sdk-plugin-oaid/.gitignore similarity index 100% rename from Adjust/sdk-plugin-oaid/.gitignore rename to Adjust/plugins/sdk-plugin-oaid/.gitignore diff --git a/Adjust/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle similarity index 100% rename from Adjust/sdk-plugin-oaid/build.gradle rename to Adjust/plugins/sdk-plugin-oaid/build.gradle diff --git a/Adjust/sdk-plugin-oaid/libs/oaid_sdk_2.0.0.aar b/Adjust/plugins/sdk-plugin-oaid/libs/oaid_sdk_2.0.0.aar similarity index 100% rename from Adjust/sdk-plugin-oaid/libs/oaid_sdk_2.0.0.aar rename to Adjust/plugins/sdk-plugin-oaid/libs/oaid_sdk_2.0.0.aar diff --git a/Adjust/sdk-plugin-oaid/proguard-rules.pro b/Adjust/plugins/sdk-plugin-oaid/proguard-rules.pro similarity index 100% rename from Adjust/sdk-plugin-oaid/proguard-rules.pro rename to Adjust/plugins/sdk-plugin-oaid/proguard-rules.pro diff --git a/Adjust/sdk-plugin-oaid/src/main/AndroidManifest.xml b/Adjust/plugins/sdk-plugin-oaid/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/sdk-plugin-oaid/src/main/AndroidManifest.xml rename to Adjust/plugins/sdk-plugin-oaid/src/main/AndroidManifest.xml diff --git a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/AdjustOaid.java b/Adjust/plugins/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/AdjustOaid.java similarity index 100% rename from Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/AdjustOaid.java rename to Adjust/plugins/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/AdjustOaid.java diff --git a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/HmsSdkClient.java b/Adjust/plugins/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/HmsSdkClient.java similarity index 100% rename from Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/HmsSdkClient.java rename to Adjust/plugins/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/HmsSdkClient.java diff --git a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/MsaSdkClient.java b/Adjust/plugins/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/MsaSdkClient.java similarity index 100% rename from Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/MsaSdkClient.java rename to Adjust/plugins/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/MsaSdkClient.java diff --git a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OaidInfo.java b/Adjust/plugins/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OaidInfo.java similarity index 100% rename from Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OaidInfo.java rename to Adjust/plugins/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OaidInfo.java diff --git a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OaidResult.java b/Adjust/plugins/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OaidResult.java similarity index 100% rename from Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OaidResult.java rename to Adjust/plugins/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OaidResult.java diff --git a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OnOaidReadListener.java b/Adjust/plugins/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OnOaidReadListener.java similarity index 100% rename from Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OnOaidReadListener.java rename to Adjust/plugins/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/OnOaidReadListener.java diff --git a/Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/Util.java b/Adjust/plugins/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/Util.java similarity index 100% rename from Adjust/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/Util.java rename to Adjust/plugins/sdk-plugin-oaid/src/main/java/com/adjust/sdk/oaid/Util.java diff --git a/Adjust/sdk-plugin-oaid/src/main/res/values/strings.xml b/Adjust/plugins/sdk-plugin-oaid/src/main/res/values/strings.xml similarity index 100% rename from Adjust/sdk-plugin-oaid/src/main/res/values/strings.xml rename to Adjust/plugins/sdk-plugin-oaid/src/main/res/values/strings.xml diff --git a/Adjust/sdk-plugin-samsung-clouddev/.gitignore b/Adjust/plugins/sdk-plugin-samsung-clouddev/.gitignore similarity index 100% rename from Adjust/sdk-plugin-samsung-clouddev/.gitignore rename to Adjust/plugins/sdk-plugin-samsung-clouddev/.gitignore diff --git a/Adjust/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle similarity index 100% rename from Adjust/sdk-plugin-samsung-clouddev/build.gradle rename to Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle diff --git a/Adjust/sdk-plugin-samsung-clouddev/proguard-rules.pro b/Adjust/plugins/sdk-plugin-samsung-clouddev/proguard-rules.pro similarity index 100% rename from Adjust/sdk-plugin-samsung-clouddev/proguard-rules.pro rename to Adjust/plugins/sdk-plugin-samsung-clouddev/proguard-rules.pro diff --git a/Adjust/sdk-plugin-samsung-clouddev/src/main/AndroidManifest.xml b/Adjust/plugins/sdk-plugin-samsung-clouddev/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/sdk-plugin-samsung-clouddev/src/main/AndroidManifest.xml rename to Adjust/plugins/sdk-plugin-samsung-clouddev/src/main/AndroidManifest.xml diff --git a/Adjust/sdk-plugin-samsung-clouddev/src/main/java/com/adjust/sdk/samsung/clouddev/AdjustSamsungCloudDev.java b/Adjust/plugins/sdk-plugin-samsung-clouddev/src/main/java/com/adjust/sdk/samsung/clouddev/AdjustSamsungCloudDev.java similarity index 100% rename from Adjust/sdk-plugin-samsung-clouddev/src/main/java/com/adjust/sdk/samsung/clouddev/AdjustSamsungCloudDev.java rename to Adjust/plugins/sdk-plugin-samsung-clouddev/src/main/java/com/adjust/sdk/samsung/clouddev/AdjustSamsungCloudDev.java diff --git a/Adjust/sdk-plugin-samsung-clouddev/src/main/java/com/adjust/sdk/samsung/clouddev/SamsungCloudDevClient.java b/Adjust/plugins/sdk-plugin-samsung-clouddev/src/main/java/com/adjust/sdk/samsung/clouddev/SamsungCloudDevClient.java similarity index 100% rename from Adjust/sdk-plugin-samsung-clouddev/src/main/java/com/adjust/sdk/samsung/clouddev/SamsungCloudDevClient.java rename to Adjust/plugins/sdk-plugin-samsung-clouddev/src/main/java/com/adjust/sdk/samsung/clouddev/SamsungCloudDevClient.java diff --git a/Adjust/sdk-plugin-samsung-clouddev/src/main/java/com/adjust/sdk/samsung/clouddev/Util.java b/Adjust/plugins/sdk-plugin-samsung-clouddev/src/main/java/com/adjust/sdk/samsung/clouddev/Util.java similarity index 100% rename from Adjust/sdk-plugin-samsung-clouddev/src/main/java/com/adjust/sdk/samsung/clouddev/Util.java rename to Adjust/plugins/sdk-plugin-samsung-clouddev/src/main/java/com/adjust/sdk/samsung/clouddev/Util.java diff --git a/Adjust/sdk-plugin-samsung-clouddev/src/main/res/values/strings.xml b/Adjust/plugins/sdk-plugin-samsung-clouddev/src/main/res/values/strings.xml similarity index 100% rename from Adjust/sdk-plugin-samsung-clouddev/src/main/res/values/strings.xml rename to Adjust/plugins/sdk-plugin-samsung-clouddev/src/main/res/values/strings.xml diff --git a/Adjust/sdk-plugin-samsung-referrer/.gitignore b/Adjust/plugins/sdk-plugin-samsung-referrer/.gitignore similarity index 100% rename from Adjust/sdk-plugin-samsung-referrer/.gitignore rename to Adjust/plugins/sdk-plugin-samsung-referrer/.gitignore diff --git a/Adjust/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle similarity index 100% rename from Adjust/sdk-plugin-samsung-referrer/build.gradle rename to Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle diff --git a/Adjust/sdk-plugin-samsung-referrer/proguard-rules.pro b/Adjust/plugins/sdk-plugin-samsung-referrer/proguard-rules.pro similarity index 100% rename from Adjust/sdk-plugin-samsung-referrer/proguard-rules.pro rename to Adjust/plugins/sdk-plugin-samsung-referrer/proguard-rules.pro diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/AndroidManifest.xml b/Adjust/plugins/sdk-plugin-samsung-referrer/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/sdk-plugin-samsung-referrer/src/main/AndroidManifest.xml rename to Adjust/plugins/sdk-plugin-samsung-referrer/src/main/AndroidManifest.xml diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java b/Adjust/plugins/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java similarity index 100% rename from Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java rename to Adjust/plugins/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/AdjustSamsungReferrer.java diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java b/Adjust/plugins/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java similarity index 100% rename from Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java rename to Adjust/plugins/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/OnSamsungInstallReferrerReadListener.java diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerDetails.java b/Adjust/plugins/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerDetails.java similarity index 100% rename from Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerDetails.java rename to Adjust/plugins/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerDetails.java diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerResult.java b/Adjust/plugins/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerResult.java similarity index 100% rename from Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerResult.java rename to Adjust/plugins/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungInstallReferrerResult.java diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungReferrerClient.java b/Adjust/plugins/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungReferrerClient.java similarity index 100% rename from Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungReferrerClient.java rename to Adjust/plugins/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/SamsungReferrerClient.java diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java b/Adjust/plugins/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java similarity index 100% rename from Adjust/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java rename to Adjust/plugins/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java diff --git a/Adjust/sdk-plugin-samsung-referrer/src/main/res/values/strings.xml b/Adjust/plugins/sdk-plugin-samsung-referrer/src/main/res/values/strings.xml similarity index 100% rename from Adjust/sdk-plugin-samsung-referrer/src/main/res/values/strings.xml rename to Adjust/plugins/sdk-plugin-samsung-referrer/src/main/res/values/strings.xml diff --git a/Adjust/sdk-plugin-vivo-referrer/.gitignore b/Adjust/plugins/sdk-plugin-vivo-referrer/.gitignore similarity index 100% rename from Adjust/sdk-plugin-vivo-referrer/.gitignore rename to Adjust/plugins/sdk-plugin-vivo-referrer/.gitignore diff --git a/Adjust/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle similarity index 100% rename from Adjust/sdk-plugin-vivo-referrer/build.gradle rename to Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle diff --git a/Adjust/sdk-plugin-vivo-referrer/proguard-rules.pro b/Adjust/plugins/sdk-plugin-vivo-referrer/proguard-rules.pro similarity index 100% rename from Adjust/sdk-plugin-vivo-referrer/proguard-rules.pro rename to Adjust/plugins/sdk-plugin-vivo-referrer/proguard-rules.pro diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/AndroidManifest.xml b/Adjust/plugins/sdk-plugin-vivo-referrer/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/sdk-plugin-vivo-referrer/src/main/AndroidManifest.xml rename to Adjust/plugins/sdk-plugin-vivo-referrer/src/main/AndroidManifest.xml diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java b/Adjust/plugins/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java similarity index 100% rename from Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java rename to Adjust/plugins/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/AdjustVivoReferrer.java diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/OnVivoInstallReferrerReadListener.java b/Adjust/plugins/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/OnVivoInstallReferrerReadListener.java similarity index 100% rename from Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/OnVivoInstallReferrerReadListener.java rename to Adjust/plugins/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/OnVivoInstallReferrerReadListener.java diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/Util.java b/Adjust/plugins/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/Util.java similarity index 100% rename from Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/Util.java rename to Adjust/plugins/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/Util.java diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerDetails.java b/Adjust/plugins/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerDetails.java similarity index 100% rename from Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerDetails.java rename to Adjust/plugins/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerDetails.java diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerResult.java b/Adjust/plugins/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerResult.java similarity index 100% rename from Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerResult.java rename to Adjust/plugins/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoInstallReferrerResult.java diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoReferrerClient.java b/Adjust/plugins/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoReferrerClient.java similarity index 100% rename from Adjust/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoReferrerClient.java rename to Adjust/plugins/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/VivoReferrerClient.java diff --git a/Adjust/sdk-plugin-vivo-referrer/src/main/res/values/strings.xml b/Adjust/plugins/sdk-plugin-vivo-referrer/src/main/res/values/strings.xml similarity index 100% rename from Adjust/sdk-plugin-vivo-referrer/src/main/res/values/strings.xml rename to Adjust/plugins/sdk-plugin-vivo-referrer/src/main/res/values/strings.xml diff --git a/Adjust/sdk-plugin-webbridge/.gitignore b/Adjust/plugins/sdk-plugin-webbridge/.gitignore similarity index 100% rename from Adjust/sdk-plugin-webbridge/.gitignore rename to Adjust/plugins/sdk-plugin-webbridge/.gitignore diff --git a/Adjust/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle similarity index 100% rename from Adjust/sdk-plugin-webbridge/build.gradle rename to Adjust/plugins/sdk-plugin-webbridge/build.gradle diff --git a/Adjust/sdk-plugin-webbridge/proguard-rules.pro b/Adjust/plugins/sdk-plugin-webbridge/proguard-rules.pro similarity index 100% rename from Adjust/sdk-plugin-webbridge/proguard-rules.pro rename to Adjust/plugins/sdk-plugin-webbridge/proguard-rules.pro diff --git a/Adjust/sdk-plugin-webbridge/src/main/AndroidManifest.xml b/Adjust/plugins/sdk-plugin-webbridge/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/sdk-plugin-webbridge/src/main/AndroidManifest.xml rename to Adjust/plugins/sdk-plugin-webbridge/src/main/AndroidManifest.xml diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js similarity index 100% rename from Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js rename to Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js similarity index 100% rename from Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js rename to Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_event.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_event.js similarity index 100% rename from Adjust/sdk-plugin-webbridge/src/main/assets/adjust_event.js rename to Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_event.js diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_third_party_sharing.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_third_party_sharing.js similarity index 100% rename from Adjust/sdk-plugin-webbridge/src/main/assets/adjust_third_party_sharing.js rename to Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_third_party_sharing.js diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridge.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridge.java similarity index 100% rename from Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridge.java rename to Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridge.java diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java similarity index 100% rename from Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java rename to Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java similarity index 100% rename from Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java rename to Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java diff --git a/Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/FacebookSDKJSInterface.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/FacebookSDKJSInterface.java similarity index 100% rename from Adjust/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/FacebookSDKJSInterface.java rename to Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/FacebookSDKJSInterface.java diff --git a/Adjust/sdk-plugin-xiaomi-referrer/.gitignore b/Adjust/plugins/sdk-plugin-xiaomi-referrer/.gitignore similarity index 100% rename from Adjust/sdk-plugin-xiaomi-referrer/.gitignore rename to Adjust/plugins/sdk-plugin-xiaomi-referrer/.gitignore diff --git a/Adjust/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle similarity index 100% rename from Adjust/sdk-plugin-xiaomi-referrer/build.gradle rename to Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle diff --git a/Adjust/sdk-plugin-xiaomi-referrer/proguard-rules.pro b/Adjust/plugins/sdk-plugin-xiaomi-referrer/proguard-rules.pro similarity index 100% rename from Adjust/sdk-plugin-xiaomi-referrer/proguard-rules.pro rename to Adjust/plugins/sdk-plugin-xiaomi-referrer/proguard-rules.pro diff --git a/Adjust/sdk-plugin-xiaomi-referrer/src/main/AndroidManifest.xml b/Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/sdk-plugin-xiaomi-referrer/src/main/AndroidManifest.xml rename to Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/AndroidManifest.xml diff --git a/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/AdjustXiaomiReferrer.java b/Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/AdjustXiaomiReferrer.java similarity index 100% rename from Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/AdjustXiaomiReferrer.java rename to Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/AdjustXiaomiReferrer.java diff --git a/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/OnXiaomiInstallReferrerReadListener.java b/Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/OnXiaomiInstallReferrerReadListener.java similarity index 100% rename from Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/OnXiaomiInstallReferrerReadListener.java rename to Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/OnXiaomiInstallReferrerReadListener.java diff --git a/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/Util.java b/Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/Util.java similarity index 100% rename from Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/Util.java rename to Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/Util.java diff --git a/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiInstallReferrerDetails.java b/Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiInstallReferrerDetails.java similarity index 100% rename from Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiInstallReferrerDetails.java rename to Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiInstallReferrerDetails.java diff --git a/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiInstallReferrerResult.java b/Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiInstallReferrerResult.java similarity index 100% rename from Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiInstallReferrerResult.java rename to Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiInstallReferrerResult.java diff --git a/Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiReferrerClient.java b/Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiReferrerClient.java similarity index 100% rename from Adjust/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiReferrerClient.java rename to Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/XiaomiReferrerClient.java diff --git a/Adjust/sdk-plugin-xiaomi-referrer/src/main/res/values/strings.xml b/Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/res/values/strings.xml similarity index 100% rename from Adjust/sdk-plugin-xiaomi-referrer/src/main/res/values/strings.xml rename to Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/res/values/strings.xml diff --git a/Adjust/settings.gradle b/Adjust/settings.gradle index 26181006b..138a32557 100644 --- a/Adjust/settings.gradle +++ b/Adjust/settings.gradle @@ -1,3 +1,23 @@ -include ':sdk-core', ':sdk-plugin-webbridge', ':sdk-plugin-oaid', ':sdk-plugin-imei', ':sdk-plugin-xiaomi-referrer', ':sdk-plugin-samsung-referrer', ':sdk-plugin-vivo-referrer', ':sdk-plugin-samsung-clouddev', ':sdk-plugin-huawei-referrer', ':sdk-plugin-meta-referrer' -include ':test-options', ':test-library', ':test-app-core', ':test-app-webbridge' -include ':example-app-java', ':example-app-kotlin', ':example-app-tv', ':example-app-webbridge', ':example-app-fbpixel', ':example-app-keyboard' +include ':sdk-core' + +include ':plugins:sdk-plugin-webbridge' +include ':plugins:sdk-plugin-oaid' +include ':plugins:sdk-plugin-imei' +include ':plugins:sdk-plugin-xiaomi-referrer' +include ':plugins:sdk-plugin-samsung-referrer' +include ':plugins:sdk-plugin-vivo-referrer' +include ':plugins:sdk-plugin-samsung-clouddev' +include ':plugins:sdk-plugin-huawei-referrer' +include ':plugins:sdk-plugin-meta-referrer' + +include ':tests:test-options' +include ':tests:test-library' +include ':tests:test-app-core' +include ':tests:test-app-webbridge' + +include ':examples:example-app-java' +include ':examples:example-app-kotlin' +include ':examples:example-app-tv' +include ':examples:example-app-webbridge' +include ':examples:example-app-fbpixel' +include ':examples:example-app-keyboard' diff --git a/Adjust/test-app-core/.gitignore b/Adjust/tests/test-app-core/.gitignore similarity index 100% rename from Adjust/test-app-core/.gitignore rename to Adjust/tests/test-app-core/.gitignore diff --git a/Adjust/test-app-core/build.gradle b/Adjust/tests/test-app-core/build.gradle similarity index 88% rename from Adjust/test-app-core/build.gradle rename to Adjust/tests/test-app-core/build.gradle index 65922e155..1bfef02af 100644 --- a/Adjust/test-app-core/build.gradle +++ b/Adjust/tests/test-app-core/build.gradle @@ -26,6 +26,6 @@ dependencies { implementation 'com.android.installreferrer:installreferrer:2.2' implementation project(':sdk-core') - implementation project(':test-options') - implementation project(':test-library') + implementation project(':tests:test-options') + implementation project(':tests:test-library') } diff --git a/Adjust/test-app-core/proguard-rules.pro b/Adjust/tests/test-app-core/proguard-rules.pro similarity index 100% rename from Adjust/test-app-core/proguard-rules.pro rename to Adjust/tests/test-app-core/proguard-rules.pro diff --git a/Adjust/test-app-core/src/main/AndroidManifest.xml b/Adjust/tests/test-app-core/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/test-app-core/src/main/AndroidManifest.xml rename to Adjust/tests/test-app-core/src/main/AndroidManifest.xml diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java similarity index 100% rename from Adjust/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java rename to Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/Command.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/Command.java similarity index 100% rename from Adjust/test-app-core/src/main/java/com/adjust/testapp/Command.java rename to Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/Command.java diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/CommandListener.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/CommandListener.java similarity index 100% rename from Adjust/test-app-core/src/main/java/com/adjust/testapp/CommandListener.java rename to Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/CommandListener.java diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java similarity index 100% rename from Adjust/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java rename to Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java diff --git a/Adjust/test-app-core/src/main/java/com/adjust/testapp/Util.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/Util.java similarity index 100% rename from Adjust/test-app-core/src/main/java/com/adjust/testapp/Util.java rename to Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/Util.java diff --git a/Adjust/test-app-core/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Adjust/tests/test-app-core/src/main/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from Adjust/test-app-core/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to Adjust/tests/test-app-core/src/main/res/drawable-v24/ic_launcher_foreground.xml diff --git a/Adjust/test-app-core/src/main/res/drawable/ic_launcher_background.xml b/Adjust/tests/test-app-core/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from Adjust/test-app-core/src/main/res/drawable/ic_launcher_background.xml rename to Adjust/tests/test-app-core/src/main/res/drawable/ic_launcher_background.xml diff --git a/Adjust/test-app-core/src/main/res/layout/activity_main.xml b/Adjust/tests/test-app-core/src/main/res/layout/activity_main.xml similarity index 100% rename from Adjust/test-app-core/src/main/res/layout/activity_main.xml rename to Adjust/tests/test-app-core/src/main/res/layout/activity_main.xml diff --git a/Adjust/test-app-core/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Adjust/tests/test-app-core/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from Adjust/test-app-core/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to Adjust/tests/test-app-core/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/Adjust/test-app-core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Adjust/tests/test-app-core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from Adjust/test-app-core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to Adjust/tests/test-app-core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/Adjust/test-app-core/src/main/res/mipmap-hdpi/ic_launcher.png b/Adjust/tests/test-app-core/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from Adjust/test-app-core/src/main/res/mipmap-hdpi/ic_launcher.png rename to Adjust/tests/test-app-core/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/Adjust/test-app-core/src/main/res/mipmap-hdpi/ic_launcher_round.png b/Adjust/tests/test-app-core/src/main/res/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from Adjust/test-app-core/src/main/res/mipmap-hdpi/ic_launcher_round.png rename to Adjust/tests/test-app-core/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/Adjust/test-app-core/src/main/res/mipmap-mdpi/ic_launcher.png b/Adjust/tests/test-app-core/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from Adjust/test-app-core/src/main/res/mipmap-mdpi/ic_launcher.png rename to Adjust/tests/test-app-core/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/Adjust/test-app-core/src/main/res/mipmap-mdpi/ic_launcher_round.png b/Adjust/tests/test-app-core/src/main/res/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from Adjust/test-app-core/src/main/res/mipmap-mdpi/ic_launcher_round.png rename to Adjust/tests/test-app-core/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/Adjust/test-app-core/src/main/res/mipmap-xhdpi/ic_launcher.png b/Adjust/tests/test-app-core/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from Adjust/test-app-core/src/main/res/mipmap-xhdpi/ic_launcher.png rename to Adjust/tests/test-app-core/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/Adjust/test-app-core/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/Adjust/tests/test-app-core/src/main/res/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from Adjust/test-app-core/src/main/res/mipmap-xhdpi/ic_launcher_round.png rename to Adjust/tests/test-app-core/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/Adjust/test-app-core/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Adjust/tests/test-app-core/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from Adjust/test-app-core/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to Adjust/tests/test-app-core/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/Adjust/test-app-core/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/Adjust/tests/test-app-core/src/main/res/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from Adjust/test-app-core/src/main/res/mipmap-xxhdpi/ic_launcher_round.png rename to Adjust/tests/test-app-core/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/Adjust/test-app-core/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/Adjust/tests/test-app-core/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from Adjust/test-app-core/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to Adjust/tests/test-app-core/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/Adjust/test-app-core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/Adjust/tests/test-app-core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from Adjust/test-app-core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png rename to Adjust/tests/test-app-core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/Adjust/test-app-core/src/main/res/values/colors.xml b/Adjust/tests/test-app-core/src/main/res/values/colors.xml similarity index 100% rename from Adjust/test-app-core/src/main/res/values/colors.xml rename to Adjust/tests/test-app-core/src/main/res/values/colors.xml diff --git a/Adjust/test-app-core/src/main/res/values/strings.xml b/Adjust/tests/test-app-core/src/main/res/values/strings.xml similarity index 100% rename from Adjust/test-app-core/src/main/res/values/strings.xml rename to Adjust/tests/test-app-core/src/main/res/values/strings.xml diff --git a/Adjust/test-app-core/src/main/res/values/styles.xml b/Adjust/tests/test-app-core/src/main/res/values/styles.xml similarity index 100% rename from Adjust/test-app-core/src/main/res/values/styles.xml rename to Adjust/tests/test-app-core/src/main/res/values/styles.xml diff --git a/Adjust/test-app-webbridge/.gitignore b/Adjust/tests/test-app-webbridge/.gitignore similarity index 100% rename from Adjust/test-app-webbridge/.gitignore rename to Adjust/tests/test-app-webbridge/.gitignore diff --git a/Adjust/test-app-webbridge/build.gradle b/Adjust/tests/test-app-webbridge/build.gradle similarity index 84% rename from Adjust/test-app-webbridge/build.gradle rename to Adjust/tests/test-app-webbridge/build.gradle index b570c788b..ada338dee 100644 --- a/Adjust/test-app-webbridge/build.gradle +++ b/Adjust/tests/test-app-webbridge/build.gradle @@ -28,7 +28,7 @@ dependencies { implementation 'com.android.installreferrer:installreferrer:2.2' implementation project(':sdk-core') - implementation project(':sdk-plugin-webbridge') - implementation project(':test-options') - implementation project(':test-library') + implementation project(':plugins:sdk-plugin-webbridge') + implementation project(':tests:test-options') + implementation project(':tests:test-library') } diff --git a/Adjust/test-app-webbridge/proguard-rules.pro b/Adjust/tests/test-app-webbridge/proguard-rules.pro similarity index 100% rename from Adjust/test-app-webbridge/proguard-rules.pro rename to Adjust/tests/test-app-webbridge/proguard-rules.pro diff --git a/Adjust/test-app-webbridge/src/main/AndroidManifest.xml b/Adjust/tests/test-app-webbridge/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/test-app-webbridge/src/main/AndroidManifest.xml rename to Adjust/tests/test-app-webbridge/src/main/AndroidManifest.xml diff --git a/Adjust/test-app-webbridge/src/main/assets/AdjustTestApp-WebView.html b/Adjust/tests/test-app-webbridge/src/main/assets/AdjustTestApp-WebView.html similarity index 100% rename from Adjust/test-app-webbridge/src/main/assets/AdjustTestApp-WebView.html rename to Adjust/tests/test-app-webbridge/src/main/assets/AdjustTestApp-WebView.html diff --git a/Adjust/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js similarity index 100% rename from Adjust/test-app-webbridge/src/main/assets/command_executor.js rename to Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js diff --git a/Adjust/test-app-webbridge/src/main/assets/test_library.js b/Adjust/tests/test-app-webbridge/src/main/assets/test_library.js similarity index 100% rename from Adjust/test-app-webbridge/src/main/assets/test_library.js rename to Adjust/tests/test-app-webbridge/src/main/assets/test_library.js diff --git a/Adjust/test-app-webbridge/src/main/java/com/example/testappwebbridge/MainActivity.java b/Adjust/tests/test-app-webbridge/src/main/java/com/example/testappwebbridge/MainActivity.java similarity index 100% rename from Adjust/test-app-webbridge/src/main/java/com/example/testappwebbridge/MainActivity.java rename to Adjust/tests/test-app-webbridge/src/main/java/com/example/testappwebbridge/MainActivity.java diff --git a/Adjust/test-app-webbridge/src/main/java/com/example/testappwebbridge/TestLibraryBridge.java b/Adjust/tests/test-app-webbridge/src/main/java/com/example/testappwebbridge/TestLibraryBridge.java similarity index 100% rename from Adjust/test-app-webbridge/src/main/java/com/example/testappwebbridge/TestLibraryBridge.java rename to Adjust/tests/test-app-webbridge/src/main/java/com/example/testappwebbridge/TestLibraryBridge.java diff --git a/Adjust/test-app-webbridge/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Adjust/tests/test-app-webbridge/src/main/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from Adjust/test-app-webbridge/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to Adjust/tests/test-app-webbridge/src/main/res/drawable-v24/ic_launcher_foreground.xml diff --git a/Adjust/test-app-webbridge/src/main/res/drawable/ic_launcher_background.xml b/Adjust/tests/test-app-webbridge/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from Adjust/test-app-webbridge/src/main/res/drawable/ic_launcher_background.xml rename to Adjust/tests/test-app-webbridge/src/main/res/drawable/ic_launcher_background.xml diff --git a/Adjust/test-app-webbridge/src/main/res/layout/activity_main.xml b/Adjust/tests/test-app-webbridge/src/main/res/layout/activity_main.xml similarity index 100% rename from Adjust/test-app-webbridge/src/main/res/layout/activity_main.xml rename to Adjust/tests/test-app-webbridge/src/main/res/layout/activity_main.xml diff --git a/Adjust/test-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Adjust/tests/test-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from Adjust/test-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to Adjust/tests/test-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/Adjust/test-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Adjust/tests/test-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from Adjust/test-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to Adjust/tests/test-app-webbridge/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/Adjust/test-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher.png b/Adjust/tests/test-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from Adjust/test-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher.png rename to Adjust/tests/test-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/Adjust/test-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher_round.png b/Adjust/tests/test-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from Adjust/test-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher_round.png rename to Adjust/tests/test-app-webbridge/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/Adjust/test-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher.png b/Adjust/tests/test-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from Adjust/test-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher.png rename to Adjust/tests/test-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/Adjust/test-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher_round.png b/Adjust/tests/test-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from Adjust/test-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher_round.png rename to Adjust/tests/test-app-webbridge/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/Adjust/test-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher.png b/Adjust/tests/test-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from Adjust/test-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher.png rename to Adjust/tests/test-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/Adjust/test-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/Adjust/tests/test-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from Adjust/test-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher_round.png rename to Adjust/tests/test-app-webbridge/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/Adjust/test-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Adjust/tests/test-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from Adjust/test-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to Adjust/tests/test-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/Adjust/test-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/Adjust/tests/test-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from Adjust/test-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher_round.png rename to Adjust/tests/test-app-webbridge/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/Adjust/test-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/Adjust/tests/test-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from Adjust/test-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to Adjust/tests/test-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/Adjust/test-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/Adjust/tests/test-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from Adjust/test-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png rename to Adjust/tests/test-app-webbridge/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/Adjust/test-app-webbridge/src/main/res/values/colors.xml b/Adjust/tests/test-app-webbridge/src/main/res/values/colors.xml similarity index 100% rename from Adjust/test-app-webbridge/src/main/res/values/colors.xml rename to Adjust/tests/test-app-webbridge/src/main/res/values/colors.xml diff --git a/Adjust/test-app-webbridge/src/main/res/values/strings.xml b/Adjust/tests/test-app-webbridge/src/main/res/values/strings.xml similarity index 100% rename from Adjust/test-app-webbridge/src/main/res/values/strings.xml rename to Adjust/tests/test-app-webbridge/src/main/res/values/strings.xml diff --git a/Adjust/test-app-webbridge/src/main/res/values/styles.xml b/Adjust/tests/test-app-webbridge/src/main/res/values/styles.xml similarity index 100% rename from Adjust/test-app-webbridge/src/main/res/values/styles.xml rename to Adjust/tests/test-app-webbridge/src/main/res/values/styles.xml diff --git a/Adjust/test-library/.gitignore b/Adjust/tests/test-library/.gitignore similarity index 100% rename from Adjust/test-library/.gitignore rename to Adjust/tests/test-library/.gitignore diff --git a/Adjust/test-library/build.gradle b/Adjust/tests/test-library/build.gradle similarity index 100% rename from Adjust/test-library/build.gradle rename to Adjust/tests/test-library/build.gradle diff --git a/Adjust/test-library/proguard-rules.pro b/Adjust/tests/test-library/proguard-rules.pro similarity index 100% rename from Adjust/test-library/proguard-rules.pro rename to Adjust/tests/test-library/proguard-rules.pro diff --git a/Adjust/test-library/src/main/AndroidManifest.xml b/Adjust/tests/test-library/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/test-library/src/main/AndroidManifest.xml rename to Adjust/tests/test-library/src/main/AndroidManifest.xml diff --git a/Adjust/test-library/src/main/java/com/adjust/test/Constants.java b/Adjust/tests/test-library/src/main/java/com/adjust/test/Constants.java similarity index 100% rename from Adjust/test-library/src/main/java/com/adjust/test/Constants.java rename to Adjust/tests/test-library/src/main/java/com/adjust/test/Constants.java diff --git a/Adjust/test-library/src/main/java/com/adjust/test/ICommandJsonListener.java b/Adjust/tests/test-library/src/main/java/com/adjust/test/ICommandJsonListener.java similarity index 100% rename from Adjust/test-library/src/main/java/com/adjust/test/ICommandJsonListener.java rename to Adjust/tests/test-library/src/main/java/com/adjust/test/ICommandJsonListener.java diff --git a/Adjust/test-library/src/main/java/com/adjust/test/ICommandListener.java b/Adjust/tests/test-library/src/main/java/com/adjust/test/ICommandListener.java similarity index 100% rename from Adjust/test-library/src/main/java/com/adjust/test/ICommandListener.java rename to Adjust/tests/test-library/src/main/java/com/adjust/test/ICommandListener.java diff --git a/Adjust/test-library/src/main/java/com/adjust/test/ICommandRawJsonListener.java b/Adjust/tests/test-library/src/main/java/com/adjust/test/ICommandRawJsonListener.java similarity index 100% rename from Adjust/test-library/src/main/java/com/adjust/test/ICommandRawJsonListener.java rename to Adjust/tests/test-library/src/main/java/com/adjust/test/ICommandRawJsonListener.java diff --git a/Adjust/test-library/src/main/java/com/adjust/test/IOnExitListener.java b/Adjust/tests/test-library/src/main/java/com/adjust/test/IOnExitListener.java similarity index 100% rename from Adjust/test-library/src/main/java/com/adjust/test/IOnExitListener.java rename to Adjust/tests/test-library/src/main/java/com/adjust/test/IOnExitListener.java diff --git a/Adjust/test-library/src/main/java/com/adjust/test/Networking.java b/Adjust/tests/test-library/src/main/java/com/adjust/test/Networking.java similarity index 100% rename from Adjust/test-library/src/main/java/com/adjust/test/Networking.java rename to Adjust/tests/test-library/src/main/java/com/adjust/test/Networking.java diff --git a/Adjust/test-library/src/main/java/com/adjust/test/TestCommand.java b/Adjust/tests/test-library/src/main/java/com/adjust/test/TestCommand.java similarity index 100% rename from Adjust/test-library/src/main/java/com/adjust/test/TestCommand.java rename to Adjust/tests/test-library/src/main/java/com/adjust/test/TestCommand.java diff --git a/Adjust/test-library/src/main/java/com/adjust/test/TestLibrary.java b/Adjust/tests/test-library/src/main/java/com/adjust/test/TestLibrary.java similarity index 100% rename from Adjust/test-library/src/main/java/com/adjust/test/TestLibrary.java rename to Adjust/tests/test-library/src/main/java/com/adjust/test/TestLibrary.java diff --git a/Adjust/test-library/src/main/java/com/adjust/test/Utils.java b/Adjust/tests/test-library/src/main/java/com/adjust/test/Utils.java similarity index 100% rename from Adjust/test-library/src/main/java/com/adjust/test/Utils.java rename to Adjust/tests/test-library/src/main/java/com/adjust/test/Utils.java diff --git a/Adjust/test-library/src/main/java/com/adjust/test/ws/ControlSignal.java b/Adjust/tests/test-library/src/main/java/com/adjust/test/ws/ControlSignal.java similarity index 100% rename from Adjust/test-library/src/main/java/com/adjust/test/ws/ControlSignal.java rename to Adjust/tests/test-library/src/main/java/com/adjust/test/ws/ControlSignal.java diff --git a/Adjust/test-library/src/main/java/com/adjust/test/ws/ControlWebSocketClient.java b/Adjust/tests/test-library/src/main/java/com/adjust/test/ws/ControlWebSocketClient.java similarity index 100% rename from Adjust/test-library/src/main/java/com/adjust/test/ws/ControlWebSocketClient.java rename to Adjust/tests/test-library/src/main/java/com/adjust/test/ws/ControlWebSocketClient.java diff --git a/Adjust/test-library/src/main/java/com/adjust/test/ws/SignalType.java b/Adjust/tests/test-library/src/main/java/com/adjust/test/ws/SignalType.java similarity index 100% rename from Adjust/test-library/src/main/java/com/adjust/test/ws/SignalType.java rename to Adjust/tests/test-library/src/main/java/com/adjust/test/ws/SignalType.java diff --git a/Adjust/test-library/src/main/res/values/strings.xml b/Adjust/tests/test-library/src/main/res/values/strings.xml similarity index 100% rename from Adjust/test-library/src/main/res/values/strings.xml rename to Adjust/tests/test-library/src/main/res/values/strings.xml diff --git a/Adjust/test-options/.gitignore b/Adjust/tests/test-options/.gitignore similarity index 100% rename from Adjust/test-options/.gitignore rename to Adjust/tests/test-options/.gitignore diff --git a/Adjust/test-options/build.gradle b/Adjust/tests/test-options/build.gradle similarity index 100% rename from Adjust/test-options/build.gradle rename to Adjust/tests/test-options/build.gradle diff --git a/Adjust/test-options/consumer-rules.pro b/Adjust/tests/test-options/consumer-rules.pro similarity index 100% rename from Adjust/test-options/consumer-rules.pro rename to Adjust/tests/test-options/consumer-rules.pro diff --git a/Adjust/test-options/proguard-rules.pro b/Adjust/tests/test-options/proguard-rules.pro similarity index 100% rename from Adjust/test-options/proguard-rules.pro rename to Adjust/tests/test-options/proguard-rules.pro diff --git a/Adjust/test-options/src/main/AndroidManifest.xml b/Adjust/tests/test-options/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/test-options/src/main/AndroidManifest.xml rename to Adjust/tests/test-options/src/main/AndroidManifest.xml diff --git a/Adjust/test-options/src/main/java/com/adjust/test_options/TLSSocketFactory.java b/Adjust/tests/test-options/src/main/java/com/adjust/test_options/TLSSocketFactory.java similarity index 100% rename from Adjust/test-options/src/main/java/com/adjust/test_options/TLSSocketFactory.java rename to Adjust/tests/test-options/src/main/java/com/adjust/test_options/TLSSocketFactory.java diff --git a/Adjust/test-options/src/main/java/com/adjust/test_options/TestConnectionOptions.java b/Adjust/tests/test-options/src/main/java/com/adjust/test_options/TestConnectionOptions.java similarity index 100% rename from Adjust/test-options/src/main/java/com/adjust/test_options/TestConnectionOptions.java rename to Adjust/tests/test-options/src/main/java/com/adjust/test_options/TestConnectionOptions.java From 11c25f1baba8f79beade1defcadb455936eda352 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 15 Jul 2024 08:57:38 +0200 Subject: [PATCH 240/540] feat: add Meta Install Referrer for FB Lite app --- .../src/main/AndroidManifest.xml | 3 +++ .../java/com/adjust/sdk/meta/MetaReferrerClient.java | 11 ++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/src/main/AndroidManifest.xml b/Adjust/plugins/sdk-plugin-meta-referrer/src/main/AndroidManifest.xml index 436998fc3..f7a0fdec2 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/src/main/AndroidManifest.xml +++ b/Adjust/plugins/sdk-plugin-meta-referrer/src/main/AndroidManifest.xml @@ -5,4 +5,7 @@ + + + diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaReferrerClient.java b/Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaReferrerClient.java index b3c4e040e..06851d2dd 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaReferrerClient.java +++ b/Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/MetaReferrerClient.java @@ -23,6 +23,11 @@ public class MetaReferrerClient { */ private static final String INSTAGRAM_REFERRER_PROVIDER_AUTHORITY = "com.instagram.contentprovider.InstallReferrerProvider"; + /** + * FBLite install referrer provider content authority. + */ + private static final String FBLITE_REFERRER_PROVIDER_AUTHORITY = "com.facebook.lite.provider.InstallReferrerProvider"; + /** * Meta referrer content provider install referrer column name. */ @@ -73,8 +78,12 @@ public static MetaInstallReferrerResult getMetaInstallReferrer( providerUri = Uri.parse("content://" + FACEBOOK_REFERRER_PROVIDER_AUTHORITY + "/" + fbAppId); } else if (resolveContentProvider(context, INSTAGRAM_REFERRER_PROVIDER_AUTHORITY)) { providerUri = Uri.parse("content://" + INSTAGRAM_REFERRER_PROVIDER_AUTHORITY + "/" + fbAppId); + } else if (resolveContentProvider(context, FBLITE_REFERRER_PROVIDER_AUTHORITY)) { + providerUri = Uri.parse("content://" + FBLITE_REFERRER_PROVIDER_AUTHORITY + "/" + fbAppId); } else { - return new MetaInstallReferrerResult("Failed to find Meta Install Referrer content provider"); + errorMessage = "Failed to find Meta Install Referrer content provider"; + logger.debug(errorMessage); + return new MetaInstallReferrerResult(errorMessage); } ContentResolver contentResolver = context.getContentResolver(); From 088b0b373bee428797bc8cc95f4ab6bdaf72be87 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 9 Jul 2024 13:17:51 +0200 Subject: [PATCH 241/540] refac: rename GoogleAdId callback interface name --- .../src/main/java/com/adjust/sdk/Adjust.java | 12 ++++++------ .../main/java/com/adjust/sdk/OnDeviceIdsRead.java | 8 -------- .../com/adjust/sdk/OnGoogleAdIdReadListener.java | 5 +++++ .../sdk-core/src/main/java/com/adjust/sdk/Util.java | 10 +++++----- 4 files changed, 16 insertions(+), 19 deletions(-) delete mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/OnDeviceIdsRead.java create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGoogleAdIdReadListener.java diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index bf454bbc6..574d1d975 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -327,19 +327,19 @@ public static void disablePlayStoreKidsApp(final Context context) { /** * Called to get value of Google Play Advertising Identifier. * - * @param context Application context - * @param onDeviceIdRead Callback to get triggered once identifier is obtained + * @param context Application context + * @param onGoogleAdIdReadListener Callback to get triggered once identifier is obtained */ - public static void getGoogleAdId(final Context context,final OnDeviceIdsRead onDeviceIdRead) { - if (onDeviceIdRead == null) { - AdjustFactory.getLogger().error("onDeviceIdRead cannot be null"); + public static void getGoogleAdId(final Context context,final OnGoogleAdIdReadListener onGoogleAdIdReadListener) { + if (onGoogleAdIdReadListener == null) { + AdjustFactory.getLogger().error("onGoogleAdIdReadListener cannot be null"); return; } if (context == null) { AdjustFactory.getLogger().error("null context"); return; } - Util.getGoogleAdId(context.getApplicationContext(), onDeviceIdRead); + Util.getGoogleAdId(context.getApplicationContext(), onGoogleAdIdReadListener); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnDeviceIdsRead.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnDeviceIdsRead.java deleted file mode 100644 index dcc7929b6..000000000 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnDeviceIdsRead.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.adjust.sdk; - -/** - * Created by pfms on 29/01/16. - */ -public interface OnDeviceIdsRead { - void onGoogleAdIdRead(String googleAdId); -} diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGoogleAdIdReadListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGoogleAdIdReadListener.java new file mode 100644 index 000000000..b5a5bc2d7 --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGoogleAdIdReadListener.java @@ -0,0 +1,5 @@ +package com.adjust.sdk; + +public interface OnGoogleAdIdReadListener { + void onGoogleAdIdRead(String googleAdId); +} diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index 86f49232c..9b247cbf1 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -155,10 +155,10 @@ private static R runSyncInPlayAdIdSchedulerWithTimeout(final Context context /** * Called to get value of Google Play Advertising Identifier. * - * @param context Application context - * @param onDeviceIdRead Callback to get triggered once identifier is obtained + * @param context Application context + * @param onGoogleAdIdReadListener Callback to get triggered once identifier is obtained */ - public static void getGoogleAdId(final Context context, final OnDeviceIdsRead onDeviceIdRead) { + public static void getGoogleAdId(final Context context, final OnGoogleAdIdReadListener onGoogleAdIdReadListener) { new AsyncTaskExecutor() { @Override protected String doInBackground(Context... params) { @@ -171,8 +171,8 @@ protected String doInBackground(Context... params) { @Override protected void onPostExecute(String playAdiId) { - if (onDeviceIdRead != null) { - onDeviceIdRead.onGoogleAdIdRead(playAdiId); + if (onGoogleAdIdReadListener != null) { + onGoogleAdIdReadListener.onGoogleAdIdRead(playAdiId); } } }.execute(context); From 63d15105f7bbdca68c27f301dc7b4fb69e164bb5 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 9 Jul 2024 13:40:20 +0200 Subject: [PATCH 242/540] refac: aligning onFail among different callback interface --- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 6 ++---- .../src/main/java/com/adjust/sdk/AdjustInstance.java | 2 +- .../sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java | 4 ++-- .../main/java/com/adjust/sdk/OnAmazonAdIdReadListener.java | 1 - .../adjust/sdk/OnGooglePlayInstallReferrerReadListener.java | 2 +- 5 files changed, 6 insertions(+), 9 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 574d1d975..d0b53ed5f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -336,7 +336,7 @@ public static void getGoogleAdId(final Context context,final OnGoogleAdIdReadLis return; } if (context == null) { - AdjustFactory.getLogger().error("null context"); + AdjustFactory.getLogger().error("getGoogleAdId: null context"); return; } Util.getGoogleAdId(context.getApplicationContext(), onGoogleAdIdReadListener); @@ -356,9 +356,7 @@ public static void getAmazonAdId(final Context context,final OnAmazonAdIdReadLis Context appContext = extractApplicationContext(context); if (appContext == null) { - String message = "null context"; - AdjustFactory.getLogger().error(message); - onAmazonAdIdReadListener.onFail(message); + AdjustFactory.getLogger().error("getAmazonAdId: null context"); return; } AdjustInstance adjustInstance = Adjust.getDefaultInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 07fd57515..8c29caba1 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -609,7 +609,7 @@ public void onInstallReferrerRead(ReferrerDetails referrerDetails, String referr @Override public void onFail(String message) { - onGooglePlayInstallReferrerReadListener.onFailure(message); + onGooglePlayInstallReferrerReadListener.onFail(message); } }); installReferrer.startConnection(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 25e8c8756..2d8133b17 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -546,7 +546,7 @@ private static String getFireAdvertisingId(final ContentResolver contentResolver private static void getFireAdvertisingIdAsync(final ContentResolver contentResolver,final OnAmazonAdIdReadListener onAmazonAdIdReadListener) { if (contentResolver == null) { - onAmazonAdIdReadListener.onFail("contentResolver could not be retrieved"); + AdjustFactory.getLogger().error("contentResolver could not be retrieved"); return; } try { @@ -554,7 +554,7 @@ private static void getFireAdvertisingIdAsync(final ContentResolver contentResol String amazonAdId = Settings.Secure.getString(contentResolver, "advertising_id"); onAmazonAdIdReadListener.onAmazonAdIdRead(amazonAdId); } catch (Exception ex) { - onAmazonAdIdReadListener.onFail(ex.getMessage()); + AdjustFactory.getLogger().error(ex.getMessage()); } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAmazonAdIdReadListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAmazonAdIdReadListener.java index 65596d1be..a5351f848 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAmazonAdIdReadListener.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnAmazonAdIdReadListener.java @@ -3,5 +3,4 @@ public interface OnAmazonAdIdReadListener { void onAmazonAdIdRead(String amazonAdId); - void onFail(String message); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java index 011b916f1..46c3212ae 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnGooglePlayInstallReferrerReadListener.java @@ -2,6 +2,6 @@ public interface OnGooglePlayInstallReferrerReadListener { void onInstallReferrerRead(GooglePlayInstallReferrerDetails referrerDetails); - void onFailure(String message); + void onFail(String message); } From 543a23ca760383b4691553bea3960c8063a4bb36 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 9 Jul 2024 15:09:44 +0200 Subject: [PATCH 243/540] feat: change default fallback domain to adjust.io --- .../java/com/adjust/sdk/network/UrlStrategy.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java index 56c909f0a..dc3091f88 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java @@ -17,10 +17,10 @@ import java.util.List; public class UrlStrategy { - private static final String BASE_URL_WORLD = "https://app.adjust.world"; - private static final String GDPR_URL_WORLD = "https://gdpr.adjust.world"; - private static final String SUBSCRIPTION_URL_WORLD = "https://subscription.adjust.world"; - private static final String PURCHASE_VERIFICATION_URL_WORLD = "https://ssrv.adjust.world"; + private static final String BASE_URL_IO = "https://app.adjust.io"; + private static final String GDPR_URL_IO = "https://gdpr.adjust.io"; + private static final String SUBSCRIPTION_URL_IO = "https://subscription.adjust.io"; + private static final String PURCHASE_VERIFICATION_URL_IO = "https://ssrv.adjust.io"; private final List urlStrategyDomains; private final boolean useSubdomains; @@ -140,7 +140,7 @@ public String targetUrlByActivityKind(final ActivityKind activityKind) { private List baseUrlChoices() { if (urlStrategyDomains == null || urlStrategyDomains.isEmpty()) { - return Arrays.asList(BASE_URL, BASE_URL_WORLD); + return Arrays.asList(BASE_URL, BASE_URL_IO); } if (useSubdomains) { List baseUrls = new ArrayList<>(); @@ -158,7 +158,7 @@ private List baseUrlChoices() { } private List gdprUrlChoices() { if (urlStrategyDomains == null || urlStrategyDomains.isEmpty()) { - return Arrays.asList(GDPR_URL, GDPR_URL_WORLD); + return Arrays.asList(GDPR_URL, GDPR_URL_IO); } List baseUrls = new ArrayList<>(); if (useSubdomains) { @@ -174,7 +174,7 @@ private List gdprUrlChoices() { } private List subscriptionUrlChoices() { if (urlStrategyDomains == null || urlStrategyDomains.isEmpty()) { - return Arrays.asList(SUBSCRIPTION_URL, SUBSCRIPTION_URL_WORLD); + return Arrays.asList(SUBSCRIPTION_URL, SUBSCRIPTION_URL_IO); } List baseUrls = new ArrayList<>(); if (useSubdomains) { @@ -190,7 +190,7 @@ private List subscriptionUrlChoices() { } private List purchaseVerificationUrlChoices() { if (urlStrategyDomains == null || urlStrategyDomains.isEmpty()) { - return Arrays.asList(PURCHASE_VERIFICATION_URL, PURCHASE_VERIFICATION_URL_WORLD); + return Arrays.asList(PURCHASE_VERIFICATION_URL, PURCHASE_VERIFICATION_URL_IO); } List baseUrls = new ArrayList<>(); if (useSubdomains){ From 0b22a454f3e807b86f5d1579d3517ae754e480c9 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 9 Jul 2024 17:50:12 +0200 Subject: [PATCH 244/540] feat: add getter for last opened deeplink --- .../src/main/java/com/adjust/sdk/Adjust.java | 20 +++ .../java/com/adjust/sdk/AdjustInstance.java | 126 ++++++++++++------ .../sdk/OnLastDeeplinkReadListener.java | 7 + .../adjust/sdk/SharedPreferencesManager.java | 14 ++ 4 files changed, 128 insertions(+), 39 deletions(-) create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/OnLastDeeplinkReadListener.java diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index d0b53ed5f..a696ed338 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -409,6 +409,26 @@ public static void getGooglePlayInstallReferrer(final Context context, final OnG AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.getGooglePlayInstallReferrer(context ,onGooglePlayInstallReferrerReadListener); } + + /** + * Called to get last opened deeplink. + * + * @param context Application context + * @param onLastDeeplinkReadListener Callback to obtain last opened deeplink. + */ + public static void getLastDeeplink(final Context context, final OnLastDeeplinkReadListener onLastDeeplinkReadListener) { + if (onLastDeeplinkReadListener == null) { + AdjustFactory.getLogger().error("onLastDeeplinkReadListener cannot be null"); + return; + } + if (context == null) { + AdjustFactory.getLogger().error("null context"); + return; + } + AdjustInstance adjustInstance = Adjust.getDefaultInstance(); + adjustInstance.getLastDeeplink(context, onLastDeeplinkReadListener); + } + /** * Called to get native SDK version string. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 8c29caba1..9a725f99b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -203,6 +203,8 @@ public void processDeeplink(final Uri url, final Context context) { return; } + cacheDeeplink(url, context); + long clickTime = System.currentTimeMillis(); if (!checkActivityHandler("processDeeplink", true)) { saveDeeplink(url, clickTime, context); @@ -226,6 +228,8 @@ public void processAndResolveDeeplink(Uri url, Context context, OnDeeplinkResolv return; } + cacheDeeplink(url, context); + // if deep link processing is triggered prior to SDK being initialized long clickTime = System.currentTimeMillis(); if (!checkActivityHandler("processAndResolveDeeplink", true)) { @@ -626,6 +630,70 @@ public void getAmazonAdId(final Context context, final OnAmazonAdIdReadListener DeviceInfo.getFireAdvertisingIdBypassConditions(context.getContentResolver(),onAmazonAdIdReadListener); } + /** + * Verify in app purchase from Google Play. + * + * @param purchase AdjustPurchase object to be verified + * @param callback Callback to be pinged with the verification results + */ + public void verifyPlayStorePurchase(final AdjustPlayStorePurchase purchase, + final OnPurchaseVerificationFinishedListener callback) { + if (!checkActivityHandler("verifyPurchase")) { + AdjustPurchaseVerificationResult result = new AdjustPurchaseVerificationResult( + "not_verified", + 100, + "SDK needs to be initialized before making purchase verification request"); + callback.onVerificationFinished(result); + return; + } + activityHandler.verifyPlayStorePurchase(purchase, callback); + } + + /** + * Verify in app purchase from Google Play and track Adjust event associated with it. + * + * @param event AdjustEvent to be tracked + * @param callback Callback to be pinged with the verification results + */ + public void verifyAndTrackPlayStorePurchase(AdjustEvent event, OnPurchaseVerificationFinishedListener callback) { + if (!checkActivityHandler("verifyAndTrack")) { + if (callback != null) { + AdjustPurchaseVerificationResult result = new AdjustPurchaseVerificationResult( + "not_verified", + 100, + "SDK needs to be initialized before making purchase verification request"); + callback.onVerificationFinished(result); + } + return; + } + activityHandler.verifyAndTrackPlayStorePurchase(event, callback); + } + + /** + * Called to get last opened deeplink. + * + * @param context Application context + * @param onLastDeeplinkReadListener Callback to obtain last opened deeplink. + */ + public void getLastDeeplink(final Context context, final OnLastDeeplinkReadListener onLastDeeplinkReadListener) { + new AsyncTaskExecutor() { + @Override + protected Uri doInBackground(Void... voids) { + String cachedDeeplink = getCachedDeeplink(context); + try { + return Uri.parse(cachedDeeplink); + } catch (Exception e) { + return null; + } + } + + @Override + protected void onPostExecute(Uri deeplink) { + onLastDeeplinkReadListener.onLastDeeplinkRead(deeplink); + } + }.execute(); + } + /** * Check if ActivityHandler instance is set or not. * @@ -730,6 +798,25 @@ private void saveDeeplink(final Uri deeplink, final long clickTime, final Contex SharedPreferencesManager.getDefaultInstance(context).saveDeeplink(deeplink, clickTime); } + /** + * Cache deep link to shared preferences. + * + * @param deeplink Deeplink Uri object + * @param context Application context + */ + private void cacheDeeplink(final Uri deeplink, final Context context) { + SharedPreferencesManager.getDefaultInstance(context).cacheDeeplink(deeplink); + } + + /** + * Get cached deeplink from shared preferences. + * + * @param context Application context + */ + private String getCachedDeeplink(final Context context) { + return SharedPreferencesManager.getDefaultInstance(context).getCachedDeeplink(); + } + /** * Flag stored referrers as still not sent. * @@ -768,45 +855,6 @@ private boolean isInstanceEnabled() { return this.startEnabled == null || this.startEnabled; } - /** - * Verify in app purchase from Google Play. - * - * @param purchase AdjustPurchase object to be verified - * @param callback Callback to be pinged with the verification results - */ - public void verifyPlayStorePurchase(final AdjustPlayStorePurchase purchase, - final OnPurchaseVerificationFinishedListener callback) { - if (!checkActivityHandler("verifyPurchase")) { - AdjustPurchaseVerificationResult result = new AdjustPurchaseVerificationResult( - "not_verified", - 100, - "SDK needs to be initialized before making purchase verification request"); - callback.onVerificationFinished(result); - return; - } - activityHandler.verifyPlayStorePurchase(purchase, callback); - } - - /** - * Verify in app purchase from Google Play and track Adjust event associated with it. - * - * @param event AdjustEvent to be tracked - * @param callback Callback to be pinged with the verification results - */ - public void verifyAndTrackPlayStorePurchase(AdjustEvent event, OnPurchaseVerificationFinishedListener callback) { - if (!checkActivityHandler("verifyAndTrack")) { - if (callback != null) { - AdjustPurchaseVerificationResult result = new AdjustPurchaseVerificationResult( - "not_verified", - 100, - "SDK needs to be initialized before making purchase verification request"); - callback.onVerificationFinished(result); - } - return; - } - activityHandler.verifyAndTrackPlayStorePurchase(event, callback); - } - /** * Used for testing purposes only. Do NOT use this method. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnLastDeeplinkReadListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnLastDeeplinkReadListener.java new file mode 100644 index 000000000..2c34061c3 --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnLastDeeplinkReadListener.java @@ -0,0 +1,7 @@ +package com.adjust.sdk; + +import android.net.Uri; + +public interface OnLastDeeplinkReadListener { + void onLastDeeplinkRead(Uri deeplink); +} diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java index 6700820ad..2040dd4b1 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -42,6 +42,8 @@ public class SharedPreferencesManager { private static final String PREFS_KEY_DEEPLINK_CLICK_TIME = "deeplink_click_time"; + private static final String PREFS_KEY_DEEPLINK_URL_CACHED = "deeplink_url_cached"; + private static final String PREFS_KEY_PREINSTALL_PAYLOAD_READ_STATUS = "preinstall_payload_read_status"; @@ -398,6 +400,18 @@ public synchronized void removeDeeplink() { remove(PREFS_KEY_DEEPLINK_CLICK_TIME); } + public synchronized void cacheDeeplink(final Uri deeplink) { + if (deeplink == null) { + return; + } + + saveString(PREFS_KEY_DEEPLINK_URL_CACHED, deeplink.toString()); + } + + public synchronized String getCachedDeeplink() { + return getString(PREFS_KEY_DEEPLINK_URL_CACHED); + } + /** * Save information that preinstall tracker has been tracked to shared preferences. */ From b15de3a1cc6f496d474d8ff170e3a782feebd162 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 9 Jul 2024 18:21:24 +0200 Subject: [PATCH 245/540] refac: log message cleanup for non plugin users --- .../src/main/java/com/adjust/sdk/huawei/Util.java | 5 +++++ .../src/main/java/com/adjust/sdk/meta/Util.java | 2 ++ .../java/com/adjust/sdk/samsung/clouddev/Util.java | 6 +++++- .../src/main/java/com/adjust/sdk/samsung/Util.java | 2 ++ .../src/main/java/com/adjust/sdk/vivo/Util.java | 2 ++ .../src/main/java/com/adjust/sdk/xiaomi/Util.java | 2 ++ .../src/main/java/com/adjust/sdk/Reflection.java | 10 +--------- 7 files changed, 19 insertions(+), 10 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/Util.java b/Adjust/plugins/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/Util.java index d454ecccf..6006660a1 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/Util.java +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/src/main/java/com/adjust/sdk/huawei/Util.java @@ -10,6 +10,9 @@ public synchronized static ReferrerDetails getHuaweiAdsInstallReferrerDetails(Co if (!AdjustHuaweiReferrer.shouldReadHuaweiReferrer) { return null; } + + logger.info("getHuaweiAdsInstallReferrerDetails invoked"); + HuaweiInstallReferrerResult huaweiInstallReferrerResult = HuaweiReferrerClient.getHuaweiAdsInstallReferrer(context, logger); if (huaweiInstallReferrerResult == null) { return null; @@ -29,6 +32,8 @@ public synchronized static ReferrerDetails getHuaweiAppGalleryInstallReferrerDet return null; } + logger.info("getHuaweiAppGalleryInstallReferrerDetails invoked"); + HuaweiInstallReferrerResult huaweiInstallReferrerResult = HuaweiReferrerClient.getHuaweiAppGalleryInstallReferrer(context, logger); if (huaweiInstallReferrerResult == null) { return null; diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/Util.java b/Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/Util.java index c0b86fd40..527d61ff5 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/Util.java +++ b/Adjust/plugins/sdk-plugin-meta-referrer/src/main/java/com/adjust/sdk/meta/Util.java @@ -11,6 +11,8 @@ public synchronized static ReferrerDetails getMetaInstallReferrerDetails(Context return null; } + logger.info("getMetaInstallReferrerDetails invoked"); + MetaInstallReferrerResult metaInstallReferrerResult = MetaReferrerClient.getMetaInstallReferrer(context, fbAppId, logger, true); if (metaInstallReferrerResult == null) { return null; diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/src/main/java/com/adjust/sdk/samsung/clouddev/Util.java b/Adjust/plugins/sdk-plugin-samsung-clouddev/src/main/java/com/adjust/sdk/samsung/clouddev/Util.java index 44ea46614..e55148b5b 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/src/main/java/com/adjust/sdk/samsung/clouddev/Util.java +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/src/main/java/com/adjust/sdk/samsung/clouddev/Util.java @@ -5,11 +5,13 @@ import com.adjust.sdk.ILogger; public class Util { - public synchronized static String getGoogleAdId(Context context, ILogger logger) { + public synchronized static String getGoogleAdIdInCloudEnvironment(Context context, ILogger logger) { if (!AdjustSamsungCloudDev.shouldUseSamsungCloudDevSdk) { return null; } + logger.info("getGoogleAdIdInCloudEnvironment invoked"); + return SamsungCloudDevClient.getGoogleAdId(context, logger, 4000); } @@ -18,6 +20,8 @@ public synchronized static boolean isAppRunningInCloudEnvironment(Context contex return false; } + logger.info("isAppRunningInCloudEnvironment invoked"); + return SamsungCloudDevClient.isAppRunningInCloudEnvironment(context, logger); } } diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java b/Adjust/plugins/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java index 8b9f5dd93..62ec76819 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/src/main/java/com/adjust/sdk/samsung/Util.java @@ -12,6 +12,8 @@ public synchronized static ReferrerDetails getSamsungInstallReferrerDetails(Cont return null; } + logger.info("getSamsungInstallReferrerDetails invoked"); + SamsungInstallReferrerResult referrerResult = SamsungReferrerClient.getReferrer(context, logger, 2000); if (referrerResult == null) { diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/Util.java b/Adjust/plugins/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/Util.java index a1b579c68..2e186b021 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/Util.java +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/src/main/java/com/adjust/sdk/vivo/Util.java @@ -11,6 +11,8 @@ public synchronized static ReferrerDetails getVivoInstallReferrerDetails(Context return null; } + logger.info("getVivoInstallReferrerDetails invoked"); + VivoInstallReferrerResult vivoInstallReferrerResult = VivoReferrerClient.getReferrer(context, logger); if (vivoInstallReferrerResult.vivoInstallReferrerDetails == null) { return null; diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/Util.java b/Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/Util.java index e6c4271bc..9c5894cac 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/Util.java +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/src/main/java/com/adjust/sdk/xiaomi/Util.java @@ -12,6 +12,8 @@ public synchronized static ReferrerDetails getXiaomiInstallReferrerDetails(Conte return null; } + logger.info("getXiaomiInstallReferrerDetails invoked"); + XiaomiInstallReferrerDetails xiaomiInstallReferrerDetails = XiaomiReferrerClient.getReferrer(context, logger, 3000).xiaomiInstallReferrerDetails; if (xiaomiInstallReferrerDetails == null) { return null; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java index 8c0586477..f58a1c05e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java @@ -68,7 +68,6 @@ public static ReferrerDetails getMetaReferrer(Context context, String fbAppId, I new Class[]{Context.class, String.class, ILogger.class}, context, fbAppId, logger); } catch (Exception e) { - logger.info("invoke getMetaInstallReferrerDetails : " + e.getMessage()); } return referrerDetails; } @@ -81,7 +80,6 @@ public static ReferrerDetails getHuaweiAdsReferrer(Context context, ILogger logg new Class[]{Context.class, ILogger.class}, context, logger); } catch (Exception e) { - logger.info("invoke getHuaweiAdsInstallReferrerDetails : " + e.getMessage()); } return referrerDetails; } @@ -94,7 +92,6 @@ public static ReferrerDetails getHuaweiAppGalleryReferrer(Context context, ILogg new Class[]{Context.class, ILogger.class}, context, logger); } catch (Exception e) { - logger.info("invoke getHuaweiAppGalleryInstallReferrerDetails : " + e.getMessage()); } return referrerDetails; } @@ -107,7 +104,6 @@ public static ReferrerDetails getSamsungReferrer(Context context, ILogger logger new Class[]{Context.class, ILogger.class}, context, logger); } catch (Exception e) { - logger.info("invoke getSamsungInstallReferrerDetails : " + e.getMessage()); } return referrerDetails; } @@ -120,7 +116,6 @@ public static ReferrerDetails getXiaomiReferrer(Context context, ILogger logger) new Class[]{Context.class, ILogger.class}, context, logger); } catch (Exception e) { - logger.info("invoke getXiaomiInstallReferrerDetails : " + e.getMessage()); } return referrerDetails; } @@ -133,7 +128,6 @@ public static ReferrerDetails getVivoReferrer(Context context, ILogger logger) { new Class[]{Context.class, ILogger.class}, context, logger); } catch (Exception e) { - logger.info("invoke getVivoInstallReferrerDetails : " + e.getMessage()); } return referrerDetails; } @@ -166,11 +160,10 @@ public static String getSamsungCloudDevGoogleAdId(Context context, ILogger logge String googleAdId = null; try { googleAdId = (String) invokeStaticMethod("com.adjust.sdk.samsung.clouddev.Util", - "getGoogleAdId", + "getGoogleAdIdInCloudEnvironment", new Class[]{Context.class, ILogger.class}, context, logger); } catch (Exception e) { - logger.info("invoke getGoogleAdId : " + e.getMessage()); } return googleAdId; } @@ -183,7 +176,6 @@ public static boolean isAppRunningInSamsungCloudEnvironment(Context context, ILo new Class[]{Context.class, ILogger.class}, context, logger); } catch (Exception e) { - logger.info("invoke isAppRunningInCloudEnvironment : " + e.getMessage()); } return isCloudEnvironment; } From 9cb1008d5c5054fbdc454e83db2b350d24ef1ec8 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 9 Jul 2024 18:24:39 +0200 Subject: [PATCH 246/540] feat: update beta version 2 --- .../src/main/java/com/adjust/sdk/network/UtilNetworking.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java index ab3805b4c..5af40867e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java @@ -32,7 +32,7 @@ public void applyConnectionOptions(final HttpsURLConnection connection, final String clientSdk) { connection.setRequestProperty("Client-SDK", clientSdk); - connection.setRequestProperty("Beta-Version", "1"); + connection.setRequestProperty("Beta-Version", "2"); connection.setConnectTimeout(Constants.ONE_MINUTE); connection.setReadTimeout(Constants.ONE_MINUTE); } From 0dc4eb6d5906b113b03e0b6de9b45c3ac6a95af7 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 10 Jul 2024 12:34:37 +0200 Subject: [PATCH 247/540] refac: remove last_interval from payload --- .../src/main/java/com/adjust/sdk/PackageBuilder.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 59570a160..820841e3b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -51,7 +51,6 @@ static class ActivityStateCopy { int sessionCount = -1; int subsessionCount = -1; long timeSpent = -1; - long lastInterval = -1; long sessionLength = -1; String uuid = null; String pushToken = null; @@ -64,7 +63,6 @@ static class ActivityStateCopy { this.sessionCount = activityState.sessionCount; this.subsessionCount = activityState.subsessionCount; this.timeSpent = activityState.timeSpent; - this.lastInterval = activityState.lastInterval; this.sessionLength = activityState.sessionLength; this.uuid = activityState.uuid; this.pushToken = activityState.pushToken; @@ -293,7 +291,6 @@ private Map getSessionParameters() { PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); PackageBuilder.addString(parameters, "installed_at", deviceInfo.appInstallTime); PackageBuilder.addString(parameters, "language", deviceInfo.language); - PackageBuilder.addDuration(parameters, "last_interval", activityStateCopy.lastInterval); PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); PackageBuilder.addBoolean(parameters, "needs_response_details", true); @@ -550,7 +547,6 @@ private Map getClickParameters(String source) { PackageBuilder.addString(parameters, "install_version", installVersion); PackageBuilder.addString(parameters, "installed_at", deviceInfo.appInstallTime); PackageBuilder.addString(parameters, "language", deviceInfo.language); - PackageBuilder.addDuration(parameters, "last_interval", activityStateCopy.lastInterval); PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); PackageBuilder.addBoolean(parameters, "needs_response_details", true); @@ -925,7 +921,6 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); PackageBuilder.addString(parameters, "installed_at", deviceInfo.appInstallTime); PackageBuilder.addString(parameters, "language", deviceInfo.language); - PackageBuilder.addDuration(parameters, "last_interval", activityStateCopy.lastInterval); PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); PackageBuilder.addBoolean(parameters, "needs_response_details", true); @@ -1023,7 +1018,6 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); PackageBuilder.addString(parameters, "installed_at", deviceInfo.appInstallTime); PackageBuilder.addString(parameters, "language", deviceInfo.language); - PackageBuilder.addDuration(parameters, "last_interval", activityStateCopy.lastInterval); PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); PackageBuilder.addBoolean(parameters, "needs_response_details", true); @@ -1118,7 +1112,6 @@ private Map getVerificationParameters(AdjustPlayStorePurchase pu PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); PackageBuilder.addString(parameters, "installed_at", deviceInfo.appInstallTime); PackageBuilder.addString(parameters, "language", deviceInfo.language); - PackageBuilder.addDuration(parameters, "last_interval", activityStateCopy.lastInterval); PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); PackageBuilder.addBoolean(parameters, "needs_response_details", true); @@ -1208,7 +1201,6 @@ private Map getVerificationParameters(AdjustEvent event) { PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); PackageBuilder.addString(parameters, "installed_at", deviceInfo.appInstallTime); PackageBuilder.addString(parameters, "language", deviceInfo.language); - PackageBuilder.addDuration(parameters, "last_interval", activityStateCopy.lastInterval); PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); PackageBuilder.addBoolean(parameters, "needs_response_details", true); From 5b3358d79f81eb51dcfa2c6ea8091ae382c7f35b Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 10 Jul 2024 15:16:28 +0200 Subject: [PATCH 248/540] refac: webbridge cleanup to reflect changes in core --- .../src/main/assets/adjust.js | 16 +--------------- .../sdk/webbridge/AdjustBridgeInstance.java | 11 +++-------- 2 files changed, 4 insertions(+), 23 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 553434cb3..696b74692 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -217,13 +217,7 @@ var Adjust = { this.getAmazonIdCallbackSuccessName = 'Adjust.adjust_getAmazonIdCallbackSuccess'; this.getAmazonIdCallbackSuccessFunction = callbackSuccess; } - if (typeof callbackFail === 'string' || callbackFail instanceof String) { - this.getAmazonIdCallbackFailName = callbackFail; - } else { - this.getAmazonIdCallbackFailName = 'Adjust.adjust_getAmazonIdCallbackFail'; - this.getAmazonIdCallbackFailFunction = callbackFail; - } - AdjustBridge.getAmazonAdId(this.getAmazonIdCallbackSuccessName,this.getAmazonIdCallbackFailName); + AdjustBridge.getAmazonAdId(this.getAmazonIdCallbackSuccessName); } }, @@ -233,12 +227,6 @@ var Adjust = { } }, - adjust_getAmazonIdCallbackFail: function (message) { - if (AdjustBridge && this.getAmazonIdCallbackFailFunction) { - this.getAmazonIdCallbackFailName(message); - } - }, - getAttribution: function (callback) { if (AdjustBridge) { if (typeof callback === 'string' || callback instanceof String) { @@ -298,8 +286,6 @@ var Adjust = { this.getAttributionCallbackFunction = undefined; this.getAmazonIdCallbackSuccessName = undefined; this.getAmazonIdCallbackSuccessFunction = undefined; - this.getAmazonIdCallbackFailName = undefined; - this.getAmazonIdCallbackFailFunction = undefined; this.getSdkVersionCallbackFunction = undefined; this.getSdkVersionCallbackName = undefined; }, diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 9a8ef1281..713ad18e8 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -25,9 +25,9 @@ import com.adjust.sdk.OnAttributionChangedListener; import com.adjust.sdk.OnAttributionReadListener; import com.adjust.sdk.OnDeferredDeeplinkResponseListener; -import com.adjust.sdk.OnDeviceIdsRead; import com.adjust.sdk.OnEventTrackingFailedListener; import com.adjust.sdk.OnEventTrackingSucceededListener; +import com.adjust.sdk.OnGoogleAdIdReadListener; import com.adjust.sdk.OnSdkVersionReadListener; import com.adjust.sdk.OnIsEnabledListener; import com.adjust.sdk.OnSessionTrackingFailedListener; @@ -699,7 +699,7 @@ public void getGoogleAdId(final String callback) { if (!isInitialized()) { return; } - Adjust.getGoogleAdId(application.getApplicationContext(), new OnDeviceIdsRead() { + Adjust.getGoogleAdId(application.getApplicationContext(), new OnGoogleAdIdReadListener() { @Override public void onGoogleAdIdRead(String googleAdId) { AdjustBridgeUtil.execSingleValueCallback(webView, callback, googleAdId); @@ -708,7 +708,7 @@ public void onGoogleAdIdRead(String googleAdId) { } @JavascriptInterface - public void getAmazonAdId(final String callbackSuccess,final String callbackFail) { + public void getAmazonAdId(final String callbackSuccess) { if (!isInitialized()) { return; } @@ -717,11 +717,6 @@ public void getAmazonAdId(final String callbackSuccess,final String callbackFail public void onAmazonAdIdRead(String adid) { AdjustBridgeUtil.execSingleValueCallback(webView, callbackSuccess, adid); } - - @Override - public void onFail(String message) { - AdjustBridgeUtil.execSingleValueCallback(webView, callbackFail, null); - } }); } From 946e4d3e0a7172fbc0ed80fe11e7ab5a181d141b Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 12 Jul 2024 12:11:15 +0200 Subject: [PATCH 249/540] refac: rename playstore kids setting APIs --- .../sdk-plugin-webbridge/src/main/assets/adjust.js | 8 ++++---- .../adjust/sdk/webbridge/AdjustBridgeInstance.java | 8 ++++---- .../src/main/java/com/adjust/sdk/Adjust.java | 8 ++++---- .../src/main/java/com/adjust/sdk/AdjustInstance.java | 4 ++-- .../com/adjust/testapp/AdjustCommandExecutor.java | 12 ++++++------ .../src/main/assets/command_executor.js | 12 ++++++------ 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 696b74692..1f1f2740e 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -153,15 +153,15 @@ var Adjust = { } }, - enablePlayStoreKidsApp: function () { + enablePlayStoreKidsCompliance: function () { if (AdjustBridge) { - AdjustBridge.enablePlayStoreKidsApp(); + AdjustBridge.enablePlayStoreKidsCompliance(); } }, - disablePlayStoreKidsApp: function () { + disablePlayStoreKidsCompliance: function () { if (AdjustBridge) { - AdjustBridge.disablePlayStoreKidsApp(); + AdjustBridge.disablePlayStoreKidsCompliance(); } }, diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 713ad18e8..76bcb835b 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -677,21 +677,21 @@ public void disableCoppaCompliance() { } @JavascriptInterface - public void enablePlayStoreKidsApp() { + public void enablePlayStoreKidsCompliance() { if (!isInitialized()) { return; } - Adjust.enablePlayStoreKidsApp(application.getApplicationContext()); + Adjust.enablePlayStoreKidsCompliance(application.getApplicationContext()); } @JavascriptInterface - public void disablePlayStoreKidsApp() { + public void disablePlayStoreKidsCompliance() { if (!isInitialized()) { return; } - Adjust.disablePlayStoreKidsApp(application.getApplicationContext()); + Adjust.disablePlayStoreKidsCompliance(application.getApplicationContext()); } @JavascriptInterface diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index a696ed338..69ccfca8c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -309,9 +309,9 @@ public static void disableCoppaCompliance(final Context context) { * * @param context Application context */ - public static void enablePlayStoreKidsApp(final Context context) { + public static void enablePlayStoreKidsCompliance(final Context context) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.enablePlayStoreKidsApp(context); + adjustInstance.enablePlayStoreKidsCompliance(context); } /** @@ -319,9 +319,9 @@ public static void enablePlayStoreKidsApp(final Context context) { * * @param context Application context */ - public static void disablePlayStoreKidsApp(final Context context) { + public static void disablePlayStoreKidsCompliance(final Context context) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.disablePlayStoreKidsApp(context); + adjustInstance.disablePlayStoreKidsCompliance(context); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 9a725f99b..bf5e70b71 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -540,7 +540,7 @@ public void disableCoppaCompliance(Context context) { * * @param context Application context */ - public void enablePlayStoreKidsApp(Context context) { + public void enablePlayStoreKidsCompliance(Context context) { savePlayStoreKidsApp(true, context); } @@ -549,7 +549,7 @@ public void enablePlayStoreKidsApp(Context context) { * * @param context Application context */ - public void disablePlayStoreKidsApp(Context context) { + public void disablePlayStoreKidsCompliance(Context context) { savePlayStoreKidsApp(false, context); } diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 371b9092c..cf2d8085b 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -92,8 +92,8 @@ public void executeCommand(final Command sentCommand) { case "processDeeplink" : processDeeplink(); break; case "enableCoppaCompliance" : enableCoppaCompliance(); break; case "disableCoppaCompliance" : disableCoppaCompliance(); break; - case "enablePlayStoreKidsApp" : enablePlayStoreKidsApp(); break; - case "disablePlayStoreKidsApp" : disablePlayStoreKidsApp(); break; + case "enablePlayStoreKidsApp" : enablePlayStoreKidsCompliance(); break; + case "disablePlayStoreKidsApp" : disablePlayStoreKidsCompliance(); break; case "attributionGetter" : attributionGetter(); break; //case "testBegin": testBegin(); break; // case "testEnd": testEnd(); break; @@ -823,12 +823,12 @@ private void disableCoppaCompliance() { Adjust.disableCoppaCompliance(context.getApplicationContext()); } - private void enablePlayStoreKidsApp() { - Adjust.enablePlayStoreKidsApp(context.getApplicationContext()); + private void enablePlayStoreKidsCompliance() { + Adjust.enablePlayStoreKidsCompliance(context.getApplicationContext()); } - private void disablePlayStoreKidsApp() { - Adjust.disablePlayStoreKidsApp(context.getApplicationContext()); + private void disablePlayStoreKidsCompliance() { + Adjust.disablePlayStoreKidsCompliance(context.getApplicationContext()); } private void attributionGetter() { diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index 9d4c934a3..f48e8a75d 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -137,8 +137,8 @@ AdjustCommandExecutor.prototype.executeCommand = function(command, idx) { case "trackAdRevenue" : this.trackAdRevenue(command.params); break; case "enableCoppaCompliance" : this.enableCoppaCompliance(command.params); break; case "disableCoppaCompliance" : this.disableCoppaCompliance(command.params); break; - case "enablePlayStoreKidsApp" : this.enablePlayStoreKidsApp(command.params); break; - case "disablePlayStoreKidsApp" : this.disablePlayStoreKidsApp(command.params); break; + case "enablePlayStoreKidsApp" : this.enablePlayStoreKidsCompliance(command.params); break; + case "disablePlayStoreKidsApp" : this.disablePlayStoreKidsCompliance(command.params); break; case "attributionGetter" : this.attributionGetter(command.params); break; break; } @@ -635,12 +635,12 @@ AdjustCommandExecutor.prototype.disableCoppaCompliance = function(params) { Adjust.disableCoppaCompliance(); }; -AdjustCommandExecutor.prototype.enablePlayStoreKidsApp = function(params) { - Adjust.enablePlayStoreKidsApp(); +AdjustCommandExecutor.prototype.enablePlayStoreKidsCompliance = function(params) { + Adjust.enablePlayStoreKidsCompliance(); }; -AdjustCommandExecutor.prototype.disablePlayStoreKidsApp = function(params) { - Adjust.disablePlayStoreKidsApp(); +AdjustCommandExecutor.prototype.disablePlayStoreKidsCompliance = function(params) { + Adjust.disablePlayStoreKidsCompliance(); }; AdjustCommandExecutor.prototype.attributionGetter = function(params) { From 50ec86af73a9bdf93dbabd5d6cdfb42af3592029 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 15 Jul 2024 11:15:21 +0200 Subject: [PATCH 250/540] refac: remove finished from event/session success/failure terminology --- .../main/java/com/adjust/examples/GlobalApplication.java | 8 ++++---- .../com/adjust/examples/keyboard/GlobalApplication.java | 8 ++++---- .../main/java/com/adjust/examples/GlobalApplication.java | 8 ++++---- .../com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 8 ++++---- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 8 ++++---- .../com/adjust/sdk/OnEventTrackingFailedListener.java | 2 +- .../com/adjust/sdk/OnEventTrackingSucceededListener.java | 2 +- .../com/adjust/sdk/OnSessionTrackingFailedListener.java | 2 +- .../adjust/sdk/OnSessionTrackingSucceededListener.java | 2 +- .../java/com/adjust/testapp/AdjustCommandExecutor.java | 8 ++++---- 10 files changed, 28 insertions(+), 28 deletions(-) diff --git a/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index 25babb14c..e8be3f94c 100644 --- a/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -55,7 +55,7 @@ public void onAttributionChanged(AdjustAttribution attribution) { // Set event success tracking delegate. config.setOnEventTrackingSucceededListener(new OnEventTrackingSucceededListener() { @Override - public void onFinishedEventTrackingSucceeded(AdjustEventSuccess eventSuccessResponseData) { + public void onEventTrackingSucceeded(AdjustEventSuccess eventSuccessResponseData) { Log.d("example", "Event success callback called!"); Log.d("example", "Event success data: " + eventSuccessResponseData.toString()); } @@ -64,7 +64,7 @@ public void onFinishedEventTrackingSucceeded(AdjustEventSuccess eventSuccessResp // Set event failure tracking delegate. config.setOnEventTrackingFailedListener(new OnEventTrackingFailedListener() { @Override - public void onFinishedEventTrackingFailed(AdjustEventFailure eventFailureResponseData) { + public void onEventTrackingFailed(AdjustEventFailure eventFailureResponseData) { Log.d("example", "Event failure callback called!"); Log.d("example", "Event failure data: " + eventFailureResponseData.toString()); } @@ -73,7 +73,7 @@ public void onFinishedEventTrackingFailed(AdjustEventFailure eventFailureRespons // Set session success tracking delegate. config.setOnSessionTrackingSucceededListener(new OnSessionTrackingSucceededListener() { @Override - public void onFinishedSessionTrackingSucceeded(AdjustSessionSuccess sessionSuccessResponseData) { + public void onSessionTrackingSucceeded(AdjustSessionSuccess sessionSuccessResponseData) { Log.d("example", "Session success callback called!"); Log.d("example", "Session success data: " + sessionSuccessResponseData.toString()); } @@ -82,7 +82,7 @@ public void onFinishedSessionTrackingSucceeded(AdjustSessionSuccess sessionSucce // Set session failure tracking delegate. config.setOnSessionTrackingFailedListener(new OnSessionTrackingFailedListener() { @Override - public void onFinishedSessionTrackingFailed(AdjustSessionFailure sessionFailureResponseData) { + public void onSessionTrackingFailed(AdjustSessionFailure sessionFailureResponseData) { Log.d("example", "Session failure callback called!"); Log.d("example", "Session failure data: " + sessionFailureResponseData.toString()); } diff --git a/Adjust/examples/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java b/Adjust/examples/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java index 55f30b016..c23c8ed18 100644 --- a/Adjust/examples/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java +++ b/Adjust/examples/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java @@ -48,7 +48,7 @@ public void onAttributionChanged(AdjustAttribution attribution) { // Set event success tracking delegate. config.setOnEventTrackingSucceededListener(new OnEventTrackingSucceededListener() { @Override - public void onFinishedEventTrackingSucceeded(AdjustEventSuccess eventSuccessResponseData) { + public void onEventTrackingSucceeded(AdjustEventSuccess eventSuccessResponseData) { Log.d("example", "Event success callback called!"); Log.d("example", "Event success data: " + eventSuccessResponseData.toString()); } @@ -57,7 +57,7 @@ public void onFinishedEventTrackingSucceeded(AdjustEventSuccess eventSuccessResp // Set event failure tracking delegate. config.setOnEventTrackingFailedListener(new OnEventTrackingFailedListener() { @Override - public void onFinishedEventTrackingFailed(AdjustEventFailure eventFailureResponseData) { + public void onEventTrackingFailed(AdjustEventFailure eventFailureResponseData) { Log.d("example", "Event failure callback called!"); Log.d("example", "Event failure data: " + eventFailureResponseData.toString()); } @@ -66,7 +66,7 @@ public void onFinishedEventTrackingFailed(AdjustEventFailure eventFailureRespons // Set session success tracking delegate. config.setOnSessionTrackingSucceededListener(new OnSessionTrackingSucceededListener() { @Override - public void onFinishedSessionTrackingSucceeded(AdjustSessionSuccess sessionSuccessResponseData) { + public void onSessionTrackingSucceeded(AdjustSessionSuccess sessionSuccessResponseData) { Log.d("example", "Session success callback called!"); Log.d("example", "Session success data: " + sessionSuccessResponseData.toString()); } @@ -75,7 +75,7 @@ public void onFinishedSessionTrackingSucceeded(AdjustSessionSuccess sessionSucce // Set session failure tracking delegate. config.setOnSessionTrackingFailedListener(new OnSessionTrackingFailedListener() { @Override - public void onFinishedSessionTrackingFailed(AdjustSessionFailure sessionFailureResponseData) { + public void onSessionTrackingFailed(AdjustSessionFailure sessionFailureResponseData) { Log.d("example", "Session failure callback called!"); Log.d("example", "Session failure data: " + sessionFailureResponseData.toString()); } diff --git a/Adjust/examples/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/examples/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java index ff6dce7d4..9fdf0bd88 100755 --- a/Adjust/examples/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/examples/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java @@ -45,7 +45,7 @@ public void onAttributionChanged(AdjustAttribution attribution) { // Set event success tracking delegate. config.setOnEventTrackingSucceededListener(new OnEventTrackingSucceededListener() { @Override - public void onFinishedEventTrackingSucceeded(AdjustEventSuccess eventSuccessResponseData) { + public void onEventTrackingSucceeded(AdjustEventSuccess eventSuccessResponseData) { Log.d("example", "Event success callback called!"); Log.d("example", "Event success data: " + eventSuccessResponseData.toString()); } @@ -54,7 +54,7 @@ public void onFinishedEventTrackingSucceeded(AdjustEventSuccess eventSuccessResp // Set event failure tracking delegate. config.setOnEventTrackingFailedListener(new OnEventTrackingFailedListener() { @Override - public void onFinishedEventTrackingFailed(AdjustEventFailure eventFailureResponseData) { + public void onEventTrackingFailed(AdjustEventFailure eventFailureResponseData) { Log.d("example", "Event failure callback called!"); Log.d("example", "Event failure data: " + eventFailureResponseData.toString()); } @@ -63,7 +63,7 @@ public void onFinishedEventTrackingFailed(AdjustEventFailure eventFailureRespons // Set session success tracking delegate. config.setOnSessionTrackingSucceededListener(new OnSessionTrackingSucceededListener() { @Override - public void onFinishedSessionTrackingSucceeded(AdjustSessionSuccess sessionSuccessResponseData) { + public void onSessionTrackingSucceeded(AdjustSessionSuccess sessionSuccessResponseData) { Log.d("example", "Session success callback called!"); Log.d("example", "Session success data: " + sessionSuccessResponseData.toString()); } @@ -72,7 +72,7 @@ public void onFinishedSessionTrackingSucceeded(AdjustSessionSuccess sessionSucce // Set session failure tracking delegate. config.setOnSessionTrackingFailedListener(new OnSessionTrackingFailedListener() { @Override - public void onFinishedSessionTrackingFailed(AdjustSessionFailure sessionFailureResponseData) { + public void onSessionTrackingFailed(AdjustSessionFailure sessionFailureResponseData) { Log.d("example", "Session failure callback called!"); Log.d("example", "Session failure data: " + sessionFailureResponseData.toString()); } diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 76bcb835b..44060c6c5 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -265,7 +265,7 @@ public void onAttributionChanged(AdjustAttribution attribution) { final String eventSuccessCallbackName = AdjustBridgeUtil.fieldToString(eventSuccessCallbackNameField); if (eventSuccessCallbackName != null) { adjustConfig.setOnEventTrackingSucceededListener(new OnEventTrackingSucceededListener() { - public void onFinishedEventTrackingSucceeded(AdjustEventSuccess eventSuccessResponseData) { + public void onEventTrackingSucceeded(AdjustEventSuccess eventSuccessResponseData) { AdjustBridgeUtil.execEventSuccessCallbackCommand(webView, eventSuccessCallbackName, eventSuccessResponseData); } }); @@ -275,7 +275,7 @@ public void onFinishedEventTrackingSucceeded(AdjustEventSuccess eventSuccessResp final String eventFailureCallbackName = AdjustBridgeUtil.fieldToString(eventFailureCallbackNameField); if (eventFailureCallbackName != null) { adjustConfig.setOnEventTrackingFailedListener(new OnEventTrackingFailedListener() { - public void onFinishedEventTrackingFailed(AdjustEventFailure eventFailureResponseData) { + public void onEventTrackingFailed(AdjustEventFailure eventFailureResponseData) { AdjustBridgeUtil.execEventFailureCallbackCommand(webView, eventFailureCallbackName, eventFailureResponseData); } }); @@ -286,7 +286,7 @@ public void onFinishedEventTrackingFailed(AdjustEventFailure eventFailureRespons if (sessionSuccessCallbackName != null) { adjustConfig.setOnSessionTrackingSucceededListener(new OnSessionTrackingSucceededListener() { @Override - public void onFinishedSessionTrackingSucceeded(AdjustSessionSuccess sessionSuccessResponseData) { + public void onSessionTrackingSucceeded(AdjustSessionSuccess sessionSuccessResponseData) { AdjustBridgeUtil.execSessionSuccessCallbackCommand(webView, sessionSuccessCallbackName, sessionSuccessResponseData); } }); @@ -297,7 +297,7 @@ public void onFinishedSessionTrackingSucceeded(AdjustSessionSuccess sessionSucce if (sessionFailureCallbackName != null) { adjustConfig.setOnSessionTrackingFailedListener(new OnSessionTrackingFailedListener() { @Override - public void onFinishedSessionTrackingFailed(AdjustSessionFailure failureResponseData) { + public void onSessionTrackingFailed(AdjustSessionFailure failureResponseData) { AdjustBridgeUtil.execSessionFailureCallbackCommand(webView, sessionFailureCallbackName, failureResponseData); } }); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 9a5be54f4..b00a0a28e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1622,7 +1622,7 @@ public void run() { if (adjustConfig.onEventTrackingSucceededListener == null) { return; } - adjustConfig.onEventTrackingSucceededListener.onFinishedEventTrackingSucceeded(eventResponseData.getSuccessResponseData()); + adjustConfig.onEventTrackingSucceededListener.onEventTrackingSucceeded(eventResponseData.getSuccessResponseData()); } }; handler.post(runnable); @@ -1642,7 +1642,7 @@ public void run() { if (adjustConfig.onEventTrackingFailedListener == null) { return; } - adjustConfig.onEventTrackingFailedListener.onFinishedEventTrackingFailed(eventResponseData.getFailureResponseData()); + adjustConfig.onEventTrackingFailedListener.onEventTrackingFailed(eventResponseData.getFailureResponseData()); } }; handler.post(runnable); @@ -1730,7 +1730,7 @@ public void run() { if (adjustConfig.onSessionTrackingSucceededListener == null) { return; } - adjustConfig.onSessionTrackingSucceededListener.onFinishedSessionTrackingSucceeded(sessionResponseData.getSuccessResponseData()); + adjustConfig.onSessionTrackingSucceededListener.onSessionTrackingSucceeded(sessionResponseData.getSuccessResponseData()); } }; handler.post(runnable); @@ -1750,7 +1750,7 @@ public void run() { if (adjustConfig.onSessionTrackingFailedListener == null) { return; } - adjustConfig.onSessionTrackingFailedListener.onFinishedSessionTrackingFailed(sessionResponseData.getFailureResponseData()); + adjustConfig.onSessionTrackingFailedListener.onSessionTrackingFailed(sessionResponseData.getFailureResponseData()); } }; handler.post(runnable); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnEventTrackingFailedListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnEventTrackingFailedListener.java index dd57eeee1..315a1682c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnEventTrackingFailedListener.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnEventTrackingFailedListener.java @@ -4,5 +4,5 @@ * Created by pfms on 04/01/16. */ public interface OnEventTrackingFailedListener { - void onFinishedEventTrackingFailed(AdjustEventFailure eventFailureResponseData); + void onEventTrackingFailed(AdjustEventFailure eventFailureResponseData); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnEventTrackingSucceededListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnEventTrackingSucceededListener.java index 5223a90cf..0ac249012 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnEventTrackingSucceededListener.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnEventTrackingSucceededListener.java @@ -4,5 +4,5 @@ * Created by pfms on 04/01/16. */ public interface OnEventTrackingSucceededListener { - void onFinishedEventTrackingSucceeded(AdjustEventSuccess eventSuccessResponseData); + void onEventTrackingSucceeded(AdjustEventSuccess eventSuccessResponseData); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnSessionTrackingFailedListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnSessionTrackingFailedListener.java index 66a01f5d8..17bdb1b21 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnSessionTrackingFailedListener.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnSessionTrackingFailedListener.java @@ -4,5 +4,5 @@ * Created by pfms on 16/02/16. */ public interface OnSessionTrackingFailedListener { - void onFinishedSessionTrackingFailed(AdjustSessionFailure failureResponseData); + void onSessionTrackingFailed(AdjustSessionFailure failureResponseData); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnSessionTrackingSucceededListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnSessionTrackingSucceededListener.java index 24d576ad8..138d12ed4 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnSessionTrackingSucceededListener.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnSessionTrackingSucceededListener.java @@ -4,5 +4,5 @@ * Created by pfms on 16/02/16. */ public interface OnSessionTrackingSucceededListener { - void onFinishedSessionTrackingSucceeded(AdjustSessionSuccess sessionSuccessResponseData); + void onSessionTrackingSucceeded(AdjustSessionSuccess sessionSuccessResponseData); } diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index cf2d8085b..cce67f647 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -358,7 +358,7 @@ public void onAttributionChanged(AdjustAttribution attribution) { final String localBasePath = basePath; adjustConfig.setOnSessionTrackingSucceededListener(new OnSessionTrackingSucceededListener() { @Override - public void onFinishedSessionTrackingSucceeded(AdjustSessionSuccess sessionSuccessResponseData) { + public void onSessionTrackingSucceeded(AdjustSessionSuccess sessionSuccessResponseData) { Log.d("TestApp", "session_success = " + sessionSuccessResponseData.toString()); MainActivity.testLibrary.addInfoToSend("message", sessionSuccessResponseData.message); @@ -376,7 +376,7 @@ public void onFinishedSessionTrackingSucceeded(AdjustSessionSuccess sessionSucce final String localBasePath = basePath; adjustConfig.setOnSessionTrackingFailedListener(new OnSessionTrackingFailedListener() { @Override - public void onFinishedSessionTrackingFailed(AdjustSessionFailure sessionFailureResponseData) { + public void onSessionTrackingFailed(AdjustSessionFailure sessionFailureResponseData) { Log.d("TestApp", "session_fail = " + sessionFailureResponseData.toString()); MainActivity.testLibrary.addInfoToSend("message", sessionFailureResponseData.message); @@ -395,7 +395,7 @@ public void onFinishedSessionTrackingFailed(AdjustSessionFailure sessionFailureR final String localBasePath = basePath; adjustConfig.setOnEventTrackingSucceededListener(new OnEventTrackingSucceededListener() { @Override - public void onFinishedEventTrackingSucceeded(AdjustEventSuccess eventSuccessResponseData) { + public void onEventTrackingSucceeded(AdjustEventSuccess eventSuccessResponseData) { Log.d("TestApp", "event_success = " + eventSuccessResponseData.toString()); MainActivity.testLibrary.addInfoToSend("message", eventSuccessResponseData.message); @@ -415,7 +415,7 @@ public void onFinishedEventTrackingSucceeded(AdjustEventSuccess eventSuccessResp final String localBasePath = basePath; adjustConfig.setOnEventTrackingFailedListener(new OnEventTrackingFailedListener() { @Override - public void onFinishedEventTrackingFailed(AdjustEventFailure eventFailureResponseData) { + public void onEventTrackingFailed(AdjustEventFailure eventFailureResponseData) { Log.d("TestApp", "event_fail = " + eventFailureResponseData.toString()); MainActivity.testLibrary.addInfoToSend("message", eventFailureResponseData.message); From d29abdabd5f5f4a8dac7e9134e90f041d8ad9292 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 17 Jul 2024 16:07:34 +0200 Subject: [PATCH 251/540] refac: remove getters of internal members in AdjustConfig --- .../java/com/adjust/sdk/AdjustConfig.java | 32 ------------------- 1 file changed, 32 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 63d7efbc6..2b87f567a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -168,22 +168,6 @@ public void setOnDeferredDeeplinkResponseListener(OnDeferredDeeplinkResponseList this.onDeferredDeeplinkResponseListener = onDeferredDeeplinkResponseListener; } - public String getBasePath() { - return basePath; - } - - public String getGdprPath() { - return gdprPath; - } - - public String getSubscriptionPath() { - return subscriptionPath; - } - - public String getPurchaseVerificationPath() { - return purchaseVerificationPath; - } - public Context getContext() { return context; } @@ -208,18 +192,6 @@ public String getDefaultTracker() { return defaultTracker; } - public String getPushToken() { - return pushToken; - } - - public Boolean getStartEnabled() { - return startEnabled; - } - - public boolean isStartOffline() { - return startOffline; - } - public String getExternalDeviceId() { return externalDeviceId; } @@ -280,10 +252,6 @@ public OnDeferredDeeplinkResponseListener getOnDeeplinkResponseListener() { return onDeferredDeeplinkResponseListener; } - public AdjustInstance.PreLaunchActions getPreLaunchActions() { - return preLaunchActions; - } - public ILogger getLogger() { return logger; } From d19e54a230d4cdbf563cec100f492929fd400106 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 18 Jul 2024 12:53:28 +0200 Subject: [PATCH 252/540] test: add signature plugin to test apps --- Adjust/tests/test-app-core/build.gradle | 7 +++++++ Adjust/tests/test-app-webbridge/build.gradle | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/Adjust/tests/test-app-core/build.gradle b/Adjust/tests/test-app-core/build.gradle index 1bfef02af..fab87b44b 100644 --- a/Adjust/tests/test-app-core/build.gradle +++ b/Adjust/tests/test-app-core/build.gradle @@ -1,5 +1,11 @@ apply plugin: 'com.android.application' +repositories { + maven { + url "https://oss.sonatype.org/content/repositories/snapshots/" + } +} + android { compileSdk 34 @@ -24,6 +30,7 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:2.1.1" implementation 'com.google.android.gms:play-services-ads-identifier:17.1.0' implementation 'com.android.installreferrer:installreferrer:2.2' + implementation 'com.adjust.signature:adjust-android-signature:3+' implementation project(':sdk-core') implementation project(':tests:test-options') diff --git a/Adjust/tests/test-app-webbridge/build.gradle b/Adjust/tests/test-app-webbridge/build.gradle index ada338dee..7bbf03334 100644 --- a/Adjust/tests/test-app-webbridge/build.gradle +++ b/Adjust/tests/test-app-webbridge/build.gradle @@ -1,5 +1,11 @@ apply plugin: 'com.android.application' +repositories { + maven { + url "https://oss.sonatype.org/content/repositories/snapshots/" + } +} + android { compileSdk 34 @@ -26,6 +32,7 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:2.1.1" implementation 'com.google.android.gms:play-services-ads-identifier:17.1.0' implementation 'com.android.installreferrer:installreferrer:2.2' + implementation 'com.adjust.signature:adjust-android-signature:3+' implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') From 586d8d1945b0bdc9bef2354101c071e186c3110d Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 18 Jul 2024 14:19:22 +0200 Subject: [PATCH 253/540] refac: move static attribution constructor method to util --- .../com/adjust/sdk/AdjustAttribution.java | 36 ---------------- .../src/main/java/com/adjust/sdk/Util.java | 41 +++++++++++++++++++ .../sdk/network/ActivityPackageSender.java | 3 +- 3 files changed, 42 insertions(+), 38 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java index 3642c779a..229d1b2aa 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java @@ -41,42 +41,6 @@ public class AdjustAttribution implements Serializable { public String costCurrency; public String fbInstallReferrer; - public static AdjustAttribution fromJson(JSONObject jsonObject, String adid, String sdkPlatform) { - if (jsonObject == null) return null; - - AdjustAttribution attribution = new AdjustAttribution(); - - if ("unity".equals(sdkPlatform)) { - // Unity platform. - attribution.trackerToken = jsonObject.optString("tracker_token", ""); - attribution.trackerName = jsonObject.optString("tracker_name", ""); - attribution.network = jsonObject.optString("network", ""); - attribution.campaign = jsonObject.optString("campaign", ""); - attribution.adgroup = jsonObject.optString("adgroup", ""); - attribution.creative = jsonObject.optString("creative", ""); - attribution.clickLabel = jsonObject.optString("click_label", ""); - attribution.costType = jsonObject.optString("cost_type", ""); - attribution.costAmount = jsonObject.optDouble("cost_amount", 0); - attribution.costCurrency = jsonObject.optString("cost_currency", ""); - attribution.fbInstallReferrer = jsonObject.optString("fb_install_referrer", ""); - } else { - // Rest of all platforms. - attribution.trackerToken = jsonObject.optString("tracker_token"); - attribution.trackerName = jsonObject.optString("tracker_name"); - attribution.network = jsonObject.optString("network"); - attribution.campaign = jsonObject.optString("campaign"); - attribution.adgroup = jsonObject.optString("adgroup"); - attribution.creative = jsonObject.optString("creative"); - attribution.clickLabel = jsonObject.optString("click_label"); - attribution.costType = jsonObject.optString("cost_type"); - attribution.costAmount = jsonObject.optDouble("cost_amount"); - attribution.costCurrency = jsonObject.optString("cost_currency"); - attribution.fbInstallReferrer = jsonObject.optString("fb_install_referrer"); - } - - return attribution; - } - @Override public boolean equals(Object other) { if (other == this) return true; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index 9b247cbf1..540d4e857 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -22,6 +22,8 @@ import com.adjust.sdk.scheduler.AsyncTaskExecutor; import com.adjust.sdk.scheduler.SingleThreadFutureScheduler; +import org.json.JSONObject; + import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.Closeable; @@ -741,4 +743,43 @@ public static boolean isEnabledFromActivityStateFile(final Context context) { return activityState.enabled; } } + + public static AdjustAttribution attributionFromJson(final JSONObject jsonObject, + final String sdkPlatform) { + if (jsonObject == null) { + return null; + } + + AdjustAttribution attribution = new AdjustAttribution(); + + if ("unity".equals(sdkPlatform)) { + // Unity platform. + attribution.trackerToken = jsonObject.optString("tracker_token", ""); + attribution.trackerName = jsonObject.optString("tracker_name", ""); + attribution.network = jsonObject.optString("network", ""); + attribution.campaign = jsonObject.optString("campaign", ""); + attribution.adgroup = jsonObject.optString("adgroup", ""); + attribution.creative = jsonObject.optString("creative", ""); + attribution.clickLabel = jsonObject.optString("click_label", ""); + attribution.costType = jsonObject.optString("cost_type", ""); + attribution.costAmount = jsonObject.optDouble("cost_amount", 0); + attribution.costCurrency = jsonObject.optString("cost_currency", ""); + attribution.fbInstallReferrer = jsonObject.optString("fb_install_referrer", ""); + } else { + // Rest of all platforms. + attribution.trackerToken = jsonObject.optString("tracker_token"); + attribution.trackerName = jsonObject.optString("tracker_name"); + attribution.network = jsonObject.optString("network"); + attribution.campaign = jsonObject.optString("campaign"); + attribution.adgroup = jsonObject.optString("adgroup"); + attribution.creative = jsonObject.optString("creative"); + attribution.clickLabel = jsonObject.optString("click_label"); + attribution.costType = jsonObject.optString("cost_type"); + attribution.costAmount = jsonObject.optDouble("cost_amount"); + attribution.costCurrency = jsonObject.optString("cost_currency"); + attribution.fbInstallReferrer = jsonObject.optString("fb_install_referrer"); + } + + return attribution; + } } \ No newline at end of file diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index ae692200a..34621966e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -594,9 +594,8 @@ private void parseResponse(final ResponseData responseData, final String respons responseData.continueIn = UtilNetworking.extractJsonLong(jsonResponse, "continue_in"); JSONObject attributionJson = jsonResponse.optJSONObject("attribution"); - responseData.attribution = AdjustAttribution.fromJson( + responseData.attribution = Util.attributionFromJson( attributionJson, - responseData.adid, Util.getSdkPrefixPlatform(clientSdk)); responseData.resolvedDeeplink = UtilNetworking.extractJsonString(jsonResponse,"resolved_click_url"); From ad24147e7431aa4f7e241faa6c2f9d298a69ca39 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 8 Jul 2024 17:09:08 +0200 Subject: [PATCH 254/540] fix: sign parameters for each fallback domain retry --- .../java/com/adjust/sdk/network/ActivityPackageSender.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index 34621966e..69d0dbbef 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -103,12 +103,10 @@ public void run() { public ResponseData sendActivityPackageSync(final ActivityPackage activityPackage, final Map sendingParameters) { - Map signedParameters = signParameters(activityPackage, sendingParameters); - boolean retryToSend; ResponseData responseData; do { - addErrorParameters(activityPackage, sendingParameters); + Map signedParameters = signParameters(activityPackage, sendingParameters); responseData = ResponseData.buildResponseData(activityPackage, sendingParameters, signedParameters); From 5b734bb3b5053a85a056be673ec2777836eed992 Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 18 Jul 2024 10:21:19 +0200 Subject: [PATCH 255/540] Feat: Track pv event after response --- .../java/com/adjust/sdk/ActivityHandler.java | 8 ++++++- .../java/com/adjust/sdk/ActivityPackage.java | 2 ++ .../adjust/testapp/AdjustCommandExecutor.java | 22 +++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index b00a0a28e..24b8a5178 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1824,6 +1824,12 @@ public void run() { } }; handler.post(runnable); + + if (purchaseVerificationResponseData.activityPackage != null && + purchaseVerificationResponseData.activityPackage.event != null) + { + this.trackEventI(purchaseVerificationResponseData.activityPackage.event); + } } private void prepareDeeplinkI(final Uri deeplink, final Handler handler) { @@ -2645,8 +2651,8 @@ private void verifyAndTrackPlayStorePurchaseI(final AdjustEvent event, callback.onVerificationFinished(verificationResult); return; } + verificationPackage.event = event; purchaseVerificationHandler.sendPurchaseVerificationPackage(verificationPackage); - trackEventI(event); } private void setCoppaComplianceI(final boolean coppaEnabled) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityPackage.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityPackage.java index ac240c198..e29f830f4 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityPackage.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityPackage.java @@ -72,6 +72,8 @@ public class ActivityPackage implements Serializable { private int lastErrorCode; private double waitBeforeSendTimeSeconds; + public transient AdjustEvent event; + public String getPath() { return path; } diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index cce67f647..e47ae7fe8 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -89,6 +89,7 @@ public void executeCommand(final Command sentCommand) { case "trackAdRevenue" : trackAdRevenue(); break; case "trackSubscription": trackPlayStoreSubscription(); break; case "verifyPurchase": verifyPurchase(); break; + case "verifyTrack": verifyTrack(); break; case "processDeeplink" : processDeeplink(); break; case "enableCoppaCompliance" : enableCoppaCompliance(); break; case "disableCoppaCompliance" : disableCoppaCompliance(); break; @@ -802,6 +803,27 @@ public void onVerificationFinished(AdjustPurchaseVerificationResult result) { }); } + private void verifyTrack() { + event(); + int eventNumber = 0; + if (command.parameters.containsKey("eventName")) { + String eventName = command.getFirstParameterValue("eventName"); + eventNumber = Integer.parseInt(eventName.substring(eventName.length() - 1)); + } + + AdjustEvent adjustEvent = savedEvents.get(eventNumber); + final String localBasePath = basePath; + + Adjust.verifyAndTrackPlayStorePurchase(adjustEvent, result -> { + MainActivity.testLibrary.addInfoToSend("verification_status", result.getVerificationStatus()); + MainActivity.testLibrary.addInfoToSend("code", String.valueOf(result.getCode())); + MainActivity.testLibrary.addInfoToSend("message", result.getMessage()); + MainActivity.testLibrary.sendInfoToServer(localBasePath); + }); + + this.savedEvents.remove(0); + } + private void processDeeplink() { String deeplink = command.getFirstParameterValue("deeplink"); Uri deeplinkUri = Uri.parse(deeplink); From d8e02faa87335b29b7c100ac5b5257d139dd222a Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 19 Jul 2024 10:10:07 +0200 Subject: [PATCH 256/540] refac: add AdjustDeeplink class to wrap deeplink url --- .../adjust/examples/GlobalApplication.java | 6 +-- .../com/adjust/examples/MainActivity.java | 4 +- .../com/adjust/examples/ServiceActivity.java | 4 +- .../examples/keyboard/GlobalApplication.java | 6 +-- .../examples/keyboard/MainActivity.java | 4 +- .../com/adjust/examples/GlobalApplication.kt | 6 +-- .../adjust/examples/GlobalApplication.java | 6 +-- .../com/adjust/examples/MainActivity.java | 4 +- .../sdk/webbridge/AdjustBridgeInstance.java | 2 +- .../java/com/adjust/sdk/ActivityHandler.java | 8 +-- .../src/main/java/com/adjust/sdk/Adjust.java | 18 +++---- .../java/com/adjust/sdk/AdjustDeeplink.java | 22 +++++++++ .../java/com/adjust/sdk/AdjustInstance.java | 49 +++++++++++-------- .../adjust/testapp/AdjustCommandExecutor.java | 7 ++- .../java/com/adjust/testapp/MainActivity.java | 6 ++- 15 files changed, 97 insertions(+), 55 deletions(-) create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustDeeplink.java diff --git a/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java index e8be3f94c..fa050ca98 100644 --- a/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java @@ -88,12 +88,12 @@ public void onSessionTrackingFailed(AdjustSessionFailure sessionFailureResponseD } }); - // Evaluate deferred deep link to be launched. + // Evaluate deferred deeplink to be launched. config.setOnDeferredDeeplinkResponseListener(new OnDeferredDeeplinkResponseListener() { @Override public boolean launchReceivedDeeplink(Uri deeplink) { - Log.d("example", "Deferred deep link callback called!"); - Log.d("example", "Deep link URL: " + deeplink); + Log.d("example", "Deferred deeplink callback called!"); + Log.d("example", "Deeplink URL: " + deeplink); return true; } diff --git a/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/MainActivity.java b/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/MainActivity.java index d41d0c41f..563da0638 100644 --- a/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/MainActivity.java +++ b/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/MainActivity.java @@ -13,6 +13,7 @@ import android.widget.Toast; import com.adjust.sdk.Adjust; +import com.adjust.sdk.AdjustDeeplink; import com.adjust.sdk.AdjustEvent; import com.adjust.sdk.OnIsEnabledListener; @@ -31,7 +32,8 @@ protected void onCreate(Bundle savedInstanceState) { Intent intent = getIntent(); Uri data = intent.getData(); - Adjust.processDeeplink(data, getApplicationContext()); + AdjustDeeplink adjustDeeplink = new AdjustDeeplink(data); + Adjust.processDeeplink(adjustDeeplink, getApplicationContext()); // Adjust UI according to SDK state. btnEnableDisableSDK = (Button) findViewById(R.id.btnEnableDisableSDK); diff --git a/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/ServiceActivity.java b/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/ServiceActivity.java index 4c651ecce..7a80bdc19 100644 --- a/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/ServiceActivity.java +++ b/Adjust/examples/example-app-java/src/main/java/com/adjust/examples/ServiceActivity.java @@ -9,6 +9,7 @@ import android.view.View; import com.adjust.sdk.Adjust; +import com.adjust.sdk.AdjustDeeplink; public class ServiceActivity extends AppCompatActivity { @@ -19,7 +20,8 @@ protected void onCreate(Bundle savedInstanceState) { Intent intent = getIntent(); Uri data = intent.getData(); - Adjust.processDeeplink(data, getApplicationContext()); + AdjustDeeplink adjustDeeplink = new AdjustDeeplink(data); + Adjust.processDeeplink(adjustDeeplink, getApplicationContext()); } public void onServiceClick(View v) { diff --git a/Adjust/examples/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java b/Adjust/examples/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java index c23c8ed18..32ecd81da 100644 --- a/Adjust/examples/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java +++ b/Adjust/examples/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/GlobalApplication.java @@ -81,12 +81,12 @@ public void onSessionTrackingFailed(AdjustSessionFailure sessionFailureResponseD } }); - // Evaluate deferred deep link to be launched. + // Evaluate deferred deeplink to be launched. config.setOnDeferredDeeplinkResponseListener(new OnDeferredDeeplinkResponseListener() { @Override public boolean launchReceivedDeeplink(Uri deeplink) { - Log.d("example", "Deferred deep link callback called!"); - Log.d("example", "Deep link URL: " + deeplink); + Log.d("example", "Deferred deeplink callback called!"); + Log.d("example", "Deeplink URL: " + deeplink); return true; } diff --git a/Adjust/examples/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/MainActivity.java b/Adjust/examples/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/MainActivity.java index 90dd1caba..dcb022905 100644 --- a/Adjust/examples/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/MainActivity.java +++ b/Adjust/examples/example-app-keyboard/src/main/java/com/adjust/examples/keyboard/MainActivity.java @@ -13,6 +13,7 @@ import androidx.appcompat.app.AppCompatActivity; import com.adjust.sdk.Adjust; +import com.adjust.sdk.AdjustDeeplink; import com.adjust.sdk.AdjustEvent; public class MainActivity extends AppCompatActivity { @@ -24,7 +25,8 @@ protected void onCreate(Bundle savedInstanceState) { Intent intent = getIntent(); Uri data = intent.getData(); - Adjust.processDeeplink(data, getApplicationContext()); + AdjustDeeplink adjustDeeplink = new AdjustDeeplink(data); + Adjust.processDeeplink(adjustDeeplink, getApplicationContext()); } @Override diff --git a/Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt b/Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt index 5204dcad4..982bbd175 100644 --- a/Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt +++ b/Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/GlobalApplication.kt @@ -49,10 +49,10 @@ class GlobalApplication : Application() { Log.d("example", "Session failure data: $sessionFailureResponseData") } - // Evaluate deferred deep link to be launched. + // Evaluate deferred deeplink to be launched. config.setOnDeferredDeeplinkResponseListener { deeplink -> - Log.d("example", "Deferred deep link callback called!") - Log.d("example", "Deep link URL: $deeplink") + Log.d("example", "Deferred deeplink callback called!") + Log.d("example", "Deeplink URL: $deeplink") true } diff --git a/Adjust/examples/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/examples/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java index 9fdf0bd88..27ad680c2 100755 --- a/Adjust/examples/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/examples/example-app-tv/src/main/java/com/adjust/examples/GlobalApplication.java @@ -78,12 +78,12 @@ public void onSessionTrackingFailed(AdjustSessionFailure sessionFailureResponseD } }); - // Evaluate deferred deep link to be launched. + // Evaluate deferred deeplink to be launched. config.setOnDeferredDeeplinkResponseListener(new OnDeferredDeeplinkResponseListener() { @Override public boolean launchReceivedDeeplink(Uri deeplink) { - Log.d("example", "Deferred deep link callback called!"); - Log.d("example", "Deep link URL: " + deeplink); + Log.d("example", "Deferred deeplink callback called!"); + Log.d("example", "Deeplink URL: " + deeplink); return true; } diff --git a/Adjust/examples/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java b/Adjust/examples/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java index 15a990207..8c92c0971 100755 --- a/Adjust/examples/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java +++ b/Adjust/examples/example-app-tv/src/main/java/com/adjust/examples/MainActivity.java @@ -11,6 +11,7 @@ import android.widget.Toast; import com.adjust.sdk.Adjust; +import com.adjust.sdk.AdjustDeeplink; import com.adjust.sdk.AdjustEvent; import com.adjust.sdk.OnIsEnabledListener; @@ -29,7 +30,8 @@ protected void onCreate(Bundle savedInstanceState) { Intent intent = getIntent(); Uri data = intent.getData(); - Adjust.processDeeplink(data, getApplicationContext()); + AdjustDeeplink adjustDeeplink = new AdjustDeeplink(data); + Adjust.processDeeplink(adjustDeeplink, getApplicationContext()); // Adjust UI according to SDK state. btnEnableDisableSDK = (Button) findViewById(R.id.btnEnableDisableSDK); diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 44060c6c5..e92d20c8d 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -303,7 +303,7 @@ public void onSessionTrackingFailed(AdjustSessionFailure failureResponseData) { }); } - // Should deferred deep link be opened? + // Should deferred deeplink be opened? Boolean isOpeningDeferredDeeplinkEnabledObject = AdjustBridgeUtil.fieldToBoolean(isOpeningDeferredDeeplinkEnabledField); if (isOpeningDeferredDeeplinkEnabledObject != null) { isOpeningDeferredDeeplinkEnabled = isOpeningDeferredDeeplinkEnabledObject; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 24b8a5178..25af3e610 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -923,7 +923,7 @@ public void run(ActivityHandler activityHandler) { } } - // cached deep link resolution callback + // cached deeplink resolution callback if (this.cachedDeeplinkResolutionCallback == null) { this.cachedDeeplinkResolutionCallback = adjustConfig.cachedDeeplinkResolutionCallback; } @@ -1386,7 +1386,7 @@ private void startFirstSessionI() { sharedPreferencesManager.removePushToken(); sharedPreferencesManager.removeGdprForgetMe(); - // check for cached deep links + // check for cached deeplinks processCachedDeeplinkI(); // don't check attribution right after first sdk start @@ -1875,12 +1875,12 @@ private void launchDeeplinkMain(Intent deeplinkIntent, Uri deeplink) { // Start an activity if it's safe if (!isIntentSafe) { - logger.error("Unable to open deferred deep link (%s)", deeplink); + logger.error("Unable to open deferred deeplink (%s)", deeplink); return; } // add it to the handler queue - logger.info("Open deferred deep link (%s)", deeplink); + logger.info("Open deferred deeplink (%s)", deeplink); adjustConfig.context.startActivity(deeplinkIntent); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 69ccfca8c..90861c1fa 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -123,26 +123,26 @@ public static boolean isAdjustUninstallDetectionPayload(Map payl } /** - * Called to process deep link. + * Called to process deeplink. * - * @param url Deep link URL to process + * @param adjustDeeplink Deeplink object to process * @param context Application context */ - public static void processDeeplink(Uri url, Context context) { + public static void processDeeplink(AdjustDeeplink adjustDeeplink, Context context) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.processDeeplink(url, extractApplicationContext(context)); + adjustInstance.processDeeplink(adjustDeeplink, extractApplicationContext(context)); } /** - * Process the deep link that has opened an app and potentially get a resolved link. + * Process the deeplink that has opened an app and potentially get a resolved link. * - * @param url Deep link URL to process - * @param callback Callback where either resolved or echoed deep link will be sent. + * @param adjustDeeplink Deeplink object to process + * @param callback Callback where either resolved or echoed deeplink will be sent. * @param context Application context */ - public static void processAndResolveDeeplink(Uri url, Context context, OnDeeplinkResolvedListener callback) { + public static void processAndResolveDeeplink(AdjustDeeplink adjustDeeplink, Context context, OnDeeplinkResolvedListener callback) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.processAndResolveDeeplink(url, extractApplicationContext(context), callback); + adjustInstance.processAndResolveDeeplink(adjustDeeplink, extractApplicationContext(context), callback); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustDeeplink.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustDeeplink.java new file mode 100644 index 000000000..85d049e0b --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustDeeplink.java @@ -0,0 +1,22 @@ +package com.adjust.sdk; + +import android.net.Uri; + +public class AdjustDeeplink { + Uri url; + + public AdjustDeeplink(Uri url) { + this.url = url; + } + + public boolean isValid() { + if (url == null || url.toString().isEmpty()) { + return false; + } + return true; + } + + public Uri getUrl() { + return url; + } +} diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index bf5e70b71..dbcd40b5e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -190,56 +190,63 @@ protected void onPostExecute(Boolean isEnabled) { } /** - * Called to process deep link. + * Called to process deeplink. * - * @param url Deep link URL to process + * @param adjustDeeplink Deeplink object to process * @param context Application context */ - public void processDeeplink(final Uri url, final Context context) { - // Check for deep link validity. If invalid, return. - if (url == null || url.toString().length() == 0) { + public void processDeeplink(final AdjustDeeplink adjustDeeplink, final Context context) { + // Check for deeplink validity. If invalid, return. + if (adjustDeeplink == null || !adjustDeeplink.isValid()) { AdjustFactory.getLogger().warn( - "Skipping deep link processing (null or empty)"); + "Skipping deeplink processing (null or empty)"); return; } - cacheDeeplink(url, context); + cacheDeeplink(adjustDeeplink.url, context); long clickTime = System.currentTimeMillis(); if (!checkActivityHandler("processDeeplink", true)) { - saveDeeplink(url, clickTime, context); + saveDeeplink(adjustDeeplink.url, clickTime, context); return; } - activityHandler.processDeeplink(url, clickTime); + activityHandler.processDeeplink(adjustDeeplink.url, clickTime); } /** - * Process the deep link that has opened an app and potentially get a resolved link. + * Process the deeplink that has opened an app and potentially get a resolved link. * - * @param url Deep link URL to process - * @param callback Callback where either resolved or echoed deep link will be sent. + * @param adjustDeeplink Deeplink object to process + * @param callback Callback where either resolved or echoed deeplink will be sent. * @param context Application context */ - public void processAndResolveDeeplink(Uri url, Context context, OnDeeplinkResolvedListener callback) { + public void processAndResolveDeeplink(AdjustDeeplink adjustDeeplink, Context context, OnDeeplinkResolvedListener callback) { + // Check for deeplink validity. If invalid, return. + if (adjustDeeplink == null || !adjustDeeplink.isValid()) { + AdjustFactory.getLogger().warn( + "Skipping deeplink processing (null or empty)"); + return; + } + // if resolution result is not wanted, fallback to default method if (callback == null) { - processDeeplink(url, context); + processDeeplink(adjustDeeplink, context); return; } - cacheDeeplink(url, context); + cacheDeeplink(adjustDeeplink.url, context); - // if deep link processing is triggered prior to SDK being initialized + // if deeplink processing is triggered prior to SDK being initialized long clickTime = System.currentTimeMillis(); if (!checkActivityHandler("processAndResolveDeeplink", true)) { - saveDeeplink(url, clickTime, context); + saveDeeplink(adjustDeeplink.url, clickTime, context); this.cachedDeeplinkResolutionCallback = callback; return; } - // if deep link processing was triggered with SDK being initialized - activityHandler.processAndResolveDeeplink(url, clickTime, callback); + // if deeplink processing was triggered with SDK being initialized + activityHandler.processAndResolveDeeplink(adjustDeeplink.url, clickTime, callback); } /** @@ -788,7 +795,7 @@ private void saveGdprForgetMe(final Context context) { } /** - * Save deep link to shared preferences. + * Save deeplink to shared preferences. * * @param deeplink Deeplink Uri object * @param clickTime Time when processDeeplink(Uri, Context) method was called @@ -799,7 +806,7 @@ private void saveDeeplink(final Uri deeplink, final long clickTime, final Contex } /** - * Cache deep link to shared preferences. + * Cache deeplink to shared preferences. * * @param deeplink Deeplink Uri object * @param context Application context diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index e47ae7fe8..c2ab54528 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -14,6 +14,7 @@ import com.adjust.sdk.AdjustAdRevenue; import com.adjust.sdk.AdjustAttribution; import com.adjust.sdk.AdjustConfig; +import com.adjust.sdk.AdjustDeeplink; import com.adjust.sdk.AdjustEvent; import com.adjust.sdk.AdjustEventFailure; import com.adjust.sdk.AdjustEventSuccess; @@ -640,7 +641,8 @@ private void teardown() throws NullPointerException { private void openDeeplink() { String deeplink = command.getFirstParameterValue("deeplink"); - Adjust.processDeeplink(Uri.parse(deeplink), this.context); + AdjustDeeplink adjustDeeplink = new AdjustDeeplink(Uri.parse(deeplink)); + Adjust.processDeeplink(adjustDeeplink, this.context); } private void sendReferrer() { @@ -828,7 +830,8 @@ private void processDeeplink() { String deeplink = command.getFirstParameterValue("deeplink"); Uri deeplinkUri = Uri.parse(deeplink); final String localBasePath = basePath; - Adjust.processAndResolveDeeplink(deeplinkUri, context, new OnDeeplinkResolvedListener() { + AdjustDeeplink adjustDeeplink = new AdjustDeeplink(deeplinkUri); + Adjust.processAndResolveDeeplink(adjustDeeplink, context, new OnDeeplinkResolvedListener() { @Override public void onDeeplinkResolved(String resolvedLink) { MainActivity.testLibrary.addInfoToSend("resolved_link", resolvedLink); diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java index d0a7662f8..a7ec2a0d9 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/MainActivity.java @@ -7,6 +7,7 @@ import androidx.appcompat.app.AppCompatActivity; import com.adjust.sdk.Adjust; +import com.adjust.sdk.AdjustDeeplink; import com.adjust.sdk.OnSdkVersionReadListener; import com.adjust.test.TestLibrary; @@ -22,11 +23,12 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - // Check if deferred deep link was received + // Check if deferred deeplink was received Intent intent = getIntent(); Uri deeplinkData = intent.getData(); if (deeplinkData != null) { - Adjust.processDeeplink(deeplinkData, getApplicationContext()); + AdjustDeeplink adjustDeeplink = new AdjustDeeplink(deeplinkData); + Adjust.processDeeplink(adjustDeeplink, getApplicationContext()); return; } From 014485011a79e9a8e2b4bee3b885e6d522a5ac59 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 19 Jul 2024 10:16:41 +0200 Subject: [PATCH 257/540] refac; update example app --- .../src/main/java/com/adjust/examples/MainActivity.kt | 4 +++- .../src/main/java/com/adjust/examples/ServiceActivity.kt | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt b/Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt index c6d44bf04..4fe43edf0 100644 --- a/Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt +++ b/Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/MainActivity.kt @@ -10,6 +10,7 @@ import android.widget.Button import android.widget.Toast import com.adjust.sdk.Adjust +import com.adjust.sdk.AdjustDeeplink import com.adjust.sdk.AdjustEvent import com.adjust.sdk.OnIsEnabledListener @@ -23,7 +24,8 @@ class MainActivity : AppCompatActivity() { val intent = intent val data = intent.data - Adjust.processDeeplink(data, applicationContext) + val adjustDeeplink = AdjustDeeplink(data); + Adjust.processDeeplink(adjustDeeplink, applicationContext) // Adjust UI according to SDK state. btnEnableDisableSDK = findViewById(R.id.btnEnableDisableSDK) as Button diff --git a/Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/ServiceActivity.kt b/Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/ServiceActivity.kt index ba0f11615..cca535f9e 100644 --- a/Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/ServiceActivity.kt +++ b/Adjust/examples/example-app-kotlin/src/main/java/com/adjust/examples/ServiceActivity.kt @@ -6,6 +6,7 @@ import androidx.appcompat.app.AppCompatActivity import android.view.View import com.adjust.sdk.Adjust +import com.adjust.sdk.AdjustDeeplink class ServiceActivity : AppCompatActivity() { @@ -15,7 +16,8 @@ class ServiceActivity : AppCompatActivity() { val intent = intent val data = intent.data - Adjust.processDeeplink(data, applicationContext) + val adjustDeeplink = AdjustDeeplink(data); + Adjust.processDeeplink(adjustDeeplink, applicationContext) } fun onServiceClick(v: View) { From 9649940c7e05f056a5b66ed4c50fad4ce8d63f8d Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 31 Jul 2024 13:56:23 +0200 Subject: [PATCH 258/540] refac: coppa settings via config --- .../src/main/assets/adjust.js | 12 -- .../src/main/assets/adjust_config.js | 9 ++ .../sdk/webbridge/AdjustBridgeInstance.java | 29 ++-- .../java/com/adjust/sdk/ActivityHandler.java | 143 +++++++++--------- .../java/com/adjust/sdk/ActivityState.java | 6 - .../src/main/java/com/adjust/sdk/Adjust.java | 20 --- .../java/com/adjust/sdk/AdjustConfig.java | 13 ++ .../java/com/adjust/sdk/AdjustInstance.java | 44 +----- .../main/java/com/adjust/sdk/DeviceInfo.java | 38 +++-- .../java/com/adjust/sdk/IActivityHandler.java | 2 - .../java/com/adjust/sdk/PackageBuilder.java | 82 +++++----- .../adjust/sdk/SharedPreferencesManager.java | 27 ---- .../src/main/java/com/adjust/sdk/Util.java | 9 +- .../adjust/testapp/AdjustCommandExecutor.java | 20 +-- .../src/main/assets/command_executor.js | 16 +- 15 files changed, 180 insertions(+), 290 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 1f1f2740e..25092877f 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -141,18 +141,6 @@ var Adjust = { } }, - enableCoppaCompliance: function () { - if (AdjustBridge) { - AdjustBridge.enableCoppaCompliance(); - } - }, - - disableCoppaCompliance: function () { - if (AdjustBridge) { - AdjustBridge.disableCoppaCompliance(); - } - }, - enablePlayStoreKidsCompliance: function () { if (AdjustBridge) { AdjustBridge.enablePlayStoreKidsCompliance(); diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js index f8aa13dbe..fd313ce72 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -46,6 +46,7 @@ function AdjustConfig(appToken, environment, legacy) { this.isDataResidency = null; this.isPreinstallTrackingEnabled = null; this.preinstallFilePath = null; + this.coppaComplianceEnabled = null; this.fbAppId = null; this.shouldReadDeviceIdsOnce = null; this.eventDeduplicationIdsMaxSize = null; @@ -217,6 +218,14 @@ AdjustConfig.prototype.setPreinstallFilePath = function(preinstallFilePath) { this.preinstallFilePath = preinstallFilePath; }; +AdjustConfig.prototype.enableCoppaCompliance = function() { + this.coppaComplianceEnabled = true; +}; + +AdjustConfig.prototype.disableCoppaCompliance = function() { + this.coppaComplianceEnabled = false; +}; + AdjustConfig.prototype.setFbAppId = function(fbAppId) { this.fbAppId = fbAppId; }; diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index e92d20c8d..7ed4686e8 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -170,6 +170,7 @@ public void initSdk(String adjustConfigString) { Object isDataResidencyField = jsonAdjustConfig.get("isDataResidency"); Object isPreinstallTrackingEnabledField = jsonAdjustConfig.get("isPreinstallTrackingEnabled"); Object preinstallFilePathField = jsonAdjustConfig.get("preinstallFilePath"); + Object coppaComplianceEnabledField = jsonAdjustConfig.get("coppaComplianceEnabled"); Object fbAppIdField = jsonAdjustConfig.get("fbAppId"); Object shouldReadDeviceIdsOnceField = jsonAdjustConfig.get("shouldReadDeviceIdsOnce"); Object eventDeduplicationIdsMaxSizeField = jsonAdjustConfig.get("eventDeduplicationIdsMaxSize"); @@ -365,6 +366,16 @@ public boolean launchReceivedDeeplink(Uri deeplink) { adjustConfig.setPreinstallFilePath(preinstallFilePath); } + // Coppa compliance + Boolean coppaCompliantEnabled = AdjustBridgeUtil.fieldToBoolean(coppaComplianceEnabledField); + if (coppaCompliantEnabled != null) { + if (coppaCompliantEnabled) { + adjustConfig.enableCoppaCompliance(); + } else { + adjustConfig.disableCoppaCompliance(); + } + } + // FB App ID String fbAppId = AdjustBridgeUtil.fieldToString(fbAppIdField); if (fbAppId != null) { @@ -658,24 +669,6 @@ public void trackMeasurementConsent(String consentMeasurementString) { } } - @JavascriptInterface - public void enableCoppaCompliance() { - if (!isInitialized()) { - return; - } - - Adjust.enableCoppaCompliance(application.getApplicationContext()); - } - - @JavascriptInterface - public void disableCoppaCompliance() { - if (!isInitialized()) { - return; - } - - Adjust.disableCoppaCompliance(application.getApplicationContext()); - } - @JavascriptInterface public void enablePlayStoreKidsCompliance() { if (!isInitialized()) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 25af3e610..7f56741cb 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -825,15 +825,6 @@ public void run() { } @Override - public void setCoppaCompliance(final boolean enabled) { - executor.submit(new Runnable() { - @Override - public void run() { - setCoppaComplianceI(enabled); - } - }); - } - public InternalState getInternalState() { return internalState; } @@ -876,21 +867,20 @@ public void run(ActivityHandler activityHandler) { readConfigFile(adjustConfig.context); - boolean coppaEnabledInState = activityState != null && activityState.isCoppaEnabled(); boolean playStoreKidsAppEnabled = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getPlayStoreKidsApp(); - deviceInfo = new DeviceInfo(adjustConfig, coppaEnabledInState, playStoreKidsAppEnabled); + deviceInfo = new DeviceInfo(adjustConfig, playStoreKidsAppEnabled); - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabledInState, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); if (deviceInfo.playAdId == null) { - if (!Util.canReadPlayIds(adjustConfig, coppaEnabledInState, playStoreKidsAppEnabled)) { + if (!Util.canReadPlayIds(adjustConfig, playStoreKidsAppEnabled)) { logger.info("Cannot read Google Play Services Advertising ID with COPPA or play store kids app enabled"); } else { logger.warn("Unable to get Google Play Services Advertising ID at start time"); } if (deviceInfo.androidId == null) { - if (! Util.canReadNonPlayIds(adjustConfig, coppaEnabledInState, playStoreKidsAppEnabled)) { + if (! Util.canReadNonPlayIds(adjustConfig, playStoreKidsAppEnabled)) { logger.info("Cannot read non Play IDs with COPPA or play store kids app enabled"); } else { logger.error("Unable to get any Device IDs. Please check if Proguard is correctly set with Adjust SDK"); @@ -1282,20 +1272,6 @@ private void preLaunchActionsI(List preLaunchActionsArray) } } - private void processPreLaunchAdjustThirdPartySharingAndCoppaComplianceI() { - for (final Object adjustThirdPartySharingOrCoppa : - adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray) { - if (adjustThirdPartySharingOrCoppa instanceof AdjustThirdPartySharing) { - trackThirdPartySharingI((AdjustThirdPartySharing) adjustThirdPartySharingOrCoppa); - } else if (adjustThirdPartySharingOrCoppa instanceof Boolean) { - setCoppaComplianceI(((Boolean)adjustThirdPartySharingOrCoppa).booleanValue()); - } else { - processCoppaComplianceI(); - } - } - adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray.clear(); - } - private void startI() { // check if it's the first sdk start if (internalState.hasFirstSdkStartNotOcurred()) { @@ -1304,7 +1280,11 @@ private void startI() { return; } else { // check if third party sharing request came, then send it first - processPreLaunchAdjustThirdPartySharingAndCoppaComplianceI(); + for (AdjustThirdPartySharing adjustThirdPartySharing : + adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray) + { + trackThirdPartySharingI(adjustThirdPartySharing); + } if (adjustConfig.preLaunchActions.lastMeasurementConsentTracked != null) { trackMeasurementConsentI( @@ -1355,13 +1335,15 @@ private void startFirstSessionI() { if (sharedPreferencesManager.getGdprForgetMe()) { gdprForgetMeI(); } else { - // methods below need to be executed in this order - // first call is processing pre-init actions queue - // second call is making sure to process cached and not processed pre-init action - // from the previous run (if any) - processPreLaunchAdjustThirdPartySharingAndCoppaComplianceI(); processCoppaComplianceI(); + // check if third party sharing request came, then send it first + for (AdjustThirdPartySharing adjustThirdPartySharing : + adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray) + { + trackThirdPartySharingI(adjustThirdPartySharing); + } + if (adjustConfig.preLaunchActions.lastMeasurementConsentTracked != null) { trackMeasurementConsentI( adjustConfig.preLaunchActions. @@ -1918,12 +1900,13 @@ private void setEnabledI(boolean enabled) { if (sharedPreferencesManager.getGdprForgetMe()) { gdprForgetMeI(); } else { - // preLaunchAdjustThirdPartySharing should be done *before* coppaCompliance - // since it will check for coppaCompliance inside it - processPreLaunchAdjustThirdPartySharingAndCoppaComplianceI(); - processCoppaComplianceI(); + for (AdjustThirdPartySharing adjustThirdPartySharing : + adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray) + { + trackThirdPartySharingI(adjustThirdPartySharing); + } if (adjustConfig.preLaunchActions.lastMeasurementConsentTracked != null) { trackMeasurementConsentI( adjustConfig.preLaunchActions. @@ -2448,7 +2431,10 @@ private void trackThirdPartySharingI(final AdjustThirdPartySharing adjustThirdPa } if (!isEnabledI()) { return; } if (activityState.isGdprForgotten) { return; } - + if (adjustConfig.coppaComplianceEnabled) { + logger.warn("Calling third party sharing API not allowed when COPPA enabled"); + return; + } long now = System.currentTimeMillis(); PackageBuilder packageBuilder = new PackageBuilder( adjustConfig, deviceInfo, activityState, globalParameters, now); @@ -2655,30 +2641,6 @@ private void verifyAndTrackPlayStorePurchaseI(final AdjustEvent event, purchaseVerificationHandler.sendPurchaseVerificationPackage(verificationPackage); } - private void setCoppaComplianceI(final boolean coppaEnabled) { - if (activityState == null) { return; } - if (!isEnabledI()) { return; } - if (activityState.isGdprForgotten) { return; } - - activityState.setCoppa(coppaEnabled); - - // third party sharing is disabled when coppa is enabled and vice-versa - final boolean tpsEnabled = !coppaEnabled; - final AdjustThirdPartySharing adjustThirdPartySharing = new AdjustThirdPartySharing(tpsEnabled); - - final long now = System.currentTimeMillis(); - final PackageBuilder packageBuilder = new PackageBuilder( - adjustConfig, deviceInfo, activityState, globalParameters, now); - - final ActivityPackage activityPackage = - packageBuilder.buildThirdPartySharingPackage(adjustThirdPartySharing); - packageHandler.addPackage(activityPackage); - - writeActivityStateI(); - - packageHandler.sendFirstPackage(); - } - private void gotOptOutResponseI() { activityState.isGdprForgotten = true; writeActivityStateI(); @@ -2981,20 +2943,57 @@ private void checkForInstallReferrerInfo(final SdkClickResponseData responseData } private void processCoppaComplianceI() { - if (activityState == null) { return; } - if (!isEnabledI()) { return; } - if (activityState.isGdprForgotten) { return; } + if (!adjustConfig.coppaComplianceEnabled) { + resetThirdPartySharingCoppaActivityStateI(); + return; + } - boolean coppaEnabled = - SharedPreferencesManager.getDefaultInstance(getContext()).getCoppaCompliance(); + disableThirdPartySharingForCoppaEnabledI(); + } - if (activityState.isCoppaEnabled() && coppaEnabled) { + private void disableThirdPartySharingForCoppaEnabledI() { + if (!shouldDisableThirdPartySharingWhenCoppaEnabled()) { return; } - if (!activityState.isCoppaEnabled() && !coppaEnabled) { - return; + + activityState.isThirdPartySharingDisabledForCoppa = true; + writeActivityStateI(); + AdjustThirdPartySharing adjustThirdPartySharing = + new AdjustThirdPartySharing(false); + + long now = System.currentTimeMillis(); + PackageBuilder packageBuilder = new PackageBuilder( + adjustConfig, deviceInfo, activityState, globalParameters, now); + + ActivityPackage activityPackage = + packageBuilder.buildThirdPartySharingPackage(adjustThirdPartySharing); + packageHandler.addPackage(activityPackage); + + packageHandler.sendFirstPackage(); + } + + private void resetThirdPartySharingCoppaActivityStateI() { + + if (activityState == null) { return; } + if (activityState.isThirdPartySharingDisabledForCoppa) { + activityState.isThirdPartySharingDisabledForCoppa = false; + writeActivityStateI(); + } + } + + private boolean shouldDisableThirdPartySharingWhenCoppaEnabled() { + if (activityState == null) { + return false; + } + + if (!isEnabledI()) { + return false; + } + + if (activityState.isGdprForgotten) { + return false; } - setCoppaComplianceI(coppaEnabled); + return !activityState.isThirdPartySharingDisabledForCoppa; } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java index 8d7242e3d..c080347d5 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java @@ -210,12 +210,6 @@ protected void setEventDeduplicationIdsMaxSize(Integer size) { } } - public boolean isCoppaEnabled() { - return isThirdPartySharingDisabledForCoppa; - } - public void setCoppa(boolean enabled) { - this.isThirdPartySharingDisabledForCoppa = enabled; - } @Override public String toString() { return Util.formatString("ec:%d sc:%d ssc:%d sl:%.1f ts:%.1f la:%s uuid:%s", diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 90861c1fa..ad9a02c4e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -284,26 +284,6 @@ public static void trackPlayStoreSubscription(final AdjustPlayStoreSubscription adjustInstance.trackPlayStoreSubscription(subscription); } - /** - * Called to enable COPPA compliance. - * - * @param context Application context - */ - public static void enableCoppaCompliance(final Context context) { - AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.enableCoppaCompliance(context); - } - - /** - * Called to disable COPPA compliance. - * - * @param context Application context - */ - public static void disableCoppaCompliance(final Context context) { - AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.disableCoppaCompliance(context); - } - /** * Called to enable Google Play Store Kids app setting. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 2b87f567a..0517da8a1 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -38,6 +38,7 @@ public class AdjustConfig { boolean useSubdomains; boolean isDataResidency; String preinstallFilePath; + boolean coppaComplianceEnabled; String fbAppId; boolean isDeviceIdsReadingOnceEnabled; OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; @@ -110,6 +111,14 @@ public void setPreinstallFilePath(String preinstallFilePath) { this.preinstallFilePath = preinstallFilePath; } + public void enableCoppaCompliance() { + this.coppaComplianceEnabled = true; + } + + public void disableCoppaCompliance() { + this.coppaComplianceEnabled = false; + } + public void setFbAppId(String fbAppId) { this.fbAppId = fbAppId; } @@ -220,6 +229,10 @@ public String getPreinstallFilePath() { return preinstallFilePath; } + public boolean isCoppaComplianceEnabled() { + return coppaComplianceEnabled; + } + public String getFbAppId() { return fbAppId; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index dbcd40b5e..ad08a112f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -17,7 +17,7 @@ public class AdjustInstance { public static class PreLaunchActions { public List preLaunchActionsArray; - public List preLaunchAdjustThirdPartySharingArray; + public List preLaunchAdjustThirdPartySharingArray; public Boolean lastMeasurementConsentTracked; public PreLaunchActions() { @@ -510,38 +510,6 @@ public void trackPlayStoreSubscription(AdjustPlayStoreSubscription subscription) activityHandler.trackPlayStoreSubscription(subscription); } - /** - * Called to enable COPPA compliance. - * - * @param context Application context - */ - public void enableCoppaCompliance(Context context) { - saveCoppaCompliance(true, context); - if (checkActivityHandler("enable coppa compliance", true)) { - if (activityHandler.isEnabled()) { - activityHandler.setCoppaCompliance(true); - } - } else { - preLaunchActions.preLaunchAdjustThirdPartySharingArray.add(Boolean.TRUE); - } - } - - /** - * Called to disable COPPA compliance. - * - * @param context Application context - */ - public void disableCoppaCompliance(Context context) { - saveCoppaCompliance(false, context); - if (checkActivityHandler("disable coppa compliant", true)) { - if (activityHandler.isEnabled()) { - activityHandler.setCoppaCompliance(false); - } - } else { - preLaunchActions.preLaunchAdjustThirdPartySharingArray.add(Boolean.FALSE); - } - } - /** * Called to enable Google Play Store Kids app setting. * @@ -833,16 +801,6 @@ private void setSendingReferrersAsNotSent(final Context context) { SharedPreferencesManager.getDefaultInstance(context).setSendingReferrersAsNotSent(); } - /** - * Save coppa compliant state to shared preferences. - * - * @param enabled boolean indicating should COPPA be enabled (true) or not (false) - * @param context Application context - */ - private void saveCoppaCompliance(final boolean enabled, final Context context) { - SharedPreferencesManager.getDefaultInstance(context).saveCoppaCompliance(enabled); - } - /** * Save Google play store kids app settings to shared preferences. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 2d8133b17..d3bdb3d56 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -101,7 +101,7 @@ class DeviceInfo { String mcc; String mnc; - DeviceInfo(AdjustConfig adjustConfig, boolean coppaEnabled, boolean playStoreKidsAppEnabled) { + DeviceInfo(AdjustConfig adjustConfig, boolean playStoreKidsAppEnabled) { Context context = adjustConfig.context; Resources resources = context.getResources(); DisplayMetrics displayMetrics = resources.getDisplayMetrics(); @@ -134,14 +134,14 @@ class DeviceInfo { appInstallTime = getAppInstallTime(packageInfo); appUpdateTime = getAppUpdateTime(packageInfo); uiMode = getDeviceUiMode(configuration); - if (Util.canReadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled)) { + if (Util.canReadPlayIds(adjustConfig, playStoreKidsAppEnabled)) { appSetId = Reflection.getAppSetId(context); } } - void reloadPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled, boolean playStoreKidsAppEnabled) { + void reloadPlayIds(final AdjustConfig adjustConfig, boolean playStoreKidsAppEnabled) { if (playIdsReadOnce && adjustConfig.isDeviceIdsReadingOnceEnabled) { - if (!Util.canReadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled)) { + if (!Util.canReadPlayIds(adjustConfig, playStoreKidsAppEnabled)) { playAdId = null; isTrackingEnabled = null; playAdIdSource = null; @@ -155,7 +155,7 @@ void reloadPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled, boolea playAdIdSource = null; playAdIdAttempt = -1; - if (!Util.canReadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled)) { + if (!Util.canReadPlayIds(adjustConfig, playStoreKidsAppEnabled)) { return; } @@ -234,8 +234,8 @@ void reloadPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled, boolea } } - void reloadNonPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled, boolean playStoreKidsAppEnabled) { - if (!Util.canReadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled)) { + void reloadNonPlayIds(final AdjustConfig adjustConfig, boolean playStoreKidsAppEnabled) { + if (!Util.canReadNonPlayIds(adjustConfig, playStoreKidsAppEnabled)) { return; } @@ -248,16 +248,15 @@ void reloadNonPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled, boo } void reloadOtherDeviceInfoParams(final AdjustConfig adjustConfig, - final boolean coppaEnabled, final ILogger logger) { if (adjustConfig.isDeviceIdsReadingOnceEnabled && otherDeviceIdsParamsReadOnce) { return; } - imeiParameters = UtilDeviceIds.getImeiParameters(adjustConfig, coppaEnabled, logger); - oaidParameters = UtilDeviceIds.getOaidParameters(adjustConfig, coppaEnabled, logger); - fireAdId = UtilDeviceIds.getFireAdvertisingId(adjustConfig, coppaEnabled); - fireTrackingEnabled = UtilDeviceIds.getFireTrackingEnabled(adjustConfig, coppaEnabled); + imeiParameters = UtilDeviceIds.getImeiParameters(adjustConfig, logger); + oaidParameters = UtilDeviceIds.getOaidParameters(adjustConfig, logger); + fireAdId = UtilDeviceIds.getFireAdvertisingId(adjustConfig); + fireTrackingEnabled = UtilDeviceIds.getFireTrackingEnabled(adjustConfig); connectivityType = UtilDeviceIds.getConnectivityType(adjustConfig.context, logger); mcc = UtilDeviceIds.getMcc(adjustConfig.context, logger); mnc = UtilDeviceIds.getMnc(adjustConfig.context, logger); @@ -503,29 +502,26 @@ private String getAppUpdateTime(PackageInfo packageInfo) { private static class UtilDeviceIds { private static Map getImeiParameters(final AdjustConfig adjustConfig, - final boolean isCoppaEnabled, final ILogger logger) { - if (isCoppaEnabled) { + if (adjustConfig.coppaComplianceEnabled) { return null; } return Reflection.getImeiParameters(adjustConfig.context, logger); } private static Map getOaidParameters(final AdjustConfig adjustConfig, - final boolean isCoppaEnabled, final ILogger logger) { - if (isCoppaEnabled) { + if (adjustConfig.coppaComplianceEnabled) { return null; } return Reflection.getOaidParameters(adjustConfig.context, logger); } - private static String getFireAdvertisingId(final AdjustConfig adjustConfig, - final boolean isCoppaEnabled) + private static String getFireAdvertisingId(final AdjustConfig adjustConfig) { - if (isCoppaEnabled) { + if (adjustConfig.coppaComplianceEnabled) { return null; } @@ -558,8 +554,8 @@ private static void getFireAdvertisingIdAsync(final ContentResolver contentResol } } - private static Boolean getFireTrackingEnabled(final AdjustConfig adjustConfig, final boolean isCoppaEnabled) { - if (isCoppaEnabled) { + private static Boolean getFireTrackingEnabled(final AdjustConfig adjustConfig) { + if (adjustConfig.coppaComplianceEnabled) { return null; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index a61b57d8e..8d5b925da 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -78,8 +78,6 @@ public interface IActivityHandler { void verifyAndTrackPlayStorePurchase(AdjustEvent event, OnPurchaseVerificationFinishedListener callback); - void setCoppaCompliance(boolean enabled); - void gotOptOutResponse(); Context getContext(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 820841e3b..a47cf3da1 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -43,7 +43,6 @@ public class PackageBuilder { Boolean isClick; ActivityHandler.InternalState internalState; - boolean coppaEnabled; boolean playStoreKidsAppEnabled; static class ActivityStateCopy { @@ -82,11 +81,6 @@ static class ActivityStateCopy { SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(adjustConfig.context); - if (activityState != null) { - this.coppaEnabled = activityState.isCoppaEnabled(); - } else { - this.coppaEnabled = sharedPreferencesManager.getCoppaCompliance(); - } this.playStoreKidsAppEnabled = sharedPreferencesManager.getPlayStoreKidsApp(); } @@ -234,7 +228,7 @@ ActivityPackage buildVerificationPackage(AdjustEvent event, OnPurchaseVerificati private Map getSessionParameters() { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -251,7 +245,7 @@ private Map getSessionParameters() { PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -264,7 +258,7 @@ private Map getSessionParameters() { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -324,7 +318,7 @@ private Map getSessionParameters() { public Map getEventParameters(AdjustEvent event) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -341,7 +335,7 @@ public Map getEventParameters(AdjustEvent event) { PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.globalParameters.partnerParameters, event.partnerParameters, "Partner")); // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -354,7 +348,7 @@ public Map getEventParameters(AdjustEvent event) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -420,7 +414,7 @@ public Map getEventParameters(AdjustEvent event) { private Map getInfoParameters(String source) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -433,7 +427,7 @@ private Map getInfoParameters(String source) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -446,7 +440,7 @@ private Map getInfoParameters(String source) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -477,7 +471,7 @@ private Map getInfoParameters(String source) { private Map getClickParameters(String source) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -490,7 +484,7 @@ private Map getClickParameters(String source) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -503,7 +497,7 @@ private Map getClickParameters(String source) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -589,7 +583,7 @@ private Map getClickParameters(String source) { private Map getAttributionParameters(String initiatedBy) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -602,7 +596,7 @@ private Map getAttributionParameters(String initiatedBy) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -615,7 +609,7 @@ private Map getAttributionParameters(String initiatedBy) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -654,7 +648,7 @@ private Map getAttributionParameters(String initiatedBy) { private Map getGdprParameters() { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -667,7 +661,7 @@ private Map getGdprParameters() { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -680,7 +674,7 @@ private Map getGdprParameters() { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -720,7 +714,7 @@ private Map getGdprParameters() { { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -745,7 +739,7 @@ private Map getGdprParameters() { adjustThirdPartySharing.partnerSharingSettings); // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -758,7 +752,7 @@ private Map getGdprParameters() { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -797,7 +791,7 @@ private Map getMeasurementConsentParameters( { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -814,7 +808,7 @@ private Map getMeasurementConsentParameters( consentMeasurement ? "enable" : "disable"); // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -827,7 +821,7 @@ private Map getMeasurementConsentParameters( if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -864,7 +858,7 @@ private Map getMeasurementConsentParameters( private Map getAdRevenueParameters(AdjustAdRevenue adjustAdRevenue) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -881,7 +875,7 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.globalParameters.partnerParameters, adjustAdRevenue.partnerParameters, "Partner")); // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -894,7 +888,7 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -961,7 +955,7 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven private Map getSubscriptionParameters(AdjustPlayStoreSubscription subscription) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -974,7 +968,7 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -987,7 +981,7 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -1060,7 +1054,7 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio private Map getVerificationParameters(AdjustPlayStorePurchase purchase) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -1073,7 +1067,7 @@ private Map getVerificationParameters(AdjustPlayStorePurchase pu } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -1085,7 +1079,7 @@ private Map getVerificationParameters(AdjustPlayStorePurchase pu if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -1149,7 +1143,7 @@ private Map getVerificationParameters(AdjustPlayStorePurchase pu private Map getVerificationParameters(AdjustEvent event) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, coppaEnabled, logger); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (deviceInfo.imeiParameters != null) { @@ -1162,7 +1156,7 @@ private Map getVerificationParameters(AdjustEvent event) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -1174,7 +1168,7 @@ private Map getVerificationParameters(AdjustEvent event) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, coppaEnabled, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -1241,7 +1235,7 @@ private ActivityPackage getDefaultActivityPackage(ActivityKind activityKind) { } private void injectFeatureFlagsWithParameters(Map parameters) { - if (coppaEnabled) { + if (adjustConfig.coppaComplianceEnabled) { PackageBuilder.addLong(parameters, "ff_coppa", 1); } @@ -1391,7 +1385,7 @@ private void checkDeviceIds(Map parameters) { && !parameters.containsKey("imeis") && !parameters.containsKey("meids") && !parameters.containsKey("device_ids")) { - if (coppaEnabled) { + if (adjustConfig.coppaComplianceEnabled) { logger.info("Missing Device IDs. COPPA enabled."); } else if (playStoreKidsAppEnabled) { logger.info("Missing Device IDs. Play store kids app enabled."); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java index 2040dd4b1..64f9fad20 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -50,8 +50,6 @@ public class SharedPreferencesManager { private static final String PREFS_KEY_PREINSTALL_SYSTEM_INSTALLER_REFERRER = "preinstall_system_installer_referrer"; - private static final String PREFS_KEY_COPPA_COMPLIANCE_ENABLED = "coppa_compliant_enabled"; - private static final String PREFS_KEY_PLAY_STORE_KIDS_APP_ENABLED = "play_store_kids_app_enabled"; private static final String PREFS_KEY_CONTROL_PARAMS = "control_params"; @@ -429,31 +427,6 @@ public synchronized long getPreinstallPayloadReadStatus() { return getLong(PREFS_KEY_PREINSTALL_PAYLOAD_READ_STATUS, 0); } - /** - * Save coppa compliance state to shared preferences. - * - * @param enabled boolean indicating should COPPA be enabled (true) or not (false) - */ - public synchronized void saveCoppaCompliance(final boolean enabled) { - saveBoolean(PREFS_KEY_COPPA_COMPLIANCE_ENABLED, enabled); - } - - /** - * Get coppa compliance from shared preferences. - * - * @return Coppa compliant state - */ - public synchronized boolean getCoppaCompliance() { - return getBoolean(PREFS_KEY_COPPA_COMPLIANCE_ENABLED, false); - } - - /** - * Remove coppa compliance from shared preferences. - */ - public synchronized void removeCoppaCompliance() { - remove(PREFS_KEY_COPPA_COMPLIANCE_ENABLED); - } - /** * Save Google Play Store Kids app state to shared preferences. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index 540d4e857..951417335 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -9,7 +9,6 @@ package com.adjust.sdk; -import static com.adjust.sdk.Constants.ACTIVITY_STATE_FILENAME; import static com.adjust.sdk.Constants.ENCODING; import android.content.Context; @@ -661,12 +660,12 @@ public static boolean isEqualReferrerDetails(final ReferrerDetails referrerDetai return false; } - public static boolean canReadPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled, boolean playStoreKidsAppEnabled) { - return !coppaEnabled && !playStoreKidsAppEnabled; + public static boolean canReadPlayIds(final AdjustConfig adjustConfig, boolean playStoreKidsAppEnabled) { + return !adjustConfig.coppaComplianceEnabled && !playStoreKidsAppEnabled; } - public static boolean canReadNonPlayIds(final AdjustConfig adjustConfig, boolean coppaEnabled, boolean playStoreKidsAppEnabled) { - return !coppaEnabled && !playStoreKidsAppEnabled; + public static boolean canReadNonPlayIds(final AdjustConfig adjustConfig, boolean playStoreKidsAppEnabled) { + return !adjustConfig.coppaComplianceEnabled && !playStoreKidsAppEnabled; } public static boolean isGooglePlayGamesForPC(final Context context) { diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index c2ab54528..7bcc5de46 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -92,8 +92,6 @@ public void executeCommand(final Command sentCommand) { case "verifyPurchase": verifyPurchase(); break; case "verifyTrack": verifyTrack(); break; case "processDeeplink" : processDeeplink(); break; - case "enableCoppaCompliance" : enableCoppaCompliance(); break; - case "disableCoppaCompliance" : disableCoppaCompliance(); break; case "enablePlayStoreKidsApp" : enablePlayStoreKidsCompliance(); break; case "disablePlayStoreKidsApp" : disablePlayStoreKidsCompliance(); break; case "attributionGetter" : attributionGetter(); break; @@ -313,6 +311,16 @@ private void config() { adjustConfig.setExternalDeviceId(externalDeviceId); } + if (command.containsParameter("coppaCompliant")) { + String coppaCompliantS = command.getFirstParameterValue("coppaCompliant"); + boolean coppaCompliant = "true".equals(coppaCompliantS); + if (coppaCompliant) { + adjustConfig.enableCoppaCompliance(); + } else { + adjustConfig.disableCoppaCompliance(); + } + } + if(command.containsParameter("deferredDeeplinkCallback")) { adjustConfig.setOnDeferredDeeplinkResponseListener(new OnDeferredDeeplinkResponseListener() { @Override @@ -840,14 +848,6 @@ public void onDeeplinkResolved(String resolvedLink) { }); } - private void enableCoppaCompliance() { - Adjust.enableCoppaCompliance(context.getApplicationContext()); - } - - private void disableCoppaCompliance() { - Adjust.disableCoppaCompliance(context.getApplicationContext()); - } - private void enablePlayStoreKidsCompliance() { Adjust.enablePlayStoreKidsCompliance(context.getApplicationContext()); } diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index f48e8a75d..19af77efa 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -135,8 +135,6 @@ AdjustCommandExecutor.prototype.executeCommand = function(command, idx) { case "thirdPartySharing" : this.thirdPartySharing(command.params); break; case "measurementConsent" : this.measurementConsent(command.params); break; case "trackAdRevenue" : this.trackAdRevenue(command.params); break; - case "enableCoppaCompliance" : this.enableCoppaCompliance(command.params); break; - case "disableCoppaCompliance" : this.disableCoppaCompliance(command.params); break; case "enablePlayStoreKidsApp" : this.enablePlayStoreKidsCompliance(command.params); break; case "disablePlayStoreKidsApp" : this.disablePlayStoreKidsCompliance(command.params); break; case "attributionGetter" : this.attributionGetter(command.params); break; @@ -319,6 +317,12 @@ AdjustCommandExecutor.prototype.config = function(params) { adjustConfig.setEventDeduplicationIdsMaxSize(eventDeduplicationIdsMaxSize); } + if ('coppaCompliant' in params) { + var coppaCompliantS = getFirstParameterValue(params, 'coppaCompliant'); + var coppaCompliant = coppaCompliantS == 'true'; + adjustConfig.setCoppaCompliantEnabled(coppaCompliant); + } + if ('attributionCallbackSendAll' in params) { var basePath = this.basePath; adjustConfig.setAttributionCallback(function(attribution) { @@ -627,14 +631,6 @@ AdjustCommandExecutor.prototype.sendReferrer = function(params) { Adjust.setReferrer(referrer); }; -AdjustCommandExecutor.prototype.enableCoppaCompliance = function(params) { - Adjust.enableCoppaCompliance(); -}; - -AdjustCommandExecutor.prototype.disableCoppaCompliance = function(params) { - Adjust.disableCoppaCompliance(); -}; - AdjustCommandExecutor.prototype.enablePlayStoreKidsCompliance = function(params) { Adjust.enablePlayStoreKidsCompliance(); }; From 8cb20a400d47866e7dbf47c52a341da2617cf992 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 31 Jul 2024 14:58:41 +0200 Subject: [PATCH 259/540] refac: play store kids compliance via config --- .../src/main/assets/adjust.js | 12 ---- .../src/main/assets/adjust_config.js | 5 +- .../sdk/webbridge/AdjustBridgeInstance.java | 29 +++------ .../java/com/adjust/sdk/ActivityHandler.java | 10 ++-- .../src/main/java/com/adjust/sdk/Adjust.java | 20 ------- .../java/com/adjust/sdk/AdjustConfig.java | 11 +++- .../java/com/adjust/sdk/AdjustInstance.java | 28 --------- .../main/java/com/adjust/sdk/DeviceInfo.java | 14 ++--- .../java/com/adjust/sdk/PackageBuilder.java | 60 +++++++++---------- .../adjust/sdk/SharedPreferencesManager.java | 27 --------- .../src/main/java/com/adjust/sdk/Util.java | 8 +-- .../adjust/testapp/AdjustCommandExecutor.java | 20 +++---- .../src/main/assets/command_executor.js | 20 +++++-- 13 files changed, 85 insertions(+), 179 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 25092877f..9c8dfc5de 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -141,18 +141,6 @@ var Adjust = { } }, - enablePlayStoreKidsCompliance: function () { - if (AdjustBridge) { - AdjustBridge.enablePlayStoreKidsCompliance(); - } - }, - - disablePlayStoreKidsCompliance: function () { - if (AdjustBridge) { - AdjustBridge.disablePlayStoreKidsCompliance(); - } - }, - getGoogleAdId: function (callback) { if (AdjustBridge) { if (typeof callback === 'string' || callback instanceof String) { diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js index fd313ce72..ef287aa0d 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -47,6 +47,7 @@ function AdjustConfig(appToken, environment, legacy) { this.isPreinstallTrackingEnabled = null; this.preinstallFilePath = null; this.coppaComplianceEnabled = null; + this.playStoreKidsComplianceEnabled = null; this.fbAppId = null; this.shouldReadDeviceIdsOnce = null; this.eventDeduplicationIdsMaxSize = null; @@ -222,8 +223,8 @@ AdjustConfig.prototype.enableCoppaCompliance = function() { this.coppaComplianceEnabled = true; }; -AdjustConfig.prototype.disableCoppaCompliance = function() { - this.coppaComplianceEnabled = false; +AdjustConfig.prototype.enablePlayStoreKidsCompliance = function() { + this.playStoreKidsComplianceEnabled = true; }; AdjustConfig.prototype.setFbAppId = function(fbAppId) { diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 7ed4686e8..afffbcda5 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -171,6 +171,7 @@ public void initSdk(String adjustConfigString) { Object isPreinstallTrackingEnabledField = jsonAdjustConfig.get("isPreinstallTrackingEnabled"); Object preinstallFilePathField = jsonAdjustConfig.get("preinstallFilePath"); Object coppaComplianceEnabledField = jsonAdjustConfig.get("coppaComplianceEnabled"); + Object playStoreKidsComplianceEnabledField = jsonAdjustConfig.get("playStoreKidsComplianceEnabled"); Object fbAppIdField = jsonAdjustConfig.get("fbAppId"); Object shouldReadDeviceIdsOnceField = jsonAdjustConfig.get("shouldReadDeviceIdsOnce"); Object eventDeduplicationIdsMaxSizeField = jsonAdjustConfig.get("eventDeduplicationIdsMaxSize"); @@ -371,8 +372,14 @@ public boolean launchReceivedDeeplink(Uri deeplink) { if (coppaCompliantEnabled != null) { if (coppaCompliantEnabled) { adjustConfig.enableCoppaCompliance(); - } else { - adjustConfig.disableCoppaCompliance(); + } + } + + // PlayStore Kids compliance + Boolean playStoreKidsComplianceEnabled = AdjustBridgeUtil.fieldToBoolean(playStoreKidsComplianceEnabledField); + if (playStoreKidsComplianceEnabled != null) { + if (playStoreKidsComplianceEnabled) { + adjustConfig.enablePlayStoreKidsCompliance(); } } @@ -669,24 +676,6 @@ public void trackMeasurementConsent(String consentMeasurementString) { } } - @JavascriptInterface - public void enablePlayStoreKidsCompliance() { - if (!isInitialized()) { - return; - } - - Adjust.enablePlayStoreKidsCompliance(application.getApplicationContext()); - } - - @JavascriptInterface - public void disablePlayStoreKidsCompliance() { - if (!isInitialized()) { - return; - } - - Adjust.disablePlayStoreKidsCompliance(application.getApplicationContext()); - } - @JavascriptInterface public void getGoogleAdId(final String callback) { if (!isInitialized()) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 7f56741cb..13aefc3f7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -867,20 +867,18 @@ public void run(ActivityHandler activityHandler) { readConfigFile(adjustConfig.context); - boolean playStoreKidsAppEnabled = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getPlayStoreKidsApp(); + deviceInfo = new DeviceInfo(adjustConfig); - deviceInfo = new DeviceInfo(adjustConfig, playStoreKidsAppEnabled); - - deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig); if (deviceInfo.playAdId == null) { - if (!Util.canReadPlayIds(adjustConfig, playStoreKidsAppEnabled)) { + if (!Util.canReadPlayIds(adjustConfig)) { logger.info("Cannot read Google Play Services Advertising ID with COPPA or play store kids app enabled"); } else { logger.warn("Unable to get Google Play Services Advertising ID at start time"); } if (deviceInfo.androidId == null) { - if (! Util.canReadNonPlayIds(adjustConfig, playStoreKidsAppEnabled)) { + if (! Util.canReadNonPlayIds(adjustConfig)) { logger.info("Cannot read non Play IDs with COPPA or play store kids app enabled"); } else { logger.error("Unable to get any Device IDs. Please check if Proguard is correctly set with Adjust SDK"); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index ad9a02c4e..73acef793 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -284,26 +284,6 @@ public static void trackPlayStoreSubscription(final AdjustPlayStoreSubscription adjustInstance.trackPlayStoreSubscription(subscription); } - /** - * Called to enable Google Play Store Kids app setting. - * - * @param context Application context - */ - public static void enablePlayStoreKidsCompliance(final Context context) { - AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.enablePlayStoreKidsCompliance(context); - } - - /** - * Called to disable Google Play Store Kids app setting. - * - * @param context Application context - */ - public static void disablePlayStoreKidsCompliance(final Context context) { - AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.disablePlayStoreKidsCompliance(context); - } - /** * Called to get value of Google Play Advertising Identifier. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 0517da8a1..d0b6b3618 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -39,6 +39,7 @@ public class AdjustConfig { boolean isDataResidency; String preinstallFilePath; boolean coppaComplianceEnabled; + boolean playStoreKidsComplianceEnabled; String fbAppId; boolean isDeviceIdsReadingOnceEnabled; OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; @@ -81,6 +82,8 @@ private void init(Context context, String appToken, String environment, boolean this.isPreinstallTrackingEnabled = false; this.isDeviceIdsReadingOnceEnabled = false; this.isCostDataInAttributionEnabled = false; + this.coppaComplianceEnabled = false; + this.playStoreKidsComplianceEnabled = false; } public void setLogLevel(LogLevel logLevel) { @@ -115,8 +118,8 @@ public void enableCoppaCompliance() { this.coppaComplianceEnabled = true; } - public void disableCoppaCompliance() { - this.coppaComplianceEnabled = false; + public void enablePlayStoreKidsCompliance() { + this.playStoreKidsComplianceEnabled = true; } public void setFbAppId(String fbAppId) { @@ -233,6 +236,10 @@ public boolean isCoppaComplianceEnabled() { return coppaComplianceEnabled; } + public boolean isPlayStoreKidsComplianceEnabled() { + return playStoreKidsComplianceEnabled; + } + public String getFbAppId() { return fbAppId; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index ad08a112f..f790053e9 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -510,24 +510,6 @@ public void trackPlayStoreSubscription(AdjustPlayStoreSubscription subscription) activityHandler.trackPlayStoreSubscription(subscription); } - /** - * Called to enable Google Play Store Kids app setting. - * - * @param context Application context - */ - public void enablePlayStoreKidsCompliance(Context context) { - savePlayStoreKidsApp(true, context); - } - - /** - * Called to disable Google Play Store Kids app setting. - * - * @param context Application context - */ - public void disablePlayStoreKidsCompliance(Context context) { - savePlayStoreKidsApp(false, context); - } - /** * Called to get value of unique Adjust device identifier. * @@ -801,16 +783,6 @@ private void setSendingReferrersAsNotSent(final Context context) { SharedPreferencesManager.getDefaultInstance(context).setSendingReferrersAsNotSent(); } - /** - * Save Google play store kids app settings to shared preferences. - * - * @param enabled boolean indicating should GPSKA be enabled (true) or not (false) - * @param context Application context - */ - private void savePlayStoreKidsApp(final boolean enabled, final Context context) { - SharedPreferencesManager.getDefaultInstance(context).savePlayStoreKidsApp(enabled); - } - /** * Check if AdjustInstance enable flag is set or not. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index d3bdb3d56..b794a4745 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -101,7 +101,7 @@ class DeviceInfo { String mcc; String mnc; - DeviceInfo(AdjustConfig adjustConfig, boolean playStoreKidsAppEnabled) { + DeviceInfo(AdjustConfig adjustConfig) { Context context = adjustConfig.context; Resources resources = context.getResources(); DisplayMetrics displayMetrics = resources.getDisplayMetrics(); @@ -134,14 +134,14 @@ class DeviceInfo { appInstallTime = getAppInstallTime(packageInfo); appUpdateTime = getAppUpdateTime(packageInfo); uiMode = getDeviceUiMode(configuration); - if (Util.canReadPlayIds(adjustConfig, playStoreKidsAppEnabled)) { + if (Util.canReadPlayIds(adjustConfig)) { appSetId = Reflection.getAppSetId(context); } } - void reloadPlayIds(final AdjustConfig adjustConfig, boolean playStoreKidsAppEnabled) { + void reloadPlayIds(final AdjustConfig adjustConfig) { if (playIdsReadOnce && adjustConfig.isDeviceIdsReadingOnceEnabled) { - if (!Util.canReadPlayIds(adjustConfig, playStoreKidsAppEnabled)) { + if (!Util.canReadPlayIds(adjustConfig)) { playAdId = null; isTrackingEnabled = null; playAdIdSource = null; @@ -155,7 +155,7 @@ void reloadPlayIds(final AdjustConfig adjustConfig, boolean playStoreKidsAppEnab playAdIdSource = null; playAdIdAttempt = -1; - if (!Util.canReadPlayIds(adjustConfig, playStoreKidsAppEnabled)) { + if (!Util.canReadPlayIds(adjustConfig)) { return; } @@ -234,8 +234,8 @@ void reloadPlayIds(final AdjustConfig adjustConfig, boolean playStoreKidsAppEnab } } - void reloadNonPlayIds(final AdjustConfig adjustConfig, boolean playStoreKidsAppEnabled) { - if (!Util.canReadNonPlayIds(adjustConfig, playStoreKidsAppEnabled)) { + void reloadNonPlayIds(final AdjustConfig adjustConfig) { + if (!Util.canReadNonPlayIds(adjustConfig)) { return; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index a47cf3da1..ca555a3ca 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -43,8 +43,6 @@ public class PackageBuilder { Boolean isClick; ActivityHandler.InternalState internalState; - boolean playStoreKidsAppEnabled; - static class ActivityStateCopy { int eventCount = -1; int sessionCount = -1; @@ -78,10 +76,6 @@ static class ActivityStateCopy { this.adjustConfig = adjustConfig; this.activityStateCopy = new ActivityStateCopy(activityState); this.globalParameters = globalParameters; - - SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(adjustConfig.context); - - this.playStoreKidsAppEnabled = sharedPreferencesManager.getPlayStoreKidsApp(); } ActivityPackage buildSessionPackage() { @@ -245,7 +239,7 @@ private Map getSessionParameters() { PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -258,7 +252,7 @@ private Map getSessionParameters() { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -335,7 +329,7 @@ public Map getEventParameters(AdjustEvent event) { PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.globalParameters.partnerParameters, event.partnerParameters, "Partner")); // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -348,7 +342,7 @@ public Map getEventParameters(AdjustEvent event) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -427,7 +421,7 @@ private Map getInfoParameters(String source) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -440,7 +434,7 @@ private Map getInfoParameters(String source) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -484,7 +478,7 @@ private Map getClickParameters(String source) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -497,7 +491,7 @@ private Map getClickParameters(String source) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -596,7 +590,7 @@ private Map getAttributionParameters(String initiatedBy) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -609,7 +603,7 @@ private Map getAttributionParameters(String initiatedBy) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -661,7 +655,7 @@ private Map getGdprParameters() { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -674,7 +668,7 @@ private Map getGdprParameters() { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -739,7 +733,7 @@ private Map getGdprParameters() { adjustThirdPartySharing.partnerSharingSettings); // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -752,7 +746,7 @@ private Map getGdprParameters() { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -808,7 +802,7 @@ private Map getMeasurementConsentParameters( consentMeasurement ? "enable" : "disable"); // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -821,7 +815,7 @@ private Map getMeasurementConsentParameters( if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -875,7 +869,7 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.globalParameters.partnerParameters, adjustAdRevenue.partnerParameters, "Partner")); // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -888,7 +882,7 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -968,7 +962,7 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -981,7 +975,7 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -1067,7 +1061,7 @@ private Map getVerificationParameters(AdjustPlayStorePurchase pu } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -1079,7 +1073,7 @@ private Map getVerificationParameters(AdjustPlayStorePurchase pu if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -1156,7 +1150,7 @@ private Map getVerificationParameters(AdjustEvent event) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); @@ -1168,7 +1162,7 @@ private Map getVerificationParameters(AdjustEvent event) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig, playStoreKidsAppEnabled); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -1247,7 +1241,7 @@ private void injectFeatureFlagsWithParameters(Map parameters) { PackageBuilder.addBoolean(parameters, "background", true); } } - if (playStoreKidsAppEnabled) { + if (adjustConfig.playStoreKidsComplianceEnabled) { PackageBuilder.addLong(parameters, "ff_play_store_kids_app", 1); } } @@ -1387,8 +1381,8 @@ private void checkDeviceIds(Map parameters) { && !parameters.containsKey("device_ids")) { if (adjustConfig.coppaComplianceEnabled) { logger.info("Missing Device IDs. COPPA enabled."); - } else if (playStoreKidsAppEnabled) { - logger.info("Missing Device IDs. Play store kids app enabled."); + } else if (adjustConfig.playStoreKidsComplianceEnabled) { + logger.info("Missing Device IDs. Play store kids compliance enabled."); } else { logger.error("Missing Device IDs. Please check if Proguard is correctly set with Adjust SDK"); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java index 64f9fad20..2986ec25d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -50,8 +50,6 @@ public class SharedPreferencesManager { private static final String PREFS_KEY_PREINSTALL_SYSTEM_INSTALLER_REFERRER = "preinstall_system_installer_referrer"; - private static final String PREFS_KEY_PLAY_STORE_KIDS_APP_ENABLED = "play_store_kids_app_enabled"; - private static final String PREFS_KEY_CONTROL_PARAMS = "control_params"; /** @@ -427,31 +425,6 @@ public synchronized long getPreinstallPayloadReadStatus() { return getLong(PREFS_KEY_PREINSTALL_PAYLOAD_READ_STATUS, 0); } - /** - * Save Google Play Store Kids app state to shared preferences. - * - * @param enabled boolean indicating should GPSKA be enabled (true) or not (false) - */ - public synchronized void savePlayStoreKidsApp(final boolean enabled) { - saveBoolean(PREFS_KEY_PLAY_STORE_KIDS_APP_ENABLED, enabled); - } - - /** - * Get Google Play Store Kids app from shared preferences. - * - * @return Google Play Store Kids app setting - */ - public synchronized boolean getPlayStoreKidsApp() { - return getBoolean(PREFS_KEY_PLAY_STORE_KIDS_APP_ENABLED, false); - } - - /** - * Remove Google Play Store Kids app settings from shared preferences. - */ - public synchronized void removePlayStoreKidsApp() { - remove(PREFS_KEY_PLAY_STORE_KIDS_APP_ENABLED); - } - /** * Save control params json to shared preferences. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index 951417335..6264fb8a3 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -660,12 +660,12 @@ public static boolean isEqualReferrerDetails(final ReferrerDetails referrerDetai return false; } - public static boolean canReadPlayIds(final AdjustConfig adjustConfig, boolean playStoreKidsAppEnabled) { - return !adjustConfig.coppaComplianceEnabled && !playStoreKidsAppEnabled; + public static boolean canReadPlayIds(final AdjustConfig adjustConfig) { + return !adjustConfig.coppaComplianceEnabled && !adjustConfig.playStoreKidsComplianceEnabled; } - public static boolean canReadNonPlayIds(final AdjustConfig adjustConfig, boolean playStoreKidsAppEnabled) { - return !adjustConfig.coppaComplianceEnabled && !playStoreKidsAppEnabled; + public static boolean canReadNonPlayIds(final AdjustConfig adjustConfig) { + return !adjustConfig.coppaComplianceEnabled && !adjustConfig.playStoreKidsComplianceEnabled; } public static boolean isGooglePlayGamesForPC(final Context context) { diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 7bcc5de46..72ecc4f59 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -92,8 +92,6 @@ public void executeCommand(final Command sentCommand) { case "verifyPurchase": verifyPurchase(); break; case "verifyTrack": verifyTrack(); break; case "processDeeplink" : processDeeplink(); break; - case "enablePlayStoreKidsApp" : enablePlayStoreKidsCompliance(); break; - case "disablePlayStoreKidsApp" : disablePlayStoreKidsCompliance(); break; case "attributionGetter" : attributionGetter(); break; //case "testBegin": testBegin(); break; // case "testEnd": testEnd(); break; @@ -316,8 +314,14 @@ private void config() { boolean coppaCompliant = "true".equals(coppaCompliantS); if (coppaCompliant) { adjustConfig.enableCoppaCompliance(); - } else { - adjustConfig.disableCoppaCompliance(); + } + } + + if (command.containsParameter("playStoreKids")) { + String playStoreKidsS = command.getFirstParameterValue("playStoreKids"); + boolean playStoreKids = "true".equals(playStoreKidsS); + if (playStoreKids) { + adjustConfig.enablePlayStoreKidsCompliance(); } } @@ -848,14 +852,6 @@ public void onDeeplinkResolved(String resolvedLink) { }); } - private void enablePlayStoreKidsCompliance() { - Adjust.enablePlayStoreKidsCompliance(context.getApplicationContext()); - } - - private void disablePlayStoreKidsCompliance() { - Adjust.disablePlayStoreKidsCompliance(context.getApplicationContext()); - } - private void attributionGetter() { Adjust.getAttribution(attribution -> { Map fields = new HashMap<>(); diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index 19af77efa..a9137af86 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -135,8 +135,6 @@ AdjustCommandExecutor.prototype.executeCommand = function(command, idx) { case "thirdPartySharing" : this.thirdPartySharing(command.params); break; case "measurementConsent" : this.measurementConsent(command.params); break; case "trackAdRevenue" : this.trackAdRevenue(command.params); break; - case "enablePlayStoreKidsApp" : this.enablePlayStoreKidsCompliance(command.params); break; - case "disablePlayStoreKidsApp" : this.disablePlayStoreKidsCompliance(command.params); break; case "attributionGetter" : this.attributionGetter(command.params); break; break; } @@ -318,10 +316,20 @@ AdjustCommandExecutor.prototype.config = function(params) { } if ('coppaCompliant' in params) { - var coppaCompliantS = getFirstParameterValue(params, 'coppaCompliant'); - var coppaCompliant = coppaCompliantS == 'true'; - adjustConfig.setCoppaCompliantEnabled(coppaCompliant); - } + var coppaCompliantS = getFirstParameterValue(params, 'coppaCompliant'); + var coppaCompliant = coppaCompliantS == 'true'; + if (coppaCompliant == true) { + adjustConfig.enableCoppaCompliance(); + } + } + + if ('playStoreKids' in params) { + var playStoreKidsS = getFirstParameterValue(params, 'playStoreKids'); + var playStoreKids = playStoreKidsS == 'true'; + if (playStoreKids == true) { + adjustConfig.enablePlayStoreKidsCompliance(); + } + } if ('attributionCallbackSendAll' in params) { var basePath = this.basePath; From b81fac4367653701316bc152a259e7978be64f36 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 31 Jul 2024 15:31:23 +0200 Subject: [PATCH 260/540] refac: send needs_cost param only when enabled --- Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index d0b6b3618..2a1e06312 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -33,7 +33,7 @@ public class AdjustConfig { boolean startOffline; String externalDeviceId; boolean isPreinstallTrackingEnabled; - boolean isCostDataInAttributionEnabled; + Boolean isCostDataInAttributionEnabled; List urlStrategyDomains; boolean useSubdomains; boolean isDataResidency; @@ -81,7 +81,6 @@ private void init(Context context, String appToken, String environment, boolean this.isSendingInBackgroundEnabled = false; this.isPreinstallTrackingEnabled = false; this.isDeviceIdsReadingOnceEnabled = false; - this.isCostDataInAttributionEnabled = false; this.coppaComplianceEnabled = false; this.playStoreKidsComplianceEnabled = false; } From 5eb6b8d2c75716b87745bce43d05f9a94ae4ea38 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 31 Jul 2024 16:06:32 +0200 Subject: [PATCH 261/540] refac: clean up --- .../src/main/assets/command_executor.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index a9137af86..ba2f99b4b 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -639,14 +639,6 @@ AdjustCommandExecutor.prototype.sendReferrer = function(params) { Adjust.setReferrer(referrer); }; -AdjustCommandExecutor.prototype.enablePlayStoreKidsCompliance = function(params) { - Adjust.enablePlayStoreKidsCompliance(); -}; - -AdjustCommandExecutor.prototype.disablePlayStoreKidsCompliance = function(params) { - Adjust.disablePlayStoreKidsCompliance(); -}; - AdjustCommandExecutor.prototype.attributionGetter = function(params) { var basePath = this.basePath; Adjust.getAttribution(function(attribution) { From 06634c98f5ff48d5ff7cde2309f58f3c4a6fd79c Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 31 Jul 2024 16:46:57 +0200 Subject: [PATCH 262/540] refac: add check for all IDs --- .../sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index b794a4745..8f5e50634 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -504,7 +504,7 @@ private static class UtilDeviceIds { private static Map getImeiParameters(final AdjustConfig adjustConfig, final ILogger logger) { - if (adjustConfig.coppaComplianceEnabled) { + if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled) { return null; } @@ -513,7 +513,7 @@ private static Map getImeiParameters(final AdjustConfig adjustCo private static Map getOaidParameters(final AdjustConfig adjustConfig, final ILogger logger) { - if (adjustConfig.coppaComplianceEnabled) { + if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled) { return null; } @@ -521,7 +521,7 @@ private static Map getOaidParameters(final AdjustConfig adjustCo } private static String getFireAdvertisingId(final AdjustConfig adjustConfig) { - if (adjustConfig.coppaComplianceEnabled) { + if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled) { return null; } @@ -555,7 +555,7 @@ private static void getFireAdvertisingIdAsync(final ContentResolver contentResol } private static Boolean getFireTrackingEnabled(final AdjustConfig adjustConfig) { - if (adjustConfig.coppaComplianceEnabled) { + if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled) { return null; } From f85757a96c5386ab76b895fa8a0ed1e5df7fac93 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 1 Aug 2024 13:15:49 +0200 Subject: [PATCH 263/540] refac: rename urlStrategy feilds to domains - remove onResume after sdkInit and rely on SDK lifecycle --- .../src/main/assets/adjust_config.js | 6 +-- .../sdk/webbridge/AdjustBridgeInstance.java | 47 +++---------------- 2 files changed, 9 insertions(+), 44 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js index ef287aa0d..fb4a77b22 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -41,7 +41,7 @@ function AdjustConfig(appToken, environment, legacy) { this.deferredDeeplinkCallbackFunction = null; this.fbPixelDefaultEventToken = null; this.fbPixelMapping = []; - this.urlStrategy = []; + this.domains = []; this.useSubDomain = null; this.isDataResidency = null; this.isPreinstallTrackingEnabled = null; @@ -205,8 +205,8 @@ AdjustConfig.prototype.addFbPixelMapping = function(fbEventNameKey, adjEventToke this.fbPixelMapping.push(adjEventTokenValue); }; -AdjustConfig.prototype.setUrlStrategy = function(urlStrategy, useSubDomain , isDataResidency) { - this.urlStrategy = urlStrategy; +AdjustConfig.prototype.setUrlStrategy = function(domains, useSubDomain , isDataResidency) { + this.domains = domains; this.useSubDomain = useSubDomain; this.isDataResidency = isDataResidency; }; diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index afffbcda5..180d103ba 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -69,36 +69,6 @@ public class AdjustBridgeInstance { setWebView(webView); } - // Automatically subscribe to Android lifecycle callbacks to properly handle session tracking. - // This requires user to have minimal supported API level set to 14. - @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) - private static final class AdjustLifecycleCallbacks implements Application.ActivityLifecycleCallbacks { - @Override - public void onActivityResumed(Activity activity) { - Adjust.onResume(); - } - - @Override - public void onActivityPaused(Activity activity) { - Adjust.onPause(); - } - - @Override - public void onActivityStopped(Activity activity) {} - - @Override - public void onActivitySaveInstanceState(Activity activity, Bundle outState) {} - - @Override - public void onActivityDestroyed(Activity activity) {} - - @Override - public void onActivityCreated(Activity activity, Bundle savedInstanceState) {} - - @Override - public void onActivityStarted(Activity activity) {} - } - private boolean isInitialized() { if (webView == null) { AdjustBridgeUtil.getLogger().error("Webview missing. Call AdjustBridge.setWebView before"); @@ -165,7 +135,7 @@ public void initSdk(String adjustConfigString) { Object deferredDeeplinkCallbackNameField = jsonAdjustConfig.get("deferredDeeplinkCallbackName"); Object fbPixelDefaultEventTokenField = jsonAdjustConfig.get("fbPixelDefaultEventToken"); Object fbPixelMappingField = jsonAdjustConfig.get("fbPixelMapping"); - Object urlStrategyField = jsonAdjustConfig.get("urlStrategy"); + Object domainsField = jsonAdjustConfig.get("domains"); Object useSubDomainField = jsonAdjustConfig.get("useSubDomain"); Object isDataResidencyField = jsonAdjustConfig.get("isDataResidency"); Object isPreinstallTrackingEnabledField = jsonAdjustConfig.get("isPreinstallTrackingEnabled"); @@ -344,13 +314,13 @@ public boolean launchReceivedDeeplink(Uri deeplink) { } // Set url strategy - String[] urlStrategyArray = AdjustBridgeUtil.jsonArrayToArray((JSONArray) urlStrategyField); - List urlStrategy = Arrays.asList(urlStrategyArray); + String[] domainsArray = AdjustBridgeUtil.jsonArrayToArray((JSONArray) domainsField); + List domains = Arrays.asList(domainsArray); Boolean useSubDomain = AdjustBridgeUtil.fieldToBoolean(useSubDomainField); Boolean isDataResidency = AdjustBridgeUtil.fieldToBoolean(isDataResidencyField); - if (urlStrategy != null && !urlStrategy.isEmpty() && useSubDomain != null && isDataResidency != null) { - adjustConfig.setUrlStrategy(urlStrategy,useSubDomain,isDataResidency); + if (domains != null && !domains.isEmpty() && useSubDomain != null && isDataResidency != null) { + adjustConfig.setUrlStrategy(domains,useSubDomain,isDataResidency); } // Preinstall tracking @@ -400,15 +370,10 @@ public boolean launchReceivedDeeplink(Uri deeplink) { adjustConfig.setEventDeduplicationIdsMaxSize(eventDeduplicationIdsMaxSize); } - // Manually call onResume() because web view initialisation will happen a bit delayed. - // With this delay, it will miss lifecycle callback onResume() initial firing. Adjust.initSdk(adjustConfig); - Adjust.onResume(); isInitialized = true; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - application.registerActivityLifecycleCallbacks(new AdjustLifecycleCallbacks()); - } + } catch (Exception e) { AdjustFactory.getLogger().error("AdjustBridgeInstance onCreate: %s", e.getMessage()); } From fc09f2f80773f6909eb76f72971ec5c73a2da70b Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 1 Aug 2024 16:21:07 +0200 Subject: [PATCH 264/540] refac: rename domains to urlStrategyDomains --- .../sdk-plugin-webbridge/src/main/assets/adjust_config.js | 6 +++--- .../java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js index fb4a77b22..8a2cc64a6 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -41,7 +41,7 @@ function AdjustConfig(appToken, environment, legacy) { this.deferredDeeplinkCallbackFunction = null; this.fbPixelDefaultEventToken = null; this.fbPixelMapping = []; - this.domains = []; + this.urlStrategyDomains = []; this.useSubDomain = null; this.isDataResidency = null; this.isPreinstallTrackingEnabled = null; @@ -205,8 +205,8 @@ AdjustConfig.prototype.addFbPixelMapping = function(fbEventNameKey, adjEventToke this.fbPixelMapping.push(adjEventTokenValue); }; -AdjustConfig.prototype.setUrlStrategy = function(domains, useSubDomain , isDataResidency) { - this.domains = domains; +AdjustConfig.prototype.setUrlStrategy = function(urlStrategyDomains, useSubDomain , isDataResidency) { + this.urlStrategyDomains = urlStrategyDomains; this.useSubDomain = useSubDomain; this.isDataResidency = isDataResidency; }; diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 180d103ba..9eeaad4c3 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -135,7 +135,7 @@ public void initSdk(String adjustConfigString) { Object deferredDeeplinkCallbackNameField = jsonAdjustConfig.get("deferredDeeplinkCallbackName"); Object fbPixelDefaultEventTokenField = jsonAdjustConfig.get("fbPixelDefaultEventToken"); Object fbPixelMappingField = jsonAdjustConfig.get("fbPixelMapping"); - Object domainsField = jsonAdjustConfig.get("domains"); + Object urlStrategyDomainsField = jsonAdjustConfig.get("urlStrategyDomains"); Object useSubDomainField = jsonAdjustConfig.get("useSubDomain"); Object isDataResidencyField = jsonAdjustConfig.get("isDataResidency"); Object isPreinstallTrackingEnabledField = jsonAdjustConfig.get("isPreinstallTrackingEnabled"); @@ -314,7 +314,7 @@ public boolean launchReceivedDeeplink(Uri deeplink) { } // Set url strategy - String[] domainsArray = AdjustBridgeUtil.jsonArrayToArray((JSONArray) domainsField); + String[] domainsArray = AdjustBridgeUtil.jsonArrayToArray((JSONArray) urlStrategyDomainsField); List domains = Arrays.asList(domainsArray); Boolean useSubDomain = AdjustBridgeUtil.fieldToBoolean(useSubDomainField); From f76d5c30238ed7d9c2f4066fe2b1e97ce823730f Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 1 Aug 2024 16:26:55 +0200 Subject: [PATCH 265/540] refac: rename domains to urlStrategyDomains in local variables --- .../com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 9eeaad4c3..f34804315 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -314,13 +314,13 @@ public boolean launchReceivedDeeplink(Uri deeplink) { } // Set url strategy - String[] domainsArray = AdjustBridgeUtil.jsonArrayToArray((JSONArray) urlStrategyDomainsField); - List domains = Arrays.asList(domainsArray); + String[] urlStrategyDomainsArray = AdjustBridgeUtil.jsonArrayToArray((JSONArray) urlStrategyDomainsField); + List urlStrategyDomains = Arrays.asList(urlStrategyDomainsArray); Boolean useSubDomain = AdjustBridgeUtil.fieldToBoolean(useSubDomainField); Boolean isDataResidency = AdjustBridgeUtil.fieldToBoolean(isDataResidencyField); - if (domains != null && !domains.isEmpty() && useSubDomain != null && isDataResidency != null) { - adjustConfig.setUrlStrategy(domains,useSubDomain,isDataResidency); + if (urlStrategyDomains != null && !urlStrategyDomains.isEmpty() && useSubDomain != null && isDataResidency != null) { + adjustConfig.setUrlStrategy(urlStrategyDomains,useSubDomain,isDataResidency); } // Preinstall tracking From 05c73d67c651a609f9d57bd24a162f0f7fce9e6f Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 1 Aug 2024 16:30:13 +0200 Subject: [PATCH 266/540] refac: rename subDomain to subdomains --- .../sdk-plugin-webbridge/src/main/assets/adjust_config.js | 6 +++--- .../com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js index 8a2cc64a6..f0c9b6b35 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -42,7 +42,7 @@ function AdjustConfig(appToken, environment, legacy) { this.fbPixelDefaultEventToken = null; this.fbPixelMapping = []; this.urlStrategyDomains = []; - this.useSubDomain = null; + this.useSubdomains = null; this.isDataResidency = null; this.isPreinstallTrackingEnabled = null; this.preinstallFilePath = null; @@ -205,9 +205,9 @@ AdjustConfig.prototype.addFbPixelMapping = function(fbEventNameKey, adjEventToke this.fbPixelMapping.push(adjEventTokenValue); }; -AdjustConfig.prototype.setUrlStrategy = function(urlStrategyDomains, useSubDomain , isDataResidency) { +AdjustConfig.prototype.setUrlStrategy = function(urlStrategyDomains, useSubdomains , isDataResidency) { this.urlStrategyDomains = urlStrategyDomains; - this.useSubDomain = useSubDomain; + this.useSubdomains = useSubdomains; this.isDataResidency = isDataResidency; }; diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index f34804315..25b00196c 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -136,7 +136,7 @@ public void initSdk(String adjustConfigString) { Object fbPixelDefaultEventTokenField = jsonAdjustConfig.get("fbPixelDefaultEventToken"); Object fbPixelMappingField = jsonAdjustConfig.get("fbPixelMapping"); Object urlStrategyDomainsField = jsonAdjustConfig.get("urlStrategyDomains"); - Object useSubDomainField = jsonAdjustConfig.get("useSubDomain"); + Object useSubdomainsField = jsonAdjustConfig.get("useSubdomains"); Object isDataResidencyField = jsonAdjustConfig.get("isDataResidency"); Object isPreinstallTrackingEnabledField = jsonAdjustConfig.get("isPreinstallTrackingEnabled"); Object preinstallFilePathField = jsonAdjustConfig.get("preinstallFilePath"); @@ -317,10 +317,10 @@ public boolean launchReceivedDeeplink(Uri deeplink) { String[] urlStrategyDomainsArray = AdjustBridgeUtil.jsonArrayToArray((JSONArray) urlStrategyDomainsField); List urlStrategyDomains = Arrays.asList(urlStrategyDomainsArray); - Boolean useSubDomain = AdjustBridgeUtil.fieldToBoolean(useSubDomainField); + Boolean useSubdomains = AdjustBridgeUtil.fieldToBoolean(useSubdomainsField); Boolean isDataResidency = AdjustBridgeUtil.fieldToBoolean(isDataResidencyField); - if (urlStrategyDomains != null && !urlStrategyDomains.isEmpty() && useSubDomain != null && isDataResidency != null) { - adjustConfig.setUrlStrategy(urlStrategyDomains,useSubDomain,isDataResidency); + if (urlStrategyDomains != null && !urlStrategyDomains.isEmpty() && useSubdomains != null && isDataResidency != null) { + adjustConfig.setUrlStrategy(urlStrategyDomains,useSubdomains,isDataResidency); } // Preinstall tracking From d4938fde1de4adefd901f16041c94660221e69e1 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 1 Aug 2024 17:00:56 +0200 Subject: [PATCH 267/540] chore: remove beta specific details --- Adjust/build.gradle | 2 +- .../src/main/java/com/adjust/sdk/network/UtilNetworking.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index a9495314e..54ab560ce 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 34 coreTargetSdkVersion = 34 - coreVersionName = '5.0.0-SNAPSHOT' + coreVersionName = '5.0.0' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java index 5af40867e..b3dc7c406 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java @@ -32,7 +32,8 @@ public void applyConnectionOptions(final HttpsURLConnection connection, final String clientSdk) { connection.setRequestProperty("Client-SDK", clientSdk); - connection.setRequestProperty("Beta-Version", "2"); + // in case of beta release, specify beta version here + // connection.setRequestProperty("Beta-Version", "2"); connection.setConnectTimeout(Constants.ONE_MINUTE); connection.setReadTimeout(Constants.ONE_MINUTE); } From 1fea310072a510223628acb3e8b6ba40d80127a7 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 2 Aug 2024 16:39:20 +0200 Subject: [PATCH 268/540] docs: update changelog --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0827cfb8e..294640742 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +### Version 5.0.0 (2nd August 2024) + +We're excited to release our major new SDK version (v5). Among many internal improvements, our spoofing protection solution is now included out of the box, reinforcing our commitment to accurate, actionable, and fraud-free data. + +To try out SDK v5 in your app, you can follow our new v4 to v5 [migration guide](https://dev.adjust.com/en/sdk/android/migration/v4-to-v5). + +On [our Signature releases page](https://github.com/adjust/adjust_signature_sdk/releases), you can find the latest version of the Signature library to integrate into your app. + +If you are a current Adjust client and have questions about SDK v5, please email [sdk-v5@adjust.com](mailto:sdk-v5@adjust.com). + +In case you were using beta version of the SDK v5, please switch to the official v5 release. + +--- + ### Version 4.38.5 (2nd July 2024) #### Fixed - Fixed occasional crash while invoking deeplink resolution callback. From 6f72384dd0407d3729e4e0ab56e431bebdc7235d Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 6 Aug 2024 14:19:43 +0200 Subject: [PATCH 269/540] fix: version dependency as per maven spec --- Adjust/sdk-core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/build.gradle b/Adjust/sdk-core/build.gradle index fc6635e71..415eefce3 100644 --- a/Adjust/sdk-core/build.gradle +++ b/Adjust/sdk-core/build.gradle @@ -220,7 +220,7 @@ def customizePomForAar(pom) { dependency { groupId 'com.adjust.signature' artifactId 'adjust-android-signature' - version '3+' + version '[3.20.0, 4.0.0)' scope 'compile' } } From 1a1d843efed8af71b09ea23e3165facd062dff0e Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 22 Aug 2024 14:10:00 +0200 Subject: [PATCH 270/540] refac: add signature library as a dependency on examples app --- Adjust/examples/example-app-fbpixel/build.gradle | 1 + Adjust/examples/example-app-java/build.gradle | 1 + Adjust/examples/example-app-keyboard/build.gradle | 1 + Adjust/examples/example-app-kotlin/build.gradle | 1 + Adjust/examples/example-app-tv/build.gradle | 1 + Adjust/examples/example-app-webbridge/build.gradle | 1 + 6 files changed, 6 insertions(+) diff --git a/Adjust/examples/example-app-fbpixel/build.gradle b/Adjust/examples/example-app-fbpixel/build.gradle index 2fc022ec1..06281d56a 100644 --- a/Adjust/examples/example-app-fbpixel/build.gradle +++ b/Adjust/examples/example-app-fbpixel/build.gradle @@ -35,4 +35,5 @@ dependencies { implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') + implementation 'com.adjust.signature:adjust-android-signature:3+' } diff --git a/Adjust/examples/example-app-java/build.gradle b/Adjust/examples/example-app-java/build.gradle index 31dcdb40d..868be5b75 100644 --- a/Adjust/examples/example-app-java/build.gradle +++ b/Adjust/examples/example-app-java/build.gradle @@ -38,4 +38,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.0.2' implementation project(':sdk-core') + implementation 'com.adjust.signature:adjust-android-signature:3+' } diff --git a/Adjust/examples/example-app-keyboard/build.gradle b/Adjust/examples/example-app-keyboard/build.gradle index 622c1d309..4e061fe26 100644 --- a/Adjust/examples/example-app-keyboard/build.gradle +++ b/Adjust/examples/example-app-keyboard/build.gradle @@ -38,4 +38,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.0.2' implementation project(':sdk-core') + implementation 'com.adjust.signature:adjust-android-signature:3+' } diff --git a/Adjust/examples/example-app-kotlin/build.gradle b/Adjust/examples/example-app-kotlin/build.gradle index c2d6fb129..171d2fbe4 100644 --- a/Adjust/examples/example-app-kotlin/build.gradle +++ b/Adjust/examples/example-app-kotlin/build.gradle @@ -35,4 +35,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.0.2' implementation project(':sdk-core') + implementation 'com.adjust.signature:adjust-android-signature:3+' } diff --git a/Adjust/examples/example-app-tv/build.gradle b/Adjust/examples/example-app-tv/build.gradle index 31dcdb40d..868be5b75 100755 --- a/Adjust/examples/example-app-tv/build.gradle +++ b/Adjust/examples/example-app-tv/build.gradle @@ -38,4 +38,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.0.2' implementation project(':sdk-core') + implementation 'com.adjust.signature:adjust-android-signature:3+' } diff --git a/Adjust/examples/example-app-webbridge/build.gradle b/Adjust/examples/example-app-webbridge/build.gradle index c681a5251..008555960 100644 --- a/Adjust/examples/example-app-webbridge/build.gradle +++ b/Adjust/examples/example-app-webbridge/build.gradle @@ -33,4 +33,5 @@ dependencies { implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') + implementation 'com.adjust.signature:adjust-android-signature:3+' } From ebd508106246514c368bfcca6c7215880082f0c0 Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 4 Sep 2024 00:33:39 +0200 Subject: [PATCH 271/540] test: add ability to test last deep link getter --- .../com/adjust/testapp/AdjustCommandExecutor.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 72ecc4f59..0682ffc05 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -31,6 +31,7 @@ import com.adjust.sdk.OnDeferredDeeplinkResponseListener; import com.adjust.sdk.OnEventTrackingFailedListener; import com.adjust.sdk.OnEventTrackingSucceededListener; +import com.adjust.sdk.OnLastDeeplinkReadListener; import com.adjust.sdk.OnPurchaseVerificationFinishedListener; import com.adjust.sdk.OnSessionTrackingFailedListener; import com.adjust.sdk.OnSessionTrackingSucceededListener; @@ -93,6 +94,7 @@ public void executeCommand(final Command sentCommand) { case "verifyTrack": verifyTrack(); break; case "processDeeplink" : processDeeplink(); break; case "attributionGetter" : attributionGetter(); break; + case "getLastDeeplink" : getLastDeeplink(); break; //case "testBegin": testBegin(); break; // case "testEnd": testEnd(); break; } @@ -883,6 +885,17 @@ private void attributionGetter() { }); } + private void getLastDeeplink() { + final String localBasePath = basePath; + Adjust.getLastDeeplink(context, new OnLastDeeplinkReadListener() { + @Override + public void onLastDeeplinkRead(Uri deeplink) { + MainActivity.testLibrary.addInfoToSend("last_deeplink", deeplink == null ? "" : deeplink.toString()); + MainActivity.testLibrary.sendInfoToServer(localBasePath); + } + }); + } + /* private void testBegin() { if (command.containsParameter("teardown")) { From 64aeee038658d9ea72f83e41855fcb852a600976 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 16 Sep 2024 08:29:22 +0200 Subject: [PATCH 272/540] fix: fix typo in suppress log level enum name --- .../java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 5 +---- .../sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/LogLevel.java | 2 +- .../main/java/com/adjust/testapp/AdjustCommandExecutor.java | 2 +- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 25b00196c..9c751fa64 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -1,10 +1,7 @@ package com.adjust.sdk.webbridge; -import android.annotation.TargetApi; import android.net.Uri; import android.os.Build; -import android.os.Bundle; -import android.app.Activity; import android.webkit.JavascriptInterface; import android.webkit.WebView; import android.app.Application; @@ -185,7 +182,7 @@ public void initSdk(String adjustConfigString) { } else if (logLevelString.equalsIgnoreCase(LOG_LEVEL_ASSERT)) { adjustConfig.setLogLevel(LogLevel.ASSERT); } else if (logLevelString.equalsIgnoreCase(LOG_LEVEL_SUPPRESS)) { - adjustConfig.setLogLevel(LogLevel.SUPRESS); + adjustConfig.setLogLevel(LogLevel.SUPPRESS); } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 2a1e06312..918d2f66a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -63,7 +63,7 @@ private void init(Context context, String appToken, String environment, boolean logger = AdjustFactory.getLogger(); // default values if (allowSuppressLogLevel && AdjustConfig.ENVIRONMENT_PRODUCTION.equals(environment)) { - setLogLevel(LogLevel.SUPRESS, environment); + setLogLevel(LogLevel.SUPPRESS, environment); } else { setLogLevel(LogLevel.INFO, environment); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/LogLevel.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/LogLevel.java index ea9a1eb23..82a88c5e1 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/LogLevel.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/LogLevel.java @@ -6,7 +6,7 @@ * Created by pfms on 11/03/15. */ public enum LogLevel { - VERBOSE(Log.VERBOSE), DEBUG(Log.DEBUG), INFO(Log.INFO), WARN(Log.WARN), ERROR(Log.ERROR), ASSERT(Log.ASSERT), SUPRESS(8); + VERBOSE(Log.VERBOSE), DEBUG(Log.DEBUG), INFO(Log.INFO), WARN(Log.WARN), ERROR(Log.ERROR), ASSERT(Log.ASSERT), SUPPRESS(8); final int androidLogLevel; LogLevel(final int androidLogLevel) { diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 0682ffc05..a22a1a51a 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -267,7 +267,7 @@ private void config() { break; case "assert": logLevel = LogLevel.ASSERT; break; - case "suppress": logLevel = LogLevel.SUPRESS; + case "suppress": logLevel = LogLevel.SUPPRESS; break; } Log.d("TestApp", logLevel.toString()); From 45ea746cc55ef0d12b638948cb53397a66b2aae9 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 16 Sep 2024 11:10:43 +0200 Subject: [PATCH 273/540] chore: remove post body print from the logs --- .../main/java/com/adjust/sdk/network/ActivityPackageSender.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index 69d0dbbef..59d9b0a40 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -417,8 +417,6 @@ private DataOutputStream configConnectionForPOST(final HttpsURLConnection connec sendingParameters, signedParameters); - logger.debug("Post body: %s", postBodyString); - if (postBodyString == null) { return null; } From d9ea414da781caa229c093879d88c1bd761e97c3 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 16 Sep 2024 11:11:50 +0200 Subject: [PATCH 274/540] chore: make request retry log message a bit clearer --- .../src/main/java/com/adjust/sdk/PackageHandler.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java index 02785193e..8f67ac6b0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java @@ -193,7 +193,10 @@ public void run() { totalWaitTimeSeconds += waitTimeSeconds; - logger.verbose("Waiting for %s seconds before retrying the %d time", secondsString, retries); + logger.verbose("Waiting for %s seconds before retrying %s for the %d time", + secondsString, + responseData.activityPackage.getActivityKind().toString(), + retries); scheduler.schedule(runnable, waitTimeMilliSeconds); responseData.activityPackage.setWaitBeforeSendTimeSeconds(responseData.activityPackage.getWaitBeforeSendTimeSeconds() + waitTimeSeconds); } From f80d7f22c2ee40570ba21533de6bd4b1bf742321 Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 4 Sep 2024 00:59:44 +0200 Subject: [PATCH 275/540] test: fix handling of value param in tps sharing options in web bridge command executor --- .../test-app-webbridge/src/main/assets/command_executor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index ba2f99b4b..698d45a9b 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -566,7 +566,7 @@ AdjustCommandExecutor.prototype.thirdPartySharing = function(params) { for (var i = 0; i < partnerSharingSettings.length; i = i + 3) { var partnerName = partnerSharingSettings[i]; var key = partnerSharingSettings[i + 1]; - var value = partnerSharingSettings[i + 2]; + var value = partnerSharingSettings[i + 2] == 'true'; adjustThirdPartySharing.addPartnerSharingSetting(partnerName, key, value); } } From 1e9441075ac1bb7b6311e6b5328d3425536d9aca Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 4 Sep 2024 01:00:04 +0200 Subject: [PATCH 276/540] refac: add input params type validation for certain public web bridge apis --- .../src/main/assets/adjust.js | 16 ++++++++++++++++ .../src/main/assets/adjust_event.js | 8 ++++++++ .../main/assets/adjust_third_party_sharing.js | 8 ++++++++ 3 files changed, 32 insertions(+) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 9c8dfc5de..421b50376 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -89,24 +89,40 @@ var Adjust = { addGlobalCallbackParameter: function(key, value) { if (AdjustBridge) { + if (typeof key !== 'string' || typeof value !== 'string') { + console.log('Passed key or value is not of string type'); + return; + } AdjustBridge.addGlobalCallbackParameter(key, value); } }, addGlobalPartnerParameter: function(key, value) { if (AdjustBridge) { + if (typeof key !== 'string' || typeof value !== 'string') { + console.log('Passed key or value is not of string type'); + return; + } AdjustBridge.addGlobalPartnerParameter(key, value); } }, removeGlobalCallbackParameter: function(key) { if (AdjustBridge) { + if (typeof key !== 'string') { + console.log('Passed key is not of string type'); + return; + } AdjustBridge.removeGlobalCallbackParameter(key); } }, removeGlobalPartnerParameter: function(key) { if (AdjustBridge) { + if (typeof key !== 'string') { + console.log('Passed key is not of string type'); + return; + } AdjustBridge.removeGlobalPartnerParameter(key); } }, diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_event.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_event.js index 190f05913..ff16c00fc 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_event.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_event.js @@ -14,11 +14,19 @@ AdjustEvent.prototype.setRevenue = function(revenue, currency) { }; AdjustEvent.prototype.addCallbackParameter = function(key, value) { + if (typeof key !== 'string' || typeof value !== 'string') { + console.log('Passed key or value is not of string type'); + return; + } this.callbackParameters.push(key); this.callbackParameters.push(value); }; AdjustEvent.prototype.addPartnerParameter = function(key, value) { + if (typeof key !== 'string' || typeof value !== 'string') { + console.log('Passed key or value is not of string type'); + return; + } this.partnerParameters.push(key); this.partnerParameters.push(value); }; diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_third_party_sharing.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_third_party_sharing.js index 2fd6b66ac..86df1a270 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_third_party_sharing.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_third_party_sharing.js @@ -5,12 +5,20 @@ function AdjustThirdPartySharing(isEnabled) { } AdjustThirdPartySharing.prototype.addGranularOption = function(partnerName, key, value) { + if (typeof partnerName !== 'string' || typeof key !== 'string' || typeof value !== 'string') { + console.log('Passed partnerName, key or value is not of string type'); + return; + } this.granularOptions.push(partnerName); this.granularOptions.push(key); this.granularOptions.push(value); }; AdjustThirdPartySharing.prototype.addPartnerSharingSetting = function(partnerName, key, value) { + if (typeof partnerName !== 'string' || typeof key !== 'string' || typeof value !== 'boolean') { + console.log('Passed partnerName or key is not of string type or value is not of boolean type'); + return; + } this.partnerSharingSettings.push(partnerName); this.partnerSharingSettings.push(key); this.partnerSharingSettings.push(value); From 8dbf138ba5ada40e8eb3c8b22f5200c903230f92 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 17 Sep 2024 10:24:56 +0200 Subject: [PATCH 277/540] refac: update log message to indicate its from Adjust --- .../sdk-plugin-webbridge/src/main/assets/adjust.js | 8 ++++---- .../sdk-plugin-webbridge/src/main/assets/adjust_event.js | 4 ++-- .../src/main/assets/adjust_third_party_sharing.js | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 421b50376..04bb5c983 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -90,7 +90,7 @@ var Adjust = { addGlobalCallbackParameter: function(key, value) { if (AdjustBridge) { if (typeof key !== 'string' || typeof value !== 'string') { - console.log('Passed key or value is not of string type'); + console.log('[Adjust]: Passed key or value is not of string type'); return; } AdjustBridge.addGlobalCallbackParameter(key, value); @@ -100,7 +100,7 @@ var Adjust = { addGlobalPartnerParameter: function(key, value) { if (AdjustBridge) { if (typeof key !== 'string' || typeof value !== 'string') { - console.log('Passed key or value is not of string type'); + console.log('[Adjust]: Passed key or value is not of string type'); return; } AdjustBridge.addGlobalPartnerParameter(key, value); @@ -110,7 +110,7 @@ var Adjust = { removeGlobalCallbackParameter: function(key) { if (AdjustBridge) { if (typeof key !== 'string') { - console.log('Passed key is not of string type'); + console.log('[Adjust]: Passed key is not of string type'); return; } AdjustBridge.removeGlobalCallbackParameter(key); @@ -120,7 +120,7 @@ var Adjust = { removeGlobalPartnerParameter: function(key) { if (AdjustBridge) { if (typeof key !== 'string') { - console.log('Passed key is not of string type'); + console.log('[Adjust]: Passed key is not of string type'); return; } AdjustBridge.removeGlobalPartnerParameter(key); diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_event.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_event.js index ff16c00fc..6a82d94ef 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_event.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_event.js @@ -15,7 +15,7 @@ AdjustEvent.prototype.setRevenue = function(revenue, currency) { AdjustEvent.prototype.addCallbackParameter = function(key, value) { if (typeof key !== 'string' || typeof value !== 'string') { - console.log('Passed key or value is not of string type'); + console.log('[Adjust]: Passed key or value is not of string type'); return; } this.callbackParameters.push(key); @@ -24,7 +24,7 @@ AdjustEvent.prototype.addCallbackParameter = function(key, value) { AdjustEvent.prototype.addPartnerParameter = function(key, value) { if (typeof key !== 'string' || typeof value !== 'string') { - console.log('Passed key or value is not of string type'); + console.log('[Adjust]: Passed key or value is not of string type'); return; } this.partnerParameters.push(key); diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_third_party_sharing.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_third_party_sharing.js index 86df1a270..210d0b730 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_third_party_sharing.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_third_party_sharing.js @@ -6,7 +6,7 @@ function AdjustThirdPartySharing(isEnabled) { AdjustThirdPartySharing.prototype.addGranularOption = function(partnerName, key, value) { if (typeof partnerName !== 'string' || typeof key !== 'string' || typeof value !== 'string') { - console.log('Passed partnerName, key or value is not of string type'); + console.log('[Adjust]: Passed partnerName, key or value is not of string type'); return; } this.granularOptions.push(partnerName); @@ -16,7 +16,7 @@ AdjustThirdPartySharing.prototype.addGranularOption = function(partnerName, key, AdjustThirdPartySharing.prototype.addPartnerSharingSetting = function(partnerName, key, value) { if (typeof partnerName !== 'string' || typeof key !== 'string' || typeof value !== 'boolean') { - console.log('Passed partnerName or key is not of string type or value is not of boolean type'); + console.log('[Adjust]: Passed partnerName or key is not of string type or value is not of boolean type'); return; } this.partnerSharingSettings.push(partnerName); From 38c64b7c9e29c0165b41cf4cbd854e3a970bd6aa Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 3 Sep 2024 12:06:23 +0200 Subject: [PATCH 278/540] refac: make setSendingReferrersAsNotSent calls from background thread --- .../src/main/java/com/adjust/sdk/AdjustInstance.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index f790053e9..55bb46468 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -4,6 +4,8 @@ import android.content.Context; import com.adjust.sdk.scheduler.AsyncTaskExecutor; +import com.adjust.sdk.scheduler.SingleThreadCachedScheduler; +import com.adjust.sdk.scheduler.ThreadExecutor; import java.util.List; import java.util.ArrayList; @@ -780,7 +782,8 @@ private String getCachedDeeplink(final Context context) { * @param context Application context */ private void setSendingReferrersAsNotSent(final Context context) { - SharedPreferencesManager.getDefaultInstance(context).setSendingReferrersAsNotSent(); + ThreadExecutor executor = new SingleThreadCachedScheduler("AdjustInstance"); + executor.submit(() -> SharedPreferencesManager.getDefaultInstance(context).setSendingReferrersAsNotSent()); } /** From bf69e7dc90e370ba5525c0cf99b1e81cd72ee2c9 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 18 Sep 2024 10:51:19 +0200 Subject: [PATCH 279/540] feat: update version number to 5.0.1 --- Adjust/build.gradle | 2 +- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-imei/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-oaid/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java | 2 +- VERSION | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 54ab560ce..cca3a075d 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 34 coreTargetSdkVersion = 34 - coreVersionName = '5.0.0' + coreVersionName = '5.0.1' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index 7b73ed803..a2cb7cb6e 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.0' + // implementation 'com.adjust.sdk:adjust-android:5.0.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index 998017363..55a929a39 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.0' + // implementation 'com.adjust.sdk:adjust-android:5.0.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index d323d77c1..f948e4811 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.0' + // implementation 'com.adjust.sdk:adjust-android:5.0.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index e31469172..06bfc4403 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.0' + // implementation 'com.adjust.sdk:adjust-android:5.0.1' implementation 'com.huawei.hms:ads-identifier:3.4.56.300' } diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index 9cdbec696..e1022308f 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.0' + // implementation 'com.adjust.sdk:adjust-android:5.0.1' // Add Samsung clouddev lib. compileOnly fileTree(include: ['*.aar'], dir: 'libs') diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index a5016793e..ee802c672 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.0' + // implementation 'com.adjust.sdk:adjust-android:5.0.1' // Add Samsung referrer lib via Maven. implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:3.0.1' diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index 4b371257c..4d3cc1a55 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.0' + // implementation 'com.adjust.sdk:adjust-android:5.0.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index 39812fca6..e8f306a70 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.0' + // implementation 'com.adjust.sdk:adjust-android:5.0.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 04bb5c983..68a0e3932 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -259,7 +259,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge5.0.0'; + return 'web-bridge5.0.1'; } }, diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index 221be585e..50e298e1e 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -31,7 +31,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.0' + // implementation 'com.adjust.sdk:adjust-android:5.0.1' // Add xiaomi referrer lib via Maven. implementation 'com.miui.referrer:homereferrer:1.0.0.6' diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 73acef793..537d060b0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -32,7 +32,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.0.0"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.0.1"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 6b3ff6050..1f53427f7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -37,7 +37,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android5.0.0"; + String CLIENT_SDK = "android5.0.1"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/VERSION b/VERSION index 0062ac971..6b244dcd6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.0.0 +5.0.1 From 2824b39d4361f83c68a8655106e2a26bf27492cb Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 18 Sep 2024 11:00:49 +0200 Subject: [PATCH 280/540] docs: update changelog --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 294640742..6836c8fc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +### Version 5.0.1 (18th September 2024) +#### Fixed +- Fixed ANR while reading referrer from Shared Preferences during SDK initialization. + +#### Changed +- Added input parameter validations in certain public Webbrdige APIs. +- Updated log messages to add more clarity and other improvements. + +--- + ### Version 5.0.0 (2nd August 2024) We're excited to release our major new SDK version (v5). Among many internal improvements, our spoofing protection solution is now included out of the box, reinforcing our commitment to accurate, actionable, and fraud-free data. From 7ec7f13c2fe5fa9dce4329d1065c57ca24764617 Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 18 Sep 2024 11:30:22 +0200 Subject: [PATCH 281/540] docs: update changelog --- CHANGELOG.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6836c8fc6..e22a438da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,11 @@ ### Version 5.0.1 (18th September 2024) #### Fixed -- Fixed ANR while reading referrer from Shared Preferences during SDK initialization. +- Fixed ANR while reading install referrer from Shared Preferences during SDK initialization. +- Fixed typo in `SUPPRESS` log level constant and renamed it from `SUPRESS to SUPPRESS` (https://github.com/adjust/android_sdk/issues/613). #### Changed -- Added input parameter validations in certain public Webbrdige APIs. -- Updated log messages to add more clarity and other improvements. +- Added validation when passing callback / partner parameters and third party sharing granular options / partner sharing setting parameters in web bridge. +- Updated some log messages to add more clarity. --- From a37a8b4159162659b1d1e6a31d245d54f0ff39f2 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 5 Dec 2024 19:15:57 +0100 Subject: [PATCH 282/540] feat: update signature version dependency --- Adjust/sdk-core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/build.gradle b/Adjust/sdk-core/build.gradle index 415eefce3..2955e3c5b 100644 --- a/Adjust/sdk-core/build.gradle +++ b/Adjust/sdk-core/build.gradle @@ -220,7 +220,7 @@ def customizePomForAar(pom) { dependency { groupId 'com.adjust.signature' artifactId 'adjust-android-signature' - version '[3.20.0, 4.0.0)' + version '3.35.0' scope 'compile' } } From 8cf85bcc924536e589948fb8d939bc79f423855c Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 5 Dec 2024 19:20:30 +0100 Subject: [PATCH 283/540] feat: update version number to 5.0.2 --- Adjust/build.gradle | 2 +- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-imei/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-oaid/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java | 2 +- VERSION | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index cca3a075d..cffb41c02 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 34 coreTargetSdkVersion = 34 - coreVersionName = '5.0.1' + coreVersionName = '5.0.2' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index a2cb7cb6e..7c51badb0 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.1' + // implementation 'com.adjust.sdk:adjust-android:5.0.2' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index 55a929a39..110e3d144 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.1' + // implementation 'com.adjust.sdk:adjust-android:5.0.2' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index f948e4811..29cc774f9 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.1' + // implementation 'com.adjust.sdk:adjust-android:5.0.2' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index 06bfc4403..0c070a726 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.1' + // implementation 'com.adjust.sdk:adjust-android:5.0.2' implementation 'com.huawei.hms:ads-identifier:3.4.56.300' } diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index e1022308f..e78086663 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.1' + // implementation 'com.adjust.sdk:adjust-android:5.0.2' // Add Samsung clouddev lib. compileOnly fileTree(include: ['*.aar'], dir: 'libs') diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index ee802c672..fbeda8e4c 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.1' + // implementation 'com.adjust.sdk:adjust-android:5.0.2' // Add Samsung referrer lib via Maven. implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:3.0.1' diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index 4d3cc1a55..8b4d4f902 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.1' + // implementation 'com.adjust.sdk:adjust-android:5.0.2' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index e8f306a70..dfd2c7eba 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.1' + // implementation 'com.adjust.sdk:adjust-android:5.0.2' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 68a0e3932..dfb615df6 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -259,7 +259,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge5.0.1'; + return 'web-bridge5.0.2'; } }, diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index 50e298e1e..fcc75c76e 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -31,7 +31,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.1' + // implementation 'com.adjust.sdk:adjust-android:5.0.2' // Add xiaomi referrer lib via Maven. implementation 'com.miui.referrer:homereferrer:1.0.0.6' diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 537d060b0..7d6b9fa63 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -32,7 +32,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.0.1"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.0.2"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 1f53427f7..a7ca156ea 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -37,7 +37,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android5.0.1"; + String CLIENT_SDK = "android5.0.2"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/VERSION b/VERSION index 6b244dcd6..a1ef0cae1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.0.1 +5.0.2 From 5bcec33c7a3269dc2d9a876cc9ad9f08ea4bd1ba Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 5 Dec 2024 21:30:36 +0100 Subject: [PATCH 284/540] docs: update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e22a438da..7b7dc36ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### Version 5.0.2 (5th December 2024) +#### Changed +- Switched to depending on a specific version of the signature library. + +--- + ### Version 5.0.1 (18th September 2024) #### Fixed - Fixed ANR while reading install referrer from Shared Preferences during SDK initialization. From bd88ccd020c6de4825825c8b59a4156ccca6e79e Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 14 Jan 2025 17:26:02 +0100 Subject: [PATCH 285/540] fix: catch any exception occurs when onActivityLifecycle callback invoked --- .../java/com/adjust/sdk/ActivityHandler.java | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 13aefc3f7..ec3b04db8 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -212,23 +212,28 @@ public boolean hasPreinstallBeenRead() { // region SystemLifecycleCallback @Override public void onActivityLifecycle(final boolean foregroundOrElseBackground) { - executor.submit(() -> { - if (internalState.foregroundOrElseBackground != null - && internalState.foregroundOrElseBackground.booleanValue() - == foregroundOrElseBackground) - { - return; - } - // received foregroundOrElseBackground is strictly different from internal state one + try { + executor.submit(() -> { + if (internalState.foregroundOrElseBackground != null + && internalState.foregroundOrElseBackground.booleanValue() + == foregroundOrElseBackground) { + return; + } + // received foregroundOrElseBackground is strictly different from internal state one - this.internalState.foregroundOrElseBackground = foregroundOrElseBackground; + this.internalState.foregroundOrElseBackground = foregroundOrElseBackground; - if (foregroundOrElseBackground) { - onResumeI(); - } else { - onPauseI(); + if (foregroundOrElseBackground) { + onResumeI(); + } else { + onPauseI(); + } + }); + } catch (Exception e) { + if (logger != null) { + logger.error("Exception while executing onActivityLifecycle task"); } - }); + } } // endregion From b05990faea4d8ebb06b35fe445eb9e41f7614da2 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 16 Jan 2025 14:07:24 +0100 Subject: [PATCH 286/540] fix: OnIsEnabledListener and OnDeeplinkResolvedListener the results posing on the UI thread --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index ec3b04db8..afa80f06d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -422,7 +422,7 @@ public boolean isEnabled() { @Override public void isEnabled(OnIsEnabledListener onIsEnabledListener) { - executor.submit(new Runnable() { + new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { @Override public void run() { onIsEnabledListener.onIsEnabledRead(isEnabledI()); @@ -451,7 +451,7 @@ public void run() { @Override public void processAndResolveDeeplink(final Uri url, final long clickTime, final OnDeeplinkResolvedListener callback) { this.cachedDeeplinkResolutionCallback = callback; - executor.submit(new Runnable() { + new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { @Override public void run() { processDeeplinkI(url, clickTime); From 5c5b344bd6201d8c66761482bb3fd5cd4a6d6f70 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 16 Jan 2025 14:33:29 +0100 Subject: [PATCH 287/540] fix: revert processDeeplinkI threading in to the background thread --- .../sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index afa80f06d..f2b95d049 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -451,7 +451,7 @@ public void run() { @Override public void processAndResolveDeeplink(final Uri url, final long clickTime, final OnDeeplinkResolvedListener callback) { this.cachedDeeplinkResolutionCallback = callback; - new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { + executor.submit(new Runnable() { @Override public void run() { processDeeplinkI(url, clickTime); From ec7ce89da140a3d9cbf7a760952cf0a24321396d Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 16 Jan 2025 15:15:21 +0100 Subject: [PATCH 288/540] fix: posting the result on ui thread and que on executor --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index f2b95d049..26eabdf0c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -422,11 +422,15 @@ public boolean isEnabled() { @Override public void isEnabled(OnIsEnabledListener onIsEnabledListener) { - new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { + executor.submit(new Runnable() { @Override public void run() { - onIsEnabledListener.onIsEnabledRead(isEnabledI()); - } + new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + onIsEnabledListener.onIsEnabledRead(isEnabledI()); + } + }); } }); } From 76e2287814d5cc862f1fa1e7354a94ec350c54f7 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 13 Jan 2025 15:18:14 +0100 Subject: [PATCH 289/540] feat: update compile and target sdk version to API 35 --- Adjust/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index cffb41c02..22a393caf 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -7,8 +7,8 @@ subprojects { ext { // Android config. coreMinSdkVersion = 21 - coreCompileSdkVersion = 34 - coreTargetSdkVersion = 34 + coreCompileSdkVersion = 35 + coreTargetSdkVersion = 35 coreVersionName = '5.0.2' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 From 8b36e5d31ec9b15928cbfaca8f89f9a535dd2958 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 13 Jan 2025 16:08:23 +0100 Subject: [PATCH 290/540] feat: update gradle version --- Adjust/build.gradle | 2 +- Adjust/gradle.properties | 1 - Adjust/gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 22a393caf..3e8f1767d 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -28,7 +28,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:8.1.4' + classpath 'com.android.tools.build:gradle:8.8.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files. diff --git a/Adjust/gradle.properties b/Adjust/gradle.properties index 4d0cdb1f3..2d406b76e 100644 --- a/Adjust/gradle.properties +++ b/Adjust/gradle.properties @@ -22,5 +22,4 @@ org.gradle.parallel=true org.gradle.configureondemand=true android.useAndroidX=true android.enableJetifier=true -android.defaults.buildfeatures.buildconfig=true android.enableR8.fullMode=false \ No newline at end of file diff --git a/Adjust/gradle/wrapper/gradle-wrapper.properties b/Adjust/gradle/wrapper/gradle-wrapper.properties index 353db86d0..1cd7404c4 100644 --- a/Adjust/gradle/wrapper/gradle-wrapper.properties +++ b/Adjust/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Oct 06 12:16:52 CEST 2023 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 3916956923aa27ac554868bc9577d206966881b8 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 13 Jan 2025 22:09:54 +0100 Subject: [PATCH 291/540] feat: update kotlin version --- Adjust/build.gradle | 2 +- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 3e8f1767d..420389d26 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -21,7 +21,7 @@ ext { } buildscript { - ext.kotlin_version = '1.7.10' + ext.kotlin_version = '2.1.0' repositories { mavenCentral() diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index 7c51badb0..974dff33d 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -9,7 +9,7 @@ repositories { } android { - compileSdkVersion rootProject.ext.coreCompileSdkVersion + compileSdk rootProject.ext.coreCompileSdkVersion publishing { multipleVariants { allVariants() diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index 29cc774f9..30b135325 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -9,7 +9,7 @@ repositories { } android { - compileSdkVersion rootProject.ext.coreCompileSdkVersion + compileSdk rootProject.ext.coreCompileSdkVersion publishing { multipleVariants { allVariants() diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index e78086663..0aa7834d4 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -9,7 +9,7 @@ repositories { } android { - compileSdkVersion rootProject.ext.coreCompileSdkVersion + compileSdk rootProject.ext.coreCompileSdkVersion publishing { multipleVariants { allVariants() diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index fbeda8e4c..97e6e5a8d 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -9,7 +9,7 @@ repositories { } android { - compileSdkVersion rootProject.ext.coreCompileSdkVersion + compileSdk rootProject.ext.coreCompileSdkVersion publishing { multipleVariants { allVariants() From c22dd50ea091664dcb83a662df77172b26f45f2b Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 13 Jan 2025 22:11:07 +0100 Subject: [PATCH 292/540] chore: update example apps compile and target sdk version --- Adjust/examples/example-app-fbpixel/build.gradle | 4 ++-- Adjust/examples/example-app-java/build.gradle | 4 ++-- Adjust/examples/example-app-keyboard/build.gradle | 4 ++-- Adjust/examples/example-app-kotlin/build.gradle | 9 +++++++-- Adjust/examples/example-app-tv/build.gradle | 4 ++-- Adjust/examples/example-app-webbridge/build.gradle | 4 ++-- 6 files changed, 17 insertions(+), 12 deletions(-) diff --git a/Adjust/examples/example-app-fbpixel/build.gradle b/Adjust/examples/example-app-fbpixel/build.gradle index 06281d56a..14f09f966 100644 --- a/Adjust/examples/example-app-fbpixel/build.gradle +++ b/Adjust/examples/example-app-fbpixel/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdk 34 + compileSdk 35 defaultConfig { applicationId "com.adjust.examples" minSdkVersion 21 - targetSdkVersion 34 + targetSdkVersion 35 versionCode 1 versionName "1.0" } diff --git a/Adjust/examples/example-app-java/build.gradle b/Adjust/examples/example-app-java/build.gradle index 868be5b75..e8dd00592 100644 --- a/Adjust/examples/example-app-java/build.gradle +++ b/Adjust/examples/example-app-java/build.gradle @@ -7,12 +7,12 @@ repositories { } android { - compileSdk 34 + compileSdk 35 defaultConfig { applicationId "com.adjust.examples" minSdkVersion 21 - targetSdkVersion 34 + targetSdkVersion 35 versionCode 1 versionName "1.0" } diff --git a/Adjust/examples/example-app-keyboard/build.gradle b/Adjust/examples/example-app-keyboard/build.gradle index 4e061fe26..fc5bea367 100644 --- a/Adjust/examples/example-app-keyboard/build.gradle +++ b/Adjust/examples/example-app-keyboard/build.gradle @@ -7,12 +7,12 @@ repositories { } android { - compileSdk 34 + compileSdk 35 defaultConfig { applicationId "com.adjust.examples.keyboard" minSdkVersion 21 - targetSdkVersion 34 + targetSdkVersion 35 versionCode 1 versionName "1.0" } diff --git a/Adjust/examples/example-app-kotlin/build.gradle b/Adjust/examples/example-app-kotlin/build.gradle index 171d2fbe4..9b3b1fdaa 100644 --- a/Adjust/examples/example-app-kotlin/build.gradle +++ b/Adjust/examples/example-app-kotlin/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' android { - compileSdk 34 + compileSdk 35 defaultConfig { applicationId "com.adjust.examples" minSdkVersion 21 - targetSdkVersion 34 + targetSdkVersion 35 versionCode 1 versionName "1.0" @@ -23,6 +23,11 @@ android { sourceCompatibility 1.8 targetCompatibility 1.8 } + + kotlinOptions { + jvmTarget = '1.8' + } + namespace 'com.adjust.examples' } diff --git a/Adjust/examples/example-app-tv/build.gradle b/Adjust/examples/example-app-tv/build.gradle index 868be5b75..e8dd00592 100755 --- a/Adjust/examples/example-app-tv/build.gradle +++ b/Adjust/examples/example-app-tv/build.gradle @@ -7,12 +7,12 @@ repositories { } android { - compileSdk 34 + compileSdk 35 defaultConfig { applicationId "com.adjust.examples" minSdkVersion 21 - targetSdkVersion 34 + targetSdkVersion 35 versionCode 1 versionName "1.0" } diff --git a/Adjust/examples/example-app-webbridge/build.gradle b/Adjust/examples/example-app-webbridge/build.gradle index 008555960..34f57b92f 100644 --- a/Adjust/examples/example-app-webbridge/build.gradle +++ b/Adjust/examples/example-app-webbridge/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdk 34 + compileSdk 35 defaultConfig { applicationId "com.example.examples" minSdkVersion 21 - targetSdkVersion 34 + targetSdkVersion 35 versionCode 1 versionName "1.0" } From 63b40e122916c17ad63dc6e63e067873618edc20 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 13 Jan 2025 22:32:56 +0100 Subject: [PATCH 293/540] feat: enable R8 --- Adjust/gradle.properties | 2 +- Adjust/sdk-core/proguard-rules.pro | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/gradle.properties b/Adjust/gradle.properties index 2d406b76e..666511cdf 100644 --- a/Adjust/gradle.properties +++ b/Adjust/gradle.properties @@ -22,4 +22,4 @@ org.gradle.parallel=true org.gradle.configureondemand=true android.useAndroidX=true android.enableJetifier=true -android.enableR8.fullMode=false \ No newline at end of file +android.enableR8.fullMode=true \ No newline at end of file diff --git a/Adjust/sdk-core/proguard-rules.pro b/Adjust/sdk-core/proguard-rules.pro index 85e1fa3e3..2f9427164 100644 --- a/Adjust/sdk-core/proguard-rules.pro +++ b/Adjust/sdk-core/proguard-rules.pro @@ -16,7 +16,7 @@ # public *; #} -keep public class com.adjust.sdk.** { *; } --keep class com.adjust.sdk.DeviceInfo** +-keep class com.adjust.sdk.** -keepclassmembers class com.adjust.sdk.DeviceInfo** {*;} -keep class com.google.android.gms.common.ConnectionResult { int SUCCESS; From e4ab3eb990d47042fb5374f53d02a01a2811a64c Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 15 Jan 2025 17:06:08 +0100 Subject: [PATCH 294/540] feat: update signature lib version to 3.35.2 --- Adjust/sdk-core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/build.gradle b/Adjust/sdk-core/build.gradle index 2955e3c5b..3179aec79 100644 --- a/Adjust/sdk-core/build.gradle +++ b/Adjust/sdk-core/build.gradle @@ -220,7 +220,7 @@ def customizePomForAar(pom) { dependency { groupId 'com.adjust.signature' artifactId 'adjust-android-signature' - version '3.35.0' + version '3.35.2' scope 'compile' } } From c62b9fd6fc0a646c590b0aeb51f965706967db6a Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 15 Jan 2025 11:03:47 +0100 Subject: [PATCH 295/540] feat: add jsonResponse to AdjustAttribution --- .../src/main/java/com/adjust/sdk/AdjustAttribution.java | 3 +++ Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java | 2 ++ 2 files changed, 5 insertions(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java index 229d1b2aa..6323d2b11 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustAttribution.java @@ -27,6 +27,7 @@ public class AdjustAttribution implements Serializable { new ObjectStreamField("costAmount", Double.class), new ObjectStreamField("costCurrency", String.class), new ObjectStreamField("fbInstallReferrer", String.class), + new ObjectStreamField("jsonResponse", String.class), }; public String trackerToken; @@ -40,6 +41,7 @@ public class AdjustAttribution implements Serializable { public Double costAmount; public String costCurrency; public String fbInstallReferrer; + public String jsonResponse; @Override public boolean equals(Object other) { @@ -76,6 +78,7 @@ public Map toMap() { if (costAmount != null) fields.put("costAmount", costAmount.toString()); if (costCurrency != null) fields.put("costCurrency", costCurrency); if (fbInstallReferrer != null) fields.put("fbInstallReferrer", fbInstallReferrer); + if (jsonResponse != null) fields.put("jsonResponse", jsonResponse); return fields; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index 6264fb8a3..d8f7f4b11 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -751,6 +751,8 @@ public static AdjustAttribution attributionFromJson(final JSONObject jsonObject, AdjustAttribution attribution = new AdjustAttribution(); + attribution.jsonResponse = jsonObject.toString(); + if ("unity".equals(sdkPlatform)) { // Unity platform. attribution.trackerToken = jsonObject.optString("tracker_token", ""); From 27cbc153345e42de42b45ed37a8fa1291c11af52 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 15 Jan 2025 11:52:43 +0100 Subject: [PATCH 296/540] feat: add jsonResponse to Attritubtion in webbridge --- .../src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java index e0c0f2b4a..99b54046a 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java @@ -141,6 +141,7 @@ public void run() { jsonAttribution.put("costAmount", attribution.costAmount == null || attribution.costAmount.isNaN() ? 0 : attribution.costAmount); jsonAttribution.put("costCurrency", attribution.costCurrency == null ? JSONObject.NULL : attribution.costCurrency); jsonAttribution.put("fbInstallReferrer", attribution.fbInstallReferrer == null ? JSONObject.NULL : attribution.fbInstallReferrer); + jsonAttribution.put("jsonResponse", attribution.jsonResponse == null ? JSONObject.NULL : attribution.jsonResponse); String command = "javascript:" + commandName + "(" + jsonAttribution.toString() + ");"; webView.loadUrl(command); From 5576d22d6a6ca5f26d868cc384cabc21f4735e9e Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 15 Jan 2025 11:53:45 +0100 Subject: [PATCH 297/540] chore: update example app webbridge --- .../src/main/assets/AdjustExample-WebView.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Adjust/examples/example-app-webbridge/src/main/assets/AdjustExample-WebView.html b/Adjust/examples/example-app-webbridge/src/main/assets/AdjustExample-WebView.html index 845ab2c2a..dc73ecadb 100755 --- a/Adjust/examples/example-app-webbridge/src/main/assets/AdjustExample-WebView.html +++ b/Adjust/examples/example-app-webbridge/src/main/assets/AdjustExample-WebView.html @@ -25,7 +25,8 @@

Adjust Web View SDK Demo 'Campaign = ' + attribution.campaign + '\n' + 'Adgroup = ' + attribution.adgroup + '\n' + 'Creative = ' + attribution.creative + '\n' + - 'Click label = ' + attribution.clickLabel); + 'Click label = ' + attribution.clickLabel + '\n' + + 'Json response = ' + attribution.jsonResponse); } function eventSuccessCallback(eventSuccess) { @@ -186,7 +187,8 @@

Adjust Web View SDK Demo 'Campaign = ' + attribution.campaign + '\n' + 'Adgroup = ' + attribution.adgroup + '\n' + 'Creative = ' + attribution.creative + '\n' + - 'Click label = ' + attribution.clickLabel); + 'Click label = ' + attribution.clickLabel + '\n' + + 'Json response = ' + attribution.jsonResponse); }); } } From ddb3321f6f81ec762793749a10513332e5dc03b2 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 16 Jan 2025 09:48:44 +0100 Subject: [PATCH 298/540] feat: update test to add json response in attribution --- .../main/java/com/adjust/testapp/AdjustCommandExecutor.java | 3 +++ .../test-app-webbridge/src/main/assets/command_executor.js | 2 ++ 2 files changed, 5 insertions(+) diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index a22a1a51a..ae3c83fcd 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -364,6 +364,7 @@ public void onAttributionChanged(AdjustAttribution attribution) { if (attribution.costAmount != null) fields.put("cost_amount", attribution.costAmount.toString()); if (attribution.costCurrency != null) fields.put("cost_currency", attribution.costCurrency); if (attribution.fbInstallReferrer != null) fields.put("fb_install_referrer", attribution.fbInstallReferrer); + if (attribution.jsonResponse != null) fields.put("jsonResponse", attribution.jsonResponse); MainActivity.testLibrary.setInfoToSend(fields); MainActivity.testLibrary.sendInfoToServer(localBasePath); } @@ -879,6 +880,8 @@ private void attributionGetter() { fields.put("cost_currency", attribution.costCurrency); if (attribution.fbInstallReferrer != null) fields.put("fb_install_referrer", attribution.fbInstallReferrer); + if (attribution.jsonResponse != null) + fields.put("jsonResponse", attribution.jsonResponse); MainActivity.testLibrary.setInfoToSend(fields); MainActivity.testLibrary.sendInfoToServer(basePath); diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index 698d45a9b..f1d489737 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -345,6 +345,7 @@ AdjustCommandExecutor.prototype.config = function(params) { TestLibrary.addInfoToSend("cost_amount", attribution.costAmount); TestLibrary.addInfoToSend("cost_currency", attribution.costCurrency); TestLibrary.addInfoToSend("fb_install_referrer", attribution.fbInstallReferrer); + TestLibrary.addInfoToSend("jsonResponse", attribution.jsonResponse); TestLibrary.sendInfoToServer(basePath); }); @@ -653,6 +654,7 @@ AdjustCommandExecutor.prototype.attributionGetter = function(params) { TestLibrary.addInfoToSend("cost_amount", attribution.costAmount); TestLibrary.addInfoToSend("cost_currency", attribution.costCurrency); TestLibrary.addInfoToSend("fb_install_referrer", attribution.fbInstallReferrer); + TestLibrary.addInfoToSend("jsonResponse", attribution.jsonResponse); TestLibrary.sendInfoToServer(basePath); }); From c00044ed9d4465f6bb680eb2d242b11692cb08c9 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 27 Jan 2025 17:16:51 +0100 Subject: [PATCH 299/540] refac: rename test_info key to align with test server attribution fields naming convention --- .../main/java/com/adjust/testapp/AdjustCommandExecutor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index ae3c83fcd..f95a91093 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -364,7 +364,7 @@ public void onAttributionChanged(AdjustAttribution attribution) { if (attribution.costAmount != null) fields.put("cost_amount", attribution.costAmount.toString()); if (attribution.costCurrency != null) fields.put("cost_currency", attribution.costCurrency); if (attribution.fbInstallReferrer != null) fields.put("fb_install_referrer", attribution.fbInstallReferrer); - if (attribution.jsonResponse != null) fields.put("jsonResponse", attribution.jsonResponse); + if (attribution.jsonResponse != null) fields.put("json_response", attribution.jsonResponse); MainActivity.testLibrary.setInfoToSend(fields); MainActivity.testLibrary.sendInfoToServer(localBasePath); } @@ -881,7 +881,7 @@ private void attributionGetter() { if (attribution.fbInstallReferrer != null) fields.put("fb_install_referrer", attribution.fbInstallReferrer); if (attribution.jsonResponse != null) - fields.put("jsonResponse", attribution.jsonResponse); + fields.put("json_response", attribution.jsonResponse); MainActivity.testLibrary.setInfoToSend(fields); MainActivity.testLibrary.sendInfoToServer(basePath); From fb20ae7b64c394cd7205ef6e5200bd186894865d Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 28 Jan 2025 09:10:21 +0100 Subject: [PATCH 300/540] refac: rename test_info key to align with test server attribution fields naming convention --- .../test-app-webbridge/src/main/assets/command_executor.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index f1d489737..767fd9c83 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -345,7 +345,7 @@ AdjustCommandExecutor.prototype.config = function(params) { TestLibrary.addInfoToSend("cost_amount", attribution.costAmount); TestLibrary.addInfoToSend("cost_currency", attribution.costCurrency); TestLibrary.addInfoToSend("fb_install_referrer", attribution.fbInstallReferrer); - TestLibrary.addInfoToSend("jsonResponse", attribution.jsonResponse); + TestLibrary.addInfoToSend("json_response", attribution.jsonResponse); TestLibrary.sendInfoToServer(basePath); }); @@ -654,7 +654,7 @@ AdjustCommandExecutor.prototype.attributionGetter = function(params) { TestLibrary.addInfoToSend("cost_amount", attribution.costAmount); TestLibrary.addInfoToSend("cost_currency", attribution.costCurrency); TestLibrary.addInfoToSend("fb_install_referrer", attribution.fbInstallReferrer); - TestLibrary.addInfoToSend("jsonResponse", attribution.jsonResponse); + TestLibrary.addInfoToSend("json_response", attribution.jsonResponse); TestLibrary.sendInfoToServer(basePath); }); From 1d7140e0af606f060e1380a707ada080a3794d5c Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 28 Jan 2025 09:12:46 +0100 Subject: [PATCH 301/540] feat: update version number to 5.1.0 --- Adjust/build.gradle | 2 +- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-imei/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-oaid/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java | 2 +- VERSION | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 420389d26..80e9bac8d 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 35 coreTargetSdkVersion = 35 - coreVersionName = '5.0.2' + coreVersionName = '5.1.0' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index 974dff33d..a0e6d90ba 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.2' + // implementation 'com.adjust.sdk:adjust-android:5.1.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index 110e3d144..bb79ba79d 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.2' + // implementation 'com.adjust.sdk:adjust-android:5.1.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index 30b135325..9a00c4644 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.2' + // implementation 'com.adjust.sdk:adjust-android:5.1.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index 0c070a726..1ab59e8f3 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.2' + // implementation 'com.adjust.sdk:adjust-android:5.1.0' implementation 'com.huawei.hms:ads-identifier:3.4.56.300' } diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index 0aa7834d4..b61142afa 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.2' + // implementation 'com.adjust.sdk:adjust-android:5.1.0' // Add Samsung clouddev lib. compileOnly fileTree(include: ['*.aar'], dir: 'libs') diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index 97e6e5a8d..5b13bba97 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.2' + // implementation 'com.adjust.sdk:adjust-android:5.1.0' // Add Samsung referrer lib via Maven. implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:3.0.1' diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index 8b4d4f902..09de5cbca 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.2' + // implementation 'com.adjust.sdk:adjust-android:5.1.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index dfd2c7eba..10d8efb5d 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.2' + // implementation 'com.adjust.sdk:adjust-android:5.1.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index dfb615df6..1089da05b 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -259,7 +259,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge5.0.2'; + return 'web-bridge5.1.0'; } }, diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index fcc75c76e..3fe1860f4 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -31,7 +31,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.0.2' + // implementation 'com.adjust.sdk:adjust-android:5.1.0' // Add xiaomi referrer lib via Maven. implementation 'com.miui.referrer:homereferrer:1.0.0.6' diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 7d6b9fa63..d745c3a3e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -32,7 +32,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.0.2"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.1.0"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index a7ca156ea..ed4c7e86e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -37,7 +37,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android5.0.2"; + String CLIENT_SDK = "android5.1.0"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/VERSION b/VERSION index a1ef0cae1..831446cbd 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.0.2 +5.1.0 From 5701ab4cd9d8e6a137ba7b4b0cec180e9f118b98 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 28 Jan 2025 09:27:22 +0100 Subject: [PATCH 302/540] refac: make jsonResponse in web bridge api to be a js object instead of string --- .../main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java | 2 +- .../test-app-webbridge/src/main/assets/command_executor.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java index 99b54046a..ea3c66654 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java @@ -141,7 +141,7 @@ public void run() { jsonAttribution.put("costAmount", attribution.costAmount == null || attribution.costAmount.isNaN() ? 0 : attribution.costAmount); jsonAttribution.put("costCurrency", attribution.costCurrency == null ? JSONObject.NULL : attribution.costCurrency); jsonAttribution.put("fbInstallReferrer", attribution.fbInstallReferrer == null ? JSONObject.NULL : attribution.fbInstallReferrer); - jsonAttribution.put("jsonResponse", attribution.jsonResponse == null ? JSONObject.NULL : attribution.jsonResponse); + jsonAttribution.put("jsonResponse", attribution.jsonResponse == null ? JSONObject.NULL : new JSONObject(attribution.jsonResponse)); String command = "javascript:" + commandName + "(" + jsonAttribution.toString() + ");"; webView.loadUrl(command); diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index 767fd9c83..b27607706 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -345,7 +345,7 @@ AdjustCommandExecutor.prototype.config = function(params) { TestLibrary.addInfoToSend("cost_amount", attribution.costAmount); TestLibrary.addInfoToSend("cost_currency", attribution.costCurrency); TestLibrary.addInfoToSend("fb_install_referrer", attribution.fbInstallReferrer); - TestLibrary.addInfoToSend("json_response", attribution.jsonResponse); + TestLibrary.addInfoToSend("json_response", JSON.stringify(attribution.jsonResponse)); TestLibrary.sendInfoToServer(basePath); }); @@ -654,7 +654,7 @@ AdjustCommandExecutor.prototype.attributionGetter = function(params) { TestLibrary.addInfoToSend("cost_amount", attribution.costAmount); TestLibrary.addInfoToSend("cost_currency", attribution.costCurrency); TestLibrary.addInfoToSend("fb_install_referrer", attribution.fbInstallReferrer); - TestLibrary.addInfoToSend("json_response", attribution.jsonResponse); + TestLibrary.addInfoToSend("json_response", JSON.stringify(attribution.jsonResponse)); TestLibrary.sendInfoToServer(basePath); }); From 89f69990bac4ff99f05f10e9b92250b3d65db26b Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 28 Jan 2025 09:28:47 +0100 Subject: [PATCH 303/540] docs: update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b7dc36ff..cadec0146 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### Version 5.1.0 (28th January 2025) +#### Added +- Added `jsonResponse` field (JSON string) to `AdjustAttribution` where every key-value pair sent by the backend as part of the attribution response can be found. Equivalently, one can also find `jsonResponse` field being part of the attribution instance in the web bridge API. + +--- + ### Version 5.0.2 (5th December 2024) #### Changed - Switched to depending on a specific version of the signature library. From 4d5656724fabb74d3b1fa648464b0e833f3a950b Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 28 Jan 2025 10:20:34 +0100 Subject: [PATCH 304/540] chore: update webbridge example app --- .../src/main/assets/AdjustExample-WebView.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/examples/example-app-webbridge/src/main/assets/AdjustExample-WebView.html b/Adjust/examples/example-app-webbridge/src/main/assets/AdjustExample-WebView.html index dc73ecadb..a9954282f 100755 --- a/Adjust/examples/example-app-webbridge/src/main/assets/AdjustExample-WebView.html +++ b/Adjust/examples/example-app-webbridge/src/main/assets/AdjustExample-WebView.html @@ -26,7 +26,7 @@

Adjust Web View SDK Demo 'Adgroup = ' + attribution.adgroup + '\n' + 'Creative = ' + attribution.creative + '\n' + 'Click label = ' + attribution.clickLabel + '\n' + - 'Json response = ' + attribution.jsonResponse); + 'Json response = ' + JSON.stringify(attribution.jsonResponse)); } function eventSuccessCallback(eventSuccess) { @@ -188,7 +188,7 @@

Adjust Web View SDK Demo 'Adgroup = ' + attribution.adgroup + '\n' + 'Creative = ' + attribution.creative + '\n' + 'Click label = ' + attribution.clickLabel + '\n' + - 'Json response = ' + attribution.jsonResponse); + 'Json response = ' + JSON.stringify(attribution.jsonResponse)); }); } } From 2dd75da02241d3d2381fa51113585441654ca27e Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 28 Jan 2025 10:26:02 +0100 Subject: [PATCH 305/540] docs: update changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cadec0146..ade3b2998 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ #### Added - Added `jsonResponse` field (JSON string) to `AdjustAttribution` where every key-value pair sent by the backend as part of the attribution response can be found. Equivalently, one can also find `jsonResponse` field being part of the attribution instance in the web bridge API. +#### Fixed +- Fixed occasional NPE occurrences when app was entering background (https://github.com/adjust/android_sdk/issues/630). + +#### Changed +- Updated Gradle version to 8.8.0. +- Updated the Adjust Signature library version to 3.35.2. +- Updated `isEnabled` listener to be invoked from the main thread. + --- ### Version 5.0.2 (5th December 2024) From 4d789500d86cc2af487a122b10616748dbcba5e9 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 5 Mar 2025 13:05:16 +0100 Subject: [PATCH 306/540] feat: update sent_at for each request --- .../java/com/adjust/sdk/AttributionHandler.java | 13 +------------ .../main/java/com/adjust/sdk/PackageHandler.java | 5 ----- .../com/adjust/sdk/PurchaseVerificationHandler.java | 3 --- .../main/java/com/adjust/sdk/SdkClickHandler.java | 5 ----- .../adjust/sdk/network/ActivityPackageSender.java | 9 +++++++++ 5 files changed, 10 insertions(+), 25 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java index bc5b4539c..b7e2849bd 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java @@ -234,7 +234,7 @@ private void sendAttributionRequestI() { ActivityPackage attributionPackage = buildAndGetAttributionPackage(activityHandlerWeakRef.get().getInternalState()); logger.verbose("%s", attributionPackage.getExtendedString()); - Map sendingParameters = generateSendingParametersI(); + Map sendingParameters = new HashMap<>(); activityPackageSender.sendActivityPackage( attributionPackage, @@ -242,17 +242,6 @@ private void sendAttributionRequestI() { this); } - private Map generateSendingParametersI() { - HashMap sendingParameters = new HashMap<>(); - - long now = System.currentTimeMillis(); - String dateString = Util.dateFormatter.format(now); - - PackageBuilder.addString(sendingParameters, "sent_at", dateString); - - return sendingParameters; - } - private ActivityPackage buildAndGetAttributionPackage(ActivityHandler.InternalState internalState) { long now = System.currentTimeMillis(); IActivityHandler activityHandler = activityHandlerWeakRef.get(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java index 8f67ac6b0..62b8cc7eb 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java @@ -277,11 +277,6 @@ private void sendFirstI() { private Map generateSendingParametersI() { HashMap sendingParameters = new HashMap<>(); - long now = System.currentTimeMillis(); - String dateString = Util.dateFormatter.format(now); - - PackageBuilder.addString(sendingParameters, "sent_at", dateString); - int queueSize = packageQueue.size() - 1; if (queueSize > 0) { PackageBuilder.addLong(sendingParameters, "queue_size", queueSize); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PurchaseVerificationHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PurchaseVerificationHandler.java index 76fd397bf..f470eb580 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PurchaseVerificationHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PurchaseVerificationHandler.java @@ -238,9 +238,6 @@ private void sendPurchaseVerificationPackageI(final ActivityPackage purchaseVeri } private Map generateSendingParametersI() { HashMap sendingParameters = new HashMap<>(); - long now = System.currentTimeMillis(); - String dateString = Util.dateFormatter.format(now); - PackageBuilder.addString(sendingParameters, "sent_at", dateString); int queueSize = packageQueue.size() - 1; if (queueSize > 0) { PackageBuilder.addLong(sendingParameters, "queue_size", queueSize); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java index fa604a802..0e4813cfe 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -421,11 +421,6 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { private Map generateSendingParametersI() { HashMap sendingParameters = new HashMap<>(); - long now = System.currentTimeMillis(); - String dateString = Util.dateFormatter.format(now); - - PackageBuilder.addString(sendingParameters, "sent_at", dateString); - int queueSize = packageQueue.size() - 1; if (queueSize > 0) { PackageBuilder.addLong(sendingParameters, "queue_size", queueSize); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index 59d9b0a40..9b7e0c2a5 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -106,6 +106,8 @@ public ResponseData sendActivityPackageSync(final ActivityPackage activityPackag boolean retryToSend; ResponseData responseData; do { + updateSendingParameters(sendingParameters); + Map signedParameters = signParameters(activityPackage, sendingParameters); responseData = @@ -119,6 +121,13 @@ public ResponseData sendActivityPackageSync(final ActivityPackage activityPackag return responseData; } + private void updateSendingParameters(Map sendingParameters) { + long now = System.currentTimeMillis(); + String dateString = Util.dateFormatter.format(now); + PackageBuilder.addString(sendingParameters, "sent_at", dateString); + logger.debug("Adding sent_at: " + dateString); + } + private Map signParameters(final ActivityPackage activityPackage, final Map sendingParameters) { Map packageParams = new HashMap<>(activityPackage.getParameters()); From 47bf0a79d85bf54756f0e6f6614a91cce378464a Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 5 Mar 2025 13:06:23 +0100 Subject: [PATCH 307/540] chore: remove debug logging --- .../main/java/com/adjust/sdk/network/ActivityPackageSender.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index 9b7e0c2a5..e0d059e10 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -125,7 +125,6 @@ private void updateSendingParameters(Map sendingParameters) { long now = System.currentTimeMillis(); String dateString = Util.dateFormatter.format(now); PackageBuilder.addString(sendingParameters, "sent_at", dateString); - logger.debug("Adding sent_at: " + dateString); } private Map signParameters(final ActivityPackage activityPackage, From 8cb9b6938e6003dd026aec61bd24fdc3c6421d77 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 13 Mar 2025 09:21:09 +0100 Subject: [PATCH 308/540] refac: add sendingParameters null checks down the pipeline --- .../com/adjust/sdk/AttributionHandler.java | 4 +- .../java/com/adjust/sdk/PackageBuilder.java | 39 +++++++++++++++++++ .../sdk/network/ActivityPackageSender.java | 4 +- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java index b7e2849bd..132fef0b7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java @@ -234,11 +234,9 @@ private void sendAttributionRequestI() { ActivityPackage attributionPackage = buildAndGetAttributionPackage(activityHandlerWeakRef.get().getInternalState()); logger.verbose("%s", attributionPackage.getExtendedString()); - Map sendingParameters = new HashMap<>(); - activityPackageSender.sendActivityPackage( attributionPackage, - sendingParameters, + null, this); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index ca555a3ca..234e56306 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -1247,6 +1247,9 @@ private void injectFeatureFlagsWithParameters(Map parameters) { } public static void addString(Map parameters, String key, String value) { + if (parameters == null) { + return; + } if (TextUtils.isEmpty(value)) { return; } @@ -1254,6 +1257,9 @@ public static void addString(Map parameters, String key, String } public static void addBoolean(Map parameters, String key, Boolean value) { + if (parameters == null) { + return; + } if (value == null) { return; } @@ -1262,6 +1268,9 @@ public static void addBoolean(Map parameters, String key, Boolea } static void addJsonObject(Map parameters, String key, JSONObject jsonObject) { + if (parameters == null) { + return; + } if (jsonObject == null) { return; } @@ -1270,6 +1279,9 @@ static void addJsonObject(Map parameters, String key, JSONObject } static void addMapJson(Map parameters, String key, Map map) { + if (parameters == null) { + return; + } if (map == null) { return; } @@ -1283,6 +1295,9 @@ static void addMapJson(Map parameters, String key, Map map) { } public static void addLong(Map parameters, String key, long value) { + if (parameters == null) { + return; + } if (value < 0) { return; } @@ -1291,6 +1306,9 @@ public static void addLong(Map parameters, String key, long valu } public static void addDouble(Map parameters, String key, double value) { + if (parameters == null) { + return; + } if (value < 0.0) { return; } @@ -1299,6 +1317,9 @@ public static void addDouble(Map parameters, String key, double } private static void addDateInMilliseconds(Map parameters, String key, long value) { + if (parameters == null) { + return; + } if (value <= 0) { return; } @@ -1307,6 +1328,9 @@ private static void addDateInMilliseconds(Map parameters, String } private static void addDateInSeconds(Map parameters, String key, long value) { + if (parameters == null) { + return; + } if (value <= 0) { return; } @@ -1315,6 +1339,9 @@ private static void addDateInSeconds(Map parameters, String key, } private static void addDate(Map parameters, String key, Date value) { + if (parameters == null) { + return; + } if (value == null) { return; } @@ -1323,6 +1350,9 @@ private static void addDate(Map parameters, String key, Date val } private static void addDuration(Map parameters, String key, long durationInMilliSeconds) { + if (parameters == null) { + return; + } if (durationInMilliSeconds < 0) { return; } @@ -1331,6 +1361,9 @@ private static void addDuration(Map parameters, String key, long } private static void addDouble(Map parameters, String key, Double value) { + if (parameters == null) { + return; + } if (value == null) { return; } @@ -1339,6 +1372,9 @@ private static void addDouble(Map parameters, String key, Double } private static void addDoubleWithoutRounding(Map parameters, String key, Double value) { + if (parameters == null) { + return; + } if (value == null) { return; } @@ -1347,6 +1383,9 @@ private static void addDoubleWithoutRounding(Map parameters, Str } private static void addInteger(Map parameters, String key, Integer value) { + if (parameters == null) { + return; + } if (value == null) { return; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index e0d059e10..c3c70f1de 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -130,7 +130,9 @@ private void updateSendingParameters(Map sendingParameters) { private Map signParameters(final ActivityPackage activityPackage, final Map sendingParameters) { Map packageParams = new HashMap<>(activityPackage.getParameters()); - packageParams.putAll(sendingParameters); + if (sendingParameters != null) { + packageParams.putAll(sendingParameters); + } Map extraParams = new HashMap<>(); From 96174c8e22194773e48caceb348ba860982c5e86 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 13 Mar 2025 10:23:23 +0100 Subject: [PATCH 309/540] feat: refactor `updatedSendingParameters` method --- .../adjust/sdk/network/ActivityPackageSender.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index c3c70f1de..2fec45dd4 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -106,12 +106,12 @@ public ResponseData sendActivityPackageSync(final ActivityPackage activityPackag boolean retryToSend; ResponseData responseData; do { - updateSendingParameters(sendingParameters); + Map updatedSendingParameters = updateSendingParameters(sendingParameters); - Map signedParameters = signParameters(activityPackage, sendingParameters); + Map signedParameters = signParameters(activityPackage, updatedSendingParameters); responseData = - ResponseData.buildResponseData(activityPackage, sendingParameters, signedParameters); + ResponseData.buildResponseData(activityPackage, updatedSendingParameters, signedParameters); tryToGetResponse(responseData); @@ -121,10 +121,15 @@ public ResponseData sendActivityPackageSync(final ActivityPackage activityPackag return responseData; } - private void updateSendingParameters(Map sendingParameters) { + private Map updateSendingParameters(Map sendingParameters) { + Map updatedSendingParameters = sendingParameters; + if (updatedSendingParameters == null) { + updatedSendingParameters = new HashMap(); + } long now = System.currentTimeMillis(); String dateString = Util.dateFormatter.format(now); - PackageBuilder.addString(sendingParameters, "sent_at", dateString); + PackageBuilder.addString(updatedSendingParameters, "sent_at", dateString); + return updatedSendingParameters; } private Map signParameters(final ActivityPackage activityPackage, From a1fbfba99c92cd7de09a4a3fdfceab4597cf5353 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 19 Feb 2025 13:33:04 +0100 Subject: [PATCH 310/540] feat: add organic search referrer --- .../java/com/adjust/sdk/ActivityHandler.java | 14 ++++++++------ .../main/java/com/adjust/sdk/AdjustDeeplink.java | 9 +++++++++ .../main/java/com/adjust/sdk/AdjustInstance.java | 10 +++++----- .../java/com/adjust/sdk/IActivityHandler.java | 4 ++-- .../main/java/com/adjust/sdk/PackageFactory.java | 2 ++ .../com/adjust/sdk/SharedPreferencesManager.java | 16 ++++++++++++++-- 6 files changed, 40 insertions(+), 15 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 26eabdf0c..b412121a7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -443,22 +443,22 @@ private boolean isEnabledI() { } @Override - public void processDeeplink(final Uri url, final long clickTime) { + public void processDeeplink(final Uri url, String referrer, final long clickTime) { executor.submit(new Runnable() { @Override public void run() { - processDeeplinkI(url, clickTime); + processDeeplinkI(url, referrer, clickTime); } }); } @Override - public void processAndResolveDeeplink(final Uri url, final long clickTime, final OnDeeplinkResolvedListener callback) { + public void processAndResolveDeeplink(final Uri url, final String referrer, final long clickTime, final OnDeeplinkResolvedListener callback) { this.cachedDeeplinkResolutionCallback = callback; executor.submit(new Runnable() { @Override public void run() { - processDeeplinkI(url, clickTime); + processDeeplinkI(url, referrer, clickTime); } }); } @@ -1540,6 +1540,7 @@ private void processCachedDeeplinkI() { SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(getContext()); String cachedDeeplinkUrl = sharedPreferencesManager.getDeeplinkUrl(); + String cachedDeeplinkReferrer = sharedPreferencesManager.getDeeplinkReferrer(); long cachedDeeplinkClickTime = sharedPreferencesManager.getDeeplinkClickTime(); if (cachedDeeplinkUrl == null) { @@ -1549,7 +1550,7 @@ private void processCachedDeeplinkI() { return; } - processDeeplink(Uri.parse(cachedDeeplinkUrl), cachedDeeplinkClickTime); + processDeeplink(Uri.parse(cachedDeeplinkUrl), cachedDeeplinkReferrer, cachedDeeplinkClickTime); sharedPreferencesManager.removeDeeplink(); } @@ -2110,7 +2111,7 @@ private boolean isValidReferrerDetails(final ReferrerDetails referrerDetails) { return referrerDetails.installReferrer.length() != 0; } - private void processDeeplinkI(Uri url, long clickTime) { + private void processDeeplinkI(Uri url, String referrer, long clickTime) { if (!isEnabledI()) { return; } @@ -2122,6 +2123,7 @@ private void processDeeplinkI(Uri url, long clickTime) { ActivityPackage sdkClickPackage = PackageFactory.buildDeeplinkSdkClickPackage( url, + referrer, clickTime, activityState, adjustConfig, diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustDeeplink.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustDeeplink.java index 85d049e0b..968d4e2dc 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustDeeplink.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustDeeplink.java @@ -4,6 +4,7 @@ public class AdjustDeeplink { Uri url; + String referrer; public AdjustDeeplink(Uri url) { this.url = url; @@ -16,7 +17,15 @@ public boolean isValid() { return true; } + public void setReferrer(String referrer) { + this.referrer = referrer; + } + public Uri getUrl() { return url; } + + public String getReferrer() { + return referrer; + } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 55bb46468..ff53674d0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -209,11 +209,11 @@ public void processDeeplink(final AdjustDeeplink adjustDeeplink, final Context c long clickTime = System.currentTimeMillis(); if (!checkActivityHandler("processDeeplink", true)) { - saveDeeplink(adjustDeeplink.url, clickTime, context); + saveDeeplink(adjustDeeplink, clickTime, context); return; } - activityHandler.processDeeplink(adjustDeeplink.url, clickTime); + activityHandler.processDeeplink(adjustDeeplink.url, adjustDeeplink.referrer, clickTime); } /** @@ -242,13 +242,13 @@ public void processAndResolveDeeplink(AdjustDeeplink adjustDeeplink, Context con // if deeplink processing is triggered prior to SDK being initialized long clickTime = System.currentTimeMillis(); if (!checkActivityHandler("processAndResolveDeeplink", true)) { - saveDeeplink(adjustDeeplink.url, clickTime, context); + saveDeeplink(adjustDeeplink, clickTime, context); this.cachedDeeplinkResolutionCallback = callback; return; } // if deeplink processing was triggered with SDK being initialized - activityHandler.processAndResolveDeeplink(adjustDeeplink.url, clickTime, callback); + activityHandler.processAndResolveDeeplink(adjustDeeplink.url, adjustDeeplink.referrer, clickTime, callback); } /** @@ -753,7 +753,7 @@ private void saveGdprForgetMe(final Context context) { * @param clickTime Time when processDeeplink(Uri, Context) method was called * @param context Application context */ - private void saveDeeplink(final Uri deeplink, final long clickTime, final Context context) { + private void saveDeeplink(final AdjustDeeplink deeplink, final long clickTime, final Context context) { SharedPreferencesManager.getDefaultInstance(context).saveDeeplink(deeplink, clickTime); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 8d5b925da..e5656bb99 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -22,9 +22,9 @@ public interface IActivityHandler { boolean isEnabled(); void isEnabled(OnIsEnabledListener onIsEnabledListener); - void processDeeplink(Uri url, long clickTime); + void processDeeplink(Uri url, String referrer, long clickTime); - void processAndResolveDeeplink(Uri url, long clickTime, OnDeeplinkResolvedListener callback); + void processAndResolveDeeplink(Uri url, String referrer, long clickTime, OnDeeplinkResolvedListener callback); boolean updateAttributionI(AdjustAttribution attribution); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java index 84e124186..227f6e289 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java @@ -74,6 +74,7 @@ public static ActivityPackage buildReftagSdkClickPackage(final String rawReferre } public static ActivityPackage buildDeeplinkSdkClickPackage(final Uri url, + final String referrer, final long clickTime, final ActivityState activityState, final AdjustConfig adjustConfig, @@ -125,6 +126,7 @@ public static ActivityPackage buildDeeplinkSdkClickPackage(final Uri url, } clickPackageBuilder.deeplink = url.toString(); + clickPackageBuilder.referrer = referrer; clickPackageBuilder.clickTimeInMilliseconds = clickTime; ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.DEEPLINK); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java index 2986ec25d..2c3dedf4b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -40,6 +40,8 @@ public class SharedPreferencesManager { private static final String PREFS_KEY_DEEPLINK_URL = "deeplink_url"; + private static final String PREFS_KEY_DEEPLINK_REFERRER = "deeplink_referrer"; + private static final String PREFS_KEY_DEEPLINK_CLICK_TIME = "deeplink_click_time"; private static final String PREFS_KEY_DEEPLINK_URL_CACHED = "deeplink_url_cached"; @@ -374,12 +376,17 @@ public synchronized void removeGdprForgetMe() { remove(PREFS_KEY_GDPR_FORGET_ME); } - public synchronized void saveDeeplink(final Uri deeplink, final long clickTime) { + public synchronized void saveDeeplink(final AdjustDeeplink deeplink, final long clickTime) { if (deeplink == null) { return; } - saveString(PREFS_KEY_DEEPLINK_URL, deeplink.toString()); + if (deeplink.url == null) { + return; + } + + saveString(PREFS_KEY_DEEPLINK_URL, deeplink.url.toString()); + saveString(PREFS_KEY_DEEPLINK_REFERRER, deeplink.referrer); saveLong(PREFS_KEY_DEEPLINK_CLICK_TIME, clickTime); } @@ -387,12 +394,17 @@ public synchronized String getDeeplinkUrl() { return getString(PREFS_KEY_DEEPLINK_URL); } + public synchronized String getDeeplinkReferrer() { + return getString(PREFS_KEY_DEEPLINK_REFERRER); + } + public synchronized long getDeeplinkClickTime() { return getLong(PREFS_KEY_DEEPLINK_CLICK_TIME, -1); } public synchronized void removeDeeplink() { remove(PREFS_KEY_DEEPLINK_URL); + remove(PREFS_KEY_DEEPLINK_REFERRER); remove(PREFS_KEY_DEEPLINK_CLICK_TIME); } From 9b7465c061b516db68dffc9d80b1323ba32afc8c Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 21 Feb 2025 16:28:56 +0100 Subject: [PATCH 311/540] test: add referrer in deeplink test --- .../main/java/com/adjust/testapp/AdjustCommandExecutor.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index f95a91093..8b87b1370 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -655,8 +655,11 @@ private void teardown() throws NullPointerException { */ private void openDeeplink() { String deeplink = command.getFirstParameterValue("deeplink"); + String referrer = command.getFirstParameterValue("referrer"); AdjustDeeplink adjustDeeplink = new AdjustDeeplink(Uri.parse(deeplink)); + adjustDeeplink.setReferrer(referrer); + Adjust.processDeeplink(adjustDeeplink, this.context); } From e5e962b759c5107f4ec997a22e59c948c2abee2b Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 3 Mar 2025 13:13:13 +0100 Subject: [PATCH 312/540] feat: update referrer type to Uri --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 8 ++++---- .../src/main/java/com/adjust/sdk/AdjustDeeplink.java | 6 +++--- .../src/main/java/com/adjust/sdk/IActivityHandler.java | 4 ++-- .../src/main/java/com/adjust/sdk/PackageFactory.java | 7 +++++-- .../java/com/adjust/sdk/SharedPreferencesManager.java | 5 ++++- .../java/com/adjust/testapp/AdjustCommandExecutor.java | 2 +- 6 files changed, 19 insertions(+), 13 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index b412121a7..52ec71f30 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -443,7 +443,7 @@ private boolean isEnabledI() { } @Override - public void processDeeplink(final Uri url, String referrer, final long clickTime) { + public void processDeeplink(final Uri url, Uri referrer, final long clickTime) { executor.submit(new Runnable() { @Override public void run() { @@ -453,7 +453,7 @@ public void run() { } @Override - public void processAndResolveDeeplink(final Uri url, final String referrer, final long clickTime, final OnDeeplinkResolvedListener callback) { + public void processAndResolveDeeplink(final Uri url, final Uri referrer, final long clickTime, final OnDeeplinkResolvedListener callback) { this.cachedDeeplinkResolutionCallback = callback; executor.submit(new Runnable() { @Override @@ -1550,7 +1550,7 @@ private void processCachedDeeplinkI() { return; } - processDeeplink(Uri.parse(cachedDeeplinkUrl), cachedDeeplinkReferrer, cachedDeeplinkClickTime); + processDeeplink(Uri.parse(cachedDeeplinkUrl), Uri.parse(cachedDeeplinkReferrer), cachedDeeplinkClickTime); sharedPreferencesManager.removeDeeplink(); } @@ -2111,7 +2111,7 @@ private boolean isValidReferrerDetails(final ReferrerDetails referrerDetails) { return referrerDetails.installReferrer.length() != 0; } - private void processDeeplinkI(Uri url, String referrer, long clickTime) { + private void processDeeplinkI(Uri url, Uri referrer, long clickTime) { if (!isEnabledI()) { return; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustDeeplink.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustDeeplink.java index 968d4e2dc..c10e0f4ce 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustDeeplink.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustDeeplink.java @@ -4,7 +4,7 @@ public class AdjustDeeplink { Uri url; - String referrer; + Uri referrer; public AdjustDeeplink(Uri url) { this.url = url; @@ -17,7 +17,7 @@ public boolean isValid() { return true; } - public void setReferrer(String referrer) { + public void setReferrer(Uri referrer) { this.referrer = referrer; } @@ -25,7 +25,7 @@ public Uri getUrl() { return url; } - public String getReferrer() { + public Uri getReferrer() { return referrer; } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index e5656bb99..6e75e1534 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -22,9 +22,9 @@ public interface IActivityHandler { boolean isEnabled(); void isEnabled(OnIsEnabledListener onIsEnabledListener); - void processDeeplink(Uri url, String referrer, long clickTime); + void processDeeplink(Uri url, Uri referrer, long clickTime); - void processAndResolveDeeplink(Uri url, String referrer, long clickTime, OnDeeplinkResolvedListener callback); + void processAndResolveDeeplink(Uri url, Uri referrer, long clickTime, OnDeeplinkResolvedListener callback); boolean updateAttributionI(AdjustAttribution attribution); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java index 227f6e289..21495cfa5 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java @@ -74,7 +74,7 @@ public static ActivityPackage buildReftagSdkClickPackage(final String rawReferre } public static ActivityPackage buildDeeplinkSdkClickPackage(final Uri url, - final String referrer, + final Uri referrer, final long clickTime, final ActivityState activityState, final AdjustConfig adjustConfig, @@ -126,9 +126,12 @@ public static ActivityPackage buildDeeplinkSdkClickPackage(final Uri url, } clickPackageBuilder.deeplink = url.toString(); - clickPackageBuilder.referrer = referrer; clickPackageBuilder.clickTimeInMilliseconds = clickTime; + if (referrer != null) { + clickPackageBuilder.referrer = referrer.toString(); + } + ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.DEEPLINK); return clickPackage; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java index 2c3dedf4b..89dd246e7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -386,8 +386,11 @@ public synchronized void saveDeeplink(final AdjustDeeplink deeplink, final long } saveString(PREFS_KEY_DEEPLINK_URL, deeplink.url.toString()); - saveString(PREFS_KEY_DEEPLINK_REFERRER, deeplink.referrer); saveLong(PREFS_KEY_DEEPLINK_CLICK_TIME, clickTime); + + if (deeplink.referrer != null) { + saveString(PREFS_KEY_DEEPLINK_REFERRER, deeplink.referrer.toString()); + } } public synchronized String getDeeplinkUrl() { diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 8b87b1370..8d97d1135 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -658,7 +658,7 @@ private void openDeeplink() { String referrer = command.getFirstParameterValue("referrer"); AdjustDeeplink adjustDeeplink = new AdjustDeeplink(Uri.parse(deeplink)); - adjustDeeplink.setReferrer(referrer); + adjustDeeplink.setReferrer(Uri.parse(referrer)); Adjust.processDeeplink(adjustDeeplink, this.context); } From 9bca80ba3cd5300945d3e03b5d0b2679d6f057f0 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 13 Mar 2025 11:56:38 +0100 Subject: [PATCH 313/540] fix: check referrer presence in command executor --- .../main/java/com/adjust/testapp/AdjustCommandExecutor.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 8d97d1135..88c712093 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -658,7 +658,9 @@ private void openDeeplink() { String referrer = command.getFirstParameterValue("referrer"); AdjustDeeplink adjustDeeplink = new AdjustDeeplink(Uri.parse(deeplink)); - adjustDeeplink.setReferrer(Uri.parse(referrer)); + if (referrer != null) { + adjustDeeplink.setReferrer(Uri.parse(referrer)); + } Adjust.processDeeplink(adjustDeeplink, this.context); } From 0140056ca3c7ff2f54f5d3c8c0af56f7a4be79ea Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 13 Mar 2025 12:58:37 +0100 Subject: [PATCH 314/540] refac: use AdjustDeeplink throughout instead of separate Uri instances --- .../java/com/adjust/sdk/ActivityHandler.java | 29 ++++++++++++------- .../java/com/adjust/sdk/AdjustInstance.java | 4 +-- .../java/com/adjust/sdk/IActivityHandler.java | 4 +-- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 52ec71f30..c41a1f2f9 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -443,22 +443,24 @@ private boolean isEnabledI() { } @Override - public void processDeeplink(final Uri url, Uri referrer, final long clickTime) { + public void processDeeplink(final AdjustDeeplink deeplink, final long clickTime) { executor.submit(new Runnable() { @Override public void run() { - processDeeplinkI(url, referrer, clickTime); + processDeeplinkI(deeplink, clickTime); } }); } @Override - public void processAndResolveDeeplink(final Uri url, final Uri referrer, final long clickTime, final OnDeeplinkResolvedListener callback) { + public void processAndResolveDeeplink(final AdjustDeeplink deeplink, + final long clickTime, + final OnDeeplinkResolvedListener callback) { this.cachedDeeplinkResolutionCallback = callback; executor.submit(new Runnable() { @Override public void run() { - processDeeplinkI(url, referrer, clickTime); + processDeeplinkI(deeplink, clickTime); } }); } @@ -1550,7 +1552,9 @@ private void processCachedDeeplinkI() { return; } - processDeeplink(Uri.parse(cachedDeeplinkUrl), Uri.parse(cachedDeeplinkReferrer), cachedDeeplinkClickTime); + AdjustDeeplink deeplink = new AdjustDeeplink(Uri.parse(cachedDeeplinkUrl)); + deeplink.setReferrer(Uri.parse(cachedDeeplinkReferrer)); + processDeeplink(deeplink, cachedDeeplinkClickTime); sharedPreferencesManager.removeDeeplink(); } @@ -2111,19 +2115,24 @@ private boolean isValidReferrerDetails(final ReferrerDetails referrerDetails) { return referrerDetails.installReferrer.length() != 0; } - private void processDeeplinkI(Uri url, Uri referrer, long clickTime) { + private void processDeeplinkI(AdjustDeeplink deeplink, long clickTime) { if (!isEnabledI()) { return; } + if (deeplink == null) { + return; + } - if (Util.isUrlFilteredOut(url)) { - logger.debug("Deeplink (" + url.toString() + ") processing skipped"); + if (Util.isUrlFilteredOut(deeplink.getUrl())) { + if (deeplink.getUrl() != null) { + logger.debug("Deeplink (" + deeplink.getUrl().toString() + ") processing skipped"); + } return; } ActivityPackage sdkClickPackage = PackageFactory.buildDeeplinkSdkClickPackage( - url, - referrer, + deeplink.getUrl(), + deeplink.getReferrer(), clickTime, activityState, adjustConfig, diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index ff53674d0..4a65c8c76 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -213,7 +213,7 @@ public void processDeeplink(final AdjustDeeplink adjustDeeplink, final Context c return; } - activityHandler.processDeeplink(adjustDeeplink.url, adjustDeeplink.referrer, clickTime); + activityHandler.processDeeplink(adjustDeeplink, clickTime); } /** @@ -248,7 +248,7 @@ public void processAndResolveDeeplink(AdjustDeeplink adjustDeeplink, Context con } // if deeplink processing was triggered with SDK being initialized - activityHandler.processAndResolveDeeplink(adjustDeeplink.url, adjustDeeplink.referrer, clickTime, callback); + activityHandler.processAndResolveDeeplink(adjustDeeplink, clickTime, callback); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 6e75e1534..5ecc73663 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -22,9 +22,9 @@ public interface IActivityHandler { boolean isEnabled(); void isEnabled(OnIsEnabledListener onIsEnabledListener); - void processDeeplink(Uri url, Uri referrer, long clickTime); + void processDeeplink(AdjustDeeplink deeplink, long clickTime); - void processAndResolveDeeplink(Uri url, Uri referrer, long clickTime, OnDeeplinkResolvedListener callback); + void processAndResolveDeeplink(AdjustDeeplink deeplink, long clickTime, OnDeeplinkResolvedListener callback); boolean updateAttributionI(AdjustAttribution attribution); From 28a189f4b9e7a783f026c205714d60ae447584c3 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 13 Mar 2025 13:12:04 +0100 Subject: [PATCH 315/540] fix: add cached referrer null check --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index c41a1f2f9..64088b34d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1553,7 +1553,9 @@ private void processCachedDeeplinkI() { } AdjustDeeplink deeplink = new AdjustDeeplink(Uri.parse(cachedDeeplinkUrl)); - deeplink.setReferrer(Uri.parse(cachedDeeplinkReferrer)); + if (cachedDeeplinkReferrer != null) { + deeplink.setReferrer(Uri.parse(cachedDeeplinkReferrer)); + } processDeeplink(deeplink, cachedDeeplinkClickTime); sharedPreferencesManager.removeDeeplink(); From 6b97cae86a0cddbb0af33eb08679d4b714c01922 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 24 Mar 2025 13:21:57 +0100 Subject: [PATCH 316/540] feat: update version number to 5.2.0 --- Adjust/build.gradle | 2 +- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-imei/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-oaid/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java | 2 +- VERSION | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 80e9bac8d..bf151937a 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 35 coreTargetSdkVersion = 35 - coreVersionName = '5.1.0' + coreVersionName = '5.2.0' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index a0e6d90ba..bad9ee36b 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.1.0' + // implementation 'com.adjust.sdk:adjust-android:5.2.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index bb79ba79d..11098c2bd 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.1.0' + // implementation 'com.adjust.sdk:adjust-android:5.2.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index 9a00c4644..209cb892c 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.1.0' + // implementation 'com.adjust.sdk:adjust-android:5.2.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index 1ab59e8f3..3c123b3fc 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.1.0' + // implementation 'com.adjust.sdk:adjust-android:5.2.0' implementation 'com.huawei.hms:ads-identifier:3.4.56.300' } diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index b61142afa..deac83006 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.1.0' + // implementation 'com.adjust.sdk:adjust-android:5.2.0' // Add Samsung clouddev lib. compileOnly fileTree(include: ['*.aar'], dir: 'libs') diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index 5b13bba97..1f31e5f61 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.1.0' + // implementation 'com.adjust.sdk:adjust-android:5.2.0' // Add Samsung referrer lib via Maven. implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:3.0.1' diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index 09de5cbca..a5a01b5a2 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.1.0' + // implementation 'com.adjust.sdk:adjust-android:5.2.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index 10d8efb5d..cf05f403e 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.1.0' + // implementation 'com.adjust.sdk:adjust-android:5.2.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 1089da05b..bbcb23663 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -259,7 +259,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge5.1.0'; + return 'web-bridge5.2.0'; } }, diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index 3fe1860f4..bec25246f 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -31,7 +31,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.1.0' + // implementation 'com.adjust.sdk:adjust-android:5.2.0' // Add xiaomi referrer lib via Maven. implementation 'com.miui.referrer:homereferrer:1.0.0.6' diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index d745c3a3e..750c045c6 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -32,7 +32,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.1.0"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.2.0"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index ed4c7e86e..e2945ed6a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -37,7 +37,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android5.1.0"; + String CLIENT_SDK = "android5.2.0"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/VERSION b/VERSION index 831446cbd..91ff57278 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.1.0 +5.2.0 From ebe8e8abd24861f4f77635e7929fb2402adc5d1a Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 24 Mar 2025 13:26:07 +0100 Subject: [PATCH 317/540] docs: update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ade3b2998..c757137b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### Version 5.2.0 (24th March 2025) +#### Added +- Added ability to send organic search referrer together with deep link. + +--- + ### Version 5.1.0 (28th January 2025) #### Added - Added `jsonResponse` field (JSON string) to `AdjustAttribution` where every key-value pair sent by the backend as part of the attribution response can be found. Equivalently, one can also find `jsonResponse` field being part of the attribution instance in the web bridge API. From 3f27923738364fa0edb08f18607d3e97aff583bb Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 25 Mar 2025 10:26:22 +0100 Subject: [PATCH 318/540] Move cached pre launch to AH --- .../java/com/adjust/sdk/ActivityHandler.java | 129 ++++++++---------- .../java/com/adjust/sdk/AdjustInstance.java | 10 +- 2 files changed, 63 insertions(+), 76 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 64088b34d..c631cccba 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -90,6 +90,8 @@ public class ActivityHandler private ArrayList cachedAdidReadCallbacks = new ArrayList<>(); private SystemLifecycle systemLifecycle; private ArrayList cachedAttributionReadCallbacks = new ArrayList<>(); + public List cachedAdjustThirdPartySharingArray; + public Boolean cachedLastMeasurementConsentTrack; @Override public void teardown() { @@ -259,6 +261,9 @@ private ActivityHandler(AdjustConfig adjustConfig) { // preinstall has not been read by default internalState.preinstallHasBeenRead = false; + cachedAdjustThirdPartySharingArray = null; + cachedLastMeasurementConsentTrack = null; + executor.submit(() -> initI()); } @@ -713,22 +718,12 @@ public void run() { @Override public void trackThirdPartySharing(final AdjustThirdPartySharing adjustThirdPartySharing) { - executor.submit(new Runnable() { - @Override - public void run() { - trackThirdPartySharingI(adjustThirdPartySharing); - } - }); + executor.submit(() -> tryTrackThirdPartySharingI(adjustThirdPartySharing)); } @Override public void trackMeasurementConsent(final boolean consentMeasurement) { - executor.submit(new Runnable() { - @Override - public void run() { - trackMeasurementConsentI(consentMeasurement); - } - }); + executor.submit(() -> tryTrackMeasurementConsentI(consentMeasurement)); } @Override @@ -1289,21 +1284,7 @@ private void startI() { return; } else { // check if third party sharing request came, then send it first - for (AdjustThirdPartySharing adjustThirdPartySharing : - adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray) - { - trackThirdPartySharingI(adjustThirdPartySharing); - } - - if (adjustConfig.preLaunchActions.lastMeasurementConsentTracked != null) { - trackMeasurementConsentI( - adjustConfig.preLaunchActions. - lastMeasurementConsentTracked.booleanValue()); - } - - adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray = - new ArrayList<>(); - adjustConfig.preLaunchActions.lastMeasurementConsentTracked = null; + processPreLaunchArraysI(); } // it shouldn't start if it was disabled after a first session @@ -1346,23 +1327,7 @@ private void startFirstSessionI() { } else { processCoppaComplianceI(); - // check if third party sharing request came, then send it first - for (AdjustThirdPartySharing adjustThirdPartySharing : - adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray) - { - trackThirdPartySharingI(adjustThirdPartySharing); - } - - if (adjustConfig.preLaunchActions.lastMeasurementConsentTracked != null) { - trackMeasurementConsentI( - adjustConfig.preLaunchActions. - lastMeasurementConsentTracked.booleanValue()); - } - - adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray = - new ArrayList<>(); - adjustConfig.preLaunchActions.lastMeasurementConsentTracked = null; - + processPreLaunchArraysI(); activityState.sessionCount = 1; // this is the first session transferSessionPackageI(now); @@ -1916,20 +1881,7 @@ private void setEnabledI(boolean enabled) { } else { processCoppaComplianceI(); - for (AdjustThirdPartySharing adjustThirdPartySharing : - adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray) - { - trackThirdPartySharingI(adjustThirdPartySharing); - } - if (adjustConfig.preLaunchActions.lastMeasurementConsentTracked != null) { - trackMeasurementConsentI( - adjustConfig.preLaunchActions. - lastMeasurementConsentTracked.booleanValue()); - } - - adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray = - new ArrayList<>(); - adjustConfig.preLaunchActions.lastMeasurementConsentTracked = null; + processPreLaunchArraysI(); } // check if install was tracked @@ -1947,6 +1899,19 @@ private void setEnabledI(boolean enabled) { "Resuming handlers due to SDK being enabled"); } + private void processPreLaunchArraysI() { + if (cachedAdjustThirdPartySharingArray != null && canTrackThirdPartySharingI()) { + for (AdjustThirdPartySharing adjustThirdPartySharing : cachedAdjustThirdPartySharingArray) { + trackThirdPartySharingI(adjustThirdPartySharing); + } + } + cachedAdjustThirdPartySharingArray = null; + + if (cachedLastMeasurementConsentTrack != null && canTrackMeasurementConsentI()) { + trackMeasurementConsentI(cachedLastMeasurementConsentTrack.booleanValue()); + } + cachedLastMeasurementConsentTrack = null; + } private void checkAfterNewStartI() { checkAfterNewStartI(SharedPreferencesManager.getDefaultInstance(getContext())); @@ -2443,18 +2408,32 @@ private void gdprForgetMeI() { packageHandler.sendFirstPackage(); } - private void trackThirdPartySharingI(final AdjustThirdPartySharing adjustThirdPartySharing) { - if (!checkActivityStateI(activityState)) { - adjustConfig.preLaunchActions.preLaunchAdjustThirdPartySharingArray.add( - adjustThirdPartySharing); + public void tryTrackThirdPartySharingI(final AdjustThirdPartySharing adjustThirdPartySharing) { + if (canTrackThirdPartySharingI()) { + trackThirdPartySharingI(adjustThirdPartySharing); return; } - if (!isEnabledI()) { return; } - if (activityState.isGdprForgotten) { return; } + + if (cachedAdjustThirdPartySharingArray == null) { + cachedAdjustThirdPartySharingArray = new ArrayList<>(); + } + + cachedAdjustThirdPartySharingArray.add(adjustThirdPartySharing); + } + + private boolean canTrackThirdPartySharingI() { + if (!checkActivityStateI(activityState)) {return false;} + if (!isEnabledI()) { return false; } + if (activityState.isGdprForgotten) { return false; } if (adjustConfig.coppaComplianceEnabled) { logger.warn("Calling third party sharing API not allowed when COPPA enabled"); - return; + return false; } + + return true; + } + + private void trackThirdPartySharingI(final AdjustThirdPartySharing adjustThirdPartySharing) { long now = System.currentTimeMillis(); PackageBuilder packageBuilder = new PackageBuilder( adjustConfig, deviceInfo, activityState, globalParameters, now); @@ -2467,14 +2446,24 @@ private void trackThirdPartySharingI(final AdjustThirdPartySharing adjustThirdPa packageHandler.sendFirstPackage(); } - private void trackMeasurementConsentI(final boolean consentMeasurement) { - if (!checkActivityStateI(activityState)) { - adjustConfig.preLaunchActions.lastMeasurementConsentTracked = consentMeasurement; + public void tryTrackMeasurementConsentI(final boolean consentMeasurement) { + if (canTrackMeasurementConsentI()) { + trackMeasurementConsentI(consentMeasurement); return; } - if (!isEnabledI()) { return; } - if (activityState.isGdprForgotten) { return; } + cachedLastMeasurementConsentTrack = consentMeasurement; + } + + private boolean canTrackMeasurementConsentI() { + if (!checkActivityStateI(activityState)) { return false; } + if (!isEnabledI()) { return false; } + if (activityState.isGdprForgotten) { return false; } + + return true; + } + + private void trackMeasurementConsentI(final boolean consentMeasurement) { long now = System.currentTimeMillis(); PackageBuilder packageBuilder = new PackageBuilder( adjustConfig, deviceInfo, activityState, globalParameters, now); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 4a65c8c76..2c861c38e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -19,13 +19,9 @@ public class AdjustInstance { public static class PreLaunchActions { public List preLaunchActionsArray; - public List preLaunchAdjustThirdPartySharingArray; - public Boolean lastMeasurementConsentTracked; public PreLaunchActions() { preLaunchActionsArray = new ArrayList<>(); - preLaunchAdjustThirdPartySharingArray = new ArrayList<>(); - lastMeasurementConsentTracked = null; } } @@ -471,7 +467,8 @@ public void gdprForgetMe(final Context context) { public void trackThirdPartySharing(final AdjustThirdPartySharing adjustThirdPartySharing) { if (!checkActivityHandler("third party sharing", true)) { - preLaunchActions.preLaunchAdjustThirdPartySharingArray.add(adjustThirdPartySharing); + preLaunchActions.preLaunchActionsArray.add(activityHandlerInner -> + activityHandlerInner.tryTrackThirdPartySharingI(adjustThirdPartySharing)); return; } @@ -480,7 +477,8 @@ public void trackThirdPartySharing(final AdjustThirdPartySharing adjustThirdPart public void trackMeasurementConsent(final boolean consentMeasurement) { if (!checkActivityHandler("measurement consent", true)) { - preLaunchActions.lastMeasurementConsentTracked = consentMeasurement; + preLaunchActions.preLaunchActionsArray.add(activityHandlerInner -> + activityHandlerInner.tryTrackMeasurementConsentI(consentMeasurement)); return; } From aa1f8f44a0aace718aa17d5564f2356c32ec9b0e Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 25 Mar 2025 14:50:37 +0100 Subject: [PATCH 319/540] Add option to config --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 5 +++-- .../sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index c631cccba..4bfa959a2 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -90,8 +90,9 @@ public class ActivityHandler private ArrayList cachedAdidReadCallbacks = new ArrayList<>(); private SystemLifecycle systemLifecycle; private ArrayList cachedAttributionReadCallbacks = new ArrayList<>(); - public List cachedAdjustThirdPartySharingArray; - public Boolean cachedLastMeasurementConsentTrack; + private List cachedAdjustThirdPartySharingArray; + private Boolean cachedLastMeasurementConsentTrack; + private FirstSessionDelayManager firstSessionDelayManager; @Override public void teardown() { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 918d2f66a..f68a7aaaf 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -46,6 +46,7 @@ public class AdjustConfig { ArrayList cachedAdidReadCallbacks = new ArrayList<>(); Integer eventDeduplicationIdsMaxSize; ArrayList cachedAttributionReadCallbacks = new ArrayList<>(); + boolean isFirstSessionDelayEnabled; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; @@ -83,6 +84,7 @@ private void init(Context context, String appToken, String environment, boolean this.isDeviceIdsReadingOnceEnabled = false; this.coppaComplianceEnabled = false; this.playStoreKidsComplianceEnabled = false; + this.isFirstSessionDelayEnabled = false; } public void setLogLevel(LogLevel logLevel) { @@ -155,6 +157,10 @@ public void enableDeviceIdsReadingOnce() { this.isDeviceIdsReadingOnceEnabled = true; } + public void enableFirstSessionDelay() { + this.isFirstSessionDelayEnabled = true; + } + public void setOnAttributionChangedListener(OnAttributionChangedListener onAttributionChangedListener) { this.onAttributionChangedListener = onAttributionChangedListener; } From ff4f07cafef39d6f97812efcd3817ed7842f4fd3 Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 25 Mar 2025 14:50:56 +0100 Subject: [PATCH 320/540] Add first session delay manager --- .../java/com/adjust/sdk/ActivityHandler.java | 8 +- .../adjust/sdk/FirstSessionDelayManager.java | 94 +++++++++++++++++++ 2 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 4bfa959a2..949028267 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -67,7 +67,7 @@ public class ActivityHandler private static final String GLOBAL_PARTNER_PARAMETERS_NAME = "Global Partner parameters"; private static final String GLOBAL_PARAMETERS_NAME = "Global parameters"; - private ThreadExecutor executor; + ThreadExecutor executor; private IPackageHandler packageHandler; private ActivityState activityState; private ILogger logger; @@ -79,7 +79,7 @@ public class ActivityHandler private String subscriptionPath; private DeviceInfo deviceInfo; - private AdjustConfig adjustConfig; // always valid after construction + AdjustConfig adjustConfig; // always valid after construction private AdjustAttribution attribution; private IAttributionHandler attributionHandler; private ISdkClickHandler sdkClickHandler; @@ -265,7 +265,9 @@ private ActivityHandler(AdjustConfig adjustConfig) { cachedAdjustThirdPartySharingArray = null; cachedLastMeasurementConsentTrack = null; - executor.submit(() -> initI()); + firstSessionDelayManager = new FirstSessionDelayManager(this, internalState.isFirstLaunch()); + + firstSessionDelayManager.delayOrInit(() -> initI()); } @Override diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java new file mode 100644 index 000000000..c495c1eff --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java @@ -0,0 +1,94 @@ +package com.adjust.sdk; + +import java.util.ArrayList; +import java.util.List; + +class FirstSessionDelayManager { + private final ActivityHandler activityHandler; + private List apiActions; + private String delayStatus; + private Runnable initBlock; + + public FirstSessionDelayManager( + final ActivityHandler activityHandler, + final boolean isFirstLaunch) + { + this.activityHandler = activityHandler; + + apiActions = new ArrayList<>(); + + boolean delayFirstSession = isFirstLaunch && activityHandler.adjustConfig.isFirstSessionDelayEnabled; + + if (delayFirstSession) { + delayStatus = "notStarted"; + } else { + delayStatus = "notSet"; + } + } + + public void stopFirstSessionDelay() { + if (!"started".equals(delayStatus)) { + return; + } + delayStatus = "stopped"; + + activityHandler.executor.submit(() -> { + initBlock.run(); + for (final Runnable apiAction : apiActions) { + apiAction.run(); + } + }); + } + + public void delayOrInit(final Runnable initBlock) { + if ("notStarted".equals(delayStatus)) { + this.initBlock = initBlock; + delayStatus = "started"; + return; + } + + if ("notSet".equals(delayStatus)) { + activityHandler.executor.submit(() -> { + initBlock.run(); + for (final Runnable apiAction : apiActions) { + apiAction.run(); + } + }); + return; + } + } + + public void setCoppaComplianceInDelay(final boolean isCoppaComplianceEnabled) { + if (!"started".equals(delayStatus)) { + return; + } + + activityHandler.adjustConfig.coppaComplianceEnabled = isCoppaComplianceEnabled; + } + + public void setExternalDeviceIdInDelay(final String externalDeviceId) { + if (!"started".equals(delayStatus)) { + return; + } + + activityHandler.adjustConfig.externalDeviceId = externalDeviceId; + } + + public void apiActionWithBlock(final Runnable runnable) { + if ("started".equals(delayStatus)) { + apiActions.add(runnable); + } else { + activityHandler.executor.submit(runnable); + } + } + + public void preLaunchActionWithBlock(final IRunActivityHandler runnableAH) { + if ("started".equals(delayStatus)) { + activityHandler.adjustConfig.preLaunchActions.preLaunchActionsArray.add(runnableAH); + } else { + activityHandler.executor.submit(() -> { + runnableAH.run(activityHandler); + }); + } + } +} From b97ecd1c2b6b1784d68dc4ee0dbfbc86eb8119b2 Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 25 Mar 2025 15:01:08 +0100 Subject: [PATCH 321/540] Add delay apis --- .../java/com/adjust/sdk/ActivityHandler.java | 19 ++++++++++-- .../src/main/java/com/adjust/sdk/Adjust.java | 14 +++++++++ .../java/com/adjust/sdk/AdjustInstance.java | 31 +++++++++++++++++++ .../adjust/sdk/FirstSessionDelayManager.java | 12 +++---- .../java/com/adjust/sdk/IActivityHandler.java | 6 ++++ 5 files changed, 74 insertions(+), 8 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 949028267..c13be1f51 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -79,7 +79,7 @@ public class ActivityHandler private String subscriptionPath; private DeviceInfo deviceInfo; - AdjustConfig adjustConfig; // always valid after construction + private AdjustConfig adjustConfig; // always valid after construction private AdjustAttribution attribution; private IAttributionHandler attributionHandler; private ISdkClickHandler sdkClickHandler; @@ -265,7 +265,7 @@ private ActivityHandler(AdjustConfig adjustConfig) { cachedAdjustThirdPartySharingArray = null; cachedLastMeasurementConsentTrack = null; - firstSessionDelayManager = new FirstSessionDelayManager(this, internalState.isFirstLaunch()); + firstSessionDelayManager = new FirstSessionDelayManager(this); firstSessionDelayManager.delayOrInit(() -> initI()); } @@ -833,6 +833,21 @@ public void run() { }); } + @Override + public void stopFirstSessionDelay() { + firstSessionDelayManager.stopFirstSessionDelay(); + } + + @Override + public void setCoppaComplianceInDelay(final boolean isCoppaComplianceEnabled) { + firstSessionDelayManager.setCoppaComplianceInDelay(isCoppaComplianceEnabled); + } + + @Override + public void setExternalDeviceIdInDelay(final String externalDeviceId) { + firstSessionDelayManager.setExternalDeviceIdInDelay(externalDeviceId); + } + @Override public InternalState getInternalState() { return internalState; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 750c045c6..d384fc667 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -430,6 +430,20 @@ public static void verifyAndTrackPlayStorePurchase(final AdjustEvent event, OnPu adjustInstance.verifyAndTrackPlayStorePurchase(event, callback); } + public static void stopFirstSessionDelay() { + Adjust.getDefaultInstance().stopFirstSessionDelay(); + } + + public static void enableCoppaComplianceInDelay() { + Adjust.getDefaultInstance().enableCoppaComplianceInDelay(); + } + public static void disableCoppaComplianceInDelay() { + Adjust.getDefaultInstance().disableCoppaComplianceInDelay(); + } + public static void setExternalDeviceIdInDelay(final String externalDeviceId) { + Adjust.getDefaultInstance().setExternalDeviceIdInDelay(externalDeviceId); + } + /** * Used for testing purposes only. Do NOT use this method. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 2c861c38e..e2d2a5332 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -626,6 +626,37 @@ public void verifyAndTrackPlayStorePurchase(AdjustEvent event, OnPurchaseVerific activityHandler.verifyAndTrackPlayStorePurchase(event, callback); } + public void stopFirstSessionDelay() { + if (!checkActivityHandler("stopFirstSessionDelay")) { + return; + } + + activityHandler.stopFirstSessionDelay(); + } + + public void enableCoppaComplianceInDelay() { + if (!checkActivityHandler("enableCoppaComplianceInDelay")) { + return; + } + + activityHandler.setCoppaComplianceInDelay(true); + } + + public void disableCoppaComplianceInDelay() { + if (!checkActivityHandler("disableCoppaComplianceInDelay")) { + return; + } + + activityHandler.setCoppaComplianceInDelay(false); + } + public void setExternalDeviceIdInDelay(final String externalDeviceId) { + if (!checkActivityHandler("setExternalDeviceIdInDelay")) { + return; + } + + activityHandler.setExternalDeviceIdInDelay(externalDeviceId); + } + /** * Called to get last opened deeplink. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java index c495c1eff..9369a5cfa 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java @@ -10,14 +10,14 @@ class FirstSessionDelayManager { private Runnable initBlock; public FirstSessionDelayManager( - final ActivityHandler activityHandler, - final boolean isFirstLaunch) + final ActivityHandler activityHandler) { this.activityHandler = activityHandler; apiActions = new ArrayList<>(); - boolean delayFirstSession = isFirstLaunch && activityHandler.adjustConfig.isFirstSessionDelayEnabled; + boolean delayFirstSession = activityHandler.getInternalState().isFirstLaunch() + && activityHandler.getAdjustConfig().isFirstSessionDelayEnabled; if (delayFirstSession) { delayStatus = "notStarted"; @@ -63,7 +63,7 @@ public void setCoppaComplianceInDelay(final boolean isCoppaComplianceEnabled) { return; } - activityHandler.adjustConfig.coppaComplianceEnabled = isCoppaComplianceEnabled; + activityHandler.getAdjustConfig().coppaComplianceEnabled = isCoppaComplianceEnabled; } public void setExternalDeviceIdInDelay(final String externalDeviceId) { @@ -71,7 +71,7 @@ public void setExternalDeviceIdInDelay(final String externalDeviceId) { return; } - activityHandler.adjustConfig.externalDeviceId = externalDeviceId; + activityHandler.getAdjustConfig().externalDeviceId = externalDeviceId; } public void apiActionWithBlock(final Runnable runnable) { @@ -84,7 +84,7 @@ public void apiActionWithBlock(final Runnable runnable) { public void preLaunchActionWithBlock(final IRunActivityHandler runnableAH) { if ("started".equals(delayStatus)) { - activityHandler.adjustConfig.preLaunchActions.preLaunchActionsArray.add(runnableAH); + activityHandler.getAdjustConfig().preLaunchActions.preLaunchActionsArray.add(runnableAH); } else { activityHandler.executor.submit(() -> { runnableAH.run(activityHandler); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 5ecc73663..60fdf7829 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -78,6 +78,12 @@ public interface IActivityHandler { void verifyAndTrackPlayStorePurchase(AdjustEvent event, OnPurchaseVerificationFinishedListener callback); + void stopFirstSessionDelay(); + + void setCoppaComplianceInDelay(final boolean isCoppaComplianceEnabled); + + void setExternalDeviceIdInDelay(final String externalDeviceId); + void gotOptOutResponse(); Context getContext(); From 22d001bdbf5cbbfb332fed735a7aaee9ddd60775 Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 25 Mar 2025 15:29:45 +0100 Subject: [PATCH 322/540] Add api actions to delay manager --- .../java/com/adjust/sdk/ActivityHandler.java | 190 +++++------------- .../adjust/sdk/FirstSessionDelayManager.java | 4 +- 2 files changed, 52 insertions(+), 142 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index c13be1f51..6f2500676 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -216,7 +216,7 @@ public boolean hasPreinstallBeenRead() { // region SystemLifecycleCallback @Override public void onActivityLifecycle(final boolean foregroundOrElseBackground) { try { - executor.submit(() -> { + firstSessionDelayManager.apiAction(() -> { if (internalState.foregroundOrElseBackground != null && internalState.foregroundOrElseBackground.booleanValue() == foregroundOrElseBackground) { @@ -364,17 +364,14 @@ public void onPauseI() { @Override public void trackEvent(final AdjustEvent event) { - executor.submit(new Runnable() { - @Override - public void run() { - if (internalState.hasFirstSdkStartNotOcurred()) { - logger.warn("Event tracked before first activity resumed.\n" + - "If it was triggered in the Application class, it might timestamp or even send an install long before the user opens the app.\n" + - "Please check https://github.com/adjust/android_sdk#can-i-trigger-an-event-at-application-launch for more information."); - startI(); - } - trackEventI(event); - } + firstSessionDelayManager.apiAction(() -> { + if (internalState.hasFirstSdkStartNotOcurred()) { + logger.warn("Event tracked before first activity resumed.\n" + + "If it was triggered in the Application class, it might timestamp or even send an install long before the user opens the app.\n" + + "Please check https://github.com/adjust/android_sdk#can-i-trigger-an-event-at-application-launch for more information."); + startI(); + } + trackEventI(event); }); } @@ -405,22 +402,12 @@ public void finishedTrackingActivity(ResponseData responseData) { @Override public void setEnabled(final boolean enabled) { - executor.submit(new Runnable() { - @Override - public void run() { - setEnabledI(enabled); - } - }); + firstSessionDelayManager.apiAction(() -> setEnabledI(enabled)); } @Override public void setOfflineMode(final boolean offline) { - executor.submit(new Runnable() { - @Override - public void run() { - setOfflineModeI(offline); - } - }); + firstSessionDelayManager.apiAction(() -> setOfflineModeI(offline)); } @Override @@ -429,17 +416,10 @@ public boolean isEnabled() { } @Override - public void isEnabled(OnIsEnabledListener onIsEnabledListener) { - executor.submit(new Runnable() { - @Override - public void run() { - new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { - @Override - public void run() { - onIsEnabledListener.onIsEnabledRead(isEnabledI()); - } - }); } - }); + public void isEnabled(final OnIsEnabledListener onIsEnabledListener) { + firstSessionDelayManager.apiAction(() -> + new Handler(adjustConfig.context.getMainLooper()).post( + () -> onIsEnabledListener.onIsEnabledRead(isEnabledI()))); } private boolean isEnabledI() { @@ -452,12 +432,7 @@ private boolean isEnabledI() { @Override public void processDeeplink(final AdjustDeeplink deeplink, final long clickTime) { - executor.submit(new Runnable() { - @Override - public void run() { - processDeeplinkI(deeplink, clickTime); - } - }); + firstSessionDelayManager.apiAction(() -> processDeeplinkI(deeplink, clickTime)); } @Override @@ -465,12 +440,7 @@ public void processAndResolveDeeplink(final AdjustDeeplink deeplink, final long clickTime, final OnDeeplinkResolvedListener callback) { this.cachedDeeplinkResolutionCallback = callback; - executor.submit(new Runnable() { - @Override - public void run() { - processDeeplinkI(deeplink, clickTime); - } - }); + firstSessionDelayManager.apiAction(() -> processDeeplinkI(deeplink, clickTime)); } private void updateAdidI(final String adid) { @@ -550,22 +520,12 @@ public void run() { @Override public void sendReftagReferrer() { - executor.submit(new Runnable() { - @Override - public void run() { - sendReftagReferrerI(); - } - }); + firstSessionDelayManager.apiAction(() -> sendReftagReferrerI()); } @Override public void sendPreinstallReferrer() { - executor.submit(new Runnable() { - @Override - public void run() { - sendPreinstallReferrerI(); - } - }); + firstSessionDelayManager.apiAction(() -> sendPreinstallReferrerI()); } @Override @@ -631,122 +591,82 @@ public void run() { @Override public void addGlobalCallbackParameter(final String key, final String value) { - executor.submit(new Runnable() { - @Override - public void run() { - addGlobalCallbackParameterI(key, value); - } - }); + firstSessionDelayManager.preLaunchAction(activityHandler -> + activityHandler.addGlobalCallbackParameterI(key, value)); } @Override public void addGlobalPartnerParameter(final String key, final String value) { - executor.submit(new Runnable() { - @Override - public void run() { - addGlobalPartnerParameterI(key, value); - } - }); + firstSessionDelayManager.preLaunchAction(activityHandler -> + activityHandler.addGlobalPartnerParameterI(key, value)); } @Override public void removeGlobalCallbackParameter(final String key) { - executor.submit(new Runnable() { - @Override - public void run() { - removeGlobalCallbackParameterI(key); - } - }); + firstSessionDelayManager.preLaunchAction(activityHandler -> + activityHandler.removeGlobalCallbackParameterI(key)); } @Override public void removeGlobalPartnerParameter(final String key) { - executor.submit(new Runnable() { - @Override - public void run() { - removeGlobalPartnerParameterI(key); - } - }); + firstSessionDelayManager.preLaunchAction(activityHandler -> + activityHandler.removeGlobalPartnerParameterI(key)); } @Override public void removeGlobalCallbackParameters() { - executor.submit(new Runnable() { - @Override - public void run() { - removeGlobalCallbackParametersI(); - } - }); + firstSessionDelayManager.preLaunchAction(activityHandler -> + activityHandler.removeGlobalCallbackParametersI()); } @Override public void removeGlobalPartnerParameters() { - executor.submit(new Runnable() { - @Override - public void run() { - removeGlobalPartnerParametersI(); - } - }); + firstSessionDelayManager.preLaunchAction(activityHandler -> + activityHandler.removeGlobalPartnerParametersI()); } @Override public void setPushToken(final String token, final boolean preSaved) { - executor.submit(new Runnable() { - @Override - public void run() { - if (!preSaved) { - SharedPreferencesManager.getDefaultInstance(getContext()).savePushToken(token); - } + firstSessionDelayManager.apiAction(() -> { + if (!preSaved) { + SharedPreferencesManager.getDefaultInstance(getContext()).savePushToken(token); + } - if (internalState.hasFirstSdkStartNotOcurred()) { - // No install has been tracked so far. - // Push token is saved, ready for the session package to pick it up. - return; - } else { - setPushTokenI(token); - } + if (internalState.hasFirstSdkStartNotOcurred()) { + // No install has been tracked so far. + // Push token is saved, ready for the session package to pick it up. + return; + } else { + setPushTokenI(token); } }); } @Override public void gdprForgetMe() { - executor.submit(new Runnable() { - @Override - public void run() { - gdprForgetMeI(); - } - }); + firstSessionDelayManager.apiAction(() -> gdprForgetMeI()); } @Override public void trackThirdPartySharing(final AdjustThirdPartySharing adjustThirdPartySharing) { - executor.submit(() -> tryTrackThirdPartySharingI(adjustThirdPartySharing)); + firstSessionDelayManager.preLaunchAction(activityHandler -> + activityHandler.tryTrackThirdPartySharingI(adjustThirdPartySharing)); } @Override public void trackMeasurementConsent(final boolean consentMeasurement) { - executor.submit(() -> tryTrackMeasurementConsentI(consentMeasurement)); + firstSessionDelayManager.preLaunchAction(activityHandler -> + activityHandler.tryTrackMeasurementConsentI(consentMeasurement)); } @Override public void trackAdRevenue(final AdjustAdRevenue adjustAdRevenue) { - executor.submit(new Runnable() { - @Override - public void run() { - trackAdRevenueI(adjustAdRevenue); - } - }); + firstSessionDelayManager.apiAction(() -> trackAdRevenueI(adjustAdRevenue)); } @Override public void trackPlayStoreSubscription(final AdjustPlayStoreSubscription subscription) { - executor.submit(new Runnable() { - @Override - public void run() { - trackPlayStoreSubscriptionI(subscription); - } - }); + firstSessionDelayManager.apiAction(() -> trackPlayStoreSubscriptionI(subscription)); } @Override @@ -815,22 +735,12 @@ public void run() { @Override public void verifyPlayStorePurchase(final AdjustPlayStorePurchase purchase, final OnPurchaseVerificationFinishedListener callback) { - executor.submit(new Runnable() { - @Override - public void run() { - verifyPlayStorePurchaseI(purchase, callback); - } - }); + firstSessionDelayManager.apiAction(() -> verifyPlayStorePurchaseI(purchase, callback)); } @Override public void verifyAndTrackPlayStorePurchase(AdjustEvent event, OnPurchaseVerificationFinishedListener callback) { - executor.submit(new Runnable() { - @Override - public void run() { - verifyAndTrackPlayStorePurchaseI(event, callback); - } - }); + firstSessionDelayManager.apiAction(() -> verifyAndTrackPlayStorePurchaseI(event, callback)); } @Override diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java index 9369a5cfa..a428b9865 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java @@ -74,7 +74,7 @@ public void setExternalDeviceIdInDelay(final String externalDeviceId) { activityHandler.getAdjustConfig().externalDeviceId = externalDeviceId; } - public void apiActionWithBlock(final Runnable runnable) { + public void apiAction(final Runnable runnable) { if ("started".equals(delayStatus)) { apiActions.add(runnable); } else { @@ -82,7 +82,7 @@ public void apiActionWithBlock(final Runnable runnable) { } } - public void preLaunchActionWithBlock(final IRunActivityHandler runnableAH) { + public void preLaunchAction(final IRunActivityHandler runnableAH) { if ("started".equals(delayStatus)) { activityHandler.getAdjustConfig().preLaunchActions.preLaunchActionsArray.add(runnableAH); } else { From b3c55cf5b2a072ad7289526fbfb5055539fc3d2c Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 25 Mar 2025 16:12:29 +0100 Subject: [PATCH 323/540] Add test commands --- .../adjust/testapp/AdjustCommandExecutor.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 88c712093..26b31de98 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -95,6 +95,9 @@ public void executeCommand(final Command sentCommand) { case "processDeeplink" : processDeeplink(); break; case "attributionGetter" : attributionGetter(); break; case "getLastDeeplink" : getLastDeeplink(); break; + case "stopFirstSessionDelay" : stopFirstSessionDelay(); break; + case "coppaComplianceInDelay" : coppaComplianceInDelay(); break; + case "externalDeviceIdInDelay" : externalDeviceIdInDelay(); break; //case "testBegin": testBegin(); break; // case "testEnd": testEnd(); break; } @@ -463,6 +466,14 @@ public boolean launchReceivedDeeplink(Uri deeplink) { } }); } + + if (command.containsParameter("firstSessionDelayEnabled")) { + String firstSessionDelayEnabledS = command.getFirstParameterValue("firstSessionDelayEnabled"); + boolean firstSessionDelayEnabled = "true".equals(firstSessionDelayEnabledS); + if (firstSessionDelayEnabled) { + adjustConfig.enableFirstSessionDelay(); + } + } } private void start() { @@ -904,6 +915,24 @@ public void onLastDeeplinkRead(Uri deeplink) { }); } + private void stopFirstSessionDelay() { + Adjust.stopFirstSessionDelay(); + } + + private void coppaComplianceInDelay() { + String isEnabledString = command.getFirstParameterValue("isEnabled"); + if ("true".equals(isEnabledString)) { + Adjust.enableCoppaComplianceInDelay(); + } + if ("false".equals(isEnabledString)) { + Adjust.disableCoppaComplianceInDelay(); + } + } + + private void externalDeviceIdInDelay() { + String externalDeviceId = command.getFirstParameterValue("externalDeviceId"); + Adjust.setExternalDeviceIdInDelay(externalDeviceId); + } /* private void testBegin() { if (command.containsParameter("teardown")) { From f6dfe73161cbd9d8d773dcb6ec2fb296d2aa094f Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 27 Mar 2025 11:30:47 +0100 Subject: [PATCH 324/540] Replace first sdk check --- .../java/com/adjust/sdk/ActivityHandler.java | 169 +++++++++--------- .../adjust/sdk/FirstSessionDelayManager.java | 54 +++--- 2 files changed, 107 insertions(+), 116 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 6f2500676..cf4193bc6 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -158,7 +158,6 @@ public class InternalState { boolean offline; boolean firstLaunch; boolean sessionResponseProcessed; - boolean firstSdkStart; boolean preinstallHasBeenRead; Boolean foregroundOrElseBackground; @@ -192,22 +191,10 @@ public boolean isFirstLaunch() { return firstLaunch; } - public boolean isNotFirstLaunch() { - return !firstLaunch; - } - public boolean hasSessionResponseNotBeenProcessed() { return !sessionResponseProcessed; } - public boolean hasFirstSdkStartOcurred() { - return firstSdkStart; - } - - public boolean hasFirstSdkStartNotOcurred() { - return !firstSdkStart; - } - public boolean hasPreinstallBeenRead() { return preinstallHasBeenRead; } @@ -216,21 +203,24 @@ public boolean hasPreinstallBeenRead() { // region SystemLifecycleCallback @Override public void onActivityLifecycle(final boolean foregroundOrElseBackground) { try { - firstSessionDelayManager.apiAction(() -> { - if (internalState.foregroundOrElseBackground != null - && internalState.foregroundOrElseBackground.booleanValue() - == foregroundOrElseBackground) { - return; - } - // received foregroundOrElseBackground is strictly different from internal state one + executor.submit(() -> { + firstSessionDelayManager.apiActionI(() -> { + if (internalState.foregroundOrElseBackground != null + && internalState.foregroundOrElseBackground.booleanValue() + == foregroundOrElseBackground) { + return; + } + // received foregroundOrElseBackground is strictly different from internal state one - this.internalState.foregroundOrElseBackground = foregroundOrElseBackground; + this.internalState.foregroundOrElseBackground = foregroundOrElseBackground; - if (foregroundOrElseBackground) { - onResumeI(); - } else { - onPauseI(); - } + if (foregroundOrElseBackground) { + onResumeI(); + } else { + onPauseI(); + } + + }); }); } catch (Exception e) { if (logger != null) { @@ -257,8 +247,6 @@ private ActivityHandler(AdjustConfig adjustConfig) { internalState.offline = adjustConfig.startOffline; // does not have the session response by default internalState.sessionResponseProcessed = false; - // does not have first start by default - internalState.firstSdkStart = false; // preinstall has not been read by default internalState.preinstallHasBeenRead = false; @@ -267,7 +255,14 @@ private ActivityHandler(AdjustConfig adjustConfig) { firstSessionDelayManager = new FirstSessionDelayManager(this); - firstSessionDelayManager.delayOrInit(() -> initI()); + executor.submit(() -> { + // has to be read in the background + readAttributionI(adjustConfig.context); + readActivityStateI(adjustConfig.context); + firstSessionDelayManager.activityStateFileReadI(); + }); + + //firstSessionDelayManager.delayOrInit(() -> initI()); } @Override @@ -364,15 +359,15 @@ public void onPauseI() { @Override public void trackEvent(final AdjustEvent event) { - firstSessionDelayManager.apiAction(() -> { - if (internalState.hasFirstSdkStartNotOcurred()) { + executor.submit(() -> firstSessionDelayManager.apiActionI(() -> { + if (activityState == null) { logger.warn("Event tracked before first activity resumed.\n" + "If it was triggered in the Application class, it might timestamp or even send an install long before the user opens the app.\n" + "Please check https://github.com/adjust/android_sdk#can-i-trigger-an-event-at-application-launch for more information."); startI(); } trackEventI(event); - }); + })); } @Override @@ -402,12 +397,13 @@ public void finishedTrackingActivity(ResponseData responseData) { @Override public void setEnabled(final boolean enabled) { - firstSessionDelayManager.apiAction(() -> setEnabledI(enabled)); + executor.submit(() -> firstSessionDelayManager.apiActionI(() -> + setEnabledI(enabled))); } @Override public void setOfflineMode(final boolean offline) { - firstSessionDelayManager.apiAction(() -> setOfflineModeI(offline)); + executor.submit(() -> firstSessionDelayManager.apiActionI(() -> setOfflineModeI(offline))); } @Override @@ -417,9 +413,9 @@ public boolean isEnabled() { @Override public void isEnabled(final OnIsEnabledListener onIsEnabledListener) { - firstSessionDelayManager.apiAction(() -> + executor.submit(() -> firstSessionDelayManager.apiActionI(() -> new Handler(adjustConfig.context.getMainLooper()).post( - () -> onIsEnabledListener.onIsEnabledRead(isEnabledI()))); + () -> onIsEnabledListener.onIsEnabledRead(isEnabledI())))); } private boolean isEnabledI() { @@ -432,15 +428,17 @@ private boolean isEnabledI() { @Override public void processDeeplink(final AdjustDeeplink deeplink, final long clickTime) { - firstSessionDelayManager.apiAction(() -> processDeeplinkI(deeplink, clickTime)); + executor.submit(() -> firstSessionDelayManager.apiActionI(() -> + processDeeplinkI(deeplink, clickTime))); } @Override public void processAndResolveDeeplink(final AdjustDeeplink deeplink, final long clickTime, - final OnDeeplinkResolvedListener callback) { + final OnDeeplinkResolvedListener callback) + { this.cachedDeeplinkResolutionCallback = callback; - firstSessionDelayManager.apiAction(() -> processDeeplinkI(deeplink, clickTime)); + executor.submit(() -> firstSessionDelayManager.apiActionI(() -> processDeeplinkI(deeplink, clickTime))); } private void updateAdidI(final String adid) { @@ -520,12 +518,12 @@ public void run() { @Override public void sendReftagReferrer() { - firstSessionDelayManager.apiAction(() -> sendReftagReferrerI()); + executor.submit(() -> firstSessionDelayManager.apiActionI(() -> sendReftagReferrerI())); } @Override public void sendPreinstallReferrer() { - firstSessionDelayManager.apiAction(() -> sendPreinstallReferrerI()); + executor.submit(() -> firstSessionDelayManager.apiActionI(() -> sendPreinstallReferrerI())); } @Override @@ -591,82 +589,82 @@ public void run() { @Override public void addGlobalCallbackParameter(final String key, final String value) { - firstSessionDelayManager.preLaunchAction(activityHandler -> - activityHandler.addGlobalCallbackParameterI(key, value)); + executor.submit(() -> firstSessionDelayManager.preLaunchActionI(activityHandler -> + activityHandler.addGlobalCallbackParameterI(key, value))); } @Override public void addGlobalPartnerParameter(final String key, final String value) { - firstSessionDelayManager.preLaunchAction(activityHandler -> - activityHandler.addGlobalPartnerParameterI(key, value)); + executor.submit(() -> firstSessionDelayManager.preLaunchActionI(activityHandler -> + activityHandler.addGlobalPartnerParameterI(key, value))); } @Override public void removeGlobalCallbackParameter(final String key) { - firstSessionDelayManager.preLaunchAction(activityHandler -> - activityHandler.removeGlobalCallbackParameterI(key)); + executor.submit(() -> firstSessionDelayManager.preLaunchActionI(activityHandler -> + activityHandler.removeGlobalCallbackParameterI(key))); } @Override public void removeGlobalPartnerParameter(final String key) { - firstSessionDelayManager.preLaunchAction(activityHandler -> - activityHandler.removeGlobalPartnerParameterI(key)); + executor.submit(() -> firstSessionDelayManager.preLaunchActionI(activityHandler -> + activityHandler.removeGlobalPartnerParameterI(key))); } @Override public void removeGlobalCallbackParameters() { - firstSessionDelayManager.preLaunchAction(activityHandler -> - activityHandler.removeGlobalCallbackParametersI()); + executor.submit(() -> firstSessionDelayManager.preLaunchActionI(activityHandler -> + activityHandler.removeGlobalCallbackParametersI())); } @Override public void removeGlobalPartnerParameters() { - firstSessionDelayManager.preLaunchAction(activityHandler -> - activityHandler.removeGlobalPartnerParametersI()); + executor.submit(() -> firstSessionDelayManager.preLaunchActionI(activityHandler -> + activityHandler.removeGlobalPartnerParametersI())); } @Override public void setPushToken(final String token, final boolean preSaved) { - firstSessionDelayManager.apiAction(() -> { + executor.submit(() -> firstSessionDelayManager.apiActionI(() -> { if (!preSaved) { SharedPreferencesManager.getDefaultInstance(getContext()).savePushToken(token); } - if (internalState.hasFirstSdkStartNotOcurred()) { + if (activityState == null) { // No install has been tracked so far. // Push token is saved, ready for the session package to pick it up. return; } else { setPushTokenI(token); } - }); + })); } @Override public void gdprForgetMe() { - firstSessionDelayManager.apiAction(() -> gdprForgetMeI()); + executor.submit(() -> firstSessionDelayManager.apiActionI(() -> gdprForgetMeI())); } @Override public void trackThirdPartySharing(final AdjustThirdPartySharing adjustThirdPartySharing) { - firstSessionDelayManager.preLaunchAction(activityHandler -> - activityHandler.tryTrackThirdPartySharingI(adjustThirdPartySharing)); + executor.submit(() -> firstSessionDelayManager.preLaunchActionI(activityHandler -> + activityHandler.tryTrackThirdPartySharingI(adjustThirdPartySharing))); } @Override public void trackMeasurementConsent(final boolean consentMeasurement) { - firstSessionDelayManager.preLaunchAction(activityHandler -> - activityHandler.tryTrackMeasurementConsentI(consentMeasurement)); + executor.submit(() -> firstSessionDelayManager.preLaunchActionI(activityHandler -> + activityHandler.tryTrackMeasurementConsentI(consentMeasurement))); } @Override public void trackAdRevenue(final AdjustAdRevenue adjustAdRevenue) { - firstSessionDelayManager.apiAction(() -> trackAdRevenueI(adjustAdRevenue)); + executor.submit(() -> firstSessionDelayManager.apiActionI(() -> trackAdRevenueI(adjustAdRevenue))); } @Override public void trackPlayStoreSubscription(final AdjustPlayStoreSubscription subscription) { - firstSessionDelayManager.apiAction(() -> trackPlayStoreSubscriptionI(subscription)); + executor.submit(() -> firstSessionDelayManager.apiActionI(() -> trackPlayStoreSubscriptionI(subscription))); } @Override @@ -734,28 +732,30 @@ public void run() { } @Override - public void verifyPlayStorePurchase(final AdjustPlayStorePurchase purchase, final OnPurchaseVerificationFinishedListener callback) { - firstSessionDelayManager.apiAction(() -> verifyPlayStorePurchaseI(purchase, callback)); + public void verifyPlayStorePurchase(final AdjustPlayStorePurchase purchase, + final OnPurchaseVerificationFinishedListener callback) + { + executor.submit(() -> firstSessionDelayManager.apiActionI(() -> verifyPlayStorePurchaseI(purchase, callback))); } @Override public void verifyAndTrackPlayStorePurchase(AdjustEvent event, OnPurchaseVerificationFinishedListener callback) { - firstSessionDelayManager.apiAction(() -> verifyAndTrackPlayStorePurchaseI(event, callback)); + executor.submit(() -> firstSessionDelayManager.apiActionI(() -> verifyAndTrackPlayStorePurchaseI(event, callback))); } @Override public void stopFirstSessionDelay() { - firstSessionDelayManager.stopFirstSessionDelay(); + executor.submit(() -> firstSessionDelayManager.stopFirstSessionDelayI()); } @Override public void setCoppaComplianceInDelay(final boolean isCoppaComplianceEnabled) { - firstSessionDelayManager.setCoppaComplianceInDelay(isCoppaComplianceEnabled); + executor.submit(() -> firstSessionDelayManager.setCoppaComplianceInDelayI(isCoppaComplianceEnabled));; } @Override public void setExternalDeviceIdInDelay(final String externalDeviceId) { - firstSessionDelayManager.setExternalDeviceIdInDelay(externalDeviceId); + executor.submit(() -> firstSessionDelayManager.setExternalDeviceIdInDelayI(externalDeviceId)); } @Override @@ -763,7 +763,7 @@ public InternalState getInternalState() { return internalState; } - private void initI() { + void initI() { SESSION_INTERVAL = AdjustFactory.getSessionInterval(); SUBSESSION_INTERVAL = AdjustFactory.getSubsessionInterval(); // get timer values @@ -771,10 +771,6 @@ private void initI() { FOREGROUND_TIMER_START = AdjustFactory.getTimerStart(); BACKGROUND_TIMER_INTERVAL = AdjustFactory.getTimerInterval(); - // has to be read in the background - readAttributionI(adjustConfig.context); - readActivityStateI(adjustConfig.context); - globalParameters = new GlobalParameters(); readGlobalCallbackParametersI(adjustConfig.context); readGlobalPartnerParametersI(adjustConfig.context); @@ -792,7 +788,7 @@ public void run(ActivityHandler activityHandler) { }); } - if (internalState.hasFirstSdkStartOcurred()) { + if (activityState != null) { internalState.enabled = activityState.enabled; internalState.firstLaunch = false; } else { @@ -829,7 +825,7 @@ public void run(ActivityHandler activityHandler) { // push token if (adjustConfig.pushToken != null) { logger.info("Push token: '%s'", adjustConfig.pushToken); - if (internalState.hasFirstSdkStartOcurred()) { + if (activityState != null) { // since sdk has already started, try to send current push token setPushToken(adjustConfig.pushToken, false); } else { @@ -838,7 +834,7 @@ public void run(ActivityHandler activityHandler) { } } else { // since sdk has already started, check if there is a saved push from previous runs - if (internalState.hasFirstSdkStartOcurred()) { + if (activityState != null) { String savedPushToken = SharedPreferencesManager.getDefaultInstance(getContext()).getPushToken(); if(savedPushToken!=null) setPushToken(savedPushToken, true); @@ -854,7 +850,7 @@ public void run(ActivityHandler activityHandler) { handleAttributionCallbackI(); // GDPR - if (internalState.hasFirstSdkStartOcurred()) { + if (activityState != null) { SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getDefaultInstance(getContext()); if (sharedPreferencesManager.getGdprForgetMe()) { gdprForgetMe(); @@ -1206,7 +1202,7 @@ private void preLaunchActionsI(List preLaunchActionsArray) private void startI() { // check if it's the first sdk start - if (internalState.hasFirstSdkStartNotOcurred()) { + if (activityState == null) { AdjustSigner.onResume(adjustConfig.logger); startFirstSessionI(); return; @@ -1235,7 +1231,7 @@ private void startI() { private void startFirstSessionI() { activityState = new ActivityState(); - internalState.firstSdkStart = true; + //internalState.firstSdkStart = true; activityState.setEventDeduplicationIdsMaxSize(adjustConfig.getEventDeduplicationIdsMaxSize()); @@ -1790,7 +1786,7 @@ private void setEnabledI(boolean enabled) { // save new enabled state in internal state internalState.enabled = enabled; - if (internalState.hasFirstSdkStartNotOcurred()) { + if (activityState == null) { updateStatusI(!enabled, "Handlers will start as paused due to the SDK being disabled", "Handlers will still start as paused", @@ -1883,7 +1879,7 @@ private void setOfflineModeI(boolean offline) { internalState.offline = offline; - if (internalState.hasFirstSdkStartNotOcurred()) { + if (activityState == null) { updateStatusI(offline, "Handlers will start paused due to SDK being offline", "Handlers will still start as paused", @@ -1947,7 +1943,7 @@ private void sendReftagReferrerI() { if (!isEnabledI()) { return; } - if (internalState.hasFirstSdkStartNotOcurred()) { + if (activityState == null) { return; } @@ -1958,7 +1954,7 @@ private void sendPreinstallReferrerI() { if (!isEnabledI()) { return; } - if (internalState.hasFirstSdkStartNotOcurred()) { + if (activityState == null) { return; } @@ -2593,9 +2589,6 @@ private void readActivityStateI(Context context) { logger.error("Failed to read %s file (%s)", ACTIVITY_STATE_NAME, e.getMessage()); activityState = null; } - if (activityState != null) { - internalState.firstSdkStart = true; - } } private void readAttributionI(Context context) { @@ -2741,7 +2734,7 @@ private boolean checkAdjustAdRevenue(AdjustAdRevenue adjustAdRevenue) { } private boolean checkActivityStateI(ActivityState activityState) { - if (internalState.hasFirstSdkStartNotOcurred()) { + if (activityState == null) { logger.error("Sdk did not yet start"); return false; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java index a428b9865..a40b499d7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java @@ -7,7 +7,6 @@ class FirstSessionDelayManager { private final ActivityHandler activityHandler; private List apiActions; private String delayStatus; - private Runnable initBlock; public FirstSessionDelayManager( final ActivityHandler activityHandler) @@ -15,7 +14,7 @@ public FirstSessionDelayManager( this.activityHandler = activityHandler; apiActions = new ArrayList<>(); - +/* boolean delayFirstSession = activityHandler.getInternalState().isFirstLaunch() && activityHandler.getAdjustConfig().isFirstSessionDelayEnabled; @@ -24,41 +23,42 @@ public FirstSessionDelayManager( } else { delayStatus = "notSet"; } + + */ + delayStatus = "beforeFileRead"; } - public void stopFirstSessionDelay() { + public void stopFirstSessionDelayI() { if (!"started".equals(delayStatus)) { return; } delayStatus = "stopped"; - activityHandler.executor.submit(() -> { - initBlock.run(); - for (final Runnable apiAction : apiActions) { - apiAction.run(); - } - }); + activityHandler.initI(); + + for (final Runnable apiAction : apiActions) { + apiAction.run(); + } } - public void delayOrInit(final Runnable initBlock) { - if ("notStarted".equals(delayStatus)) { - this.initBlock = initBlock; + public void activityStateFileReadI() { + boolean delayFirstSession = activityHandler.getActivityState() == null + && activityHandler.getAdjustConfig().isFirstSessionDelayEnabled; + + if (delayFirstSession) { delayStatus = "started"; return; } + delayStatus = "notSet"; - if ("notSet".equals(delayStatus)) { - activityHandler.executor.submit(() -> { - initBlock.run(); - for (final Runnable apiAction : apiActions) { - apiAction.run(); - } - }); - return; + activityHandler.initI(); + + for (final Runnable apiAction : apiActions) { + apiAction.run(); } } - public void setCoppaComplianceInDelay(final boolean isCoppaComplianceEnabled) { + public void setCoppaComplianceInDelayI(final boolean isCoppaComplianceEnabled) { if (!"started".equals(delayStatus)) { return; } @@ -66,7 +66,7 @@ public void setCoppaComplianceInDelay(final boolean isCoppaComplianceEnabled) { activityHandler.getAdjustConfig().coppaComplianceEnabled = isCoppaComplianceEnabled; } - public void setExternalDeviceIdInDelay(final String externalDeviceId) { + public void setExternalDeviceIdInDelayI(final String externalDeviceId) { if (!"started".equals(delayStatus)) { return; } @@ -74,21 +74,19 @@ public void setExternalDeviceIdInDelay(final String externalDeviceId) { activityHandler.getAdjustConfig().externalDeviceId = externalDeviceId; } - public void apiAction(final Runnable runnable) { + public void apiActionI(final Runnable runnable) { if ("started".equals(delayStatus)) { apiActions.add(runnable); } else { - activityHandler.executor.submit(runnable); + runnable.run(); } } - public void preLaunchAction(final IRunActivityHandler runnableAH) { + public void preLaunchActionI(final IRunActivityHandler runnableAH) { if ("started".equals(delayStatus)) { activityHandler.getAdjustConfig().preLaunchActions.preLaunchActionsArray.add(runnableAH); } else { - activityHandler.executor.submit(() -> { - runnableAH.run(activityHandler); - }); + runnableAH.run(activityHandler); } } } From a28e56987873e8d1f6024dd5904e2de4d15b0105 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 28 Mar 2025 14:04:24 +0100 Subject: [PATCH 325/540] Rename stop to end --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 4 ++-- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 4 ++-- .../src/main/java/com/adjust/sdk/AdjustInstance.java | 6 +++--- .../main/java/com/adjust/sdk/FirstSessionDelayManager.java | 2 +- .../src/main/java/com/adjust/sdk/IActivityHandler.java | 2 +- .../main/java/com/adjust/testapp/AdjustCommandExecutor.java | 6 +++--- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index cf4193bc6..8f8acb9dd 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -744,8 +744,8 @@ public void verifyAndTrackPlayStorePurchase(AdjustEvent event, OnPurchaseVerific } @Override - public void stopFirstSessionDelay() { - executor.submit(() -> firstSessionDelayManager.stopFirstSessionDelayI()); + public void endFirstSessionDelay() { + executor.submit(() -> firstSessionDelayManager.endFirstSessionDelayI()); } @Override diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index d384fc667..e19df3e5f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -430,8 +430,8 @@ public static void verifyAndTrackPlayStorePurchase(final AdjustEvent event, OnPu adjustInstance.verifyAndTrackPlayStorePurchase(event, callback); } - public static void stopFirstSessionDelay() { - Adjust.getDefaultInstance().stopFirstSessionDelay(); + public static void endFirstSessionDelay() { + Adjust.getDefaultInstance().endFirstSessionDelay(); } public static void enableCoppaComplianceInDelay() { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index e2d2a5332..bc4c74c6e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -626,12 +626,12 @@ public void verifyAndTrackPlayStorePurchase(AdjustEvent event, OnPurchaseVerific activityHandler.verifyAndTrackPlayStorePurchase(event, callback); } - public void stopFirstSessionDelay() { - if (!checkActivityHandler("stopFirstSessionDelay")) { + public void endFirstSessionDelay() { + if (!checkActivityHandler("endFirstSessionDelay")) { return; } - activityHandler.stopFirstSessionDelay(); + activityHandler.endFirstSessionDelay(); } public void enableCoppaComplianceInDelay() { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java index a40b499d7..46683acee 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java @@ -28,7 +28,7 @@ public FirstSessionDelayManager( delayStatus = "beforeFileRead"; } - public void stopFirstSessionDelayI() { + public void endFirstSessionDelayI() { if (!"started".equals(delayStatus)) { return; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 60fdf7829..5b32895e7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -78,7 +78,7 @@ public interface IActivityHandler { void verifyAndTrackPlayStorePurchase(AdjustEvent event, OnPurchaseVerificationFinishedListener callback); - void stopFirstSessionDelay(); + void endFirstSessionDelay(); void setCoppaComplianceInDelay(final boolean isCoppaComplianceEnabled); diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 26b31de98..bd5591357 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -95,7 +95,7 @@ public void executeCommand(final Command sentCommand) { case "processDeeplink" : processDeeplink(); break; case "attributionGetter" : attributionGetter(); break; case "getLastDeeplink" : getLastDeeplink(); break; - case "stopFirstSessionDelay" : stopFirstSessionDelay(); break; + case "endFirstSessionDelay" : endFirstSessionDelay(); break; case "coppaComplianceInDelay" : coppaComplianceInDelay(); break; case "externalDeviceIdInDelay" : externalDeviceIdInDelay(); break; //case "testBegin": testBegin(); break; @@ -915,8 +915,8 @@ public void onLastDeeplinkRead(Uri deeplink) { }); } - private void stopFirstSessionDelay() { - Adjust.stopFirstSessionDelay(); + private void endFirstSessionDelay() { + Adjust.endFirstSessionDelay(); } private void coppaComplianceInDelay() { From 1ddbb9834af6c93d47830188ddf9df2e9d82ded8 Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 10 Apr 2025 10:10:34 +0200 Subject: [PATCH 326/540] Add feature flag --- .../java/com/adjust/sdk/ActivityHandler.java | 38 +++++++++++++------ .../com/adjust/sdk/AttributionHandler.java | 1 + .../adjust/sdk/FirstSessionDelayManager.java | 4 ++ .../java/com/adjust/sdk/IActivityHandler.java | 2 + .../java/com/adjust/sdk/PackageBuilder.java | 7 ++++ .../java/com/adjust/sdk/PackageFactory.java | 14 ++++++- .../java/com/adjust/sdk/SdkClickHandler.java | 4 +- 7 files changed, 55 insertions(+), 15 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 8f8acb9dd..14d54b01b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -285,6 +285,11 @@ public GlobalParameters getGlobalParameters() { return globalParameters; } + @Override + public FirstSessionDelayManager getFirstSessionDelayManager() { + return firstSessionDelayManager; + } + @Override public void init(AdjustConfig adjustConfig) { this.adjustConfig = adjustConfig; @@ -1473,7 +1478,8 @@ private void trackEventI(AdjustEvent event) { activityState.eventCount++; updateActivityStateI(now); - PackageBuilder eventBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, globalParameters, now); + PackageBuilder eventBuilder = new PackageBuilder( + adjustConfig, deviceInfo, activityState, globalParameters, firstSessionDelayManager, now); eventBuilder.internalState = internalState; ActivityPackage eventPackage = eventBuilder.buildEventPackage(event); packageHandler.addPackage(eventPackage); @@ -1989,6 +1995,7 @@ private void sendInstallReferrerI(ReferrerDetails referrerDetails, String referr adjustConfig, deviceInfo, globalParameters, + firstSessionDelayManager, internalState); sdkClickHandler.sendSdkClick(sdkClickPackage); @@ -2029,6 +2036,7 @@ private void processDeeplinkI(AdjustDeeplink deeplink, long clickTime) { adjustConfig, deviceInfo, globalParameters, + firstSessionDelayManager, internalState); if (sdkClickPackage == null) { @@ -2109,8 +2117,8 @@ public static boolean deleteGlobalPartnerParameters(Context context) { } private void transferSessionPackageI(long now) { - PackageBuilder builder = new PackageBuilder(adjustConfig, deviceInfo, activityState, - globalParameters, now); + PackageBuilder builder = new PackageBuilder( + adjustConfig, deviceInfo, activityState, globalParameters, firstSessionDelayManager, now); builder.internalState = internalState; ActivityPackage sessionPackage = builder.buildSessionPackage(); packageHandler.addPackage(sessionPackage); @@ -2299,7 +2307,8 @@ private void setPushTokenI(String token) { writeActivityStateI(); long now = System.currentTimeMillis(); - PackageBuilder infoPackageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, globalParameters, now); + PackageBuilder infoPackageBuilder = new PackageBuilder( + adjustConfig, deviceInfo, activityState, globalParameters, firstSessionDelayManager, now); infoPackageBuilder.internalState = internalState; ActivityPackage infoPackage = infoPackageBuilder.buildInfoPackage(Constants.PUSH); @@ -2320,7 +2329,8 @@ private void gdprForgetMeI() { writeActivityStateI(); long now = System.currentTimeMillis(); - PackageBuilder gdprPackageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, globalParameters, now); + PackageBuilder gdprPackageBuilder = new PackageBuilder( + adjustConfig, deviceInfo, activityState, globalParameters, firstSessionDelayManager, now); gdprPackageBuilder.internalState = internalState; ActivityPackage gdprPackage = gdprPackageBuilder.buildGdprPackage(); @@ -2360,7 +2370,7 @@ private boolean canTrackThirdPartySharingI() { private void trackThirdPartySharingI(final AdjustThirdPartySharing adjustThirdPartySharing) { long now = System.currentTimeMillis(); PackageBuilder packageBuilder = new PackageBuilder( - adjustConfig, deviceInfo, activityState, globalParameters, now); + adjustConfig, deviceInfo, activityState, globalParameters, firstSessionDelayManager, now); packageBuilder.internalState = internalState; ActivityPackage activityPackage = @@ -2390,7 +2400,7 @@ private boolean canTrackMeasurementConsentI() { private void trackMeasurementConsentI(final boolean consentMeasurement) { long now = System.currentTimeMillis(); PackageBuilder packageBuilder = new PackageBuilder( - adjustConfig, deviceInfo, activityState, globalParameters, now); + adjustConfig, deviceInfo, activityState, globalParameters, firstSessionDelayManager, now); packageBuilder.internalState = internalState; ActivityPackage activityPackage = @@ -2408,7 +2418,8 @@ private void trackAdRevenueI(AdjustAdRevenue adjustAdRevenue) { long now = System.currentTimeMillis(); - PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, globalParameters, now); + PackageBuilder packageBuilder = new PackageBuilder( + adjustConfig, deviceInfo, activityState, globalParameters, firstSessionDelayManager, now); packageBuilder.internalState = internalState; ActivityPackage adRevenuePackage = packageBuilder.buildAdRevenuePackage(adjustAdRevenue); @@ -2423,7 +2434,8 @@ private void trackPlayStoreSubscriptionI(final AdjustPlayStoreSubscription subsc long now = System.currentTimeMillis(); - PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, globalParameters, now); + PackageBuilder packageBuilder = new PackageBuilder( + adjustConfig, deviceInfo, activityState, globalParameters, firstSessionDelayManager, now); packageBuilder.internalState = internalState; ActivityPackage subscriptionPackage = packageBuilder.buildSubscriptionPackage(subscription); @@ -2486,7 +2498,8 @@ private void verifyPlayStorePurchaseI(final AdjustPlayStorePurchase purchase, } long now = System.currentTimeMillis(); - PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, globalParameters, now); + PackageBuilder packageBuilder = new PackageBuilder( + adjustConfig, deviceInfo, activityState, globalParameters, firstSessionDelayManager, now); packageBuilder.internalState = internalState; ActivityPackage verificationPackage = packageBuilder.buildVerificationPackage(purchase, callback); @@ -2558,7 +2571,8 @@ private void verifyAndTrackPlayStorePurchaseI(final AdjustEvent event, } long now = System.currentTimeMillis(); - PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, globalParameters, now); + PackageBuilder packageBuilder = new PackageBuilder( + adjustConfig, deviceInfo, activityState, globalParameters, firstSessionDelayManager, now); ActivityPackage verificationPackage = packageBuilder.buildVerificationPackage(event, callback); if (verificationPackage == null) { logger.warn("Purchase verification aborted because verification package is null"); @@ -2893,7 +2907,7 @@ private void disableThirdPartySharingForCoppaEnabledI() { long now = System.currentTimeMillis(); PackageBuilder packageBuilder = new PackageBuilder( - adjustConfig, deviceInfo, activityState, globalParameters, now); + adjustConfig, deviceInfo, activityState, globalParameters, firstSessionDelayManager, now); ActivityPackage activityPackage = packageBuilder.buildThirdPartySharingPackage(adjustThirdPartySharing); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java index 132fef0b7..02090c826 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java @@ -248,6 +248,7 @@ private ActivityPackage buildAndGetAttributionPackage(ActivityHandler.InternalSt activityHandler.getDeviceInfo(), activityHandler.getActivityState(), activityHandler.getGlobalParameters(), + activityHandler.getFirstSessionDelayManager(), now); packageBuilder.internalState = internalState; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java index 46683acee..0914fa489 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java @@ -89,4 +89,8 @@ public void preLaunchActionI(final IRunActivityHandler runnableAH) { runnableAH.run(activityHandler); } } + + public boolean wasSet() { + return ! "notSet".equals(delayStatus); + } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 5b32895e7..32dc65634 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -100,6 +100,8 @@ public interface IActivityHandler { GlobalParameters getGlobalParameters(); + FirstSessionDelayManager getFirstSessionDelayManager(); + ActivityHandler.InternalState getInternalState(); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 234e56306..88ffa556b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -23,6 +23,7 @@ public class PackageBuilder { private AdjustConfig adjustConfig; private ActivityStateCopy activityStateCopy; private GlobalParameters globalParameters; + private FirstSessionDelayManager firstSessionDelayManager; long clickTimeInSeconds = -1; long clickTimeInMilliseconds = -1; @@ -70,11 +71,13 @@ static class ActivityStateCopy { DeviceInfo deviceInfo, ActivityState activityState, GlobalParameters globalParameters, + FirstSessionDelayManager firstSessionDelayManager, long createdAt) { this.createdAt = createdAt; this.deviceInfo = deviceInfo; this.adjustConfig = adjustConfig; this.activityStateCopy = new ActivityStateCopy(activityState); + this.firstSessionDelayManager = firstSessionDelayManager; this.globalParameters = globalParameters; } @@ -1244,6 +1247,10 @@ private void injectFeatureFlagsWithParameters(Map parameters) { if (adjustConfig.playStoreKidsComplianceEnabled) { PackageBuilder.addLong(parameters, "ff_play_store_kids_app", 1); } + + if (firstSessionDelayManager.wasSet()) { + PackageBuilder.addBoolean(parameters, "ff_first_session_delay", true); + } } public static void addString(Map parameters, String key, String value) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java index 21495cfa5..fe81996a0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java @@ -25,7 +25,8 @@ public static ActivityPackage buildReftagSdkClickPackage(final String rawReferre final AdjustConfig adjustConfig, final DeviceInfo deviceInfo, final GlobalParameters globalParameters, - final ActivityHandler.InternalState internalState) { + final FirstSessionDelayManager firstSessionDelayManager, + final ActivityHandler.InternalState internalState) { if (rawReferrer == null || rawReferrer.length() == 0) { return null; } @@ -58,6 +59,7 @@ public static ActivityPackage buildReftagSdkClickPackage(final String rawReferre adjustConfig, deviceInfo, globalParameters, + firstSessionDelayManager, internalState); if (clickPackageBuilder == null) { @@ -80,6 +82,7 @@ public static ActivityPackage buildDeeplinkSdkClickPackage(final Uri url, final AdjustConfig adjustConfig, final DeviceInfo deviceInfo, final GlobalParameters globalParameters, + final FirstSessionDelayManager firstSessionDelayManager, final ActivityHandler.InternalState internalState) { if (url == null) { return null; @@ -119,6 +122,7 @@ public static ActivityPackage buildDeeplinkSdkClickPackage(final Uri url, adjustConfig, deviceInfo, globalParameters, + firstSessionDelayManager, internalState); if (clickPackageBuilder == null) { @@ -143,6 +147,7 @@ public static ActivityPackage buildInstallReferrerSdkClickPackage(final Referrer final AdjustConfig adjustConfig, final DeviceInfo deviceInfo, final GlobalParameters globalParameters, + final FirstSessionDelayManager firstSessionDelayManager, final ActivityHandler.InternalState internalState) { long now = System.currentTimeMillis(); @@ -151,6 +156,7 @@ public static ActivityPackage buildInstallReferrerSdkClickPackage(final Referrer deviceInfo, activityState, globalParameters, + firstSessionDelayManager, now); clickPackageBuilder.internalState = internalState; @@ -174,7 +180,8 @@ public static ActivityPackage buildPreinstallSdkClickPackage(final String preins final ActivityState activityState, final AdjustConfig adjustConfig, final DeviceInfo deviceInfo, - final GlobalParameters globalParameters) { + final GlobalParameters globalParameters, + final FirstSessionDelayManager firstSessionDelayManager) { if (preinstallPayload == null || preinstallPayload.length() == 0) { return null; } @@ -186,6 +193,7 @@ public static ActivityPackage buildPreinstallSdkClickPackage(final String preins deviceInfo, activityState, globalParameters, + firstSessionDelayManager, now); clickPackageBuilder.preinstallPayload = preinstallPayload; @@ -202,6 +210,7 @@ private static PackageBuilder queryStringClickPackageBuilder( final AdjustConfig adjustConfig, final DeviceInfo deviceInfo, final GlobalParameters globalParameters, + final FirstSessionDelayManager firstSessionDelayManager, final ActivityHandler.InternalState internalState) { if (queryList == null) { return null; @@ -233,6 +242,7 @@ private static PackageBuilder queryStringClickPackageBuilder( deviceInfo, activityState, globalParameters, + firstSessionDelayManager, now); builder.internalState = internalState; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java index 0e4813cfe..4044675c4 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -180,6 +180,7 @@ public void run() { activityHandler.getAdjustConfig(), activityHandler.getDeviceInfo(), activityHandler.getGlobalParameters(), + activityHandler.getFirstSessionDelayManager(), activityHandler.getInternalState()); // Send referrer sdk_click package. @@ -217,7 +218,8 @@ public void run() { activityHandler.getActivityState(), activityHandler.getAdjustConfig(), activityHandler.getDeviceInfo(), - activityHandler.getGlobalParameters()); + activityHandler.getGlobalParameters(), + activityHandler.getFirstSessionDelayManager()); // Send preinstall info sdk_click package. sendSdkClick(sdkClickPackage); From 34f4699859e3bed6b44b5429254a3bc203bb80b7 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 10 Apr 2025 15:15:37 +0200 Subject: [PATCH 327/540] feat: add logging about enqueueing first session delay actions --- .../java/com/adjust/sdk/ActivityHandler.java | 130 ++++++++++++------ .../adjust/sdk/FirstSessionDelayManager.java | 8 +- 2 files changed, 91 insertions(+), 47 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 14d54b01b..8aaf28130 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -204,7 +204,7 @@ public boolean hasPreinstallBeenRead() { @Override public void onActivityLifecycle(final boolean foregroundOrElseBackground) { try { executor.submit(() -> { - firstSessionDelayManager.apiActionI(() -> { + firstSessionDelayManager.apiActionI("activity state", () -> { if (internalState.foregroundOrElseBackground != null && internalState.foregroundOrElseBackground.booleanValue() == foregroundOrElseBackground) { @@ -364,7 +364,7 @@ public void onPauseI() { @Override public void trackEvent(final AdjustEvent event) { - executor.submit(() -> firstSessionDelayManager.apiActionI(() -> { + executor.submit(() -> firstSessionDelayManager.apiActionI("track event", () -> { if (activityState == null) { logger.warn("Event tracked before first activity resumed.\n" + "If it was triggered in the Application class, it might timestamp or even send an install long before the user opens the app.\n" + @@ -402,13 +402,16 @@ public void finishedTrackingActivity(ResponseData responseData) { @Override public void setEnabled(final boolean enabled) { - executor.submit(() -> firstSessionDelayManager.apiActionI(() -> - setEnabledI(enabled))); + executor.submit(() -> firstSessionDelayManager.apiActionI( + (enabled ? "enable" : "disable"), + () -> setEnabledI(enabled))); } @Override public void setOfflineMode(final boolean offline) { - executor.submit(() -> firstSessionDelayManager.apiActionI(() -> setOfflineModeI(offline))); + executor.submit(() -> firstSessionDelayManager.apiActionI( + (offline ? "put SDK in offline mode" : "put SDK back to online mode"), + () -> setOfflineModeI(offline))); } @Override @@ -418,8 +421,9 @@ public boolean isEnabled() { @Override public void isEnabled(final OnIsEnabledListener onIsEnabledListener) { - executor.submit(() -> firstSessionDelayManager.apiActionI(() -> - new Handler(adjustConfig.context.getMainLooper()).post( + executor.submit(() -> firstSessionDelayManager.apiActionI( + "is SDK enabled", + () -> new Handler(adjustConfig.context.getMainLooper()).post( () -> onIsEnabledListener.onIsEnabledRead(isEnabledI())))); } @@ -433,8 +437,9 @@ private boolean isEnabledI() { @Override public void processDeeplink(final AdjustDeeplink deeplink, final long clickTime) { - executor.submit(() -> firstSessionDelayManager.apiActionI(() -> - processDeeplinkI(deeplink, clickTime))); + executor.submit(() -> firstSessionDelayManager.apiActionI( + "process deep link", + () -> processDeeplinkI(deeplink, clickTime))); } @Override @@ -443,7 +448,9 @@ public void processAndResolveDeeplink(final AdjustDeeplink deeplink, final OnDeeplinkResolvedListener callback) { this.cachedDeeplinkResolutionCallback = callback; - executor.submit(() -> firstSessionDelayManager.apiActionI(() -> processDeeplinkI(deeplink, clickTime))); + executor.submit(() -> firstSessionDelayManager.apiActionI( + "process and resolve deep link", + () -> processDeeplinkI(deeplink, clickTime))); } private void updateAdidI(final String adid) { @@ -523,12 +530,16 @@ public void run() { @Override public void sendReftagReferrer() { - executor.submit(() -> firstSessionDelayManager.apiActionI(() -> sendReftagReferrerI())); + executor.submit(() -> firstSessionDelayManager.apiActionI( + "send referrer", + () -> sendReftagReferrerI())); } @Override public void sendPreinstallReferrer() { - executor.submit(() -> firstSessionDelayManager.apiActionI(() -> sendPreinstallReferrerI())); + executor.submit(() -> firstSessionDelayManager.apiActionI( + "send preinstall referrer", + () -> sendPreinstallReferrerI())); } @Override @@ -594,82 +605,107 @@ public void run() { @Override public void addGlobalCallbackParameter(final String key, final String value) { - executor.submit(() -> firstSessionDelayManager.preLaunchActionI(activityHandler -> - activityHandler.addGlobalCallbackParameterI(key, value))); + executor.submit(() -> firstSessionDelayManager.preLaunchActionI( + "add global callback parameter", + activityHandler -> + activityHandler.addGlobalCallbackParameterI(key, value))); } @Override public void addGlobalPartnerParameter(final String key, final String value) { - executor.submit(() -> firstSessionDelayManager.preLaunchActionI(activityHandler -> - activityHandler.addGlobalPartnerParameterI(key, value))); + executor.submit(() -> firstSessionDelayManager.preLaunchActionI( + "add global partner parameter", + activityHandler -> + activityHandler.addGlobalPartnerParameterI(key, value))); } @Override public void removeGlobalCallbackParameter(final String key) { - executor.submit(() -> firstSessionDelayManager.preLaunchActionI(activityHandler -> - activityHandler.removeGlobalCallbackParameterI(key))); + executor.submit(() -> firstSessionDelayManager.preLaunchActionI( + "remove global callback parameter", + activityHandler -> + activityHandler.removeGlobalCallbackParameterI(key))); } @Override public void removeGlobalPartnerParameter(final String key) { - executor.submit(() -> firstSessionDelayManager.preLaunchActionI(activityHandler -> - activityHandler.removeGlobalPartnerParameterI(key))); + executor.submit(() -> firstSessionDelayManager.preLaunchActionI( + "remove global partner parameter", + activityHandler -> + activityHandler.removeGlobalPartnerParameterI(key))); } @Override public void removeGlobalCallbackParameters() { - executor.submit(() -> firstSessionDelayManager.preLaunchActionI(activityHandler -> - activityHandler.removeGlobalCallbackParametersI())); + executor.submit(() -> firstSessionDelayManager.preLaunchActionI( + "remove global callback parameters", + activityHandler -> + activityHandler.removeGlobalCallbackParametersI())); } @Override public void removeGlobalPartnerParameters() { - executor.submit(() -> firstSessionDelayManager.preLaunchActionI(activityHandler -> - activityHandler.removeGlobalPartnerParametersI())); + executor.submit(() -> firstSessionDelayManager.preLaunchActionI( + "remove global partner parameters", + activityHandler -> + activityHandler.removeGlobalPartnerParametersI())); } @Override public void setPushToken(final String token, final boolean preSaved) { - executor.submit(() -> firstSessionDelayManager.apiActionI(() -> { - if (!preSaved) { - SharedPreferencesManager.getDefaultInstance(getContext()).savePushToken(token); - } + executor.submit(() -> firstSessionDelayManager.apiActionI( + "set push token", + () -> { + if (!preSaved) { + SharedPreferencesManager.getDefaultInstance(getContext()).savePushToken(token); + } - if (activityState == null) { - // No install has been tracked so far. - // Push token is saved, ready for the session package to pick it up. - return; - } else { - setPushTokenI(token); - } - })); + if (activityState == null) { + // No install has been tracked so far. + // Push token is saved, ready for the session package to pick it up. + return; + } else { + setPushTokenI(token); + } + } + )); } @Override public void gdprForgetMe() { - executor.submit(() -> firstSessionDelayManager.apiActionI(() -> gdprForgetMeI())); + executor.submit(() -> firstSessionDelayManager.apiActionI( + "GDPR forget device", + () -> gdprForgetMeI())); } @Override public void trackThirdPartySharing(final AdjustThirdPartySharing adjustThirdPartySharing) { - executor.submit(() -> firstSessionDelayManager.preLaunchActionI(activityHandler -> - activityHandler.tryTrackThirdPartySharingI(adjustThirdPartySharing))); + executor.submit(() -> firstSessionDelayManager.preLaunchActionI( + "track third party sharing", + activityHandler -> + activityHandler.tryTrackThirdPartySharingI(adjustThirdPartySharing))); } @Override public void trackMeasurementConsent(final boolean consentMeasurement) { - executor.submit(() -> firstSessionDelayManager.preLaunchActionI(activityHandler -> - activityHandler.tryTrackMeasurementConsentI(consentMeasurement))); + executor.submit(() -> firstSessionDelayManager.preLaunchActionI( + "track measurement consent", + activityHandler -> + activityHandler.tryTrackMeasurementConsentI(consentMeasurement))); } @Override public void trackAdRevenue(final AdjustAdRevenue adjustAdRevenue) { - executor.submit(() -> firstSessionDelayManager.apiActionI(() -> trackAdRevenueI(adjustAdRevenue))); + executor.submit(() -> firstSessionDelayManager.apiActionI( + "track ad revenue", + () -> trackAdRevenueI(adjustAdRevenue))); } @Override public void trackPlayStoreSubscription(final AdjustPlayStoreSubscription subscription) { - executor.submit(() -> firstSessionDelayManager.apiActionI(() -> trackPlayStoreSubscriptionI(subscription))); + executor.submit(() -> firstSessionDelayManager.apiActionI( + "track play store subscription", + () -> trackPlayStoreSubscriptionI(subscription))); } @Override @@ -740,12 +776,16 @@ public void run() { public void verifyPlayStorePurchase(final AdjustPlayStorePurchase purchase, final OnPurchaseVerificationFinishedListener callback) { - executor.submit(() -> firstSessionDelayManager.apiActionI(() -> verifyPlayStorePurchaseI(purchase, callback))); + executor.submit(() -> firstSessionDelayManager.apiActionI( + "verify play store purchase", + () -> verifyPlayStorePurchaseI(purchase, callback))); } @Override public void verifyAndTrackPlayStorePurchase(AdjustEvent event, OnPurchaseVerificationFinishedListener callback) { - executor.submit(() -> firstSessionDelayManager.apiActionI(() -> verifyAndTrackPlayStorePurchaseI(event, callback))); + executor.submit(() -> firstSessionDelayManager.apiActionI( + "verify and track play store purchase", + () -> verifyAndTrackPlayStorePurchaseI(event, callback))); } @Override diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java index 0914fa489..183ebfb07 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java @@ -74,16 +74,20 @@ public void setExternalDeviceIdInDelayI(final String externalDeviceId) { activityHandler.getAdjustConfig().externalDeviceId = externalDeviceId; } - public void apiActionI(final Runnable runnable) { + public void apiActionI(final String message, final Runnable runnable) { if ("started".equals(delayStatus)) { + activityHandler.getAdjustConfig().getLogger().debug( + "Enqueuing \"" + message + "\" action to be executed after first session delay ends"); apiActions.add(runnable); } else { runnable.run(); } } - public void preLaunchActionI(final IRunActivityHandler runnableAH) { + public void preLaunchActionI(final String message, final IRunActivityHandler runnableAH) { if ("started".equals(delayStatus)) { + activityHandler.getAdjustConfig().getLogger().debug( + "Enqueuing \"" + message + "\" action to be executed after first session delay ends"); activityHandler.getAdjustConfig().preLaunchActions.preLaunchActionsArray.add(runnableAH); } else { runnableAH.run(activityHandler); From 89a9186c97f85cbad489407c13003463470c7350 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 10 Apr 2025 15:22:03 +0200 Subject: [PATCH 328/540] add: first session delay in webbridge --- .../src/main/assets/adjust.js | 24 +++++++++++ .../src/main/assets/adjust_config.js | 5 +++ .../sdk/webbridge/AdjustBridgeInstance.java | 41 +++++++++++++++++++ .../src/main/assets/command_executor.js | 29 +++++++++++++ 4 files changed, 99 insertions(+) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index bbcb23663..27783c350 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -157,6 +157,30 @@ var Adjust = { } }, + endFirstSessionDelay: function() { + if (AdjustBridge) { + AdjustBridge.endFirstSessionDelay(); + } + }, + + enableCoppaComplianceInDelay: function() { + if (AdjustBridge) { + AdjustBridge.enableCoppaComplianceInDelay(); + } + }, + + disableCoppaComplianceInDelay: function() { + if (AdjustBridge) { + AdjustBridge.disableCoppaComplianceInDelay(); + } + }, + + setExternalDeviceIdInDelay: function(externalDeviceId) { + if (AdjustBridge) { + AdjustBridge.setExternalDeviceIdInDelay(externalDeviceId); + } + }, + getGoogleAdId: function (callback) { if (AdjustBridge) { if (typeof callback === 'string' || callback instanceof String) { diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js index f0c9b6b35..add8fc2e8 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -51,6 +51,7 @@ function AdjustConfig(appToken, environment, legacy) { this.fbAppId = null; this.shouldReadDeviceIdsOnce = null; this.eventDeduplicationIdsMaxSize = null; + this.isFirstSessionDelayEnabled = null; } AdjustConfig.EnvironmentSandbox = 'sandbox'; @@ -238,3 +239,7 @@ AdjustConfig.prototype.readDeviceIdsOnce = function() { AdjustConfig.prototype.setEventDeduplicationIdsMaxSize = function(eventDeduplicationIdsMaxSize) { this.eventDeduplicationIdsMaxSize = eventDeduplicationIdsMaxSize; }; + +AdjustConfig.prototype.enableFirstSessionDelay = function() { + this.isFirstSessionDelayEnabled = true; +}; diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 9c751fa64..dfd592c94 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -142,6 +142,7 @@ public void initSdk(String adjustConfigString) { Object fbAppIdField = jsonAdjustConfig.get("fbAppId"); Object shouldReadDeviceIdsOnceField = jsonAdjustConfig.get("shouldReadDeviceIdsOnce"); Object eventDeduplicationIdsMaxSizeField = jsonAdjustConfig.get("eventDeduplicationIdsMaxSize"); + Object isFirstSessionDelayEnabledField = jsonAdjustConfig.get("isFirstSessionDelayEnabled"); String appToken = AdjustBridgeUtil.fieldToString(appTokenField); String environment = AdjustBridgeUtil.fieldToString(environmentField); @@ -367,6 +368,14 @@ public boolean launchReceivedDeeplink(Uri deeplink) { adjustConfig.setEventDeduplicationIdsMaxSize(eventDeduplicationIdsMaxSize); } + // First session delay + Boolean isFirstSessionDelayEnabled = AdjustBridgeUtil.fieldToBoolean(isFirstSessionDelayEnabledField); + if (isFirstSessionDelayEnabled != null) { + if (isFirstSessionDelayEnabled) { + adjustConfig.enableFirstSessionDelay(); + } + } + Adjust.initSdk(adjustConfig); isInitialized = true; @@ -638,6 +647,38 @@ public void trackMeasurementConsent(String consentMeasurementString) { } } + @JavascriptInterface + public void endFirstSessionDelay() { + if (!isInitialized()) { + return; + } + Adjust.endFirstSessionDelay(); + } + + @JavascriptInterface + public void enableCoppaComplianceInDelay() { + if (!isInitialized()) { + return; + } + Adjust.enableCoppaComplianceInDelay(); + } + + @JavascriptInterface + public void disableCoppaComplianceInDelay() { + if (!isInitialized()) { + return; + } + Adjust.disableCoppaComplianceInDelay(); + } + + @JavascriptInterface + public void setExternalDeviceIdInDelay(String externalDeviceId) { + if (!isInitialized()) { + return; + } + Adjust.setExternalDeviceIdInDelay(externalDeviceId); + } + @JavascriptInterface public void getGoogleAdId(final String callback) { if (!isInitialized()) { diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index b27607706..859e170e3 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -136,6 +136,9 @@ AdjustCommandExecutor.prototype.executeCommand = function(command, idx) { case "measurementConsent" : this.measurementConsent(command.params); break; case "trackAdRevenue" : this.trackAdRevenue(command.params); break; case "attributionGetter" : this.attributionGetter(command.params); break; + case "endFirstSessionDelay" : this.endFirstSessionDelay(command.params); break; + case "coppaComplianceInDelay" : this.coppaComplianceInDelay(command.params); break; + case "externalDeviceIdInDelay" : this.externalDeviceIdInDelay(command.params); break; break; } @@ -331,6 +334,14 @@ AdjustCommandExecutor.prototype.config = function(params) { } } + if ('firstSessionDelayEnabled' in params) { + var firstSessionDelayEnabled = getFirstParameterValue(params, 'firstSessionDelayEnabled'); + var firstSessionDelayEnabled = firstSessionDelayEnabledS == 'true'; + if (firstSessionDelayEnabled == true) { + adjustConfig.enableFirstSessionDelay(); + } + } + if ('attributionCallbackSendAll' in params) { var basePath = this.basePath; adjustConfig.setAttributionCallback(function(attribution) { @@ -580,6 +591,24 @@ AdjustCommandExecutor.prototype.measurementConsent = function(params) { Adjust.trackMeasurementConsent(isEnabled); } +AdjustCommandExecutor.prototype.endFirstSessionDelay = function(params) { + Adjust.endFirstSessionDelay(); +} + +AdjustCommandExecutor.prototype.coppaComplianceInDelay = function(params) { + var enabled = getFirstParameterValue(params, "isEnabled") == 'true'; + if (enabled){ + Adjust.enableCoppaCompliance() + }else{ + Adjust.disableCoppaCompliance() + } +} + +AdjustCommandExecutor.prototype.externalDeviceIdInDelay = function(params) { + var externalDeviceId = getFirstParameterValue(params, "externalDeviceId"); + Adjust.setExternalDeviceId(externalDeviceId); +} + AdjustCommandExecutor.prototype.addGlobalCallbackParameter = function(params) { var list = getValueFromKey(params, "KeyValue"); From 1869a1348a47abc2ea4709ae92605867a0d6c140 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 10 Apr 2025 16:02:35 +0200 Subject: [PATCH 329/540] add: play store kids compliance in delay --- .../src/main/assets/adjust.js | 12 ++++++++++++ .../sdk/webbridge/AdjustBridgeInstance.java | 16 ++++++++++++++++ .../java/com/adjust/sdk/ActivityHandler.java | 5 +++++ .../src/main/java/com/adjust/sdk/Adjust.java | 10 ++++++++++ .../java/com/adjust/sdk/AdjustInstance.java | 17 +++++++++++++++++ .../adjust/sdk/FirstSessionDelayManager.java | 8 ++++++++ .../java/com/adjust/sdk/IActivityHandler.java | 2 ++ .../adjust/testapp/AdjustCommandExecutor.java | 11 +++++++++++ .../src/main/assets/command_executor.js | 10 ++++++++++ 9 files changed, 91 insertions(+) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 27783c350..daa94eb0e 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -175,6 +175,18 @@ var Adjust = { } }, + enablePlayStoreKidsComplianceInDelay: function() { + if (AdjustBridge) { + AdjustBridge.enablePlayStoreKidsComplianceInDelay(); + } + }, + + disablePlayStoreKidsComplianceInDelay: function() { + if (AdjustBridge) { + AdjustBridge.disablePlayStoreKidsComplianceInDelay(); + } + }, + setExternalDeviceIdInDelay: function(externalDeviceId) { if (AdjustBridge) { AdjustBridge.setExternalDeviceIdInDelay(externalDeviceId); diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index dfd592c94..f1a3279df 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -671,6 +671,22 @@ public void disableCoppaComplianceInDelay() { Adjust.disableCoppaComplianceInDelay(); } + @JavascriptInterface + public void enablePlayStoreKidsComplianceInDelay() { + if (!isInitialized()) { + return; + } + Adjust.enablePlayStoreKidsComplianceInDelay(); + } + + @JavascriptInterface + public void disablePlayStoreKidsComplianceInDelay() { + if (!isInitialized()) { + return; + } + Adjust.disablePlayStoreKidsComplianceInDelay(); + } + @JavascriptInterface public void setExternalDeviceIdInDelay(String externalDeviceId) { if (!isInitialized()) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 8aaf28130..41db40a01 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -798,6 +798,11 @@ public void setCoppaComplianceInDelay(final boolean isCoppaComplianceEnabled) { executor.submit(() -> firstSessionDelayManager.setCoppaComplianceInDelayI(isCoppaComplianceEnabled));; } + @Override + public void setPlayStoreKidsComplianceInDelay(final boolean isPlayStoreKidsComplianceEnabled) { + executor.submit(() -> firstSessionDelayManager.setPlayStoreKidsComplianceInDelayI(isPlayStoreKidsComplianceEnabled));; + } + @Override public void setExternalDeviceIdInDelay(final String externalDeviceId) { executor.submit(() -> firstSessionDelayManager.setExternalDeviceIdInDelayI(externalDeviceId)); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index e19df3e5f..76bd599f5 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -437,9 +437,19 @@ public static void endFirstSessionDelay() { public static void enableCoppaComplianceInDelay() { Adjust.getDefaultInstance().enableCoppaComplianceInDelay(); } + public static void disableCoppaComplianceInDelay() { Adjust.getDefaultInstance().disableCoppaComplianceInDelay(); } + + public static void enablePlayStoreKidsComplianceInDelay() { + Adjust.getDefaultInstance().enablePlayStoreKidsComplianceInDelay(); + } + + public static void disablePlayStoreKidsComplianceInDelay() { + Adjust.getDefaultInstance().disablePlayStoreKidsComplianceInDelay(); + } + public static void setExternalDeviceIdInDelay(final String externalDeviceId) { Adjust.getDefaultInstance().setExternalDeviceIdInDelay(externalDeviceId); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index bc4c74c6e..c334217fa 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -649,6 +649,23 @@ public void disableCoppaComplianceInDelay() { activityHandler.setCoppaComplianceInDelay(false); } + + public void enablePlayStoreKidsComplianceInDelay() { + if (!checkActivityHandler("enablePlayStoreKidsComplianceInDelay")) { + return; + } + + activityHandler.setPlayStoreKidsComplianceInDelay(true); + } + + public void disablePlayStoreKidsComplianceInDelay() { + if (!checkActivityHandler("disablePlayStoreKidsComplianceInDelay")) { + return; + } + + activityHandler.setPlayStoreKidsComplianceInDelay(false); + } + public void setExternalDeviceIdInDelay(final String externalDeviceId) { if (!checkActivityHandler("setExternalDeviceIdInDelay")) { return; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java index 183ebfb07..055b65762 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java @@ -66,6 +66,14 @@ public void setCoppaComplianceInDelayI(final boolean isCoppaComplianceEnabled) { activityHandler.getAdjustConfig().coppaComplianceEnabled = isCoppaComplianceEnabled; } + public void setPlayStoreKidsComplianceInDelayI(final boolean isPlayStoreKidsComplianceEnabled) { + if (!"started".equals(delayStatus)) { + return; + } + + activityHandler.getAdjustConfig().playStoreKidsComplianceEnabled = isPlayStoreKidsComplianceEnabled; + } + public void setExternalDeviceIdInDelayI(final String externalDeviceId) { if (!"started".equals(delayStatus)) { return; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 32dc65634..fa6746a6e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -82,6 +82,8 @@ public interface IActivityHandler { void setCoppaComplianceInDelay(final boolean isCoppaComplianceEnabled); + void setPlayStoreKidsComplianceInDelay(final boolean isPlayStoreKidsComplianceEnabled); + void setExternalDeviceIdInDelay(final String externalDeviceId); void gotOptOutResponse(); diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index bd5591357..ef9cbe7f7 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -97,6 +97,7 @@ public void executeCommand(final Command sentCommand) { case "getLastDeeplink" : getLastDeeplink(); break; case "endFirstSessionDelay" : endFirstSessionDelay(); break; case "coppaComplianceInDelay" : coppaComplianceInDelay(); break; + case "playStoreKidsComplianceInDelay" : playStoreKidsComplianceInDelay(); break; case "externalDeviceIdInDelay" : externalDeviceIdInDelay(); break; //case "testBegin": testBegin(); break; // case "testEnd": testEnd(); break; @@ -929,6 +930,16 @@ private void coppaComplianceInDelay() { } } + private void playStoreKidsComplianceInDelay() { + String isEnabledString = command.getFirstParameterValue("isEnabled"); + if ("true".equals(isEnabledString)) { + Adjust.enablePlayStoreKidsComplianceInDelay(); + } + if ("false".equals(isEnabledString)) { + Adjust.disablePlayStoreKidsComplianceInDelay(); + } + } + private void externalDeviceIdInDelay() { String externalDeviceId = command.getFirstParameterValue("externalDeviceId"); Adjust.setExternalDeviceIdInDelay(externalDeviceId); diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index 859e170e3..ecf04a409 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -138,6 +138,7 @@ AdjustCommandExecutor.prototype.executeCommand = function(command, idx) { case "attributionGetter" : this.attributionGetter(command.params); break; case "endFirstSessionDelay" : this.endFirstSessionDelay(command.params); break; case "coppaComplianceInDelay" : this.coppaComplianceInDelay(command.params); break; + case "playStoreKidsComplianceInDelay" : this.playStoreKidsComplianceInDelay(command.params); break; case "externalDeviceIdInDelay" : this.externalDeviceIdInDelay(command.params); break; break; } @@ -604,6 +605,15 @@ AdjustCommandExecutor.prototype.coppaComplianceInDelay = function(params) { } } +AdjustCommandExecutor.prototype.playStoreKidsComplianceInDelay = function(params) { + var enabled = getFirstParameterValue(params, "isEnabled") == 'true'; + if (enabled){ + Adjust.enablePlayStoreKidsCompliance() + }else{ + Adjust.disablePlayStoreKidsCompliance() + } +} + AdjustCommandExecutor.prototype.externalDeviceIdInDelay = function(params) { var externalDeviceId = getFirstParameterValue(params, "externalDeviceId"); Adjust.setExternalDeviceId(externalDeviceId); From 7935dd1ae0f11c349e0a84a92441f3664d224dbb Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 10 Apr 2025 16:57:26 +0200 Subject: [PATCH 330/540] fix: first session delay test failure in webbridge --- .../src/main/assets/command_executor.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index ecf04a409..3333c77d5 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -336,7 +336,7 @@ AdjustCommandExecutor.prototype.config = function(params) { } if ('firstSessionDelayEnabled' in params) { - var firstSessionDelayEnabled = getFirstParameterValue(params, 'firstSessionDelayEnabled'); + var firstSessionDelayEnabledS = getFirstParameterValue(params, 'firstSessionDelayEnabled'); var firstSessionDelayEnabled = firstSessionDelayEnabledS == 'true'; if (firstSessionDelayEnabled == true) { adjustConfig.enableFirstSessionDelay(); @@ -599,24 +599,24 @@ AdjustCommandExecutor.prototype.endFirstSessionDelay = function(params) { AdjustCommandExecutor.prototype.coppaComplianceInDelay = function(params) { var enabled = getFirstParameterValue(params, "isEnabled") == 'true'; if (enabled){ - Adjust.enableCoppaCompliance() + Adjust.enableCoppaComplianceInDelay() }else{ - Adjust.disableCoppaCompliance() + Adjust.disableCoppaComplianceInDelay() } } AdjustCommandExecutor.prototype.playStoreKidsComplianceInDelay = function(params) { var enabled = getFirstParameterValue(params, "isEnabled") == 'true'; if (enabled){ - Adjust.enablePlayStoreKidsCompliance() + Adjust.enablePlayStoreKidsComplianceInDelay() }else{ - Adjust.disablePlayStoreKidsCompliance() + Adjust.disablePlayStoreKidsComplianceInDelay() } } AdjustCommandExecutor.prototype.externalDeviceIdInDelay = function(params) { var externalDeviceId = getFirstParameterValue(params, "externalDeviceId"); - Adjust.setExternalDeviceId(externalDeviceId); + Adjust.setExternalDeviceIdInDelay(externalDeviceId); } AdjustCommandExecutor.prototype.addGlobalCallbackParameter = function(params) { From 5af0a62c69874f7ead629877526a1d5ebbdf94ff Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 11 Apr 2025 09:42:23 +0200 Subject: [PATCH 331/540] docs: add JavaDocs header --- .../src/main/java/com/adjust/sdk/Adjust.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 76bd599f5..79919affc 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -430,26 +430,51 @@ public static void verifyAndTrackPlayStorePurchase(final AdjustEvent event, OnPu adjustInstance.verifyAndTrackPlayStorePurchase(event, callback); } + /** + * Called to end the delay for first session to be sent to Adjust. + * + */ public static void endFirstSessionDelay() { Adjust.getDefaultInstance().endFirstSessionDelay(); } + /** + * Called to enable COPPA compliance while the SDK is in delayed first session state. + * + */ public static void enableCoppaComplianceInDelay() { Adjust.getDefaultInstance().enableCoppaComplianceInDelay(); } + /** + * Called to disable COPPA compliance while the SDK is in delayed first session state. + * + */ public static void disableCoppaComplianceInDelay() { Adjust.getDefaultInstance().disableCoppaComplianceInDelay(); } + /** + * Called to enable Play Store Kids compliance while the SDK is in delayed first session state. + * + */ public static void enablePlayStoreKidsComplianceInDelay() { Adjust.getDefaultInstance().enablePlayStoreKidsComplianceInDelay(); } + /** + * Called to disable Play Store Kids compliance while the SDK is in delayed first session state. + * + */ public static void disablePlayStoreKidsComplianceInDelay() { Adjust.getDefaultInstance().disablePlayStoreKidsComplianceInDelay(); } + /** + * Called to set external device ID while the SDK is in delayed first session state. + * + * @param externalDeviceId External device ID + */ public static void setExternalDeviceIdInDelay(final String externalDeviceId) { Adjust.getDefaultInstance().setExternalDeviceIdInDelay(externalDeviceId); } From 622539d06fe155163dc4605fdd3bd1e89dfc7803 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 11 Apr 2025 10:18:58 +0200 Subject: [PATCH 332/540] docs: update JavaDocs --- .../src/main/java/com/adjust/sdk/Adjust.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 79919affc..d75befd77 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -439,7 +439,8 @@ public static void endFirstSessionDelay() { } /** - * Called to enable COPPA compliance while the SDK is in delayed first session state. + * Called to enable COPPA (Children's Online Privacy Protection Act) compliance + * for the application when is in first session delay. * */ public static void enableCoppaComplianceInDelay() { @@ -447,7 +448,8 @@ public static void enableCoppaComplianceInDelay() { } /** - * Called to disable COPPA compliance while the SDK is in delayed first session state. + * Called to disable COPPA (Children's Online Privacy Protection Act) compliance + * for the application when is in first session delay. * */ public static void disableCoppaComplianceInDelay() { @@ -455,7 +457,8 @@ public static void disableCoppaComplianceInDelay() { } /** - * Called to enable Play Store Kids compliance while the SDK is in delayed first session state. + * Called to enable Play Store Kids App compliance for the application + * when is in first session delay. * */ public static void enablePlayStoreKidsComplianceInDelay() { @@ -463,7 +466,8 @@ public static void enablePlayStoreKidsComplianceInDelay() { } /** - * Called to disable Play Store Kids compliance while the SDK is in delayed first session state. + * Called to disable Play Store Kids App compliance for the application + * when is in first session delay. * */ public static void disablePlayStoreKidsComplianceInDelay() { @@ -471,7 +475,8 @@ public static void disablePlayStoreKidsComplianceInDelay() { } /** - * Called to set external device ID while the SDK is in delayed first session state. + * Called to set a custom defined unique device ID (optional) when is in first session delay. + * Note: Make sure to have a UNIQUE external ID for each user / device. * * @param externalDeviceId External device ID */ From d6492c97bfae8b3bab810cb60eb2276033a21381 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 11 Apr 2025 11:07:03 +0200 Subject: [PATCH 333/540] Small refac --- .../adjust/sdk/FirstSessionDelayManager.java | 77 ++++++++++--------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java index 055b65762..8a6662ade 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/FirstSessionDelayManager.java @@ -1,56 +1,63 @@ package com.adjust.sdk; +import androidx.annotation.IntDef; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; +@Retention(RetentionPolicy.SOURCE) +@IntDef({ + DelayState.BEFORE_FILE_READ, + DelayState.NOT_STARTED, + DelayState.NOT_SET, + DelayState.STARTED, + DelayState.ENDED +}) +@interface DelayState { + int BEFORE_FILE_READ = 0; + int NOT_STARTED = 1; + int NOT_SET = 2; + int STARTED = 3; + int ENDED = 4; +} + class FirstSessionDelayManager { private final ActivityHandler activityHandler; - private List apiActions; - private String delayStatus; + private final List apiActions; + private @DelayState int delayState; - public FirstSessionDelayManager( - final ActivityHandler activityHandler) - { + public FirstSessionDelayManager(final ActivityHandler activityHandler) { this.activityHandler = activityHandler; apiActions = new ArrayList<>(); -/* - boolean delayFirstSession = activityHandler.getInternalState().isFirstLaunch() - && activityHandler.getAdjustConfig().isFirstSessionDelayEnabled; - if (delayFirstSession) { - delayStatus = "notStarted"; - } else { - delayStatus = "notSet"; - } - - */ - delayStatus = "beforeFileRead"; + delayState = DelayState.BEFORE_FILE_READ; } public void endFirstSessionDelayI() { - if (!"started".equals(delayStatus)) { + if (delayState != DelayState.STARTED) { return; } - delayStatus = "stopped"; - - activityHandler.initI(); + delayState = DelayState.ENDED; - for (final Runnable apiAction : apiActions) { - apiAction.run(); - } + runInitActions(); } public void activityStateFileReadI() { - boolean delayFirstSession = activityHandler.getActivityState() == null - && activityHandler.getAdjustConfig().isFirstSessionDelayEnabled; + if (activityHandler.getActivityState() == null + && activityHandler.getAdjustConfig().isFirstSessionDelayEnabled) + { + delayState = DelayState.STARTED; + } else { + delayState = DelayState.NOT_SET; - if (delayFirstSession) { - delayStatus = "started"; - return; + runInitActions(); } - delayStatus = "notSet"; + } + private void runInitActions() { activityHandler.initI(); for (final Runnable apiAction : apiActions) { @@ -59,7 +66,7 @@ public void activityStateFileReadI() { } public void setCoppaComplianceInDelayI(final boolean isCoppaComplianceEnabled) { - if (!"started".equals(delayStatus)) { + if (delayState != DelayState.STARTED) { return; } @@ -67,7 +74,7 @@ public void setCoppaComplianceInDelayI(final boolean isCoppaComplianceEnabled) { } public void setPlayStoreKidsComplianceInDelayI(final boolean isPlayStoreKidsComplianceEnabled) { - if (!"started".equals(delayStatus)) { + if (delayState != DelayState.STARTED) { return; } @@ -75,7 +82,7 @@ public void setPlayStoreKidsComplianceInDelayI(final boolean isPlayStoreKidsComp } public void setExternalDeviceIdInDelayI(final String externalDeviceId) { - if (!"started".equals(delayStatus)) { + if (delayState != DelayState.STARTED) { return; } @@ -83,7 +90,7 @@ public void setExternalDeviceIdInDelayI(final String externalDeviceId) { } public void apiActionI(final String message, final Runnable runnable) { - if ("started".equals(delayStatus)) { + if (delayState == DelayState.STARTED) { activityHandler.getAdjustConfig().getLogger().debug( "Enqueuing \"" + message + "\" action to be executed after first session delay ends"); apiActions.add(runnable); @@ -93,7 +100,7 @@ public void apiActionI(final String message, final Runnable runnable) { } public void preLaunchActionI(final String message, final IRunActivityHandler runnableAH) { - if ("started".equals(delayStatus)) { + if (delayState == DelayState.STARTED) { activityHandler.getAdjustConfig().getLogger().debug( "Enqueuing \"" + message + "\" action to be executed after first session delay ends"); activityHandler.getAdjustConfig().preLaunchActions.preLaunchActionsArray.add(runnableAH); @@ -103,6 +110,6 @@ public void preLaunchActionI(final String message, final IRunActivityHandler run } public boolean wasSet() { - return ! "notSet".equals(delayStatus); + return delayState != DelayState.NOT_SET && delayState != DelayState.BEFORE_FILE_READ; } } From c7cc15d86c8fd7641abd2d0c08f6fec45dd0a9c5 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 15 Apr 2025 13:00:50 +0200 Subject: [PATCH 334/540] docs: update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c757137b0..a7f503123 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### Version 5.3.0 (16th April 2025) +#### Added +- Added ability to initialize the SDK for the first session in delayed mode. You can start the SDK in the delayed mode by calling the `enableFirstSessionDelay` method on your `AdjustConfig` instance. To end the delay, make sure to call `endFirstSessionDelay` method of `Adjust` instance. + +--- + ### Version 5.2.0 (24th March 2025) #### Added - Added ability to send organic search referrer together with deep link. From 64b30e85f0a08aa2a1f8f84678b5ba7bd8a6e36d Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 15 Apr 2025 13:02:36 +0200 Subject: [PATCH 335/540] feat: update version number to 5.3.0 --- Adjust/build.gradle | 2 +- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-imei/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-oaid/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java | 2 +- VERSION | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index bf151937a..809e23e41 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 35 coreTargetSdkVersion = 35 - coreVersionName = '5.2.0' + coreVersionName = '5.3.0' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index bad9ee36b..08710aaa1 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.2.0' + // implementation 'com.adjust.sdk:adjust-android:5.3.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index 11098c2bd..f7838f5c8 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.2.0' + // implementation 'com.adjust.sdk:adjust-android:5.3.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index 209cb892c..950d50bbe 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.2.0' + // implementation 'com.adjust.sdk:adjust-android:5.3.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index 3c123b3fc..d0ca992f8 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.2.0' + // implementation 'com.adjust.sdk:adjust-android:5.3.0' implementation 'com.huawei.hms:ads-identifier:3.4.56.300' } diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index deac83006..d46614194 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.2.0' + // implementation 'com.adjust.sdk:adjust-android:5.3.0' // Add Samsung clouddev lib. compileOnly fileTree(include: ['*.aar'], dir: 'libs') diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index 1f31e5f61..77e4556b6 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.2.0' + // implementation 'com.adjust.sdk:adjust-android:5.3.0' // Add Samsung referrer lib via Maven. implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:3.0.1' diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index a5a01b5a2..4974ec242 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.2.0' + // implementation 'com.adjust.sdk:adjust-android:5.3.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index cf05f403e..40b6b0161 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.2.0' + // implementation 'com.adjust.sdk:adjust-android:5.3.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index daa94eb0e..b61aea711 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -295,7 +295,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge5.2.0'; + return 'web-bridge5.3.0'; } }, diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index bec25246f..a9444ebff 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -31,7 +31,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.2.0' + // implementation 'com.adjust.sdk:adjust-android:5.3.0' // Add xiaomi referrer lib via Maven. implementation 'com.miui.referrer:homereferrer:1.0.0.6' diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index d75befd77..82ab810b0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -32,7 +32,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.2.0"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.3.0"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index e2945ed6a..1d22b2f58 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -37,7 +37,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android5.2.0"; + String CLIENT_SDK = "android5.3.0"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/VERSION b/VERSION index 91ff57278..03f488b07 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.2.0 +5.3.0 From 2cdbdcd3089a457828d62bf6ceda64b9b10e16e9 Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 16 Apr 2025 13:40:52 +0200 Subject: [PATCH 336/540] docs: update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7f503123..4b7e944c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ### Version 5.3.0 (16th April 2025) #### Added -- Added ability to initialize the SDK for the first session in delayed mode. You can start the SDK in the delayed mode by calling the `enableFirstSessionDelay` method on your `AdjustConfig` instance. To end the delay, make sure to call `endFirstSessionDelay` method of `Adjust` instance. +- Added ability to initialize the SDK for the first session in delayed mode. You can start the SDK in the delayed mode by calling the `enableFirstSessionDelay` method on your `AdjustConfig` instance. To end the delay, make sure to call `endFirstSessionDelay` method of `Adjust` instance. For more details about this feature, refer to the [official documentation](https://dev.adjust.com/en/sdk/android/features/first-session-delay). --- From 6cbe492ba74fd871a6b16c5819b17d440be08243 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 25 Feb 2025 14:50:58 +0100 Subject: [PATCH 337/540] feat: add support for store type --- .../java/com/adjust/sdk/AdjustConfig.java | 9 ++++ .../java/com/adjust/sdk/AdjustStoreInfo.java | 19 +++++++ .../main/java/com/adjust/sdk/DeviceInfo.java | 6 +++ .../java/com/adjust/sdk/PackageBuilder.java | 11 ++++ .../java/com/adjust/sdk/StoreInfoUtil.java | 51 +++++++++++++++++++ 5 files changed, 96 insertions(+) create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustStoreInfo.java create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index f68a7aaaf..1da414464 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -47,6 +47,7 @@ public class AdjustConfig { Integer eventDeduplicationIdsMaxSize; ArrayList cachedAttributionReadCallbacks = new ArrayList<>(); boolean isFirstSessionDelayEnabled; + AdjustStoreInfo adjustStoreInfo; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; @@ -161,6 +162,10 @@ public void enableFirstSessionDelay() { this.isFirstSessionDelayEnabled = true; } + public void setAdjustStoreInfo(AdjustStoreInfo adjustStoreInfo) { + this.adjustStoreInfo = adjustStoreInfo; + } + public void setOnAttributionChangedListener(OnAttributionChangedListener onAttributionChangedListener) { this.onAttributionChangedListener = onAttributionChangedListener; } @@ -253,6 +258,10 @@ public boolean isDeviceIdsReadingOnceEnabled() { return isDeviceIdsReadingOnceEnabled; } + public AdjustStoreInfo getAdjustStoreInfo() { + return adjustStoreInfo; + } + public OnAttributionChangedListener getOnAttributionChangedListener() { return onAttributionChangedListener; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustStoreInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustStoreInfo.java new file mode 100644 index 000000000..87cfd576e --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustStoreInfo.java @@ -0,0 +1,19 @@ +package com.adjust.sdk; + +public class AdjustStoreInfo { + String storeType; + String appId; + + public AdjustStoreInfo(String storeType, String appId) { + this.storeType = storeType; + this.appId = appId; + } + + public String getStoreType() { + return storeType; + } + + public String getAppId() { + return appId; + } +} diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 8f5e50634..a27912c34 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -100,6 +100,9 @@ class DeviceInfo { int connectivityType; String mcc; String mnc; + AdjustStoreInfo storeInfoApi; + AdjustStoreInfo storeInfoMetadata; + String storeIdSystem; DeviceInfo(AdjustConfig adjustConfig) { Context context = adjustConfig.context; @@ -137,6 +140,9 @@ class DeviceInfo { if (Util.canReadPlayIds(adjustConfig)) { appSetId = Reflection.getAppSetId(context); } + storeInfoApi = StoreInfoUtil.getStoreInfoFromApi(adjustConfig); + storeInfoMetadata = StoreInfoUtil.getStoreInfoFromMetadata(context); + storeIdSystem = StoreInfoUtil.getStoreIdFromSystem(context); } void reloadPlayIds(final AdjustConfig adjustConfig) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 88ffa556b..39d7b0967 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -306,6 +306,17 @@ private Map getSessionParameters() { JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + // store info + if (deviceInfo.storeInfoApi != null) { + PackageBuilder.addString(parameters, "store_a", deviceInfo.storeInfoApi.storeType); + PackageBuilder.addString(parameters, "app_id_a", deviceInfo.storeInfoApi.appId); + } + if (deviceInfo.storeInfoMetadata != null) { + PackageBuilder.addString(parameters, "store_m", deviceInfo.storeInfoMetadata.storeType); + PackageBuilder.addString(parameters, "app_id_m", deviceInfo.storeInfoMetadata.appId); + } + PackageBuilder.addString(parameters, "store_s", deviceInfo.storeIdSystem); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java new file mode 100644 index 000000000..f070036ed --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java @@ -0,0 +1,51 @@ +package com.adjust.sdk; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.InstallSourceInfo; +import android.content.pm.PackageManager; +import android.os.Build; +import android.os.Bundle; + +public class StoreInfoUtil { + public static String getStoreIdFromSystem(final Context context) { + try { + PackageManager packageManager = context.getPackageManager(); + String packageName = context.getPackageName(); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + InstallSourceInfo installSourceInfo = packageManager.getInstallSourceInfo(packageName); + return installSourceInfo.getInstallingPackageName(); + } else { + return packageManager.getInstallerPackageName(packageName); + } + } catch (Exception e) { + return null; + } + } + + public static AdjustStoreInfo getStoreInfoFromMetadata(final Context context) { + try { + ApplicationInfo applicationInfo = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); + Bundle metaData = applicationInfo.metaData; + if (metaData == null) { + return null; + } + + String storeType = metaData.getString("ADJUST_STORE_TYPE"); + String storeAppId = metaData.getString("ADJUST_STORE_APP_ID"); + + if (storeType == null || storeAppId == null) { + return null; + } + + return new AdjustStoreInfo(storeType, storeAppId); + } catch (Exception e) { + return null; + } + } + + public static AdjustStoreInfo getStoreInfoFromApi(final AdjustConfig adjustConfig) { + return adjustConfig.adjustStoreInfo; + } +} From 2872fc20d8c52f7c4cd888639bf26da591184b94 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 4 Mar 2025 13:54:02 +0100 Subject: [PATCH 338/540] feat: add store info to params of all various packages --- .../java/com/adjust/sdk/PackageBuilder.java | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 39d7b0967..55b4fdced 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -307,15 +307,7 @@ private Map getSessionParameters() { PackageBuilder.addJsonObject(parameters, "control_params", controlParams); // store info - if (deviceInfo.storeInfoApi != null) { - PackageBuilder.addString(parameters, "store_a", deviceInfo.storeInfoApi.storeType); - PackageBuilder.addString(parameters, "app_id_a", deviceInfo.storeInfoApi.appId); - } - if (deviceInfo.storeInfoMetadata != null) { - PackageBuilder.addString(parameters, "store_m", deviceInfo.storeInfoMetadata.storeType); - PackageBuilder.addString(parameters, "app_id_m", deviceInfo.storeInfoMetadata.appId); - } - PackageBuilder.addString(parameters, "store_s", deviceInfo.storeIdSystem); + injectStoreInfoToParameters(parameters); injectFeatureFlagsWithParameters(parameters); @@ -413,6 +405,9 @@ public Map getEventParameters(AdjustEvent event) { JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + // store info + injectStoreInfoToParameters(parameters); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -470,6 +465,9 @@ private Map getInfoParameters(String source) { JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + // store info + injectStoreInfoToParameters(parameters); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -582,6 +580,9 @@ private Map getClickParameters(String source) { JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + // store info + injectStoreInfoToParameters(parameters); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -954,6 +955,9 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + // store info + injectStoreInfoToParameters(parameters); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -1053,6 +1057,9 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + // store info + injectStoreInfoToParameters(parameters); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -1142,6 +1149,9 @@ private Map getVerificationParameters(AdjustPlayStorePurchase pu JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + // store info + injectStoreInfoToParameters(parameters); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -1230,6 +1240,9 @@ private Map getVerificationParameters(AdjustEvent event) { // google play games PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + // store info + injectStoreInfoToParameters(parameters); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -1264,6 +1277,18 @@ private void injectFeatureFlagsWithParameters(Map parameters) { } } + private void injectStoreInfoToParameters(Map parameters) { + if (deviceInfo.storeInfoApi != null) { + PackageBuilder.addString(parameters, "store_a", deviceInfo.storeInfoApi.storeType); + PackageBuilder.addString(parameters, "app_id_a", deviceInfo.storeInfoApi.appId); + } + if (deviceInfo.storeInfoMetadata != null) { + PackageBuilder.addString(parameters, "store_m", deviceInfo.storeInfoMetadata.storeType); + PackageBuilder.addString(parameters, "app_id_m", deviceInfo.storeInfoMetadata.appId); + } + PackageBuilder.addString(parameters, "store_s", deviceInfo.storeIdSystem); + } + public static void addString(Map parameters, String key, String value) { if (parameters == null) { return; From d89d4ef661570b1db4571a89acfde6f2376db953 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 7 Mar 2025 11:53:48 +0100 Subject: [PATCH 339/540] feat: add support for store type in webbridge --- .../src/main/assets/adjust_config.js | 7 +++++++ .../adjust/sdk/webbridge/AdjustBridgeInstance.java | 11 +++++++++++ 2 files changed, 18 insertions(+) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js index add8fc2e8..346b7c7ee 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -52,6 +52,8 @@ function AdjustConfig(appToken, environment, legacy) { this.shouldReadDeviceIdsOnce = null; this.eventDeduplicationIdsMaxSize = null; this.isFirstSessionDelayEnabled = null; + this.storeInfoType = null; + this.storeInfoAppId = null; } AdjustConfig.EnvironmentSandbox = 'sandbox'; @@ -243,3 +245,8 @@ AdjustConfig.prototype.setEventDeduplicationIdsMaxSize = function(eventDeduplica AdjustConfig.prototype.enableFirstSessionDelay = function() { this.isFirstSessionDelayEnabled = true; }; + +AdjustConfig.prototype.setStoreInfo = function(storeInfoType, storeInfoAppId) { + this.storeInfoType = storeInfoType; + this.storeInfoAppId = storeInfoAppId; +}; diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index f1a3279df..137154750 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -15,6 +15,7 @@ import com.adjust.sdk.AdjustFactory; import com.adjust.sdk.AdjustSessionFailure; import com.adjust.sdk.AdjustSessionSuccess; +import com.adjust.sdk.AdjustStoreInfo; import com.adjust.sdk.AdjustThirdPartySharing; import com.adjust.sdk.LogLevel; import com.adjust.sdk.OnAdidReadListener; @@ -143,6 +144,8 @@ public void initSdk(String adjustConfigString) { Object shouldReadDeviceIdsOnceField = jsonAdjustConfig.get("shouldReadDeviceIdsOnce"); Object eventDeduplicationIdsMaxSizeField = jsonAdjustConfig.get("eventDeduplicationIdsMaxSize"); Object isFirstSessionDelayEnabledField = jsonAdjustConfig.get("isFirstSessionDelayEnabled"); + Object storeInfoTypeField = jsonAdjustConfig.get("storeInfoType"); + Object storeInfoAppIdField = jsonAdjustConfig.get("storeInfoAppId"); String appToken = AdjustBridgeUtil.fieldToString(appTokenField); String environment = AdjustBridgeUtil.fieldToString(environmentField); @@ -376,6 +379,14 @@ public boolean launchReceivedDeeplink(Uri deeplink) { } } + // store info + String storeInfoType = AdjustBridgeUtil.fieldToString(storeInfoTypeField); + String storeInfoAppId = AdjustBridgeUtil.fieldToString(storeInfoAppIdField); + if (storeInfoType != null || storeInfoAppId != null) { + AdjustStoreInfo adjustStoreInfo = new AdjustStoreInfo(storeInfoType, storeInfoAppId); + adjustConfig.setAdjustStoreInfo(adjustStoreInfo); + } + Adjust.initSdk(adjustConfig); isInitialized = true; From f9b0185ed864fe7d905052efd4916d5166fd57bd Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 10 Mar 2025 14:18:26 +0100 Subject: [PATCH 340/540] refac: remove adding of store info into params of packages other than session --- .../java/com/adjust/sdk/PackageBuilder.java | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 55b4fdced..6afce80f9 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -405,9 +405,6 @@ public Map getEventParameters(AdjustEvent event) { JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); PackageBuilder.addJsonObject(parameters, "control_params", controlParams); - // store info - injectStoreInfoToParameters(parameters); - injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -465,9 +462,6 @@ private Map getInfoParameters(String source) { JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); PackageBuilder.addJsonObject(parameters, "control_params", controlParams); - // store info - injectStoreInfoToParameters(parameters); - injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -580,9 +574,6 @@ private Map getClickParameters(String source) { JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); PackageBuilder.addJsonObject(parameters, "control_params", controlParams); - // store info - injectStoreInfoToParameters(parameters); - injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -955,9 +946,6 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); PackageBuilder.addJsonObject(parameters, "control_params", controlParams); - // store info - injectStoreInfoToParameters(parameters); - injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -1057,9 +1045,6 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); PackageBuilder.addJsonObject(parameters, "control_params", controlParams); - // store info - injectStoreInfoToParameters(parameters); - injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -1149,9 +1134,6 @@ private Map getVerificationParameters(AdjustPlayStorePurchase pu JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); PackageBuilder.addJsonObject(parameters, "control_params", controlParams); - // store info - injectStoreInfoToParameters(parameters); - injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); @@ -1240,9 +1222,6 @@ private Map getVerificationParameters(AdjustEvent event) { // google play games PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); - // store info - injectStoreInfoToParameters(parameters); - injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); From 32ca345ad770e446614bedfe7df85139bce712c3 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 10 Mar 2025 14:55:16 +0100 Subject: [PATCH 341/540] refac: renaming store info params and related methods --- .../src/main/java/com/adjust/sdk/DeviceInfo.java | 4 ++-- .../src/main/java/com/adjust/sdk/PackageBuilder.java | 12 ++++++------ .../src/main/java/com/adjust/sdk/StoreInfoUtil.java | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index a27912c34..3b4331f02 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -101,7 +101,7 @@ class DeviceInfo { String mcc; String mnc; AdjustStoreInfo storeInfoApi; - AdjustStoreInfo storeInfoMetadata; + AdjustStoreInfo storeInfoManifest; String storeIdSystem; DeviceInfo(AdjustConfig adjustConfig) { @@ -141,7 +141,7 @@ class DeviceInfo { appSetId = Reflection.getAppSetId(context); } storeInfoApi = StoreInfoUtil.getStoreInfoFromApi(adjustConfig); - storeInfoMetadata = StoreInfoUtil.getStoreInfoFromMetadata(context); + storeInfoManifest = StoreInfoUtil.getStoreInfoFromManifest(context); storeIdSystem = StoreInfoUtil.getStoreIdFromSystem(context); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 6afce80f9..f3ae43e8e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -1258,14 +1258,14 @@ private void injectFeatureFlagsWithParameters(Map parameters) { private void injectStoreInfoToParameters(Map parameters) { if (deviceInfo.storeInfoApi != null) { - PackageBuilder.addString(parameters, "store_a", deviceInfo.storeInfoApi.storeType); - PackageBuilder.addString(parameters, "app_id_a", deviceInfo.storeInfoApi.appId); + PackageBuilder.addString(parameters, "store_api", deviceInfo.storeInfoApi.storeType); + PackageBuilder.addString(parameters, "app_id_api", deviceInfo.storeInfoApi.appId); } - if (deviceInfo.storeInfoMetadata != null) { - PackageBuilder.addString(parameters, "store_m", deviceInfo.storeInfoMetadata.storeType); - PackageBuilder.addString(parameters, "app_id_m", deviceInfo.storeInfoMetadata.appId); + if (deviceInfo.storeInfoManifest != null) { + PackageBuilder.addString(parameters, "store_manifest", deviceInfo.storeInfoManifest.storeType); + PackageBuilder.addString(parameters, "app_id_manifest", deviceInfo.storeInfoManifest.appId); } - PackageBuilder.addString(parameters, "store_s", deviceInfo.storeIdSystem); + PackageBuilder.addString(parameters, "store_system", deviceInfo.storeIdSystem); } public static void addString(Map parameters, String key, String value) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java index f070036ed..14810e0aa 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java @@ -24,7 +24,7 @@ public static String getStoreIdFromSystem(final Context context) { } } - public static AdjustStoreInfo getStoreInfoFromMetadata(final Context context) { + public static AdjustStoreInfo getStoreInfoFromManifest(final Context context) { try { ApplicationInfo applicationInfo = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); Bundle metaData = applicationInfo.metaData; From 81432f6b48e65be9ca6716934c3bd6599929b675 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 24 Mar 2025 15:38:25 +0100 Subject: [PATCH 342/540] feat: update store info logic --- .../java/com/adjust/sdk/AdjustStoreInfo.java | 18 +++++++-------- .../main/java/com/adjust/sdk/DeviceInfo.java | 10 ++++----- .../java/com/adjust/sdk/PackageBuilder.java | 12 ++++------ .../java/com/adjust/sdk/StoreInfoUtil.java | 22 ++++++++----------- 4 files changed, 26 insertions(+), 36 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustStoreInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustStoreInfo.java index 87cfd576e..44baaac0e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustStoreInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustStoreInfo.java @@ -1,19 +1,19 @@ package com.adjust.sdk; public class AdjustStoreInfo { - String storeType; - String appId; + String storeName; + String storeAppId; - public AdjustStoreInfo(String storeType, String appId) { - this.storeType = storeType; - this.appId = appId; + public AdjustStoreInfo(String storeName, String storeAppId) { + this.storeName = storeName; + this.storeAppId = storeAppId; } - public String getStoreType() { - return storeType; + public String getStoreName() { + return storeName; } - public String getAppId() { - return appId; + public String getStoreAppId() { + return storeAppId; } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 3b4331f02..b2204e49e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -100,9 +100,8 @@ class DeviceInfo { int connectivityType; String mcc; String mnc; - AdjustStoreInfo storeInfoApi; - AdjustStoreInfo storeInfoManifest; - String storeIdSystem; + AdjustStoreInfo storeInfoFromClient; + String storeIdFromSystem; DeviceInfo(AdjustConfig adjustConfig) { Context context = adjustConfig.context; @@ -140,9 +139,8 @@ class DeviceInfo { if (Util.canReadPlayIds(adjustConfig)) { appSetId = Reflection.getAppSetId(context); } - storeInfoApi = StoreInfoUtil.getStoreInfoFromApi(adjustConfig); - storeInfoManifest = StoreInfoUtil.getStoreInfoFromManifest(context); - storeIdSystem = StoreInfoUtil.getStoreIdFromSystem(context); + storeInfoFromClient = StoreInfoUtil.getStoreInfoFromClient(adjustConfig, context); + storeIdFromSystem = StoreInfoUtil.getStoreIdFromSystem(context); } void reloadPlayIds(final AdjustConfig adjustConfig) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index f3ae43e8e..d7b624898 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -1257,15 +1257,11 @@ private void injectFeatureFlagsWithParameters(Map parameters) { } private void injectStoreInfoToParameters(Map parameters) { - if (deviceInfo.storeInfoApi != null) { - PackageBuilder.addString(parameters, "store_api", deviceInfo.storeInfoApi.storeType); - PackageBuilder.addString(parameters, "app_id_api", deviceInfo.storeInfoApi.appId); + if (deviceInfo.storeInfoFromClient != null) { + PackageBuilder.addString(parameters, "store_name_from_client", deviceInfo.storeInfoFromClient.storeName); + PackageBuilder.addString(parameters, "store_app_id_from_client", deviceInfo.storeInfoFromClient.storeAppId); } - if (deviceInfo.storeInfoManifest != null) { - PackageBuilder.addString(parameters, "store_manifest", deviceInfo.storeInfoManifest.storeType); - PackageBuilder.addString(parameters, "app_id_manifest", deviceInfo.storeInfoManifest.appId); - } - PackageBuilder.addString(parameters, "store_system", deviceInfo.storeIdSystem); + PackageBuilder.addString(parameters, "store_name_from_system", deviceInfo.storeIdFromSystem); } public static void addString(Map parameters, String key, String value) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java index 14810e0aa..09e5fec85 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java @@ -24,28 +24,24 @@ public static String getStoreIdFromSystem(final Context context) { } } - public static AdjustStoreInfo getStoreInfoFromManifest(final Context context) { + public static AdjustStoreInfo getStoreInfoFromClient(final AdjustConfig adjustConfig, final Context context) { try { ApplicationInfo applicationInfo = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); Bundle metaData = applicationInfo.metaData; if (metaData == null) { - return null; + return adjustConfig.adjustStoreInfo; } - String storeType = metaData.getString("ADJUST_STORE_TYPE"); - String storeAppId = metaData.getString("ADJUST_STORE_APP_ID"); - - if (storeType == null || storeAppId == null) { - return null; + String storeName = metaData.getString("ADJUST_STORE_NAME"); + if (storeName == null || storeName.isEmpty()) { + return adjustConfig.adjustStoreInfo; } - return new AdjustStoreInfo(storeType, storeAppId); + String storeAppId = metaData.getString("ADJUST_STORE_APP_ID"); + + return new AdjustStoreInfo(storeName, storeAppId); } catch (Exception e) { - return null; + return adjustConfig.adjustStoreInfo; } } - - public static AdjustStoreInfo getStoreInfoFromApi(final AdjustConfig adjustConfig) { - return adjustConfig.adjustStoreInfo; - } } From 53ab1d331a7e5f04e2451b796154d4034e1a84d7 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 25 Mar 2025 10:11:23 +0100 Subject: [PATCH 343/540] refac: rename store info variables --- .../src/main/assets/adjust_config.js | 8 ++++---- .../com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js index 346b7c7ee..c4f6ff754 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -52,7 +52,7 @@ function AdjustConfig(appToken, environment, legacy) { this.shouldReadDeviceIdsOnce = null; this.eventDeduplicationIdsMaxSize = null; this.isFirstSessionDelayEnabled = null; - this.storeInfoType = null; + this.storeInfoName = null; this.storeInfoAppId = null; } @@ -246,7 +246,7 @@ AdjustConfig.prototype.enableFirstSessionDelay = function() { this.isFirstSessionDelayEnabled = true; }; -AdjustConfig.prototype.setStoreInfo = function(storeInfoType, storeInfoAppId) { - this.storeInfoType = storeInfoType; - this.storeInfoAppId = storeInfoAppId; +AdjustConfig.prototype.setStoreInfo = function(storeName, storeAppId) { + this.storeInfoName = storeName; + this.storeInfoAppId = storeAppId; }; diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 137154750..30b1acc8d 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -144,7 +144,7 @@ public void initSdk(String adjustConfigString) { Object shouldReadDeviceIdsOnceField = jsonAdjustConfig.get("shouldReadDeviceIdsOnce"); Object eventDeduplicationIdsMaxSizeField = jsonAdjustConfig.get("eventDeduplicationIdsMaxSize"); Object isFirstSessionDelayEnabledField = jsonAdjustConfig.get("isFirstSessionDelayEnabled"); - Object storeInfoTypeField = jsonAdjustConfig.get("storeInfoType"); + Object storeInfoNameField = jsonAdjustConfig.get("storeInfoName"); Object storeInfoAppIdField = jsonAdjustConfig.get("storeInfoAppId"); String appToken = AdjustBridgeUtil.fieldToString(appTokenField); @@ -380,10 +380,10 @@ public boolean launchReceivedDeeplink(Uri deeplink) { } // store info - String storeInfoType = AdjustBridgeUtil.fieldToString(storeInfoTypeField); - String storeInfoAppId = AdjustBridgeUtil.fieldToString(storeInfoAppIdField); - if (storeInfoType != null || storeInfoAppId != null) { - AdjustStoreInfo adjustStoreInfo = new AdjustStoreInfo(storeInfoType, storeInfoAppId); + String storeName = AdjustBridgeUtil.fieldToString(storeInfoNameField); + String storeAppId = AdjustBridgeUtil.fieldToString(storeInfoAppIdField); + if (storeName != null || storeAppId != null) { + AdjustStoreInfo adjustStoreInfo = new AdjustStoreInfo(storeName, storeAppId); adjustConfig.setAdjustStoreInfo(adjustStoreInfo); } From 602ce418478a261796a5821a3081d2b0e1433998 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 31 Mar 2025 14:35:47 +0200 Subject: [PATCH 344/540] refac: make store app id optional --- .../sdk/webbridge/AdjustBridgeInstance.java | 5 ++-- .../java/com/adjust/sdk/AdjustStoreInfo.java | 25 ++++++++++++++----- .../java/com/adjust/sdk/StoreInfoUtil.java | 5 +++- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 30b1acc8d..090e3edbe 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -382,8 +382,9 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // store info String storeName = AdjustBridgeUtil.fieldToString(storeInfoNameField); String storeAppId = AdjustBridgeUtil.fieldToString(storeInfoAppIdField); - if (storeName != null || storeAppId != null) { - AdjustStoreInfo adjustStoreInfo = new AdjustStoreInfo(storeName, storeAppId); + if (storeName != null) { + AdjustStoreInfo adjustStoreInfo = new AdjustStoreInfo(storeName); + adjustStoreInfo.setStoreAppId(storeAppId); adjustConfig.setAdjustStoreInfo(adjustStoreInfo); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustStoreInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustStoreInfo.java index 44baaac0e..9ea069e1c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustStoreInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustStoreInfo.java @@ -4,16 +4,29 @@ public class AdjustStoreInfo { String storeName; String storeAppId; - public AdjustStoreInfo(String storeName, String storeAppId) { + private static final ILogger logger = AdjustFactory.getLogger(); + + public AdjustStoreInfo(String storeName) { + if (!isValidStore(storeName)) { + return; + } + this.storeName = storeName; - this.storeAppId = storeAppId; } - public String getStoreName() { - return storeName; + public void setStoreAppId(String storeAppId) { + this.storeAppId = storeAppId; } - public String getStoreAppId() { - return storeAppId; + private boolean isValidStore(final String storeName) { + if (storeName == null) { + logger.error("Missing store name"); + return false; + } + if (storeName.isEmpty()) { + logger.error("Store name can't be empty"); + return false; + } + return true; } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java index 09e5fec85..72a32593c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java @@ -39,7 +39,10 @@ public static AdjustStoreInfo getStoreInfoFromClient(final AdjustConfig adjustCo String storeAppId = metaData.getString("ADJUST_STORE_APP_ID"); - return new AdjustStoreInfo(storeName, storeAppId); + AdjustStoreInfo storeInfo = new AdjustStoreInfo(storeName); + storeInfo.setStoreAppId(storeAppId); + return storeInfo; + } catch (Exception e) { return adjustConfig.adjustStoreInfo; } From 6e0a59e17feb58dff8d3e1f1d9b794fedadf5965 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 18 Apr 2025 12:37:08 +0200 Subject: [PATCH 345/540] refac: update store info methods name --- .../java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 2 +- .../sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 090e3edbe..d5e38bc5a 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -385,7 +385,7 @@ public boolean launchReceivedDeeplink(Uri deeplink) { if (storeName != null) { AdjustStoreInfo adjustStoreInfo = new AdjustStoreInfo(storeName); adjustStoreInfo.setStoreAppId(storeAppId); - adjustConfig.setAdjustStoreInfo(adjustStoreInfo); + adjustConfig.setStoreInfo(adjustStoreInfo); } Adjust.initSdk(adjustConfig); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 1da414464..5464f8819 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -162,7 +162,7 @@ public void enableFirstSessionDelay() { this.isFirstSessionDelayEnabled = true; } - public void setAdjustStoreInfo(AdjustStoreInfo adjustStoreInfo) { + public void setStoreInfo(AdjustStoreInfo adjustStoreInfo) { this.adjustStoreInfo = adjustStoreInfo; } @@ -258,7 +258,7 @@ public boolean isDeviceIdsReadingOnceEnabled() { return isDeviceIdsReadingOnceEnabled; } - public AdjustStoreInfo getAdjustStoreInfo() { + public AdjustStoreInfo getStoreInfo() { return adjustStoreInfo; } From de3371f0ea84e144cb6da39b217b5f52b7b32ca4 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 18 Apr 2025 13:10:30 +0200 Subject: [PATCH 346/540] refac: keeping validation checks in core --- .../com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index d5e38bc5a..5350dae6c 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -382,11 +382,9 @@ public boolean launchReceivedDeeplink(Uri deeplink) { // store info String storeName = AdjustBridgeUtil.fieldToString(storeInfoNameField); String storeAppId = AdjustBridgeUtil.fieldToString(storeInfoAppIdField); - if (storeName != null) { - AdjustStoreInfo adjustStoreInfo = new AdjustStoreInfo(storeName); - adjustStoreInfo.setStoreAppId(storeAppId); - adjustConfig.setStoreInfo(adjustStoreInfo); - } + AdjustStoreInfo adjustStoreInfo = new AdjustStoreInfo(storeName); + adjustStoreInfo.setStoreAppId(storeAppId); + adjustConfig.setStoreInfo(adjustStoreInfo); Adjust.initSdk(adjustConfig); From b3af0100a8bd455b6bd5793e9235f7eb50e93ebf Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 18 Apr 2025 13:39:51 +0200 Subject: [PATCH 347/540] refac: add JS abstraction for store info --- .../src/main/assets/adjust_config.js | 8 +++--- .../src/main/assets/adjust_store_info.js | 8 ++++++ .../sdk/webbridge/AdjustBridgeInstance.java | 26 ++++++++++++++----- 3 files changed, 30 insertions(+), 12 deletions(-) create mode 100644 Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_store_info.js diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js index c4f6ff754..f7b8b9e4c 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -52,8 +52,7 @@ function AdjustConfig(appToken, environment, legacy) { this.shouldReadDeviceIdsOnce = null; this.eventDeduplicationIdsMaxSize = null; this.isFirstSessionDelayEnabled = null; - this.storeInfoName = null; - this.storeInfoAppId = null; + this.adjustStoreInfo = null; } AdjustConfig.EnvironmentSandbox = 'sandbox'; @@ -246,7 +245,6 @@ AdjustConfig.prototype.enableFirstSessionDelay = function() { this.isFirstSessionDelayEnabled = true; }; -AdjustConfig.prototype.setStoreInfo = function(storeName, storeAppId) { - this.storeInfoName = storeName; - this.storeInfoAppId = storeAppId; +AdjustConfig.prototype.setStoreInfo = function(adjustStoreInfo) { + this.adjustStoreInfo = JSON.stringify(adjustStoreInfo); }; diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_store_info.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_store_info.js new file mode 100644 index 000000000..d5b48848a --- /dev/null +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_store_info.js @@ -0,0 +1,8 @@ +function AdjustStoreInfo(storeName) { + this.storeName = storeName; + this.storeAppId = null; +} + +AdjustStoreInfo.prototype.setStoreAppId = function(storeAppId) { + this.storeAppId = storeAppId; +}; \ No newline at end of file diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 5350dae6c..27749ebda 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -144,8 +144,7 @@ public void initSdk(String adjustConfigString) { Object shouldReadDeviceIdsOnceField = jsonAdjustConfig.get("shouldReadDeviceIdsOnce"); Object eventDeduplicationIdsMaxSizeField = jsonAdjustConfig.get("eventDeduplicationIdsMaxSize"); Object isFirstSessionDelayEnabledField = jsonAdjustConfig.get("isFirstSessionDelayEnabled"); - Object storeInfoNameField = jsonAdjustConfig.get("storeInfoName"); - Object storeInfoAppIdField = jsonAdjustConfig.get("storeInfoAppId"); + Object adjustStoreInfoField = jsonAdjustConfig.get("adjustStoreInfo"); String appToken = AdjustBridgeUtil.fieldToString(appTokenField); String environment = AdjustBridgeUtil.fieldToString(environmentField); @@ -380,11 +379,24 @@ public boolean launchReceivedDeeplink(Uri deeplink) { } // store info - String storeName = AdjustBridgeUtil.fieldToString(storeInfoNameField); - String storeAppId = AdjustBridgeUtil.fieldToString(storeInfoAppIdField); - AdjustStoreInfo adjustStoreInfo = new AdjustStoreInfo(storeName); - adjustStoreInfo.setStoreAppId(storeAppId); - adjustConfig.setStoreInfo(adjustStoreInfo); + String adjustStoreInfoString = AdjustBridgeUtil.fieldToString(adjustStoreInfoField); + + try { + JSONObject jsonAdjustStoreInfo = new JSONObject(adjustStoreInfoString); + + Object storeNameField = jsonAdjustStoreInfo.get("storeName"); + Object storeAppIdField = jsonAdjustStoreInfo.get("storeAppId"); + + String storeName = AdjustBridgeUtil.fieldToString(storeNameField); + String storeAppId = AdjustBridgeUtil.fieldToString(storeAppIdField); + AdjustStoreInfo adjustStoreInfo = new AdjustStoreInfo(storeName); + adjustStoreInfo.setStoreAppId(storeAppId); + + // set store info + adjustConfig.setStoreInfo(adjustStoreInfo); + } catch (Exception e) { + AdjustFactory.getLogger().error("AdjustBridgeInstance adjustStoreInfo: %s", e.getMessage()); + } Adjust.initSdk(adjustConfig); From d12feaa2910361553c31641b1e022355728e5a89 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 28 Apr 2025 12:31:27 +0200 Subject: [PATCH 348/540] refac: rename adjustStoreInfo to storeInfo --- .../src/main/assets/adjust_config.js | 6 +++--- .../sdk/webbridge/AdjustBridgeInstance.java | 18 +++++++++--------- .../main/java/com/adjust/sdk/AdjustConfig.java | 8 ++++---- .../java/com/adjust/sdk/StoreInfoUtil.java | 6 +++--- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js index f7b8b9e4c..c44b494d6 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -52,7 +52,7 @@ function AdjustConfig(appToken, environment, legacy) { this.shouldReadDeviceIdsOnce = null; this.eventDeduplicationIdsMaxSize = null; this.isFirstSessionDelayEnabled = null; - this.adjustStoreInfo = null; + this.storeInfo = null; } AdjustConfig.EnvironmentSandbox = 'sandbox'; @@ -245,6 +245,6 @@ AdjustConfig.prototype.enableFirstSessionDelay = function() { this.isFirstSessionDelayEnabled = true; }; -AdjustConfig.prototype.setStoreInfo = function(adjustStoreInfo) { - this.adjustStoreInfo = JSON.stringify(adjustStoreInfo); +AdjustConfig.prototype.setStoreInfo = function(storeInfo) { + this.storeInfo = JSON.stringify(storeInfo); }; diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 27749ebda..9fee832cd 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -144,7 +144,7 @@ public void initSdk(String adjustConfigString) { Object shouldReadDeviceIdsOnceField = jsonAdjustConfig.get("shouldReadDeviceIdsOnce"); Object eventDeduplicationIdsMaxSizeField = jsonAdjustConfig.get("eventDeduplicationIdsMaxSize"); Object isFirstSessionDelayEnabledField = jsonAdjustConfig.get("isFirstSessionDelayEnabled"); - Object adjustStoreInfoField = jsonAdjustConfig.get("adjustStoreInfo"); + Object storeInfoField = jsonAdjustConfig.get("storeInfo"); String appToken = AdjustBridgeUtil.fieldToString(appTokenField); String environment = AdjustBridgeUtil.fieldToString(environmentField); @@ -379,23 +379,23 @@ public boolean launchReceivedDeeplink(Uri deeplink) { } // store info - String adjustStoreInfoString = AdjustBridgeUtil.fieldToString(adjustStoreInfoField); + String storeInfoString = AdjustBridgeUtil.fieldToString(storeInfoField); try { - JSONObject jsonAdjustStoreInfo = new JSONObject(adjustStoreInfoString); + JSONObject jsonStoreInfo = new JSONObject(storeInfoString); - Object storeNameField = jsonAdjustStoreInfo.get("storeName"); - Object storeAppIdField = jsonAdjustStoreInfo.get("storeAppId"); + Object storeNameField = jsonStoreInfo.get("storeName"); + Object storeAppIdField = jsonStoreInfo.get("storeAppId"); String storeName = AdjustBridgeUtil.fieldToString(storeNameField); String storeAppId = AdjustBridgeUtil.fieldToString(storeAppIdField); - AdjustStoreInfo adjustStoreInfo = new AdjustStoreInfo(storeName); - adjustStoreInfo.setStoreAppId(storeAppId); + AdjustStoreInfo storeInfo = new AdjustStoreInfo(storeName); + storeInfo.setStoreAppId(storeAppId); // set store info - adjustConfig.setStoreInfo(adjustStoreInfo); + adjustConfig.setStoreInfo(storeInfo); } catch (Exception e) { - AdjustFactory.getLogger().error("AdjustBridgeInstance adjustStoreInfo: %s", e.getMessage()); + AdjustFactory.getLogger().error("AdjustBridgeInstance storeInfo: %s", e.getMessage()); } Adjust.initSdk(adjustConfig); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 5464f8819..a02e8875d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -47,7 +47,7 @@ public class AdjustConfig { Integer eventDeduplicationIdsMaxSize; ArrayList cachedAttributionReadCallbacks = new ArrayList<>(); boolean isFirstSessionDelayEnabled; - AdjustStoreInfo adjustStoreInfo; + AdjustStoreInfo storeInfo; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; @@ -162,8 +162,8 @@ public void enableFirstSessionDelay() { this.isFirstSessionDelayEnabled = true; } - public void setStoreInfo(AdjustStoreInfo adjustStoreInfo) { - this.adjustStoreInfo = adjustStoreInfo; + public void setStoreInfo(AdjustStoreInfo storeInfo) { + this.storeInfo = storeInfo; } public void setOnAttributionChangedListener(OnAttributionChangedListener onAttributionChangedListener) { @@ -259,7 +259,7 @@ public boolean isDeviceIdsReadingOnceEnabled() { } public AdjustStoreInfo getStoreInfo() { - return adjustStoreInfo; + return storeInfo; } public OnAttributionChangedListener getOnAttributionChangedListener() { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java index 72a32593c..f2e67f968 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java @@ -29,12 +29,12 @@ public static AdjustStoreInfo getStoreInfoFromClient(final AdjustConfig adjustCo ApplicationInfo applicationInfo = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); Bundle metaData = applicationInfo.metaData; if (metaData == null) { - return adjustConfig.adjustStoreInfo; + return adjustConfig.storeInfo; } String storeName = metaData.getString("ADJUST_STORE_NAME"); if (storeName == null || storeName.isEmpty()) { - return adjustConfig.adjustStoreInfo; + return adjustConfig.storeInfo; } String storeAppId = metaData.getString("ADJUST_STORE_APP_ID"); @@ -44,7 +44,7 @@ public static AdjustStoreInfo getStoreInfoFromClient(final AdjustConfig adjustCo return storeInfo; } catch (Exception e) { - return adjustConfig.adjustStoreInfo; + return adjustConfig.storeInfo; } } } From 0447cae788bc4153281bd00f25fa7871aa0c3e52 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 28 Apr 2025 14:14:01 +0200 Subject: [PATCH 349/540] test: add store info testing --- .../com/adjust/testapp/AdjustCommandExecutor.java | 13 +++++++++++++ .../src/main/assets/AdjustTestApp-WebView.html | 1 + .../src/main/assets/command_executor.js | 12 ++++++++++++ 3 files changed, 26 insertions(+) diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index ef9cbe7f7..eb9c70b1c 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -23,6 +23,7 @@ import com.adjust.sdk.AdjustPurchaseVerificationResult; import com.adjust.sdk.AdjustSessionFailure; import com.adjust.sdk.AdjustSessionSuccess; +import com.adjust.sdk.AdjustStoreInfo; import com.adjust.sdk.AdjustTestOptions; import com.adjust.sdk.AdjustThirdPartySharing; import com.adjust.sdk.LogLevel; @@ -331,6 +332,18 @@ private void config() { } } + if (command.containsParameter("storeName")) { + AdjustStoreInfo storeInfo; + String storeName = command.getFirstParameterValue("storeName"); + storeInfo = new AdjustStoreInfo(storeName); + + if (command.containsParameter("storeAppId")) { + String storeAppId = command.getFirstParameterValue("storeAppId"); + storeInfo.setStoreAppId(storeAppId); + } + adjustConfig.setStoreInfo(storeInfo); + } + if(command.containsParameter("deferredDeeplinkCallback")) { adjustConfig.setOnDeferredDeeplinkResponseListener(new OnDeferredDeeplinkResponseListener() { @Override diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/AdjustTestApp-WebView.html b/Adjust/tests/test-app-webbridge/src/main/assets/AdjustTestApp-WebView.html index 846e4880d..48f6af4f7 100755 --- a/Adjust/tests/test-app-webbridge/src/main/assets/AdjustTestApp-WebView.html +++ b/Adjust/tests/test-app-webbridge/src/main/assets/AdjustTestApp-WebView.html @@ -11,6 +11,7 @@ + diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index 3333c77d5..58834a39e 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -343,6 +343,18 @@ AdjustCommandExecutor.prototype.config = function(params) { } } + if ('storeName' in params) { + var storeInfo; + var storeName = getFirstParameterValue(params, 'storeName'); + storeInfo = new AdjustStoreInfo(storeName); + + if ('storeAppId' in params) { + var storeAppId = getFirstParameterValue(params, 'storeAppId'); + storeInfo.setStoreAppId(storeAppId); + } + adjustConfig.setStoreInfo(storeInfo); + } + if ('attributionCallbackSendAll' in params) { var basePath = this.basePath; adjustConfig.setAttributionCallback(function(attribution) { From 8bcbd70fca779adef493cd2756cd1843f6dfa657 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 28 Apr 2025 14:41:43 +0200 Subject: [PATCH 350/540] feat: update version number to 5.4.0 --- Adjust/build.gradle | 2 +- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-imei/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-oaid/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java | 2 +- VERSION | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 809e23e41..365c7e882 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 35 coreTargetSdkVersion = 35 - coreVersionName = '5.3.0' + coreVersionName = '5.4.0' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index 08710aaa1..97d99676b 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.3.0' + // implementation 'com.adjust.sdk:adjust-android:5.4.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index f7838f5c8..474e969f1 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.3.0' + // implementation 'com.adjust.sdk:adjust-android:5.4.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index 950d50bbe..db9b2bacb 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.3.0' + // implementation 'com.adjust.sdk:adjust-android:5.4.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index d0ca992f8..1e70ea0be 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.3.0' + // implementation 'com.adjust.sdk:adjust-android:5.4.0' implementation 'com.huawei.hms:ads-identifier:3.4.56.300' } diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index d46614194..43a3f03a5 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.3.0' + // implementation 'com.adjust.sdk:adjust-android:5.4.0' // Add Samsung clouddev lib. compileOnly fileTree(include: ['*.aar'], dir: 'libs') diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index 77e4556b6..f0df073e3 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.3.0' + // implementation 'com.adjust.sdk:adjust-android:5.4.0' // Add Samsung referrer lib via Maven. implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:3.0.1' diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index 4974ec242..7a8ba6dba 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.3.0' + // implementation 'com.adjust.sdk:adjust-android:5.4.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index 40b6b0161..fd54ac73d 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.3.0' + // implementation 'com.adjust.sdk:adjust-android:5.4.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index b61aea711..5f7843791 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -295,7 +295,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge5.3.0'; + return 'web-bridge5.4.0'; } }, diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index a9444ebff..98d914b00 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -31,7 +31,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.3.0' + // implementation 'com.adjust.sdk:adjust-android:5.4.0' // Add xiaomi referrer lib via Maven. implementation 'com.miui.referrer:homereferrer:1.0.0.6' diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 82ab810b0..a718131c0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -32,7 +32,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.3.0"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.4.0"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 1d22b2f58..3682d9923 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -37,7 +37,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android5.3.0"; + String CLIENT_SDK = "android5.4.0"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/VERSION b/VERSION index 03f488b07..8a30e8f94 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.3.0 +5.4.0 From 967c94fac9fb0508af80779cc2e8fa844f18e704 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 2 May 2025 10:09:43 +0200 Subject: [PATCH 351/540] docs: update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b7e944c7..31c69b2cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### Version 5.4.0 (2nd May 2025) +#### Added +- Added support for configuring store information via the `AdjustStoreInfo` object. You can now specify the store name and store app ID using `setStoreInfo` method on your `AdjustConfig` instance. This enables the SDK to record the intended app store source during initialization. + +--- + ### Version 5.3.0 (16th April 2025) #### Added - Added ability to initialize the SDK for the first session in delayed mode. You can start the SDK in the delayed mode by calling the `enableFirstSessionDelay` method on your `AdjustConfig` instance. To end the delay, make sure to call `endFirstSessionDelay` method of `Adjust` instance. For more details about this feature, refer to the [official documentation](https://dev.adjust.com/en/sdk/android/features/first-session-delay). From 85df5169fd55608eb82d75fefbaca450b31023be Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 7 May 2025 13:53:22 +0200 Subject: [PATCH 352/540] feat: added filter for deeplink with tracker to optimize deeplink callback --- .../java/com/adjust/sdk/ActivityHandler.java | 16 ++++++++++++++++ .../src/main/java/com/adjust/sdk/Util.java | 17 +++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 41db40a01..ddace7c99 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -2073,6 +2073,22 @@ private void processDeeplinkI(AdjustDeeplink deeplink, long clickTime) { return; } + if (Util.isUrlWithTrackerQueryParam(deeplink.getUrl())) { + final String resolvedLink = deeplink.getUrl().toString(); + Handler handler = new Handler(adjustConfig.context.getMainLooper()); + OnDeeplinkResolvedListener onDeeplinkResolvedListener = cachedDeeplinkResolutionCallback; + cachedDeeplinkResolutionCallback = null; + if (onDeeplinkResolvedListener != null) { + Runnable runnable = new Runnable() { + @Override + public void run() { + onDeeplinkResolvedListener.onDeeplinkResolved(resolvedLink); + } + }; + handler.post(runnable); + } + } + ActivityPackage sdkClickPackage = PackageFactory.buildDeeplinkSdkClickPackage( deeplink.getUrl(), deeplink.getReferrer(), diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index d8f7f4b11..84562f3de 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -623,6 +623,23 @@ public static boolean isUrlFilteredOut(Uri url) { return false; } + public static boolean isUrlWithTrackerQueryParam(Uri url) { + try { + String trackerParam = url.getQueryParameter("adj_t"); + if (trackerParam != null) { + return true; + } + + trackerParam = url.getQueryParameter("adjust_t"); + if (trackerParam != null) { + return true; + } + } catch (Exception e) { + } + + return false; + } + public static String getSdkVersion() { return Constants.CLIENT_SDK; } From 70217868f00c59dcc218f12fd2a3d79bf749826c Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 17 Jun 2025 15:27:27 +0200 Subject: [PATCH 353/540] feat: update compile and target sdk version, also other dependency versions --- Adjust/build.gradle | 6 +++--- Adjust/examples/example-app-fbpixel/build.gradle | 8 ++++---- Adjust/examples/example-app-java/build.gradle | 8 ++++---- Adjust/examples/example-app-keyboard/build.gradle | 8 ++++---- Adjust/examples/example-app-kotlin/build.gradle | 8 ++++---- Adjust/examples/example-app-tv/build.gradle | 8 ++++---- Adjust/examples/example-app-webbridge/build.gradle | 8 ++++---- Adjust/gradle/wrapper/gradle-wrapper.properties | 2 +- .../src/main/java/com/adjust/sdk/StoreInfoUtil.java | 1 + Adjust/tests/test-app-core/build.gradle | 6 +++--- Adjust/tests/test-app-webbridge/build.gradle | 6 +++--- Adjust/tests/test-library/build.gradle | 4 ++-- Adjust/tests/test-options/build.gradle | 4 ++-- 13 files changed, 39 insertions(+), 38 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 365c7e882..cb8a89b8c 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -7,8 +7,8 @@ subprojects { ext { // Android config. coreMinSdkVersion = 21 - coreCompileSdkVersion = 35 - coreTargetSdkVersion = 35 + coreCompileSdkVersion = 36 + coreTargetSdkVersion = 36 coreVersionName = '5.4.0' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 @@ -28,7 +28,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:8.8.0' + classpath 'com.android.tools.build:gradle:8.10.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files. diff --git a/Adjust/examples/example-app-fbpixel/build.gradle b/Adjust/examples/example-app-fbpixel/build.gradle index 14f09f966..17b355aef 100644 --- a/Adjust/examples/example-app-fbpixel/build.gradle +++ b/Adjust/examples/example-app-fbpixel/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdk 35 + compileSdk 36 defaultConfig { applicationId "com.adjust.examples" minSdkVersion 21 - targetSdkVersion 35 + targetSdkVersion 36 versionCode 1 versionName "1.0" } @@ -29,9 +29,9 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.3.1' implementation "androidx.constraintlayout:constraintlayout:2.1.1" - implementation 'com.google.android.gms:play-services-ads-identifier:17.1.0' + implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0' implementation 'com.android.installreferrer:installreferrer:2.2' - implementation 'com.google.android.gms:play-services-appset:16.0.2' + implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') diff --git a/Adjust/examples/example-app-java/build.gradle b/Adjust/examples/example-app-java/build.gradle index e8dd00592..fa5e0fedb 100644 --- a/Adjust/examples/example-app-java/build.gradle +++ b/Adjust/examples/example-app-java/build.gradle @@ -7,12 +7,12 @@ repositories { } android { - compileSdk 35 + compileSdk 36 defaultConfig { applicationId "com.adjust.examples" minSdkVersion 21 - targetSdkVersion 35 + targetSdkVersion 36 versionCode 1 versionName "1.0" } @@ -33,9 +33,9 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.3.1' implementation "androidx.constraintlayout:constraintlayout:2.1.1" - implementation 'com.google.android.gms:play-services-ads-identifier:17.1.0' + implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0' implementation 'com.android.installreferrer:installreferrer:2.2' - implementation 'com.google.android.gms:play-services-appset:16.0.2' + implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') implementation 'com.adjust.signature:adjust-android-signature:3+' diff --git a/Adjust/examples/example-app-keyboard/build.gradle b/Adjust/examples/example-app-keyboard/build.gradle index fc5bea367..3beabc981 100644 --- a/Adjust/examples/example-app-keyboard/build.gradle +++ b/Adjust/examples/example-app-keyboard/build.gradle @@ -7,12 +7,12 @@ repositories { } android { - compileSdk 35 + compileSdk 36 defaultConfig { applicationId "com.adjust.examples.keyboard" minSdkVersion 21 - targetSdkVersion 35 + targetSdkVersion 36 versionCode 1 versionName "1.0" } @@ -33,9 +33,9 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.3.1' implementation "androidx.constraintlayout:constraintlayout:2.1.1" - implementation 'com.google.android.gms:play-services-ads-identifier:17.1.0' + implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0' implementation 'com.android.installreferrer:installreferrer:2.2' - implementation 'com.google.android.gms:play-services-appset:16.0.2' + implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') implementation 'com.adjust.signature:adjust-android-signature:3+' diff --git a/Adjust/examples/example-app-kotlin/build.gradle b/Adjust/examples/example-app-kotlin/build.gradle index 9b3b1fdaa..564bd53c2 100644 --- a/Adjust/examples/example-app-kotlin/build.gradle +++ b/Adjust/examples/example-app-kotlin/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' android { - compileSdk 35 + compileSdk 36 defaultConfig { applicationId "com.adjust.examples" minSdkVersion 21 - targetSdkVersion 35 + targetSdkVersion 36 versionCode 1 versionName "1.0" @@ -35,9 +35,9 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.3.1' implementation "androidx.constraintlayout:constraintlayout:2.1.1" - implementation 'com.google.android.gms:play-services-ads-identifier:17.1.0' + implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0' implementation 'com.android.installreferrer:installreferrer:2.2' - implementation 'com.google.android.gms:play-services-appset:16.0.2' + implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') implementation 'com.adjust.signature:adjust-android-signature:3+' diff --git a/Adjust/examples/example-app-tv/build.gradle b/Adjust/examples/example-app-tv/build.gradle index e8dd00592..fa5e0fedb 100755 --- a/Adjust/examples/example-app-tv/build.gradle +++ b/Adjust/examples/example-app-tv/build.gradle @@ -7,12 +7,12 @@ repositories { } android { - compileSdk 35 + compileSdk 36 defaultConfig { applicationId "com.adjust.examples" minSdkVersion 21 - targetSdkVersion 35 + targetSdkVersion 36 versionCode 1 versionName "1.0" } @@ -33,9 +33,9 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.3.1' implementation "androidx.constraintlayout:constraintlayout:2.1.1" - implementation 'com.google.android.gms:play-services-ads-identifier:17.1.0' + implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0' implementation 'com.android.installreferrer:installreferrer:2.2' - implementation 'com.google.android.gms:play-services-appset:16.0.2' + implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') implementation 'com.adjust.signature:adjust-android-signature:3+' diff --git a/Adjust/examples/example-app-webbridge/build.gradle b/Adjust/examples/example-app-webbridge/build.gradle index 34f57b92f..b31437a4b 100644 --- a/Adjust/examples/example-app-webbridge/build.gradle +++ b/Adjust/examples/example-app-webbridge/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdk 35 + compileSdk 36 defaultConfig { applicationId "com.example.examples" minSdkVersion 21 - targetSdkVersion 35 + targetSdkVersion 36 versionCode 1 versionName "1.0" } @@ -27,9 +27,9 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.3.1' implementation "androidx.constraintlayout:constraintlayout:2.1.1" - implementation 'com.google.android.gms:play-services-ads-identifier:17.1.0' + implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0' implementation 'com.android.installreferrer:installreferrer:2.2' - implementation 'com.google.android.gms:play-services-appset:16.0.2' + implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') diff --git a/Adjust/gradle/wrapper/gradle-wrapper.properties b/Adjust/gradle/wrapper/gradle-wrapper.properties index 1cd7404c4..a1614819e 100644 --- a/Adjust/gradle/wrapper/gradle-wrapper.properties +++ b/Adjust/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Oct 06 12:16:52 CEST 2023 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java index f2e67f968..7eb419d94 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java @@ -8,6 +8,7 @@ import android.os.Bundle; public class StoreInfoUtil { + @SuppressWarnings("deprecation") public static String getStoreIdFromSystem(final Context context) { try { PackageManager packageManager = context.getPackageManager(); diff --git a/Adjust/tests/test-app-core/build.gradle b/Adjust/tests/test-app-core/build.gradle index fab87b44b..f71a1e981 100644 --- a/Adjust/tests/test-app-core/build.gradle +++ b/Adjust/tests/test-app-core/build.gradle @@ -7,12 +7,12 @@ repositories { } android { - compileSdk 34 + compileSdk 36 defaultConfig { applicationId "com.adjust.testapp" minSdkVersion 21 - targetSdkVersion 34 + targetSdkVersion 36 versionCode 1 versionName "1.0" } @@ -28,7 +28,7 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) implementation 'androidx.appcompat:appcompat:1.3.1' implementation "androidx.constraintlayout:constraintlayout:2.1.1" - implementation 'com.google.android.gms:play-services-ads-identifier:17.1.0' + implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0' implementation 'com.android.installreferrer:installreferrer:2.2' implementation 'com.adjust.signature:adjust-android-signature:3+' diff --git a/Adjust/tests/test-app-webbridge/build.gradle b/Adjust/tests/test-app-webbridge/build.gradle index 7bbf03334..7cb47a80d 100644 --- a/Adjust/tests/test-app-webbridge/build.gradle +++ b/Adjust/tests/test-app-webbridge/build.gradle @@ -7,12 +7,12 @@ repositories { } android { - compileSdk 34 + compileSdk 36 defaultConfig { applicationId "com.example.testappwebbridge" minSdkVersion 21 - targetSdkVersion 34 + targetSdkVersion 36 versionCode 1 versionName "1.0" } @@ -30,7 +30,7 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.3.1' implementation "androidx.constraintlayout:constraintlayout:2.1.1" - implementation 'com.google.android.gms:play-services-ads-identifier:17.1.0' + implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0' implementation 'com.android.installreferrer:installreferrer:2.2' implementation 'com.adjust.signature:adjust-android-signature:3+' diff --git a/Adjust/tests/test-library/build.gradle b/Adjust/tests/test-library/build.gradle index 7325cca91..5d482ea40 100644 --- a/Adjust/tests/test-library/build.gradle +++ b/Adjust/tests/test-library/build.gradle @@ -1,11 +1,11 @@ apply plugin: 'com.android.library' android { - compileSdk 34 + compileSdk 36 defaultConfig { minSdkVersion 21 - targetSdkVersion 34 + targetSdkVersion 36 } namespace 'com.adjust.test_library' } diff --git a/Adjust/tests/test-options/build.gradle b/Adjust/tests/test-options/build.gradle index 013e782cb..db4a52786 100644 --- a/Adjust/tests/test-options/build.gradle +++ b/Adjust/tests/test-options/build.gradle @@ -3,11 +3,11 @@ plugins { } android { - compileSdk 34 + compileSdk 36 defaultConfig { minSdkVersion 21 - targetSdkVersion 34 + targetSdkVersion 36 } namespace 'com.adjust.test_options' } From 1f769305f852066a27b59f2d9377d821bc87263e Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 18 Jun 2025 10:53:52 +0200 Subject: [PATCH 354/540] fix: formatting of a log warning --- Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustSigner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustSigner.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustSigner.java index 18c62fb0a..b89c34532 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustSigner.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustSigner.java @@ -52,7 +52,7 @@ public static Map sign(final Map packageParams, context, packageParams, extraParams, outputParams); } catch (Exception e) { - logger.warn("Invoking Signer sign() for %s received an error [%s]", e.getMessage()); + logger.warn("Invoking Signer sign() received an error [%s]", e.getMessage()); } } From d6382e1988400c9efd0588f0a937769ae22401bd Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 19 Jun 2025 13:41:02 +0200 Subject: [PATCH 355/540] feat: update Signature library version to 3.47.0 --- Adjust/sdk-core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/build.gradle b/Adjust/sdk-core/build.gradle index 3179aec79..910081675 100644 --- a/Adjust/sdk-core/build.gradle +++ b/Adjust/sdk-core/build.gradle @@ -220,7 +220,7 @@ def customizePomForAar(pom) { dependency { groupId 'com.adjust.signature' artifactId 'adjust-android-signature' - version '3.35.2' + version '3.47.0' scope 'compile' } } From 6a4b04940d0141564386f064e37108503d831689 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 23 Jun 2025 09:37:19 +0200 Subject: [PATCH 356/540] feat: update version number to 5.4.1 --- Adjust/build.gradle | 2 +- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-imei/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-oaid/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java | 2 +- VERSION | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index cb8a89b8c..5f476b8b6 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 36 coreTargetSdkVersion = 36 - coreVersionName = '5.4.0' + coreVersionName = '5.4.1' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index 97d99676b..4aa9f1ebb 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.0' + // implementation 'com.adjust.sdk:adjust-android:5.4.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index 474e969f1..574a79a8d 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.0' + // implementation 'com.adjust.sdk:adjust-android:5.4.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index db9b2bacb..e2eefb569 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.0' + // implementation 'com.adjust.sdk:adjust-android:5.4.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index 1e70ea0be..ff28e03e9 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.0' + // implementation 'com.adjust.sdk:adjust-android:5.4.1' implementation 'com.huawei.hms:ads-identifier:3.4.56.300' } diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index 43a3f03a5..785e55313 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.0' + // implementation 'com.adjust.sdk:adjust-android:5.4.1' // Add Samsung clouddev lib. compileOnly fileTree(include: ['*.aar'], dir: 'libs') diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index f0df073e3..61bf83e86 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.0' + // implementation 'com.adjust.sdk:adjust-android:5.4.1' // Add Samsung referrer lib via Maven. implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:3.0.1' diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index 7a8ba6dba..406084f65 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.0' + // implementation 'com.adjust.sdk:adjust-android:5.4.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index fd54ac73d..87fa93a3a 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.0' + // implementation 'com.adjust.sdk:adjust-android:5.4.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 5f7843791..9581ef70c 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -295,7 +295,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge5.4.0'; + return 'web-bridge5.4.1'; } }, diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index 98d914b00..8988095ae 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -31,7 +31,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.0' + // implementation 'com.adjust.sdk:adjust-android:5.4.1' // Add xiaomi referrer lib via Maven. implementation 'com.miui.referrer:homereferrer:1.0.0.6' diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index a718131c0..697e386d3 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -32,7 +32,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.4.0"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.4.1"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 3682d9923..4154f882e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -37,7 +37,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android5.4.0"; + String CLIENT_SDK = "android5.4.1"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/VERSION b/VERSION index 8a30e8f94..ade65226e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.4.0 +5.4.1 From f465559566d3fb23254a732e80da156b9d3f86d1 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 23 Jun 2025 09:41:37 +0200 Subject: [PATCH 357/540] docs: update changelog --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31c69b2cd..5cfead4d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +### Version 5.4.1 (23rd June 2025) +#### Added +- Optimized the logic behind the `processAndResolveDeeplink` method to immediately return links that have already been resolved. + +#### Changed +- Updated the Adjust Signature library version to 3.47.0. + +--- + ### Version 5.4.0 (2nd May 2025) #### Added - Added support for configuring store information via the `AdjustStoreInfo` object. You can now specify the store name and store app ID using `setStoreInfo` method on your `AdjustConfig` instance. This enables the SDK to record the intended app store source during initialization. From 7f5d5ab3352a48574b074b756b94d32dcfbc1cfa Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 27 Jun 2025 14:59:57 +0200 Subject: [PATCH 358/540] fix: tls 1.1 errors with kotlin dsl --- .../test_options/TestConnectionOptions.java | 50 ++++++++++--------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/Adjust/tests/test-options/src/main/java/com/adjust/test_options/TestConnectionOptions.java b/Adjust/tests/test-options/src/main/java/com/adjust/test_options/TestConnectionOptions.java index ab4d13ced..124226d3f 100644 --- a/Adjust/tests/test-options/src/main/java/com/adjust/test_options/TestConnectionOptions.java +++ b/Adjust/tests/test-options/src/main/java/com/adjust/test_options/TestConnectionOptions.java @@ -7,6 +7,7 @@ import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; @@ -21,13 +22,17 @@ public void applyConnectionOptions(HttpsURLConnection connection, String clientS defaultConnectionOption.applyConnectionOptions(connection, clientSdk); try { - TLSSocketFactory tlsSocketFactory = - new TLSSocketFactory( - TestConnectionOptions.generateTrustAllCerts(), - new java.security.SecureRandom()); - connection.setSSLSocketFactory(tlsSocketFactory); - connection.setHostnameVerifier( - TestConnectionOptions.generateHostnameVerifier()); + // create modern SSLContext that supports TLS 1.2+ + SSLContext sslContext = SSLContext.getInstance("TLS"); + sslContext.init( + null, + TestConnectionOptions.generateTrustAllCerts(), + new java.security.SecureRandom()); + + // use the modern SSL socket factory instead of TLSSocketFactory + // this avoids the TLS 1.1 limitation + connection.setSSLSocketFactory(sslContext.getSocketFactory()); + connection.setHostnameVerifier(TestConnectionOptions.generateHostnameVerifier()); } catch (Exception e) { Log.e("TestOptions","connectionOptions error " + e.getMessage()); } @@ -36,25 +41,23 @@ public void applyConnectionOptions(HttpsURLConnection connection, String clientS } private static TrustManager[] generateTrustAllCerts() { - return new TrustManager[]{ - new X509TrustManager() { - public java.security.cert.X509Certificate[] getAcceptedIssuers() { - Log.d("TestApp", "getAcceptedIssuers"); - return null; - } + return new TrustManager[] { + new X509TrustManager() { + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + Log.d("TestApp", "getAcceptedIssuers"); + return null; + } - public void checkClientTrusted(final java.security.cert.X509Certificate[] certs, - final String authType) - { - Log.d("TestApp", "checkClientTrusted"); - } + public void checkClientTrusted(final java.security.cert.X509Certificate[] certs, + final String authType) { + Log.d("TestApp", "checkClientTrusted"); + } - public void checkServerTrusted(final java.security.cert.X509Certificate[] certs, - final String authType) - { - Log.d("TestApp", "checkServerTrusted"); - } + public void checkServerTrusted(final java.security.cert.X509Certificate[] certs, + final String authType) { + Log.d("TestApp", "checkServerTrusted"); } + } }; } @@ -67,5 +70,4 @@ public boolean verify(final String hostname, final SSLSession session) { } }; } - } From ec902086c9c75ab94431ce92273d430281d74a47 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 31 Jul 2025 23:00:26 +0200 Subject: [PATCH 359/540] refac: update pv handler retry logic --- .../sdk/PurchaseVerificationHandler.java | 157 +++++++++--------- 1 file changed, 82 insertions(+), 75 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PurchaseVerificationHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PurchaseVerificationHandler.java index f470eb580..2e2a01879 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PurchaseVerificationHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PurchaseVerificationHandler.java @@ -6,9 +6,7 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** * PurchaseVerificationHandler class. @@ -39,9 +37,9 @@ public class PurchaseVerificationHandler implements IPurchaseVerificationHandler private ILogger logger; /** - * Backoff strategy. + * Flag to indicate if Purchase Verification package is being sent. */ - private BackoffStrategy backoffStrategy; + private boolean isSendingPurchaseVerificationPackage; /** * Sending queue. @@ -74,7 +72,6 @@ public PurchaseVerificationHandler(final IActivityHandler activityHandler, { init(activityHandler, startsSending, purchaseVerificationHandlerActivityPackageSender); this.logger = AdjustFactory.getLogger(); - backoffStrategy = AdjustFactory.getSdkClickBackoffStrategy(); scheduler = new SingleThreadCachedScheduler(SCHEDULED_EXECUTOR_SOURCE); } @@ -89,6 +86,8 @@ public void init(final IActivityHandler activityHandler, packageQueue = new ArrayList(); activityHandlerWeakRef = new WeakReference(activityHandler); activityPackageSender = purchaseVerificationHandlerActivityPackageSender; + isSendingPurchaseVerificationPackage = false; + lastPackageRetryInMilli = 0L; } /** @@ -97,6 +96,8 @@ public void init(final IActivityHandler activityHandler, @Override public void pauseSending() { paused = true; + isSendingPurchaseVerificationPackage = false; + lastPackageRetryInMilli = 0L; } /** @@ -117,10 +118,7 @@ public void sendPurchaseVerificationPackage(final ActivityPackage purchaseVerifi scheduler.submit(new Runnable() { @Override public void run() { - packageQueue.add(purchaseVerification); - logger.debug("Added purchase_verification %d", packageQueue.size()); - logger.verbose("%s", purchaseVerification.getExtendedString()); - sendNextPurchaseVerificationPackage(); + sendPurchaseVerificationPackageI(purchaseVerification); } }); } @@ -146,8 +144,19 @@ public void teardown() { logger = null; packageQueue = null; - backoffStrategy = null; scheduler = null; + isSendingPurchaseVerificationPackage = false; + lastPackageRetryInMilli = 0L; + } + + /** + * Add purchase_verification package to the queue and send. + */ + private void sendPurchaseVerificationPackageI(final ActivityPackage purchaseVerification) { + packageQueue.add(purchaseVerification); + logger.debug("Added purchase_verification %d", packageQueue.size()); + logger.verbose("%s", purchaseVerification.getExtendedString()); + sendNextPurchaseVerificationPackage(); } /** @@ -170,34 +179,40 @@ private void sendNextPurchaseVerificationPackageI() { if (activityHandler.getActivityState() == null) { return; } + if (packageQueue.isEmpty()) { + return; + } if (activityHandler.getActivityState().isGdprForgotten) { + logger.debug("purchase_verification request won't be sent for GDPR forgotten user"); return; } if (paused) { + logger.debug("PurchaseVerificationHandler is paused"); return; } - if (packageQueue.isEmpty()) { + if (isSendingPurchaseVerificationPackage) { + logger.debug("PurchaseVerificationHandler is is already sending a package"); return; } - final ActivityPackage purchaseVerificationPackage = packageQueue.remove(0); - int retries = purchaseVerificationPackage.getRetries(); - - Runnable runnable = new Runnable() { - @Override - public void run() { - sendPurchaseVerificationPackageI(purchaseVerificationPackage); - sendNextPurchaseVerificationPackage(); - } - }; + long waitTimeMilliSeconds = waitTime(); - long waitTimeMilliSeconds = waitTime(retries); if (waitTimeMilliSeconds > 0) { + Runnable runnable = new Runnable() { + @Override + public void run() { + lastPackageRetryInMilli = 0L; + sendNextPurchaseVerificationPackage(); + } + }; scheduler.schedule(runnable, waitTimeMilliSeconds); - } else { - runnable.run(); + return; } + // get the package but keep it in the queue until processing is complete + final ActivityPackage purchaseVerificationPackage = packageQueue.get(0); + isSendingPurchaseVerificationPackage = true; + sendPurchaseVerificationPackageSync(purchaseVerificationPackage); } /** @@ -205,80 +220,72 @@ public void run() { * * @param purchaseVerificationPackage purchase_verification package to be sent. */ - private void sendPurchaseVerificationPackageI(final ActivityPackage purchaseVerificationPackage) { + private void sendPurchaseVerificationPackageSync(final ActivityPackage purchaseVerificationPackage) { IActivityHandler activityHandler = activityHandlerWeakRef.get(); - Map sendingParameters = generateSendingParametersI(); ResponseData responseData = activityPackageSender.sendActivityPackageSync( purchaseVerificationPackage, - sendingParameters); + null); if (!(responseData instanceof PurchaseVerificationResponseData)) { return; } + // reset flag to indicate we're done processing this package + isSendingPurchaseVerificationPackage = false; + PurchaseVerificationResponseData purchaseVerificationResponseData = (PurchaseVerificationResponseData)responseData; - if (purchaseVerificationResponseData.willRetry) { - retrySendingI(purchaseVerificationPackage, responseData.retryIn); - return; - } + if (purchaseVerificationResponseData.jsonResponse == null) { + logger.error("Could not get purchase_verification JSON response with message: %s", + purchaseVerificationResponseData.message); + } else { - lastPackageRetryInMilli = 0L; + if (activityHandler == null) { + return; + } + // check if any package response contains information that user has opted out. + // if yes, disable SDK and flush any potentially stored packages that happened afterwards. + if (purchaseVerificationResponseData.trackingState == TrackingState.OPTED_OUT) { + activityHandler.gotOptOutResponse(); + return; + } - if (activityHandler == null) { - return; - } - if (purchaseVerificationResponseData.trackingState == TrackingState.OPTED_OUT) { - activityHandler.gotOptOutResponse(); - return; - } + // check if backend requested retry_in delay + if (purchaseVerificationResponseData.willRetry) { + if (responseData.retryIn != null && responseData.retryIn > 0) { + lastPackageRetryInMilli = responseData.retryIn; + logger.error("Retrying purchase_verification package with retry in %d ms", + lastPackageRetryInMilli); + } - activityHandler.finishedTrackingActivity(purchaseVerificationResponseData); - } - private Map generateSendingParametersI() { - HashMap sendingParameters = new HashMap<>(); - int queueSize = packageQueue.size() - 1; - if (queueSize > 0) { - PackageBuilder.addLong(sendingParameters, "queue_size", queueSize); + // package stays in queue - schedule retry + sendNextPurchaseVerificationPackage(); + return; + } + + lastPackageRetryInMilli = 0L; } - return sendingParameters; - } - /** - * Retry sending of the purchase_verification package passed as the parameter (runs within scheduled executor). - * - * @param purchaseVerificationPackage purchase_verification package to be retried. - */ - private void retrySendingI(final ActivityPackage purchaseVerificationPackage, Long retryIn) { - if (retryIn != null && retryIn > 0) { - lastPackageRetryInMilli = retryIn; - } else { - int retries = purchaseVerificationPackage.increaseRetries(); - logger.error("Retrying purchase_verification package for the %d time", retries); + // processing is complete - remove the package from queue + if (!packageQueue.isEmpty()) { + packageQueue.remove(0); } - sendPurchaseVerificationPackage(purchaseVerificationPackage); + // finish package tracking without retrying / backoff + activityHandler.finishedTrackingActivity(purchaseVerificationResponseData); + + // process next package in queue if any + sendNextPurchaseVerificationPackage(); } - /** - * calculate wait time (runs within scheduled executor). - * @param retries count of retries - * @return calculated wait time depends on the number of retry in and backoff strategy - */ - private long waitTime(int retries) { + private long waitTime() { + // handle backend-requested retry_in delay if (lastPackageRetryInMilli > 0) { + logger.verbose("Waiting for %d ms before retrying purchase_verification with retry_in", + lastPackageRetryInMilli); return lastPackageRetryInMilli; } - if (retries > 0) { - long waitTimeMilliSeconds = Util.getWaitingTime(retries, backoffStrategy); - double waitTimeSeconds = waitTimeMilliSeconds / MILLISECONDS_TO_SECONDS_DIVISOR; - String secondsString = Util.SecondsDisplayFormat.format(waitTimeSeconds); - logger.verbose( - "Waiting for %s seconds before retrying purchase_verification for the %d time", - secondsString, retries); - return waitTimeMilliSeconds; - } return 0L; } From bae4f1e6d067b2e0075da34aac326832ce88072d Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 1 Aug 2025 10:32:22 +0200 Subject: [PATCH 360/540] feat: set verify request timeout to 30 seconds --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 6 ++++++ .../sdk-core/src/main/java/com/adjust/sdk/Constants.java | 3 ++- .../com/adjust/sdk/network/ActivityPackageSender.java | 6 +++++- .../main/java/com/adjust/sdk/network/UtilNetworking.java | 9 +++++---- .../src/main/java/com/adjust/testapp/Util.java | 5 +++-- .../com/adjust/test_options/TestConnectionOptions.java | 4 ++-- 6 files changed, 23 insertions(+), 10 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index ddace7c99..8918d1f74 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -11,6 +11,8 @@ import static com.adjust.sdk.Constants.ACTIVITY_STATE_FILENAME; import static com.adjust.sdk.Constants.ATTRIBUTION_FILENAME; +import static com.adjust.sdk.Constants.CONNECTION_TIMEOUT; +import static com.adjust.sdk.Constants.CONNECTION_TIMEOUT_VERIFY; import static com.adjust.sdk.Constants.GLOBAL_CALLBACK_PARAMETERS_FILENAME; import static com.adjust.sdk.Constants.GLOBAL_PARTNER_PARAMETERS_FILENAME; import static com.adjust.sdk.Constants.REFERRER_API_HUAWEI_ADS; @@ -936,6 +938,7 @@ public void run() { adjustConfig.subscriptionPath, adjustConfig.purchaseVerificationPath, deviceInfo.clientSdk, + CONNECTION_TIMEOUT, adjustConfig.context); packageHandler = AdjustFactory.getPackageHandler( this, @@ -952,6 +955,7 @@ public void run() { adjustConfig.subscriptionPath, adjustConfig.purchaseVerificationPath, deviceInfo.clientSdk, + CONNECTION_TIMEOUT, adjustConfig.context); attributionHandler = AdjustFactory.getAttributionHandler( @@ -968,6 +972,7 @@ public void run() { adjustConfig.subscriptionPath, adjustConfig.purchaseVerificationPath, deviceInfo.clientSdk, + CONNECTION_TIMEOUT, adjustConfig.context); sdkClickHandler = AdjustFactory.getSdkClickHandler( @@ -984,6 +989,7 @@ public void run() { adjustConfig.subscriptionPath, adjustConfig.purchaseVerificationPath, deviceInfo.clientSdk, + CONNECTION_TIMEOUT_VERIFY, adjustConfig.context); purchaseVerificationHandler = AdjustFactory.getPurchaseVerificationHandler( diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 4154f882e..c50571d7a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -19,7 +19,8 @@ public interface Constants { int THIRTY_MINUTES = 30 * ONE_MINUTE; int ONE_HOUR = 2 * THIRTY_MINUTES; - int CONNECTION_TIMEOUT = Constants.ONE_MINUTE; + int CONNECTION_TIMEOUT = ONE_MINUTE; + int CONNECTION_TIMEOUT_VERIFY = 30 * ONE_SECOND; int SOCKET_TIMEOUT = Constants.ONE_MINUTE; int MAX_WAIT_INTERVAL = Constants.ONE_MINUTE; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index 2fec45dd4..72fbd7939 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -55,6 +55,7 @@ public class ActivityPackageSender implements IActivityPackageSender { private IHttpsURLConnectionProvider httpsURLConnectionProvider; private IConnectionOptions connectionOptions; private Context context; + private int connectionTimeout; public ActivityPackageSender(final List urlStrategyDomains, final boolean useSubdomains, @@ -63,6 +64,7 @@ public ActivityPackageSender(final List urlStrategyDomains, final String subscriptionPath, final String purchaseVerificationPath, final String clientSdk, + final int connectionTimeout, final Context context) { this.basePath = basePath; @@ -70,6 +72,7 @@ public ActivityPackageSender(final List urlStrategyDomains, this.subscriptionPath = subscriptionPath; this.purchaseVerificationPath = purchaseVerificationPath; this.clientSdk = clientSdk; + this.connectionTimeout = connectionTimeout; this.context = context; logger = AdjustFactory.getLogger(); @@ -83,6 +86,7 @@ public ActivityPackageSender(final List urlStrategyDomains, useSubdomains); httpsURLConnectionProvider = AdjustFactory.getHttpsURLConnectionProvider(); connectionOptions = AdjustFactory.getConnectionOptions(); + } @Override @@ -210,7 +214,7 @@ private void tryToGetResponse(final ResponseData responseData) { httpsURLConnectionProvider.generateHttpsURLConnection(url); // get and apply connection options (default or for tests) - connectionOptions.applyConnectionOptions(connection, clientSdk); + connectionOptions.applyConnectionOptions(connection, clientSdk, connectionTimeout); if (authorizationHeader != null) { connection.setRequestProperty("Authorization", authorizationHeader); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java index b3dc7c406..1114c4ae2 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UtilNetworking.java @@ -22,20 +22,21 @@ private static ILogger getLogger() { } public interface IConnectionOptions { - void applyConnectionOptions(HttpsURLConnection connection, String clientSdk); + void applyConnectionOptions(HttpsURLConnection connection, String clientSdk, int connectionTimeout); } public static IConnectionOptions createDefaultConnectionOptions() { return new IConnectionOptions() { @Override public void applyConnectionOptions(final HttpsURLConnection connection, - final String clientSdk) + final String clientSdk, + final int timeout) { connection.setRequestProperty("Client-SDK", clientSdk); // in case of beta release, specify beta version here // connection.setRequestProperty("Beta-Version", "2"); - connection.setConnectTimeout(Constants.ONE_MINUTE); - connection.setReadTimeout(Constants.ONE_MINUTE); + connection.setConnectTimeout(timeout); + connection.setReadTimeout(timeout); } }; } diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/Util.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/Util.java index 3fced07ed..7a66a814c 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/Util.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/Util.java @@ -39,11 +39,12 @@ static UtilNetworking.IConnectionOptions testConnectionOptions() { return new UtilNetworking.IConnectionOptions() { @Override public void applyConnectionOptions(final HttpsURLConnection connection, - final String clientSdk) + final String clientSdk, + final int timeout) { UtilNetworking.IConnectionOptions defaultConnectionOption = UtilNetworking.createDefaultConnectionOptions(); - defaultConnectionOption.applyConnectionOptions(connection, clientSdk); + defaultConnectionOption.applyConnectionOptions(connection, clientSdk, timeout); try { SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, new TrustManager[]{ diff --git a/Adjust/tests/test-options/src/main/java/com/adjust/test_options/TestConnectionOptions.java b/Adjust/tests/test-options/src/main/java/com/adjust/test_options/TestConnectionOptions.java index 124226d3f..0c3d4bb45 100644 --- a/Adjust/tests/test-options/src/main/java/com/adjust/test_options/TestConnectionOptions.java +++ b/Adjust/tests/test-options/src/main/java/com/adjust/test_options/TestConnectionOptions.java @@ -16,10 +16,10 @@ public class TestConnectionOptions { public static void setTestConnectionOptions() { AdjustFactory.setConnectionOptions(new UtilNetworking.IConnectionOptions() { @Override - public void applyConnectionOptions(HttpsURLConnection connection, String clientSdk) { + public void applyConnectionOptions(HttpsURLConnection connection, String clientSdk, int timeout) { UtilNetworking.IConnectionOptions defaultConnectionOption = UtilNetworking.createDefaultConnectionOptions(); - defaultConnectionOption.applyConnectionOptions(connection, clientSdk); + defaultConnectionOption.applyConnectionOptions(connection, clientSdk, timeout); try { // create modern SSLContext that supports TLS 1.2+ From 4fd55732ef478f3d4a32b3b605982e84fd70f7c5 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 1 Aug 2025 15:38:58 +0200 Subject: [PATCH 361/540] fix: add test option for url strategy not to skip fallback domain --- .../src/main/java/com/adjust/sdk/AdjustFactory.java | 10 ++++++++++ .../src/main/java/com/adjust/sdk/AdjustInstance.java | 4 ++++ .../main/java/com/adjust/sdk/AdjustTestOptions.java | 1 + .../main/java/com/adjust/sdk/network/UrlStrategy.java | 7 +++++-- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java index 86db131b1..419e057be 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java @@ -32,6 +32,7 @@ public class AdjustFactory { private static UtilNetworking.IHttpsURLConnectionProvider httpsURLConnectionProvider = null; private static boolean tryInstallReferrer = true; private static boolean ignoreSystemLifecycleBootstrap = false; + private static boolean ignoreSkippingUrlStrategyForOverwrittenUrl = false; public static class URLGetConnection { HttpsURLConnection httpsURLConnection; @@ -289,6 +290,15 @@ public static boolean isSystemLifecycleBootstrapIgnored() { return AdjustFactory.ignoreSystemLifecycleBootstrap; } + public static void setIgnoreSkippingUrlStrategyForOverwrittenUrl( + final boolean ignoreSkippingUrlStrategyForOverwrittenUrl) + { + AdjustFactory.ignoreSkippingUrlStrategyForOverwrittenUrl = ignoreSkippingUrlStrategyForOverwrittenUrl; + } + public static boolean isIgnoreSkippingUrlStrategyForOverwrittenUrl() { + return AdjustFactory.ignoreSkippingUrlStrategyForOverwrittenUrl; + } + private static String byte2HexFormatted(byte[] arr) { StringBuilder str = new StringBuilder(arr.length * 2); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index c334217fa..330c40f5d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -894,5 +894,9 @@ public void setTestOptions(AdjustTestOptions testOptions) { AdjustFactory.setIgnoreSystemLifecycleBootstrap( testOptions.ignoreSystemLifecycleBootstrap.booleanValue()); } + if (testOptions.ignoreSkippingUrlStrategyForOverwrittenUrl != null) { + AdjustFactory.setIgnoreSkippingUrlStrategyForOverwrittenUrl( + testOptions.ignoreSkippingUrlStrategyForOverwrittenUrl.booleanValue()); + } } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTestOptions.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTestOptions.java index e9858ea29..d72cf7261 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTestOptions.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTestOptions.java @@ -24,4 +24,5 @@ public class AdjustTestOptions { public Boolean tryInstallReferrer = false; public Boolean noBackoffWait; public Boolean ignoreSystemLifecycleBootstrap = true; + public Boolean ignoreSkippingUrlStrategyForOverwrittenUrl = true; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java index dc3091f88..db847f447 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java @@ -11,6 +11,7 @@ import static com.adjust.sdk.Constants.SUBSCRIPTION_URL_FORMAT; import com.adjust.sdk.ActivityKind; +import com.adjust.sdk.AdjustFactory; import java.util.ArrayList; import java.util.Arrays; @@ -78,8 +79,10 @@ public boolean shouldRetryAfterFailure(final ActivityKind activityKind) { // since it will use the same overwritten url // might as well stop retrying in the same sending "session" // and let the backoff strategy pick it up - if (wasLastAttemptWithOverwrittenUrl) { - return false; + if (!AdjustFactory.isIgnoreSkippingUrlStrategyForOverwrittenUrl()) { + if (wasLastAttemptWithOverwrittenUrl) { + return false; + } } int choiceListSize; From e402b9ed6c02b0b79e98c9bf9de3173906eeac6d Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 4 Aug 2025 13:51:42 +0200 Subject: [PATCH 362/540] fix: should retry with url strategy only when no valid json response --- .../com/adjust/sdk/network/ActivityPackageSender.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java index 72fbd7939..2298c6914 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java @@ -5,7 +5,6 @@ import com.adjust.sdk.ActivityKind; import com.adjust.sdk.ActivityPackage; -import com.adjust.sdk.AdjustAttribution; import com.adjust.sdk.AdjustFactory; import com.adjust.sdk.AdjustSigner; import com.adjust.sdk.Constants; @@ -119,7 +118,7 @@ public ResponseData sendActivityPackageSync(final ActivityPackage activityPackag tryToGetResponse(responseData); - retryToSend = shouldRetryToSend(responseData); + retryToSend = shouldRetryToSendWithUrlStrategy(responseData); } while (retryToSend); return responseData; @@ -170,9 +169,9 @@ private Map signParameters(final ActivityPackage activityPackage return AdjustSigner.sign(packageParams, extraParams, context, logger); } - private boolean shouldRetryToSend(final ResponseData responseData) { - if (!responseData.willRetry) { - logger.debug("Will not retry with current url strategy"); + private boolean shouldRetryToSendWithUrlStrategy(final ResponseData responseData) { + if (responseData.jsonResponse != null) { + logger.debug("Will not retry with current url strategy, already got a valid json response"); urlStrategy.resetAfterSuccess(); return false; } From 0ae0bef56cac762791301e428161d78a1a3e682e Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 5 Aug 2025 12:55:40 +0200 Subject: [PATCH 363/540] refac: rename flag for allowing url stragy fallback --- .../src/main/java/com/adjust/sdk/AdjustFactory.java | 12 ++++++------ .../src/main/java/com/adjust/sdk/AdjustInstance.java | 6 +++--- .../main/java/com/adjust/sdk/AdjustTestOptions.java | 2 +- .../java/com/adjust/sdk/network/UrlStrategy.java | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java index 419e057be..d66aa0346 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustFactory.java @@ -32,7 +32,7 @@ public class AdjustFactory { private static UtilNetworking.IHttpsURLConnectionProvider httpsURLConnectionProvider = null; private static boolean tryInstallReferrer = true; private static boolean ignoreSystemLifecycleBootstrap = false; - private static boolean ignoreSkippingUrlStrategyForOverwrittenUrl = false; + private static boolean allowUrlStrategyFallback = true; public static class URLGetConnection { HttpsURLConnection httpsURLConnection; @@ -290,13 +290,13 @@ public static boolean isSystemLifecycleBootstrapIgnored() { return AdjustFactory.ignoreSystemLifecycleBootstrap; } - public static void setIgnoreSkippingUrlStrategyForOverwrittenUrl( - final boolean ignoreSkippingUrlStrategyForOverwrittenUrl) + public static void setAllowUrlStrategyFallback( + final boolean allowUrlStrategyFallback) { - AdjustFactory.ignoreSkippingUrlStrategyForOverwrittenUrl = ignoreSkippingUrlStrategyForOverwrittenUrl; + AdjustFactory.allowUrlStrategyFallback = allowUrlStrategyFallback; } - public static boolean isIgnoreSkippingUrlStrategyForOverwrittenUrl() { - return AdjustFactory.ignoreSkippingUrlStrategyForOverwrittenUrl; + public static boolean isAllowUrlStrategyFallback() { + return AdjustFactory.allowUrlStrategyFallback; } private static String byte2HexFormatted(byte[] arr) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 330c40f5d..f414b4d32 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -894,9 +894,9 @@ public void setTestOptions(AdjustTestOptions testOptions) { AdjustFactory.setIgnoreSystemLifecycleBootstrap( testOptions.ignoreSystemLifecycleBootstrap.booleanValue()); } - if (testOptions.ignoreSkippingUrlStrategyForOverwrittenUrl != null) { - AdjustFactory.setIgnoreSkippingUrlStrategyForOverwrittenUrl( - testOptions.ignoreSkippingUrlStrategyForOverwrittenUrl.booleanValue()); + if (testOptions.allowUrlStrategyFallback != null) { + AdjustFactory.setAllowUrlStrategyFallback( + testOptions.allowUrlStrategyFallback.booleanValue()); } } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTestOptions.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTestOptions.java index d72cf7261..19934b010 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTestOptions.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTestOptions.java @@ -24,5 +24,5 @@ public class AdjustTestOptions { public Boolean tryInstallReferrer = false; public Boolean noBackoffWait; public Boolean ignoreSystemLifecycleBootstrap = true; - public Boolean ignoreSkippingUrlStrategyForOverwrittenUrl = true; + public Boolean allowUrlStrategyFallback = false; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java index db847f447..8a7652e0b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/network/UrlStrategy.java @@ -79,7 +79,7 @@ public boolean shouldRetryAfterFailure(final ActivityKind activityKind) { // since it will use the same overwritten url // might as well stop retrying in the same sending "session" // and let the backoff strategy pick it up - if (!AdjustFactory.isIgnoreSkippingUrlStrategyForOverwrittenUrl()) { + if (AdjustFactory.isAllowUrlStrategyFallback()) { if (wasLastAttemptWithOverwrittenUrl) { return false; } From 859620c5cb7f793d00338f3b9d29ddaaed81bde4 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 6 Aug 2025 14:46:21 +0200 Subject: [PATCH 364/540] feat: update version number to 5.4.2 --- Adjust/build.gradle | 2 +- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-imei/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-oaid/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java | 2 +- VERSION | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 5f476b8b6..ffcbbaa93 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 36 coreTargetSdkVersion = 36 - coreVersionName = '5.4.1' + coreVersionName = '5.4.2' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index 4aa9f1ebb..c3dee8c04 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.1' + // implementation 'com.adjust.sdk:adjust-android:5.4.2' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index 574a79a8d..bf009bfb6 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.1' + // implementation 'com.adjust.sdk:adjust-android:5.4.2' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index e2eefb569..1107a5582 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.1' + // implementation 'com.adjust.sdk:adjust-android:5.4.2' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index ff28e03e9..03c0fb4ee 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.1' + // implementation 'com.adjust.sdk:adjust-android:5.4.2' implementation 'com.huawei.hms:ads-identifier:3.4.56.300' } diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index 785e55313..3e53e0cf8 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.1' + // implementation 'com.adjust.sdk:adjust-android:5.4.2' // Add Samsung clouddev lib. compileOnly fileTree(include: ['*.aar'], dir: 'libs') diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index 61bf83e86..841581e52 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.1' + // implementation 'com.adjust.sdk:adjust-android:5.4.2' // Add Samsung referrer lib via Maven. implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:3.0.1' diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index 406084f65..08b5e6e38 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.1' + // implementation 'com.adjust.sdk:adjust-android:5.4.2' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index 87fa93a3a..22c19aaa4 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.1' + // implementation 'com.adjust.sdk:adjust-android:5.4.2' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 9581ef70c..f3eb08ca1 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -295,7 +295,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge5.4.1'; + return 'web-bridge5.4.2'; } }, diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index 8988095ae..9aa98835c 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -31,7 +31,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.1' + // implementation 'com.adjust.sdk:adjust-android:5.4.2' // Add xiaomi referrer lib via Maven. implementation 'com.miui.referrer:homereferrer:1.0.0.6' diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 697e386d3..33fa46453 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -32,7 +32,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.4.1"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.4.2"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index c50571d7a..0b221b7c3 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -38,7 +38,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android5.4.1"; + String CLIENT_SDK = "android5.4.2"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/VERSION b/VERSION index ade65226e..8ae03c119 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.4.1 +5.4.2 From a9102406780b81c39903f59754ab63786fff5e74 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 6 Aug 2025 22:25:37 +0200 Subject: [PATCH 365/540] feat: update staging and snapshot repository url for central sonatype publishing --- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 4 ++-- Adjust/plugins/sdk-plugin-imei/build.gradle | 4 ++-- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 4 ++-- Adjust/plugins/sdk-plugin-oaid/build.gradle | 4 ++-- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 4 ++-- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 4 ++-- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 4 ++-- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 4 ++-- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 4 ++-- Adjust/sdk-core/build.gradle | 4 ++-- 10 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index c3dee8c04..ac8b1d315 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -106,9 +106,9 @@ afterEvaluate { maven { if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { println "Using Maven SNAPSHOT repository for publishing" - url "https://oss.sonatype.org/content/repositories/snapshots/" + url "https://central.sonatype.com/repository/maven-snapshots/" } else { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + url "https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2" } if (project.hasProperty("sonatypeUsername")) { credentials { diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index bf009bfb6..b9b7758a2 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -108,9 +108,9 @@ afterEvaluate { maven { if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { println "Using Maven SNAPSHOT repository for publishing" - url "https://oss.sonatype.org/content/repositories/snapshots/" + url "https://central.sonatype.com/repository/maven-snapshots/" } else { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + url "https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2" } if (project.hasProperty("sonatypeUsername")) { credentials { diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index 1107a5582..95de5e77f 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -106,9 +106,9 @@ afterEvaluate { maven { if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { println "Using Maven SNAPSHOT repository for publishing" - url "https://oss.sonatype.org/content/repositories/snapshots/" + url "https://central.sonatype.com/repository/maven-snapshots/" } else { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + url "https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2" } if (project.hasProperty("sonatypeUsername")) { credentials { diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index 03c0fb4ee..bff1a7a36 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -112,9 +112,9 @@ afterEvaluate { maven { if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { println "Using Maven SNAPSHOT repository for publishing" - url "https://oss.sonatype.org/content/repositories/snapshots/" + url "https://central.sonatype.com/repository/maven-snapshots/" } else { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + url "https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2" } if (project.hasProperty("sonatypeUsername")) { credentials { diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index 3e53e0cf8..185819960 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -109,9 +109,9 @@ afterEvaluate { maven { if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { println "Using Maven SNAPSHOT repository for publishing" - url "https://oss.sonatype.org/content/repositories/snapshots/" + url "https://central.sonatype.com/repository/maven-snapshots/" } else { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + url "https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2" } if (project.hasProperty("sonatypeUsername")) { credentials { diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index 841581e52..177a4ec0e 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -109,9 +109,9 @@ afterEvaluate { maven { if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { println "Using Maven SNAPSHOT repository for publishing" - url "https://oss.sonatype.org/content/repositories/snapshots/" + url "https://central.sonatype.com/repository/maven-snapshots/" } else { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + url "https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2" } if (project.hasProperty("sonatypeUsername")) { credentials { diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index 08b5e6e38..fde93e70c 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -109,9 +109,9 @@ afterEvaluate { maven { if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { println "Using Maven SNAPSHOT repository for publishing" - url "https://oss.sonatype.org/content/repositories/snapshots/" + url "https://central.sonatype.com/repository/maven-snapshots/" } else { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + url "https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2" } if (project.hasProperty("sonatypeUsername")) { credentials { diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index 22c19aaa4..8f7557914 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -108,9 +108,9 @@ afterEvaluate { maven { if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { println "Using Maven SNAPSHOT repository for publishing" - url "https://oss.sonatype.org/content/repositories/snapshots/" + url "https://central.sonatype.com/repository/maven-snapshots/" } else { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + url "https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2" } if (project.hasProperty("sonatypeUsername")) { credentials { diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index 9aa98835c..76715ef66 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -111,9 +111,9 @@ afterEvaluate { maven { if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { println "Using Maven SNAPSHOT repository for publishing" - url "https://oss.sonatype.org/content/repositories/snapshots/" + url "https://central.sonatype.com/repository/maven-snapshots/" } else { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + url "https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2" } if (project.hasProperty("sonatypeUsername")) { credentials { diff --git a/Adjust/sdk-core/build.gradle b/Adjust/sdk-core/build.gradle index 910081675..f47c729e2 100644 --- a/Adjust/sdk-core/build.gradle +++ b/Adjust/sdk-core/build.gradle @@ -124,9 +124,9 @@ afterEvaluate { maven { if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { println "Using Maven SNAPSHOT repository for publishing" - url "https://oss.sonatype.org/content/repositories/snapshots/" + url "https://central.sonatype.com/repository/maven-snapshots/" } else { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + url "https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2" } if (project.hasProperty("sonatypeUsername")) { credentials { From 53225a217d28080a43b54f273221e0fd633b39d2 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 7 Aug 2025 08:17:29 +0200 Subject: [PATCH 366/540] docs: update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5cfead4d5..f6a03e713 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### Version 5.4.2 (7th August 2025) +#### Changed +- Updated purchase verification handler (internal changes). + +--- + ### Version 5.4.1 (23rd June 2025) #### Added - Optimized the logic behind the `processAndResolveDeeplink` method to immediately return links that have already been resolved. From 1a229bfc4f13f7f63fac8bbc4d14d267cebcc9bb Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 7 Aug 2025 10:40:15 +0200 Subject: [PATCH 367/540] feat: update staging and snapshot repository ol url with central sonatype snapshot url --- Adjust/examples/example-app-java/build.gradle | 2 +- Adjust/examples/example-app-keyboard/build.gradle | 2 +- Adjust/examples/example-app-tv/build.gradle | 2 +- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-imei/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-oaid/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 2 +- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- Adjust/tests/test-app-core/build.gradle | 2 +- Adjust/tests/test-app-webbridge/build.gradle | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Adjust/examples/example-app-java/build.gradle b/Adjust/examples/example-app-java/build.gradle index fa5e0fedb..d286f0abe 100644 --- a/Adjust/examples/example-app-java/build.gradle +++ b/Adjust/examples/example-app-java/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' repositories { maven { - url "https://oss.sonatype.org/content/repositories/staging/" + url "https://central.sonatype.com/repository/maven-snapshots/" } } diff --git a/Adjust/examples/example-app-keyboard/build.gradle b/Adjust/examples/example-app-keyboard/build.gradle index 3beabc981..fae8d9418 100644 --- a/Adjust/examples/example-app-keyboard/build.gradle +++ b/Adjust/examples/example-app-keyboard/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' repositories { maven { - url "https://oss.sonatype.org/content/repositories/staging/" + url "https://central.sonatype.com/repository/maven-snapshots/" } } diff --git a/Adjust/examples/example-app-tv/build.gradle b/Adjust/examples/example-app-tv/build.gradle index fa5e0fedb..d286f0abe 100755 --- a/Adjust/examples/example-app-tv/build.gradle +++ b/Adjust/examples/example-app-tv/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' repositories { maven { - url "https://oss.sonatype.org/content/repositories/staging/" + url "https://central.sonatype.com/repository/maven-snapshots/" } } diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index ac8b1d315..42f0db95c 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'signing' repositories { maven { - url "https://oss.sonatype.org/content/repositories/staging/" + url "https://central.sonatype.com/repository/maven-snapshots/" } } diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index b9b7758a2..67f1f5c64 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'signing' repositories { maven { - url "https://oss.sonatype.org/content/repositories/staging/" + url "https://central.sonatype.com/repository/maven-snapshots/" } } diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index 95de5e77f..5b1361bf3 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'signing' repositories { maven { - url "https://oss.sonatype.org/content/repositories/staging/" + url "https://central.sonatype.com/repository/maven-snapshots/" } } diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index bff1a7a36..101330f56 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'signing' repositories { maven { - url "https://oss.sonatype.org/content/repositories/staging/" + url "https://central.sonatype.com/repository/maven-snapshots/" } maven { url "https://developer.huawei.com/repo/" diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index 185819960..4817c57ec 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'signing' repositories { maven { - url "https://oss.sonatype.org/content/repositories/staging/" + url "https://central.sonatype.com/repository/maven-snapshots/" } } diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index 177a4ec0e..6f748b387 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'signing' repositories { maven { - url "https://oss.sonatype.org/content/repositories/staging/" + url "https://central.sonatype.com/repository/maven-snapshots/" } } diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index fde93e70c..544bcf11d 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'signing' repositories { maven { - url "https://oss.sonatype.org/content/repositories/staging/" + url "https://central.sonatype.com/repository/maven-snapshots/" } } diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index 8f7557914..fc9d49862 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'signing' repositories { maven { - url "https://oss.sonatype.org/content/repositories/staging/" + url "https://central.sonatype.com/repository/maven-snapshots/" } } diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index 76715ef66..35ea25168 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'signing' repositories { maven { - url "https://oss.sonatype.org/content/repositories/staging/" + url "https://central.sonatype.com/repository/maven-snapshots/" } } diff --git a/Adjust/tests/test-app-core/build.gradle b/Adjust/tests/test-app-core/build.gradle index f71a1e981..e14c2a1f0 100644 --- a/Adjust/tests/test-app-core/build.gradle +++ b/Adjust/tests/test-app-core/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' repositories { maven { - url "https://oss.sonatype.org/content/repositories/snapshots/" + url "https://central.sonatype.com/repository/maven-snapshots/" } } diff --git a/Adjust/tests/test-app-webbridge/build.gradle b/Adjust/tests/test-app-webbridge/build.gradle index 7cb47a80d..0bab12d3e 100644 --- a/Adjust/tests/test-app-webbridge/build.gradle +++ b/Adjust/tests/test-app-webbridge/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' repositories { maven { - url "https://oss.sonatype.org/content/repositories/snapshots/" + url "https://central.sonatype.com/repository/maven-snapshots/" } } From 3c4fc14c666b71267315347211e0a3ab9b420b82 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 7 Aug 2025 12:00:29 +0200 Subject: [PATCH 368/540] reafc: update signature lib to 3.47.0 using in example and test apps --- Adjust/examples/example-app-fbpixel/build.gradle | 2 +- Adjust/examples/example-app-java/build.gradle | 2 +- Adjust/examples/example-app-keyboard/build.gradle | 2 +- Adjust/examples/example-app-kotlin/build.gradle | 2 +- Adjust/examples/example-app-tv/build.gradle | 2 +- Adjust/examples/example-app-webbridge/build.gradle | 2 +- Adjust/tests/test-app-core/build.gradle | 2 +- Adjust/tests/test-app-webbridge/build.gradle | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Adjust/examples/example-app-fbpixel/build.gradle b/Adjust/examples/example-app-fbpixel/build.gradle index 17b355aef..0c0c07b20 100644 --- a/Adjust/examples/example-app-fbpixel/build.gradle +++ b/Adjust/examples/example-app-fbpixel/build.gradle @@ -35,5 +35,5 @@ dependencies { implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') - implementation 'com.adjust.signature:adjust-android-signature:3+' + implementation 'com.adjust.signature:adjust-android-signature:3.47.0' } diff --git a/Adjust/examples/example-app-java/build.gradle b/Adjust/examples/example-app-java/build.gradle index d286f0abe..52739da43 100644 --- a/Adjust/examples/example-app-java/build.gradle +++ b/Adjust/examples/example-app-java/build.gradle @@ -38,5 +38,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3+' + implementation 'com.adjust.signature:adjust-android-signature:3.47.0' } diff --git a/Adjust/examples/example-app-keyboard/build.gradle b/Adjust/examples/example-app-keyboard/build.gradle index fae8d9418..f043c5b57 100644 --- a/Adjust/examples/example-app-keyboard/build.gradle +++ b/Adjust/examples/example-app-keyboard/build.gradle @@ -38,5 +38,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3+' + implementation 'com.adjust.signature:adjust-android-signature:3.47.0' } diff --git a/Adjust/examples/example-app-kotlin/build.gradle b/Adjust/examples/example-app-kotlin/build.gradle index 564bd53c2..b2441763e 100644 --- a/Adjust/examples/example-app-kotlin/build.gradle +++ b/Adjust/examples/example-app-kotlin/build.gradle @@ -40,5 +40,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3+' + implementation 'com.adjust.signature:adjust-android-signature:3.47.0' } diff --git a/Adjust/examples/example-app-tv/build.gradle b/Adjust/examples/example-app-tv/build.gradle index d286f0abe..52739da43 100755 --- a/Adjust/examples/example-app-tv/build.gradle +++ b/Adjust/examples/example-app-tv/build.gradle @@ -38,5 +38,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3+' + implementation 'com.adjust.signature:adjust-android-signature:3.47.0' } diff --git a/Adjust/examples/example-app-webbridge/build.gradle b/Adjust/examples/example-app-webbridge/build.gradle index b31437a4b..2f103eaef 100644 --- a/Adjust/examples/example-app-webbridge/build.gradle +++ b/Adjust/examples/example-app-webbridge/build.gradle @@ -33,5 +33,5 @@ dependencies { implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') - implementation 'com.adjust.signature:adjust-android-signature:3+' + implementation 'com.adjust.signature:adjust-android-signature:3.47.0' } diff --git a/Adjust/tests/test-app-core/build.gradle b/Adjust/tests/test-app-core/build.gradle index e14c2a1f0..0462380c1 100644 --- a/Adjust/tests/test-app-core/build.gradle +++ b/Adjust/tests/test-app-core/build.gradle @@ -30,7 +30,7 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:2.1.1" implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0' implementation 'com.android.installreferrer:installreferrer:2.2' - implementation 'com.adjust.signature:adjust-android-signature:3+' + implementation 'com.adjust.signature:adjust-android-signature:3.47.0' implementation project(':sdk-core') implementation project(':tests:test-options') diff --git a/Adjust/tests/test-app-webbridge/build.gradle b/Adjust/tests/test-app-webbridge/build.gradle index 0bab12d3e..357492f70 100644 --- a/Adjust/tests/test-app-webbridge/build.gradle +++ b/Adjust/tests/test-app-webbridge/build.gradle @@ -32,7 +32,7 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:2.1.1" implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0' implementation 'com.android.installreferrer:installreferrer:2.2' - implementation 'com.adjust.signature:adjust-android-signature:3+' + implementation 'com.adjust.signature:adjust-android-signature:3.47.0' implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') From b64bf006850816a74244bd3873bdffed8112d196 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 8 Aug 2025 13:36:18 +0200 Subject: [PATCH 369/540] feat: extract deeplink from session response --- .../java/com/adjust/sdk/ActivityHandler.java | 3 +++ .../java/com/adjust/sdk/AttributionHandler.java | 17 +++++++++++++++-- .../com/adjust/sdk/SessionResponseData.java | 3 +++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 8918d1f74..96afd61f7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1654,6 +1654,9 @@ private void launchSessionResponseTasksI(SessionResponseData sessionResponseData // launch Session tracking listener if available launchSessionResponseListenerI(sessionResponseData, handler); + // if there is any, try to launch the deeplink + prepareDeeplinkI(sessionResponseData.deeplink, handler); + // mark session response has proccessed internalState.sessionResponseProcessed = true; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java index 02090c826..8937f5f82 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AttributionHandler.java @@ -187,6 +187,7 @@ private void checkSessionResponseI(IActivityHandler activityHandler, SessionResponseData sessionResponseData) { checkAttributionI(activityHandler, sessionResponseData); + checkDeeplinkInSessionResponseI(sessionResponseData); activityHandler.launchSessionResponseTasks(sessionResponseData); } @@ -201,11 +202,11 @@ private void checkAttributionResponseI(IActivityHandler activityHandler, AttributionResponseData attributionResponseData) { checkAttributionI(activityHandler, attributionResponseData); - checkDeeplinkI(attributionResponseData); + checkDeeplinkInAttributionResponseI(attributionResponseData); activityHandler.launchAttributionResponseTasks(attributionResponseData); } - private void checkDeeplinkI(AttributionResponseData attributionResponseData) { + private void checkDeeplinkInAttributionResponseI(AttributionResponseData attributionResponseData) { if (attributionResponseData.jsonResponse == null) { return; } @@ -221,6 +222,18 @@ private void checkDeeplinkI(AttributionResponseData attributionResponseData) { attributionResponseData.deeplink = Uri.parse(deeplinkString); } + private void checkDeeplinkInSessionResponseI(SessionResponseData sessionResponseData) { + if (sessionResponseData.jsonResponse == null) { + return; + } + + String deeplinkString = sessionResponseData.jsonResponse.optString("deeplink", null); + if (deeplinkString == null) { + return; + } + sessionResponseData.deeplink = Uri.parse(deeplinkString); + } + private void sendAttributionRequestI() { if (activityHandlerWeakRef.get().getActivityState().isGdprForgotten) { return; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SessionResponseData.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SessionResponseData.java index e6e2fc178..77b7c580f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SessionResponseData.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SessionResponseData.java @@ -1,5 +1,7 @@ package com.adjust.sdk; +import android.net.Uri; + import org.json.JSONObject; /** @@ -9,6 +11,7 @@ */ public class SessionResponseData extends ResponseData { private String sdkPlatform; + public Uri deeplink; public SessionResponseData(final ActivityPackage activityPackage) { this.sdkPlatform = Util.getSdkPrefixPlatform(activityPackage.getClientSdk()); From 0b565649c9b6daf1c9069f799f859b0dba19d081 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 22 Aug 2025 11:59:27 +0200 Subject: [PATCH 370/540] feat: update version number to 5.4.3 --- Adjust/build.gradle | 2 +- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-imei/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-oaid/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java | 2 +- VERSION | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index ffcbbaa93..a156e79ba 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 36 coreTargetSdkVersion = 36 - coreVersionName = '5.4.2' + coreVersionName = '5.4.3' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index 42f0db95c..ddd7e8c6c 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.2' + // implementation 'com.adjust.sdk:adjust-android:5.4.3' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index 67f1f5c64..88ffb84f7 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.2' + // implementation 'com.adjust.sdk:adjust-android:5.4.3' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index 5b1361bf3..af641f2a4 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.2' + // implementation 'com.adjust.sdk:adjust-android:5.4.3' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index 101330f56..041721b6f 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.2' + // implementation 'com.adjust.sdk:adjust-android:5.4.3' implementation 'com.huawei.hms:ads-identifier:3.4.56.300' } diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index 4817c57ec..7a682ae67 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.2' + // implementation 'com.adjust.sdk:adjust-android:5.4.3' // Add Samsung clouddev lib. compileOnly fileTree(include: ['*.aar'], dir: 'libs') diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index 6f748b387..e404195f8 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.2' + // implementation 'com.adjust.sdk:adjust-android:5.4.3' // Add Samsung referrer lib via Maven. implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:3.0.1' diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index 544bcf11d..2d2dc108a 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.2' + // implementation 'com.adjust.sdk:adjust-android:5.4.3' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index fc9d49862..164268b0d 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.2' + // implementation 'com.adjust.sdk:adjust-android:5.4.3' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index f3eb08ca1..4a4d60229 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -295,7 +295,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge5.4.2'; + return 'web-bridge5.4.3'; } }, diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index 35ea25168..7fdc8cd64 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -31,7 +31,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.2' + // implementation 'com.adjust.sdk:adjust-android:5.4.3' // Add xiaomi referrer lib via Maven. implementation 'com.miui.referrer:homereferrer:1.0.0.6' diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 33fa46453..c0b284923 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -32,7 +32,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.4.2"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.4.3"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 0b221b7c3..eda6ed463 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -38,7 +38,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android5.4.2"; + String CLIENT_SDK = "android5.4.3"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/VERSION b/VERSION index 8ae03c119..6ffbe8ba8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.4.2 +5.4.3 From b9853773cc992bb0370a77f1b9c29b8111f9cee2 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 22 Aug 2025 12:00:58 +0200 Subject: [PATCH 371/540] docs: update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6a03e713..1154c4941 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### Version 5.4.3 (22nd August 2025) +#### Added +- Added support for processing deferred deep links in session responses. + +--- + ### Version 5.4.2 (7th August 2025) #### Changed - Updated purchase verification handler (internal changes). From b4d03a44138da2f2fcfdc6fff34451a2ca99a081 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 25 Aug 2025 04:26:37 +0200 Subject: [PATCH 372/540] docs: update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1154c4941..738b9a3fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### Version 5.4.3 (22nd August 2025) +### Version 5.4.3 (25th August 2025) #### Added - Added support for processing deferred deep links in session responses. From 12a9f9848c00f1ed69cd171ffbbf0ccb06f994af Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 6 May 2025 14:00:31 +0200 Subject: [PATCH 373/540] feat: creating lvl plugin using the licenseService to fetch signed data --- .../src/main/AndroidManifest.xml | 2 + .../.gitignore | 1 + .../build.gradle | 235 ++++++++++++++++++ .../proguard-rules.pro | 21 ++ .../ExampleInstrumentedTest.java | 26 ++ .../src/main/AndroidManifest.xml | 5 + .../licensing/ILicenseResultListener.aidl | 21 ++ .../vending/licensing/ILicensingService.aidl | 23 ++ .../sdk/lvl/AdjustLicenseVerification.java | 39 +++ .../com/adjust/sdk/lvl/LicenseChecker.java | 85 +++++++ .../adjust/sdk/lvl/LicenseRawCallback.java | 6 + .../main/java/com/adjust/sdk/lvl/Util.java | 13 + .../ExampleUnitTest.java | 17 ++ .../java/com/adjust/sdk/ActivityHandler.java | 14 ++ .../com/adjust/sdk/LicenseRequiredData.java | 25 ++ .../main/java/com/adjust/sdk/Reflection.java | 12 + Adjust/settings.gradle | 1 + 17 files changed, 546 insertions(+) create mode 100644 Adjust/plugins/sdk-plugin-license-verification/.gitignore create mode 100644 Adjust/plugins/sdk-plugin-license-verification/build.gradle create mode 100644 Adjust/plugins/sdk-plugin-license-verification/proguard-rules.pro create mode 100644 Adjust/plugins/sdk-plugin-license-verification/src/androidTest/java/com/example/sdk_plugin_license_verification/ExampleInstrumentedTest.java create mode 100644 Adjust/plugins/sdk-plugin-license-verification/src/main/AndroidManifest.xml create mode 100644 Adjust/plugins/sdk-plugin-license-verification/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl create mode 100644 Adjust/plugins/sdk-plugin-license-verification/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl create mode 100644 Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java create mode 100644 Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java create mode 100644 Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java create mode 100644 Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java create mode 100644 Adjust/plugins/sdk-plugin-license-verification/src/test/java/com/example/sdk_plugin_license_verification/ExampleUnitTest.java create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/LicenseRequiredData.java diff --git a/Adjust/examples/example-app-java/src/main/AndroidManifest.xml b/Adjust/examples/example-app-java/src/main/AndroidManifest.xml index e8ed52227..b57a20670 100644 --- a/Adjust/examples/example-app-java/src/main/AndroidManifest.xml +++ b/Adjust/examples/example-app-java/src/main/AndroidManifest.xml @@ -5,6 +5,8 @@ + + diff --git a/Adjust/plugins/sdk-plugin-license-verification/.gitignore b/Adjust/plugins/sdk-plugin-license-verification/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-license-verification/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/Adjust/plugins/sdk-plugin-license-verification/build.gradle b/Adjust/plugins/sdk-plugin-license-verification/build.gradle new file mode 100644 index 000000000..014008580 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-license-verification/build.gradle @@ -0,0 +1,235 @@ +apply plugin: 'com.android.library' +apply plugin: 'maven-publish' +apply plugin: 'signing' + +repositories { + maven { + url "https://oss.sonatype.org/content/repositories/staging/" + } +} + +android { + compileSdk rootProject.ext.coreCompileSdkVersion + publishing { + multipleVariants { + allVariants() + withJavadocJar() + } + } + defaultConfig { + minSdkVersion rootProject.ext.coreMinSdkVersion + targetSdkVersion rootProject.ext.coreTargetSdkVersion + } + namespace 'com.adjust.sdk.lvl' + sourceSets { + main { + aidl { + srcDirs 'src/main/aidl' + } + } + } + buildFeatures { + aidl true + } +} + +dependencies { + // Add SDK via module. + compileOnly project(':sdk-core') + // Add SDK via Maven. + // implementation 'com.adjust.sdk:adjust-android:5.3.0' +} + +// read local properties +File localPropsFile = project.rootProject.file('local.properties') +if (localPropsFile.exists()) { + Properties p = new Properties() + new FileInputStream(localPropsFile).withCloseable { is -> + p.load(is) + } + p.each { name, value -> + ext[name] = value + } +} + +task adjustLicenseVerificationPluginAar(type: Copy) { + dependsOn 'assembleRelease' + + from('build/outputs/aar/') + include 'sdk-plugin-license-verification-release.aar' + destinationDir file('build/libs/') + rename 'sdk-plugin-license-verification-release.aar', "${project.name}.aar" + +} + +task adjustLicenseVerificationPluginJar(type: Jar) { + dependsOn 'packageReleaseAssets' + dependsOn 'compileReleaseJavaWithJavac' + + from('build/intermediates/library_assets/release/packageReleaseAssets/out/') { + into('assets') + } + from('build/intermediates/javac/release/classes/') + + archiveFileName = project.provider { "${project.name}.jar" } +} + + +task adjustLicenseVerificationPluginSourcesJar(type: Jar) { + setArchiveClassifier('sources') + from android.sourceSets.main.java.srcDirs +} + +artifacts { + archives adjustLicenseVerificationPluginJar + archives adjustLicenseVerificationPluginSourcesJar +} + +afterEvaluate { + publishing { + publications { +/* + mavenAndroidLicenseVerificationJar(MavenPublication) { + customizePomForJar(pom) + groupId rootProject.ext.adjustGroupId + artifactId 'adjust-android-license-verification' + version rootProject.ext.coreVersionName + + artifact adjustLicenseVerificationPluginJar + artifact adjustLicenseVerificationPluginSourcesJar + } +*/ + mavenAndroidLicenseVerificationAar(MavenPublication) { + customizePomForAar(pom) + groupId rootProject.ext.adjustGroupId + artifactId 'adjust-android-license-verification' + version rootProject.ext.coreVersionName + + artifact("$buildDir/outputs/aar/sdk-plugin-license-verification-release.aar") { + builtBy tasks.getByPath("adjustLicenseVerificationPluginAar") + } + artifact adjustLicenseVerificationPluginSourcesJar + } + } + + repositories { + maven { + if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { + println "Using Maven SNAPSHOT repository for publishing" + url "https://oss.sonatype.org/content/repositories/snapshots/" + } else { + url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + } + if (project.hasProperty("sonatypeUsername")) { + credentials { + username sonatypeUsername + password sonatypePassword + } + } + } + } + } + signing { +// sign publishing.publications.mavenAndroidLicenseVerificationJar + sign publishing.publications.mavenAndroidLicenseVerificationAar + } +} + +def customizePomForJar(pom) { + pom.withXml { + def root = asNode() + + // Add all items necessary for maven central publication. + root.children().last() + { + resolveStrategy = Closure.DELEGATE_FIRST + description 'The License Verification plugin for Adjust SDK for Android' + name 'Adjust Android SDK License Verification plugin' + url 'https://github.com/adjust/android_sdk' + + organization { + name 'adjust GmbH' + url 'http://www.adjust.com' + } + licenses { + license { + name 'MIT License' + url 'http://www.opensource.org/licenses/mit-license.php' + } + } + scm { + url 'git@github.com:adjust/android_sdk.git' + connection 'scm:git:git@github.com:adjust/android_sdk.git' + developerConnection 'scm:git:git@github.com:adjust/android_sdk.git' + } + developers { + developer { + name 'Pedro Silva' + email 'pedro@adjust.com' + } + developer { + name 'Ugljesa Erceg' + email 'ugljesa@adjust.com' + } + } + } + } +} + +def customizePomForAar(pom) { + pom.withXml { + def root = asNode() + + // Add all items necessary for maven central publication. + root.children().last() + { + resolveStrategy = Closure.DELEGATE_FIRST + description 'The License Verification plugin for Adjust SDK for Android' + name 'Adjust Android SDK License Verification plugin' + url 'https://github.com/adjust/android_sdk' + + organization { + name 'adjust GmbH' + url 'http://www.adjust.com' + } + licenses { + license { + name 'MIT License' + url 'http://www.opensource.org/licenses/mit-license.php' + } + } + scm { + url 'git@github.com:adjust/android_sdk.git' + connection 'scm:git:git@github.com:adjust/android_sdk.git' + developerConnection 'scm:git:git@github.com:adjust/android_sdk.git' + } + developers { + developer { + name 'Pedro Silva' + email 'pedro@adjust.com' + } + developer { + name 'Ugljesa Erceg' + email 'ugljesa@adjust.com' + } + } + } + } +} + +model { +// tasks.generatePomFileForMavenAndroidLicenseVerificationJarPublication { +// destination = file("${project.buildDir}/generated-pom.xml") +// } + /* TODO check if/how to replace this tasks + tasks.publishMavenAndroidLicenseVerificationPublicationToMavenLocal { + dependsOn project.tasks.signArchives + } + tasks.publishMavenAndroidLicenseVerificationPublicationToMavenRepository { + dependsOn project.tasks.signArchives + } + */ + tasks.generatePomFileForMavenAndroidLicenseVerificationAarPublication { + destination = file("${project.buildDir}/generated-pom.xml") + } +} + + diff --git a/Adjust/plugins/sdk-plugin-license-verification/proguard-rules.pro b/Adjust/plugins/sdk-plugin-license-verification/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-license-verification/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/androidTest/java/com/example/sdk_plugin_license_verification/ExampleInstrumentedTest.java b/Adjust/plugins/sdk-plugin-license-verification/src/androidTest/java/com/example/sdk_plugin_license_verification/ExampleInstrumentedTest.java new file mode 100644 index 000000000..b34f06742 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-license-verification/src/androidTest/java/com/example/sdk_plugin_license_verification/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.sdk_plugin_license_verification; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.example.sdk_plugin_license_verification", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/AndroidManifest.xml b/Adjust/plugins/sdk-plugin-license-verification/src/main/AndroidManifest.xml new file mode 100644 index 000000000..a27fb4b66 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl b/Adjust/plugins/sdk-plugin-license-verification/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl new file mode 100644 index 000000000..869cb16f6 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.vending.licensing; + +oneway interface ILicenseResultListener { + void verifyLicense(int responseCode, String signedData, String signature); +} diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl b/Adjust/plugins/sdk-plugin-license-verification/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl new file mode 100644 index 000000000..9541a2090 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.vending.licensing; + +import com.android.vending.licensing.ILicenseResultListener; + +oneway interface ILicensingService { + void checkLicense(long nonce, String packageName, in ILicenseResultListener listener); +} diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java new file mode 100644 index 000000000..3d04328e5 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java @@ -0,0 +1,39 @@ +package com.adjust.sdk.lvl; + +import android.content.Context; + +import com.adjust.sdk.ILogger; +import com.adjust.sdk.LicenseRequiredData; + +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +public class AdjustLicenseVerification { + + public static LicenseRequiredData fetchLicenseDate(Context context, ILogger logger) { + try { + logger.info("start fetch license data"); + BlockingQueue licenseHolder = new LinkedBlockingQueue(1); + LicenseChecker checker = new LicenseChecker(context, new LicenseRawCallback() { + @Override + public void onLicenseDataReceived(String signedData, String signature, int responseCode) { + logger.info("license data received from server with code: " + responseCode ); + licenseHolder.offer(new LicenseRequiredData(signedData, signature, responseCode)); + } + + @Override + public void onError(int errorCode) { + logger.error("license error: " + errorCode ); + licenseHolder.offer(new LicenseRequiredData(null, null, errorCode)); + } + }); + logger.info("license check access"); + checker.checkAccess(); + return licenseHolder.poll(10000, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + logger.error("license checker interrupted: ", e.getMessage()); + return null; + } + } +} diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java new file mode 100644 index 000000000..437da5f3f --- /dev/null +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -0,0 +1,85 @@ +package com.adjust.sdk.lvl; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.IBinder; +import android.os.RemoteException; +import android.util.Log; + +import com.android.vending.licensing.ILicensingService; + +public class LicenseChecker { + private static final String TAG = "LicenseChecker"; + private static final String GOOGLE_PLAY_PACKAGE = "com.android.vending"; + + private final Context mContext; + private final LicenseRawCallback mCallback; + private ILicensingService mService; + private boolean mBound ; + + public LicenseChecker(Context context, LicenseRawCallback callback) { + this.mContext = context.getApplicationContext(); + this.mCallback = callback; + } + + public void checkAccess() { + if (mBound) return; + + Log.d(TAG, "License check starts 1"); + Intent serviceIntent = new Intent("com.android.vending.licensing.ILicensingService.BIND"); + serviceIntent.setPackage(GOOGLE_PLAY_PACKAGE); + boolean isBind = mContext.bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE); + Log.d(TAG, "License check bindService = " + isBind); + } + + private final ServiceConnection mServiceConnection = new ServiceConnection() { + + public void onServiceConnected(ComponentName name, IBinder service) { + Log.d(TAG, "License check starts 3"); + + mService = ILicensingService.Stub.asInterface(service); + mBound = true; + + try { + String packageName = mContext.getPackageName(); +// int versionCode = mContext.getPackageManager() +// .getPackageInfo(packageName, 0).versionCode; + Log.d(TAG, "License check starts"); + + mService.checkLicense(1, packageName, new ResultListener()); + + } catch (Exception e) { + Log.e(TAG, "License check failed", e); + mCallback.onError(-1); + } + } + + public void onServiceDisconnected(ComponentName name) { + Log.d(TAG, "License check disconnected"); + mService = null; + mBound = false; + } + }; + + public void onDestroy() { + Log.d(TAG, "License check onDestroy"); + if (mBound) { + mContext.unbindService(mServiceConnection); + mBound = false; + } + } + + private class ResultListener extends com.android.vending.licensing.ILicenseResultListener.Stub { + @Override + public void verifyLicense(int responseCode, String signedData, String signature) throws RemoteException { + Log.d(TAG, "Received license response"); + if (signedData != null && signature != null) { + mCallback.onLicenseDataReceived(signedData, signature,responseCode); + } else { + mCallback.onError(responseCode); + } + } + } +} diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java new file mode 100644 index 000000000..48f3f64d5 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java @@ -0,0 +1,6 @@ +package com.adjust.sdk.lvl; + +public interface LicenseRawCallback { + void onLicenseDataReceived(String signedData, String signature,int responseCode); + void onError(int errorCode); +} diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java new file mode 100644 index 000000000..486ebacad --- /dev/null +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java @@ -0,0 +1,13 @@ +package com.adjust.sdk.lvl; + +import android.content.Context; + +import com.adjust.sdk.ILogger; +import com.adjust.sdk.LicenseRequiredData; + +public class Util { + + public synchronized static LicenseRequiredData getLicenseRequiredData(Context context, ILogger logger) { + return AdjustLicenseVerification.fetchLicenseDate(context, logger); + } +} diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/test/java/com/example/sdk_plugin_license_verification/ExampleUnitTest.java b/Adjust/plugins/sdk-plugin-license-verification/src/test/java/com/example/sdk_plugin_license_verification/ExampleUnitTest.java new file mode 100644 index 000000000..f6e0d7ff2 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-license-verification/src/test/java/com/example/sdk_plugin_license_verification/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.example.sdk_plugin_license_verification; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 96afd61f7..afcae4b2f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1365,6 +1365,7 @@ private void processSessionI() { // Try to check if there's new referrer information. installReferrer.startConnection(); + readLicenseVerificationData(); readInstallReferrerMeta(); readInstallReferrerHuaweiAds(); readInstallReferrerHuaweiAppGallery(); @@ -1390,6 +1391,18 @@ public void run() { }); } + private void readLicenseVerificationData() { + executor.submit(new Runnable() { + @Override + public void run() { + LicenseRequiredData licenseRequiredData = Reflection.getLicenseRequiredData(getContext(), logger); + if (licenseRequiredData != null) { + logger.info("licenseRequiredData: %s", licenseRequiredData.toString()); + } + } + }); + } + private void readInstallReferrerHuaweiAds() { executor.submit(new Runnable() { @Override @@ -1921,6 +1934,7 @@ private void checkAfterNewStartI(SharedPreferencesManager sharedPreferencesManag // try to read and send the install referrer installReferrer.startConnection(); + readLicenseVerificationData(); readInstallReferrerMeta(); readInstallReferrerHuaweiAds(); readInstallReferrerHuaweiAppGallery(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/LicenseRequiredData.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/LicenseRequiredData.java new file mode 100644 index 000000000..9e547a52d --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/LicenseRequiredData.java @@ -0,0 +1,25 @@ +package com.adjust.sdk; + +public class LicenseRequiredData { + private final String signedData; + private final String signature; + private final int responseCode; + + public LicenseRequiredData(String signedData, String signature, int responseCode) { + this.signedData = signedData; + this.signature = signature; + this.responseCode = responseCode; + } + + public String getSignedData() { + return signedData; + } + + public String getSignature() { + return signature; + } + + public int getResponseCode() { + return responseCode; + } +} diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java index f58a1c05e..00cd35302 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java @@ -72,6 +72,18 @@ public static ReferrerDetails getMetaReferrer(Context context, String fbAppId, I return referrerDetails; } + public static LicenseRequiredData getLicenseRequiredData(Context context, ILogger logger) { + LicenseRequiredData licenseRequiredData = null; + try { + licenseRequiredData = (LicenseRequiredData) invokeStaticMethod("com.adjust.sdk.lvl.Util", + "getLicenseRequiredData", + new Class[]{Context.class, ILogger.class}, + context, logger); + } catch (Exception e) { + } + return licenseRequiredData; + } + public static ReferrerDetails getHuaweiAdsReferrer(Context context, ILogger logger) { ReferrerDetails referrerDetails = null; try { diff --git a/Adjust/settings.gradle b/Adjust/settings.gradle index 138a32557..b90a1b0e7 100644 --- a/Adjust/settings.gradle +++ b/Adjust/settings.gradle @@ -21,3 +21,4 @@ include ':examples:example-app-tv' include ':examples:example-app-webbridge' include ':examples:example-app-fbpixel' include ':examples:example-app-keyboard' +include ':plugins:sdk-plugin-license-verification' From a314086a244949666cfe47c2bccedcbf8b1b170a Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 15 May 2025 13:14:56 +0200 Subject: [PATCH 374/540] feat: creating lvl plugin using the licenseService to fetch signed data --- .../src/main/AndroidManifest.xml | 6 ++++-- .../adjust/sdk/lvl/AdjustLicenseVerification.java | 2 +- .../java/com/adjust/sdk/lvl/LicenseChecker.java | 13 ++++++------- .../java/com/adjust/sdk/lvl/LicenseRawCallback.java | 2 +- .../main/java/com/adjust/sdk/ActivityHandler.java | 2 +- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/AndroidManifest.xml b/Adjust/plugins/sdk-plugin-license-verification/src/main/AndroidManifest.xml index a27fb4b66..00053e6bc 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/AndroidManifest.xml +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/AndroidManifest.xml @@ -1,5 +1,7 @@ - + + - \ No newline at end of file diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java index 3d04328e5..5f13f7f44 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java @@ -17,7 +17,7 @@ public static LicenseRequiredData fetchLicenseDate(Context context, ILogger logg BlockingQueue licenseHolder = new LinkedBlockingQueue(1); LicenseChecker checker = new LicenseChecker(context, new LicenseRawCallback() { @Override - public void onLicenseDataReceived(String signedData, String signature, int responseCode) { + public void onLicenseDataReceived(int responseCode,String signedData, String signature) { logger.info("license data received from server with code: " + responseCode ); licenseHolder.offer(new LicenseRequiredData(signedData, signature, responseCode)); } diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index 437da5f3f..ca1ea7631 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -17,20 +17,19 @@ public class LicenseChecker { private final Context mContext; private final LicenseRawCallback mCallback; private ILicensingService mService; - private boolean mBound ; + private boolean mBound; public LicenseChecker(Context context, LicenseRawCallback callback) { - this.mContext = context.getApplicationContext(); + this.mContext = context; this.mCallback = callback; } - public void checkAccess() { + public synchronized void checkAccess() { if (mBound) return; - Log.d(TAG, "License check starts 1"); - Intent serviceIntent = new Intent("com.android.vending.licensing.ILicensingService.BIND"); + Intent serviceIntent = new Intent("com.android.vending.licensing.ILicensingService"); serviceIntent.setPackage(GOOGLE_PLAY_PACKAGE); - boolean isBind = mContext.bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE); + boolean isBind = mContext.bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE); Log.d(TAG, "License check bindService = " + isBind); } @@ -76,7 +75,7 @@ private class ResultListener extends com.android.vending.licensing.ILicenseResul public void verifyLicense(int responseCode, String signedData, String signature) throws RemoteException { Log.d(TAG, "Received license response"); if (signedData != null && signature != null) { - mCallback.onLicenseDataReceived(signedData, signature,responseCode); + mCallback.onLicenseDataReceived(responseCode, signedData, signature); } else { mCallback.onError(responseCode); } diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java index 48f3f64d5..536477a67 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java @@ -1,6 +1,6 @@ package com.adjust.sdk.lvl; public interface LicenseRawCallback { - void onLicenseDataReceived(String signedData, String signature,int responseCode); + void onLicenseDataReceived(int responseCode, String signedData, String signature); void onError(int errorCode); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index afcae4b2f..1d72a017a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1397,7 +1397,7 @@ private void readLicenseVerificationData() { public void run() { LicenseRequiredData licenseRequiredData = Reflection.getLicenseRequiredData(getContext(), logger); if (licenseRequiredData != null) { - logger.info("licenseRequiredData: %s", licenseRequiredData.toString()); + logger.info("licenseRequiredData: %s", licenseRequiredData.getSignedData()); } } }); From 3d5a71dc24a294da540961f6ddc2c34e28a15620 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 3 Jun 2025 10:46:45 +0200 Subject: [PATCH 375/540] feat:adding retry mechanism --- Adjust/examples/example-app-java/build.gradle | 1 + .../sdk/lvl/AdjustLicenseVerification.java | 4 +- .../com/adjust/sdk/lvl/LicenseChecker.java | 105 ++++++++++++++---- .../main/java/com/adjust/sdk/lvl/Util.java | 4 +- .../java/com/adjust/sdk/ActivityHandler.java | 4 +- .../main/java/com/adjust/sdk/DeviceInfo.java | 4 + .../main/java/com/adjust/sdk/Reflection.java | 6 +- 7 files changed, 100 insertions(+), 28 deletions(-) diff --git a/Adjust/examples/example-app-java/build.gradle b/Adjust/examples/example-app-java/build.gradle index 52739da43..f73e9900b 100644 --- a/Adjust/examples/example-app-java/build.gradle +++ b/Adjust/examples/example-app-java/build.gradle @@ -15,6 +15,7 @@ android { targetSdkVersion 36 versionCode 1 versionName "1.0" + applicationIdSuffix ".java" } buildTypes { release { diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java index 5f13f7f44..a9ddecaf9 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java @@ -11,7 +11,7 @@ public class AdjustLicenseVerification { - public static LicenseRequiredData fetchLicenseDate(Context context, ILogger logger) { + public static LicenseRequiredData fetchLicenseDate(Context context, ILogger logger,String gpsAdid, long installTimeStamp) { try { logger.info("start fetch license data"); BlockingQueue licenseHolder = new LinkedBlockingQueue(1); @@ -27,7 +27,7 @@ public void onError(int errorCode) { logger.error("license error: " + errorCode ); licenseHolder.offer(new LicenseRequiredData(null, null, errorCode)); } - }); + }, gpsAdid, installTimeStamp); logger.info("license check access"); checker.checkAccess(); return licenseHolder.poll(10000, TimeUnit.MILLISECONDS); diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index ca1ea7631..850d92942 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -16,12 +16,19 @@ public class LicenseChecker { private final Context mContext; private final LicenseRawCallback mCallback; + private String gpsAdid; + private long installTimeStamp; private ILicensingService mService; private boolean mBound; - public LicenseChecker(Context context, LicenseRawCallback callback) { + private static final int MAX_RETRIES = 3; + private int retryCount = 0; + + public LicenseChecker(Context context, LicenseRawCallback callback, String gpsAdid, long installTimeStamp) { this.mContext = context; this.mCallback = callback; + this.gpsAdid = gpsAdid; + this.installTimeStamp = installTimeStamp; } public synchronized void checkAccess() { @@ -33,28 +40,37 @@ public synchronized void checkAccess() { Log.d(TAG, "License check bindService = " + isBind); } + private void executeLicenseCheck() { + try { + Log.d(TAG, "License check connected" +", retryCount = " + retryCount); + String packageName = mContext.getPackageName(); + long nonce = generateNonce(gpsAdid, installTimeStamp); + + Log.d(TAG, "License gpsAdid = " + gpsAdid); + Log.d(TAG, "License installTimeStamp = " + installTimeStamp); + Log.d(TAG, "License check nonce = " + nonce); + Log.d(TAG, "License check attempt #" + (retryCount + 1)); + + mService.checkLicense(nonce, packageName, new ResultListener()); + + } catch (Exception e) { + Log.e(TAG, "License check failed", e); + mCallback.onError(-1); + } + } + private final ServiceConnection mServiceConnection = new ServiceConnection() { public void onServiceConnected(ComponentName name, IBinder service) { - Log.d(TAG, "License check starts 3"); mService = ILicensingService.Stub.asInterface(service); mBound = true; - try { - String packageName = mContext.getPackageName(); -// int versionCode = mContext.getPackageManager() -// .getPackageInfo(packageName, 0).versionCode; - Log.d(TAG, "License check starts"); - - mService.checkLicense(1, packageName, new ResultListener()); - - } catch (Exception e) { - Log.e(TAG, "License check failed", e); - mCallback.onError(-1); - } + retryCount = 0; // Reset retry count on successful connection + executeLicenseCheck(); } + public void onServiceDisconnected(ComponentName name) { Log.d(TAG, "License check disconnected"); mService = null; @@ -73,12 +89,63 @@ public void onDestroy() { private class ResultListener extends com.android.vending.licensing.ILicenseResultListener.Stub { @Override public void verifyLicense(int responseCode, String signedData, String signature) throws RemoteException { - Log.d(TAG, "Received license response"); - if (signedData != null && signature != null) { - mCallback.onLicenseDataReceived(responseCode, signedData, signature); - } else { - mCallback.onError(responseCode); + Log.d(TAG, "Received license response, code: " + responseCode); + + switch (responseCode) { + case 0: // LICENSED + case 2: // LICENSED_OLD_KEY + retryCount = 0; + if (signedData != null && signature != null) { + mCallback.onLicenseDataReceived(responseCode, signedData, signature); + } else { + Log.e(TAG, "Valid response code, but missing signed data or signature"); + mCallback.onError(responseCode); + } + break; + + case 1: // NOT_LICENSED + case 6: // INVALID_PACKAGE_NAME + case 7: // NON_MATCHING_UID + retryCount = 0; + Log.w(TAG, "License check failed: " + responseCode); + mCallback.onError(responseCode); + break; + + case 3: // SERVER_FAILURE + case 4: // RETRY + case 5: // CONTACTING_SERVER_ERROR + if (++retryCount < MAX_RETRIES) { + Log.w(TAG, "Temporary license error, retrying... Attempt " + retryCount); + executeLicenseCheck(); + } else { + Log.e(TAG, "License check failed after max retries"); + mCallback.onError(responseCode); + } + break; + + default: + retryCount = 0; + Log.e(TAG, "Unexpected license response code: " + responseCode); + mCallback.onError(responseCode); + break; } } } + + + public static long generateNonce(String deviceId, long installTimestamp) { + // Hash the device ID (ADID, UUID, etc.) + int deviceHash = deviceId != null ? deviceId.hashCode() : 0; + + // Reduce timestamp (e.g., divide by 60 to get minutes) + long reducedTimestamp = (installTimestamp / 1000) % (1L << 24); // 24 bits + + // Pack into a long: [deviceHash: 32 bits][timestamp: 24 bits][spare: 8 bits] + long nonce = 0; + nonce |= (deviceHash & 0xFFFFFFFFL) << 32; + nonce |= (reducedTimestamp & 0xFFFFFFL) << 8; + nonce |= 0x01; // Version or flag, optional + + return nonce; + } } diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java index 486ebacad..714ccc097 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java @@ -7,7 +7,7 @@ public class Util { - public synchronized static LicenseRequiredData getLicenseRequiredData(Context context, ILogger logger) { - return AdjustLicenseVerification.fetchLicenseDate(context, logger); + public synchronized static LicenseRequiredData getLicenseRequiredData(Context context, ILogger logger,String gpsAdid, long installTimeStamp) { + return AdjustLicenseVerification.fetchLicenseDate(context, logger,gpsAdid, installTimeStamp); } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 1d72a017a..925c84e6c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1395,9 +1395,9 @@ private void readLicenseVerificationData() { executor.submit(new Runnable() { @Override public void run() { - LicenseRequiredData licenseRequiredData = Reflection.getLicenseRequiredData(getContext(), logger); + LicenseRequiredData licenseRequiredData = Reflection.getLicenseRequiredData(getContext(), logger,deviceInfo.playAdId,deviceInfo.installTimeTimestamp); if (licenseRequiredData != null) { - logger.info("licenseRequiredData: %s", licenseRequiredData.getSignedData()); + logger.info("licenseRequiredData: signed data = \n %s ,\n response code : %d,\n signature : %s,", licenseRequiredData.getSignature(),licenseRequiredData.getResponseCode(),licenseRequiredData.getSignedData()); } } }); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index b2204e49e..5746ce318 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -102,6 +102,7 @@ class DeviceInfo { String mnc; AdjustStoreInfo storeInfoFromClient; String storeIdFromSystem; + long installTimeTimestamp; DeviceInfo(AdjustConfig adjustConfig) { Context context = adjustConfig.context; @@ -134,6 +135,9 @@ class DeviceInfo { abi = getABI(); buildName = getBuildName(); appInstallTime = getAppInstallTime(packageInfo); + if (packageInfo != null){ + installTimeTimestamp = packageInfo.firstInstallTime; + } appUpdateTime = getAppUpdateTime(packageInfo); uiMode = getDeviceUiMode(configuration); if (Util.canReadPlayIds(adjustConfig)) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java index 00cd35302..fbaf70991 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java @@ -72,13 +72,13 @@ public static ReferrerDetails getMetaReferrer(Context context, String fbAppId, I return referrerDetails; } - public static LicenseRequiredData getLicenseRequiredData(Context context, ILogger logger) { + public static LicenseRequiredData getLicenseRequiredData(Context context, ILogger logger, String gpsAdid, long installTimeStamp) { LicenseRequiredData licenseRequiredData = null; try { licenseRequiredData = (LicenseRequiredData) invokeStaticMethod("com.adjust.sdk.lvl.Util", "getLicenseRequiredData", - new Class[]{Context.class, ILogger.class}, - context, logger); + new Class[]{Context.class, ILogger.class, String.class, long.class}, + context, logger, gpsAdid, installTimeStamp); } catch (Exception e) { } return licenseRequiredData; From 1b146b43c822e146f9ca4cfc14b5c2a53b803f1f Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 25 Jun 2025 15:27:52 +0200 Subject: [PATCH 376/540] feat:sending the sdk_click for LicenseChecker tuning the retry and error codes --- Adjust/examples/example-app-java/build.gradle | 2 +- .../sdk/lvl/AdjustLicenseVerification.java | 6 +- .../com/adjust/sdk/lvl/LicenseChecker.java | 104 ++++++++++-------- .../main/java/com/adjust/sdk/lvl/Util.java | 4 +- .../java/com/adjust/sdk/ActivityHandler.java | 63 ++++++++++- .../main/java/com/adjust/sdk/Constants.java | 1 + .../java/com/adjust/sdk/IActivityHandler.java | 2 + .../java/com/adjust/sdk/PackageBuilder.java | 6 + .../java/com/adjust/sdk/PackageFactory.java | 25 +++++ .../main/java/com/adjust/sdk/Reflection.java | 6 +- .../java/com/adjust/sdk/SdkClickHandler.java | 10 ++ .../adjust/sdk/SharedPreferencesManager.java | 20 ++++ 12 files changed, 193 insertions(+), 56 deletions(-) diff --git a/Adjust/examples/example-app-java/build.gradle b/Adjust/examples/example-app-java/build.gradle index f73e9900b..0f11916d3 100644 --- a/Adjust/examples/example-app-java/build.gradle +++ b/Adjust/examples/example-app-java/build.gradle @@ -15,7 +15,7 @@ android { targetSdkVersion 36 versionCode 1 versionName "1.0" - applicationIdSuffix ".java" +// applicationIdSuffix ".java" } buildTypes { release { diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java index a9ddecaf9..66bfacbc6 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java @@ -11,7 +11,7 @@ public class AdjustLicenseVerification { - public static LicenseRequiredData fetchLicenseDate(Context context, ILogger logger,String gpsAdid, long installTimeStamp) { + public static LicenseRequiredData fetchLicenseDate(Context context, ILogger logger, long installTimeStamp) { try { logger.info("start fetch license data"); BlockingQueue licenseHolder = new LinkedBlockingQueue(1); @@ -27,10 +27,10 @@ public void onError(int errorCode) { logger.error("license error: " + errorCode ); licenseHolder.offer(new LicenseRequiredData(null, null, errorCode)); } - }, gpsAdid, installTimeStamp); + }, logger, installTimeStamp); logger.info("license check access"); checker.checkAccess(); - return licenseHolder.poll(10000, TimeUnit.MILLISECONDS); + return licenseHolder.poll(3000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { logger.error("license checker interrupted: ", e.getMessage()); return null; diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index 850d92942..bad52fe5b 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -6,55 +6,66 @@ import android.content.ServiceConnection; import android.os.IBinder; import android.os.RemoteException; -import android.util.Log; +import com.adjust.sdk.ILogger; import com.android.vending.licensing.ILicensingService; public class LicenseChecker { - private static final String TAG = "LicenseChecker"; private static final String GOOGLE_PLAY_PACKAGE = "com.android.vending"; + // Server response codes. + private static final int LICENSED = 0x0; + private static final int NOT_LICENSED = 0x1; + private static final int LICENSED_OLD_KEY = 0x2; + private static final int ERROR_NOT_MARKET_MANAGED = 0x3; + private static final int ERROR_SERVER_FAILURE = 0x4; + private static final int ERROR_OVER_QUOTA = 0x5; + + private static final int ERROR_CONTACTING_SERVER = 0x101; + private static final int ERROR_INVALID_PACKAGE_NAME = 0x102; + private static final int ERROR_NON_MATCHING_UID = 0x103; + + private final Context mContext; private final LicenseRawCallback mCallback; - private String gpsAdid; - private long installTimeStamp; + private final ILogger logger; + private final long installTimeStamp; private ILicensingService mService; private boolean mBound; private static final int MAX_RETRIES = 3; private int retryCount = 0; - public LicenseChecker(Context context, LicenseRawCallback callback, String gpsAdid, long installTimeStamp) { + public LicenseChecker(Context context, LicenseRawCallback callback, ILogger logger, long installTimeStamp) { this.mContext = context; this.mCallback = callback; - this.gpsAdid = gpsAdid; + this.logger = logger; this.installTimeStamp = installTimeStamp; } public synchronized void checkAccess() { if (mBound) return; - Log.d(TAG, "License check starts 1"); + logger.debug("License check starts 1"); Intent serviceIntent = new Intent("com.android.vending.licensing.ILicensingService"); serviceIntent.setPackage(GOOGLE_PLAY_PACKAGE); boolean isBind = mContext.bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE); - Log.d(TAG, "License check bindService = " + isBind); + logger.debug("License check bindService = " + isBind); } private void executeLicenseCheck() { try { - Log.d(TAG, "License check connected" +", retryCount = " + retryCount); + logger.debug("License check connected" +", retryCount = " + retryCount); String packageName = mContext.getPackageName(); - long nonce = generateNonce(gpsAdid, installTimeStamp); + long nonce = generateNonce(installTimeStamp); - Log.d(TAG, "License gpsAdid = " + gpsAdid); - Log.d(TAG, "License installTimeStamp = " + installTimeStamp); - Log.d(TAG, "License check nonce = " + nonce); - Log.d(TAG, "License check attempt #" + (retryCount + 1)); + logger.debug("License installTimeStamp = " + installTimeStamp); + logger.debug("License check nonce = " + nonce); + logger.debug("License check attempt #" + (retryCount + 1)); mService.checkLicense(nonce, packageName, new ResultListener()); } catch (Exception e) { - Log.e(TAG, "License check failed", e); + logger.error("License check failed", e); mCallback.onError(-1); } } @@ -72,14 +83,14 @@ public void onServiceConnected(ComponentName name, IBinder service) { public void onServiceDisconnected(ComponentName name) { - Log.d(TAG, "License check disconnected"); + logger.debug("License check disconnected"); mService = null; mBound = false; } }; public void onDestroy() { - Log.d(TAG, "License check onDestroy"); + logger.debug("License check onDestroy"); if (mBound) { mContext.unbindService(mServiceConnection); mBound = false; @@ -89,45 +100,38 @@ public void onDestroy() { private class ResultListener extends com.android.vending.licensing.ILicenseResultListener.Stub { @Override public void verifyLicense(int responseCode, String signedData, String signature) throws RemoteException { - Log.d(TAG, "Received license response, code: " + responseCode); + logger.debug( "Received license response, code: " + responseCode); switch (responseCode) { - case 0: // LICENSED - case 2: // LICENSED_OLD_KEY - retryCount = 0; - if (signedData != null && signature != null) { - mCallback.onLicenseDataReceived(responseCode, signedData, signature); - } else { - Log.e(TAG, "Valid response code, but missing signed data or signature"); - mCallback.onError(responseCode); - } - break; - - case 1: // NOT_LICENSED - case 6: // INVALID_PACKAGE_NAME - case 7: // NON_MATCHING_UID - retryCount = 0; - Log.w(TAG, "License check failed: " + responseCode); + case NOT_LICENSED: // NOT_LICENSED + case ERROR_INVALID_PACKAGE_NAME: // INVALID_PACKAGE_NAME + case ERROR_NON_MATCHING_UID: // NON_MATCHING_UID + case ERROR_NOT_MARKET_MANAGED: // NOT_MARKET_MANAGED + logger.warn("License check failed: " + responseCode); mCallback.onError(responseCode); - break; + return; - case 3: // SERVER_FAILURE - case 4: // RETRY - case 5: // CONTACTING_SERVER_ERROR + case ERROR_CONTACTING_SERVER: // CONTACTING_SERVER_ERROR + case ERROR_SERVER_FAILURE: // SERVER_FAILURE + case ERROR_OVER_QUOTA: // refusing to talk to this device, over quota if (++retryCount < MAX_RETRIES) { - Log.w(TAG, "Temporary license error, retrying... Attempt " + retryCount); + logger.warn("Retry attempt [%d] for response code [%d]" , retryCount, responseCode); executeLicenseCheck(); } else { - Log.e(TAG, "License check failed after max retries"); + logger.error("License check failed after max retries"); mCallback.onError(responseCode); } break; + case LICENSED: // LICENSED + case LICENSED_OLD_KEY: // LICENSED_OLD_KEY default: - retryCount = 0; - Log.e(TAG, "Unexpected license response code: " + responseCode); - mCallback.onError(responseCode); - break; + if (signedData != null && signature != null) { + mCallback.onLicenseDataReceived(responseCode, signedData, signature); + } else { + logger.error("missing signed data or signature"); + mCallback.onError(responseCode); + } } } } @@ -148,4 +152,16 @@ public static long generateNonce(String deviceId, long installTimestamp) { return nonce; } + + public static long generateNonce(long installTimestamp) { + // Reduce timestamp (e.g., seconds since epoch / 60 to reduce size) + long reducedTimestamp = (installTimestamp / 1000) % (1L << 24); // 24 bits + + // Pack into a long: [reserved: 32 bits][timestamp: 24 bits][version/flags: 8 bits] + long nonce = 0; + nonce |= (reducedTimestamp & 0xFFFFFFL) << 8; // bits 8–31 + nonce |= 0x01; // version in the lowest 8 bits + + return nonce; + } } diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java index 714ccc097..be3802dd3 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java @@ -7,7 +7,7 @@ public class Util { - public synchronized static LicenseRequiredData getLicenseRequiredData(Context context, ILogger logger,String gpsAdid, long installTimeStamp) { - return AdjustLicenseVerification.fetchLicenseDate(context, logger,gpsAdid, installTimeStamp); + public synchronized static LicenseRequiredData getLicenseRequiredData(Context context, ILogger logger, long installTimeStamp) { + return AdjustLicenseVerification.fetchLicenseDate(context, logger, installTimeStamp); } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 925c84e6c..7517847c9 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -555,6 +555,17 @@ public void run() { }); } + @Override + public void sendLicenseVerificationData(final LicenseRequiredData licenseVerificationData) { + executor.submit(new Runnable() { + @Override + public void run() { + sendLicenseVerificationDataI(licenseVerificationData); + } + }); + } + + @Override public void launchEventResponseTasks(final EventResponseData eventResponseData) { executor.submit(new Runnable() { @@ -1365,13 +1376,14 @@ private void processSessionI() { // Try to check if there's new referrer information. installReferrer.startConnection(); - readLicenseVerificationData(); readInstallReferrerMeta(); readInstallReferrerHuaweiAds(); readInstallReferrerHuaweiAppGallery(); readInstallReferrerSamsung(); readInstallReferrerXiaomi(); readInstallReferrerVivo(); + readLicenseVerificationData(); + return; } @@ -1392,12 +1404,19 @@ public void run() { } private void readLicenseVerificationData() { + executor.submit(new Runnable() { @Override public void run() { - LicenseRequiredData licenseRequiredData = Reflection.getLicenseRequiredData(getContext(), logger,deviceInfo.playAdId,deviceInfo.installTimeTimestamp); + if (SharedPreferencesManager + .getDefaultInstance(getContext()) + .getLicenseVerificationTracked()){ + return; + } + LicenseRequiredData licenseRequiredData = Reflection.getLicenseRequiredData(getContext(), logger,deviceInfo.installTimeTimestamp); if (licenseRequiredData != null) { logger.info("licenseRequiredData: signed data = \n %s ,\n response code : %d,\n signature : %s,", licenseRequiredData.getSignature(),licenseRequiredData.getResponseCode(),licenseRequiredData.getSignedData()); + sendLicenseVerificationData(licenseRequiredData); } } }); @@ -1934,13 +1953,13 @@ private void checkAfterNewStartI(SharedPreferencesManager sharedPreferencesManag // try to read and send the install referrer installReferrer.startConnection(); - readLicenseVerificationData(); readInstallReferrerMeta(); readInstallReferrerHuaweiAds(); readInstallReferrerHuaweiAppGallery(); readInstallReferrerSamsung(); readInstallReferrerXiaomi(); readInstallReferrerVivo(); + readLicenseVerificationData(); } private void setOfflineModeI(boolean offline) { @@ -2069,6 +2088,28 @@ private void sendInstallReferrerI(ReferrerDetails referrerDetails, String referr sdkClickHandler.sendSdkClick(sdkClickPackage); } + private void sendLicenseVerificationDataI(LicenseRequiredData licenseRequiredData) { + if (!isEnabledI()) { + return; + } + + if (!isValidLicenseData(licenseRequiredData)) { + return; + } + + // Create sdk click + ActivityPackage sdkClickPackage = PackageFactory.buildLicenseVerificationSdkClickPackage( + licenseRequiredData, + activityState, + adjustConfig, + deviceInfo, + globalParameters, + firstSessionDelayManager, + internalState); + + sdkClickHandler.sendSdkClick(sdkClickPackage); + } + private boolean isValidReferrerDetails(final ReferrerDetails referrerDetails) { if (referrerDetails == null) { return false; @@ -2081,6 +2122,22 @@ private boolean isValidReferrerDetails(final ReferrerDetails referrerDetails) { return referrerDetails.installReferrer.length() != 0; } + private boolean isValidLicenseData(final LicenseRequiredData licenseRequiredData) { + if (licenseRequiredData == null) { + return false; + } + + if (licenseRequiredData.getSignedData() == null || licenseRequiredData.getSignature() == null) { + return false; + } + + if (licenseRequiredData.getSignedData().isEmpty() || licenseRequiredData.getSignature().isEmpty()){ + return false; + } + return true; + } + + private void processDeeplinkI(AdjustDeeplink deeplink, long clickTime) { if (!isEnabledI()) { return; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index eda6ed463..7f4b76d66 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -42,6 +42,7 @@ public interface Constants { String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; + String LICENSE_VERIFICATION = "google_lvl"; String REFERRER_API_GOOGLE = "google"; String REFERRER_API_HUAWEI_ADS = "huawei_ads"; String REFERRER_API_HUAWEI_APP_GALLERY = "huawei_app_gallery"; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index fa6746a6e..8f62cfb48 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -44,6 +44,8 @@ public interface IActivityHandler { void sendInstallReferrer(ReferrerDetails referrerDetails, String referrerApi); + void sendLicenseVerificationData(LicenseRequiredData licenseVerificationData); + void setOfflineMode(boolean enabled); void setAskingAttribution(boolean askingAttribution); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index d7b624898..9d6209d72 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -43,6 +43,7 @@ public class PackageBuilder { Map extraParameters; Boolean isClick; ActivityHandler.InternalState internalState; + LicenseRequiredData licenseRequiredData; static class ActivityStateCopy { int eventCount = -1; @@ -566,6 +567,11 @@ private Map getClickParameters(String source) { PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); PackageBuilder.addString(parameters, "payload", preinstallPayload); PackageBuilder.addString(parameters, "found_location", preinstallLocation); + if (licenseRequiredData != null) { + PackageBuilder.addInteger(parameters, "lvl_response_code", licenseRequiredData.getResponseCode()); + PackageBuilder.addString(parameters, "lvl_signed_data", licenseRequiredData.getSignedData()); + PackageBuilder.addString(parameters, "lvl_signature", licenseRequiredData.getSignature()); + } // google play games PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java index fe81996a0..f31153afb 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java @@ -175,6 +175,31 @@ public static ActivityPackage buildInstallReferrerSdkClickPackage(final Referrer return clickPackage; } + public static ActivityPackage buildLicenseVerificationSdkClickPackage(final LicenseRequiredData licenseRequiredData, + final ActivityState activityState, + final AdjustConfig adjustConfig, + final DeviceInfo deviceInfo, + final GlobalParameters globalParameters, + final FirstSessionDelayManager firstSessionDelayManager, + final ActivityHandler.InternalState internalState) { + long now = System.currentTimeMillis(); + + PackageBuilder clickPackageBuilder = new PackageBuilder( + adjustConfig, + deviceInfo, + activityState, + globalParameters, + firstSessionDelayManager, + now); + clickPackageBuilder.internalState = internalState; + + clickPackageBuilder.licenseRequiredData = licenseRequiredData; + + ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.LICENSE_VERIFICATION); + + return clickPackage; + } + public static ActivityPackage buildPreinstallSdkClickPackage(final String preinstallPayload, final String preinstallLocation, final ActivityState activityState, diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java index fbaf70991..71ff2ed7a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java @@ -72,13 +72,13 @@ public static ReferrerDetails getMetaReferrer(Context context, String fbAppId, I return referrerDetails; } - public static LicenseRequiredData getLicenseRequiredData(Context context, ILogger logger, String gpsAdid, long installTimeStamp) { + public static LicenseRequiredData getLicenseRequiredData(Context context, ILogger logger, long installTimeStamp) { LicenseRequiredData licenseRequiredData = null; try { licenseRequiredData = (LicenseRequiredData) invokeStaticMethod("com.adjust.sdk.lvl.Util", "getLicenseRequiredData", - new Class[]{Context.class, ILogger.class, String.class, long.class}, - context, logger, gpsAdid, installTimeStamp); + new Class[]{Context.class, ILogger.class, long.class}, + context, logger, installTimeStamp); } catch (Exception e) { } return licenseRequiredData; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java index 4044675c4..0476f668b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -351,6 +351,8 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { boolean isPreinstall = source != null && source.equals(Constants.PREINSTALL); + boolean isLicenseVerification = source != null && source.equals(Constants.LICENSE_VERIFICATION); + Map sendingParameters = generateSendingParametersI(); ResponseData responseData = activityPackageSender.sendActivityPackageSync( @@ -418,6 +420,14 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { } } + if (isLicenseVerification){ + // update preinstall flag in shared preferences after sdk_click is sent. + SharedPreferencesManager sharedPreferencesManager + = SharedPreferencesManager.getDefaultInstance(activityHandler.getContext()); + + sharedPreferencesManager.setLicenseVerificationTracked(); + } + activityHandler.finishedTrackingActivity(sdkClickResponseData); } private Map generateSendingParametersI() { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java index 89dd246e7..cb38e2e01 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -54,6 +54,9 @@ public class SharedPreferencesManager { private static final String PREFS_KEY_CONTROL_PARAMS = "control_params"; + private static final String PREFS_KEY_LVL_TRACKED = "lvl_tracked"; + + /** * Index for raw referrer string content in saved JSONArray object. */ @@ -471,6 +474,23 @@ public synchronized JSONObject getControlParamsJson() { return null; } + + /** + * Save information that license verification has been tracked to shared preferences. + */ + public synchronized void setLicenseVerificationTracked() { + saveBoolean(PREFS_KEY_LVL_TRACKED, true); + } + + /** + * Get information if license verification has been tracked from shared preferences. If no info, default to false. + * + * @return boolean indicating whether license verification has been tracked or not + */ + public synchronized boolean getLicenseVerificationTracked() { + return getBoolean(PREFS_KEY_LVL_TRACKED, false); + } + /** * Remove all key-value pairs from shared preferences. */ From 506e0bc9e02d3b75db33ac1024b826e2492fc43f Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 25 Jun 2025 15:56:47 +0200 Subject: [PATCH 377/540] feat:tuning the generate the nonce --- .../com/adjust/sdk/lvl/LicenseChecker.java | 26 +++---------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index bad52fe5b..84b9cc311 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -136,31 +136,11 @@ public void verifyLicense(int responseCode, String signedData, String signature) } } - - public static long generateNonce(String deviceId, long installTimestamp) { - // Hash the device ID (ADID, UUID, etc.) - int deviceHash = deviceId != null ? deviceId.hashCode() : 0; - - // Reduce timestamp (e.g., divide by 60 to get minutes) - long reducedTimestamp = (installTimestamp / 1000) % (1L << 24); // 24 bits - - // Pack into a long: [deviceHash: 32 bits][timestamp: 24 bits][spare: 8 bits] - long nonce = 0; - nonce |= (deviceHash & 0xFFFFFFFFL) << 32; - nonce |= (reducedTimestamp & 0xFFFFFFL) << 8; - nonce |= 0x01; // Version or flag, optional - - return nonce; - } - public static long generateNonce(long installTimestamp) { - // Reduce timestamp (e.g., seconds since epoch / 60 to reduce size) - long reducedTimestamp = (installTimestamp / 1000) % (1L << 24); // 24 bits - - // Pack into a long: [reserved: 32 bits][timestamp: 24 bits][version/flags: 8 bits] + // Pack into a long:[timestamp: 56 bits][version/flags: 8 bits] long nonce = 0; - nonce |= (reducedTimestamp & 0xFFFFFFL) << 8; // bits 8–31 - nonce |= 0x01; // version in the lowest 8 bits + nonce |= (installTimestamp & 0xFFFFFFFFFFL) << 8; // bits 8–31 + nonce |= 0x02; // version in the lowest 8 bits return nonce; } From 19037a3fcc50f08da920dd0e6ccc8fa4d53c9ea0 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 25 Jun 2025 16:25:55 +0200 Subject: [PATCH 378/540] feat:changing the nonce version to 1 --- .../src/main/java/com/adjust/sdk/lvl/LicenseChecker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index 84b9cc311..94a9e34f9 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -140,7 +140,7 @@ public static long generateNonce(long installTimestamp) { // Pack into a long:[timestamp: 56 bits][version/flags: 8 bits] long nonce = 0; nonce |= (installTimestamp & 0xFFFFFFFFFFL) << 8; // bits 8–31 - nonce |= 0x02; // version in the lowest 8 bits + nonce |= 0x01; // version in the lowest 8 bits return nonce; } From f7661129f6398a00135e71e2c72e71a7691befc1 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 1 Jul 2025 12:09:47 +0200 Subject: [PATCH 379/540] style: cleaning the code and remove the debug logs --- Adjust/examples/example-app-java/build.gradle | 1 - .../ExampleInstrumentedTest.java | 26 ------------------- .../com/adjust/sdk/lvl/LicenseChecker.java | 11 +------- .../ExampleUnitTest.java | 17 ------------ .../java/com/adjust/sdk/ActivityHandler.java | 1 - 5 files changed, 1 insertion(+), 55 deletions(-) delete mode 100644 Adjust/plugins/sdk-plugin-license-verification/src/androidTest/java/com/example/sdk_plugin_license_verification/ExampleInstrumentedTest.java delete mode 100644 Adjust/plugins/sdk-plugin-license-verification/src/test/java/com/example/sdk_plugin_license_verification/ExampleUnitTest.java diff --git a/Adjust/examples/example-app-java/build.gradle b/Adjust/examples/example-app-java/build.gradle index 0f11916d3..52739da43 100644 --- a/Adjust/examples/example-app-java/build.gradle +++ b/Adjust/examples/example-app-java/build.gradle @@ -15,7 +15,6 @@ android { targetSdkVersion 36 versionCode 1 versionName "1.0" -// applicationIdSuffix ".java" } buildTypes { release { diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/androidTest/java/com/example/sdk_plugin_license_verification/ExampleInstrumentedTest.java b/Adjust/plugins/sdk-plugin-license-verification/src/androidTest/java/com/example/sdk_plugin_license_verification/ExampleInstrumentedTest.java deleted file mode 100644 index b34f06742..000000000 --- a/Adjust/plugins/sdk-plugin-license-verification/src/androidTest/java/com/example/sdk_plugin_license_verification/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.example.sdk_plugin_license_verification; - -import android.content.Context; - -import androidx.test.platform.app.InstrumentationRegistry; -import androidx.test.ext.junit.runners.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); - assertEquals("com.example.sdk_plugin_license_verification", appContext.getPackageName()); - } -} \ No newline at end of file diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index 94a9e34f9..e3fda54e2 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -54,18 +54,12 @@ public synchronized void checkAccess() { private void executeLicenseCheck() { try { - logger.debug("License check connected" +", retryCount = " + retryCount); String packageName = mContext.getPackageName(); long nonce = generateNonce(installTimeStamp); - - logger.debug("License installTimeStamp = " + installTimeStamp); - logger.debug("License check nonce = " + nonce); - logger.debug("License check attempt #" + (retryCount + 1)); - mService.checkLicense(nonce, packageName, new ResultListener()); } catch (Exception e) { - logger.error("License check failed", e); + logger.error("License check failed", e.getMessage()); mCallback.onError(-1); } } @@ -83,14 +77,12 @@ public void onServiceConnected(ComponentName name, IBinder service) { public void onServiceDisconnected(ComponentName name) { - logger.debug("License check disconnected"); mService = null; mBound = false; } }; public void onDestroy() { - logger.debug("License check onDestroy"); if (mBound) { mContext.unbindService(mServiceConnection); mBound = false; @@ -100,7 +92,6 @@ public void onDestroy() { private class ResultListener extends com.android.vending.licensing.ILicenseResultListener.Stub { @Override public void verifyLicense(int responseCode, String signedData, String signature) throws RemoteException { - logger.debug( "Received license response, code: " + responseCode); switch (responseCode) { case NOT_LICENSED: // NOT_LICENSED diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/test/java/com/example/sdk_plugin_license_verification/ExampleUnitTest.java b/Adjust/plugins/sdk-plugin-license-verification/src/test/java/com/example/sdk_plugin_license_verification/ExampleUnitTest.java deleted file mode 100644 index f6e0d7ff2..000000000 --- a/Adjust/plugins/sdk-plugin-license-verification/src/test/java/com/example/sdk_plugin_license_verification/ExampleUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.sdk_plugin_license_verification; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see Testing documentation - */ -public class ExampleUnitTest { - @Test - public void addition_isCorrect() { - assertEquals(4, 2 + 2); - } -} \ No newline at end of file diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 7517847c9..2b7956b2b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1415,7 +1415,6 @@ public void run() { } LicenseRequiredData licenseRequiredData = Reflection.getLicenseRequiredData(getContext(), logger,deviceInfo.installTimeTimestamp); if (licenseRequiredData != null) { - logger.info("licenseRequiredData: signed data = \n %s ,\n response code : %d,\n signature : %s,", licenseRequiredData.getSignature(),licenseRequiredData.getResponseCode(),licenseRequiredData.getSignedData()); sendLicenseVerificationData(licenseRequiredData); } } From b8da1528de2e6d885ab08cf383d280c09cd634b9 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 1 Jul 2025 12:15:46 +0200 Subject: [PATCH 380/540] style: cleaning the code and remove the debug logs --- .../java/com/adjust/sdk/lvl/AdjustLicenseVerification.java | 6 +----- .../src/main/java/com/adjust/sdk/lvl/LicenseChecker.java | 4 +--- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java index 66bfacbc6..5e3cf1ff7 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java @@ -13,26 +13,22 @@ public class AdjustLicenseVerification { public static LicenseRequiredData fetchLicenseDate(Context context, ILogger logger, long installTimeStamp) { try { - logger.info("start fetch license data"); BlockingQueue licenseHolder = new LinkedBlockingQueue(1); LicenseChecker checker = new LicenseChecker(context, new LicenseRawCallback() { @Override public void onLicenseDataReceived(int responseCode,String signedData, String signature) { - logger.info("license data received from server with code: " + responseCode ); licenseHolder.offer(new LicenseRequiredData(signedData, signature, responseCode)); } @Override public void onError(int errorCode) { - logger.error("license error: " + errorCode ); licenseHolder.offer(new LicenseRequiredData(null, null, errorCode)); } }, logger, installTimeStamp); - logger.info("license check access"); checker.checkAccess(); return licenseHolder.poll(3000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { - logger.error("license checker interrupted: ", e.getMessage()); + logger.error("License checker interrupted: ", e.getMessage()); return null; } } diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index e3fda54e2..c35efc592 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -45,11 +45,9 @@ public LicenseChecker(Context context, LicenseRawCallback callback, ILogger logg public synchronized void checkAccess() { if (mBound) return; - logger.debug("License check starts 1"); Intent serviceIntent = new Intent("com.android.vending.licensing.ILicensingService"); serviceIntent.setPackage(GOOGLE_PLAY_PACKAGE); - boolean isBind = mContext.bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE); - logger.debug("License check bindService = " + isBind); + mContext.bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE); } private void executeLicenseCheck() { From 68b709f39f49f928a057a1fd93706463fa017b19 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 7 Jul 2025 11:17:56 +0200 Subject: [PATCH 381/540] fix: cleaning the logs - add progaurd rules for the lvl - remove lvl dependency from example app - unbinding the service after getting the result --- Adjust/build.gradle | 5 ++++- .../example-app-java/src/main/AndroidManifest.xml | 2 -- .../proguard-rules.pro | 14 +++++++++++++- .../adjust/sdk/lvl/AdjustLicenseVerification.java | 2 +- .../java/com/adjust/sdk/lvl/LicenseChecker.java | 13 ++++++++----- 5 files changed, 26 insertions(+), 10 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index a156e79ba..6c5bd58ae 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -21,6 +21,9 @@ ext { } buildscript { + ext { + agp_version = '8.8.1' + } ext.kotlin_version = '2.1.0' repositories { @@ -28,7 +31,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:8.10.1' + classpath "com.android.tools.build:gradle:$agp_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files. diff --git a/Adjust/examples/example-app-java/src/main/AndroidManifest.xml b/Adjust/examples/example-app-java/src/main/AndroidManifest.xml index b57a20670..e8ed52227 100644 --- a/Adjust/examples/example-app-java/src/main/AndroidManifest.xml +++ b/Adjust/examples/example-app-java/src/main/AndroidManifest.xml @@ -5,8 +5,6 @@ - - diff --git a/Adjust/plugins/sdk-plugin-license-verification/proguard-rules.pro b/Adjust/plugins/sdk-plugin-license-verification/proguard-rules.pro index 481bb4348..c3806c93a 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/proguard-rules.pro +++ b/Adjust/plugins/sdk-plugin-license-verification/proguard-rules.pro @@ -18,4 +18,16 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file +#-renamesourcefileattribute SourceFile + +# Keep all classes in the LVL licensing AIDL package +-keep class com.android.vending.licensing.** { *; } + +# Keep interface method signatures +-keep interface com.android.vending.licensing.ILicensingService +-keep interface com.android.vending.licensing.ILicenseResultListener + +# Prevent obfuscation of the stub classes used for IPC +-keepclassmembers class * implements android.os.IInterface { + ; +} \ No newline at end of file diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java index 5e3cf1ff7..a90498472 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java @@ -28,7 +28,7 @@ public void onError(int errorCode) { checker.checkAccess(); return licenseHolder.poll(3000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { - logger.error("License checker interrupted: ", e.getMessage()); + logger.error("[LicenseVerification] License checker interrupted: ", e.getMessage()); return null; } } diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index c35efc592..a1bdaad41 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -57,7 +57,7 @@ private void executeLicenseCheck() { mService.checkLicense(nonce, packageName, new ResultListener()); } catch (Exception e) { - logger.error("License check failed", e.getMessage()); + logger.error("[License Verification] License check failed", e.getMessage()); mCallback.onError(-1); } } @@ -96,19 +96,21 @@ public void verifyLicense(int responseCode, String signedData, String signature) case ERROR_INVALID_PACKAGE_NAME: // INVALID_PACKAGE_NAME case ERROR_NON_MATCHING_UID: // NON_MATCHING_UID case ERROR_NOT_MARKET_MANAGED: // NOT_MARKET_MANAGED - logger.warn("License check failed: " + responseCode); + logger.warn("[LicenseVerification] License check failed: " + responseCode); mCallback.onError(responseCode); + onDestroy(); return; case ERROR_CONTACTING_SERVER: // CONTACTING_SERVER_ERROR case ERROR_SERVER_FAILURE: // SERVER_FAILURE case ERROR_OVER_QUOTA: // refusing to talk to this device, over quota if (++retryCount < MAX_RETRIES) { - logger.warn("Retry attempt [%d] for response code [%d]" , retryCount, responseCode); + logger.warn("[LicenseVerification] Retry attempt [%d] for response code [%d]" , retryCount, responseCode); executeLicenseCheck(); } else { - logger.error("License check failed after max retries"); + logger.error("[LicenseVerification] License check failed after max retries"); mCallback.onError(responseCode); + onDestroy(); } break; @@ -118,9 +120,10 @@ public void verifyLicense(int responseCode, String signedData, String signature) if (signedData != null && signature != null) { mCallback.onLicenseDataReceived(responseCode, signedData, signature); } else { - logger.error("missing signed data or signature"); + logger.error("[LicenseVerification] missing signed data or signature"); mCallback.onError(responseCode); } + onDestroy(); } } } From 25c44daf448392c851ff2e5907d40dccc27497f7 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 7 Jul 2025 13:02:29 +0200 Subject: [PATCH 382/540] fix: cleaning the publishing task for lvl plugin using the agp 8.10.1 --- Adjust/build.gradle | 2 +- .../plugins/sdk-plugin-license-verification/build.gradle | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 6c5bd58ae..ab493335e 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -22,7 +22,7 @@ ext { buildscript { ext { - agp_version = '8.8.1' + agp_version = '8.10.1' } ext.kotlin_version = '2.1.0' diff --git a/Adjust/plugins/sdk-plugin-license-verification/build.gradle b/Adjust/plugins/sdk-plugin-license-verification/build.gradle index 014008580..adf270375 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/build.gradle +++ b/Adjust/plugins/sdk-plugin-license-verification/build.gradle @@ -147,7 +147,7 @@ def customizePomForJar(pom) { url 'https://github.com/adjust/android_sdk' organization { - name 'adjust GmbH' + name 'Adjust GmbH' url 'http://www.adjust.com' } licenses { @@ -168,7 +168,7 @@ def customizePomForJar(pom) { } developer { name 'Ugljesa Erceg' - email 'ugljesa@adjust.com' + email 'ugi@adjust.com' } } } @@ -187,7 +187,7 @@ def customizePomForAar(pom) { url 'https://github.com/adjust/android_sdk' organization { - name 'adjust GmbH' + name 'Adjust GmbH' url 'http://www.adjust.com' } licenses { @@ -208,7 +208,7 @@ def customizePomForAar(pom) { } developer { name 'Ugljesa Erceg' - email 'ugljesa@adjust.com' + email 'ugi@adjust.com' } } } From 2960bae36871172b0eb2ca94aae92d86e65dfc3a Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 9 Jul 2025 12:44:29 +0200 Subject: [PATCH 383/540] refac: remove installTimeTimestamp in DeviceInfo and refactor appInstallTime to long --- .../main/java/com/adjust/sdk/ActivityHandler.java | 2 +- .../src/main/java/com/adjust/sdk/DeviceInfo.java | 15 +++++---------- .../main/java/com/adjust/sdk/PackageBuilder.java | 12 ++++++------ 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 2b7956b2b..7b8f7ad85 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1413,7 +1413,7 @@ public void run() { .getLicenseVerificationTracked()){ return; } - LicenseRequiredData licenseRequiredData = Reflection.getLicenseRequiredData(getContext(), logger,deviceInfo.installTimeTimestamp); + LicenseRequiredData licenseRequiredData = Reflection.getLicenseRequiredData(getContext(), logger,deviceInfo.appInstallTime); if (licenseRequiredData != null) { sendLicenseVerificationData(licenseRequiredData); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 5746ce318..045424490 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -87,7 +87,7 @@ class DeviceInfo { String hardwareName; String abi; String buildName; - String appInstallTime; + long appInstallTime; String appUpdateTime; int uiMode; String appSetId; @@ -102,7 +102,6 @@ class DeviceInfo { String mnc; AdjustStoreInfo storeInfoFromClient; String storeIdFromSystem; - long installTimeTimestamp; DeviceInfo(AdjustConfig adjustConfig) { Context context = adjustConfig.context; @@ -135,9 +134,6 @@ class DeviceInfo { abi = getABI(); buildName = getBuildName(); appInstallTime = getAppInstallTime(packageInfo); - if (packageInfo != null){ - installTimeTimestamp = packageInfo.firstInstallTime; - } appUpdateTime = getAppUpdateTime(packageInfo); uiMode = getDeviceUiMode(configuration); if (Util.canReadPlayIds(adjustConfig)) { @@ -492,12 +488,11 @@ private String getABI() { return SupportedABIS[0]; } - private String getAppInstallTime(PackageInfo packageInfo) { - try { - return Util.dateFormatter.format(new Date(packageInfo.firstInstallTime)); - } catch (Exception ex) { - return null; + private long getAppInstallTime(PackageInfo packageInfo) { + if (packageInfo == null){ + return 0L; } + return packageInfo.firstInstallTime; } private String getAppUpdateTime(PackageInfo packageInfo) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 9d6209d72..abd1e5995 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -281,7 +281,7 @@ private Map getSessionParameters() { PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); - PackageBuilder.addString(parameters, "installed_at", deviceInfo.appInstallTime); + PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); PackageBuilder.addString(parameters, "language", deviceInfo.language); PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); @@ -540,7 +540,7 @@ private Map getClickParameters(String source) { PackageBuilder.addDateInSeconds(parameters, "install_begin_time", installBeginTimeInSeconds); PackageBuilder.addDateInSeconds(parameters, "install_begin_time_server", installBeginTimeServerInSeconds); PackageBuilder.addString(parameters, "install_version", installVersion); - PackageBuilder.addString(parameters, "installed_at", deviceInfo.appInstallTime); + PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); PackageBuilder.addString(parameters, "language", deviceInfo.language); PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); @@ -919,7 +919,7 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); - PackageBuilder.addString(parameters, "installed_at", deviceInfo.appInstallTime); + PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); PackageBuilder.addString(parameters, "language", deviceInfo.language); PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); @@ -1016,7 +1016,7 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); - PackageBuilder.addString(parameters, "installed_at", deviceInfo.appInstallTime); + PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); PackageBuilder.addString(parameters, "language", deviceInfo.language); PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); @@ -1110,7 +1110,7 @@ private Map getVerificationParameters(AdjustPlayStorePurchase pu PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); - PackageBuilder.addString(parameters, "installed_at", deviceInfo.appInstallTime); + PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); PackageBuilder.addString(parameters, "language", deviceInfo.language); PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); @@ -1199,7 +1199,7 @@ private Map getVerificationParameters(AdjustEvent event) { PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); - PackageBuilder.addString(parameters, "installed_at", deviceInfo.appInstallTime); + PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); PackageBuilder.addString(parameters, "language", deviceInfo.language); PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); From 64209d5446aa338f6ad66f21e242417fd3171059 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 16 Jul 2025 15:23:46 +0200 Subject: [PATCH 384/540] Update Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Uglješa Erceg --- .../main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java index a90498472..dba9bead1 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java @@ -11,7 +11,7 @@ public class AdjustLicenseVerification { - public static LicenseRequiredData fetchLicenseDate(Context context, ILogger logger, long installTimeStamp) { + public static LicenseRequiredData fetchLicenseDate(Context context, ILogger logger, long installTimestamp) { try { BlockingQueue licenseHolder = new LinkedBlockingQueue(1); LicenseChecker checker = new LicenseChecker(context, new LicenseRawCallback() { From 97064adfb8c8527ac3d48cb2ed4f60fb51f157b5 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 16 Jul 2025 15:23:59 +0200 Subject: [PATCH 385/540] Update Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Uglješa Erceg --- .../src/main/java/com/adjust/sdk/lvl/LicenseChecker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index a1bdaad41..1cb890579 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -29,7 +29,7 @@ public class LicenseChecker { private final Context mContext; private final LicenseRawCallback mCallback; private final ILogger logger; - private final long installTimeStamp; + private final long installTimestamp; private ILicensingService mService; private boolean mBound; From 6004d477bd15102d0ceaa9c7ac913df1334f46be Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 16 Jul 2025 15:24:11 +0200 Subject: [PATCH 386/540] Update Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Uglješa Erceg --- .../src/main/java/com/adjust/sdk/lvl/LicenseChecker.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index 1cb890579..3e69602eb 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -44,7 +44,9 @@ public LicenseChecker(Context context, LicenseRawCallback callback, ILogger logg } public synchronized void checkAccess() { - if (mBound) return; + if (mBound) { + return; + } Intent serviceIntent = new Intent("com.android.vending.licensing.ILicensingService"); serviceIntent.setPackage(GOOGLE_PLAY_PACKAGE); mContext.bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE); From be72703fc8cb8eed1f578186f3ed1af1df07b194 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 16 Jul 2025 15:24:27 +0200 Subject: [PATCH 387/540] Update Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Uglješa Erceg --- .../src/main/java/com/adjust/sdk/lvl/LicenseChecker.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index 3e69602eb..c40528d34 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -65,7 +65,6 @@ private void executeLicenseCheck() { } private final ServiceConnection mServiceConnection = new ServiceConnection() { - public void onServiceConnected(ComponentName name, IBinder service) { mService = ILicensingService.Stub.asInterface(service); From e05851ba2fe6799b5ea569d82f2b1c54d0cba379 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 16 Jul 2025 15:24:35 +0200 Subject: [PATCH 388/540] Update Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Uglješa Erceg --- .../src/main/java/com/adjust/sdk/lvl/Util.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java index be3802dd3..5b5c3e033 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java @@ -7,7 +7,7 @@ public class Util { - public synchronized static LicenseRequiredData getLicenseRequiredData(Context context, ILogger logger, long installTimeStamp) { + public synchronized static LicenseRequiredData getLicenseRequiredData(Context context, ILogger logger, long installTimestamp) { return AdjustLicenseVerification.fetchLicenseDate(context, logger, installTimeStamp); } } From 5b23ccb06f3df229375071bd7955ae30ab082750 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 16 Jul 2025 15:25:27 +0200 Subject: [PATCH 389/540] Update Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Uglješa Erceg --- .../sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 7b8f7ad85..0e7da0602 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1404,7 +1404,6 @@ public void run() { } private void readLicenseVerificationData() { - executor.submit(new Runnable() { @Override public void run() { From 85c78e9ea24b5dbbbe595a452125b0d12d9856e0 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 21 Jul 2025 09:53:53 +0200 Subject: [PATCH 390/540] Update Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Uglješa Erceg --- .../src/main/java/com/adjust/sdk/lvl/LicenseChecker.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index c40528d34..146c6394f 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -74,7 +74,6 @@ public void onServiceConnected(ComponentName name, IBinder service) { executeLicenseCheck(); } - public void onServiceDisconnected(ComponentName name) { mService = null; mBound = false; From 697470bf844f7e07bb525613936048bfe5ff4ef2 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 21 Jul 2025 10:03:54 +0200 Subject: [PATCH 391/540] fix: LicenseVerificationrefactor LicenseRequiredData.java to LicenseData.java move isValid function to LicenseData class --- .../sdk/lvl/AdjustLicenseVerification.java | 12 ++++---- .../main/java/com/adjust/sdk/lvl/Util.java | 6 ++-- .../java/com/adjust/sdk/ActivityHandler.java | 29 +++++-------------- .../java/com/adjust/sdk/IActivityHandler.java | 3 +- ...enseRequiredData.java => LicenseData.java} | 16 ++++++++-- .../java/com/adjust/sdk/PackageBuilder.java | 10 +++---- .../java/com/adjust/sdk/PackageFactory.java | 4 +-- .../main/java/com/adjust/sdk/Reflection.java | 9 +++--- 8 files changed, 42 insertions(+), 47 deletions(-) rename Adjust/sdk-core/src/main/java/com/adjust/sdk/{LicenseRequiredData.java => LicenseData.java} (55%) diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java index dba9bead1..e7b407708 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java @@ -3,7 +3,7 @@ import android.content.Context; import com.adjust.sdk.ILogger; -import com.adjust.sdk.LicenseRequiredData; +import com.adjust.sdk.LicenseData; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; @@ -11,20 +11,20 @@ public class AdjustLicenseVerification { - public static LicenseRequiredData fetchLicenseDate(Context context, ILogger logger, long installTimestamp) { + public static LicenseData fetchLicenseDate(Context context, ILogger logger, long installTimestamp) { try { - BlockingQueue licenseHolder = new LinkedBlockingQueue(1); + BlockingQueue licenseHolder = new LinkedBlockingQueue(1); LicenseChecker checker = new LicenseChecker(context, new LicenseRawCallback() { @Override public void onLicenseDataReceived(int responseCode,String signedData, String signature) { - licenseHolder.offer(new LicenseRequiredData(signedData, signature, responseCode)); + licenseHolder.offer(new LicenseData(signedData, signature, responseCode)); } @Override public void onError(int errorCode) { - licenseHolder.offer(new LicenseRequiredData(null, null, errorCode)); + licenseHolder.offer(new LicenseData(null, null, errorCode)); } - }, logger, installTimeStamp); + }, logger, installTimestamp); checker.checkAccess(); return licenseHolder.poll(3000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java index 5b5c3e033..982656ad9 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java +++ b/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java @@ -3,11 +3,11 @@ import android.content.Context; import com.adjust.sdk.ILogger; -import com.adjust.sdk.LicenseRequiredData; +import com.adjust.sdk.LicenseData; public class Util { - public synchronized static LicenseRequiredData getLicenseRequiredData(Context context, ILogger logger, long installTimestamp) { - return AdjustLicenseVerification.fetchLicenseDate(context, logger, installTimeStamp); + public synchronized static LicenseData getLicenseRequiredData(Context context, ILogger logger, long installTimestamp) { + return AdjustLicenseVerification.fetchLicenseDate(context, logger, installTimestamp); } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 0e7da0602..396c43981 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -556,7 +556,7 @@ public void run() { } @Override - public void sendLicenseVerificationData(final LicenseRequiredData licenseVerificationData) { + public void sendLicenseVerificationData(final LicenseData licenseVerificationData) { executor.submit(new Runnable() { @Override public void run() { @@ -1412,9 +1412,9 @@ public void run() { .getLicenseVerificationTracked()){ return; } - LicenseRequiredData licenseRequiredData = Reflection.getLicenseRequiredData(getContext(), logger,deviceInfo.appInstallTime); - if (licenseRequiredData != null) { - sendLicenseVerificationData(licenseRequiredData); + LicenseData licenseData = Reflection.getLicenseRequiredData(getContext(), logger,deviceInfo.appInstallTime); + if (licenseData != null) { + sendLicenseVerificationData(licenseData); } } }); @@ -2086,18 +2086,18 @@ private void sendInstallReferrerI(ReferrerDetails referrerDetails, String referr sdkClickHandler.sendSdkClick(sdkClickPackage); } - private void sendLicenseVerificationDataI(LicenseRequiredData licenseRequiredData) { + private void sendLicenseVerificationDataI(LicenseData licenseData) { if (!isEnabledI()) { return; } - if (!isValidLicenseData(licenseRequiredData)) { + if (licenseData == null || !licenseData.isValid()) { return; } // Create sdk click ActivityPackage sdkClickPackage = PackageFactory.buildLicenseVerificationSdkClickPackage( - licenseRequiredData, + licenseData, activityState, adjustConfig, deviceInfo, @@ -2120,21 +2120,6 @@ private boolean isValidReferrerDetails(final ReferrerDetails referrerDetails) { return referrerDetails.installReferrer.length() != 0; } - private boolean isValidLicenseData(final LicenseRequiredData licenseRequiredData) { - if (licenseRequiredData == null) { - return false; - } - - if (licenseRequiredData.getSignedData() == null || licenseRequiredData.getSignature() == null) { - return false; - } - - if (licenseRequiredData.getSignedData().isEmpty() || licenseRequiredData.getSignature().isEmpty()){ - return false; - } - return true; - } - private void processDeeplinkI(AdjustDeeplink deeplink, long clickTime) { if (!isEnabledI()) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 8f62cfb48..d43a47c57 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -1,7 +1,6 @@ package com.adjust.sdk; import android.content.Context; -import android.net.Uri; /** * Created by pfms on 15/12/14. @@ -44,7 +43,7 @@ public interface IActivityHandler { void sendInstallReferrer(ReferrerDetails referrerDetails, String referrerApi); - void sendLicenseVerificationData(LicenseRequiredData licenseVerificationData); + void sendLicenseVerificationData(LicenseData licenseVerificationData); void setOfflineMode(boolean enabled); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/LicenseRequiredData.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/LicenseData.java similarity index 55% rename from Adjust/sdk-core/src/main/java/com/adjust/sdk/LicenseRequiredData.java rename to Adjust/sdk-core/src/main/java/com/adjust/sdk/LicenseData.java index 9e547a52d..3dd4bfafc 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/LicenseRequiredData.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/LicenseData.java @@ -1,11 +1,11 @@ package com.adjust.sdk; -public class LicenseRequiredData { +public class LicenseData { private final String signedData; private final String signature; private final int responseCode; - public LicenseRequiredData(String signedData, String signature, int responseCode) { + public LicenseData(String signedData, String signature, int responseCode) { this.signedData = signedData; this.signature = signature; this.responseCode = responseCode; @@ -22,4 +22,16 @@ public String getSignature() { public int getResponseCode() { return responseCode; } + + public boolean isValid() { + + if (this.signedData == null || this.signature == null) { + return false; + } + + if (this.signedData.isEmpty() || this.signature.isEmpty()){ + return false; + } + return true; + } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index abd1e5995..8f6a75ab0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -43,7 +43,7 @@ public class PackageBuilder { Map extraParameters; Boolean isClick; ActivityHandler.InternalState internalState; - LicenseRequiredData licenseRequiredData; + LicenseData licenseData; static class ActivityStateCopy { int eventCount = -1; @@ -567,10 +567,10 @@ private Map getClickParameters(String source) { PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); PackageBuilder.addString(parameters, "payload", preinstallPayload); PackageBuilder.addString(parameters, "found_location", preinstallLocation); - if (licenseRequiredData != null) { - PackageBuilder.addInteger(parameters, "lvl_response_code", licenseRequiredData.getResponseCode()); - PackageBuilder.addString(parameters, "lvl_signed_data", licenseRequiredData.getSignedData()); - PackageBuilder.addString(parameters, "lvl_signature", licenseRequiredData.getSignature()); + if (licenseData != null) { + PackageBuilder.addInteger(parameters, "lvl_response_code", licenseData.getResponseCode()); + PackageBuilder.addString(parameters, "lvl_signed_data", licenseData.getSignedData()); + PackageBuilder.addString(parameters, "lvl_signature", licenseData.getSignature()); } // google play games diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java index f31153afb..e4b17fde3 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java @@ -175,7 +175,7 @@ public static ActivityPackage buildInstallReferrerSdkClickPackage(final Referrer return clickPackage; } - public static ActivityPackage buildLicenseVerificationSdkClickPackage(final LicenseRequiredData licenseRequiredData, + public static ActivityPackage buildLicenseVerificationSdkClickPackage(final LicenseData licenseData, final ActivityState activityState, final AdjustConfig adjustConfig, final DeviceInfo deviceInfo, @@ -193,7 +193,7 @@ public static ActivityPackage buildLicenseVerificationSdkClickPackage(final Lice now); clickPackageBuilder.internalState = internalState; - clickPackageBuilder.licenseRequiredData = licenseRequiredData; + clickPackageBuilder.licenseData = licenseData; ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.LICENSE_VERIFICATION); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java index 71ff2ed7a..292bf3584 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java @@ -4,7 +4,6 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Map; @@ -72,16 +71,16 @@ public static ReferrerDetails getMetaReferrer(Context context, String fbAppId, I return referrerDetails; } - public static LicenseRequiredData getLicenseRequiredData(Context context, ILogger logger, long installTimeStamp) { - LicenseRequiredData licenseRequiredData = null; + public static LicenseData getLicenseRequiredData(Context context, ILogger logger, long installTimeStamp) { + LicenseData licenseData = null; try { - licenseRequiredData = (LicenseRequiredData) invokeStaticMethod("com.adjust.sdk.lvl.Util", + licenseData = (LicenseData) invokeStaticMethod("com.adjust.sdk.lvl.Util", "getLicenseRequiredData", new Class[]{Context.class, ILogger.class, long.class}, context, logger, installTimeStamp); } catch (Exception e) { } - return licenseRequiredData; + return licenseData; } public static ReferrerDetails getHuaweiAdsReferrer(Context context, ILogger logger) { From 0517a4ecdf8cd9dee170696ae6d50d76323a8969 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 21 Jul 2025 10:11:36 +0200 Subject: [PATCH 392/540] refac: refactor lvl plugin name from sdk-plugin-license-verification to sdk-plugin-lvl --- .../.gitignore | 0 .../build.gradle | 40 +++++++++---------- .../proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../licensing/ILicenseResultListener.aidl | 0 .../vending/licensing/ILicensingService.aidl | 0 .../sdk/lvl/AdjustLicenseVerification.java | 0 .../com/adjust/sdk/lvl/LicenseChecker.java | 4 +- .../adjust/sdk/lvl/LicenseRawCallback.java | 0 .../main/java/com/adjust/sdk/lvl/Util.java | 0 Adjust/settings.gradle | 3 +- 11 files changed, 24 insertions(+), 23 deletions(-) rename Adjust/plugins/{sdk-plugin-license-verification => sdk-plugin-lvl}/.gitignore (100%) rename Adjust/plugins/{sdk-plugin-license-verification => sdk-plugin-lvl}/build.gradle (81%) rename Adjust/plugins/{sdk-plugin-license-verification => sdk-plugin-lvl}/proguard-rules.pro (100%) rename Adjust/plugins/{sdk-plugin-license-verification => sdk-plugin-lvl}/src/main/AndroidManifest.xml (100%) rename Adjust/plugins/{sdk-plugin-license-verification => sdk-plugin-lvl}/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl (100%) rename Adjust/plugins/{sdk-plugin-license-verification => sdk-plugin-lvl}/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl (100%) rename Adjust/plugins/{sdk-plugin-license-verification => sdk-plugin-lvl}/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java (100%) rename Adjust/plugins/{sdk-plugin-license-verification => sdk-plugin-lvl}/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java (97%) rename Adjust/plugins/{sdk-plugin-license-verification => sdk-plugin-lvl}/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java (100%) rename Adjust/plugins/{sdk-plugin-license-verification => sdk-plugin-lvl}/src/main/java/com/adjust/sdk/lvl/Util.java (100%) diff --git a/Adjust/plugins/sdk-plugin-license-verification/.gitignore b/Adjust/plugins/sdk-plugin-lvl/.gitignore similarity index 100% rename from Adjust/plugins/sdk-plugin-license-verification/.gitignore rename to Adjust/plugins/sdk-plugin-lvl/.gitignore diff --git a/Adjust/plugins/sdk-plugin-license-verification/build.gradle b/Adjust/plugins/sdk-plugin-lvl/build.gradle similarity index 81% rename from Adjust/plugins/sdk-plugin-license-verification/build.gradle rename to Adjust/plugins/sdk-plugin-lvl/build.gradle index adf270375..b77bbc8e2 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/build.gradle +++ b/Adjust/plugins/sdk-plugin-lvl/build.gradle @@ -52,17 +52,17 @@ if (localPropsFile.exists()) { } } -task adjustLicenseVerificationPluginAar(type: Copy) { +task adjustLvlPluginAar(type: Copy) { dependsOn 'assembleRelease' from('build/outputs/aar/') - include 'sdk-plugin-license-verification-release.aar' + include 'sdk-plugin-lvl-release.aar' destinationDir file('build/libs/') - rename 'sdk-plugin-license-verification-release.aar', "${project.name}.aar" + rename 'sdk-plugin-lvl-release.aar', "${project.name}.aar" } -task adjustLicenseVerificationPluginJar(type: Jar) { +task adjustLvlPluginJar(type: Jar) { dependsOn 'packageReleaseAssets' dependsOn 'compileReleaseJavaWithJavac' @@ -75,40 +75,40 @@ task adjustLicenseVerificationPluginJar(type: Jar) { } -task adjustLicenseVerificationPluginSourcesJar(type: Jar) { +task adjustLvlPluginSourcesJar(type: Jar) { setArchiveClassifier('sources') from android.sourceSets.main.java.srcDirs } artifacts { - archives adjustLicenseVerificationPluginJar - archives adjustLicenseVerificationPluginSourcesJar + archives adjustLvlPluginJar + archives adjustLvlPluginSourcesJar } afterEvaluate { publishing { publications { /* - mavenAndroidLicenseVerificationJar(MavenPublication) { + mavenAndroidLvlJar(MavenPublication) { customizePomForJar(pom) groupId rootProject.ext.adjustGroupId artifactId 'adjust-android-license-verification' version rootProject.ext.coreVersionName - artifact adjustLicenseVerificationPluginJar - artifact adjustLicenseVerificationPluginSourcesJar + artifact adjustLvlPluginJar + artifact adjustLvlPluginSourcesJar } */ - mavenAndroidLicenseVerificationAar(MavenPublication) { + mavenAndroidLvlAar(MavenPublication) { customizePomForAar(pom) groupId rootProject.ext.adjustGroupId artifactId 'adjust-android-license-verification' version rootProject.ext.coreVersionName - artifact("$buildDir/outputs/aar/sdk-plugin-license-verification-release.aar") { - builtBy tasks.getByPath("adjustLicenseVerificationPluginAar") + artifact("$buildDir/outputs/aar/sdk-plugin-lvl-release.aar") { + builtBy tasks.getByPath("adjustLvlPluginAar") } - artifact adjustLicenseVerificationPluginSourcesJar + artifact adjustLvlPluginSourcesJar } } @@ -130,8 +130,8 @@ afterEvaluate { } } signing { -// sign publishing.publications.mavenAndroidLicenseVerificationJar - sign publishing.publications.mavenAndroidLicenseVerificationAar +// sign publishing.publications.mavenAndroidLvlJar + sign publishing.publications.mavenAndroidLvlAar } } @@ -216,18 +216,18 @@ def customizePomForAar(pom) { } model { -// tasks.generatePomFileForMavenAndroidLicenseVerificationJarPublication { +// tasks.generatePomFileForMavenAndroidLvlJarPublication { // destination = file("${project.buildDir}/generated-pom.xml") // } /* TODO check if/how to replace this tasks - tasks.publishMavenAndroidLicenseVerificationPublicationToMavenLocal { + tasks.publishMavenAndroidLvlPublicationToMavenLocal { dependsOn project.tasks.signArchives } - tasks.publishMavenAndroidLicenseVerificationPublicationToMavenRepository { + tasks.publishMavenAndroidLvlPublicationToMavenRepository { dependsOn project.tasks.signArchives } */ - tasks.generatePomFileForMavenAndroidLicenseVerificationAarPublication { + tasks.generatePomFileForMavenAndroidLvlAarPublication { destination = file("${project.buildDir}/generated-pom.xml") } } diff --git a/Adjust/plugins/sdk-plugin-license-verification/proguard-rules.pro b/Adjust/plugins/sdk-plugin-lvl/proguard-rules.pro similarity index 100% rename from Adjust/plugins/sdk-plugin-license-verification/proguard-rules.pro rename to Adjust/plugins/sdk-plugin-lvl/proguard-rules.pro diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/AndroidManifest.xml b/Adjust/plugins/sdk-plugin-lvl/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/plugins/sdk-plugin-license-verification/src/main/AndroidManifest.xml rename to Adjust/plugins/sdk-plugin-lvl/src/main/AndroidManifest.xml diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl b/Adjust/plugins/sdk-plugin-lvl/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl similarity index 100% rename from Adjust/plugins/sdk-plugin-license-verification/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl rename to Adjust/plugins/sdk-plugin-lvl/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl b/Adjust/plugins/sdk-plugin-lvl/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl similarity index 100% rename from Adjust/plugins/sdk-plugin-license-verification/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl rename to Adjust/plugins/sdk-plugin-lvl/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java similarity index 100% rename from Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java rename to Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java similarity index 97% rename from Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java rename to Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index 146c6394f..58f2cd604 100644 --- a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -40,7 +40,7 @@ public LicenseChecker(Context context, LicenseRawCallback callback, ILogger logg this.mContext = context; this.mCallback = callback; this.logger = logger; - this.installTimeStamp = installTimeStamp; + this.installTimestamp = installTimeStamp; } public synchronized void checkAccess() { @@ -55,7 +55,7 @@ public synchronized void checkAccess() { private void executeLicenseCheck() { try { String packageName = mContext.getPackageName(); - long nonce = generateNonce(installTimeStamp); + long nonce = generateNonce(installTimestamp); mService.checkLicense(nonce, packageName, new ResultListener()); } catch (Exception e) { diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java similarity index 100% rename from Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java rename to Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java diff --git a/Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/Util.java similarity index 100% rename from Adjust/plugins/sdk-plugin-license-verification/src/main/java/com/adjust/sdk/lvl/Util.java rename to Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/Util.java diff --git a/Adjust/settings.gradle b/Adjust/settings.gradle index b90a1b0e7..6a4226e18 100644 --- a/Adjust/settings.gradle +++ b/Adjust/settings.gradle @@ -9,6 +9,7 @@ include ':plugins:sdk-plugin-vivo-referrer' include ':plugins:sdk-plugin-samsung-clouddev' include ':plugins:sdk-plugin-huawei-referrer' include ':plugins:sdk-plugin-meta-referrer' +include ':plugins:sdk-plugin-lvl' include ':tests:test-options' include ':tests:test-library' @@ -21,4 +22,4 @@ include ':examples:example-app-tv' include ':examples:example-app-webbridge' include ':examples:example-app-fbpixel' include ':examples:example-app-keyboard' -include ':plugins:sdk-plugin-license-verification' + From 10a6bd42df4e21b2b6ee7414e5bf4250e9e40e7c Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 25 Jul 2025 11:42:03 +0200 Subject: [PATCH 393/540] feat:adding unit and integration test for LicenseChecker.java --- Adjust/plugins/sdk-plugin-lvl/build.gradle | 12 ++ .../com/adjust/sdk/lvl/LicenseChecker.java | 119 +++++++----------- .../sdk/lvl/LicenseResponseHandler.java | 63 ++++++++++ .../src/test/java/com/adjust/sdk/ILogger.java | 9 ++ .../lvl/LicenseCheckerIntegrationTest.java | 57 +++++++++ .../sdk/lvl/LicenseResponseHandlerTest.java | 74 +++++++++++ 6 files changed, 257 insertions(+), 77 deletions(-) create mode 100644 Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseResponseHandler.java create mode 100644 Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/ILogger.java create mode 100644 Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerIntegrationTest.java create mode 100644 Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseResponseHandlerTest.java diff --git a/Adjust/plugins/sdk-plugin-lvl/build.gradle b/Adjust/plugins/sdk-plugin-lvl/build.gradle index b77bbc8e2..60150c2f9 100644 --- a/Adjust/plugins/sdk-plugin-lvl/build.gradle +++ b/Adjust/plugins/sdk-plugin-lvl/build.gradle @@ -31,11 +31,23 @@ android { buildFeatures { aidl true } + testOptions { + unitTests.includeAndroidResources = true + } } dependencies { + // Add SDK via module. compileOnly project(':sdk-core') + // Unit testing + // For unit tests + testImplementation 'junit:junit:4.13.2' + testImplementation 'org.mockito:mockito-core:5.10.0' + +// For integration tests + testImplementation 'org.robolectric:robolectric:4.11.1' + // Add SDK via Maven. // implementation 'com.adjust.sdk:adjust-android:5.3.0' } diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index 58f2cd604..682e9f196 100644 --- a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -6,134 +6,99 @@ import android.content.ServiceConnection; import android.os.IBinder; import android.os.RemoteException; - import com.adjust.sdk.ILogger; import com.android.vending.licensing.ILicensingService; public class LicenseChecker { private static final String GOOGLE_PLAY_PACKAGE = "com.android.vending"; - - // Server response codes. - private static final int LICENSED = 0x0; - private static final int NOT_LICENSED = 0x1; - private static final int LICENSED_OLD_KEY = 0x2; - private static final int ERROR_NOT_MARKET_MANAGED = 0x3; - private static final int ERROR_SERVER_FAILURE = 0x4; - private static final int ERROR_OVER_QUOTA = 0x5; - - private static final int ERROR_CONTACTING_SERVER = 0x101; - private static final int ERROR_INVALID_PACKAGE_NAME = 0x102; - private static final int ERROR_NON_MATCHING_UID = 0x103; - + private static final String TAG = "LicenseChecker"; private final Context mContext; private final LicenseRawCallback mCallback; private final ILogger logger; - private final long installTimestamp; + private final long installTimeStamp; + private ILicensingService mService; private boolean mBound; - - private static final int MAX_RETRIES = 3; private int retryCount = 0; + private static final int MAX_RETRIES = 3; public LicenseChecker(Context context, LicenseRawCallback callback, ILogger logger, long installTimeStamp) { this.mContext = context; this.mCallback = callback; this.logger = logger; - this.installTimestamp = installTimeStamp; + this.installTimeStamp = installTimeStamp; } public synchronized void checkAccess() { - if (mBound) { - return; - } + if (mBound) return; + logger.debug(TAG, "License check starts"); + Intent serviceIntent = new Intent("com.android.vending.licensing.ILicensingService"); serviceIntent.setPackage(GOOGLE_PLAY_PACKAGE); - mContext.bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE); + boolean isBind = mContext.bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE); + logger.debug(TAG, "bindService result: " + isBind); } - private void executeLicenseCheck() { - try { - String packageName = mContext.getPackageName(); - long nonce = generateNonce(installTimestamp); - mService.checkLicense(nonce, packageName, new ResultListener()); - - } catch (Exception e) { - logger.error("[License Verification] License check failed", e.getMessage()); - mCallback.onError(-1); + public void onDestroy() { + logger.debug(TAG, "LicenseChecker destroyed"); + if (mBound) { + mContext.unbindService(mServiceConnection); + mBound = false; } } private final ServiceConnection mServiceConnection = new ServiceConnection() { + @Override public void onServiceConnected(ComponentName name, IBinder service) { - + logger.debug(TAG, "Service connected"); mService = ILicensingService.Stub.asInterface(service); mBound = true; - - retryCount = 0; // Reset retry count on successful connection + retryCount = 0; executeLicenseCheck(); } + @Override public void onServiceDisconnected(ComponentName name) { + logger.debug(TAG, "Service disconnected"); mService = null; mBound = false; } }; - public void onDestroy() { - if (mBound) { - mContext.unbindService(mServiceConnection); - mBound = false; + private void executeLicenseCheck() { + try { + String packageName = mContext.getPackageName(); + long nonce = generateNonce(installTimeStamp); + logger.debug(TAG, "Generated nonce: " + nonce); + + mService.checkLicense(nonce, packageName, new ResultListener()); + } catch (Exception e) { + logger.error(TAG, "License check failed", e); + mCallback.onError(-1); } } private class ResultListener extends com.android.vending.licensing.ILicenseResultListener.Stub { @Override public void verifyLicense(int responseCode, String signedData, String signature) throws RemoteException { - - switch (responseCode) { - case NOT_LICENSED: // NOT_LICENSED - case ERROR_INVALID_PACKAGE_NAME: // INVALID_PACKAGE_NAME - case ERROR_NON_MATCHING_UID: // NON_MATCHING_UID - case ERROR_NOT_MARKET_MANAGED: // NOT_MARKET_MANAGED - logger.warn("[LicenseVerification] License check failed: " + responseCode); - mCallback.onError(responseCode); - onDestroy(); - return; - - case ERROR_CONTACTING_SERVER: // CONTACTING_SERVER_ERROR - case ERROR_SERVER_FAILURE: // SERVER_FAILURE - case ERROR_OVER_QUOTA: // refusing to talk to this device, over quota - if (++retryCount < MAX_RETRIES) { - logger.warn("[LicenseVerification] Retry attempt [%d] for response code [%d]" , retryCount, responseCode); - executeLicenseCheck(); - } else { - logger.error("[LicenseVerification] License check failed after max retries"); - mCallback.onError(responseCode); - onDestroy(); - } - break; - - case LICENSED: // LICENSED - case LICENSED_OLD_KEY: // LICENSED_OLD_KEY - default: - if (signedData != null && signature != null) { - mCallback.onLicenseDataReceived(responseCode, signedData, signature); - } else { - logger.error("[LicenseVerification] missing signed data or signature"); - mCallback.onError(responseCode); - } - onDestroy(); + logger.debug(TAG, "Received license response: " + responseCode); + + LicenseResponseHandler handler = new LicenseResponseHandler(mCallback, logger, MAX_RETRIES); + boolean shouldRetry = handler.handleResponse(responseCode, signedData, signature, retryCount); + if (shouldRetry) { + retryCount++; + logger.debug(TAG, "Retrying license check... Attempt " + retryCount); + executeLicenseCheck(); + }else { + onDestroy(); } } } public static long generateNonce(long installTimestamp) { - // Pack into a long:[timestamp: 56 bits][version/flags: 8 bits] - long nonce = 0; - nonce |= (installTimestamp & 0xFFFFFFFFFFL) << 8; // bits 8–31 - nonce |= 0x01; // version in the lowest 8 bits - + long reducedTimestamp = (installTimestamp / 1000) % (1L << 56); + long nonce = (reducedTimestamp << 8) | 0x01; return nonce; } } diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseResponseHandler.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseResponseHandler.java new file mode 100644 index 000000000..1d33a196a --- /dev/null +++ b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseResponseHandler.java @@ -0,0 +1,63 @@ +package com.adjust.sdk.lvl; + +import com.adjust.sdk.ILogger; + +public class LicenseResponseHandler { + private final LicenseRawCallback callback; + private final ILogger logger; + private final int maxRetries; + // Server response codes. + private static final int LICENSED = 0x0; + private static final int NOT_LICENSED = 0x1; + private static final int LICENSED_OLD_KEY = 0x2; + private static final int ERROR_NOT_MARKET_MANAGED = 0x3; + private static final int ERROR_SERVER_FAILURE = 0x4; + private static final int ERROR_OVER_QUOTA = 0x5; + + private static final int ERROR_CONTACTING_SERVER = 0x101; + private static final int ERROR_INVALID_PACKAGE_NAME = 0x102; + private static final int ERROR_NON_MATCHING_UID = 0x103; + + public LicenseResponseHandler(LicenseRawCallback callback, ILogger logger, int maxRetries) { + this.callback = callback; + this.logger = logger; + this.maxRetries = maxRetries; + } + + public boolean handleResponse(int responseCode, String signedData, String signature, int retryCount) { + switch (responseCode) { + case NOT_LICENSED: // NOT_LICENSED + case ERROR_INVALID_PACKAGE_NAME: // INVALID_PACKAGE_NAME + case ERROR_NON_MATCHING_UID: // NON_MATCHING_UID + case ERROR_NOT_MARKET_MANAGED: // NOT_MARKET_MANAGED + logger.warn("[LicenseVerification] License check failed: " + responseCode); + callback.onError(responseCode); + return false; + + case ERROR_CONTACTING_SERVER: // CONTACTING_SERVER_ERROR + case ERROR_SERVER_FAILURE: // SERVER_FAILURE + case ERROR_OVER_QUOTA: // refusing to talk to this device, over quota + if (retryCount < maxRetries) { + logger.warn("Retry attempt [" + (retryCount + 1) + "]", responseCode); + return true; // signal to retry + } else { + logger.error("Retry attempt [" + retryCount + "] failed after max retries", responseCode); + callback.onError(responseCode); + return false; + } + case LICENSED: // LICENSED + case LICENSED_OLD_KEY: // LICENSED_OLD_KEY + if (signedData != null && signature != null) { + callback.onLicenseDataReceived(responseCode, signedData, signature); + } else { + logger.error("[LicenseVerification] missing signed data or signature"); + callback.onError(responseCode); + } + return false; + default: + logger.error("Unexpected response code", responseCode); + callback.onError(responseCode); + return false; + } + } +} diff --git a/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/ILogger.java b/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/ILogger.java new file mode 100644 index 000000000..1dce371ab --- /dev/null +++ b/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/ILogger.java @@ -0,0 +1,9 @@ +package com.adjust.sdk; + +public interface ILogger { + void debug(String message, Object... params); + void info(String message, Object... params); + void warn(String message, Object... params); + void error(String message, Object... params); +} + diff --git a/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerIntegrationTest.java b/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerIntegrationTest.java new file mode 100644 index 000000000..0f38839c9 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerIntegrationTest.java @@ -0,0 +1,57 @@ +package com.adjust.sdk.lvl; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.os.IBinder; +import android.content.ServiceConnection; +import android.os.RemoteException; + +import com.adjust.sdk.ILogger; +import com.android.vending.licensing.ILicenseResultListener; +import com.android.vending.licensing.ILicensingService; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +import static org.mockito.Mockito.*; + +@RunWith(RobolectricTestRunner.class) +@Config(sdk = 33) // or 34, must be <= 34 +public class LicenseCheckerIntegrationTest { + + private Context context; + private LicenseRawCallback mockCallback; + private ILogger mockLogger; + private LicenseChecker licenseChecker; + + @Before + public void setUp() { + context = mock(Context.class); + mockCallback = mock(LicenseRawCallback.class); + mockLogger = mock(ILogger.class); + licenseChecker = new LicenseChecker(context, mockCallback, mockLogger, System.currentTimeMillis()); + } + + @Test + public void testSuccessfulLicenseCheck_shouldCallCallback() { + doAnswer(invocation -> { + ServiceConnection conn = invocation.getArgument(1); + IBinder binder = new ILicensingService.Stub() { + @Override + public void checkLicense(long nonce, String packageName, ILicenseResultListener listener) throws RemoteException { + listener.verifyLicense(0, "signedData", "signature"); + } + }; + conn.onServiceConnected(new ComponentName("com.android.vending", "LicensingService"), binder); + return true; + }).when(context).bindService(any(Intent.class), any(), anyInt()); + + licenseChecker.checkAccess(); + verify(mockCallback, timeout(1000)).onLicenseDataReceived(eq(0), eq("signedData"), eq("signature")); + } +} diff --git a/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseResponseHandlerTest.java b/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseResponseHandlerTest.java new file mode 100644 index 000000000..812db5c4e --- /dev/null +++ b/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseResponseHandlerTest.java @@ -0,0 +1,74 @@ +package com.adjust.sdk.lvl; + +import com.adjust.sdk.ILogger; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import static org.mockito.Mockito.*; + +public class LicenseResponseHandlerTest { + + @Mock LicenseRawCallback mockCallback; + @Mock ILogger mockLogger; + + private LicenseResponseHandler handler; + + @Before + public void setup() { + MockitoAnnotations.openMocks(this); + handler = new LicenseResponseHandler(mockCallback, mockLogger, 3); + } + + @Test + public void testLicensed_response_callsOnSuccess() { + handler.handleResponse(0, "signedData", "signature", 0); + + verify(mockCallback).onLicenseDataReceived(0, "signedData", "signature"); + verifyNoMoreInteractions(mockCallback); + } + + @Test + public void testLicensed_missingSignature_callsError() { + handler.handleResponse(0, null, null, 0); + + verify(mockLogger).error(contains("missing signed data")); + verify(mockCallback).onError(0); + } + + @Test + public void testNotLicensed_callsErrorDirectly() { + handler.handleResponse(1, null, null, 0); + + verify(mockCallback).onError(1); + verify(mockLogger).warn(contains("[LicenseVerification] License check failed: ")); + } + + @Test + public void testTemporaryError_retriesBelowMax() { + boolean shouldRetry = handler.handleResponse(4, null, null, 2); + + verify(mockLogger).warn(contains("Retry attempt [3]"), eq(4)); + verify(mockCallback, never()).onError(anyInt()); + assert(shouldRetry); + } + + @Test + public void testTemporaryError_retriesExceeded_callsError() { + boolean shouldRetry = handler.handleResponse(5, null, null, 3); + + verify(mockLogger).error(contains("after max retries"), eq(5)); + verify(mockCallback).onError(5); + assert(!shouldRetry); + } + + @Test + public void testUnexpectedCode_callsError() { + handler.handleResponse(999, "X", "Y", 0); + + verify(mockLogger).error(contains("Unexpected response code"), eq(999)); + verify(mockCallback).onError(999); + } +} From cddd90165e9a6c9f843cdfce5af2676db4a74fbb Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 25 Jul 2025 11:55:46 +0200 Subject: [PATCH 394/540] feat:adding unit test for checking the generateNonce --- .../sdk/lvl/LicenseCheckerNonceTest.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java diff --git a/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java b/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java new file mode 100644 index 000000000..e2515b229 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java @@ -0,0 +1,24 @@ +package com.adjust.sdk.lvl; + +import org.junit.Test; + +import static org.junit.Assert.*; + +public class LicenseCheckerNonceTest { + + @Test + public void testGenerateNonce_packsTimestampCorrectly() { + long fakeInstallTimeMillis = 1720000000000L; + long nonce = LicenseChecker.generateNonce(fakeInstallTimeMillis); + long reducedTimestamp = (fakeInstallTimeMillis / 1000) % (1L << 56); + long expected = (reducedTimestamp << 8) | 0x01; + assertEquals(expected, nonce); + } + + @Test + public void testGenerateNonce_uniqueForDifferentTimestamps() { + long t1 = LicenseChecker.generateNonce(1600000000000L); + long t2 = LicenseChecker.generateNonce(1700000000000L); + assertNotEquals(t1, t2); + } +} From 1cbb06027aba9b680af8183b5eb05dc054088bf1 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 28 Jul 2025 10:51:47 +0200 Subject: [PATCH 395/540] feat:tuning the generate nonce for the storing timestamp in 8 to 63 bits --- .../com/adjust/sdk/lvl/LicenseChecker.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index 682e9f196..ce375906b 100644 --- a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -96,9 +96,21 @@ public void verifyLicense(int responseCode, String signedData, String signature) } } + /** + * Generates a 64-bit nonce with: + * - 56-bit reduced timestamp (in seconds) stored in bits 8–63 + * - 8-bit reserved field in bits 0–7 (currently using 0x01 as version marker) + */ public static long generateNonce(long installTimestamp) { - long reducedTimestamp = (installTimestamp / 1000) % (1L << 56); - long nonce = (reducedTimestamp << 8) | 0x01; - return nonce; + // Convert to seconds for compactness and to fit into 56 bits + long timestampInSeconds = installTimestamp / 1000; + + // Mask to ensure we only keep the lowest 56 bits + long MASK_56_BITS = 0x00FFFFFFFFFFFFFFL; + long reducedTimestamp = timestampInSeconds & MASK_56_BITS; + + // Shift timestamp to occupy bits 8–63, reserve LSB for flags/version + return (reducedTimestamp << 8) | 0x01; } + } From 99e2ce1f563ca879d62a79b5b696958e25cf27c5 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 28 Jul 2025 11:04:35 +0200 Subject: [PATCH 396/540] feat:tuning the generate nonce tests --- .../sdk/lvl/LicenseCheckerNonceTest.java | 58 +++++++++++++++---- 1 file changed, 48 insertions(+), 10 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java b/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java index e2515b229..825313269 100644 --- a/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java +++ b/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java @@ -7,18 +7,56 @@ public class LicenseCheckerNonceTest { @Test - public void testGenerateNonce_packsTimestampCorrectly() { - long fakeInstallTimeMillis = 1720000000000L; - long nonce = LicenseChecker.generateNonce(fakeInstallTimeMillis); - long reducedTimestamp = (fakeInstallTimeMillis / 1000) % (1L << 56); - long expected = (reducedTimestamp << 8) | 0x01; - assertEquals(expected, nonce); + public void testGenerateNonce_containsVersionByte() { + long timestamp = System.currentTimeMillis(); + long nonce = LicenseChecker.generateNonce(timestamp); + assertEquals("LSB should be 0x01 (version/flag)", 0x01, nonce & 0xFF); } @Test - public void testGenerateNonce_uniqueForDifferentTimestamps() { - long t1 = LicenseChecker.generateNonce(1600000000000L); - long t2 = LicenseChecker.generateNonce(1700000000000L); - assertNotEquals(t1, t2); + public void testGenerateNonce_timestampPacking_isCorrect() { + long timestamp = 1720000000000L; // Epoch in ms + long expectedSeconds = (timestamp / 1000) & 0x00FFFFFFFFFFFFFFL; + long nonce = LicenseChecker.generateNonce(timestamp); + + long extractedSeconds = (nonce >>> 8); // remove version byte + assertEquals("Timestamp in nonce should match expected seconds", expectedSeconds, extractedSeconds); + } + + @Test + public void testGenerateNonce_zeroTimestamp_shouldStillWork() { + long nonce = LicenseChecker.generateNonce(0L); + assertEquals("Should only have version byte set", 0x01, nonce); + } + + @Test + public void testGenerateNonce_nearLimit_doesNotOverflowSafe() { + // Use a timestamp that still fits in millis without overflowing long + long safeSeconds = (1L << 53); // 53 bits (won't overflow when *1000) + long installTimeMillis = safeSeconds * 1000; + + long nonce = LicenseChecker.generateNonce(installTimeMillis); + long extractedSeconds = nonce >>> 8; + + assertEquals("Should safely extract 53-bit timestamp", safeSeconds, extractedSeconds); + } + + + + @Test + public void testGenerateNonce_truncatesIfAbove56Bits() { + long overMaxTimestampMs = ((1L << 56) + 9999L) * 1000; // milliseconds that overflow 56-bit seconds + + long nonce = LicenseChecker.generateNonce(overMaxTimestampMs); + long extracted = (nonce >>> 8); + + assertTrue("Extracted timestamp must be less than 2^56", extracted < (1L << 56)); + } + + @Test + public void testGenerateNonce_multipleCalls_differentResults() { + long t1 = LicenseChecker.generateNonce(System.currentTimeMillis()); + long t2 = LicenseChecker.generateNonce(System.currentTimeMillis() + 2000); + assertNotEquals("Nonces from different times should differ", t1, t2); } } From fae4698788e95adeedb9c6065902d6c841b2cd0d Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 31 Jul 2025 15:14:06 +0200 Subject: [PATCH 397/540] reafc: refactor installTimestamp name --- .../src/main/java/com/adjust/sdk/lvl/LicenseChecker.java | 8 ++++---- .../sdk-core/src/main/java/com/adjust/sdk/Reflection.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index ce375906b..0d948ddac 100644 --- a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -16,18 +16,18 @@ public class LicenseChecker { private final Context mContext; private final LicenseRawCallback mCallback; private final ILogger logger; - private final long installTimeStamp; + private final long installTimestamp; private ILicensingService mService; private boolean mBound; private int retryCount = 0; private static final int MAX_RETRIES = 3; - public LicenseChecker(Context context, LicenseRawCallback callback, ILogger logger, long installTimeStamp) { + public LicenseChecker(Context context, LicenseRawCallback callback, ILogger logger, long installTimestamp) { this.mContext = context; this.mCallback = callback; this.logger = logger; - this.installTimeStamp = installTimeStamp; + this.installTimestamp = installTimestamp; } public synchronized void checkAccess() { @@ -69,7 +69,7 @@ public void onServiceDisconnected(ComponentName name) { private void executeLicenseCheck() { try { String packageName = mContext.getPackageName(); - long nonce = generateNonce(installTimeStamp); + long nonce = generateNonce(installTimestamp); logger.debug(TAG, "Generated nonce: " + nonce); mService.checkLicense(nonce, packageName, new ResultListener()); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java index 292bf3584..10967e514 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java @@ -71,13 +71,13 @@ public static ReferrerDetails getMetaReferrer(Context context, String fbAppId, I return referrerDetails; } - public static LicenseData getLicenseRequiredData(Context context, ILogger logger, long installTimeStamp) { + public static LicenseData getLicenseRequiredData(Context context, ILogger logger, long installTimestamp) { LicenseData licenseData = null; try { licenseData = (LicenseData) invokeStaticMethod("com.adjust.sdk.lvl.Util", "getLicenseRequiredData", new Class[]{Context.class, ILogger.class, long.class}, - context, logger, installTimeStamp); + context, logger, installTimestamp); } catch (Exception e) { } return licenseData; From 575331415969ccec799e452914134e02d1ec2741 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 31 Jul 2025 15:16:06 +0200 Subject: [PATCH 398/540] reafc: refactor installTimestamp to timestamp --- .../adjust/sdk/lvl/AdjustLicenseVerification.java | 4 ++-- .../main/java/com/adjust/sdk/lvl/LicenseChecker.java | 12 ++++++------ .../src/main/java/com/adjust/sdk/lvl/Util.java | 4 ++-- .../src/main/java/com/adjust/sdk/Reflection.java | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java index e7b407708..87317b81f 100644 --- a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java +++ b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java @@ -11,7 +11,7 @@ public class AdjustLicenseVerification { - public static LicenseData fetchLicenseDate(Context context, ILogger logger, long installTimestamp) { + public static LicenseData fetchLicenseDate(Context context, ILogger logger, long timestamp) { try { BlockingQueue licenseHolder = new LinkedBlockingQueue(1); LicenseChecker checker = new LicenseChecker(context, new LicenseRawCallback() { @@ -24,7 +24,7 @@ public void onLicenseDataReceived(int responseCode,String signedData, String sig public void onError(int errorCode) { licenseHolder.offer(new LicenseData(null, null, errorCode)); } - }, logger, installTimestamp); + }, logger, timestamp); checker.checkAccess(); return licenseHolder.poll(3000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index 0d948ddac..2400c1854 100644 --- a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -16,18 +16,18 @@ public class LicenseChecker { private final Context mContext; private final LicenseRawCallback mCallback; private final ILogger logger; - private final long installTimestamp; + private final long timestamp; private ILicensingService mService; private boolean mBound; private int retryCount = 0; private static final int MAX_RETRIES = 3; - public LicenseChecker(Context context, LicenseRawCallback callback, ILogger logger, long installTimestamp) { + public LicenseChecker(Context context, LicenseRawCallback callback, ILogger logger, long timestamp) { this.mContext = context; this.mCallback = callback; this.logger = logger; - this.installTimestamp = installTimestamp; + this.timestamp = timestamp; } public synchronized void checkAccess() { @@ -69,7 +69,7 @@ public void onServiceDisconnected(ComponentName name) { private void executeLicenseCheck() { try { String packageName = mContext.getPackageName(); - long nonce = generateNonce(installTimestamp); + long nonce = generateNonce(timestamp); logger.debug(TAG, "Generated nonce: " + nonce); mService.checkLicense(nonce, packageName, new ResultListener()); @@ -101,9 +101,9 @@ public void verifyLicense(int responseCode, String signedData, String signature) * - 56-bit reduced timestamp (in seconds) stored in bits 8–63 * - 8-bit reserved field in bits 0–7 (currently using 0x01 as version marker) */ - public static long generateNonce(long installTimestamp) { + public static long generateNonce(long timestamp) { // Convert to seconds for compactness and to fit into 56 bits - long timestampInSeconds = installTimestamp / 1000; + long timestampInSeconds = timestamp / 1000; // Mask to ensure we only keep the lowest 56 bits long MASK_56_BITS = 0x00FFFFFFFFFFFFFFL; diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/Util.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/Util.java index 982656ad9..0d32870b5 100644 --- a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/Util.java +++ b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/Util.java @@ -7,7 +7,7 @@ public class Util { - public synchronized static LicenseData getLicenseRequiredData(Context context, ILogger logger, long installTimestamp) { - return AdjustLicenseVerification.fetchLicenseDate(context, logger, installTimestamp); + public synchronized static LicenseData getLicenseRequiredData(Context context, ILogger logger, long timestamp) { + return AdjustLicenseVerification.fetchLicenseDate(context, logger, timestamp); } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java index 10967e514..5cacca7aa 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java @@ -71,13 +71,13 @@ public static ReferrerDetails getMetaReferrer(Context context, String fbAppId, I return referrerDetails; } - public static LicenseData getLicenseRequiredData(Context context, ILogger logger, long installTimestamp) { + public static LicenseData getLicenseRequiredData(Context context, ILogger logger, long timestamp) { LicenseData licenseData = null; try { licenseData = (LicenseData) invokeStaticMethod("com.adjust.sdk.lvl.Util", "getLicenseRequiredData", new Class[]{Context.class, ILogger.class, long.class}, - context, logger, installTimestamp); + context, logger, timestamp); } catch (Exception e) { } return licenseData; From 6621fb0403d166dae44e09286ac71512a3281ea5 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 31 Jul 2025 15:43:46 +0200 Subject: [PATCH 399/540] reafc: tuning the logs and removed the TAG --- .../com/adjust/sdk/lvl/LicenseChecker.java | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index 2400c1854..46d7ee9cf 100644 --- a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -6,12 +6,12 @@ import android.content.ServiceConnection; import android.os.IBinder; import android.os.RemoteException; + import com.adjust.sdk.ILogger; import com.android.vending.licensing.ILicensingService; public class LicenseChecker { private static final String GOOGLE_PLAY_PACKAGE = "com.android.vending"; - private static final String TAG = "LicenseChecker"; private final Context mContext; private final LicenseRawCallback mCallback; @@ -31,17 +31,19 @@ public LicenseChecker(Context context, LicenseRawCallback callback, ILogger logg } public synchronized void checkAccess() { - if (mBound) return; - logger.debug(TAG, "License check starts"); + if (mBound) { + return; + } + logger.debug("[LicenseVerification] License check starts"); Intent serviceIntent = new Intent("com.android.vending.licensing.ILicensingService"); serviceIntent.setPackage(GOOGLE_PLAY_PACKAGE); boolean isBind = mContext.bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE); - logger.debug(TAG, "bindService result: " + isBind); + logger.debug("[LicenseVerification] bindService result: " + isBind); } public void onDestroy() { - logger.debug(TAG, "LicenseChecker destroyed"); + logger.debug("[LicenseVerification] LicenseChecker destroyed"); if (mBound) { mContext.unbindService(mServiceConnection); mBound = false; @@ -51,7 +53,7 @@ public void onDestroy() { private final ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { - logger.debug(TAG, "Service connected"); + logger.debug("[LicenseVerification] Service connected"); mService = ILicensingService.Stub.asInterface(service); mBound = true; retryCount = 0; @@ -60,7 +62,7 @@ public void onServiceConnected(ComponentName name, IBinder service) { @Override public void onServiceDisconnected(ComponentName name) { - logger.debug(TAG, "Service disconnected"); + logger.debug("[LicenseVerification] Service disconnected"); mService = null; mBound = false; } @@ -70,11 +72,11 @@ private void executeLicenseCheck() { try { String packageName = mContext.getPackageName(); long nonce = generateNonce(timestamp); - logger.debug(TAG, "Generated nonce: " + nonce); + logger.debug("[LicenseVerification] Generated nonce: " + nonce); mService.checkLicense(nonce, packageName, new ResultListener()); } catch (Exception e) { - logger.error(TAG, "License check failed", e); + logger.error("[LicenseVerification] License check failed", e); mCallback.onError(-1); } } @@ -82,15 +84,15 @@ private void executeLicenseCheck() { private class ResultListener extends com.android.vending.licensing.ILicenseResultListener.Stub { @Override public void verifyLicense(int responseCode, String signedData, String signature) throws RemoteException { - logger.debug(TAG, "Received license response: " + responseCode); + logger.debug("[LicenseVerification] Received license response: " + responseCode); LicenseResponseHandler handler = new LicenseResponseHandler(mCallback, logger, MAX_RETRIES); boolean shouldRetry = handler.handleResponse(responseCode, signedData, signature, retryCount); if (shouldRetry) { retryCount++; - logger.debug(TAG, "Retrying license check... Attempt " + retryCount); + logger.debug("[LicenseVerification] Retrying license check... Attempt " + retryCount); executeLicenseCheck(); - }else { + } else { onDestroy(); } } From 049160842010252933e68fd69b3d93a363ea80ec Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 31 Jul 2025 16:01:15 +0200 Subject: [PATCH 400/540] reafc: using actual milliseconds instead of seconds for generating nonce --- .../java/com/adjust/sdk/lvl/LicenseChecker.java | 5 +---- .../com/adjust/sdk/lvl/LicenseCheckerNonceTest.java | 13 ++++++------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index 46d7ee9cf..9afcf658b 100644 --- a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -104,12 +104,9 @@ public void verifyLicense(int responseCode, String signedData, String signature) * - 8-bit reserved field in bits 0–7 (currently using 0x01 as version marker) */ public static long generateNonce(long timestamp) { - // Convert to seconds for compactness and to fit into 56 bits - long timestampInSeconds = timestamp / 1000; - // Mask to ensure we only keep the lowest 56 bits long MASK_56_BITS = 0x00FFFFFFFFFFFFFFL; - long reducedTimestamp = timestampInSeconds & MASK_56_BITS; + long reducedTimestamp = timestamp & MASK_56_BITS; // Shift timestamp to occupy bits 8–63, reserve LSB for flags/version return (reducedTimestamp << 8) | 0x01; diff --git a/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java b/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java index 825313269..a97955807 100644 --- a/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java +++ b/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java @@ -16,7 +16,7 @@ public void testGenerateNonce_containsVersionByte() { @Test public void testGenerateNonce_timestampPacking_isCorrect() { long timestamp = 1720000000000L; // Epoch in ms - long expectedSeconds = (timestamp / 1000) & 0x00FFFFFFFFFFFFFFL; + long expectedSeconds =timestamp & 0x00FFFFFFFFFFFFFFL; long nonce = LicenseChecker.generateNonce(timestamp); long extractedSeconds = (nonce >>> 8); // remove version byte @@ -32,20 +32,19 @@ public void testGenerateNonce_zeroTimestamp_shouldStillWork() { @Test public void testGenerateNonce_nearLimit_doesNotOverflowSafe() { // Use a timestamp that still fits in millis without overflowing long - long safeSeconds = (1L << 53); // 53 bits (won't overflow when *1000) - long installTimeMillis = safeSeconds * 1000; + long safeMillis = (1L << 53); // 53 bits (won't overflow when *1000) - long nonce = LicenseChecker.generateNonce(installTimeMillis); - long extractedSeconds = nonce >>> 8; + long nonce = LicenseChecker.generateNonce(safeMillis); + long extractedMillis = nonce >>> 8; - assertEquals("Should safely extract 53-bit timestamp", safeSeconds, extractedSeconds); + assertEquals("Should safely extract 53-bit timestamp", safeMillis, extractedMillis); } @Test public void testGenerateNonce_truncatesIfAbove56Bits() { - long overMaxTimestampMs = ((1L << 56) + 9999L) * 1000; // milliseconds that overflow 56-bit seconds + long overMaxTimestampMs = ((1L << 56) + 9999L); // milliseconds that overflow 56-bit seconds long nonce = LicenseChecker.generateNonce(overMaxTimestampMs); long extracted = (nonce >>> 8); From 84aa030d8fd1a4366abcdf5e3359b9e0f7eed812 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 18 Aug 2025 11:44:09 +0200 Subject: [PATCH 401/540] Update Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Uglješa Erceg --- .../src/main/java/com/adjust/sdk/lvl/LicenseChecker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index 9afcf658b..9f185e832 100644 --- a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -34,7 +34,7 @@ public synchronized void checkAccess() { if (mBound) { return; } - logger.debug("[LicenseVerification] License check starts"); + logger.debug("LVL license check started"); Intent serviceIntent = new Intent("com.android.vending.licensing.ILicensingService"); serviceIntent.setPackage(GOOGLE_PLAY_PACKAGE); From ea49315f88f277342648632f62b27c6cc3197972 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 18 Aug 2025 11:48:53 +0200 Subject: [PATCH 402/540] clean: clearing the Logs --- .../sdk/lvl/AdjustLicenseVerification.java | 2 +- .../com/adjust/sdk/lvl/LicenseChecker.java | 18 +++++++++--------- .../adjust/sdk/lvl/LicenseResponseHandler.java | 10 +++++----- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java index 87317b81f..536833225 100644 --- a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java +++ b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java @@ -28,7 +28,7 @@ public void onError(int errorCode) { checker.checkAccess(); return licenseHolder.poll(3000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { - logger.error("[LicenseVerification] License checker interrupted: ", e.getMessage()); + logger.error("LVL License checker interrupted: ", e.getMessage()); return null; } } diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index 9f185e832..32b39ca7d 100644 --- a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -34,16 +34,16 @@ public synchronized void checkAccess() { if (mBound) { return; } - logger.debug("LVL license check started"); + logger.debug("LVL License check starts"); Intent serviceIntent = new Intent("com.android.vending.licensing.ILicensingService"); serviceIntent.setPackage(GOOGLE_PLAY_PACKAGE); boolean isBind = mContext.bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE); - logger.debug("[LicenseVerification] bindService result: " + isBind); + logger.debug("LVL bindService result: " + isBind); } public void onDestroy() { - logger.debug("[LicenseVerification] LicenseChecker destroyed"); + logger.debug("LVL license checker destroyed"); if (mBound) { mContext.unbindService(mServiceConnection); mBound = false; @@ -53,7 +53,7 @@ public void onDestroy() { private final ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { - logger.debug("[LicenseVerification] Service connected"); + logger.debug("LVL service connected"); mService = ILicensingService.Stub.asInterface(service); mBound = true; retryCount = 0; @@ -62,7 +62,7 @@ public void onServiceConnected(ComponentName name, IBinder service) { @Override public void onServiceDisconnected(ComponentName name) { - logger.debug("[LicenseVerification] Service disconnected"); + logger.debug("LVL service disconnected"); mService = null; mBound = false; } @@ -72,11 +72,11 @@ private void executeLicenseCheck() { try { String packageName = mContext.getPackageName(); long nonce = generateNonce(timestamp); - logger.debug("[LicenseVerification] Generated nonce: " + nonce); + logger.debug("LVL generated nonce: " + nonce); mService.checkLicense(nonce, packageName, new ResultListener()); } catch (Exception e) { - logger.error("[LicenseVerification] License check failed", e); + logger.error("LVL license check failed: ", e); mCallback.onError(-1); } } @@ -84,13 +84,13 @@ private void executeLicenseCheck() { private class ResultListener extends com.android.vending.licensing.ILicenseResultListener.Stub { @Override public void verifyLicense(int responseCode, String signedData, String signature) throws RemoteException { - logger.debug("[LicenseVerification] Received license response: " + responseCode); + logger.debug("LVL Received license response: " + responseCode); LicenseResponseHandler handler = new LicenseResponseHandler(mCallback, logger, MAX_RETRIES); boolean shouldRetry = handler.handleResponse(responseCode, signedData, signature, retryCount); if (shouldRetry) { retryCount++; - logger.debug("[LicenseVerification] Retrying license check... Attempt " + retryCount); + logger.debug("LVL retrying license check... Attempt: " + retryCount); executeLicenseCheck(); } else { onDestroy(); diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseResponseHandler.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseResponseHandler.java index 1d33a196a..879016cee 100644 --- a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseResponseHandler.java +++ b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseResponseHandler.java @@ -30,7 +30,7 @@ public boolean handleResponse(int responseCode, String signedData, String signat case ERROR_INVALID_PACKAGE_NAME: // INVALID_PACKAGE_NAME case ERROR_NON_MATCHING_UID: // NON_MATCHING_UID case ERROR_NOT_MARKET_MANAGED: // NOT_MARKET_MANAGED - logger.warn("[LicenseVerification] License check failed: " + responseCode); + logger.warn("LVL license check failed: " + responseCode); callback.onError(responseCode); return false; @@ -38,10 +38,10 @@ public boolean handleResponse(int responseCode, String signedData, String signat case ERROR_SERVER_FAILURE: // SERVER_FAILURE case ERROR_OVER_QUOTA: // refusing to talk to this device, over quota if (retryCount < maxRetries) { - logger.warn("Retry attempt [" + (retryCount + 1) + "]", responseCode); + logger.warn("LVL retry attempt [" + (retryCount + 1) + "]: ", responseCode); return true; // signal to retry } else { - logger.error("Retry attempt [" + retryCount + "] failed after max retries", responseCode); + logger.error("LVL retry attempt [" + retryCount + "] failed after max retries: ", responseCode); callback.onError(responseCode); return false; } @@ -50,12 +50,12 @@ public boolean handleResponse(int responseCode, String signedData, String signat if (signedData != null && signature != null) { callback.onLicenseDataReceived(responseCode, signedData, signature); } else { - logger.error("[LicenseVerification] missing signed data or signature"); + logger.error("LVL missing signed data or signature"); callback.onError(responseCode); } return false; default: - logger.error("Unexpected response code", responseCode); + logger.error("LVL unexpected response code: ", responseCode); callback.onError(responseCode); return false; } From fbe33f3b8bb78e11c3163d3fd97b4e370b63f091 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 18 Aug 2025 12:21:20 +0200 Subject: [PATCH 403/540] docs: rename MIT-LICENSE to LICENSE --- MIT-LICENSE => LICENSE | 0 README.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename MIT-LICENSE => LICENSE (100%) diff --git a/MIT-LICENSE b/LICENSE similarity index 100% rename from MIT-LICENSE rename to LICENSE diff --git a/README.md b/README.md index 4c66bfdae..28b4a5ddb 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ This is the [Adjust](https://adjust.com)™ SDK for Android. Documentation is a ## License -Distributed under the [MIT license](https://opensource.org/licenses/MIT). See [`MIT-LICENSE`](MIT-LICENSE) for the full text. +Distributed under the [MIT license](https://opensource.org/licenses/MIT). See [`LICENSE`](LICENSE) for the full text. [en-helpcenter]: https://help.adjust.com/en/developer/android-sdk-documentation [zh-helpcenter]: https://help.adjust.com/zh/developer/android-sdk-documentation From d4d10a2b00a3295f699e9fba3f83090e0d04a266 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 18 Aug 2025 12:21:35 +0200 Subject: [PATCH 404/540] docs: update LICENSE file text --- LICENSE | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index f4d1af881..242e5d555 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,4 @@ -Copyright (c) 2012-2017 adjust GmbH, -http://www.adjust.com +Copyright (c) 2012-Present Adjust GmbH, http://www.adjust.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the From 31b0426c73becf53445fdc9b04dd2ba06fc2b397 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 18 Aug 2025 12:29:14 +0200 Subject: [PATCH 405/540] docs: add LICENSE to each of the plugin directories --- .../sdk-plugin-huawei-referrer/LICENSE | 20 ++++++++++++ Adjust/plugins/sdk-plugin-imei/LICENSE | 20 ++++++++++++ Adjust/plugins/sdk-plugin-lvl/LICENSE | 32 +++++++++++++++++++ .../plugins/sdk-plugin-meta-referrer/LICENSE | 20 ++++++++++++ Adjust/plugins/sdk-plugin-oaid/LICENSE | 20 ++++++++++++ .../sdk-plugin-samsung-clouddev/LICENSE | 20 ++++++++++++ .../sdk-plugin-samsung-referrer/LICENSE | 20 ++++++++++++ .../plugins/sdk-plugin-vivo-referrer/LICENSE | 20 ++++++++++++ Adjust/plugins/sdk-plugin-webbridge/LICENSE | 20 ++++++++++++ .../sdk-plugin-xiaomi-referrer/LICENSE | 20 ++++++++++++ 10 files changed, 212 insertions(+) create mode 100644 Adjust/plugins/sdk-plugin-huawei-referrer/LICENSE create mode 100644 Adjust/plugins/sdk-plugin-imei/LICENSE create mode 100644 Adjust/plugins/sdk-plugin-lvl/LICENSE create mode 100644 Adjust/plugins/sdk-plugin-meta-referrer/LICENSE create mode 100644 Adjust/plugins/sdk-plugin-oaid/LICENSE create mode 100644 Adjust/plugins/sdk-plugin-samsung-clouddev/LICENSE create mode 100644 Adjust/plugins/sdk-plugin-samsung-referrer/LICENSE create mode 100644 Adjust/plugins/sdk-plugin-vivo-referrer/LICENSE create mode 100644 Adjust/plugins/sdk-plugin-webbridge/LICENSE create mode 100644 Adjust/plugins/sdk-plugin-xiaomi-referrer/LICENSE diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/LICENSE b/Adjust/plugins/sdk-plugin-huawei-referrer/LICENSE new file mode 100644 index 000000000..242e5d555 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2012-Present Adjust GmbH, http://www.adjust.com + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Adjust/plugins/sdk-plugin-imei/LICENSE b/Adjust/plugins/sdk-plugin-imei/LICENSE new file mode 100644 index 000000000..242e5d555 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-imei/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2012-Present Adjust GmbH, http://www.adjust.com + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Adjust/plugins/sdk-plugin-lvl/LICENSE b/Adjust/plugins/sdk-plugin-lvl/LICENSE new file mode 100644 index 000000000..3f04265d1 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-lvl/LICENSE @@ -0,0 +1,32 @@ +Copyright (c) 2012-Present Adjust GmbH, http://www.adjust.com + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------------------------------- +Third-Party Components and Licenses +----------------------------------- + +This project includes code from the following third-party component(s): + +- Google Licensing Service + Licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) + +The Apache 2.0 license and any required NOTICE file are located in: +[**src/main/aidl/com/android/vending/licensing**](src/main/aidl/com/android/vending/licensing) diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/LICENSE b/Adjust/plugins/sdk-plugin-meta-referrer/LICENSE new file mode 100644 index 000000000..242e5d555 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-meta-referrer/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2012-Present Adjust GmbH, http://www.adjust.com + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Adjust/plugins/sdk-plugin-oaid/LICENSE b/Adjust/plugins/sdk-plugin-oaid/LICENSE new file mode 100644 index 000000000..242e5d555 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-oaid/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2012-Present Adjust GmbH, http://www.adjust.com + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/LICENSE b/Adjust/plugins/sdk-plugin-samsung-clouddev/LICENSE new file mode 100644 index 000000000..242e5d555 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2012-Present Adjust GmbH, http://www.adjust.com + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/LICENSE b/Adjust/plugins/sdk-plugin-samsung-referrer/LICENSE new file mode 100644 index 000000000..242e5d555 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2012-Present Adjust GmbH, http://www.adjust.com + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/LICENSE b/Adjust/plugins/sdk-plugin-vivo-referrer/LICENSE new file mode 100644 index 000000000..242e5d555 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2012-Present Adjust GmbH, http://www.adjust.com + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Adjust/plugins/sdk-plugin-webbridge/LICENSE b/Adjust/plugins/sdk-plugin-webbridge/LICENSE new file mode 100644 index 000000000..242e5d555 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-webbridge/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2012-Present Adjust GmbH, http://www.adjust.com + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/LICENSE b/Adjust/plugins/sdk-plugin-xiaomi-referrer/LICENSE new file mode 100644 index 000000000..242e5d555 --- /dev/null +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2012-Present Adjust GmbH, http://www.adjust.com + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. From ce223f7f6481049b1d28abc3a69b3683ae5c4a2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Mon, 18 Aug 2025 12:33:01 +0200 Subject: [PATCH 406/540] docs: update sdk-plugin-lvl LICENSE --- Adjust/plugins/sdk-plugin-lvl/LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/plugins/sdk-plugin-lvl/LICENSE b/Adjust/plugins/sdk-plugin-lvl/LICENSE index 3f04265d1..01be12cc8 100644 --- a/Adjust/plugins/sdk-plugin-lvl/LICENSE +++ b/Adjust/plugins/sdk-plugin-lvl/LICENSE @@ -29,4 +29,4 @@ This project includes code from the following third-party component(s): Licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) The Apache 2.0 license and any required NOTICE file are located in: -[**src/main/aidl/com/android/vending/licensing**](src/main/aidl/com/android/vending/licensing) +[src/main/aidl/com/android/vending/licensing](./src/main/aidl/com/android/vending/licensing) From 1a2928de7c56a57df650b61768d6188878e5a152 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 18 Aug 2025 12:39:41 +0200 Subject: [PATCH 407/540] docs: update sdk-plugin-lvl LICENSE --- Adjust/plugins/sdk-plugin-lvl/LICENSE | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-lvl/LICENSE b/Adjust/plugins/sdk-plugin-lvl/LICENSE index 01be12cc8..50b720ae3 100644 --- a/Adjust/plugins/sdk-plugin-lvl/LICENSE +++ b/Adjust/plugins/sdk-plugin-lvl/LICENSE @@ -26,7 +26,6 @@ Third-Party Components and Licenses This project includes code from the following third-party component(s): - Google Licensing Service - Licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) + Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0) -The Apache 2.0 license and any required NOTICE file are located in: -[src/main/aidl/com/android/vending/licensing](./src/main/aidl/com/android/vending/licensing) +The Apache 2.0 license and any required NOTICE file are located in src/main/aidl/com/android/vending/licensing directory From 2b49b00ba7088479202eb6a22fe604db096826c9 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 18 Aug 2025 12:07:45 +0200 Subject: [PATCH 408/540] fix: adding the License disclaimer to AdjustLicenseVerification.java --- .../adjust/sdk/lvl/AdjustLicenseVerification.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java index 536833225..d91ac0187 100644 --- a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java +++ b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java @@ -1,3 +1,13 @@ +/* +* This project is licensed under the MIT License. +* However, this project includes code from the following third-party component(s): +* - ILicenseResultListener.aidl , ILicensingService.aidl - Licensed under +* the Apache License, Version 2.0 +* http://www.apache.org/licenses/LICENSE-2.0 +* The Apache 2.0 license and any required NOTICE file are included in the +* com.android.vending.licensing directory. +*/ + package com.adjust.sdk.lvl; import android.content.Context; @@ -16,7 +26,7 @@ public static LicenseData fetchLicenseDate(Context context, ILogger logger, long BlockingQueue licenseHolder = new LinkedBlockingQueue(1); LicenseChecker checker = new LicenseChecker(context, new LicenseRawCallback() { @Override - public void onLicenseDataReceived(int responseCode,String signedData, String signature) { + public void onLicenseDataReceived(int responseCode, String signedData, String signature) { licenseHolder.offer(new LicenseData(signedData, signature, responseCode)); } From e62619014aadef154bfbdf6b44ff7865f590c953 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 18 Aug 2025 13:00:09 +0200 Subject: [PATCH 409/540] fix: remove logs check unit test --- .../sdk/lvl/AdjustLicenseVerification.java | 10 --- .../sdk/lvl/LicenseResponseHandlerTest.java | 74 ------------------- 2 files changed, 84 deletions(-) delete mode 100644 Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseResponseHandlerTest.java diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java index d91ac0187..da5ad6a14 100644 --- a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java +++ b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java @@ -1,13 +1,3 @@ -/* -* This project is licensed under the MIT License. -* However, this project includes code from the following third-party component(s): -* - ILicenseResultListener.aidl , ILicensingService.aidl - Licensed under -* the Apache License, Version 2.0 -* http://www.apache.org/licenses/LICENSE-2.0 -* The Apache 2.0 license and any required NOTICE file are included in the -* com.android.vending.licensing directory. -*/ - package com.adjust.sdk.lvl; import android.content.Context; diff --git a/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseResponseHandlerTest.java b/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseResponseHandlerTest.java deleted file mode 100644 index 812db5c4e..000000000 --- a/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseResponseHandlerTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.adjust.sdk.lvl; - -import com.adjust.sdk.ILogger; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import static org.mockito.Mockito.*; - -public class LicenseResponseHandlerTest { - - @Mock LicenseRawCallback mockCallback; - @Mock ILogger mockLogger; - - private LicenseResponseHandler handler; - - @Before - public void setup() { - MockitoAnnotations.openMocks(this); - handler = new LicenseResponseHandler(mockCallback, mockLogger, 3); - } - - @Test - public void testLicensed_response_callsOnSuccess() { - handler.handleResponse(0, "signedData", "signature", 0); - - verify(mockCallback).onLicenseDataReceived(0, "signedData", "signature"); - verifyNoMoreInteractions(mockCallback); - } - - @Test - public void testLicensed_missingSignature_callsError() { - handler.handleResponse(0, null, null, 0); - - verify(mockLogger).error(contains("missing signed data")); - verify(mockCallback).onError(0); - } - - @Test - public void testNotLicensed_callsErrorDirectly() { - handler.handleResponse(1, null, null, 0); - - verify(mockCallback).onError(1); - verify(mockLogger).warn(contains("[LicenseVerification] License check failed: ")); - } - - @Test - public void testTemporaryError_retriesBelowMax() { - boolean shouldRetry = handler.handleResponse(4, null, null, 2); - - verify(mockLogger).warn(contains("Retry attempt [3]"), eq(4)); - verify(mockCallback, never()).onError(anyInt()); - assert(shouldRetry); - } - - @Test - public void testTemporaryError_retriesExceeded_callsError() { - boolean shouldRetry = handler.handleResponse(5, null, null, 3); - - verify(mockLogger).error(contains("after max retries"), eq(5)); - verify(mockCallback).onError(5); - assert(!shouldRetry); - } - - @Test - public void testUnexpectedCode_callsError() { - handler.handleResponse(999, "X", "Y", 0); - - verify(mockLogger).error(contains("Unexpected response code"), eq(999)); - verify(mockCallback).onError(999); - } -} From 8a3b11f90b85c4c18a9d70547182cb23b6427d03 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 18 Aug 2025 13:02:52 +0200 Subject: [PATCH 410/540] clean: fix the generateNonce comment --- .../src/main/java/com/adjust/sdk/lvl/LicenseChecker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java index 32b39ca7d..bc57a8fc3 100644 --- a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java @@ -100,7 +100,7 @@ public void verifyLicense(int responseCode, String signedData, String signature) /** * Generates a 64-bit nonce with: - * - 56-bit reduced timestamp (in seconds) stored in bits 8–63 + * - 56-bit reduced timestamp (in milliseconds) stored in bits 8–63 * - 8-bit reserved field in bits 0–7 (currently using 0x01 as version marker) */ public static long generateNonce(long timestamp) { From 8238da9d9c1bd57ce5dfe24268c086202104afb9 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 16 Sep 2025 12:22:10 +0200 Subject: [PATCH 411/540] refac: refactoring the artifact name and also module name --- .../{sdk-plugin-lvl => sdk-plugin-google-lvl}/.gitignore | 0 .../plugins/{sdk-plugin-lvl => sdk-plugin-google-lvl}/LICENSE | 0 .../{sdk-plugin-lvl => sdk-plugin-google-lvl}/build.gradle | 2 +- .../proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../com/android/vending/licensing/ILicenseResultListener.aidl | 0 .../aidl/com/android/vending/licensing/ILicensingService.aidl | 0 .../main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java | 0 .../src/main/java/com/adjust/sdk/lvl/LicenseChecker.java | 0 .../src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java | 0 .../main/java/com/adjust/sdk/lvl/LicenseResponseHandler.java | 0 .../src/main/java/com/adjust/sdk/lvl/Util.java | 0 .../src/test/java/com/adjust/sdk/ILogger.java | 0 .../java/com/adjust/sdk/lvl/LicenseCheckerIntegrationTest.java | 0 .../test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java | 0 Adjust/settings.gradle | 2 +- 16 files changed, 2 insertions(+), 2 deletions(-) rename Adjust/plugins/{sdk-plugin-lvl => sdk-plugin-google-lvl}/.gitignore (100%) rename Adjust/plugins/{sdk-plugin-lvl => sdk-plugin-google-lvl}/LICENSE (100%) rename Adjust/plugins/{sdk-plugin-lvl => sdk-plugin-google-lvl}/build.gradle (99%) rename Adjust/plugins/{sdk-plugin-lvl => sdk-plugin-google-lvl}/proguard-rules.pro (100%) rename Adjust/plugins/{sdk-plugin-lvl => sdk-plugin-google-lvl}/src/main/AndroidManifest.xml (100%) rename Adjust/plugins/{sdk-plugin-lvl => sdk-plugin-google-lvl}/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl (100%) rename Adjust/plugins/{sdk-plugin-lvl => sdk-plugin-google-lvl}/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl (100%) rename Adjust/plugins/{sdk-plugin-lvl => sdk-plugin-google-lvl}/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java (100%) rename Adjust/plugins/{sdk-plugin-lvl => sdk-plugin-google-lvl}/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java (100%) rename Adjust/plugins/{sdk-plugin-lvl => sdk-plugin-google-lvl}/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java (100%) rename Adjust/plugins/{sdk-plugin-lvl => sdk-plugin-google-lvl}/src/main/java/com/adjust/sdk/lvl/LicenseResponseHandler.java (100%) rename Adjust/plugins/{sdk-plugin-lvl => sdk-plugin-google-lvl}/src/main/java/com/adjust/sdk/lvl/Util.java (100%) rename Adjust/plugins/{sdk-plugin-lvl => sdk-plugin-google-lvl}/src/test/java/com/adjust/sdk/ILogger.java (100%) rename Adjust/plugins/{sdk-plugin-lvl => sdk-plugin-google-lvl}/src/test/java/com/adjust/sdk/lvl/LicenseCheckerIntegrationTest.java (100%) rename Adjust/plugins/{sdk-plugin-lvl => sdk-plugin-google-lvl}/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java (100%) diff --git a/Adjust/plugins/sdk-plugin-lvl/.gitignore b/Adjust/plugins/sdk-plugin-google-lvl/.gitignore similarity index 100% rename from Adjust/plugins/sdk-plugin-lvl/.gitignore rename to Adjust/plugins/sdk-plugin-google-lvl/.gitignore diff --git a/Adjust/plugins/sdk-plugin-lvl/LICENSE b/Adjust/plugins/sdk-plugin-google-lvl/LICENSE similarity index 100% rename from Adjust/plugins/sdk-plugin-lvl/LICENSE rename to Adjust/plugins/sdk-plugin-google-lvl/LICENSE diff --git a/Adjust/plugins/sdk-plugin-lvl/build.gradle b/Adjust/plugins/sdk-plugin-google-lvl/build.gradle similarity index 99% rename from Adjust/plugins/sdk-plugin-lvl/build.gradle rename to Adjust/plugins/sdk-plugin-google-lvl/build.gradle index 60150c2f9..7fc3fc030 100644 --- a/Adjust/plugins/sdk-plugin-lvl/build.gradle +++ b/Adjust/plugins/sdk-plugin-google-lvl/build.gradle @@ -114,7 +114,7 @@ afterEvaluate { mavenAndroidLvlAar(MavenPublication) { customizePomForAar(pom) groupId rootProject.ext.adjustGroupId - artifactId 'adjust-android-license-verification' + artifactId 'adjust-android-google-lvl' version rootProject.ext.coreVersionName artifact("$buildDir/outputs/aar/sdk-plugin-lvl-release.aar") { diff --git a/Adjust/plugins/sdk-plugin-lvl/proguard-rules.pro b/Adjust/plugins/sdk-plugin-google-lvl/proguard-rules.pro similarity index 100% rename from Adjust/plugins/sdk-plugin-lvl/proguard-rules.pro rename to Adjust/plugins/sdk-plugin-google-lvl/proguard-rules.pro diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/AndroidManifest.xml b/Adjust/plugins/sdk-plugin-google-lvl/src/main/AndroidManifest.xml similarity index 100% rename from Adjust/plugins/sdk-plugin-lvl/src/main/AndroidManifest.xml rename to Adjust/plugins/sdk-plugin-google-lvl/src/main/AndroidManifest.xml diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl b/Adjust/plugins/sdk-plugin-google-lvl/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl similarity index 100% rename from Adjust/plugins/sdk-plugin-lvl/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl rename to Adjust/plugins/sdk-plugin-google-lvl/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl b/Adjust/plugins/sdk-plugin-google-lvl/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl similarity index 100% rename from Adjust/plugins/sdk-plugin-lvl/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl rename to Adjust/plugins/sdk-plugin-google-lvl/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java similarity index 100% rename from Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java rename to Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java similarity index 100% rename from Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java rename to Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java similarity index 100% rename from Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java rename to Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseResponseHandler.java b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/LicenseResponseHandler.java similarity index 100% rename from Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/LicenseResponseHandler.java rename to Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/LicenseResponseHandler.java diff --git a/Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/Util.java b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/Util.java similarity index 100% rename from Adjust/plugins/sdk-plugin-lvl/src/main/java/com/adjust/sdk/lvl/Util.java rename to Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/Util.java diff --git a/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/ILogger.java b/Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/ILogger.java similarity index 100% rename from Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/ILogger.java rename to Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/ILogger.java diff --git a/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerIntegrationTest.java b/Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerIntegrationTest.java similarity index 100% rename from Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerIntegrationTest.java rename to Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerIntegrationTest.java diff --git a/Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java b/Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java similarity index 100% rename from Adjust/plugins/sdk-plugin-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java rename to Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java diff --git a/Adjust/settings.gradle b/Adjust/settings.gradle index 6a4226e18..9fc1cffee 100644 --- a/Adjust/settings.gradle +++ b/Adjust/settings.gradle @@ -9,7 +9,7 @@ include ':plugins:sdk-plugin-vivo-referrer' include ':plugins:sdk-plugin-samsung-clouddev' include ':plugins:sdk-plugin-huawei-referrer' include ':plugins:sdk-plugin-meta-referrer' -include ':plugins:sdk-plugin-lvl' +include ':plugins:sdk-plugin-google-lvl' include ':tests:test-options' include ':tests:test-library' From be62a68172eea93bf66bf2abb0297aaef9a9b969 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 16 Sep 2025 12:43:52 +0200 Subject: [PATCH 412/540] refac: refactoring the lvl package to google.lvl --- Adjust/plugins/sdk-plugin-google-lvl/build.gradle | 8 ++++---- .../sdk/{ => google}/lvl/AdjustLicenseVerification.java | 2 +- .../com/adjust/sdk/{ => google}/lvl/LicenseChecker.java | 2 +- .../adjust/sdk/{ => google}/lvl/LicenseRawCallback.java | 2 +- .../sdk/{ => google}/lvl/LicenseResponseHandler.java | 2 +- .../main/java/com/adjust/sdk/{ => google}/lvl/Util.java | 2 +- .../{ => google}/lvl/LicenseCheckerIntegrationTest.java | 4 +++- .../sdk/{ => google}/lvl/LicenseCheckerNonceTest.java | 4 +++- .../sdk-core/src/main/java/com/adjust/sdk/Reflection.java | 2 +- 9 files changed, 16 insertions(+), 12 deletions(-) rename Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/{ => google}/lvl/AdjustLicenseVerification.java (97%) rename Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/{ => google}/lvl/LicenseChecker.java (99%) rename Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/{ => google}/lvl/LicenseRawCallback.java (82%) rename Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/{ => google}/lvl/LicenseResponseHandler.java (98%) rename Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/{ => google}/lvl/Util.java (90%) rename Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/{ => google}/lvl/LicenseCheckerIntegrationTest.java (93%) rename Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/{ => google}/lvl/LicenseCheckerNonceTest.java (96%) diff --git a/Adjust/plugins/sdk-plugin-google-lvl/build.gradle b/Adjust/plugins/sdk-plugin-google-lvl/build.gradle index 7fc3fc030..3d780feed 100644 --- a/Adjust/plugins/sdk-plugin-google-lvl/build.gradle +++ b/Adjust/plugins/sdk-plugin-google-lvl/build.gradle @@ -20,7 +20,7 @@ android { minSdkVersion rootProject.ext.coreMinSdkVersion targetSdkVersion rootProject.ext.coreTargetSdkVersion } - namespace 'com.adjust.sdk.lvl' + namespace 'com.adjust.sdk.google.lvl' sourceSets { main { aidl { @@ -68,9 +68,9 @@ task adjustLvlPluginAar(type: Copy) { dependsOn 'assembleRelease' from('build/outputs/aar/') - include 'sdk-plugin-lvl-release.aar' + include 'sdk-plugin-google-lvl-release.aar' destinationDir file('build/libs/') - rename 'sdk-plugin-lvl-release.aar', "${project.name}.aar" + rename 'sdk-plugin-google-lvl-release.aar', "${project.name}.aar" } @@ -117,7 +117,7 @@ afterEvaluate { artifactId 'adjust-android-google-lvl' version rootProject.ext.coreVersionName - artifact("$buildDir/outputs/aar/sdk-plugin-lvl-release.aar") { + artifact("$buildDir/outputs/aar/sdk-plugin-google-lvl-release.aar") { builtBy tasks.getByPath("adjustLvlPluginAar") } artifact adjustLvlPluginSourcesJar diff --git a/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/AdjustLicenseVerification.java similarity index 97% rename from Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java rename to Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/AdjustLicenseVerification.java index da5ad6a14..6a147cfda 100644 --- a/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/AdjustLicenseVerification.java +++ b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/AdjustLicenseVerification.java @@ -1,4 +1,4 @@ -package com.adjust.sdk.lvl; +package com.adjust.sdk.google.lvl; import android.content.Context; diff --git a/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseChecker.java similarity index 99% rename from Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java rename to Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseChecker.java index bc57a8fc3..72dc9aee6 100644 --- a/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseChecker.java @@ -1,4 +1,4 @@ -package com.adjust.sdk.lvl; +package com.adjust.sdk.google.lvl; import android.content.ComponentName; import android.content.Context; diff --git a/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseRawCallback.java similarity index 82% rename from Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java rename to Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseRawCallback.java index 536477a67..c3e58dafe 100644 --- a/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/LicenseRawCallback.java +++ b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseRawCallback.java @@ -1,4 +1,4 @@ -package com.adjust.sdk.lvl; +package com.adjust.sdk.google.lvl; public interface LicenseRawCallback { void onLicenseDataReceived(int responseCode, String signedData, String signature); diff --git a/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/LicenseResponseHandler.java b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseResponseHandler.java similarity index 98% rename from Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/LicenseResponseHandler.java rename to Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseResponseHandler.java index 879016cee..13b7825c1 100644 --- a/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/LicenseResponseHandler.java +++ b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseResponseHandler.java @@ -1,4 +1,4 @@ -package com.adjust.sdk.lvl; +package com.adjust.sdk.google.lvl; import com.adjust.sdk.ILogger; diff --git a/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/Util.java b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/Util.java similarity index 90% rename from Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/Util.java rename to Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/Util.java index 0d32870b5..9053673af 100644 --- a/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/lvl/Util.java +++ b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/Util.java @@ -1,4 +1,4 @@ -package com.adjust.sdk.lvl; +package com.adjust.sdk.google.lvl; import android.content.Context; diff --git a/Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerIntegrationTest.java b/Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/google/lvl/LicenseCheckerIntegrationTest.java similarity index 93% rename from Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerIntegrationTest.java rename to Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/google/lvl/LicenseCheckerIntegrationTest.java index 0f38839c9..4e44e6fa3 100644 --- a/Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerIntegrationTest.java +++ b/Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/google/lvl/LicenseCheckerIntegrationTest.java @@ -1,4 +1,4 @@ -package com.adjust.sdk.lvl; +package com.adjust.sdk.google.lvl; import android.content.ComponentName; import android.content.Context; @@ -8,6 +8,8 @@ import android.os.RemoteException; import com.adjust.sdk.ILogger; +import com.adjust.sdk.google.lvl.LicenseChecker; +import com.adjust.sdk.google.lvl.LicenseRawCallback; import com.android.vending.licensing.ILicenseResultListener; import com.android.vending.licensing.ILicensingService; diff --git a/Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java b/Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/google/lvl/LicenseCheckerNonceTest.java similarity index 96% rename from Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java rename to Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/google/lvl/LicenseCheckerNonceTest.java index a97955807..78ab6faf2 100644 --- a/Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/lvl/LicenseCheckerNonceTest.java +++ b/Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/google/lvl/LicenseCheckerNonceTest.java @@ -1,9 +1,11 @@ -package com.adjust.sdk.lvl; +package com.adjust.sdk.google.lvl; import org.junit.Test; import static org.junit.Assert.*; +import com.adjust.sdk.google.lvl.LicenseChecker; + public class LicenseCheckerNonceTest { @Test diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java index 5cacca7aa..bc9d715b0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java @@ -74,7 +74,7 @@ public static ReferrerDetails getMetaReferrer(Context context, String fbAppId, I public static LicenseData getLicenseRequiredData(Context context, ILogger logger, long timestamp) { LicenseData licenseData = null; try { - licenseData = (LicenseData) invokeStaticMethod("com.adjust.sdk.lvl.Util", + licenseData = (LicenseData) invokeStaticMethod("com.adjust.sdk.google.lvl.Util", "getLicenseRequiredData", new Class[]{Context.class, ILogger.class, long.class}, context, logger, timestamp); From 0529b71cb1828b2c4dd4e83df19a986fd0de2bdc Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 17 Sep 2025 10:06:43 +0200 Subject: [PATCH 413/540] feat: add initiating & originating install source params in session request --- .../main/java/com/adjust/sdk/DeviceInfo.java | 4 +++ .../java/com/adjust/sdk/PackageBuilder.java | 2 ++ .../java/com/adjust/sdk/StoreInfoUtil.java | 28 +++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 045424490..cf997d944 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -102,6 +102,8 @@ class DeviceInfo { String mnc; AdjustStoreInfo storeInfoFromClient; String storeIdFromSystem; + String initiatingPackageName; + String originatingPackageName; DeviceInfo(AdjustConfig adjustConfig) { Context context = adjustConfig.context; @@ -141,6 +143,8 @@ class DeviceInfo { } storeInfoFromClient = StoreInfoUtil.getStoreInfoFromClient(adjustConfig, context); storeIdFromSystem = StoreInfoUtil.getStoreIdFromSystem(context); + initiatingPackageName = StoreInfoUtil.getInitiatingPackageName(context); + originatingPackageName = StoreInfoUtil.getOriginatingPackageName(context); } void reloadPlayIds(final AdjustConfig adjustConfig) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 8f6a75ab0..a982b1c8a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -1268,6 +1268,8 @@ private void injectStoreInfoToParameters(Map parameters) { PackageBuilder.addString(parameters, "store_app_id_from_client", deviceInfo.storeInfoFromClient.storeAppId); } PackageBuilder.addString(parameters, "store_name_from_system", deviceInfo.storeIdFromSystem); + PackageBuilder.addString(parameters, "initiating_package_name", deviceInfo.initiatingPackageName); + PackageBuilder.addString(parameters, "originating_package_name", deviceInfo.originatingPackageName); } public static void addString(Map parameters, String key, String value) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java index 7eb419d94..0ca8436a4 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java @@ -48,4 +48,32 @@ public static AdjustStoreInfo getStoreInfoFromClient(final AdjustConfig adjustCo return adjustConfig.storeInfo; } } + + public static String getInitiatingPackageName(final Context context) { + try { + PackageManager packageManager = context.getPackageManager(); + String packageName = context.getPackageName(); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + InstallSourceInfo installSourceInfo = packageManager.getInstallSourceInfo(packageName); + return installSourceInfo.getInitiatingPackageName(); + } + } catch (Exception e) { + } + return null; + } + + public static String getOriginatingPackageName(final Context context) { + try { + PackageManager packageManager = context.getPackageManager(); + String packageName = context.getPackageName(); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + InstallSourceInfo installSourceInfo = packageManager.getInstallSourceInfo(packageName); + return installSourceInfo.getOriginatingPackageName(); + } + } catch (Exception e) { + } + return null; + } } From c1c5d52c13eb74d1cd265ceac141ad6ed9d793be Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 18 Sep 2025 09:37:25 +0200 Subject: [PATCH 414/540] feat: update version number to 5.4.4 docs: update changelog --- Adjust/build.gradle | 2 +- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-imei/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-oaid/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 2 +- .../plugins/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java | 2 +- CHANGELOG.md | 6 ++++++ VERSION | 2 +- 15 files changed, 20 insertions(+), 14 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index ab493335e..38eda45e0 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 36 coreTargetSdkVersion = 36 - coreVersionName = '5.4.3' + coreVersionName = '5.4.4' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index ddd7e8c6c..58ba203d8 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.3' + // implementation 'com.adjust.sdk:adjust-android:5.4.4' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index 88ffb84f7..c0feef1cf 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.3' + // implementation 'com.adjust.sdk:adjust-android:5.4.4' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index af641f2a4..9a0a5dc86 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.3' + // implementation 'com.adjust.sdk:adjust-android:5.4.4' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index 041721b6f..34edc2c6c 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.3' + // implementation 'com.adjust.sdk:adjust-android:5.4.4' implementation 'com.huawei.hms:ads-identifier:3.4.56.300' } diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index 7a682ae67..a1b16a0f6 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.3' + // implementation 'com.adjust.sdk:adjust-android:5.4.4' // Add Samsung clouddev lib. compileOnly fileTree(include: ['*.aar'], dir: 'libs') diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index e404195f8..d1ccda760 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.3' + // implementation 'com.adjust.sdk:adjust-android:5.4.4' // Add Samsung referrer lib via Maven. implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:3.0.1' diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index 2d2dc108a..f67da67b1 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.3' + // implementation 'com.adjust.sdk:adjust-android:5.4.4' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index 164268b0d..b7f050238 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.3' + // implementation 'com.adjust.sdk:adjust-android:5.4.4' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 4a4d60229..c9105a111 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -295,7 +295,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge5.4.3'; + return 'web-bridge5.4.4'; } }, diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index 7fdc8cd64..6d970c270 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -31,7 +31,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.3' + // implementation 'com.adjust.sdk:adjust-android:5.4.4' // Add xiaomi referrer lib via Maven. implementation 'com.miui.referrer:homereferrer:1.0.0.6' diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index c0b284923..74b74c8f0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -32,7 +32,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.4.3"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.4.4"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 7f4b76d66..b1e078b67 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -38,7 +38,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android5.4.3"; + String CLIENT_SDK = "android5.4.4"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/CHANGELOG.md b/CHANGELOG.md index 738b9a3fc..789c57dee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### Version 5.4.4 (18th September 2025) +#### Added +- Added support to Google License Verification plugin. + +--- + ### Version 5.4.3 (25th August 2025) #### Added - Added support for processing deferred deep links in session responses. diff --git a/VERSION b/VERSION index 6ffbe8ba8..426c1c179 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.4.3 +5.4.4 From 3bd5d9b28047424b754bdd321bb16120143beffb Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 18 Sep 2025 12:17:12 +0200 Subject: [PATCH 415/540] docs: update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 789c57dee..89cd84e9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ### Version 5.4.4 (18th September 2025) #### Added -- Added support to Google License Verification plugin. +- Added support for Google License Verification (LVL). For more details about this feature, refer to the [official documentation](https://dev.adjust.com/en/sdk/android/plugins/google-lvl-plugin). --- From 6b359f69b6707f2374c7e861b33724510bacc9c5 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 1 Oct 2025 12:15:52 +0200 Subject: [PATCH 416/540] fix: declare content provider query for huawei plugin to access to app gallery - api 30+ --- .../src/main/AndroidManifest.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/src/main/AndroidManifest.xml b/Adjust/plugins/sdk-plugin-huawei-referrer/src/main/AndroidManifest.xml index a2f47b605..38548e7f2 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/src/main/AndroidManifest.xml +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/src/main/AndroidManifest.xml @@ -1,2 +1,11 @@ + + + + + + + + + From 31669e415fed3466ffb8758b88ebf243a8db83d0 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 13 Oct 2025 13:22:46 +0200 Subject: [PATCH 417/540] fix: adding "adjust.net.in", "adjust.cn", "adjust.world", "adjust.io" to expectedUrlHostSuffixArray --- .../src/main/java/com/adjust/sdk/AdjustLinkResolution.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustLinkResolution.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustLinkResolution.java index 668fa2080..aa8e4eed6 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustLinkResolution.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustLinkResolution.java @@ -20,7 +20,11 @@ public interface AdjustLinkResolutionCallback { private static final String[] expectedUrlHostSuffixArray = { "adjust.com", "adj.st", - "go.link" + "go.link", + "adjust.net.in", + "adjust.cn", + "adjust.world", + "adjust.io" }; private AdjustLinkResolution() { } From e8c2f683d0c1c609af644fb5b14b7a98beb167f7 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 8 Oct 2025 15:05:42 +0200 Subject: [PATCH 418/540] feat: update signature library version 3.61.0 --- Adjust/examples/example-app-fbpixel/build.gradle | 2 +- Adjust/examples/example-app-java/build.gradle | 2 +- Adjust/examples/example-app-keyboard/build.gradle | 2 +- Adjust/examples/example-app-kotlin/build.gradle | 2 +- Adjust/examples/example-app-tv/build.gradle | 2 +- Adjust/examples/example-app-webbridge/build.gradle | 2 +- Adjust/sdk-core/build.gradle | 2 +- Adjust/tests/test-app-core/build.gradle | 2 +- Adjust/tests/test-app-webbridge/build.gradle | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Adjust/examples/example-app-fbpixel/build.gradle b/Adjust/examples/example-app-fbpixel/build.gradle index 0c0c07b20..022cd12aa 100644 --- a/Adjust/examples/example-app-fbpixel/build.gradle +++ b/Adjust/examples/example-app-fbpixel/build.gradle @@ -35,5 +35,5 @@ dependencies { implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') - implementation 'com.adjust.signature:adjust-android-signature:3.47.0' + implementation 'com.adjust.signature:adjust-android-signature:3.61.0' } diff --git a/Adjust/examples/example-app-java/build.gradle b/Adjust/examples/example-app-java/build.gradle index 52739da43..d8eb9aaac 100644 --- a/Adjust/examples/example-app-java/build.gradle +++ b/Adjust/examples/example-app-java/build.gradle @@ -38,5 +38,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3.47.0' + implementation 'com.adjust.signature:adjust-android-signature:3.61.0' } diff --git a/Adjust/examples/example-app-keyboard/build.gradle b/Adjust/examples/example-app-keyboard/build.gradle index f043c5b57..71c42ea86 100644 --- a/Adjust/examples/example-app-keyboard/build.gradle +++ b/Adjust/examples/example-app-keyboard/build.gradle @@ -38,5 +38,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3.47.0' + implementation 'com.adjust.signature:adjust-android-signature:3.61.0' } diff --git a/Adjust/examples/example-app-kotlin/build.gradle b/Adjust/examples/example-app-kotlin/build.gradle index b2441763e..dc4296b8d 100644 --- a/Adjust/examples/example-app-kotlin/build.gradle +++ b/Adjust/examples/example-app-kotlin/build.gradle @@ -40,5 +40,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3.47.0' + implementation 'com.adjust.signature:adjust-android-signature:3.61.0' } diff --git a/Adjust/examples/example-app-tv/build.gradle b/Adjust/examples/example-app-tv/build.gradle index 52739da43..d8eb9aaac 100755 --- a/Adjust/examples/example-app-tv/build.gradle +++ b/Adjust/examples/example-app-tv/build.gradle @@ -38,5 +38,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3.47.0' + implementation 'com.adjust.signature:adjust-android-signature:3.61.0' } diff --git a/Adjust/examples/example-app-webbridge/build.gradle b/Adjust/examples/example-app-webbridge/build.gradle index 2f103eaef..31a6c3385 100644 --- a/Adjust/examples/example-app-webbridge/build.gradle +++ b/Adjust/examples/example-app-webbridge/build.gradle @@ -33,5 +33,5 @@ dependencies { implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') - implementation 'com.adjust.signature:adjust-android-signature:3.47.0' + implementation 'com.adjust.signature:adjust-android-signature:3.61.0' } diff --git a/Adjust/sdk-core/build.gradle b/Adjust/sdk-core/build.gradle index f47c729e2..4a0ba57f7 100644 --- a/Adjust/sdk-core/build.gradle +++ b/Adjust/sdk-core/build.gradle @@ -220,7 +220,7 @@ def customizePomForAar(pom) { dependency { groupId 'com.adjust.signature' artifactId 'adjust-android-signature' - version '3.47.0' + version '3.61.0' scope 'compile' } } diff --git a/Adjust/tests/test-app-core/build.gradle b/Adjust/tests/test-app-core/build.gradle index 0462380c1..236939df5 100644 --- a/Adjust/tests/test-app-core/build.gradle +++ b/Adjust/tests/test-app-core/build.gradle @@ -30,7 +30,7 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:2.1.1" implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0' implementation 'com.android.installreferrer:installreferrer:2.2' - implementation 'com.adjust.signature:adjust-android-signature:3.47.0' + implementation 'com.adjust.signature:adjust-android-signature:3.61.0' implementation project(':sdk-core') implementation project(':tests:test-options') diff --git a/Adjust/tests/test-app-webbridge/build.gradle b/Adjust/tests/test-app-webbridge/build.gradle index 357492f70..74137f277 100644 --- a/Adjust/tests/test-app-webbridge/build.gradle +++ b/Adjust/tests/test-app-webbridge/build.gradle @@ -32,7 +32,7 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:2.1.1" implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0' implementation 'com.android.installreferrer:installreferrer:2.2' - implementation 'com.adjust.signature:adjust-android-signature:3.47.0' + implementation 'com.adjust.signature:adjust-android-signature:3.61.0' implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') From 30910548063ef830d5a33db789dbb2f2606f52ba Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 8 Oct 2025 15:09:02 +0200 Subject: [PATCH 419/540] feat: update version number to 5.4.5 --- Adjust/build.gradle | 2 +- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-imei/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-oaid/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java | 2 +- VERSION | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 38eda45e0..4ecb4962c 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 36 coreTargetSdkVersion = 36 - coreVersionName = '5.4.4' + coreVersionName = '5.4.5' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index 58ba203d8..85cd9fdaa 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.4' + // implementation 'com.adjust.sdk:adjust-android:5.4.5' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index c0feef1cf..af352b96a 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.4' + // implementation 'com.adjust.sdk:adjust-android:5.4.5' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index 9a0a5dc86..7ad438ec4 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.4' + // implementation 'com.adjust.sdk:adjust-android:5.4.5' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index 34edc2c6c..f41b41071 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.4' + // implementation 'com.adjust.sdk:adjust-android:5.4.5' implementation 'com.huawei.hms:ads-identifier:3.4.56.300' } diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index a1b16a0f6..684701bdf 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.4' + // implementation 'com.adjust.sdk:adjust-android:5.4.5' // Add Samsung clouddev lib. compileOnly fileTree(include: ['*.aar'], dir: 'libs') diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index d1ccda760..466f5f4f7 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.4' + // implementation 'com.adjust.sdk:adjust-android:5.4.5' // Add Samsung referrer lib via Maven. implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:3.0.1' diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index f67da67b1..702445ffc 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.4' + // implementation 'com.adjust.sdk:adjust-android:5.4.5' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index b7f050238..560ad213d 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.4' + // implementation 'com.adjust.sdk:adjust-android:5.4.5' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index c9105a111..3fc88263d 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -295,7 +295,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge5.4.4'; + return 'web-bridge5.4.5'; } }, diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index 6d970c270..556b6658e 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -31,7 +31,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.4' + // implementation 'com.adjust.sdk:adjust-android:5.4.5' // Add xiaomi referrer lib via Maven. implementation 'com.miui.referrer:homereferrer:1.0.0.6' diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 74b74c8f0..068504c53 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -32,7 +32,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.4.4"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.4.5"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index b1e078b67..f8428393b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -38,7 +38,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android5.4.4"; + String CLIENT_SDK = "android5.4.5"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/VERSION b/VERSION index 426c1c179..8ce222e90 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.4.4 +5.4.5 From e7395bb89239a3cfc3fda0c9bef197658411a7ab Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 8 Oct 2025 15:10:30 +0200 Subject: [PATCH 420/540] docs: update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89cd84e9e..bc7cf9213 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### Version 5.4.5 (8th October 2025) +#### Changed +- Updated the Adjust Signature library version to 3.61.0. + +--- + ### Version 5.4.4 (18th September 2025) #### Added - Added support for Google License Verification (LVL). For more details about this feature, refer to the [official documentation](https://dev.adjust.com/en/sdk/android/plugins/google-lvl-plugin). From 5c0be7e74402677f43381f1b03b6daf735f4c7dc Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 22 Oct 2025 12:13:08 +0200 Subject: [PATCH 421/540] build: update publishing url in lvl plugin build gradle --- Adjust/plugins/sdk-plugin-google-lvl/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-google-lvl/build.gradle b/Adjust/plugins/sdk-plugin-google-lvl/build.gradle index 3d780feed..c9ddc7754 100644 --- a/Adjust/plugins/sdk-plugin-google-lvl/build.gradle +++ b/Adjust/plugins/sdk-plugin-google-lvl/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'signing' repositories { maven { - url "https://oss.sonatype.org/content/repositories/staging/" + url "https://central.sonatype.com/repository/maven-snapshots/" } } @@ -128,9 +128,9 @@ afterEvaluate { maven { if (rootProject.ext.coreVersionName.toString().contains('SNAPSHOT')) { println "Using Maven SNAPSHOT repository for publishing" - url "https://oss.sonatype.org/content/repositories/snapshots/" + url "https://central.sonatype.com/repository/maven-snapshots/" } else { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + url "https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2" } if (project.hasProperty("sonatypeUsername")) { credentials { From 16828433f9718dc163626e3ee7d919250e2db343 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 23 Oct 2025 10:48:03 +0200 Subject: [PATCH 422/540] docs: update changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc7cf9213..bcacf40d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ -### Version 5.4.5 (8th October 2025) +### Version 5.4.5 (23rd October 2025) #### Changed - Updated the Adjust Signature library version to 3.61.0. +- Updated Link Resolution logic to resolve Adjust deep links with URL strategy domains. --- From 405fd49e921d33606062687f02ff02704b800fe3 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 23 Oct 2025 13:56:13 +0200 Subject: [PATCH 423/540] docs: update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bcacf40d7..d7c0fdf65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ ### Version 5.4.5 (23rd October 2025) #### Changed - Updated the Adjust Signature library version to 3.61.0. -- Updated Link Resolution logic to resolve Adjust deep links with URL strategy domains. +- Updated link resolution logic to include new Adjust domains where link resolution ends. --- From 6207e1a6e2d43eb27e23a4561befdbc928eff3d1 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 27 Oct 2025 16:59:29 +0100 Subject: [PATCH 424/540] fix: using the raw binder instead of AIDL ipc for retrieving the lvl data --- .../examples/example-app-kotlin/build.gradle | 2 + .../sdk-plugin-google-lvl/proguard-rules.pro | 6 +- .../licensing/ILicenseResultListener.aidl | 21 ---- .../vending/licensing/ILicensingService.aidl | 23 ---- .../adjust/sdk/google/lvl/LicenseChecker.java | 100 +++++++++++++++--- .../lvl/LicenseCheckerIntegrationTest.java | 40 +++++-- 6 files changed, 119 insertions(+), 73 deletions(-) delete mode 100644 Adjust/plugins/sdk-plugin-google-lvl/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl delete mode 100644 Adjust/plugins/sdk-plugin-google-lvl/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl diff --git a/Adjust/examples/example-app-kotlin/build.gradle b/Adjust/examples/example-app-kotlin/build.gradle index dc4296b8d..d79541247 100644 --- a/Adjust/examples/example-app-kotlin/build.gradle +++ b/Adjust/examples/example-app-kotlin/build.gradle @@ -40,5 +40,7 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') + implementation project(':plugins:sdk-plugin-google-lvl') + implementation 'com.adjust.signature:adjust-android-signature:3.61.0' } diff --git a/Adjust/plugins/sdk-plugin-google-lvl/proguard-rules.pro b/Adjust/plugins/sdk-plugin-google-lvl/proguard-rules.pro index c3806c93a..4a9685c4a 100644 --- a/Adjust/plugins/sdk-plugin-google-lvl/proguard-rules.pro +++ b/Adjust/plugins/sdk-plugin-google-lvl/proguard-rules.pro @@ -23,11 +23,7 @@ # Keep all classes in the LVL licensing AIDL package -keep class com.android.vending.licensing.** { *; } -# Keep interface method signatures --keep interface com.android.vending.licensing.ILicensingService --keep interface com.android.vending.licensing.ILicenseResultListener - # Prevent obfuscation of the stub classes used for IPC -keepclassmembers class * implements android.os.IInterface { ; -} \ No newline at end of file +} diff --git a/Adjust/plugins/sdk-plugin-google-lvl/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl b/Adjust/plugins/sdk-plugin-google-lvl/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl deleted file mode 100644 index 869cb16f6..000000000 --- a/Adjust/plugins/sdk-plugin-google-lvl/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.vending.licensing; - -oneway interface ILicenseResultListener { - void verifyLicense(int responseCode, String signedData, String signature); -} diff --git a/Adjust/plugins/sdk-plugin-google-lvl/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl b/Adjust/plugins/sdk-plugin-google-lvl/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl deleted file mode 100644 index 9541a2090..000000000 --- a/Adjust/plugins/sdk-plugin-google-lvl/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.vending.licensing; - -import com.android.vending.licensing.ILicenseResultListener; - -oneway interface ILicensingService { - void checkLicense(long nonce, String packageName, in ILicenseResultListener listener); -} diff --git a/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseChecker.java index 72dc9aee6..19cc29c8d 100644 --- a/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseChecker.java @@ -4,21 +4,27 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; +import android.os.Binder; import android.os.IBinder; +import android.os.IInterface; +import android.os.Parcel; import android.os.RemoteException; import com.adjust.sdk.ILogger; -import com.android.vending.licensing.ILicensingService; public class LicenseChecker { private static final String GOOGLE_PLAY_PACKAGE = "com.android.vending"; + private static final String LICENSING_SERVICE_DESCRIPTOR = "com.android.vending.licensing.ILicensingService"; + private static final String RESULT_LISTENER_DESCRIPTOR = "com.android.vending.licensing.ILicenseResultListener"; + private static final int TRANSACTION_CHECK_LICENSE = IBinder.FIRST_CALL_TRANSACTION; private final Context mContext; private final LicenseRawCallback mCallback; private final ILogger logger; private final long timestamp; + private final ResultListenerBinder resultListenerBinder = new ResultListenerBinder(); - private ILicensingService mService; + private IBinder mServiceBinder; private boolean mBound; private int retryCount = 0; private static final int MAX_RETRIES = 3; @@ -54,7 +60,7 @@ public void onDestroy() { @Override public void onServiceConnected(ComponentName name, IBinder service) { logger.debug("LVL service connected"); - mService = ILicensingService.Stub.asInterface(service); + mServiceBinder = service; mBound = true; retryCount = 0; executeLicenseCheck(); @@ -63,38 +69,98 @@ public void onServiceConnected(ComponentName name, IBinder service) { @Override public void onServiceDisconnected(ComponentName name) { logger.debug("LVL service disconnected"); - mService = null; + mServiceBinder = null; mBound = false; } }; private void executeLicenseCheck() { try { + if (mServiceBinder == null) { + logger.error("LVL binder unavailable for license check"); + mCallback.onError(-1); + return; + } + String packageName = mContext.getPackageName(); long nonce = generateNonce(timestamp); logger.debug("LVL generated nonce: " + nonce); - mService.checkLicense(nonce, packageName, new ResultListener()); + Parcel data = Parcel.obtain(); + try { + data.writeInterfaceToken(LICENSING_SERVICE_DESCRIPTOR); + data.writeLong(nonce); + data.writeString(packageName); + data.writeStrongBinder(resultListenerBinder); + boolean transacted = mServiceBinder.transact( + TRANSACTION_CHECK_LICENSE, + data, + null, + IBinder.FLAG_ONEWAY + ); + logger.debug("LVL binder transact sent (code " + TRANSACTION_CHECK_LICENSE + "): " + transacted); + if (!transacted) { + logger.error("LVL binder transact failed to enqueue"); + mCallback.onError(-1); + } + } finally { + data.recycle(); + } + } catch (RemoteException e) { + logger.error("LVL remote exception during license check: ", e); + mCallback.onError(-1); } catch (Exception e) { logger.error("LVL license check failed: ", e); mCallback.onError(-1); } } - private class ResultListener extends com.android.vending.licensing.ILicenseResultListener.Stub { + private class ResultListenerBinder extends Binder implements IInterface { + ResultListenerBinder() { + attachInterface(this, RESULT_LISTENER_DESCRIPTOR); + } + @Override - public void verifyLicense(int responseCode, String signedData, String signature) throws RemoteException { - logger.debug("LVL Received license response: " + responseCode); - - LicenseResponseHandler handler = new LicenseResponseHandler(mCallback, logger, MAX_RETRIES); - boolean shouldRetry = handler.handleResponse(responseCode, signedData, signature, retryCount); - if (shouldRetry) { - retryCount++; - logger.debug("LVL retrying license check... Attempt: " + retryCount); - executeLicenseCheck(); - } else { - onDestroy(); + public IBinder asBinder() { + return this; + } + + @Override + protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { + if (code == IBinder.INTERFACE_TRANSACTION) { + if (reply != null) { + reply.writeString(RESULT_LISTENER_DESCRIPTOR); + } + return true; } + + if (code == IBinder.FIRST_CALL_TRANSACTION) { + try { + data.enforceInterface(RESULT_LISTENER_DESCRIPTOR); + int responseCode = data.readInt(); + String signedData = data.readString(); + String signature = data.readString(); + + logger.debug("LVL received license response: " + responseCode); + + LicenseResponseHandler handler = new LicenseResponseHandler(mCallback, logger, MAX_RETRIES); + boolean shouldRetry = handler.handleResponse(responseCode, signedData, signature, retryCount); + if (shouldRetry) { + retryCount++; + logger.debug("LVL retrying license check... Attempt: " + retryCount); + executeLicenseCheck(); + } else { + onDestroy(); + } + return true; + } catch (Exception ex) { + logger.error("LVL failed to process license response: ", ex); + mCallback.onError(-1); + return true; + } + } + + return super.onTransact(code, data, reply, flags); } } diff --git a/Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/google/lvl/LicenseCheckerIntegrationTest.java b/Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/google/lvl/LicenseCheckerIntegrationTest.java index 4e44e6fa3..41c1ad61b 100644 --- a/Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/google/lvl/LicenseCheckerIntegrationTest.java +++ b/Adjust/plugins/sdk-plugin-google-lvl/src/test/java/com/adjust/sdk/google/lvl/LicenseCheckerIntegrationTest.java @@ -3,15 +3,13 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.os.Binder; import android.os.IBinder; import android.content.ServiceConnection; +import android.os.Parcel; import android.os.RemoteException; import com.adjust.sdk.ILogger; -import com.adjust.sdk.google.lvl.LicenseChecker; -import com.adjust.sdk.google.lvl.LicenseRawCallback; -import com.android.vending.licensing.ILicenseResultListener; -import com.android.vending.licensing.ILicensingService; import org.junit.Before; import org.junit.Test; @@ -43,10 +41,38 @@ public void setUp() { public void testSuccessfulLicenseCheck_shouldCallCallback() { doAnswer(invocation -> { ServiceConnection conn = invocation.getArgument(1); - IBinder binder = new ILicensingService.Stub() { + IBinder binder = new Binder() { + private static final String SERVICE_DESCRIPTOR = "com.android.vending.licensing.ILicensingService"; + private static final String LISTENER_DESCRIPTOR = "com.android.vending.licensing.ILicenseResultListener"; + @Override - public void checkLicense(long nonce, String packageName, ILicenseResultListener listener) throws RemoteException { - listener.verifyLicense(0, "signedData", "signature"); + protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { + if (code == IBinder.INTERFACE_TRANSACTION) { + if (reply != null) { + reply.writeString(SERVICE_DESCRIPTOR); + } + return true; + } + + if (code == IBinder.FIRST_CALL_TRANSACTION) { + data.enforceInterface(SERVICE_DESCRIPTOR); + long nonce = data.readLong(); + String packageName = data.readString(); + IBinder listenerBinder = data.readStrongBinder(); + + Parcel response = Parcel.obtain(); + try { + response.writeInterfaceToken(LISTENER_DESCRIPTOR); + response.writeInt(0); + response.writeString("signedData"); + response.writeString("signature"); + listenerBinder.transact(IBinder.FIRST_CALL_TRANSACTION, response, null, IBinder.FLAG_ONEWAY); + } finally { + response.recycle(); + } + return true; + } + return super.onTransact(code, data, reply, flags); } }; conn.onServiceConnected(new ComponentName("com.android.vending", "LicensingService"), binder); From 3afa8ad98175478cb1d99ff4a04e9da7079c44d2 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 29 Oct 2025 13:30:04 +0100 Subject: [PATCH 425/540] fix: initiating the resultListenerBinder in constructor. --- .../main/java/com/adjust/sdk/google/lvl/LicenseChecker.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseChecker.java index 19cc29c8d..71882613f 100644 --- a/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseChecker.java @@ -22,7 +22,7 @@ public class LicenseChecker { private final LicenseRawCallback mCallback; private final ILogger logger; private final long timestamp; - private final ResultListenerBinder resultListenerBinder = new ResultListenerBinder(); + private final ResultListenerBinder resultListenerBinder; private IBinder mServiceBinder; private boolean mBound; @@ -34,6 +34,7 @@ public LicenseChecker(Context context, LicenseRawCallback callback, ILogger logg this.mCallback = callback; this.logger = logger; this.timestamp = timestamp; + this.resultListenerBinder = new ResultListenerBinder(); } public synchronized void checkAccess() { From ad3230b69ea1d16530b4ff6f9ff78f6a0058980f Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 5 Nov 2025 16:37:15 +0100 Subject: [PATCH 426/540] fix: adding specific error based on failure situations adding linkToDeath to detect death proactively --- .../adjust/sdk/google/lvl/LicenseChecker.java | 39 ++++++++++++++++--- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseChecker.java b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseChecker.java index 71882613f..ed645943a 100644 --- a/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseChecker.java +++ b/Adjust/plugins/sdk-plugin-google-lvl/src/main/java/com/adjust/sdk/google/lvl/LicenseChecker.java @@ -18,6 +18,14 @@ public class LicenseChecker { private static final String RESULT_LISTENER_DESCRIPTOR = "com.android.vending.licensing.ILicenseResultListener"; private static final int TRANSACTION_CHECK_LICENSE = IBinder.FIRST_CALL_TRANSACTION; + // Error codes for better diagnostics + private static final int ERROR_GENERIC = -1; + private static final int ERROR_BIND_FAILED = -5; + private static final int ERROR_NO_BINDER = -3; + private static final int ERROR_TRANSACT_FAILED = -2; + private static final int ERROR_REMOTE_EXCEPTION = -4; + private static final int ERROR_BINDER_DIED = -6; + private final Context mContext; private final LicenseRawCallback mCallback; private final ILogger logger; @@ -47,6 +55,11 @@ public synchronized void checkAccess() { serviceIntent.setPackage(GOOGLE_PLAY_PACKAGE); boolean isBind = mContext.bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE); logger.debug("LVL bindService result: " + isBind); + + if (!isBind) { + logger.error("LVL failed to bind licensing service"); + mCallback.onError(ERROR_BIND_FAILED); + } } public void onDestroy() { @@ -55,6 +68,8 @@ public void onDestroy() { mContext.unbindService(mServiceConnection); mBound = false; } + // Ensure binder reference is cleared even if unbind fails + mServiceBinder = null; } private final ServiceConnection mServiceConnection = new ServiceConnection() { @@ -64,6 +79,18 @@ public void onServiceConnected(ComponentName name, IBinder service) { mServiceBinder = service; mBound = true; retryCount = 0; + + // Detect binder death proactively + try { + mServiceBinder.linkToDeath(() -> { + logger.error("LVL binder died unexpectedly"); + mCallback.onError(ERROR_BINDER_DIED); + onDestroy(); + }, 0); + } catch (RemoteException e) { + logger.error("LVL failed to link binder death recipient", e); + } + executeLicenseCheck(); } @@ -79,7 +106,7 @@ private void executeLicenseCheck() { try { if (mServiceBinder == null) { logger.error("LVL binder unavailable for license check"); - mCallback.onError(-1); + mCallback.onError(ERROR_NO_BINDER); return; } @@ -102,17 +129,17 @@ private void executeLicenseCheck() { logger.debug("LVL binder transact sent (code " + TRANSACTION_CHECK_LICENSE + "): " + transacted); if (!transacted) { logger.error("LVL binder transact failed to enqueue"); - mCallback.onError(-1); + mCallback.onError(ERROR_TRANSACT_FAILED); } } finally { data.recycle(); } } catch (RemoteException e) { logger.error("LVL remote exception during license check: ", e); - mCallback.onError(-1); + mCallback.onError(ERROR_REMOTE_EXCEPTION); } catch (Exception e) { logger.error("LVL license check failed: ", e); - mCallback.onError(-1); + mCallback.onError(ERROR_GENERIC); } } @@ -156,7 +183,8 @@ protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) thr return true; } catch (Exception ex) { logger.error("LVL failed to process license response: ", ex); - mCallback.onError(-1); + mCallback.onError(ERROR_GENERIC); + onDestroy(); return true; } } @@ -178,5 +206,4 @@ public static long generateNonce(long timestamp) { // Shift timestamp to occupy bits 8–63, reserve LSB for flags/version return (reducedTimestamp << 8) | 0x01; } - } From 045cb0e4723f9f2a7975d4f36fcebe8a7650ebac Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Fri, 7 Nov 2025 11:21:42 +0100 Subject: [PATCH 427/540] feat: update version number to 5.4.6 docs: update changelog --- Adjust/build.gradle | 2 +- Adjust/examples/example-app-kotlin/build.gradle | 1 - Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-imei/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-oaid/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 2 +- .../plugins/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java | 2 +- CHANGELOG.md | 6 ++++++ VERSION | 2 +- 16 files changed, 20 insertions(+), 15 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 4ecb4962c..810887ec6 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 36 coreTargetSdkVersion = 36 - coreVersionName = '5.4.5' + coreVersionName = '5.4.6' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 diff --git a/Adjust/examples/example-app-kotlin/build.gradle b/Adjust/examples/example-app-kotlin/build.gradle index d79541247..985d785bf 100644 --- a/Adjust/examples/example-app-kotlin/build.gradle +++ b/Adjust/examples/example-app-kotlin/build.gradle @@ -40,7 +40,6 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') - implementation project(':plugins:sdk-plugin-google-lvl') implementation 'com.adjust.signature:adjust-android-signature:3.61.0' } diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index 85cd9fdaa..5a9787c15 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.5' + // implementation 'com.adjust.sdk:adjust-android:5.4.6' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index af352b96a..c995d8ad0 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.5' + // implementation 'com.adjust.sdk:adjust-android:5.4.6' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index 7ad438ec4..fa26fd195 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.5' + // implementation 'com.adjust.sdk:adjust-android:5.4.6' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index f41b41071..3cebb2859 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.5' + // implementation 'com.adjust.sdk:adjust-android:5.4.6' implementation 'com.huawei.hms:ads-identifier:3.4.56.300' } diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index 684701bdf..dc31bc5da 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.5' + // implementation 'com.adjust.sdk:adjust-android:5.4.6' // Add Samsung clouddev lib. compileOnly fileTree(include: ['*.aar'], dir: 'libs') diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index 466f5f4f7..9bc5fff8a 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.5' + // implementation 'com.adjust.sdk:adjust-android:5.4.6' // Add Samsung referrer lib via Maven. implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:3.0.1' diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index 702445ffc..d8b77c964 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.5' + // implementation 'com.adjust.sdk:adjust-android:5.4.6' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index 560ad213d..aef9f8bb9 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.5' + // implementation 'com.adjust.sdk:adjust-android:5.4.6' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 3fc88263d..98e42989e 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -295,7 +295,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge5.4.5'; + return 'web-bridge5.4.6'; } }, diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index 556b6658e..0290bdc30 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -31,7 +31,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.5' + // implementation 'com.adjust.sdk:adjust-android:5.4.6' // Add xiaomi referrer lib via Maven. implementation 'com.miui.referrer:homereferrer:1.0.0.6' diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 068504c53..4ad955b45 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -32,7 +32,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.4.5"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.4.6"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index f8428393b..52e1f5e66 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -38,7 +38,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android5.4.5"; + String CLIENT_SDK = "android5.4.6"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/CHANGELOG.md b/CHANGELOG.md index d7c0fdf65..62b79e237 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### Version 5.4.6 (7th November 2025) +#### Changed +- Refactored LVL plugin to use direct `Binder` interface instead of `AIDL`. + +--- + ### Version 5.4.5 (23rd October 2025) #### Changed - Updated the Adjust Signature library version to 3.61.0. diff --git a/VERSION b/VERSION index 8ce222e90..bb0915fd5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.4.5 +5.4.6 From b4c119d807d678a42bef1e1126b4a0469a67a622 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 22 Jul 2025 09:28:30 +0200 Subject: [PATCH 428/540] feat: add config method to disable reading of appset Id --- .../src/main/java/com/adjust/sdk/AdjustConfig.java | 10 ++++++++++ .../src/main/java/com/adjust/sdk/DeviceInfo.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java | 7 +++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index a02e8875d..637117ee6 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -48,6 +48,7 @@ public class AdjustConfig { ArrayList cachedAttributionReadCallbacks = new ArrayList<>(); boolean isFirstSessionDelayEnabled; AdjustStoreInfo storeInfo; + boolean appSetIdReadingDisabled; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; @@ -86,6 +87,7 @@ private void init(Context context, String appToken, String environment, boolean this.coppaComplianceEnabled = false; this.playStoreKidsComplianceEnabled = false; this.isFirstSessionDelayEnabled = false; + this.appSetIdReadingDisabled = false; } public void setLogLevel(LogLevel logLevel) { @@ -190,6 +192,10 @@ public void setOnDeferredDeeplinkResponseListener(OnDeferredDeeplinkResponseList this.onDeferredDeeplinkResponseListener = onDeferredDeeplinkResponseListener; } + public void disableAppSetIdReading() { + this.appSetIdReadingDisabled = true; + } + public Context getContext() { return context; } @@ -290,6 +296,10 @@ public ILogger getLogger() { return logger; } + public boolean isAppSetIdReadingDisabled() { + return appSetIdReadingDisabled; + } + private boolean checkContext(Context context) { if (context == null) { logger.error("Missing context"); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index cf997d944..bec4d81b5 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -138,7 +138,7 @@ class DeviceInfo { appInstallTime = getAppInstallTime(packageInfo); appUpdateTime = getAppUpdateTime(packageInfo); uiMode = getDeviceUiMode(configuration); - if (Util.canReadPlayIds(adjustConfig)) { + if (Util.canReadAppSetId(adjustConfig)) { appSetId = Reflection.getAppSetId(context); } storeInfoFromClient = StoreInfoUtil.getStoreInfoFromClient(adjustConfig, context); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index 84562f3de..39911a93a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -685,6 +685,13 @@ public static boolean canReadNonPlayIds(final AdjustConfig adjustConfig) { return !adjustConfig.coppaComplianceEnabled && !adjustConfig.playStoreKidsComplianceEnabled; } + public static boolean canReadAppSetId(final AdjustConfig adjustConfig) { + if (adjustConfig.isAppSetIdReadingDisabled()) { + return false; + } + return canReadPlayIds(adjustConfig); + } + public static boolean isGooglePlayGamesForPC(final Context context) { PackageManager pm = context.getPackageManager(); return pm.hasSystemFeature("com.google.android.play.feature.HPE_EXPERIENCE"); From 09fe67926349a9496ff63de1e18535c167ff7146 Mon Sep 17 00:00:00 2001 From: Shashank Suhane <46443728+shashanksu@users.noreply.github.com> Date: Tue, 22 Jul 2025 10:03:11 +0200 Subject: [PATCH 429/540] Update Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Uglješa Erceg --- Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 637117ee6..a32459ca1 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -48,7 +48,7 @@ public class AdjustConfig { ArrayList cachedAttributionReadCallbacks = new ArrayList<>(); boolean isFirstSessionDelayEnabled; AdjustStoreInfo storeInfo; - boolean appSetIdReadingDisabled; + boolean isAppSetIdReadingEnabled; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; From 305ca9a5954eb48d6cba00cba493fc93caeacc35 Mon Sep 17 00:00:00 2001 From: Shashank Suhane <46443728+shashanksu@users.noreply.github.com> Date: Tue, 22 Jul 2025 10:03:21 +0200 Subject: [PATCH 430/540] Update Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Uglješa Erceg --- Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index a32459ca1..bc1c98cea 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -87,7 +87,7 @@ private void init(Context context, String appToken, String environment, boolean this.coppaComplianceEnabled = false; this.playStoreKidsComplianceEnabled = false; this.isFirstSessionDelayEnabled = false; - this.appSetIdReadingDisabled = false; + this.isAppSetIdReadingEnabled = true; } public void setLogLevel(LogLevel logLevel) { From 690ed3d9a4ef4114caeb869c1438e8201ccfa358 Mon Sep 17 00:00:00 2001 From: Shashank Suhane <46443728+shashanksu@users.noreply.github.com> Date: Tue, 22 Jul 2025 10:03:29 +0200 Subject: [PATCH 431/540] Update Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Uglješa Erceg --- Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index bc1c98cea..7cc980a81 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -193,7 +193,7 @@ public void setOnDeferredDeeplinkResponseListener(OnDeferredDeeplinkResponseList } public void disableAppSetIdReading() { - this.appSetIdReadingDisabled = true; + this.isAppSetIdReadingEnabled = false; } public Context getContext() { From 18be7f5c74bf0b737f7a87bf9ac6d7dee228e039 Mon Sep 17 00:00:00 2001 From: Shashank Suhane <46443728+shashanksu@users.noreply.github.com> Date: Tue, 22 Jul 2025 10:03:35 +0200 Subject: [PATCH 432/540] Update Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Uglješa Erceg --- Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 7cc980a81..a6e0179ed 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -296,7 +296,7 @@ public ILogger getLogger() { return logger; } - public boolean isAppSetIdReadingDisabled() { + public boolean isAppSetIdReadingEnabled() { return appSetIdReadingDisabled; } From 5b76e385995a944b94a7ee50e12e296a3e9a9417 Mon Sep 17 00:00:00 2001 From: Shashank Suhane <46443728+shashanksu@users.noreply.github.com> Date: Tue, 22 Jul 2025 10:03:42 +0200 Subject: [PATCH 433/540] Update Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Uglješa Erceg --- Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index a6e0179ed..6e9bc269a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -297,7 +297,7 @@ public ILogger getLogger() { } public boolean isAppSetIdReadingEnabled() { - return appSetIdReadingDisabled; + return isAppSetIdReadingEnabled; } private boolean checkContext(Context context) { From 1b79e18c6ccd1ff79ff681349cca7dc762ce52b0 Mon Sep 17 00:00:00 2001 From: Shashank Suhane <46443728+shashanksu@users.noreply.github.com> Date: Tue, 22 Jul 2025 10:03:50 +0200 Subject: [PATCH 434/540] Update Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Uglješa Erceg --- Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index 39911a93a..dda4df176 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -686,7 +686,7 @@ public static boolean canReadNonPlayIds(final AdjustConfig adjustConfig) { } public static boolean canReadAppSetId(final AdjustConfig adjustConfig) { - if (adjustConfig.isAppSetIdReadingDisabled()) { + if (!adjustConfig.isAppSetIdReadingEnabled()) { return false; } return canReadPlayIds(adjustConfig); From ef60dc7fa966bc358e062ad824813c44ee7e4042 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 22 Jul 2025 13:44:37 +0200 Subject: [PATCH 435/540] feat: add config method to disable reading of appSet Id in webbridge --- .../src/main/assets/adjust_config.js | 5 +++++ .../com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js index c44b494d6..4550816cd 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -53,6 +53,7 @@ function AdjustConfig(appToken, environment, legacy) { this.eventDeduplicationIdsMaxSize = null; this.isFirstSessionDelayEnabled = null; this.storeInfo = null; + this.isAppSetIdReadingEnabled = null; } AdjustConfig.EnvironmentSandbox = 'sandbox'; @@ -248,3 +249,7 @@ AdjustConfig.prototype.enableFirstSessionDelay = function() { AdjustConfig.prototype.setStoreInfo = function(storeInfo) { this.storeInfo = JSON.stringify(storeInfo); }; + +AdjustConfig.prototype.disableAppSetIdReading = function() { + this.isAppSetIdReadingEnabled = false; +}; diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 9fee832cd..57188f849 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -145,6 +145,7 @@ public void initSdk(String adjustConfigString) { Object eventDeduplicationIdsMaxSizeField = jsonAdjustConfig.get("eventDeduplicationIdsMaxSize"); Object isFirstSessionDelayEnabledField = jsonAdjustConfig.get("isFirstSessionDelayEnabled"); Object storeInfoField = jsonAdjustConfig.get("storeInfo"); + Object isAppSetIdReadingEnabledField = jsonAdjustConfig.get("isAppSetIdReadingEnabled"); String appToken = AdjustBridgeUtil.fieldToString(appTokenField); String environment = AdjustBridgeUtil.fieldToString(environmentField); @@ -398,6 +399,14 @@ public boolean launchReceivedDeeplink(Uri deeplink) { AdjustFactory.getLogger().error("AdjustBridgeInstance storeInfo: %s", e.getMessage()); } + // AppSetId reading + Boolean isAppSetIdReadingEnabled = AdjustBridgeUtil.fieldToBoolean(isAppSetIdReadingEnabledField); + if (isAppSetIdReadingEnabled != null) { + if (!isAppSetIdReadingEnabled) { + adjustConfig.disableAppSetIdReading(); + } + } + Adjust.initSdk(adjustConfig); isInitialized = true; From 07caedd1a31f4000089af4183dd14fd22c683ebf Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 22 Jul 2025 14:08:50 +0200 Subject: [PATCH 436/540] feat: add feature flag for appSetId reading disabled --- .../sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index a982b1c8a..fb4ef1cd5 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -1260,6 +1260,10 @@ private void injectFeatureFlagsWithParameters(Map parameters) { if (firstSessionDelayManager.wasSet()) { PackageBuilder.addBoolean(parameters, "ff_first_session_delay", true); } + + if (!adjustConfig.isAppSetIdReadingEnabled) { + PackageBuilder.addBoolean(parameters, "ff_app_set_id_disabled", true); + } } private void injectStoreInfoToParameters(Map parameters) { From 52d501d3d00a808e4fd9458160c1a626da08fa8d Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 23 Jul 2025 10:50:10 +0200 Subject: [PATCH 437/540] test: add changes to disable appset Id reading --- Adjust/tests/test-app-core/build.gradle | 1 + .../java/com/adjust/testapp/AdjustCommandExecutor.java | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/Adjust/tests/test-app-core/build.gradle b/Adjust/tests/test-app-core/build.gradle index 236939df5..c7122a116 100644 --- a/Adjust/tests/test-app-core/build.gradle +++ b/Adjust/tests/test-app-core/build.gradle @@ -31,6 +31,7 @@ dependencies { implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0' implementation 'com.android.installreferrer:installreferrer:2.2' implementation 'com.adjust.signature:adjust-android-signature:3.61.0' + implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') implementation project(':tests:test-options') diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index eb9c70b1c..7b2074641 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -488,6 +488,14 @@ public boolean launchReceivedDeeplink(Uri deeplink) { adjustConfig.enableFirstSessionDelay(); } } + + if (command.containsParameter("appSetIdReadingEnabled")) { + String appSetIdReadingEnabledS = command.getFirstParameterValue("appSetIdReadingEnabled"); + boolean appSetIdReadingDisabled = "false".equals(appSetIdReadingEnabledS); + if (appSetIdReadingDisabled) { + adjustConfig.disableAppSetIdReading(); + } + } } private void start() { From c0bffe488079dba97e7897f32442533e985b7541 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 30 Sep 2025 15:40:25 +0200 Subject: [PATCH 438/540] feat: add timeout while waiting to read app set id --- .../sdk-core/src/main/java/com/adjust/sdk/Reflection.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java index bc9d715b0..df75dbe7d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java @@ -1,11 +1,13 @@ package com.adjust.sdk; import android.content.Context; +import android.util.Log; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Map; +import java.util.concurrent.TimeUnit; public class Reflection { public static Object getAdvertisingInfoObject(Context context) throws Exception { @@ -157,8 +159,8 @@ public static String getAppSetId(Context context) { Object appSetInfoObject = invokeStaticMethod("com.google.android.gms.tasks.Tasks", "await", - new Class[]{forName("com.google.android.gms.tasks.Task")}, - taskWithAppSetInfoObject); + new Class[]{forName("com.google.android.gms.tasks.Task"), long.class, TimeUnit.class}, + taskWithAppSetInfoObject, 1L, TimeUnit.SECONDS); return (String) invokeInstanceMethod(appSetInfoObject, "getId", null); From afe1d80831888a4a8a22d9cab5183aa83fc34bc4 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 30 Sep 2025 15:42:34 +0200 Subject: [PATCH 439/540] refactor: cleanup --- Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java index df75dbe7d..03f07ff72 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java @@ -1,7 +1,6 @@ package com.adjust.sdk; import android.content.Context; -import android.util.Log; import java.lang.reflect.Constructor; import java.lang.reflect.Field; From 202ac04bea9637ddc5f5e2bcb65e8f09fd4b3751 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 24 Nov 2025 12:52:37 +0100 Subject: [PATCH 440/540] refactor: coding consistencies while using appset Id reading flag --- Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java | 2 +- .../main/java/com/adjust/testapp/AdjustCommandExecutor.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index dda4df176..114c2c14f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -686,7 +686,7 @@ public static boolean canReadNonPlayIds(final AdjustConfig adjustConfig) { } public static boolean canReadAppSetId(final AdjustConfig adjustConfig) { - if (!adjustConfig.isAppSetIdReadingEnabled()) { + if (!adjustConfig.isAppSetIdReadingEnabled) { return false; } return canReadPlayIds(adjustConfig); diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 7b2074641..36cfaf677 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -491,8 +491,8 @@ public boolean launchReceivedDeeplink(Uri deeplink) { if (command.containsParameter("appSetIdReadingEnabled")) { String appSetIdReadingEnabledS = command.getFirstParameterValue("appSetIdReadingEnabled"); - boolean appSetIdReadingDisabled = "false".equals(appSetIdReadingEnabledS); - if (appSetIdReadingDisabled) { + boolean appSetIdReadingEnabled = "true".equals(appSetIdReadingEnabledS); + if (!appSetIdReadingEnabled) { adjustConfig.disableAppSetIdReading(); } } From 1791dd9470af458d26d3b7670fa24e5310d93c28 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 25 Nov 2025 11:29:47 +0100 Subject: [PATCH 441/540] test: add ability to test sdk version getter --- .../java/com/adjust/testapp/AdjustCommandExecutor.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 36cfaf677..dddf9d886 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -34,6 +34,7 @@ import com.adjust.sdk.OnEventTrackingSucceededListener; import com.adjust.sdk.OnLastDeeplinkReadListener; import com.adjust.sdk.OnPurchaseVerificationFinishedListener; +import com.adjust.sdk.OnSdkVersionReadListener; import com.adjust.sdk.OnSessionTrackingFailedListener; import com.adjust.sdk.OnSessionTrackingSucceededListener; import com.adjust.test_options.TestConnectionOptions; @@ -100,6 +101,7 @@ public void executeCommand(final Command sentCommand) { case "coppaComplianceInDelay" : coppaComplianceInDelay(); break; case "playStoreKidsComplianceInDelay" : playStoreKidsComplianceInDelay(); break; case "externalDeviceIdInDelay" : externalDeviceIdInDelay(); break; + case "sdkVersionGetter" : sdkVersionGetter(); break; //case "testBegin": testBegin(); break; // case "testEnd": testEnd(); break; } @@ -965,6 +967,13 @@ private void externalDeviceIdInDelay() { String externalDeviceId = command.getFirstParameterValue("externalDeviceId"); Adjust.setExternalDeviceIdInDelay(externalDeviceId); } + + private void sdkVersionGetter() { + Adjust.getSdkVersion(sdkVersion -> { + MainActivity.testLibrary.addInfoToSend("sdk_version", sdkVersion); + MainActivity.testLibrary.sendInfoToServer(basePath); + }); + } /* private void testBegin() { if (command.containsParameter("teardown")) { From 157290e54d556479dbad071b2eafc188626975c1 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 25 Nov 2025 11:45:26 +0100 Subject: [PATCH 442/540] test: add ability to test google and amazon ad id getters --- .../adjust/testapp/AdjustCommandExecutor.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index dddf9d886..a6e705752 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -102,6 +102,8 @@ public void executeCommand(final Command sentCommand) { case "playStoreKidsComplianceInDelay" : playStoreKidsComplianceInDelay(); break; case "externalDeviceIdInDelay" : externalDeviceIdInDelay(); break; case "sdkVersionGetter" : sdkVersionGetter(); break; + case "googleAdIdGetter" : googleAdIdGetter(); break; + case "amazonAdIdGetter" : amazonAdIdGetter(); break; //case "testBegin": testBegin(); break; // case "testEnd": testEnd(); break; } @@ -974,6 +976,20 @@ private void sdkVersionGetter() { MainActivity.testLibrary.sendInfoToServer(basePath); }); } + + private void googleAdIdGetter() { + Adjust.getGoogleAdId(context, googleAdId -> { + MainActivity.testLibrary.addInfoToSend("gps_adid", googleAdId); + MainActivity.testLibrary.sendInfoToServer(basePath); + }); + } + + private void amazonAdIdGetter() { + Adjust.getAmazonAdId(context, amazonAdId -> { + MainActivity.testLibrary.addInfoToSend("fire_adid", amazonAdId); + MainActivity.testLibrary.sendInfoToServer(basePath); + }); + } /* private void testBegin() { if (command.containsParameter("teardown")) { From 1a2f1ff82b49a53c66e925d2a1168f7fe7c48881 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 25 Nov 2025 11:55:41 +0100 Subject: [PATCH 443/540] test: add ability to test google and amazon ad id web bridge getters --- .../src/main/assets/command_executor.js | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index 58834a39e..a88fd8170 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -140,6 +140,9 @@ AdjustCommandExecutor.prototype.executeCommand = function(command, idx) { case "coppaComplianceInDelay" : this.coppaComplianceInDelay(command.params); break; case "playStoreKidsComplianceInDelay" : this.playStoreKidsComplianceInDelay(command.params); break; case "externalDeviceIdInDelay" : this.externalDeviceIdInDelay(command.params); break; + case "sdkVersionGetter" : this.sdkVersionGetter(command.params); break; + case "googleAdIdGetter" : this.googleAdIdGetter(command.params); break; + case "amazonAdIdGetter" : this.amazonAdIdGetter(command.params); break; break; } @@ -711,6 +714,30 @@ AdjustCommandExecutor.prototype.attributionGetter = function(params) { }); }; +AdjustCommandExecutor.prototype.sdkVersionGetter = function(params) { + var basePath = this.basePath; + Adjust.getSdkVersion(function(sdkVersion) { + TestLibrary.addInfoToSend("sdk_version", sdkVersion); + TestLibrary.sendInfoToServer(basePath); + }); +}; + +AdjustCommandExecutor.prototype.googleAdIdGetter = function(params) { + var basePath = this.basePath; + Adjust.getGoogleAdId(function(googleAdId) { + TestLibrary.addInfoToSend("gps_adid", googleAdId); + TestLibrary.sendInfoToServer(basePath); + }); +}; + +AdjustCommandExecutor.prototype.amazonAdIdGetter = function(params) { + var basePath = this.basePath; + Adjust.getAmazonAdId(function(amazonAdId) { + TestLibrary.addInfoToSend("fire_adid", amazonAdId); + TestLibrary.sendInfoToServer(basePath); + }); +}; + //Util //====================== function getValueFromKey(params, key) { From b2f566df96f1c7e698456e711e73a56c1117a2f8 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 25 Nov 2025 11:58:08 +0100 Subject: [PATCH 444/540] chore: random cleanups --- .../adjust/testapp/AdjustCommandExecutor.java | 1 - .../src/main/assets/command_executor.js | 32 +++++++++---------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index a6e705752..ba6d62ba9 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -34,7 +34,6 @@ import com.adjust.sdk.OnEventTrackingSucceededListener; import com.adjust.sdk.OnLastDeeplinkReadListener; import com.adjust.sdk.OnPurchaseVerificationFinishedListener; -import com.adjust.sdk.OnSdkVersionReadListener; import com.adjust.sdk.OnSessionTrackingFailedListener; import com.adjust.sdk.OnSessionTrackingSucceededListener; import com.adjust.test_options.TestConnectionOptions; diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index a88fd8170..97fe34778 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -695,23 +695,23 @@ AdjustCommandExecutor.prototype.sendReferrer = function(params) { }; AdjustCommandExecutor.prototype.attributionGetter = function(params) { - var basePath = this.basePath; - Adjust.getAttribution(function(attribution) { - TestLibrary.addInfoToSend("tracker_token", attribution.trackerToken); - TestLibrary.addInfoToSend("tracker_name", attribution.trackerName); - TestLibrary.addInfoToSend("network", attribution.network); - TestLibrary.addInfoToSend("campaign", attribution.campaign); - TestLibrary.addInfoToSend("adgroup", attribution.adgroup); - TestLibrary.addInfoToSend("creative", attribution.creative); - TestLibrary.addInfoToSend("click_label", attribution.clickLabel); - TestLibrary.addInfoToSend("cost_type", attribution.costType); - TestLibrary.addInfoToSend("cost_amount", attribution.costAmount); - TestLibrary.addInfoToSend("cost_currency", attribution.costCurrency); - TestLibrary.addInfoToSend("fb_install_referrer", attribution.fbInstallReferrer); - TestLibrary.addInfoToSend("json_response", JSON.stringify(attribution.jsonResponse)); + var basePath = this.basePath; + Adjust.getAttribution(function(attribution) { + TestLibrary.addInfoToSend("tracker_token", attribution.trackerToken); + TestLibrary.addInfoToSend("tracker_name", attribution.trackerName); + TestLibrary.addInfoToSend("network", attribution.network); + TestLibrary.addInfoToSend("campaign", attribution.campaign); + TestLibrary.addInfoToSend("adgroup", attribution.adgroup); + TestLibrary.addInfoToSend("creative", attribution.creative); + TestLibrary.addInfoToSend("click_label", attribution.clickLabel); + TestLibrary.addInfoToSend("cost_type", attribution.costType); + TestLibrary.addInfoToSend("cost_amount", attribution.costAmount); + TestLibrary.addInfoToSend("cost_currency", attribution.costCurrency); + TestLibrary.addInfoToSend("fb_install_referrer", attribution.fbInstallReferrer); + TestLibrary.addInfoToSend("json_response", JSON.stringify(attribution.jsonResponse)); - TestLibrary.sendInfoToServer(basePath); - }); + TestLibrary.sendInfoToServer(basePath); + }); }; AdjustCommandExecutor.prototype.sdkVersionGetter = function(params) { From a7bdcf476a85cf375afa8d81911aa4dc02b57727 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 22 Sep 2025 16:54:29 +0200 Subject: [PATCH 445/540] feat: add tracking of unique event sequence --- .../java/com/adjust/sdk/ActivityHandler.java | 57 ++++++++++++++++++- .../main/java/com/adjust/sdk/Constants.java | 1 + .../java/com/adjust/sdk/EventMetadata.java | 35 ++++++++++++ .../java/com/adjust/sdk/PackageBuilder.java | 7 ++- 4 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 396c43981..8fdcfaf71 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -13,6 +13,7 @@ import static com.adjust.sdk.Constants.ATTRIBUTION_FILENAME; import static com.adjust.sdk.Constants.CONNECTION_TIMEOUT; import static com.adjust.sdk.Constants.CONNECTION_TIMEOUT_VERIFY; +import static com.adjust.sdk.Constants.EVENT_METADATA_FILENAME; import static com.adjust.sdk.Constants.GLOBAL_CALLBACK_PARAMETERS_FILENAME; import static com.adjust.sdk.Constants.GLOBAL_PARTNER_PARAMETERS_FILENAME; import static com.adjust.sdk.Constants.REFERRER_API_HUAWEI_ADS; @@ -68,6 +69,7 @@ public class ActivityHandler private static final String GLOBAL_CALLBACK_PARAMETERS_NAME = "Global Callback parameters"; private static final String GLOBAL_PARTNER_PARAMETERS_NAME = "Global Partner parameters"; private static final String GLOBAL_PARAMETERS_NAME = "Global parameters"; + private static final String EVENT_METADATA_NAME = "Event metadata"; ThreadExecutor executor; private IPackageHandler packageHandler; @@ -95,6 +97,7 @@ public class ActivityHandler private List cachedAdjustThirdPartySharingArray; private Boolean cachedLastMeasurementConsentTrack; private FirstSessionDelayManager firstSessionDelayManager; + private EventMetadata eventMetadata; @Override public void teardown() { @@ -151,6 +154,7 @@ static void deleteState(Context context) { deleteAttribution(context); deleteGlobalCallbackParameters(context); deleteGlobalPartnerParameters(context); + deleteEventMetadata(context); SharedPreferencesManager.getDefaultInstance(context).clear(); } @@ -838,6 +842,9 @@ void initI() { readGlobalCallbackParametersI(adjustConfig.context); readGlobalPartnerParametersI(adjustConfig.context); + eventMetadata = new EventMetadata(); + readEventMetadataI(adjustConfig.context); + if (activityState != null) { activityState.setEventDeduplicationIdsMaxSize(adjustConfig.getEventDeduplicationIdsMaxSize()); } @@ -1556,13 +1563,15 @@ private void trackEventI(AdjustEvent event) { long now = System.currentTimeMillis(); + int sequence = updateEventMetadataI(event); + activityState.eventCount++; updateActivityStateI(now); PackageBuilder eventBuilder = new PackageBuilder( adjustConfig, deviceInfo, activityState, globalParameters, firstSessionDelayManager, now); eventBuilder.internalState = internalState; - ActivityPackage eventPackage = eventBuilder.buildEventPackage(event); + ActivityPackage eventPackage = eventBuilder.buildEventPackage(event, sequence); packageHandler.addPackage(eventPackage); packageHandler.sendFirstPackage(); @@ -1573,6 +1582,26 @@ private void trackEventI(AdjustEvent event) { } writeActivityStateI(); + writeEventMetadataI(); + } + + private int updateEventMetadataI(AdjustEvent event) { + if (eventMetadata == null) { + eventMetadata = new EventMetadata(); + } + + if (eventMetadata.eventSequence == null) { + eventMetadata.eventSequence = new LinkedHashMap(); + } + + Integer oldValue = eventMetadata.eventSequence.get(event.eventToken); + int newValue = 1; + if (oldValue != null) { + newValue = oldValue + 1; + } + + eventMetadata.eventSequence.put(event.eventToken, newValue); + return newValue; } private void launchEventResponseTasksI(final EventResponseData eventResponseData) { @@ -2240,6 +2269,10 @@ public static boolean deleteGlobalPartnerParameters(Context context) { return context.deleteFile(GLOBAL_PARTNER_PARAMETERS_FILENAME); } + public static boolean deleteEventMetadata(Context context) { + return context.deleteFile(EVENT_METADATA_FILENAME); + } + private void transferSessionPackageI(long now) { PackageBuilder builder = new PackageBuilder( adjustConfig, deviceInfo, activityState, globalParameters, firstSessionDelayManager, now); @@ -2764,6 +2797,19 @@ private void readGlobalPartnerParametersI(Context context) { } } + @SuppressWarnings("unchecked") + private void readEventMetadataI(Context context) { + try { + eventMetadata.eventSequence = Util.readObject(context, + EVENT_METADATA_FILENAME, + EVENT_METADATA_NAME, + (Class>)(Class)Map.class); + } catch (Exception e) { + logger.error("Failed to read %s file (%s)", EVENT_METADATA_NAME, e.getMessage()); + eventMetadata.eventSequence = null; + } + } + private void writeActivityStateI() { synchronized (ActivityState.class) { if (activityState == null) { @@ -2818,6 +2864,15 @@ private void writeGlobalPartnerParametersI() { } } + private void writeEventMetadataI() { + synchronized (EventMetadata.class) { + if (eventMetadata == null) { + return; + } + Util.writeObject(eventMetadata.eventSequence, adjustConfig.context, EVENT_METADATA_FILENAME, EVENT_METADATA_NAME); + } + } + private void teardownAllGlobalParametersS() { synchronized (GlobalParameters.class) { if (globalParameters == null) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 52e1f5e66..2c5ae3cd7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -58,6 +58,7 @@ public interface Constants { String ATTRIBUTION_FILENAME = "AdjustAttribution"; String GLOBAL_CALLBACK_PARAMETERS_FILENAME = "AdjustGlobalCallbackParameters"; String GLOBAL_PARTNER_PARAMETERS_FILENAME = "AdjustGlobalPartnerParameters"; + String EVENT_METADATA_FILENAME = "AdjustEventMetadata"; String MALFORMED = "malformed"; String SMALL = "small"; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java new file mode 100644 index 000000000..c78bab251 --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java @@ -0,0 +1,35 @@ +package com.adjust.sdk; + +import java.util.HashMap; +import java.util.Map; + +public class EventMetadata { + Map eventSequence; + + @Override + public boolean equals(Object other) { + if (other == this) return true; + if (other == null) return false; + if (getClass() != other.getClass()) return false; + EventMetadata otherEventMetadata = (EventMetadata) other; + + if (!Util.equalObject(eventSequence, otherEventMetadata.eventSequence)) return false; + + return true; + } + + @Override + public int hashCode() { + int hashCode = 17; + hashCode = Util.hashObject(eventSequence, hashCode); + return hashCode; + } + + public EventMetadata deepCopy() { + EventMetadata newEventMetadata = new EventMetadata(); + if (this.eventSequence != null) { + newEventMetadata.eventSequence = new HashMap(this.eventSequence); + } + return newEventMetadata; + } +} diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index fb4ef1cd5..6a8fd5d86 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -92,8 +92,8 @@ ActivityPackage buildSessionPackage() { return sessionPackage; } - ActivityPackage buildEventPackage(AdjustEvent event) { - Map parameters = getEventParameters(event); + ActivityPackage buildEventPackage(AdjustEvent event, int sequence) { + Map parameters = getEventParameters(event, sequence); ActivityPackage eventPackage = getDefaultActivityPackage(ActivityKind.EVENT); eventPackage.setPath("/event"); eventPackage.setSuffix(getEventSuffix(event)); @@ -316,7 +316,7 @@ private Map getSessionParameters() { return parameters; } - public Map getEventParameters(AdjustEvent event) { + public Map getEventParameters(AdjustEvent event, int sequence) { Map parameters = new HashMap(); deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); @@ -398,6 +398,7 @@ public Map getEventParameters(AdjustEvent event) { PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); + PackageBuilder.addInteger(parameters, "seq", sequence); // google play games PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); From 94c58dbd88adfc368c6e40a0efbbc77d8d77982f Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 4 Nov 2025 10:52:52 +0100 Subject: [PATCH 446/540] Refac: Encapsulate event metadata --- .../java/com/adjust/sdk/ActivityHandler.java | 56 ++-------------- .../main/java/com/adjust/sdk/Constants.java | 1 - .../java/com/adjust/sdk/EventMetadata.java | 67 +++++++++++++++++-- 3 files changed, 65 insertions(+), 59 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 8fdcfaf71..137224c8e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -13,7 +13,6 @@ import static com.adjust.sdk.Constants.ATTRIBUTION_FILENAME; import static com.adjust.sdk.Constants.CONNECTION_TIMEOUT; import static com.adjust.sdk.Constants.CONNECTION_TIMEOUT_VERIFY; -import static com.adjust.sdk.Constants.EVENT_METADATA_FILENAME; import static com.adjust.sdk.Constants.GLOBAL_CALLBACK_PARAMETERS_FILENAME; import static com.adjust.sdk.Constants.GLOBAL_PARTNER_PARAMETERS_FILENAME; import static com.adjust.sdk.Constants.REFERRER_API_HUAWEI_ADS; @@ -69,7 +68,6 @@ public class ActivityHandler private static final String GLOBAL_CALLBACK_PARAMETERS_NAME = "Global Callback parameters"; private static final String GLOBAL_PARTNER_PARAMETERS_NAME = "Global Partner parameters"; private static final String GLOBAL_PARAMETERS_NAME = "Global parameters"; - private static final String EVENT_METADATA_NAME = "Event metadata"; ThreadExecutor executor; private IPackageHandler packageHandler; @@ -97,7 +95,7 @@ public class ActivityHandler private List cachedAdjustThirdPartySharingArray; private Boolean cachedLastMeasurementConsentTrack; private FirstSessionDelayManager firstSessionDelayManager; - private EventMetadata eventMetadata; + private @NonNull final EventMetadata eventMetadata = new EventMetadata(); @Override public void teardown() { @@ -154,7 +152,7 @@ static void deleteState(Context context) { deleteAttribution(context); deleteGlobalCallbackParameters(context); deleteGlobalPartnerParameters(context); - deleteEventMetadata(context); + EventMetadata.deleteState(context); SharedPreferencesManager.getDefaultInstance(context).clear(); } @@ -842,8 +840,7 @@ void initI() { readGlobalCallbackParametersI(adjustConfig.context); readGlobalPartnerParametersI(adjustConfig.context); - eventMetadata = new EventMetadata(); - readEventMetadataI(adjustConfig.context); + eventMetadata.readState(adjustConfig.context); if (activityState != null) { activityState.setEventDeduplicationIdsMaxSize(adjustConfig.getEventDeduplicationIdsMaxSize()); @@ -1563,7 +1560,7 @@ private void trackEventI(AdjustEvent event) { long now = System.currentTimeMillis(); - int sequence = updateEventMetadataI(event); + int sequence = eventMetadata.incrementSequenceForEvent(event.eventToken); activityState.eventCount++; updateActivityStateI(now); @@ -1582,26 +1579,6 @@ private void trackEventI(AdjustEvent event) { } writeActivityStateI(); - writeEventMetadataI(); - } - - private int updateEventMetadataI(AdjustEvent event) { - if (eventMetadata == null) { - eventMetadata = new EventMetadata(); - } - - if (eventMetadata.eventSequence == null) { - eventMetadata.eventSequence = new LinkedHashMap(); - } - - Integer oldValue = eventMetadata.eventSequence.get(event.eventToken); - int newValue = 1; - if (oldValue != null) { - newValue = oldValue + 1; - } - - eventMetadata.eventSequence.put(event.eventToken, newValue); - return newValue; } private void launchEventResponseTasksI(final EventResponseData eventResponseData) { @@ -2269,10 +2246,6 @@ public static boolean deleteGlobalPartnerParameters(Context context) { return context.deleteFile(GLOBAL_PARTNER_PARAMETERS_FILENAME); } - public static boolean deleteEventMetadata(Context context) { - return context.deleteFile(EVENT_METADATA_FILENAME); - } - private void transferSessionPackageI(long now) { PackageBuilder builder = new PackageBuilder( adjustConfig, deviceInfo, activityState, globalParameters, firstSessionDelayManager, now); @@ -2797,19 +2770,6 @@ private void readGlobalPartnerParametersI(Context context) { } } - @SuppressWarnings("unchecked") - private void readEventMetadataI(Context context) { - try { - eventMetadata.eventSequence = Util.readObject(context, - EVENT_METADATA_FILENAME, - EVENT_METADATA_NAME, - (Class>)(Class)Map.class); - } catch (Exception e) { - logger.error("Failed to read %s file (%s)", EVENT_METADATA_NAME, e.getMessage()); - eventMetadata.eventSequence = null; - } - } - private void writeActivityStateI() { synchronized (ActivityState.class) { if (activityState == null) { @@ -2864,14 +2824,6 @@ private void writeGlobalPartnerParametersI() { } } - private void writeEventMetadataI() { - synchronized (EventMetadata.class) { - if (eventMetadata == null) { - return; - } - Util.writeObject(eventMetadata.eventSequence, adjustConfig.context, EVENT_METADATA_FILENAME, EVENT_METADATA_NAME); - } - } private void teardownAllGlobalParametersS() { synchronized (GlobalParameters.class) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 2c5ae3cd7..52e1f5e66 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -58,7 +58,6 @@ public interface Constants { String ATTRIBUTION_FILENAME = "AdjustAttribution"; String GLOBAL_CALLBACK_PARAMETERS_FILENAME = "AdjustGlobalCallbackParameters"; String GLOBAL_PARTNER_PARAMETERS_FILENAME = "AdjustGlobalPartnerParameters"; - String EVENT_METADATA_FILENAME = "AdjustEventMetadata"; String MALFORMED = "malformed"; String SMALL = "small"; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java index c78bab251..e5730fa31 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java @@ -1,10 +1,61 @@ package com.adjust.sdk; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import java.util.HashMap; import java.util.Map; public class EventMetadata { - Map eventSequence; + private static final String EVENT_METADATA_FILENAME = "AdjustEventMetadata"; + private static final String EVENT_METADATA_NAME = "Event metadata"; + + private @NonNull Map eventSequence; + private @NonNull final ILogger logger; + private @Nullable Context context; + + public EventMetadata() { + eventSequence = new HashMap<>(); + logger = AdjustFactory.getLogger(); + } + + @SuppressWarnings("unchecked") + public void readState(Context context) { + this.context = context; + try { + Map readEventSequence = Util.readObject(context, + EVENT_METADATA_FILENAME, + EVENT_METADATA_NAME, + (Class>)(Class)Map.class); + if (readEventSequence != null) { + eventSequence = readEventSequence; + } else { + logger.error("Read null event metadata file"); + } + } catch (Exception e) { + logger.error("Failed to read event metadata file (%s)", e.getMessage()); + } + } + + public int incrementSequenceForEvent(String eventToken) { + @Nullable final Integer oldSequence = eventSequence.get(eventToken); + final int newSequence = incrementOrStartAt1(oldSequence); + + eventSequence.put(eventToken, newSequence); + writeEventMetadata(); + + return newSequence; + } + + private int incrementOrStartAt1(@Nullable final Integer oldValue) { + if (oldValue == null) { + return 1; + } + return oldValue + 1; + } @Override public boolean equals(Object other) { @@ -25,11 +76,15 @@ public int hashCode() { return hashCode; } - public EventMetadata deepCopy() { - EventMetadata newEventMetadata = new EventMetadata(); - if (this.eventSequence != null) { - newEventMetadata.eventSequence = new HashMap(this.eventSequence); + private void writeEventMetadata() { + if (context == null) { + logger.error("Could not write event metadata before having context from reading"); + return; } - return newEventMetadata; + Util.writeObject(eventSequence, context, EVENT_METADATA_FILENAME, EVENT_METADATA_NAME); + } + + public static boolean deleteState(Context context) { + return context.deleteFile(EVENT_METADATA_FILENAME); } } From c989af1984a055d3383d19ad27778ef55c3b01cd Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 11 Nov 2025 12:23:41 +0100 Subject: [PATCH 447/540] refactor: minor refactoring, added comment for more clarity --- .../src/main/java/com/adjust/sdk/EventMetadata.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java index e5730fa31..13b339a1f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java @@ -42,7 +42,9 @@ public void readState(Context context) { public int incrementSequenceForEvent(String eventToken) { @Nullable final Integer oldSequence = eventSequence.get(eventToken); - final int newSequence = incrementOrStartAt1(oldSequence); + + // Sequence start at 1 when it does not exist + final int newSequence = (oldSequence != null ? oldSequence : 0) + 1; eventSequence.put(eventToken, newSequence); writeEventMetadata(); @@ -50,13 +52,6 @@ public int incrementSequenceForEvent(String eventToken) { return newSequence; } - private int incrementOrStartAt1(@Nullable final Integer oldValue) { - if (oldValue == null) { - return 1; - } - return oldValue + 1; - } - @Override public boolean equals(Object other) { if (other == this) return true; From 440d61ec6292621974315b8cda1bd958a97ab1b9 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 1 Dec 2025 15:08:29 +0100 Subject: [PATCH 448/540] refactor: update EventMetadata to Serializable --- .../java/com/adjust/sdk/ActivityHandler.java | 46 ++++++++++++++-- .../main/java/com/adjust/sdk/Constants.java | 1 + .../java/com/adjust/sdk/EventMetadata.java | 54 ++++++------------- 3 files changed, 60 insertions(+), 41 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 137224c8e..f53f9338c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -13,6 +13,7 @@ import static com.adjust.sdk.Constants.ATTRIBUTION_FILENAME; import static com.adjust.sdk.Constants.CONNECTION_TIMEOUT; import static com.adjust.sdk.Constants.CONNECTION_TIMEOUT_VERIFY; +import static com.adjust.sdk.Constants.EVENT_METADATA_FILENAME; import static com.adjust.sdk.Constants.GLOBAL_CALLBACK_PARAMETERS_FILENAME; import static com.adjust.sdk.Constants.GLOBAL_PARTNER_PARAMETERS_FILENAME; import static com.adjust.sdk.Constants.REFERRER_API_HUAWEI_ADS; @@ -68,6 +69,7 @@ public class ActivityHandler private static final String GLOBAL_CALLBACK_PARAMETERS_NAME = "Global Callback parameters"; private static final String GLOBAL_PARTNER_PARAMETERS_NAME = "Global Partner parameters"; private static final String GLOBAL_PARAMETERS_NAME = "Global parameters"; + private static final String EVENT_METADATA_NAME = "Event metadata"; ThreadExecutor executor; private IPackageHandler packageHandler; @@ -95,7 +97,7 @@ public class ActivityHandler private List cachedAdjustThirdPartySharingArray; private Boolean cachedLastMeasurementConsentTrack; private FirstSessionDelayManager firstSessionDelayManager; - private @NonNull final EventMetadata eventMetadata = new EventMetadata(); + private @NonNull EventMetadata eventMetadata = new EventMetadata(); @Override public void teardown() { @@ -132,6 +134,7 @@ public void teardown() { teardownActivityStateS(); teardownAttributionS(); teardownAllGlobalParametersS(); + teardownEventMetadataS(); packageHandler = null; logger = null; @@ -152,7 +155,7 @@ static void deleteState(Context context) { deleteAttribution(context); deleteGlobalCallbackParameters(context); deleteGlobalPartnerParameters(context); - EventMetadata.deleteState(context); + deleteEventMetadata(context); SharedPreferencesManager.getDefaultInstance(context).clear(); } @@ -263,6 +266,7 @@ private ActivityHandler(AdjustConfig adjustConfig) { // has to be read in the background readAttributionI(adjustConfig.context); readActivityStateI(adjustConfig.context); + readEventMetadataI(adjustConfig.context); firstSessionDelayManager.activityStateFileReadI(); }); @@ -840,8 +844,6 @@ void initI() { readGlobalCallbackParametersI(adjustConfig.context); readGlobalPartnerParametersI(adjustConfig.context); - eventMetadata.readState(adjustConfig.context); - if (activityState != null) { activityState.setEventDeduplicationIdsMaxSize(adjustConfig.getEventDeduplicationIdsMaxSize()); } @@ -1579,6 +1581,7 @@ private void trackEventI(AdjustEvent event) { } writeActivityStateI(); + writeEventMetadataI(); } private void launchEventResponseTasksI(final EventResponseData eventResponseData) { @@ -2238,6 +2241,10 @@ public static boolean deleteAttribution(Context context) { return context.deleteFile(ATTRIBUTION_FILENAME); } + public static boolean deleteEventMetadata(Context context) { + return context.deleteFile(EVENT_METADATA_FILENAME); + } + public static boolean deleteGlobalCallbackParameters(Context context) { return context.deleteFile(GLOBAL_CALLBACK_PARAMETERS_FILENAME); } @@ -2744,6 +2751,19 @@ private void readAttributionI(Context context) { } } + private void readEventMetadataI(Context context) { + try { + eventMetadata = Util.readObject(context, EVENT_METADATA_FILENAME, EVENT_METADATA_NAME, EventMetadata.class); + } catch (Exception e) { + logger.error("Failed to read %s file (%s)", EVENT_METADATA_NAME, e.getMessage()); + } + + if (eventMetadata == null) { + eventMetadata = new EventMetadata(); + } + } + + @SuppressWarnings("unchecked") private void readGlobalCallbackParametersI(Context context) { try { @@ -2834,6 +2854,24 @@ private void teardownAllGlobalParametersS() { } } + private void writeEventMetadataI() { + synchronized (EventMetadata.class) { + if (eventMetadata == null) { + return; + } + Util.writeObject(eventMetadata, adjustConfig.context, EVENT_METADATA_FILENAME, EVENT_METADATA_NAME); + } + } + + private void teardownEventMetadataS() { + synchronized (EventMetadata.class) { + if (eventMetadata == null) { + return; + } + eventMetadata = null; + } + } + private boolean checkEventI(AdjustEvent event) { if (event == null) { logger.error("Event missing"); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 52e1f5e66..2c5ae3cd7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -58,6 +58,7 @@ public interface Constants { String ATTRIBUTION_FILENAME = "AdjustAttribution"; String GLOBAL_CALLBACK_PARAMETERS_FILENAME = "AdjustGlobalCallbackParameters"; String GLOBAL_PARTNER_PARAMETERS_FILENAME = "AdjustGlobalPartnerParameters"; + String EVENT_METADATA_FILENAME = "AdjustEventMetadata"; String MALFORMED = "malformed"; String SMALL = "small"; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java index 13b339a1f..e74e64e8a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java @@ -1,43 +1,27 @@ package com.adjust.sdk; -import android.content.Context; - -import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.ObjectStreamField; +import java.io.Serializable; import java.util.HashMap; import java.util.Map; -public class EventMetadata { - private static final String EVENT_METADATA_FILENAME = "AdjustEventMetadata"; - private static final String EVENT_METADATA_NAME = "Event metadata"; +public class EventMetadata implements Serializable { + private static final long serialVersionUID = 1L; + @SuppressWarnings("unchecked") + private static final ObjectStreamField[] serialPersistentFields = { + new ObjectStreamField("eventSequence", (Class>)(Class)Map.class), + }; - private @NonNull Map eventSequence; - private @NonNull final ILogger logger; - private @Nullable Context context; + private Map eventSequence; public EventMetadata() { eventSequence = new HashMap<>(); - logger = AdjustFactory.getLogger(); - } - - @SuppressWarnings("unchecked") - public void readState(Context context) { - this.context = context; - try { - Map readEventSequence = Util.readObject(context, - EVENT_METADATA_FILENAME, - EVENT_METADATA_NAME, - (Class>)(Class)Map.class); - if (readEventSequence != null) { - eventSequence = readEventSequence; - } else { - logger.error("Read null event metadata file"); - } - } catch (Exception e) { - logger.error("Failed to read event metadata file (%s)", e.getMessage()); - } } public int incrementSequenceForEvent(String eventToken) { @@ -47,7 +31,6 @@ public int incrementSequenceForEvent(String eventToken) { final int newSequence = (oldSequence != null ? oldSequence : 0) + 1; eventSequence.put(eventToken, newSequence); - writeEventMetadata(); return newSequence; } @@ -71,15 +54,12 @@ public int hashCode() { return hashCode; } - private void writeEventMetadata() { - if (context == null) { - logger.error("Could not write event metadata before having context from reading"); - return; - } - Util.writeObject(eventSequence, context, EVENT_METADATA_FILENAME, EVENT_METADATA_NAME); + private void writeObject(ObjectOutputStream stream) throws IOException { + stream.defaultWriteObject(); } - public static boolean deleteState(Context context) { - return context.deleteFile(EVENT_METADATA_FILENAME); + private void readObject(ObjectInputStream stream) throws ClassNotFoundException, IOException { + ObjectInputStream.GetField fields = stream.readFields(); + eventSequence = Util.readObjectField(fields, "eventSequence", null); } } From a11e0a8f731391cb5666a654c0845668996d4642 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 1 Dec 2025 16:03:31 +0100 Subject: [PATCH 449/540] fix: initialise eventSequence by default --- Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java index e74e64e8a..e3ea0e735 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/EventMetadata.java @@ -60,6 +60,6 @@ private void writeObject(ObjectOutputStream stream) throws IOException { private void readObject(ObjectInputStream stream) throws ClassNotFoundException, IOException { ObjectInputStream.GetField fields = stream.readFields(); - eventSequence = Util.readObjectField(fields, "eventSequence", null); + eventSequence = Util.readObjectField(fields, "eventSequence", new HashMap<>()); } } From 9cd49ae06d600810d3b0bc8fd54499f60f7d1b00 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 19 Nov 2025 14:53:49 +0100 Subject: [PATCH 450/540] feat: add adid and attribution getter with timeout --- .../java/com/adjust/sdk/ActivityHandler.java | 310 ++++++++++++++++-- .../src/main/java/com/adjust/sdk/Adjust.java | 56 ++++ .../java/com/adjust/sdk/AdjustConfig.java | 2 + .../java/com/adjust/sdk/AdjustInstance.java | 143 +++++++- .../com/adjust/sdk/AdjustTimeoutCallback.java | 41 +++ .../main/java/com/adjust/sdk/Constants.java | 4 + .../java/com/adjust/sdk/IActivityHandler.java | 4 + .../src/main/java/com/adjust/sdk/Util.java | 21 ++ 8 files changed, 556 insertions(+), 25 deletions(-) create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTimeoutCallback.java diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index f53f9338c..5b782ccca 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -10,7 +10,9 @@ package com.adjust.sdk; import static com.adjust.sdk.Constants.ACTIVITY_STATE_FILENAME; +import static com.adjust.sdk.Constants.ADID_TIMEOUT_TIMER_NAME; import static com.adjust.sdk.Constants.ATTRIBUTION_FILENAME; +import static com.adjust.sdk.Constants.ATTRIBUTION_TIMEOUT_TIMER_NAME; import static com.adjust.sdk.Constants.CONNECTION_TIMEOUT; import static com.adjust.sdk.Constants.CONNECTION_TIMEOUT_VERIFY; import static com.adjust.sdk.Constants.EVENT_METADATA_FILENAME; @@ -91,9 +93,11 @@ public class ActivityHandler private GlobalParameters globalParameters; private InstallReferrer installReferrer; private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; - private ArrayList cachedAdidReadCallbacks = new ArrayList<>(); + private final ArrayList cachedAdidReadCallbacks = new ArrayList<>(); + private final ArrayList cachedAdidReadTimeoutCallbacks = new ArrayList<>(); private SystemLifecycle systemLifecycle; - private ArrayList cachedAttributionReadCallbacks = new ArrayList<>(); + private final ArrayList cachedAttributionReadCallbacks = new ArrayList<>(); + private final ArrayList cachedAttributionReadTimeoutCallbacks = new ArrayList<>(); private List cachedAdjustThirdPartySharingArray; private Boolean cachedLastMeasurementConsentTrack; private FirstSessionDelayManager firstSessionDelayManager; @@ -471,11 +475,14 @@ private void updateAdidI(final String adid) { writeActivityStateI(); } - if (! cachedAdidReadCallbacks.isEmpty()) { - final ArrayList cachedAdidReadCallbacksCopy = - new ArrayList<>(cachedAdidReadCallbacks); + final ArrayList cachedAdidReadCallbacksCopy; + if (!cachedAdidReadCallbacks.isEmpty()) { + synchronized (cachedAdidReadCallbacks) { + cachedAdidReadCallbacksCopy = new ArrayList<>(cachedAdidReadCallbacks); + cachedAdidReadCallbacks.clear(); + } - cachedAdidReadCallbacks.clear(); + // process regular adid callbacks new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { @Override public void run() { @@ -487,6 +494,39 @@ public void run() { } }); } + + final ArrayList cachedAdidReadTimeoutCallbacksCopy; + if (!cachedAdidReadTimeoutCallbacks.isEmpty()) { + + synchronized (cachedAdidReadTimeoutCallbacks) { + cachedAdidReadTimeoutCallbacksCopy = new ArrayList<>(cachedAdidReadTimeoutCallbacks); + cachedAdidReadTimeoutCallbacks.clear(); + } + + // process timeout adid callbacks + new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + for (AdjustTimeoutCallback adjustTimeoutCallback : cachedAdidReadTimeoutCallbacksCopy) { + if (adjustTimeoutCallback != null) { + // cancel any pending timeout + TimerOnce timerOnce = adjustTimeoutCallback.getTimeoutTimer(); + if (timerOnce != null) { + timerOnce.cancel(); + } + + OnAdidReadListener onAdidReadListener = adjustTimeoutCallback.getOnAdidReadListener(); + if (onAdidReadListener != null) { + onAdidReadListener.onAdidRead(adid); + } + + // null callback to call it only once + adjustTimeoutCallback.setOnAdidReadListener(null); + } + } + } + }); + } } @Override @@ -499,11 +539,14 @@ public boolean updateAttributionI(AdjustAttribution attribution) { return false; } + final ArrayList cachedAttributionReadCallbacksCopy; if (! cachedAttributionReadCallbacks.isEmpty()) { - final ArrayList cachedAttributionReadCallbacksCopy = - new ArrayList<>(cachedAttributionReadCallbacks); + synchronized (cachedAttributionReadCallbacks) { + cachedAttributionReadCallbacksCopy = new ArrayList<>(cachedAttributionReadCallbacks); + cachedAttributionReadCallbacks.clear(); + } - cachedAttributionReadCallbacks.clear(); + // process regular attribution callbacks new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { @Override public void run() { @@ -516,6 +559,37 @@ public void run() { }); } + final ArrayList cachedAttributionReadTimeoutCallbacksCopy; + if (! cachedAttributionReadTimeoutCallbacks.isEmpty()) { + + synchronized (cachedAttributionReadTimeoutCallbacks) { + cachedAttributionReadTimeoutCallbacksCopy = new ArrayList<>(cachedAttributionReadTimeoutCallbacks); + cachedAttributionReadTimeoutCallbacks.clear(); + } + + // process timeout attribution callbacks + new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + for (AdjustTimeoutCallback adjustTimeoutCallback : cachedAttributionReadTimeoutCallbacksCopy) { + if (adjustTimeoutCallback != null) { + // cancel any pending timeout + TimerOnce timerOnce = adjustTimeoutCallback.getTimeoutTimer(); + if (timerOnce != null) { + timerOnce.cancel(); + } + OnAttributionReadListener onAttributionReadListener = adjustTimeoutCallback.getOnAttributionReadListener(); + if (onAttributionReadListener != null) { + onAttributionReadListener.onAttributionRead(attribution); + } + // null callback to call it only once + adjustTimeoutCallback.setOnAttributionReadListener(null); + } + } + } + }); + } + if (attribution.equals(this.attribution)) { return false; } @@ -773,7 +847,60 @@ public void run() { if (activityState == null) { logger.warn("SDK needs to be initialized before getting adid"); } - cachedAdidReadCallbacks.add(callback); + synchronized (cachedAdidReadCallbacks) { + cachedAdidReadCallbacks.add(callback); + } + } + } + + @Override + public void getAdidWithTimeout(long timeoutInMilliSec, OnAdidReadListener callback) { + if (activityState != null && activityState.adid != null) { + new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + callback.onAdidRead(activityState.adid); + } + }); + } else { + if (activityState == null) { + logger.warn("SDK needs to be initialized before getting adid"); + } + + // adid not found in activity state + // store timeout callback for later processing + AdjustTimeoutCallback timeoutCallback = new AdjustTimeoutCallback(callback); + + // set up timeout timer immediately + TimerOnce timerOnce = new TimerOnce(new Runnable() { + @Override + public void run() { + if (timeoutCallback.getOnAdidReadListener() != null) { + // remove callback from array and call callback with null + synchronized (cachedAdidReadTimeoutCallbacks) { + cachedAdidReadTimeoutCallbacks.remove(timeoutCallback); + } + new Handler(getContext().getMainLooper()).post(new Runnable() { + @Override + public void run() { + // if timer elapses, return null (only if callback still exists) + if (timeoutCallback.getOnAdidReadListener() != null) { + timeoutCallback.getOnAdidReadListener().onAdidRead(null); + } + + // null callback to call it only once + timeoutCallback.setOnAdidReadListener(null); + } + }); + } + } + }, ADID_TIMEOUT_TIMER_NAME); + + timeoutCallback.setTimer(timerOnce); + synchronized (cachedAdidReadTimeoutCallbacks) { + cachedAdidReadTimeoutCallbacks.add(timeoutCallback); + } + timerOnce.startIn(timeoutInMilliSec); } } @@ -787,7 +914,56 @@ public void run() { } }); }else { - cachedAttributionReadCallbacks.add(onAttributionReadListener); + synchronized (cachedAttributionReadCallbacks) { + cachedAttributionReadCallbacks.add(onAttributionReadListener); + } + } + } + + @Override + public void getAttributionWithTimeout(long timeoutInMilliSec, OnAttributionReadListener onAttributionReadListener) { + if (attribution != null) { + new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + onAttributionReadListener.onAttributionRead(attribution); + } + }); + } else { + // attribution not found + // store timeout callback for later processing + AdjustTimeoutCallback timeoutCallback = new AdjustTimeoutCallback(onAttributionReadListener); + + // set up timeout timer immediately + TimerOnce timerOnce = new TimerOnce(new Runnable() { + @Override + public void run() { + if (timeoutCallback.getOnAttributionReadListener() != null) { + // remove callback from array and call callback with null + synchronized (cachedAttributionReadTimeoutCallbacks) { + cachedAttributionReadTimeoutCallbacks.remove(timeoutCallback); + } + new Handler(getContext().getMainLooper()).post(new Runnable() { + @Override + public void run() { + // if timer elapses, return null (only if callback still exists) + if (timeoutCallback.getOnAttributionReadListener() != null) { + timeoutCallback.getOnAttributionReadListener().onAttributionRead(null); + } + + // null callback to call it only once + timeoutCallback.setOnAttributionReadListener(null); + } + }); + } + } + }, ATTRIBUTION_TIMEOUT_TIMER_NAME); + + timeoutCallback.setTimer(timerOnce); + synchronized (cachedAttributionReadTimeoutCallbacks) { + cachedAttributionReadTimeoutCallbacks.add(timeoutCallback); + } + timerOnce.startIn(timeoutInMilliSec); } } @@ -1034,17 +1210,23 @@ public void onFail(String message) { } private void handleAttributionCallbackI() { - cachedAttributionReadCallbacks.addAll(adjustConfig.cachedAttributionReadCallbacks); - adjustConfig.cachedAttributionReadCallbacks.clear(); + synchronized (cachedAttributionReadCallbacks) { + cachedAttributionReadCallbacks.addAll(adjustConfig.cachedAttributionReadCallbacks); + adjustConfig.cachedAttributionReadCallbacks.clear(); + } if (! cachedAttributionReadCallbacks.isEmpty() && attribution != null) { - final ArrayList cachedAttributionReadCallbacksCopy = - new ArrayList<>(cachedAttributionReadCallbacks); + final ArrayList cachedAttributionReadCallbacksCopy; + synchronized (cachedAttributionReadCallbacks) { + cachedAttributionReadCallbacksCopy = new ArrayList<>(cachedAttributionReadCallbacks); + cachedAttributionReadCallbacks.clear(); + } + final AdjustAttribution attributionCopy = attribution; - cachedAttributionReadCallbacks.clear(); + // process regular attribution callbacks new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { @Override public void run() { @@ -1056,21 +1238,66 @@ public void run() { } }); } + + synchronized (cachedAttributionReadTimeoutCallbacks) { + cachedAttributionReadTimeoutCallbacks.addAll(adjustConfig.cachedAttributionReadTimeoutCallbacks); + adjustConfig.cachedAttributionReadTimeoutCallbacks.clear(); + } + + if (! cachedAttributionReadTimeoutCallbacks.isEmpty() + && attribution != null) + { + final ArrayList cachedAttributionReadTimeoutCallbacksCopy; + synchronized (cachedAttributionReadTimeoutCallbacks) { + cachedAttributionReadTimeoutCallbacksCopy = new ArrayList<>(cachedAttributionReadTimeoutCallbacks); + cachedAttributionReadTimeoutCallbacks.clear(); + } + + final AdjustAttribution attributionCopy = attribution; + + // process timeout attribution callbacks + new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + for (AdjustTimeoutCallback adjustTimeoutCallback : cachedAttributionReadTimeoutCallbacksCopy) { + if (adjustTimeoutCallback != null) { + // cancel any pending timeout + TimerOnce timerOnce = adjustTimeoutCallback.getTimeoutTimer(); + if (timerOnce != null) { + timerOnce.cancel(); + } + OnAttributionReadListener onAttributionReadListener = adjustTimeoutCallback.getOnAttributionReadListener(); + if (onAttributionReadListener != null) { + onAttributionReadListener.onAttributionRead(attributionCopy); + } + + // null callback to call it only once + adjustTimeoutCallback.setOnAttributionReadListener(null); + } + } + } + }); + } } private void handleAdidCallbackI() { - cachedAdidReadCallbacks.addAll(adjustConfig.cachedAdidReadCallbacks); - adjustConfig.cachedAdidReadCallbacks.clear(); + synchronized (cachedAdidReadCallbacks) { + cachedAdidReadCallbacks.addAll(adjustConfig.cachedAdidReadCallbacks); + adjustConfig.cachedAdidReadCallbacks.clear(); + } if (! cachedAdidReadCallbacks.isEmpty() && activityState != null && activityState.adid != null) { - final ArrayList cachedAdidReadCallbacksCopy = - new ArrayList<>(cachedAdidReadCallbacks); + final ArrayList cachedAdidReadCallbacksCopy; + synchronized (cachedAdidReadCallbacks) { + cachedAdidReadCallbacksCopy = new ArrayList<>(cachedAdidReadCallbacks); + cachedAdidReadCallbacks.clear(); + } final String adidCopy = activityState.adid; - cachedAdidReadCallbacks.clear(); + // process regular adid callbacks new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { @Override public void run() { @@ -1082,6 +1309,47 @@ public void run() { } }); } + + synchronized (cachedAdidReadTimeoutCallbacks) { + cachedAdidReadTimeoutCallbacks.addAll(adjustConfig.cachedAdidReadTimeoutCallbacks); + adjustConfig.cachedAdidReadTimeoutCallbacks.clear(); + } + + if (! cachedAdidReadTimeoutCallbacks.isEmpty() + && activityState != null + && activityState.adid != null) + { + final ArrayList cachedAdidReadTimeoutCallbacksCopy; + synchronized (cachedAdidReadTimeoutCallbacks) { + cachedAdidReadTimeoutCallbacksCopy = new ArrayList<>(cachedAdidReadTimeoutCallbacks); + cachedAdidReadTimeoutCallbacks.clear(); + } + + final String adidCopy = activityState.adid; + + // process timeout adid callbacks + new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + for (AdjustTimeoutCallback adjustTimeoutCallback : cachedAdidReadTimeoutCallbacksCopy) { + if (adjustTimeoutCallback != null) { + // cancel any pending timeout + TimerOnce timerOnce = adjustTimeoutCallback.getTimeoutTimer(); + if (timerOnce != null) { + timerOnce.cancel(); + } + OnAdidReadListener onAdidReadListener = adjustTimeoutCallback.getOnAdidReadListener(); + if (onAdidReadListener != null) { + onAdidReadListener.onAdidRead(adidCopy); + } + + // null callback to call it only once + adjustTimeoutCallback.setOnAdidReadListener(null); + } + } + } + }); + } } private void bootstrapLifecycleI() { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 4ad955b45..a9f567601 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -337,6 +337,34 @@ public static void getAdid(final OnAdidReadListener onAdidReadListener) { adjustInstance.getAdid(onAdidReadListener); } + /** + * Called to get value of unique Adjust device identifier with a timeout + * + * @param timeoutInMilliSec Timeout in milliseconds. If adid is not available within this time, + * the callback will return null adid. + * @param onAdidReadListener Callback to get triggered once identifier is obtained. + * @param context Application context + */ + public static void getAdidWithTimeout(final long timeoutInMilliSec, + final OnAdidReadListener onAdidReadListener, + final Context context) { + if (onAdidReadListener == null) { + AdjustFactory.getLogger().error("Callback for getting adid can't be null"); + return; + } + if (timeoutInMilliSec < 0) { + AdjustFactory.getLogger().error("Timeout value for getting adid can't be negative"); + return; + } + if (context == null) { + AdjustFactory.getLogger().error("Context for getting adid can't be null"); + return; + } + + AdjustInstance adjustInstance = Adjust.getDefaultInstance(); + adjustInstance.getAdidWithTimeout(timeoutInMilliSec, onAdidReadListener, context); + } + /** * Called to get user's current attribution value. * @@ -351,6 +379,34 @@ public static void getAttribution(final OnAttributionReadListener attributionRea adjustInstance.getAttribution(attributionReadListener); } + /** + * Called to get user's current attribution value. + * + * @param timeoutInMilliSec Timeout in milliseconds. If attribution is not available within this time, + * the callback will return null attribution. + * @param attributionReadListener Callback to get triggered once attribution is obtained + * @param context Application context + */ + public static void getAttributionWithTimeout(final long timeoutInMilliSec, + final OnAttributionReadListener attributionReadListener, + final Context context) { + if (attributionReadListener == null) { + AdjustFactory.getLogger().error("Callback for getting attribution can't be null"); + return; + } + if (timeoutInMilliSec < 0) { + AdjustFactory.getLogger().error("Timeout value for getting attribution can't be negative"); + return; + } + if (context == null) { + AdjustFactory.getLogger().error("Context for getting attribution can't be null"); + return; + } + + AdjustInstance adjustInstance = Adjust.getDefaultInstance(); + adjustInstance.getAttributionWithTimeout(timeoutInMilliSec, attributionReadListener, context); + } + /** * Called to get Google Install Referrer. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 6e9bc269a..3858ce77f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -44,8 +44,10 @@ public class AdjustConfig { boolean isDeviceIdsReadingOnceEnabled; OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; ArrayList cachedAdidReadCallbacks = new ArrayList<>(); + ArrayList cachedAdidReadTimeoutCallbacks = new ArrayList<>(); Integer eventDeduplicationIdsMaxSize; ArrayList cachedAttributionReadCallbacks = new ArrayList<>(); + ArrayList cachedAttributionReadTimeoutCallbacks = new ArrayList<>(); boolean isFirstSessionDelayEnabled; AdjustStoreInfo storeInfo; boolean isAppSetIdReadingEnabled; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index f414b4d32..7d1c64057 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -1,11 +1,16 @@ package com.adjust.sdk; +import static com.adjust.sdk.Constants.ADID_TIMEOUT_TIMER_NAME; +import static com.adjust.sdk.Constants.ATTRIBUTION_TIMEOUT_TIMER_NAME; + import android.net.Uri; import android.content.Context; +import android.os.Handler; import com.adjust.sdk.scheduler.AsyncTaskExecutor; import com.adjust.sdk.scheduler.SingleThreadCachedScheduler; import com.adjust.sdk.scheduler.ThreadExecutor; +import com.adjust.sdk.scheduler.TimerOnce; import java.util.List; import java.util.ArrayList; @@ -49,8 +54,10 @@ public PreLaunchActions() { private OnDeeplinkResolvedListener cachedDeeplinkResolutionCallback; - private ArrayList cachedAdidReadCallbacks = new ArrayList<>(); - private ArrayList cachedAttributionReadCallbacks = new ArrayList<>(); + private final ArrayList cachedAdidReadCallbacks = new ArrayList<>(); + private final ArrayList cachedAdidReadTimeoutCallbacks = new ArrayList<>(); + private final ArrayList cachedAttributionReadCallbacks = new ArrayList<>(); + private final ArrayList cachedAttributionReadTimeoutCallbacks = new ArrayList<>(); /** * Base path for Adjust packages. */ @@ -104,7 +111,9 @@ public void initSdk(final AdjustConfig adjustConfig) { adjustConfig.purchaseVerificationPath = this.purchaseVerificationPath; adjustConfig.cachedDeeplinkResolutionCallback = cachedDeeplinkResolutionCallback; adjustConfig.cachedAdidReadCallbacks = cachedAdidReadCallbacks; + adjustConfig.cachedAdidReadTimeoutCallbacks = cachedAdidReadTimeoutCallbacks; adjustConfig.cachedAttributionReadCallbacks = cachedAttributionReadCallbacks; + adjustConfig.cachedAttributionReadTimeoutCallbacks = cachedAttributionReadTimeoutCallbacks; activityHandler = AdjustFactory.getActivityHandler(adjustConfig); setSendingReferrersAsNotSent(adjustConfig.context); @@ -517,12 +526,75 @@ public void trackPlayStoreSubscription(AdjustPlayStoreSubscription subscription) */ public void getAdid(OnAdidReadListener onAdidReadListener) { if (!checkActivityHandler("getAdid")) { - cachedAdidReadCallbacks.add(onAdidReadListener); + synchronized (cachedAdidReadCallbacks) { + cachedAdidReadCallbacks.add(onAdidReadListener); + } return; } activityHandler.getAdid(onAdidReadListener); } + /** + * Called to get value of unique Adjust device identifier. + * + * @param timeoutInMilliSec Timeout in milliseconds. + * @param onAdidReadListener Callback to get triggered once identifier is obtained. + * @param context Application context + */ + public void getAdidWithTimeout(long timeoutInMilliSec, OnAdidReadListener onAdidReadListener, Context context) { + if (!checkActivityHandler("getAdidWithTimeout")) { + String adid = Util.getAdidFromActivityStateFile(context); + if (adid != null) { + new Handler(context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + onAdidReadListener.onAdidRead(adid); + } + }); + return; + } + + // adid not found locally + AdjustTimeoutCallback timeoutCallback = new AdjustTimeoutCallback(onAdidReadListener); + + // cache the callback before starting the timer + synchronized (cachedAdidReadTimeoutCallbacks) { + cachedAdidReadTimeoutCallbacks.add(timeoutCallback); + } + + // set up timeout timer immediately + TimerOnce timerOnce = new TimerOnce(new Runnable() { + @Override + public void run() { + if (timeoutCallback.getOnAdidReadListener() != null) { + // remove callback from array and call callback with null + synchronized (cachedAdidReadTimeoutCallbacks) { + cachedAdidReadTimeoutCallbacks.remove(timeoutCallback); + } + new Handler(context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + // if timer elapses, return null (only if callback still exists) + OnAdidReadListener onAdidReadListener = timeoutCallback.getOnAdidReadListener(); + if (onAdidReadListener != null) { + onAdidReadListener.onAdidRead(null); + } + + // null callback to call it only once + timeoutCallback.setOnAdidReadListener(null); + } + }); + } + } + }, ADID_TIMEOUT_TIMER_NAME); + + timeoutCallback.setTimer(timerOnce); + timerOnce.startIn(timeoutInMilliSec); + return; + } + activityHandler.getAdidWithTimeout(timeoutInMilliSec, onAdidReadListener); + } + /** * Called to get user's current attribution value. * @@ -530,12 +602,75 @@ public void getAdid(OnAdidReadListener onAdidReadListener) { */ public void getAttribution(OnAttributionReadListener attributionReadListener) { if (!checkActivityHandler("getAttribution")) { - cachedAttributionReadCallbacks.add(attributionReadListener); + synchronized (cachedAttributionReadCallbacks) { + cachedAttributionReadCallbacks.add(attributionReadListener); + } return; } activityHandler.getAttribution(attributionReadListener); } + /** + * Called to get user's current attribution value. + * + * @param timeoutInMilliSec Timeout in milliseconds. + * @param attributionReadListener Callback to get triggered once attribution is obtained. + * @param context Application context + */ + public void getAttributionWithTimeout(long timeoutInMilliSec, OnAttributionReadListener attributionReadListener, Context context) { + if (!checkActivityHandler("getAttributionWithTimeout")) { + AdjustAttribution adjustAttribution = Util.getAttributionFromAttributionFile(context); + if (adjustAttribution != null) { + new Handler(context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + attributionReadListener.onAttributionRead(adjustAttribution); + } + }); + return; + } + + // attribution not found locally + AdjustTimeoutCallback timeoutCallback = new AdjustTimeoutCallback(attributionReadListener); + + // cache the callback before starting the timer + synchronized (cachedAttributionReadTimeoutCallbacks) { + cachedAttributionReadTimeoutCallbacks.add(timeoutCallback); + } + + // set up timeout timer immediately + TimerOnce timerOnce = new TimerOnce(new Runnable() { + @Override + public void run() { + if (timeoutCallback.getOnAttributionReadListener() != null) { + // remove callback from array and call callback with null + synchronized (cachedAttributionReadTimeoutCallbacks) { + cachedAttributionReadTimeoutCallbacks.remove(timeoutCallback); + } + new Handler(context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + // if timer elapses, return null (only if callback still exists) + OnAttributionReadListener onAttributionReadListener = timeoutCallback.getOnAttributionReadListener(); + if (onAttributionReadListener != null) { + onAttributionReadListener.onAttributionRead(null); + } + + // null callback to call it only once + timeoutCallback.setOnAttributionReadListener(null); + } + }); + } + } + }, ATTRIBUTION_TIMEOUT_TIMER_NAME); + + timeoutCallback.setTimer(timerOnce); + timerOnce.startIn(timeoutInMilliSec); + return; + } + activityHandler.getAttributionWithTimeout(timeoutInMilliSec, attributionReadListener); + } + /** * Called to get native SDK version string. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTimeoutCallback.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTimeoutCallback.java new file mode 100644 index 000000000..f868141ee --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTimeoutCallback.java @@ -0,0 +1,41 @@ +package com.adjust.sdk; + +import com.adjust.sdk.scheduler.TimerOnce; + +public class AdjustTimeoutCallback { + private OnAdidReadListener onAdidReadListener; + private OnAttributionReadListener onAttributionReadListener; + private TimerOnce timeoutTimer; + + public AdjustTimeoutCallback(OnAdidReadListener onAdidReadListener) { + this.onAdidReadListener = onAdidReadListener; + } + + public AdjustTimeoutCallback(OnAttributionReadListener onAttributionReadListener) { + this.onAttributionReadListener = onAttributionReadListener; + } + + public void setOnAdidReadListener(OnAdidReadListener onAdidReadListener) { + this.onAdidReadListener = onAdidReadListener; + } + + public void setOnAttributionReadListener(OnAttributionReadListener onAttributionReadListener) { + this.onAttributionReadListener = onAttributionReadListener; + } + + public void setTimer(TimerOnce timer) { + this.timeoutTimer = timer; + } + + public OnAdidReadListener getOnAdidReadListener() { + return onAdidReadListener; + } + + public OnAttributionReadListener getOnAttributionReadListener() { + return onAttributionReadListener; + } + + public TimerOnce getTimeoutTimer() { + return timeoutTimer; + } +} diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 2c5ae3cd7..c1d39959e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -103,4 +103,8 @@ public interface Constants { String ADJUST_PREINSTALL_CONTENT_PROVIDER_INTENT_ACTION = "com.attribution.REFERRAL_PROVIDER"; String ADJUST_PREINSTALL_FILE_SYSTEM_PATH = "/data/local/tmp/adjust.preinstall"; String EXTRA_SYSTEM_INSTALLER_REFERRER = "com.attribution.EXTRA_SYSTEM_INSTALLER_REFERRER"; + + String ADID_TIMEOUT_TIMER_NAME = "Get Adid timeout timer"; + String ATTRIBUTION_TIMEOUT_TIMER_NAME = "Get Attribution timeout timer"; + } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index d43a47c57..7e37483b0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -93,8 +93,12 @@ public interface IActivityHandler { void getAdid(OnAdidReadListener onAdidReadListener); + void getAdidWithTimeout(long timeoutInMilliSec, OnAdidReadListener onAdidReadListener); + void getAttribution(OnAttributionReadListener onAttributionReadListener); + void getAttributionWithTimeout(long timeoutInMilliSec, OnAttributionReadListener onAttributionReadListener); + AdjustConfig getAdjustConfig(); DeviceInfo getDeviceInfo(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index 114c2c14f..08be554a5 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -807,4 +807,25 @@ public static AdjustAttribution attributionFromJson(final JSONObject jsonObject, return attribution; } + + public static String getAdidFromActivityStateFile(final Context context) { + ActivityState activityState = Util.readObject( + context, + Constants.ACTIVITY_STATE_FILENAME, + "Activity state", + ActivityState.class); + if (activityState == null) { + return null; + } else { + return activityState.adid; + } + } + + public static AdjustAttribution getAttributionFromAttributionFile(final Context context) { + return Util.readObject( + context, + Constants.ATTRIBUTION_FILENAME, + "Attribution", + AdjustAttribution.class); + } } \ No newline at end of file From a50f64b8b8d271e5b551451dcc1da027d4ceeae1 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 19 Nov 2025 16:37:23 +0100 Subject: [PATCH 451/540] feat: add adid and attribution getter with timeout in webbridge --- .../src/main/assets/adjust.js | 24 +++++++++++++++++ .../sdk/webbridge/AdjustBridgeInstance.java | 27 +++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 98e42989e..49cc5d459 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -231,6 +231,18 @@ var Adjust = { } }, + getAdidWithTimeout: function (timeoutInMilliSec, callback) { + if (AdjustBridge) { + if (typeof callback === 'string' || callback instanceof String) { + this.getAdIdCallbackName = callback; + } else { + this.getAdIdCallbackName = 'Adjust.adjust_getAdIdCallback'; + this.getAdIdCallbackFunction = callback; + } + AdjustBridge.getAdidWithTimeout(timeoutInMilliSec, this.getAdIdCallbackName); + } + }, + adjust_getAdIdCallback: function (adId) { if (AdjustBridge && this.getAdIdCallbackFunction) { this.getAdIdCallbackFunction(adId); @@ -267,6 +279,18 @@ var Adjust = { } }, + getAttributionWithTimeout: function (timeoutInMilliSec, callback) { + if (AdjustBridge) { + if (typeof callback === 'string' || callback instanceof String) { + this.getAttributionCallbackName = callback; + } else { + this.getAttributionCallbackName = 'Adjust.adjust_getAttributionCallback'; + this.getAttributionCallbackFunction = callback; + } + AdjustBridge.getAttributionWithTimeout(timeoutInMilliSec, this.getAttributionCallbackName); + } + }, + adjust_getAttributionCallback: function (attribution) { if (AdjustBridge && this.getAttributionCallbackFunction) { this.getAttributionCallbackFunction(attribution); diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 57188f849..e0d106d08 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -765,6 +765,19 @@ public void onAdidRead(String adid) { }); } + @JavascriptInterface + public void getAdidWithTimeout(final long timeoutInMilliSec, final String callback) { + if (!isInitialized()) { + return; + } + Adjust.getAdidWithTimeout(timeoutInMilliSec, new OnAdidReadListener() { + @Override + public void onAdidRead(String adid) { + AdjustBridgeUtil.execSingleValueCallback(webView, callback, adid); + } + }, application.getApplicationContext()); + } + @JavascriptInterface public void getAttribution(final String callback) { if (!isInitialized()) { @@ -779,6 +792,20 @@ public void onAttributionRead(AdjustAttribution attribution) { }); } + @JavascriptInterface + public void getAttributionWithTimeout(final long timeoutInMilliSec, final String callback) { + if (!isInitialized()) { + return; + } + Adjust.getAttributionWithTimeout(timeoutInMilliSec, new OnAttributionReadListener() { + @Override + public void onAttributionRead(AdjustAttribution attribution) { + AdjustBridgeUtil.execAttributionCallbackCommand(webView, callback, attribution); + } + + }, application.getApplicationContext()); + } + @JavascriptInterface public void getSdkVersion(final String callback) { if (!isInitialized()) { From bb82dad43c64f58b9bd3e2c010f68960bad1a947 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 21 Nov 2025 10:07:41 +0100 Subject: [PATCH 452/540] refactor: extract timeout callbacks --- .../java/com/adjust/sdk/ActivityHandler.java | 152 ++++++++++-------- .../src/main/java/com/adjust/sdk/Adjust.java | 4 +- .../java/com/adjust/sdk/AdjustInstance.java | 99 +++--------- 3 files changed, 107 insertions(+), 148 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 5b782ccca..583490501 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -868,39 +868,8 @@ public void run() { } // adid not found in activity state - // store timeout callback for later processing - AdjustTimeoutCallback timeoutCallback = new AdjustTimeoutCallback(callback); - - // set up timeout timer immediately - TimerOnce timerOnce = new TimerOnce(new Runnable() { - @Override - public void run() { - if (timeoutCallback.getOnAdidReadListener() != null) { - // remove callback from array and call callback with null - synchronized (cachedAdidReadTimeoutCallbacks) { - cachedAdidReadTimeoutCallbacks.remove(timeoutCallback); - } - new Handler(getContext().getMainLooper()).post(new Runnable() { - @Override - public void run() { - // if timer elapses, return null (only if callback still exists) - if (timeoutCallback.getOnAdidReadListener() != null) { - timeoutCallback.getOnAdidReadListener().onAdidRead(null); - } - - // null callback to call it only once - timeoutCallback.setOnAdidReadListener(null); - } - }); - } - } - }, ADID_TIMEOUT_TIMER_NAME); - - timeoutCallback.setTimer(timerOnce); - synchronized (cachedAdidReadTimeoutCallbacks) { - cachedAdidReadTimeoutCallbacks.add(timeoutCallback); - } - timerOnce.startIn(timeoutInMilliSec); + // queue timeout callback for later processing + queueGetAdidWithTimeout(timeoutInMilliSec, callback, cachedAdidReadTimeoutCallbacks, getContext()); } } @@ -931,39 +900,8 @@ public void run() { }); } else { // attribution not found - // store timeout callback for later processing - AdjustTimeoutCallback timeoutCallback = new AdjustTimeoutCallback(onAttributionReadListener); - - // set up timeout timer immediately - TimerOnce timerOnce = new TimerOnce(new Runnable() { - @Override - public void run() { - if (timeoutCallback.getOnAttributionReadListener() != null) { - // remove callback from array and call callback with null - synchronized (cachedAttributionReadTimeoutCallbacks) { - cachedAttributionReadTimeoutCallbacks.remove(timeoutCallback); - } - new Handler(getContext().getMainLooper()).post(new Runnable() { - @Override - public void run() { - // if timer elapses, return null (only if callback still exists) - if (timeoutCallback.getOnAttributionReadListener() != null) { - timeoutCallback.getOnAttributionReadListener().onAttributionRead(null); - } - - // null callback to call it only once - timeoutCallback.setOnAttributionReadListener(null); - } - }); - } - } - }, ATTRIBUTION_TIMEOUT_TIMER_NAME); - - timeoutCallback.setTimer(timerOnce); - synchronized (cachedAttributionReadTimeoutCallbacks) { - cachedAttributionReadTimeoutCallbacks.add(timeoutCallback); - } - timerOnce.startIn(timeoutInMilliSec); + // queue timeout callback for later processing + queueGetAttributionWithTimeout(timeoutInMilliSec, onAttributionReadListener, cachedAttributionReadTimeoutCallbacks, getContext()); } } @@ -1008,6 +946,88 @@ public InternalState getInternalState() { return internalState; } + public static void queueGetAdidWithTimeout(final long timeoutInMilliSec, + final OnAdidReadListener onAdidReadListener, + final ArrayList cachedAdidReadTimeoutCallbacks, + final Context context) { + AdjustTimeoutCallback timeoutCallback = new AdjustTimeoutCallback(onAdidReadListener); + + // cache the callback before starting the timer + synchronized (cachedAdidReadTimeoutCallbacks) { + cachedAdidReadTimeoutCallbacks.add(timeoutCallback); + } + + // set up timeout timer immediately + TimerOnce timerOnce = new TimerOnce(new Runnable() { + @Override + public void run() { + if (timeoutCallback.getOnAdidReadListener() != null) { + // remove callback from array and call callback with null + synchronized (cachedAdidReadTimeoutCallbacks) { + cachedAdidReadTimeoutCallbacks.remove(timeoutCallback); + } + new Handler(context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + // if timer elapses, return null (only if callback still exists) + OnAdidReadListener onAdidReadListener = timeoutCallback.getOnAdidReadListener(); + if (onAdidReadListener != null) { + onAdidReadListener.onAdidRead(null); + } + + // null callback to call it only once + timeoutCallback.setOnAdidReadListener(null); + } + }); + } + } + }, ADID_TIMEOUT_TIMER_NAME); + + timeoutCallback.setTimer(timerOnce); + timerOnce.startIn(timeoutInMilliSec); + } + + public static void queueGetAttributionWithTimeout(final long timeoutInMilliSec, + final OnAttributionReadListener attributionReadListener, + final ArrayList cachedAttributionReadTimeoutCallbacks, + final Context context) { + AdjustTimeoutCallback timeoutCallback = new AdjustTimeoutCallback(attributionReadListener); + + // cache the callback before starting the timer + synchronized (cachedAttributionReadTimeoutCallbacks) { + cachedAttributionReadTimeoutCallbacks.add(timeoutCallback); + } + + // set up timeout timer immediately + TimerOnce timerOnce = new TimerOnce(new Runnable() { + @Override + public void run() { + if (timeoutCallback.getOnAttributionReadListener() != null) { + // remove callback from array and call callback with null + synchronized (cachedAttributionReadTimeoutCallbacks) { + cachedAttributionReadTimeoutCallbacks.remove(timeoutCallback); + } + new Handler(context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + // if timer elapses, return null (only if callback still exists) + OnAttributionReadListener onAttributionReadListener = timeoutCallback.getOnAttributionReadListener(); + if (onAttributionReadListener != null) { + onAttributionReadListener.onAttributionRead(null); + } + + // null callback to call it only once + timeoutCallback.setOnAttributionReadListener(null); + } + }); + } + } + }, ATTRIBUTION_TIMEOUT_TIMER_NAME); + + timeoutCallback.setTimer(timerOnce); + timerOnce.startIn(timeoutInMilliSec); + } + void initI() { SESSION_INTERVAL = AdjustFactory.getSessionInterval(); SUBSESSION_INTERVAL = AdjustFactory.getSubsessionInterval(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index a9f567601..5eda64a4e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -362,7 +362,7 @@ public static void getAdidWithTimeout(final long timeoutInMilliSec, } AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.getAdidWithTimeout(timeoutInMilliSec, onAdidReadListener, context); + adjustInstance.getAdidWithTimeout(timeoutInMilliSec, onAdidReadListener, extractApplicationContext(context)); } /** @@ -404,7 +404,7 @@ public static void getAttributionWithTimeout(final long timeoutInMilliSec, } AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.getAttributionWithTimeout(timeoutInMilliSec, attributionReadListener, context); + adjustInstance.getAttributionWithTimeout(timeoutInMilliSec, attributionReadListener, extractApplicationContext(context)); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 7d1c64057..5dea98de0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -1,8 +1,5 @@ package com.adjust.sdk; -import static com.adjust.sdk.Constants.ADID_TIMEOUT_TIMER_NAME; -import static com.adjust.sdk.Constants.ATTRIBUTION_TIMEOUT_TIMER_NAME; - import android.net.Uri; import android.content.Context; import android.os.Handler; @@ -10,7 +7,6 @@ import com.adjust.sdk.scheduler.AsyncTaskExecutor; import com.adjust.sdk.scheduler.SingleThreadCachedScheduler; import com.adjust.sdk.scheduler.ThreadExecutor; -import com.adjust.sdk.scheduler.TimerOnce; import java.util.List; import java.util.ArrayList; @@ -543,53 +539,25 @@ public void getAdid(OnAdidReadListener onAdidReadListener) { */ public void getAdidWithTimeout(long timeoutInMilliSec, OnAdidReadListener onAdidReadListener, Context context) { if (!checkActivityHandler("getAdidWithTimeout")) { - String adid = Util.getAdidFromActivityStateFile(context); - if (adid != null) { - new Handler(context.getMainLooper()).post(new Runnable() { - @Override - public void run() { - onAdidReadListener.onAdidRead(adid); - } - }); - return; - } - - // adid not found locally - AdjustTimeoutCallback timeoutCallback = new AdjustTimeoutCallback(onAdidReadListener); - - // cache the callback before starting the timer - synchronized (cachedAdidReadTimeoutCallbacks) { - cachedAdidReadTimeoutCallbacks.add(timeoutCallback); - } - - // set up timeout timer immediately - TimerOnce timerOnce = new TimerOnce(new Runnable() { + ThreadExecutor executor = new SingleThreadCachedScheduler("getAdidWithTimeout"); + executor.submit(new Runnable() { @Override public void run() { - if (timeoutCallback.getOnAdidReadListener() != null) { - // remove callback from array and call callback with null - synchronized (cachedAdidReadTimeoutCallbacks) { - cachedAdidReadTimeoutCallbacks.remove(timeoutCallback); - } + String adid = Util.getAdidFromActivityStateFile(context); + if (adid != null) { new Handler(context.getMainLooper()).post(new Runnable() { @Override public void run() { - // if timer elapses, return null (only if callback still exists) - OnAdidReadListener onAdidReadListener = timeoutCallback.getOnAdidReadListener(); - if (onAdidReadListener != null) { - onAdidReadListener.onAdidRead(null); - } - - // null callback to call it only once - timeoutCallback.setOnAdidReadListener(null); + onAdidReadListener.onAdidRead(adid); } }); + return; } - } - }, ADID_TIMEOUT_TIMER_NAME); - timeoutCallback.setTimer(timerOnce); - timerOnce.startIn(timeoutInMilliSec); + // adid not found locally + ActivityHandler.queueGetAdidWithTimeout(timeoutInMilliSec, onAdidReadListener, cachedAdidReadTimeoutCallbacks, context); + } + }); return; } activityHandler.getAdidWithTimeout(timeoutInMilliSec, onAdidReadListener); @@ -619,53 +587,24 @@ public void getAttribution(OnAttributionReadListener attributionReadListener) { */ public void getAttributionWithTimeout(long timeoutInMilliSec, OnAttributionReadListener attributionReadListener, Context context) { if (!checkActivityHandler("getAttributionWithTimeout")) { - AdjustAttribution adjustAttribution = Util.getAttributionFromAttributionFile(context); - if (adjustAttribution != null) { - new Handler(context.getMainLooper()).post(new Runnable() { - @Override - public void run() { - attributionReadListener.onAttributionRead(adjustAttribution); - } - }); - return; - } - - // attribution not found locally - AdjustTimeoutCallback timeoutCallback = new AdjustTimeoutCallback(attributionReadListener); - - // cache the callback before starting the timer - synchronized (cachedAttributionReadTimeoutCallbacks) { - cachedAttributionReadTimeoutCallbacks.add(timeoutCallback); - } - - // set up timeout timer immediately - TimerOnce timerOnce = new TimerOnce(new Runnable() { + ThreadExecutor executor = new SingleThreadCachedScheduler("getAttributionWithTimeout"); + executor.submit(new Runnable() { @Override public void run() { - if (timeoutCallback.getOnAttributionReadListener() != null) { - // remove callback from array and call callback with null - synchronized (cachedAttributionReadTimeoutCallbacks) { - cachedAttributionReadTimeoutCallbacks.remove(timeoutCallback); - } + AdjustAttribution adjustAttribution = Util.getAttributionFromAttributionFile(context); + if (adjustAttribution != null) { new Handler(context.getMainLooper()).post(new Runnable() { @Override public void run() { - // if timer elapses, return null (only if callback still exists) - OnAttributionReadListener onAttributionReadListener = timeoutCallback.getOnAttributionReadListener(); - if (onAttributionReadListener != null) { - onAttributionReadListener.onAttributionRead(null); - } - - // null callback to call it only once - timeoutCallback.setOnAttributionReadListener(null); + attributionReadListener.onAttributionRead(adjustAttribution); } }); + } else { + // attribution not found locally + ActivityHandler.queueGetAttributionWithTimeout(timeoutInMilliSec, attributionReadListener, cachedAttributionReadTimeoutCallbacks, context); } } - }, ATTRIBUTION_TIMEOUT_TIMER_NAME); - - timeoutCallback.setTimer(timerOnce); - timerOnce.startIn(timeoutInMilliSec); + }); return; } activityHandler.getAttributionWithTimeout(timeoutInMilliSec, attributionReadListener); From 7b5610b698b98e7b288f4fc8dee98f8c15a5f4db Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 21 Nov 2025 10:17:04 +0100 Subject: [PATCH 453/540] test: add ability to test getters --- .../sdk/webbridge/AdjustBridgeInstance.java | 2 +- .../sdk/webbridge/AdjustBridgeUtil.java | 59 ++++++++++------ .../adjust/testapp/AdjustCommandExecutor.java | 70 +++++++++++++++++++ .../src/main/assets/command_executor.js | 61 ++++++++++++++++ 4 files changed, 171 insertions(+), 21 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index e0d106d08..8d8669bd7 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -773,7 +773,7 @@ public void getAdidWithTimeout(final long timeoutInMilliSec, final String callba Adjust.getAdidWithTimeout(timeoutInMilliSec, new OnAdidReadListener() { @Override public void onAdidRead(String adid) { - AdjustBridgeUtil.execSingleValueCallback(webView, callback, adid); + AdjustBridgeUtil.execAdidCallbackCommand(webView, callback, adid); } }, application.getApplicationContext()); } diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java index ea3c66654..c3b7f8aee 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java @@ -116,35 +116,54 @@ public static Integer fieldToInteger(Object field) { } } - - public static void execAttributionCallbackCommand(final WebView webView, final String commandName, final AdjustAttribution attribution) { + public static void execAdidCallbackCommand(final WebView webView, final String commandName, final String adid) { if (webView == null) { return; } - if (attribution == null) { + + webView.post(new Runnable() { + @Override + public void run() { + if (adid != null ) { + String command = "javascript:" + commandName + "('" + adid + "');"; + webView.loadUrl(command); + } else { + String command = "javascript:" + commandName + "(null);"; + webView.loadUrl(command); + } + } + }); + } + + public static void execAttributionCallbackCommand(final WebView webView, final String commandName, final AdjustAttribution attribution) { + if (webView == null) { return; } - webView.post(new Runnable() { @Override public void run() { - JSONObject jsonAttribution = new JSONObject(); try { - jsonAttribution.put("trackerName", attribution.trackerName == null ? JSONObject.NULL : attribution.trackerName); - jsonAttribution.put("trackerToken", attribution.trackerToken == null ? JSONObject.NULL : attribution.trackerToken); - jsonAttribution.put("campaign", attribution.campaign == null ? JSONObject.NULL : attribution.campaign); - jsonAttribution.put("network", attribution.network == null ? JSONObject.NULL : attribution.network); - jsonAttribution.put("creative", attribution.creative == null ? JSONObject.NULL : attribution.creative); - jsonAttribution.put("adgroup", attribution.adgroup == null ? JSONObject.NULL : attribution.adgroup); - jsonAttribution.put("clickLabel", attribution.clickLabel == null ? JSONObject.NULL : attribution.clickLabel); - jsonAttribution.put("costType", attribution.costType == null ? JSONObject.NULL : attribution.costType); - jsonAttribution.put("costAmount", attribution.costAmount == null || attribution.costAmount.isNaN() ? 0 : attribution.costAmount); - jsonAttribution.put("costCurrency", attribution.costCurrency == null ? JSONObject.NULL : attribution.costCurrency); - jsonAttribution.put("fbInstallReferrer", attribution.fbInstallReferrer == null ? JSONObject.NULL : attribution.fbInstallReferrer); - jsonAttribution.put("jsonResponse", attribution.jsonResponse == null ? JSONObject.NULL : new JSONObject(attribution.jsonResponse)); - - String command = "javascript:" + commandName + "(" + jsonAttribution.toString() + ");"; - webView.loadUrl(command); + if (attribution != null) { + JSONObject jsonAttribution = new JSONObject(); + jsonAttribution.put("trackerName", attribution.trackerName == null ? JSONObject.NULL : attribution.trackerName); + jsonAttribution.put("trackerToken", attribution.trackerToken == null ? JSONObject.NULL : attribution.trackerToken); + jsonAttribution.put("campaign", attribution.campaign == null ? JSONObject.NULL : attribution.campaign); + jsonAttribution.put("network", attribution.network == null ? JSONObject.NULL : attribution.network); + jsonAttribution.put("creative", attribution.creative == null ? JSONObject.NULL : attribution.creative); + jsonAttribution.put("adgroup", attribution.adgroup == null ? JSONObject.NULL : attribution.adgroup); + jsonAttribution.put("clickLabel", attribution.clickLabel == null ? JSONObject.NULL : attribution.clickLabel); + jsonAttribution.put("costType", attribution.costType == null ? JSONObject.NULL : attribution.costType); + jsonAttribution.put("costAmount", attribution.costAmount == null || attribution.costAmount.isNaN() ? 0 : attribution.costAmount); + jsonAttribution.put("costCurrency", attribution.costCurrency == null ? JSONObject.NULL : attribution.costCurrency); + jsonAttribution.put("fbInstallReferrer", attribution.fbInstallReferrer == null ? JSONObject.NULL : attribution.fbInstallReferrer); + jsonAttribution.put("jsonResponse", attribution.jsonResponse == null ? JSONObject.NULL : new JSONObject(attribution.jsonResponse)); + + String command = "javascript:" + commandName + "(" + jsonAttribution.toString() + ");"; + webView.loadUrl(command); + } else { + String command = "javascript:" + commandName + "(null);"; + webView.loadUrl(command); + } } catch (Exception e) { e.printStackTrace(); } diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index ba6d62ba9..ee37b61ae 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -27,6 +27,7 @@ import com.adjust.sdk.AdjustTestOptions; import com.adjust.sdk.AdjustThirdPartySharing; import com.adjust.sdk.LogLevel; +import com.adjust.sdk.OnAdidReadListener; import com.adjust.sdk.OnAttributionChangedListener; import com.adjust.sdk.OnDeeplinkResolvedListener; import com.adjust.sdk.OnDeferredDeeplinkResponseListener; @@ -95,6 +96,10 @@ public void executeCommand(final Command sentCommand) { case "verifyTrack": verifyTrack(); break; case "processDeeplink" : processDeeplink(); break; case "attributionGetter" : attributionGetter(); break; + case "attributionGetterWithTimeout" : attributionGetterWithTimeout(); break; + case "adidGetter" : adidGetter(); break; + case "adidGetterWithTimeout" : adidGetterWithTimeout(); break; + case "sdkVersionGetter" : sdkVersionGetter(); break; case "getLastDeeplink" : getLastDeeplink(); break; case "endFirstSessionDelay" : endFirstSessionDelay(); break; case "coppaComplianceInDelay" : coppaComplianceInDelay(); break; @@ -929,6 +934,71 @@ private void attributionGetter() { }); } + private void attributionGetterWithTimeout() { + long timeout = Long.parseLong(command.getFirstParameterValue("timeout")); + Adjust.getAttributionWithTimeout(timeout, attribution -> { + Map fields = new HashMap<>(); + if (attribution != null) { + if (attribution.trackerToken != null) + fields.put("tracker_token", attribution.trackerToken); + if (attribution.trackerName != null) + fields.put("tracker_name", attribution.trackerName); + if (attribution.network != null) + fields.put("network", attribution.network); + if (attribution.campaign != null) + fields.put("campaign", attribution.campaign); + if (attribution.adgroup != null) + fields.put("adgroup", attribution.adgroup); + if (attribution.creative != null) + fields.put("creative", attribution.creative); + if (attribution.clickLabel != null) + fields.put("click_label", attribution.clickLabel); + if (attribution.costType != null) + fields.put("cost_type", attribution.costType); + if (attribution.costAmount != null) + fields.put("cost_amount", attribution.costAmount.toString()); + if (attribution.costCurrency != null) + fields.put("cost_currency", attribution.costCurrency); + if (attribution.fbInstallReferrer != null) + fields.put("fb_install_referrer", attribution.fbInstallReferrer); + if (attribution.jsonResponse != null) + fields.put("json_response", attribution.jsonResponse); + + MainActivity.testLibrary.setInfoToSend(fields); + } else { + MainActivity.testLibrary.addInfoToSend("attribution", "null"); + } + + MainActivity.testLibrary.sendInfoToServer(basePath); + }, context); + } + + private void adidGetter() { + Adjust.getAdid(adid -> { + MainActivity.testLibrary.addInfoToSend("adid", adid); + MainActivity.testLibrary.sendInfoToServer(basePath); + }); + } + + private void adidGetterWithTimeout() { + long timeout = Long.parseLong(command.getFirstParameterValue("timeout")); + Adjust.getAdidWithTimeout(timeout, adid -> { + if (adid != null) { + MainActivity.testLibrary.addInfoToSend("adid", adid); + } else { + MainActivity.testLibrary.addInfoToSend("adid", "null"); + } + MainActivity.testLibrary.sendInfoToServer(basePath); + }, context); + } + + private void sdkVersionGetter() { + Adjust.getSdkVersion(sdkVersion -> { + MainActivity.testLibrary.addInfoToSend("sdk_version", sdkVersion); + MainActivity.testLibrary.sendInfoToServer(basePath); + }); + } + private void getLastDeeplink() { final String localBasePath = basePath; Adjust.getLastDeeplink(context, new OnLastDeeplinkReadListener() { diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index 97fe34778..9031d294f 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -136,6 +136,10 @@ AdjustCommandExecutor.prototype.executeCommand = function(command, idx) { case "measurementConsent" : this.measurementConsent(command.params); break; case "trackAdRevenue" : this.trackAdRevenue(command.params); break; case "attributionGetter" : this.attributionGetter(command.params); break; + case "attributionGetterWithTimeout" : this.attributionGetterWithTimeout(command.params); break; + case "adidGetter" : this.adidGetter(command.params); break; + case "adidGetterWithTimeout" : this.adidGetterWithTimeout(command.params); break; + case "sdkVersionGetter" : this.sdkVersionGetter(command.params); break; case "endFirstSessionDelay" : this.endFirstSessionDelay(command.params); break; case "coppaComplianceInDelay" : this.coppaComplianceInDelay(command.params); break; case "playStoreKidsComplianceInDelay" : this.playStoreKidsComplianceInDelay(command.params); break; @@ -738,6 +742,63 @@ AdjustCommandExecutor.prototype.amazonAdIdGetter = function(params) { }); }; +AdjustCommandExecutor.prototype.attributionGetterWithTimeout = function(params) { + var timeoutS = getFirstParameterValue(params, 'timeout'); + var timeout = parseInt(timeoutS); + var basePath = this.basePath; + Adjust.getAttributionWithTimeout(timeout, function(attribution) { + if (attribution != null) { + TestLibrary.addInfoToSend("tracker_token", attribution.trackerToken); + TestLibrary.addInfoToSend("tracker_name", attribution.trackerName); + TestLibrary.addInfoToSend("network", attribution.network); + TestLibrary.addInfoToSend("campaign", attribution.campaign); + TestLibrary.addInfoToSend("adgroup", attribution.adgroup); + TestLibrary.addInfoToSend("creative", attribution.creative); + TestLibrary.addInfoToSend("click_label", attribution.clickLabel); + TestLibrary.addInfoToSend("cost_type", attribution.costType); + TestLibrary.addInfoToSend("cost_amount", attribution.costAmount); + TestLibrary.addInfoToSend("cost_currency", attribution.costCurrency); + TestLibrary.addInfoToSend("fb_install_referrer", attribution.fbInstallReferrer); + TestLibrary.addInfoToSend("json_response", JSON.stringify(attribution.jsonResponse)); + } else { + TestLibrary.addInfoToSend("attribution", "null"); + } + + TestLibrary.sendInfoToServer(basePath); + }); +}; + +AdjustCommandExecutor.prototype.adidGetter = function(params) { + var basePath = this.basePath; + Adjust.getAdid(function(adid) { + TestLibrary.addInfoToSend("adid", adid); + TestLibrary.sendInfoToServer(basePath); + }); +}; + +AdjustCommandExecutor.prototype.adidGetterWithTimeout = function(params) { + var timeoutS = getFirstParameterValue(params, 'timeout'); + var timeout = parseInt(timeoutS); + var basePath = this.basePath; + Adjust.getAdidWithTimeout(timeout, function(adid) { + if (adid != null) { + TestLibrary.addInfoToSend("adid", adid); + } else { + TestLibrary.addInfoToSend("adid", "null"); + } + + TestLibrary.sendInfoToServer(basePath); + }); +}; + +AdjustCommandExecutor.prototype.sdkVersionGetter = function(params) { + var basePath = this.basePath; + Adjust.getSdkVersion(function(sdkVersion) { + TestLibrary.addInfoToSend("sdk_version", sdkVersion); + TestLibrary.sendInfoToServer(basePath); + }); +}; + //Util //====================== function getValueFromKey(params, key) { From 139faf55291250cb7a937b1a3e33afae533a14e7 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 25 Nov 2025 12:05:17 +0100 Subject: [PATCH 454/540] chore: remove unrelated getters testing from this branch --- .../java/com/adjust/testapp/AdjustCommandExecutor.java | 8 -------- .../src/main/assets/command_executor.js | 9 --------- 2 files changed, 17 deletions(-) diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index ee37b61ae..56cccc724 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -99,7 +99,6 @@ public void executeCommand(final Command sentCommand) { case "attributionGetterWithTimeout" : attributionGetterWithTimeout(); break; case "adidGetter" : adidGetter(); break; case "adidGetterWithTimeout" : adidGetterWithTimeout(); break; - case "sdkVersionGetter" : sdkVersionGetter(); break; case "getLastDeeplink" : getLastDeeplink(); break; case "endFirstSessionDelay" : endFirstSessionDelay(); break; case "coppaComplianceInDelay" : coppaComplianceInDelay(); break; @@ -992,13 +991,6 @@ private void adidGetterWithTimeout() { }, context); } - private void sdkVersionGetter() { - Adjust.getSdkVersion(sdkVersion -> { - MainActivity.testLibrary.addInfoToSend("sdk_version", sdkVersion); - MainActivity.testLibrary.sendInfoToServer(basePath); - }); - } - private void getLastDeeplink() { final String localBasePath = basePath; Adjust.getLastDeeplink(context, new OnLastDeeplinkReadListener() { diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index 9031d294f..7125e6062 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -139,7 +139,6 @@ AdjustCommandExecutor.prototype.executeCommand = function(command, idx) { case "attributionGetterWithTimeout" : this.attributionGetterWithTimeout(command.params); break; case "adidGetter" : this.adidGetter(command.params); break; case "adidGetterWithTimeout" : this.adidGetterWithTimeout(command.params); break; - case "sdkVersionGetter" : this.sdkVersionGetter(command.params); break; case "endFirstSessionDelay" : this.endFirstSessionDelay(command.params); break; case "coppaComplianceInDelay" : this.coppaComplianceInDelay(command.params); break; case "playStoreKidsComplianceInDelay" : this.playStoreKidsComplianceInDelay(command.params); break; @@ -791,14 +790,6 @@ AdjustCommandExecutor.prototype.adidGetterWithTimeout = function(params) { }); }; -AdjustCommandExecutor.prototype.sdkVersionGetter = function(params) { - var basePath = this.basePath; - Adjust.getSdkVersion(function(sdkVersion) { - TestLibrary.addInfoToSend("sdk_version", sdkVersion); - TestLibrary.sendInfoToServer(basePath); - }); -}; - //Util //====================== function getValueFromKey(params, key) { From d2fad064b8247ff2f1f979f6cb3a7bf68e468454 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 27 Nov 2025 16:33:03 +0100 Subject: [PATCH 455/540] refactor: updated order of input parameters to align with other getter methods --- .../sdk/webbridge/AdjustBridgeInstance.java | 27 ++++++++------- .../src/main/java/com/adjust/sdk/Adjust.java | 34 +++++++++---------- .../java/com/adjust/sdk/AdjustInstance.java | 8 ++--- .../adjust/testapp/AdjustCommandExecutor.java | 8 ++--- 4 files changed, 38 insertions(+), 39 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 8d8669bd7..236cd85d9 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -770,12 +770,13 @@ public void getAdidWithTimeout(final long timeoutInMilliSec, final String callba if (!isInitialized()) { return; } - Adjust.getAdidWithTimeout(timeoutInMilliSec, new OnAdidReadListener() { - @Override - public void onAdidRead(String adid) { - AdjustBridgeUtil.execAdidCallbackCommand(webView, callback, adid); - } - }, application.getApplicationContext()); + Adjust.getAdidWithTimeout(application.getApplicationContext(), timeoutInMilliSec, + new OnAdidReadListener() { + @Override + public void onAdidRead(String adid) { + AdjustBridgeUtil.execAdidCallbackCommand(webView, callback, adid); + } + }); } @JavascriptInterface @@ -797,13 +798,13 @@ public void getAttributionWithTimeout(final long timeoutInMilliSec, final String if (!isInitialized()) { return; } - Adjust.getAttributionWithTimeout(timeoutInMilliSec, new OnAttributionReadListener() { - @Override - public void onAttributionRead(AdjustAttribution attribution) { - AdjustBridgeUtil.execAttributionCallbackCommand(webView, callback, attribution); - } - - }, application.getApplicationContext()); + Adjust.getAttributionWithTimeout(application.getApplicationContext(), timeoutInMilliSec, + new OnAttributionReadListener() { + @Override + public void onAttributionRead(AdjustAttribution attribution) { + AdjustBridgeUtil.execAttributionCallbackCommand(webView, callback, attribution); + } + }); } @JavascriptInterface diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 5eda64a4e..cebe63c6b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -340,29 +340,28 @@ public static void getAdid(final OnAdidReadListener onAdidReadListener) { /** * Called to get value of unique Adjust device identifier with a timeout * + * @param context Application context * @param timeoutInMilliSec Timeout in milliseconds. If adid is not available within this time, * the callback will return null adid. * @param onAdidReadListener Callback to get triggered once identifier is obtained. - * @param context Application context */ - public static void getAdidWithTimeout(final long timeoutInMilliSec, - final OnAdidReadListener onAdidReadListener, - final Context context) { - if (onAdidReadListener == null) { - AdjustFactory.getLogger().error("Callback for getting adid can't be null"); + public static void getAdidWithTimeout(final Context context, final long timeoutInMilliSec, + final OnAdidReadListener onAdidReadListener) { + if (context == null) { + AdjustFactory.getLogger().error("Context for getting adid can't be null"); return; } if (timeoutInMilliSec < 0) { AdjustFactory.getLogger().error("Timeout value for getting adid can't be negative"); return; } - if (context == null) { - AdjustFactory.getLogger().error("Context for getting adid can't be null"); + if (onAdidReadListener == null) { + AdjustFactory.getLogger().error("Callback for getting adid can't be null"); return; } AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.getAdidWithTimeout(timeoutInMilliSec, onAdidReadListener, extractApplicationContext(context)); + adjustInstance.getAdidWithTimeout(extractApplicationContext(context), timeoutInMilliSec, onAdidReadListener); } /** @@ -382,29 +381,28 @@ public static void getAttribution(final OnAttributionReadListener attributionRea /** * Called to get user's current attribution value. * + * @param context Application context * @param timeoutInMilliSec Timeout in milliseconds. If attribution is not available within this time, * the callback will return null attribution. * @param attributionReadListener Callback to get triggered once attribution is obtained - * @param context Application context */ - public static void getAttributionWithTimeout(final long timeoutInMilliSec, - final OnAttributionReadListener attributionReadListener, - final Context context) { - if (attributionReadListener == null) { - AdjustFactory.getLogger().error("Callback for getting attribution can't be null"); + public static void getAttributionWithTimeout(final Context context, final long timeoutInMilliSec, + final OnAttributionReadListener attributionReadListener) { + if (context == null) { + AdjustFactory.getLogger().error("Context for getting attribution can't be null"); return; } if (timeoutInMilliSec < 0) { AdjustFactory.getLogger().error("Timeout value for getting attribution can't be negative"); return; } - if (context == null) { - AdjustFactory.getLogger().error("Context for getting attribution can't be null"); + if (attributionReadListener == null) { + AdjustFactory.getLogger().error("Callback for getting attribution can't be null"); return; } AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.getAttributionWithTimeout(timeoutInMilliSec, attributionReadListener, extractApplicationContext(context)); + adjustInstance.getAttributionWithTimeout(extractApplicationContext(context), timeoutInMilliSec, attributionReadListener); } /** diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index 5dea98de0..a38b8f556 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -533,11 +533,11 @@ public void getAdid(OnAdidReadListener onAdidReadListener) { /** * Called to get value of unique Adjust device identifier. * + * @param context Application context * @param timeoutInMilliSec Timeout in milliseconds. * @param onAdidReadListener Callback to get triggered once identifier is obtained. - * @param context Application context */ - public void getAdidWithTimeout(long timeoutInMilliSec, OnAdidReadListener onAdidReadListener, Context context) { + public void getAdidWithTimeout(Context context, long timeoutInMilliSec, OnAdidReadListener onAdidReadListener) { if (!checkActivityHandler("getAdidWithTimeout")) { ThreadExecutor executor = new SingleThreadCachedScheduler("getAdidWithTimeout"); executor.submit(new Runnable() { @@ -581,11 +581,11 @@ public void getAttribution(OnAttributionReadListener attributionReadListener) { /** * Called to get user's current attribution value. * + * @param context Application context * @param timeoutInMilliSec Timeout in milliseconds. * @param attributionReadListener Callback to get triggered once attribution is obtained. - * @param context Application context */ - public void getAttributionWithTimeout(long timeoutInMilliSec, OnAttributionReadListener attributionReadListener, Context context) { + public void getAttributionWithTimeout(Context context, long timeoutInMilliSec, OnAttributionReadListener attributionReadListener) { if (!checkActivityHandler("getAttributionWithTimeout")) { ThreadExecutor executor = new SingleThreadCachedScheduler("getAttributionWithTimeout"); executor.submit(new Runnable() { diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 56cccc724..a634085b1 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -935,7 +935,7 @@ private void attributionGetter() { private void attributionGetterWithTimeout() { long timeout = Long.parseLong(command.getFirstParameterValue("timeout")); - Adjust.getAttributionWithTimeout(timeout, attribution -> { + Adjust.getAttributionWithTimeout(context, timeout, attribution -> { Map fields = new HashMap<>(); if (attribution != null) { if (attribution.trackerToken != null) @@ -969,7 +969,7 @@ private void attributionGetterWithTimeout() { } MainActivity.testLibrary.sendInfoToServer(basePath); - }, context); + }); } private void adidGetter() { @@ -981,14 +981,14 @@ private void adidGetter() { private void adidGetterWithTimeout() { long timeout = Long.parseLong(command.getFirstParameterValue("timeout")); - Adjust.getAdidWithTimeout(timeout, adid -> { + Adjust.getAdidWithTimeout(context, timeout, adid -> { if (adid != null) { MainActivity.testLibrary.addInfoToSend("adid", adid); } else { MainActivity.testLibrary.addInfoToSend("adid", "null"); } MainActivity.testLibrary.sendInfoToServer(basePath); - }, context); + }); } private void getLastDeeplink() { From e0e2a6b6b49aa42ec1b67c6f2d4cef3803da0aa4 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 3 Dec 2025 12:20:45 +0100 Subject: [PATCH 456/540] fix: updated synchronisation of getters callback array for uncovered and redundant cases --- .../src/main/assets/adjust.js | 28 +++- .../java/com/adjust/sdk/ActivityHandler.java | 146 ++++++++++-------- .../java/com/adjust/sdk/AdjustInstance.java | 8 +- 3 files changed, 104 insertions(+), 78 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 49cc5d459..48e4f4a9e 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -234,12 +234,12 @@ var Adjust = { getAdidWithTimeout: function (timeoutInMilliSec, callback) { if (AdjustBridge) { if (typeof callback === 'string' || callback instanceof String) { - this.getAdIdCallbackName = callback; + this.getAdIdWithTimeoutCallbackName = callback; } else { - this.getAdIdCallbackName = 'Adjust.adjust_getAdIdCallback'; - this.getAdIdCallbackFunction = callback; + this.getAdIdWithTimeoutCallbackName = 'Adjust.adjust_getAdIdWithTimeoutCallback'; + this.getAdIdWithTimeoutCallbackFunction = callback; } - AdjustBridge.getAdidWithTimeout(timeoutInMilliSec, this.getAdIdCallbackName); + AdjustBridge.getAdidWithTimeout(timeoutInMilliSec, this.getAdIdWithTimeoutCallbackName); } }, @@ -249,6 +249,12 @@ var Adjust = { } }, + adjust_getAdIdWithTimeoutCallback: function (adId) { + if (AdjustBridge && this.getAdIdWithTimeoutCallbackFunction) { + this.getAdIdWithTimeoutCallbackFunction(adId); + } + }, + getAmazonAdId: function (callbackSuccess,callbackFail) { if (AdjustBridge) { if (typeof callbackSuccess === 'string' || callbackSuccess instanceof String) { @@ -282,12 +288,12 @@ var Adjust = { getAttributionWithTimeout: function (timeoutInMilliSec, callback) { if (AdjustBridge) { if (typeof callback === 'string' || callback instanceof String) { - this.getAttributionCallbackName = callback; + this.getAttributionWithTimeoutCallbackName = callback; } else { - this.getAttributionCallbackName = 'Adjust.adjust_getAttributionCallback'; - this.getAttributionCallbackFunction = callback; + this.getAttributionWithTimeoutCallbackName = 'Adjust.adjust_getAttributionWithTimeoutCallback'; + this.getAttributionWithTimeoutCallbackFunction = callback; } - AdjustBridge.getAttributionWithTimeout(timeoutInMilliSec, this.getAttributionCallbackName); + AdjustBridge.getAttributionWithTimeout(timeoutInMilliSec, this.getAttributionWithTimeoutCallbackName); } }, @@ -297,6 +303,12 @@ var Adjust = { } }, + adjust_getAttributionWithTimeoutCallback: function (attribution) { + if (AdjustBridge && this.getAttributionWithTimeoutCallbackFunction) { + this.getAttributionWithTimeoutCallbackFunction(attribution); + } + }, + getSdkVersion: function (callback) { if (AdjustBridge) { if (typeof callback === 'string' || callback instanceof String) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 583490501..18d795380 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -475,18 +475,21 @@ private void updateAdidI(final String adid) { writeActivityStateI(); } - final ArrayList cachedAdidReadCallbacksCopy; - if (!cachedAdidReadCallbacks.isEmpty()) { - synchronized (cachedAdidReadCallbacks) { + ArrayList cachedAdidReadCallbacksCopy = null; + synchronized (cachedAdidReadCallbacks) { + if (!cachedAdidReadCallbacks.isEmpty()) { cachedAdidReadCallbacksCopy = new ArrayList<>(cachedAdidReadCallbacks); cachedAdidReadCallbacks.clear(); } + } - // process regular adid callbacks + // process regular adid callbacks + if (cachedAdidReadCallbacksCopy != null) { + ArrayList finalCachedAdidReadCallbacksCopy = cachedAdidReadCallbacksCopy; new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { @Override public void run() { - for (OnAdidReadListener onAdidReadListener : cachedAdidReadCallbacksCopy) { + for (OnAdidReadListener onAdidReadListener : finalCachedAdidReadCallbacksCopy) { if (onAdidReadListener != null) { onAdidReadListener.onAdidRead(adid); } @@ -495,19 +498,21 @@ public void run() { }); } - final ArrayList cachedAdidReadTimeoutCallbacksCopy; - if (!cachedAdidReadTimeoutCallbacks.isEmpty()) { - - synchronized (cachedAdidReadTimeoutCallbacks) { + ArrayList cachedAdidReadTimeoutCallbacksCopy = null; + synchronized (cachedAdidReadTimeoutCallbacks) { + if (!cachedAdidReadTimeoutCallbacks.isEmpty()) { cachedAdidReadTimeoutCallbacksCopy = new ArrayList<>(cachedAdidReadTimeoutCallbacks); cachedAdidReadTimeoutCallbacks.clear(); } + } - // process timeout adid callbacks + // process timeout adid callbacks + if (cachedAdidReadTimeoutCallbacksCopy != null) { + ArrayList finalCachedAdidReadTimeoutCallbacksCopy = cachedAdidReadTimeoutCallbacksCopy; new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { @Override public void run() { - for (AdjustTimeoutCallback adjustTimeoutCallback : cachedAdidReadTimeoutCallbacksCopy) { + for (AdjustTimeoutCallback adjustTimeoutCallback : finalCachedAdidReadTimeoutCallbacksCopy) { if (adjustTimeoutCallback != null) { // cancel any pending timeout TimerOnce timerOnce = adjustTimeoutCallback.getTimeoutTimer(); @@ -539,18 +544,21 @@ public boolean updateAttributionI(AdjustAttribution attribution) { return false; } - final ArrayList cachedAttributionReadCallbacksCopy; - if (! cachedAttributionReadCallbacks.isEmpty()) { - synchronized (cachedAttributionReadCallbacks) { + ArrayList cachedAttributionReadCallbacksCopy = null; + synchronized (cachedAttributionReadCallbacks) { + if (! cachedAttributionReadCallbacks.isEmpty()) { cachedAttributionReadCallbacksCopy = new ArrayList<>(cachedAttributionReadCallbacks); cachedAttributionReadCallbacks.clear(); } + } - // process regular attribution callbacks + // process regular attribution callbacks + if (cachedAttributionReadCallbacksCopy != null) { + ArrayList finalCachedAttributionReadCallbacksCopy = cachedAttributionReadCallbacksCopy; new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { @Override public void run() { - for (OnAttributionReadListener onAttributionReadListener : cachedAttributionReadCallbacksCopy) { + for (OnAttributionReadListener onAttributionReadListener : finalCachedAttributionReadCallbacksCopy) { if (onAttributionReadListener != null) { onAttributionReadListener.onAttributionRead(attribution); } @@ -559,19 +567,21 @@ public void run() { }); } - final ArrayList cachedAttributionReadTimeoutCallbacksCopy; - if (! cachedAttributionReadTimeoutCallbacks.isEmpty()) { - - synchronized (cachedAttributionReadTimeoutCallbacks) { + ArrayList cachedAttributionReadTimeoutCallbacksCopy = null; + synchronized (cachedAttributionReadTimeoutCallbacks) { + if (! cachedAttributionReadTimeoutCallbacks.isEmpty()) { cachedAttributionReadTimeoutCallbacksCopy = new ArrayList<>(cachedAttributionReadTimeoutCallbacks); cachedAttributionReadTimeoutCallbacks.clear(); } + } - // process timeout attribution callbacks + // process timeout attribution callbacks + if (cachedAttributionReadTimeoutCallbacksCopy != null) { + ArrayList finalCachedAttributionReadTimeoutCallbacksCopy = cachedAttributionReadTimeoutCallbacksCopy; new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { @Override public void run() { - for (AdjustTimeoutCallback adjustTimeoutCallback : cachedAttributionReadTimeoutCallbacksCopy) { + for (AdjustTimeoutCallback adjustTimeoutCallback : finalCachedAttributionReadTimeoutCallbacksCopy) { if (adjustTimeoutCallback != null) { // cancel any pending timeout TimerOnce timerOnce = adjustTimeoutCallback.getTimeoutTimer(); @@ -1235,22 +1245,31 @@ private void handleAttributionCallbackI() { adjustConfig.cachedAttributionReadCallbacks.clear(); } - if (! cachedAttributionReadCallbacks.isEmpty() - && attribution != null) - { - final ArrayList cachedAttributionReadCallbacksCopy; - synchronized (cachedAttributionReadCallbacks) { + synchronized (cachedAttributionReadTimeoutCallbacks) { + cachedAttributionReadTimeoutCallbacks.addAll(adjustConfig.cachedAttributionReadTimeoutCallbacks); + adjustConfig.cachedAttributionReadTimeoutCallbacks.clear(); + } + + if (attribution == null) { + return; + } + + ArrayList cachedAttributionReadCallbacksCopy = null; + synchronized (cachedAttributionReadCallbacks) { + if (! cachedAttributionReadCallbacks.isEmpty()) { cachedAttributionReadCallbacksCopy = new ArrayList<>(cachedAttributionReadCallbacks); cachedAttributionReadCallbacks.clear(); } + } + // process regular attribution callbacks + if (cachedAttributionReadCallbacksCopy != null) { final AdjustAttribution attributionCopy = attribution; - - // process regular attribution callbacks + ArrayList finalCachedAttributionReadCallbacksCopy = cachedAttributionReadCallbacksCopy; new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { @Override public void run() { - for (OnAttributionReadListener onAttributionReadListener : cachedAttributionReadCallbacksCopy) { + for (OnAttributionReadListener onAttributionReadListener : finalCachedAttributionReadCallbacksCopy) { if (onAttributionReadListener != null) { onAttributionReadListener.onAttributionRead(attributionCopy); } @@ -1259,27 +1278,22 @@ public void run() { }); } + ArrayList cachedAttributionReadTimeoutCallbacksCopy = null; synchronized (cachedAttributionReadTimeoutCallbacks) { - cachedAttributionReadTimeoutCallbacks.addAll(adjustConfig.cachedAttributionReadTimeoutCallbacks); - adjustConfig.cachedAttributionReadTimeoutCallbacks.clear(); - } - - if (! cachedAttributionReadTimeoutCallbacks.isEmpty() - && attribution != null) - { - final ArrayList cachedAttributionReadTimeoutCallbacksCopy; - synchronized (cachedAttributionReadTimeoutCallbacks) { + if (! cachedAttributionReadTimeoutCallbacks.isEmpty()) { cachedAttributionReadTimeoutCallbacksCopy = new ArrayList<>(cachedAttributionReadTimeoutCallbacks); cachedAttributionReadTimeoutCallbacks.clear(); } + } + // process timeout attribution callbacks + if (cachedAttributionReadTimeoutCallbacksCopy != null) { final AdjustAttribution attributionCopy = attribution; - - // process timeout attribution callbacks + ArrayList finalCachedAttributionReadTimeoutCallbacksCopy = cachedAttributionReadTimeoutCallbacksCopy; new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { @Override public void run() { - for (AdjustTimeoutCallback adjustTimeoutCallback : cachedAttributionReadTimeoutCallbacksCopy) { + for (AdjustTimeoutCallback adjustTimeoutCallback : finalCachedAttributionReadTimeoutCallbacksCopy) { if (adjustTimeoutCallback != null) { // cancel any pending timeout TimerOnce timerOnce = adjustTimeoutCallback.getTimeoutTimer(); @@ -1306,22 +1320,31 @@ private void handleAdidCallbackI() { adjustConfig.cachedAdidReadCallbacks.clear(); } - if (! cachedAdidReadCallbacks.isEmpty() - && activityState != null - && activityState.adid != null) - { - final ArrayList cachedAdidReadCallbacksCopy; - synchronized (cachedAdidReadCallbacks) { + synchronized (cachedAdidReadTimeoutCallbacks) { + cachedAdidReadTimeoutCallbacks.addAll(adjustConfig.cachedAdidReadTimeoutCallbacks); + adjustConfig.cachedAdidReadTimeoutCallbacks.clear(); + } + + if (activityState == null || activityState.adid == null) { + return; + } + + ArrayList cachedAdidReadCallbacksCopy = null; + synchronized (cachedAdidReadCallbacks) { + if (! cachedAdidReadCallbacks.isEmpty()) { cachedAdidReadCallbacksCopy = new ArrayList<>(cachedAdidReadCallbacks); cachedAdidReadCallbacks.clear(); } - final String adidCopy = activityState.adid; + } - // process regular adid callbacks + // process regular adid callbacks + if (cachedAdidReadCallbacksCopy != null) { + final String adidCopy = activityState.adid; + ArrayList finalCachedAdidReadCallbacksCopy = cachedAdidReadCallbacksCopy; new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { @Override public void run() { - for (OnAdidReadListener onAdidReadListener : cachedAdidReadCallbacksCopy) { + for (OnAdidReadListener onAdidReadListener : finalCachedAdidReadCallbacksCopy) { if (onAdidReadListener != null) { onAdidReadListener.onAdidRead(adidCopy); } @@ -1330,28 +1353,23 @@ public void run() { }); } - synchronized (cachedAdidReadTimeoutCallbacks) { - cachedAdidReadTimeoutCallbacks.addAll(adjustConfig.cachedAdidReadTimeoutCallbacks); - adjustConfig.cachedAdidReadTimeoutCallbacks.clear(); - } - if (! cachedAdidReadTimeoutCallbacks.isEmpty() - && activityState != null - && activityState.adid != null) - { - final ArrayList cachedAdidReadTimeoutCallbacksCopy; - synchronized (cachedAdidReadTimeoutCallbacks) { + ArrayList cachedAdidReadTimeoutCallbacksCopy = null; + synchronized (cachedAdidReadTimeoutCallbacks) { + if (! cachedAdidReadTimeoutCallbacks.isEmpty()) { cachedAdidReadTimeoutCallbacksCopy = new ArrayList<>(cachedAdidReadTimeoutCallbacks); cachedAdidReadTimeoutCallbacks.clear(); } + } + // process timeout adid callbacks + if (cachedAdidReadTimeoutCallbacksCopy != null) { final String adidCopy = activityState.adid; - - // process timeout adid callbacks + ArrayList finalCachedAdidReadTimeoutCallbacksCopy = cachedAdidReadTimeoutCallbacksCopy; new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { @Override public void run() { - for (AdjustTimeoutCallback adjustTimeoutCallback : cachedAdidReadTimeoutCallbacksCopy) { + for (AdjustTimeoutCallback adjustTimeoutCallback : finalCachedAdidReadTimeoutCallbacksCopy) { if (adjustTimeoutCallback != null) { // cancel any pending timeout TimerOnce timerOnce = adjustTimeoutCallback.getTimeoutTimer(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index a38b8f556..fe2d669c1 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -522,9 +522,7 @@ public void trackPlayStoreSubscription(AdjustPlayStoreSubscription subscription) */ public void getAdid(OnAdidReadListener onAdidReadListener) { if (!checkActivityHandler("getAdid")) { - synchronized (cachedAdidReadCallbacks) { - cachedAdidReadCallbacks.add(onAdidReadListener); - } + cachedAdidReadCallbacks.add(onAdidReadListener); return; } activityHandler.getAdid(onAdidReadListener); @@ -570,9 +568,7 @@ public void run() { */ public void getAttribution(OnAttributionReadListener attributionReadListener) { if (!checkActivityHandler("getAttribution")) { - synchronized (cachedAttributionReadCallbacks) { - cachedAttributionReadCallbacks.add(attributionReadListener); - } + cachedAttributionReadCallbacks.add(attributionReadListener); return; } activityHandler.getAttribution(attributionReadListener); From 153125a092fabd6c68f9522fccefd87ddd074283 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 4 Dec 2025 15:22:23 +0100 Subject: [PATCH 457/540] test: fix race condition when running addInfoToSend from multiple threads --- .../java/com/adjust/test/TestLibrary.java | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/Adjust/tests/test-library/src/main/java/com/adjust/test/TestLibrary.java b/Adjust/tests/test-library/src/main/java/com/adjust/test/TestLibrary.java index e52dad324..da1a5c7c7 100644 --- a/Adjust/tests/test-library/src/main/java/com/adjust/test/TestLibrary.java +++ b/Adjust/tests/test-library/src/main/java/com/adjust/test/TestLibrary.java @@ -147,21 +147,38 @@ public void run() { } public void addInfoToSend(String key, String value) { - if (infoToServer == null) { - infoToServer = new HashMap(); + synchronized (this) { + if (infoToServer == null) { + infoToServer = new HashMap(); + } + infoToServer.put(key, value); } - infoToServer.put(key, value); } public void setInfoToSend(Map info) { - infoToServer = info; + synchronized (this) { + infoToServer = info; + } } public void sendInfoToServer(final String basePath) { + // Create a snapshot of the current infoToServer map to avoid race conditions + // when multiple callbacks execute concurrently + final Map infoSnapshot; + synchronized (this) { + if (infoToServer == null || infoToServer.isEmpty()) { + infoSnapshot = new HashMap(); + } else { + infoSnapshot = new HashMap(infoToServer); + } + // Clear the shared map immediately so next callback starts fresh + infoToServer = null; + } + executor.submit(new Runnable() { @Override public void run() { - sendInfoToServerI(basePath); + sendInfoToServerI(basePath, infoSnapshot); } }); } @@ -178,9 +195,8 @@ private void startTestSessionI(String clientSdk) { readResponseI(response); } - private void sendInfoToServerI(String basePath) { - Networking.Response response = networking.sendPost("/test_info", basePath, infoToServer); - infoToServer = null; + private void sendInfoToServerI(String basePath, Map infoToSend) { + Networking.Response response = networking.sendPost("/test_info", basePath, infoToSend); readResponseI(response); } From f7eb54fe105add63e2ffba90829cc826c75c0db5 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 4 Dec 2025 15:22:44 +0100 Subject: [PATCH 458/540] test: add support for getters burst tests --- .../adjust/testapp/AdjustCommandExecutor.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index a634085b1..b141d6a39 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -901,8 +901,11 @@ public void onDeeplinkResolved(String resolvedLink) { } private void attributionGetter() { + String testId = command.getFirstParameterValue("id"); + Adjust.getAttribution(attribution -> { Map fields = new HashMap<>(); + fields.put("id", testId); if (attribution.trackerToken != null) fields.put("tracker_token", attribution.trackerToken); if (attribution.trackerName != null) @@ -935,8 +938,11 @@ private void attributionGetter() { private void attributionGetterWithTimeout() { long timeout = Long.parseLong(command.getFirstParameterValue("timeout")); + String testId = command.getFirstParameterValue("id"); + Adjust.getAttributionWithTimeout(context, timeout, attribution -> { Map fields = new HashMap<>(); + fields.put("id", testId); if (attribution != null) { if (attribution.trackerToken != null) fields.put("tracker_token", attribution.trackerToken); @@ -973,20 +979,26 @@ private void attributionGetterWithTimeout() { } private void adidGetter() { + String testId = command.getFirstParameterValue("id"); + Adjust.getAdid(adid -> { MainActivity.testLibrary.addInfoToSend("adid", adid); + MainActivity.testLibrary.addInfoToSend("id", testId); MainActivity.testLibrary.sendInfoToServer(basePath); }); } private void adidGetterWithTimeout() { long timeout = Long.parseLong(command.getFirstParameterValue("timeout")); + String testId = command.getFirstParameterValue("id"); + Adjust.getAdidWithTimeout(context, timeout, adid -> { if (adid != null) { MainActivity.testLibrary.addInfoToSend("adid", adid); } else { MainActivity.testLibrary.addInfoToSend("adid", "null"); } + MainActivity.testLibrary.addInfoToSend("id", testId); MainActivity.testLibrary.sendInfoToServer(basePath); }); } @@ -1032,22 +1044,31 @@ private void externalDeviceIdInDelay() { } private void sdkVersionGetter() { + String testId = command.getFirstParameterValue("id"); + Adjust.getSdkVersion(sdkVersion -> { MainActivity.testLibrary.addInfoToSend("sdk_version", sdkVersion); + MainActivity.testLibrary.addInfoToSend("id", testId); MainActivity.testLibrary.sendInfoToServer(basePath); }); } private void googleAdIdGetter() { + String testId = command.getFirstParameterValue("id"); + Adjust.getGoogleAdId(context, googleAdId -> { MainActivity.testLibrary.addInfoToSend("gps_adid", googleAdId); + MainActivity.testLibrary.addInfoToSend("id", testId); MainActivity.testLibrary.sendInfoToServer(basePath); }); } private void amazonAdIdGetter() { + String testId = command.getFirstParameterValue("id"); + Adjust.getAmazonAdId(context, amazonAdId -> { MainActivity.testLibrary.addInfoToSend("fire_adid", amazonAdId); + MainActivity.testLibrary.addInfoToSend("id", testId); MainActivity.testLibrary.sendInfoToServer(basePath); }); } From 13bd764a10c124234e7c092b01234940d9c04af3 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 4 Dec 2025 15:31:02 +0100 Subject: [PATCH 459/540] test: add support for web bridge getters burst tests --- .../src/main/assets/command_executor.js | 53 +++++++++++++------ 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index 7125e6062..e222dee57 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -698,7 +698,9 @@ AdjustCommandExecutor.prototype.sendReferrer = function(params) { }; AdjustCommandExecutor.prototype.attributionGetter = function(params) { + var testId = getFirstParameterValue(params, 'id'); var basePath = this.basePath; + Adjust.getAttribution(function(attribution) { TestLibrary.addInfoToSend("tracker_token", attribution.trackerToken); TestLibrary.addInfoToSend("tracker_name", attribution.trackerName); @@ -713,30 +715,40 @@ AdjustCommandExecutor.prototype.attributionGetter = function(params) { TestLibrary.addInfoToSend("fb_install_referrer", attribution.fbInstallReferrer); TestLibrary.addInfoToSend("json_response", JSON.stringify(attribution.jsonResponse)); + TestLibrary.addInfoToSend("id", testId); TestLibrary.sendInfoToServer(basePath); }); }; AdjustCommandExecutor.prototype.sdkVersionGetter = function(params) { + var testId = getFirstParameterValue(params, 'id'); var basePath = this.basePath; + Adjust.getSdkVersion(function(sdkVersion) { TestLibrary.addInfoToSend("sdk_version", sdkVersion); + TestLibrary.addInfoToSend("id", testId); TestLibrary.sendInfoToServer(basePath); }); }; AdjustCommandExecutor.prototype.googleAdIdGetter = function(params) { + var testId = getFirstParameterValue(params, 'id'); var basePath = this.basePath; + Adjust.getGoogleAdId(function(googleAdId) { TestLibrary.addInfoToSend("gps_adid", googleAdId); + TestLibrary.addInfoToSend("id", testId); TestLibrary.sendInfoToServer(basePath); }); }; AdjustCommandExecutor.prototype.amazonAdIdGetter = function(params) { + var testId = getFirstParameterValue(params, 'id'); var basePath = this.basePath; + Adjust.getAmazonAdId(function(amazonAdId) { TestLibrary.addInfoToSend("fire_adid", amazonAdId); + TestLibrary.addInfoToSend("id", testId); TestLibrary.sendInfoToServer(basePath); }); }; @@ -744,7 +756,9 @@ AdjustCommandExecutor.prototype.amazonAdIdGetter = function(params) { AdjustCommandExecutor.prototype.attributionGetterWithTimeout = function(params) { var timeoutS = getFirstParameterValue(params, 'timeout'); var timeout = parseInt(timeoutS); + var testId = getFirstParameterValue(params, 'id'); var basePath = this.basePath; + Adjust.getAttributionWithTimeout(timeout, function(attribution) { if (attribution != null) { TestLibrary.addInfoToSend("tracker_token", attribution.trackerToken); @@ -763,31 +777,38 @@ AdjustCommandExecutor.prototype.attributionGetterWithTimeout = function(params) TestLibrary.addInfoToSend("attribution", "null"); } + TestLibrary.addInfoToSend("id", testId); TestLibrary.sendInfoToServer(basePath); }); }; AdjustCommandExecutor.prototype.adidGetter = function(params) { - var basePath = this.basePath; - Adjust.getAdid(function(adid) { - TestLibrary.addInfoToSend("adid", adid); - TestLibrary.sendInfoToServer(basePath); - }); + var testId = getFirstParameterValue(params, 'id'); + var basePath = this.basePath; + + Adjust.getAdid(function(adid) { + TestLibrary.addInfoToSend("adid", adid); + TestLibrary.addInfoToSend("id", testId); + TestLibrary.sendInfoToServer(basePath); + }); }; AdjustCommandExecutor.prototype.adidGetterWithTimeout = function(params) { - var timeoutS = getFirstParameterValue(params, 'timeout'); - var timeout = parseInt(timeoutS); - var basePath = this.basePath; - Adjust.getAdidWithTimeout(timeout, function(adid) { - if (adid != null) { - TestLibrary.addInfoToSend("adid", adid); - } else { - TestLibrary.addInfoToSend("adid", "null"); - } + var timeoutS = getFirstParameterValue(params, 'timeout'); + var timeout = parseInt(timeoutS); + var testId = getFirstParameterValue(params, 'id'); + var basePath = this.basePath; - TestLibrary.sendInfoToServer(basePath); - }); + Adjust.getAdidWithTimeout(timeout, function(adid) { + if (adid != null) { + TestLibrary.addInfoToSend("adid", adid); + } else { + TestLibrary.addInfoToSend("adid", "null"); + } + + TestLibrary.addInfoToSend("id", testId); + TestLibrary.sendInfoToServer(basePath); + }); }; //Util From 9b0aafad6a8ba2004cd1c1889880b47d0bb6c66c Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 4 Dec 2025 16:47:50 +0100 Subject: [PATCH 460/540] fix: keep array of getter callbacks in web bridge --- .../src/main/assets/adjust.js | 220 +++++++----------- 1 file changed, 88 insertions(+), 132 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 48e4f4a9e..c26abaf7e 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -1,4 +1,44 @@ +// generate random callback ID with prefix (similar to iOS implementation) +window.randomCallbackIdWithPrefix = function(prefix) { + const randomString = (Math.random() + 1).toString(36).substring(7); + return prefix + "_" + randomString; +}; + var Adjust = { + // map to store callbacks by their unique callback ID + _callbackMap: {}, + + _handleGetterCallback: function(callback, callbackId) { + // store callback in map + this._callbackMap[callbackId] = callback; + + // create a function on window with the callbackId name + // this function will be called by the native side + window[callbackId] = (function(adjustInstance, storedCallbackId) { + return function(value) { + var callback = adjustInstance._callbackMap[storedCallbackId]; + if (callback) { + // for attribution, the native side passes a JSON object that's already parsed + // for other values, they're passed as strings + if (storedCallbackId.includes("adjust_getAttribution")) { + // value is already a JavaScript object (parsed from JSON) + // only parse if it's actually a string (shouldn't happen) + if (typeof value === 'string') { + callback(JSON.parse(value)); + } else { + callback(value); + } + } else { + callback(value); + } + // clean up: remove callback and delete the function + delete adjustInstance._callbackMap[storedCallbackId]; + delete window[storedCallbackId]; + } + }; + })(this, callbackId); + }, + initSdk: function (adjustConfig) { if (adjustConfig && !adjustConfig.getSdkPrefix()) { adjustConfig.setSdkPrefix(this.getSdkPrefix()); @@ -49,26 +89,15 @@ var Adjust = { } // supports legacy return with callback if (arguments.length === 1) { - // with manual string call - if (typeof callback === 'string' || callback instanceof String) { - this.isEnabledCallbackName = callback; - } else { - // or save callback and call later - this.isEnabledCallbackName = 'Adjust.adjust_isEnabledCallback'; - this.isEnabledCallbackFunction = callback; - } - AdjustBridge.isEnabled(this.isEnabledCallbackName); + // generate unique callback ID + const callbackId = window.randomCallbackIdWithPrefix("adjust_isEnabled"); + this._handleGetterCallback(callback, callbackId); + AdjustBridge.isEnabled(callbackId); } else { return AdjustBridge.isEnabled(); } }, - adjust_isEnabledCallback: function (isEnabled) { - if (AdjustBridge && this.isEnabledCallbackFunction) { - this.isEnabledCallbackFunction(isEnabled); - } - }, - setReferrer: function (referrer) { if (AdjustBridge) { AdjustBridge.setReferrer(referrer); @@ -195,135 +224,73 @@ var Adjust = { getGoogleAdId: function (callback) { if (AdjustBridge) { - if (typeof callback === 'string' || callback instanceof String) { - this.getGoogleAdIdCallbackName = callback; - } else { - this.getGoogleAdIdCallbackName = 'Adjust.adjust_getGoogleAdIdCallback'; - this.getGoogleAdIdCallbackFunction = callback; - } - AdjustBridge.getGoogleAdId(this.getGoogleAdIdCallbackName); - } - }, - - adjust_getGoogleAdIdCallback: function (googleAdId) { - if (AdjustBridge && this.getGoogleAdIdCallbackFunction) { - this.getGoogleAdIdCallbackFunction(googleAdId); - } - }, - - getAmazonAdId: function (callback) { - if (AdjustBridge) { - return AdjustBridge.getAmazonAdId(); - } else { - return undefined; + const callbackId = window.randomCallbackIdWithPrefix("adjust_getGoogleAdId"); + this._handleGetterCallback(callback, callbackId); + AdjustBridge.getGoogleAdId(callbackId); } }, getAdid: function (callback) { - if (AdjustBridge) { - if (typeof callback === 'string' || callback instanceof String) { - this.getAdIdCallbackName = callback; - } else { - this.getAdIdCallbackName = 'Adjust.adjust_getAdIdCallback'; - this.getAdIdCallbackFunction = callback; - } - AdjustBridge.getAdid(this.getAdIdCallbackName); + if (AdjustBridge) { + const callbackId = window.randomCallbackIdWithPrefix("adjust_getAdid"); + this._handleGetterCallback(callback, callbackId); + AdjustBridge.getAdid(callbackId); } }, getAdidWithTimeout: function (timeoutInMilliSec, callback) { - if (AdjustBridge) { - if (typeof callback === 'string' || callback instanceof String) { - this.getAdIdWithTimeoutCallbackName = callback; - } else { - this.getAdIdWithTimeoutCallbackName = 'Adjust.adjust_getAdIdWithTimeoutCallback'; - this.getAdIdWithTimeoutCallbackFunction = callback; - } - AdjustBridge.getAdidWithTimeout(timeoutInMilliSec, this.getAdIdWithTimeoutCallbackName); - } - }, - - adjust_getAdIdCallback: function (adId) { - if (AdjustBridge && this.getAdIdCallbackFunction) { - this.getAdIdCallbackFunction(adId); - } - }, - - adjust_getAdIdWithTimeoutCallback: function (adId) { - if (AdjustBridge && this.getAdIdWithTimeoutCallbackFunction) { - this.getAdIdWithTimeoutCallbackFunction(adId); + if (AdjustBridge) { + const callbackId = window.randomCallbackIdWithPrefix("adjust_getAdidWithTimeout"); + this._handleGetterCallback(callback, callbackId); + AdjustBridge.getAdidWithTimeout(timeoutInMilliSec, callbackId); } }, - getAmazonAdId: function (callbackSuccess,callbackFail) { - if (AdjustBridge) { - if (typeof callbackSuccess === 'string' || callbackSuccess instanceof String) { - this.getAmazonIdCallbackSuccessName = callbackSuccess; - } else { - this.getAmazonIdCallbackSuccessName = 'Adjust.adjust_getAmazonIdCallbackSuccess'; - this.getAmazonIdCallbackSuccessFunction = callbackSuccess; - } - AdjustBridge.getAmazonAdId(this.getAmazonIdCallbackSuccessName); - } - }, - - adjust_getAmazonIdCallbackSuccess: function (amazonId) { - if (AdjustBridge && this.getAmazonIdCallbackSuccessFunction) { - this.getAmazonIdCallbackSuccessFunction(amazonId); + getAmazonAdId: function (callbackSuccess, callbackFail) { + if (AdjustBridge) { + const callbackId = window.randomCallbackIdWithPrefix("adjust_getAmazonAdId"); + this._handleGetterCallback(callbackSuccess, callbackId); + // note: Java side only supports success callback, callbackFail is ignored + AdjustBridge.getAmazonAdId(callbackId); } }, getAttribution: function (callback) { - if (AdjustBridge) { - if (typeof callback === 'string' || callback instanceof String) { - this.getAttributionCallbackName = callback; - } else { - this.getAttributionCallbackName = 'Adjust.adjust_getAttributionCallback'; - this.getAttributionCallbackFunction = callback; - } - AdjustBridge.getAttribution(this.getAttributionCallbackName); + if (AdjustBridge) { + const callbackId = window.randomCallbackIdWithPrefix("adjust_getAttribution"); + this._handleGetterCallback(callback, callbackId); + AdjustBridge.getAttribution(callbackId); } }, getAttributionWithTimeout: function (timeoutInMilliSec, callback) { - if (AdjustBridge) { - if (typeof callback === 'string' || callback instanceof String) { - this.getAttributionWithTimeoutCallbackName = callback; - } else { - this.getAttributionWithTimeoutCallbackName = 'Adjust.adjust_getAttributionWithTimeoutCallback'; - this.getAttributionWithTimeoutCallbackFunction = callback; - } - AdjustBridge.getAttributionWithTimeout(timeoutInMilliSec, this.getAttributionWithTimeoutCallbackName); - } - }, - - adjust_getAttributionCallback: function (attribution) { - if (AdjustBridge && this.getAttributionCallbackFunction) { - this.getAttributionCallbackFunction(attribution); - } - }, - - adjust_getAttributionWithTimeoutCallback: function (attribution) { - if (AdjustBridge && this.getAttributionWithTimeoutCallbackFunction) { - this.getAttributionWithTimeoutCallbackFunction(attribution); + if (AdjustBridge) { + const callbackId = window.randomCallbackIdWithPrefix("adjust_getAttributionWithTimeout"); + this._handleGetterCallback(callback, callbackId); + AdjustBridge.getAttributionWithTimeout(timeoutInMilliSec, callbackId); } }, getSdkVersion: function (callback) { if (AdjustBridge) { - if (typeof callback === 'string' || callback instanceof String) { - this.getSdkVersionCallbackName = callback; - } else { - this.getSdkVersionCallbackName = 'Adjust.adjust_getSdkVersionCallback'; - this.getSdkVersionCallbackFunction = callback; - } - AdjustBridge.getSdkVersion(this.getSdkVersionCallbackName); - } - }, - - adjust_getSdkVersionCallback: function (sdkVersion) { - if (AdjustBridge && this.getSdkVersionCallbackFunction) { - this.getSdkVersionCallbackFunction(this.getSdkPrefix() + '@' + sdkVersion); + const callbackId = window.randomCallbackIdWithPrefix("adjust_getSdkVersion"); + // store callback with wrapper to add SDK prefix + this._callbackMap[callbackId] = function(sdkVersion) { + callback(Adjust.getSdkPrefix() + '@' + sdkVersion); + }; + // create a function on window with the callbackId name + window[callbackId] = (function(adjustInstance, storedCallbackId) { + return function(value) { + var callback = adjustInstance._callbackMap[storedCallbackId]; + if (callback) { + callback(value); + // clean up: remove callback and delete the function + delete adjustInstance._callbackMap[storedCallbackId]; + delete window[storedCallbackId]; + } + }; + })(this, callbackId); + AdjustBridge.getSdkVersion(callbackId); } }, @@ -340,17 +307,6 @@ var Adjust = { AdjustBridge.teardown(); } this.adjustConfig = undefined; - this.isEnabledCallbackName = undefined; - this.isEnabledCallbackFunction = undefined; - this.getGoogleAdIdCallbackName = undefined; - this.getGoogleAdIdCallbackFunction = undefined; - this.getAdIdCallbackName = undefined; - this.getAdIdCallbackFunction = undefined; - this.getAttributionCallbackName = undefined; - this.getAttributionCallbackFunction = undefined; - this.getAmazonIdCallbackSuccessName = undefined; - this.getAmazonIdCallbackSuccessFunction = undefined; - this.getSdkVersionCallbackFunction = undefined; - this.getSdkVersionCallbackName = undefined; + this._callbackMap = {}; }, }; From b849a506dcf6fb3106550dca7e52afb15edca6b3 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 4 Dec 2025 16:50:58 +0100 Subject: [PATCH 461/540] test: add support for last deep link getter burst tests --- .../main/java/com/adjust/testapp/AdjustCommandExecutor.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index b141d6a39..08566a204 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -1004,11 +1004,14 @@ private void adidGetterWithTimeout() { } private void getLastDeeplink() { + String testId = command.getFirstParameterValue("id"); final String localBasePath = basePath; + Adjust.getLastDeeplink(context, new OnLastDeeplinkReadListener() { @Override public void onLastDeeplinkRead(Uri deeplink) { MainActivity.testLibrary.addInfoToSend("last_deeplink", deeplink == null ? "" : deeplink.toString()); + MainActivity.testLibrary.addInfoToSend("id", testId); MainActivity.testLibrary.sendInfoToServer(localBasePath); } }); From d09b144d5d5d0e7186bc61374675493ea858776d Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 5 Dec 2025 11:56:34 +0100 Subject: [PATCH 462/540] test: rename id to test_callback_id --- .../adjust/testapp/AdjustCommandExecutor.java | 32 +++++++++---------- .../src/main/assets/command_executor.js | 28 ++++++++-------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 08566a204..11c723a26 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -901,11 +901,11 @@ public void onDeeplinkResolved(String resolvedLink) { } private void attributionGetter() { - String testId = command.getFirstParameterValue("id"); + String testCallbackId = command.getFirstParameterValue("testCallbackId"); Adjust.getAttribution(attribution -> { Map fields = new HashMap<>(); - fields.put("id", testId); + fields.put("test_callback_id", testCallbackId); if (attribution.trackerToken != null) fields.put("tracker_token", attribution.trackerToken); if (attribution.trackerName != null) @@ -938,11 +938,11 @@ private void attributionGetter() { private void attributionGetterWithTimeout() { long timeout = Long.parseLong(command.getFirstParameterValue("timeout")); - String testId = command.getFirstParameterValue("id"); + String testCallbackId = command.getFirstParameterValue("testCallbackId"); Adjust.getAttributionWithTimeout(context, timeout, attribution -> { Map fields = new HashMap<>(); - fields.put("id", testId); + fields.put("test_callback_id", testCallbackId); if (attribution != null) { if (attribution.trackerToken != null) fields.put("tracker_token", attribution.trackerToken); @@ -979,18 +979,18 @@ private void attributionGetterWithTimeout() { } private void adidGetter() { - String testId = command.getFirstParameterValue("id"); + String testCallbackId = command.getFirstParameterValue("testCallbackId"); Adjust.getAdid(adid -> { MainActivity.testLibrary.addInfoToSend("adid", adid); - MainActivity.testLibrary.addInfoToSend("id", testId); + MainActivity.testLibrary.addInfoToSend("test_callback_id", testCallbackId); MainActivity.testLibrary.sendInfoToServer(basePath); }); } private void adidGetterWithTimeout() { long timeout = Long.parseLong(command.getFirstParameterValue("timeout")); - String testId = command.getFirstParameterValue("id"); + String testCallbackId = command.getFirstParameterValue("testCallbackId"); Adjust.getAdidWithTimeout(context, timeout, adid -> { if (adid != null) { @@ -998,20 +998,20 @@ private void adidGetterWithTimeout() { } else { MainActivity.testLibrary.addInfoToSend("adid", "null"); } - MainActivity.testLibrary.addInfoToSend("id", testId); + MainActivity.testLibrary.addInfoToSend("test_callback_id", testCallbackId); MainActivity.testLibrary.sendInfoToServer(basePath); }); } private void getLastDeeplink() { - String testId = command.getFirstParameterValue("id"); + String testCallbackId = command.getFirstParameterValue("testCallbackId"); final String localBasePath = basePath; Adjust.getLastDeeplink(context, new OnLastDeeplinkReadListener() { @Override public void onLastDeeplinkRead(Uri deeplink) { MainActivity.testLibrary.addInfoToSend("last_deeplink", deeplink == null ? "" : deeplink.toString()); - MainActivity.testLibrary.addInfoToSend("id", testId); + MainActivity.testLibrary.addInfoToSend("test_callback_id", testCallbackId); MainActivity.testLibrary.sendInfoToServer(localBasePath); } }); @@ -1047,31 +1047,31 @@ private void externalDeviceIdInDelay() { } private void sdkVersionGetter() { - String testId = command.getFirstParameterValue("id"); + String testCallbackId = command.getFirstParameterValue("testCallbackId"); Adjust.getSdkVersion(sdkVersion -> { MainActivity.testLibrary.addInfoToSend("sdk_version", sdkVersion); - MainActivity.testLibrary.addInfoToSend("id", testId); + MainActivity.testLibrary.addInfoToSend("test_callback_id", testCallbackId); MainActivity.testLibrary.sendInfoToServer(basePath); }); } private void googleAdIdGetter() { - String testId = command.getFirstParameterValue("id"); + String testCallbackId = command.getFirstParameterValue("testCallbackId"); Adjust.getGoogleAdId(context, googleAdId -> { MainActivity.testLibrary.addInfoToSend("gps_adid", googleAdId); - MainActivity.testLibrary.addInfoToSend("id", testId); + MainActivity.testLibrary.addInfoToSend("test_callback_id", testCallbackId); MainActivity.testLibrary.sendInfoToServer(basePath); }); } private void amazonAdIdGetter() { - String testId = command.getFirstParameterValue("id"); + String testCallbackId = command.getFirstParameterValue("testCallbackId"); Adjust.getAmazonAdId(context, amazonAdId -> { MainActivity.testLibrary.addInfoToSend("fire_adid", amazonAdId); - MainActivity.testLibrary.addInfoToSend("id", testId); + MainActivity.testLibrary.addInfoToSend("test_callback_id", testCallbackId); MainActivity.testLibrary.sendInfoToServer(basePath); }); } diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index e222dee57..e0d80374c 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -698,7 +698,7 @@ AdjustCommandExecutor.prototype.sendReferrer = function(params) { }; AdjustCommandExecutor.prototype.attributionGetter = function(params) { - var testId = getFirstParameterValue(params, 'id'); + var testCallbackId = getFirstParameterValue(params, 'testCallbackId'); var basePath = this.basePath; Adjust.getAttribution(function(attribution) { @@ -715,40 +715,40 @@ AdjustCommandExecutor.prototype.attributionGetter = function(params) { TestLibrary.addInfoToSend("fb_install_referrer", attribution.fbInstallReferrer); TestLibrary.addInfoToSend("json_response", JSON.stringify(attribution.jsonResponse)); - TestLibrary.addInfoToSend("id", testId); + TestLibrary.addInfoToSend("test_callback_id", testCallbackId); TestLibrary.sendInfoToServer(basePath); }); }; AdjustCommandExecutor.prototype.sdkVersionGetter = function(params) { - var testId = getFirstParameterValue(params, 'id'); + var testCallbackId = getFirstParameterValue(params, 'testCallbackId'); var basePath = this.basePath; Adjust.getSdkVersion(function(sdkVersion) { TestLibrary.addInfoToSend("sdk_version", sdkVersion); - TestLibrary.addInfoToSend("id", testId); + TestLibrary.addInfoToSend("test_callback_id", testCallbackId); TestLibrary.sendInfoToServer(basePath); }); }; AdjustCommandExecutor.prototype.googleAdIdGetter = function(params) { - var testId = getFirstParameterValue(params, 'id'); + var testCallbackId = getFirstParameterValue(params, 'testCallbackId'); var basePath = this.basePath; Adjust.getGoogleAdId(function(googleAdId) { TestLibrary.addInfoToSend("gps_adid", googleAdId); - TestLibrary.addInfoToSend("id", testId); + TestLibrary.addInfoToSend("test_callback_id", testCallbackId); TestLibrary.sendInfoToServer(basePath); }); }; AdjustCommandExecutor.prototype.amazonAdIdGetter = function(params) { - var testId = getFirstParameterValue(params, 'id'); + var testCallbackId = getFirstParameterValue(params, 'testCallbackId'); var basePath = this.basePath; Adjust.getAmazonAdId(function(amazonAdId) { TestLibrary.addInfoToSend("fire_adid", amazonAdId); - TestLibrary.addInfoToSend("id", testId); + TestLibrary.addInfoToSend("test_callback_id", testCallbackId); TestLibrary.sendInfoToServer(basePath); }); }; @@ -756,7 +756,7 @@ AdjustCommandExecutor.prototype.amazonAdIdGetter = function(params) { AdjustCommandExecutor.prototype.attributionGetterWithTimeout = function(params) { var timeoutS = getFirstParameterValue(params, 'timeout'); var timeout = parseInt(timeoutS); - var testId = getFirstParameterValue(params, 'id'); + var testCallbackId = getFirstParameterValue(params, 'testCallbackId'); var basePath = this.basePath; Adjust.getAttributionWithTimeout(timeout, function(attribution) { @@ -777,18 +777,18 @@ AdjustCommandExecutor.prototype.attributionGetterWithTimeout = function(params) TestLibrary.addInfoToSend("attribution", "null"); } - TestLibrary.addInfoToSend("id", testId); + TestLibrary.addInfoToSend("test_callback_id", testCallbackId); TestLibrary.sendInfoToServer(basePath); }); }; AdjustCommandExecutor.prototype.adidGetter = function(params) { - var testId = getFirstParameterValue(params, 'id'); + var testCallbackId = getFirstParameterValue(params, 'testCallbackId'); var basePath = this.basePath; Adjust.getAdid(function(adid) { TestLibrary.addInfoToSend("adid", adid); - TestLibrary.addInfoToSend("id", testId); + TestLibrary.addInfoToSend("test_callback_id", testCallbackId); TestLibrary.sendInfoToServer(basePath); }); }; @@ -796,7 +796,7 @@ AdjustCommandExecutor.prototype.adidGetter = function(params) { AdjustCommandExecutor.prototype.adidGetterWithTimeout = function(params) { var timeoutS = getFirstParameterValue(params, 'timeout'); var timeout = parseInt(timeoutS); - var testId = getFirstParameterValue(params, 'id'); + var testCallbackId = getFirstParameterValue(params, 'testCallbackId'); var basePath = this.basePath; Adjust.getAdidWithTimeout(timeout, function(adid) { @@ -806,7 +806,7 @@ AdjustCommandExecutor.prototype.adidGetterWithTimeout = function(params) { TestLibrary.addInfoToSend("adid", "null"); } - TestLibrary.addInfoToSend("id", testId); + TestLibrary.addInfoToSend("test_callback_id", testCallbackId); TestLibrary.sendInfoToServer(basePath); }); }; From d759b07aab1764617f2481e7359287134aa8c196 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 5 Dec 2025 12:14:25 +0100 Subject: [PATCH 463/540] refac: make getSdkVersion to use _handleGetterCallback --- .../src/main/assets/adjust.js | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index c26abaf7e..a26747996 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -34,6 +34,10 @@ var Adjust = { // clean up: remove callback and delete the function delete adjustInstance._callbackMap[storedCallbackId]; delete window[storedCallbackId]; + } else { + // callback was already cleaned up (teardown was called) + // safely remove the window function to prevent memory leaks + delete window[storedCallbackId]; } }; })(this, callbackId); @@ -274,22 +278,11 @@ var Adjust = { getSdkVersion: function (callback) { if (AdjustBridge) { const callbackId = window.randomCallbackIdWithPrefix("adjust_getSdkVersion"); - // store callback with wrapper to add SDK prefix - this._callbackMap[callbackId] = function(sdkVersion) { + // wrap callback to add SDK prefix before passing to _handleGetterCallback + const wrappedCallback = function(sdkVersion) { callback(Adjust.getSdkPrefix() + '@' + sdkVersion); }; - // create a function on window with the callbackId name - window[callbackId] = (function(adjustInstance, storedCallbackId) { - return function(value) { - var callback = adjustInstance._callbackMap[storedCallbackId]; - if (callback) { - callback(value); - // clean up: remove callback and delete the function - delete adjustInstance._callbackMap[storedCallbackId]; - delete window[storedCallbackId]; - } - }; - })(this, callbackId); + this._handleGetterCallback(wrappedCallback, callbackId); AdjustBridge.getSdkVersion(callbackId); } }, From ecdf346f7b770903c9cdf84867fa3c30ff901d2a Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 5 Dec 2025 14:47:57 +0100 Subject: [PATCH 464/540] feat: update signature library version 3.62.0 --- Adjust/examples/example-app-fbpixel/build.gradle | 2 +- Adjust/examples/example-app-java/build.gradle | 2 +- Adjust/examples/example-app-keyboard/build.gradle | 2 +- Adjust/examples/example-app-kotlin/build.gradle | 2 +- Adjust/examples/example-app-tv/build.gradle | 2 +- Adjust/examples/example-app-webbridge/build.gradle | 2 +- Adjust/sdk-core/build.gradle | 2 +- Adjust/tests/test-app-core/build.gradle | 2 +- Adjust/tests/test-app-webbridge/build.gradle | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Adjust/examples/example-app-fbpixel/build.gradle b/Adjust/examples/example-app-fbpixel/build.gradle index 022cd12aa..544d46250 100644 --- a/Adjust/examples/example-app-fbpixel/build.gradle +++ b/Adjust/examples/example-app-fbpixel/build.gradle @@ -35,5 +35,5 @@ dependencies { implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') - implementation 'com.adjust.signature:adjust-android-signature:3.61.0' + implementation 'com.adjust.signature:adjust-android-signature:3.62.0' } diff --git a/Adjust/examples/example-app-java/build.gradle b/Adjust/examples/example-app-java/build.gradle index d8eb9aaac..faa74fd33 100644 --- a/Adjust/examples/example-app-java/build.gradle +++ b/Adjust/examples/example-app-java/build.gradle @@ -38,5 +38,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3.61.0' + implementation 'com.adjust.signature:adjust-android-signature:3.62.0' } diff --git a/Adjust/examples/example-app-keyboard/build.gradle b/Adjust/examples/example-app-keyboard/build.gradle index 71c42ea86..d1e5d13b6 100644 --- a/Adjust/examples/example-app-keyboard/build.gradle +++ b/Adjust/examples/example-app-keyboard/build.gradle @@ -38,5 +38,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3.61.0' + implementation 'com.adjust.signature:adjust-android-signature:3.62.0' } diff --git a/Adjust/examples/example-app-kotlin/build.gradle b/Adjust/examples/example-app-kotlin/build.gradle index 985d785bf..edeed92c0 100644 --- a/Adjust/examples/example-app-kotlin/build.gradle +++ b/Adjust/examples/example-app-kotlin/build.gradle @@ -41,5 +41,5 @@ dependencies { implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3.61.0' + implementation 'com.adjust.signature:adjust-android-signature:3.62.0' } diff --git a/Adjust/examples/example-app-tv/build.gradle b/Adjust/examples/example-app-tv/build.gradle index d8eb9aaac..faa74fd33 100755 --- a/Adjust/examples/example-app-tv/build.gradle +++ b/Adjust/examples/example-app-tv/build.gradle @@ -38,5 +38,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3.61.0' + implementation 'com.adjust.signature:adjust-android-signature:3.62.0' } diff --git a/Adjust/examples/example-app-webbridge/build.gradle b/Adjust/examples/example-app-webbridge/build.gradle index 31a6c3385..d3cc31595 100644 --- a/Adjust/examples/example-app-webbridge/build.gradle +++ b/Adjust/examples/example-app-webbridge/build.gradle @@ -33,5 +33,5 @@ dependencies { implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') - implementation 'com.adjust.signature:adjust-android-signature:3.61.0' + implementation 'com.adjust.signature:adjust-android-signature:3.62.0' } diff --git a/Adjust/sdk-core/build.gradle b/Adjust/sdk-core/build.gradle index 4a0ba57f7..40ec1ddd1 100644 --- a/Adjust/sdk-core/build.gradle +++ b/Adjust/sdk-core/build.gradle @@ -220,7 +220,7 @@ def customizePomForAar(pom) { dependency { groupId 'com.adjust.signature' artifactId 'adjust-android-signature' - version '3.61.0' + version '3.62.0' scope 'compile' } } diff --git a/Adjust/tests/test-app-core/build.gradle b/Adjust/tests/test-app-core/build.gradle index c7122a116..c508abb36 100644 --- a/Adjust/tests/test-app-core/build.gradle +++ b/Adjust/tests/test-app-core/build.gradle @@ -30,7 +30,7 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:2.1.1" implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0' implementation 'com.android.installreferrer:installreferrer:2.2' - implementation 'com.adjust.signature:adjust-android-signature:3.61.0' + implementation 'com.adjust.signature:adjust-android-signature:3.62.0' implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') diff --git a/Adjust/tests/test-app-webbridge/build.gradle b/Adjust/tests/test-app-webbridge/build.gradle index 74137f277..394c27117 100644 --- a/Adjust/tests/test-app-webbridge/build.gradle +++ b/Adjust/tests/test-app-webbridge/build.gradle @@ -32,7 +32,7 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:2.1.1" implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0' implementation 'com.android.installreferrer:installreferrer:2.2' - implementation 'com.adjust.signature:adjust-android-signature:3.61.0' + implementation 'com.adjust.signature:adjust-android-signature:3.62.0' implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') From f920b8c0ea7f379fb9a78560c6dce2b877c05b79 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 5 Dec 2025 14:49:04 +0100 Subject: [PATCH 465/540] feat: update version number to 5.5.0 --- Adjust/build.gradle | 2 +- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-imei/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-oaid/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java | 2 +- VERSION | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 810887ec6..3e2ce2b87 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 36 coreTargetSdkVersion = 36 - coreVersionName = '5.4.6' + coreVersionName = '5.5.0' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index 5a9787c15..bcd827071 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.6' + // implementation 'com.adjust.sdk:adjust-android:5.5.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index c995d8ad0..21ef749e8 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.6' + // implementation 'com.adjust.sdk:adjust-android:5.5.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index fa26fd195..3d9c18c8b 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.6' + // implementation 'com.adjust.sdk:adjust-android:5.5.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index 3cebb2859..1da522ce8 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.6' + // implementation 'com.adjust.sdk:adjust-android:5.5.0' implementation 'com.huawei.hms:ads-identifier:3.4.56.300' } diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index dc31bc5da..9af3bfc65 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.6' + // implementation 'com.adjust.sdk:adjust-android:5.5.0' // Add Samsung clouddev lib. compileOnly fileTree(include: ['*.aar'], dir: 'libs') diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index 9bc5fff8a..a66f841fc 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.6' + // implementation 'com.adjust.sdk:adjust-android:5.5.0' // Add Samsung referrer lib via Maven. implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:3.0.1' diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index d8b77c964..3074c9ddf 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.6' + // implementation 'com.adjust.sdk:adjust-android:5.5.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index aef9f8bb9..ff7422738 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.6' + // implementation 'com.adjust.sdk:adjust-android:5.5.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index a26747996..d6cb9d206 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -291,7 +291,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge5.4.6'; + return 'web-bridge5.5.0'; } }, diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index 0290bdc30..b240e6eba 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -31,7 +31,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.4.6' + // implementation 'com.adjust.sdk:adjust-android:5.5.0' // Add xiaomi referrer lib via Maven. implementation 'com.miui.referrer:homereferrer:1.0.0.6' diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index cebe63c6b..0f163966e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -32,7 +32,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.4.6"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.5.0"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index c1d39959e..a188b59c9 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -38,7 +38,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android5.4.6"; + String CLIENT_SDK = "android5.5.0"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/VERSION b/VERSION index bb0915fd5..d50359de1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.4.6 +5.5.0 From cf1e8ab6de1a519bf07a762c8825910bfe4d6dea Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 5 Dec 2025 14:51:42 +0100 Subject: [PATCH 466/540] docs: update changelog --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62b79e237..145db519b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +### Version 5.5.0 (5th December 2025) +#### Added +- Added `getAdidWithTimeout` method to the `Adjust` API to allow retrieving the ADID with a specified timeout. If the value is not obtained in time, null is returned. +- Added `getAttributionWithTimeout` method to the `Adjust` API to allow retrieving the current attribution information with a specified timeout. If the value is not obtained in time, null is returned. +- Added `disableAppSetIdReading()` method to `AdjustConfig` to allow the SDK to skip reading the App Set ID. + +#### Changed +- Updated the Adjust Signature library version to 3.62.0. + +--- + ### Version 5.4.6 (7th November 2025) #### Changed - Refactored LVL plugin to use direct `Binder` interface instead of `AIDL`. From 0519c83de3d21561074a57f356bf35fc13aef3bf Mon Sep 17 00:00:00 2001 From: Shashank Suhane <46443728+shashanksu@users.noreply.github.com> Date: Fri, 5 Dec 2025 16:57:05 +0100 Subject: [PATCH 467/540] Update CHANGELOG.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Uglješa Erceg --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 145db519b..29681721e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ #### Added - Added `getAdidWithTimeout` method to the `Adjust` API to allow retrieving the ADID with a specified timeout. If the value is not obtained in time, null is returned. - Added `getAttributionWithTimeout` method to the `Adjust` API to allow retrieving the current attribution information with a specified timeout. If the value is not obtained in time, null is returned. -- Added `disableAppSetIdReading()` method to `AdjustConfig` to allow the SDK to skip reading the App Set ID. +- Added `disableAppSetIdReading` method to `AdjustConfig` to allow disabling the SDK’s reading of the app set ID. #### Changed - Updated the Adjust Signature library version to 3.62.0. From 2e5b95e1a9a7f25c59fe3d95bee260470b68c9fd Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 6 Feb 2026 11:40:30 +0100 Subject: [PATCH 468/540] feat: add allowed class filter for object deserialization --- .../adjust/sdk/ObjectInputFilterStream.java | 51 +++++++++++++++++++ .../src/main/java/com/adjust/sdk/Util.java | 5 +- 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/ObjectInputFilterStream.java diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ObjectInputFilterStream.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ObjectInputFilterStream.java new file mode 100644 index 000000000..dde431ed2 --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ObjectInputFilterStream.java @@ -0,0 +1,51 @@ +package com.adjust.sdk; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InvalidClassException; +import java.io.ObjectInputStream; +import java.io.ObjectStreamClass; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public class ObjectInputFilterStream extends ObjectInputStream { + private static final Set ALLOWED_CLASSES = new HashSet<>(Arrays.asList( + "java.lang.Boolean", + "java.lang.Double", + "java.lang.Enum", + "java.lang.Float", + "java.lang.Integer", + "java.lang.Long", + "java.lang.Number", + "java.lang.String", + "java.util.ArrayList", + "java.util.HashMap", + "java.util.LinkedList", + "com.adjust.sdk.ActivityKind", + "com.adjust.sdk.ActivityPackage", + "com.adjust.sdk.ActivityState", + "com.adjust.sdk.AdjustAttribution", + "com.adjust.sdk.EventMetadata" + )); + + public ObjectInputFilterStream(InputStream in) throws IOException { + super(in); + } + + @Override + protected Class resolveClass(ObjectStreamClass desc) throws ClassNotFoundException, IOException { + + // Allow all primitive types + Class resolveClass = super.resolveClass(desc); + if (resolveClass.isPrimitive()) { + return resolveClass; + } + + // Block any unknown classes + if (!ALLOWED_CLASSES.contains(desc.getName())) { + throw new InvalidClassException("Blocked deserialization", desc.getName()); + } + return super.resolveClass(desc); + } +} diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index 08be554a5..a34301abe 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -29,6 +29,7 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.InvalidClassException; import java.io.NotSerializableException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; @@ -216,7 +217,7 @@ public static T readObject(Context context, String filename, String objectNa BufferedInputStream bufferedStream = new BufferedInputStream(inputStream); closable = bufferedStream; - ObjectInputStream objectStream = new ObjectInputStream(bufferedStream); + ObjectInputStream objectStream = new ObjectInputFilterStream(bufferedStream); closable = objectStream; try { @@ -224,6 +225,8 @@ public static T readObject(Context context, String filename, String objectNa getLogger().debug("Read %s: %s", objectName, object); } catch (ClassNotFoundException e) { getLogger().error("Failed to find %s class (%s)", objectName, e.getMessage()); + } catch (InvalidClassException e) { + getLogger().error("Failed to validate %s class (%s)", objectName, e.getMessage()); } catch (ClassCastException e) { getLogger().error("Failed to cast %s object (%s)", objectName, e.getMessage()); } catch (Exception e) { From 8556081c399612388a3438ef888d32e93e67e333 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 6 Feb 2026 16:17:45 +0100 Subject: [PATCH 469/540] feat: update allowed class and removed unused primitive types --- .../main/java/com/adjust/sdk/ObjectInputFilterStream.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ObjectInputFilterStream.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ObjectInputFilterStream.java index dde431ed2..36b1f0b10 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ObjectInputFilterStream.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ObjectInputFilterStream.java @@ -21,6 +21,7 @@ public class ObjectInputFilterStream extends ObjectInputStream { "java.lang.String", "java.util.ArrayList", "java.util.HashMap", + "java.util.LinkedHashMap", "java.util.LinkedList", "com.adjust.sdk.ActivityKind", "com.adjust.sdk.ActivityPackage", @@ -35,13 +36,6 @@ public ObjectInputFilterStream(InputStream in) throws IOException { @Override protected Class resolveClass(ObjectStreamClass desc) throws ClassNotFoundException, IOException { - - // Allow all primitive types - Class resolveClass = super.resolveClass(desc); - if (resolveClass.isPrimitive()) { - return resolveClass; - } - // Block any unknown classes if (!ALLOWED_CLASSES.contains(desc.getName())) { throw new InvalidClassException("Blocked deserialization", desc.getName()); From e39dc04c7b75b0259b9a3e2f76af88c21d16cda2 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 2 Mar 2026 15:54:46 +0100 Subject: [PATCH 470/540] test: add tests for ObjectInputFilterStream --- Adjust/sdk-core/build.gradle | 1 + .../adjust/sdk/ObjectInputFilterStream.java | 2 +- .../sdk/ObjectInputFilterStreamTest.java | 120 ++++++++++++++++++ .../java/com/adjust/sdk/UnfilteredClass.java | 19 +++ 4 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 Adjust/sdk-core/src/test/java/com/adjust/sdk/ObjectInputFilterStreamTest.java create mode 100644 Adjust/sdk-core/src/test/java/com/adjust/sdk/UnfilteredClass.java diff --git a/Adjust/sdk-core/build.gradle b/Adjust/sdk-core/build.gradle index 40ec1ddd1..ca081792e 100644 --- a/Adjust/sdk-core/build.gradle +++ b/Adjust/sdk-core/build.gradle @@ -50,6 +50,7 @@ dependencies { * for any downstream users of your library. */ implementation 'androidx.annotation:annotation:1.8.0' + testImplementation 'junit:junit:4.13.2' } task adjustCoreAarRelease(type: Copy) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ObjectInputFilterStream.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ObjectInputFilterStream.java index 36b1f0b10..6f2a040d5 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ObjectInputFilterStream.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ObjectInputFilterStream.java @@ -10,7 +10,7 @@ import java.util.Set; public class ObjectInputFilterStream extends ObjectInputStream { - private static final Set ALLOWED_CLASSES = new HashSet<>(Arrays.asList( + static final Set ALLOWED_CLASSES = new HashSet<>(Arrays.asList( "java.lang.Boolean", "java.lang.Double", "java.lang.Enum", diff --git a/Adjust/sdk-core/src/test/java/com/adjust/sdk/ObjectInputFilterStreamTest.java b/Adjust/sdk-core/src/test/java/com/adjust/sdk/ObjectInputFilterStreamTest.java new file mode 100644 index 000000000..4d2998518 --- /dev/null +++ b/Adjust/sdk-core/src/test/java/com/adjust/sdk/ObjectInputFilterStreamTest.java @@ -0,0 +1,120 @@ +package com.adjust.sdk; + +import org.junit.Test; +import static org.junit.Assert.*; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InvalidClassException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; + +public class ObjectInputFilterStreamTest { + + @Test + public void allowedClasses_shouldDeserialize() throws Exception { + String input = "hello"; + + byte[] data = serialize(input); + Object result = deserialize(data); + + assertEquals("hello", result); + } + + @Test + public void disallowedClasses_shouldBeBlocked() throws Exception { + UnfilteredClass.DESERIALIZED = false; + + byte[] data = serialize(new UnfilteredClass()); + + assertThrows(InvalidClassException.class, () -> { + deserialize(data); + }); + + assertFalse(UnfilteredClass.DESERIALIZED); + } + + @Test + public void nestedUnfilteredObject_shouldBeBlocked() throws Exception { + UnfilteredClass.DESERIALIZED = false; + + ArrayList list = new ArrayList<>(); + list.add(new UnfilteredClass()); + + byte[] data = serialize(list); + + assertThrows(InvalidClassException.class, () -> { + deserialize(data); + }); + + assertFalse(UnfilteredClass.DESERIALIZED); + } + + @Test + public void nestedSerializableFieldsMustBeWhitelisted() { + Set missing = new HashSet<>(); + + for (String allowed : ObjectInputFilterStream.ALLOWED_CLASSES) { + try { + Class cls = Class.forName(allowed); + checkSerializableFields(cls, missing); + } catch (ClassNotFoundException e) { + fail("Whitelisted class not found: " + allowed); + } + } + + assertTrue( + "Found serializable types in allowed classes that are missing from whitelist: " + missing, + missing.isEmpty() + ); + } + + private void checkSerializableFields(Class cls, Set missing) { + for (Field field : cls.getDeclaredFields()) { + + int mods = field.getModifiers(); + + // skip static fields + if (Modifier.isStatic(mods)) continue; + + // skip synthetic fields + if (field.isSynthetic()) continue; + + Class type = field.getType(); + + // skip primitives + if (type.isPrimitive()) continue; + + // skip arrays for simplicity (or handle arrays separately) + if (type.isArray()) type = type.getComponentType(); + + // check if Serializable + if (Serializable.class.isAssignableFrom(type)) { + String typeName = type.getName(); + if (!ObjectInputFilterStream.ALLOWED_CLASSES.contains(typeName)) { + missing.add(cls.getName() + "." + field.getName() + " -> " + typeName); + } + } + } + } + + byte[] serialize(Object obj) throws Exception { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(obj); + oos.close(); + return bos.toByteArray(); + } + + Object deserialize(byte[] data) throws Exception { + ByteArrayInputStream bis = new ByteArrayInputStream(data); + ObjectInputStream ois = new ObjectInputFilterStream(bis); + return ois.readObject(); + } +} diff --git a/Adjust/sdk-core/src/test/java/com/adjust/sdk/UnfilteredClass.java b/Adjust/sdk-core/src/test/java/com/adjust/sdk/UnfilteredClass.java new file mode 100644 index 000000000..ac887338e --- /dev/null +++ b/Adjust/sdk-core/src/test/java/com/adjust/sdk/UnfilteredClass.java @@ -0,0 +1,19 @@ +package com.adjust.sdk; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.Serializable; + +public class UnfilteredClass implements Serializable { + + public static boolean DESERIALIZED = false; + + private void readObject(ObjectInputStream in) + throws IOException, ClassNotFoundException { + + in.defaultReadObject(); + + // If this runs, indicates filter has FAILED with no exception thrown + DESERIALIZED = true; + } +} From ea7a0e7383e56d134053a930b240c29dbc38280f Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 3 Mar 2026 11:03:11 +0100 Subject: [PATCH 471/540] add filtered stream tests for all of the persisted data --- .../ObjectInputFilterStreamPersistedTest.java | 366 ++++++++++++++++++ 1 file changed, 366 insertions(+) create mode 100644 Adjust/sdk-core/src/test/java/com/adjust/sdk/ObjectInputFilterStreamPersistedTest.java diff --git a/Adjust/sdk-core/src/test/java/com/adjust/sdk/ObjectInputFilterStreamPersistedTest.java b/Adjust/sdk-core/src/test/java/com/adjust/sdk/ObjectInputFilterStreamPersistedTest.java new file mode 100644 index 000000000..c266e5697 --- /dev/null +++ b/Adjust/sdk-core/src/test/java/com/adjust/sdk/ObjectInputFilterStreamPersistedTest.java @@ -0,0 +1,366 @@ +package com.adjust.sdk; + +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InvalidClassException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThrows; + +public class ObjectInputFilterStreamPersistedTest { + @Test + public void roundTrip_activityState() throws Exception { + ActivityState original = new ActivityState(); + original.uuid = "uuid-1"; + original.enabled = false; + original.isGdprForgotten = true; + original.askingAttribution = true; + original.eventCount = 12; + original.sessionCount = 34; + original.subsessionCount = 56; + original.sessionLength = 1001L; + original.timeSpent = 1002L; + original.lastActivity = 1003L; + original.lastInterval = 1004L; + original.orderIds = new LinkedList<>(); + original.orderIds.add("order-1"); + original.orderIds.add("order-2"); + original.pushToken = "push-token"; + original.adid = "adid-1"; + original.clickTime = 2001L; + original.installBegin = 2002L; + original.installReferrer = "install-ref"; + original.googlePlayInstant = Boolean.TRUE; + original.clickTimeServer = 2003L; + original.installBeginServer = 2004L; + original.installVersion = "1.2.3"; + original.clickTimeHuawei = 3001L; + original.installBeginHuawei = 3002L; + original.installReferrerHuawei = "hua-ref"; + original.installReferrerHuaweiAppGallery = "hua-app-gallery-ref"; + original.isThirdPartySharingDisabledForCoppa = true; + original.clickTimeXiaomi = 4001L; + original.installBeginXiaomi = 4002L; + original.installReferrerXiaomi = "xiaomi-ref"; + original.clickTimeServerXiaomi = 4003L; + original.installBeginServerXiaomi = 4004L; + original.installVersionXiaomi = "x-1.0"; + original.clickTimeSamsung = 5001L; + original.installBeginSamsung = 5002L; + original.installReferrerSamsung = "samsung-ref"; + original.clickTimeVivo = 6001L; + original.installBeginVivo = 6002L; + original.installReferrerVivo = "vivo-ref"; + original.installVersionVivo = "v-1.0"; + original.installReferrerMeta = "meta-ref"; + original.clickTimeMeta = 7001L; + original.isClickMeta = Boolean.FALSE; + + ActivityState restored = (ActivityState) deserialize(serialize(original)); + + assertEquals(original.uuid, restored.uuid); + assertEquals(original.enabled, restored.enabled); + assertEquals(original.isGdprForgotten, restored.isGdprForgotten); + assertEquals(original.askingAttribution, restored.askingAttribution); + assertEquals(original.eventCount, restored.eventCount); + assertEquals(original.sessionCount, restored.sessionCount); + assertEquals(original.subsessionCount, restored.subsessionCount); + assertEquals(original.sessionLength, restored.sessionLength); + assertEquals(original.timeSpent, restored.timeSpent); + assertEquals(original.lastActivity, restored.lastActivity); + assertEquals(original.lastInterval, restored.lastInterval); + assertEquals(original.orderIds, restored.orderIds); + assertEquals(original.pushToken, restored.pushToken); + assertEquals(original.adid, restored.adid); + assertEquals(original.clickTime, restored.clickTime); + assertEquals(original.installBegin, restored.installBegin); + assertEquals(original.installReferrer, restored.installReferrer); + assertEquals(original.googlePlayInstant, restored.googlePlayInstant); + assertEquals(original.clickTimeServer, restored.clickTimeServer); + assertEquals(original.installBeginServer, restored.installBeginServer); + assertEquals(original.installVersion, restored.installVersion); + assertEquals(original.clickTimeHuawei, restored.clickTimeHuawei); + assertEquals(original.installBeginHuawei, restored.installBeginHuawei); + assertEquals(original.installReferrerHuawei, restored.installReferrerHuawei); + assertEquals(original.installReferrerHuaweiAppGallery, restored.installReferrerHuaweiAppGallery); + assertEquals(original.isThirdPartySharingDisabledForCoppa, restored.isThirdPartySharingDisabledForCoppa); + assertEquals(original.clickTimeXiaomi, restored.clickTimeXiaomi); + assertEquals(original.installBeginXiaomi, restored.installBeginXiaomi); + assertEquals(original.installReferrerXiaomi, restored.installReferrerXiaomi); + assertEquals(original.clickTimeServerXiaomi, restored.clickTimeServerXiaomi); + assertEquals(original.installBeginServerXiaomi, restored.installBeginServerXiaomi); + assertEquals(original.installVersionXiaomi, restored.installVersionXiaomi); + assertEquals(original.clickTimeSamsung, restored.clickTimeSamsung); + assertEquals(original.installBeginSamsung, restored.installBeginSamsung); + assertEquals(original.installReferrerSamsung, restored.installReferrerSamsung); + assertEquals(original.clickTimeVivo, restored.clickTimeVivo); + assertEquals(original.installBeginVivo, restored.installBeginVivo); + assertEquals(original.installReferrerVivo, restored.installReferrerVivo); + assertEquals(original.installVersionVivo, restored.installVersionVivo); + assertEquals(original.installReferrerMeta, restored.installReferrerMeta); + assertEquals(original.clickTimeMeta, restored.clickTimeMeta); + assertEquals(original.isClickMeta, restored.isClickMeta); + } + + @Test + public void roundTrip_adjustAttribution() throws Exception { + AdjustAttribution original = new AdjustAttribution(); + original.trackerToken = "token"; + original.trackerName = "name"; + original.network = "network"; + original.campaign = "campaign"; + original.adgroup = "adgroup"; + original.creative = "creative"; + original.clickLabel = "label"; + original.costType = "cpi"; + original.costAmount = 123.45d; + original.costCurrency = "USD"; + original.fbInstallReferrer = "fb-ref"; + original.jsonResponse = "{\"a\":1}"; + + AdjustAttribution restored = (AdjustAttribution) deserialize(serialize(original)); + + assertEquals(original.trackerToken, restored.trackerToken); + assertEquals(original.trackerName, restored.trackerName); + assertEquals(original.network, restored.network); + assertEquals(original.campaign, restored.campaign); + assertEquals(original.adgroup, restored.adgroup); + assertEquals(original.creative, restored.creative); + assertEquals(original.clickLabel, restored.clickLabel); + assertEquals(original.costType, restored.costType); + assertEquals(original.costAmount, restored.costAmount); + assertEquals(original.costCurrency, restored.costCurrency); + assertEquals(original.fbInstallReferrer, restored.fbInstallReferrer); + assertEquals(original.jsonResponse, restored.jsonResponse); + } + + @Test + public void roundTrip_eventMetadata() throws Exception { + EventMetadata original = new EventMetadata(); + original.incrementSequenceForEvent("evt-a"); + original.incrementSequenceForEvent("evt-b"); + original.incrementSequenceForEvent("evt-b"); + + EventMetadata restored = (EventMetadata) deserialize(serialize(original)); + + assertEquals(original, restored); + } + + @Test + public void roundTrip_activityPackage() throws Exception { + ActivityPackage original = new ActivityPackage(ActivityKind.EVENT); + original.setPath("/event"); + original.setClientSdk("android5.5.0"); + Map parameters = new LinkedHashMap<>(); + parameters.put("k1", "v1"); + parameters.put("k2", "v2"); + original.setParameters(parameters); + original.setSuffix("_suffix"); + Map callbackParameters = new LinkedHashMap<>(); + callbackParameters.put("cb1", "cv1"); + original.setCallbackParameters(callbackParameters); + Map partnerParameters = new LinkedHashMap<>(); + partnerParameters.put("pp1", "pv1"); + original.setPartnerParameters(partnerParameters); + original.addError(400); + original.addError(401); + original.setWaitBeforeSendTimeSeconds(3.5d); + + ActivityPackage restored = (ActivityPackage) deserialize(serialize(original)); + + assertEquals(original.getPath(), restored.getPath()); + assertEquals(original.getClientSdk(), restored.getClientSdk()); + assertEquals(original.getParameters(), restored.getParameters()); + assertEquals(original.getActivityKind(), restored.getActivityKind()); + assertEquals(original.getSuffix(), restored.getSuffix()); + assertEquals(original.getCallbackParameters(), restored.getCallbackParameters()); + assertEquals(original.getPartnerParameters(), restored.getPartnerParameters()); + // current ActivityPackage.readObject reads legacy "errorCount" and drops "retryCount" + assertEquals(0, restored.getRetryCount()); + assertEquals(original.getFirstErrorCode(), restored.getFirstErrorCode()); + assertEquals(original.getLastErrorCode(), restored.getLastErrorCode()); + assertEquals(original.getWaitBeforeSendTimeSeconds(), restored.getWaitBeforeSendTimeSeconds(), 0.0d); + } + + @Test + public void roundTrip_packageQueue() throws Exception { + ActivityPackage first = new ActivityPackage(ActivityKind.SESSION); + first.setPath("/session"); + first.setClientSdk("android5.5.0"); + Map firstParams = new LinkedHashMap<>(); + firstParams.put("k1", "v1"); + firstParams.put("k2", "v2"); + first.setParameters(firstParams); + first.setSuffix("_first"); + Map firstCallbackParams = new LinkedHashMap<>(); + firstCallbackParams.put("fcb1", "fcv1"); + first.setCallbackParameters(firstCallbackParams); + Map firstPartnerParams = new LinkedHashMap<>(); + firstPartnerParams.put("fpp1", "fpv1"); + first.setPartnerParameters(firstPartnerParams); + first.addError(400); + first.addError(401); + first.setWaitBeforeSendTimeSeconds(1.5d); + + ActivityPackage second = new ActivityPackage(ActivityKind.EVENT); + second.setPath("/event"); + second.setClientSdk("android5.5.0"); + Map secondParams = new LinkedHashMap<>(); + secondParams.put("k2", "v2"); + secondParams.put("k3", "v3"); + second.setParameters(secondParams); + second.setSuffix("_second"); + Map secondCallbackParams = new LinkedHashMap<>(); + secondCallbackParams.put("scb1", "scv1"); + second.setCallbackParameters(secondCallbackParams); + Map secondPartnerParams = new LinkedHashMap<>(); + secondPartnerParams.put("spp1", "spv1"); + second.setPartnerParameters(secondPartnerParams); + second.addError(402); + second.addError(403); + second.setWaitBeforeSendTimeSeconds(2.5d); + + List original = new ArrayList<>(); + original.add(first); + original.add(second); + + @SuppressWarnings("unchecked") + List restored = (List) deserialize(serialize(original)); + + assertEquals(2, restored.size()); + assertEquals(first.getPath(), restored.get(0).getPath()); + assertEquals(first.getClientSdk(), restored.get(0).getClientSdk()); + assertEquals(first.getParameters(), restored.get(0).getParameters()); + assertEquals(first.getActivityKind(), restored.get(0).getActivityKind()); + assertEquals(first.getSuffix(), restored.get(0).getSuffix()); + assertEquals(first.getCallbackParameters(), restored.get(0).getCallbackParameters()); + assertEquals(first.getPartnerParameters(), restored.get(0).getPartnerParameters()); + assertEquals(0, restored.get(0).getRetryCount()); + assertEquals(first.getFirstErrorCode(), restored.get(0).getFirstErrorCode()); + assertEquals(first.getLastErrorCode(), restored.get(0).getLastErrorCode()); + assertEquals(first.getWaitBeforeSendTimeSeconds(), restored.get(0).getWaitBeforeSendTimeSeconds(), 0.0d); + + assertEquals(second.getPath(), restored.get(1).getPath()); + assertEquals(second.getClientSdk(), restored.get(1).getClientSdk()); + assertEquals(second.getParameters(), restored.get(1).getParameters()); + assertEquals(second.getActivityKind(), restored.get(1).getActivityKind()); + assertEquals(second.getSuffix(), restored.get(1).getSuffix()); + assertEquals(second.getCallbackParameters(), restored.get(1).getCallbackParameters()); + assertEquals(second.getPartnerParameters(), restored.get(1).getPartnerParameters()); + assertEquals(0, restored.get(1).getRetryCount()); + assertEquals(second.getFirstErrorCode(), restored.get(1).getFirstErrorCode()); + assertEquals(second.getLastErrorCode(), restored.get(1).getLastErrorCode()); + assertEquals(second.getWaitBeforeSendTimeSeconds(), restored.get(1).getWaitBeforeSendTimeSeconds(), 0.0d); + } + + @Test + public void roundTrip_globalParametersMap() throws Exception { + Map original = new LinkedHashMap<>(); + original.put("k1", "v1"); + original.put("k2", "v2"); + + @SuppressWarnings("unchecked") + Map restored = (Map) deserialize(serialize(original)); + + assertEquals(original, restored); + } + + @Test + public void blocks_activityState_withBoobytrappedOrderIds() throws Exception { + ActivityState boobytrapped = new ActivityState(); + LinkedList orderIds = new LinkedList<>(); + orderIds.add("safe"); + orderIds.add(new UnfilteredClass()); + @SuppressWarnings("unchecked") + LinkedList raw = (LinkedList) (LinkedList) orderIds; + boobytrapped.orderIds = raw; + + assertThrows(InvalidClassException.class, () -> deserialize(serialize(boobytrapped))); + } + + @Test + public void blocks_eventMetadata_withBoobytrappedEventSequence() throws Exception { + EventMetadata boobytrapped = new EventMetadata(); + Map eventSequence = new HashMap<>(); + eventSequence.put("safe", 1); + eventSequence.put("bad", new UnfilteredClass()); + Field field = EventMetadata.class.getDeclaredField("eventSequence"); + field.setAccessible(true); + field.set(boobytrapped, eventSequence); + + assertThrows(InvalidClassException.class, () -> deserialize(serialize(boobytrapped))); + } + + @Test + public void blocks_activityPackage_withBoobytrappedParameters() throws Exception { + ActivityPackage boobytrapped = new ActivityPackage(ActivityKind.EVENT); + Map parameters = new LinkedHashMap<>(); + parameters.put("safe", "value"); + parameters.put("bad", new UnfilteredClass()); + @SuppressWarnings("unchecked") + Map raw = (Map) (Map) parameters; + boobytrapped.setParameters(raw); + + assertThrows(InvalidClassException.class, () -> deserialize(serialize(boobytrapped))); + } + + @Test + public void blocks_packageQueue_withBoobytrappedElement() throws Exception { + ActivityPackage safePackage = new ActivityPackage(ActivityKind.SESSION); + safePackage.setPath("/safe"); + Map safeParameters = new LinkedHashMap<>(); + safeParameters.put("safe_k", "safe_v"); + safePackage.setParameters(safeParameters); + + ActivityPackage boobytrappedPackage = new ActivityPackage(ActivityKind.EVENT); + boobytrappedPackage.setPath("/boobytrapped"); + Map boobytrappedParameters = new LinkedHashMap<>(); + boobytrappedParameters.put("safe_k", "safe_v"); + boobytrappedParameters.put("bad_k", new UnfilteredClass()); + @SuppressWarnings("unchecked") + Map rawBoobytrappedParameters = + (Map) (Map) boobytrappedParameters; + boobytrappedPackage.setParameters(rawBoobytrappedParameters); + + List boobytrappedQueue = new ArrayList<>(); + boobytrappedQueue.add(safePackage); + boobytrappedQueue.add(boobytrappedPackage); + + assertThrows(InvalidClassException.class, () -> deserialize(serialize(boobytrappedQueue))); + } + + @Test + public void blocks_globalParametersMap_withBoobytrappedValue() throws Exception { + Map boobytrapped = new LinkedHashMap<>(); + boobytrapped.put("safe", "value"); + boobytrapped.put("bad", new UnfilteredClass()); + + assertThrows(InvalidClassException.class, () -> deserialize(serialize(boobytrapped))); + } + + private static Object deserialize(byte[] data) throws Exception { + ByteArrayInputStream input = new ByteArrayInputStream(data); + try (ObjectInputStream objectInputStream = new ObjectInputFilterStream(input)) { + return objectInputStream.readObject(); + } + } + + private static byte[] serialize(Object obj) throws Exception { + ByteArrayOutputStream output = new ByteArrayOutputStream(); + try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(output)) { + objectOutputStream.writeObject(obj); + } + return output.toByteArray(); + } +} From 3d8d483708cf1ad6022b9b8233778c208f7c6ad8 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 6 Feb 2026 15:14:18 +0100 Subject: [PATCH 472/540] hardening(webbridge): stop using javascript loadUrl sink --- .../sdk/webbridge/AdjustBridgeUtil.java | 44 +++++++++---------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java index c3b7f8aee..93cc70b3b 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java @@ -41,8 +41,9 @@ public static void sendDeeplinkToWebView(final WebView webView, final Uri deepli webView.post(new Runnable() { @Override public void run() { - String command = "javascript:adjust_deeplink('" + deeplink.toString() + "');"; - webView.loadUrl(command); + String deeplinkValue = deeplink == null ? "null" : JSONObject.quote(deeplink.toString()); + String command = "adjust_deeplink(" + deeplinkValue + ");"; + webView.evaluateJavascript(command, null); } }); } @@ -124,13 +125,9 @@ public static void execAdidCallbackCommand(final WebView webView, final String c webView.post(new Runnable() { @Override public void run() { - if (adid != null ) { - String command = "javascript:" + commandName + "('" + adid + "');"; - webView.loadUrl(command); - } else { - String command = "javascript:" + commandName + "(null);"; - webView.loadUrl(command); - } + String payload = adid == null ? "null" : JSONObject.quote(adid); + String command = commandName + "(" + payload + ");"; + webView.evaluateJavascript(command, null); } }); } @@ -158,11 +155,11 @@ public void run() { jsonAttribution.put("fbInstallReferrer", attribution.fbInstallReferrer == null ? JSONObject.NULL : attribution.fbInstallReferrer); jsonAttribution.put("jsonResponse", attribution.jsonResponse == null ? JSONObject.NULL : new JSONObject(attribution.jsonResponse)); - String command = "javascript:" + commandName + "(" + jsonAttribution.toString() + ");"; - webView.loadUrl(command); + String command = commandName + "(" + jsonAttribution.toString() + ");"; + webView.evaluateJavascript(command, null); } else { - String command = "javascript:" + commandName + "(null);"; - webView.loadUrl(command); + String command = commandName + "(null);"; + webView.evaluateJavascript(command, null); } } catch (Exception e) { e.printStackTrace(); @@ -189,8 +186,8 @@ public void run() { jsonSessionSuccess.put("timestamp", sessionSuccess.timestamp == null ? JSONObject.NULL : sessionSuccess.timestamp); jsonSessionSuccess.put("jsonResponse", sessionSuccess.jsonResponse == null ? JSONObject.NULL : sessionSuccess.jsonResponse); - String command = "javascript:" + commandName + "(" + jsonSessionSuccess.toString() + ");"; - webView.loadUrl(command); + String command = commandName + "(" + jsonSessionSuccess.toString() + ");"; + webView.evaluateJavascript(command, null); } catch (Exception e) { e.printStackTrace(); } @@ -217,8 +214,8 @@ public void run() { jsonSessionFailure.put("willRetry", sessionFailure.willRetry ? String.valueOf(true) : String.valueOf(false)); jsonSessionFailure.put("jsonResponse", sessionFailure.jsonResponse == null ? JSONObject.NULL : sessionFailure.jsonResponse); - String command = "javascript:" + commandName + "(" + jsonSessionFailure.toString() + ");"; - webView.loadUrl(command); + String command = commandName + "(" + jsonSessionFailure.toString() + ");"; + webView.evaluateJavascript(command, null); } catch (Exception e) { e.printStackTrace(); } @@ -246,8 +243,8 @@ public void run() { jsonEventSuccess.put("callbackId", eventSuccess.callbackId == null ? JSONObject.NULL : eventSuccess.callbackId); jsonEventSuccess.put("jsonResponse", eventSuccess.jsonResponse == null ? JSONObject.NULL : eventSuccess.jsonResponse); - String command = "javascript:" + commandName + "(" + jsonEventSuccess.toString() + ");"; - webView.loadUrl(command); + String command = commandName + "(" + jsonEventSuccess.toString() + ");"; + webView.evaluateJavascript(command, null); } catch (Exception e) { e.printStackTrace(); } @@ -276,8 +273,8 @@ public void run() { jsonEventFailure.put("callbackId", eventFailure.callbackId == null ? JSONObject.NULL : eventFailure.callbackId); jsonEventFailure.put("jsonResponse", eventFailure.jsonResponse == null ? JSONObject.NULL : eventFailure.jsonResponse); - String command = "javascript:" + commandName + "(" + jsonEventFailure.toString() + ");"; - webView.loadUrl(command); + String command = commandName + "(" + jsonEventFailure.toString() + ");"; + webView.evaluateJavascript(command, null); } catch (Exception e) { e.printStackTrace(); } @@ -293,8 +290,9 @@ public static void execSingleValueCallback(final WebView webView, final String c webView.post(new Runnable() { @Override public void run() { - String command = "javascript:" + commandName + "('" + value + "');"; - webView.loadUrl(command); + String payload = value == null ? "null" : JSONObject.quote(value); + String command = commandName + "(" + payload + ");"; + webView.evaluateJavascript(command, null); } }); } From 25a40d2449c7e7d487a9ddd477b71ff430fedcae Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 6 Feb 2026 15:15:07 +0100 Subject: [PATCH 473/540] hardening(webbridge): route callbacks through fixed Adjust._nativeCallback --- .../src/main/assets/adjust.js | 132 ++++++++++++++---- .../sdk/webbridge/AdjustBridgeUtil.java | 64 ++++----- 2 files changed, 130 insertions(+), 66 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index d6cb9d206..7d2a7f351 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -7,47 +7,118 @@ window.randomCallbackIdWithPrefix = function(prefix) { var Adjust = { // map to store callbacks by their unique callback ID _callbackMap: {}, + _namedCallbackMap: {}, _handleGetterCallback: function(callback, callbackId) { - // store callback in map this._callbackMap[callbackId] = callback; + }, - // create a function on window with the callbackId name - // this function will be called by the native side - window[callbackId] = (function(adjustInstance, storedCallbackId) { - return function(value) { - var callback = adjustInstance._callbackMap[storedCallbackId]; - if (callback) { - // for attribution, the native side passes a JSON object that's already parsed - // for other values, they're passed as strings - if (storedCallbackId.includes("adjust_getAttribution")) { - // value is already a JavaScript object (parsed from JSON) - // only parse if it's actually a string (shouldn't happen) - if (typeof value === 'string') { - callback(JSON.parse(value)); - } else { - callback(value); - } - } else { - callback(value); - } - // clean up: remove callback and delete the function - delete adjustInstance._callbackMap[storedCallbackId]; - delete window[storedCallbackId]; - } else { - // callback was already cleaned up (teardown was called) - // safely remove the window function to prevent memory leaks - delete window[storedCallbackId]; - } - }; - })(this, callbackId); + _registerNamedCallback: function(callbackName, callback) { + if (!callbackName || typeof callback !== 'function') { + return; + } + this._namedCallbackMap[callbackName] = callback; + }, + + _registerConfigCallbacks: function(adjustConfig) { + if (!adjustConfig) { + return; + } + + var registerIfPresent = function(callbackName, callbackFn) { + if (!callbackName) { + return; + } + if (typeof callbackFn === 'function') { + Adjust._registerNamedCallback(callbackName, callbackFn); + return; + } + var resolved = Adjust._resolveCallbackByPath(callbackName); + if (typeof resolved === 'function') { + Adjust._registerNamedCallback(callbackName, resolved); + } + }; + + registerIfPresent(adjustConfig.attributionCallbackName, adjustConfig.attributionCallbackFunction); + registerIfPresent(adjustConfig.eventSuccessCallbackName, adjustConfig.eventSuccessCallbackFunction); + registerIfPresent(adjustConfig.eventFailureCallbackName, adjustConfig.eventFailureCallbackFunction); + registerIfPresent(adjustConfig.sessionSuccessCallbackName, adjustConfig.sessionSuccessCallbackFunction); + registerIfPresent(adjustConfig.sessionFailureCallbackName, adjustConfig.sessionFailureCallbackFunction); + registerIfPresent(adjustConfig.deferredDeeplinkCallbackName, adjustConfig.deferredDeeplinkCallbackFunction); + + var registerInternal = function(callbackName, callbackFn) { + if (!callbackName || typeof callbackFn !== 'function') { + return; + } + if (Adjust._namedCallbackMap[callbackName]) { + return; + } + Adjust._registerNamedCallback(callbackName, callbackFn.bind(adjustConfig)); + }; + + registerInternal(adjustConfig.attributionCallbackName, adjustConfig.adjust_attributionCallback); + registerInternal(adjustConfig.eventSuccessCallbackName, adjustConfig.adjust_eventSuccessCallback); + registerInternal(adjustConfig.eventFailureCallbackName, adjustConfig.adjust_eventFailureCallback); + registerInternal(adjustConfig.sessionSuccessCallbackName, adjustConfig.adjust_sessionSuccessCallback); + registerInternal(adjustConfig.sessionFailureCallbackName, adjustConfig.adjust_sessionFailureCallback); + registerInternal(adjustConfig.deferredDeeplinkCallbackName, adjustConfig.adjust_deferredDeeplinkCallback); }, + _resolveCallbackByPath: function(path) { + if (!path || typeof path !== 'string') { + return null; + } + if (path.indexOf('(') !== -1 || path.indexOf(')') !== -1) { + return null; + } + var parts = path.split('.'); + var context = window; + for (var i = 0; i < parts.length; i++) { + if (!context) { + return null; + } + context = context[parts[i]]; + } + return context; + }, + + _invokeCallback: function(callbackName, callback, value) { + if (callbackName && callbackName.indexOf("adjust_getAttribution") !== -1) { + if (typeof value === 'string') { + callback(JSON.parse(value)); + } else { + callback(value); + } + return; + } + callback(value); + }, + + _nativeCallback: function(callbackName, value) { + if (!callbackName) { + return; + } + var getterCallback = this._callbackMap[callbackName]; + if (getterCallback) { + this._invokeCallback(callbackName, getterCallback, value); + delete this._callbackMap[callbackName]; + return; + } + + var namedCallback = this._namedCallbackMap[callbackName]; + if (namedCallback) { + this._invokeCallback(callbackName, namedCallback, value); + } + }, + + + initSdk: function (adjustConfig) { if (adjustConfig && !adjustConfig.getSdkPrefix()) { adjustConfig.setSdkPrefix(this.getSdkPrefix()); } this.adjustConfig = adjustConfig; + this._registerConfigCallbacks(adjustConfig); if (AdjustBridge) { AdjustBridge.initSdk(JSON.stringify(adjustConfig)); } @@ -301,5 +372,6 @@ var Adjust = { } this.adjustConfig = undefined; this._callbackMap = {}; + this._namedCallbackMap = {}; }, }; diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java index 93cc70b3b..6acca242a 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java @@ -34,6 +34,8 @@ * Created by uerceg on 22/07/16. */ public class AdjustBridgeUtil { + private static final String NATIVE_CALLBACK_NAME = "Adjust._nativeCallback"; + public static void sendDeeplinkToWebView(final WebView webView, final Uri deeplink) { // If web view is initialised, trigger adjust_deeplink method which user should override. // In this method, the content of the deeplink will be delivered. @@ -118,18 +120,7 @@ public static Integer fieldToInteger(Object field) { } public static void execAdidCallbackCommand(final WebView webView, final String commandName, final String adid) { - if (webView == null) { - return; - } - - webView.post(new Runnable() { - @Override - public void run() { - String payload = adid == null ? "null" : JSONObject.quote(adid); - String command = commandName + "(" + payload + ");"; - webView.evaluateJavascript(command, null); - } - }); + execNativeCallback(webView, commandName, adid == null ? "null" : JSONObject.quote(adid)); } public static void execAttributionCallbackCommand(final WebView webView, final String commandName, final AdjustAttribution attribution) { @@ -155,11 +146,9 @@ public void run() { jsonAttribution.put("fbInstallReferrer", attribution.fbInstallReferrer == null ? JSONObject.NULL : attribution.fbInstallReferrer); jsonAttribution.put("jsonResponse", attribution.jsonResponse == null ? JSONObject.NULL : new JSONObject(attribution.jsonResponse)); - String command = commandName + "(" + jsonAttribution.toString() + ");"; - webView.evaluateJavascript(command, null); + execNativeCallback(webView, commandName, jsonAttribution.toString()); } else { - String command = commandName + "(null);"; - webView.evaluateJavascript(command, null); + execNativeCallback(webView, commandName, "null"); } } catch (Exception e) { e.printStackTrace(); @@ -186,8 +175,7 @@ public void run() { jsonSessionSuccess.put("timestamp", sessionSuccess.timestamp == null ? JSONObject.NULL : sessionSuccess.timestamp); jsonSessionSuccess.put("jsonResponse", sessionSuccess.jsonResponse == null ? JSONObject.NULL : sessionSuccess.jsonResponse); - String command = commandName + "(" + jsonSessionSuccess.toString() + ");"; - webView.evaluateJavascript(command, null); + execNativeCallback(webView, commandName, jsonSessionSuccess.toString()); } catch (Exception e) { e.printStackTrace(); } @@ -214,8 +202,7 @@ public void run() { jsonSessionFailure.put("willRetry", sessionFailure.willRetry ? String.valueOf(true) : String.valueOf(false)); jsonSessionFailure.put("jsonResponse", sessionFailure.jsonResponse == null ? JSONObject.NULL : sessionFailure.jsonResponse); - String command = commandName + "(" + jsonSessionFailure.toString() + ");"; - webView.evaluateJavascript(command, null); + execNativeCallback(webView, commandName, jsonSessionFailure.toString()); } catch (Exception e) { e.printStackTrace(); } @@ -243,8 +230,7 @@ public void run() { jsonEventSuccess.put("callbackId", eventSuccess.callbackId == null ? JSONObject.NULL : eventSuccess.callbackId); jsonEventSuccess.put("jsonResponse", eventSuccess.jsonResponse == null ? JSONObject.NULL : eventSuccess.jsonResponse); - String command = commandName + "(" + jsonEventSuccess.toString() + ");"; - webView.evaluateJavascript(command, null); + execNativeCallback(webView, commandName, jsonEventSuccess.toString()); } catch (Exception e) { e.printStackTrace(); } @@ -273,8 +259,7 @@ public void run() { jsonEventFailure.put("callbackId", eventFailure.callbackId == null ? JSONObject.NULL : eventFailure.callbackId); jsonEventFailure.put("jsonResponse", eventFailure.jsonResponse == null ? JSONObject.NULL : eventFailure.jsonResponse); - String command = commandName + "(" + jsonEventFailure.toString() + ");"; - webView.evaluateJavascript(command, null); + execNativeCallback(webView, commandName, jsonEventFailure.toString()); } catch (Exception e) { e.printStackTrace(); } @@ -283,18 +268,7 @@ public void run() { } public static void execSingleValueCallback(final WebView webView, final String commandName, final String value) { - if (webView == null) { - return; - } - - webView.post(new Runnable() { - @Override - public void run() { - String payload = value == null ? "null" : JSONObject.quote(value); - String command = commandName + "(" + payload + ");"; - webView.evaluateJavascript(command, null); - } - }); + execNativeCallback(webView, commandName, value == null ? "null" : JSONObject.quote(value)); } public static String[] jsonArrayToArray(JSONArray jsonArray) throws JSONException { @@ -311,4 +285,22 @@ public static String[] jsonArrayToArray(JSONArray jsonArray) throws JSONExceptio public static ILogger getLogger() { return AdjustFactory.getLogger(); } + + private static void execNativeCallback(final WebView webView, final String commandName, final String payload) { + if (webView == null) { + return; + } + if (commandName == null) { + return; + } + + webView.post(new Runnable() { + @Override + public void run() { + String command = "if (window.Adjust && typeof " + NATIVE_CALLBACK_NAME + " === 'function') { " + + NATIVE_CALLBACK_NAME + "(" + JSONObject.quote(commandName) + ", " + payload + "); }"; + webView.evaluateJavascript(command, null); + } + }); + } } From 7241ec3ee781fd2bd2152e242ddbf8fcfff94641 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 6 Feb 2026 15:15:23 +0100 Subject: [PATCH 474/540] hardening(webbridge): require bridge token and block iframe bridge calls --- .../src/main/assets/adjust.js | 144 ++++---- .../sdk/webbridge/AdjustBridgeInstance.java | 309 ++++++++++++++++++ .../sdk/webbridge/AdjustBridgeUtil.java | 208 ++++++------ 3 files changed, 472 insertions(+), 189 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 7d2a7f351..b8c49a9f8 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -8,7 +8,10 @@ var Adjust = { // map to store callbacks by their unique callback ID _callbackMap: {}, _namedCallbackMap: {}, - + _bridgeToken: null, + _bridgeTokenRequested: false, + _pendingBridgeCalls: [], + _handleGetterCallback: function(callback, callbackId) { this._callbackMap[callbackId] = callback; }, @@ -111,7 +114,39 @@ var Adjust = { } }, - + _setBridgeToken: function(token) { + this._bridgeToken = token; + this._bridgeTokenRequested = false; + if (!this._pendingBridgeCalls.length) { + return; + } + var pending = this._pendingBridgeCalls; + this._pendingBridgeCalls = []; + for (var i = 0; i < pending.length; i++) { + var entry = pending[i]; + this._callBridge(entry.method, entry.args); + } + }, + + _callBridge: function(method, args) { + if (!AdjustBridge) { + return undefined; + } + if (window.top !== window.self) { + return undefined; + } + var callArgs = args ? args.slice() : []; + if (!this._bridgeToken) { + if (!this._bridgeTokenRequested && typeof AdjustBridge.requestBridgeToken === 'function') { + this._bridgeTokenRequested = true; + AdjustBridge.requestBridgeToken(); + } + this._pendingBridgeCalls.push({ method: method, args: callArgs }); + return undefined; + } + callArgs.push(this._bridgeToken); + return AdjustBridge[method].apply(AdjustBridge, callArgs); + }, initSdk: function (adjustConfig) { if (adjustConfig && !adjustConfig.getSdkPrefix()) { @@ -129,33 +164,23 @@ var Adjust = { }, trackEvent: function (adjustEvent) { - if (AdjustBridge) { - AdjustBridge.trackEvent(JSON.stringify(adjustEvent)); - } + this._callBridge('trackEvent', [JSON.stringify(adjustEvent)]); }, onResume: function () { - if (AdjustBridge) { - AdjustBridge.onResume(); - } + this._callBridge('onResume'); }, onPause: function () { - if (AdjustBridge) { - AdjustBridge.onPause(); - } + this._callBridge('onPause'); }, enable: function () { - if (AdjustBridge) { - AdjustBridge.enable(); - } + this._callBridge('enable'); }, disable: function () { - if (AdjustBridge) { - AdjustBridge.disable(); - } + this._callBridge('disable'); }, isEnabled: function (callback) { @@ -167,28 +192,22 @@ var Adjust = { // generate unique callback ID const callbackId = window.randomCallbackIdWithPrefix("adjust_isEnabled"); this._handleGetterCallback(callback, callbackId); - AdjustBridge.isEnabled(callbackId); + this._callBridge('isEnabled', [callbackId]); } else { return AdjustBridge.isEnabled(); } }, setReferrer: function (referrer) { - if (AdjustBridge) { - AdjustBridge.setReferrer(referrer); - } + this._callBridge('setReferrer', [referrer]); }, switchToOfflineMode: function() { - if (AdjustBridge) { - AdjustBridge.switchToOfflineMode(); - } + this._callBridge('switchToOfflineMode'); }, switchBackToOnlineMode: function() { - if (AdjustBridge) { - AdjustBridge.switchBackToOnlineMode(); - } + this._callBridge('switchBackToOnlineMode'); }, addGlobalCallbackParameter: function(key, value) { @@ -197,7 +216,7 @@ var Adjust = { console.log('[Adjust]: Passed key or value is not of string type'); return; } - AdjustBridge.addGlobalCallbackParameter(key, value); + this._callBridge('addGlobalCallbackParameter', [key, value]); } }, @@ -207,7 +226,7 @@ var Adjust = { console.log('[Adjust]: Passed key or value is not of string type'); return; } - AdjustBridge.addGlobalPartnerParameter(key, value); + this._callBridge('addGlobalPartnerParameter', [key, value]); } }, @@ -217,7 +236,7 @@ var Adjust = { console.log('[Adjust]: Passed key is not of string type'); return; } - AdjustBridge.removeGlobalCallbackParameter(key); + this._callBridge('removeGlobalCallbackParameter', [key]); } }, @@ -227,81 +246,59 @@ var Adjust = { console.log('[Adjust]: Passed key is not of string type'); return; } - AdjustBridge.removeGlobalPartnerParameter(key); + this._callBridge('removeGlobalPartnerParameter', [key]); } }, removeGlobalCallbackParameters: function() { - if (AdjustBridge) { - AdjustBridge.removeGlobalCallbackParameters(); - } + this._callBridge('removeGlobalCallbackParameters'); }, removeGlobalPartnerParameters: function() { - if (AdjustBridge) { - AdjustBridge.removeGlobalPartnerParameters(); - } + this._callBridge('removeGlobalPartnerParameters'); }, gdprForgetMe: function() { - if (AdjustBridge) { - AdjustBridge.gdprForgetMe(); - } + this._callBridge('gdprForgetMe'); }, trackThirdPartySharing: function(adjustThirdPartySharing) { - if (AdjustBridge) { - AdjustBridge.trackThirdPartySharing(JSON.stringify(adjustThirdPartySharing)); - } + this._callBridge('trackThirdPartySharing', [JSON.stringify(adjustThirdPartySharing)]); }, trackMeasurementConsent: function(consentMeasurement) { - if (AdjustBridge) { - AdjustBridge.trackMeasurementConsent(consentMeasurement); - } + this._callBridge('trackMeasurementConsent', [consentMeasurement]); }, endFirstSessionDelay: function() { - if (AdjustBridge) { - AdjustBridge.endFirstSessionDelay(); - } + this._callBridge('endFirstSessionDelay'); }, enableCoppaComplianceInDelay: function() { - if (AdjustBridge) { - AdjustBridge.enableCoppaComplianceInDelay(); - } + this._callBridge('enableCoppaComplianceInDelay'); }, disableCoppaComplianceInDelay: function() { - if (AdjustBridge) { - AdjustBridge.disableCoppaComplianceInDelay(); - } + this._callBridge('disableCoppaComplianceInDelay'); }, enablePlayStoreKidsComplianceInDelay: function() { - if (AdjustBridge) { - AdjustBridge.enablePlayStoreKidsComplianceInDelay(); - } + this._callBridge('enablePlayStoreKidsComplianceInDelay'); }, disablePlayStoreKidsComplianceInDelay: function() { - if (AdjustBridge) { - AdjustBridge.disablePlayStoreKidsComplianceInDelay(); - } + this._callBridge('disablePlayStoreKidsComplianceInDelay'); }, setExternalDeviceIdInDelay: function(externalDeviceId) { - if (AdjustBridge) { - AdjustBridge.setExternalDeviceIdInDelay(externalDeviceId); - } + this._callBridge('setExternalDeviceIdInDelay', [externalDeviceId]); }, getGoogleAdId: function (callback) { if (AdjustBridge) { const callbackId = window.randomCallbackIdWithPrefix("adjust_getGoogleAdId"); this._handleGetterCallback(callback, callbackId); - AdjustBridge.getGoogleAdId(callbackId); + this._callBridge('getGoogleAdId', [callbackId]); } }, @@ -309,7 +306,7 @@ var Adjust = { if (AdjustBridge) { const callbackId = window.randomCallbackIdWithPrefix("adjust_getAdid"); this._handleGetterCallback(callback, callbackId); - AdjustBridge.getAdid(callbackId); + this._callBridge('getAdid', [callbackId]); } }, @@ -317,7 +314,7 @@ var Adjust = { if (AdjustBridge) { const callbackId = window.randomCallbackIdWithPrefix("adjust_getAdidWithTimeout"); this._handleGetterCallback(callback, callbackId); - AdjustBridge.getAdidWithTimeout(timeoutInMilliSec, callbackId); + this._callBridge('getAdidWithTimeout', [timeoutInMilliSec, callbackId]); } }, @@ -326,7 +323,7 @@ var Adjust = { const callbackId = window.randomCallbackIdWithPrefix("adjust_getAmazonAdId"); this._handleGetterCallback(callbackSuccess, callbackId); // note: Java side only supports success callback, callbackFail is ignored - AdjustBridge.getAmazonAdId(callbackId); + this._callBridge('getAmazonAdId', [callbackId]); } }, @@ -334,7 +331,7 @@ var Adjust = { if (AdjustBridge) { const callbackId = window.randomCallbackIdWithPrefix("adjust_getAttribution"); this._handleGetterCallback(callback, callbackId); - AdjustBridge.getAttribution(callbackId); + this._callBridge('getAttribution', [callbackId]); } }, @@ -342,7 +339,7 @@ var Adjust = { if (AdjustBridge) { const callbackId = window.randomCallbackIdWithPrefix("adjust_getAttributionWithTimeout"); this._handleGetterCallback(callback, callbackId); - AdjustBridge.getAttributionWithTimeout(timeoutInMilliSec, callbackId); + this._callBridge('getAttributionWithTimeout', [timeoutInMilliSec, callbackId]); } }, @@ -354,7 +351,7 @@ var Adjust = { callback(Adjust.getSdkPrefix() + '@' + sdkVersion); }; this._handleGetterCallback(wrappedCallback, callbackId); - AdjustBridge.getSdkVersion(callbackId); + this._callBridge('getSdkVersion', [callbackId]); } }, @@ -368,10 +365,13 @@ var Adjust = { teardown: function() { if (AdjustBridge) { - AdjustBridge.teardown(); + this._callBridge('teardown'); } this.adjustConfig = undefined; this._callbackMap = {}; this._namedCallbackMap = {}; + this._bridgeToken = null; + this._bridgeTokenRequested = false; + this._pendingBridgeCalls = []; }, }; diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 236cd85d9..bdf1e220e 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -2,6 +2,7 @@ import android.net.Uri; import android.os.Build; +import android.util.Base64; import android.webkit.JavascriptInterface; import android.webkit.WebView; import android.app.Application; @@ -34,6 +35,7 @@ import org.json.JSONArray; import org.json.JSONObject; +import java.security.SecureRandom; import java.util.Arrays; import java.util.List; @@ -59,6 +61,8 @@ public class AdjustBridgeInstance { private FacebookSDKJSInterface facebookSDKJSInterface = null; private String adjustSdkPrefix = null; + private boolean isBridgeSecurityEnabled = false; + private String bridgeSecurityToken = null; AdjustBridgeInstance() {} @@ -79,6 +83,32 @@ private boolean isInitialized() { return true; } + private boolean isBridgeAuthorized(String token) { + if (!isBridgeSecurityEnabled) { + return true; + } + if (bridgeSecurityToken == null) { + return false; + } + return bridgeSecurityToken.equals(token); + } + + private void enableBridgeSecurity() { + if (!isBridgeSecurityEnabled) { + isBridgeSecurityEnabled = true; + } + if (bridgeSecurityToken == null) { + bridgeSecurityToken = generateBridgeToken(); + } + AdjustBridgeUtil.sendBridgeTokenToWebView(webView, bridgeSecurityToken); + } + + private String generateBridgeToken() { + byte[] tokenBytes = new byte[16]; + new SecureRandom().nextBytes(tokenBytes); + return Base64.encodeToString(tokenBytes, Base64.NO_WRAP); + } + public void registerFacebookSDKJSInterface() { // Configure the web view to add fb pixel interface String fbApplicationId = FacebookSDKJSInterface.getApplicationId(application.getApplicationContext()); @@ -407,6 +437,8 @@ public boolean launchReceivedDeeplink(Uri deeplink) { } } + enableBridgeSecurity(); + Adjust.initSdk(adjustConfig); isInitialized = true; @@ -416,8 +448,24 @@ public boolean launchReceivedDeeplink(Uri deeplink) { } } + @JavascriptInterface + public void requestBridgeToken() { + if (webView == null) { + return; + } + enableBridgeSecurity(); + } + @JavascriptInterface public void trackEvent(String adjustEventString) { + trackEvent(adjustEventString, null); + } + + @JavascriptInterface + public void trackEvent(String adjustEventString, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -489,6 +537,14 @@ public void trackEvent(String adjustEventString) { @JavascriptInterface public void onResume() { + onResume(null); + } + + @JavascriptInterface + public void onResume(String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -497,6 +553,14 @@ public void onResume() { @JavascriptInterface public void onPause() { + onPause(null); + } + + @JavascriptInterface + public void onPause(String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -505,6 +569,14 @@ public void onPause() { @JavascriptInterface public void enable() { + enable(null); + } + + @JavascriptInterface + public void enable(String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -513,6 +585,14 @@ public void enable() { @JavascriptInterface public void disable() { + disable(null); + } + + @JavascriptInterface + public void disable(String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -521,6 +601,14 @@ public void disable() { @JavascriptInterface public void isEnabled(String callback) { + isEnabled(callback, null); + } + + @JavascriptInterface + public void isEnabled(String callback, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -534,6 +622,14 @@ public void onIsEnabledRead(boolean isEnabled) { @JavascriptInterface public void setReferrer(String referrer) { + setReferrer(referrer, null); + } + + @JavascriptInterface + public void setReferrer(String referrer, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -542,6 +638,14 @@ public void setReferrer(String referrer) { @JavascriptInterface public void switchToOfflineMode() { + switchToOfflineMode(null); + } + + @JavascriptInterface + public void switchToOfflineMode(String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -550,6 +654,14 @@ public void switchToOfflineMode() { @JavascriptInterface public void switchBackToOnlineMode() { + switchBackToOnlineMode(null); + } + + @JavascriptInterface + public void switchBackToOnlineMode(String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -558,6 +670,14 @@ public void switchBackToOnlineMode() { @JavascriptInterface public void addGlobalCallbackParameter(String key, String value) { + addGlobalCallbackParameter(key, value, null); + } + + @JavascriptInterface + public void addGlobalCallbackParameter(String key, String value, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -566,6 +686,14 @@ public void addGlobalCallbackParameter(String key, String value) { @JavascriptInterface public void addGlobalPartnerParameter(String key, String value) { + addGlobalPartnerParameter(key, value, null); + } + + @JavascriptInterface + public void addGlobalPartnerParameter(String key, String value, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -574,6 +702,14 @@ public void addGlobalPartnerParameter(String key, String value) { @JavascriptInterface public void removeGlobalCallbackParameter(String key) { + removeGlobalCallbackParameter(key, null); + } + + @JavascriptInterface + public void removeGlobalCallbackParameter(String key, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -582,6 +718,14 @@ public void removeGlobalCallbackParameter(String key) { @JavascriptInterface public void removeGlobalPartnerParameter(String key) { + removeGlobalPartnerParameter(key, null); + } + + @JavascriptInterface + public void removeGlobalPartnerParameter(String key, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -590,6 +734,14 @@ public void removeGlobalPartnerParameter(String key) { @JavascriptInterface public void removeGlobalCallbackParameters() { + removeGlobalCallbackParameters(null); + } + + @JavascriptInterface + public void removeGlobalCallbackParameters(String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -598,6 +750,14 @@ public void removeGlobalCallbackParameters() { @JavascriptInterface public void removeGlobalPartnerParameters() { + removeGlobalPartnerParameters(null); + } + + @JavascriptInterface + public void removeGlobalPartnerParameters(String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -606,6 +766,14 @@ public void removeGlobalPartnerParameters() { @JavascriptInterface public void gdprForgetMe() { + gdprForgetMe(null); + } + + @JavascriptInterface + public void gdprForgetMe(String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -614,6 +782,14 @@ public void gdprForgetMe() { @JavascriptInterface public void trackThirdPartySharing(String adjustThirdPartySharingString) { + trackThirdPartySharing(adjustThirdPartySharingString, null); + } + + @JavascriptInterface + public void trackThirdPartySharing(String adjustThirdPartySharingString, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -669,6 +845,14 @@ public void trackThirdPartySharing(String adjustThirdPartySharingString) { @JavascriptInterface public void trackMeasurementConsent(String consentMeasurementString) { + trackMeasurementConsent(consentMeasurementString, null); + } + + @JavascriptInterface + public void trackMeasurementConsent(String consentMeasurementString, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -680,6 +864,14 @@ public void trackMeasurementConsent(String consentMeasurementString) { @JavascriptInterface public void endFirstSessionDelay() { + endFirstSessionDelay(null); + } + + @JavascriptInterface + public void endFirstSessionDelay(String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -688,6 +880,14 @@ public void endFirstSessionDelay() { @JavascriptInterface public void enableCoppaComplianceInDelay() { + enableCoppaComplianceInDelay(null); + } + + @JavascriptInterface + public void enableCoppaComplianceInDelay(String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -696,6 +896,14 @@ public void enableCoppaComplianceInDelay() { @JavascriptInterface public void disableCoppaComplianceInDelay() { + disableCoppaComplianceInDelay(null); + } + + @JavascriptInterface + public void disableCoppaComplianceInDelay(String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -704,6 +912,14 @@ public void disableCoppaComplianceInDelay() { @JavascriptInterface public void enablePlayStoreKidsComplianceInDelay() { + enablePlayStoreKidsComplianceInDelay(null); + } + + @JavascriptInterface + public void enablePlayStoreKidsComplianceInDelay(String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -712,6 +928,14 @@ public void enablePlayStoreKidsComplianceInDelay() { @JavascriptInterface public void disablePlayStoreKidsComplianceInDelay() { + disablePlayStoreKidsComplianceInDelay(null); + } + + @JavascriptInterface + public void disablePlayStoreKidsComplianceInDelay(String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -720,6 +944,14 @@ public void disablePlayStoreKidsComplianceInDelay() { @JavascriptInterface public void setExternalDeviceIdInDelay(String externalDeviceId) { + setExternalDeviceIdInDelay(externalDeviceId, null); + } + + @JavascriptInterface + public void setExternalDeviceIdInDelay(String externalDeviceId, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -728,6 +960,14 @@ public void setExternalDeviceIdInDelay(String externalDeviceId) { @JavascriptInterface public void getGoogleAdId(final String callback) { + getGoogleAdId(callback, null); + } + + @JavascriptInterface + public void getGoogleAdId(final String callback, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -741,6 +981,14 @@ public void onGoogleAdIdRead(String googleAdId) { @JavascriptInterface public void getAmazonAdId(final String callbackSuccess) { + getAmazonAdId(callbackSuccess, null); + } + + @JavascriptInterface + public void getAmazonAdId(final String callbackSuccess, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -754,6 +1002,14 @@ public void onAmazonAdIdRead(String adid) { @JavascriptInterface public void getAdid(final String callback) { + getAdid(callback, null); + } + + @JavascriptInterface + public void getAdid(final String callback, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -767,6 +1023,14 @@ public void onAdidRead(String adid) { @JavascriptInterface public void getAdidWithTimeout(final long timeoutInMilliSec, final String callback) { + getAdidWithTimeout(timeoutInMilliSec, callback, null); + } + + @JavascriptInterface + public void getAdidWithTimeout(final long timeoutInMilliSec, final String callback, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -781,6 +1045,14 @@ public void onAdidRead(String adid) { @JavascriptInterface public void getAttribution(final String callback) { + getAttribution(callback, null); + } + + @JavascriptInterface + public void getAttribution(final String callback, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -795,6 +1067,14 @@ public void onAttributionRead(AdjustAttribution attribution) { @JavascriptInterface public void getAttributionWithTimeout(final long timeoutInMilliSec, final String callback) { + getAttributionWithTimeout(timeoutInMilliSec, callback, null); + } + + @JavascriptInterface + public void getAttributionWithTimeout(final long timeoutInMilliSec, final String callback, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -809,6 +1089,14 @@ public void onAttributionRead(AdjustAttribution attribution) { @JavascriptInterface public void getSdkVersion(final String callback) { + getSdkVersion(callback, null); + } + + @JavascriptInterface + public void getSdkVersion(final String callback, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } if (!isInitialized()) { return; } @@ -822,13 +1110,31 @@ public void onSdkVersionRead(String sdkVersion) { @JavascriptInterface public void fbPixelEvent(String pixelId, String event_name, String jsonString) { + fbPixelEvent(pixelId, event_name, jsonString, null); + } + + @JavascriptInterface + public void fbPixelEvent(String pixelId, String event_name, String jsonString, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } this.facebookSDKJSInterface.sendEvent(pixelId, event_name, jsonString); } @JavascriptInterface public void teardown() { + teardown(null); + } + + @JavascriptInterface + public void teardown(String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } isInitialized = false; isOpeningDeferredDeeplinkEnabled = true; + isBridgeSecurityEnabled = false; + bridgeSecurityToken = null; } public void setWebView(WebView webView) { @@ -836,6 +1142,7 @@ public void setWebView(WebView webView) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { webView.addJavascriptInterface(this, JAVASCRIPT_INTERFACE_NAME); } + enableBridgeSecurity(); } public void setApplicationContext(Application application) { @@ -855,6 +1162,8 @@ public void unregister() { application = null; webView = null; isInitialized = false; + isBridgeSecurityEnabled = false; + bridgeSecurityToken = null; } public void unregisterFacebookSDKJSInterface() { diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java index 6acca242a..5d8334284 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java @@ -1,7 +1,6 @@ package com.adjust.sdk.webbridge; import android.net.Uri; -import android.util.Log; import android.webkit.WebView; import com.adjust.sdk.AdjustAttribution; @@ -11,30 +10,17 @@ import com.adjust.sdk.AdjustSessionFailure; import com.adjust.sdk.AdjustSessionSuccess; import com.adjust.sdk.ILogger; -import com.adjust.sdk.network.UtilNetworking; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.security.cert.CertificateEncodingException; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSession; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; - /** * Created by uerceg on 22/07/16. */ public class AdjustBridgeUtil { private static final String NATIVE_CALLBACK_NAME = "Adjust._nativeCallback"; + private static final String SET_BRIDGE_TOKEN_CALLBACK_NAME = "Adjust._setBridgeToken"; public static void sendDeeplinkToWebView(final WebView webView, final Uri deeplink) { // If web view is initialised, trigger adjust_deeplink method which user should override. @@ -44,7 +30,7 @@ public static void sendDeeplinkToWebView(final WebView webView, final Uri deepli @Override public void run() { String deeplinkValue = deeplink == null ? "null" : JSONObject.quote(deeplink.toString()); - String command = "adjust_deeplink(" + deeplinkValue + ");"; + String command = "if (typeof adjust_deeplink === 'function') { adjust_deeplink(" + deeplinkValue + "); }"; webView.evaluateJavascript(command, null); } }); @@ -127,34 +113,32 @@ public static void execAttributionCallbackCommand(final WebView webView, final S if (webView == null) { return; } - webView.post(new Runnable() { - @Override - public void run() { - try { - if (attribution != null) { - JSONObject jsonAttribution = new JSONObject(); - jsonAttribution.put("trackerName", attribution.trackerName == null ? JSONObject.NULL : attribution.trackerName); - jsonAttribution.put("trackerToken", attribution.trackerToken == null ? JSONObject.NULL : attribution.trackerToken); - jsonAttribution.put("campaign", attribution.campaign == null ? JSONObject.NULL : attribution.campaign); - jsonAttribution.put("network", attribution.network == null ? JSONObject.NULL : attribution.network); - jsonAttribution.put("creative", attribution.creative == null ? JSONObject.NULL : attribution.creative); - jsonAttribution.put("adgroup", attribution.adgroup == null ? JSONObject.NULL : attribution.adgroup); - jsonAttribution.put("clickLabel", attribution.clickLabel == null ? JSONObject.NULL : attribution.clickLabel); - jsonAttribution.put("costType", attribution.costType == null ? JSONObject.NULL : attribution.costType); - jsonAttribution.put("costAmount", attribution.costAmount == null || attribution.costAmount.isNaN() ? 0 : attribution.costAmount); - jsonAttribution.put("costCurrency", attribution.costCurrency == null ? JSONObject.NULL : attribution.costCurrency); - jsonAttribution.put("fbInstallReferrer", attribution.fbInstallReferrer == null ? JSONObject.NULL : attribution.fbInstallReferrer); - jsonAttribution.put("jsonResponse", attribution.jsonResponse == null ? JSONObject.NULL : new JSONObject(attribution.jsonResponse)); - - execNativeCallback(webView, commandName, jsonAttribution.toString()); - } else { - execNativeCallback(webView, commandName, "null"); - } - } catch (Exception e) { - e.printStackTrace(); - } + if (commandName == null) { + return; + } + try { + if (attribution != null) { + JSONObject jsonAttribution = new JSONObject(); + jsonAttribution.put("trackerName", attribution.trackerName == null ? JSONObject.NULL : attribution.trackerName); + jsonAttribution.put("trackerToken", attribution.trackerToken == null ? JSONObject.NULL : attribution.trackerToken); + jsonAttribution.put("campaign", attribution.campaign == null ? JSONObject.NULL : attribution.campaign); + jsonAttribution.put("network", attribution.network == null ? JSONObject.NULL : attribution.network); + jsonAttribution.put("creative", attribution.creative == null ? JSONObject.NULL : attribution.creative); + jsonAttribution.put("adgroup", attribution.adgroup == null ? JSONObject.NULL : attribution.adgroup); + jsonAttribution.put("clickLabel", attribution.clickLabel == null ? JSONObject.NULL : attribution.clickLabel); + jsonAttribution.put("costType", attribution.costType == null ? JSONObject.NULL : attribution.costType); + jsonAttribution.put("costAmount", attribution.costAmount == null || attribution.costAmount.isNaN() ? 0 : attribution.costAmount); + jsonAttribution.put("costCurrency", attribution.costCurrency == null ? JSONObject.NULL : attribution.costCurrency); + jsonAttribution.put("fbInstallReferrer", attribution.fbInstallReferrer == null ? JSONObject.NULL : attribution.fbInstallReferrer); + jsonAttribution.put("jsonResponse", attribution.jsonResponse == null ? JSONObject.NULL : new JSONObject(attribution.jsonResponse)); + + execNativeCallback(webView, commandName, jsonAttribution.toString()); + } else { + execNativeCallback(webView, commandName, "null"); } - }); + } catch (Exception e) { + e.printStackTrace(); + } } public static void execSessionSuccessCallbackCommand(final WebView webView, final String commandName, final AdjustSessionSuccess sessionSuccess) { @@ -164,23 +148,16 @@ public static void execSessionSuccessCallbackCommand(final WebView webView, fina if (sessionSuccess == null) { return; } - - webView.post(new Runnable() { - @Override - public void run() { - JSONObject jsonSessionSuccess = new JSONObject(); - try { - jsonSessionSuccess.put("message", sessionSuccess.message == null ? JSONObject.NULL : sessionSuccess.message); - jsonSessionSuccess.put("adid", sessionSuccess.adid == null ? JSONObject.NULL : sessionSuccess.adid); - jsonSessionSuccess.put("timestamp", sessionSuccess.timestamp == null ? JSONObject.NULL : sessionSuccess.timestamp); - jsonSessionSuccess.put("jsonResponse", sessionSuccess.jsonResponse == null ? JSONObject.NULL : sessionSuccess.jsonResponse); - - execNativeCallback(webView, commandName, jsonSessionSuccess.toString()); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); + JSONObject jsonSessionSuccess = new JSONObject(); + try { + jsonSessionSuccess.put("message", sessionSuccess.message == null ? JSONObject.NULL : sessionSuccess.message); + jsonSessionSuccess.put("adid", sessionSuccess.adid == null ? JSONObject.NULL : sessionSuccess.adid); + jsonSessionSuccess.put("timestamp", sessionSuccess.timestamp == null ? JSONObject.NULL : sessionSuccess.timestamp); + jsonSessionSuccess.put("jsonResponse", sessionSuccess.jsonResponse == null ? JSONObject.NULL : sessionSuccess.jsonResponse); + execNativeCallback(webView, commandName, jsonSessionSuccess.toString()); + } catch (Exception e) { + e.printStackTrace(); + } } public static void execSessionFailureCallbackCommand(final WebView webView, final String commandName, final AdjustSessionFailure sessionFailure) { @@ -190,24 +167,17 @@ public static void execSessionFailureCallbackCommand(final WebView webView, fina if (sessionFailure == null) { return; } - - webView.post(new Runnable() { - @Override - public void run() { - JSONObject jsonSessionFailure = new JSONObject(); - try { - jsonSessionFailure.put("message", sessionFailure.message == null ? JSONObject.NULL : sessionFailure.message); - jsonSessionFailure.put("adid", sessionFailure.adid == null ? JSONObject.NULL : sessionFailure.adid); - jsonSessionFailure.put("timestamp", sessionFailure.timestamp == null ? JSONObject.NULL : sessionFailure.timestamp); - jsonSessionFailure.put("willRetry", sessionFailure.willRetry ? String.valueOf(true) : String.valueOf(false)); - jsonSessionFailure.put("jsonResponse", sessionFailure.jsonResponse == null ? JSONObject.NULL : sessionFailure.jsonResponse); - - execNativeCallback(webView, commandName, jsonSessionFailure.toString()); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); + JSONObject jsonSessionFailure = new JSONObject(); + try { + jsonSessionFailure.put("message", sessionFailure.message == null ? JSONObject.NULL : sessionFailure.message); + jsonSessionFailure.put("adid", sessionFailure.adid == null ? JSONObject.NULL : sessionFailure.adid); + jsonSessionFailure.put("timestamp", sessionFailure.timestamp == null ? JSONObject.NULL : sessionFailure.timestamp); + jsonSessionFailure.put("willRetry", sessionFailure.willRetry ? String.valueOf(true) : String.valueOf(false)); + jsonSessionFailure.put("jsonResponse", sessionFailure.jsonResponse == null ? JSONObject.NULL : sessionFailure.jsonResponse); + execNativeCallback(webView, commandName, jsonSessionFailure.toString()); + } catch (Exception e) { + e.printStackTrace(); + } } public static void execEventSuccessCallbackCommand(final WebView webView, final String commandName, final AdjustEventSuccess eventSuccess) { @@ -217,25 +187,18 @@ public static void execEventSuccessCallbackCommand(final WebView webView, final if (eventSuccess == null) { return; } - - webView.post(new Runnable() { - @Override - public void run() { - JSONObject jsonEventSuccess = new JSONObject(); - try { - jsonEventSuccess.put("eventToken", eventSuccess.eventToken == null ? JSONObject.NULL : eventSuccess.eventToken); - jsonEventSuccess.put("message", eventSuccess.message == null ? JSONObject.NULL : eventSuccess.message); - jsonEventSuccess.put("adid", eventSuccess.adid == null ? JSONObject.NULL : eventSuccess.adid); - jsonEventSuccess.put("timestamp", eventSuccess.timestamp == null ? JSONObject.NULL : eventSuccess.timestamp); - jsonEventSuccess.put("callbackId", eventSuccess.callbackId == null ? JSONObject.NULL : eventSuccess.callbackId); - jsonEventSuccess.put("jsonResponse", eventSuccess.jsonResponse == null ? JSONObject.NULL : eventSuccess.jsonResponse); - - execNativeCallback(webView, commandName, jsonEventSuccess.toString()); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); + JSONObject jsonEventSuccess = new JSONObject(); + try { + jsonEventSuccess.put("eventToken", eventSuccess.eventToken == null ? JSONObject.NULL : eventSuccess.eventToken); + jsonEventSuccess.put("message", eventSuccess.message == null ? JSONObject.NULL : eventSuccess.message); + jsonEventSuccess.put("adid", eventSuccess.adid == null ? JSONObject.NULL : eventSuccess.adid); + jsonEventSuccess.put("timestamp", eventSuccess.timestamp == null ? JSONObject.NULL : eventSuccess.timestamp); + jsonEventSuccess.put("callbackId", eventSuccess.callbackId == null ? JSONObject.NULL : eventSuccess.callbackId); + jsonEventSuccess.put("jsonResponse", eventSuccess.jsonResponse == null ? JSONObject.NULL : eventSuccess.jsonResponse); + execNativeCallback(webView, commandName, jsonEventSuccess.toString()); + } catch (Exception e) { + e.printStackTrace(); + } } public static void execEventFailureCallbackCommand(final WebView webView, final String commandName, final AdjustEventFailure eventFailure) { @@ -245,26 +208,19 @@ public static void execEventFailureCallbackCommand(final WebView webView, final if (eventFailure == null) { return; } - - webView.post(new Runnable() { - @Override - public void run() { - JSONObject jsonEventFailure = new JSONObject(); - try { - jsonEventFailure.put("eventToken", eventFailure.eventToken == null ? JSONObject.NULL : eventFailure.eventToken); - jsonEventFailure.put("message", eventFailure.message == null ? JSONObject.NULL : eventFailure.message); - jsonEventFailure.put("adid", eventFailure.adid == null ? JSONObject.NULL : eventFailure.adid); - jsonEventFailure.put("timestamp", eventFailure.timestamp == null ? JSONObject.NULL : eventFailure.timestamp); - jsonEventFailure.put("willRetry", eventFailure.willRetry ? String.valueOf(true) : String.valueOf(false)); - jsonEventFailure.put("callbackId", eventFailure.callbackId == null ? JSONObject.NULL : eventFailure.callbackId); - jsonEventFailure.put("jsonResponse", eventFailure.jsonResponse == null ? JSONObject.NULL : eventFailure.jsonResponse); - - execNativeCallback(webView, commandName, jsonEventFailure.toString()); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); + JSONObject jsonEventFailure = new JSONObject(); + try { + jsonEventFailure.put("eventToken", eventFailure.eventToken == null ? JSONObject.NULL : eventFailure.eventToken); + jsonEventFailure.put("message", eventFailure.message == null ? JSONObject.NULL : eventFailure.message); + jsonEventFailure.put("adid", eventFailure.adid == null ? JSONObject.NULL : eventFailure.adid); + jsonEventFailure.put("timestamp", eventFailure.timestamp == null ? JSONObject.NULL : eventFailure.timestamp); + jsonEventFailure.put("willRetry", eventFailure.willRetry ? String.valueOf(true) : String.valueOf(false)); + jsonEventFailure.put("callbackId", eventFailure.callbackId == null ? JSONObject.NULL : eventFailure.callbackId); + jsonEventFailure.put("jsonResponse", eventFailure.jsonResponse == null ? JSONObject.NULL : eventFailure.jsonResponse); + execNativeCallback(webView, commandName, jsonEventFailure.toString()); + } catch (Exception e) { + e.printStackTrace(); + } } public static void execSingleValueCallback(final WebView webView, final String commandName, final String value) { @@ -286,6 +242,24 @@ public static ILogger getLogger() { return AdjustFactory.getLogger(); } + public static void sendBridgeTokenToWebView(final WebView webView, final String token) { + if (webView == null) { + return; + } + if (token == null) { + return; + } + + webView.post(new Runnable() { + @Override + public void run() { + String command = "if (window.Adjust && typeof " + SET_BRIDGE_TOKEN_CALLBACK_NAME + " === 'function') { " + + SET_BRIDGE_TOKEN_CALLBACK_NAME + "(" + JSONObject.quote(token) + "); }"; + webView.evaluateJavascript(command, null); + } + }); + } + private static void execNativeCallback(final WebView webView, final String commandName, final String payload) { if (webView == null) { return; From 20af4fcfc9fbe7d34f57469ae3e169aeed0e0b38 Mon Sep 17 00:00:00 2001 From: nonelse Date: Mon, 2 Mar 2026 11:47:55 +0100 Subject: [PATCH 475/540] refac(webbridge): replace AdjustBridge.initSdk with _callBridge method for SDK initialization --- .../sdk-plugin-webbridge/src/main/assets/adjust.js | 4 +--- .../com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 8 ++++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index b8c49a9f8..7ada7d829 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -154,9 +154,7 @@ var Adjust = { } this.adjustConfig = adjustConfig; this._registerConfigCallbacks(adjustConfig); - if (AdjustBridge) { - AdjustBridge.initSdk(JSON.stringify(adjustConfig)); - } + this._callBridge('initSdk', [JSON.stringify(adjustConfig)]); }, getConfig: function () { diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index bdf1e220e..d9723ae0b 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -131,6 +131,14 @@ public void registerFacebookSDKJSInterface() { @JavascriptInterface public void initSdk(String adjustConfigString) { + initSdk(adjustConfigString, null); + } + + @JavascriptInterface + public void initSdk(String adjustConfigString, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } // Initialise SDK only if it's not already initialised. if (isInitialized) { AdjustBridgeUtil.getLogger().warn("Adjust bridge is already initialized. Ignoring further attempts"); From 911e6531f8b3c8ef98a046f3b9e3330ff4d70918 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 4 Mar 2026 10:01:07 +0100 Subject: [PATCH 476/540] feat: update version number to 5.5.1 --- Adjust/build.gradle | 2 +- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-imei/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-oaid/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 2 +- .../plugins/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java | 2 +- .../adjust/sdk/ObjectInputFilterStreamPersistedTest.java | 6 +++--- VERSION | 2 +- 15 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 3e2ce2b87..5d468f931 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 36 coreTargetSdkVersion = 36 - coreVersionName = '5.5.0' + coreVersionName = '5.5.1' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index bcd827071..f5f986ae7 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.5.0' + // implementation 'com.adjust.sdk:adjust-android:5.5.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index 21ef749e8..ea926dad6 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.5.0' + // implementation 'com.adjust.sdk:adjust-android:5.5.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index 3d9c18c8b..9a10fc03c 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.5.0' + // implementation 'com.adjust.sdk:adjust-android:5.5.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index 1da522ce8..644815009 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.5.0' + // implementation 'com.adjust.sdk:adjust-android:5.5.1' implementation 'com.huawei.hms:ads-identifier:3.4.56.300' } diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index 9af3bfc65..6f6f9c7a1 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.5.0' + // implementation 'com.adjust.sdk:adjust-android:5.5.1' // Add Samsung clouddev lib. compileOnly fileTree(include: ['*.aar'], dir: 'libs') diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index a66f841fc..8ff56217c 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.5.0' + // implementation 'com.adjust.sdk:adjust-android:5.5.1' // Add Samsung referrer lib via Maven. implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:3.0.1' diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index 3074c9ddf..c4b368095 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.5.0' + // implementation 'com.adjust.sdk:adjust-android:5.5.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index ff7422738..bfd00b77e 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.5.0' + // implementation 'com.adjust.sdk:adjust-android:5.5.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 7ada7d829..2e034ce65 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -357,7 +357,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge5.5.0'; + return 'web-bridge5.5.1'; } }, diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index b240e6eba..bb0ea68d7 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -31,7 +31,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.5.0' + // implementation 'com.adjust.sdk:adjust-android:5.5.1' // Add xiaomi referrer lib via Maven. implementation 'com.miui.referrer:homereferrer:1.0.0.6' diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 0f163966e..54128fc88 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -32,7 +32,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.5.0"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.5.1"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index a188b59c9..6c3b3513c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -38,7 +38,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android5.5.0"; + String CLIENT_SDK = "android5.5.1"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/Adjust/sdk-core/src/test/java/com/adjust/sdk/ObjectInputFilterStreamPersistedTest.java b/Adjust/sdk-core/src/test/java/com/adjust/sdk/ObjectInputFilterStreamPersistedTest.java index c266e5697..e1896afda 100644 --- a/Adjust/sdk-core/src/test/java/com/adjust/sdk/ObjectInputFilterStreamPersistedTest.java +++ b/Adjust/sdk-core/src/test/java/com/adjust/sdk/ObjectInputFilterStreamPersistedTest.java @@ -161,7 +161,7 @@ public void roundTrip_eventMetadata() throws Exception { public void roundTrip_activityPackage() throws Exception { ActivityPackage original = new ActivityPackage(ActivityKind.EVENT); original.setPath("/event"); - original.setClientSdk("android5.5.0"); + original.setClientSdk("android5.5.1"); Map parameters = new LinkedHashMap<>(); parameters.put("k1", "v1"); parameters.put("k2", "v2"); @@ -197,7 +197,7 @@ public void roundTrip_activityPackage() throws Exception { public void roundTrip_packageQueue() throws Exception { ActivityPackage first = new ActivityPackage(ActivityKind.SESSION); first.setPath("/session"); - first.setClientSdk("android5.5.0"); + first.setClientSdk("android5.5.1"); Map firstParams = new LinkedHashMap<>(); firstParams.put("k1", "v1"); firstParams.put("k2", "v2"); @@ -215,7 +215,7 @@ public void roundTrip_packageQueue() throws Exception { ActivityPackage second = new ActivityPackage(ActivityKind.EVENT); second.setPath("/event"); - second.setClientSdk("android5.5.0"); + second.setClientSdk("android5.5.1"); Map secondParams = new LinkedHashMap<>(); secondParams.put("k2", "v2"); secondParams.put("k3", "v3"); diff --git a/VERSION b/VERSION index d50359de1..7acd1cb0e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.5.0 +5.5.1 From 0c2474aacd23829abec9e898b8b7dfa2c76f0152 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 4 Mar 2026 11:58:03 +0100 Subject: [PATCH 477/540] docs: update CHANGELOG --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 29681721e..df176f279 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +### Version 5.5.1 (4th March 2026) +#### Fixed +- Improved WebBridge input validation to address a potential UXSS risk. +- Hardened object deserialization handling for improved security. + +--- + ### Version 5.5.0 (5th December 2025) #### Added - Added `getAdidWithTimeout` method to the `Adjust` API to allow retrieving the ADID with a specified timeout. If the value is not obtained in time, null is returned. From 1a80541fff656870ef5c4d9f7c29cd43a5df2501 Mon Sep 17 00:00:00 2001 From: Shashank Suhane <46443728+shashanksu@users.noreply.github.com> Date: Wed, 4 Mar 2026 13:24:39 +0100 Subject: [PATCH 478/540] Update CHANGELOG.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Uglješa Erceg --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index df176f279..16fbf54ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ### Version 5.5.1 (4th March 2026) #### Fixed -- Improved WebBridge input validation to address a potential UXSS risk. +- Improved web bridge input validation to address a potential UXSS risk. - Hardened object deserialization handling for improved security. --- From 3fd5fe07af0864342c26a896609e7ea427075d94 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 13 Jan 2026 14:55:25 +0100 Subject: [PATCH 479/540] feat: initial implementation of remote triggers feature --- .../java/com/adjust/sdk/ActivityHandler.java | 74 +++++++++++++++++++ .../java/com/adjust/sdk/AdjustConfig.java | 9 +++ .../com/adjust/sdk/AdjustRemoteTrigger.java | 32 ++++++++ .../java/com/adjust/sdk/IActivityHandler.java | 2 + .../adjust/sdk/OnRemoteTriggerListener.java | 5 ++ 5 files changed, 122 insertions(+) create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustRemoteTrigger.java create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/OnRemoteTriggerListener.java diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 18d795380..d8889f604 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -45,6 +45,7 @@ import com.adjust.sdk.scheduler.TimerCycle; import com.adjust.sdk.scheduler.TimerOnce; +import org.json.JSONArray; import org.json.JSONObject; import java.io.InputStream; @@ -389,6 +390,9 @@ public void trackEvent(final AdjustEvent event) { @Override public void finishedTrackingActivity(ResponseData responseData) { + // process remote triggers from any response + processRemoteTriggers(responseData); + // redirect session responses to attribution handler to check for attribution information if (responseData instanceof SessionResponseData) { logger.debug("Finished tracking session"); @@ -706,6 +710,16 @@ public void run() { }); } + @Override + public void processRemoteTriggers(ResponseData responseData) { + executor.submit(new Runnable() { + @Override + public void run() { + processRemoteTriggersI(responseData); + } + }); + } + @Override public void addGlobalCallbackParameter(final String key, final String value) { executor.submit(() -> firstSessionDelayManager.preLaunchActionI( @@ -2122,6 +2136,66 @@ public void run() { } } + private void processRemoteTriggersI(ResponseData responseData) { + if (!isEnabledI()) { + return; + } + + // process remote triggers independently from other response processing + if (responseData.jsonResponse == null) { + return; + } + + JSONArray remoteTriggers = responseData.jsonResponse.optJSONArray("remote_triggers"); + + if (remoteTriggers == null) { + return; + } + + if (remoteTriggers.length() == 0) { + return; + } + + if (adjustConfig.onRemoteTriggerListener == null) { + return; + } + + // process each remote trigger in order + for (int i = 0; i < remoteTriggers.length(); i++) { + JSONObject remoteTrigger = remoteTriggers.optJSONObject(i); + if (remoteTrigger == null) { + logger.warn("Invalid remote trigger item, skipping"); + continue; + } + + String label = remoteTrigger.optString("label"); + if (label.isEmpty()) { + logger.warn("Remote trigger missing or invalid label, skipping"); + continue; + } + + JSONObject payload = remoteTrigger.optJSONObject("payload"); + if (payload == null) { + logger.warn("Remote trigger missing or invalid payload, skipping"); + continue; + } + + final AdjustRemoteTrigger adjustRemoteTrigger = new AdjustRemoteTrigger(label, payload); + Handler handler = new Handler(adjustConfig.context.getMainLooper()); + Runnable runnable = new Runnable() { + @Override + public void run() { + if (adjustConfig.onRemoteTriggerListener != null) { + adjustConfig.onRemoteTriggerListener.onRemoteTrigger(adjustRemoteTrigger); + } + } + }; + handler.post(runnable); + } + } + + + private void prepareDeeplinkI(final Uri deeplink, final Handler handler) { if (deeplink == null) { return; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 3858ce77f..192db2232 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -25,6 +25,7 @@ public class AdjustConfig { OnSessionTrackingSucceededListener onSessionTrackingSucceededListener; OnSessionTrackingFailedListener onSessionTrackingFailedListener; OnDeferredDeeplinkResponseListener onDeferredDeeplinkResponseListener; + OnRemoteTriggerListener onRemoteTriggerListener; boolean isSendingInBackgroundEnabled; AdjustInstance.PreLaunchActions preLaunchActions; ILogger logger; @@ -194,6 +195,10 @@ public void setOnDeferredDeeplinkResponseListener(OnDeferredDeeplinkResponseList this.onDeferredDeeplinkResponseListener = onDeferredDeeplinkResponseListener; } + public void setOnRemoteTriggerListener(OnRemoteTriggerListener onRemoteTriggerListener) { + this.onRemoteTriggerListener = onRemoteTriggerListener; + } + public void disableAppSetIdReading() { this.isAppSetIdReadingEnabled = false; } @@ -294,6 +299,10 @@ public OnDeferredDeeplinkResponseListener getOnDeeplinkResponseListener() { return onDeferredDeeplinkResponseListener; } + public OnRemoteTriggerListener getOnRemoteTriggerListener() { + return onRemoteTriggerListener; + } + public ILogger getLogger() { return logger; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustRemoteTrigger.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustRemoteTrigger.java new file mode 100644 index 000000000..2e6112bdc --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustRemoteTrigger.java @@ -0,0 +1,32 @@ +package com.adjust.sdk; + +import androidx.annotation.NonNull; + +import org.json.JSONObject; + +public class AdjustRemoteTrigger { + private final String label; + private final JSONObject payload; + + public AdjustRemoteTrigger(String label, JSONObject payload) { + this.label = label; + this.payload = payload; + } + + public String getLabel() { + return label; + } + + public JSONObject getPayload() { + return payload; + } + + @NonNull + @Override + public String toString() { + return "AdjustRemoteTrigger{" + + "label='" + label + '\'' + + ", payload=" + payload + + '}'; + } +} diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 7e37483b0..67b92d011 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -25,6 +25,8 @@ public interface IActivityHandler { void processAndResolveDeeplink(AdjustDeeplink deeplink, long clickTime, OnDeeplinkResolvedListener callback); + void processRemoteTriggers(ResponseData responseData); + boolean updateAttributionI(AdjustAttribution attribution); void launchEventResponseTasks(EventResponseData eventResponseData); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnRemoteTriggerListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnRemoteTriggerListener.java new file mode 100644 index 000000000..9f59e7d8c --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnRemoteTriggerListener.java @@ -0,0 +1,5 @@ +package com.adjust.sdk; + +public interface OnRemoteTriggerListener { + void onRemoteTrigger(AdjustRemoteTrigger trigger); +} From 6854c1a7746fbef23ba7d96398a0a98cc2d3920e Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 14 Jan 2026 11:22:40 +0100 Subject: [PATCH 480/540] feat: add remote trigger support in webbridge --- .../src/main/assets/adjust_config.js | 17 ++++++++++++ .../sdk/webbridge/AdjustBridgeInstance.java | 14 ++++++++++ .../sdk/webbridge/AdjustBridgeUtil.java | 26 +++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js index 4550816cd..4d2901c54 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -39,6 +39,8 @@ function AdjustConfig(appToken, environment, legacy) { this.isOpeningDeferredDeeplinkEnabled = null; this.deferredDeeplinkCallbackName = null; this.deferredDeeplinkCallbackFunction = null; + this.remoteTriggerCallbackName = null; + this.remoteTriggerCallbackFunction = null; this.fbPixelDefaultEventToken = null; this.fbPixelMapping = []; this.urlStrategyDomains = []; @@ -197,6 +199,21 @@ AdjustConfig.prototype.adjust_deferredDeeplinkCallback = function(deeplink) { } }; +AdjustConfig.prototype.setRemoteTriggerCallback = function(callback) { + if (typeof callback === 'string' || callback instanceof String) { + this.remoteTriggerCallbackName = callback; + } else { + this.remoteTriggerCallbackName = 'Adjust.getConfig().adjust_remoteTriggerCallback'; + this.remoteTriggerCallbackFunction = callback; + } +}; + +AdjustConfig.prototype.adjust_remoteTriggerCallback = function(remoteTrigger) { + if (this.remoteTriggerCallbackFunction) { + this.remoteTriggerCallbackFunction(remoteTrigger); + } +}; + AdjustConfig.prototype.setReadMobileEquipmentIdentity = function(readMobileEquipmentIdentity) {}; AdjustConfig.prototype.setFbPixelDefaultEventToken = function(fbPixelDefaultEventToken) { diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index d9723ae0b..01a42b36c 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -14,6 +14,7 @@ import com.adjust.sdk.AdjustEventFailure; import com.adjust.sdk.AdjustEventSuccess; import com.adjust.sdk.AdjustFactory; +import com.adjust.sdk.AdjustRemoteTrigger; import com.adjust.sdk.AdjustSessionFailure; import com.adjust.sdk.AdjustSessionSuccess; import com.adjust.sdk.AdjustStoreInfo; @@ -27,6 +28,7 @@ import com.adjust.sdk.OnEventTrackingFailedListener; import com.adjust.sdk.OnEventTrackingSucceededListener; import com.adjust.sdk.OnGoogleAdIdReadListener; +import com.adjust.sdk.OnRemoteTriggerListener; import com.adjust.sdk.OnSdkVersionReadListener; import com.adjust.sdk.OnIsEnabledListener; import com.adjust.sdk.OnSessionTrackingFailedListener; @@ -169,6 +171,7 @@ public void initSdk(String adjustConfigString, String bridgeToken) { Object sessionFailureCallbackNameField = jsonAdjustConfig.get("sessionFailureCallbackName"); Object isOpeningDeferredDeeplinkEnabledField = jsonAdjustConfig.get("isOpeningDeferredDeeplinkEnabled"); Object deferredDeeplinkCallbackNameField = jsonAdjustConfig.get("deferredDeeplinkCallbackName"); + Object remoteTriggerCallbackNameField = jsonAdjustConfig.get("remoteTriggerCallbackName"); Object fbPixelDefaultEventTokenField = jsonAdjustConfig.get("fbPixelDefaultEventToken"); Object fbPixelMappingField = jsonAdjustConfig.get("fbPixelMapping"); Object urlStrategyDomainsField = jsonAdjustConfig.get("urlStrategyDomains"); @@ -332,6 +335,17 @@ public boolean launchReceivedDeeplink(Uri deeplink) { }); } + // Remote trigger callback + final String remoteTriggerCallbackName = AdjustBridgeUtil.fieldToString(remoteTriggerCallbackNameField); + if (remoteTriggerCallbackName != null) { + adjustConfig.setOnRemoteTriggerListener(new OnRemoteTriggerListener() { + @Override + public void onRemoteTrigger(AdjustRemoteTrigger remoteTrigger) { + AdjustBridgeUtil.execRemoteTriggerCallbackCommand(webView, remoteTriggerCallbackName, remoteTrigger); + } + }); + } + // Check Pixel Default Event Token String fbPixelDefaultEventToken = AdjustBridgeUtil.fieldToString(fbPixelDefaultEventTokenField); if (fbPixelDefaultEventToken != null && this.facebookSDKJSInterface != null) { diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java index 5d8334284..387d49c15 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java @@ -7,6 +7,7 @@ import com.adjust.sdk.AdjustEventFailure; import com.adjust.sdk.AdjustEventSuccess; import com.adjust.sdk.AdjustFactory; +import com.adjust.sdk.AdjustRemoteTrigger; import com.adjust.sdk.AdjustSessionFailure; import com.adjust.sdk.AdjustSessionSuccess; import com.adjust.sdk.ILogger; @@ -223,6 +224,31 @@ public static void execEventFailureCallbackCommand(final WebView webView, final } } + public static void execRemoteTriggerCallbackCommand(final WebView webView, final String commandName, final AdjustRemoteTrigger remoteTrigger) { + if (webView == null) { + return; + } + if (remoteTrigger == null) { + return; + } + + webView.post(new Runnable() { + @Override + public void run() { + JSONObject jsonRemoteTrigger = new JSONObject(); + try { + jsonRemoteTrigger.put("label", remoteTrigger.getLabel() == null ? JSONObject.NULL : remoteTrigger.getLabel()); + jsonRemoteTrigger.put("payload", remoteTrigger.getPayload() == null ? JSONObject.NULL : remoteTrigger.getPayload()); + + String command = "javascript:" + commandName + "(" + jsonRemoteTrigger.toString() + ");"; + webView.loadUrl(command); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + public static void execSingleValueCallback(final WebView webView, final String commandName, final String value) { execNativeCallback(webView, commandName, value == null ? "null" : JSONObject.quote(value)); } From acee30fd1b61fca4794cd9c5298fb6e727a45100 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 14 Jan 2026 14:02:47 +0100 Subject: [PATCH 481/540] test: add ability to test remote triggers --- .../adjust/testapp/AdjustCommandExecutor.java | 24 +++++++++++++++++++ .../src/main/assets/command_executor.js | 10 ++++++++ 2 files changed, 34 insertions(+) diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 11c723a26..acccab8d3 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -21,6 +21,7 @@ import com.adjust.sdk.AdjustPlayStoreSubscription; import com.adjust.sdk.AdjustPlayStorePurchase; import com.adjust.sdk.AdjustPurchaseVerificationResult; +import com.adjust.sdk.AdjustRemoteTrigger; import com.adjust.sdk.AdjustSessionFailure; import com.adjust.sdk.AdjustSessionSuccess; import com.adjust.sdk.AdjustStoreInfo; @@ -35,6 +36,7 @@ import com.adjust.sdk.OnEventTrackingSucceededListener; import com.adjust.sdk.OnLastDeeplinkReadListener; import com.adjust.sdk.OnPurchaseVerificationFinishedListener; +import com.adjust.sdk.OnRemoteTriggerListener; import com.adjust.sdk.OnSessionTrackingFailedListener; import com.adjust.sdk.OnSessionTrackingSucceededListener; import com.adjust.test_options.TestConnectionOptions; @@ -488,6 +490,28 @@ public boolean launchReceivedDeeplink(Uri deeplink) { }); } + if (command.containsParameter("remoteTriggerCallback")) { + Log.d("TestApp", "remoteTriggerCallback detected"); + final String localBasePath = basePath; + adjustConfig.setOnRemoteTriggerListener(new OnRemoteTriggerListener() { + @Override + public void onRemoteTrigger(AdjustRemoteTrigger trigger) { + Log.d("TestApp", "Remote trigger callback called!"); + Log.d("TestApp", String.format("onRemoteTrigger label: %s, payload: %s", trigger.getLabel(), trigger.getPayload())); + MainActivity.testLibrary.addInfoToSend("label", trigger.getLabel()); + + if (trigger.getPayload() != null) { + MainActivity.testLibrary.addInfoToSend("payload", trigger.getPayload().toString()); + } else { + Log.d("TestApp", "Remote trigger payload is null"); + MainActivity.testLibrary.addInfoToSend("payload", "null"); + } + + MainActivity.testLibrary.sendInfoToServer(localBasePath); + } + }); + } + if (command.containsParameter("firstSessionDelayEnabled")) { String firstSessionDelayEnabledS = command.getFirstParameterValue("firstSessionDelayEnabled"); boolean firstSessionDelayEnabled = "true".equals(firstSessionDelayEnabledS); diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index e0d80374c..87a5be0c2 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -448,6 +448,16 @@ AdjustCommandExecutor.prototype.config = function(params) { TestLibrary.sendInfoToServer(basePath); }); } + + if ('remoteTriggerCallback' in params) { + var basePath = this.basePath; + adjustConfig.setRemoteTriggerCallback(function(remoteTrigger) { + TestLibrary.addInfoToSend("label", remoteTrigger.label); + TestLibrary.addInfoToSend("payload", JSON.stringify(remoteTrigger.payload)); + + TestLibrary.sendInfoToServer(basePath); + }); + } }; AdjustCommandExecutor.prototype.start = function(params) { From 1c55531e09c5e0f56297306f0db2792085d55df6 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 27 Mar 2026 09:31:41 +0100 Subject: [PATCH 482/540] feat: process remote triggers in attribution responses --- .../sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index d8889f604..f7b996ba9 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -2064,6 +2064,9 @@ public void run() { } private void launchAttributionResponseTasksI(AttributionResponseData attributionResponseData) { + // process remote triggers from any response + processRemoteTriggersI(attributionResponseData); + // try to update adid from response updateAdidI(attributionResponseData.adid); From 29b8fb4aa6e37ff0f45caf8fdbe6554188814c87 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 27 Mar 2026 09:33:24 +0100 Subject: [PATCH 483/540] feat: add feature flag indicating the implementation of remote triggers callback --- .../sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 6a8fd5d86..da3c55442 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -1265,6 +1265,10 @@ private void injectFeatureFlagsWithParameters(Map parameters) { if (!adjustConfig.isAppSetIdReadingEnabled) { PackageBuilder.addBoolean(parameters, "ff_app_set_id_disabled", true); } + + if (adjustConfig.onRemoteTriggerListener != null) { + PackageBuilder.addBoolean(parameters, "ff_remote_triggers_callback", true); + } } private void injectStoreInfoToParameters(Map parameters) { From 0d182e798e200f215946371eeee1fe513d47abb5 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 27 Mar 2026 10:19:05 +0100 Subject: [PATCH 484/540] feat: update webbridge to register remote trigger callback --- .../src/main/assets/adjust.js | 2 ++ .../sdk/webbridge/AdjustBridgeUtil.java | 24 +++++++------------ 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 2e034ce65..fc90a4190 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -48,6 +48,7 @@ var Adjust = { registerIfPresent(adjustConfig.sessionSuccessCallbackName, adjustConfig.sessionSuccessCallbackFunction); registerIfPresent(adjustConfig.sessionFailureCallbackName, adjustConfig.sessionFailureCallbackFunction); registerIfPresent(adjustConfig.deferredDeeplinkCallbackName, adjustConfig.deferredDeeplinkCallbackFunction); + registerIfPresent(adjustConfig.remoteTriggerCallbackName, adjustConfig.remoteTriggerCallbackFunction); var registerInternal = function(callbackName, callbackFn) { if (!callbackName || typeof callbackFn !== 'function') { @@ -65,6 +66,7 @@ var Adjust = { registerInternal(adjustConfig.sessionSuccessCallbackName, adjustConfig.adjust_sessionSuccessCallback); registerInternal(adjustConfig.sessionFailureCallbackName, adjustConfig.adjust_sessionFailureCallback); registerInternal(adjustConfig.deferredDeeplinkCallbackName, adjustConfig.adjust_deferredDeeplinkCallback); + registerInternal(adjustConfig.remoteTriggerCallbackName, adjustConfig.adjust_remoteTriggerCallback); }, _resolveCallbackByPath: function(path) { diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java index 387d49c15..860243209 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java @@ -232,21 +232,15 @@ public static void execRemoteTriggerCallbackCommand(final WebView webView, final return; } - webView.post(new Runnable() { - @Override - public void run() { - JSONObject jsonRemoteTrigger = new JSONObject(); - try { - jsonRemoteTrigger.put("label", remoteTrigger.getLabel() == null ? JSONObject.NULL : remoteTrigger.getLabel()); - jsonRemoteTrigger.put("payload", remoteTrigger.getPayload() == null ? JSONObject.NULL : remoteTrigger.getPayload()); - - String command = "javascript:" + commandName + "(" + jsonRemoteTrigger.toString() + ");"; - webView.loadUrl(command); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); + JSONObject jsonRemoteTrigger = new JSONObject(); + try { + jsonRemoteTrigger.put("label", remoteTrigger.getLabel() == null ? JSONObject.NULL : remoteTrigger.getLabel()); + jsonRemoteTrigger.put("payload", remoteTrigger.getPayload() == null ? JSONObject.NULL : remoteTrigger.getPayload()); + + execNativeCallback(webView, commandName, jsonRemoteTrigger.toString()); + } catch (Exception e) { + e.printStackTrace(); + } } public static void execSingleValueCallback(final WebView webView, final String commandName, final String value) { From 5cf5de344f7172242f605c3f8ba45d35785936f1 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 30 Mar 2026 14:55:39 +0200 Subject: [PATCH 485/540] feat: remove isEnabled check for remote trigger callback --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index f7b996ba9..6ec436668 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -2140,10 +2140,6 @@ public void run() { } private void processRemoteTriggersI(ResponseData responseData) { - if (!isEnabledI()) { - return; - } - // process remote triggers independently from other response processing if (responseData.jsonResponse == null) { return; From 089c9b59c007c1cf58f441c05f6b7a8cba8fc5da Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 30 Mar 2026 15:28:53 +0200 Subject: [PATCH 486/540] feat: update version number to 5.6.0 --- Adjust/build.gradle | 2 +- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-imei/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-oaid/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java | 2 +- VERSION | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 5d468f931..5525c6597 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 36 coreTargetSdkVersion = 36 - coreVersionName = '5.5.1' + coreVersionName = '5.6.0' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index f5f986ae7..f0acd9aa7 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.5.1' + // implementation 'com.adjust.sdk:adjust-android:5.6.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index ea926dad6..650378383 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.5.1' + // implementation 'com.adjust.sdk:adjust-android:5.6.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index 9a10fc03c..0cba2340f 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.5.1' + // implementation 'com.adjust.sdk:adjust-android:5.6.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index 644815009..c4d7c4927 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.5.1' + // implementation 'com.adjust.sdk:adjust-android:5.6.0' implementation 'com.huawei.hms:ads-identifier:3.4.56.300' } diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index 6f6f9c7a1..92cefe837 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.5.1' + // implementation 'com.adjust.sdk:adjust-android:5.6.0' // Add Samsung clouddev lib. compileOnly fileTree(include: ['*.aar'], dir: 'libs') diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index 8ff56217c..43ad0536f 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.5.1' + // implementation 'com.adjust.sdk:adjust-android:5.6.0' // Add Samsung referrer lib via Maven. implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:3.0.1' diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index c4b368095..134c3b523 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.5.1' + // implementation 'com.adjust.sdk:adjust-android:5.6.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index bfd00b77e..9905ea75f 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.5.1' + // implementation 'com.adjust.sdk:adjust-android:5.6.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index fc90a4190..e8b61ca44 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -359,7 +359,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge5.5.1'; + return 'web-bridge5.6.0'; } }, diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index bb0ea68d7..262ec3455 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -31,7 +31,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.5.1' + // implementation 'com.adjust.sdk:adjust-android:5.6.0' // Add xiaomi referrer lib via Maven. implementation 'com.miui.referrer:homereferrer:1.0.0.6' diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 54128fc88..bd2fe46b5 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -32,7 +32,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.5.1"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.6.0"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 6c3b3513c..c5b422e48 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -38,7 +38,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android5.5.1"; + String CLIENT_SDK = "android5.6.0"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/VERSION b/VERSION index 7acd1cb0e..1bc788d3b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.5.1 +5.6.0 From a287b6faed66546ebb5a9a0c3fa480040f92c361 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 30 Mar 2026 15:30:29 +0200 Subject: [PATCH 487/540] docs: update CHANGELOG --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16fbf54ac..4bb5b455c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### Version 5.6.0 (30th March 2026) +#### Added +- Added `setOnRemoteTriggerListener` method to `AdjustConfig` to allow receiving remote trigger updates sent by Adjust backend. + +--- + ### Version 5.5.1 (4th March 2026) #### Fixed - Improved web bridge input validation to address a potential UXSS risk. From ae3f726564f2037bf464a1b2697404af5314267c Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 16 Apr 2026 13:07:24 +0200 Subject: [PATCH 488/540] feat: update Sig Lib version --- Adjust/examples/example-app-fbpixel/build.gradle | 2 +- Adjust/examples/example-app-java/build.gradle | 2 +- Adjust/examples/example-app-keyboard/build.gradle | 2 +- Adjust/examples/example-app-kotlin/build.gradle | 2 +- Adjust/examples/example-app-tv/build.gradle | 2 +- Adjust/examples/example-app-webbridge/build.gradle | 2 +- Adjust/sdk-core/build.gradle | 2 +- Adjust/tests/test-app-core/build.gradle | 2 +- Adjust/tests/test-app-webbridge/build.gradle | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Adjust/examples/example-app-fbpixel/build.gradle b/Adjust/examples/example-app-fbpixel/build.gradle index 544d46250..f00648460 100644 --- a/Adjust/examples/example-app-fbpixel/build.gradle +++ b/Adjust/examples/example-app-fbpixel/build.gradle @@ -35,5 +35,5 @@ dependencies { implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') - implementation 'com.adjust.signature:adjust-android-signature:3.62.0' + implementation 'com.adjust.signature:adjust-android-signature:3.67.0' } diff --git a/Adjust/examples/example-app-java/build.gradle b/Adjust/examples/example-app-java/build.gradle index faa74fd33..a8e9acd93 100644 --- a/Adjust/examples/example-app-java/build.gradle +++ b/Adjust/examples/example-app-java/build.gradle @@ -38,5 +38,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3.62.0' + implementation 'com.adjust.signature:adjust-android-signature:3.67.0' } diff --git a/Adjust/examples/example-app-keyboard/build.gradle b/Adjust/examples/example-app-keyboard/build.gradle index d1e5d13b6..e7e7d1f5b 100644 --- a/Adjust/examples/example-app-keyboard/build.gradle +++ b/Adjust/examples/example-app-keyboard/build.gradle @@ -38,5 +38,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3.62.0' + implementation 'com.adjust.signature:adjust-android-signature:3.67.0' } diff --git a/Adjust/examples/example-app-kotlin/build.gradle b/Adjust/examples/example-app-kotlin/build.gradle index edeed92c0..ed9d4886f 100644 --- a/Adjust/examples/example-app-kotlin/build.gradle +++ b/Adjust/examples/example-app-kotlin/build.gradle @@ -41,5 +41,5 @@ dependencies { implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3.62.0' + implementation 'com.adjust.signature:adjust-android-signature:3.67.0' } diff --git a/Adjust/examples/example-app-tv/build.gradle b/Adjust/examples/example-app-tv/build.gradle index faa74fd33..a8e9acd93 100755 --- a/Adjust/examples/example-app-tv/build.gradle +++ b/Adjust/examples/example-app-tv/build.gradle @@ -38,5 +38,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3.62.0' + implementation 'com.adjust.signature:adjust-android-signature:3.67.0' } diff --git a/Adjust/examples/example-app-webbridge/build.gradle b/Adjust/examples/example-app-webbridge/build.gradle index d3cc31595..12263d75d 100644 --- a/Adjust/examples/example-app-webbridge/build.gradle +++ b/Adjust/examples/example-app-webbridge/build.gradle @@ -33,5 +33,5 @@ dependencies { implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') - implementation 'com.adjust.signature:adjust-android-signature:3.62.0' + implementation 'com.adjust.signature:adjust-android-signature:3.67.0' } diff --git a/Adjust/sdk-core/build.gradle b/Adjust/sdk-core/build.gradle index ca081792e..debb84003 100644 --- a/Adjust/sdk-core/build.gradle +++ b/Adjust/sdk-core/build.gradle @@ -221,7 +221,7 @@ def customizePomForAar(pom) { dependency { groupId 'com.adjust.signature' artifactId 'adjust-android-signature' - version '3.62.0' + version '3.67.0' scope 'compile' } } diff --git a/Adjust/tests/test-app-core/build.gradle b/Adjust/tests/test-app-core/build.gradle index c508abb36..d70842068 100644 --- a/Adjust/tests/test-app-core/build.gradle +++ b/Adjust/tests/test-app-core/build.gradle @@ -30,7 +30,7 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:2.1.1" implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0' implementation 'com.android.installreferrer:installreferrer:2.2' - implementation 'com.adjust.signature:adjust-android-signature:3.62.0' + implementation 'com.adjust.signature:adjust-android-signature:3.67.0' implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') diff --git a/Adjust/tests/test-app-webbridge/build.gradle b/Adjust/tests/test-app-webbridge/build.gradle index 394c27117..d89047c7c 100644 --- a/Adjust/tests/test-app-webbridge/build.gradle +++ b/Adjust/tests/test-app-webbridge/build.gradle @@ -32,7 +32,7 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:2.1.1" implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0' implementation 'com.android.installreferrer:installreferrer:2.2' - implementation 'com.adjust.signature:adjust-android-signature:3.62.0' + implementation 'com.adjust.signature:adjust-android-signature:3.67.0' implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') From a4c5c0b0770994e5eb0b82ac37a4f348e930283a Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 16 Apr 2026 13:10:39 +0200 Subject: [PATCH 489/540] feat: update version number to 5.6.1 --- Adjust/build.gradle | 2 +- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-imei/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-oaid/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java | 2 +- VERSION | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 5525c6597..735e308a1 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 36 coreTargetSdkVersion = 36 - coreVersionName = '5.6.0' + coreVersionName = '5.6.1' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index f0acd9aa7..b8c28fc23 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.6.0' + // implementation 'com.adjust.sdk:adjust-android:5.6.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index 650378383..d133e53db 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.6.0' + // implementation 'com.adjust.sdk:adjust-android:5.6.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index 0cba2340f..212252553 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.6.0' + // implementation 'com.adjust.sdk:adjust-android:5.6.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index c4d7c4927..2f41bd2b3 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.6.0' + // implementation 'com.adjust.sdk:adjust-android:5.6.1' implementation 'com.huawei.hms:ads-identifier:3.4.56.300' } diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index 92cefe837..582c61656 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.6.0' + // implementation 'com.adjust.sdk:adjust-android:5.6.1' // Add Samsung clouddev lib. compileOnly fileTree(include: ['*.aar'], dir: 'libs') diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index 43ad0536f..2f72704fc 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.6.0' + // implementation 'com.adjust.sdk:adjust-android:5.6.1' // Add Samsung referrer lib via Maven. implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:3.0.1' diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index 134c3b523..74fb208da 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.6.0' + // implementation 'com.adjust.sdk:adjust-android:5.6.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index 9905ea75f..28180f363 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.6.0' + // implementation 'com.adjust.sdk:adjust-android:5.6.1' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index e8b61ca44..df482f2ed 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -359,7 +359,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge5.6.0'; + return 'web-bridge5.6.1'; } }, diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index 262ec3455..aa5eb25b9 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -31,7 +31,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.6.0' + // implementation 'com.adjust.sdk:adjust-android:5.6.1' // Add xiaomi referrer lib via Maven. implementation 'com.miui.referrer:homereferrer:1.0.0.6' diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index bd2fe46b5..c114fb058 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -32,7 +32,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.6.0"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.6.1"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index c5b422e48..77b8c5fbd 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -38,7 +38,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android5.6.0"; + String CLIENT_SDK = "android5.6.1"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/VERSION b/VERSION index 1bc788d3b..b7c75422b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.6.0 +5.6.1 From 11b2f23eaba3aa2a14a7d04a6e5ae1af66171946 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 16 Apr 2026 13:23:01 +0200 Subject: [PATCH 490/540] docs: update CHANGELOG --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bb5b455c..81d225cba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### Version 5.6.1 (16th April 2026) +#### Changed +- Updated the Adjust Signature library version to 3.67.0. + +--- + ### Version 5.6.0 (30th March 2026) #### Added - Added `setOnRemoteTriggerListener` method to `AdjustConfig` to allow receiving remote trigger updates sent by Adjust backend. From 7db5e950ea09f9f984be26c4f8039d1ebcc2806d Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 11 May 2026 10:17:47 +0200 Subject: [PATCH 491/540] add third party sharing settings getter --- .../src/main/assets/adjust.js | 8 + .../src/main/assets/adjust_config.js | 5 + .../sdk/webbridge/AdjustBridgeInstance.java | 33 ++++ .../sdk/webbridge/AdjustBridgeUtil.java | 21 ++ .../java/com/adjust/sdk/ActivityHandler.java | 184 ++++++++++++++++++ .../src/main/java/com/adjust/sdk/Adjust.java | 29 ++- .../java/com/adjust/sdk/AdjustConfig.java | 11 ++ .../java/com/adjust/sdk/AdjustInstance.java | 35 ++++ .../sdk/AdjustThirdPartySharingResult.java | 17 ++ .../com/adjust/sdk/AdjustTimeoutCallback.java | 13 ++ .../main/java/com/adjust/sdk/Constants.java | 1 + .../main/java/com/adjust/sdk/DeviceInfo.java | 4 +- .../java/com/adjust/sdk/IActivityHandler.java | 2 + ...ThirdPartySharingSettingsReadListener.java | 6 + .../java/com/adjust/sdk/PackageBuilder.java | 4 + .../java/com/adjust/sdk/ResponseData.java | 3 + .../adjust/sdk/SharedPreferencesManager.java | 19 ++ .../sdk/ThirdPartySharingResponseData.java | 4 + .../src/main/java/com/adjust/sdk/Util.java | 7 + .../adjust/testapp/AdjustCommandExecutor.java | 25 ++- .../src/main/assets/command_executor.js | 19 ++ 21 files changed, 447 insertions(+), 3 deletions(-) create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustThirdPartySharingResult.java create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/OnThirdPartySharingSettingsReadListener.java create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/ThirdPartySharingResponseData.java diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index df482f2ed..771f76bf1 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -343,6 +343,14 @@ var Adjust = { } }, + getThirdPartySharingSettingsWithTimeout: function (timeoutInMilliSec, callback) { + if (AdjustBridge) { + const callbackId = window.randomCallbackIdWithPrefix("adjust_getThirdPartySharingSettingsWithTimeout"); + this._handleGetterCallback(callback, callbackId); + this._callBridge('getThirdPartySharingSettingsWithTimeout', [timeoutInMilliSec, callbackId]); + } + }, + getSdkVersion: function (callback) { if (AdjustBridge) { const callbackId = window.randomCallbackIdWithPrefix("adjust_getSdkVersion"); diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js index 4d2901c54..d285253b9 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -56,6 +56,7 @@ function AdjustConfig(appToken, environment, legacy) { this.isFirstSessionDelayEnabled = null; this.storeInfo = null; this.isAppSetIdReadingEnabled = null; + this.isFbAidReadingEnabled = null; } AdjustConfig.EnvironmentSandbox = 'sandbox'; @@ -270,3 +271,7 @@ AdjustConfig.prototype.setStoreInfo = function(storeInfo) { AdjustConfig.prototype.disableAppSetIdReading = function() { this.isAppSetIdReadingEnabled = false; }; + +AdjustConfig.prototype.disableFbAidReading = function() { + this.isFbAidReadingEnabled = false; +}; diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 01a42b36c..db29f567d 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -19,6 +19,7 @@ import com.adjust.sdk.AdjustSessionSuccess; import com.adjust.sdk.AdjustStoreInfo; import com.adjust.sdk.AdjustThirdPartySharing; +import com.adjust.sdk.AdjustThirdPartySharingResult; import com.adjust.sdk.LogLevel; import com.adjust.sdk.OnAdidReadListener; import com.adjust.sdk.OnAmazonAdIdReadListener; @@ -33,6 +34,7 @@ import com.adjust.sdk.OnIsEnabledListener; import com.adjust.sdk.OnSessionTrackingFailedListener; import com.adjust.sdk.OnSessionTrackingSucceededListener; +import com.adjust.sdk.OnThirdPartySharingSettingsReadListener; import org.json.JSONArray; import org.json.JSONObject; @@ -187,6 +189,7 @@ public void initSdk(String adjustConfigString, String bridgeToken) { Object isFirstSessionDelayEnabledField = jsonAdjustConfig.get("isFirstSessionDelayEnabled"); Object storeInfoField = jsonAdjustConfig.get("storeInfo"); Object isAppSetIdReadingEnabledField = jsonAdjustConfig.get("isAppSetIdReadingEnabled"); + Object isFbAidReadingEnabledField = jsonAdjustConfig.get("isFbAidReadingEnabled"); String appToken = AdjustBridgeUtil.fieldToString(appTokenField); String environment = AdjustBridgeUtil.fieldToString(environmentField); @@ -459,6 +462,14 @@ public void onRemoteTrigger(AdjustRemoteTrigger remoteTrigger) { } } + // FbAid reading + Boolean isFbAidReadingEnabled = AdjustBridgeUtil.fieldToBoolean(isFbAidReadingEnabledField); + if (isFbAidReadingEnabled != null) { + if (!isFbAidReadingEnabled) { + adjustConfig.disableFbAidReading(); + } + } + enableBridgeSecurity(); Adjust.initSdk(adjustConfig); @@ -1109,6 +1120,28 @@ public void onAttributionRead(AdjustAttribution attribution) { }); } + @JavascriptInterface + public void getThirdPartySharingSettingsWithTimeout(final long timeoutInMilliSec, final String callback) { + getThirdPartySharingSettingsWithTimeout(timeoutInMilliSec, callback, null); + } + + @JavascriptInterface + public void getThirdPartySharingSettingsWithTimeout(final long timeoutInMilliSec, final String callback, String bridgeToken) { + if (!isBridgeAuthorized(bridgeToken)) { + return; + } + if (!isInitialized()) { + return; + } + Adjust.getThirdPartySharingSettingsWithTimeout(application.getApplicationContext(), timeoutInMilliSec, + new OnThirdPartySharingSettingsReadListener() { + @Override + public void onThirdPartySharingSettingsRead(AdjustThirdPartySharingResult adjustThirdPartySharingResult) { + AdjustBridgeUtil.execThirdPartySharingSettingsCallbackCommand(webView, callback, adjustThirdPartySharingResult); + } + }); + } + @JavascriptInterface public void getSdkVersion(final String callback) { getSdkVersion(callback, null); diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java index 860243209..38d7c801a 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeUtil.java @@ -10,6 +10,7 @@ import com.adjust.sdk.AdjustRemoteTrigger; import com.adjust.sdk.AdjustSessionFailure; import com.adjust.sdk.AdjustSessionSuccess; +import com.adjust.sdk.AdjustThirdPartySharingResult; import com.adjust.sdk.ILogger; import org.json.JSONArray; @@ -142,6 +143,26 @@ public static void execAttributionCallbackCommand(final WebView webView, final S } } + public static void execThirdPartySharingSettingsCallbackCommand(final WebView webView, final String commandName, final AdjustThirdPartySharingResult result) { + if (webView == null) { + return; + } + if (commandName == null) { + return; + } + try { + if (result != null) { + JSONObject jsonAdjustThirdPartySharingResult = new JSONObject(); + jsonAdjustThirdPartySharingResult.put("thirdPartySharingSettingsJson", result.getThirdPartySharingSettingsJson() == null ? JSONObject.NULL : result.getThirdPartySharingSettingsJson()); + execNativeCallback(webView, commandName, jsonAdjustThirdPartySharingResult.toString()); + } else { + execNativeCallback(webView, commandName, "null"); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + public static void execSessionSuccessCallbackCommand(final WebView webView, final String commandName, final AdjustSessionSuccess sessionSuccess) { if (webView == null) { return; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 6ec436668..7c0f276f5 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -24,6 +24,7 @@ import static com.adjust.sdk.Constants.REFERRER_API_SAMSUNG; import static com.adjust.sdk.Constants.REFERRER_API_VIVO; import static com.adjust.sdk.Constants.REFERRER_API_XIAOMI; +import static com.adjust.sdk.Constants.TPS_SETTINGS_TIMEOUT_TIMER_NAME; import android.app.ActivityManager; import android.content.Context; @@ -88,6 +89,7 @@ public class ActivityHandler private DeviceInfo deviceInfo; private AdjustConfig adjustConfig; // always valid after construction private AdjustAttribution attribution; + private AdjustThirdPartySharingResult thirdPartySharingResult; private IAttributionHandler attributionHandler; private ISdkClickHandler sdkClickHandler; private IPurchaseVerificationHandler purchaseVerificationHandler; @@ -100,6 +102,7 @@ public class ActivityHandler private final ArrayList cachedAttributionReadCallbacks = new ArrayList<>(); private final ArrayList cachedAttributionReadTimeoutCallbacks = new ArrayList<>(); private List cachedAdjustThirdPartySharingArray; + private final ArrayList cachedThirdPartySharingTimeoutCallbacks = new ArrayList<>(); private Boolean cachedLastMeasurementConsentTrack; private FirstSessionDelayManager firstSessionDelayManager; private @NonNull EventMetadata eventMetadata = new EventMetadata(); @@ -270,6 +273,7 @@ private ActivityHandler(AdjustConfig adjustConfig) { executor.submit(() -> { // has to be read in the background readAttributionI(adjustConfig.context); + readThirdPartySharingResultI(adjustConfig.context); readActivityStateI(adjustConfig.context); readEventMetadataI(adjustConfig.context); firstSessionDelayManager.activityStateFileReadI(); @@ -414,6 +418,11 @@ public void finishedTrackingActivity(ResponseData responseData) { if (responseData instanceof PurchaseVerificationResponseData) { launchPurchaseVerificationResponseTasks((PurchaseVerificationResponseData)responseData); } + + // check if it's a third party sharing response + if (responseData instanceof ThirdPartySharingResponseData) { + launchThirdPartySharingResponseTasks((ThirdPartySharingResponseData)responseData); + } } @Override @@ -614,6 +623,48 @@ public void run() { return true; } + private void updateThirdPartySharingSettingsI() { + final SharedPreferencesManager sharedPreferencesManager = + SharedPreferencesManager.getDefaultInstance(getContext()); + sharedPreferencesManager.saveThirdPartySharingResult(this.thirdPartySharingResult); + + ArrayList cachedThirdPartySharingTimeoutCallbacksCopy = null; + synchronized (cachedThirdPartySharingTimeoutCallbacks) { + if (!cachedThirdPartySharingTimeoutCallbacks.isEmpty()) { + cachedThirdPartySharingTimeoutCallbacksCopy = new ArrayList<>(cachedThirdPartySharingTimeoutCallbacks); + cachedThirdPartySharingTimeoutCallbacks.clear(); + } + } + + // process third party sharing callbacks + if (cachedThirdPartySharingTimeoutCallbacksCopy != null) { + final AdjustThirdPartySharingResult thirdPartySharingResultCopy = thirdPartySharingResult; + ArrayList finalCachedThirdPartySharingTimeoutCallbacksCopy = cachedThirdPartySharingTimeoutCallbacksCopy; + new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + for (AdjustTimeoutCallback adjustTimeoutCallback : finalCachedThirdPartySharingTimeoutCallbacksCopy) { + if (adjustTimeoutCallback != null) { + // cancel any pending timeout + TimerOnce timerOnce = adjustTimeoutCallback.getTimeoutTimer(); + if (timerOnce != null) { + timerOnce.cancel(); + } + + OnThirdPartySharingSettingsReadListener listener = adjustTimeoutCallback.getOnThirdPartySharingSettingsReadListener(); + if (listener != null) { + listener.onThirdPartySharingSettingsRead(thirdPartySharingResultCopy); + } + + // null callback to call it only once + adjustTimeoutCallback.setOnThirdPartySharingSettingsReadListener(null); + } + } + } + }); + } + } + @Override public void setAskingAttribution(final boolean askingAttribution) { executor.submit(new Runnable() { @@ -710,6 +761,15 @@ public void run() { }); } + private void launchThirdPartySharingResponseTasks(final ThirdPartySharingResponseData thirdPartySharingResponseData) { + executor.submit(new Runnable() { + @Override + public void run() { + launchThirdPartySharingResponseTasksI(thirdPartySharingResponseData); + } + }); + } + @Override public void processRemoteTriggers(ResponseData responseData) { executor.submit(new Runnable() { @@ -929,6 +989,22 @@ public void run() { } } + @Override + public void getThirdPartySharingSettingsWithTimeout(long timeoutInMilliSec, OnThirdPartySharingSettingsReadListener listener) { + if (thirdPartySharingResult != null) { + new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + listener.onThirdPartySharingSettingsRead(thirdPartySharingResult); + } + }); + } else { + // third party sharing settings not found + // queue timeout callback for later processing + queueGetThirdPartySharingSettingsWithTimeout(timeoutInMilliSec, listener, cachedThirdPartySharingTimeoutCallbacks, getContext()); + } + } + @Override public void verifyPlayStorePurchase(final AdjustPlayStorePurchase purchase, final OnPurchaseVerificationFinishedListener callback) @@ -1052,6 +1128,48 @@ public void run() { timerOnce.startIn(timeoutInMilliSec); } + public static void queueGetThirdPartySharingSettingsWithTimeout(final long timeoutInMilliSec, + final OnThirdPartySharingSettingsReadListener listener, + final ArrayList cachedThirdPartySharingSettingsReadTimeoutCallbacks, + final Context context) { + AdjustTimeoutCallback timeoutCallback = new AdjustTimeoutCallback(listener); + + // cache the callback before starting the timer + synchronized (cachedThirdPartySharingSettingsReadTimeoutCallbacks) { + cachedThirdPartySharingSettingsReadTimeoutCallbacks.add(timeoutCallback); + } + + // set up timeout timer immediately + TimerOnce timerOnce = new TimerOnce(new Runnable() { + @Override + public void run() { + if (timeoutCallback.getOnThirdPartySharingSettingsReadListener() != null) { + // remove callback from array and call callback with null + synchronized (cachedThirdPartySharingSettingsReadTimeoutCallbacks) { + cachedThirdPartySharingSettingsReadTimeoutCallbacks.remove(timeoutCallback); + } + new Handler(context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + // if timer elapses, return null (only if callback still exists) + OnThirdPartySharingSettingsReadListener readListener = + timeoutCallback.getOnThirdPartySharingSettingsReadListener(); + if (readListener != null) { + readListener.onThirdPartySharingSettingsRead(null); + } + + // null callback to call it only once + timeoutCallback.setOnThirdPartySharingSettingsReadListener(null); + } + }); + } + } + }, TPS_SETTINGS_TIMEOUT_TIMER_NAME); + + timeoutCallback.setTimer(timerOnce); + timerOnce.startIn(timeoutInMilliSec); + } + void initI() { SESSION_INTERVAL = AdjustFactory.getSessionInterval(); SUBSESSION_INTERVAL = AdjustFactory.getSubsessionInterval(); @@ -1137,6 +1255,7 @@ public void run(ActivityHandler activityHandler) { handleAdidCallbackI(); handleAttributionCallbackI(); + handleThirdPartySharingCallbackI(); // GDPR if (activityState != null) { @@ -1404,6 +1523,52 @@ public void run() { } } + private void handleThirdPartySharingCallbackI() { + synchronized (cachedThirdPartySharingTimeoutCallbacks) { + cachedThirdPartySharingTimeoutCallbacks.addAll(adjustConfig.cachedThirdPartySharingTimeoutCallbacks); + adjustConfig.cachedThirdPartySharingTimeoutCallbacks.clear(); + } + + if (thirdPartySharingResult == null) { + return; + } + + ArrayList cachedThirdPartySharingTimeoutCallbacksCopy = null; + synchronized (cachedThirdPartySharingTimeoutCallbacks) { + if (! cachedThirdPartySharingTimeoutCallbacks.isEmpty()) { + cachedThirdPartySharingTimeoutCallbacksCopy = new ArrayList<>(cachedThirdPartySharingTimeoutCallbacks); + cachedThirdPartySharingTimeoutCallbacks.clear(); + } + } + + // process third party sharing callbacks + if (cachedThirdPartySharingTimeoutCallbacksCopy != null) { + final AdjustThirdPartySharingResult thirdPartySharingResultCopy = thirdPartySharingResult; + ArrayList finalCachedThirdPartySharingTimeoutCallbacksCopy = cachedThirdPartySharingTimeoutCallbacksCopy; + new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + for (AdjustTimeoutCallback adjustTimeoutCallback : finalCachedThirdPartySharingTimeoutCallbacksCopy) { + if (adjustTimeoutCallback != null) { + // cancel any pending timeout + TimerOnce timerOnce = adjustTimeoutCallback.getTimeoutTimer(); + if (timerOnce != null) { + timerOnce.cancel(); + } + OnThirdPartySharingSettingsReadListener listener = adjustTimeoutCallback.getOnThirdPartySharingSettingsReadListener(); + if (listener != null) { + listener.onThirdPartySharingSettingsRead(thirdPartySharingResultCopy); + } + + // null callback to call it only once + adjustTimeoutCallback.setOnThirdPartySharingSettingsReadListener(null); + } + } + } + }); + } + } + private void bootstrapLifecycleI() { this.systemLifecycle = SystemLifecycle.getSingletonInstance(); @@ -2193,7 +2358,23 @@ public void run() { } } + private void launchThirdPartySharingResponseTasksI(final ThirdPartySharingResponseData thirdPartySharingResponseData) { + if (thirdPartySharingResponseData.jsonResponse == null) { + return; + } + final JSONObject tpsSettingsJson = thirdPartySharingResponseData.jsonResponse.optJSONObject("third_party_sharing"); + + if (tpsSettingsJson == null) { + // nothing to update + return; + } + + String tpsSettingsJsonString = tpsSettingsJson.toString(); + + this.thirdPartySharingResult = new AdjustThirdPartySharingResult(tpsSettingsJsonString); + updateThirdPartySharingSettingsI(); + } private void prepareDeeplinkI(final Uri deeplink, final Handler handler) { if (deeplink == null) { @@ -3142,6 +3323,9 @@ private void readEventMetadataI(Context context) { } } + private void readThirdPartySharingResultI(final Context context) { + thirdPartySharingResult = SharedPreferencesManager.getDefaultInstance(context).getThirdPartySharingResult(); + } @SuppressWarnings("unchecked") private void readGlobalCallbackParametersI(Context context) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index c114fb058..1ebe73a03 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -1,7 +1,6 @@ package com.adjust.sdk; import android.content.Context; -import android.net.Uri; import java.util.Map; @@ -405,6 +404,34 @@ public static void getAttributionWithTimeout(final Context context, final long t adjustInstance.getAttributionWithTimeout(extractApplicationContext(context), timeoutInMilliSec, attributionReadListener); } + /** + * Called to get user's current third party sharing settings. + * + * @param context Application context + * @param timeoutInMilliSec Timeout in milliseconds. If third party sharing settings + * are not available within this time, the callback will return null. + * @param listener Callback to get triggered once third party sharing settings are obtained + */ + public static void getThirdPartySharingSettingsWithTimeout(final Context context, final long timeoutInMilliSec, + final OnThirdPartySharingSettingsReadListener listener) { + if (listener == null) { + AdjustFactory.getLogger().error("Callback for getting third party sharing settings can't be null"); + return; + } + if (context == null) { + AdjustFactory.getLogger().error("Context for getting third party sharing settings can't be null"); + listener.onThirdPartySharingSettingsRead(null); + return; + } + if (timeoutInMilliSec < 0) { + AdjustFactory.getLogger().error("Timeout value for getting third party sharing settings can't be negative"); + listener.onThirdPartySharingSettingsRead(null); + return; + } + AdjustInstance adjustInstance = Adjust.getDefaultInstance(); + adjustInstance.getThirdPartySharingSettingsWithTimeout(extractApplicationContext(context), timeoutInMilliSec, listener); + } + /** * Called to get Google Install Referrer. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 192db2232..cb4ae8e94 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -49,9 +49,11 @@ public class AdjustConfig { Integer eventDeduplicationIdsMaxSize; ArrayList cachedAttributionReadCallbacks = new ArrayList<>(); ArrayList cachedAttributionReadTimeoutCallbacks = new ArrayList<>(); + ArrayList cachedThirdPartySharingTimeoutCallbacks = new ArrayList<>(); boolean isFirstSessionDelayEnabled; AdjustStoreInfo storeInfo; boolean isAppSetIdReadingEnabled; + boolean isFbAidReadingEnabled; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; @@ -91,6 +93,7 @@ private void init(Context context, String appToken, String environment, boolean this.playStoreKidsComplianceEnabled = false; this.isFirstSessionDelayEnabled = false; this.isAppSetIdReadingEnabled = true; + this.isFbAidReadingEnabled = true; } public void setLogLevel(LogLevel logLevel) { @@ -203,6 +206,10 @@ public void disableAppSetIdReading() { this.isAppSetIdReadingEnabled = false; } + public void disableFbAidReading() { + this.isFbAidReadingEnabled = false; + } + public Context getContext() { return context; } @@ -311,6 +318,10 @@ public boolean isAppSetIdReadingEnabled() { return isAppSetIdReadingEnabled; } + public boolean isFbAidReadingEnabled() { + return isFbAidReadingEnabled; + } + private boolean checkContext(Context context) { if (context == null) { logger.error("Missing context"); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java index fe2d669c1..5acb65a2b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -54,6 +54,7 @@ public PreLaunchActions() { private final ArrayList cachedAdidReadTimeoutCallbacks = new ArrayList<>(); private final ArrayList cachedAttributionReadCallbacks = new ArrayList<>(); private final ArrayList cachedAttributionReadTimeoutCallbacks = new ArrayList<>(); + private final ArrayList cachedThirdPartySharingTimeoutCallbacks = new ArrayList<>(); /** * Base path for Adjust packages. */ @@ -110,6 +111,7 @@ public void initSdk(final AdjustConfig adjustConfig) { adjustConfig.cachedAdidReadTimeoutCallbacks = cachedAdidReadTimeoutCallbacks; adjustConfig.cachedAttributionReadCallbacks = cachedAttributionReadCallbacks; adjustConfig.cachedAttributionReadTimeoutCallbacks = cachedAttributionReadTimeoutCallbacks; + adjustConfig.cachedThirdPartySharingTimeoutCallbacks = cachedThirdPartySharingTimeoutCallbacks; activityHandler = AdjustFactory.getActivityHandler(adjustConfig); setSendingReferrersAsNotSent(adjustConfig.context); @@ -606,6 +608,39 @@ public void run() { activityHandler.getAttributionWithTimeout(timeoutInMilliSec, attributionReadListener); } + /** + * Called to get user's current third party sharing settings. + * + * @param context Application context + * @param timeoutInMilliSec Timeout in milliseconds. If third party sharing settings + * are not available within this time, the callback will return null. + * @param listener Callback to get triggered once third party sharing settings are obtained + */ + public void getThirdPartySharingSettingsWithTimeout(Context context, long timeoutInMilliSec, OnThirdPartySharingSettingsReadListener listener) { + if (!checkActivityHandler("getThirdPartySharingSettings")) { + ThreadExecutor executor = new SingleThreadCachedScheduler("getThirdPartySharingSettings"); + executor.submit(new Runnable() { + @Override + public void run() { + AdjustThirdPartySharingResult adjustThirdPartySharingResult = SharedPreferencesManager.getDefaultInstance(context).getThirdPartySharingResult(); + if (adjustThirdPartySharingResult != null) { + new Handler(context.getMainLooper()).post(new Runnable() { + @Override + public void run() { + listener.onThirdPartySharingSettingsRead(adjustThirdPartySharingResult); + } + }); + } else { + // third party sharing settings not found locally + ActivityHandler.queueGetThirdPartySharingSettingsWithTimeout(timeoutInMilliSec, listener, cachedThirdPartySharingTimeoutCallbacks, context); + } + } + }); + return; + } + activityHandler.getThirdPartySharingSettingsWithTimeout(timeoutInMilliSec, listener); + } + /** * Called to get native SDK version string. * diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustThirdPartySharingResult.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustThirdPartySharingResult.java new file mode 100644 index 000000000..4ede13016 --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustThirdPartySharingResult.java @@ -0,0 +1,17 @@ +package com.adjust.sdk; + +public class AdjustThirdPartySharingResult { + private final String thirdPartySharingSettingsJson; + + public AdjustThirdPartySharingResult(final String thirdPartySharingSettingsJson) { + this.thirdPartySharingSettingsJson = thirdPartySharingSettingsJson; + } + + /** + * Returns third party sharing settings as a raw JSON string received from the backend. + */ + public String getThirdPartySharingSettingsJson() { + return thirdPartySharingSettingsJson; + } + +} diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTimeoutCallback.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTimeoutCallback.java index f868141ee..5d6318ae5 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTimeoutCallback.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustTimeoutCallback.java @@ -5,6 +5,7 @@ public class AdjustTimeoutCallback { private OnAdidReadListener onAdidReadListener; private OnAttributionReadListener onAttributionReadListener; + private OnThirdPartySharingSettingsReadListener onThirdPartySharingSettingsReadListener; private TimerOnce timeoutTimer; public AdjustTimeoutCallback(OnAdidReadListener onAdidReadListener) { @@ -15,6 +16,10 @@ public AdjustTimeoutCallback(OnAttributionReadListener onAttributionReadListener this.onAttributionReadListener = onAttributionReadListener; } + public AdjustTimeoutCallback(OnThirdPartySharingSettingsReadListener onThirdPartySharingSettingsReadListener) { + this.onThirdPartySharingSettingsReadListener = onThirdPartySharingSettingsReadListener; + } + public void setOnAdidReadListener(OnAdidReadListener onAdidReadListener) { this.onAdidReadListener = onAdidReadListener; } @@ -23,6 +28,10 @@ public void setOnAttributionReadListener(OnAttributionReadListener onAttribution this.onAttributionReadListener = onAttributionReadListener; } + public void setOnThirdPartySharingSettingsReadListener(OnThirdPartySharingSettingsReadListener onThirdPartySharingSettingsReadListener) { + this.onThirdPartySharingSettingsReadListener = onThirdPartySharingSettingsReadListener; + } + public void setTimer(TimerOnce timer) { this.timeoutTimer = timer; } @@ -35,6 +44,10 @@ public OnAttributionReadListener getOnAttributionReadListener() { return onAttributionReadListener; } + public OnThirdPartySharingSettingsReadListener getOnThirdPartySharingSettingsReadListener() { + return onThirdPartySharingSettingsReadListener; + } + public TimerOnce getTimeoutTimer() { return timeoutTimer; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 77b8c5fbd..340576eb8 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -106,5 +106,6 @@ public interface Constants { String ADID_TIMEOUT_TIMER_NAME = "Get Adid timeout timer"; String ATTRIBUTION_TIMEOUT_TIMER_NAME = "Get Attribution timeout timer"; + String TPS_SETTINGS_TIMEOUT_TIMER_NAME = "Get Third party sharing settings timeout timer"; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index bec4d81b5..276bd7e28 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -131,7 +131,9 @@ class DeviceInfo { displayWidth = getDisplayWidth(displayMetrics); displayHeight = getDisplayHeight(displayMetrics); clientSdk = getClientSdk(adjustConfig.sdkPrefix); - fbAttributionId = getFacebookAttributionId(context); + if (Util.canReadFbAid(adjustConfig)) { + fbAttributionId = getFacebookAttributionId(context); + } hardwareName = getHardwareName(); abi = getABI(); buildName = getBuildName(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java index 67b92d011..753ec3cf5 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -101,6 +101,8 @@ public interface IActivityHandler { void getAttributionWithTimeout(long timeoutInMilliSec, OnAttributionReadListener onAttributionReadListener); + void getThirdPartySharingSettingsWithTimeout(long timeoutInMilliSec, OnThirdPartySharingSettingsReadListener onThirdPartySharingSettingsReadListener); + AdjustConfig getAdjustConfig(); DeviceInfo getDeviceInfo(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnThirdPartySharingSettingsReadListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnThirdPartySharingSettingsReadListener.java new file mode 100644 index 000000000..2d8079c12 --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnThirdPartySharingSettingsReadListener.java @@ -0,0 +1,6 @@ +package com.adjust.sdk; + +public interface OnThirdPartySharingSettingsReadListener { + void onThirdPartySharingSettingsRead(AdjustThirdPartySharingResult adjustThirdPartySharingResult); +} + diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index da3c55442..be35af358 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -1266,6 +1266,10 @@ private void injectFeatureFlagsWithParameters(Map parameters) { PackageBuilder.addBoolean(parameters, "ff_app_set_id_disabled", true); } + if (!adjustConfig.isFbAidReadingEnabled) { + PackageBuilder.addBoolean(parameters, "ff_fb_aid_disabled", true); + } + if (adjustConfig.onRemoteTriggerListener != null) { PackageBuilder.addBoolean(parameters, "ff_remote_triggers_callback", true); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ResponseData.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ResponseData.java index 9de0903b0..72fbbdb55 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ResponseData.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ResponseData.java @@ -57,6 +57,9 @@ public static ResponseData buildResponseData( case PURCHASE_VERIFICATION: responseData = new PurchaseVerificationResponseData(); break; + case THIRD_PARTY_SHARING: + responseData = new ThirdPartySharingResponseData(); + break; default: responseData = new ResponseData(); break; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java index cb38e2e01..2415d4c26 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -7,6 +7,7 @@ import android.content.Context; import android.content.SharedPreferences; import android.net.Uri; +import android.text.TextUtils; /** * Class used for shared preferences manipulation. @@ -56,6 +57,7 @@ public class SharedPreferencesManager { private static final String PREFS_KEY_LVL_TRACKED = "lvl_tracked"; + private static final String PREFS_KEY_TPS_RESULT_SETTINGS = "tps_result_settings"; /** * Index for raw referrer string content in saved JSONArray object. @@ -491,6 +493,23 @@ public synchronized boolean getLicenseVerificationTracked() { return getBoolean(PREFS_KEY_LVL_TRACKED, false); } + public synchronized void saveThirdPartySharingResult(final AdjustThirdPartySharingResult thirdPartySharingResult) { + try { + saveString(PREFS_KEY_TPS_RESULT_SETTINGS, thirdPartySharingResult.getThirdPartySharingSettingsJson()); + } catch (Throwable t) { + } + } + + public synchronized AdjustThirdPartySharingResult getThirdPartySharingResult() { + String thirdPartySharingSettingsJson = getString(PREFS_KEY_TPS_RESULT_SETTINGS); + + if (TextUtils.isEmpty(thirdPartySharingSettingsJson)) { + return null; + } + + return new AdjustThirdPartySharingResult(thirdPartySharingSettingsJson); + } + /** * Remove all key-value pairs from shared preferences. */ diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ThirdPartySharingResponseData.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ThirdPartySharingResponseData.java new file mode 100644 index 000000000..00196a280 --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ThirdPartySharingResponseData.java @@ -0,0 +1,4 @@ +package com.adjust.sdk; + +public class ThirdPartySharingResponseData extends ResponseData { +} diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index a34301abe..85594248b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -695,6 +695,13 @@ public static boolean canReadAppSetId(final AdjustConfig adjustConfig) { return canReadPlayIds(adjustConfig); } + public static boolean canReadFbAid(final AdjustConfig adjustConfig) { + if (!adjustConfig.isFbAidReadingEnabled) { + return false; + } + return canReadNonPlayIds(adjustConfig); + } + public static boolean isGooglePlayGamesForPC(final Context context) { PackageManager pm = context.getPackageManager(); return pm.hasSystemFeature("com.google.android.play.feature.HPE_EXPERIENCE"); diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index acccab8d3..4c17f5b44 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -28,7 +28,6 @@ import com.adjust.sdk.AdjustTestOptions; import com.adjust.sdk.AdjustThirdPartySharing; import com.adjust.sdk.LogLevel; -import com.adjust.sdk.OnAdidReadListener; import com.adjust.sdk.OnAttributionChangedListener; import com.adjust.sdk.OnDeeplinkResolvedListener; import com.adjust.sdk.OnDeferredDeeplinkResponseListener; @@ -109,6 +108,7 @@ public void executeCommand(final Command sentCommand) { case "sdkVersionGetter" : sdkVersionGetter(); break; case "googleAdIdGetter" : googleAdIdGetter(); break; case "amazonAdIdGetter" : amazonAdIdGetter(); break; + case "tpsSettingsGetter" : tpsSettingsGetter(); break; //case "testBegin": testBegin(); break; // case "testEnd": testEnd(); break; } @@ -527,6 +527,14 @@ public void onRemoteTrigger(AdjustRemoteTrigger trigger) { adjustConfig.disableAppSetIdReading(); } } + + if (command.containsParameter("fbAidReadingEnabled")) { + String fbAidReadingEnabledS = command.getFirstParameterValue("fbAidReadingEnabled"); + boolean fbAidReadingEnabled = "true".equals(fbAidReadingEnabledS); + if (!fbAidReadingEnabled) { + adjustConfig.disableFbAidReading(); + } + } } private void start() { @@ -1027,6 +1035,21 @@ private void adidGetterWithTimeout() { }); } + private void tpsSettingsGetter() { + long timeout = Long.parseLong(command.getFirstParameterValue("timeout")); + String testCallbackId = command.getFirstParameterValue("testCallbackId"); + + Adjust.getThirdPartySharingSettingsWithTimeout(context, timeout, adjustThirdPartySharingResult -> { + Map fields = new HashMap<>(); + if (adjustThirdPartySharingResult != null) { + fields.put("third_party_sharing", adjustThirdPartySharingResult.getThirdPartySharingSettingsJson()); + } + MainActivity.testLibrary.setInfoToSend(fields); + MainActivity.testLibrary.addInfoToSend("test_callback_id", testCallbackId); + MainActivity.testLibrary.sendInfoToServer(basePath); + }); + } + private void getLastDeeplink() { String testCallbackId = command.getFirstParameterValue("testCallbackId"); final String localBasePath = basePath; diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index 87a5be0c2..d4b28f110 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -146,6 +146,7 @@ AdjustCommandExecutor.prototype.executeCommand = function(command, idx) { case "sdkVersionGetter" : this.sdkVersionGetter(command.params); break; case "googleAdIdGetter" : this.googleAdIdGetter(command.params); break; case "amazonAdIdGetter" : this.amazonAdIdGetter(command.params); break; + case "tpsSettingsGetter" : this.tpsSettingsGetter(command.params); break; break; } @@ -821,6 +822,24 @@ AdjustCommandExecutor.prototype.adidGetterWithTimeout = function(params) { }); }; +AdjustCommandExecutor.prototype.tpsSettingsGetter = function(params) { + var timeoutS = getFirstParameterValue(params, 'timeout'); + var timeout = parseInt(timeoutS); + var testCallbackId = getFirstParameterValue(params, 'testCallbackId'); + var basePath = this.basePath; + + Adjust.getThirdPartySharingSettingsWithTimeout(timeout, function(adjustThirdPartySharingResult) { + if (adjustThirdPartySharingResult != null) { + TestLibrary.addInfoToSend("third_party_sharing", adjustThirdPartySharingResult.thirdPartySharingSettingsJson); + } else { + TestLibrary.addInfoToSend("third_party_sharing", null); + } + + TestLibrary.addInfoToSend("test_callback_id", testCallbackId); + TestLibrary.sendInfoToServer(basePath); + }); +}; + //Util //====================== function getValueFromKey(params, key) { From 168804fad5d1b3a9e7c4ec604f0d595614565dab Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 5 May 2026 16:57:28 +0200 Subject: [PATCH 492/540] add third party sharing settings changed callback --- .../src/main/assets/adjust.js | 2 + .../src/main/assets/adjust_config.js | 17 +++++++ .../sdk/webbridge/AdjustBridgeInstance.java | 15 ++++++ .../java/com/adjust/sdk/ActivityHandler.java | 51 ++++++++++++++++--- .../java/com/adjust/sdk/AdjustConfig.java | 11 +++- .../sdk/AdjustThirdPartySharingResult.java | 15 ++++++ ...rdPartySharingSettingsChangedListener.java | 5 ++ 7 files changed, 108 insertions(+), 8 deletions(-) create mode 100644 Adjust/sdk-core/src/main/java/com/adjust/sdk/OnThirdPartySharingSettingsChangedListener.java diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 771f76bf1..86e4ff356 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -43,6 +43,7 @@ var Adjust = { }; registerIfPresent(adjustConfig.attributionCallbackName, adjustConfig.attributionCallbackFunction); + registerIfPresent(adjustConfig.thirdPartySharingSettingsChangedCallbackName, adjustConfig.thirdPartySharingSettingsChangedCallbackFunction); registerIfPresent(adjustConfig.eventSuccessCallbackName, adjustConfig.eventSuccessCallbackFunction); registerIfPresent(adjustConfig.eventFailureCallbackName, adjustConfig.eventFailureCallbackFunction); registerIfPresent(adjustConfig.sessionSuccessCallbackName, adjustConfig.sessionSuccessCallbackFunction); @@ -61,6 +62,7 @@ var Adjust = { }; registerInternal(adjustConfig.attributionCallbackName, adjustConfig.adjust_attributionCallback); + registerInternal(adjustConfig.thirdPartySharingSettingsChangedCallbackName, adjustConfig.adjust_thirdPartySharingSettingsChangedCallback); registerInternal(adjustConfig.eventSuccessCallbackName, adjustConfig.adjust_eventSuccessCallback); registerInternal(adjustConfig.eventFailureCallbackName, adjustConfig.adjust_eventFailureCallback); registerInternal(adjustConfig.sessionSuccessCallbackName, adjustConfig.adjust_sessionSuccessCallback); diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js index d285253b9..84d8efd20 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -27,6 +27,8 @@ function AdjustConfig(appToken, environment, legacy) { this.externalDeviceId = null; this.attributionCallbackName = null; this.attributionCallbackFunction = null; + this.thirdPartySharingSettingsChangedCallbackName = null; + this.thirdPartySharingSettingsChangedCallbackFunction = null; this.isCostDataInAttributionEnabled = null; this.eventSuccessCallbackName = null; this.eventSuccessCallbackFunction = null; @@ -117,6 +119,21 @@ AdjustConfig.prototype.adjust_attributionCallback = function(attribution) { } }; +AdjustConfig.prototype.setThirdPartySharingSettingsChangedCallback = function(callback) { + if (typeof callback === 'string' || callback instanceof String) { + this.thirdPartySharingSettingsChangedCallbackName = callback; + } else { + this.thirdPartySharingSettingsChangedCallbackName = 'Adjust.getConfig().adjust_thirdPartySharingSettingsChangedCallback'; + this.thirdPartySharingSettingsChangedCallbackFunction = callback; + } +}; + +AdjustConfig.prototype.adjust_thirdPartySharingSettingsChangedCallback = function(result) { + if (this.thirdPartySharingSettingsChangedCallbackFunction) { + this.thirdPartySharingSettingsChangedCallbackFunction(result); + } +}; + AdjustConfig.prototype.enableCostDataInAttribution = function() { this.isCostDataInAttributionEnabled = true; }; diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index db29f567d..51ce73630 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -34,6 +34,7 @@ import com.adjust.sdk.OnIsEnabledListener; import com.adjust.sdk.OnSessionTrackingFailedListener; import com.adjust.sdk.OnSessionTrackingSucceededListener; +import com.adjust.sdk.OnThirdPartySharingSettingsChangedListener; import com.adjust.sdk.OnThirdPartySharingSettingsReadListener; import org.json.JSONArray; @@ -166,6 +167,7 @@ public void initSdk(String adjustConfigString, String bridgeToken) { Object defaultTrackerField = jsonAdjustConfig.get("defaultTracker"); Object externalDeviceIdField = jsonAdjustConfig.get("externalDeviceId"); Object attributionCallbackNameField = jsonAdjustConfig.get("attributionCallbackName"); + Object thirdPartySharingSettingsChangedCallbackNameField = jsonAdjustConfig.get("thirdPartySharingSettingsChangedCallbackName"); Object isCostDataInAttributionEnabledField = jsonAdjustConfig.get("isCostDataInAttributionEnabled"); Object eventSuccessCallbackNameField = jsonAdjustConfig.get("eventSuccessCallbackName"); Object eventFailureCallbackNameField = jsonAdjustConfig.get("eventFailureCallbackName"); @@ -270,6 +272,19 @@ public void onAttributionChanged(AdjustAttribution attribution) { }); } + // Third party sharing settings changed callback name + final String thirdPartySharingSettingsChangedCallbackName = + AdjustBridgeUtil.fieldToString(thirdPartySharingSettingsChangedCallbackNameField); + if (thirdPartySharingSettingsChangedCallbackName != null) { + adjustConfig.setOnThirdPartySharingSettingsChangedListener(new OnThirdPartySharingSettingsChangedListener() { + @Override + public void onThirdPartySharingSettingsChanged(AdjustThirdPartySharingResult adjustThirdPartySharingResult) { + AdjustBridgeUtil.execThirdPartySharingSettingsCallbackCommand( + webView, thirdPartySharingSettingsChangedCallbackName, adjustThirdPartySharingResult); + } + }); + } + // Needs cost Boolean isCostDataInAttributionEnabled = AdjustBridgeUtil.fieldToBoolean(isCostDataInAttributionEnabledField); if (isCostDataInAttributionEnabled != null) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 7c0f276f5..c48e01482 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -623,10 +623,19 @@ public void run() { return true; } - private void updateThirdPartySharingSettingsI() { - final SharedPreferencesManager sharedPreferencesManager = - SharedPreferencesManager.getDefaultInstance(getContext()); - sharedPreferencesManager.saveThirdPartySharingResult(this.thirdPartySharingResult); + private boolean updateThirdPartySharingSettingsI(final AdjustThirdPartySharingResult thirdPartySharingResult) { + if (thirdPartySharingResult == null) { + return false; + } + + boolean thirdPartySharingSettingsChanged = !thirdPartySharingResult.equals(this.thirdPartySharingResult); + this.thirdPartySharingResult = thirdPartySharingResult; + + if (thirdPartySharingSettingsChanged) { + final SharedPreferencesManager sharedPreferencesManager = + SharedPreferencesManager.getDefaultInstance(getContext()); + sharedPreferencesManager.saveThirdPartySharingResult(this.thirdPartySharingResult); + } ArrayList cachedThirdPartySharingTimeoutCallbacksCopy = null; synchronized (cachedThirdPartySharingTimeoutCallbacks) { @@ -638,7 +647,7 @@ private void updateThirdPartySharingSettingsI() { // process third party sharing callbacks if (cachedThirdPartySharingTimeoutCallbacksCopy != null) { - final AdjustThirdPartySharingResult thirdPartySharingResultCopy = thirdPartySharingResult; + final AdjustThirdPartySharingResult thirdPartySharingResultCopy = this.thirdPartySharingResult; ArrayList finalCachedThirdPartySharingTimeoutCallbacksCopy = cachedThirdPartySharingTimeoutCallbacksCopy; new Handler(adjustConfig.context.getMainLooper()).post(new Runnable() { @Override @@ -663,6 +672,8 @@ public void run() { } }); } + + return thirdPartySharingSettingsChanged; } @Override @@ -2269,6 +2280,26 @@ public void run() { handler.post(runnable); } + private void launchThirdPartySharingSettingsChangedListenerI(Handler handler) { + if (adjustConfig.onThirdPartySharingSettingsChangedListener == null) { + return; + } + // add it to the handler queue + Runnable runnable = new Runnable() { + @Override + public void run() { + if (adjustConfig == null) { + return; + } + if (adjustConfig.onThirdPartySharingSettingsChangedListener == null) { + return; + } + adjustConfig.onThirdPartySharingSettingsChangedListener.onThirdPartySharingSettingsChanged(thirdPartySharingResult); + } + }; + handler.post(runnable); + } + private void launchPurchaseVerificationResponseTasksI(PurchaseVerificationResponseData purchaseVerificationResponseData) { // use the same handler to ensure that all tasks are executed sequentially Handler handler = new Handler(adjustConfig.context.getMainLooper()); @@ -2372,8 +2403,14 @@ private void launchThirdPartySharingResponseTasksI(final ThirdPartySharingRespon String tpsSettingsJsonString = tpsSettingsJson.toString(); - this.thirdPartySharingResult = new AdjustThirdPartySharingResult(tpsSettingsJsonString); - updateThirdPartySharingSettingsI(); + boolean thirdPartySharingSettingsChanged = + updateThirdPartySharingSettingsI(new AdjustThirdPartySharingResult(tpsSettingsJsonString)); + + // if third party sharing settings changed, launch third party sharing settings changed delegate + if (thirdPartySharingSettingsChanged) { + Handler handler = new Handler(adjustConfig.context.getMainLooper()); + launchThirdPartySharingSettingsChangedListenerI(handler); + } } private void prepareDeeplinkI(final Uri deeplink, final Handler handler) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index cb4ae8e94..ac8734047 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -20,6 +20,7 @@ public class AdjustConfig { String sdkPrefix; String defaultTracker; OnAttributionChangedListener onAttributionChangedListener; + OnThirdPartySharingSettingsChangedListener onThirdPartySharingSettingsChangedListener; OnEventTrackingSucceededListener onEventTrackingSucceededListener; OnEventTrackingFailedListener onEventTrackingFailedListener; OnSessionTrackingSucceededListener onSessionTrackingSucceededListener; @@ -178,6 +179,10 @@ public void setOnAttributionChangedListener(OnAttributionChangedListener onAttri this.onAttributionChangedListener = onAttributionChangedListener; } + public void setOnThirdPartySharingSettingsChangedListener(OnThirdPartySharingSettingsChangedListener onThirdPartySharingSettingsChangedListener) { + this.onThirdPartySharingSettingsChangedListener = onThirdPartySharingSettingsChangedListener; + } + public void setOnEventTrackingSucceededListener(OnEventTrackingSucceededListener onEventTrackingSucceededListener) { this.onEventTrackingSucceededListener = onEventTrackingSucceededListener; } @@ -286,6 +291,10 @@ public OnAttributionChangedListener getOnAttributionChangedListener() { return onAttributionChangedListener; } + public OnThirdPartySharingSettingsChangedListener getOnThirdPartySharingSettingsChangedListener() { + return onThirdPartySharingSettingsChangedListener; + } + public OnEventTrackingSucceededListener getOnEventTrackingSucceededListener() { return onEventTrackingSucceededListener; } @@ -386,4 +395,4 @@ public boolean isValid() { } return true; } -} \ No newline at end of file +} diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustThirdPartySharingResult.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustThirdPartySharingResult.java index 4ede13016..188104ca1 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustThirdPartySharingResult.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustThirdPartySharingResult.java @@ -14,4 +14,19 @@ public String getThirdPartySharingSettingsJson() { return thirdPartySharingSettingsJson; } + @Override + public boolean equals(Object other) { + if (other == null) return false; + if (other == this) return true; + if (!(other instanceof AdjustThirdPartySharingResult)) return false; + + AdjustThirdPartySharingResult otherResult = (AdjustThirdPartySharingResult) other; + return Util.equalString(thirdPartySharingSettingsJson, otherResult.thirdPartySharingSettingsJson); + } + + @Override + public int hashCode() { + return thirdPartySharingSettingsJson != null ? thirdPartySharingSettingsJson.hashCode() : 0; + } + } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnThirdPartySharingSettingsChangedListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnThirdPartySharingSettingsChangedListener.java new file mode 100644 index 000000000..d6755b8dc --- /dev/null +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnThirdPartySharingSettingsChangedListener.java @@ -0,0 +1,5 @@ +package com.adjust.sdk; + +public interface OnThirdPartySharingSettingsChangedListener { + void onThirdPartySharingSettingsChanged(AdjustThirdPartySharingResult adjustThirdPartySharingResult); +} From fb4b82d345500e46769ab3030375f9d973dab201 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 7 May 2026 16:30:07 +0200 Subject: [PATCH 493/540] add ability to test third party settings changed callback --- .../adjust/testapp/AdjustCommandExecutor.java | 17 +++++++++++++++++ .../src/main/assets/command_executor.js | 13 +++++++++++++ 2 files changed, 30 insertions(+) diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 4c17f5b44..43b78bfe1 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -27,6 +27,7 @@ import com.adjust.sdk.AdjustStoreInfo; import com.adjust.sdk.AdjustTestOptions; import com.adjust.sdk.AdjustThirdPartySharing; +import com.adjust.sdk.AdjustThirdPartySharingResult; import com.adjust.sdk.LogLevel; import com.adjust.sdk.OnAttributionChangedListener; import com.adjust.sdk.OnDeeplinkResolvedListener; @@ -38,6 +39,7 @@ import com.adjust.sdk.OnRemoteTriggerListener; import com.adjust.sdk.OnSessionTrackingFailedListener; import com.adjust.sdk.OnSessionTrackingSucceededListener; +import com.adjust.sdk.OnThirdPartySharingSettingsChangedListener; import com.adjust.test_options.TestConnectionOptions; import java.util.HashMap; @@ -397,6 +399,21 @@ public void onAttributionChanged(AdjustAttribution attribution) { }); } + if (command.containsParameter("thirdPartySharingSettingsChangedCallbackSendAll")) { + final String localBasePath = basePath; + adjustConfig.setOnThirdPartySharingSettingsChangedListener(new OnThirdPartySharingSettingsChangedListener() { + @Override + public void onThirdPartySharingSettingsChanged(AdjustThirdPartySharingResult result) { + Map fields = new HashMap<>(); + if (result != null && result.getThirdPartySharingSettingsJson() != null) { + fields.put("third_party_sharing_settings", result.getThirdPartySharingSettingsJson()); + } + MainActivity.testLibrary.setInfoToSend(fields); + MainActivity.testLibrary.sendInfoToServer(localBasePath); + } + }); + } + if (command.containsParameter("sessionCallbackSendSuccess")) { final String localBasePath = basePath; adjustConfig.setOnSessionTrackingSucceededListener(new OnSessionTrackingSucceededListener() { diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index d4b28f110..f70748d91 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -382,6 +382,19 @@ AdjustCommandExecutor.prototype.config = function(params) { }); } + if ('thirdPartySharingSettingsChangedCallbackSendAll' in params) { + var basePath = this.basePath; + adjustConfig.setThirdPartySharingSettingsChangedCallback(function(result) { + if (result != null) { + TestLibrary.addInfoToSend("third_party_sharing_settings", result.thirdPartySharingSettingsJson); + } else { + TestLibrary.addInfoToSend("third_party_sharing_settings", null); + } + + TestLibrary.sendInfoToServer(basePath); + }); + } + if ('sessionCallbackSendSuccess' in params) { var basePath = this.basePath; adjustConfig.setSessionSuccessCallback(function(sessionSuccess) { From d44b592cc442532c3b5acfbe0cd77d3df5715b86 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 11 May 2026 15:01:27 +0200 Subject: [PATCH 494/540] remove extra blank line in tps settings read listener --- .../com/adjust/sdk/OnThirdPartySharingSettingsReadListener.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnThirdPartySharingSettingsReadListener.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnThirdPartySharingSettingsReadListener.java index 2d8079c12..d47080663 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnThirdPartySharingSettingsReadListener.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/OnThirdPartySharingSettingsReadListener.java @@ -3,4 +3,3 @@ public interface OnThirdPartySharingSettingsReadListener { void onThirdPartySharingSettingsRead(AdjustThirdPartySharingResult adjustThirdPartySharingResult); } - From 15895b4ac271dd7a630cce9033337a24b24242c9 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Mon, 2 Feb 2026 09:51:15 +0100 Subject: [PATCH 495/540] feat: add is_system_app and is_updated_system_app parameters - StoreInfoUtil: add getIsSystemApp(Context) and getIsUpdatedSystemApp(Context) using ApplicationInfo.FLAG_SYSTEM and FLAG_UPDATED_SYSTEM_APP; return false on exception - DeviceInfo: add isSystemApp and isUpdatedSystemApp, set in constructor via StoreInfoUtil - PackageBuilder: in injectStoreInfoToParameters, add is_system_app and is_updated_system_app --- .../main/java/com/adjust/sdk/DeviceInfo.java | 4 +++ .../java/com/adjust/sdk/PackageBuilder.java | 2 ++ .../java/com/adjust/sdk/StoreInfoUtil.java | 25 +++++++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 276bd7e28..9642efd8c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -104,6 +104,8 @@ class DeviceInfo { String storeIdFromSystem; String initiatingPackageName; String originatingPackageName; + boolean isSystemApp; + boolean isUpdatedSystemApp; DeviceInfo(AdjustConfig adjustConfig) { Context context = adjustConfig.context; @@ -147,6 +149,8 @@ class DeviceInfo { storeIdFromSystem = StoreInfoUtil.getStoreIdFromSystem(context); initiatingPackageName = StoreInfoUtil.getInitiatingPackageName(context); originatingPackageName = StoreInfoUtil.getOriginatingPackageName(context); + isSystemApp = StoreInfoUtil.getIsSystemApp(context); + isUpdatedSystemApp = StoreInfoUtil.getIsUpdatedSystemApp(context); } void reloadPlayIds(final AdjustConfig adjustConfig) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index be35af358..961338852 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -1283,6 +1283,8 @@ private void injectStoreInfoToParameters(Map parameters) { PackageBuilder.addString(parameters, "store_name_from_system", deviceInfo.storeIdFromSystem); PackageBuilder.addString(parameters, "initiating_package_name", deviceInfo.initiatingPackageName); PackageBuilder.addString(parameters, "originating_package_name", deviceInfo.originatingPackageName); + PackageBuilder.addBoolean(parameters, "is_system_app", deviceInfo.isSystemApp); + PackageBuilder.addBoolean(parameters, "is_updated_system_app", deviceInfo.isUpdatedSystemApp); } public static void addString(Map parameters, String key, String value) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java index 0ca8436a4..bf2a787bc 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java @@ -8,6 +8,31 @@ import android.os.Bundle; public class StoreInfoUtil { + + public static boolean getIsSystemApp(final Context context) { + try { + ApplicationInfo ai = + context.getPackageManager().getApplicationInfo(context.getPackageName(), 0); + return (ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0; + } catch (PackageManager.NameNotFoundException e) { + return false; + } catch (Exception e) { + return false; + } + } + + public static boolean getIsUpdatedSystemApp(final Context context) { + try { + ApplicationInfo ai = + context.getPackageManager().getApplicationInfo(context.getPackageName(), 0); + return (ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; + } catch (PackageManager.NameNotFoundException e) { + return false; + } catch (Exception e) { + return false; + } + } + @SuppressWarnings("deprecation") public static String getStoreIdFromSystem(final Context context) { try { From 34a43761363cf5d4b319be7838713712aa50222f Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Wed, 6 May 2026 14:46:27 +0200 Subject: [PATCH 496/540] refac: simplify exception handling by removing redundant NameNotFoundException catches. --- .../sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java index bf2a787bc..e9ad3bf4d 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java @@ -14,8 +14,6 @@ public static boolean getIsSystemApp(final Context context) { ApplicationInfo ai = context.getPackageManager().getApplicationInfo(context.getPackageName(), 0); return (ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0; - } catch (PackageManager.NameNotFoundException e) { - return false; } catch (Exception e) { return false; } @@ -26,8 +24,6 @@ public static boolean getIsUpdatedSystemApp(final Context context) { ApplicationInfo ai = context.getPackageManager().getApplicationInfo(context.getPackageName(), 0); return (ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; - } catch (PackageManager.NameNotFoundException e) { - return false; } catch (Exception e) { return false; } From 9179bb47f55521af0acf4e58080db7a2f20a757c Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Thu, 7 May 2026 10:03:02 +0200 Subject: [PATCH 497/540] return null when system app flag lookup fails --- .../sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java | 4 ++-- .../src/main/java/com/adjust/sdk/StoreInfoUtil.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 9642efd8c..afc314e5f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -104,8 +104,8 @@ class DeviceInfo { String storeIdFromSystem; String initiatingPackageName; String originatingPackageName; - boolean isSystemApp; - boolean isUpdatedSystemApp; + Boolean isSystemApp; + Boolean isUpdatedSystemApp; DeviceInfo(AdjustConfig adjustConfig) { Context context = adjustConfig.context; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java index e9ad3bf4d..fa0e688f9 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java @@ -9,23 +9,23 @@ public class StoreInfoUtil { - public static boolean getIsSystemApp(final Context context) { + public static Boolean getIsSystemApp(final Context context) { try { ApplicationInfo ai = context.getPackageManager().getApplicationInfo(context.getPackageName(), 0); return (ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0; } catch (Exception e) { - return false; + return null; } } - public static boolean getIsUpdatedSystemApp(final Context context) { + public static Boolean getIsUpdatedSystemApp(final Context context) { try { ApplicationInfo ai = context.getPackageManager().getApplicationInfo(context.getPackageName(), 0); return (ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; } catch (Exception e) { - return false; + return null; } } From e135941751b54362a0f42e2ea44bfdbdff5b4019 Mon Sep 17 00:00:00 2001 From: Mahdi ZTD Date: Tue, 12 May 2026 10:51:27 +0200 Subject: [PATCH 498/540] refac: Return null for non-system-apps/non-updated-system-app in StoreInfoUtil --- .../src/main/assets/adjust_config.js | 6 +++--- .../adjust/sdk/webbridge/AdjustBridgeInstance.java | 12 ++++++------ .../src/main/java/com/adjust/sdk/AdjustConfig.java | 12 ++++++------ .../src/main/java/com/adjust/sdk/DeviceInfo.java | 2 +- .../src/main/java/com/adjust/sdk/PackageBuilder.java | 4 ++-- .../src/main/java/com/adjust/sdk/StoreInfoUtil.java | 8 ++++++-- .../sdk-core/src/main/java/com/adjust/sdk/Util.java | 6 +++--- .../com/adjust/testapp/AdjustCommandExecutor.java | 10 +++++----- 8 files changed, 32 insertions(+), 28 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js index 84d8efd20..3a9bb4532 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -58,7 +58,7 @@ function AdjustConfig(appToken, environment, legacy) { this.isFirstSessionDelayEnabled = null; this.storeInfo = null; this.isAppSetIdReadingEnabled = null; - this.isFbAidReadingEnabled = null; + this.isFbIdReadingEnabled = null; } AdjustConfig.EnvironmentSandbox = 'sandbox'; @@ -289,6 +289,6 @@ AdjustConfig.prototype.disableAppSetIdReading = function() { this.isAppSetIdReadingEnabled = false; }; -AdjustConfig.prototype.disableFbAidReading = function() { - this.isFbAidReadingEnabled = false; +AdjustConfig.prototype.disableFbIdReading = function() { + this.isFbIdReadingEnabled = false; }; diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 51ce73630..d190c3c34 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -191,7 +191,7 @@ public void initSdk(String adjustConfigString, String bridgeToken) { Object isFirstSessionDelayEnabledField = jsonAdjustConfig.get("isFirstSessionDelayEnabled"); Object storeInfoField = jsonAdjustConfig.get("storeInfo"); Object isAppSetIdReadingEnabledField = jsonAdjustConfig.get("isAppSetIdReadingEnabled"); - Object isFbAidReadingEnabledField = jsonAdjustConfig.get("isFbAidReadingEnabled"); + Object isFbIdReadingEnabledField = jsonAdjustConfig.get("isFbIdReadingEnabled"); String appToken = AdjustBridgeUtil.fieldToString(appTokenField); String environment = AdjustBridgeUtil.fieldToString(environmentField); @@ -477,11 +477,11 @@ public void onRemoteTrigger(AdjustRemoteTrigger remoteTrigger) { } } - // FbAid reading - Boolean isFbAidReadingEnabled = AdjustBridgeUtil.fieldToBoolean(isFbAidReadingEnabledField); - if (isFbAidReadingEnabled != null) { - if (!isFbAidReadingEnabled) { - adjustConfig.disableFbAidReading(); + // FbId reading + Boolean isFbIdReadingEnabled = AdjustBridgeUtil.fieldToBoolean(isFbIdReadingEnabledField); + if (isFbIdReadingEnabled != null) { + if (!isFbIdReadingEnabled) { + adjustConfig.disableFbIdReading(); } } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index ac8734047..af7b21a03 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -54,7 +54,7 @@ public class AdjustConfig { boolean isFirstSessionDelayEnabled; AdjustStoreInfo storeInfo; boolean isAppSetIdReadingEnabled; - boolean isFbAidReadingEnabled; + boolean isFbIdReadingEnabled; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; @@ -94,7 +94,7 @@ private void init(Context context, String appToken, String environment, boolean this.playStoreKidsComplianceEnabled = false; this.isFirstSessionDelayEnabled = false; this.isAppSetIdReadingEnabled = true; - this.isFbAidReadingEnabled = true; + this.isFbIdReadingEnabled = true; } public void setLogLevel(LogLevel logLevel) { @@ -211,8 +211,8 @@ public void disableAppSetIdReading() { this.isAppSetIdReadingEnabled = false; } - public void disableFbAidReading() { - this.isFbAidReadingEnabled = false; + public void disableFbIdReading() { + this.isFbIdReadingEnabled = false; } public Context getContext() { @@ -327,8 +327,8 @@ public boolean isAppSetIdReadingEnabled() { return isAppSetIdReadingEnabled; } - public boolean isFbAidReadingEnabled() { - return isFbAidReadingEnabled; + public boolean isFbIdReadingEnabled() { + return isFbIdReadingEnabled; } private boolean checkContext(Context context) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index afc314e5f..9a6601df0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -133,7 +133,7 @@ class DeviceInfo { displayWidth = getDisplayWidth(displayMetrics); displayHeight = getDisplayHeight(displayMetrics); clientSdk = getClientSdk(adjustConfig.sdkPrefix); - if (Util.canReadFbAid(adjustConfig)) { + if (Util.canReadFbId(adjustConfig)) { fbAttributionId = getFacebookAttributionId(context); } hardwareName = getHardwareName(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 961338852..0788b3d42 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -1266,8 +1266,8 @@ private void injectFeatureFlagsWithParameters(Map parameters) { PackageBuilder.addBoolean(parameters, "ff_app_set_id_disabled", true); } - if (!adjustConfig.isFbAidReadingEnabled) { - PackageBuilder.addBoolean(parameters, "ff_fb_aid_disabled", true); + if (!adjustConfig.isFbIdReadingEnabled) { + PackageBuilder.addBoolean(parameters, "ff_fb_id_disabled", true); } if (adjustConfig.onRemoteTriggerListener != null) { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java index fa0e688f9..8319011c3 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/StoreInfoUtil.java @@ -13,7 +13,9 @@ public static Boolean getIsSystemApp(final Context context) { try { ApplicationInfo ai = context.getPackageManager().getApplicationInfo(context.getPackageName(), 0); - return (ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0; + return ((ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0) + ? Boolean.TRUE + : null; } catch (Exception e) { return null; } @@ -23,7 +25,9 @@ public static Boolean getIsUpdatedSystemApp(final Context context) { try { ApplicationInfo ai = context.getPackageManager().getApplicationInfo(context.getPackageName(), 0); - return (ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; + return ((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) + ? Boolean.TRUE + : null; } catch (Exception e) { return null; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index 85594248b..f0303a57b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -695,8 +695,8 @@ public static boolean canReadAppSetId(final AdjustConfig adjustConfig) { return canReadPlayIds(adjustConfig); } - public static boolean canReadFbAid(final AdjustConfig adjustConfig) { - if (!adjustConfig.isFbAidReadingEnabled) { + public static boolean canReadFbId(final AdjustConfig adjustConfig) { + if (!adjustConfig.isFbIdReadingEnabled) { return false; } return canReadNonPlayIds(adjustConfig); @@ -838,4 +838,4 @@ public static AdjustAttribution getAttributionFromAttributionFile(final Context "Attribution", AdjustAttribution.class); } -} \ No newline at end of file +} diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 43b78bfe1..c189d1ec6 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -545,11 +545,11 @@ public void onRemoteTrigger(AdjustRemoteTrigger trigger) { } } - if (command.containsParameter("fbAidReadingEnabled")) { - String fbAidReadingEnabledS = command.getFirstParameterValue("fbAidReadingEnabled"); - boolean fbAidReadingEnabled = "true".equals(fbAidReadingEnabledS); - if (!fbAidReadingEnabled) { - adjustConfig.disableFbAidReading(); + if (command.containsParameter("fbIdReadingEnabled")) { + String fbIdReadingEnabledS = command.getFirstParameterValue("fbIdReadingEnabled"); + boolean fbIdReadingEnabled = "true".equals(fbIdReadingEnabledS); + if (!fbIdReadingEnabled) { + adjustConfig.disableFbIdReading(); } } } From 465552ab50767bb8344ab1e5396fd000b0efe9eb Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 17 Apr 2026 14:05:12 +0200 Subject: [PATCH 499/540] avoid d8 crash in android test library --- .../main/java/com/adjust/test/Networking.java | 53 ++++++++------- .../java/com/adjust/test/TestLibrary.java | 66 ++++++++++++++----- 2 files changed, 78 insertions(+), 41 deletions(-) diff --git a/Adjust/tests/test-library/src/main/java/com/adjust/test/Networking.java b/Adjust/tests/test-library/src/main/java/com/adjust/test/Networking.java index da9a690a2..36e60dea4 100644 --- a/Adjust/tests/test-library/src/main/java/com/adjust/test/Networking.java +++ b/Adjust/tests/test-library/src/main/java/com/adjust/test/Networking.java @@ -36,6 +36,34 @@ import javax.net.ssl.X509TrustManager; public class Networking { + private static final class DebugTrustManager implements X509TrustManager { + @Override + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + debug("getAcceptedIssuers"); + + return null; + } + + @Override + public void checkClientTrusted( + java.security.cert.X509Certificate[] certs, String authType) { + debug("checkClientTrusted"); + } + + @Override + public void checkServerTrusted( + java.security.cert.X509Certificate[] certs, String authType) { + debug("checkServerTrusted"); + } + } + + private static final class AllowAllHostnameVerifier implements HostnameVerifier { + @Override + public boolean verify(String hostname, SSLSession session) { + return true; + } + } + public static class Response { public String response = null; public Integer responseCode = null; @@ -63,30 +91,9 @@ public Networking(final String baseUrl, final Context context) { this.fingerprint = fingerprint(context); trustAllCerts = new TrustManager[]{ - new X509TrustManager() { - public java.security.cert.X509Certificate[] getAcceptedIssuers() { - debug("getAcceptedIssuers"); - - return null; - } - - public void checkClientTrusted( - java.security.cert.X509Certificate[] certs, String authType) { - debug("checkClientTrusted"); - } - - public void checkServerTrusted( - java.security.cert.X509Certificate[] certs, String authType) { - debug("checkServerTrusted"); - } - } - }; - hostnameVerifier = new HostnameVerifier() { - @Override - public boolean verify(String hostname, SSLSession session) { - return true; - } + new DebugTrustManager() }; + hostnameVerifier = new AllowAllHostnameVerifier(); } // endregion diff --git a/Adjust/tests/test-library/src/main/java/com/adjust/test/TestLibrary.java b/Adjust/tests/test-library/src/main/java/com/adjust/test/TestLibrary.java index da1a5c7c7..535febb73 100644 --- a/Adjust/tests/test-library/src/main/java/com/adjust/test/TestLibrary.java +++ b/Adjust/tests/test-library/src/main/java/com/adjust/test/TestLibrary.java @@ -32,6 +32,51 @@ */ public class TestLibrary { + private static final class StartTestSessionRunnable implements Runnable { + private final TestLibrary testLibrary; + private final String clientSdk; + + private StartTestSessionRunnable(TestLibrary testLibrary, String clientSdk) { + this.testLibrary = testLibrary; + this.clientSdk = clientSdk; + } + + @Override + public void run() { + testLibrary.startTestSessionI(clientSdk); + } + } + + private static final class CancelTestAndGetNextRunnable implements Runnable { + private final TestLibrary testLibrary; + + private CancelTestAndGetNextRunnable(TestLibrary testLibrary) { + this.testLibrary = testLibrary; + } + + @Override + public void run() { + testLibrary.readResponseI(testLibrary.networking.sendPost("/end_test_read_next", testLibrary.currentBasePath)); + } + } + + private static final class SendInfoToServerRunnable implements Runnable { + private final TestLibrary testLibrary; + private final String basePath; + private final Map infoSnapshot; + + private SendInfoToServerRunnable(TestLibrary testLibrary, String basePath, Map infoSnapshot) { + this.testLibrary = testLibrary; + this.basePath = basePath; + this.infoSnapshot = infoSnapshot; + } + + @Override + public void run() { + testLibrary.sendInfoToServerI(basePath, infoSnapshot); + } + } + private String controlUrl; private Networking networking; private Gson gson = new Gson(); @@ -120,12 +165,7 @@ public void startTestSession(final String clientSdk) { SystemClock.sleep(ONE_SECOND); } - executor.submit(new Runnable() { - @Override - public void run() { - startTestSessionI(clientSdk); - } - }); + executor.submit(new StartTestSessionRunnable(this, clientSdk)); } public void setOnExitListener(IOnExitListener onExitListener) { @@ -138,12 +178,7 @@ public void signalEndWait(String reason) { public void cancelTestAndGetNext() { resetTestLibrary(); - executor.submit(new Runnable() { - @Override - public void run() { - readResponseI(networking.sendPost("/end_test_read_next", currentBasePath)); - } - }); + executor.submit(new CancelTestAndGetNextRunnable(this)); } public void addInfoToSend(String key, String value) { @@ -175,12 +210,7 @@ public void sendInfoToServer(final String basePath) { infoToServer = null; } - executor.submit(new Runnable() { - @Override - public void run() { - sendInfoToServerI(basePath, infoSnapshot); - } - }); + executor.submit(new SendInfoToServerRunnable(this, basePath, infoSnapshot)); } private void startTestSessionI(String clientSdk) { From fd7f40af12fecacffa86432c1f4559ad3c3e8ef4 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 12 May 2026 13:15:12 +0200 Subject: [PATCH 500/540] feat: update version number to 5.7.0 --- Adjust/build.gradle | 2 +- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-imei/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-oaid/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java | 2 +- VERSION | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 735e308a1..6a8688256 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 36 coreTargetSdkVersion = 36 - coreVersionName = '5.6.1' + coreVersionName = '5.7.0' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index b8c28fc23..75ce5c187 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.6.1' + // implementation 'com.adjust.sdk:adjust-android:5.7.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index d133e53db..b2faf85bd 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.6.1' + // implementation 'com.adjust.sdk:adjust-android:5.7.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index 212252553..7a407343f 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.6.1' + // implementation 'com.adjust.sdk:adjust-android:5.7.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index 2f41bd2b3..196ce0c81 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.6.1' + // implementation 'com.adjust.sdk:adjust-android:5.7.0' implementation 'com.huawei.hms:ads-identifier:3.4.56.300' } diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index 582c61656..7fb8e581f 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.6.1' + // implementation 'com.adjust.sdk:adjust-android:5.7.0' // Add Samsung clouddev lib. compileOnly fileTree(include: ['*.aar'], dir: 'libs') diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index 2f72704fc..e7746f695 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -27,7 +27,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.6.1' + // implementation 'com.adjust.sdk:adjust-android:5.7.0' // Add Samsung referrer lib via Maven. implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:3.0.1' diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index 74fb208da..21d923d6c 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.6.1' + // implementation 'com.adjust.sdk:adjust-android:5.7.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index 28180f363..8bf569029 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.6.1' + // implementation 'com.adjust.sdk:adjust-android:5.7.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 86e4ff356..16e9ada5f 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -369,7 +369,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge5.6.1'; + return 'web-bridge5.7.0'; } }, diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index aa5eb25b9..b04f8df83 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -31,7 +31,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.6.1' + // implementation 'com.adjust.sdk:adjust-android:5.7.0' // Add xiaomi referrer lib via Maven. implementation 'com.miui.referrer:homereferrer:1.0.0.6' diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 1ebe73a03..7182972ff 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -31,7 +31,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.6.1"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.7.0"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 340576eb8..1d94f0393 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -38,7 +38,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android5.6.1"; + String CLIENT_SDK = "android5.7.0"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/VERSION b/VERSION index b7c75422b..42cdd0b54 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.6.1 +5.7.0 From 2add581ac49935504f8a37ab1edd33d44a9f4e1a Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 12 May 2026 13:18:14 +0200 Subject: [PATCH 501/540] docs: update CHANGELOG --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81d225cba..12783b0d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +### Version 5.7.0 (12th May 2026) +#### Added +- Added `getThirdPartySharingSettingsWithTimeout` to the `Adjust` API and `setOnThirdPartySharingSettingsChangedListener` to `AdjustConfig` to enable receiving the current third-party-sharing settings provided by the Adjust backend. +- Added support for sending parameters to identify pre-installed apps. + +--- + ### Version 5.6.1 (16th April 2026) #### Changed - Updated the Adjust Signature library version to 3.67.0. From 74720ab50f9b6956558f6bf11c4f4fbe07853d05 Mon Sep 17 00:00:00 2001 From: Shashank Suhane <46443728+shashanksu@users.noreply.github.com> Date: Tue, 12 May 2026 13:32:45 +0200 Subject: [PATCH 502/540] Update CHANGELOG.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Uglješa Erceg --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12783b0d9..330da01be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ### Version 5.7.0 (12th May 2026) #### Added -- Added `getThirdPartySharingSettingsWithTimeout` to the `Adjust` API and `setOnThirdPartySharingSettingsChangedListener` to `AdjustConfig` to enable receiving the current third-party-sharing settings provided by the Adjust backend. +- Added `getThirdPartySharingSettingsWithTimeout` to the `Adjust` API and `setOnThirdPartySharingSettingsChangedListener` to `AdjustConfig` for reading current third-party-sharing settings from the Adjust backend. - Added support for sending parameters to identify pre-installed apps. --- From 2cfca6f530af850c3d8348294429670a03f2142d Mon Sep 17 00:00:00 2001 From: Shashank Suhane <46443728+shashanksu@users.noreply.github.com> Date: Tue, 12 May 2026 13:32:57 +0200 Subject: [PATCH 503/540] Update CHANGELOG.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Uglješa Erceg --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 330da01be..b3ab5bb0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ ### Version 5.7.0 (12th May 2026) #### Added - Added `getThirdPartySharingSettingsWithTimeout` to the `Adjust` API and `setOnThirdPartySharingSettingsChangedListener` to `AdjustConfig` for reading current third-party-sharing settings from the Adjust backend. -- Added support for sending parameters to identify pre-installed apps. +- Added support for sending parameters that identify preinstalled Android system apps. --- From fd417645c6c4bc366e91b9f25fa945cc92d4a6c0 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 3 Aug 2026 18:11:03 +0200 Subject: [PATCH 504/540] feat: add Samsung preinstall maps solution --- Adjust/sdk-core/src/main/AndroidManifest.xml | 4 + .../java/com/adjust/sdk/ActivityHandler.java | 14 +++ .../main/java/com/adjust/sdk/Constants.java | 1 + .../java/com/adjust/sdk/PreinstallUtil.java | 96 +++++++++++++++++-- 4 files changed, 106 insertions(+), 9 deletions(-) diff --git a/Adjust/sdk-core/src/main/AndroidManifest.xml b/Adjust/sdk-core/src/main/AndroidManifest.xml index 648a2271d..253d2ad93 100644 --- a/Adjust/sdk-core/src/main/AndroidManifest.xml +++ b/Adjust/sdk-core/src/main/AndroidManifest.xml @@ -2,6 +2,10 @@ + + + + getPayloadsFromContentProviderNoPermission( logger); } + public static String getPayloadFromContentProviderSamsungMaps(final Context context, + final String packageName, + final ILogger logger) + { + if (!Util.resolveContentProvider(context, "com.samsung.android.mapsagent.providers.apptracking")) { + return null; + } + + JSONObject appTrackingInfoJsonObject = getSamsungMapsAppTrackingInfo(context, packageName, logger); + if (appTrackingInfoJsonObject == null || appTrackingInfoJsonObject.length() <= 0) { + return null; + } + + boolean result = Boolean.parseBoolean(appTrackingInfoJsonObject.optString("RESULT", "false")); + if (!result) { + return null; + } + + try { + String appTrackingInfoJsonString = appTrackingInfoJsonObject.toString(); + String base64EncodedAppTrackingInfo = Base64.encodeToString(appTrackingInfoJsonString.getBytes(StandardCharsets.UTF_8), Base64.NO_WRAP); + if (base64EncodedAppTrackingInfo == null || base64EncodedAppTrackingInfo.isEmpty()) { + return null; + } + + JSONObject payloadJsonObject = new JSONObject(); + payloadJsonObject.put("provider", "samsung_maps"); + payloadJsonObject.put("details", base64EncodedAppTrackingInfo); + + return payloadJsonObject.toString(); + } catch (Exception e) { + logger.error("Samsung MAPS Exception during payload json object creation from content provider Samsung maps [%s]", e.getMessage()); + } + + return null; + } + + private static JSONObject getSamsungMapsAppTrackingInfo(Context context, String packageName, ILogger logger) { + try { + Uri contentUri = Uri.parse("content://com.samsung.android.mapsagent.providers.apptracking/info"); + Cursor cursor = context.getContentResolver().query(contentUri, null, packageName, new String[]{"ADJUSTSS0001"}, null); + + if (cursor == null) { + return null; + } + + if (!cursor.moveToFirst()) { + cursor.close(); + return null; + } + + JSONObject jsonObject = new JSONObject(); + + for (int col = 0; col < cursor.getColumnCount(); col++) { + jsonObject.put(cursor.getColumnName(col), cursor.getString(col)); + } + cursor.close(); + if (jsonObject.length() <= 0) { + return null; + } + + return jsonObject; + + } catch (Exception e) { + logger.error("Samsung MAPS exception read content provider error [%s]", e.getMessage()); + } + + return null; + } + public static String getPayloadFromFileSystem(final String packageName, final String filePath, final ILogger logger) From 68d77ba2d5200f2c711962373bc744a7501e8cd6 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 4 Aug 2026 14:09:07 +0200 Subject: [PATCH 505/540] feat: moving the permission and queries for samsung maps to client integration docs --- Adjust/sdk-core/src/main/AndroidManifest.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Adjust/sdk-core/src/main/AndroidManifest.xml b/Adjust/sdk-core/src/main/AndroidManifest.xml index 253d2ad93..648a2271d 100644 --- a/Adjust/sdk-core/src/main/AndroidManifest.xml +++ b/Adjust/sdk-core/src/main/AndroidManifest.xml @@ -2,10 +2,6 @@ - - - - Date: Tue, 4 Aug 2026 16:25:01 +0200 Subject: [PATCH 506/540] fix: closing cursor in all cases + extracting constants --- .../main/java/com/adjust/sdk/Constants.java | 5 +++++ .../java/com/adjust/sdk/PreinstallUtil.java | 20 ++++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 8445dd5dd..5c50c7bc2 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -105,6 +105,11 @@ public interface Constants { String ADJUST_PREINSTALL_FILE_SYSTEM_PATH = "/data/local/tmp/adjust.preinstall"; String EXTRA_SYSTEM_INSTALLER_REFERRER = "com.attribution.EXTRA_SYSTEM_INSTALLER_REFERRER"; + String SAMSUNG_PREINSTALL_CONTENT_URI_AUTHORITY = "com.samsung.android.mapsagent.providers.apptracking"; + String SAMSUNG_PREINSTALL_CONTENT_URI_PATH = "info"; + String SAMSUNG_PREINSTALL_APP_TRACKING_ID = "ADJUSTSS0001"; + String SAMSUNG_PREINSTALL_PAYLOAD_PROVIDER = "samsung_maps"; + String ADID_TIMEOUT_TIMER_NAME = "Get Adid timeout timer"; String ATTRIBUTION_TIMEOUT_TIMER_NAME = "Get Attribution timeout timer"; String TPS_SETTINGS_TIMEOUT_TIMER_NAME = "Get Third party sharing settings timeout timer"; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PreinstallUtil.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PreinstallUtil.java index d98441bfa..4c7db8cca 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PreinstallUtil.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PreinstallUtil.java @@ -27,6 +27,10 @@ import static com.adjust.sdk.Constants.ADJUST_PREINSTALL_FILE_SYSTEM_PATH; import static com.adjust.sdk.Constants.ADJUST_PREINSTALL_CONTENT_URI_AUTHORITY; import static com.adjust.sdk.Constants.ADJUST_PREINSTALL_CONTENT_URI_PATH; +import static com.adjust.sdk.Constants.SAMSUNG_PREINSTALL_APP_TRACKING_ID; +import static com.adjust.sdk.Constants.SAMSUNG_PREINSTALL_CONTENT_URI_AUTHORITY; +import static com.adjust.sdk.Constants.SAMSUNG_PREINSTALL_CONTENT_URI_PATH; +import static com.adjust.sdk.Constants.SAMSUNG_PREINSTALL_PAYLOAD_PROVIDER; public class PreinstallUtil { @@ -195,7 +199,7 @@ public static String getPayloadFromContentProviderSamsungMaps(final Context cont final String packageName, final ILogger logger) { - if (!Util.resolveContentProvider(context, "com.samsung.android.mapsagent.providers.apptracking")) { + if (!Util.resolveContentProvider(context, SAMSUNG_PREINSTALL_CONTENT_URI_AUTHORITY)) { return null; } @@ -217,7 +221,7 @@ public static String getPayloadFromContentProviderSamsungMaps(final Context cont } JSONObject payloadJsonObject = new JSONObject(); - payloadJsonObject.put("provider", "samsung_maps"); + payloadJsonObject.put("provider", SAMSUNG_PREINSTALL_PAYLOAD_PROVIDER); payloadJsonObject.put("details", base64EncodedAppTrackingInfo); return payloadJsonObject.toString(); @@ -229,9 +233,11 @@ public static String getPayloadFromContentProviderSamsungMaps(final Context cont } private static JSONObject getSamsungMapsAppTrackingInfo(Context context, String packageName, ILogger logger) { + Cursor cursor = null; try { - Uri contentUri = Uri.parse("content://com.samsung.android.mapsagent.providers.apptracking/info"); - Cursor cursor = context.getContentResolver().query(contentUri, null, packageName, new String[]{"ADJUSTSS0001"}, null); + String contentUriString = Util.formatString("content://%s/%s", SAMSUNG_PREINSTALL_CONTENT_URI_AUTHORITY, SAMSUNG_PREINSTALL_CONTENT_URI_PATH); + Uri contentUri = Uri.parse(contentUriString); + cursor = context.getContentResolver().query(contentUri, null, packageName, new String[]{SAMSUNG_PREINSTALL_APP_TRACKING_ID}, null); if (cursor == null) { return null; @@ -255,7 +261,11 @@ private static JSONObject getSamsungMapsAppTrackingInfo(Context context, String return jsonObject; } catch (Exception e) { - logger.error("Samsung MAPS exception read content provider error [%s]", e.getMessage()); + logger.error("Samsung MAPS Exception read content provider error [%s]", e.getMessage()); + } finally { + if (cursor != null) { + cursor.close(); + } } return null; From 525020a7b4d9bcfab7128d405ba4a7ff659c84d0 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 30 Jun 2026 13:06:39 +0200 Subject: [PATCH 507/540] feat: update compile and target Sdk to API 37 --- Adjust/build.gradle | 4 ++-- Adjust/examples/example-app-fbpixel/build.gradle | 4 ++-- Adjust/examples/example-app-java/build.gradle | 4 ++-- Adjust/examples/example-app-keyboard/build.gradle | 4 ++-- Adjust/examples/example-app-kotlin/build.gradle | 4 ++-- Adjust/examples/example-app-tv/build.gradle | 4 ++-- Adjust/examples/example-app-webbridge/build.gradle | 4 ++-- Adjust/gradle/wrapper/gradle-wrapper.properties | 2 +- Adjust/tests/test-app-core/build.gradle | 4 ++-- Adjust/tests/test-app-webbridge/build.gradle | 4 ++-- Adjust/tests/test-library/build.gradle | 4 ++-- Adjust/tests/test-options/build.gradle | 4 ++-- 12 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 6a8688256..754703001 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -7,8 +7,8 @@ subprojects { ext { // Android config. coreMinSdkVersion = 21 - coreCompileSdkVersion = 36 - coreTargetSdkVersion = 36 + coreCompileSdkVersion = 37 + coreTargetSdkVersion = 37 coreVersionName = '5.7.0' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 diff --git a/Adjust/examples/example-app-fbpixel/build.gradle b/Adjust/examples/example-app-fbpixel/build.gradle index f00648460..a07084e5c 100644 --- a/Adjust/examples/example-app-fbpixel/build.gradle +++ b/Adjust/examples/example-app-fbpixel/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdk 36 + compileSdk 37 defaultConfig { applicationId "com.adjust.examples" minSdkVersion 21 - targetSdkVersion 36 + targetSdkVersion 37 versionCode 1 versionName "1.0" } diff --git a/Adjust/examples/example-app-java/build.gradle b/Adjust/examples/example-app-java/build.gradle index a8e9acd93..016ba917e 100644 --- a/Adjust/examples/example-app-java/build.gradle +++ b/Adjust/examples/example-app-java/build.gradle @@ -7,12 +7,12 @@ repositories { } android { - compileSdk 36 + compileSdk 37 defaultConfig { applicationId "com.adjust.examples" minSdkVersion 21 - targetSdkVersion 36 + targetSdkVersion 37 versionCode 1 versionName "1.0" } diff --git a/Adjust/examples/example-app-keyboard/build.gradle b/Adjust/examples/example-app-keyboard/build.gradle index e7e7d1f5b..cd84b7bd2 100644 --- a/Adjust/examples/example-app-keyboard/build.gradle +++ b/Adjust/examples/example-app-keyboard/build.gradle @@ -7,12 +7,12 @@ repositories { } android { - compileSdk 36 + compileSdk 37 defaultConfig { applicationId "com.adjust.examples.keyboard" minSdkVersion 21 - targetSdkVersion 36 + targetSdkVersion 37 versionCode 1 versionName "1.0" } diff --git a/Adjust/examples/example-app-kotlin/build.gradle b/Adjust/examples/example-app-kotlin/build.gradle index ed9d4886f..6a2b2d85d 100644 --- a/Adjust/examples/example-app-kotlin/build.gradle +++ b/Adjust/examples/example-app-kotlin/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' android { - compileSdk 36 + compileSdk 37 defaultConfig { applicationId "com.adjust.examples" minSdkVersion 21 - targetSdkVersion 36 + targetSdkVersion 37 versionCode 1 versionName "1.0" diff --git a/Adjust/examples/example-app-tv/build.gradle b/Adjust/examples/example-app-tv/build.gradle index a8e9acd93..016ba917e 100755 --- a/Adjust/examples/example-app-tv/build.gradle +++ b/Adjust/examples/example-app-tv/build.gradle @@ -7,12 +7,12 @@ repositories { } android { - compileSdk 36 + compileSdk 37 defaultConfig { applicationId "com.adjust.examples" minSdkVersion 21 - targetSdkVersion 36 + targetSdkVersion 37 versionCode 1 versionName "1.0" } diff --git a/Adjust/examples/example-app-webbridge/build.gradle b/Adjust/examples/example-app-webbridge/build.gradle index 12263d75d..7877fb4f2 100644 --- a/Adjust/examples/example-app-webbridge/build.gradle +++ b/Adjust/examples/example-app-webbridge/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdk 36 + compileSdk 37 defaultConfig { applicationId "com.example.examples" minSdkVersion 21 - targetSdkVersion 36 + targetSdkVersion 37 versionCode 1 versionName "1.0" } diff --git a/Adjust/gradle/wrapper/gradle-wrapper.properties b/Adjust/gradle/wrapper/gradle-wrapper.properties index a1614819e..52a427713 100644 --- a/Adjust/gradle/wrapper/gradle-wrapper.properties +++ b/Adjust/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Oct 06 12:16:52 CEST 2023 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/Adjust/tests/test-app-core/build.gradle b/Adjust/tests/test-app-core/build.gradle index d70842068..5067c6c8f 100644 --- a/Adjust/tests/test-app-core/build.gradle +++ b/Adjust/tests/test-app-core/build.gradle @@ -7,12 +7,12 @@ repositories { } android { - compileSdk 36 + compileSdk 37 defaultConfig { applicationId "com.adjust.testapp" minSdkVersion 21 - targetSdkVersion 36 + targetSdkVersion 37 versionCode 1 versionName "1.0" } diff --git a/Adjust/tests/test-app-webbridge/build.gradle b/Adjust/tests/test-app-webbridge/build.gradle index d89047c7c..ae7b037eb 100644 --- a/Adjust/tests/test-app-webbridge/build.gradle +++ b/Adjust/tests/test-app-webbridge/build.gradle @@ -7,12 +7,12 @@ repositories { } android { - compileSdk 36 + compileSdk 37 defaultConfig { applicationId "com.example.testappwebbridge" minSdkVersion 21 - targetSdkVersion 36 + targetSdkVersion 37 versionCode 1 versionName "1.0" } diff --git a/Adjust/tests/test-library/build.gradle b/Adjust/tests/test-library/build.gradle index 5d482ea40..43be2df9c 100644 --- a/Adjust/tests/test-library/build.gradle +++ b/Adjust/tests/test-library/build.gradle @@ -1,11 +1,11 @@ apply plugin: 'com.android.library' android { - compileSdk 36 + compileSdk 37 defaultConfig { minSdkVersion 21 - targetSdkVersion 36 + targetSdkVersion 37 } namespace 'com.adjust.test_library' } diff --git a/Adjust/tests/test-options/build.gradle b/Adjust/tests/test-options/build.gradle index db4a52786..0b3e5599c 100644 --- a/Adjust/tests/test-options/build.gradle +++ b/Adjust/tests/test-options/build.gradle @@ -3,11 +3,11 @@ plugins { } android { - compileSdk 36 + compileSdk 37 defaultConfig { minSdkVersion 21 - targetSdkVersion 36 + targetSdkVersion 37 } namespace 'com.adjust.test_options' } From e036c447d0883fe588427496680557d7de255a01 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 30 Jun 2026 13:13:37 +0200 Subject: [PATCH 508/540] fix: avoid exception thrown when storeInfoString is null --- .../sdk/webbridge/AdjustBridgeInstance.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index d190c3c34..549ce690e 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -453,18 +453,20 @@ public void onRemoteTrigger(AdjustRemoteTrigger remoteTrigger) { String storeInfoString = AdjustBridgeUtil.fieldToString(storeInfoField); try { - JSONObject jsonStoreInfo = new JSONObject(storeInfoString); + if (storeInfoString != null) { + JSONObject jsonStoreInfo = new JSONObject(storeInfoString); - Object storeNameField = jsonStoreInfo.get("storeName"); - Object storeAppIdField = jsonStoreInfo.get("storeAppId"); + Object storeNameField = jsonStoreInfo.get("storeName"); + Object storeAppIdField = jsonStoreInfo.get("storeAppId"); - String storeName = AdjustBridgeUtil.fieldToString(storeNameField); - String storeAppId = AdjustBridgeUtil.fieldToString(storeAppIdField); - AdjustStoreInfo storeInfo = new AdjustStoreInfo(storeName); - storeInfo.setStoreAppId(storeAppId); + String storeName = AdjustBridgeUtil.fieldToString(storeNameField); + String storeAppId = AdjustBridgeUtil.fieldToString(storeAppIdField); + AdjustStoreInfo storeInfo = new AdjustStoreInfo(storeName); + storeInfo.setStoreAppId(storeAppId); - // set store info - adjustConfig.setStoreInfo(storeInfo); + // set store info + adjustConfig.setStoreInfo(storeInfo); + } } catch (Exception e) { AdjustFactory.getLogger().error("AdjustBridgeInstance storeInfo: %s", e.getMessage()); } From 5e2317bcbe1efb56e9139c17a16782b85a6bd64e Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 30 Jun 2026 14:10:02 +0200 Subject: [PATCH 509/540] chore: update example app --- .../src/main/assets/AdjustExample-FbPixel.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/examples/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html b/Adjust/examples/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html index a49547f07..4a4e2cd0e 100755 --- a/Adjust/examples/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html +++ b/Adjust/examples/example-app-fbpixel/src/main/assets/AdjustExample-FbPixel.html @@ -53,7 +53,7 @@

Adjust Facebook Pixel Dem adjustConfig.setFbPixelDefaultEventToken('34vgg9'); // Start Adjust SDK. - Adjust.onCreate(adjustConfig); + Adjust.initSdk(adjustConfig); window.onload = function() { var btnTrackSearchEvent = document.getElementById('btnTrackSearchEvent') From 9f76d4ce5250228e4f61e82e967af4bb20de9d82 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 30 Jun 2026 14:36:18 +0200 Subject: [PATCH 510/540] fix: deserialise retryCount correctly and validate retryIn before scheduling --- .../sdk-core/src/main/java/com/adjust/sdk/ActivityPackage.java | 2 +- .../sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityPackage.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityPackage.java index e29f830f4..5b8b406fe 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityPackage.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityPackage.java @@ -281,7 +281,7 @@ private void readObject(ObjectInputStream stream) throws ClassNotFoundException, suffix = Util.readStringField(fields, "suffix", null); callbackParameters = Util.readObjectField(fields, "callbackParameters", null); partnerParameters = Util.readObjectField(fields, "partnerParameters", null); - retryCount = Util.readIntField(fields, "errorCount", 0); + retryCount = Util.readIntField(fields, "retryCount", 0); firstErrorCode = Util.readIntField(fields, "firstErrorCode", 0); lastErrorCode = Util.readIntField(fields, "lastErrorCode", 0); waitBeforeSendTimeSeconds = Util.readDoubleField(fields, "waitBeforeSendTimeSeconds", 0.0); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java index 62b8cc7eb..6bec143c0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java @@ -170,7 +170,7 @@ public void run() { } }; - if (responseData.retryIn != null) { + if (responseData.retryIn != null && responseData.retryIn > 0) { long retryIn = responseData.retryIn; scheduler.schedule(runnable, retryIn); return; From 07680f0cbef5d03e750b2b297e85754561b8e4c7 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 30 Jun 2026 16:13:38 +0200 Subject: [PATCH 511/540] feat: update agp to 9.2.1 --- Adjust/build.gradle | 33 +++++++++---------- .../examples/example-app-fbpixel/build.gradle | 2 +- Adjust/examples/example-app-java/build.gradle | 2 +- .../example-app-keyboard/build.gradle | 2 +- .../examples/example-app-kotlin/build.gradle | 16 +++++---- Adjust/examples/example-app-tv/build.gradle | 2 +- .../example-app-webbridge/build.gradle | 2 +- Adjust/gradle.properties | 1 - Adjust/tests/test-app-webbridge/build.gradle | 2 +- 9 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 754703001..881ef10bf 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -1,5 +1,20 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + ext { + agp_version = '9.2.1' + kotlin_version = '2.0.21' + } + repositories { + mavenCentral() + google() + } + dependencies { + classpath "com.android.tools.build:gradle:$agp_version" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + // common in all sub-projects subprojects { } @@ -20,24 +35,6 @@ ext { adjustGroupId = 'com.adjust.sdk' } -buildscript { - ext { - agp_version = '8.10.1' - } - ext.kotlin_version = '2.1.0' - - repositories { - mavenCentral() - google() - } - dependencies { - classpath "com.android.tools.build:gradle:$agp_version" - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files. - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } -} - allprojects { repositories { mavenCentral() diff --git a/Adjust/examples/example-app-fbpixel/build.gradle b/Adjust/examples/example-app-fbpixel/build.gradle index a07084e5c..fcf18bef3 100644 --- a/Adjust/examples/example-app-fbpixel/build.gradle +++ b/Adjust/examples/example-app-fbpixel/build.gradle @@ -14,7 +14,7 @@ android { buildTypes { release { minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } diff --git a/Adjust/examples/example-app-java/build.gradle b/Adjust/examples/example-app-java/build.gradle index 016ba917e..7bf8c4098 100644 --- a/Adjust/examples/example-app-java/build.gradle +++ b/Adjust/examples/example-app-java/build.gradle @@ -19,7 +19,7 @@ android { buildTypes { release { minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { diff --git a/Adjust/examples/example-app-keyboard/build.gradle b/Adjust/examples/example-app-keyboard/build.gradle index cd84b7bd2..679fba5f1 100644 --- a/Adjust/examples/example-app-keyboard/build.gradle +++ b/Adjust/examples/example-app-keyboard/build.gradle @@ -19,7 +19,7 @@ android { buildTypes { release { minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { diff --git a/Adjust/examples/example-app-kotlin/build.gradle b/Adjust/examples/example-app-kotlin/build.gradle index 6a2b2d85d..6f22b2804 100644 --- a/Adjust/examples/example-app-kotlin/build.gradle +++ b/Adjust/examples/example-app-kotlin/build.gradle @@ -1,5 +1,7 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' +plugins { + id 'com.android.application' +} + android { compileSdk 37 @@ -24,13 +26,15 @@ android { targetCompatibility 1.8 } - kotlinOptions { - jvmTarget = '1.8' - } - namespace 'com.adjust.examples' } +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8 + } +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.3.1' diff --git a/Adjust/examples/example-app-tv/build.gradle b/Adjust/examples/example-app-tv/build.gradle index 016ba917e..7bf8c4098 100755 --- a/Adjust/examples/example-app-tv/build.gradle +++ b/Adjust/examples/example-app-tv/build.gradle @@ -19,7 +19,7 @@ android { buildTypes { release { minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { diff --git a/Adjust/examples/example-app-webbridge/build.gradle b/Adjust/examples/example-app-webbridge/build.gradle index 7877fb4f2..70eb972dd 100644 --- a/Adjust/examples/example-app-webbridge/build.gradle +++ b/Adjust/examples/example-app-webbridge/build.gradle @@ -13,7 +13,7 @@ android { buildTypes { release { minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { diff --git a/Adjust/gradle.properties b/Adjust/gradle.properties index 666511cdf..50d3d4fd9 100644 --- a/Adjust/gradle.properties +++ b/Adjust/gradle.properties @@ -21,5 +21,4 @@ org.gradle.daemon=true org.gradle.parallel=true org.gradle.configureondemand=true android.useAndroidX=true -android.enableJetifier=true android.enableR8.fullMode=true \ No newline at end of file diff --git a/Adjust/tests/test-app-webbridge/build.gradle b/Adjust/tests/test-app-webbridge/build.gradle index ae7b037eb..e49e77516 100644 --- a/Adjust/tests/test-app-webbridge/build.gradle +++ b/Adjust/tests/test-app-webbridge/build.gradle @@ -20,7 +20,7 @@ android { buildTypes { release { minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } namespace 'com.example.testappwebbridge' From 3603940a0b7fe5d427e0f9798812baf04018f7d3 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 30 Jun 2026 16:26:20 +0200 Subject: [PATCH 512/540] test: update tests to read retryCount and not legacy "errorCount" --- .../adjust/sdk/ObjectInputFilterStreamPersistedTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Adjust/sdk-core/src/test/java/com/adjust/sdk/ObjectInputFilterStreamPersistedTest.java b/Adjust/sdk-core/src/test/java/com/adjust/sdk/ObjectInputFilterStreamPersistedTest.java index e1896afda..0a20c27f1 100644 --- a/Adjust/sdk-core/src/test/java/com/adjust/sdk/ObjectInputFilterStreamPersistedTest.java +++ b/Adjust/sdk-core/src/test/java/com/adjust/sdk/ObjectInputFilterStreamPersistedTest.java @@ -186,8 +186,8 @@ public void roundTrip_activityPackage() throws Exception { assertEquals(original.getSuffix(), restored.getSuffix()); assertEquals(original.getCallbackParameters(), restored.getCallbackParameters()); assertEquals(original.getPartnerParameters(), restored.getPartnerParameters()); - // current ActivityPackage.readObject reads legacy "errorCount" and drops "retryCount" - assertEquals(0, restored.getRetryCount()); + // current ActivityPackage.readObject reads "retryCount" and drops legacy "errorCount" + assertEquals(original.getRetryCount(), restored.getRetryCount()); assertEquals(original.getFirstErrorCode(), restored.getFirstErrorCode()); assertEquals(original.getLastErrorCode(), restored.getLastErrorCode()); assertEquals(original.getWaitBeforeSendTimeSeconds(), restored.getWaitBeforeSendTimeSeconds(), 0.0d); @@ -246,7 +246,7 @@ public void roundTrip_packageQueue() throws Exception { assertEquals(first.getSuffix(), restored.get(0).getSuffix()); assertEquals(first.getCallbackParameters(), restored.get(0).getCallbackParameters()); assertEquals(first.getPartnerParameters(), restored.get(0).getPartnerParameters()); - assertEquals(0, restored.get(0).getRetryCount()); + assertEquals(first.getRetryCount(), restored.get(0).getRetryCount()); assertEquals(first.getFirstErrorCode(), restored.get(0).getFirstErrorCode()); assertEquals(first.getLastErrorCode(), restored.get(0).getLastErrorCode()); assertEquals(first.getWaitBeforeSendTimeSeconds(), restored.get(0).getWaitBeforeSendTimeSeconds(), 0.0d); @@ -258,7 +258,7 @@ public void roundTrip_packageQueue() throws Exception { assertEquals(second.getSuffix(), restored.get(1).getSuffix()); assertEquals(second.getCallbackParameters(), restored.get(1).getCallbackParameters()); assertEquals(second.getPartnerParameters(), restored.get(1).getPartnerParameters()); - assertEquals(0, restored.get(1).getRetryCount()); + assertEquals(second.getRetryCount(), restored.get(1).getRetryCount()); assertEquals(second.getFirstErrorCode(), restored.get(1).getFirstErrorCode()); assertEquals(second.getLastErrorCode(), restored.get(1).getLastErrorCode()); assertEquals(second.getWaitBeforeSendTimeSeconds(), restored.get(1).getWaitBeforeSendTimeSeconds(), 0.0d); From b127cf8cbb5bfee67e5093f3432c21ba37017554 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 3 Jul 2026 11:59:08 +0200 Subject: [PATCH 513/540] feat: update progurad rule for appset --- Adjust/sdk-core/adjust-proguard-rules.txt | 4 +++- Adjust/sdk-core/proguard-rules.pro | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Adjust/sdk-core/adjust-proguard-rules.txt b/Adjust/sdk-core/adjust-proguard-rules.txt index 7c3195e28..c0f85ae60 100644 --- a/Adjust/sdk-core/adjust-proguard-rules.txt +++ b/Adjust/sdk-core/adjust-proguard-rules.txt @@ -25,4 +25,6 @@ -keep class android.os.LocaleList { java.util.Locale get(int); } --keep public class com.android.installreferrer.** { *; } \ No newline at end of file +-keep public class com.android.installreferrer.** { *; } +-keep class com.google.android.gms.appset.** { *; } +-keep class com.google.android.gms.tasks.** { *; } \ No newline at end of file diff --git a/Adjust/sdk-core/proguard-rules.pro b/Adjust/sdk-core/proguard-rules.pro index 2f9427164..8d0bca12f 100644 --- a/Adjust/sdk-core/proguard-rules.pro +++ b/Adjust/sdk-core/proguard-rules.pro @@ -29,3 +29,5 @@ boolean isLimitAdTrackingEnabled(); } -keep public class com.android.installreferrer.** { *; } +-keep class com.google.android.gms.appset.** { *; } +-keep class com.google.android.gms.tasks.** { *; } From 0517e8d37d847727795c6cd0498847c5e6597d29 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 3 Aug 2026 17:04:47 +0200 Subject: [PATCH 514/540] feat: update Signature library v5.0.0 --- Adjust/examples/example-app-fbpixel/build.gradle | 2 +- Adjust/examples/example-app-java/build.gradle | 2 +- Adjust/examples/example-app-keyboard/build.gradle | 2 +- Adjust/examples/example-app-kotlin/build.gradle | 2 +- Adjust/examples/example-app-tv/build.gradle | 2 +- Adjust/examples/example-app-webbridge/build.gradle | 2 +- Adjust/sdk-core/build.gradle | 2 +- Adjust/tests/test-app-core/build.gradle | 2 +- Adjust/tests/test-app-webbridge/build.gradle | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Adjust/examples/example-app-fbpixel/build.gradle b/Adjust/examples/example-app-fbpixel/build.gradle index fcf18bef3..76f6b8cf7 100644 --- a/Adjust/examples/example-app-fbpixel/build.gradle +++ b/Adjust/examples/example-app-fbpixel/build.gradle @@ -35,5 +35,5 @@ dependencies { implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') - implementation 'com.adjust.signature:adjust-android-signature:3.67.0' + implementation 'com.adjust.signature:adjust-android-signature:5.0.0' } diff --git a/Adjust/examples/example-app-java/build.gradle b/Adjust/examples/example-app-java/build.gradle index 7bf8c4098..918a9e395 100644 --- a/Adjust/examples/example-app-java/build.gradle +++ b/Adjust/examples/example-app-java/build.gradle @@ -38,5 +38,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3.67.0' + implementation 'com.adjust.signature:adjust-android-signature:5.0.0' } diff --git a/Adjust/examples/example-app-keyboard/build.gradle b/Adjust/examples/example-app-keyboard/build.gradle index 679fba5f1..7e012a2bd 100644 --- a/Adjust/examples/example-app-keyboard/build.gradle +++ b/Adjust/examples/example-app-keyboard/build.gradle @@ -38,5 +38,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3.67.0' + implementation 'com.adjust.signature:adjust-android-signature:5.0.0' } diff --git a/Adjust/examples/example-app-kotlin/build.gradle b/Adjust/examples/example-app-kotlin/build.gradle index 6f22b2804..70c52e9ce 100644 --- a/Adjust/examples/example-app-kotlin/build.gradle +++ b/Adjust/examples/example-app-kotlin/build.gradle @@ -45,5 +45,5 @@ dependencies { implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3.67.0' + implementation 'com.adjust.signature:adjust-android-signature:5.0.0' } diff --git a/Adjust/examples/example-app-tv/build.gradle b/Adjust/examples/example-app-tv/build.gradle index 7bf8c4098..918a9e395 100755 --- a/Adjust/examples/example-app-tv/build.gradle +++ b/Adjust/examples/example-app-tv/build.gradle @@ -38,5 +38,5 @@ dependencies { implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') - implementation 'com.adjust.signature:adjust-android-signature:3.67.0' + implementation 'com.adjust.signature:adjust-android-signature:5.0.0' } diff --git a/Adjust/examples/example-app-webbridge/build.gradle b/Adjust/examples/example-app-webbridge/build.gradle index 70eb972dd..34b253fc5 100644 --- a/Adjust/examples/example-app-webbridge/build.gradle +++ b/Adjust/examples/example-app-webbridge/build.gradle @@ -33,5 +33,5 @@ dependencies { implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') - implementation 'com.adjust.signature:adjust-android-signature:3.67.0' + implementation 'com.adjust.signature:adjust-android-signature:5.0.0' } diff --git a/Adjust/sdk-core/build.gradle b/Adjust/sdk-core/build.gradle index debb84003..67ea74677 100644 --- a/Adjust/sdk-core/build.gradle +++ b/Adjust/sdk-core/build.gradle @@ -221,7 +221,7 @@ def customizePomForAar(pom) { dependency { groupId 'com.adjust.signature' artifactId 'adjust-android-signature' - version '3.67.0' + version '5.0.0' scope 'compile' } } diff --git a/Adjust/tests/test-app-core/build.gradle b/Adjust/tests/test-app-core/build.gradle index 5067c6c8f..8afc89b76 100644 --- a/Adjust/tests/test-app-core/build.gradle +++ b/Adjust/tests/test-app-core/build.gradle @@ -30,7 +30,7 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:2.1.1" implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0' implementation 'com.android.installreferrer:installreferrer:2.2' - implementation 'com.adjust.signature:adjust-android-signature:3.67.0' + implementation 'com.adjust.signature:adjust-android-signature:5.0.0' implementation 'com.google.android.gms:play-services-appset:16.1.0' implementation project(':sdk-core') diff --git a/Adjust/tests/test-app-webbridge/build.gradle b/Adjust/tests/test-app-webbridge/build.gradle index e49e77516..6cdeeb988 100644 --- a/Adjust/tests/test-app-webbridge/build.gradle +++ b/Adjust/tests/test-app-webbridge/build.gradle @@ -32,7 +32,7 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:2.1.1" implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0' implementation 'com.android.installreferrer:installreferrer:2.2' - implementation 'com.adjust.signature:adjust-android-signature:3.67.0' + implementation 'com.adjust.signature:adjust-android-signature:5.0.0' implementation project(':sdk-core') implementation project(':plugins:sdk-plugin-webbridge') From ca010d98fd3295655272c69624667f1437f94a68 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 4 Aug 2026 14:00:43 +0200 Subject: [PATCH 515/540] feat: update proguard rules to make it more precise --- Adjust/sdk-core/adjust-proguard-rules.txt | 15 +++++++++++++-- Adjust/sdk-core/proguard-rules.pro | 15 +++++++++++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/Adjust/sdk-core/adjust-proguard-rules.txt b/Adjust/sdk-core/adjust-proguard-rules.txt index c0f85ae60..339998601 100644 --- a/Adjust/sdk-core/adjust-proguard-rules.txt +++ b/Adjust/sdk-core/adjust-proguard-rules.txt @@ -26,5 +26,16 @@ java.util.Locale get(int); } -keep public class com.android.installreferrer.** { *; } --keep class com.google.android.gms.appset.** { *; } --keep class com.google.android.gms.tasks.** { *; } \ No newline at end of file +-keep class com.google.android.gms.appset.AppSet { + com.google.android.gms.appset.AppSetIdClient getClient(android.content.Context); +} +-keep class com.google.android.gms.appset.AppSetIdClient { + com.google.android.gms.tasks.Task getAppSetIdInfo(); + } +-keep class com.google.android.gms.appset.AppSetIdInfo { + java.lang.String getId(); +} +-keep class com.google.android.gms.tasks.Task +-keep class com.google.android.gms.tasks.Tasks { + java.lang.Object await(com.google.android.gms.tasks.Task, long, java.util.concurrent.TimeUnit); +} \ No newline at end of file diff --git a/Adjust/sdk-core/proguard-rules.pro b/Adjust/sdk-core/proguard-rules.pro index 8d0bca12f..511ed6aec 100644 --- a/Adjust/sdk-core/proguard-rules.pro +++ b/Adjust/sdk-core/proguard-rules.pro @@ -29,5 +29,16 @@ boolean isLimitAdTrackingEnabled(); } -keep public class com.android.installreferrer.** { *; } --keep class com.google.android.gms.appset.** { *; } --keep class com.google.android.gms.tasks.** { *; } +-keep class com.google.android.gms.appset.AppSet { + com.google.android.gms.appset.AppSetIdClient getClient(android.content.Context); +} +-keep class com.google.android.gms.appset.AppSetIdClient { + com.google.android.gms.tasks.Task getAppSetIdInfo(); + } +-keep class com.google.android.gms.appset.AppSetIdInfo { + java.lang.String getId(); +} +-keep class com.google.android.gms.tasks.Task +-keep class com.google.android.gms.tasks.Tasks { + java.lang.Object await(com.google.android.gms.tasks.Task, long, java.util.concurrent.TimeUnit); +} \ No newline at end of file From 48aec69369d4d73c1e67ca461bc6c74d2c02bf08 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 4 Aug 2026 14:02:19 +0200 Subject: [PATCH 516/540] fix: updated min compile sdk for aar metadata for updated agp version --- Adjust/sdk-core/build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Adjust/sdk-core/build.gradle b/Adjust/sdk-core/build.gradle index 67ea74677..ce3bea010 100644 --- a/Adjust/sdk-core/build.gradle +++ b/Adjust/sdk-core/build.gradle @@ -16,6 +16,9 @@ android { minSdkVersion rootProject.ext.coreMinSdkVersion targetSdkVersion rootProject.ext.coreTargetSdkVersion consumerProguardFiles 'adjust-proguard-rules.txt' + aarMetadata { + minCompileSdk = 1 + } } buildTypes { From f1c7c54ffa306efbadbaf298bd5e5843fadb8215 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 4 Aug 2026 16:50:24 +0200 Subject: [PATCH 517/540] feat: add global callback and global parnter params with each request to Backend --- .../java/com/adjust/sdk/PackageBuilder.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 0788b3d42..a0a882663 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -428,6 +428,10 @@ private Map getInfoParameters(String source) { parameters.putAll(deviceInfo.oaidParameters); } + // Callback and partner parameters. + PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); + PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); + // Device identifiers. deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); @@ -602,6 +606,10 @@ private Map getAttributionParameters(String initiatedBy) { parameters.putAll(deviceInfo.oaidParameters); } + // Callback and partner parameters. + PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); + PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); + // Device identifiers. deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); @@ -667,6 +675,10 @@ private Map getGdprParameters() { parameters.putAll(deviceInfo.oaidParameters); } + // Callback and partner parameters. + PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); + PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); + // Device identifiers. deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); @@ -745,6 +757,10 @@ private Map getGdprParameters() { PackageBuilder.addMapJson(parameters, "partner_sharing_settings", adjustThirdPartySharing.partnerSharingSettings); + // Callback and partner parameters. + PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); + PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); + // Device identifiers. deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); @@ -814,6 +830,10 @@ private Map getMeasurementConsentParameters( PackageBuilder.addString(parameters, "measurement", consentMeasurement ? "enable" : "disable"); + // Callback and partner parameters. + PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); + PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); + // Device identifiers. deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); @@ -1073,6 +1093,10 @@ private Map getVerificationParameters(AdjustPlayStorePurchase pu parameters.putAll(deviceInfo.oaidParameters); } + // Callback and partner parameters. + PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); + PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); + // Device identifiers. deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); @@ -1162,6 +1186,10 @@ private Map getVerificationParameters(AdjustEvent event) { parameters.putAll(deviceInfo.oaidParameters); } + // Callback and partner parameters. + PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); + PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); + // Device identifiers. deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); From 4ea88c1b5f3fb3ac2489a1f9934581c511c064b4 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 5 Aug 2026 22:42:18 +0200 Subject: [PATCH 518/540] fix: updated min compile sdk for aar metadata for plugins --- Adjust/plugins/sdk-plugin-google-lvl/build.gradle | 3 +++ Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 3 +++ Adjust/plugins/sdk-plugin-imei/build.gradle | 3 +++ Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 3 +++ Adjust/plugins/sdk-plugin-oaid/build.gradle | 3 +++ Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 3 +++ Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 3 +++ Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 3 +++ Adjust/plugins/sdk-plugin-webbridge/build.gradle | 3 +++ Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 3 +++ 10 files changed, 30 insertions(+) diff --git a/Adjust/plugins/sdk-plugin-google-lvl/build.gradle b/Adjust/plugins/sdk-plugin-google-lvl/build.gradle index c9ddc7754..f10c4c6ba 100644 --- a/Adjust/plugins/sdk-plugin-google-lvl/build.gradle +++ b/Adjust/plugins/sdk-plugin-google-lvl/build.gradle @@ -19,6 +19,9 @@ android { defaultConfig { minSdkVersion rootProject.ext.coreMinSdkVersion targetSdkVersion rootProject.ext.coreTargetSdkVersion + aarMetadata { + minCompileSdk = 1 + } } namespace 'com.adjust.sdk.google.lvl' sourceSets { diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index 75ce5c187..df6a5fdcb 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -19,6 +19,9 @@ android { defaultConfig { minSdkVersion rootProject.ext.coreMinSdkVersion targetSdkVersion rootProject.ext.coreTargetSdkVersion + aarMetadata { + minCompileSdk = 1 + } } namespace 'com.adjust.sdk.huawei' } diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index b2faf85bd..4ddbdd46f 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -21,6 +21,9 @@ android { defaultConfig { minSdkVersion rootProject.ext.coreMinSdkVersion targetSdkVersion rootProject.ext.coreTargetSdkVersion + aarMetadata { + minCompileSdk = 1 + } } namespace 'com.adjust.sdk.imei' } diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index 7a407343f..83dd9424e 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -19,6 +19,9 @@ android { defaultConfig { minSdkVersion rootProject.ext.coreMinSdkVersion targetSdkVersion rootProject.ext.coreTargetSdkVersion + aarMetadata { + minCompileSdk = 1 + } } namespace 'com.adjust.sdk.meta' } diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index 196ce0c81..fb6965d7a 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -24,6 +24,9 @@ android { defaultConfig { minSdkVersion rootProject.ext.coreMinSdkVersion targetSdkVersion rootProject.ext.coreTargetSdkVersion + aarMetadata { + minCompileSdk = 1 + } } namespace 'com.adjust.sdk.oaid' } diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index 7fb8e581f..c7c481da3 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -19,6 +19,9 @@ android { defaultConfig { minSdkVersion rootProject.ext.samsungCloudDevMinSdkVersion targetSdkVersion rootProject.ext.coreTargetSdkVersion + aarMetadata { + minCompileSdk = 1 + } } namespace 'com.adjust.sdk.samsung.clouddev' } diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index e7746f695..d9fc0f4b2 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -19,6 +19,9 @@ android { defaultConfig { minSdkVersion rootProject.ext.samsungReferrerMinSdkVersion targetSdkVersion rootProject.ext.coreTargetSdkVersion + aarMetadata { + minCompileSdk = 1 + } } namespace 'com.adjust.sdk.samsung' } diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index 21d923d6c..a325c1fa8 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -20,6 +20,9 @@ android { defaultConfig { minSdkVersion rootProject.ext.vivoReferrerMinSdkVersion targetSdkVersion rootProject.ext.coreTargetSdkVersion + aarMetadata { + minCompileSdk = 1 + } } namespace 'com.adjust.sdk.vivo' } diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index 8bf569029..638d7e977 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -21,6 +21,9 @@ android { defaultConfig { minSdkVersion rootProject.ext.webbridgeMinSdkVersion targetSdkVersion rootProject.ext.coreTargetSdkVersion + aarMetadata { + minCompileSdk = 1 + } } namespace 'com.adjust.sdk.webbridge' } diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index b04f8df83..18c3071dd 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -21,6 +21,9 @@ android { defaultConfig { minSdkVersion rootProject.ext.coreMinSdkVersion targetSdkVersion rootProject.ext.coreTargetSdkVersion + aarMetadata { + minCompileSdk = 1 + } } namespace 'com.adjust.sdk.xiaomi' } From f86ef08dc73863c34aa08a137b38b69abc5c1415 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 6 Aug 2026 10:40:24 +0200 Subject: [PATCH 519/540] feat: revert callback and partner param addition where redundant --- .../java/com/adjust/sdk/PackageBuilder.java | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index a0a882663..6db104cf9 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -428,10 +428,6 @@ private Map getInfoParameters(String source) { parameters.putAll(deviceInfo.oaidParameters); } - // Callback and partner parameters. - PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); - PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); - // Device identifiers. deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); @@ -606,10 +602,6 @@ private Map getAttributionParameters(String initiatedBy) { parameters.putAll(deviceInfo.oaidParameters); } - // Callback and partner parameters. - PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); - PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); - // Device identifiers. deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); @@ -675,10 +667,6 @@ private Map getGdprParameters() { parameters.putAll(deviceInfo.oaidParameters); } - // Callback and partner parameters. - PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); - PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); - // Device identifiers. deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); @@ -1093,10 +1081,6 @@ private Map getVerificationParameters(AdjustPlayStorePurchase pu parameters.putAll(deviceInfo.oaidParameters); } - // Callback and partner parameters. - PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); - PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); - // Device identifiers. deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); @@ -1186,10 +1170,6 @@ private Map getVerificationParameters(AdjustEvent event) { parameters.putAll(deviceInfo.oaidParameters); } - // Callback and partner parameters. - PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); - PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); - // Device identifiers. deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); From 3eb92eb21256b782ec82cf9562e7fdd6bf5b1943 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 6 Aug 2026 11:00:08 +0200 Subject: [PATCH 520/540] fix indentation in proguard rules files --- Adjust/sdk-core/adjust-proguard-rules.txt | 4 ++-- Adjust/sdk-core/proguard-rules.pro | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Adjust/sdk-core/adjust-proguard-rules.txt b/Adjust/sdk-core/adjust-proguard-rules.txt index 339998601..3ddc462cb 100644 --- a/Adjust/sdk-core/adjust-proguard-rules.txt +++ b/Adjust/sdk-core/adjust-proguard-rules.txt @@ -31,11 +31,11 @@ } -keep class com.google.android.gms.appset.AppSetIdClient { com.google.android.gms.tasks.Task getAppSetIdInfo(); - } +} -keep class com.google.android.gms.appset.AppSetIdInfo { java.lang.String getId(); } -keep class com.google.android.gms.tasks.Task -keep class com.google.android.gms.tasks.Tasks { java.lang.Object await(com.google.android.gms.tasks.Task, long, java.util.concurrent.TimeUnit); -} \ No newline at end of file +} diff --git a/Adjust/sdk-core/proguard-rules.pro b/Adjust/sdk-core/proguard-rules.pro index 511ed6aec..7498b73ed 100644 --- a/Adjust/sdk-core/proguard-rules.pro +++ b/Adjust/sdk-core/proguard-rules.pro @@ -34,11 +34,11 @@ } -keep class com.google.android.gms.appset.AppSetIdClient { com.google.android.gms.tasks.Task getAppSetIdInfo(); - } +} -keep class com.google.android.gms.appset.AppSetIdInfo { java.lang.String getId(); } -keep class com.google.android.gms.tasks.Task -keep class com.google.android.gms.tasks.Tasks { java.lang.Object await(com.google.android.gms.tasks.Task, long, java.util.concurrent.TimeUnit); -} \ No newline at end of file +} From 9bff39116866bba06437d175b2d1ce439dc6b93b Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 6 Aug 2026 11:07:34 +0200 Subject: [PATCH 521/540] feat: revert addition of callback and partner param from measurement consent --- .../sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 6db104cf9..988abd20f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -818,10 +818,6 @@ private Map getMeasurementConsentParameters( PackageBuilder.addString(parameters, "measurement", consentMeasurement ? "enable" : "disable"); - // Callback and partner parameters. - PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); - PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); - // Device identifiers. deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); From 3749c7e7dd32115b2f31d33e9e57ffe1f64aa7a9 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 6 Aug 2026 14:44:14 +0200 Subject: [PATCH 522/540] feat: revert adding callback / partner params in third party request --- .../sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 988abd20f..0788b3d42 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -745,10 +745,6 @@ private Map getGdprParameters() { PackageBuilder.addMapJson(parameters, "partner_sharing_settings", adjustThirdPartySharing.partnerSharingSettings); - // Callback and partner parameters. - PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); - PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); - // Device identifiers. deviceInfo.reloadPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); From cb5b42f21f2256f5ed0012af301876894b5d90a4 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 23 Jun 2026 10:29:48 +0200 Subject: [PATCH 523/540] feat: add disable google adid and android id methods in config --- .../java/com/adjust/sdk/ActivityHandler.java | 8 ++--- .../java/com/adjust/sdk/AdjustConfig.java | 20 ++++++++++++ .../main/java/com/adjust/sdk/DeviceInfo.java | 10 +++--- .../java/com/adjust/sdk/PackageBuilder.java | 32 ++++++++++++------- .../src/main/java/com/adjust/sdk/Util.java | 8 ++--- 5 files changed, 53 insertions(+), 25 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index 714c6b7af..be0334b0e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1220,16 +1220,16 @@ public void run(ActivityHandler activityHandler) { deviceInfo.reloadPlayIds(adjustConfig); if (deviceInfo.playAdId == null) { if (!Util.canReadPlayIds(adjustConfig)) { - logger.info("Cannot read Google Play Services Advertising ID with COPPA or play store kids app enabled"); + logger.info("Cannot read Google Play Services Advertising ID with COPPA or play store kids app enabled or reading disabled"); } else { logger.warn("Unable to get Google Play Services Advertising ID at start time"); } if (deviceInfo.androidId == null) { - if (! Util.canReadNonPlayIds(adjustConfig)) { - logger.info("Cannot read non Play IDs with COPPA or play store kids app enabled"); + if (! Util.canReadAndroidId(adjustConfig)) { + logger.info("Cannot read Android ID with COPPA or play store kids app enabled or reading disabled"); } else { - logger.error("Unable to get any Device IDs. Please check if Proguard is correctly set with Adjust SDK"); + logger.error("Unable to get Android Id. Please check if Proguard is correctly set with Adjust SDK"); } } } else { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index af7b21a03..1850be925 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -53,6 +53,8 @@ public class AdjustConfig { ArrayList cachedThirdPartySharingTimeoutCallbacks = new ArrayList<>(); boolean isFirstSessionDelayEnabled; AdjustStoreInfo storeInfo; + boolean isGoogleAdIdReadingEnabled; + boolean isAndroidIdReadingEnabled; boolean isAppSetIdReadingEnabled; boolean isFbIdReadingEnabled; @@ -93,6 +95,8 @@ private void init(Context context, String appToken, String environment, boolean this.coppaComplianceEnabled = false; this.playStoreKidsComplianceEnabled = false; this.isFirstSessionDelayEnabled = false; + this.isGoogleAdIdReadingEnabled = true; + this.isAndroidIdReadingEnabled = true; this.isAppSetIdReadingEnabled = true; this.isFbIdReadingEnabled = true; } @@ -207,6 +211,14 @@ public void setOnRemoteTriggerListener(OnRemoteTriggerListener onRemoteTriggerLi this.onRemoteTriggerListener = onRemoteTriggerListener; } + public void disableGoogleAdIdReading() { + this.isGoogleAdIdReadingEnabled = false; + } + + public void disableAndroidIdReading() { + this.isAndroidIdReadingEnabled = false; + } + public void disableAppSetIdReading() { this.isAppSetIdReadingEnabled = false; } @@ -323,6 +335,14 @@ public ILogger getLogger() { return logger; } + public boolean isGoogleAdIdReadingEnabled() { + return isGoogleAdIdReadingEnabled; + } + + public boolean isAndroidIdReadingEnabled() { + return isAndroidIdReadingEnabled; + } + public boolean isAppSetIdReadingEnabled() { return isAppSetIdReadingEnabled; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 9a6601df0..335ad60a2 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -63,7 +63,7 @@ class DeviceInfo { String playAdIdSource; int playAdIdAttempt = -1; Boolean isTrackingEnabled; - private boolean nonGoogleIdsReadOnce = false; + private boolean androidIdReadOnce = false; private boolean playIdsReadOnce = false; private boolean otherDeviceIdsParamsReadOnce = false; String androidId; @@ -248,17 +248,17 @@ void reloadPlayIds(final AdjustConfig adjustConfig) { } } - void reloadNonPlayIds(final AdjustConfig adjustConfig) { - if (!Util.canReadNonPlayIds(adjustConfig)) { + void readAndroidId(final AdjustConfig adjustConfig) { + if (!Util.canReadAndroidId(adjustConfig)) { return; } - if (nonGoogleIdsReadOnce) { + if (androidIdReadOnce) { return; } androidId = Util.getAndroidId(adjustConfig.context); - nonGoogleIdsReadOnce = true; + androidIdReadOnce = true; } void reloadOtherDeviceInfoParams(final AdjustConfig adjustConfig, diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 0788b3d42..772e9490b 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -256,7 +256,7 @@ private Map getSessionParameters() { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.readAndroidId(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -349,7 +349,7 @@ public Map getEventParameters(AdjustEvent event, int sequence) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.readAndroidId(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -442,7 +442,7 @@ private Map getInfoParameters(String source) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.readAndroidId(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -499,7 +499,7 @@ private Map getClickParameters(String source) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.readAndroidId(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -616,7 +616,7 @@ private Map getAttributionParameters(String initiatedBy) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.readAndroidId(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -681,7 +681,7 @@ private Map getGdprParameters() { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.readAndroidId(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -759,7 +759,7 @@ private Map getGdprParameters() { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.readAndroidId(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -828,7 +828,7 @@ private Map getMeasurementConsentParameters( if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.readAndroidId(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -895,7 +895,7 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.readAndroidId(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -988,7 +988,7 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.readAndroidId(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -1086,7 +1086,7 @@ private Map getVerificationParameters(AdjustPlayStorePurchase pu if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.readAndroidId(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -1175,7 +1175,7 @@ private Map getVerificationParameters(AdjustEvent event) { if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.reloadNonPlayIds(adjustConfig); + deviceInfo.readAndroidId(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -1262,6 +1262,14 @@ private void injectFeatureFlagsWithParameters(Map parameters) { PackageBuilder.addBoolean(parameters, "ff_first_session_delay", true); } + if (!adjustConfig.isGoogleAdIdReadingEnabled) { + PackageBuilder.addBoolean(parameters, "ff_gps_adid_disabled", true); + } + + if (!adjustConfig.isAndroidIdReadingEnabled) { + PackageBuilder.addBoolean(parameters, "ff_android_id_disabled", true); + } + if (!adjustConfig.isAppSetIdReadingEnabled) { PackageBuilder.addBoolean(parameters, "ff_app_set_id_disabled", true); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index f0303a57b..8015ded9a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -681,11 +681,11 @@ public static boolean isEqualReferrerDetails(final ReferrerDetails referrerDetai } public static boolean canReadPlayIds(final AdjustConfig adjustConfig) { - return !adjustConfig.coppaComplianceEnabled && !adjustConfig.playStoreKidsComplianceEnabled; + return !adjustConfig.coppaComplianceEnabled && !adjustConfig.playStoreKidsComplianceEnabled && adjustConfig.isGoogleAdIdReadingEnabled; } - public static boolean canReadNonPlayIds(final AdjustConfig adjustConfig) { - return !adjustConfig.coppaComplianceEnabled && !adjustConfig.playStoreKidsComplianceEnabled; + public static boolean canReadAndroidId(final AdjustConfig adjustConfig) { + return !adjustConfig.coppaComplianceEnabled && !adjustConfig.playStoreKidsComplianceEnabled && adjustConfig.isAndroidIdReadingEnabled; } public static boolean canReadAppSetId(final AdjustConfig adjustConfig) { @@ -699,7 +699,7 @@ public static boolean canReadFbId(final AdjustConfig adjustConfig) { if (!adjustConfig.isFbIdReadingEnabled) { return false; } - return canReadNonPlayIds(adjustConfig); + return canReadAndroidId(adjustConfig); } public static boolean isGooglePlayGamesForPC(final Context context) { From 0ef18d8f518f22913d376d0c5704ab5ed343cf33 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 23 Jun 2026 10:49:21 +0200 Subject: [PATCH 524/540] feat: add disable google adid & android id reading config methods in web bridge --- .../src/main/assets/adjust_config.js | 10 ++++++++++ .../sdk/webbridge/AdjustBridgeInstance.java | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js index 3a9bb4532..fa722c1c8 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -57,6 +57,8 @@ function AdjustConfig(appToken, environment, legacy) { this.eventDeduplicationIdsMaxSize = null; this.isFirstSessionDelayEnabled = null; this.storeInfo = null; + this.isGoogleAdIdReadingEnabled = null; + this.isAndroidIdReadingEnabled = null; this.isAppSetIdReadingEnabled = null; this.isFbIdReadingEnabled = null; } @@ -285,6 +287,14 @@ AdjustConfig.prototype.setStoreInfo = function(storeInfo) { this.storeInfo = JSON.stringify(storeInfo); }; +AdjustConfig.prototype.disableGoogleAdIdReading = function() { + this.isGoogleAdIdReadingEnabled = false; +}; + +AdjustConfig.prototype.disableAndroidIdReading = function() { + this.isAndroidIdReadingEnabled = false; +}; + AdjustConfig.prototype.disableAppSetIdReading = function() { this.isAppSetIdReadingEnabled = false; }; diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 549ce690e..86d6b078e 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -190,6 +190,8 @@ public void initSdk(String adjustConfigString, String bridgeToken) { Object eventDeduplicationIdsMaxSizeField = jsonAdjustConfig.get("eventDeduplicationIdsMaxSize"); Object isFirstSessionDelayEnabledField = jsonAdjustConfig.get("isFirstSessionDelayEnabled"); Object storeInfoField = jsonAdjustConfig.get("storeInfo"); + Object isGoogleAdIdReadingEnabledField = jsonAdjustConfig.get("isGoogleAdIdReadingEnabled"); + Object isAndroidIdReadingEnabledField = jsonAdjustConfig.get("isAndroidIdReadingEnabled"); Object isAppSetIdReadingEnabledField = jsonAdjustConfig.get("isAppSetIdReadingEnabled"); Object isFbIdReadingEnabledField = jsonAdjustConfig.get("isFbIdReadingEnabled"); @@ -471,6 +473,22 @@ public void onRemoteTrigger(AdjustRemoteTrigger remoteTrigger) { AdjustFactory.getLogger().error("AdjustBridgeInstance storeInfo: %s", e.getMessage()); } + // Google AdId reading + Boolean isGoogleAdIdReadingEnabled = AdjustBridgeUtil.fieldToBoolean(isGoogleAdIdReadingEnabledField); + if (isGoogleAdIdReadingEnabled != null) { + if (!isGoogleAdIdReadingEnabled) { + adjustConfig.disableGoogleAdIdReading(); + } + } + + // Android Id reading + Boolean isAndroidIdReadingEnabled = AdjustBridgeUtil.fieldToBoolean(isAndroidIdReadingEnabledField); + if (isAndroidIdReadingEnabled != null) { + if (!isAndroidIdReadingEnabled) { + adjustConfig.disableAndroidIdReading(); + } + } + // AppSetId reading Boolean isAppSetIdReadingEnabled = AdjustBridgeUtil.fieldToBoolean(isAppSetIdReadingEnabledField); if (isAppSetIdReadingEnabled != null) { From 3f5121356466ee01227d8694879d72712c539285 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 23 Jun 2026 14:29:37 +0200 Subject: [PATCH 525/540] test: add testing of disable id methods --- .../adjust/testapp/AdjustCommandExecutor.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index c189d1ec6..a1b52e968 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -537,6 +537,22 @@ public void onRemoteTrigger(AdjustRemoteTrigger trigger) { } } + if (command.containsParameter("googleAdIdReadingEnabled")) { + String googleAdIdReadingEnabledS = command.getFirstParameterValue("googleAdIdReadingEnabled"); + boolean googleAdIdReadingEnabled = "true".equals(googleAdIdReadingEnabledS); + if (!googleAdIdReadingEnabled) { + adjustConfig.disableGoogleAdIdReading(); + } + } + + if (command.containsParameter("androidIdReadingEnabled")) { + String androidIdReadingEnabledS = command.getFirstParameterValue("androidIdReadingEnabled"); + boolean androidIdReadingEnabled = "true".equals(androidIdReadingEnabledS); + if (!androidIdReadingEnabled) { + adjustConfig.disableAndroidIdReading(); + } + } + if (command.containsParameter("appSetIdReadingEnabled")) { String appSetIdReadingEnabledS = command.getFirstParameterValue("appSetIdReadingEnabled"); boolean appSetIdReadingEnabled = "true".equals(appSetIdReadingEnabledS); From e043a0609e567e12338b3c8653e44a9f9889516c Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 25 Jun 2026 14:18:15 +0200 Subject: [PATCH 526/540] refactor: extract common parameters for all the packages --- .../java/com/adjust/sdk/PackageBuilder.java | 957 +++--------------- 1 file changed, 124 insertions(+), 833 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 772e9490b..d7ee39c58 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -154,9 +154,7 @@ ActivityPackage buildGdprPackage() { return gdprPackage; } - ActivityPackage buildThirdPartySharingPackage( - final AdjustThirdPartySharing adjustThirdPartySharing) - { + ActivityPackage buildThirdPartySharingPackage(final AdjustThirdPartySharing adjustThirdPartySharing) { Map parameters = getThirdPartySharingParameters(adjustThirdPartySharing); ActivityPackage activityPackage = getDefaultActivityPackage(ActivityKind.THIRD_PARTY_SHARING); activityPackage.setPath("/third_party_sharing"); @@ -226,92 +224,14 @@ ActivityPackage buildVerificationPackage(AdjustEvent event, OnPurchaseVerificati private Map getSessionParameters() { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); - - // Check if plugin is used and if yes, add read parameters. - if (deviceInfo.imeiParameters != null) { - parameters.putAll(deviceInfo.imeiParameters); - } - - // Check if oaid plugin is used and if yes, add the parameter - if (deviceInfo.oaidParameters != null) { - parameters.putAll(deviceInfo.oaidParameters); - } - - // Callback and partner parameters. - PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); - PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); - - // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); - PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); - PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); - PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); - PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); - PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); - PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); - PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); - - if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { - logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + - "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.readAndroidId(adjustConfig); - PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); - } + addCommonPackageParameters(parameters); - // Rest of the parameters. - PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); - PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); - PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); - PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); - PackageBuilder.addString(parameters, "country", deviceInfo.country); - PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); - PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); + PackageBuilder.addMapJson(parameters, "callback_params", globalParameters.callbackParameters); + PackageBuilder.addMapJson(parameters, "partner_params", globalParameters.partnerParameters); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); - PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); - PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); - PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); - PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); - PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); - PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); - PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); - PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); - PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); - PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); - PackageBuilder.addString(parameters, "language", deviceInfo.language); - PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); - PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); - PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); - PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); - PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); - PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); - PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); - PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); - PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); - PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); - PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); - PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); - PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); - PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); - PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); - - // google play games - PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); - - // control params json - JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); - PackageBuilder.addJsonObject(parameters, "control_params", controlParams); - // store info injectStoreInfoToParameters(parameters); - injectFeatureFlagsWithParameters(parameters); - checkDeviceIds(parameters); return parameters; } @@ -319,96 +239,24 @@ private Map getSessionParameters() { public Map getEventParameters(AdjustEvent event, int sequence) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); - - // Check if plugin is used and if yes, add read parameters. - if (deviceInfo.imeiParameters != null) { - parameters.putAll(deviceInfo.imeiParameters); - } - - // Check if oaid plugin is used and if yes, add the parameter - if (deviceInfo.oaidParameters != null) { - parameters.putAll(deviceInfo.oaidParameters); - } - - // Callback and partner parameters. - PackageBuilder.addMapJson(parameters, "callback_params", Util.mergeParameters(this.globalParameters.callbackParameters, event.callbackParameters, "Callback")); - PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.globalParameters.partnerParameters, event.partnerParameters, "Partner")); - - // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); - PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); - PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); - PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); - PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); - PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); - PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); - PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); + addCommonPackageParameters(parameters); - if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { - logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + - "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.readAndroidId(adjustConfig); - PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); - } + PackageBuilder.addMapJson(parameters, "callback_params", + Util.mergeParameters(globalParameters.callbackParameters, event.callbackParameters, "Callback")); + PackageBuilder.addMapJson(parameters, "partner_params", + Util.mergeParameters(globalParameters.partnerParameters, event.partnerParameters, "Partner")); - // Rest of the parameters. - PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); - PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); - PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); - PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); - PackageBuilder.addString(parameters, "country", deviceInfo.country); - PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); - PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "currency", event.currency); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); - PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); - PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); - PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); - PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); - PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); - PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); - PackageBuilder.addString(parameters, "environment", adjustConfig.environment); PackageBuilder.addString(parameters, "event_callback_id", event.callbackId); PackageBuilder.addLong(parameters, "event_count", activityStateCopy.eventCount); PackageBuilder.addString(parameters, "event_token", event.eventToken); - PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); - PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); - PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); - PackageBuilder.addString(parameters, "language", deviceInfo.language); - PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); - PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); - PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); - PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); - PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); - PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "product_id", event.productId); PackageBuilder.addString(parameters, "purchase_token", event.purchaseToken); - PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addDouble(parameters, "revenue", event.revenue); PackageBuilder.addString(parameters, "order_id", event.orderId); PackageBuilder.addString(parameters, "deduplication_id", event.deduplicationId); - PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); - PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); - PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); - PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); - PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); - PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); - PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); PackageBuilder.addInteger(parameters, "seq", sequence); - // google play games - PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); - - // control params json - JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); - PackageBuilder.addJsonObject(parameters, "control_params", controlParams); - - injectFeatureFlagsWithParameters(parameters); - checkDeviceIds(parameters); return parameters; } @@ -416,56 +264,10 @@ public Map getEventParameters(AdjustEvent event, int sequence) { private Map getInfoParameters(String source) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); - - // Check if plugin is used and if yes, add read parameters. - if (deviceInfo.imeiParameters != null) { - parameters.putAll(deviceInfo.imeiParameters); - } - - // Check if oaid plugin is used and if yes, add the parameter - if (deviceInfo.oaidParameters != null) { - parameters.putAll(deviceInfo.oaidParameters); - } - - // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); - PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); - PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); - PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); - PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); - PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); - PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); - PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); - - if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { - logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + - "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.readAndroidId(adjustConfig); - PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); - } + addCommonPackageParameters(parameters); - // Rest of the parameters. - PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); - PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); - PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); - PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); - PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "source", source); - // google play games - PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); - - // control params json - JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); - PackageBuilder.addJsonObject(parameters, "control_params", controlParams); - - injectFeatureFlagsWithParameters(parameters); - checkDeviceIds(parameters); return parameters; } @@ -473,35 +275,7 @@ private Map getInfoParameters(String source) { private Map getClickParameters(String source) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); - - // Check if plugin is used and if yes, add read parameters. - if (deviceInfo.imeiParameters != null) { - parameters.putAll(deviceInfo.imeiParameters); - } - - // Check if oaid plugin is used and if yes, add the parameter - if (deviceInfo.oaidParameters != null) { - parameters.putAll(deviceInfo.oaidParameters); - } - - // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); - PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); - PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); - PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); - PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); - PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); - PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); - PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); - - if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { - logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + - "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.readAndroidId(adjustConfig); - PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); - } + addCommonPackageParameters(parameters); // Attribution parameters. if (attribution != null) { @@ -511,78 +285,32 @@ private Map getClickParameters(String source) { PackageBuilder.addString(parameters, "creative", attribution.creative); } - // Rest of the parameters. - PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); - PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); - PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); - PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); + PackageBuilder.addMapJson(parameters, "callback_params", globalParameters.callbackParameters); + PackageBuilder.addMapJson(parameters, "partner_params", globalParameters.partnerParameters); PackageBuilder.addDateInMilliseconds(parameters, "click_time", clickTimeInMilliseconds); PackageBuilder.addDateInSeconds(parameters, "click_time", clickTimeInSeconds); PackageBuilder.addDateInSeconds(parameters, "click_time_server", clickTimeServerInSeconds); - PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); - PackageBuilder.addString(parameters, "country", deviceInfo.country); - PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); - PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "deeplink", deeplink); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); - PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); - PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); - PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); - PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); - PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); - PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); - PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); - PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); PackageBuilder.addBoolean(parameters, "google_play_instant", googlePlayInstant); PackageBuilder.addBoolean(parameters, "is_click", isClick); - PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); PackageBuilder.addDateInSeconds(parameters, "install_begin_time", installBeginTimeInSeconds); PackageBuilder.addDateInSeconds(parameters, "install_begin_time_server", installBeginTimeServerInSeconds); PackageBuilder.addString(parameters, "install_version", installVersion); - PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); - PackageBuilder.addString(parameters, "language", deviceInfo.language); - PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); - PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); - PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); - PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); - PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); - PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addMapJson(parameters, "params", extraParameters); - PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); - PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "raw_referrer", rawReferrer); PackageBuilder.addString(parameters, "referrer", referrer); PackageBuilder.addString(parameters, "referrer_api", referrerApi); PackageBuilder.addString(parameters, "reftag", reftag); - PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); - PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); - PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); - PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); - PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); PackageBuilder.addString(parameters, "source", source); - PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); - PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); - PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); PackageBuilder.addString(parameters, "payload", preinstallPayload); PackageBuilder.addString(parameters, "found_location", preinstallLocation); + if (licenseData != null) { PackageBuilder.addInteger(parameters, "lvl_response_code", licenseData.getResponseCode()); PackageBuilder.addString(parameters, "lvl_signed_data", licenseData.getSignedData()); PackageBuilder.addString(parameters, "lvl_signature", licenseData.getSignature()); } - // google play games - PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); - - // control params json - JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); - PackageBuilder.addJsonObject(parameters, "control_params", controlParams); - - injectFeatureFlagsWithParameters(parameters); - checkDeviceIds(parameters); return parameters; } @@ -590,453 +318,84 @@ private Map getClickParameters(String source) { private Map getAttributionParameters(String initiatedBy) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); - - // Check if plugin is used and if yes, add read parameters. - if (deviceInfo.imeiParameters != null) { - parameters.putAll(deviceInfo.imeiParameters); - } - - // Check if oaid plugin is used and if yes, add the parameter - if (deviceInfo.oaidParameters != null) { - parameters.putAll(deviceInfo.oaidParameters); - } - - // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); - PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); - PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); - PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); - PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); - PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); - PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); - PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); - - if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { - logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + - "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.readAndroidId(adjustConfig); - PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); - } + addCommonPackageParameters(parameters); - // Rest of the parameters. - PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); - PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); - PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); - PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); - PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); - PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); - PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); - PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addString(parameters, "initiated_by", initiatedBy); - PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); - PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); - PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); - PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); - - // google play games - PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); - - // control params json - JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); - PackageBuilder.addJsonObject(parameters, "control_params", controlParams); - - injectFeatureFlagsWithParameters(parameters); - - checkDeviceIds(parameters); - return parameters; - } - - private Map getGdprParameters() { - Map parameters = new HashMap(); - - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); - - // Check if plugin is used and if yes, add read parameters. - if (deviceInfo.imeiParameters != null) { - parameters.putAll(deviceInfo.imeiParameters); - } - - // Check if oaid plugin is used and if yes, add the parameter - if (deviceInfo.oaidParameters != null) { - parameters.putAll(deviceInfo.oaidParameters); - } - - // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); - PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); - PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); - PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); - PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); - PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); - PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); - PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); - - if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { - logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + - "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.readAndroidId(adjustConfig); - PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); - } - - // Rest of the parameters. - PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); - PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); - PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); - PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); - PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); - PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); - PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); - PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); - PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); - PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); - PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); - PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); - - // google play games - PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); - - // control params json - JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); - PackageBuilder.addJsonObject(parameters, "control_params", controlParams); - - injectFeatureFlagsWithParameters(parameters); - - checkDeviceIds(parameters); - return parameters; - } - - private Map getThirdPartySharingParameters - (final AdjustThirdPartySharing adjustThirdPartySharing) - { - Map parameters = new HashMap(); - - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); - - // Check if plugin is used and if yes, add read parameters. - if (deviceInfo.imeiParameters != null) { - parameters.putAll(deviceInfo.imeiParameters); - } - - // Check if oaid plugin is used and if yes, add the parameter - if (deviceInfo.oaidParameters != null) { - parameters.putAll(deviceInfo.oaidParameters); - } - - // Third Party Sharing - if (adjustThirdPartySharing.isEnabled != null) { - PackageBuilder.addString(parameters, "sharing", - adjustThirdPartySharing.isEnabled.booleanValue() ? - "enable" : "disable"); - } - PackageBuilder.addMapJson(parameters, "granular_third_party_sharing_options", - adjustThirdPartySharing.granularOptions); - - PackageBuilder.addMapJson(parameters, "partner_sharing_settings", - adjustThirdPartySharing.partnerSharingSettings); - - // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); - PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); - PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); - PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); - PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); - PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); - PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); - PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); - - if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { - logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + - "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.readAndroidId(adjustConfig); - PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); - } - - // Rest of the parameters. - PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); - PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); - PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); - PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); - PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); - PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); - PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); - PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); - PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); - PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); - PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); - - // google play games - PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); - - // control params json - JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); - PackageBuilder.addJsonObject(parameters, "control_params", controlParams); - - injectFeatureFlagsWithParameters(parameters); - - checkDeviceIds(parameters); - return parameters; - } - - private Map getMeasurementConsentParameters( - final boolean consentMeasurement) - { - Map parameters = new HashMap(); - - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); - - // Check if plugin is used and if yes, add read parameters. - if (deviceInfo.imeiParameters != null) { - parameters.putAll(deviceInfo.imeiParameters); - } - - // Check if oaid plugin is used and if yes, add the parameter - if (deviceInfo.oaidParameters != null) { - parameters.putAll(deviceInfo.oaidParameters); - } - - // Measurement Consent - PackageBuilder.addString(parameters, "measurement", - consentMeasurement ? "enable" : "disable"); - - // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); - PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); - PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); - PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); - PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); - PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); - PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); - PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); - - if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { - logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + - "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.readAndroidId(adjustConfig); - PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); - } - - // Rest of the parameters. - PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); - PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); - PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); - PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); - PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); - PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); - PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); - PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); - PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); - PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); - PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); - - // google play games - PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); - - // control params json - JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); - PackageBuilder.addJsonObject(parameters, "control_params", controlParams); - - injectFeatureFlagsWithParameters(parameters); - - checkDeviceIds(parameters); - return parameters; - } - - private Map getAdRevenueParameters(AdjustAdRevenue adjustAdRevenue) { - Map parameters = new HashMap(); - - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); - - // Check if plugin is used and if yes, add read parameters. - if (deviceInfo.imeiParameters != null) { - parameters.putAll(deviceInfo.imeiParameters); - } - - // Check if oaid plugin is used and if yes, add the parameter - if (deviceInfo.oaidParameters != null) { - parameters.putAll(deviceInfo.oaidParameters); - } - - // Callback and partner parameters. - PackageBuilder.addMapJson(parameters, "callback_params", Util.mergeParameters(this.globalParameters.callbackParameters, adjustAdRevenue.callbackParameters, "Callback")); - PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.globalParameters.partnerParameters, adjustAdRevenue.partnerParameters, "Partner")); - - // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); - PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); - PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); - PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); - PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); - PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); - PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); - PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); - if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { - logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + - "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.readAndroidId(adjustConfig); - PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); - } - - // Rest of the parameters. - PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); - PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); - PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); - PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); - PackageBuilder.addString(parameters, "country", deviceInfo.country); - PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); - PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); - PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); - PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); - PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); - PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); - PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); - PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); - PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); - PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); - PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); - PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); - PackageBuilder.addString(parameters, "language", deviceInfo.language); - PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); - PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); - PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); - PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); - PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); - PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); - PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); - PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); - PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); - PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); - PackageBuilder.addString(parameters, "source", adjustAdRevenue.source); - PackageBuilder.addDoubleWithoutRounding(parameters, "revenue", adjustAdRevenue.revenue); - PackageBuilder.addString(parameters, "currency", adjustAdRevenue.currency); - PackageBuilder.addInteger(parameters, "ad_impressions_count", adjustAdRevenue.adImpressionsCount); - PackageBuilder.addString(parameters, "ad_revenue_network", adjustAdRevenue.adRevenueNetwork); - PackageBuilder.addString(parameters, "ad_revenue_unit", adjustAdRevenue.adRevenueUnit); - PackageBuilder.addString(parameters, "ad_revenue_placement", adjustAdRevenue.adRevenuePlacement); - PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); - PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); - PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); - PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); - PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); - - // google play games - PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + checkDeviceIds(parameters); + return parameters; + } - // control params json - JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); - PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + private Map getGdprParameters() { + Map parameters = new HashMap(); - injectFeatureFlagsWithParameters(parameters); + addCommonPackageParameters(parameters); checkDeviceIds(parameters); return parameters; } - private Map getSubscriptionParameters(AdjustPlayStoreSubscription subscription) { + private Map getThirdPartySharingParameters + (final AdjustThirdPartySharing adjustThirdPartySharing) + { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + addCommonPackageParameters(parameters); - // Check if plugin is used and if yes, add read parameters. - if (deviceInfo.imeiParameters != null) { - parameters.putAll(deviceInfo.imeiParameters); + if (adjustThirdPartySharing.isEnabled != null) { + PackageBuilder.addString(parameters, "sharing", adjustThirdPartySharing.isEnabled.booleanValue() ? "enable" : "disable"); } - // Check if oaid plugin is used and if yes, add the parameter - if (deviceInfo.oaidParameters != null) { - parameters.putAll(deviceInfo.oaidParameters); - } + PackageBuilder.addMapJson(parameters, "granular_third_party_sharing_options", adjustThirdPartySharing.granularOptions); + PackageBuilder.addMapJson(parameters, "partner_sharing_settings", adjustThirdPartySharing.partnerSharingSettings); - // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); - PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); - PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); - PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); - PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); - PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); - PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); - PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); + checkDeviceIds(parameters); + return parameters; + } - if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { - logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + - "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.readAndroidId(adjustConfig); - PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); - } + private Map getMeasurementConsentParameters(final boolean consentMeasurement) { + Map parameters = new HashMap<>(); - // Callback and partner parameters. - PackageBuilder.addMapJson(parameters, "callback_params", Util.mergeParameters(this.globalParameters.callbackParameters, subscription.getCallbackParameters(), "Callback")); - PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.globalParameters.partnerParameters, subscription.getPartnerParameters(), "Partner")); + addCommonPackageParameters(parameters); - // Rest of the parameters. - PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); - PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); - PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); - PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); - PackageBuilder.addString(parameters, "country", deviceInfo.country); - PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); - PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); + PackageBuilder.addString(parameters, "measurement", consentMeasurement ? "enable" : "disable"); + + checkDeviceIds(parameters); + return parameters; + } + + private Map getAdRevenueParameters(AdjustAdRevenue adjustAdRevenue) { + Map parameters = new HashMap(); + + addCommonPackageParameters(parameters); + + PackageBuilder.addMapJson(parameters, "callback_params", + Util.mergeParameters(globalParameters.callbackParameters, adjustAdRevenue.callbackParameters, "Callback")); + PackageBuilder.addMapJson(parameters, "partner_params", + Util.mergeParameters(globalParameters.partnerParameters, adjustAdRevenue.partnerParameters, "Partner")); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); - PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); - PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); - PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); - PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); - PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); - PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); - PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); - PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); - PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); - PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); - PackageBuilder.addString(parameters, "language", deviceInfo.language); - PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); - PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); - PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); - PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); - PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); - PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); - PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); - PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); - PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); - PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); - PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); - PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); - PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); - PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); - PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); + PackageBuilder.addString(parameters, "source", adjustAdRevenue.source); + PackageBuilder.addDoubleWithoutRounding(parameters, "revenue", adjustAdRevenue.revenue); + PackageBuilder.addString(parameters, "currency", adjustAdRevenue.currency); + PackageBuilder.addInteger(parameters, "ad_impressions_count", adjustAdRevenue.adImpressionsCount); + PackageBuilder.addString(parameters, "ad_revenue_network", adjustAdRevenue.adRevenueNetwork); + PackageBuilder.addString(parameters, "ad_revenue_unit", adjustAdRevenue.adRevenueUnit); + PackageBuilder.addString(parameters, "ad_revenue_placement", adjustAdRevenue.adRevenuePlacement); + + checkDeviceIds(parameters); + return parameters; + } + + private Map getSubscriptionParameters(AdjustPlayStoreSubscription subscription) { + Map parameters = new HashMap(); - // subscription specific parameters + addCommonPackageParameters(parameters); + + PackageBuilder.addMapJson(parameters, "callback_params", + Util.mergeParameters(globalParameters.callbackParameters, subscription.getCallbackParameters(), "Callback")); + PackageBuilder.addMapJson(parameters, "partner_params", + Util.mergeParameters(globalParameters.partnerParameters, subscription.getPartnerParameters(), "Partner")); + PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); PackageBuilder.addString(parameters, "currency", subscription.getCurrency()); PackageBuilder.addString(parameters, "product_id", subscription.getSku()); PackageBuilder.addString(parameters, "purchase_token", subscription.getPurchaseToken()); @@ -1045,15 +404,6 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio PackageBuilder.addDateInMilliseconds(parameters, "transaction_date", subscription.getPurchaseTime()); PackageBuilder.addString(parameters, "transaction_id", subscription.getOrderId()); - // google play games - PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); - - // control params json - JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); - PackageBuilder.addJsonObject(parameters, "control_params", controlParams); - - injectFeatureFlagsWithParameters(parameters); - checkDeviceIds(parameters); return parameters; } @@ -1061,88 +411,12 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio private Map getVerificationParameters(AdjustPlayStorePurchase purchase) { Map parameters = new HashMap(); - deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); - - // Check if plugin is used and if yes, add read parameters. - if (deviceInfo.imeiParameters != null) { - parameters.putAll(deviceInfo.imeiParameters); - } - - // Check if oaid plugin is used and if yes, add the parameter - if (deviceInfo.oaidParameters != null) { - parameters.putAll(deviceInfo.oaidParameters); - } - - // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); - PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); - PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); - PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); - PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); - PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); - PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); - - if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { - logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + - "fallback to non Google Play and Fire identifiers will take place"); - deviceInfo.readAndroidId(adjustConfig); - PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); - } + addCommonPackageParameters(parameters); - // Rest of the parameters. - PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); - PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); - PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); - PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); - PackageBuilder.addString(parameters, "country", deviceInfo.country); - PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); - PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); - PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); - PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); - PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); - PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); - PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); - PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); - PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); - PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); - PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); - PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); - PackageBuilder.addString(parameters, "language", deviceInfo.language); - PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); - PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); - PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); - PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); - PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); - PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); - PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); - PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); - PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); - PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); - PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); - PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); - PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); - PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); - PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); - - // purchase verification specific parameters PackageBuilder.addString(parameters, "product_id", purchase.getProductId()); PackageBuilder.addString(parameters, "purchase_token", purchase.getPurchaseToken()); - // google play games - PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); - - // control params json - JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); - PackageBuilder.addJsonObject(parameters, "control_params", controlParams); - - injectFeatureFlagsWithParameters(parameters); - checkDeviceIds(parameters); return parameters; } @@ -1150,6 +424,20 @@ private Map getVerificationParameters(AdjustPlayStorePurchase pu private Map getVerificationParameters(AdjustEvent event) { Map parameters = new HashMap(); + addCommonPackageParameters(parameters); + + PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); + PackageBuilder.addString(parameters, "product_id", event.getProductId()); + PackageBuilder.addString(parameters, "purchase_token", event.getPurchaseToken()); + PackageBuilder.addString(parameters, "event_token", event.getEventToken()); + PackageBuilder.addString(parameters, "currency", event.getCurrency()); + PackageBuilder.addDouble(parameters, "revenue", event.getRevenue()); + + checkDeviceIds(parameters); + return parameters; + } + + private void addCommonPackageParameters(final Map parameters) { deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. @@ -1179,60 +467,59 @@ private Map getVerificationParameters(AdjustEvent event) { PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } - // Rest of the parameters. - PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); + PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); + PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); + PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); + + PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); + + // config PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); - PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); + PackageBuilder.addString(parameters, "environment", adjustConfig.environment); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); - PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); - PackageBuilder.addString(parameters, "country", deviceInfo.country); + PackageBuilder.addBoolean(parameters, "needs_response_details", true); + + // app info + PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); + PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); + PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); + PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); + PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); + + // Device details PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); - PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); + PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); - PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); - PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); - PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); - PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); - PackageBuilder.addString(parameters, "language", deviceInfo.language); - PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); - PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); - PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); - PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); - PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); - PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); - PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); + PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); + PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); + PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); + PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); + PackageBuilder.addString(parameters, "country", deviceInfo.country); + PackageBuilder.addString(parameters, "language", deviceInfo.language); + PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); + PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); + PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); + + // session parameters PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); - PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); - - // purchase verification specific parameters - PackageBuilder.addString(parameters, "product_id", event.getProductId()); - PackageBuilder.addString(parameters, "purchase_token", event.getPurchaseToken()); - PackageBuilder.addString(parameters, "event_token", event.getEventToken()); - PackageBuilder.addString(parameters, "currency", event.getCurrency()); - PackageBuilder.addDouble(parameters, "revenue", event.getRevenue()); - // google play games - PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); injectFeatureFlagsWithParameters(parameters); - - checkDeviceIds(parameters); - return parameters; } private ActivityPackage getDefaultActivityPackage(ActivityKind activityKind) { @@ -1471,6 +758,10 @@ private void checkDeviceIds(Map parameters) { logger.info("Missing Device IDs. COPPA enabled."); } else if (adjustConfig.playStoreKidsComplianceEnabled) { logger.info("Missing Device IDs. Play store kids compliance enabled."); + } else if (!adjustConfig.isGoogleAdIdReadingEnabled) { + logger.info("Missing Google Advertising ID, reading disabled."); + } else if (!adjustConfig.isAndroidIdReadingEnabled) { + logger.info("Missing Android ID, reading disabled."); } else { logger.error("Missing Device IDs. Please check if Proguard is correctly set with Adjust SDK"); } From 00812ac242283238d9e6d9bab0e9970ed17ce0da Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 25 Jun 2026 14:55:07 +0200 Subject: [PATCH 527/540] fix: allow reading of Ids not disabled for reading --- .../src/main/java/com/adjust/sdk/Util.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index 8015ded9a..d71feb4e3 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -680,26 +680,36 @@ public static boolean isEqualReferrerDetails(final ReferrerDetails referrerDetai return false; } + public static boolean canReadIds(final AdjustConfig adjustConfig) { + return !adjustConfig.coppaComplianceEnabled && !adjustConfig.playStoreKidsComplianceEnabled; + } + public static boolean canReadPlayIds(final AdjustConfig adjustConfig) { - return !adjustConfig.coppaComplianceEnabled && !adjustConfig.playStoreKidsComplianceEnabled && adjustConfig.isGoogleAdIdReadingEnabled; + if (!adjustConfig.isAppSetIdReadingEnabled) { + return false; + } + return canReadIds(adjustConfig); } public static boolean canReadAndroidId(final AdjustConfig adjustConfig) { - return !adjustConfig.coppaComplianceEnabled && !adjustConfig.playStoreKidsComplianceEnabled && adjustConfig.isAndroidIdReadingEnabled; + if (!adjustConfig.isAppSetIdReadingEnabled) { + return false; + } + return canReadIds(adjustConfig); } public static boolean canReadAppSetId(final AdjustConfig adjustConfig) { if (!adjustConfig.isAppSetIdReadingEnabled) { return false; } - return canReadPlayIds(adjustConfig); + return canReadIds(adjustConfig); } public static boolean canReadFbId(final AdjustConfig adjustConfig) { if (!adjustConfig.isFbIdReadingEnabled) { return false; } - return canReadAndroidId(adjustConfig); + return canReadIds(adjustConfig); } public static boolean isGooglePlayGamesForPC(final Context context) { From 14ba890114aa4d1ccd9dfeb69948f3ff9d7facd1 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 25 Jun 2026 15:10:04 +0200 Subject: [PATCH 528/540] fix: check for correct Id config flag --- Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index d71feb4e3..10a7bdb09 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -685,14 +685,14 @@ public static boolean canReadIds(final AdjustConfig adjustConfig) { } public static boolean canReadPlayIds(final AdjustConfig adjustConfig) { - if (!adjustConfig.isAppSetIdReadingEnabled) { + if (!adjustConfig.isGoogleAdIdReadingEnabled) { return false; } return canReadIds(adjustConfig); } public static boolean canReadAndroidId(final AdjustConfig adjustConfig) { - if (!adjustConfig.isAppSetIdReadingEnabled) { + if (!adjustConfig.isAndroidIdReadingEnabled) { return false; } return canReadIds(adjustConfig); From 3f4e76f1e3cf72fb1db83b484d77512fe38534e4 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 10 Jul 2026 10:40:06 +0200 Subject: [PATCH 529/540] refac: rename Id reading check methods --- .../java/com/adjust/sdk/ActivityHandler.java | 8 ++--- .../main/java/com/adjust/sdk/DeviceInfo.java | 10 +++--- .../src/main/java/com/adjust/sdk/Util.java | 32 +++++++++---------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index be0334b0e..e9eba4a0e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1219,14 +1219,14 @@ public void run(ActivityHandler activityHandler) { deviceInfo.reloadPlayIds(adjustConfig); if (deviceInfo.playAdId == null) { - if (!Util.canReadPlayIds(adjustConfig)) { - logger.info("Cannot read Google Play Services Advertising ID with COPPA or play store kids app enabled or reading disabled"); + if (!Util.isGoogleAdvertisingIdReadingEnabled(adjustConfig)) { + logger.info("Cannot read Google Advertising ID with COPPA or play store kids app enabled or reading disabled"); } else { - logger.warn("Unable to get Google Play Services Advertising ID at start time"); + logger.warn("Unable to get Google Advertising ID at start time"); } if (deviceInfo.androidId == null) { - if (! Util.canReadAndroidId(adjustConfig)) { + if (! Util.isAndroidIdReadingEnabled(adjustConfig)) { logger.info("Cannot read Android ID with COPPA or play store kids app enabled or reading disabled"); } else { logger.error("Unable to get Android Id. Please check if Proguard is correctly set with Adjust SDK"); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 335ad60a2..b5a4430d5 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -133,7 +133,7 @@ class DeviceInfo { displayWidth = getDisplayWidth(displayMetrics); displayHeight = getDisplayHeight(displayMetrics); clientSdk = getClientSdk(adjustConfig.sdkPrefix); - if (Util.canReadFbId(adjustConfig)) { + if (Util.isFbIdReadingEnabled(adjustConfig)) { fbAttributionId = getFacebookAttributionId(context); } hardwareName = getHardwareName(); @@ -142,7 +142,7 @@ class DeviceInfo { appInstallTime = getAppInstallTime(packageInfo); appUpdateTime = getAppUpdateTime(packageInfo); uiMode = getDeviceUiMode(configuration); - if (Util.canReadAppSetId(adjustConfig)) { + if (Util.isAppSetIdReadingEnabled(adjustConfig)) { appSetId = Reflection.getAppSetId(context); } storeInfoFromClient = StoreInfoUtil.getStoreInfoFromClient(adjustConfig, context); @@ -155,7 +155,7 @@ class DeviceInfo { void reloadPlayIds(final AdjustConfig adjustConfig) { if (playIdsReadOnce && adjustConfig.isDeviceIdsReadingOnceEnabled) { - if (!Util.canReadPlayIds(adjustConfig)) { + if (!Util.isGoogleAdvertisingIdReadingEnabled(adjustConfig)) { playAdId = null; isTrackingEnabled = null; playAdIdSource = null; @@ -169,7 +169,7 @@ void reloadPlayIds(final AdjustConfig adjustConfig) { playAdIdSource = null; playAdIdAttempt = -1; - if (!Util.canReadPlayIds(adjustConfig)) { + if (!Util.isGoogleAdvertisingIdReadingEnabled(adjustConfig)) { return; } @@ -249,7 +249,7 @@ void reloadPlayIds(final AdjustConfig adjustConfig) { } void readAndroidId(final AdjustConfig adjustConfig) { - if (!Util.canReadAndroidId(adjustConfig)) { + if (!Util.isAndroidIdReadingEnabled(adjustConfig)) { return; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index 10a7bdb09..be0236926 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -680,36 +680,36 @@ public static boolean isEqualReferrerDetails(final ReferrerDetails referrerDetai return false; } - public static boolean canReadIds(final AdjustConfig adjustConfig) { - return !adjustConfig.coppaComplianceEnabled && !adjustConfig.playStoreKidsComplianceEnabled; - } - - public static boolean canReadPlayIds(final AdjustConfig adjustConfig) { - if (!adjustConfig.isGoogleAdIdReadingEnabled) { + public static boolean isGoogleAdvertisingIdReadingEnabled(final AdjustConfig adjustConfig) { + if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled) { return false; } - return canReadIds(adjustConfig); + + return adjustConfig.isGoogleAdIdReadingEnabled; } - public static boolean canReadAndroidId(final AdjustConfig adjustConfig) { - if (!adjustConfig.isAndroidIdReadingEnabled) { + public static boolean isAndroidIdReadingEnabled(final AdjustConfig adjustConfig) { + if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled) { return false; } - return canReadIds(adjustConfig); + + return adjustConfig.isAndroidIdReadingEnabled; } - public static boolean canReadAppSetId(final AdjustConfig adjustConfig) { - if (!adjustConfig.isAppSetIdReadingEnabled) { + public static boolean isAppSetIdReadingEnabled(final AdjustConfig adjustConfig) { + if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled) { return false; } - return canReadIds(adjustConfig); + + return adjustConfig.isAppSetIdReadingEnabled; } - public static boolean canReadFbId(final AdjustConfig adjustConfig) { - if (!adjustConfig.isFbIdReadingEnabled) { + public static boolean isFbIdReadingEnabled(final AdjustConfig adjustConfig) { + if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled) { return false; } - return canReadIds(adjustConfig); + + return adjustConfig.isFbIdReadingEnabled; } public static boolean isGooglePlayGamesForPC(final Context context) { From 9f3745ff5621d005d9409d995ba08150d81655a3 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 10 Jul 2026 11:44:54 +0200 Subject: [PATCH 530/540] refac: rename all references of playAdId to googleAdId --- .../java/com/adjust/sdk/ActivityHandler.java | 6 +- .../main/java/com/adjust/sdk/DeviceInfo.java | 68 +++++++++---------- .../java/com/adjust/sdk/PackageBuilder.java | 14 ++-- .../main/java/com/adjust/sdk/Reflection.java | 12 ++-- .../src/main/java/com/adjust/sdk/Util.java | 48 ++++++------- 5 files changed, 74 insertions(+), 74 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java index e9eba4a0e..3dddd7518 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1217,9 +1217,9 @@ public void run(ActivityHandler activityHandler) { deviceInfo = new DeviceInfo(adjustConfig); - deviceInfo.reloadPlayIds(adjustConfig); - if (deviceInfo.playAdId == null) { - if (!Util.isGoogleAdvertisingIdReadingEnabled(adjustConfig)) { + deviceInfo.reloadGoogleAdId(adjustConfig); + if (deviceInfo.googleAdId == null) { + if (!Util.isGoogleAdIdReadingEnabled(adjustConfig)) { logger.info("Cannot read Google Advertising ID with COPPA or play store kids app enabled or reading disabled"); } else { logger.warn("Unable to get Google Advertising ID at start time"); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index b5a4430d5..70fb67782 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -59,12 +59,12 @@ class DeviceInfo { "0d247663b26a9031e15f84bc1c74d141ff98a02d76f85b2c8ab2571b6469b232d8e768a7f7" + "ca04f7abe4a775615916c07940656b58717457b42bd928a2"; - String playAdId; - String playAdIdSource; - int playAdIdAttempt = -1; + String googleAdId; + String googleAdIdSource; + int googleAdIdReadAttempt = -1; Boolean isTrackingEnabled; private boolean androidIdReadOnce = false; - private boolean playIdsReadOnce = false; + private boolean googleAdIdReadOnce = false; private boolean otherDeviceIdsParamsReadOnce = false; String androidId; String fbAttributionId; @@ -153,35 +153,35 @@ class DeviceInfo { isUpdatedSystemApp = StoreInfoUtil.getIsUpdatedSystemApp(context); } - void reloadPlayIds(final AdjustConfig adjustConfig) { - if (playIdsReadOnce && adjustConfig.isDeviceIdsReadingOnceEnabled) { - if (!Util.isGoogleAdvertisingIdReadingEnabled(adjustConfig)) { - playAdId = null; + void reloadGoogleAdId(final AdjustConfig adjustConfig) { + if (googleAdIdReadOnce && adjustConfig.isDeviceIdsReadingOnceEnabled) { + if (!Util.isGoogleAdIdReadingEnabled(adjustConfig)) { + googleAdId = null; isTrackingEnabled = null; - playAdIdSource = null; - playAdIdAttempt = -1; + googleAdIdSource = null; + googleAdIdReadAttempt = -1; } return; } - playAdId = null; + googleAdId = null; isTrackingEnabled = null; - playAdIdSource = null; - playAdIdAttempt = -1; + googleAdIdSource = null; + googleAdIdReadAttempt = -1; - if (!Util.isGoogleAdvertisingIdReadingEnabled(adjustConfig)) { + if (!Util.isGoogleAdIdReadingEnabled(adjustConfig)) { return; } Context context = adjustConfig.context; if (Reflection.isAppRunningInSamsungCloudEnvironment(context, adjustConfig.logger)) { - playAdId = Reflection.getSamsungCloudDevGoogleAdId(context, adjustConfig.logger); - playAdIdSource = "samsung_cloud_sdk"; - playIdsReadOnce = true; + googleAdId = Reflection.getSamsungCloudDevGoogleAdId(context, adjustConfig.logger); + googleAdIdSource = "samsung_cloud_sdk"; + googleAdIdReadOnce = true; } - String previousPlayAdId = playAdId; + String previousGoogleAdId = googleAdId; Boolean previousIsTrackingEnabled = isTrackingEnabled; // attempt connecting to Google Play Service by own @@ -193,17 +193,17 @@ void reloadPlayIds(final AdjustConfig adjustConfig) { GooglePlayServicesClient.GooglePlayServicesInfo gpsInfo = GooglePlayServicesClient.getGooglePlayServicesInfo(context, timeoutServiceMilli); - if (playAdId == null) { - playAdId = gpsInfo.getGpsAdid(); - playIdsReadOnce = true; + if (googleAdId == null) { + googleAdId = gpsInfo.getGpsAdid(); + googleAdIdReadOnce = true; } if (isTrackingEnabled == null) { isTrackingEnabled = gpsInfo.isTrackingEnabled(); } - if (playAdId != null && isTrackingEnabled != null) { - playAdIdSource = "service"; - playAdIdAttempt = serviceAttempt; + if (googleAdId != null && isTrackingEnabled != null) { + googleAdIdSource = "service"; + googleAdIdReadAttempt = serviceAttempt; return; } } catch (Exception e) {} @@ -219,29 +219,29 @@ void reloadPlayIds(final AdjustConfig adjustConfig) { continue; } - if (playAdId == null) { + if (googleAdId == null) { // just needs a short timeout since it should be just accessing a POJO - playAdId = Util.getPlayAdId( + googleAdId = Util.getGoogleAdId( context, advertisingInfoObject, Constants.ONE_SECOND); - playIdsReadOnce = true; + googleAdIdReadOnce = true; } if (isTrackingEnabled == null) { // just needs a short timeout since it should be just accessing a POJO - isTrackingEnabled = Util.isPlayTrackingEnabled( + isTrackingEnabled = Util.isGoogleAdIdTrackingEnabled( context, advertisingInfoObject, Constants.ONE_SECOND); } - if (playAdId != null && isTrackingEnabled != null) { - playAdIdSource = "library"; - playAdIdAttempt = libAttempt; + if (googleAdId != null && isTrackingEnabled != null) { + googleAdIdSource = "library"; + googleAdIdReadAttempt = libAttempt; return; } } // if both weren't found, use previous values - if (playAdId == null) { - playAdId = previousPlayAdId; - playIdsReadOnce = true; + if (googleAdId == null) { + googleAdId = previousGoogleAdId; + googleAdIdReadOnce = true; } if (isTrackingEnabled == null) { isTrackingEnabled = previousIsTrackingEnabled; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index d7ee39c58..65a7f9f30 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -451,16 +451,16 @@ private void addCommonPackageParameters(final Map parameters) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig); + deviceInfo.reloadGoogleAdId(adjustConfig); PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); - PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); - PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.playAdIdAttempt); - PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); + PackageBuilder.addString(parameters, "gps_adid", deviceInfo.googleAdId); + PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.googleAdIdReadAttempt); + PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.googleAdIdSource); PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); - if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { + if (!containsGoogleAdId(parameters) && !containsFireAdId(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + "fallback to non Google Play and Fire identifiers will take place"); deviceInfo.readAndroidId(adjustConfig); @@ -729,14 +729,14 @@ private static void addInteger(Map parameters, String key, Integ PackageBuilder.addString(parameters, key, intString); } - private boolean containsPlayIds(Map parameters) { + private boolean containsGoogleAdId(Map parameters) { if (parameters == null) { return false; } return parameters.containsKey("gps_adid"); } - private boolean containsFireIds(Map parameters) { + private boolean containsFireAdId(Map parameters) { if (parameters == null) { return false; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java index 03f07ff72..0e31dbfaf 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Reflection.java @@ -41,20 +41,20 @@ static Map getOaidParameters(Context context, ILogger logger) { return null; } - public static String getPlayAdId(Context context, Object AdvertisingInfoObject) { + public static String getGoogleAdId(Context context, Object AdvertisingInfoObject) { try { - String playAdid = (String) invokeInstanceMethod(AdvertisingInfoObject, "getId", null); - return playAdid; + String googleAdId = (String) invokeInstanceMethod(AdvertisingInfoObject, "getId", null); + return googleAdId; } catch (Throwable t) { return null; } } - public static Boolean isPlayTrackingEnabled(Context context, Object AdvertisingInfoObject) { + public static Boolean isGoogleAdIdTrackingEnabled(Context context, Object AdvertisingInfoObject) { try { Boolean isLimitedTrackingEnabled = (Boolean) invokeInstanceMethod(AdvertisingInfoObject, "isLimitAdTrackingEnabled", null); - Boolean isPlayTrackingEnabled = (isLimitedTrackingEnabled == null ? null : !isLimitedTrackingEnabled); - return isPlayTrackingEnabled; + Boolean isGoogleAdIdTrackingEnabled = (isLimitedTrackingEnabled == null ? null : !isLimitedTrackingEnabled); + return isGoogleAdIdTrackingEnabled; } catch (Throwable t) { return null; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index be0236926..ccddea508 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -64,7 +64,7 @@ public class Util { public static final SimpleDateFormat dateFormatter = new SimpleDateFormat(DATE_FORMAT, Locale.US); // https://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html - private static volatile SingleThreadFutureScheduler playAdIdScheduler = null; + private static volatile SingleThreadFutureScheduler googleAdIdScheduler = null; private static ILogger getLogger() { return AdjustFactory.getLogger(); @@ -94,7 +94,7 @@ public static String quote(String string) { } public static Object getAdvertisingInfoObject(final Context context, long timeoutMilli) { - return runSyncInPlayAdIdSchedulerWithTimeout(context, new Callable() { + return runSyncInGoogleAdIdSchedulerWithTimeout(context, new Callable() { @Override public Object call() { try { @@ -106,46 +106,46 @@ public Object call() { }, timeoutMilli); } - public static String getPlayAdId(final Context context, - final Object advertisingInfoObject, - long timeoutMilli) + public static String getGoogleAdId(final Context context, + final Object advertisingInfoObject, + long timeoutMilli) { - return runSyncInPlayAdIdSchedulerWithTimeout(context, new Callable() { + return runSyncInGoogleAdIdSchedulerWithTimeout(context, new Callable() { @Override public String call() { - return Reflection.getPlayAdId(context, advertisingInfoObject); + return Reflection.getGoogleAdId(context, advertisingInfoObject); } }, timeoutMilli); } - public static Boolean isPlayTrackingEnabled(final Context context, - final Object advertisingInfoObject, - long timeoutMilli) + public static Boolean isGoogleAdIdTrackingEnabled(final Context context, + final Object advertisingInfoObject, + long timeoutMilli) { - return runSyncInPlayAdIdSchedulerWithTimeout(context, new Callable() { + return runSyncInGoogleAdIdSchedulerWithTimeout(context, new Callable() { @Override public Boolean call() { - return Reflection.isPlayTrackingEnabled(context, advertisingInfoObject); + return Reflection.isGoogleAdIdTrackingEnabled(context, advertisingInfoObject); } }, timeoutMilli); } - private static R runSyncInPlayAdIdSchedulerWithTimeout(final Context context, - Callable callable, - long timeoutMilli) + private static R runSyncInGoogleAdIdSchedulerWithTimeout(final Context context, + Callable callable, + long timeoutMilli) { - if (playAdIdScheduler == null) { + if (googleAdIdScheduler == null) { synchronized (Util.class) { - if (playAdIdScheduler == null) { - playAdIdScheduler = new SingleThreadFutureScheduler("PlayAdIdLibrary", true); + if (googleAdIdScheduler == null) { + googleAdIdScheduler = new SingleThreadFutureScheduler("PlayAdIdLibrary", true); } } } - ScheduledFuture playAdIdFuture = playAdIdScheduler.scheduleFutureWithReturn(callable, 0); + ScheduledFuture googleAdIdFuture = googleAdIdScheduler.scheduleFutureWithReturn(callable, 0); try { - return playAdIdFuture.get(timeoutMilli, TimeUnit.MILLISECONDS); + return googleAdIdFuture.get(timeoutMilli, TimeUnit.MILLISECONDS); } catch (ExecutionException e) { } catch (InterruptedException e) { } catch (TimeoutException e) { @@ -172,9 +172,9 @@ protected String doInBackground(Context... params) { } @Override - protected void onPostExecute(String playAdiId) { + protected void onPostExecute(String googleAdiId) { if (onGoogleAdIdReadListener != null) { - onGoogleAdIdReadListener.onGoogleAdIdRead(playAdiId); + onGoogleAdIdReadListener.onGoogleAdIdRead(googleAdiId); } } }.execute(context); @@ -196,7 +196,7 @@ private static String getGoogleAdId(Context context) { context, Constants.ONE_SECOND * 11); if (advertisingInfoObject != null) { - googleAdId = Util.getPlayAdId(context, advertisingInfoObject, Constants.ONE_SECOND); + googleAdId = Util.getGoogleAdId(context, advertisingInfoObject, Constants.ONE_SECOND); } } @@ -680,7 +680,7 @@ public static boolean isEqualReferrerDetails(final ReferrerDetails referrerDetai return false; } - public static boolean isGoogleAdvertisingIdReadingEnabled(final AdjustConfig adjustConfig) { + public static boolean isGoogleAdIdReadingEnabled(final AdjustConfig adjustConfig) { if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled) { return false; } From 42848eab6aa18b96eb459ae58bdd57d1ebb29b38 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 10 Jul 2026 15:31:57 +0200 Subject: [PATCH 531/540] feat: add disable fire adid method in config --- .../src/main/assets/adjust_config.js | 5 +++++ .../com/adjust/sdk/webbridge/AdjustBridgeInstance.java | 9 +++++++++ .../src/main/java/com/adjust/sdk/AdjustConfig.java | 10 ++++++++++ .../src/main/java/com/adjust/sdk/DeviceInfo.java | 4 ++-- .../src/main/java/com/adjust/sdk/PackageBuilder.java | 6 ++++++ Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java | 8 ++++++++ .../java/com/adjust/testapp/AdjustCommandExecutor.java | 8 ++++++++ 7 files changed, 48 insertions(+), 2 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js index fa722c1c8..ddf1b3364 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -61,6 +61,7 @@ function AdjustConfig(appToken, environment, legacy) { this.isAndroidIdReadingEnabled = null; this.isAppSetIdReadingEnabled = null; this.isFbIdReadingEnabled = null; + this.isFireAdIdReadingEnabled = null; } AdjustConfig.EnvironmentSandbox = 'sandbox'; @@ -302,3 +303,7 @@ AdjustConfig.prototype.disableAppSetIdReading = function() { AdjustConfig.prototype.disableFbIdReading = function() { this.isFbIdReadingEnabled = false; }; + +AdjustConfig.prototype.disableFireAdIdReading = function() { + this.isFireAdIdReadingEnabled = false; +}; diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 86d6b078e..9251ba340 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -194,6 +194,7 @@ public void initSdk(String adjustConfigString, String bridgeToken) { Object isAndroidIdReadingEnabledField = jsonAdjustConfig.get("isAndroidIdReadingEnabled"); Object isAppSetIdReadingEnabledField = jsonAdjustConfig.get("isAppSetIdReadingEnabled"); Object isFbIdReadingEnabledField = jsonAdjustConfig.get("isFbIdReadingEnabled"); + Object isFireAdIdReadingEnabledField = jsonAdjustConfig.get("isFireAdIdReadingEnabled"); String appToken = AdjustBridgeUtil.fieldToString(appTokenField); String environment = AdjustBridgeUtil.fieldToString(environmentField); @@ -505,6 +506,14 @@ public void onRemoteTrigger(AdjustRemoteTrigger remoteTrigger) { } } + // Fire AdId reading + Boolean isFireAdIdReadingEnabled = AdjustBridgeUtil.fieldToBoolean(isFireAdIdReadingEnabledField); + if (isFireAdIdReadingEnabled != null) { + if (!isFireAdIdReadingEnabled) { + adjustConfig.disableFireAdIdReading(); + } + } + enableBridgeSecurity(); Adjust.initSdk(adjustConfig); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 1850be925..94788db19 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -57,6 +57,7 @@ public class AdjustConfig { boolean isAndroidIdReadingEnabled; boolean isAppSetIdReadingEnabled; boolean isFbIdReadingEnabled; + boolean isFireAdIdReadingEnabled; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; @@ -99,6 +100,7 @@ private void init(Context context, String appToken, String environment, boolean this.isAndroidIdReadingEnabled = true; this.isAppSetIdReadingEnabled = true; this.isFbIdReadingEnabled = true; + this.isFireAdIdReadingEnabled = true; } public void setLogLevel(LogLevel logLevel) { @@ -227,6 +229,10 @@ public void disableFbIdReading() { this.isFbIdReadingEnabled = false; } + public void disableFireAdIdReading() { + this.isFireAdIdReadingEnabled = false; + } + public Context getContext() { return context; } @@ -351,6 +357,10 @@ public boolean isFbIdReadingEnabled() { return isFbIdReadingEnabled; } + public boolean isFireAdIdReadingEnabled() { + return isFireAdIdReadingEnabled; + } + private boolean checkContext(Context context) { if (context == null) { logger.error("Missing context"); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 70fb67782..24d50947c 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -534,7 +534,7 @@ private static Map getOaidParameters(final AdjustConfig adjustCo } private static String getFireAdvertisingId(final AdjustConfig adjustConfig) { - if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled) { + if (!Util.isFireAdIdReadingEnabled(adjustConfig)) { return null; } @@ -568,7 +568,7 @@ private static void getFireAdvertisingIdAsync(final ContentResolver contentResol } private static Boolean getFireTrackingEnabled(final AdjustConfig adjustConfig) { - if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled) { + if (!Util.isFireAdIdReadingEnabled(adjustConfig)) { return null; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 65a7f9f30..67343f0ca 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -565,6 +565,10 @@ private void injectFeatureFlagsWithParameters(Map parameters) { PackageBuilder.addBoolean(parameters, "ff_fb_id_disabled", true); } + if (!adjustConfig.isFireAdIdReadingEnabled) { + PackageBuilder.addBoolean(parameters, "ff_fire_adid_disabled", true); + } + if (adjustConfig.onRemoteTriggerListener != null) { PackageBuilder.addBoolean(parameters, "ff_remote_triggers_callback", true); } @@ -762,6 +766,8 @@ private void checkDeviceIds(Map parameters) { logger.info("Missing Google Advertising ID, reading disabled."); } else if (!adjustConfig.isAndroidIdReadingEnabled) { logger.info("Missing Android ID, reading disabled."); + } else if (!adjustConfig.isFireAdIdReadingEnabled) { + logger.info("Missing Fire Advertising ID, reading disabled."); } else { logger.error("Missing Device IDs. Please check if Proguard is correctly set with Adjust SDK"); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index ccddea508..0b8b7cef7 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -712,6 +712,14 @@ public static boolean isFbIdReadingEnabled(final AdjustConfig adjustConfig) { return adjustConfig.isFbIdReadingEnabled; } + public static boolean isFireAdIdReadingEnabled(final AdjustConfig adjustConfig) { + if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled) { + return false; + } + + return adjustConfig.isFireAdIdReadingEnabled; + } + public static boolean isGooglePlayGamesForPC(final Context context) { PackageManager pm = context.getPackageManager(); return pm.hasSystemFeature("com.google.android.play.feature.HPE_EXPERIENCE"); diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index a1b52e968..3db53e331 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -568,6 +568,14 @@ public void onRemoteTrigger(AdjustRemoteTrigger trigger) { adjustConfig.disableFbIdReading(); } } + + if (command.containsParameter("fireAdIdReadingEnabled")) { + String fireAdIdReadingEnabledS = command.getFirstParameterValue("fireAdIdReadingEnabled"); + boolean fireAdIdReadingEnabled = "true".equals(fireAdIdReadingEnabledS); + if (!fireAdIdReadingEnabled) { + adjustConfig.disableFireAdIdReading(); + } + } } private void start() { From 10274a1439efb821bbba07bfb4b299ed968ae410 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 29 Jul 2026 10:50:24 +0200 Subject: [PATCH 532/540] feat: add callback and partner parameters to all the packages --- .../java/com/adjust/sdk/PackageBuilder.java | 53 +++++++++---------- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 67343f0ca..ba5d0a0e3 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -224,10 +224,8 @@ ActivityPackage buildVerificationPackage(AdjustEvent event, OnPurchaseVerificati private Map getSessionParameters() { Map parameters = new HashMap(); - addCommonPackageParameters(parameters); + addCommonPackageParameters(parameters, globalParameters.callbackParameters, globalParameters.partnerParameters); - PackageBuilder.addMapJson(parameters, "callback_params", globalParameters.callbackParameters); - PackageBuilder.addMapJson(parameters, "partner_params", globalParameters.partnerParameters); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); injectStoreInfoToParameters(parameters); @@ -239,11 +237,8 @@ private Map getSessionParameters() { public Map getEventParameters(AdjustEvent event, int sequence) { Map parameters = new HashMap(); - addCommonPackageParameters(parameters); - - PackageBuilder.addMapJson(parameters, "callback_params", - Util.mergeParameters(globalParameters.callbackParameters, event.callbackParameters, "Callback")); - PackageBuilder.addMapJson(parameters, "partner_params", + addCommonPackageParameters(parameters, + Util.mergeParameters(globalParameters.callbackParameters, event.callbackParameters, "Callback"), Util.mergeParameters(globalParameters.partnerParameters, event.partnerParameters, "Partner")); PackageBuilder.addString(parameters, "currency", event.currency); @@ -264,7 +259,7 @@ public Map getEventParameters(AdjustEvent event, int sequence) { private Map getInfoParameters(String source) { Map parameters = new HashMap(); - addCommonPackageParameters(parameters); + addCommonPackageParameters(parameters, globalParameters.callbackParameters, globalParameters.partnerParameters); PackageBuilder.addString(parameters, "source", source); @@ -275,7 +270,7 @@ private Map getInfoParameters(String source) { private Map getClickParameters(String source) { Map parameters = new HashMap(); - addCommonPackageParameters(parameters); + addCommonPackageParameters(parameters, globalParameters.callbackParameters, globalParameters.partnerParameters); // Attribution parameters. if (attribution != null) { @@ -285,8 +280,6 @@ private Map getClickParameters(String source) { PackageBuilder.addString(parameters, "creative", attribution.creative); } - PackageBuilder.addMapJson(parameters, "callback_params", globalParameters.callbackParameters); - PackageBuilder.addMapJson(parameters, "partner_params", globalParameters.partnerParameters); PackageBuilder.addDateInMilliseconds(parameters, "click_time", clickTimeInMilliseconds); PackageBuilder.addDateInSeconds(parameters, "click_time", clickTimeInSeconds); PackageBuilder.addDateInSeconds(parameters, "click_time_server", clickTimeServerInSeconds); @@ -318,7 +311,7 @@ private Map getClickParameters(String source) { private Map getAttributionParameters(String initiatedBy) { Map parameters = new HashMap(); - addCommonPackageParameters(parameters); + addCommonPackageParameters(parameters, globalParameters.callbackParameters, globalParameters.partnerParameters); PackageBuilder.addString(parameters, "initiated_by", initiatedBy); @@ -329,7 +322,7 @@ private Map getAttributionParameters(String initiatedBy) { private Map getGdprParameters() { Map parameters = new HashMap(); - addCommonPackageParameters(parameters); + addCommonPackageParameters(parameters, globalParameters.callbackParameters, globalParameters.partnerParameters); checkDeviceIds(parameters); return parameters; @@ -340,7 +333,7 @@ private Map getGdprParameters() { { Map parameters = new HashMap(); - addCommonPackageParameters(parameters); + addCommonPackageParameters(parameters, globalParameters.callbackParameters, globalParameters.partnerParameters); if (adjustThirdPartySharing.isEnabled != null) { PackageBuilder.addString(parameters, "sharing", adjustThirdPartySharing.isEnabled.booleanValue() ? "enable" : "disable"); @@ -356,7 +349,7 @@ private Map getGdprParameters() { private Map getMeasurementConsentParameters(final boolean consentMeasurement) { Map parameters = new HashMap<>(); - addCommonPackageParameters(parameters); + addCommonPackageParameters(parameters, globalParameters.callbackParameters, globalParameters.partnerParameters); PackageBuilder.addString(parameters, "measurement", consentMeasurement ? "enable" : "disable"); @@ -367,12 +360,10 @@ private Map getMeasurementConsentParameters(final boolean consen private Map getAdRevenueParameters(AdjustAdRevenue adjustAdRevenue) { Map parameters = new HashMap(); - addCommonPackageParameters(parameters); + addCommonPackageParameters(parameters, + Util.mergeParameters(globalParameters.callbackParameters, adjustAdRevenue.callbackParameters, "Callback"), + Util.mergeParameters(globalParameters.partnerParameters, adjustAdRevenue.partnerParameters, "Partner")); - PackageBuilder.addMapJson(parameters, "callback_params", - Util.mergeParameters(globalParameters.callbackParameters, adjustAdRevenue.callbackParameters, "Callback")); - PackageBuilder.addMapJson(parameters, "partner_params", - Util.mergeParameters(globalParameters.partnerParameters, adjustAdRevenue.partnerParameters, "Partner")); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); PackageBuilder.addString(parameters, "source", adjustAdRevenue.source); PackageBuilder.addDoubleWithoutRounding(parameters, "revenue", adjustAdRevenue.revenue); @@ -389,12 +380,10 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven private Map getSubscriptionParameters(AdjustPlayStoreSubscription subscription) { Map parameters = new HashMap(); - addCommonPackageParameters(parameters); - - PackageBuilder.addMapJson(parameters, "callback_params", - Util.mergeParameters(globalParameters.callbackParameters, subscription.getCallbackParameters(), "Callback")); - PackageBuilder.addMapJson(parameters, "partner_params", + addCommonPackageParameters(parameters, + Util.mergeParameters(globalParameters.callbackParameters, subscription.getCallbackParameters(), "Callback"), Util.mergeParameters(globalParameters.partnerParameters, subscription.getPartnerParameters(), "Partner")); + PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); PackageBuilder.addString(parameters, "currency", subscription.getCurrency()); PackageBuilder.addString(parameters, "product_id", subscription.getSku()); @@ -411,7 +400,7 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio private Map getVerificationParameters(AdjustPlayStorePurchase purchase) { Map parameters = new HashMap(); - addCommonPackageParameters(parameters); + addCommonPackageParameters(parameters, globalParameters.callbackParameters, globalParameters.partnerParameters); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); PackageBuilder.addString(parameters, "product_id", purchase.getProductId()); @@ -424,7 +413,7 @@ private Map getVerificationParameters(AdjustPlayStorePurchase pu private Map getVerificationParameters(AdjustEvent event) { Map parameters = new HashMap(); - addCommonPackageParameters(parameters); + addCommonPackageParameters(parameters, globalParameters.callbackParameters, globalParameters.partnerParameters); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); PackageBuilder.addString(parameters, "product_id", event.getProductId()); @@ -437,7 +426,9 @@ private Map getVerificationParameters(AdjustEvent event) { return parameters; } - private void addCommonPackageParameters(final Map parameters) { + private void addCommonPackageParameters(final Map parameters, + final Map callbackParameters, + final Map partnerParameters) { deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. @@ -516,6 +507,10 @@ private void addCommonPackageParameters(final Map parameters) { PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); + // callback and partner parameters + PackageBuilder.addMapJson(parameters, "callback_params", callbackParameters); + PackageBuilder.addMapJson(parameters, "partner_params", partnerParameters); + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); PackageBuilder.addJsonObject(parameters, "control_params", controlParams); From 702e520f5534f237302bcdecbe17c07bc5336958 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 6 Aug 2026 14:00:35 +0200 Subject: [PATCH 533/540] feat: revert package builder refactoring --- .../java/com/adjust/sdk/PackageBuilder.java | 952 +++++++++++++++--- 1 file changed, 835 insertions(+), 117 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index ba5d0a0e3..4d015dce9 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -154,7 +154,9 @@ ActivityPackage buildGdprPackage() { return gdprPackage; } - ActivityPackage buildThirdPartySharingPackage(final AdjustThirdPartySharing adjustThirdPartySharing) { + ActivityPackage buildThirdPartySharingPackage( + final AdjustThirdPartySharing adjustThirdPartySharing) + { Map parameters = getThirdPartySharingParameters(adjustThirdPartySharing); ActivityPackage activityPackage = getDefaultActivityPackage(ActivityKind.THIRD_PARTY_SHARING); activityPackage.setPath("/third_party_sharing"); @@ -224,12 +226,92 @@ ActivityPackage buildVerificationPackage(AdjustEvent event, OnPurchaseVerificati private Map getSessionParameters() { Map parameters = new HashMap(); - addCommonPackageParameters(parameters, globalParameters.callbackParameters, globalParameters.partnerParameters); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + + // Check if plugin is used and if yes, add read parameters. + if (deviceInfo.imeiParameters != null) { + parameters.putAll(deviceInfo.imeiParameters); + } + + // Check if oaid plugin is used and if yes, add the parameter + if (deviceInfo.oaidParameters != null) { + parameters.putAll(deviceInfo.oaidParameters); + } + + // Callback and partner parameters. + PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); + PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); + + // Device identifiers. + deviceInfo.reloadGoogleAdId(adjustConfig); + PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); + PackageBuilder.addString(parameters, "gps_adid", deviceInfo.googleAdId); + PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.googleAdIdReadAttempt); + PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.googleAdIdSource); + PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); + PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); + PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); + + if (!containsGoogleAdId(parameters) && !containsFireAdId(parameters)) { + logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + + "fallback to non Google Play and Fire identifiers will take place"); + deviceInfo.readAndroidId(adjustConfig); + PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); + } + // Rest of the parameters. + PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); + PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); + PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); + PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); + PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); + PackageBuilder.addString(parameters, "country", deviceInfo.country); + PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); + PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); + PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); + PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); + PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); + PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); + PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); + PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); + PackageBuilder.addString(parameters, "environment", adjustConfig.environment); + PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); + PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); + PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); + PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); + PackageBuilder.addString(parameters, "language", deviceInfo.language); + PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); + PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); + PackageBuilder.addBoolean(parameters, "needs_response_details", true); + PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); + PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); + PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); + PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); + PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); + PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); + PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); + PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); + PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); + PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); + PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); + PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); + PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); + + // google play games + PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + // store info injectStoreInfoToParameters(parameters); + injectFeatureFlagsWithParameters(parameters); + checkDeviceIds(parameters); return parameters; } @@ -237,21 +319,96 @@ private Map getSessionParameters() { public Map getEventParameters(AdjustEvent event, int sequence) { Map parameters = new HashMap(); - addCommonPackageParameters(parameters, - Util.mergeParameters(globalParameters.callbackParameters, event.callbackParameters, "Callback"), - Util.mergeParameters(globalParameters.partnerParameters, event.partnerParameters, "Partner")); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + + // Check if plugin is used and if yes, add read parameters. + if (deviceInfo.imeiParameters != null) { + parameters.putAll(deviceInfo.imeiParameters); + } + + // Check if oaid plugin is used and if yes, add the parameter + if (deviceInfo.oaidParameters != null) { + parameters.putAll(deviceInfo.oaidParameters); + } + + // Callback and partner parameters. + PackageBuilder.addMapJson(parameters, "callback_params", Util.mergeParameters(this.globalParameters.callbackParameters, event.callbackParameters, "Callback")); + PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.globalParameters.partnerParameters, event.partnerParameters, "Partner")); + + // Device identifiers. + deviceInfo.reloadGoogleAdId(adjustConfig); + PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); + PackageBuilder.addString(parameters, "gps_adid", deviceInfo.googleAdId); + PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.googleAdIdReadAttempt); + PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.googleAdIdSource); + PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); + PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); + PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); + + if (!containsGoogleAdId(parameters) && !containsFireAdId(parameters)) { + logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + + "fallback to non Google Play and Fire identifiers will take place"); + deviceInfo.readAndroidId(adjustConfig); + PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); + } + // Rest of the parameters. + PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); + PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); + PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); + PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); + PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); + PackageBuilder.addString(parameters, "country", deviceInfo.country); + PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); + PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "currency", event.currency); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); + PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); + PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); + PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); + PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); + PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); + PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); + PackageBuilder.addString(parameters, "environment", adjustConfig.environment); PackageBuilder.addString(parameters, "event_callback_id", event.callbackId); PackageBuilder.addLong(parameters, "event_count", activityStateCopy.eventCount); PackageBuilder.addString(parameters, "event_token", event.eventToken); + PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); + PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); + PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); + PackageBuilder.addString(parameters, "language", deviceInfo.language); + PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); + PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); + PackageBuilder.addBoolean(parameters, "needs_response_details", true); + PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); + PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); + PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); + PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "product_id", event.productId); PackageBuilder.addString(parameters, "purchase_token", event.purchaseToken); + PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addDouble(parameters, "revenue", event.revenue); PackageBuilder.addString(parameters, "order_id", event.orderId); PackageBuilder.addString(parameters, "deduplication_id", event.deduplicationId); + PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); + PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); + PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); + PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); + PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); + PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); + PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); PackageBuilder.addInteger(parameters, "seq", sequence); + // google play games + PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + + injectFeatureFlagsWithParameters(parameters); + checkDeviceIds(parameters); return parameters; } @@ -259,10 +416,56 @@ public Map getEventParameters(AdjustEvent event, int sequence) { private Map getInfoParameters(String source) { Map parameters = new HashMap(); - addCommonPackageParameters(parameters, globalParameters.callbackParameters, globalParameters.partnerParameters); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + + // Check if plugin is used and if yes, add read parameters. + if (deviceInfo.imeiParameters != null) { + parameters.putAll(deviceInfo.imeiParameters); + } + + // Check if oaid plugin is used and if yes, add the parameter + if (deviceInfo.oaidParameters != null) { + parameters.putAll(deviceInfo.oaidParameters); + } + + // Device identifiers. + deviceInfo.reloadGoogleAdId(adjustConfig); + PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); + PackageBuilder.addString(parameters, "gps_adid", deviceInfo.googleAdId); + PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.googleAdIdReadAttempt); + PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.googleAdIdSource); + PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); + PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); + PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); + + if (!containsGoogleAdId(parameters) && !containsFireAdId(parameters)) { + logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + + "fallback to non Google Play and Fire identifiers will take place"); + deviceInfo.readAndroidId(adjustConfig); + PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); + } + // Rest of the parameters. + PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); + PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); + PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); + PackageBuilder.addString(parameters, "environment", adjustConfig.environment); + PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); + PackageBuilder.addBoolean(parameters, "needs_response_details", true); + PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "source", source); + // google play games + PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + + injectFeatureFlagsWithParameters(parameters); + checkDeviceIds(parameters); return parameters; } @@ -270,7 +473,35 @@ private Map getInfoParameters(String source) { private Map getClickParameters(String source) { Map parameters = new HashMap(); - addCommonPackageParameters(parameters, globalParameters.callbackParameters, globalParameters.partnerParameters); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + + // Check if plugin is used and if yes, add read parameters. + if (deviceInfo.imeiParameters != null) { + parameters.putAll(deviceInfo.imeiParameters); + } + + // Check if oaid plugin is used and if yes, add the parameter + if (deviceInfo.oaidParameters != null) { + parameters.putAll(deviceInfo.oaidParameters); + } + + // Device identifiers. + deviceInfo.reloadGoogleAdId(adjustConfig); + PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); + PackageBuilder.addString(parameters, "gps_adid", deviceInfo.googleAdId); + PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.googleAdIdReadAttempt); + PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.googleAdIdSource); + PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); + PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); + PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); + + if (!containsGoogleAdId(parameters) && !containsFireAdId(parameters)) { + logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + + "fallback to non Google Play and Fire identifiers will take place"); + deviceInfo.readAndroidId(adjustConfig); + PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); + } // Attribution parameters. if (attribution != null) { @@ -280,30 +511,78 @@ private Map getClickParameters(String source) { PackageBuilder.addString(parameters, "creative", attribution.creative); } + // Rest of the parameters. + PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); + PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); + PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); + PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); + PackageBuilder.addMapJson(parameters, "callback_params", this.globalParameters.callbackParameters); PackageBuilder.addDateInMilliseconds(parameters, "click_time", clickTimeInMilliseconds); PackageBuilder.addDateInSeconds(parameters, "click_time", clickTimeInSeconds); PackageBuilder.addDateInSeconds(parameters, "click_time_server", clickTimeServerInSeconds); + PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); + PackageBuilder.addString(parameters, "country", deviceInfo.country); + PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); + PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "deeplink", deeplink); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); + PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); + PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); + PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); + PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); + PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); + PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); + PackageBuilder.addString(parameters, "environment", adjustConfig.environment); + PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); + PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); PackageBuilder.addBoolean(parameters, "google_play_instant", googlePlayInstant); PackageBuilder.addBoolean(parameters, "is_click", isClick); + PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); PackageBuilder.addDateInSeconds(parameters, "install_begin_time", installBeginTimeInSeconds); PackageBuilder.addDateInSeconds(parameters, "install_begin_time_server", installBeginTimeServerInSeconds); PackageBuilder.addString(parameters, "install_version", installVersion); + PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); + PackageBuilder.addString(parameters, "language", deviceInfo.language); + PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); + PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); + PackageBuilder.addBoolean(parameters, "needs_response_details", true); + PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); + PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); + PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); + PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addMapJson(parameters, "params", extraParameters); + PackageBuilder.addMapJson(parameters, "partner_params", this.globalParameters.partnerParameters); + PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "raw_referrer", rawReferrer); PackageBuilder.addString(parameters, "referrer", referrer); PackageBuilder.addString(parameters, "referrer_api", referrerApi); PackageBuilder.addString(parameters, "reftag", reftag); + PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); + PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); + PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); + PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); + PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); PackageBuilder.addString(parameters, "source", source); - PackageBuilder.addString(parameters, "payload", preinstallPayload); - PackageBuilder.addString(parameters, "found_location", preinstallLocation); - + PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); + PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); + PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); + PackageBuilder.addString(parameters, "payload", preinstallPayload); + PackageBuilder.addString(parameters, "found_location", preinstallLocation); if (licenseData != null) { PackageBuilder.addInteger(parameters, "lvl_response_code", licenseData.getResponseCode()); PackageBuilder.addString(parameters, "lvl_signed_data", licenseData.getSignedData()); PackageBuilder.addString(parameters, "lvl_signature", licenseData.getSignature()); } + // google play games + PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + + injectFeatureFlagsWithParameters(parameters); + checkDeviceIds(parameters); return parameters; } @@ -311,80 +590,453 @@ private Map getClickParameters(String source) { private Map getAttributionParameters(String initiatedBy) { Map parameters = new HashMap(); - addCommonPackageParameters(parameters, globalParameters.callbackParameters, globalParameters.partnerParameters); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + + // Check if plugin is used and if yes, add read parameters. + if (deviceInfo.imeiParameters != null) { + parameters.putAll(deviceInfo.imeiParameters); + } + + // Check if oaid plugin is used and if yes, add the parameter + if (deviceInfo.oaidParameters != null) { + parameters.putAll(deviceInfo.oaidParameters); + } + + // Device identifiers. + deviceInfo.reloadGoogleAdId(adjustConfig); + PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); + PackageBuilder.addString(parameters, "gps_adid", deviceInfo.googleAdId); + PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.googleAdIdReadAttempt); + PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.googleAdIdSource); + PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); + PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); + PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); + + if (!containsGoogleAdId(parameters) && !containsFireAdId(parameters)) { + logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + + "fallback to non Google Play and Fire identifiers will take place"); + deviceInfo.readAndroidId(adjustConfig); + PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); + } + // Rest of the parameters. + PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); + PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); + PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); + PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); + PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); + PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); + PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); + PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); + PackageBuilder.addString(parameters, "environment", adjustConfig.environment); + PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); PackageBuilder.addString(parameters, "initiated_by", initiatedBy); + PackageBuilder.addBoolean(parameters, "needs_response_details", true); + PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); + PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); + PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); + PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); + + // google play games + PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + + injectFeatureFlagsWithParameters(parameters); + + checkDeviceIds(parameters); + return parameters; + } + + private Map getGdprParameters() { + Map parameters = new HashMap(); + + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + + // Check if plugin is used and if yes, add read parameters. + if (deviceInfo.imeiParameters != null) { + parameters.putAll(deviceInfo.imeiParameters); + } + + // Check if oaid plugin is used and if yes, add the parameter + if (deviceInfo.oaidParameters != null) { + parameters.putAll(deviceInfo.oaidParameters); + } + + // Device identifiers. + deviceInfo.reloadGoogleAdId(adjustConfig); + PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); + PackageBuilder.addString(parameters, "gps_adid", deviceInfo.googleAdId); + PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.googleAdIdReadAttempt); + PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.googleAdIdSource); + PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); + PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); + PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); + + if (!containsGoogleAdId(parameters) && !containsFireAdId(parameters)) { + logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + + "fallback to non Google Play and Fire identifiers will take place"); + deviceInfo.readAndroidId(adjustConfig); + PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); + } + + // Rest of the parameters. + PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); + PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); + PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); + PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); + PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); + PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); + PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); + PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); + PackageBuilder.addString(parameters, "environment", adjustConfig.environment); + PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); + PackageBuilder.addBoolean(parameters, "needs_response_details", true); + PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); + PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); + PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); + PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); + + // google play games + PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + + injectFeatureFlagsWithParameters(parameters); + + checkDeviceIds(parameters); + return parameters; + } + + private Map getThirdPartySharingParameters + (final AdjustThirdPartySharing adjustThirdPartySharing) + { + Map parameters = new HashMap(); + + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + + // Check if plugin is used and if yes, add read parameters. + if (deviceInfo.imeiParameters != null) { + parameters.putAll(deviceInfo.imeiParameters); + } + + // Check if oaid plugin is used and if yes, add the parameter + if (deviceInfo.oaidParameters != null) { + parameters.putAll(deviceInfo.oaidParameters); + } + + // Third Party Sharing + if (adjustThirdPartySharing.isEnabled != null) { + PackageBuilder.addString(parameters, "sharing", + adjustThirdPartySharing.isEnabled.booleanValue() ? + "enable" : "disable"); + } + PackageBuilder.addMapJson(parameters, "granular_third_party_sharing_options", + adjustThirdPartySharing.granularOptions); + + PackageBuilder.addMapJson(parameters, "partner_sharing_settings", + adjustThirdPartySharing.partnerSharingSettings); + + // Device identifiers. + deviceInfo.reloadGoogleAdId(adjustConfig); + PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); + PackageBuilder.addString(parameters, "gps_adid", deviceInfo.googleAdId); + PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.googleAdIdReadAttempt); + PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.googleAdIdSource); + PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); + PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); + PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); + + if (!containsGoogleAdId(parameters) && !containsFireAdId(parameters)) { + logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + + "fallback to non Google Play and Fire identifiers will take place"); + deviceInfo.readAndroidId(adjustConfig); + PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); + } + + // Rest of the parameters. + PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); + PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); + PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); + PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); + PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); + PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); + PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); + PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); + PackageBuilder.addString(parameters, "environment", adjustConfig.environment); + PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); + PackageBuilder.addBoolean(parameters, "needs_response_details", true); + PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); + PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); + PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); + PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); + + // google play games + PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + + injectFeatureFlagsWithParameters(parameters); + + checkDeviceIds(parameters); + return parameters; + } + + private Map getMeasurementConsentParameters( + final boolean consentMeasurement) + { + Map parameters = new HashMap(); + + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + + // Check if plugin is used and if yes, add read parameters. + if (deviceInfo.imeiParameters != null) { + parameters.putAll(deviceInfo.imeiParameters); + } + + // Check if oaid plugin is used and if yes, add the parameter + if (deviceInfo.oaidParameters != null) { + parameters.putAll(deviceInfo.oaidParameters); + } + + // Measurement Consent + PackageBuilder.addString(parameters, "measurement", + consentMeasurement ? "enable" : "disable"); + + // Device identifiers. + deviceInfo.reloadGoogleAdId(adjustConfig); + PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); + PackageBuilder.addString(parameters, "gps_adid", deviceInfo.googleAdId); + PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.googleAdIdReadAttempt); + PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.googleAdIdSource); + PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); + PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); + PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); + + if (!containsGoogleAdId(parameters) && !containsFireAdId(parameters)) { + logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + + "fallback to non Google Play and Fire identifiers will take place"); + deviceInfo.readAndroidId(adjustConfig); + PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); + } + + // Rest of the parameters. + PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); + PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); + PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); + PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); + PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); + PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); + PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); + PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); + PackageBuilder.addString(parameters, "environment", adjustConfig.environment); + PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); + PackageBuilder.addBoolean(parameters, "needs_response_details", true); + PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); + PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); + PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); + PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); + + // google play games + PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + + injectFeatureFlagsWithParameters(parameters); + + checkDeviceIds(parameters); + return parameters; + } + + private Map getAdRevenueParameters(AdjustAdRevenue adjustAdRevenue) { + Map parameters = new HashMap(); + + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + + // Check if plugin is used and if yes, add read parameters. + if (deviceInfo.imeiParameters != null) { + parameters.putAll(deviceInfo.imeiParameters); + } + + // Check if oaid plugin is used and if yes, add the parameter + if (deviceInfo.oaidParameters != null) { + parameters.putAll(deviceInfo.oaidParameters); + } + + // Callback and partner parameters. + PackageBuilder.addMapJson(parameters, "callback_params", Util.mergeParameters(this.globalParameters.callbackParameters, adjustAdRevenue.callbackParameters, "Callback")); + PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.globalParameters.partnerParameters, adjustAdRevenue.partnerParameters, "Partner")); + + // Device identifiers. + deviceInfo.reloadGoogleAdId(adjustConfig); + PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); + PackageBuilder.addString(parameters, "gps_adid", deviceInfo.googleAdId); + PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.googleAdIdReadAttempt); + PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.googleAdIdSource); + PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); + PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); + PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); + + if (!containsGoogleAdId(parameters) && !containsFireAdId(parameters)) { + logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + + "fallback to non Google Play and Fire identifiers will take place"); + deviceInfo.readAndroidId(adjustConfig); + PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); + } + + // Rest of the parameters. + PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); + PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); + PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); + PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); + PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); + PackageBuilder.addString(parameters, "country", deviceInfo.country); + PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); + PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); + PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); + PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); + PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); + PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); + PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); + PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); + PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); + PackageBuilder.addString(parameters, "environment", adjustConfig.environment); + PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); + PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); + PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); + PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); + PackageBuilder.addString(parameters, "language", deviceInfo.language); + PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); + PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); + PackageBuilder.addBoolean(parameters, "needs_response_details", true); + PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); + PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); + PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); + PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); + PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); + PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); + PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); + PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); + PackageBuilder.addString(parameters, "source", adjustAdRevenue.source); + PackageBuilder.addDoubleWithoutRounding(parameters, "revenue", adjustAdRevenue.revenue); + PackageBuilder.addString(parameters, "currency", adjustAdRevenue.currency); + PackageBuilder.addInteger(parameters, "ad_impressions_count", adjustAdRevenue.adImpressionsCount); + PackageBuilder.addString(parameters, "ad_revenue_network", adjustAdRevenue.adRevenueNetwork); + PackageBuilder.addString(parameters, "ad_revenue_unit", adjustAdRevenue.adRevenueUnit); + PackageBuilder.addString(parameters, "ad_revenue_placement", adjustAdRevenue.adRevenuePlacement); + PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); + PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); + PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); + PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); + PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); - checkDeviceIds(parameters); - return parameters; - } + // google play games + PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); - private Map getGdprParameters() { - Map parameters = new HashMap(); + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); - addCommonPackageParameters(parameters, globalParameters.callbackParameters, globalParameters.partnerParameters); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); return parameters; } - private Map getThirdPartySharingParameters - (final AdjustThirdPartySharing adjustThirdPartySharing) - { + private Map getSubscriptionParameters(AdjustPlayStoreSubscription subscription) { Map parameters = new HashMap(); - addCommonPackageParameters(parameters, globalParameters.callbackParameters, globalParameters.partnerParameters); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); - if (adjustThirdPartySharing.isEnabled != null) { - PackageBuilder.addString(parameters, "sharing", adjustThirdPartySharing.isEnabled.booleanValue() ? "enable" : "disable"); + // Check if plugin is used and if yes, add read parameters. + if (deviceInfo.imeiParameters != null) { + parameters.putAll(deviceInfo.imeiParameters); } - PackageBuilder.addMapJson(parameters, "granular_third_party_sharing_options", adjustThirdPartySharing.granularOptions); - PackageBuilder.addMapJson(parameters, "partner_sharing_settings", adjustThirdPartySharing.partnerSharingSettings); - - checkDeviceIds(parameters); - return parameters; - } - - private Map getMeasurementConsentParameters(final boolean consentMeasurement) { - Map parameters = new HashMap<>(); - - addCommonPackageParameters(parameters, globalParameters.callbackParameters, globalParameters.partnerParameters); - - PackageBuilder.addString(parameters, "measurement", consentMeasurement ? "enable" : "disable"); + // Check if oaid plugin is used and if yes, add the parameter + if (deviceInfo.oaidParameters != null) { + parameters.putAll(deviceInfo.oaidParameters); + } - checkDeviceIds(parameters); - return parameters; - } + // Device identifiers. + deviceInfo.reloadGoogleAdId(adjustConfig); + PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); + PackageBuilder.addString(parameters, "gps_adid", deviceInfo.googleAdId); + PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.googleAdIdReadAttempt); + PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.googleAdIdSource); + PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); + PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); + PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); - private Map getAdRevenueParameters(AdjustAdRevenue adjustAdRevenue) { - Map parameters = new HashMap(); + if (!containsGoogleAdId(parameters) && !containsFireAdId(parameters)) { + logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + + "fallback to non Google Play and Fire identifiers will take place"); + deviceInfo.readAndroidId(adjustConfig); + PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); + } - addCommonPackageParameters(parameters, - Util.mergeParameters(globalParameters.callbackParameters, adjustAdRevenue.callbackParameters, "Callback"), - Util.mergeParameters(globalParameters.partnerParameters, adjustAdRevenue.partnerParameters, "Partner")); + // Callback and partner parameters. + PackageBuilder.addMapJson(parameters, "callback_params", Util.mergeParameters(this.globalParameters.callbackParameters, subscription.getCallbackParameters(), "Callback")); + PackageBuilder.addMapJson(parameters, "partner_params", Util.mergeParameters(this.globalParameters.partnerParameters, subscription.getPartnerParameters(), "Partner")); + // Rest of the parameters. + PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); + PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); + PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); + PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); + PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); + PackageBuilder.addString(parameters, "country", deviceInfo.country); + PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); + PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); - PackageBuilder.addString(parameters, "source", adjustAdRevenue.source); - PackageBuilder.addDoubleWithoutRounding(parameters, "revenue", adjustAdRevenue.revenue); - PackageBuilder.addString(parameters, "currency", adjustAdRevenue.currency); - PackageBuilder.addInteger(parameters, "ad_impressions_count", adjustAdRevenue.adImpressionsCount); - PackageBuilder.addString(parameters, "ad_revenue_network", adjustAdRevenue.adRevenueNetwork); - PackageBuilder.addString(parameters, "ad_revenue_unit", adjustAdRevenue.adRevenueUnit); - PackageBuilder.addString(parameters, "ad_revenue_placement", adjustAdRevenue.adRevenuePlacement); - - checkDeviceIds(parameters); - return parameters; - } - - private Map getSubscriptionParameters(AdjustPlayStoreSubscription subscription) { - Map parameters = new HashMap(); - - addCommonPackageParameters(parameters, - Util.mergeParameters(globalParameters.callbackParameters, subscription.getCallbackParameters(), "Callback"), - Util.mergeParameters(globalParameters.partnerParameters, subscription.getPartnerParameters(), "Partner")); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); + PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); + PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); + PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); + PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); + PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); + PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); + PackageBuilder.addString(parameters, "environment", adjustConfig.environment); + PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); + PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); + PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); + PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); + PackageBuilder.addString(parameters, "language", deviceInfo.language); + PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); + PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); + PackageBuilder.addBoolean(parameters, "needs_response_details", true); + PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); + PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); + PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); + PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); + PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); + PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); + PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); + PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); + PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); + PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); + PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); + PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); + PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); - PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); + // subscription specific parameters PackageBuilder.addString(parameters, "currency", subscription.getCurrency()); PackageBuilder.addString(parameters, "product_id", subscription.getSku()); PackageBuilder.addString(parameters, "purchase_token", subscription.getPurchaseToken()); @@ -393,6 +1045,15 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio PackageBuilder.addDateInMilliseconds(parameters, "transaction_date", subscription.getPurchaseTime()); PackageBuilder.addString(parameters, "transaction_id", subscription.getOrderId()); + // google play games + PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); + + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + + injectFeatureFlagsWithParameters(parameters); + checkDeviceIds(parameters); return parameters; } @@ -400,35 +1061,95 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio private Map getVerificationParameters(AdjustPlayStorePurchase purchase) { Map parameters = new HashMap(); - addCommonPackageParameters(parameters, globalParameters.callbackParameters, globalParameters.partnerParameters); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); + + // Check if plugin is used and if yes, add read parameters. + if (deviceInfo.imeiParameters != null) { + parameters.putAll(deviceInfo.imeiParameters); + } + + // Check if oaid plugin is used and if yes, add the parameter + if (deviceInfo.oaidParameters != null) { + parameters.putAll(deviceInfo.oaidParameters); + } + + // Device identifiers. + deviceInfo.reloadGoogleAdId(adjustConfig); + PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); + PackageBuilder.addString(parameters, "gps_adid", deviceInfo.googleAdId); + PackageBuilder.addLong(parameters, "gps_adid_attempt", deviceInfo.googleAdIdReadAttempt); + PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.googleAdIdSource); + PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); + PackageBuilder.addString(parameters, "fire_adid", deviceInfo.fireAdId); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", deviceInfo.fireTrackingEnabled); + + if (!containsGoogleAdId(parameters) && !containsFireAdId(parameters)) { + logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + + "fallback to non Google Play and Fire identifiers will take place"); + deviceInfo.readAndroidId(adjustConfig); + PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); + } + // Rest of the parameters. + PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); + PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); + PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); + PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); + PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); + PackageBuilder.addString(parameters, "country", deviceInfo.country); + PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); + PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); + PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); + PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); + PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); + PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); + PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); + PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); + PackageBuilder.addString(parameters, "environment", adjustConfig.environment); + PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); + PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); + PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); + PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); + PackageBuilder.addString(parameters, "language", deviceInfo.language); + PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); + PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); + PackageBuilder.addBoolean(parameters, "needs_response_details", true); + PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); + PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); + PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); + PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); + PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); + PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); + PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); + PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); + PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); + PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); + PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); + PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); + PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); + + // purchase verification specific parameters PackageBuilder.addString(parameters, "product_id", purchase.getProductId()); PackageBuilder.addString(parameters, "purchase_token", purchase.getPurchaseToken()); - checkDeviceIds(parameters); - return parameters; - } - - private Map getVerificationParameters(AdjustEvent event) { - Map parameters = new HashMap(); + // google play games + PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); - addCommonPackageParameters(parameters, globalParameters.callbackParameters, globalParameters.partnerParameters); + // control params json + JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); + PackageBuilder.addJsonObject(parameters, "control_params", controlParams); - PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); - PackageBuilder.addString(parameters, "product_id", event.getProductId()); - PackageBuilder.addString(parameters, "purchase_token", event.getPurchaseToken()); - PackageBuilder.addString(parameters, "event_token", event.getEventToken()); - PackageBuilder.addString(parameters, "currency", event.getCurrency()); - PackageBuilder.addDouble(parameters, "revenue", event.getRevenue()); + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); return parameters; } - private void addCommonPackageParameters(final Map parameters, - final Map callbackParameters, - final Map partnerParameters) { + private Map getVerificationParameters(AdjustEvent event) { + Map parameters = new HashMap(); + deviceInfo.reloadOtherDeviceInfoParams(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. @@ -458,63 +1179,60 @@ private void addCommonPackageParameters(final Map parameters, PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } - PackageBuilder.addString(parameters, "google_app_set_id", deviceInfo.appSetId); - PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); - PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); - - PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); - - // config + // Rest of the parameters. + PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); - PackageBuilder.addString(parameters, "environment", adjustConfig.environment); - PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); - PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); - PackageBuilder.addBoolean(parameters, "needs_response_details", true); - - // app info PackageBuilder.addString(parameters, "app_version", deviceInfo.appVersion); - PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); - PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); - PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); - PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); - - // Device details + PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); + PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); + PackageBuilder.addString(parameters, "country", deviceInfo.country); PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); + PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); + PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); + PackageBuilder.addBoolean(parameters, "needs_cost", adjustConfig.isCostDataInAttributionEnabled); PackageBuilder.addString(parameters, "device_manufacturer", deviceInfo.deviceManufacturer); PackageBuilder.addString(parameters, "device_name", deviceInfo.deviceName); PackageBuilder.addString(parameters, "device_type", deviceInfo.deviceType); - PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); PackageBuilder.addLong(parameters, "ui_mode", deviceInfo.uiMode); PackageBuilder.addString(parameters, "display_height", deviceInfo.displayHeight); PackageBuilder.addString(parameters, "display_width", deviceInfo.displayWidth); - PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); - PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); - PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); - PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); - PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); - PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); - PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); - PackageBuilder.addString(parameters, "api_level", deviceInfo.apiLevel); - PackageBuilder.addString(parameters, "country", deviceInfo.country); + PackageBuilder.addString(parameters, "environment", adjustConfig.environment); + PackageBuilder.addString(parameters, "external_device_id", adjustConfig.externalDeviceId); + PackageBuilder.addString(parameters, "fb_id", deviceInfo.fbAttributionId); + PackageBuilder.addString(parameters, "hardware_name", deviceInfo.hardwareName); + PackageBuilder.addDateInMilliseconds(parameters, "installed_at", deviceInfo.appInstallTime); PackageBuilder.addString(parameters, "language", deviceInfo.language); - PackageBuilder.addLong(parameters, "connectivity_type", deviceInfo.connectivityType); PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); - - // session parameters + PackageBuilder.addBoolean(parameters, "needs_response_details", true); + PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); + PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); + PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); + PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); + PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); + PackageBuilder.addString(parameters, "screen_density", deviceInfo.screenDensity); + PackageBuilder.addString(parameters, "screen_format", deviceInfo.screenFormat); + PackageBuilder.addString(parameters, "screen_size", deviceInfo.screenSize); PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); + PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); - // callback and partner parameters - PackageBuilder.addMapJson(parameters, "callback_params", callbackParameters); - PackageBuilder.addMapJson(parameters, "partner_params", partnerParameters); + // purchase verification specific parameters + PackageBuilder.addString(parameters, "product_id", event.getProductId()); + PackageBuilder.addString(parameters, "purchase_token", event.getPurchaseToken()); + PackageBuilder.addString(parameters, "event_token", event.getEventToken()); + PackageBuilder.addString(parameters, "currency", event.getCurrency()); + PackageBuilder.addDouble(parameters, "revenue", event.getRevenue()); - JSONObject controlParams = SharedPreferencesManager.getDefaultInstance(adjustConfig.context).getControlParamsJson(); - PackageBuilder.addJsonObject(parameters, "control_params", controlParams); + // google play games + PackageBuilder.addBoolean(parameters, "gpg_pc_enabled", deviceInfo.isGooglePlayGamesForPC ? true : null); injectFeatureFlagsWithParameters(parameters); + + checkDeviceIds(parameters); + return parameters; } private ActivityPackage getDefaultActivityPackage(ActivityKind activityKind) { From c5b855cb55a4d35ca296684a389a8c405972d8ca Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 6 Aug 2026 14:19:28 +0200 Subject: [PATCH 534/540] feat: add disableDeviceIdsReading method --- .../sdk-plugin-webbridge/src/main/assets/adjust_config.js | 8 ++++++++ .../src/main/java/com/adjust/sdk/AdjustConfig.java | 8 ++++++++ .../java/com/adjust/testapp/AdjustCommandExecutor.java | 8 ++++++++ 3 files changed, 24 insertions(+) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js index ddf1b3364..5f3744981 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -307,3 +307,11 @@ AdjustConfig.prototype.disableFbIdReading = function() { AdjustConfig.prototype.disableFireAdIdReading = function() { this.isFireAdIdReadingEnabled = false; }; + +AdjustConfig.prototype.disableDeviceIdsReading = function() { + this.isGoogleAdIdReadingEnabled = false; + this.isAndroidIdReadingEnabled = false; + this.isAppSetIdReadingEnabled = false; + this.isFbIdReadingEnabled = false; + this.isFireAdIdReadingEnabled = false; +}; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 94788db19..9eeb71d3f 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -233,6 +233,14 @@ public void disableFireAdIdReading() { this.isFireAdIdReadingEnabled = false; } + public void disableDeviceIdsReading() { + this.isGoogleAdIdReadingEnabled = false; + this.isAndroidIdReadingEnabled = false; + this.isAppSetIdReadingEnabled = false; + this.isFbIdReadingEnabled = false; + this.isFireAdIdReadingEnabled = false; + } + public Context getContext() { return context; } diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 3db53e331..907fee2b5 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -576,6 +576,14 @@ public void onRemoteTrigger(AdjustRemoteTrigger trigger) { adjustConfig.disableFireAdIdReading(); } } + + if (command.containsParameter("disableDeviceIdsReading")) { + String deviceIdsReadingEnabledS = command.getFirstParameterValue("disableDeviceIdsReading"); + boolean deviceIdsReadingEnabled = "true".equals(deviceIdsReadingEnabledS); + if (!deviceIdsReadingEnabled) { + adjustConfig.disableDeviceIdsReading(); + } + } } private void start() { From 0fa37c910f56d62af7ac7a0a6c58ac7a1c0ab95a Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 6 Aug 2026 15:49:44 +0200 Subject: [PATCH 535/540] feat: block reading of IMEI & OAID when reading of device Ids not enabled --- .../sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java | 3 +++ .../sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java | 6 ++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index 9eeb71d3f..f44328ad0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -58,6 +58,7 @@ public class AdjustConfig { boolean isAppSetIdReadingEnabled; boolean isFbIdReadingEnabled; boolean isFireAdIdReadingEnabled; + boolean isDeviceIdsReadingEnabled; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; @@ -101,6 +102,7 @@ private void init(Context context, String appToken, String environment, boolean this.isAppSetIdReadingEnabled = true; this.isFbIdReadingEnabled = true; this.isFireAdIdReadingEnabled = true; + this.isDeviceIdsReadingEnabled = true; } public void setLogLevel(LogLevel logLevel) { @@ -234,6 +236,7 @@ public void disableFireAdIdReading() { } public void disableDeviceIdsReading() { + this.isDeviceIdsReadingEnabled = false; this.isGoogleAdIdReadingEnabled = false; this.isAndroidIdReadingEnabled = false; this.isAppSetIdReadingEnabled = false; diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 24d50947c..50aa8586a 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -517,7 +517,8 @@ private static class UtilDeviceIds { private static Map getImeiParameters(final AdjustConfig adjustConfig, final ILogger logger) { - if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled) { + if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled + || !adjustConfig.isDeviceIdsReadingEnabled) { return null; } @@ -526,7 +527,8 @@ private static Map getImeiParameters(final AdjustConfig adjustCo private static Map getOaidParameters(final AdjustConfig adjustConfig, final ILogger logger) { - if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled) { + if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled + || !adjustConfig.isDeviceIdsReadingEnabled) { return null; } From 69c3238dc75f334eb576dc50939ac1b5f3792561 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 6 Aug 2026 16:17:29 +0200 Subject: [PATCH 536/540] feat: add feature flag and rename boolean for plugins device ids reading not enabled --- .../sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java | 6 +++--- .../sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java | 4 ++-- .../src/main/java/com/adjust/sdk/PackageBuilder.java | 4 ++++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index f44328ad0..fc62ce7de 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -58,7 +58,7 @@ public class AdjustConfig { boolean isAppSetIdReadingEnabled; boolean isFbIdReadingEnabled; boolean isFireAdIdReadingEnabled; - boolean isDeviceIdsReadingEnabled; + boolean isPluginsDeviceIdsReadingEnabled; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; @@ -102,7 +102,7 @@ private void init(Context context, String appToken, String environment, boolean this.isAppSetIdReadingEnabled = true; this.isFbIdReadingEnabled = true; this.isFireAdIdReadingEnabled = true; - this.isDeviceIdsReadingEnabled = true; + this.isPluginsDeviceIdsReadingEnabled = true; } public void setLogLevel(LogLevel logLevel) { @@ -236,12 +236,12 @@ public void disableFireAdIdReading() { } public void disableDeviceIdsReading() { - this.isDeviceIdsReadingEnabled = false; this.isGoogleAdIdReadingEnabled = false; this.isAndroidIdReadingEnabled = false; this.isAppSetIdReadingEnabled = false; this.isFbIdReadingEnabled = false; this.isFireAdIdReadingEnabled = false; + this.isPluginsDeviceIdsReadingEnabled = false; } public Context getContext() { diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 50aa8586a..3dada72fa 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -518,7 +518,7 @@ private static Map getImeiParameters(final AdjustConfig adjustCo final ILogger logger) { if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled - || !adjustConfig.isDeviceIdsReadingEnabled) { + || !adjustConfig.isPluginsDeviceIdsReadingEnabled) { return null; } @@ -528,7 +528,7 @@ private static Map getOaidParameters(final AdjustConfig adjustCo final ILogger logger) { if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled - || !adjustConfig.isDeviceIdsReadingEnabled) { + || !adjustConfig.isPluginsDeviceIdsReadingEnabled) { return null; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 4d015dce9..2a0a8d7b9 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -1282,6 +1282,10 @@ private void injectFeatureFlagsWithParameters(Map parameters) { PackageBuilder.addBoolean(parameters, "ff_fire_adid_disabled", true); } + if (!adjustConfig.isPluginsDeviceIdsReadingEnabled) { + PackageBuilder.addBoolean(parameters, "ff_plugins_device_ids_disabled", true); + } + if (adjustConfig.onRemoteTriggerListener != null) { PackageBuilder.addBoolean(parameters, "ff_remote_triggers_callback", true); } From 6c6eef3ac644ed96c797433d00e6214fc0f90d87 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 6 Aug 2026 21:32:05 +0200 Subject: [PATCH 537/540] add ability to disable reading of device ids from plugins --- .../src/main/assets/adjust_config.js | 6 ++ .../sdk/webbridge/AdjustBridgeInstance.java | 8 +++ .../java/com/adjust/sdk/AdjustConfig.java | 14 ++++- .../main/java/com/adjust/sdk/DeviceInfo.java | 6 +- .../java/com/adjust/sdk/PackageBuilder.java | 2 +- .../src/main/java/com/adjust/sdk/Util.java | 8 +++ .../adjust/testapp/AdjustCommandExecutor.java | 12 +++- .../src/main/assets/command_executor.js | 56 +++++++++++++++++++ 8 files changed, 102 insertions(+), 10 deletions(-) diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js index 5f3744981..abc0b3791 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -62,6 +62,7 @@ function AdjustConfig(appToken, environment, legacy) { this.isAppSetIdReadingEnabled = null; this.isFbIdReadingEnabled = null; this.isFireAdIdReadingEnabled = null; + this.isDeviceIdsFromPluginsReadingEnabled = null; } AdjustConfig.EnvironmentSandbox = 'sandbox'; @@ -308,10 +309,15 @@ AdjustConfig.prototype.disableFireAdIdReading = function() { this.isFireAdIdReadingEnabled = false; }; +AdjustConfig.prototype.disableDeviceIdsFromPluginsReading = function() { + this.isDeviceIdsFromPluginsReadingEnabled = false; +}; + AdjustConfig.prototype.disableDeviceIdsReading = function() { this.isGoogleAdIdReadingEnabled = false; this.isAndroidIdReadingEnabled = false; this.isAppSetIdReadingEnabled = false; this.isFbIdReadingEnabled = false; this.isFireAdIdReadingEnabled = false; + this.isDeviceIdsFromPluginsReadingEnabled = false; }; diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java index 9251ba340..43dc7371e 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/java/com/adjust/sdk/webbridge/AdjustBridgeInstance.java @@ -195,6 +195,7 @@ public void initSdk(String adjustConfigString, String bridgeToken) { Object isAppSetIdReadingEnabledField = jsonAdjustConfig.get("isAppSetIdReadingEnabled"); Object isFbIdReadingEnabledField = jsonAdjustConfig.get("isFbIdReadingEnabled"); Object isFireAdIdReadingEnabledField = jsonAdjustConfig.get("isFireAdIdReadingEnabled"); + Object isDeviceIdsFromPluginsReadingEnabledField = jsonAdjustConfig.get("isDeviceIdsFromPluginsReadingEnabled"); String appToken = AdjustBridgeUtil.fieldToString(appTokenField); String environment = AdjustBridgeUtil.fieldToString(environmentField); @@ -514,6 +515,13 @@ public void onRemoteTrigger(AdjustRemoteTrigger remoteTrigger) { } } + Boolean isDeviceIdsFromPluginsReadingEnabled = AdjustBridgeUtil.fieldToBoolean(isDeviceIdsFromPluginsReadingEnabledField); + if (isDeviceIdsFromPluginsReadingEnabled != null) { + if (!isDeviceIdsFromPluginsReadingEnabled) { + adjustConfig.disableDeviceIdsFromPluginsReading(); + } + } + enableBridgeSecurity(); Adjust.initSdk(adjustConfig); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java index fc62ce7de..09eed383e 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -58,7 +58,7 @@ public class AdjustConfig { boolean isAppSetIdReadingEnabled; boolean isFbIdReadingEnabled; boolean isFireAdIdReadingEnabled; - boolean isPluginsDeviceIdsReadingEnabled; + boolean isDeviceIdsFromPluginsReadingEnabled; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; @@ -102,7 +102,7 @@ private void init(Context context, String appToken, String environment, boolean this.isAppSetIdReadingEnabled = true; this.isFbIdReadingEnabled = true; this.isFireAdIdReadingEnabled = true; - this.isPluginsDeviceIdsReadingEnabled = true; + this.isDeviceIdsFromPluginsReadingEnabled = true; } public void setLogLevel(LogLevel logLevel) { @@ -235,13 +235,17 @@ public void disableFireAdIdReading() { this.isFireAdIdReadingEnabled = false; } + public void disableDeviceIdsFromPluginsReading() { + this.isDeviceIdsFromPluginsReadingEnabled = false; + } + public void disableDeviceIdsReading() { this.isGoogleAdIdReadingEnabled = false; this.isAndroidIdReadingEnabled = false; this.isAppSetIdReadingEnabled = false; this.isFbIdReadingEnabled = false; this.isFireAdIdReadingEnabled = false; - this.isPluginsDeviceIdsReadingEnabled = false; + this.isDeviceIdsFromPluginsReadingEnabled = false; } public Context getContext() { @@ -372,6 +376,10 @@ public boolean isFireAdIdReadingEnabled() { return isFireAdIdReadingEnabled; } + public boolean isDeviceIdsFromPluginsReadingEnabled() { + return isDeviceIdsFromPluginsReadingEnabled; + } + private boolean checkContext(Context context) { if (context == null) { logger.error("Missing context"); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java index 3dada72fa..9989518f0 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -517,8 +517,7 @@ private static class UtilDeviceIds { private static Map getImeiParameters(final AdjustConfig adjustConfig, final ILogger logger) { - if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled - || !adjustConfig.isPluginsDeviceIdsReadingEnabled) { + if (!Util.isDeviceIdsFromPluginsReadingEnabled(adjustConfig)) { return null; } @@ -527,8 +526,7 @@ private static Map getImeiParameters(final AdjustConfig adjustCo private static Map getOaidParameters(final AdjustConfig adjustConfig, final ILogger logger) { - if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled - || !adjustConfig.isPluginsDeviceIdsReadingEnabled) { + if (!Util.isDeviceIdsFromPluginsReadingEnabled(adjustConfig)) { return null; } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 2a0a8d7b9..627f76851 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -1282,7 +1282,7 @@ private void injectFeatureFlagsWithParameters(Map parameters) { PackageBuilder.addBoolean(parameters, "ff_fire_adid_disabled", true); } - if (!adjustConfig.isPluginsDeviceIdsReadingEnabled) { + if (!adjustConfig.isDeviceIdsFromPluginsReadingEnabled) { PackageBuilder.addBoolean(parameters, "ff_plugins_device_ids_disabled", true); } diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java index 0b8b7cef7..491eddedb 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java @@ -720,6 +720,14 @@ public static boolean isFireAdIdReadingEnabled(final AdjustConfig adjustConfig) return adjustConfig.isFireAdIdReadingEnabled; } + public static boolean isDeviceIdsFromPluginsReadingEnabled(final AdjustConfig adjustConfig) { + if (adjustConfig.coppaComplianceEnabled || adjustConfig.playStoreKidsComplianceEnabled) { + return false; + } + + return adjustConfig.isDeviceIdsFromPluginsReadingEnabled; + } + public static boolean isGooglePlayGamesForPC(final Context context) { PackageManager pm = context.getPackageManager(); return pm.hasSystemFeature("com.google.android.play.feature.HPE_EXPERIENCE"); diff --git a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index 907fee2b5..828c7b379 100644 --- a/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/tests/test-app-core/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -577,8 +577,16 @@ public void onRemoteTrigger(AdjustRemoteTrigger trigger) { } } - if (command.containsParameter("disableDeviceIdsReading")) { - String deviceIdsReadingEnabledS = command.getFirstParameterValue("disableDeviceIdsReading"); + if (command.containsParameter("deviceIdsFromPluginsReadingEnabled")) { + String deviceIdsFromPluginsReadingEnabledS = command.getFirstParameterValue("deviceIdsFromPluginsReadingEnabled"); + boolean deviceIdsFromPluginsReadingEnabled = "true".equals(deviceIdsFromPluginsReadingEnabledS); + if (!deviceIdsFromPluginsReadingEnabled) { + adjustConfig.disableDeviceIdsFromPluginsReading(); + } + } + + if (command.containsParameter("deviceIdsReadingEnabled")) { + String deviceIdsReadingEnabledS = command.getFirstParameterValue("deviceIdsReadingEnabled"); boolean deviceIdsReadingEnabled = "true".equals(deviceIdsReadingEnabledS); if (!deviceIdsReadingEnabled) { adjustConfig.disableDeviceIdsReading(); diff --git a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js index f70748d91..dcebe38b4 100644 --- a/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/tests/test-app-webbridge/src/main/assets/command_executor.js @@ -350,6 +350,62 @@ AdjustCommandExecutor.prototype.config = function(params) { } } + if ('googleAdIdReadingEnabled' in params) { + var googleAdIdReadingEnabledS = getFirstParameterValue(params, 'googleAdIdReadingEnabled'); + var googleAdIdReadingEnabled = googleAdIdReadingEnabledS == 'true'; + if (googleAdIdReadingEnabled == false) { + adjustConfig.disableGoogleAdIdReading(); + } + } + + if ('androidIdReadingEnabled' in params) { + var androidIdReadingEnabledS = getFirstParameterValue(params, 'androidIdReadingEnabled'); + var androidIdReadingEnabled = androidIdReadingEnabledS == 'true'; + if (androidIdReadingEnabled == false) { + adjustConfig.disableAndroidIdReading(); + } + } + + if ('appSetIdReadingEnabled' in params) { + var appSetIdReadingEnabledS = getFirstParameterValue(params, 'appSetIdReadingEnabled'); + var appSetIdReadingEnabled = appSetIdReadingEnabledS == 'true'; + if (appSetIdReadingEnabled == false) { + adjustConfig.disableAppSetIdReading(); + } + } + + if ('fbIdReadingEnabled' in params) { + var fbIdReadingEnabledS = getFirstParameterValue(params, 'fbIdReadingEnabled'); + var fbIdReadingEnabled = fbIdReadingEnabledS == 'true'; + if (fbIdReadingEnabled == false) { + adjustConfig.disableFbIdReading(); + } + } + + if ('fireAdIdReadingEnabled' in params) { + var fireAdIdReadingEnabledS = getFirstParameterValue(params, 'fireAdIdReadingEnabled'); + var fireAdIdReadingEnabled = fireAdIdReadingEnabledS == 'true'; + if (fireAdIdReadingEnabled == false) { + adjustConfig.disableFireAdIdReading(); + } + } + + if ('deviceIdsFromPluginsReadingEnabled' in params) { + var deviceIdsFromPluginsReadingEnabledS = getFirstParameterValue(params, 'deviceIdsFromPluginsReadingEnabled'); + var deviceIdsFromPluginsReadingEnabled = deviceIdsFromPluginsReadingEnabledS == 'true'; + if (deviceIdsFromPluginsReadingEnabled == false) { + adjustConfig.disableDeviceIdsFromPluginsReading(); + } + } + + if ('deviceIdsReadingEnabled' in params) { + var deviceIdsReadingEnabledS = getFirstParameterValue(params, 'deviceIdsReadingEnabled'); + var deviceIdsReadingEnabled = deviceIdsReadingEnabledS == 'true'; + if (deviceIdsReadingEnabled == false) { + adjustConfig.disableDeviceIdsReading(); + } + } + if ('storeName' in params) { var storeInfo; var storeName = getFirstParameterValue(params, 'storeName'); From 243a85cf829b7bb7fe1ae569f67bb228fbb55a24 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 6 Aug 2026 21:34:35 +0200 Subject: [PATCH 538/540] update version number to 5.8.0 --- Adjust/build.gradle | 2 +- Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-imei/build.gradle | 2 +- Adjust/plugins/sdk-plugin-meta-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-oaid/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle | 2 +- Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/build.gradle | 2 +- Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java | 2 +- VERSION | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 881ef10bf..2526273fd 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -24,7 +24,7 @@ ext { coreMinSdkVersion = 21 coreCompileSdkVersion = 37 coreTargetSdkVersion = 37 - coreVersionName = '5.7.0' + coreVersionName = '5.8.0' defaultVersionCode = 1 webbridgeMinSdkVersion = 21 samsungReferrerMinSdkVersion = 21 diff --git a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle index df6a5fdcb..5465d684f 100644 --- a/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-huawei-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.7.0' + // implementation 'com.adjust.sdk:adjust-android:5.8.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-imei/build.gradle b/Adjust/plugins/sdk-plugin-imei/build.gradle index 4ddbdd46f..54ff5e84d 100644 --- a/Adjust/plugins/sdk-plugin-imei/build.gradle +++ b/Adjust/plugins/sdk-plugin-imei/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.7.0' + // implementation 'com.adjust.sdk:adjust-android:5.8.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle index 83dd9424e..cf9db099b 100644 --- a/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-meta-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.7.0' + // implementation 'com.adjust.sdk:adjust-android:5.8.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-oaid/build.gradle b/Adjust/plugins/sdk-plugin-oaid/build.gradle index fb6965d7a..dbeb6e633 100644 --- a/Adjust/plugins/sdk-plugin-oaid/build.gradle +++ b/Adjust/plugins/sdk-plugin-oaid/build.gradle @@ -36,7 +36,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.7.0' + // implementation 'com.adjust.sdk:adjust-android:5.8.0' implementation 'com.huawei.hms:ads-identifier:3.4.56.300' } diff --git a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle index c7c481da3..7931b0e04 100644 --- a/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-clouddev/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.7.0' + // implementation 'com.adjust.sdk:adjust-android:5.8.0' // Add Samsung clouddev lib. compileOnly fileTree(include: ['*.aar'], dir: 'libs') diff --git a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle index d9fc0f4b2..21b995dd9 100644 --- a/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-samsung-referrer/build.gradle @@ -30,7 +30,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.7.0' + // implementation 'com.adjust.sdk:adjust-android:5.8.0' // Add Samsung referrer lib via Maven. implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:3.0.1' diff --git a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle index a325c1fa8..2dfeea5d2 100644 --- a/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-vivo-referrer/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.7.0' + // implementation 'com.adjust.sdk:adjust-android:5.8.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/build.gradle b/Adjust/plugins/sdk-plugin-webbridge/build.gradle index 638d7e977..e9798dd59 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/build.gradle +++ b/Adjust/plugins/sdk-plugin-webbridge/build.gradle @@ -33,7 +33,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.7.0' + // implementation 'com.adjust.sdk:adjust-android:5.8.0' } // read local properties diff --git a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js index 16e9ada5f..85d7fea73 100644 --- a/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/plugins/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -369,7 +369,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge5.7.0'; + return 'web-bridge5.8.0'; } }, diff --git a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle index 18c3071dd..ea1e4e9b9 100644 --- a/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle +++ b/Adjust/plugins/sdk-plugin-xiaomi-referrer/build.gradle @@ -34,7 +34,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:5.7.0' + // implementation 'com.adjust.sdk:adjust-android:5.8.0' // Add xiaomi referrer lib via Maven. implementation 'com.miui.referrer:homereferrer:1.0.0.6' diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java index 7182972ff..4439933bb 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Adjust.java @@ -31,7 +31,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.7.0"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:5.8.0"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java index 5c50c7bc2..c709e1cb6 100644 --- a/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java @@ -38,7 +38,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android5.7.0"; + String CLIENT_SDK = "android5.8.0"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/VERSION b/VERSION index 42cdd0b54..11d9efa3d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.7.0 +5.8.0 From c8adf79d822127d83ba90c63b2f5ae2403039c1a Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 6 Aug 2026 21:35:21 +0200 Subject: [PATCH 539/540] update changelog --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3ab5bb0f..bb4b371f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +### Version 5.8.0 (7th August 2026) +#### Added +- Added `disableDeviceIdsReading` method to `AdjustConfig` as an umbrella method alternative to invoking individual device ID disabling methods. + +#### Changed +- Updated the Adjust Signature library version to 5.0.0. + +--- + ### Version 5.7.0 (12th May 2026) #### Added - Added `getThirdPartySharingSettingsWithTimeout` to the `Adjust` API and `setOnThirdPartySharingSettingsChangedListener` to `AdjustConfig` for reading current third-party-sharing settings from the Adjust backend. From 53e5a674d45aee439221283aea879b5cdb03f5b4 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 7 Aug 2026 10:18:29 +0200 Subject: [PATCH 540/540] docs: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb4b371f4..23d86d953 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ### Version 5.8.0 (7th August 2026) #### Added +- Added support for Samsung MAPS (Mobile Application Preload System). - Added `disableDeviceIdsReading` method to `AdjustConfig` as an umbrella method alternative to invoking individual device ID disabling methods. #### Changed