From 2e9700541f73638b43c999d80dbeabc72ffd207c Mon Sep 17 00:00:00 2001 From: mahdi_ztd Date: Fri, 18 Mar 2022 11:11:33 +0100 Subject: [PATCH 01/31] refactor[PackageBuilder]: Remove network_type parameter - no need for dangerous READ_PHONE_STATE permission - remove getNetworkType function Closes #SDK-1410 --- .../java/com/adjust/sdk/PackageBuilder.java | 6 ------ .../src/main/java/com/adjust/sdk/Util.java | 18 ------------------ 2 files changed, 24 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 be7755a6f..e471e5bb5 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 @@ -326,7 +326,6 @@ private Map getSessionParameters(boolean isInDelay) { PackageBuilder.addString(parameters, "mcc", Util.getMcc(adjustConfig.context)); PackageBuilder.addString(parameters, "mnc", Util.getMnc(adjustConfig.context)); PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addLong(parameters, "network_type", Util.getNetworkType(adjustConfig.context)); PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); @@ -416,7 +415,6 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel PackageBuilder.addString(parameters, "mcc", Util.getMcc(adjustConfig.context)); PackageBuilder.addString(parameters, "mnc", Util.getMnc(adjustConfig.context)); PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addLong(parameters, "network_type", Util.getNetworkType(adjustConfig.context)); PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); @@ -567,7 +565,6 @@ private Map getClickParameters(String source) { PackageBuilder.addString(parameters, "mcc", Util.getMcc(adjustConfig.context)); PackageBuilder.addString(parameters, "mnc", Util.getMnc(adjustConfig.context)); PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addLong(parameters, "network_type", Util.getNetworkType(adjustConfig.context)); PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); @@ -970,7 +967,6 @@ private Map getAdRevenueParameters(String source, JSONObject adR PackageBuilder.addString(parameters, "mcc", Util.getMcc(adjustConfig.context)); PackageBuilder.addString(parameters, "mnc", Util.getMnc(adjustConfig.context)); PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addLong(parameters, "network_type", Util.getNetworkType(adjustConfig.context)); PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); @@ -1061,7 +1057,6 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven PackageBuilder.addString(parameters, "mcc", Util.getMcc(adjustConfig.context)); PackageBuilder.addString(parameters, "mnc", Util.getMnc(adjustConfig.context)); PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addLong(parameters, "network_type", Util.getNetworkType(adjustConfig.context)); PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); @@ -1157,7 +1152,6 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio PackageBuilder.addString(parameters, "mcc", Util.getMcc(adjustConfig.context)); PackageBuilder.addString(parameters, "mnc", Util.getMnc(adjustConfig.context)); PackageBuilder.addBoolean(parameters, "needs_response_details", true); - PackageBuilder.addLong(parameters, "network_type", Util.getNetworkType(adjustConfig.context)); PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); PackageBuilder.addString(parameters, "os_name", deviceInfo.osName); PackageBuilder.addString(parameters, "os_version", deviceInfo.osVersion); 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 8f6673c99..2d6992156 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 @@ -627,24 +627,6 @@ public static int getConnectivityType(Context context) { return -1; } - public static int getNetworkType(Context context) { - int networkType = -1; // default value that will not be send - - try { - TelephonyManager teleMan = - (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - networkType = teleMan.getDataNetworkType(); - } else { - networkType = teleMan.getNetworkType(); - } - } catch (Exception e) { - getLogger().warn("Couldn't read network type (%s)", e.getMessage()); - } - - return networkType; - } - public static String getMcc(Context context) { try { TelephonyManager tel = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); From 2906c722c6cac0cf6221a297152e1f9d0a90dcd2 Mon Sep 17 00:00:00 2001 From: mahdi_ztd Date: Fri, 18 Mar 2022 15:18:27 +0100 Subject: [PATCH 02/31] refactor[example apps]: Comment out READ_PHONE_STATE permission in example apps --- Adjust/example-app-java/src/main/AndroidManifest.xml | 2 +- Adjust/example-app-keyboard/src/main/AndroidManifest.xml | 2 +- Adjust/example-app-kotlin/src/main/AndroidManifest.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Adjust/example-app-java/src/main/AndroidManifest.xml b/Adjust/example-app-java/src/main/AndroidManifest.xml index 1826c1187..6dbd24c3d 100644 --- a/Adjust/example-app-java/src/main/AndroidManifest.xml +++ b/Adjust/example-app-java/src/main/AndroidManifest.xml @@ -5,7 +5,7 @@ - + diff --git a/Adjust/example-app-keyboard/src/main/AndroidManifest.xml b/Adjust/example-app-keyboard/src/main/AndroidManifest.xml index d1075877a..a7fe0b06d 100644 --- a/Adjust/example-app-keyboard/src/main/AndroidManifest.xml +++ b/Adjust/example-app-keyboard/src/main/AndroidManifest.xml @@ -5,7 +5,7 @@ - + - + Date: Fri, 4 Mar 2022 15:09:59 +0100 Subject: [PATCH 03/31] feat: add coppa compliance & play kids app support --- .../java/com/adjust/sdk/ActivityHandler.java | 15 +++- .../java/com/adjust/sdk/AdjustConfig.java | 10 +++ .../main/java/com/adjust/sdk/DeviceInfo.java | 39 +++++++++- .../java/com/adjust/sdk/PackageBuilder.java | 72 ++++++++++++------- .../src/main/assets/adjust_config.js | 10 +++ .../sdk/webbridge/AdjustBridgeInstance.java | 14 ++++ 6 files changed, 131 insertions(+), 29 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 b7940ebda..5ae976fca 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 @@ -788,8 +788,8 @@ public void run(ActivityHandler activityHandler) { logger.info("Event buffering is enabled"); } - deviceInfo.reloadPlayIds(adjustConfig.context); - if (deviceInfo.playAdId == null) { + deviceInfo.reloadPlayIds(adjustConfig); + if (deviceInfo.canReadPlayIds(adjustConfig) && deviceInfo.playAdId == null) { logger.warn("Unable to get Google Play Services Advertising ID at start time"); if (deviceInfo.androidId == null) { logger.error("Unable to get any device id's. Please check if Proguard is correctly set with Adjust SDK"); @@ -1131,6 +1131,8 @@ private void startI() { updateHandlersStatusAndSendI(); + processCoppaComplianceI(); + processSessionI(); checkAttributionStateI(); @@ -1156,6 +1158,8 @@ private void startFirstSessionI() { if (sharedPreferencesManager.getGdprForgetMe()) { gdprForgetMeI(); } else { + processCoppaComplianceI(); + // check if disable third party sharing request came, then send it first if (sharedPreferencesManager.getDisableThirdPartySharing()) { disableThirdPartySharingI(); @@ -2576,4 +2580,11 @@ private void checkForInstallReferrerInfo(final SdkClickResponseData responseData writeActivityStateI(); } + + private void processCoppaComplianceI() { + if (adjustConfig.coppaCompliantEnabled != null && + adjustConfig.coppaCompliantEnabled) { + disableThirdPartySharingI(); + } + } } 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 6d025428f..21e7a62de 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,8 @@ public class AdjustConfig { Boolean needsCost; String urlStrategy; String preinstallFilePath; + Boolean playStoreKidsAppEnabled; + Boolean coppaCompliantEnabled; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; @@ -184,6 +186,14 @@ public void setNeedsCost(boolean needsCost) { this.needsCost = needsCost; } + public void setPlayStoreKidsAppEnabled(boolean playStoreKidsAppEnabled) { + this.playStoreKidsAppEnabled = playStoreKidsAppEnabled; + } + + public void setCoppaCompliantEnabled(boolean coppaCompliantEnabled) { + this.coppaCompliantEnabled = coppaCompliantEnabled; + } + public boolean isValid() { if (!checkAppToken(appToken)) return false; if (!checkEnvironment(environment)) return 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 b4f95204d..9cbcd32d9 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 @@ -113,7 +113,12 @@ class DeviceInfo { uiMode = getDeviceUiMode(configuration); } - void reloadPlayIds(Context context) { + void reloadPlayIds(final AdjustConfig adjustConfig) { + if (!canReadPlayIds(adjustConfig)) { + return; + } + + Context context = adjustConfig.context; String previousPlayAdId = playAdId; Boolean previousIsTrackingEnabled = isTrackingEnabled; @@ -184,11 +189,15 @@ void reloadPlayIds(Context context) { } } - void reloadNonPlayIds(Context context) { + void reloadNonPlayIds(final AdjustConfig adjustConfig) { + if (!canReadNonPlayIds(adjustConfig)) { + return; + } + if (nonGoogleIdsReadOnce) { return; } - androidId = Util.getAndroidId(context); + androidId = Util.getAndroidId(adjustConfig.context); nonGoogleIdsReadOnce = true; } @@ -402,4 +411,28 @@ private String getAppUpdateTime(Context context) { return null; } } + + public boolean canReadPlayIds(final AdjustConfig adjustConfig) { + if (adjustConfig.playStoreKidsAppEnabled != null && adjustConfig.playStoreKidsAppEnabled) { + return false; + } + + if (adjustConfig.coppaCompliantEnabled != null && adjustConfig.coppaCompliantEnabled) { + return false; + } + + return true; + } + + public boolean canReadNonPlayIds(final AdjustConfig adjustConfig) { + if (adjustConfig.playStoreKidsAppEnabled != null && adjustConfig.playStoreKidsAppEnabled) { + return false; + } + + if (adjustConfig.coppaCompliantEnabled != null && adjustConfig.coppaCompliantEnabled) { + 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 e471e5bb5..4273e7e2f 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(boolean isInDelay) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig.context); + 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); @@ -292,7 +292,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.context); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -340,6 +340,8 @@ private Map getSessionParameters(boolean isInDelay) { PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); + PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -368,7 +370,7 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig.context); + 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); @@ -380,7 +382,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.context); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -429,6 +431,8 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); + PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -451,7 +455,7 @@ private Map getInfoParameters(String source) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig.context); + 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); @@ -463,7 +467,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.context); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -481,6 +485,8 @@ private Map getInfoParameters(String source) { PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); PackageBuilder.addString(parameters, "source", source); + PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -503,7 +509,7 @@ private Map getClickParameters(String source) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig.context); + 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); @@ -515,7 +521,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.context); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -588,6 +594,8 @@ private Map getClickParameters(String source) { PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); PackageBuilder.addString(parameters, "payload", preinstallPayload); PackageBuilder.addString(parameters, "found_location", preinstallLocation); + PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -610,7 +618,7 @@ private Map getAttributionParameters(String initiatedBy) { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig.context); + 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); @@ -622,7 +630,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.context); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -648,6 +656,8 @@ private Map getAttributionParameters(String initiatedBy) { PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); + PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -670,7 +680,7 @@ private Map getGdprParameters() { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig.context); + 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); @@ -682,7 +692,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.context); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -707,6 +717,8 @@ private Map getGdprParameters() { PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); + PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -729,7 +741,7 @@ private Map getDisableThirdPartySharingParameters() { } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig.context); + 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); @@ -741,7 +753,7 @@ private Map getDisableThirdPartySharingParameters() { 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.context); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -766,6 +778,8 @@ private Map getDisableThirdPartySharingParameters() { PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); + PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -799,7 +813,7 @@ private Map getDisableThirdPartySharingParameters() { adjustThirdPartySharing.granularOptions); // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig.context); + 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); @@ -811,7 +825,7 @@ private Map getDisableThirdPartySharingParameters() { 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.context); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -835,6 +849,8 @@ private Map getDisableThirdPartySharingParameters() { PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); + PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -863,7 +879,7 @@ private Map getMeasurementConsentParameters( consentMeasurement ? "enable" : "disable"); // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig.context); + 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); @@ -875,7 +891,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.context); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -899,6 +915,8 @@ private Map getMeasurementConsentParameters( PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); + PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -921,7 +939,7 @@ private Map getAdRevenueParameters(String source, JSONObject adR } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig.context); + 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); @@ -933,7 +951,7 @@ private Map getAdRevenueParameters(String source, JSONObject adR 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.context); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -983,6 +1001,8 @@ private Map getAdRevenueParameters(String source, JSONObject adR PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); + PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -1011,7 +1031,7 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig.context); + 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); @@ -1023,7 +1043,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.context); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -1078,6 +1098,8 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); + PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -1100,7 +1122,7 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio } // Device identifiers. - deviceInfo.reloadPlayIds(adjustConfig.context); + 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); @@ -1112,7 +1134,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.context); + deviceInfo.reloadNonPlayIds(adjustConfig); PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); } @@ -1176,6 +1198,8 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio PackageBuilder.addLong(parameters, "revenue", subscription.getPrice()); PackageBuilder.addDateInMilliseconds(parameters, "transaction_date", subscription.getPurchaseTime()); PackageBuilder.addString(parameters, "transaction_id", subscription.getOrderId()); + PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; 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 b06f84f70..f5c0c45eb 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust_config.js @@ -53,6 +53,8 @@ function AdjustConfig(appToken, environment, legacy) { this.urlStrategy = null; this.preinstallTrackingEnabled = null; this.preinstallFilePath = null; + this.playStoreKidsAppEnabled = null; + this.coppaCompliantEnabled = null; } AdjustConfig.EnvironmentSandbox = 'sandbox'; @@ -248,3 +250,11 @@ AdjustConfig.prototype.setPreinstallTrackingEnabled = function(preinstallTrackin AdjustConfig.prototype.setPreinstallFilePath = function(preinstallFilePath) { this.preinstallFilePath = preinstallFilePath; }; + +AdjustConfig.prototype.setPlayStoreKidsAppEnabled = function(isEnabled) { + this.playStoreKidsAppEnabled = isEnabled; +}; + +AdjustConfig.prototype.setCoppaCompliantEnabled = function(isEnabled) { + this.coppaCompliantEnabled = 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 5dbe4f41f..f3ee1f487 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 @@ -172,6 +172,8 @@ 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 coppaCompliantEnabledField = jsonAdjustConfig.get("coppaCompliantEnabled"); String appToken = AdjustBridgeUtil.fieldToString(appTokenField); String environment = AdjustBridgeUtil.fieldToString(environmentField); @@ -387,6 +389,18 @@ public boolean launchReceivedDeeplink(Uri deeplink) { adjustConfig.setPreinstallFilePath(preinstallFilePath); } + // PlayStore Kids app + Boolean playStoreKidsAppEnabled = AdjustBridgeUtil.fieldToBoolean(playStoreKidsAppEnabledField); + if (playStoreKidsAppEnabled != null) { + adjustConfig.setPlayStoreKidsAppEnabled(playStoreKidsAppEnabled); + } + + // Coppa compliant + Boolean coppaCompliantEnabled = AdjustBridgeUtil.fieldToBoolean(coppaCompliantEnabledField); + if (coppaCompliantEnabled != null) { + adjustConfig.setCoppaCompliantEnabled(coppaCompliantEnabled); + } + // 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); From 2ee15ebb528f238a95875ea7718899b19916ed02 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 22 Mar 2022 09:29:42 +0100 Subject: [PATCH 04/31] feat: use new third pary sharing api --- .../java/com/adjust/sdk/ActivityHandler.java | 55 ++++++++++++++++++- .../java/com/adjust/sdk/ActivityState.java | 6 ++ .../main/java/com/adjust/sdk/DeviceInfo.java | 2 +- 3 files changed, 59 insertions(+), 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 5ae976fca..62b8e99a9 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 @@ -2582,9 +2582,58 @@ private void checkForInstallReferrerInfo(final SdkClickResponseData responseData } private void processCoppaComplianceI() { - if (adjustConfig.coppaCompliantEnabled != null && - adjustConfig.coppaCompliantEnabled) { - disableThirdPartySharingI(); + if (adjustConfig.coppaCompliantEnabled == null) { + return; + } + + if (adjustConfig.coppaCompliantEnabled) { + disableThirdPartySharingForCoppaEnabledI(); + } else { + enableThirdPartySharingForCoppaDisabledI(); + } + } + + private void disableThirdPartySharingForCoppaEnabledI() { + if (shouldDisableThirdPartySharingForCoppaEnabled()) { + activityState.isThirdPartySharingDisabledForCoppa = true; + writeActivityStateI(); + AdjustThirdPartySharing adjustThirdPartySharingForCoppaDisabled = + new AdjustThirdPartySharing(false); + trackThirdPartySharingI(adjustThirdPartySharingForCoppaDisabled); + } + } + + private void enableThirdPartySharingForCoppaDisabledI() { + if (shouldEnableThirdPartySharingForCoppaDisabled()) { + activityState.isThirdPartySharingDisabledForCoppa = false; + writeActivityStateI(); + AdjustThirdPartySharing adjustThirdPartySharingForCoppaEnabled = + new AdjustThirdPartySharing(true); + trackThirdPartySharingI(adjustThirdPartySharingForCoppaEnabled); + } + } + + private boolean shouldDisableThirdPartySharingForCoppaEnabled() { + if (activityState == null) { + return false; + } + + if (activityState.isThirdPartySharingDisabledForCoppa == null) { + return true; } + + return !activityState.isThirdPartySharingDisabledForCoppa; + } + + private boolean shouldEnableThirdPartySharingForCoppaDisabled() { + if (activityState == null) { + return false; + } + + if (activityState.isThirdPartySharingDisabledForCoppa == null) { + return false; + } + + 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 875298a3e..b91566b35 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,6 +27,7 @@ public class ActivityState implements Serializable, Cloneable { new ObjectStreamField("enabled", boolean.class), new ObjectStreamField("isGdprForgotten", boolean.class), new ObjectStreamField("isThirdPartySharingDisabled", boolean.class), + new ObjectStreamField("isThirdPartySharingDisabledForCoppa", Boolean.class), new ObjectStreamField("askingAttribution", boolean.class), new ObjectStreamField("eventCount", int.class), new ObjectStreamField("sessionCount", int.class), @@ -57,6 +58,7 @@ public class ActivityState implements Serializable, Cloneable { protected boolean enabled; protected boolean isGdprForgotten; protected boolean isThirdPartySharingDisabled; + protected Boolean isThirdPartySharingDisabledForCoppa; protected boolean askingAttribution; // global counters @@ -98,6 +100,7 @@ protected ActivityState() { enabled = true; isGdprForgotten = false; isThirdPartySharingDisabled = false; + isThirdPartySharingDisabledForCoppa = null; askingAttribution = false; eventCount = 0; // no events yet sessionCount = 0; // the first session just started @@ -168,6 +171,7 @@ public boolean equals(Object other) { 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; if (!Util.equalInt(sessionCount, otherActivityState.sessionCount)) return false; @@ -200,6 +204,7 @@ public int hashCode() { hashCode = 37 * hashCode + Util.hashBoolean(enabled); hashCode = 37 * hashCode + Util.hashBoolean(isGdprForgotten); hashCode = 37 * hashCode + Util.hashBoolean(isThirdPartySharingDisabled); + hashCode = 37 * hashCode + Util.hashBoolean(isThirdPartySharingDisabledForCoppa); hashCode = 37 * hashCode + Util.hashBoolean(askingAttribution); hashCode = 37 * hashCode + eventCount; hashCode = 37 * hashCode + sessionCount; @@ -241,6 +246,7 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo enabled = Util.readBooleanField(fields, "enabled", true); isGdprForgotten = Util.readBooleanField(fields, "isGdprForgotten", false); isThirdPartySharingDisabled = Util.readBooleanField(fields, "isThirdPartySharingDisabled", false); + isThirdPartySharingDisabledForCoppa = Util.readObjectField(fields, "isThirdPartySharingDisabledForCoppa", null); askingAttribution = Util.readBooleanField(fields, "askingAttribution", false); updatePackages = Util.readBooleanField(fields, "updatePackages", 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 9cbcd32d9..b62582704 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 @@ -53,7 +53,7 @@ class DeviceInfo { String playAdId; String playAdIdSource; - int playAdIdAttempt; + int playAdIdAttempt = -1; Boolean isTrackingEnabled; private boolean nonGoogleIdsReadOnce = false; String androidId; From 3f3cbc05daa91d36a4a685417925f80fe7e1429b Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 23 Mar 2022 19:00:40 +0100 Subject: [PATCH 05/31] feat: update handling coppa disabled --- .../java/com/adjust/sdk/ActivityHandler.java | 59 ++++++++++++------- 1 file changed, 37 insertions(+), 22 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 62b8e99a9..f171ca766 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 @@ -1611,6 +1611,8 @@ private void setEnabledI(boolean enabled) { if (sharedPreferencesManager.getGdprForgetMe()) { gdprForgetMeI(); } else { + processCoppaComplianceI(); + if (sharedPreferencesManager.getDisableThirdPartySharing()) { disableThirdPartySharingI(); } @@ -2255,6 +2257,10 @@ private void trackThirdPartySharingI(final AdjustThirdPartySharing adjustThirdPa } if (!isEnabledI()) { return; } if (activityState.isGdprForgotten) { return; } + if (adjustConfig.coppaCompliantEnabled != null && adjustConfig.coppaCompliantEnabled) { + // block calling third party sharing API when COPPA enabled + return; + } long now = System.currentTimeMillis(); PackageBuilder packageBuilder = new PackageBuilder( @@ -2589,51 +2595,60 @@ private void processCoppaComplianceI() { if (adjustConfig.coppaCompliantEnabled) { disableThirdPartySharingForCoppaEnabledI(); } else { - enableThirdPartySharingForCoppaDisabledI(); + resetThirdPartySharingCoppaActivityStateI(); } } private void disableThirdPartySharingForCoppaEnabledI() { - if (shouldDisableThirdPartySharingForCoppaEnabled()) { - activityState.isThirdPartySharingDisabledForCoppa = true; - writeActivityStateI(); - AdjustThirdPartySharing adjustThirdPartySharingForCoppaDisabled = - new AdjustThirdPartySharing(false); - trackThirdPartySharingI(adjustThirdPartySharingForCoppaDisabled); + if (!shouldDisableThirdPartySharingWhenCoppaEnabled()) { + return; + } + + activityState.isThirdPartySharingDisabledForCoppa = true; + writeActivityStateI(); + AdjustThirdPartySharing adjustThirdPartySharing = + new AdjustThirdPartySharing(false); + + 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(); } } - private void enableThirdPartySharingForCoppaDisabledI() { - if (shouldEnableThirdPartySharingForCoppaDisabled()) { + private void resetThirdPartySharingCoppaActivityStateI() { + if (activityState == null) { return; } + if (activityState.isThirdPartySharingDisabledForCoppa) { activityState.isThirdPartySharingDisabledForCoppa = false; writeActivityStateI(); - AdjustThirdPartySharing adjustThirdPartySharingForCoppaEnabled = - new AdjustThirdPartySharing(true); - trackThirdPartySharingI(adjustThirdPartySharingForCoppaEnabled); } } - private boolean shouldDisableThirdPartySharingForCoppaEnabled() { + private boolean shouldDisableThirdPartySharingWhenCoppaEnabled() { if (activityState == null) { return false; } - if (activityState.isThirdPartySharingDisabledForCoppa == null) { - return true; + if (!isEnabledI()) { + return false; } - return !activityState.isThirdPartySharingDisabledForCoppa; - } - - private boolean shouldEnableThirdPartySharingForCoppaDisabled() { - if (activityState == null) { + if (activityState.isGdprForgotten) { return false; } if (activityState.isThirdPartySharingDisabledForCoppa == null) { - return false; + return true; } - return activityState.isThirdPartySharingDisabledForCoppa; + return !activityState.isThirdPartySharingDisabledForCoppa; } } From 1ed423b8f932f318d5b6228b7d230f1405082073 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 24 Mar 2022 17:36:20 +0100 Subject: [PATCH 06/31] feat: reset third party sharing flag when coppa settings not present --- .../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 f171ca766..d7a5c2fb9 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 @@ -2589,6 +2589,7 @@ private void checkForInstallReferrerInfo(final SdkClickResponseData responseData private void processCoppaComplianceI() { if (adjustConfig.coppaCompliantEnabled == null) { + resetThirdPartySharingCoppaActivityStateI(); return; } @@ -2626,7 +2627,8 @@ private void disableThirdPartySharingForCoppaEnabledI() { private void resetThirdPartySharingCoppaActivityStateI() { if (activityState == null) { return; } - if (activityState.isThirdPartySharingDisabledForCoppa) { + if (activityState.isThirdPartySharingDisabledForCoppa != null && + activityState.isThirdPartySharingDisabledForCoppa) { activityState.isThirdPartySharingDisabledForCoppa = false; writeActivityStateI(); } From ed97d9a8ba31146f6f7ceb6504ed9d2cf14e5c1a Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 24 Mar 2022 17:40:40 +0100 Subject: [PATCH 07/31] feat: moving isThirdPartySharingDisabledForCoppa flag to end for version migration --- Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityState.java | 2 +- 1 file changed, 1 insertion(+), 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 b91566b35..617c07839 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("enabled", boolean.class), new ObjectStreamField("isGdprForgotten", boolean.class), new ObjectStreamField("isThirdPartySharingDisabled", boolean.class), - new ObjectStreamField("isThirdPartySharingDisabledForCoppa", Boolean.class), new ObjectStreamField("askingAttribution", boolean.class), new ObjectStreamField("eventCount", int.class), new ObjectStreamField("sessionCount", int.class), @@ -51,6 +50,7 @@ public class ActivityState implements Serializable, Cloneable { new ObjectStreamField("installBeginHuawei", long.class), new ObjectStreamField("installReferrerHuawei", String.class), new ObjectStreamField("installReferrerHuaweiAppGallery", String.class), + new ObjectStreamField("isThirdPartySharingDisabledForCoppa", Boolean.class), }; // persistent data From 0b5211e93095e19c7696b5f5f62df8a3931901c5 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 24 Mar 2022 18:00:56 +0100 Subject: [PATCH 08/31] feat: add logs when not reading ids for kids --- .../main/java/com/adjust/sdk/ActivityHandler.java | 15 ++++++++++++--- 1 file changed, 12 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 d7a5c2fb9..d9a4b552b 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 @@ -789,10 +789,19 @@ public void run(ActivityHandler activityHandler) { } deviceInfo.reloadPlayIds(adjustConfig); - if (deviceInfo.canReadPlayIds(adjustConfig) && deviceInfo.playAdId == null) { - logger.warn("Unable to get Google Play Services Advertising ID at start time"); + if (deviceInfo.playAdId == null) { + if (deviceInfo.canReadPlayIds(adjustConfig)) { + logger.warn("Unable to get Google Play Services Advertising ID at start time"); + } else { + logger.info("Cannot read Google Play Services Advertising ID for kids"); + } + if (deviceInfo.androidId == null) { - logger.error("Unable to get any device id's. Please check if Proguard is correctly set with Adjust SDK"); + if (deviceInfo.canReadNonPlayIds(adjustConfig)) { + logger.error("Unable to get any device id's. Please check if Proguard is correctly set with Adjust SDK"); + } else { + logger.info("Cannot read non Play Ids for kids"); + } } } else { logger.info("Google Play Services Advertising ID read correctly at start time"); From 152f1cf47d08cc7e25d40d626646a044fc685431 Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 24 Mar 2022 21:54:52 +0100 Subject: [PATCH 09/31] test: Add commands to test coppa/playKids --- .../com/adjust/testapp/AdjustCommandExecutor.java | 12 ++++++++++++ 1 file changed, 12 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 41e74df26..3f77a5079 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 @@ -316,6 +316,18 @@ 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); + adjustConfig.setPlayStoreKidsAppEnabled(playStoreKids); + } + if(command.containsParameter("deferredDeeplinkCallback")) { adjustConfig.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() { @Override From 4f8a87032e8053845b0236a06c937e38f6e1da9c Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 24 Mar 2022 22:58:11 +0100 Subject: [PATCH 10/31] feat: add check to stop reading other ids for coppa --- .../java/com/adjust/sdk/ActivityHandler.java | 4 +- .../main/java/com/adjust/sdk/DeviceInfo.java | 26 +------ .../java/com/adjust/sdk/PackageBuilder.java | 72 +++++++++---------- .../src/main/java/com/adjust/sdk/Util.java | 62 ++++++++++++++++ 4 files changed, 102 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 d9a4b552b..08478cf5b 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 @@ -790,14 +790,14 @@ public void run(ActivityHandler activityHandler) { deviceInfo.reloadPlayIds(adjustConfig); if (deviceInfo.playAdId == null) { - if (deviceInfo.canReadPlayIds(adjustConfig)) { + if (Util.canReadPlayIds(adjustConfig)) { logger.warn("Unable to get Google Play Services Advertising ID at start time"); } else { logger.info("Cannot read Google Play Services Advertising ID for kids"); } if (deviceInfo.androidId == null) { - if (deviceInfo.canReadNonPlayIds(adjustConfig)) { + if (Util.canReadNonPlayIds(adjustConfig)) { logger.error("Unable to get any device id's. Please check if Proguard is correctly set with Adjust SDK"); } else { logger.info("Cannot read non Play Ids for kids"); 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 b62582704..f9f83c225 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 @@ -114,7 +114,7 @@ class DeviceInfo { } void reloadPlayIds(final AdjustConfig adjustConfig) { - if (!canReadPlayIds(adjustConfig)) { + if (!Util.canReadPlayIds(adjustConfig)) { return; } @@ -190,7 +190,7 @@ void reloadPlayIds(final AdjustConfig adjustConfig) { } void reloadNonPlayIds(final AdjustConfig adjustConfig) { - if (!canReadNonPlayIds(adjustConfig)) { + if (!Util.canReadNonPlayIds(adjustConfig)) { return; } @@ -412,27 +412,5 @@ private String getAppUpdateTime(Context context) { } } - public boolean canReadPlayIds(final AdjustConfig adjustConfig) { - if (adjustConfig.playStoreKidsAppEnabled != null && adjustConfig.playStoreKidsAppEnabled) { - return false; - } - - if (adjustConfig.coppaCompliantEnabled != null && adjustConfig.coppaCompliantEnabled) { - return false; - } - - return true; - } - public boolean canReadNonPlayIds(final AdjustConfig adjustConfig) { - if (adjustConfig.playStoreKidsAppEnabled != null && adjustConfig.playStoreKidsAppEnabled) { - return false; - } - - if (adjustConfig.coppaCompliantEnabled != null && adjustConfig.coppaCompliantEnabled) { - 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 4273e7e2f..2db44ac92 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 @@ -260,7 +260,7 @@ ActivityPackage buildSubscriptionPackage(AdjustPlayStoreSubscription subscriptio private Map getSessionParameters(boolean isInDelay) { ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); - Map imeiParameters = Reflection.getImeiParameters(adjustConfig.context, logger); + Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (imeiParameters != null) { @@ -268,7 +268,7 @@ private Map getSessionParameters(boolean isInDelay) { } // Check if oaid plugin is used and if yes, add the parameter - Map oaidParameters = Reflection.getOaidParameters(adjustConfig.context, logger); + Map oaidParameters = Util.getOaidParameters(adjustConfig, logger); if (oaidParameters != null) { parameters.putAll(oaidParameters); } @@ -286,7 +286,7 @@ private Map getSessionParameters(boolean isInDelay) { 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", Util.getFireAdvertisingId(contentResolver)); + PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { @@ -350,7 +350,7 @@ private Map getSessionParameters(boolean isInDelay) { public Map getEventParameters(AdjustEvent event, boolean isInDelay) { ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); - Map imeiParameters = Reflection.getImeiParameters(adjustConfig.context, logger); + Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (imeiParameters != null) { @@ -358,7 +358,7 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel } // Check if oaid plugin is used and if yes, add the parameter - Map oaidParameters = Reflection.getOaidParameters(adjustConfig.context, logger); + Map oaidParameters = Util.getOaidParameters(adjustConfig, logger); if (oaidParameters != null) { parameters.putAll(oaidParameters); } @@ -376,7 +376,7 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel 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", Util.getFireAdvertisingId(contentResolver)); + PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { @@ -441,7 +441,7 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel private Map getInfoParameters(String source) { ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); - Map imeiParameters = Reflection.getImeiParameters(adjustConfig.context, logger); + Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (imeiParameters != null) { @@ -449,7 +449,7 @@ private Map getInfoParameters(String source) { } // Check if oaid plugin is used and if yes, add the parameter - Map oaidParameters = Reflection.getOaidParameters(adjustConfig.context, logger); + Map oaidParameters = Util.getOaidParameters(adjustConfig, logger); if (oaidParameters != null) { parameters.putAll(oaidParameters); } @@ -461,7 +461,7 @@ private Map getInfoParameters(String source) { 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", Util.getFireAdvertisingId(contentResolver)); + PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { @@ -495,7 +495,7 @@ private Map getInfoParameters(String source) { private Map getClickParameters(String source) { ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); - Map imeiParameters = Reflection.getImeiParameters(adjustConfig.context, logger); + Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (imeiParameters != null) { @@ -503,7 +503,7 @@ private Map getClickParameters(String source) { } // Check if oaid plugin is used and if yes, add the parameter - Map oaidParameters = Reflection.getOaidParameters(adjustConfig.context, logger); + Map oaidParameters = Util.getOaidParameters(adjustConfig, logger); if (oaidParameters != null) { parameters.putAll(oaidParameters); } @@ -515,7 +515,7 @@ private Map getClickParameters(String source) { 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", Util.getFireAdvertisingId(contentResolver)); + PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { @@ -604,7 +604,7 @@ private Map getClickParameters(String source) { private Map getAttributionParameters(String initiatedBy) { ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); - Map imeiParameters = Reflection.getImeiParameters(adjustConfig.context, logger); + Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (imeiParameters != null) { @@ -612,7 +612,7 @@ private Map getAttributionParameters(String initiatedBy) { } // Check if oaid plugin is used and if yes, add the parameter - Map oaidParameters = Reflection.getOaidParameters(adjustConfig.context, logger); + Map oaidParameters = Util.getOaidParameters(adjustConfig, logger); if (oaidParameters != null) { parameters.putAll(oaidParameters); } @@ -624,7 +624,7 @@ private Map getAttributionParameters(String initiatedBy) { 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", Util.getFireAdvertisingId(contentResolver)); + PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { @@ -666,7 +666,7 @@ private Map getAttributionParameters(String initiatedBy) { private Map getGdprParameters() { ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); - Map imeiParameters = Reflection.getImeiParameters(adjustConfig.context, logger); + Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (imeiParameters != null) { @@ -674,7 +674,7 @@ private Map getGdprParameters() { } // Check if oaid plugin is used and if yes, add the parameter - Map oaidParameters = Reflection.getOaidParameters(adjustConfig.context, logger); + Map oaidParameters = Util.getOaidParameters(adjustConfig, logger); if (oaidParameters != null) { parameters.putAll(oaidParameters); } @@ -686,7 +686,7 @@ private Map getGdprParameters() { 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", Util.getFireAdvertisingId(contentResolver)); + PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { @@ -727,7 +727,7 @@ private Map getGdprParameters() { private Map getDisableThirdPartySharingParameters() { ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); - Map imeiParameters = Reflection.getImeiParameters(adjustConfig.context, logger); + Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (imeiParameters != null) { @@ -735,7 +735,7 @@ private Map getDisableThirdPartySharingParameters() { } // Check if oaid plugin is used and if yes, add the parameter - Map oaidParameters = Reflection.getOaidParameters(adjustConfig.context, logger); + Map oaidParameters = Util.getOaidParameters(adjustConfig, logger); if (oaidParameters != null) { parameters.putAll(oaidParameters); } @@ -747,7 +747,7 @@ private Map getDisableThirdPartySharingParameters() { 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", Util.getFireAdvertisingId(contentResolver)); + PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { @@ -790,7 +790,7 @@ private Map getDisableThirdPartySharingParameters() { { ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); - Map imeiParameters = Reflection.getImeiParameters(adjustConfig.context, logger); + Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (imeiParameters != null) { @@ -798,7 +798,7 @@ private Map getDisableThirdPartySharingParameters() { } // Check if oaid plugin is used and if yes, add the parameter - Map oaidParameters = Reflection.getOaidParameters(adjustConfig.context, logger); + Map oaidParameters = Util.getOaidParameters(adjustConfig, logger); if (oaidParameters != null) { parameters.putAll(oaidParameters); } @@ -819,7 +819,7 @@ private Map getDisableThirdPartySharingParameters() { 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", Util.getFireAdvertisingId(contentResolver)); + PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { @@ -861,7 +861,7 @@ private Map getMeasurementConsentParameters( { ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); - Map imeiParameters = Reflection.getImeiParameters(adjustConfig.context, logger); + Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (imeiParameters != null) { @@ -869,7 +869,7 @@ private Map getMeasurementConsentParameters( } // Check if oaid plugin is used and if yes, add the parameter - Map oaidParameters = Reflection.getOaidParameters(adjustConfig.context, logger); + Map oaidParameters = Util.getOaidParameters(adjustConfig, logger); if (oaidParameters != null) { parameters.putAll(oaidParameters); } @@ -885,7 +885,7 @@ private Map getMeasurementConsentParameters( 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", Util.getFireAdvertisingId(contentResolver)); + PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { @@ -925,7 +925,7 @@ private Map getMeasurementConsentParameters( private Map getAdRevenueParameters(String source, JSONObject adRevenueJson) { ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); - Map imeiParameters = Reflection.getImeiParameters(adjustConfig.context, logger); + Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (imeiParameters != null) { @@ -933,7 +933,7 @@ private Map getAdRevenueParameters(String source, JSONObject adR } // Check if oaid plugin is used and if yes, add the parameter - Map oaidParameters = Reflection.getOaidParameters(adjustConfig.context, logger); + Map oaidParameters = Util.getOaidParameters(adjustConfig, logger); if (oaidParameters != null) { parameters.putAll(oaidParameters); } @@ -945,7 +945,7 @@ private Map getAdRevenueParameters(String source, JSONObject adR 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", Util.getFireAdvertisingId(contentResolver)); + PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { @@ -1011,7 +1011,7 @@ private Map getAdRevenueParameters(String source, JSONObject adR private Map getAdRevenueParameters(AdjustAdRevenue adjustAdRevenue, boolean isInDelay) { ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); - Map imeiParameters = Reflection.getImeiParameters(adjustConfig.context, logger); + Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (imeiParameters != null) { @@ -1019,7 +1019,7 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven } // Check if oaid plugin is used and if yes, add the parameter - Map oaidParameters = Reflection.getOaidParameters(adjustConfig.context, logger); + Map oaidParameters = Util.getOaidParameters(adjustConfig, logger); if (oaidParameters != null) { parameters.putAll(oaidParameters); } @@ -1037,7 +1037,7 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven 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", Util.getFireAdvertisingId(contentResolver)); + PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { @@ -1108,7 +1108,7 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven private Map getSubscriptionParameters(AdjustPlayStoreSubscription subscription, boolean isInDelay) { ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); - Map imeiParameters = Reflection.getImeiParameters(adjustConfig.context, logger); + Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); // Check if plugin is used and if yes, add read parameters. if (imeiParameters != null) { @@ -1116,7 +1116,7 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio } // Check if oaid plugin is used and if yes, add the parameter - Map oaidParameters = Reflection.getOaidParameters(adjustConfig.context, logger); + Map oaidParameters = Util.getOaidParameters(adjustConfig, logger); if (oaidParameters != null) { parameters.putAll(oaidParameters); } @@ -1128,7 +1128,7 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio 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", Util.getFireAdvertisingId(contentResolver)); + PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { 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 2d6992156..b9d191d64 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 @@ -771,6 +771,68 @@ public static boolean isEqualReferrerDetails(final ReferrerDetails referrerDetai return false; } + public static boolean canReadPlayIds(final AdjustConfig adjustConfig) { + if (isPlayStoreKidsAppEnabled(adjustConfig)) { + return false; + } + + if (isCoppaEnabled(adjustConfig)) { + return false; + } + + return true; + } + + public static boolean canReadNonPlayIds(final AdjustConfig adjustConfig) { + if (isPlayStoreKidsAppEnabled(adjustConfig)) { + return false; + } + + if (isCoppaEnabled(adjustConfig)) { + return false; + } + + return true; + } + + public static boolean isCoppaEnabled(final AdjustConfig adjustConfig) { + if (adjustConfig.coppaCompliantEnabled != null && adjustConfig.coppaCompliantEnabled) { + return true; + } + return false; + } + + public static boolean isPlayStoreKidsAppEnabled(final AdjustConfig adjustConfig) { + if (adjustConfig.playStoreKidsAppEnabled != null && adjustConfig.playStoreKidsAppEnabled) { + return true; + } + return false; + } + + public static Map getImeiParameters(final AdjustConfig adjustConfig, ILogger logger) { + if (isCoppaEnabled(adjustConfig)) { + return null; + } + + return Reflection.getImeiParameters(adjustConfig.context, logger); + } + + public static Map getOaidParameters(final AdjustConfig adjustConfig, ILogger logger) { + if (isCoppaEnabled(adjustConfig)) { + return null; + } + + return Reflection.getOaidParameters(adjustConfig.context, logger); + } + + public static String getFireAdvertisingId(final AdjustConfig adjustConfig) { + if (isCoppaEnabled(adjustConfig)) { + return null; + } + + return getFireAdvertisingId(adjustConfig.context.getContentResolver()); + } + private static boolean isEqualGoogleReferrerDetails(final ReferrerDetails referrerDetails, final ActivityState activityState) { return referrerDetails.referrerClickTimestampSeconds == activityState.clickTime From 36492f088a9db7dbc94cc5f653ee8128f596e239 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 25 Mar 2022 11:05:34 +0100 Subject: [PATCH 11/31] feat: apply coppa enable settings on fire adid tracking param --- .../java/com/adjust/sdk/PackageBuilder.java | 43 ++++++++----------- .../src/main/java/com/adjust/sdk/Util.java | 8 ++++ 2 files changed, 25 insertions(+), 26 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 2db44ac92..546d4302e 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 @@ -15,7 +15,6 @@ import org.json.JSONObject; import android.text.TextUtils; -import android.content.ContentResolver; public class PackageBuilder { private static ILogger logger = AdjustFactory.getLogger(); @@ -258,7 +257,6 @@ ActivityPackage buildSubscriptionPackage(AdjustPlayStoreSubscription subscriptio } private Map getSessionParameters(boolean isInDelay) { - ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); @@ -287,7 +285,7 @@ private Map getSessionParameters(boolean isInDelay) { PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(adjustConfig)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + @@ -348,7 +346,6 @@ private Map getSessionParameters(boolean isInDelay) { } public Map getEventParameters(AdjustEvent event, boolean isInDelay) { - ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); @@ -377,7 +374,7 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(adjustConfig)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + @@ -439,7 +436,6 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel } private Map getInfoParameters(String source) { - ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); @@ -462,7 +458,7 @@ private Map getInfoParameters(String source) { PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(adjustConfig)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + @@ -493,7 +489,6 @@ private Map getInfoParameters(String source) { } private Map getClickParameters(String source) { - ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); @@ -516,7 +511,7 @@ private Map getClickParameters(String source) { PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(adjustConfig)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + @@ -602,7 +597,6 @@ private Map getClickParameters(String source) { } private Map getAttributionParameters(String initiatedBy) { - ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); @@ -625,7 +619,7 @@ private Map getAttributionParameters(String initiatedBy) { PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(adjustConfig)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + @@ -664,7 +658,6 @@ private Map getAttributionParameters(String initiatedBy) { } private Map getGdprParameters() { - ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); @@ -687,7 +680,7 @@ private Map getGdprParameters() { PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(adjustConfig)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + @@ -725,7 +718,6 @@ private Map getGdprParameters() { } private Map getDisableThirdPartySharingParameters() { - ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); @@ -748,7 +740,7 @@ private Map getDisableThirdPartySharingParameters() { PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(adjustConfig)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + @@ -788,7 +780,6 @@ private Map getDisableThirdPartySharingParameters() { private Map getThirdPartySharingParameters (final AdjustThirdPartySharing adjustThirdPartySharing) { - ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); @@ -820,7 +811,7 @@ private Map getDisableThirdPartySharingParameters() { PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(adjustConfig)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + @@ -859,7 +850,6 @@ private Map getDisableThirdPartySharingParameters() { private Map getMeasurementConsentParameters( final boolean consentMeasurement) { - ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); @@ -886,7 +876,7 @@ private Map getMeasurementConsentParameters( PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(adjustConfig)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + @@ -923,7 +913,6 @@ private Map getMeasurementConsentParameters( } private Map getAdRevenueParameters(String source, JSONObject adRevenueJson) { - ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); @@ -946,7 +935,7 @@ private Map getAdRevenueParameters(String source, JSONObject adR PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(adjustConfig)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + @@ -1009,7 +998,6 @@ private Map getAdRevenueParameters(String source, JSONObject adR } private Map getAdRevenueParameters(AdjustAdRevenue adjustAdRevenue, boolean isInDelay) { - ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); @@ -1038,7 +1026,7 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(adjustConfig)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + @@ -1106,7 +1094,6 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven } private Map getSubscriptionParameters(AdjustPlayStoreSubscription subscription, boolean isInDelay) { - ContentResolver contentResolver = adjustConfig.context.getContentResolver(); Map parameters = new HashMap(); Map imeiParameters = Util.getImeiParameters(adjustConfig, logger); @@ -1129,7 +1116,7 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio PackageBuilder.addString(parameters, "gps_adid_src", deviceInfo.playAdIdSource); PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); PackageBuilder.addString(parameters, "fire_adid", Util.getFireAdvertisingId(adjustConfig)); - PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(contentResolver)); + PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", Util.getFireTrackingEnabled(adjustConfig)); if (!containsPlayIds(parameters) && !containsFireIds(parameters)) { logger.warn("Google Advertising ID or Fire Advertising ID not detected, " + @@ -1336,7 +1323,11 @@ private void checkDeviceIds(Map parameters) { && !parameters.containsKey("imeis") && !parameters.containsKey("meids") && !parameters.containsKey("device_ids")) { - logger.error("Missing device id's. Please check if Proguard is correctly set with Adjust SDK"); + if (Util.isCoppaEnabled(adjustConfig)) { + logger.info("Missing device id's. Coppa enabled."); + } else { + logger.error("Missing device id's. 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 b9d191d64..8460508d0 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 @@ -833,6 +833,14 @@ public static String getFireAdvertisingId(final AdjustConfig adjustConfig) { return getFireAdvertisingId(adjustConfig.context.getContentResolver()); } + public static Boolean getFireTrackingEnabled(final AdjustConfig adjustConfig) { + if (isCoppaEnabled(adjustConfig)) { + return null; + } + + return getFireTrackingEnabled(adjustConfig.context.getContentResolver()); + } + private static boolean isEqualGoogleReferrerDetails(final ReferrerDetails referrerDetails, final ActivityState activityState) { return referrerDetails.referrerClickTimestampSeconds == activityState.clickTime From c4a8bbee79750185784c7df61ee85c9e0120e58f Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 25 Mar 2022 14:00:38 +0100 Subject: [PATCH 12/31] feat: update resetting of third party sharing coppa flag --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 5 ++--- 1 file changed, 2 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 08478cf5b..8c0659ef9 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 @@ -2271,6 +2271,8 @@ private void trackThirdPartySharingI(final AdjustThirdPartySharing adjustThirdPa return; } + resetThirdPartySharingCoppaActivityStateI(); + long now = System.currentTimeMillis(); PackageBuilder packageBuilder = new PackageBuilder( adjustConfig, deviceInfo, activityState, sessionParameters, now); @@ -2598,14 +2600,11 @@ private void checkForInstallReferrerInfo(final SdkClickResponseData responseData private void processCoppaComplianceI() { if (adjustConfig.coppaCompliantEnabled == null) { - resetThirdPartySharingCoppaActivityStateI(); return; } if (adjustConfig.coppaCompliantEnabled) { disableThirdPartySharingForCoppaEnabledI(); - } else { - resetThirdPartySharingCoppaActivityStateI(); } } From 8ecfc257dfb0374ef6b02d0735afc6ec300666d8 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Fri, 25 Mar 2022 16:25:10 +0100 Subject: [PATCH 13/31] feat: update revert to reset third party sharing coppa flag during init --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 5 +++-- 1 file changed, 3 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 8c0659ef9..08478cf5b 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 @@ -2271,8 +2271,6 @@ private void trackThirdPartySharingI(final AdjustThirdPartySharing adjustThirdPa return; } - resetThirdPartySharingCoppaActivityStateI(); - long now = System.currentTimeMillis(); PackageBuilder packageBuilder = new PackageBuilder( adjustConfig, deviceInfo, activityState, sessionParameters, now); @@ -2600,11 +2598,14 @@ private void checkForInstallReferrerInfo(final SdkClickResponseData responseData private void processCoppaComplianceI() { if (adjustConfig.coppaCompliantEnabled == null) { + resetThirdPartySharingCoppaActivityStateI(); return; } if (adjustConfig.coppaCompliantEnabled) { disableThirdPartySharingForCoppaEnabledI(); + } else { + resetThirdPartySharingCoppaActivityStateI(); } } From 9e2d80aec159aaeb0bb952f3b5b1460c33c70d31 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 28 Mar 2022 10:30:11 +0200 Subject: [PATCH 14/31] refac: coppa tps persist state to boolean --- .../main/java/com/adjust/sdk/ActivityHandler.java | 14 +++++--------- .../main/java/com/adjust/sdk/ActivityState.java | 8 ++++---- 2 files changed, 9 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 08478cf5b..1ea0ca752 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 @@ -2602,11 +2602,12 @@ private void processCoppaComplianceI() { return; } - if (adjustConfig.coppaCompliantEnabled) { - disableThirdPartySharingForCoppaEnabledI(); - } else { + if (adjustConfig.coppaCompliantEnabled == false) { resetThirdPartySharingCoppaActivityStateI(); + return; } + + disableThirdPartySharingForCoppaEnabledI(); } private void disableThirdPartySharingForCoppaEnabledI() { @@ -2636,8 +2637,7 @@ private void disableThirdPartySharingForCoppaEnabledI() { private void resetThirdPartySharingCoppaActivityStateI() { if (activityState == null) { return; } - if (activityState.isThirdPartySharingDisabledForCoppa != null && - activityState.isThirdPartySharingDisabledForCoppa) { + if (activityState.isThirdPartySharingDisabledForCoppa) { activityState.isThirdPartySharingDisabledForCoppa = false; writeActivityStateI(); } @@ -2656,10 +2656,6 @@ private boolean shouldDisableThirdPartySharingWhenCoppaEnabled() { return false; } - if (activityState.isThirdPartySharingDisabledForCoppa == null) { - return true; - } - 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 617c07839..df638be45 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 @@ -50,7 +50,7 @@ public class ActivityState implements Serializable, Cloneable { new ObjectStreamField("installBeginHuawei", long.class), new ObjectStreamField("installReferrerHuawei", String.class), new ObjectStreamField("installReferrerHuaweiAppGallery", String.class), - new ObjectStreamField("isThirdPartySharingDisabledForCoppa", Boolean.class), + new ObjectStreamField("isThirdPartySharingDisabledForCoppa", boolean.class), }; // persistent data @@ -58,7 +58,7 @@ public class ActivityState implements Serializable, Cloneable { protected boolean enabled; protected boolean isGdprForgotten; protected boolean isThirdPartySharingDisabled; - protected Boolean isThirdPartySharingDisabledForCoppa; + protected boolean isThirdPartySharingDisabledForCoppa; protected boolean askingAttribution; // global counters @@ -100,7 +100,7 @@ protected ActivityState() { enabled = true; isGdprForgotten = false; isThirdPartySharingDisabled = false; - isThirdPartySharingDisabledForCoppa = null; + isThirdPartySharingDisabledForCoppa = false; askingAttribution = false; eventCount = 0; // no events yet sessionCount = 0; // the first session just started @@ -246,7 +246,7 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo enabled = Util.readBooleanField(fields, "enabled", true); isGdprForgotten = Util.readBooleanField(fields, "isGdprForgotten", false); isThirdPartySharingDisabled = Util.readBooleanField(fields, "isThirdPartySharingDisabled", false); - isThirdPartySharingDisabledForCoppa = Util.readObjectField(fields, "isThirdPartySharingDisabledForCoppa", null); + isThirdPartySharingDisabledForCoppa = Util.readBooleanField(fields, "isThirdPartySharingDisabledForCoppa", false); askingAttribution = Util.readBooleanField(fields, "askingAttribution", false); updatePackages = Util.readBooleanField(fields, "updatePackages", false); From 6c9ccf3c0fc7df7569204d1b0fb338a2b63c4e5d Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 29 Mar 2022 14:20:37 +0200 Subject: [PATCH 15/31] fix: Send ff_ flags only when positive --- .../java/com/adjust/sdk/PackageBuilder.java | 55 +++++++++++-------- 1 file changed, 31 insertions(+), 24 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 546d4302e..0336f4fc7 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 @@ -338,8 +338,8 @@ private Map getSessionParameters(boolean isInDelay) { PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); - PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -428,8 +428,8 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); - PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -481,8 +481,8 @@ private Map getInfoParameters(String source) { PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); PackageBuilder.addString(parameters, "source", source); - PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -589,8 +589,8 @@ private Map getClickParameters(String source) { PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); PackageBuilder.addString(parameters, "payload", preinstallPayload); PackageBuilder.addString(parameters, "found_location", preinstallLocation); - PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -650,8 +650,8 @@ private Map getAttributionParameters(String initiatedBy) { PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); - PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -710,8 +710,8 @@ private Map getGdprParameters() { PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); - PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -770,8 +770,8 @@ private Map getDisableThirdPartySharingParameters() { PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); - PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -840,8 +840,8 @@ private Map getDisableThirdPartySharingParameters() { PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); - PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -905,8 +905,8 @@ private Map getMeasurementConsentParameters( PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); - PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -990,8 +990,8 @@ private Map getAdRevenueParameters(String source, JSONObject adR PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); - PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -1086,8 +1086,8 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); - PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -1185,8 +1185,8 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio PackageBuilder.addLong(parameters, "revenue", subscription.getPrice()); PackageBuilder.addDateInMilliseconds(parameters, "transaction_date", subscription.getPurchaseTime()); PackageBuilder.addString(parameters, "transaction_id", subscription.getOrderId()); - PackageBuilder.addBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); + PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); checkDeviceIds(parameters); return parameters; @@ -1213,6 +1213,13 @@ public static void addBoolean(Map parameters, String key, Boolea PackageBuilder.addLong(parameters, key, intValue); } + public static void addPositiveBoolean(Map parameters, String key, Boolean value) { + if (value == null || value == false) { + return; + } + PackageBuilder.addLong(parameters, key, 1); + } + static void addJsonObject(Map parameters, String key, JSONObject jsonObject) { if (jsonObject == null) { return; From 63b037fbb04030e8ba19190d5205d2e7ef07cb55 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 30 Mar 2022 10:14:25 +0200 Subject: [PATCH 16/31] refac: update precise logging and variable type --- .../java/com/adjust/sdk/ActivityHandler.java | 35 +++++++++++-------- .../java/com/adjust/sdk/AdjustConfig.java | 4 +-- .../java/com/adjust/sdk/PackageBuilder.java | 6 ++-- .../src/main/java/com/adjust/sdk/Util.java | 30 +++++----------- 4 files changed, 34 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 1ea0ca752..c53187401 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 @@ -790,17 +790,29 @@ public void run(ActivityHandler activityHandler) { deviceInfo.reloadPlayIds(adjustConfig); if (deviceInfo.playAdId == null) { - if (Util.canReadPlayIds(adjustConfig)) { - logger.warn("Unable to get Google Play Services Advertising ID at start time"); + if (!Util.canReadPlayIds(adjustConfig)) { + if (adjustConfig.coppaCompliantEnabled) { + logger.info("Cannot read Google Play Services Advertising ID with COPPA enabled"); + } + + if (adjustConfig.playStoreKidsAppEnabled) { + logger.info("Cannot read Google Play Services Advertising ID with play store kids app enabled"); + } } else { - logger.info("Cannot read Google Play Services Advertising ID for kids"); + logger.warn("Unable to get Google Play Services Advertising ID at start time"); } if (deviceInfo.androidId == null) { - if (Util.canReadNonPlayIds(adjustConfig)) { - logger.error("Unable to get any device id's. Please check if Proguard is correctly set with Adjust SDK"); + if (!Util.canReadNonPlayIds(adjustConfig)) { + if (adjustConfig.coppaCompliantEnabled) { + logger.info("Cannot read non Play IDs with COPPA enabled"); + } + + if (adjustConfig.playStoreKidsAppEnabled) { + logger.info("Cannot read non Play IDs with play store kids app enabled"); + } } else { - logger.info("Cannot read non Play Ids for kids"); + logger.error("Unable to get any Device IDs. Please check if Proguard is correctly set with Adjust SDK"); } } } else { @@ -2266,8 +2278,8 @@ private void trackThirdPartySharingI(final AdjustThirdPartySharing adjustThirdPa } if (!isEnabledI()) { return; } if (activityState.isGdprForgotten) { return; } - if (adjustConfig.coppaCompliantEnabled != null && adjustConfig.coppaCompliantEnabled) { - // block calling third party sharing API when COPPA enabled + if (adjustConfig.coppaCompliantEnabled) { + logger.warn("Calling third party sharing API not allowed when COPPA enabled"); return; } @@ -2597,12 +2609,7 @@ private void checkForInstallReferrerInfo(final SdkClickResponseData responseData } private void processCoppaComplianceI() { - if (adjustConfig.coppaCompliantEnabled == null) { - resetThirdPartySharingCoppaActivityStateI(); - return; - } - - if (adjustConfig.coppaCompliantEnabled == false) { + if (!adjustConfig.coppaCompliantEnabled) { resetThirdPartySharingCoppaActivityStateI(); 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 21e7a62de..89d1d0802 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,8 +41,8 @@ public class AdjustConfig { Boolean needsCost; String urlStrategy; String preinstallFilePath; - Boolean playStoreKidsAppEnabled; - Boolean coppaCompliantEnabled; + boolean playStoreKidsAppEnabled; + boolean coppaCompliantEnabled; 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/PackageBuilder.java b/Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java index 0336f4fc7..bb26e6367 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 @@ -1330,10 +1330,10 @@ private void checkDeviceIds(Map parameters) { && !parameters.containsKey("imeis") && !parameters.containsKey("meids") && !parameters.containsKey("device_ids")) { - if (Util.isCoppaEnabled(adjustConfig)) { - logger.info("Missing device id's. Coppa enabled."); + if (adjustConfig.coppaCompliantEnabled) { + logger.info("Missing Device IDs. COPPA enabled."); } else { - logger.error("Missing device id's. Please check if Proguard is correctly set with Adjust SDK"); + 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 8460508d0..5c395585a 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 @@ -772,11 +772,11 @@ public static boolean isEqualReferrerDetails(final ReferrerDetails referrerDetai } public static boolean canReadPlayIds(final AdjustConfig adjustConfig) { - if (isPlayStoreKidsAppEnabled(adjustConfig)) { + if (adjustConfig.playStoreKidsAppEnabled) { return false; } - if (isCoppaEnabled(adjustConfig)) { + if (adjustConfig.coppaCompliantEnabled) { return false; } @@ -784,33 +784,19 @@ public static boolean canReadPlayIds(final AdjustConfig adjustConfig) { } public static boolean canReadNonPlayIds(final AdjustConfig adjustConfig) { - if (isPlayStoreKidsAppEnabled(adjustConfig)) { + if (adjustConfig.playStoreKidsAppEnabled) { return false; } - if (isCoppaEnabled(adjustConfig)) { + if (adjustConfig.coppaCompliantEnabled) { return false; } return true; } - public static boolean isCoppaEnabled(final AdjustConfig adjustConfig) { - if (adjustConfig.coppaCompliantEnabled != null && adjustConfig.coppaCompliantEnabled) { - return true; - } - return false; - } - - public static boolean isPlayStoreKidsAppEnabled(final AdjustConfig adjustConfig) { - if (adjustConfig.playStoreKidsAppEnabled != null && adjustConfig.playStoreKidsAppEnabled) { - return true; - } - return false; - } - public static Map getImeiParameters(final AdjustConfig adjustConfig, ILogger logger) { - if (isCoppaEnabled(adjustConfig)) { + if (adjustConfig.coppaCompliantEnabled) { return null; } @@ -818,7 +804,7 @@ public static Map getImeiParameters(final AdjustConfig adjustCon } public static Map getOaidParameters(final AdjustConfig adjustConfig, ILogger logger) { - if (isCoppaEnabled(adjustConfig)) { + if (adjustConfig.coppaCompliantEnabled) { return null; } @@ -826,7 +812,7 @@ public static Map getOaidParameters(final AdjustConfig adjustCon } public static String getFireAdvertisingId(final AdjustConfig adjustConfig) { - if (isCoppaEnabled(adjustConfig)) { + if (adjustConfig.coppaCompliantEnabled) { return null; } @@ -834,7 +820,7 @@ public static String getFireAdvertisingId(final AdjustConfig adjustConfig) { } public static Boolean getFireTrackingEnabled(final AdjustConfig adjustConfig) { - if (isCoppaEnabled(adjustConfig)) { + if (adjustConfig.coppaCompliantEnabled) { return null; } From 96b5e9c80d189bc5946376cadf65666a22b7db07 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 30 Mar 2022 11:02:40 +0200 Subject: [PATCH 17/31] test: add commands to test coppa/playKids for webbridge --- .../src/main/assets/command_executor.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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 a905e0374..e435dfaa0 100644 --- a/Adjust/test-app-webbridge/src/main/assets/command_executor.js +++ b/Adjust/test-app-webbridge/src/main/assets/command_executor.js @@ -340,6 +340,18 @@ AdjustCommandExecutor.prototype.config = function(params) { adjustConfig.setUserAgent(userAgent); } + 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'; + adjustConfig.setPlayStoreKidsAppEnabled(playStoreKids); + } + if ('attributionCallbackSendAll' in params) { var basePath = this.basePath; adjustConfig.setAttributionCallback(function(attribution) { From cb5cc0a4c4dd5b613423e8aa5297d12b54953fba Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 30 Mar 2022 12:58:56 +0200 Subject: [PATCH 18/31] refac: feature flag params grouping --- .../java/com/adjust/sdk/PackageBuilder.java | 65 ++++++++++--------- 1 file changed, 34 insertions(+), 31 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 bb26e6367..be4593401 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 @@ -338,8 +338,8 @@ private Map getSessionParameters(boolean isInDelay) { PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); - PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); return parameters; @@ -428,8 +428,8 @@ public Map getEventParameters(AdjustEvent event, boolean isInDel PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); - PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); return parameters; @@ -481,8 +481,8 @@ private Map getInfoParameters(String source) { PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); PackageBuilder.addString(parameters, "source", source); - PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); return parameters; @@ -589,8 +589,8 @@ private Map getClickParameters(String source) { PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); PackageBuilder.addString(parameters, "payload", preinstallPayload); PackageBuilder.addString(parameters, "found_location", preinstallLocation); - PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); return parameters; @@ -650,8 +650,8 @@ private Map getAttributionParameters(String initiatedBy) { PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); - PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); return parameters; @@ -710,8 +710,8 @@ private Map getGdprParameters() { PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); - PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); return parameters; @@ -770,8 +770,8 @@ private Map getDisableThirdPartySharingParameters() { PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); - PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); return parameters; @@ -840,8 +840,8 @@ private Map getDisableThirdPartySharingParameters() { PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); - PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); return parameters; @@ -905,8 +905,8 @@ private Map getMeasurementConsentParameters( PackageBuilder.addString(parameters, "package_name", deviceInfo.packageName); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); - PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); return parameters; @@ -990,8 +990,8 @@ private Map getAdRevenueParameters(String source, JSONObject adR PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); - PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); return parameters; @@ -1086,8 +1086,8 @@ private Map getAdRevenueParameters(AdjustAdRevenue adjustAdReven PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); - PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); return parameters; @@ -1185,8 +1185,8 @@ private Map getSubscriptionParameters(AdjustPlayStoreSubscriptio PackageBuilder.addLong(parameters, "revenue", subscription.getPrice()); PackageBuilder.addDateInMilliseconds(parameters, "transaction_date", subscription.getPurchaseTime()); PackageBuilder.addString(parameters, "transaction_id", subscription.getOrderId()); - PackageBuilder.addPositiveBoolean(parameters, "ff_play_store_kids_app", adjustConfig.playStoreKidsAppEnabled); - PackageBuilder.addPositiveBoolean(parameters, "ff_coppa", adjustConfig.coppaCompliantEnabled); + + injectFeatureFlagsWithParameters(parameters); checkDeviceIds(parameters); return parameters; @@ -1198,6 +1198,16 @@ private ActivityPackage getDefaultActivityPackage(ActivityKind activityKind) { return activityPackage; } + private void injectFeatureFlagsWithParameters(Map parameters) { + if (adjustConfig.coppaCompliantEnabled) { + PackageBuilder.addLong(parameters, "ff_coppa", 1); + } + + if (adjustConfig.playStoreKidsAppEnabled) { + PackageBuilder.addLong(parameters, "ff_play_store_kids_app", 1); + } + } + public static void addString(Map parameters, String key, String value) { if (TextUtils.isEmpty(value)) { return; @@ -1213,13 +1223,6 @@ public static void addBoolean(Map parameters, String key, Boolea PackageBuilder.addLong(parameters, key, intValue); } - public static void addPositiveBoolean(Map parameters, String key, Boolean value) { - if (value == null || value == false) { - return; - } - PackageBuilder.addLong(parameters, key, 1); - } - static void addJsonObject(Map parameters, String key, JSONObject jsonObject) { if (jsonObject == null) { return; From 0b9aab36f4a89ca0cbd10453db133274c3cc05b6 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 30 Mar 2022 15:23:13 +0200 Subject: [PATCH 19/31] docs: add COPPA compliance & Playstore Kids App support --- README.md | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 13a4d27d5..9a1aec6c2 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,8 @@ Read this in other languages: [English][en-readme], [中文][zh-readme], [日本 * [Enable third-party sharing](#af-enable-third-party-sharing) * [Consent measurement](#af-measurement-consent) * [[beta] Data residency](#af-data-residency) + * [COPPA compliance](#af-coppa-compliance) + * [Playstore Kids App](#af-playstore-kids-app) ### Testing and troubleshooting @@ -2222,7 +2224,73 @@ adjustConfig.setUrlStrategy(AdjustConfig.DataResidencyUS); // for US data reside -**Note:** This feature is currently in beta testing phase. If you are interested in getting access to it, please contact your dedicated account manager or write an email to support@adjust.com. Please, do not turn this setting on before making sure with the support team that this feature is enabled for your app because otherwise SDK traffic will get dropped. +### COPPA compliance + +The default behaviour of the Adjust SDK is COPPA compliance disabled. You can enable this in your config instance: + + + + + + + + + + + + + + +
+Native App SDK +
+ +```java +adjustConfig.setCoppaCompliantEnabled(true); +``` +
+Web View SDK +
+ +```js +adjustConfig.setCoppaCompliantEnabled(true); +``` +
+ +**Note:** On enabling this feature, third-party sharing gets disabled internally. But on re-enabling this feature, third-party sharing status remains unchanged. In order to re-enable third-party sharing, one needs to call third-party sharing API explicitly. + +### Playstore Kids App + +The default behaviour of the Adjust SDK is Playstore Kids App disabled. You can enable this in your config instance: + + + + + + + + + + + + + + +
+Native App SDK +
+ +```java +adjustConfig.setPlayStoreKidsAppEnabled(true); +``` +
+Web View SDK +
+ +```js +adjustConfig.setPlayStoreKidsAppEnabled(true); +``` +
## Testing and troubleshooting From 23ad33d8ee9f6d4498f2c0c2d132ebb12c8228af Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 30 Mar 2022 15:29:36 +0200 Subject: [PATCH 20/31] docs: fix reverted note section --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 9a1aec6c2..e605755c9 100644 --- a/README.md +++ b/README.md @@ -2224,6 +2224,8 @@ adjustConfig.setUrlStrategy(AdjustConfig.DataResidencyUS); // for US data reside +**Note:** This feature is currently in beta testing phase. If you are interested in getting access to it, please contact your dedicated account manager or write an email to support@adjust.com. Please, do not turn this setting on before making sure with the support team that this feature is enabled for your app because otherwise SDK traffic will get dropped. + ### COPPA compliance The default behaviour of the Adjust SDK is COPPA compliance disabled. You can enable this in your config instance: From 9dbb6459f962321e0b14ca500c88797438075baa Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 31 Mar 2022 18:03:38 +0200 Subject: [PATCH 21/31] docs: update traget API version for AD_ID permission --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e605755c9..63d7a9c73 100644 --- a/README.md +++ b/README.md @@ -149,7 +149,7 @@ The Adjust SDK requires the following permissions. Please add them to your `Andr #### Add permission to gather Google advertising ID -If you are targeting Android 12 and above (API level 31), you need to add the `com.google.android.gms.AD_ID` permission to read the device's advertising ID. Add the following line to your `AndroidManifest.xml` to enable the permission. +You will need to add the `com.google.android.gms.AD_ID` permission to read the device's advertising ID, when your apps are able to target Android 13 (API level 33) and above. Add the following line to your `AndroidManifest.xml` to enable the permission. ```xml From 2a91661242cf2ff2df6e80a9f4081ea5e4b90809 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Tue, 5 Apr 2022 17:27:22 +0200 Subject: [PATCH 22/31] fix: command execution in background thread even when mylooper is null --- 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 5c395585a..b8c7bb340 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 @@ -161,7 +161,7 @@ private static R runSyncInPlayAdIdSchedulerWithTimeout(final Context context } public static void runInBackground(Runnable command) { - if (Looper.myLooper() != Looper.getMainLooper()) { + if (Looper.myLooper() != null && Looper.myLooper() != Looper.getMainLooper()) { command.run(); return; } From 49b3b194da3dc3c9d09300d42384969c031b4509 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Wed, 6 Apr 2022 11:04:32 +0200 Subject: [PATCH 23/31] feat: block dtps when Coppa enabled --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 4 ++++ 1 file changed, 4 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 c53187401..014d7ea45 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 @@ -2250,6 +2250,10 @@ private void disableThirdPartySharingI() { 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(); From b5d4d4ac22d6f207fe580d66823f566aeef03a5f Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 7 Apr 2022 01:09:35 +0200 Subject: [PATCH 24/31] build: update Gradle from 7.1.1 to 7.1.2 --- Adjust/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 46838261c..907db9656 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -25,7 +25,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:7.1.1' + classpath 'com.android.tools.build:gradle:7.1.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files. From 70787fe5ea73f8ad9f068e2a5359052a900e9927 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 7 Apr 2022 11:13:43 +0200 Subject: [PATCH 25/31] build: update version number to 4.30.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-sociomantic/build.gradle | 2 +- Adjust/sdk-plugin-trademob/build.gradle | 2 +- Adjust/sdk-plugin-webbridge/build.gradle | 2 +- Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js | 2 +- .../androidTest/java/com/adjust/sdk/TestActivityPackage.java | 2 +- README.md | 4 ++-- VERSION | 2 +- doc/chinese/README.md | 4 ++-- doc/chinese/plugins/oaid.md | 4 ++-- doc/english/migration/migrate.md | 2 +- doc/english/plugins/oaid.md | 4 ++-- doc/japanese/README.md | 4 ++-- doc/japanese/migration/migrate.md | 2 +- doc/japanese/plugins/oaid.md | 4 ++-- doc/korean/README.md | 4 ++-- doc/korean/plugins/oaid.md | 4 ++-- 22 files changed, 30 insertions(+), 30 deletions(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 907db9656..f95128282 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -9,7 +9,7 @@ ext { coreMinSdkVersion = 9 coreCompileSdkVersion = 31 coreTargetSdkVersion = 31 - coreVersionName = '4.29.1' + coreVersionName = '4.30.0' defaultVersionCode = 1 webbridgeMinSdkVersion = 17 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 908e68f3f..13418324c 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:4.29.1"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:4.30.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 15b619f6c..32136cec8 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 @@ -29,7 +29,7 @@ public interface Constants { String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android4.29.1"; + String CLIENT_SDK = "android4.30.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 1216fe94a..b409fea2b 100644 --- a/Adjust/sdk-plugin-criteo/build.gradle +++ b/Adjust/sdk-plugin-criteo/build.gradle @@ -23,7 +23,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:4.29.1' + // implementation 'com.adjust.sdk:adjust-android:4.30.0' } task adjustCriteoAndroidAar (type: Copy) { diff --git a/Adjust/sdk-plugin-imei/build.gradle b/Adjust/sdk-plugin-imei/build.gradle index 9c73f4b6d..89b11f11b 100644 --- a/Adjust/sdk-plugin-imei/build.gradle +++ b/Adjust/sdk-plugin-imei/build.gradle @@ -22,7 +22,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:4.29.1' + // implementation 'com.adjust.sdk:adjust-android:4.30.0' } task adjustImeiAndroidAar (type: Copy) { diff --git a/Adjust/sdk-plugin-oaid/build.gradle b/Adjust/sdk-plugin-oaid/build.gradle index c383993c0..cf9beaf1a 100644 --- a/Adjust/sdk-plugin-oaid/build.gradle +++ b/Adjust/sdk-plugin-oaid/build.gradle @@ -22,7 +22,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:4.29.1' + // implementation 'com.adjust.sdk:adjust-android:4.30.0' } task adjustOaidAndroidAar (type: Copy) { diff --git a/Adjust/sdk-plugin-sociomantic/build.gradle b/Adjust/sdk-plugin-sociomantic/build.gradle index a15218870..98759d2b3 100644 --- a/Adjust/sdk-plugin-sociomantic/build.gradle +++ b/Adjust/sdk-plugin-sociomantic/build.gradle @@ -22,7 +22,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:4.29.1' + // implementation 'com.adjust.sdk:adjust-android:4.30.0' } task adjustSociomanticAndroidAar (type: Copy) { diff --git a/Adjust/sdk-plugin-trademob/build.gradle b/Adjust/sdk-plugin-trademob/build.gradle index 111b4ca04..f7d23aa8b 100644 --- a/Adjust/sdk-plugin-trademob/build.gradle +++ b/Adjust/sdk-plugin-trademob/build.gradle @@ -22,7 +22,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:4.29.1' + // implementation 'com.adjust.sdk:adjust-android:4.30.0' } task adjustTrademobAndroidAar (type: Copy) { diff --git a/Adjust/sdk-plugin-webbridge/build.gradle b/Adjust/sdk-plugin-webbridge/build.gradle index 2fb579e20..f234fe448 100644 --- a/Adjust/sdk-plugin-webbridge/build.gradle +++ b/Adjust/sdk-plugin-webbridge/build.gradle @@ -22,7 +22,7 @@ dependencies { // Add SDK via module. compileOnly project(':sdk-core') // Add SDK via Maven. - // implementation 'com.adjust.sdk:adjust-android:4.29.1' + // implementation 'com.adjust.sdk:adjust-android:4.30.0' } task adjustWebBridgeAndroidAar (type: Copy) { diff --git a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js index eecbd6c1c..bc7ba0c40 100644 --- a/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js +++ b/Adjust/sdk-plugin-webbridge/src/main/assets/adjust.js @@ -211,7 +211,7 @@ var Adjust = { if (this.adjustConfig) { return this.adjustConfig.getSdkPrefix(); } else { - return 'web-bridge4.29.1'; + return 'web-bridge4.30.0'; } }, 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 bf0aa0314..73bc50d93 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 @@ -53,7 +53,7 @@ public TestActivityPackage(ActivityPackage activityPackage) { // default values appToken = "123456789012"; environment = "sandbox"; - clientSdk = "android4.29.1"; + clientSdk = "android4.30.0"; suffix = ""; attribution = new AdjustAttribution(); playServices = true; diff --git a/README.md b/README.md index 63d7a9c73..153a847bf 100644 --- a/README.md +++ b/README.md @@ -114,14 +114,14 @@ These are the minimum required steps to integrate the Adjust SDK in your Android If you are using Maven, add the following to your `build.gradle` file: ```gradle -implementation 'com.adjust.sdk:adjust-android:4.29.1' +implementation 'com.adjust.sdk:adjust-android:4.30.0' implementation 'com.android.installreferrer:installreferrer:2.2' ``` If you would prefer to use the Adjust SDK inside web views in your app, please include this additional dependency as well: ```gradle -implementation 'com.adjust.sdk:adjust-android-webbridge:4.29.1' +implementation 'com.adjust.sdk:adjust-android-webbridge:4.30.0' ``` **Note**: The minimum supported Android API level for the web view extension is 17 (Jelly Bean). diff --git a/VERSION b/VERSION index 2ff15b2a2..598ce0d49 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.29.1 +4.30.0 diff --git a/doc/chinese/README.md b/doc/chinese/README.md index c5960f266..d47760320 100644 --- a/doc/chinese/README.md +++ b/doc/chinese/README.md @@ -112,14 +112,14 @@ 如果您使用的是 Maven,请添加下行到您的 `build.gradle` 文件: ```gradle -implementation 'com.adjust.sdk:adjust-android:4.29.1' +implementation 'com.adjust.sdk:adjust-android:4.30.0' implementation 'com.android.installreferrer:installreferrer:2.2' ``` 如果您想在应用 web view 中使用 Adjust SDK,请也添加下列附加依赖项: ```gradle -implementation 'com.adjust.sdk:adjust-android-webbridge:4.29.1' +implementation 'com.adjust.sdk:adjust-android-webbridge:4.30.0' ``` **请注意:** web view 扩展支持的最低安卓 API 级别为 17 (Jelly Bean)。 diff --git a/doc/chinese/plugins/oaid.md b/doc/chinese/plugins/oaid.md index 481f163de..fd9d5d0e2 100644 --- a/doc/chinese/plugins/oaid.md +++ b/doc/chinese/plugins/oaid.md @@ -13,8 +13,8 @@ OAID 是由移动安全联盟 (MSA) 推出的广告 ID。所有中国国内的 如果您使用的是 Maven,请将以下 OAID 插件依赖项添加到现有 Adjust SDK 依赖项旁的 `build.gradle` 文件: ``` -implementation 'com.adjust.sdk:adjust-android:4.29.1' -implementation 'com.adjust.sdk:adjust-android-oaid:4.29.1' +implementation 'com.adjust.sdk:adjust-android:4.30.0' +implementation 'com.adjust.sdk:adjust-android-oaid:4.30.0' ``` 您还可以将 Adjust OAID 插件作为 JAR 文件进行添加,该文件可从我们的 [版本页面][releases] 下载。 diff --git a/doc/english/migration/migrate.md b/doc/english/migration/migrate.md index ddf7f7b22..51cae6135 100644 --- a/doc/english/migration/migrate.md +++ b/doc/english/migration/migrate.md @@ -1,4 +1,4 @@ -## Migrate your Adjust SDK for Android to 4.29.1 from 3.6.2 +## Migrate your Adjust SDK for Android to 4.30.0 from 3.6.2 ### The Application class diff --git a/doc/english/plugins/oaid.md b/doc/english/plugins/oaid.md index e4dba33c8..8547cbc76 100644 --- a/doc/english/plugins/oaid.md +++ b/doc/english/plugins/oaid.md @@ -12,8 +12,8 @@ To enable the Adjust SDK to collect and track OAID, follow these steps. To only If you are using Maven, add the following OAID plugin dependency to your `build.gradle` file next to the existing Adjust SDK dependency: ``` -implementation 'com.adjust.sdk:adjust-android:4.29.1' -implementation 'com.adjust.sdk:adjust-android-oaid:4.29.1' +implementation 'com.adjust.sdk:adjust-android:4.30.0' +implementation 'com.adjust.sdk:adjust-android-oaid:4.30.0' ``` You can also add the Adjust OAID plugin as JAR file, which you can download from our [releases page][releases]. diff --git a/doc/japanese/README.md b/doc/japanese/README.md index 0e3492cd2..d3b17be46 100644 --- a/doc/japanese/README.md +++ b/doc/japanese/README.md @@ -111,14 +111,14 @@ Adjust SDKをAndroidプロジェクトに実装する手順を説明します。 Mavenを使用している場合は、以下の内容を`build.gradle`ファイルに追加します。file: ```gradle -implementation 'com.adjust.sdk:adjust-android:4.29.1' +implementation 'com.adjust.sdk:adjust-android:4.30.0' implementation 'com.android.installreferrer:installreferrer:2.2' ``` アプリの WebView内でAdjust SDKを使用したい場合は、以下のdependencyを追加してください。 ```gradle -implementation 'com.adjust.sdk:adjust-android-webbridge:4.29.1' +implementation 'com.adjust.sdk:adjust-android-webbridge:4.30.0' ``` **注意**:WebView拡張機能用にサポートされている最小のAndroid APIレベルは17(Jelly Bean)です。 diff --git a/doc/japanese/migration/migrate.md b/doc/japanese/migration/migrate.md index 018faa7af..7e67f699a 100644 --- a/doc/japanese/migration/migrate.md +++ b/doc/japanese/migration/migrate.md @@ -1,4 +1,4 @@ -## Android用adjust SDKのv3.6.2からv4.29.1への移行 +## Android用adjust SDKのv3.6.2からv4.30.0への移行 ### アプリケーションクラス diff --git a/doc/japanese/plugins/oaid.md b/doc/japanese/plugins/oaid.md index 145a6cfe6..d20ea0adb 100644 --- a/doc/japanese/plugins/oaid.md +++ b/doc/japanese/plugins/oaid.md @@ -13,8 +13,8 @@ Adjust SDKがOAID値を収集し計測するための設定手順は、以下の Mavenを使用している場合は、以下のOAIDプラグイン dependencyを、既存のAdjust SDKのdependencyの隣にあるbuild.gradle` file に追加します: ``` -implementation 'com.adjust.sdk:adjust-android:4.29.1' -implementation 'com.adjust.sdk:adjust-android-oaid:4.29.1' +implementation 'com.adjust.sdk:adjust-android:4.30.0' +implementation 'com.adjust.sdk:adjust-android-oaid:4.30.0' ``` Adjust OAIDプラグインを JARファイルとして追加することもできます。JARファイルは、[releases page][releases] からダウンロードすることができます。 diff --git a/doc/korean/README.md b/doc/korean/README.md index eb06b533c..5f6a01678 100644 --- a/doc/korean/README.md +++ b/doc/korean/README.md @@ -114,14 +114,14 @@ Adjust™의 Android SDK에 관한 문서입니다. Adjust™에 대한 자세 Maven을 사용하는 경우, 다음을 `build.gradle` 파일에 추가하시기 바랍니다. ```gradle -implementation 'com.adjust.sdk:adjust-android:4.29.1' +implementation 'com.adjust.sdk:adjust-android:4.30.0' implementation 'com.android.installreferrer:installreferrer:2.2' ``` 앱의 웹뷰 안에서 Adjust SDK를 사용하고자 하는 경우, 다음의 추가적인 dependency를 추가하시기 바랍니다. ```gradle -implementation 'com.adjust.sdk:adjust-android-webbridge:4.29.1' +implementation 'com.adjust.sdk:adjust-android-webbridge:4.30.0' ``` **참고**: 웹뷰 확장에 필요한 Android API의 최소 지원 레벨은 17(Jelley Bean)입니다. diff --git a/doc/korean/plugins/oaid.md b/doc/korean/plugins/oaid.md index 003b714a5..a00a6480f 100644 --- a/doc/korean/plugins/oaid.md +++ b/doc/korean/plugins/oaid.md @@ -14,8 +14,8 @@ Adjust SDK가 OAID를 수집하고 트래킹할 수 있게 하기 위해서는 Maven을 사용하고 있는 경우, 기존 Adjust SDK dependency 옆에 있는 `build.gradle` 파일에 다음의 OAID plugin dependency을 추가하세요. ``` -implementation 'com.adjust.sdk:adjust-android:4.29.1' -implementation 'com.adjust.sdk:adjust-android-oaid:4.29.1' +implementation 'com.adjust.sdk:adjust-android:4.30.0' +implementation 'com.adjust.sdk:adjust-android-oaid:4.30.0' ``` Adjust OAID 플러그인을 JAR 파일로 추가할 수도 있습니다. Adjust [릴리스 페이지][releases]에서 다운로드하세요. From 413b96bfd1e72d7b7fc20291f95a9181866aec70 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Thu, 7 Apr 2022 11:18:44 +0200 Subject: [PATCH 26/31] docs: update CHANGELOG.md --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3aa663a29..338166fbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +### Version 4.30.0 (7th April 2022) +#### Added +- Added COPPA compliant support. You can choose this setting by calling `setCoppaCompliantEnabled` method of `AdjustConfig` instance with boolean parameter to enable or disable it. +- Added Playstore Kids App support. You can choose this setting by calling `setPlayStoreKidsAppEnabled` method of `AdjustConfig` instance with boolean parameter to enable or disable it. + +#### Changed +- Removed reading of `network_type` parameter. +- Updated docs. + +--- + ### Version 4.29.1 (8th February 2022) #### Added - Added support for `Helium Chartboost` ad revenue tracking. From ead69565fda278402d864efa0466ed071994e579 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 7 Apr 2022 22:43:38 +0200 Subject: [PATCH 27/31] docs: reword v4.30.0 CHANGELOG entries --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 338166fbb..7da91e339 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ ### Version 4.30.0 (7th April 2022) #### Added -- Added COPPA compliant support. You can choose this setting by calling `setCoppaCompliantEnabled` method of `AdjustConfig` instance with boolean parameter to enable or disable it. -- Added Playstore Kids App support. You can choose this setting by calling `setPlayStoreKidsAppEnabled` method of `AdjustConfig` instance with boolean parameter to enable or disable it. +- Added ability to mark your app as COPPA compliant. You can enable this setting by calling `setCoppaCompliantEnabled` method of `AdjustConfig` instance with boolean parameter `true`. +- Added ability to mark your app as app for the kids in accordance to Google Play Families policies. You can enable this setting by calling `setPlayStoreKidsAppEnabled` method of `AdjustConfig` instance with boolean parameter `true`. #### Changed - Removed reading of `network_type` parameter. From aceb39caa3f6f2fc6f55c78b318894f785dfa634 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 7 Apr 2022 22:44:00 +0200 Subject: [PATCH 28/31] docs: reword v4.30.0 README chapters --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 153a847bf..57c7a5921 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ Read this in other languages: [English][en-readme], [中文][zh-readme], [日本 * [Consent measurement](#af-measurement-consent) * [[beta] Data residency](#af-data-residency) * [COPPA compliance](#af-coppa-compliance) - * [Playstore Kids App](#af-playstore-kids-app) + * [Play Store Kids Apps](#af-play-store-kids-apps) ### Testing and troubleshooting @@ -2228,7 +2228,7 @@ adjustConfig.setUrlStrategy(AdjustConfig.DataResidencyUS); // for US data reside ### COPPA compliance -The default behaviour of the Adjust SDK is COPPA compliance disabled. You can enable this in your config instance: +By deafult Adjust SDK doesn't mark app as COPPA compliant. In order to mark your app as COPPA compliant, make sure to call `setCoppaCompliantEnabled` method of `AdjustConfig` instance with boolean parameter `true`: @@ -2259,11 +2259,11 @@ adjustConfig.setCoppaCompliantEnabled(true);
-**Note:** On enabling this feature, third-party sharing gets disabled internally. But on re-enabling this feature, third-party sharing status remains unchanged. In order to re-enable third-party sharing, one needs to call third-party sharing API explicitly. +**Note:** By enabling this feature, third-party sharing will be automatically disabled for the users. If later during the app lifetime you decide not to mark app as COPPA compliant anymore, third-party sharing **will not be automatically re-enabled**. Instead, next to not marking your app as COPPA compliant anymore, you will need to explicitly re-enable third-party sharing in case you want to do that. -### Playstore Kids App +### Play Store Kids Apps -The default behaviour of the Adjust SDK is Playstore Kids App disabled. You can enable this in your config instance: +By default Adjust SDK doesn't mark app as Play Store Kids App. In order to mark your app as the app which is targetting kids in Play Store, make sure to call `setPlayStoreKidsAppEnabled` method of `AdjustConfig` instance with boolean parameter `true`: From 0b8282b433dc0e845439f16b100085b43a16e214 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 8 Apr 2022 21:16:53 +0200 Subject: [PATCH 29/31] build: update Gradle from 7.1.2 to 7.1.3 --- Adjust/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index f95128282..af09ef718 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -25,7 +25,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:7.1.2' + classpath 'com.android.tools.build:gradle:7.1.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files. From 322993e10f7d64168b6114a57f3c76221b3cecbf Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 11 Apr 2022 10:25:16 +0200 Subject: [PATCH 30/31] fix: revert to keep SP writing in sync --- 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 b8c7bb340..5c395585a 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 @@ -161,7 +161,7 @@ private static R runSyncInPlayAdIdSchedulerWithTimeout(final Context context } public static void runInBackground(Runnable command) { - if (Looper.myLooper() != null && Looper.myLooper() != Looper.getMainLooper()) { + if (Looper.myLooper() != Looper.getMainLooper()) { command.run(); return; } From 4069de1fa18a25aed051ba81ef1d35e4f8624202 Mon Sep 17 00:00:00 2001 From: Shashank Suhane Date: Mon, 11 Apr 2022 10:27:15 +0200 Subject: [PATCH 31/31] docs: update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7da91e339..697444e92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### Version 4.30.0 (7th April 2022) +### Version 4.30.0 (11th April 2022) #### Added - Added ability to mark your app as COPPA compliant. You can enable this setting by calling `setCoppaCompliantEnabled` method of `AdjustConfig` instance with boolean parameter `true`. - Added ability to mark your app as app for the kids in accordance to Google Play Families policies. You can enable this setting by calling `setPlayStoreKidsAppEnabled` method of `AdjustConfig` instance with boolean parameter `true`.