From de6803732f3968c6cc698b6703173691939456ee Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 19 Mar 2018 15:37:02 +0100 Subject: [PATCH 01/31] Initialise install referrer before pre launch actions --- .../adjust/src/main/java/com/adjust/sdk/ActivityHandler.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java index a93c13430..eedb4647e 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -780,10 +780,8 @@ public void run() { updatePackagesI(); } - preLaunchActionsI(adjustConfig.preLaunchActionsArray); - installReferrer = new InstallReferrer(adjustConfig.context, this); - + preLaunchActionsI(adjustConfig.preLaunchActionsArray); sendReftagReferrerI(); } From 8d2c8a85779ad1927a75a2f175983bcc623783c7 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 28 Mar 2018 16:29:58 +0200 Subject: [PATCH 02/31] Add initiated by --- .../src/main/java/com/adjust/sdk/AttributionHandler.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/AttributionHandler.java b/Adjust/adjust/src/main/java/com/adjust/sdk/AttributionHandler.java index a99ce2dae..fbb20e30d 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AttributionHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AttributionHandler.java @@ -74,7 +74,7 @@ public void getAttribution() { scheduledExecutor.submit(new Runnable() { @Override public void run() { - getAttributionI(0); + getAttributionI(0, true); } }); } @@ -141,7 +141,7 @@ public void run() { }); } - private void getAttributionI(long delayInMilliseconds) { + private void getAttributionI(long delayInMilliseconds, boolean isInitiatedBySdk) { // don't reset if new time is shorter than last one if (timer.getFireIn() > delayInMilliseconds) { return; @@ -154,6 +154,9 @@ private void getAttributionI(long delayInMilliseconds) { logger.debug("Waiting to query attribution in %s seconds", secondsString); } + String initiatedBy = isInitiatedBySdk ? "sdk" : "backend"; + attributionPackage.getParameters().put("initiated_by", initiatedBy); + // set the new time the timer will fire in timer.startIn(delayInMilliseconds); } @@ -168,7 +171,7 @@ private void checkAttributionI(IActivityHandler activityHandler, ResponseData re if (timerMilliseconds >= 0) { activityHandler.setAskingAttribution(true); - getAttributionI(timerMilliseconds); + getAttributionI(timerMilliseconds, false); return; } From 66fde8672169d4334d06b148c4d05359fc47f1a6 Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 4 Apr 2018 14:12:37 +0200 Subject: [PATCH 03/31] Add VERSION variable --- Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java index 7c37d83d3..b7ea3e2f8 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java @@ -18,7 +18,8 @@ * See the README for details. */ public class Adjust { - + @SuppressWarnings("unused") + final String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:4.12.4"; private static AdjustInstance defaultInstance; private Adjust() { From 1d52ee52e426f3cb56ec359fd22bf52bdebd88ed Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 4 Apr 2018 19:43:29 +0200 Subject: [PATCH 04/31] Move VERSION variable to getDefaultInstance method --- Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java index b7ea3e2f8..d2c4c3e86 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java @@ -18,14 +18,15 @@ * See the README for details. */ public class Adjust { - @SuppressWarnings("unused") - final String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:4.12.4"; private static AdjustInstance defaultInstance; private Adjust() { } public static synchronized AdjustInstance getDefaultInstance() { + @SuppressWarnings("unused") + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:4.12.4"; + if (defaultInstance == null) { defaultInstance = new AdjustInstance(); } From c2e25367e6aac7e376bcbf732d7e3434d907b4b3 Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 12 Apr 2018 11:23:21 +0200 Subject: [PATCH 05/31] Change order of state enable change --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java index eedb4647e..790eada1a 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1222,6 +1222,9 @@ private void setEnabledI(boolean enabled) { return; } + activityState.enabled = enabled; + writeActivityStateI(); + if (enabled) { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext()); @@ -1233,9 +1236,6 @@ private void setEnabledI(boolean enabled) { checkAfterNewStartI(sharedPreferencesManager); } - activityState.enabled = enabled; - writeActivityStateI(); - updateStatusI(!enabled, "Pausing handlers due to SDK being disabled", "Handlers remain paused", From 64e9ba5bcda5694fbf268d417b4779657c0de71e Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 20 Apr 2018 13:43:56 +0200 Subject: [PATCH 06/31] Adding TrackingState enumeration --- .../main/java/com/adjust/sdk/TrackingState.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 Adjust/adjust/src/main/java/com/adjust/sdk/TrackingState.java diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/TrackingState.java b/Adjust/adjust/src/main/java/com/adjust/sdk/TrackingState.java new file mode 100644 index 000000000..f7c858b23 --- /dev/null +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/TrackingState.java @@ -0,0 +1,15 @@ +package com.adjust.sdk; + +public enum TrackingState { + OPTED_OUT(1); + + private int value; + + TrackingState(int value) { + this.value = value; + } + + public int getValue() { + return this.value; + } +} From 65581aecd9862db9829f45b6c6123627c58ff75b Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 20 Apr 2018 13:44:42 +0200 Subject: [PATCH 07/31] Adding methods for GDPR forget me choice caching --- .../com/adjust/sdk/SharedPreferencesManager.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java index 51063bd42..5d72367b0 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -34,6 +34,8 @@ public class SharedPreferencesManager { */ private static final String PREFS_KEY_INSTALL_TRACKED = "install_tracked"; + private static final String PREFS_KEY_GDPR_FORGET_ME = "gdpr_forget_me"; + /** * Index for raw referrer string content in saved JSONArray object. */ @@ -295,6 +297,18 @@ public synchronized boolean getInstallTracked() { return getBoolean(PREFS_KEY_INSTALL_TRACKED, false); } + public synchronized void setGdprForgetMe() { + saveBoolean(PREFS_KEY_GDPR_FORGET_ME, true); + } + + public synchronized boolean getGdprForgetMe() { + return getBoolean(PREFS_KEY_GDPR_FORGET_ME, false); + } + + public synchronized void removeGdprForgetMe() { + remove(PREFS_KEY_GDPR_FORGET_ME); + } + /** * Remove all key-value pairs from shared preferences. */ From 445ee3bfe0e4fa216b8884945fc11d7c64f67a72 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 20 Apr 2018 13:45:27 +0200 Subject: [PATCH 08/31] Adding GDPR endpoint --- Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java index 6e544f7ec..6241cdf1f 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java @@ -27,6 +27,7 @@ public interface Constants { int MAX_WAIT_INTERVAL = Constants.ONE_MINUTE; String BASE_URL = "https://app.adjust.com"; + String GDPR_URL = "https://gdpr.adjust.com"; String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; String CLIENT_SDK = "android4.12.4"; From 34e10c7cca9a652b56a15ffa39191d137c9a8400 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 20 Apr 2018 13:46:04 +0200 Subject: [PATCH 09/31] Extending interfaces for GDPR forget me feature --- .../src/main/java/com/adjust/sdk/IActivityHandler.java | 6 ++++++ .../src/main/java/com/adjust/sdk/IPackageHandler.java | 4 ++++ .../src/main/java/com/adjust/sdk/IRequestHandler.java | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/IActivityHandler.java b/Adjust/adjust/src/main/java/com/adjust/sdk/IActivityHandler.java index ce227bf4d..c704503b4 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -59,6 +59,10 @@ public interface IActivityHandler { void setPushToken(String token, boolean preSaved); + void gdprForgetMe(); + + void gotOptOutResponse(); + Context getContext(); String getAdid(); @@ -74,4 +78,6 @@ public interface IActivityHandler { SessionParameters getSessionParameters(); String getBasePath(); + + String getGdprPath(); } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/IPackageHandler.java b/Adjust/adjust/src/main/java/com/adjust/sdk/IPackageHandler.java index ab186b239..81d7121b6 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/IPackageHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/IPackageHandler.java @@ -19,7 +19,11 @@ public interface IPackageHandler { void updatePackages(SessionParameters sessionParameters); + void flush(); + String getBasePath(); + String getGdprPath(); + void teardown(); } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/IRequestHandler.java b/Adjust/adjust/src/main/java/com/adjust/sdk/IRequestHandler.java index 771cf36a6..f59321187 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/IRequestHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/IRequestHandler.java @@ -1,7 +1,7 @@ package com.adjust.sdk; public interface IRequestHandler { - void init(IPackageHandler packageHandler); + void init(IActivityHandler activityHandler, IPackageHandler packageHandler); void sendPackage(ActivityPackage activityPackage, int queueSize); From ffb0655bed4bdf80d41a71fea57e6549f8bc3501 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 20 Apr 2018 13:46:29 +0200 Subject: [PATCH 10/31] Add new GDPR activity kind --- .../adjust/src/main/java/com/adjust/sdk/ActivityKind.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityKind.java b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityKind.java index a6ecce4b4..6bcca2bac 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityKind.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityKind.java @@ -1,7 +1,7 @@ package com.adjust.sdk; public enum ActivityKind { - UNKNOWN, SESSION, EVENT, CLICK, ATTRIBUTION, REVENUE, REATTRIBUTION, INFO; + UNKNOWN, SESSION, EVENT, CLICK, ATTRIBUTION, REVENUE, REATTRIBUTION, INFO, GDPR; public static ActivityKind fromString(String string) { if ("session".equals(string)) { @@ -14,6 +14,8 @@ public static ActivityKind fromString(String string) { return ATTRIBUTION; } else if ("info".equals(string)) { return INFO; + } else if ("gdpr".equals(string)) { + return GDPR; } else { return UNKNOWN; } @@ -32,6 +34,8 @@ public String toString() { return "attribution"; case INFO: return "info"; + case GDPR: + return "gdpr"; default: return "unknown"; } From 3a1f72e0cb986d51ee355cd8a6398c8fc4c12a4e Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 20 Apr 2018 13:52:34 +0200 Subject: [PATCH 11/31] Save isGdprForgotten in activity state --- .../adjust/src/main/java/com/adjust/sdk/ActivityState.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityState.java b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityState.java index d80d1a4da..b816df043 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityState.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityState.java @@ -26,6 +26,7 @@ public class ActivityState implements Serializable, Cloneable { private static final ObjectStreamField[] serialPersistentFields = { new ObjectStreamField("uuid", String.class), new ObjectStreamField("enabled", boolean.class), + new ObjectStreamField("isGdprForgotten", boolean.class), new ObjectStreamField("askingAttribution", boolean.class), new ObjectStreamField("eventCount", int.class), new ObjectStreamField("sessionCount", int.class), @@ -46,6 +47,7 @@ public class ActivityState implements Serializable, Cloneable { // persistent data protected String uuid; protected boolean enabled; + protected boolean isGdprForgotten; protected boolean askingAttribution; // global counters @@ -76,6 +78,7 @@ protected ActivityState() { // create UUID for new devices uuid = Util.createUuid(); enabled = true; + isGdprForgotten = false; askingAttribution = false; eventCount = 0; // no events yet sessionCount = 0; // the first session just started @@ -136,6 +139,7 @@ public boolean equals(Object other) { if (!Util.equalString(uuid, otherActivityState.uuid)) return false; if (!Util.equalBoolean(enabled, otherActivityState.enabled)) return false; + if (!Util.equalBoolean(isGdprForgotten, otherActivityState.isGdprForgotten)) return false; if (!Util.equalBoolean(askingAttribution, otherActivityState.askingAttribution)) return false; if (!Util.equalInt(eventCount, otherActivityState.eventCount)) return false; if (!Util.equalInt(sessionCount, otherActivityState.sessionCount)) return false; @@ -158,6 +162,7 @@ public int hashCode() { int hashCode = 17; hashCode = 37 * hashCode + Util.hashString(uuid); hashCode = 37 * hashCode + Util.hashBoolean(enabled); + hashCode = 37 * hashCode + Util.hashBoolean(isGdprForgotten); hashCode = 37 * hashCode + Util.hashBoolean(askingAttribution); hashCode = 37 * hashCode + eventCount; hashCode = 37 * hashCode + sessionCount; @@ -189,6 +194,7 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo // new fields uuid = Util.readStringField(fields, "uuid", null); enabled = Util.readBooleanField(fields, "enabled", true); + isGdprForgotten = Util.readBooleanField(fields, "isGdprForgotten", false); askingAttribution = Util.readBooleanField(fields, "askingAttribution", false); updatePackages = Util.readBooleanField(fields, "updatePackages", false); From 0125c1e93b64ba23df03c5e67589d804894d2ee9 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 20 Apr 2018 13:54:02 +0200 Subject: [PATCH 12/31] Add gdprForgetMe to public API --- .../java/com/adjust/sdk/ActivityHandler.java | 97 ++++++++++++++++++- .../src/main/java/com/adjust/sdk/Adjust.java | 5 + .../java/com/adjust/sdk/AdjustConfig.java | 1 + .../java/com/adjust/sdk/AdjustFactory.java | 20 +++- .../java/com/adjust/sdk/AdjustInstance.java | 29 ++++++ .../java/com/adjust/sdk/PackageBuilder.java | 11 +++ .../java/com/adjust/sdk/PackageHandler.java | 28 +++++- 7 files changed, 183 insertions(+), 8 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java index 790eada1a..9836c0b45 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -54,6 +54,7 @@ public class ActivityHandler implements IActivityHandler { private TimerOnce delayStartTimer; private InternalState internalState; private String basePath; + private String gdprPath; private DeviceInfo deviceInfo; private AdjustConfig adjustConfig; // always valid after construction @@ -592,6 +593,26 @@ public void run() { }); } + @Override + public void gdprForgetMe() { + scheduledExecutor.submit(new Runnable() { + @Override + public void run() { + gdprForgetMeI(); + } + }); + } + + @Override + public void gotOptOutResponse() { + scheduledExecutor.submit(new Runnable() { + @Override + public void run() { + gotOptOutResponseI(); + } + }); + } + @Override public Context getContext() { return adjustConfig.context; @@ -633,6 +654,11 @@ public String getBasePath() { return this.basePath; } + @Override + public String getGdprPath() { + return this.gdprPath; + } + public ActivityPackage getAttributionPackageI() { long now = System.currentTimeMillis(); PackageBuilder attributionBuilder = new PackageBuilder(adjustConfig, @@ -727,6 +753,14 @@ public void run(ActivityHandler activityHandler) { } } + // GDPR + if (internalState.hasFirstSdkStartOcurred()) { + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext()); + if (sharedPreferencesManager.getGdprForgetMe()) { + gdprForgetMe(); + } + } + foregroundTimer = new TimerCycle( new Runnable() { @Override @@ -765,6 +799,7 @@ public void run() { UtilNetworking.setUserAgent(adjustConfig.userAgent); this.basePath = adjustConfig.basePath; + this.gdprPath = adjustConfig.gdprPath; packageHandler = AdjustFactory.getPackageHandler(this, adjustConfig.context, toSendI(false)); @@ -846,13 +881,17 @@ private void startFirstSessionI() { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext()); activityState.pushToken = sharedPreferencesManager.getPushToken(); + // activityState.isGdprForgotten = sharedPreferencesManager.getGdprForgetMe(); // track the first session package only if it's enabled if (internalState.isEnabled()) { - activityState.sessionCount = 1; // this is the first session - transferSessionPackageI(now); - - checkAfterNewStartI(sharedPreferencesManager); + if (!sharedPreferencesManager.getGdprForgetMe()) { + activityState.sessionCount = 1; // this is the first session + transferSessionPackageI(now); + checkAfterNewStartI(sharedPreferencesManager); + } else { + gdprForgetMeI(); + } } activityState.resetSessionAttributes(now); @@ -861,11 +900,16 @@ private void startFirstSessionI() { writeActivityStateI(); sharedPreferencesManager.removePushToken(); + sharedPreferencesManager.removeGdprForgetMe(); // don't check attribution right after first sdk start } private void processSessionI() { + if (activityState.isGdprForgotten) { + return; + } + long now = System.currentTimeMillis(); long lastInterval = now - activityState.lastActivity; @@ -949,6 +993,7 @@ private void trackEventI(AdjustEvent event) { if (!isEnabledI()) return; if (!checkEventI(event)) return; if (!checkOrderIdI(event.orderId)) return; + if (activityState.isGdprForgotten) return; long now = System.currentTimeMillis(); @@ -1211,6 +1256,13 @@ private void setEnabledI(boolean enabled) { return; } + if (enabled) { + if (activityState.isGdprForgotten) { + logger.error("Re-enabling SDK not possible for forgotten user"); + return; + } + } + // save new enabled state in internal state internalState.enabled = enabled; @@ -1228,6 +1280,10 @@ private void setEnabledI(boolean enabled) { if (enabled) { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext()); + if (sharedPreferencesManager.getGdprForgetMe()) { + gdprForgetMeI(); + } + // check if install was tracked if (!sharedPreferencesManager.getInstallTracked()) { long now = System.currentTimeMillis(); @@ -1727,6 +1783,7 @@ public void resetSessionPartnerParametersI() { private void setPushTokenI(String token) { if (!checkActivityStateI(activityState)) { return; } if (!isEnabledI()) { return; } + if (activityState.isGdprForgotten) { return; } if (token == null) { return; } if (token.equals(activityState.pushToken)) { return; } @@ -1752,6 +1809,38 @@ private void setPushTokenI(String token) { } } + private void gdprForgetMeI() { + if (!checkActivityStateI(activityState)) { return; } + if (!isEnabledI()) { return; } + if (activityState.isGdprForgotten) { return; } + + activityState.isGdprForgotten = true; + writeActivityStateI(); + + long now = System.currentTimeMillis(); + PackageBuilder gdprPackageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now); + + ActivityPackage gdprPackage = gdprPackageBuilder.buildGdprPackage(); + packageHandler.addPackage(gdprPackage); + + // If GDPR choice was cached, remove it. + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext()); + sharedPreferencesManager.removeGdprForgetMe(); + + if (adjustConfig.eventBufferingEnabled) { + logger.info("Buffered event %s", gdprPackage.getSuffix()); + } else { + packageHandler.sendFirstPackage(); + } + } + + private void gotOptOutResponseI() { + packageHandler.flush(); + setEnabledI(false); + activityState.isGdprForgotten = true; + writeActivityStateI(); + } + private void readActivityStateI(Context context) { try { activityState = Util.readObject(context, ACTIVITY_STATE_FILENAME, ACTIVITY_STATE_NAME, ActivityState.class); diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java index d2c4c3e86..93c16054a 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java @@ -123,6 +123,11 @@ public static void setPushToken(final String token, final Context context) { adjustInstance.setPushToken(token, context); } + public static void gdprForgetMe(final Context context) { + AdjustInstance adjustInstance = Adjust.getDefaultInstance(); + adjustInstance.gdprForgetMe(context); + } + public static void getGoogleAdId(Context context, OnDeviceIdsRead onDeviceIdRead) { Util.getGoogleAdId(context, onDeviceIdRead); } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java index f004d9ffc..1c57716d5 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -9,6 +9,7 @@ */ public class AdjustConfig { String basePath; + String gdprPath; Context context; String appToken; String environment; diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustFactory.java b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustFactory.java index 070fb167f..f8232534e 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustFactory.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustFactory.java @@ -34,6 +34,7 @@ public class AdjustFactory { private static BackoffStrategy packageHandlerBackoffStrategy = null; private static long maxDelayStart = -1; private static String baseUrl = Constants.BASE_URL; + private static String gdprUrl = Constants.GDPR_URL; private static UtilNetworking.IConnectionOptions connectionOptions = null; private static boolean tryInstallReferrer = true; @@ -56,11 +57,12 @@ public static IPackageHandler getPackageHandler(IActivityHandler activityHandler return packageHandler; } - public static IRequestHandler getRequestHandler(IPackageHandler packageHandler) { + public static IRequestHandler getRequestHandler(IActivityHandler activityHandler, + IPackageHandler packageHandler) { if (requestHandler == null) { - return new RequestHandler(packageHandler); + return new RequestHandler(activityHandler, packageHandler); } - requestHandler.init(packageHandler); + requestHandler.init(activityHandler, packageHandler); return requestHandler; } @@ -163,6 +165,13 @@ public static String getBaseUrl() { return AdjustFactory.baseUrl; } + public static String getGdprUrl() { + if (AdjustFactory.gdprUrl == null) { + return Constants.GDPR_URL; + } + return AdjustFactory.gdprUrl; + } + public static UtilNetworking.IConnectionOptions getConnectionOptions() { if (connectionOptions == null) { return new UtilNetworking.ConnectionOptions(); @@ -230,6 +239,10 @@ public static void setBaseUrl(String baseUrl) { AdjustFactory.baseUrl = baseUrl; } + public static void setGdprUrl(String gdprUrl) { + AdjustFactory.gdprUrl = gdprUrl; + } + public static void useTestConnectionOptions() { AdjustFactory.connectionOptions = new UtilNetworking.IConnectionOptions() { @Override @@ -336,6 +349,7 @@ public static void teardown(Context context) { packageHandlerBackoffStrategy = null; maxDelayStart = -1; baseUrl = Constants.BASE_URL; + gdprUrl = Constants.GDPR_URL; connectionOptions = null; tryInstallReferrer = true; } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java index 21f7b70a3..1d1bf582e 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -38,6 +38,7 @@ public class AdjustInstance { */ private List preLaunchActionsArray; private String basePath; + private String gdprPath; /** * Called upon SDK initialisation. @@ -65,6 +66,7 @@ public void onCreate(final AdjustConfig adjustConfig) { adjustConfig.startEnabled = startEnabled; adjustConfig.startOffline = startOffline; adjustConfig.basePath = this.basePath; + adjustConfig.gdprPath = this.gdprPath; activityHandler = AdjustFactory.getActivityHandler(adjustConfig); @@ -371,6 +373,16 @@ public void setPushToken(final String token, final Context context) { } } + public void gdprForgetMe(final Context context) { + saveGdprForgetMe(context); + + if (checkActivityHandler("gdpr")) { + if (activityHandler.isEnabled()) { + activityHandler.gdprForgetMe(); + } + } + } + /** * Called to get value of unique Adjust device identifier. * @@ -478,6 +490,17 @@ public void run() { Util.runInBackground(command); } + private void saveGdprForgetMe(final Context context) { + Runnable command = new Runnable() { + @Override + public void run() { + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); + sharedPreferencesManager.setGdprForgetMe(); + } + }; + Util.runInBackground(command); + } + private void setSendingReferrersAsNotSent(final Context context) { Runnable command = new Runnable() { @Override @@ -503,9 +526,15 @@ public void setTestOptions(AdjustTestOptions testOptions) { if (testOptions.basePath != null) { this.basePath = testOptions.basePath; } + if (testOptions.gdprPath != null) { + this.gdprPath = testOptions.gdprPath; + } if (testOptions.baseUrl != null) { AdjustFactory.setBaseUrl(testOptions.baseUrl); } + if (testOptions.gdprUrl != null) { + AdjustFactory.setGdprUrl(testOptions.gdprUrl); + } if (testOptions.useTestConnectionOptions != null && testOptions.useTestConnectionOptions.booleanValue()) { AdjustFactory.useTestConnectionOptions(); } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java index b791bc899..d01192681 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -170,6 +170,17 @@ public ActivityPackage buildAttributionPackage() { return attributionPackage; } + public ActivityPackage buildGdprPackage() { + Map parameters = getIdsParameters(); + + ActivityPackage gdprPackage = getDefaultActivityPackage(ActivityKind.GDPR); + gdprPackage.setPath("/gdpr_forget_device"); + gdprPackage.setSuffix(""); + gdprPackage.setParameters(parameters); + + return gdprPackage; + } + private ActivityPackage getDefaultActivityPackage(ActivityKind activityKind) { ActivityPackage activityPackage = new ActivityPackage(activityKind); activityPackage.setClientSdk(deviceInfo.clientSdk); diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageHandler.java b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageHandler.java index 3fc57630e..33621f30e 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageHandler.java @@ -36,6 +36,7 @@ public class PackageHandler implements IPackageHandler { private ILogger logger; private BackoffStrategy backoffStrategy; private String basePath; + private String gdprPath; @Override public void teardown() { @@ -91,6 +92,7 @@ public void init(IActivityHandler activityHandler, Context context, boolean star this.context = context; this.paused = !startsSending; this.basePath = activityHandler.getBasePath(); + this.gdprPath = activityHandler.getGdprPath(); } // add a package to the queue @@ -197,15 +199,30 @@ public void run() { }); } + @Override + public void flush() { + scheduledExecutor.submit(new Runnable() { + @Override + public void run() { + flushI(); + } + }); + } + @Override public String getBasePath() { return this.basePath; } + @Override + public String getGdprPath() { + return this.gdprPath; + } + // internal methods run in dedicated queue thread private void initI() { - requestHandler = AdjustFactory.getRequestHandler(this); + requestHandler = AdjustFactory.getRequestHandler(activityHandlerWeakRef.get(), this); isSending = new AtomicBoolean(); @@ -239,6 +256,10 @@ private void sendFirstI() { } private void sendNextI() { + if (packageQueue.isEmpty()) { + return; + } + packageQueue.remove(0); writePackageQueueI(); isSending.set(false); @@ -274,6 +295,11 @@ public void updatePackagesI(SessionParameters sessionParameters) { writePackageQueueI(); } + private void flushI() { + packageQueue.clear(); + writePackageQueueI(); + } + private void readPackageQueueI() { try { packageQueue = Util.readObject(context, From fcee77458223ab1d612bbb5d4fc1d1cdb2443ac7 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 20 Apr 2018 13:55:04 +0200 Subject: [PATCH 13/31] Process GDPR forget me response --- .../com/adjust/sdk/AttributionHandler.java | 7 ++++ .../java/com/adjust/sdk/RequestHandler.java | 39 +++++++++++++++---- .../java/com/adjust/sdk/ResponseData.java | 1 + .../java/com/adjust/sdk/SdkClickHandler.java | 9 ++++- .../java/com/adjust/sdk/UtilNetworking.java | 5 ++- 5 files changed, 52 insertions(+), 9 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/AttributionHandler.java b/Adjust/adjust/src/main/java/com/adjust/sdk/AttributionHandler.java index fbb20e30d..0e4ac47b9 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AttributionHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AttributionHandler.java @@ -220,6 +220,9 @@ private void checkDeeplinkI(AttributionResponseData attributionResponseData) { } private void sendAttributionRequestI() { + if (activityHandlerWeakRef.get().getActivityState().isGdprForgotten) { + return; + } if (paused) { logger.debug("Attribution handler is paused"); return; @@ -234,6 +237,10 @@ private void sendAttributionRequestI() { return; } + if (responseData.trackingState == TrackingState.OPTED_OUT) { + activityHandlerWeakRef.get().gotOptOutResponse(); + } + checkAttributionResponse((AttributionResponseData)responseData); } catch (Exception e) { logger.error("Failed to get attribution (%s)", e.getMessage()); diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/RequestHandler.java b/Adjust/adjust/src/main/java/com/adjust/sdk/RequestHandler.java index fbd79f3fb..179fdf6ef 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/RequestHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/RequestHandler.java @@ -19,19 +19,23 @@ public class RequestHandler implements IRequestHandler { private CustomScheduledExecutor scheduledExecutor; private WeakReference packageHandlerWeakRef; + private WeakReference activityHandlerWeakRef; private ILogger logger; private String basePath; + private String gdprPath; - public RequestHandler(IPackageHandler packageHandler) { + public RequestHandler(IActivityHandler activityHandler, IPackageHandler packageHandler) { this.logger = AdjustFactory.getLogger(); this.scheduledExecutor = new CustomScheduledExecutor("RequestHandler", false); - init(packageHandler); + init(activityHandler, packageHandler); this.basePath = packageHandler.getBasePath(); + this.gdprPath = packageHandler.getGdprPath(); } @Override - public void init(IPackageHandler packageHandler) { + public void init(IActivityHandler activityHandler, IPackageHandler packageHandler) { this.packageHandlerWeakRef = new WeakReference(packageHandler); + this.activityHandlerWeakRef = new WeakReference(activityHandler); } @Override @@ -55,16 +59,30 @@ public void teardown() { if (packageHandlerWeakRef != null) { packageHandlerWeakRef.clear(); } + if (activityHandlerWeakRef != null) { + activityHandlerWeakRef.clear(); + } scheduledExecutor = null; packageHandlerWeakRef = null; + activityHandlerWeakRef = null; logger = null; } private void sendI(ActivityPackage activityPackage, int queueSize) { - String url = AdjustFactory.getBaseUrl(); - if (basePath != null) { - url += basePath; + String url; + + if (activityPackage.getActivityKind() != ActivityKind.GDPR) { + url = AdjustFactory.getBaseUrl(); + if (basePath != null) { + url += basePath; + } + } else { + url = AdjustFactory.getGdprUrl(); + if (gdprPath != null) { + url += gdprPath; + } } + String targetURL = url + activityPackage.getPath(); try { @@ -74,10 +92,17 @@ private void sendI(ActivityPackage activityPackage, int queueSize) { if (packageHandler == null) { return; } + IActivityHandler activityHandler = activityHandlerWeakRef.get(); + if (activityHandler == null) { + return; + } if (responseData.jsonResponse == null) { packageHandler.closeFirstPackage(responseData, activityPackage); - return; + } + + if (responseData.trackingState == TrackingState.OPTED_OUT) { + activityHandler.gotOptOutResponse(); } packageHandler.sendNextPackage(responseData); diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/ResponseData.java b/Adjust/adjust/src/main/java/com/adjust/sdk/ResponseData.java index cddb019cb..5ce54eac4 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ResponseData.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ResponseData.java @@ -15,6 +15,7 @@ public class ResponseData { public boolean success; public boolean willRetry; public JSONObject jsonResponse; + public TrackingState trackingState; public AdjustAttribution attribution; protected ResponseData() {} diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java index 56a5d7406..6633dbde9 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -276,8 +276,11 @@ public void run() { */ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { IActivityHandler activityHandler = activityHandlerWeakRef.get(); - String source = sdkClickPackage.getParameters().get("source"); + if (activityHandler.getActivityState().isGdprForgotten) { + return; + } + String source = sdkClickPackage.getParameters().get("source"); boolean isReftag = source != null && source.equals(SOURCE_REFTAG); String rawReferrerString = sdkClickPackage.getParameters().get("raw_referrer"); @@ -332,6 +335,10 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { return; } + if (responseData.trackingState == TrackingState.OPTED_OUT) { + activityHandler.gotOptOutResponse(); + } + if (isReftag) { // Remove referrer from shared preferences after sdk_click is sent. SharedPreferencesManager sharedPreferencesManager diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java b/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java index 51e35824f..2998c7267 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java @@ -165,10 +165,13 @@ private static ResponseData readHttpResponse(HttpsURLConnection connection, Acti responseData.jsonResponse = jsonResponse; String message = jsonResponse.optString("message", null); - responseData.message = message; responseData.timestamp = jsonResponse.optString("timestamp", null); responseData.adid = jsonResponse.optString("adid", null); + String trackingState = jsonResponse.optString("tracking_state", null); + if (trackingState != null && trackingState.equals("opted_out")) { + responseData.trackingState = TrackingState.OPTED_OUT; + } if (message == null) { message = "No message found"; From 519a65cf60140ec74c03ec8a86ce4a8fc1238a97 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 20 Apr 2018 13:55:27 +0200 Subject: [PATCH 14/31] Add integration tests support for gdprForgetMe --- .../main/java/com/adjust/sdk/AdjustTestOptions.java | 2 ++ .../com/adjust/testapp/AdjustCommandExecutor.java | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustTestOptions.java b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustTestOptions.java index 0376f833e..ae3a7d82d 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustTestOptions.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustTestOptions.java @@ -9,7 +9,9 @@ public class AdjustTestOptions { public Context context; public String baseUrl; + public String gdprUrl; public String basePath; + public String gdprPath; public Boolean useTestConnectionOptions; public Long timerIntervalInMilliseconds; public Long timerStartInMilliseconds; diff --git a/Adjust/testapp/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java b/Adjust/testapp/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java index aa3ed77de..e5652af59 100644 --- a/Adjust/testapp/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java +++ b/Adjust/testapp/src/main/java/com/adjust/testapp/AdjustCommandExecutor.java @@ -25,6 +25,7 @@ import java.util.List; import static com.adjust.testapp.MainActivity.baseUrl; +import static com.adjust.testapp.MainActivity.gdprUrl; /** * Created by nonelse on 10.03.17. @@ -34,6 +35,7 @@ public class AdjustCommandExecutor { private static final String TAG = "AdjustCommandExecutor"; private Context context; private String basePath; + private String gdprPath; private SparseArray savedEvents = new SparseArray<>(); private SparseArray savedConfigs = new SparseArray<>(); private Command command; @@ -67,6 +69,7 @@ public void executeCommand(Command command) { // case "teardown": teardown(); break; case "openDeeplink": openDeeplink(); break; case "sendReferrer": sendReferrer(); break; + case "gdprForgetMe": gdprForgetMe(); break; //case "testBegin": testBegin(); break; // case "testEnd": testEnd(); break; } @@ -98,8 +101,10 @@ private void factory() { private void testOptions() { AdjustTestOptions testOptions = new AdjustTestOptions(); testOptions.baseUrl = baseUrl; + testOptions.gdprUrl = gdprUrl; if (command.containsParameter("basePath")) { basePath = command.getFirstParameterValue("basePath"); + gdprPath = command.getFirstParameterValue("basePath"); } if (command.containsParameter("timerInterval")) { long timerInterval = Long.parseLong(command.getFirstParameterValue("timerInterval")); @@ -130,6 +135,7 @@ private void testOptions() { if (teardownOption.equals("resetSdk")) { testOptions.teardown = true; testOptions.basePath = basePath; + testOptions.gdprPath = gdprPath; testOptions.useTestConnectionOptions = true; testOptions.tryInstallReferrer = false; } @@ -147,6 +153,7 @@ private void testOptions() { if (teardownOption.equals("sdk")) { testOptions.teardown = true; testOptions.basePath = null; + testOptions.gdprPath = null; testOptions.useTestConnectionOptions = false; } if (teardownOption.equals("test")) { @@ -563,6 +570,10 @@ private void sendReferrer() { Adjust.setReferrer(referrer, this.context); } + private void gdprForgetMe() { + Adjust.gdprForgetMe(this.context); + } + /* private void testBegin() { if (command.containsParameter("teardown")) { From 3af400a54bdcc9000a11411e8343479080033b77 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 20 Apr 2018 13:55:42 +0200 Subject: [PATCH 15/31] Test app update --- .../src/main/java/com/adjust/testapp/MainActivity.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Adjust/testapp/src/main/java/com/adjust/testapp/MainActivity.java b/Adjust/testapp/src/main/java/com/adjust/testapp/MainActivity.java index 849a0f4dd..80dddb1da 100644 --- a/Adjust/testapp/src/main/java/com/adjust/testapp/MainActivity.java +++ b/Adjust/testapp/src/main/java/com/adjust/testapp/MainActivity.java @@ -11,6 +11,7 @@ public class MainActivity extends AppCompatActivity { public static TestLibrary testLibrary; public static final String baseUrl = "https://10.0.2.2:8443"; + public static final String gdprUrl = "https://10.0.2.2:8443"; @Override protected void onCreate(Bundle savedInstanceState) { @@ -31,8 +32,8 @@ protected void onCreate(Bundle savedInstanceState) { } private void startTestSession() { - //testLibrary.addTestDirectory("current/sdkInfo"); - //testLibrary.addTest("current/appSecret/Test_AppSecret_no_secret"); + // testLibrary.addTestDirectory("current/gdpr"); + // testLibrary.addTest("current/gdpr/Test_GdprForgetMe_web_attribution"); testLibrary.startTestSession("android4.12.4"); } From 09eb6878f1fee58ba5bcc07c9c4d509486b62651 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 20 Apr 2018 14:21:15 +0200 Subject: [PATCH 16/31] Adjust.java cleanup --- .../src/main/java/com/adjust/sdk/Adjust.java | 139 ++++++++++++++++-- 1 file changed, 130 insertions(+), 9 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java index 93c16054a..022ef9344 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java @@ -1,12 +1,3 @@ -// -// Adjust.java -// Adjust -// -// Created by Christian Wellenbrock on 2012-10-11. -// Copyright (c) 2012-2014 adjust GmbH. All rights reserved. -// See the file MIT-LICENSE for copying permission. -// - package com.adjust.sdk; import android.content.Context; @@ -16,13 +7,27 @@ * The main interface to Adjust. * Use the methods of this class to tell Adjust about the usage of your app. * See the README for details. + * + * @author Christian Wellenbrock (@wellle) + * @since 11th November 2011 */ public class Adjust { + /** + * Singleton Adjust SDK instance. + */ private static AdjustInstance defaultInstance; + /** + * Private constructor. + */ private Adjust() { } + /** + * Method used to obtain Adjust SDK singleton instance. + * + * @return Adjust SDK singleton instance. + */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:4.12.4"; @@ -33,119 +38,234 @@ public static synchronized AdjustInstance getDefaultInstance() { return defaultInstance; } + /** + * Called upon SDK initialisation. + * + * @param adjustConfig AdjustConfig object used for SDK initialisation + */ public static void onCreate(AdjustConfig adjustConfig) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.onCreate(adjustConfig); } + /** + * Called to track event. + * + * @param event AdjustEvent object to be tracked + */ public static void trackEvent(AdjustEvent event) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.trackEvent(event); } + /** + * Called upon each Activity's onResume() method call. + */ public static void onResume() { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.onResume(); } + /** + * Called upon each Activity's onPause() method call. + */ public static void onPause() { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.onPause(); } + /** + * Called to disable/enable SDK. + * + * @param enabled boolean indicating whether SDK should be enabled or disabled + */ public static void setEnabled(boolean enabled) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.setEnabled(enabled); } + /** + * Get information if SDK is enabled or not. + * + * @return boolean indicating whether SDK is enabled or not + */ public static boolean isEnabled() { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); return adjustInstance.isEnabled(); } + /** + * Called to process deep link. + * + * @param url Deep link URL to process + */ public static void appWillOpenUrl(Uri url) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.appWillOpenUrl(url); } + /** + * Called to process referrer information sent with INSTALL_REFERRER intent. + * + * @param referrer Referrer content + * @param context Application context + */ public static void setReferrer(String referrer, Context context) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.sendReferrer(referrer, context); } + /** + * Called to set SDK to offline or online mode. + * + * @param enabled boolean indicating should SDK be in offline mode (true) or not (false) + */ public static void setOfflineMode(boolean enabled) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.setOfflineMode(enabled); } + /** + * Called if SDK initialisation was delayed and you would like to stop waiting for timer. + */ public static void sendFirstPackages() { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.sendFirstPackages(); } + /** + * Called to add global callback parameter that will be sent with each session and event. + * + * @param key Global callback parameter key + * @param value Global callback parameter value + */ public static void addSessionCallbackParameter(String key, String value) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.addSessionCallbackParameter(key, value); } + /** + * Called to add global partner parameter that will be sent with each session and event. + * + * @param key Global partner parameter key + * @param value Global partner parameter value + */ public static void addSessionPartnerParameter(String key, String value) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.addSessionPartnerParameter(key, value); } + /** + * Called to remove global callback parameter from session and event packages. + * + * @param key Global callback parameter key + */ public static void removeSessionCallbackParameter(String key) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.removeSessionCallbackParameter(key); } + /** + * Called to remove global partner parameter from session and event packages. + * + * @param key Global partner parameter key + */ public static void removeSessionPartnerParameter(String key) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.removeSessionPartnerParameter(key); } + /** + * Called to remove all added global callback parameters. + */ public static void resetSessionCallbackParameters() { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.resetSessionCallbackParameters(); } + /** + * Called to remove all added global partner parameters. + */ public static void resetSessionPartnerParameters() { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.resetSessionPartnerParameters(); } + /** + * Called to set user's push notifications token. + * + * @param token Push notifications token + * @deprecated use {@link #setPushToken(String, Context)} instead. + */ public static void setPushToken(String token) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.setPushToken(token); } + /** + * Called to set user's push notifications token. + * + * @param token Push notifications token + * @param context Application context + */ public static void setPushToken(final String token, final Context context) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.setPushToken(token, context); } + /** + * Called to forget the user in accordance with GDPR law. + * + * @param context Application context + */ public static void gdprForgetMe(final Context context) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.gdprForgetMe(context); } + /** + * Called to get value of Google Play Advertising Identifier. + * + * @return Google Play Advertising Identifier + */ public static void getGoogleAdId(Context context, OnDeviceIdsRead onDeviceIdRead) { Util.getGoogleAdId(context, onDeviceIdRead); } + /** + * Called to get value of Amazon Advertising Identifier. + * + * @return Amazon Advertising Identifier + */ public static String getAmazonAdId(final Context context) { return Util.getFireAdvertisingId(context.getContentResolver()); } + /** + * Called to get value of unique Adjust device identifier. + * + * @return Unique Adjust device indetifier + */ public static String getAdid() { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); return adjustInstance.getAdid(); } + /** + * Called to get user's current attribution value. + * + * @return AdjustAttribution object with current attribution value + */ public static AdjustAttribution getAttribution() { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); return adjustInstance.getAttribution(); } + /** + * Used for testing purposes only. Do NOT use this method. + * + * @param testOptions Adjust integration tests options + */ public static void setTestOptions(AdjustTestOptions testOptions) { if (testOptions.teardown != null && testOptions.teardown.booleanValue()) { if (defaultInstance != null) { @@ -154,6 +274,7 @@ public static void setTestOptions(AdjustTestOptions testOptions) { defaultInstance = null; AdjustFactory.teardown(testOptions.context); } + AdjustInstance adjustInstance = Adjust.getDefaultInstance(); adjustInstance.setTestOptions(testOptions); } From ffc9ea70532f73457bfc722e89d7268354d15c01 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 20 Apr 2018 14:21:25 +0200 Subject: [PATCH 17/31] AdjustInstance.java cleanup --- .../java/com/adjust/sdk/AdjustInstance.java | 62 +++++++++---------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java index 1d1bf582e..fc5c1b2ed 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -9,7 +9,7 @@ /** * Class used to forward instructions to SDK which user gives as part of Adjust class interface. * - * @author Pedro Silva (nonelse) + * @author Pedro Silva (@nonelse) * @since 12th April 2014 */ public class AdjustInstance { @@ -37,7 +37,15 @@ public class AdjustInstance { * Array of actions that were requested before SDK initialisation. */ private List preLaunchActionsArray; + + /** + * Base path for Adjust packages. + */ private String basePath; + + /** + * Path for GDPR package. + */ private String gdprPath; /** @@ -50,12 +58,10 @@ public void onCreate(final AdjustConfig adjustConfig) { AdjustFactory.getLogger().error("AdjustConfig missing"); return; } - if (!adjustConfig.isValid()) { AdjustFactory.getLogger().error("AdjustConfig not initialized correctly"); return; } - if (activityHandler != null) { AdjustFactory.getLogger().error("Adjust already initialized"); return; @@ -69,7 +75,6 @@ public void onCreate(final AdjustConfig adjustConfig) { adjustConfig.gdprPath = this.gdprPath; activityHandler = AdjustFactory.getActivityHandler(adjustConfig); - setSendingReferrersAsNotSent(adjustConfig.context); } @@ -82,7 +87,6 @@ public void trackEvent(final AdjustEvent event) { if (!checkActivityHandler()) { return; } - activityHandler.trackEvent(event); } @@ -93,7 +97,6 @@ public void onResume() { if (!checkActivityHandler()) { return; } - activityHandler.onResume(); } @@ -104,7 +107,6 @@ public void onPause() { if (!checkActivityHandler()) { return; } - activityHandler.onPause(); } @@ -115,7 +117,6 @@ public void onPause() { */ public void setEnabled(final boolean enabled) { this.startEnabled = enabled; - if (checkActivityHandler(enabled, "enabled mode", "disabled mode")) { activityHandler.setEnabled(enabled); } @@ -130,7 +131,6 @@ public boolean isEnabled() { if (!checkActivityHandler()) { return isInstanceEnabled(); } - return activityHandler.isEnabled(); } @@ -143,7 +143,6 @@ public void appWillOpenUrl(final Uri url) { if (!checkActivityHandler()) { return; } - long clickTime = System.currentTimeMillis(); activityHandler.readOpenUrl(url, clickTime); } @@ -163,7 +162,6 @@ public void sendReferrer(final String rawReferrer, final Context context) { } saveRawReferrer(rawReferrer, clickTime, context); - if (checkActivityHandler("referrer")) { if (activityHandler.isEnabled()) { activityHandler.sendReftagReferrer(); @@ -191,7 +189,6 @@ public void sendFirstPackages() { if (!checkActivityHandler()) { return; } - activityHandler.sendFirstPackages(); } @@ -206,11 +203,9 @@ public void addSessionCallbackParameter(final String key, final String value) { activityHandler.addSessionCallbackParameter(key, value); return; } - if (preLaunchActionsArray == null) { preLaunchActionsArray = new ArrayList(); } - preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(final ActivityHandler activityHandler) { @@ -230,11 +225,9 @@ public void addSessionPartnerParameter(final String key, final String value) { activityHandler.addSessionPartnerParameter(key, value); return; } - if (preLaunchActionsArray == null) { preLaunchActionsArray = new ArrayList(); } - preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(final ActivityHandler activityHandler) { @@ -253,11 +246,9 @@ public void removeSessionCallbackParameter(final String key) { activityHandler.removeSessionCallbackParameter(key); return; } - if (preLaunchActionsArray == null) { preLaunchActionsArray = new ArrayList(); } - preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(final ActivityHandler activityHandler) { @@ -276,11 +267,9 @@ public void removeSessionPartnerParameter(final String key) { activityHandler.removeSessionPartnerParameter(key); return; } - if (preLaunchActionsArray == null) { preLaunchActionsArray = new ArrayList(); } - preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(final ActivityHandler activityHandler) { @@ -297,11 +286,9 @@ public void resetSessionCallbackParameters() { activityHandler.resetSessionCallbackParameters(); return; } - if (preLaunchActionsArray == null) { preLaunchActionsArray = new ArrayList(); } - preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(final ActivityHandler activityHandler) { @@ -318,11 +305,9 @@ public void resetSessionPartnerParameters() { activityHandler.resetSessionPartnerParameters(); return; } - if (preLaunchActionsArray == null) { preLaunchActionsArray = new ArrayList(); } - preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(final ActivityHandler activityHandler) { @@ -339,7 +324,6 @@ public void teardown() { if (!checkActivityHandler()) { return; } - activityHandler.teardown(); activityHandler = null; } @@ -365,7 +349,6 @@ public void setPushToken(final String token) { */ public void setPushToken(final String token, final Context context) { savePushToken(token, context); - if (checkActivityHandler("push token")) { if (activityHandler.isEnabled()) { activityHandler.setPushToken(token, true); @@ -373,9 +356,13 @@ public void setPushToken(final String token, final Context context) { } } + /** + * Called to forget the user in accordance with GDPR law. + * + * @param context Application context + */ public void gdprForgetMe(final Context context) { saveGdprForgetMe(context); - if (checkActivityHandler("gdpr")) { if (activityHandler.isEnabled()) { activityHandler.gdprForgetMe(); @@ -392,7 +379,6 @@ public String getAdid() { if (!checkActivityHandler()) { return null; } - return activityHandler.getAdid(); } @@ -405,7 +391,6 @@ public AdjustAttribution getAttribution() { if (!checkActivityHandler()) { return null; } - return activityHandler.getAttribution(); } @@ -443,12 +428,12 @@ private boolean checkActivityHandler(final boolean status, final String trueMess private boolean checkActivityHandler(final String savedForLaunchWarningSuffixMessage) { if (activityHandler == null) { if (savedForLaunchWarningSuffixMessage != null) { - AdjustFactory.getLogger().warn("Adjust not initialized, but %s saved for launch", + AdjustFactory.getLogger().warn( + "Adjust not initialized, but %s saved for launch", savedForLaunchWarningSuffixMessage); } else { AdjustFactory.getLogger().error("Adjust not initialized correctly"); } - return false; } else { return true; @@ -490,6 +475,11 @@ public void run() { Util.runInBackground(command); } + /** + * Save GDPR forget me choice to shared preferences. + * + * @param context Application context + */ private void saveGdprForgetMe(final Context context) { Runnable command = new Runnable() { @Override @@ -501,6 +491,11 @@ public void run() { Util.runInBackground(command); } + /** + * Flag stored referrers as still not sent. + * + * @param context Application context + */ private void setSendingReferrersAsNotSent(final Context context) { Runnable command = new Runnable() { @Override @@ -522,6 +517,11 @@ private boolean isInstanceEnabled() { return this.startEnabled == null || this.startEnabled; } + /** + * Used for testing purposes only. Do NOT use this method. + * + * @param testOptions Adjust integration tests options + */ public void setTestOptions(AdjustTestOptions testOptions) { if (testOptions.basePath != null) { this.basePath = testOptions.basePath; From 8a6cb9fa28e228522e6e51f62373778be5c23819 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 23 Apr 2018 15:55:18 +0200 Subject: [PATCH 18/31] Set activity state opt out field first by web opt out --- .../adjust/src/main/java/com/adjust/sdk/ActivityHandler.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java index 9836c0b45..5b7113ffc 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1835,10 +1835,11 @@ private void gdprForgetMeI() { } private void gotOptOutResponseI() { - packageHandler.flush(); - setEnabledI(false); activityState.isGdprForgotten = true; writeActivityStateI(); + + packageHandler.flush(); + setEnabledI(false); } private void readActivityStateI(Context context) { From 0b4bcba9eb4bff29d9a1bbcdc8ad818bb2b030ba Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 25 Apr 2018 12:46:29 +0200 Subject: [PATCH 19/31] Test app update --- .../src/main/java/com/adjust/testapp/MainActivity.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Adjust/testapp/src/main/java/com/adjust/testapp/MainActivity.java b/Adjust/testapp/src/main/java/com/adjust/testapp/MainActivity.java index 80dddb1da..20cf30e13 100644 --- a/Adjust/testapp/src/main/java/com/adjust/testapp/MainActivity.java +++ b/Adjust/testapp/src/main/java/com/adjust/testapp/MainActivity.java @@ -18,7 +18,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - // check if deferred deeplink was received + // Check if deferred deep link was received Intent intent = getIntent(); Uri deeplinkData = intent.getData(); if (deeplinkData != null) { @@ -27,13 +27,14 @@ protected void onCreate(Bundle savedInstanceState) { } testLibrary = new TestLibrary(baseUrl, new CommandListener(this.getApplicationContext())); -// testLibrary.doNotExitAfterEnd(); + // testLibrary.doNotExitAfterEnd(); + startTestSession(); } private void startTestSession() { // testLibrary.addTestDirectory("current/gdpr"); - // testLibrary.addTest("current/gdpr/Test_GdprForgetMe_web_attribution"); + // testLibrary.addTest("current/gdpr/Test_GdprForgetMe_after_install_kill_before_install"); testLibrary.startTestSession("android4.12.4"); } From 402cd639537e987c1486130c28360334d87a36ca Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 25 Apr 2018 12:58:18 +0200 Subject: [PATCH 20/31] New version 4.13.0 --- Adjust/adjust/build.gradle | 2 +- Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java | 2 +- Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java | 2 +- Adjust/example/build.gradle | 2 +- Adjust/pom.xml | 2 +- Adjust/pom_criteo.xml | 2 +- Adjust/pom_sociomantic.xml | 2 +- Adjust/pom_trademob.xml | 2 +- .../androidTest/java/com/adjust/sdk/TestActivityPackage.java | 2 +- .../src/main/java/com/adjust/testapp/MainActivity.java | 2 +- README.md | 4 ++-- VERSION | 2 +- doc/english/criteo_plugin.md | 2 +- doc/english/migrate.md | 2 +- doc/english/sociomantic_plugin.md | 2 +- doc/english/trademob_plugin.md | 2 +- 16 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Adjust/adjust/build.gradle b/Adjust/adjust/build.gradle index a3dd926d9..6b8376715 100644 --- a/Adjust/adjust/build.gradle +++ b/Adjust/adjust/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.library' def getVersionName() { - return "4.12.4" + return "4.13.0" } android { diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java index 022ef9344..a79ad9ede 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java @@ -30,7 +30,7 @@ private Adjust() { */ public static synchronized AdjustInstance getDefaultInstance() { @SuppressWarnings("unused") - String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:4.12.4"; + String VERSION = "!SDK-VERSION-STRING!:com.adjust.sdk:adjust-android:4.13.0"; if (defaultInstance == null) { defaultInstance = new AdjustInstance(); diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java index 6241cdf1f..65a6fbf62 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java @@ -30,7 +30,7 @@ public interface Constants { String GDPR_URL = "https://gdpr.adjust.com"; String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android4.12.4"; + String CLIENT_SDK = "android4.13.0"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String INSTALL_REFERRER = "install_referrer"; diff --git a/Adjust/example/build.gradle b/Adjust/example/build.gradle index d4b4bbff9..4eff5b9ee 100644 --- a/Adjust/example/build.gradle +++ b/Adjust/example/build.gradle @@ -27,7 +27,7 @@ dependencies { // running mvn package //compile fileTree(dir: '../target', include: ['*.jar']) // using maven repository - //compile 'com.adjust.sdk:adjust-android:4.12.4' + //compile 'com.adjust.sdk:adjust-android:4.13.0' debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.4' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4' diff --git a/Adjust/pom.xml b/Adjust/pom.xml index c36c6a63b..27c0e63d6 100644 --- a/Adjust/pom.xml +++ b/Adjust/pom.xml @@ -5,7 +5,7 @@ 4.0.0 adjust-android com.adjust.sdk - 4.12.4 + 4.13.0 jar Adjust Android SDK https://github.com/adjust/android_sdk diff --git a/Adjust/pom_criteo.xml b/Adjust/pom_criteo.xml index 0fae914c9..d08366255 100644 --- a/Adjust/pom_criteo.xml +++ b/Adjust/pom_criteo.xml @@ -5,7 +5,7 @@ 4.0.0 adjust-android-criteo com.adjust.sdk - 4.12.4 + 4.13.0 jar Adjust Android SDK https://github.com/adjust/android_sdk diff --git a/Adjust/pom_sociomantic.xml b/Adjust/pom_sociomantic.xml index f335de2aa..61f30d6dc 100644 --- a/Adjust/pom_sociomantic.xml +++ b/Adjust/pom_sociomantic.xml @@ -5,7 +5,7 @@ 4.0.0 adjust-android-sociomantic com.adjust.sdk - 4.12.4 + 4.13.0 jar Adjust Android SDK https://github.com/adjust/android_sdk diff --git a/Adjust/pom_trademob.xml b/Adjust/pom_trademob.xml index 4c37e72e2..ba9d9f020 100644 --- a/Adjust/pom_trademob.xml +++ b/Adjust/pom_trademob.xml @@ -5,7 +5,7 @@ 4.0.0 adjust-android-trademob com.adjust.sdk - 4.12.4 + 4.13.0 jar Adjust Android SDK https://github.com/adjust/android_sdk diff --git a/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityPackage.java b/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityPackage.java index 40dc04b16..c0f44513a 100644 --- a/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityPackage.java +++ b/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityPackage.java @@ -53,7 +53,7 @@ public TestActivityPackage(ActivityPackage activityPackage) { // default values appToken = "123456789012"; environment = "sandbox"; - clientSdk = "android4.12.4"; + clientSdk = "android4.13.0"; suffix = ""; attribution = new AdjustAttribution(); playServices = true; diff --git a/Adjust/testapp/src/main/java/com/adjust/testapp/MainActivity.java b/Adjust/testapp/src/main/java/com/adjust/testapp/MainActivity.java index 20cf30e13..0548c618e 100644 --- a/Adjust/testapp/src/main/java/com/adjust/testapp/MainActivity.java +++ b/Adjust/testapp/src/main/java/com/adjust/testapp/MainActivity.java @@ -36,6 +36,6 @@ private void startTestSession() { // testLibrary.addTestDirectory("current/gdpr"); // testLibrary.addTest("current/gdpr/Test_GdprForgetMe_after_install_kill_before_install"); - testLibrary.startTestSession("android4.12.4"); + testLibrary.startTestSession("android4.13.0"); } } diff --git a/README.md b/README.md index ba92e9427..6c42193fa 100644 --- a/README.md +++ b/README.md @@ -72,14 +72,14 @@ These are the minimal steps required to integrate the Adjust SDK into your Andro If you are using Maven, add the following to your `build.gradle` file: ``` -compile 'com.adjust.sdk:adjust-android:4.12.4' +compile 'com.adjust.sdk:adjust-android:4.13.0' compile 'com.android.installreferrer:installreferrer:1.0' ``` **Note**: If you are using `Gradle 3.0.0 or above`, make sure to use the `implementation` keyword instead of `compile` as follows: ``` -implementation 'com.adjust.sdk:adjust-android:4.12.4' +implementation 'com.adjust.sdk:adjust-android:4.13.0' implementation 'com.android.installreferrer:installreferrer:1.0' ``` diff --git a/VERSION b/VERSION index 23297c30e..813b83b65 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.12.4 +4.13.0 diff --git a/doc/english/criteo_plugin.md b/doc/english/criteo_plugin.md index d34d7e05f..98e03c554 100644 --- a/doc/english/criteo_plugin.md +++ b/doc/english/criteo_plugin.md @@ -3,7 +3,7 @@ Add the dependency of the adjust sdk with the Criteo plugin: ``` -compile 'com.adjust.sdk:adjust-android-criteo:4.12.4' +compile 'com.adjust.sdk:adjust-android-criteo:4.13.0' ``` Or integrate adjust with Criteo events by following these steps: diff --git a/doc/english/migrate.md b/doc/english/migrate.md index 0320874ec..eb37cfcfb 100644 --- a/doc/english/migrate.md +++ b/doc/english/migrate.md @@ -1,4 +1,4 @@ -## Migrate your adjust SDK for Android to 4.12.4 from 3.6.2 +## Migrate your adjust SDK for Android to 4.13.0 from 3.6.2 ### The Application class diff --git a/doc/english/sociomantic_plugin.md b/doc/english/sociomantic_plugin.md index c3532fdea..5d2c6d2fa 100644 --- a/doc/english/sociomantic_plugin.md +++ b/doc/english/sociomantic_plugin.md @@ -3,7 +3,7 @@ Add the dependency of the adjust sdk with the Sociomantic plugin: ``` -compile 'com.adjust.sdk:adjust-android-sociomantic:4.12.4' +compile 'com.adjust.sdk:adjust-android-sociomantic:4.13.0' ``` Or integrate adjust with Sociomantic events by following these steps: diff --git a/doc/english/trademob_plugin.md b/doc/english/trademob_plugin.md index 61c101e45..ade89ff9f 100644 --- a/doc/english/trademob_plugin.md +++ b/doc/english/trademob_plugin.md @@ -3,7 +3,7 @@ Add the dependency of the adjust sdk with the Trademob plugin: ``` -compile 'com.adjust.sdk:adjust-android-trademob:4.12.4' +compile 'com.adjust.sdk:adjust-android-trademob:4.13.0' ``` Or integrate adjust with Trademob events by following these steps: From 2158fa575ba94f1ad5a42c57192a6e6b3e572ebd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Wed, 25 Apr 2018 13:01:44 +0200 Subject: [PATCH 21/31] Update CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 092d70b84..4ae4c90c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### Version 4.13.0 (27th April 2018) +#### Added +- Added `gdprForgetMe` method to `Adjust` interface to enable possibility for user to be forgotten in accordance to GDPR law. + +--- + ### Version 4.12.4 (9th March 2018) #### Changed - Added additional null checks into `InstallReferrer` `invoke` method. From a8cdbcd59ff3d2b475916388ac96f5c6d36a3df5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Wed, 25 Apr 2018 13:02:52 +0200 Subject: [PATCH 22/31] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ae4c90c5..0117eb0da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ### Version 4.13.0 (27th April 2018) #### Added -- Added `gdprForgetMe` method to `Adjust` interface to enable possibility for user to be forgotten in accordance to GDPR law. +- Added `Adjust.gdprForgetMe()` method to enable possibility for user to be forgotten in accordance with GDPR law. --- From 341e2c9746104cb5147ffe27221e5e2da8bacb75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Thu, 26 Apr 2018 12:06:57 +0200 Subject: [PATCH 23/31] Update README.md --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 6c42193fa..1692fbac4 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ our [Android web views SDK guide](doc/english/web_views.md). * [Session and event callbacks](#session-event-callbacks) * [Disable tracking](#disable-tracking) * [Offline mode](#offline-mode) + * [GDPR right to be forgotten](#gdpr-forget-me) * [Event buffering](#event-buffering) * [SDK signature](#sdk-signature) * [Background tracking](#background-tracking) @@ -681,6 +682,16 @@ config.setEventBufferingEnabled(true); Adjust.onCreate(config); ``` +### GDPR right to be forgotten + +In accordance with article 17 of the EU's General Data Protection Regulation (GDPR), you can notify Adjust when a user has exercised their right to be forgotten. Calling the following method will instruct the Adjust SDK to communicate the user's choice to be forgotten to the Adjust backend: + +```java +Adjust.gdprForgetMe(); +``` + +Upon receiving this information, Adjust will erase the user's data and the Adjust SDK will stop tracking the user. No requests from this device will be sent to Adjust in the future. + ### SDK signature An account manager must activate the Adjust SDK signature. Contact Adjust support (support@adjust.com) if you are interested in using this feature. From 750f8a09e8d36bd0ab820a35003345220b70ee6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Thu, 26 Apr 2018 12:15:42 +0200 Subject: [PATCH 24/31] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1692fbac4..548ca7693 100644 --- a/README.md +++ b/README.md @@ -38,8 +38,8 @@ our [Android web views SDK guide](doc/english/web_views.md). * [Session and event callbacks](#session-event-callbacks) * [Disable tracking](#disable-tracking) * [Offline mode](#offline-mode) - * [GDPR right to be forgotten](#gdpr-forget-me) * [Event buffering](#event-buffering) + * [GDPR right to be forgotten](#gdpr-forget-me) * [SDK signature](#sdk-signature) * [Background tracking](#background-tracking) * [Device IDs](#device-ids) From 859427aa6848de7ea3aa625119851ee3ff1780d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Thu, 26 Apr 2018 17:08:38 +0200 Subject: [PATCH 25/31] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 548ca7693..096b8e181 100644 --- a/README.md +++ b/README.md @@ -687,7 +687,7 @@ Adjust.onCreate(config); In accordance with article 17 of the EU's General Data Protection Regulation (GDPR), you can notify Adjust when a user has exercised their right to be forgotten. Calling the following method will instruct the Adjust SDK to communicate the user's choice to be forgotten to the Adjust backend: ```java -Adjust.gdprForgetMe(); +Adjust.gdprForgetMe(context); ``` Upon receiving this information, Adjust will erase the user's data and the Adjust SDK will stop tracking the user. No requests from this device will be sent to Adjust in the future. From f023e01418ead21fb81874e461cb919243680917 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Thu, 26 Apr 2018 17:08:53 +0200 Subject: [PATCH 26/31] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0117eb0da..358f113a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ### Version 4.13.0 (27th April 2018) #### Added -- Added `Adjust.gdprForgetMe()` method to enable possibility for user to be forgotten in accordance with GDPR law. +- Added `Adjust.gdprForgetMe(context)` method to enable possibility for user to be forgotten in accordance with GDPR law. --- From ec2f120a91a7d1a49ed6cabf2a51b29af60c4997 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 26 Apr 2018 19:40:15 +0200 Subject: [PATCH 27/31] Retry on HTTP 429 --- .../adjust/src/main/java/com/adjust/sdk/RequestHandler.java | 2 ++ .../adjust/src/main/java/com/adjust/sdk/UtilNetworking.java | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/RequestHandler.java b/Adjust/adjust/src/main/java/com/adjust/sdk/RequestHandler.java index 179fdf6ef..9a736d2ed 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/RequestHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/RequestHandler.java @@ -99,10 +99,12 @@ private void sendI(ActivityPackage activityPackage, int queueSize) { if (responseData.jsonResponse == null) { packageHandler.closeFirstPackage(responseData, activityPackage); + return; } if (responseData.trackingState == TrackingState.OPTED_OUT) { activityHandler.gotOptOutResponse(); + return; } packageHandler.sendNextPackage(responseData); diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java b/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java index 2998c7267..da2f40704 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java @@ -117,6 +117,10 @@ private static ResponseData readHttpResponse(HttpsURLConnection connection, Acti responseCode = connection.getResponseCode(); InputStream inputStream; + if (responseCode == 429) { + return responseData; + } + if (responseCode >= 400) { inputStream = connection.getErrorStream(); } else { From f8fa0d043b51df2c7a7e7a6b02a4cefd87385533 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 26 Apr 2018 19:57:39 +0200 Subject: [PATCH 28/31] Return after gotOptOutResponse() --- .../adjust/src/main/java/com/adjust/sdk/AttributionHandler.java | 1 + Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java | 1 + 2 files changed, 2 insertions(+) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/AttributionHandler.java b/Adjust/adjust/src/main/java/com/adjust/sdk/AttributionHandler.java index 0e4ac47b9..345f3b785 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AttributionHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AttributionHandler.java @@ -239,6 +239,7 @@ private void sendAttributionRequestI() { if (responseData.trackingState == TrackingState.OPTED_OUT) { activityHandlerWeakRef.get().gotOptOutResponse(); + return; } checkAttributionResponse((AttributionResponseData)responseData); diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java index 6633dbde9..28983fcde 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -337,6 +337,7 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { if (responseData.trackingState == TrackingState.OPTED_OUT) { activityHandler.gotOptOutResponse(); + return; } if (isReftag) { From 7c9f6ed5602ff554a5dbc03e4bf01fb591de632c Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 27 Apr 2018 08:45:12 +0200 Subject: [PATCH 29/31] Minor refactoring and adding 429 log line --- .../src/main/java/com/adjust/sdk/RequestHandler.java | 8 ++++---- .../src/main/java/com/adjust/sdk/UtilNetworking.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/RequestHandler.java b/Adjust/adjust/src/main/java/com/adjust/sdk/RequestHandler.java index 9a736d2ed..e56188306 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/RequestHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/RequestHandler.java @@ -97,13 +97,13 @@ private void sendI(ActivityPackage activityPackage, int queueSize) { return; } - if (responseData.jsonResponse == null) { - packageHandler.closeFirstPackage(responseData, activityPackage); + if (responseData.trackingState == TrackingState.OPTED_OUT) { + activityHandler.gotOptOutResponse(); return; } - if (responseData.trackingState == TrackingState.OPTED_OUT) { - activityHandler.gotOptOutResponse(); + if (responseData.jsonResponse == null) { + packageHandler.closeFirstPackage(responseData, activityPackage); return; } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java b/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java index da2f40704..906803456 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java @@ -117,10 +117,6 @@ private static ResponseData readHttpResponse(HttpsURLConnection connection, Acti responseCode = connection.getResponseCode(); InputStream inputStream; - if (responseCode == 429) { - return responseData; - } - if (responseCode >= 400) { inputStream = connection.getErrorStream(); } else { @@ -148,6 +144,10 @@ private static ResponseData readHttpResponse(HttpsURLConnection connection, Acti String stringResponse = sb.toString(); logger.verbose("Response: %s", stringResponse); + if (responseCode == 429) { + logger.error("Too frequent requests to the endpoint (429)"); + return responseData; + } if (stringResponse == null || stringResponse.length() == 0) { return responseData; } From c44807d5a8e2b27c4d7de5fa995444258f6af838 Mon Sep 17 00:00:00 2001 From: Dave Jones Date: Mon, 9 Apr 2018 22:15:49 +0100 Subject: [PATCH 30/31] Issue 307: Fix typos in Proguard rules & README Further to #300, there are other examples of the typo in the README and other proguard configuration files within the library and sample app. --- Adjust/adjust/adjust-proguard-rules.txt | 4 ++-- Adjust/example/proguard-rules.pro | 4 ++-- README.md | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Adjust/adjust/adjust-proguard-rules.txt b/Adjust/adjust/adjust-proguard-rules.txt index c7ecab901..cbc3b8c23 100644 --- a/Adjust/adjust/adjust-proguard-rules.txt +++ b/Adjust/adjust/adjust-proguard-rules.txt @@ -17,10 +17,10 @@ java.lang.String CPU_ABI; } -keep class android.content.res.Configuration { - android.os.LocaledList getLocales(); + android.os.LocaleList getLocales(); java.util.Locale locale; } --keep class android.os.LocaledList { +-keep class android.os.LocaleList { java.util.Locale get(int); } -keep public class com.android.installreferrer.** { *; } \ No newline at end of file diff --git a/Adjust/example/proguard-rules.pro b/Adjust/example/proguard-rules.pro index 243dcaf62..9708978d6 100644 --- a/Adjust/example/proguard-rules.pro +++ b/Adjust/example/proguard-rules.pro @@ -32,9 +32,9 @@ java.lang.String CPU_ABI; } -keep class android.content.res.Configuration { - android.os.LocaledList getLocales(); + android.os.LocaleList getLocales(); java.util.Locale locale; } --keep class android.os.LocaledList { +-keep class android.os.LocaleList { java.util.Locale get(int); } diff --git a/README.md b/README.md index 096b8e181..22c8a8b72 100644 --- a/README.md +++ b/README.md @@ -157,7 +157,7 @@ If you are using Proguard, add these lines to your Proguard file: android.os.LocaleList getLocales(); java.util.Locale locale; } --keep class android.os.LocaledList { +-keep class android.os.LocaleList { java.util.Locale get(int); } -keep public class com.android.installreferrer.** { *; } From 51b8ea7823de9cd1c54c1ed7d6a75a3ee3a4b18c Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 27 Apr 2018 14:37:29 +0200 Subject: [PATCH 31/31] Fixing comments to make mvn happy --- Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java index a79ad9ede..0772a69d6 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java @@ -226,7 +226,8 @@ public static void gdprForgetMe(final Context context) { /** * Called to get value of Google Play Advertising Identifier. * - * @return Google Play Advertising Identifier + * @param context Application context + * @param onDeviceIdRead Callback to get triggered once identifier is obtained */ public static void getGoogleAdId(Context context, OnDeviceIdsRead onDeviceIdRead) { Util.getGoogleAdId(context, onDeviceIdRead); @@ -235,6 +236,7 @@ public static void getGoogleAdId(Context context, OnDeviceIdsRead onDeviceIdRead /** * Called to get value of Amazon Advertising Identifier. * + * @param context Application context * @return Amazon Advertising Identifier */ public static String getAmazonAdId(final Context context) {