From db051d1004e65118263b6935c90f5aebd8f5a0ac Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 28 Jun 2017 15:09:21 +0200 Subject: [PATCH 001/146] Queue set enabled and offline operations --- .../java/com/adjust/sdk/ActivityHandler.java | 200 +++++++++--------- 1 file changed, 103 insertions(+), 97 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 7a24699aa..283166eb8 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -314,100 +314,22 @@ public void finishedTrackingActivity(ResponseData responseData) { @Override public void setEnabled(final boolean enabled) { - // compare with the saved or internal state - if (!hasChangedState(this.isEnabled(), enabled, - "Adjust already enabled", "Adjust already disabled")) { - return; - } - - // save new enabled state in internal state - internalState.enabled = enabled; - - if (activityState == null) { - updateStatus(!enabled, - "Handlers will start as paused due to the SDK being disabled", - "Handlers will still start as paused", - "Handlers will start as active due to the SDK being enabled"); - return; - } - - // save new enabled state in activity state - Runnable saveEnabled = new Runnable() { + scheduledExecutor.submit(new Runnable() { @Override public void run() { - activityState.enabled = enabled; + setEnabledI(enabled); } - }; - writeActivityStateS(saveEnabled); - - updateStatus(!enabled, - "Pausing handlers due to SDK being disabled", - "Handlers remain paused", - "Resuming handlers due to SDK being enabled"); - } - - private void updateStatus(boolean pausingState, String pausingMessage, - String remainsPausedMessage, String unPausingMessage) - { - // it is changing from an active state to a pause state - if (pausingState) { - logger.info(pausingMessage); - } - // check if it's remaining in a pause state - else if (pausedI(false)) { // safe to use internal version of paused (read only), can suffer from phantom read but not an issue - // including the sdk click handler - if (pausedI(true)) { - logger.info(remainsPausedMessage); - } else { - logger.info(remainsPausedMessage + ", except the Sdk Click Handler"); - } - } else { - // it is changing from a pause state to an active state - logger.info(unPausingMessage); - } - - updateHandlersStatusAndSend(); - } - - private boolean hasChangedState(boolean previousState, boolean newState, - String trueMessage, String falseMessage) - { - if (previousState != newState) { - return true; - } - - if (previousState) { - logger.debug(trueMessage); - } else { - logger.debug(falseMessage); - } - - return false; + }); } @Override - public void setOfflineMode(boolean offline) { - // compare with the internal state - if (!hasChangedState(internalState.isOffline(), offline, - "Adjust already in offline mode", - "Adjust already in online mode")) { - return; - } - - internalState.offline = offline; - - if (activityState == null) { - updateStatus(offline, - "Handlers will start paused due to SDK being offline", - "Handlers will still start as paused", - "Handlers will start as active due to SDK being online"); - return; - } - - updateStatus(offline, - "Pausing handlers to put SDK offline mode", - "Handlers remain paused", - "Resuming handlers to put SDK in online mode"); + public void setOfflineMode(final boolean offline) { + scheduledExecutor.submit(new Runnable() { + @Override + public void run() { + setOfflineModeI(offline); + } + }); } @Override @@ -649,15 +571,6 @@ public InternalState getInternalState() { return internalState; } - private void updateHandlersStatusAndSend() { - scheduledExecutor.submit(new Runnable() { - @Override - public void run() { - updateHandlersStatusAndSendI(); - } - }); - } - private void initI() { SESSION_INTERVAL = AdjustFactory.getSessionInterval(); SUBSESSION_INTERVAL = AdjustFactory.getSubsessionInterval(); @@ -1120,6 +1033,99 @@ private void launchDeeplinkMain(Intent deeplinkIntent, Uri deeplink) { adjustConfig.context.startActivity(deeplinkIntent); } + private void setEnabledI(boolean enabled) { + // compare with the saved or internal state + if (!hasChangedStateI(this.isEnabledI(), enabled, + "Adjust already enabled", "Adjust already disabled")) { + return; + } + + // save new enabled state in internal state + internalState.enabled = enabled; + + if (activityState == null) { + updateStatusI(!enabled, + "Handlers will start as paused due to the SDK being disabled", + "Handlers will still start as paused", + "Handlers will start as active due to the SDK being enabled"); + + return; + } + + activityState.enabled = enabled; + writeActivityStateI(); + + updateStatusI(!enabled, + "Pausing handlers due to SDK being disabled", + "Handlers remain paused", + "Resuming handlers due to SDK being enabled"); + + } + + private void setOfflineModeI(boolean offline) { + // compare with the internal state + if (!hasChangedStateI(internalState.isOffline(), offline, + "Adjust already in offline mode", + "Adjust already in online mode")) { + return; + } + + internalState.offline = offline; + + if (activityState == null) { + updateStatusI(offline, + "Handlers will start paused due to SDK being offline", + "Handlers will still start as paused", + "Handlers will start as active due to SDK being online"); + return; + } + + updateStatusI(offline, + "Pausing handlers to put SDK offline mode", + "Handlers remain paused", + "Resuming handlers to put SDK in online mode"); + + } + + private boolean hasChangedStateI(boolean previousState, boolean newState, + String trueMessage, String falseMessage) + { + if (previousState != newState) { + return true; + } + + if (previousState) { + logger.debug(trueMessage); + } else { + logger.debug(falseMessage); + } + + return false; + } + + private void updateStatusI(boolean pausingState, String pausingMessage, + String remainsPausedMessage, String unPausingMessage) + { + // it is changing from an active state to a pause state + if (pausingState) { + logger.info(pausingMessage); + } + // check if it's remaining in a pause state + else if (pausedI(false)) { + // including the sdk click handler + if (pausedI(true)) { + logger.info(remainsPausedMessage); + } else { + logger.info(remainsPausedMessage + ", except the Sdk Click Handler"); + } + } else { + // it is changing from a pause state to an active state + logger.info(unPausingMessage); + } + + updateHandlersStatusAndSendI(); + } + private void sendReferrerI(String referrer, long clickTime) { if (referrer == null || referrer.length() == 0 ) { return; From 488303c15adc3b7673847e475a6406b01ed2b48a Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 28 Jun 2017 15:19:00 +0200 Subject: [PATCH 002/146] Rename internal state vars --- .../java/com/adjust/sdk/ActivityHandler.java | 35 +++++++++---------- .../com/adjust/sdk/TestActivityHandler.java | 20 +++++------ 2 files changed, 26 insertions(+), 29 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 283166eb8..c884b9e67 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -17,7 +17,6 @@ import android.net.Uri; import android.net.UrlQuerySanitizer; import android.os.Handler; -import android.util.*; import java.io.InputStream; import java.util.LinkedHashMap; @@ -139,23 +138,23 @@ public boolean isOnline() { return !offline; } - public boolean isBackground() { + public boolean isInBackground() { return background; } - public boolean isForeground() { + public boolean isInForeground() { return !background; } - public boolean isDelayStart() { + public boolean isInDelayedStart() { return delayStart; } - public boolean isToStartNow() { + public boolean isNotInDelayedStart() { return !delayStart; } - public boolean isToUpdatePackages() { + public boolean itHasToUpdatePackages() { return updatePackages; } @@ -163,8 +162,8 @@ public boolean isFirstLaunch() { return firstLaunch; } - public boolean isSessionResponseProcessed() { - return sessionResponseProcessed; + public boolean hasSessionResponseNotBeenProcessed() { + return !sessionResponseProcessed; } } @@ -742,7 +741,7 @@ private void processSessionI() { transferSessionPackageI(now); activityState.resetSessionAttributes(now); activityState.enabled = internalState.isEnabled(); - activityState.updatePackages = internalState.isToUpdatePackages(); + activityState.updatePackages = internalState.itHasToUpdatePackages(); writeActivityStateI(); return; } @@ -788,7 +787,7 @@ private void checkAttributionStateI() { // if it's the first launch if (internalState.isFirstLaunch()) { // and it hasn't received the session response - if (!internalState.isSessionResponseProcessed()) { + if (internalState.hasSessionResponseNotBeenProcessed()) { return; } } @@ -824,7 +823,7 @@ private void trackEventI(AdjustEvent event) { updateActivityStateI(now); PackageBuilder eventBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, now); - ActivityPackage eventPackage = eventBuilder.buildEventPackage(event, sessionParameters, internalState.isDelayStart()); + ActivityPackage eventPackage = eventBuilder.buildEventPackage(event, sessionParameters, internalState.isInDelayedStart()); packageHandler.addPackage(eventPackage); if (adjustConfig.eventBufferingEnabled) { @@ -834,7 +833,7 @@ private void trackEventI(AdjustEvent event) { } // if it is in the background and it can send, start the background timer - if (adjustConfig.sendInBackground && internalState.isBackground()) { + if (adjustConfig.sendInBackground && internalState.isInBackground()) { startBackgroundTimerI(); } @@ -1329,7 +1328,7 @@ public static boolean deleteSessionPartnerParameters(Context context) { private void transferSessionPackageI(long now) { PackageBuilder builder = new PackageBuilder(adjustConfig, deviceInfo, activityState, now); - ActivityPackage sessionPackage = builder.buildSessionPackage(sessionParameters, internalState.isDelayStart()); + ActivityPackage sessionPackage = builder.buildSessionPackage(sessionParameters, internalState.isInDelayedStart()); packageHandler.addPackage(sessionPackage); packageHandler.sendFirstPackage(); } @@ -1397,7 +1396,7 @@ private void backgroundTimerFiredI() { private void delayStartI() { // it's not configured to start delayed or already finished - if (internalState.isToStartNow()) { + if (internalState.isNotInDelayedStart()) { return; } @@ -1435,7 +1434,7 @@ private void delayStartI() { } private void sendFirstPackagesI() { - if (internalState.isToStartNow()) { + if (internalState.isNotInDelayedStart()) { logger.info("Start delay expired or never configured"); return; } @@ -1467,7 +1466,7 @@ private boolean isToUpdatePackagesI() { if (activityState != null) { return activityState.updatePackages; } else { - return internalState.isToUpdatePackages(); + return internalState.itHasToUpdatePackages(); } } @@ -1773,7 +1772,7 @@ private boolean pausedI(boolean sdkClickHandlerOnly) { // other handlers are paused if either: return internalState.isOffline() || // it's offline !isEnabledI() || // is disabled - internalState.isDelayStart(); // is in delayed start + internalState.isInDelayedStart(); // is in delayed start } private boolean toSendI() { @@ -1792,6 +1791,6 @@ private boolean toSendI(boolean sdkClickHandlerOnly) { } // doesn't have the option -> depends on being on the background/foreground - return internalState.isForeground(); + return internalState.isInForeground(); } } diff --git a/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java b/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java index f741f0173..50ede6dd5 100644 --- a/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java +++ b/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java @@ -8,7 +8,6 @@ import android.support.test.runner.AndroidJUnit4; import android.test.mock.MockContext; import android.test.suitebuilder.annotation.LargeTest; -import android.util.Log; import org.json.JSONException; import org.json.JSONObject; @@ -20,7 +19,6 @@ import java.util.ArrayList; import java.util.HashMap; -import java.util.List; /** * Created by pfms on 08/08/2016. @@ -1921,7 +1919,7 @@ public void testCheckAttributionState() { // if it's the first launch //if (internalState.isFirstLaunch()) { - // if (!internalState.isSessionResponseProcessed()) { + // if (internalState.hasSessionResponseNotBeenProcessed()) { // return; // } //} @@ -2984,9 +2982,9 @@ private ActivityHandler getActivityHandler(AdjustConfig config) { // test default values assertUtil.isTrue(internalState.isEnabled()); assertUtil.isTrue(internalState.isOnline()); - assertUtil.isTrue(internalState.isBackground()); - assertUtil.isTrue(internalState.isToStartNow()); - assertUtil.isFalse(internalState.isToUpdatePackages()); + assertUtil.isTrue(internalState.isInBackground()); + assertUtil.isTrue(internalState.isNotInDelayedStart()); + assertUtil.isFalse(internalState.itHasToUpdatePackages()); } return activityHandler; @@ -3015,7 +3013,7 @@ private void checkInitTests(StateActivityHandlerInit sInit) { // check values read from activity state assertUtil.isEqual(sInit.internalState.isEnabled(), sInit.startEnabled); - //assertUtil.isEqual(sInit.internalState.isToUpdatePackages(), sInit.updatePackages); + //assertUtil.isEqual(sInit.internalState.itHasToUpdatePackages(), sInit.updatePackages); // check event buffering if (sInit.eventBufferingIsEnabled) { @@ -3054,10 +3052,10 @@ private void checkInitTests(StateActivityHandlerInit sInit) { if (sInit.delayStartConfigured) { assertUtil.info("Delay start configured"); - assertUtil.isTrue(sInit.internalState.isDelayStart()); + assertUtil.isTrue(sInit.internalState.isInDelayedStart()); } else { assertUtil.notInInfo("Delay start configured"); - assertUtil.isFalse(sInit.internalState.isDelayStart()); + assertUtil.isFalse(sInit.internalState.isInDelayedStart()); } if (sInit.startsSending) { @@ -3104,7 +3102,7 @@ private void resumeActivity(ActivityHandler activityHandler) { ActivityHandler.InternalState internalState = activityHandler.getInternalState(); // comes to the foreground - assertUtil.isTrue(internalState.isForeground()); + assertUtil.isTrue(internalState.isInForeground()); } private void checkFirstSession() { @@ -3353,7 +3351,7 @@ private void stopActivity(ActivityHandler activityHandler) { ActivityHandler.InternalState internalState = activityHandler.getInternalState(); // goes to the background - assertUtil.isTrue(internalState.isBackground()); + assertUtil.isTrue(internalState.isInBackground()); } private void checkEndSession() { From 47dc589cf3474ad484f285e585c646b54e4cb94c Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 28 Jun 2017 15:36:53 +0200 Subject: [PATCH 003/146] Send first session package even with buffering --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 c884b9e67..ba81d63c0 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1266,6 +1266,12 @@ private void updateHandlersStatusAndSendI() { resumeSendingI(); + // try to send if it's the first launch and it hasn't received the session response + // even if event buffering is enabled + if (internalState.isFirstLaunch() && internalState.hasSessionResponseNotBeenProcessed()) { + packageHandler.sendFirstPackage(); + } + // try to send if (!adjustConfig.eventBufferingEnabled) { packageHandler.sendFirstPackage(); From 97ac57d0bd9917f67ef665c19a202d2205a19d0e Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 28 Jun 2017 16:16:41 +0200 Subject: [PATCH 004/146] Save askingAttribution inside internal queue --- .../java/com/adjust/sdk/ActivityHandler.java | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 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 ba81d63c0..e7dc42f64 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -385,14 +385,12 @@ public boolean updateAttributionI(AdjustAttribution attribution) { @Override public void setAskingAttribution(final boolean askingAttribution) { - Runnable saveAskingAttribution = new Runnable() { + scheduledExecutor.submit(new Runnable() { @Override public void run() { - activityState.askingAttribution = askingAttribution; + setAskingAttributionI(askingAttribution); } - }; - - writeActivityStateS(saveAskingAttribution); + }); } @Override @@ -1125,6 +1123,12 @@ else if (pausedI(false)) { updateHandlersStatusAndSendI(); } + private void setAskingAttributionI(boolean askingAttribution) { + activityState.askingAttribution = askingAttribution; + + writeActivityStateI(); + } + private void sendReferrerI(String referrer, long clickTime) { if (referrer == null || referrer.length() == 0 ) { return; @@ -1648,17 +1652,10 @@ private void readSessionPartnerParametersI(Context context) { } private void writeActivityStateI() { - writeActivityStateS(null); - } - - private void writeActivityStateS(Runnable changeActivityState) { synchronized (ActivityState.class) { if (activityState == null) { return; } - if (changeActivityState != null) { - changeActivityState.run(); - } Util.writeObject(activityState, adjustConfig.context, ACTIVITY_STATE_FILENAME, ACTIVITY_STATE_NAME); } } From 90abb2ee87461abfbfb2fb155a2eef7b254dffa0 Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 29 Jun 2017 13:18:56 +0200 Subject: [PATCH 005/146] Refac adjust instance logs --- .../java/com/adjust/sdk/AdjustInstance.java | 62 ++++++++++++------- 1 file changed, 38 insertions(+), 24 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 63d052601..61fe1b20a 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -34,32 +34,32 @@ public void onCreate(AdjustConfig adjustConfig) { } public void trackEvent(AdjustEvent event) { - if (!checkActivityHandler()) return; + if (!checkActivityHandler()) { return; } activityHandler.trackEvent(event); } public void onResume() { - if (!checkActivityHandler()) return; + if (!checkActivityHandler()) { return; } activityHandler.onResume(); } public void onPause() { - if (!checkActivityHandler()) return; + if (!checkActivityHandler()) { return; } activityHandler.onPause(); } public void setEnabled(boolean enabled) { - if (!checkActivityHandler()) return; + if (!checkActivityHandler()) { return; } activityHandler.setEnabled(enabled); } public boolean isEnabled() { - if (!checkActivityHandler()) return false; + if (!checkActivityHandler()) { return false; } return activityHandler.isEnabled(); } public void appWillOpenUrl(Uri url) { - if (!checkActivityHandler()) return; + if (!checkActivityHandler()) { return; } long clickTime = System.currentTimeMillis(); activityHandler.readOpenUrl(url, clickTime); } @@ -67,7 +67,7 @@ public void appWillOpenUrl(Uri url) { public void sendReferrer(String referrer) { long clickTime = System.currentTimeMillis(); // sendReferrer might be triggered before Adjust - if (activityHandler == null) { + if (!checkActivityHandler("referrer")) { // save it to inject in the config before launch this.referrer = referrer; this.referrerClickTime = clickTime; @@ -77,18 +77,17 @@ public void sendReferrer(String referrer) { } public void setOfflineMode(boolean enabled) { - if (!checkActivityHandler()) return; + if (!checkActivityHandler()) { return; } activityHandler.setOfflineMode(enabled); } - public void sendFirstPackages() { - if (!checkActivityHandler()) return; + if (!checkActivityHandler()) { return; } activityHandler.sendFirstPackages(); } public void addSessionCallbackParameter(final String key, final String value) { - if (activityHandler != null) { + if (checkActivityHandler("adding session callback parameter")) { activityHandler.addSessionCallbackParameter(key, value); return; } @@ -106,7 +105,7 @@ public void run(ActivityHandler activityHandler) { } public void addSessionPartnerParameter(final String key, final String value) { - if (activityHandler != null) { + if (checkActivityHandler("adding session partner parameter")) { activityHandler.addSessionPartnerParameter(key, value); return; } @@ -124,7 +123,7 @@ public void run(ActivityHandler activityHandler) { } public void removeSessionCallbackParameter(final String key) { - if (activityHandler != null) { + if (checkActivityHandler("removing session callback parameter")) { activityHandler.removeSessionCallbackParameter(key); return; } @@ -142,7 +141,7 @@ public void run(ActivityHandler activityHandler) { } public void removeSessionPartnerParameter(final String key) { - if (activityHandler != null) { + if (checkActivityHandler("removing session partner parameter")) { activityHandler.removeSessionPartnerParameter(key); return; } @@ -160,7 +159,7 @@ public void run(ActivityHandler activityHandler) { } public void resetSessionCallbackParameters() { - if (activityHandler != null) { + if (checkActivityHandler("resetting session callback parameters")) { activityHandler.resetSessionCallbackParameters(); return; } @@ -178,7 +177,7 @@ public void run(ActivityHandler activityHandler) { } public void resetSessionPartnerParameters() { - if (activityHandler != null) { + if (checkActivityHandler("resetting session partner parameters")) { activityHandler.resetSessionPartnerParameters(); return; } @@ -196,33 +195,48 @@ public void run(ActivityHandler activityHandler) { } public void teardown(boolean deleteState) { - if (!checkActivityHandler()) return; + if (!checkActivityHandler()) { return; } activityHandler.teardown(deleteState); activityHandler = null; } public void setPushToken(String token) { - pushToken = token; - - if (activityHandler != null) { + if (!checkActivityHandler("push token")) { + this.pushToken = token; + } else { activityHandler.setPushToken(token); - return; } } public String getAdid() { - if (!checkActivityHandler()) return null; + if (!checkActivityHandler()) { return null; } return activityHandler.getAdid(); } public AdjustAttribution getAttribution() { - if (!checkActivityHandler()) return null; + if (!checkActivityHandler()) { return null; } return activityHandler.getAttribution(); } private boolean checkActivityHandler() { + return checkActivityHandler(null); + } + + private boolean checkActivityHandler(boolean status, String trueMessage, String falseMessage) { + if (status) { + return checkActivityHandler(trueMessage); + } else { + return checkActivityHandler(falseMessage); + } + } + + private boolean checkActivityHandler(String savedForLaunchWarningSuffixMessage) { if (activityHandler == null) { - getLogger().error("Adjust not initialized correctly"); + if (savedForLaunchWarningSuffixMessage != null) { + getLogger().warn("Adjust not initialized, but %s saved for launch", savedForLaunchWarningSuffixMessage); + } else { + getLogger().error("Adjust not initialized correctly"); + } return false; } else { return true; From cdc0eedb0db860bf0453bcab3a791ce997c2c824 Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 29 Jun 2017 13:32:36 +0200 Subject: [PATCH 006/146] Inject enabled and disabled at start time --- .../java/com/adjust/sdk/ActivityHandler.java | 31 ++++++++++++------- .../java/com/adjust/sdk/AdjustConfig.java | 2 ++ .../java/com/adjust/sdk/AdjustInstance.java | 18 ++++++++--- 3 files changed, 35 insertions(+), 16 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 e7dc42f64..a81c66fca 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -181,7 +181,7 @@ private ActivityHandler(AdjustConfig adjustConfig) { // enabled by default internalState.enabled = true; // online by default - internalState.offline = false; + internalState.offline = adjustConfig.startOffline; // in the background by default internalState.background = true; // delay start not configured by default @@ -316,7 +316,7 @@ public void setEnabled(final boolean enabled) { scheduledExecutor.submit(new Runnable() { @Override public void run() { - setEnabledI(enabled); + setEnabledI(enabled, true); } }); } @@ -584,6 +584,10 @@ private void initI() { readSessionCallbackParametersI(adjustConfig.context); readSessionPartnerParametersI(adjustConfig.context); + if (adjustConfig.startEnabled != null) { + setEnabledI(adjustConfig.startEnabled, false); + } + if (activityState != null) { internalState.enabled = activityState.enabled; internalState.updatePackages = activityState.updatePackages; @@ -1030,7 +1034,7 @@ private void launchDeeplinkMain(Intent deeplinkIntent, Uri deeplink) { adjustConfig.context.startActivity(deeplinkIntent); } - private void setEnabledI(boolean enabled) { + private void setEnabledI(boolean enabled, boolean updateStatus) { // compare with the saved or internal state if (!hasChangedStateI(this.isEnabledI(), enabled, "Adjust already enabled", "Adjust already disabled")) { @@ -1041,21 +1045,24 @@ private void setEnabledI(boolean enabled) { internalState.enabled = enabled; if (activityState == null) { - updateStatusI(!enabled, - "Handlers will start as paused due to the SDK being disabled", - "Handlers will still start as paused", - "Handlers will start as active due to the SDK being enabled"); - + if (updateStatus) { + updateStatusI(!enabled, + "Handlers will start as paused due to the SDK being disabled", + "Handlers will still start as paused", + "Handlers will start as active due to the SDK being enabled"); + } return; } activityState.enabled = enabled; writeActivityStateI(); - updateStatusI(!enabled, - "Pausing handlers due to SDK being disabled", - "Handlers remain paused", - "Resuming handlers due to SDK being enabled"); + if (updateStatus) { + updateStatusI(!enabled, + "Pausing handlers due to SDK being disabled", + "Handlers remain paused", + "Resuming handlers due to SDK being enabled"); + } } 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 117d2f6e5..7c325f17a 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -31,6 +31,8 @@ public class AdjustConfig { ILogger logger; String userAgent; String pushToken; + Boolean startEnabled; + boolean startOffline; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; 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 61fe1b20a..20de5474f 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -14,6 +14,8 @@ public class AdjustInstance { private ActivityHandler activityHandler; private List sessionParametersActionsArray; private String pushToken; + private Boolean startEnabled = null; + private boolean startOffline = false; private static ILogger getLogger() { return AdjustFactory.getLogger(); @@ -29,6 +31,8 @@ public void onCreate(AdjustConfig adjustConfig) { adjustConfig.referrerClickTime = this.referrerClickTime; adjustConfig.sessionParametersActionsArray = sessionParametersActionsArray; adjustConfig.pushToken = pushToken; + adjustConfig.startEnabled = startEnabled; + adjustConfig.startOffline = startOffline; activityHandler = ActivityHandler.getInstance(adjustConfig); } @@ -49,8 +53,11 @@ public void onPause() { } public void setEnabled(boolean enabled) { - if (!checkActivityHandler()) { return; } - activityHandler.setEnabled(enabled); + if (!checkActivityHandler(enabled, "enabled mode", "disabled mode")){ + this.startEnabled = enabled; + } else { + activityHandler.setEnabled(enabled); + } } public boolean isEnabled() { @@ -77,8 +84,11 @@ public void sendReferrer(String referrer) { } public void setOfflineMode(boolean enabled) { - if (!checkActivityHandler()) { return; } - activityHandler.setOfflineMode(enabled); + if (!checkActivityHandler(enabled, "offline mode", "online mode")) { + this.startOffline = enabled; + } else { + activityHandler.setOfflineMode(enabled); + } } public void sendFirstPackages() { From 706e5be6e53d9f215095399d1dfa36b389e034de Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 29 Jun 2017 14:19:12 +0200 Subject: [PATCH 007/146] Block adding packages when disabled --- .../main/java/com/adjust/sdk/ActivityHandler.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 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 a81c66fca..b081b3248 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1137,6 +1137,8 @@ private void setAskingAttributionI(boolean askingAttribution) { } private void sendReferrerI(String referrer, long clickTime) { + if (!isEnabledI()) { return; } + if (referrer == null || referrer.length() == 0 ) { return; } @@ -1162,6 +1164,8 @@ private void sendReferrerI(String referrer, long clickTime) { } private void readOpenUrlI(Uri url, long clickTime) { + if (!isEnabledI()) { return; } + if (url == null) { return; } @@ -1596,13 +1600,11 @@ public void resetSessionPartnerParametersI() { } private void setPushTokenI(String token) { - if (token == null) { - return; - } + if (!checkActivityStateI(activityState)) { return; } + if (!isEnabledI()) { return; } - if (token.equals(activityState.pushToken)) { - return; - } + if (token == null) { return; } + if (token.equals(activityState.pushToken)) { return; } // save new push token activityState.pushToken = token; From 220dad599bd21e4bb69634a469cb8649dd400651 Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 29 Jun 2017 15:36:45 +0200 Subject: [PATCH 008/146] Don't track first session when disabled --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 b081b3248..0e01b79be 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -740,7 +740,11 @@ private void processSessionI() { activityState.sessionCount = 1; // this is the first session activityState.pushToken = adjustConfig.pushToken; - transferSessionPackageI(now); + // track the first session package only if it's enabled + if (internalState.isEnabled()) { + transferSessionPackageI(now); + } + activityState.resetSessionAttributes(now); activityState.enabled = internalState.isEnabled(); activityState.updatePackages = internalState.itHasToUpdatePackages(); From 1bc83ace39b5bd741c37a4d651a4d247478726b6 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 30 Jun 2017 14:33:48 +0200 Subject: [PATCH 009/146] Send non play ids only when play id is not present --- .../java/com/adjust/sdk/ActivityHandler.java | 3 +- .../main/java/com/adjust/sdk/DeviceInfo.java | 36 ++++++++++++------- .../java/com/adjust/sdk/PackageBuilder.java | 17 +++++---- 3 files changed, 34 insertions(+), 22 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 0e01b79be..08263b397 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -604,8 +604,7 @@ private void initI() { logger.info("Event buffering is enabled"); } - String playAdId = Util.getPlayAdId(adjustConfig.context); - if (playAdId == null) { + if (deviceInfo.playAdId == null) { logger.warn("Unable to get Google Play Services Advertising ID at start time"); if (deviceInfo.macSha1 == null && deviceInfo.macShortMd5 == null && diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java index 27f13dcb9..8654d11f5 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -28,6 +28,9 @@ * Created by pfms on 06/11/14. */ class DeviceInfo { + String playAdId; + Boolean isTrackingEnabled; + private boolean nonGoogleIdsRead = false; String macSha1; String macShortMd5; String androidId; @@ -62,10 +65,10 @@ class DeviceInfo { Configuration configuration = resources.getConfiguration(); Locale locale = Util.getLocale(configuration); int screenLayout = configuration.screenLayout; - boolean isGooglePlayServicesAvailable = Util.getPlayAdId(context) != null; - String macAddress = getMacAddress(context, isGooglePlayServicesAvailable); ContentResolver contentResolver = context.getContentResolver(); + reloadDeviceIds(context); + packageName = getPackageName(context); appVersion = getAppVersion(context); deviceType = getDeviceType(screenLayout); @@ -82,11 +85,8 @@ class DeviceInfo { displayWidth = getDisplayWidth(displayMetrics); displayHeight = getDisplayHeight(displayMetrics); clientSdk = getClientSdk(sdkPrefix); - androidId = getAndroidId(context, isGooglePlayServicesAvailable); fbAttributionId = getFacebookAttributionId(context); pluginKeys = Util.getPluginKeys(context); - macSha1 = getMacSha1(macAddress); - macShortMd5 = getMacShortMd5(macAddress); hardwareName = getHardwareName(); abi = getABI(); buildName = getBuildName(); @@ -95,6 +95,24 @@ class DeviceInfo { appUpdateTime = getAppUpdateTime(context); } + void reloadDeviceIds(Context context) { + isTrackingEnabled = Util.isPlayTrackingEnabled(context); + playAdId = Util.getPlayAdId(context); + + if (playAdId == null && !nonGoogleIdsRead) { + if (!Util.checkPermission(context, android.Manifest.permission.ACCESS_WIFI_STATE)) { + AdjustFactory.getLogger().warn("Missing permission: ACCESS_WIFI_STATE"); + } + String macAddress = Util.getMacAddress(context); + macSha1 = getMacSha1(macAddress); + macShortMd5 = getMacShortMd5(macAddress); + + androidId = Util.getAndroidId(context); + + nonGoogleIdsRead = true; + } + } + private String getMacAddress(Context context, boolean isGooglePlayServicesAvailable) { if (!isGooglePlayServicesAvailable) { if (!Util.checkPermission(context, android.Manifest.permission.ACCESS_WIFI_STATE)) { @@ -251,14 +269,6 @@ private String getMacShortMd5(String macAddress) { return macShortMd5; } - private String getAndroidId(Context context, boolean isGooglePlayServicesAvailable) { - if (!isGooglePlayServicesAvailable) { - return Util.getAndroidId(context); - } else { - return null; - } - } - private String getFacebookAttributionId(final Context context) { try { final ContentResolver contentResolver = context.getContentResolver(); 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 cc3ae2a7a..f8e6cd81a 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -233,9 +233,16 @@ private void injectDeviceInfo(Map parameters) { } private void injectDeviceInfoIds(Map parameters) { - PackageBuilder.addString(parameters, "mac_sha1", deviceInfo.macSha1); - PackageBuilder.addString(parameters, "mac_md5", deviceInfo.macShortMd5); - PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); + deviceInfo.reloadDeviceIds(adjustConfig.context); + + PackageBuilder.addBoolean(parameters, "tracking_enabled", deviceInfo.isTrackingEnabled); + PackageBuilder.addString(parameters, "gps_adid", deviceInfo.playAdId); + + if (deviceInfo.playAdId == null) { + PackageBuilder.addString(parameters, "mac_sha1", deviceInfo.macSha1); + PackageBuilder.addString(parameters, "mac_md5", deviceInfo.macShortMd5); + PackageBuilder.addString(parameters, "android_id", deviceInfo.androidId); + } } private void injectConfig(Map parameters) { @@ -244,10 +251,6 @@ private void injectConfig(Map parameters) { PackageBuilder.addBoolean(parameters, "device_known", adjustConfig.deviceKnown); PackageBuilder.addBoolean(parameters, "needs_response_details", true); - String playAdId = Util.getPlayAdId(adjustConfig.context); - PackageBuilder.addString(parameters, "gps_adid", playAdId); - Boolean isTrackingEnabled = Util.isPlayTrackingEnabled(adjustConfig.context); - PackageBuilder.addBoolean(parameters, "tracking_enabled", isTrackingEnabled); PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); ContentResolver contentResolver = adjustConfig.context.getContentResolver(); From bbc776f13c5da0992b07de44af2fe1191985e3ad Mon Sep 17 00:00:00 2001 From: nonelse Date: Mon, 3 Jul 2017 16:23:51 +0200 Subject: [PATCH 010/146] Inject early disable into action array --- .../java/com/adjust/sdk/ActivityHandler.java | 46 ++++++++++--------- .../java/com/adjust/sdk/AdjustConfig.java | 2 +- .../java/com/adjust/sdk/AdjustInstance.java | 40 ++++++++-------- .../com/adjust/sdk/TestActivityHandler.java | 8 ++-- 4 files changed, 50 insertions(+), 46 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 08263b397..5cf84bfa8 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -19,6 +19,7 @@ import android.os.Handler; import java.io.InputStream; +import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -316,7 +317,7 @@ public void setEnabled(final boolean enabled) { scheduledExecutor.submit(new Runnable() { @Override public void run() { - setEnabledI(enabled, true); + setEnabledI(enabled); } }); } @@ -585,7 +586,15 @@ private void initI() { readSessionPartnerParametersI(adjustConfig.context); if (adjustConfig.startEnabled != null) { - setEnabledI(adjustConfig.startEnabled, false); + if (adjustConfig.preLaunchActionsArray == null) { + adjustConfig.preLaunchActionsArray = new ArrayList(); + } + adjustConfig.preLaunchActionsArray.add(new IRunActivityHandler() { + @Override + public void run(ActivityHandler activityHandler) { + activityHandler.setEnabledI(adjustConfig.startEnabled); + } + }); } if (activityState != null) { @@ -682,7 +691,7 @@ public void run() { sendReferrerI(adjustConfig.referrer, adjustConfig.referrerClickTime); } - sessionParametersActionsI(adjustConfig.sessionParametersActionsArray); + preLaunchActionsI(adjustConfig.preLaunchActionsArray); } private void readConfigFile(Context context) { @@ -706,13 +715,13 @@ private void readConfigFile(Context context) { } } - private void sessionParametersActionsI(List sessionParametersActionsArray) { - if (sessionParametersActionsArray == null) { + private void preLaunchActionsI(List preLaunchActionsArray) { + if (preLaunchActionsArray == null) { return; } - for (IRunActivityHandler sessionParametersAction : sessionParametersActionsArray) { - sessionParametersAction.run(this); + for (IRunActivityHandler preLaunchAction : preLaunchActionsArray) { + preLaunchAction.run(this); } } @@ -1037,7 +1046,7 @@ private void launchDeeplinkMain(Intent deeplinkIntent, Uri deeplink) { adjustConfig.context.startActivity(deeplinkIntent); } - private void setEnabledI(boolean enabled, boolean updateStatus) { + private void setEnabledI(boolean enabled) { // compare with the saved or internal state if (!hasChangedStateI(this.isEnabledI(), enabled, "Adjust already enabled", "Adjust already disabled")) { @@ -1048,25 +1057,20 @@ private void setEnabledI(boolean enabled, boolean updateStatus) { internalState.enabled = enabled; if (activityState == null) { - if (updateStatus) { - updateStatusI(!enabled, - "Handlers will start as paused due to the SDK being disabled", - "Handlers will still start as paused", - "Handlers will start as active due to the SDK being enabled"); - } + updateStatusI(!enabled, + "Handlers will start as paused due to the SDK being disabled", + "Handlers will still start as paused", + "Handlers will start as active due to the SDK being enabled"); return; } activityState.enabled = enabled; writeActivityStateI(); - if (updateStatus) { - updateStatusI(!enabled, - "Pausing handlers due to SDK being disabled", - "Handlers remain paused", - "Resuming handlers due to SDK being enabled"); - } - + updateStatusI(!enabled, + "Pausing handlers due to SDK being disabled", + "Handlers remain paused", + "Resuming handlers due to SDK being enabled"); } private void setOfflineModeI(boolean offline) { 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 7c325f17a..60804e324 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -27,7 +27,7 @@ public class AdjustConfig { OnDeeplinkResponseListener onDeeplinkResponseListener; boolean sendInBackground; Double delayStart; - List sessionParametersActionsArray; + List preLaunchActionsArray; ILogger logger; String userAgent; String pushToken; 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 20de5474f..e86e19afe 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -12,7 +12,7 @@ public class AdjustInstance { private String referrer; private long referrerClickTime; private ActivityHandler activityHandler; - private List sessionParametersActionsArray; + private List preLaunchActionsArray; private String pushToken; private Boolean startEnabled = null; private boolean startOffline = false; @@ -29,7 +29,7 @@ public void onCreate(AdjustConfig adjustConfig) { adjustConfig.referrer = this.referrer; adjustConfig.referrerClickTime = this.referrerClickTime; - adjustConfig.sessionParametersActionsArray = sessionParametersActionsArray; + adjustConfig.preLaunchActionsArray = preLaunchActionsArray; adjustConfig.pushToken = pushToken; adjustConfig.startEnabled = startEnabled; adjustConfig.startOffline = startOffline; @@ -102,11 +102,11 @@ public void addSessionCallbackParameter(final String key, final String value) { return; } - if (sessionParametersActionsArray == null) { - sessionParametersActionsArray = new ArrayList(); + if (preLaunchActionsArray == null) { + preLaunchActionsArray = new ArrayList(); } - sessionParametersActionsArray.add(new IRunActivityHandler() { + preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(ActivityHandler activityHandler) { activityHandler.addSessionCallbackParameterI(key, value); @@ -120,11 +120,11 @@ public void addSessionPartnerParameter(final String key, final String value) { return; } - if (sessionParametersActionsArray == null) { - sessionParametersActionsArray = new ArrayList(); + if (preLaunchActionsArray == null) { + preLaunchActionsArray = new ArrayList(); } - sessionParametersActionsArray.add(new IRunActivityHandler() { + preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(ActivityHandler activityHandler) { activityHandler.addSessionPartnerParameterI(key, value); @@ -138,11 +138,11 @@ public void removeSessionCallbackParameter(final String key) { return; } - if (sessionParametersActionsArray == null) { - sessionParametersActionsArray = new ArrayList(); + if (preLaunchActionsArray == null) { + preLaunchActionsArray = new ArrayList(); } - sessionParametersActionsArray.add(new IRunActivityHandler() { + preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(ActivityHandler activityHandler) { activityHandler.removeSessionCallbackParameterI(key); @@ -156,11 +156,11 @@ public void removeSessionPartnerParameter(final String key) { return; } - if (sessionParametersActionsArray == null) { - sessionParametersActionsArray = new ArrayList(); + if (preLaunchActionsArray == null) { + preLaunchActionsArray = new ArrayList(); } - sessionParametersActionsArray.add(new IRunActivityHandler() { + preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(ActivityHandler activityHandler) { activityHandler.removeSessionPartnerParameterI(key); @@ -174,11 +174,11 @@ public void resetSessionCallbackParameters() { return; } - if (sessionParametersActionsArray == null) { - sessionParametersActionsArray = new ArrayList(); + if (preLaunchActionsArray == null) { + preLaunchActionsArray = new ArrayList(); } - sessionParametersActionsArray.add(new IRunActivityHandler() { + preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(ActivityHandler activityHandler) { activityHandler.resetSessionCallbackParametersI(); @@ -192,11 +192,11 @@ public void resetSessionPartnerParameters() { return; } - if (sessionParametersActionsArray == null) { - sessionParametersActionsArray = new ArrayList(); + if (preLaunchActionsArray == null) { + preLaunchActionsArray = new ArrayList(); } - sessionParametersActionsArray.add(new IRunActivityHandler() { + preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(ActivityHandler activityHandler) { activityHandler.resetSessionPartnerParametersI(); diff --git a/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java b/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java index 50ede6dd5..5e2c1c42c 100644 --- a/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java +++ b/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java @@ -2287,8 +2287,8 @@ public void testSessionParameters() { AdjustConfig config = getConfig(); // create handler and start the first session - config.sessionParametersActionsArray = new ArrayList(); - config.sessionParametersActionsArray.add(new IRunActivityHandler() { + config.preLaunchActionsArray = new ArrayList(); + config.preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(ActivityHandler activityHandler) { // @@ -2489,8 +2489,8 @@ public void testDelayStartTimerFirst() { config.setDelayStart(4); - config.sessionParametersActionsArray = new ArrayList(); - config.sessionParametersActionsArray.add(new IRunActivityHandler() { + config.preLaunchActionsArray = new ArrayList(); + config.preLaunchActionsArray.add(new IRunActivityHandler() { @Override public void run(ActivityHandler activityHandler) { activityHandler.addSessionCallbackParameterI("scpKey", "scpValue"); From c12cdf7e839b53e6566c441d6e660fd2aae2ea0d Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 4 Jul 2017 15:33:07 +0200 Subject: [PATCH 011/146] Save referrer in preferences --- .../java/com/adjust/sdk/ActivityHandler.java | 38 +++++++++++++++++-- .../src/main/java/com/adjust/sdk/Adjust.java | 4 +- .../java/com/adjust/sdk/AdjustConfig.java | 2 - .../java/com/adjust/sdk/AdjustInstance.java | 16 ++++---- .../adjust/sdk/AdjustReferrerReceiver.java | 2 +- .../main/java/com/adjust/sdk/Constants.java | 4 ++ 6 files changed, 49 insertions(+), 17 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 5cf84bfa8..df6e5bdbd 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -12,6 +12,7 @@ import android.app.ActivityManager; import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; @@ -163,6 +164,10 @@ public boolean isFirstLaunch() { return firstLaunch; } + public boolean isNotFirstLaunch() { + return !firstLaunch; + } + public boolean hasSessionResponseNotBeenProcessed() { return !sessionResponseProcessed; } @@ -687,11 +692,13 @@ public void run() { updatePackagesI(); } - if (adjustConfig.referrer != null) { - sendReferrerI(adjustConfig.referrer, adjustConfig.referrerClickTime); - } - preLaunchActionsI(adjustConfig.preLaunchActionsArray); + + // only try to read referrer from init after first launch with success + if (internalState.isNotFirstLaunch()) + { + checkReferrerI(); + } } private void readConfigFile(Context context) { @@ -739,6 +746,26 @@ private void startI() { checkAttributionStateI(); } + private void checkReferrerI() { + // read preferences + SharedPreferences settings = adjustConfig.context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); + String referrer = settings.getString(Constants.REFERRER_PREFKEY, null); + + if (referrer == null) { + return; + } + + long clickTime = settings.getLong(Constants.REFERRER_CLICKTIME_PREFKEY, -1); + + // send referrer + sendReferrerI(referrer, clickTime); + + // delete from preferences + SharedPreferences.Editor editor = settings.edit(); + editor.remove(Constants.REFERRER_PREFKEY); + editor.remove(Constants.REFERRER_CLICKTIME_PREFKEY); + } + private void processSessionI() { long now = System.currentTimeMillis(); @@ -757,6 +784,9 @@ private void processSessionI() { activityState.enabled = internalState.isEnabled(); activityState.updatePackages = internalState.itHasToUpdatePackages(); writeActivityStateI(); + + // check referrer after first launch with success + checkReferrerI(); return; } 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 de9e66ef9..508739c9c 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java @@ -66,9 +66,9 @@ public static void appWillOpenUrl(Uri url) { adjustInstance.appWillOpenUrl(url); } - public static void setReferrer(String referrer) { + public static void setReferrer(String referrer, Context context) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.sendReferrer(referrer); + adjustInstance.sendReferrer(referrer, context); } public static void setOfflineMode(boolean enabled) { 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 60804e324..3d85db767 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -16,8 +16,6 @@ public class AdjustConfig { boolean eventBufferingEnabled; String defaultTracker; OnAttributionChangedListener onAttributionChangedListener; - String referrer; - long referrerClickTime; Boolean deviceKnown; Class deepLinkComponent; OnEventTrackingSucceededListener onEventTrackingSucceededListener; 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 e86e19afe..5703ae73b 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -1,5 +1,7 @@ package com.adjust.sdk; +import android.content.Context; +import android.content.SharedPreferences; import android.net.Uri; import java.util.ArrayList; @@ -9,8 +11,6 @@ * Created by pfms on 04/12/14. */ public class AdjustInstance { - private String referrer; - private long referrerClickTime; private ActivityHandler activityHandler; private List preLaunchActionsArray; private String pushToken; @@ -27,8 +27,6 @@ public void onCreate(AdjustConfig adjustConfig) { return; } - adjustConfig.referrer = this.referrer; - adjustConfig.referrerClickTime = this.referrerClickTime; adjustConfig.preLaunchActionsArray = preLaunchActionsArray; adjustConfig.pushToken = pushToken; adjustConfig.startEnabled = startEnabled; @@ -71,13 +69,15 @@ public void appWillOpenUrl(Uri url) { activityHandler.readOpenUrl(url, clickTime); } - public void sendReferrer(String referrer) { + public void sendReferrer(String referrer, Context context) { long clickTime = System.currentTimeMillis(); // sendReferrer might be triggered before Adjust if (!checkActivityHandler("referrer")) { - // save it to inject in the config before launch - this.referrer = referrer; - this.referrerClickTime = clickTime; + // save referrer to preferences + SharedPreferences settings = context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.putString(Constants.REFERRER_PREFKEY, referrer); + editor.putLong(Constants.REFERRER_CLICKTIME_PREFKEY, clickTime); } else { activityHandler.sendReferrer(referrer, clickTime); } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java index cfeecd8d0..313640321 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java @@ -30,6 +30,6 @@ public void onReceive(Context context, Intent intent) { } AdjustInstance adjust = Adjust.getDefaultInstance(); - adjust.sendReferrer(referrer); + adjust.sendReferrer(referrer, context); } } 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 aec385baa..7bd6e778b 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java @@ -59,6 +59,10 @@ public interface Constants { String CALLBACK_PARAMETERS = "callback_params"; String PARTNER_PARAMETERS = "partner_params"; + String PREFERENCES_NAME = "Adjust"; + String REFERRER_PREFKEY = "referrer"; + String REFERRER_CLICKTIME_PREFKEY = "referrerClickTime"; + // List of known plugins, possibly not active List PLUGINS = Arrays.asList(); } From a1936fb2ea4e812856126d1a4c4c9111435b720e Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 4 Jul 2017 16:44:47 +0200 Subject: [PATCH 012/146] Update tests --- .../com/adjust/sdk/TestActivityHandler.java | 82 ++++++++++++------- 1 file changed, 51 insertions(+), 31 deletions(-) diff --git a/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java b/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java index 5e2c1c42c..63171b854 100644 --- a/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java +++ b/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java @@ -1,6 +1,7 @@ package com.adjust.sdk; import android.content.Context; +import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.Uri; import android.os.SystemClock; @@ -75,6 +76,8 @@ public void tearDown() { AdjustFactory.setSessionInterval(-1); AdjustFactory.setSubsessionInterval(-1); + context.deleteSharedPreferences("Adjust"); + activity = null; context = null; } @@ -676,23 +679,23 @@ public void testDisable() { // disable sdk activityHandler.setEnabled(false); + SystemClock.sleep(1000); + // check that it is disabled assertUtil.isFalse(activityHandler.isEnabled()); - SystemClock.sleep(1500); - // not writing activity state because it set enable does not start the sdk assertUtil.notInDebug("Wrote Activity state"); - // check if message the disable of the SDK - assertUtil.info("Handlers will start as paused due to the SDK being disabled"); - StateActivityHandlerInit stateActivityHandlerInit = new StateActivityHandlerInit(activityHandler); stateActivityHandlerInit.startsSending = false; stateActivityHandlerInit.startEnabled = false; checkInitTests(stateActivityHandlerInit); + // check if message the disable of the SDK + assertUtil.info("Handlers will start as paused due to the SDK being disabled"); + checkHandlerStatus(true); // start the sdk @@ -704,11 +707,11 @@ public void testDisable() { SystemClock.sleep(1500); // check initial created session - StateSession sessionStartsPaused = new StateSession(StateSession.SessionType.NEW_SESSION); - sessionStartsPaused.toSend = false; - sessionStartsPaused.foregroundTimerStarts = false; + StateSession initialSessionDisabled = new StateSession(StateSession.SessionType.DISABLED); + initialSessionDisabled.toSend = false; + initialSessionDisabled.foregroundTimerStarts = false; - checkStartInternal(sessionStartsPaused); + checkStartInternal(initialSessionDisabled); // and failed event StateEvent stateFailedEvent = new StateEvent(); @@ -741,17 +744,17 @@ public void testDisable() { checkStartInternal(sessionDisabled); // only the first session package should be sent - assertUtil.isEqual(1, mockPackageHandler.queue.size()); + assertUtil.isEqual(0, mockPackageHandler.queue.size()); // put in offline mode activityHandler.setOfflineMode(true); - // pausing due to offline mode - assertUtil.info("Pausing handlers to put SDK offline mode"); - // wait to update status SystemClock.sleep(1500); + // pausing due to offline mode + assertUtil.info("Pausing handlers to put SDK offline mode"); + // after pausing, even when it's already paused // tries to update the status checkHandlerStatus(true); @@ -759,6 +762,9 @@ public void testDisable() { // re-enable the SDK activityHandler.setEnabled(true); + // wait to update status + SystemClock.sleep(1500); + // check that it is enabled assertUtil.isTrue(activityHandler.isEnabled()); @@ -794,9 +800,9 @@ public void testDisable() { checkEvent(stateEvent); // it should have the second session and the event - assertUtil.isEqual(3, mockPackageHandler.queue.size()); + assertUtil.isEqual(2, mockPackageHandler.queue.size()); - ActivityPackage secondSessionPackage = mockPackageHandler.queue.get(1); + ActivityPackage secondSessionPackage = mockPackageHandler.queue.get(0); // create activity package test TestActivityPackage testSecondSessionPackage = new TestActivityPackage(secondSessionPackage); @@ -807,7 +813,7 @@ public void testDisable() { // test second session testSecondSessionPackage.testSessionPackage(2); - ActivityPackage eventPackage = mockPackageHandler.queue.get(2); + ActivityPackage eventPackage = mockPackageHandler.queue.get(1); // create activity package test TestActivityPackage testEventPackage = new TestActivityPackage(eventPackage); @@ -827,6 +833,8 @@ public void testDisable() { // put in online mode activityHandler.setOfflineMode(false); + SystemClock.sleep(1500); + // message that is finally resuming assertUtil.info("Resuming handlers to put SDK in online mode"); @@ -1609,6 +1617,8 @@ public void testOfflineMode() { // put SDK offline activityHandler.setOfflineMode(true); + SystemClock.sleep(1000); + ActivityHandler.InternalState internalState = activityHandler.getInternalState(); // check if it's offline before the sdk starts @@ -1619,12 +1629,12 @@ public void testOfflineMode() { // not writing activity state because it set enable does not start the sdk assertUtil.notInDebug("Wrote Activity state"); - // check if message the disable of the SDK - assertUtil.info("Handlers will start paused due to SDK being offline"); - // test init values checkInitTests(activityHandler); + // check if message the disable of the SDK + assertUtil.info("Handlers will start paused due to SDK being offline"); + // check change from set offline mode checkHandlerStatus(true); @@ -1654,6 +1664,8 @@ public void testOfflineMode() { // disable the SDK in the background activityHandler.setEnabled(false); + SystemClock.sleep(1000); + // check that it is disabled assertUtil.isFalse(activityHandler.isEnabled()); @@ -1685,10 +1697,10 @@ public void testOfflineMode() { // put SDK back online activityHandler.setOfflineMode(false); - assertUtil.info("Handlers remain paused"); - SystemClock.sleep(1500); + assertUtil.info("Handlers remain paused"); + // test the update status, still paused checkHandlerStatus(true); @@ -1719,6 +1731,8 @@ public void testOfflineMode() { // enable the SDK again activityHandler.setEnabled(true); + SystemClock.sleep(1000); + // check that is enabled assertUtil.isTrue(activityHandler.isEnabled()); @@ -1753,8 +1767,12 @@ public void testSendReferrer() { String referrerBeforeLaunch = "referrerBeforeLaunch"; - config.referrer = referrerBeforeLaunch; - config.referrerClickTime = now; + SharedPreferences settings = context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.putString(Constants.REFERRER_PREFKEY, referrerBeforeLaunch); + editor.putLong(Constants.REFERRER_CLICKTIME_PREFKEY, now); + editor.apply(); + // start activity handler with config ActivityHandler activityHandler = getActivityHandler(config); @@ -1762,7 +1780,7 @@ public void testSendReferrer() { // test init values StateActivityHandlerInit stateActivityHandlerInit = new StateActivityHandlerInit(activityHandler); - stateActivityHandlerInit.sendReferrer = referrerBeforeLaunch; + //stateActivityHandlerInit.sendReferrer = referrerBeforeLaunch; checkInitTests(stateActivityHandlerInit); resumeActivity(activityHandler); @@ -1814,9 +1832,6 @@ public void testSendReferrer() { assertUtil.verbose("Referrer to parse (%s)", incomplete); assertUtil.test("SdkClickHandler sendSdkClick"); - // check that it did not send any other click package - assertUtil.notInTest("SdkClickHandler sendSdkClick"); - // 7 click assertUtil.isEqual(8, mockSdkClickHandler.queue.size()); @@ -1826,7 +1841,7 @@ public void testSendReferrer() { referrerBeforeLaunchTest.referrer = referrerBeforeLaunch; - referrerBeforeLaunchTest.testClickPackage("reftag", false); + referrerBeforeLaunchTest.testClickPackage("reftag", true); ActivityPackage reftagClickPackage = mockSdkClickHandler.queue.get(1); @@ -2222,6 +2237,8 @@ public void testSendBackground() { // disable and enable the sdk while in the background activityHandler.setEnabled(false); + SystemClock.sleep(1000); + // check that it is disabled assertUtil.isFalse(activityHandler.isEnabled()); @@ -2235,6 +2252,8 @@ public void testSendBackground() { activityHandler.setEnabled(true); + SystemClock.sleep(1000); + // check that it is enabled assertUtil.isTrue(activityHandler.isEnabled()); @@ -2250,6 +2269,8 @@ public void testSendBackground() { // set offline and online the sdk while in the background activityHandler.setOfflineMode(true); + SystemClock.sleep(1000); + ActivityHandler.InternalState internalState = activityHandler.getInternalState(); // check that it is offline @@ -2265,6 +2286,8 @@ public void testSendBackground() { activityHandler.setOfflineMode(false); + SystemClock.sleep(1000); + // check that it is online assertUtil.isTrue(internalState.isOnline()); @@ -3175,8 +3198,6 @@ private void checkStartInternal(StateSession stateSession) assertUtil.notInVerbose("Started subsession "); assertUtil.notInVerbose("Time span since last activity too short for a new subsession"); assertUtil.notInError("Time travel!"); - // does not writes activity state - assertUtil.notInDebug("Wrote Activity state: "); break; } @@ -3293,7 +3314,6 @@ private void checkEvent(StateEvent stateEvent) { assertUtil.notInTest("PackageHandler addPackage"); assertUtil.notInInfo("Buffered event "); assertUtil.notInTest("PackageHandler sendFirstPackage"); - assertUtil.notInDebug("Wrote Activity state"); return; } if (stateEvent.duplicatedOrderId) { From 5fc6af0c1dd7d2350608fcef81e2b52c320ddc46 Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 4 Jul 2017 17:01:39 +0200 Subject: [PATCH 013/146] Save preference editor changes --- Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java | 1 + Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java | 1 + 2 files changed, 2 insertions(+) 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 df6e5bdbd..e345507f0 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -764,6 +764,7 @@ private void checkReferrerI() { SharedPreferences.Editor editor = settings.edit(); editor.remove(Constants.REFERRER_PREFKEY); editor.remove(Constants.REFERRER_CLICKTIME_PREFKEY); + editor.apply(); } private void processSessionI() { 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 5703ae73b..76378e98a 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -78,6 +78,7 @@ public void sendReferrer(String referrer, Context context) { SharedPreferences.Editor editor = settings.edit(); editor.putString(Constants.REFERRER_PREFKEY, referrer); editor.putLong(Constants.REFERRER_CLICKTIME_PREFKEY, clickTime); + editor.apply(); } else { activityHandler.sendReferrer(referrer, clickTime); } From 17dd7c15d66c97f72a09c00e520a858543b71e2d Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 4 Jul 2017 17:48:34 +0200 Subject: [PATCH 014/146] Add changelog --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 002a87b5a..986f59464 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +### Version 4.11.5 (Xth July 2017) +#### Added +- Don't send `sdk_click` and `sdk_info` packages when disabled + +#### Changed +- Setting enable/disable or offline/online is now queued +- Guarantee that first package is send even with buffering +- Disable before starting the sdk does not create and send first session package +- Reload reading device ids for every package, not just at beginning +- Save referrer in local storage and send it only after first session + +--- ### Version 4.11.4 (5th May 2017) #### Added - Added check if `sdk_click` package response contains attribution information. From f198e01d487b2d6c82a2de4f91779e7b4a6d81fa Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 4 Jul 2017 17:52:29 +0200 Subject: [PATCH 015/146] New version v4.11.5 --- Adjust/adjust/build.gradle | 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 +- README.md | 2 +- 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 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Adjust/adjust/build.gradle b/Adjust/adjust/build.gradle index 56584eba5..3d002eb03 100644 --- a/Adjust/adjust/build.gradle +++ b/Adjust/adjust/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.library' def getVersionName() { - return "4.11.4" + return "4.11.5" } android { 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 7bd6e778b..e48258f2d 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java @@ -29,7 +29,7 @@ public interface Constants { String BASE_URL = "https://app.adjust.com"; String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android4.11.4"; + String CLIENT_SDK = "android4.11.5"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String DEEPLINK = "deeplink"; diff --git a/Adjust/example/build.gradle b/Adjust/example/build.gradle index 70a26a402..2739992b0 100644 --- a/Adjust/example/build.gradle +++ b/Adjust/example/build.gradle @@ -28,7 +28,7 @@ dependencies { // running mvn package //compile fileTree(dir: '../target', include: ['*.jar']) // using maven repository - //compile 'com.adjust.sdk:adjust-android:4.11.4' + //compile 'com.adjust.sdk:adjust-android:4.11.5' debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5' diff --git a/Adjust/pom.xml b/Adjust/pom.xml index b87291699..ccd7242de 100644 --- a/Adjust/pom.xml +++ b/Adjust/pom.xml @@ -5,7 +5,7 @@ 4.0.0 adjust-android com.adjust.sdk - 4.11.4 + 4.11.5 jar Adjust Android SDK https://github.com/adjust/android_sdk diff --git a/Adjust/pom_criteo.xml b/Adjust/pom_criteo.xml index a977fb8cc..3fac0f5b9 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.11.4 + 4.11.5 jar Adjust Android SDK https://github.com/adjust/android_sdk diff --git a/Adjust/pom_sociomantic.xml b/Adjust/pom_sociomantic.xml index cf428cd46..27dbd2ff6 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.11.4 + 4.11.5 jar Adjust Android SDK https://github.com/adjust/android_sdk diff --git a/Adjust/pom_trademob.xml b/Adjust/pom_trademob.xml index 6d0c71603..eb6340bdb 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.11.4 + 4.11.5 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 0094e2704..5a2f41759 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.11.4"; + clientSdk = "android4.11.5"; suffix = ""; attribution = new AdjustAttribution(); playServices = true; diff --git a/README.md b/README.md index a4f6bd72d..7e43551d7 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ compile project(":adjust") If you are using Maven, add this line instead: ``` -compile 'com.adjust.sdk:adjust-android:4.11.4' +compile 'com.adjust.sdk:adjust-android:4.11.5' ``` ### Add Google Play Services diff --git a/VERSION b/VERSION index 0ce5c18e9..ad2c17edd 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.11.4 +4.11.5 diff --git a/doc/english/criteo_plugin.md b/doc/english/criteo_plugin.md index f2f9c69ae..ecba19142 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.11.4' +compile 'com.adjust.sdk:adjust-android-criteo:4.11.5' ``` Or integrate adjust with Criteo events by following these steps: diff --git a/doc/english/migrate.md b/doc/english/migrate.md index dde67f90a..f7a6e1694 100644 --- a/doc/english/migrate.md +++ b/doc/english/migrate.md @@ -1,4 +1,4 @@ -## Migrate your adjust SDK for Android to 4.11.4 from 3.6.2 +## Migrate your adjust SDK for Android to 4.11.5 from 3.6.2 ### The Application class diff --git a/doc/english/sociomantic_plugin.md b/doc/english/sociomantic_plugin.md index cc3e85fc8..e65afd885 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.11.4' +compile 'com.adjust.sdk:adjust-android-sociomantic:4.11.5' ``` 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 f39815025..8c1d7018a 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.11.4' +compile 'com.adjust.sdk:adjust-android-trademob:4.11.5' ``` Or integrate adjust with Trademob events by following these steps: From 74fea62a1e2a484673bbf1092fe01f59bd77f734 Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 4 Jul 2017 18:56:57 +0200 Subject: [PATCH 016/146] Add teardown of shared preferences --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 7 +++++++ .../java/com/adjust/sdk/TestActivityHandler.java | 5 ++++- 2 files changed, 11 insertions(+), 1 deletion(-) 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 e345507f0..bc3c9804b 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -101,6 +101,13 @@ public void teardown(boolean deleteState) { teardownAttributionS(deleteState); teardownAllSessionParametersS(deleteState); + if (deleteState) { + SharedPreferences settings = adjustConfig.context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.clear(); + editor.apply(); + } + packageHandler = null; logger = null; foregroundTimer = null; diff --git a/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java b/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java index 63171b854..a15daf343 100644 --- a/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java +++ b/Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java @@ -76,7 +76,10 @@ public void tearDown() { AdjustFactory.setSessionInterval(-1); AdjustFactory.setSubsessionInterval(-1); - context.deleteSharedPreferences("Adjust"); + SharedPreferences settings = context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.clear(); + editor.apply(); activity = null; context = null; From eb54416bffad2c161c8e109f5481f12f84f02e57 Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 4 Jul 2017 19:30:01 +0200 Subject: [PATCH 017/146] Remove saved referrer from click handler --- .../java/com/adjust/sdk/ActivityHandler.java | 2 +- .../java/com/adjust/sdk/AdjustInstance.java | 17 +++++----- .../java/com/adjust/sdk/SdkClickHandler.java | 32 +++++++++++++++++++ 3 files changed, 41 insertions(+), 10 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 bc3c9804b..fe3e633ac 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -57,7 +57,7 @@ public class ActivityHandler implements IActivityHandler { private InternalState internalState; private DeviceInfo deviceInfo; - private AdjustConfig adjustConfig; // always valid after construction + AdjustConfig adjustConfig; // always valid after construction private AdjustAttribution attribution; private IAttributionHandler attributionHandler; private ISdkClickHandler sdkClickHandler; 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 76378e98a..6f5839a8b 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -71,15 +71,14 @@ public void appWillOpenUrl(Uri url) { public void sendReferrer(String referrer, Context context) { long clickTime = System.currentTimeMillis(); - // sendReferrer might be triggered before Adjust - if (!checkActivityHandler("referrer")) { - // save referrer to preferences - SharedPreferences settings = context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = settings.edit(); - editor.putString(Constants.REFERRER_PREFKEY, referrer); - editor.putLong(Constants.REFERRER_CLICKTIME_PREFKEY, clickTime); - editor.apply(); - } else { + // save referrer to preferences + SharedPreferences settings = context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.putString(Constants.REFERRER_PREFKEY, referrer); + editor.putLong(Constants.REFERRER_CLICKTIME_PREFKEY, clickTime); + editor.apply(); + + if (checkActivityHandler("referrer")) { activityHandler.sendReferrer(referrer, clickTime); } } 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 7b4f635ce..6b6e1cbab 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -1,5 +1,8 @@ package com.adjust.sdk; +import android.content.Context; +import android.content.SharedPreferences; + import java.io.IOException; import java.io.UnsupportedEncodingException; import java.lang.ref.WeakReference; @@ -139,6 +142,8 @@ private void sendSdkClickI(ActivityPackage sdkClickPackage) { return; } + deleteSavedReferrerI((ActivityHandler) activityHandler, sdkClickPackage); + activityHandler.finishedTrackingActivity(responseData); } catch (UnsupportedEncodingException e) { @@ -154,6 +159,33 @@ private void sendSdkClickI(ActivityPackage sdkClickPackage) { } } + private void deleteSavedReferrerI(ActivityHandler activityHandler, ActivityPackage sdkClickPackage) { + // extract sent referrer + String sentReferrer = sdkClickPackage.getParameters().get("referrer"); + if (sentReferrer == null) { + return; + } + + // read saved referrer + SharedPreferences settings = activityHandler.adjustConfig.context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); + String savedReferrer = settings.getString(Constants.REFERRER_PREFKEY, null); + + if (savedReferrer == null) { + return; + } + + // check if they are the same + if (!sentReferrer.equals(savedReferrer)) { + return; + } + + // delete referrer from preferences + SharedPreferences.Editor editor = settings.edit(); + editor.remove(Constants.REFERRER_PREFKEY); + editor.remove(Constants.REFERRER_CLICKTIME_PREFKEY); + editor.apply(); + } + private void retrySendingI(ActivityPackage sdkClickPackage) { int retries = sdkClickPackage.increaseRetries(); From d12cc2bcb5092b4c3533c4552667d070c7f39468 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 5 Jul 2017 10:08:40 +0200 Subject: [PATCH 018/146] Remove delete saved referrer after checking --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 6 ------ 1 file changed, 6 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 fe3e633ac..6e732e3f8 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -766,12 +766,6 @@ private void checkReferrerI() { // send referrer sendReferrerI(referrer, clickTime); - - // delete from preferences - SharedPreferences.Editor editor = settings.edit(); - editor.remove(Constants.REFERRER_PREFKEY); - editor.remove(Constants.REFERRER_CLICKTIME_PREFKEY); - editor.apply(); } private void processSessionI() { From 7fccfaf941ae0709c0b35f27daba1eedad240ce5 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 7 Jul 2017 17:45:58 +0100 Subject: [PATCH 019/146] Adding shared preferences manager class --- .../adjust/sdk/SharedPreferencesManager.java | 116 ++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java new file mode 100644 index 000000000..87621718c --- /dev/null +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -0,0 +1,116 @@ +package com.adjust.sdk; + +import android.content.Context; +import android.content.SharedPreferences; + +/** + * Class used for shared preferences manipulation. + */ +public class SharedPreferencesManager { + private SharedPreferences sharedPreferences; + + /** + * Default constructor + * @param context Application context + * @param name Shared preferences name + */ + public SharedPreferencesManager(Context context, String name) { + this.sharedPreferences = context.getSharedPreferences(name, Context.MODE_PRIVATE); + } + + /** + * Write a string value to shared preferences + * @param key Key to be written to shared preferences + * @param value Value to be written to shared preferences + */ + public synchronized void saveStringToSharedPreferences(String key, String value) { + this.sharedPreferences.edit().putString(key, value).apply(); + } + + /** + * Write a long value to shared preferences + * @param key Key to be written to shared preferences + * @param value Value to be written to shared preferences + */ + public synchronized void saveLongToSharedPreferences(String key, long value) { + this.sharedPreferences.edit().putLong(key, value).apply(); + } + + /** + * Write a boolean value to shared preferences + * @param key Key to be written to shared preferences + * @param value Value to be written to shared preferences + */ + public synchronized void saveBooleanToSharedPreferences(String key, boolean value) { + this.sharedPreferences.edit().putBoolean(key, value).apply(); + } + + /** + * Get a string value from shared preferences + * @param key Key for which string value should be retrieved + * @return String value for given key saved in shared preferences (null if not found) + */ + public synchronized String getStringFromSharedPreferences(String key) { + String defaultValue = null; + + try { + return this.sharedPreferences.getString(key, defaultValue); + } catch (ClassCastException e) { + return defaultValue; + } + } + + /** + * Get a long value from shared preferences + * @param key Key for which long value should be retrieved + * @return Long value for given key saved in shared preferences (-1 if not found) + */ + public synchronized long getLongFromSharedPreferences(String key) { + long defaultValue = -1; + + try { + return this.sharedPreferences.getLong(key, defaultValue); + } catch (ClassCastException e) { + return defaultValue; + } + } + + /** + * Get a long value from shared preferences + * @param key Key for which boolean value should be retrieved + * @return Boolean value for given key saved in shared preferences (false if not found) + */ + public synchronized boolean getBooleanFromSharedPreferences(String key) { + boolean defaultValue = false; + + try { + return this.sharedPreferences.getBoolean(key, defaultValue); + } catch (ClassCastException e) { + return defaultValue; + } + } + + /** + * Check if a given key is contained inside of shared preferences + * @param key Key which is being checked + * @return Boolean indicating whether key is present in shared preferences or not + */ + public synchronized boolean isContainedInSharedPreferences(String key) { + return this.sharedPreferences.contains(key); + } + + /** + * Remove given key from shared preferences + * @param key Key which might be removed + */ + public synchronized void removeFromSharedPreferences(String key) { + this.sharedPreferences.edit().remove(key).apply(); + } + + /** + * Remove all key-value pairs from shared preferences + */ + public synchronized void clearSharedPreferences() { + this.sharedPreferences.edit().clear().apply(); + } +} From c943ceaa637f862272b346dbeaad9a885dd127a2 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 7 Jul 2017 17:46:41 +0100 Subject: [PATCH 020/146] Shared preferences keys naming convention change --- Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 e48258f2d..f4cd212d1 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java @@ -59,9 +59,10 @@ public interface Constants { String CALLBACK_PARAMETERS = "callback_params"; String PARTNER_PARAMETERS = "partner_params"; - String PREFERENCES_NAME = "Adjust"; - String REFERRER_PREFKEY = "referrer"; - String REFERRER_CLICKTIME_PREFKEY = "referrerClickTime"; + String PREFS_NAME = "adjust_preferences"; + String PREFS_KEY_REFERRER = "referrer"; + String PREFS_KEY_REFERRER_CLICKTIME = "referrer_click_time"; + String PREFS_KEY_REFERRER_SENDING = "referrer_is_sending"; // List of known plugins, possibly not active List PLUGINS = Arrays.asList(); From cb9a9f8e2aba9ae22c651550319902eb8ce2184a Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 7 Jul 2017 17:47:20 +0100 Subject: [PATCH 021/146] Synchronise reading/writing of referrer info in shared preferences --- .../java/com/adjust/sdk/ActivityHandler.java | 41 +++++++++++++++---- .../java/com/adjust/sdk/AdjustInstance.java | 16 +++++--- .../java/com/adjust/sdk/SdkClickHandler.java | 30 +++++++++++--- 3 files changed, 69 insertions(+), 18 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 6e732e3f8..41a5f5113 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -102,10 +102,13 @@ public void teardown(boolean deleteState) { teardownAllSessionParametersS(deleteState); if (deleteState) { - SharedPreferences settings = adjustConfig.context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = settings.edit(); - editor.clear(); - editor.apply(); + // SharedPreferences settings = adjustConfig.context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); + // SharedPreferences.Editor editor = settings.edit(); + // editor.clear(); + // editor.apply(); + + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(adjustConfig.context, Constants.PREFS_NAME); + sharedPreferencesManager.clearSharedPreferences(); } packageHandler = null; @@ -755,14 +758,18 @@ private void startI() { private void checkReferrerI() { // read preferences - SharedPreferences settings = adjustConfig.context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); - String referrer = settings.getString(Constants.REFERRER_PREFKEY, null); + // SharedPreferences settings = adjustConfig.context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); + // String referrer = settings.getString(Constants.REFERRER_PREFKEY, null); + + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(adjustConfig.context, Constants.PREFS_NAME); + String referrer = sharedPreferencesManager.getStringFromSharedPreferences(Constants.PREFS_KEY_REFERRER); if (referrer == null) { return; } - long clickTime = settings.getLong(Constants.REFERRER_CLICKTIME_PREFKEY, -1); + // long clickTime = settings.getLong(Constants.REFERRER_CLICKTIME_PREFKEY, -1); + long clickTime = sharedPreferencesManager.getLongFromSharedPreferences(Constants.PREFS_KEY_REFERRER_CLICKTIME); // send referrer sendReferrerI(referrer, clickTime); @@ -1176,6 +1183,26 @@ private void setAskingAttributionI(boolean askingAttribution) { } private void sendReferrerI(String referrer, long clickTime) { + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(adjustConfig.context, Constants.PREFS_NAME); + boolean isClickBeingSent = sharedPreferencesManager.getBooleanFromSharedPreferences(Constants.PREFS_KEY_REFERRER_SENDING); + + if (false == isClickBeingSent) { + // Write down that referrer is actually being sent + sharedPreferencesManager.saveBooleanToSharedPreferences(Constants.PREFS_KEY_REFERRER_SENDING, true); + } else { + // We know some referrer is being sent, but let's see if it's the same like in this request. + String referrerCurrentlyBeingSent = sharedPreferencesManager.getStringFromSharedPreferences(Constants.PREFS_KEY_REFERRER); + + // If the same one as requested one is being sent, do nothing (don't duplicate the click). + if (referrer.equals(referrerCurrentlyBeingSent)) { + return; + } + + // If they are not equal... + // Some referrer is being sent, but new one was asked to be sent after that. + // So proceed with sending the requested one. + } + if (!isEnabledI()) { return; } if (referrer == null || referrer.length() == 0 ) { 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 6f5839a8b..24360f418 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -71,12 +71,18 @@ public void appWillOpenUrl(Uri url) { public void sendReferrer(String referrer, Context context) { long clickTime = System.currentTimeMillis(); + // save referrer to preferences - SharedPreferences settings = context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = settings.edit(); - editor.putString(Constants.REFERRER_PREFKEY, referrer); - editor.putLong(Constants.REFERRER_CLICKTIME_PREFKEY, clickTime); - editor.apply(); + // SharedPreferences settings = context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); + // SharedPreferences.Editor editor = settings.edit(); + // editor.putString(Constants.REFERRER_PREFKEY, referrer); + // editor.putLong(Constants.REFERRER_CLICKTIME_PREFKEY, clickTime); + // editor.apply(); + + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context, Constants.PREFS_NAME); + sharedPreferencesManager.saveStringToSharedPreferences(Constants.PREFS_KEY_REFERRER, referrer); + sharedPreferencesManager.saveLongToSharedPreferences(Constants.PREFS_KEY_REFERRER_CLICKTIME, clickTime); + sharedPreferencesManager.saveBooleanToSharedPreferences(Constants.PREFS_KEY_REFERRER_SENDING, false); if (checkActivityHandler("referrer")) { activityHandler.sendReferrer(referrer, clickTime); 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 6b6e1cbab..8a9550478 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -162,13 +162,16 @@ private void sendSdkClickI(ActivityPackage sdkClickPackage) { private void deleteSavedReferrerI(ActivityHandler activityHandler, ActivityPackage sdkClickPackage) { // extract sent referrer String sentReferrer = sdkClickPackage.getParameters().get("referrer"); + if (sentReferrer == null) { return; } // read saved referrer - SharedPreferences settings = activityHandler.adjustConfig.context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); - String savedReferrer = settings.getString(Constants.REFERRER_PREFKEY, null); + // SharedPreferences settings = activityHandler.adjustConfig.context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); + // String savedReferrer = settings.getString(Constants.REFERRER_PREFKEY, null); + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(activityHandler.adjustConfig.context, Constants.PREFS_NAME); + String savedReferrer = sharedPreferencesManager.getStringFromSharedPreferences(Constants.PREFS_KEY_REFERRER); if (savedReferrer == null) { return; @@ -180,10 +183,25 @@ private void deleteSavedReferrerI(ActivityHandler activityHandler, ActivityPacka } // delete referrer from preferences - SharedPreferences.Editor editor = settings.edit(); - editor.remove(Constants.REFERRER_PREFKEY); - editor.remove(Constants.REFERRER_CLICKTIME_PREFKEY); - editor.apply(); + // SharedPreferences.Editor editor = settings.edit(); + // editor.remove(Constants.REFERRER_PREFKEY); + // editor.remove(Constants.REFERRER_CLICKTIME_PREFKEY); + // editor.apply(); + + // In theory now, if multiple send actions were triggered, first one will wipe out all the info. + // So, before removing the info, let's ask if keys exist and if yes, then try to delete them. + + if (sharedPreferencesManager.isContainedInSharedPreferences(Constants.PREFS_KEY_REFERRER)) { + sharedPreferencesManager.removeFromSharedPreferences(Constants.PREFS_KEY_REFERRER); + } + + if (sharedPreferencesManager.isContainedInSharedPreferences(Constants.PREFS_KEY_REFERRER_SENDING)) { + sharedPreferencesManager.removeFromSharedPreferences(Constants.PREFS_KEY_REFERRER_SENDING); + } + + if (sharedPreferencesManager.isContainedInSharedPreferences(Constants.PREFS_KEY_REFERRER_CLICKTIME)) { + sharedPreferencesManager.removeFromSharedPreferences(Constants.PREFS_KEY_REFERRER_CLICKTIME); + } } private void retrySendingI(ActivityPackage sdkClickPackage) { From 320a05a54548499e1d99c4cedb390ad253ba41e6 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 7 Jul 2017 21:14:35 +0100 Subject: [PATCH 022/146] Adding Adjust checkstyle XML to .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index b9f69b0be..2b797a4a5 100644 --- a/.gitignore +++ b/.gitignore @@ -74,3 +74,6 @@ google-services.json # generated native code .externalNativeBuild/ + +# Checkstyle config file +adjust_checks.xml From 23139a73a4c84f2493f8f7226f101770f1ae9d67 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 7 Jul 2017 21:14:53 +0100 Subject: [PATCH 023/146] Checkstyle cleanup for SharedPreferencesManager --- .../adjust/sdk/SharedPreferencesManager.java | 58 +++++++++++-------- 1 file changed, 35 insertions(+), 23 deletions(-) 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 87621718c..c242b0c1c 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -7,50 +7,58 @@ * Class used for shared preferences manipulation. */ public class SharedPreferencesManager { + /** + * Shared preferences of the app. + */ private SharedPreferences sharedPreferences; /** - * Default constructor + * Default constructor. + * * @param context Application context - * @param name Shared preferences name + * @param name Shared preferences name */ - public SharedPreferencesManager(Context context, String name) { + public SharedPreferencesManager(final Context context, final String name) { this.sharedPreferences = context.getSharedPreferences(name, Context.MODE_PRIVATE); } /** - * Write a string value to shared preferences - * @param key Key to be written to shared preferences + * Write a string value to shared preferences. + * + * @param key Key to be written to shared preferences * @param value Value to be written to shared preferences */ - public synchronized void saveStringToSharedPreferences(String key, String value) { + public synchronized void saveStringToSharedPreferences(final String key, final String value) { this.sharedPreferences.edit().putString(key, value).apply(); } /** - * Write a long value to shared preferences - * @param key Key to be written to shared preferences + * Write a long value to shared preferences. + * + * @param key Key to be written to shared preferences * @param value Value to be written to shared preferences */ - public synchronized void saveLongToSharedPreferences(String key, long value) { + public synchronized void saveLongToSharedPreferences(final String key, final long value) { this.sharedPreferences.edit().putLong(key, value).apply(); } /** - * Write a boolean value to shared preferences - * @param key Key to be written to shared preferences + * Write a boolean value to shared preferences. + * + * @param key Key to be written to shared preferences * @param value Value to be written to shared preferences */ - public synchronized void saveBooleanToSharedPreferences(String key, boolean value) { + public synchronized void saveBooleanToSharedPreferences(final String key, final boolean value) { this.sharedPreferences.edit().putBoolean(key, value).apply(); } /** - * Get a string value from shared preferences + * Get a string value from shared preferences. + * * @param key Key for which string value should be retrieved * @return String value for given key saved in shared preferences (null if not found) */ - public synchronized String getStringFromSharedPreferences(String key) { + public synchronized String getStringFromSharedPreferences(final String key) { String defaultValue = null; try { @@ -61,11 +69,12 @@ public synchronized String getStringFromSharedPreferences(String key) { } /** - * Get a long value from shared preferences + * Get a long value from shared preferences. + * * @param key Key for which long value should be retrieved * @return Long value for given key saved in shared preferences (-1 if not found) */ - public synchronized long getLongFromSharedPreferences(String key) { + public synchronized long getLongFromSharedPreferences(final String key) { long defaultValue = -1; try { @@ -76,11 +85,12 @@ public synchronized long getLongFromSharedPreferences(String key) { } /** - * Get a long value from shared preferences + * Get a long value from shared preferences. + * * @param key Key for which boolean value should be retrieved * @return Boolean value for given key saved in shared preferences (false if not found) */ - public synchronized boolean getBooleanFromSharedPreferences(String key) { + public synchronized boolean getBooleanFromSharedPreferences(final String key) { boolean defaultValue = false; try { @@ -91,24 +101,26 @@ public synchronized boolean getBooleanFromSharedPreferences(String key) { } /** - * Check if a given key is contained inside of shared preferences + * Check if a given key is contained inside of shared preferences. + * * @param key Key which is being checked * @return Boolean indicating whether key is present in shared preferences or not */ - public synchronized boolean isContainedInSharedPreferences(String key) { + public synchronized boolean isContainedInSharedPreferences(final String key) { return this.sharedPreferences.contains(key); } /** - * Remove given key from shared preferences + * Remove given key from shared preferences. + * * @param key Key which might be removed */ - public synchronized void removeFromSharedPreferences(String key) { + public synchronized void removeFromSharedPreferences(final String key) { this.sharedPreferences.edit().remove(key).apply(); } /** - * Remove all key-value pairs from shared preferences + * Remove all key-value pairs from shared preferences. */ public synchronized void clearSharedPreferences() { this.sharedPreferences.edit().clear().apply(); From 22844ff954555495deebe958680e385a5a518cfc Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 11 Jul 2017 15:24:43 +0200 Subject: [PATCH 024/146] Linter cleanup --- .../com/adjust/sdk/SharedPreferencesManager.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) 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 c242b0c1c..abc8a8fa6 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -10,7 +10,7 @@ public class SharedPreferencesManager { /** * Shared preferences of the app. */ - private SharedPreferences sharedPreferences; + private final SharedPreferences sharedPreferences; /** * Default constructor. @@ -59,12 +59,10 @@ public synchronized void saveBooleanToSharedPreferences(final String key, final * @return String value for given key saved in shared preferences (null if not found) */ public synchronized String getStringFromSharedPreferences(final String key) { - String defaultValue = null; - try { - return this.sharedPreferences.getString(key, defaultValue); + return this.sharedPreferences.getString(key, null); } catch (ClassCastException e) { - return defaultValue; + return null; } } @@ -91,12 +89,10 @@ public synchronized long getLongFromSharedPreferences(final String key) { * @return Boolean value for given key saved in shared preferences (false if not found) */ public synchronized boolean getBooleanFromSharedPreferences(final String key) { - boolean defaultValue = false; - try { - return this.sharedPreferences.getBoolean(key, defaultValue); + return this.sharedPreferences.getBoolean(key, false); } catch (ClassCastException e) { - return defaultValue; + return false; } } From 35bcaa9931852fd8b70930aa2bc717cec674d7f7 Mon Sep 17 00:00:00 2001 From: Obaied Date: Fri, 14 Jul 2017 10:16:35 +0200 Subject: [PATCH 025/146] Add sending mcc and mnc to DeviceInfo --- .../main/java/com/adjust/sdk/DeviceInfo.java | 39 +++++++++++++++++++ .../java/com/adjust/sdk/PackageBuilder.java | 6 ++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java index 8654d11f5..274e6dd68 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -9,6 +9,8 @@ import android.database.Cursor; import android.net.Uri; import android.os.Build; +import android.telephony.TelephonyManager; +import android.text.TextUtils; import android.util.DisplayMetrics; import java.util.Date; @@ -57,6 +59,8 @@ class DeviceInfo { String vmInstructionSet; String appInstallTime; String appUpdateTime; + String mcc; + String mnc; Map pluginKeys; DeviceInfo(Context context, String sdkPrefix) { @@ -93,6 +97,8 @@ class DeviceInfo { vmInstructionSet = getVmInstructionSet(); appInstallTime = getAppInstallTime(context); appUpdateTime = getAppUpdateTime(context); + mcc = getMcc(context); + mnc = getMnc(context); } void reloadDeviceIds(Context context) { @@ -189,6 +195,7 @@ private String getBuildName() { private String getHardwareName() { return Build.DISPLAY; } + private String getScreenSize(int screenLayout) { int screenSize = screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK; @@ -335,4 +342,36 @@ private String getAppUpdateTime(Context context) { return null; } } + + private String getMcc(Context context) { + try { + TelephonyManager tel = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + String networkOperator = tel.getNetworkOperator(); + + if (TextUtils.isEmpty(networkOperator)) { + AdjustFactory.getLogger().warn("Couldn't receive networkOperator string"); + return null; + } + return networkOperator.substring(0, 3); + } catch (Exception ex) { + AdjustFactory.getLogger().warn("Couldn't return mcc"); + return null; + } + } + + private String getMnc(Context context) { + try { + TelephonyManager tel = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + String networkOperator = tel.getNetworkOperator(); + + if (TextUtils.isEmpty(networkOperator)) { + AdjustFactory.getLogger().warn("Couldn't receive networkOperator string"); + return null; + } + return networkOperator.substring(3); + } catch (Exception ex) { + AdjustFactory.getLogger().warn("Couldn't return mnc"); + return null; + } + } } 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 f8e6cd81a..d4da5c35c 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -17,6 +17,7 @@ import java.util.HashMap; import java.util.Locale; import java.util.Map; + import static com.adjust.sdk.Constants.CALLBACK_PARAMETERS; import static com.adjust.sdk.Constants.PARTNER_PARAMETERS; @@ -90,8 +91,7 @@ public ActivityPackage buildSessionPackage(SessionParameters sessionParameters, public ActivityPackage buildEventPackage(AdjustEvent event, SessionParameters sessionParameters, - boolean isInDelay) - { + boolean isInDelay) { Map parameters = getDefaultParameters(); PackageBuilder.addInt(parameters, "event_count", activityStateCopy.eventCount); PackageBuilder.addString(parameters, "event_token", event.eventToken); @@ -229,6 +229,8 @@ private void injectDeviceInfo(Map parameters) { PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); PackageBuilder.addString(parameters, "vm_isa", deviceInfo.vmInstructionSet); + PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); + PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); fillPluginKeys(parameters); } From df6fd9d1d6768d29937c5bf8fcf4c9400804a0f7 Mon Sep 17 00:00:00 2001 From: Obaied Date: Fri, 14 Jul 2017 12:15:32 +0200 Subject: [PATCH 026/146] Add sending 'network_type' through DeviceInfo --- .../main/java/com/adjust/sdk/DeviceInfo.java | 77 +++++++++++++++++++ .../java/com/adjust/sdk/PackageBuilder.java | 1 + 2 files changed, 78 insertions(+) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java index 274e6dd68..2fede9791 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -7,6 +7,8 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.database.Cursor; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; import android.net.Uri; import android.os.Build; import android.telephony.TelephonyManager; @@ -61,6 +63,7 @@ class DeviceInfo { String appUpdateTime; String mcc; String mnc; + String networkType; Map pluginKeys; DeviceInfo(Context context, String sdkPrefix) { @@ -99,6 +102,7 @@ class DeviceInfo { appUpdateTime = getAppUpdateTime(context); mcc = getMcc(context); mnc = getMnc(context); + networkType = NetworkUtil.getNetworkType(context); } void reloadDeviceIds(Context context) { @@ -374,4 +378,77 @@ private String getMnc(Context context) { return null; } } + + private static class NetworkUtil { + private final static String NETWORKTYPE_2G = "2g"; + private final static String NETWORKTYPE_3G = "3g"; + private final static String NETWORKTYPE_4G = "4g"; + private final static String NETWORKTYPE_WIFI = "wifi"; + private final static String NETWORKTYPE_UNKNOWN = "unknown"; + private final static String NETWORKTYPE_NOT_CONNECTED = "not_connected"; + + private NetworkUtil() { + } + + static String getNetworkType(Context context) { + ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); + if (activeNetwork != null) { // connected to the internet + if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) { + // connected to wifi + return NETWORKTYPE_WIFI; + } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) { + // connected to the mobile provider's data plan + return getMobileNetworkType(context); + } + } + + // not connected to the internet + return NETWORKTYPE_NOT_CONNECTED; + } + + private static String getMobileNetworkType(Context context) { + TelephonyManager teleMan = + (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + int networkType = teleMan.getNetworkType(); + + switch (networkType) { + + case 11: //iDen + return NETWORKTYPE_2G; + case 1: //GPRS + return NETWORKTYPE_2G; + case 2: //EDGE + return NETWORKTYPE_2G; + + case 3: //UMTS + return NETWORKTYPE_3G; + case 7: //1xRTT + return NETWORKTYPE_3G; + case 4: //CDMA + return NETWORKTYPE_3G; + case 14: //eHRPD + return NETWORKTYPE_3G; + case 5: //EVDO rev. 0 + return NETWORKTYPE_3G; + case 6: //EVDO rev. A + return NETWORKTYPE_3G; + case 12: //EVDO rev. B + return NETWORKTYPE_3G; + case 8: //HSDPA + return NETWORKTYPE_3G; + case 10: //HSPA + return NETWORKTYPE_3G; + case 9: //HSUPA + return NETWORKTYPE_3G; + + case 15: //HSPA+ + return NETWORKTYPE_4G; + case 13: //LTE + return NETWORKTYPE_4G; + } + + return NETWORKTYPE_UNKNOWN; + } + } } 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 d4da5c35c..f01833fcc 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -231,6 +231,7 @@ private void injectDeviceInfo(Map parameters) { PackageBuilder.addString(parameters, "vm_isa", deviceInfo.vmInstructionSet); PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); + PackageBuilder.addString(parameters, "network_type", deviceInfo.networkType); fillPluginKeys(parameters); } From adedda51c59d93c86d01ef4ca324e1c7ad000d37 Mon Sep 17 00:00:00 2001 From: Obaied Date: Fri, 14 Jul 2017 12:17:03 +0200 Subject: [PATCH 027/146] Add ACCESS_NETWORK_STATE permission --- Adjust/adjust/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/Adjust/adjust/src/main/AndroidManifest.xml b/Adjust/adjust/src/main/AndroidManifest.xml index 609789bf2..91069a33a 100644 --- a/Adjust/adjust/src/main/AndroidManifest.xml +++ b/Adjust/adjust/src/main/AndroidManifest.xml @@ -2,6 +2,7 @@ package="com.adjust.sdk"> + Date: Fri, 14 Jul 2017 12:21:47 +0200 Subject: [PATCH 028/146] Add comment about source of network type categorization --- Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java index 2fede9791..90b744ce3 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -413,6 +413,8 @@ private static String getMobileNetworkType(Context context) { int networkType = teleMan.getNetworkType(); switch (networkType) { + //Most network types were determined using the table at the end of this page: + // https://en.wikipedia.org/wiki/List_of_mobile_phone_generations case 11: //iDen return NETWORKTYPE_2G; From e508ecfaaa585463ee5d830642209790e7d050d0 Mon Sep 17 00:00:00 2001 From: Obaied Date: Fri, 14 Jul 2017 15:57:16 +0200 Subject: [PATCH 029/146] Add Network types from TelephonyManager instead of integers --- .../main/java/com/adjust/sdk/DeviceInfo.java | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java index 90b744ce3..1ac53dc36 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -390,6 +390,8 @@ private static class NetworkUtil { private NetworkUtil() { } + // Returns the network type based as one of the NETWORKTYPE_XX const values. + // Priority goes to 'wifi' even if mobile data is enabled static String getNetworkType(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); @@ -413,40 +415,40 @@ private static String getMobileNetworkType(Context context) { int networkType = teleMan.getNetworkType(); switch (networkType) { - //Most network types were determined using the table at the end of this page: + //- Most network types were determined using the table at the end of this page: // https://en.wikipedia.org/wiki/List_of_mobile_phone_generations - case 11: //iDen + case TelephonyManager.NETWORK_TYPE_IDEN: return NETWORKTYPE_2G; - case 1: //GPRS + case TelephonyManager.NETWORK_TYPE_GPRS: return NETWORKTYPE_2G; - case 2: //EDGE + case TelephonyManager.NETWORK_TYPE_EDGE: return NETWORKTYPE_2G; - case 3: //UMTS + case TelephonyManager.NETWORK_TYPE_UMTS: return NETWORKTYPE_3G; - case 7: //1xRTT + case TelephonyManager.NETWORK_TYPE_1xRTT: return NETWORKTYPE_3G; - case 4: //CDMA + case TelephonyManager.NETWORK_TYPE_CDMA: return NETWORKTYPE_3G; - case 14: //eHRPD + case TelephonyManager.NETWORK_TYPE_EHRPD: return NETWORKTYPE_3G; - case 5: //EVDO rev. 0 + case TelephonyManager.NETWORK_TYPE_EVDO_0: return NETWORKTYPE_3G; - case 6: //EVDO rev. A + case TelephonyManager.NETWORK_TYPE_EVDO_A: return NETWORKTYPE_3G; - case 12: //EVDO rev. B + case TelephonyManager.NETWORK_TYPE_EVDO_B: return NETWORKTYPE_3G; - case 8: //HSDPA + case TelephonyManager.NETWORK_TYPE_HSDPA: return NETWORKTYPE_3G; - case 10: //HSPA + case TelephonyManager.NETWORK_TYPE_HSPA: return NETWORKTYPE_3G; - case 9: //HSUPA + case TelephonyManager.NETWORK_TYPE_HSUPA: return NETWORKTYPE_3G; - case 15: //HSPA+ + case TelephonyManager.NETWORK_TYPE_HSPAP: return NETWORKTYPE_4G; - case 13: //LTE + case TelephonyManager.NETWORK_TYPE_LTE: return NETWORKTYPE_4G; } From a3c3d22a5bfc97dc13bab9c5d302f896637c7910 Mon Sep 17 00:00:00 2001 From: Obaied Date: Tue, 18 Jul 2017 10:35:56 +0200 Subject: [PATCH 030/146] Change network_type return values to concatenate both type and subtype in one string --- .../main/java/com/adjust/sdk/DeviceInfo.java | 33 +++++++++---------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java index 1ac53dc36..ea19e6fb2 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -380,9 +380,6 @@ private String getMnc(Context context) { } private static class NetworkUtil { - private final static String NETWORKTYPE_2G = "2g"; - private final static String NETWORKTYPE_3G = "3g"; - private final static String NETWORKTYPE_4G = "4g"; private final static String NETWORKTYPE_WIFI = "wifi"; private final static String NETWORKTYPE_UNKNOWN = "unknown"; private final static String NETWORKTYPE_NOT_CONNECTED = "not_connected"; @@ -419,37 +416,37 @@ private static String getMobileNetworkType(Context context) { // https://en.wikipedia.org/wiki/List_of_mobile_phone_generations case TelephonyManager.NETWORK_TYPE_IDEN: - return NETWORKTYPE_2G; + return "2g@iden"; case TelephonyManager.NETWORK_TYPE_GPRS: - return NETWORKTYPE_2G; + return "2g@gprs"; case TelephonyManager.NETWORK_TYPE_EDGE: - return NETWORKTYPE_2G; + return "2g@edge"; case TelephonyManager.NETWORK_TYPE_UMTS: - return NETWORKTYPE_3G; + return "3g@umts"; case TelephonyManager.NETWORK_TYPE_1xRTT: - return NETWORKTYPE_3G; + return "3g@1xrtt"; case TelephonyManager.NETWORK_TYPE_CDMA: - return NETWORKTYPE_3G; + return "3g@cdma"; case TelephonyManager.NETWORK_TYPE_EHRPD: - return NETWORKTYPE_3G; + return "3g@ehrpd"; case TelephonyManager.NETWORK_TYPE_EVDO_0: - return NETWORKTYPE_3G; + return "3g@evdo0"; case TelephonyManager.NETWORK_TYPE_EVDO_A: - return NETWORKTYPE_3G; + return "3g@evdoa"; case TelephonyManager.NETWORK_TYPE_EVDO_B: - return NETWORKTYPE_3G; + return "3g@evdob"; case TelephonyManager.NETWORK_TYPE_HSDPA: - return NETWORKTYPE_3G; + return "3g@hsdpa"; case TelephonyManager.NETWORK_TYPE_HSPA: - return NETWORKTYPE_3G; + return "3g@hspa"; case TelephonyManager.NETWORK_TYPE_HSUPA: - return NETWORKTYPE_3G; + return "3g@hsupa"; case TelephonyManager.NETWORK_TYPE_HSPAP: - return NETWORKTYPE_4G; + return "4g@hspap"; case TelephonyManager.NETWORK_TYPE_LTE: - return NETWORKTYPE_4G; + return "4g@lte"; } return NETWORKTYPE_UNKNOWN; From a354db484a8a0b325743d6054232f449ee53a81e Mon Sep 17 00:00:00 2001 From: Obaied Date: Tue, 18 Jul 2017 15:00:23 +0200 Subject: [PATCH 031/146] Add extra network types --- Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java index ea19e6fb2..97905b750 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -421,6 +421,8 @@ private static String getMobileNetworkType(Context context) { return "2g@gprs"; case TelephonyManager.NETWORK_TYPE_EDGE: return "2g@edge"; + case TelephonyManager.NETWORK_TYPE_GSM: + return "2g@gsm"; case TelephonyManager.NETWORK_TYPE_UMTS: return "3g@umts"; @@ -442,11 +444,16 @@ private static String getMobileNetworkType(Context context) { return "3g@hspa"; case TelephonyManager.NETWORK_TYPE_HSUPA: return "3g@hsupa"; + case TelephonyManager.NETWORK_TYPE_TD_SCDMA: + return "3g@tdscdma"; case TelephonyManager.NETWORK_TYPE_HSPAP: return "4g@hspap"; case TelephonyManager.NETWORK_TYPE_LTE: return "4g@lte"; + + case TelephonyManager.NETWORK_TYPE_IWLAN: + return "unknown@iwlan"; } return NETWORKTYPE_UNKNOWN; From e83e9558880bbfeb5e937921ca571b4fd6215a4e Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 20 Jul 2017 17:04:44 +0200 Subject: [PATCH 032/146] Referrer sending/storing logic revision --- .../java/com/adjust/sdk/ActivityHandler.java | 65 +++--- .../java/com/adjust/sdk/ActivityPackage.java | 9 + .../java/com/adjust/sdk/AdjustInstance.java | 18 +- .../main/java/com/adjust/sdk/Constants.java | 5 - .../java/com/adjust/sdk/IActivityHandler.java | 3 + .../java/com/adjust/sdk/PackageBuilder.java | 1 + .../java/com/adjust/sdk/SdkClickHandler.java | 51 +--- .../adjust/sdk/SharedPreferencesManager.java | 220 +++++++++++++----- 8 files changed, 215 insertions(+), 157 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 41a5f5113..d715dfd2c 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -19,8 +19,12 @@ import android.net.UrlQuerySanitizer; import android.os.Handler; +import org.json.JSONArray; +import org.json.JSONException; + import java.io.InputStream; import java.util.ArrayList; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -107,7 +111,7 @@ public void teardown(boolean deleteState) { // editor.clear(); // editor.apply(); - SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(adjustConfig.context, Constants.PREFS_NAME); + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(adjustConfig.context); sharedPreferencesManager.clearSharedPreferences(); } @@ -542,6 +546,11 @@ public void run() { }); } + @Override + public Context getContext() { + return adjustConfig.context; + } + public void foregroundTimerFired() { scheduledExecutor.submit(new Runnable() { @Override @@ -757,22 +766,23 @@ private void startI() { } private void checkReferrerI() { - // read preferences - // SharedPreferences settings = adjustConfig.context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); - // String referrer = settings.getString(Constants.REFERRER_PREFKEY, null); + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(adjustConfig.context); + JSONArray referrerQueue = sharedPreferencesManager.getReferrersFromSharedPreferences(); - SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(adjustConfig.context, Constants.PREFS_NAME); - String referrer = sharedPreferencesManager.getStringFromSharedPreferences(Constants.PREFS_KEY_REFERRER); + try { + for (int i = 0; i < referrerQueue.length(); i += 1) { + JSONArray referrerPair = referrerQueue.getJSONArray(i); - if (referrer == null) { - return; - } + String savedReferrer = referrerPair.getString(0); + long savedClickTime = referrerPair.getLong(1); - // long clickTime = settings.getLong(Constants.REFERRER_CLICKTIME_PREFKEY, -1); - long clickTime = sharedPreferencesManager.getLongFromSharedPreferences(Constants.PREFS_KEY_REFERRER_CLICKTIME); + if (referrerPair.length() == 2) { + sendReferrerI(savedReferrer, savedClickTime); + } + } + } catch (JSONException e) { - // send referrer - sendReferrerI(referrer, clickTime); + } } private void processSessionI() { @@ -1183,32 +1193,15 @@ private void setAskingAttributionI(boolean askingAttribution) { } private void sendReferrerI(String referrer, long clickTime) { - SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(adjustConfig.context, Constants.PREFS_NAME); - boolean isClickBeingSent = sharedPreferencesManager.getBooleanFromSharedPreferences(Constants.PREFS_KEY_REFERRER_SENDING); - - if (false == isClickBeingSent) { - // Write down that referrer is actually being sent - sharedPreferencesManager.saveBooleanToSharedPreferences(Constants.PREFS_KEY_REFERRER_SENDING, true); - } else { - // We know some referrer is being sent, but let's see if it's the same like in this request. - String referrerCurrentlyBeingSent = sharedPreferencesManager.getStringFromSharedPreferences(Constants.PREFS_KEY_REFERRER); - - // If the same one as requested one is being sent, do nothing (don't duplicate the click). - if (referrer.equals(referrerCurrentlyBeingSent)) { - return; - } - - // If they are not equal... - // Some referrer is being sent, but new one was asked to be sent after that. - // So proceed with sending the requested one. - } - if (!isEnabledI()) { return; } - if (referrer == null || referrer.length() == 0 ) { + if (referrer == null || referrer.length() == 0) { return; } + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(adjustConfig.context); + sharedPreferencesManager.markReferrerForSendingInSharedPreferences(referrer, clickTime); + logger.verbose("Referrer to parse (%s)", referrer); UrlQuerySanitizer querySanitizer = new UrlQuerySanitizer(); @@ -1226,6 +1219,10 @@ private void sendReferrerI(String referrer, long clickTime) { clickPackageBuilder.clickTime = clickTime; ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.REFTAG, sessionParameters); + logger.debug("Referrer sdk_click package created and is about to be sent."); + logger.debug("Referrer: " + referrer); + logger.debug("Click time: " + clickTime); + sdkClickHandler.sendSdkClick(clickPackage); } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java index aa7608105..69b944384 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java @@ -48,6 +48,7 @@ public class ActivityPackage implements Serializable { private Map partnerParameters; private int retries; + private long clickTime; public String getPath() { return path; @@ -101,6 +102,14 @@ public int increaseRetries() { return retries; } + public long getClickTime() { + return this.clickTime; + } + + public void setClickTime(long clickTime) { + this.clickTime = clickTime; + } + public Map getCallbackParameters() { return callbackParameters; } 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 24360f418..d331f3d20 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -72,17 +72,13 @@ public void appWillOpenUrl(Uri url) { public void sendReferrer(String referrer, Context context) { long clickTime = System.currentTimeMillis(); - // save referrer to preferences - // SharedPreferences settings = context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); - // SharedPreferences.Editor editor = settings.edit(); - // editor.putString(Constants.REFERRER_PREFKEY, referrer); - // editor.putLong(Constants.REFERRER_CLICKTIME_PREFKEY, clickTime); - // editor.apply(); - - SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context, Constants.PREFS_NAME); - sharedPreferencesManager.saveStringToSharedPreferences(Constants.PREFS_KEY_REFERRER, referrer); - sharedPreferencesManager.saveLongToSharedPreferences(Constants.PREFS_KEY_REFERRER_CLICKTIME, clickTime); - sharedPreferencesManager.saveBooleanToSharedPreferences(Constants.PREFS_KEY_REFERRER_SENDING, false); + // Check for referrer validity. If invalid, return. + if (referrer == null || referrer.length() == 0) { + return; + } + + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); + sharedPreferencesManager.saveReferrerToSharedPreferences(referrer, clickTime); if (checkActivityHandler("referrer")) { activityHandler.sendReferrer(referrer, clickTime); 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 f4cd212d1..1985a3c65 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java @@ -59,11 +59,6 @@ public interface Constants { String CALLBACK_PARAMETERS = "callback_params"; String PARTNER_PARAMETERS = "partner_params"; - String PREFS_NAME = "adjust_preferences"; - String PREFS_KEY_REFERRER = "referrer"; - String PREFS_KEY_REFERRER_CLICKTIME = "referrer_click_time"; - String PREFS_KEY_REFERRER_SENDING = "referrer_is_sending"; - // List of known plugins, possibly not active List PLUGINS = Arrays.asList(); } 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 6f3e88ac1..892847b13 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -1,5 +1,6 @@ package com.adjust.sdk; +import android.content.Context; import android.net.Uri; /** @@ -55,4 +56,6 @@ public interface IActivityHandler { void teardown(boolean deleteState); void setPushToken(String token); + + Context getContext(); } 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 f01833fcc..6350d9c89 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -131,6 +131,7 @@ public ActivityPackage buildClickPackage(String source, SessionParameters sessio ActivityPackage clickPackage = getDefaultActivityPackage(ActivityKind.CLICK); clickPackage.setPath("/sdk_click"); clickPackage.setSuffix(""); + clickPackage.setClickTime(clickTime); clickPackage.setParameters(parameters); return clickPackage; 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 8a9550478..a782484b1 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -9,6 +9,7 @@ import java.net.SocketTimeoutException; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.concurrent.TimeUnit; import javax.net.ssl.HttpsURLConnection; @@ -142,10 +143,11 @@ private void sendSdkClickI(ActivityPackage sdkClickPackage) { return; } - deleteSavedReferrerI((ActivityHandler) activityHandler, sdkClickPackage); + // Remove referrer from shared preferences after sdk_click is sent. + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(activityHandler.getContext()); + sharedPreferencesManager.removeReferrerFromSharedPreferences(sdkClickPackage.getParameters().get("referrer"), sdkClickPackage.getClickTime()); activityHandler.finishedTrackingActivity(responseData); - } catch (UnsupportedEncodingException e) { logErrorMessageI(sdkClickPackage, "Sdk_click failed to encode parameters", e); } catch (SocketTimeoutException e) { @@ -159,51 +161,6 @@ private void sendSdkClickI(ActivityPackage sdkClickPackage) { } } - private void deleteSavedReferrerI(ActivityHandler activityHandler, ActivityPackage sdkClickPackage) { - // extract sent referrer - String sentReferrer = sdkClickPackage.getParameters().get("referrer"); - - if (sentReferrer == null) { - return; - } - - // read saved referrer - // SharedPreferences settings = activityHandler.adjustConfig.context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); - // String savedReferrer = settings.getString(Constants.REFERRER_PREFKEY, null); - SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(activityHandler.adjustConfig.context, Constants.PREFS_NAME); - String savedReferrer = sharedPreferencesManager.getStringFromSharedPreferences(Constants.PREFS_KEY_REFERRER); - - if (savedReferrer == null) { - return; - } - - // check if they are the same - if (!sentReferrer.equals(savedReferrer)) { - return; - } - - // delete referrer from preferences - // SharedPreferences.Editor editor = settings.edit(); - // editor.remove(Constants.REFERRER_PREFKEY); - // editor.remove(Constants.REFERRER_CLICKTIME_PREFKEY); - // editor.apply(); - - // In theory now, if multiple send actions were triggered, first one will wipe out all the info. - // So, before removing the info, let's ask if keys exist and if yes, then try to delete them. - - if (sharedPreferencesManager.isContainedInSharedPreferences(Constants.PREFS_KEY_REFERRER)) { - sharedPreferencesManager.removeFromSharedPreferences(Constants.PREFS_KEY_REFERRER); - } - - if (sharedPreferencesManager.isContainedInSharedPreferences(Constants.PREFS_KEY_REFERRER_SENDING)) { - sharedPreferencesManager.removeFromSharedPreferences(Constants.PREFS_KEY_REFERRER_SENDING); - } - - if (sharedPreferencesManager.isContainedInSharedPreferences(Constants.PREFS_KEY_REFERRER_CLICKTIME)) { - sharedPreferencesManager.removeFromSharedPreferences(Constants.PREFS_KEY_REFERRER_CLICKTIME); - } - } - private void retrySendingI(ActivityPackage sdkClickPackage) { int retries = sdkClickPackage.increaseRetries(); 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 abc8a8fa6..f8bdbbf54 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -1,5 +1,8 @@ package com.adjust.sdk; +import org.json.JSONArray; +import org.json.JSONException; + import android.content.Context; import android.content.SharedPreferences; @@ -7,6 +10,9 @@ * Class used for shared preferences manipulation. */ public class SharedPreferencesManager { + private final String PREFS_NAME = "adjust_preferences"; + private final String PREFS_KEY_REFERRERS = "referrers"; + /** * Shared preferences of the app. */ @@ -16,109 +22,203 @@ public class SharedPreferencesManager { * Default constructor. * * @param context Application context - * @param name Shared preferences name */ - public SharedPreferencesManager(final Context context, final String name) { - this.sharedPreferences = context.getSharedPreferences(name, Context.MODE_PRIVATE); + public SharedPreferencesManager(final Context context) { + this.sharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); } /** - * Write a string value to shared preferences. + * Save referrer information to shared preferences. * - * @param key Key to be written to shared preferences - * @param value Value to be written to shared preferences + * @param referrer Referrer string. + * @param clickTime Referrer click time. */ - public synchronized void saveStringToSharedPreferences(final String key, final String value) { - this.sharedPreferences.edit().putString(key, value).apply(); - } + public synchronized void saveReferrerToSharedPreferences(final String referrer, final long clickTime) { + // Check if referrer is null or empty string already done before calling this mehtod. + try { + JSONArray referrerQueue = getReferrersFromSharedPreferences(); - /** - * Write a long value to shared preferences. - * - * @param key Key to be written to shared preferences - * @param value Value to be written to shared preferences - */ - public synchronized void saveLongToSharedPreferences(final String key, final long value) { - this.sharedPreferences.edit().putLong(key, value).apply(); - } + // If referrer is already contained in shared preferences, skip adding it. + if (isReferrerContainedInArray(referrer, clickTime, referrerQueue) >= 0) { + return; + } - /** - * Write a boolean value to shared preferences. - * - * @param key Key to be written to shared preferences - * @param value Value to be written to shared preferences - */ - public synchronized void saveBooleanToSharedPreferences(final String key, final boolean value) { - this.sharedPreferences.edit().putBoolean(key, value).apply(); + // Add new referrer JSONArray entry to the queue. + JSONArray newReferrerPair = new JSONArray(); + + newReferrerPair.put(0, referrer); + newReferrerPair.put(1, clickTime); + + referrerQueue.put(newReferrerPair); + + // Save JSON array as string back to shared preferences. + saveStringToSharedPreferences(PREFS_KEY_REFERRERS, referrerQueue.toString()); + } catch (JSONException e) { + + } } /** - * Get a string value from shared preferences. + * Mark referrer entry in referrer queue as currently being sent from sdk_click handler. * - * @param key Key for which string value should be retrieved - * @return String value for given key saved in shared preferences (null if not found) + * @param referrer Referrer string. + * @param clickTime Referrer click time. */ - public synchronized String getStringFromSharedPreferences(final String key) { + public synchronized void markReferrerForSendingInSharedPreferences(final String referrer, final long clickTime) { + // Don't even try to alter null or empty referrers since they shouldn't exist in shared preferences. + if (referrer == null || referrer.length() == 0) { + return; + } + try { - return this.sharedPreferences.getString(key, null); - } catch (ClassCastException e) { - return null; + // Try to locate position in queue of the referrer that should be altered. + JSONArray referrerQueue = getReferrersFromSharedPreferences(); + int index = isReferrerContainedInArray(referrer, clickTime, referrerQueue); + + // If referrer is not found in the queue, skip the rest. + if (index == -1) { + return; + } + + JSONArray referrerPair = referrerQueue.getJSONArray(index); + + // Rebuild queue and alter the aimed referrer info entry. + JSONArray newReferrerQueue = new JSONArray(); + + for (int i = 0; i < referrerQueue.length(); i += 1) { + if (i == index) { + JSONArray alteredReferrerPair = new JSONArray(); + + alteredReferrerPair.put(0, referrerPair.get(0)); + alteredReferrerPair.put(1, referrerPair.get(1)); + alteredReferrerPair.put(2, true); + + newReferrerQueue.put(alteredReferrerPair); + + continue; + } + + newReferrerQueue.put(referrerQueue.getJSONArray(i)); + } + + // Save new referrer queue JSON array as string back to shared preferences. + saveStringToSharedPreferences(PREFS_KEY_REFERRERS, newReferrerQueue.toString()); + } catch (JSONException e) { + } } /** - * Get a long value from shared preferences. + * Remove referrer information from shared preferences. * - * @param key Key for which long value should be retrieved - * @return Long value for given key saved in shared preferences (-1 if not found) + * @param referrer Referrer string. + * @param clickTime Referrer click time. */ - public synchronized long getLongFromSharedPreferences(final String key) { - long defaultValue = -1; + public synchronized void removeReferrerFromSharedPreferences(final String referrer, final long clickTime) { + // Don't even try to remove null or empty referrers since they shouldn't exist in shared preferences. + if (referrer == null || referrer.length() == 0) { + return; + } try { - return this.sharedPreferences.getLong(key, defaultValue); - } catch (ClassCastException e) { - return defaultValue; + // Try to locate position in queue of the referrer that should be deleted. + JSONArray referrerQueue = getReferrersFromSharedPreferences(); + int index = isReferrerContainedInArray(referrer, clickTime, referrerQueue); + + // If referrer is not found in the queue, skip the rest. + if (index == -1) { + return; + } + + // Rebuild queue without referrer that should be removed. + JSONArray newReferrerQueue = new JSONArray(); + + for (int i = 0; i < referrerQueue.length(); i += 1) { + if (i == index) { + continue; + } + + newReferrerQueue.put(referrerQueue.getJSONArray(i)); + } + + // Save new referrer queue JSON array as string back to shared preferences. + saveStringToSharedPreferences(PREFS_KEY_REFERRERS, newReferrerQueue.toString()); + } catch (JSONException e) { + } } /** - * Get a long value from shared preferences. + * Get all currently saved referrers from shared preferences. * - * @param key Key for which boolean value should be retrieved - * @return Boolean value for given key saved in shared preferences (false if not found) + * @return JSONArray with all the saved referrers from shared preferences. Empty array if none available. */ - public synchronized boolean getBooleanFromSharedPreferences(final String key) { + public synchronized JSONArray getReferrersFromSharedPreferences() { try { - return this.sharedPreferences.getBoolean(key, false); - } catch (ClassCastException e) { - return false; + String referrerQueueString = getStringFromSharedPreferences(PREFS_KEY_REFERRERS); + + if (referrerQueueString == null) { + return new JSONArray(); + } else { + return new JSONArray(referrerQueueString); + } + } catch (JSONException e) { + return new JSONArray(); } } /** - * Check if a given key is contained inside of shared preferences. + * Remove all key-value pairs from shared preferences. + */ + public synchronized void clearSharedPreferences() { + this.sharedPreferences.edit().clear().apply(); + } + + /** + * Write a string value to shared preferences. * - * @param key Key which is being checked - * @return Boolean indicating whether key is present in shared preferences or not + * @param key Key to be written to shared preferences + * @param value Value to be written to shared preferences */ - public synchronized boolean isContainedInSharedPreferences(final String key) { - return this.sharedPreferences.contains(key); + private synchronized void saveStringToSharedPreferences(final String key, final String value) { + this.sharedPreferences.edit().putString(key, value).apply(); } /** - * Remove given key from shared preferences. + * Get a string value from shared preferences. * - * @param key Key which might be removed + * @param key Key for which string value should be retrieved + * @return String value for given key saved in shared preferences (null if not found) */ - public synchronized void removeFromSharedPreferences(final String key) { - this.sharedPreferences.edit().remove(key).apply(); + private synchronized String getStringFromSharedPreferences(final String key) { + try { + return this.sharedPreferences.getString(key, null); + } catch (ClassCastException e) { + return null; + } } /** - * Remove all key-value pairs from shared preferences. + * Check if referrer information is contained in referrer queue in shared preferences. + * + * @param referrer Referrer string. + * @param clickTime Referrer click time. + * @param referrerQueue Referrer queue from shared preferences. + * @return Index of referrer information inside of the referrer queue. -1 if referrer information is not found. + * @throws JSONException */ - public synchronized void clearSharedPreferences() { - this.sharedPreferences.edit().clear().apply(); + private int isReferrerContainedInArray(String referrer, long clickTime, JSONArray referrerQueue) throws JSONException { + for (int i = 0; i < referrerQueue.length(); i += 1) { + JSONArray referrerPair = referrerQueue.getJSONArray(i); + + String savedReferrer = referrerPair.getString(0); + long savedClickTime = referrerPair.getLong(1); + + if (savedReferrer.equals(referrer) && savedClickTime == clickTime) { + return i; + } + } + + return -1; } } From c93883bbe251f6cf194577e7d2633c1c6d3b83c3 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 20 Jul 2017 19:32:34 +0200 Subject: [PATCH 033/146] Excluding Adjust checkstyle configuration --- .gitignore | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitignore b/.gitignore index 2b797a4a5..b9f69b0be 100644 --- a/.gitignore +++ b/.gitignore @@ -74,6 +74,3 @@ google-services.json # generated native code .externalNativeBuild/ - -# Checkstyle config file -adjust_checks.xml From 098d7e20f8d4fe032b2f065a0ecbbfd6dffc6afb Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 20 Jul 2017 19:35:27 +0200 Subject: [PATCH 034/146] Adding Adjust checkstyle configuration --- checkstyle/adjust_checks.xml | 179 +++++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 checkstyle/adjust_checks.xml diff --git a/checkstyle/adjust_checks.xml b/checkstyle/adjust_checks.xml new file mode 100644 index 000000000..f24044753 --- /dev/null +++ b/checkstyle/adjust_checks.xml @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 535d18a5a7cf18c09e3856bc441c96b3c0854c2f Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 20 Jul 2017 19:36:10 +0200 Subject: [PATCH 035/146] SharedPreferencesManager cleanup --- .../adjust/sdk/SharedPreferencesManager.java | 51 ++++++++++++------- 1 file changed, 32 insertions(+), 19 deletions(-) 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 f8bdbbf54..4b6483994 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -8,10 +8,21 @@ /** * Class used for shared preferences manipulation. + * + * @author Ugljesa Erceg (uerceg) + * @since 7th July 2017 */ + public class SharedPreferencesManager { - private final String PREFS_NAME = "adjust_preferences"; - private final String PREFS_KEY_REFERRERS = "referrers"; + /** + * Name of Adjust preferences. + */ + private static final String PREFS_NAME = "adjust_preferences"; + + /** + * Key name for referrers. + */ + private static final String PREFS_KEY_REFERRERS = "referrers"; /** * Shared preferences of the app. @@ -30,16 +41,16 @@ public SharedPreferencesManager(final Context context) { /** * Save referrer information to shared preferences. * - * @param referrer Referrer string. - * @param clickTime Referrer click time. + * @param referrer Referrer string + * @param clickTime Referrer click time */ public synchronized void saveReferrerToSharedPreferences(final String referrer, final long clickTime) { - // Check if referrer is null or empty string already done before calling this mehtod. + // Check if referrer is null or empty string already done before calling this method. try { JSONArray referrerQueue = getReferrersFromSharedPreferences(); // If referrer is already contained in shared preferences, skip adding it. - if (isReferrerContainedInArray(referrer, clickTime, referrerQueue) >= 0) { + if (getReferrerIndex(referrer, clickTime, referrerQueue) >= 0) { return; } @@ -61,8 +72,8 @@ public synchronized void saveReferrerToSharedPreferences(final String referrer, /** * Mark referrer entry in referrer queue as currently being sent from sdk_click handler. * - * @param referrer Referrer string. - * @param clickTime Referrer click time. + * @param referrer Referrer string + * @param clickTime Referrer click time */ public synchronized void markReferrerForSendingInSharedPreferences(final String referrer, final long clickTime) { // Don't even try to alter null or empty referrers since they shouldn't exist in shared preferences. @@ -73,7 +84,7 @@ public synchronized void markReferrerForSendingInSharedPreferences(final String try { // Try to locate position in queue of the referrer that should be altered. JSONArray referrerQueue = getReferrersFromSharedPreferences(); - int index = isReferrerContainedInArray(referrer, clickTime, referrerQueue); + int index = getReferrerIndex(referrer, clickTime, referrerQueue); // If referrer is not found in the queue, skip the rest. if (index == -1) { @@ -111,8 +122,8 @@ public synchronized void markReferrerForSendingInSharedPreferences(final String /** * Remove referrer information from shared preferences. * - * @param referrer Referrer string. - * @param clickTime Referrer click time. + * @param referrer Referrer string + * @param clickTime Referrer click time */ public synchronized void removeReferrerFromSharedPreferences(final String referrer, final long clickTime) { // Don't even try to remove null or empty referrers since they shouldn't exist in shared preferences. @@ -123,7 +134,7 @@ public synchronized void removeReferrerFromSharedPreferences(final String referr try { // Try to locate position in queue of the referrer that should be deleted. JSONArray referrerQueue = getReferrersFromSharedPreferences(); - int index = isReferrerContainedInArray(referrer, clickTime, referrerQueue); + int index = getReferrerIndex(referrer, clickTime, referrerQueue); // If referrer is not found in the queue, skip the rest. if (index == -1) { @@ -199,15 +210,17 @@ private synchronized String getStringFromSharedPreferences(final String key) { } /** - * Check if referrer information is contained in referrer queue in shared preferences. + * Check if referrer information is contained in referrer queue in shared preferences and get it's index. * - * @param referrer Referrer string. - * @param clickTime Referrer click time. - * @param referrerQueue Referrer queue from shared preferences. - * @return Index of referrer information inside of the referrer queue. -1 if referrer information is not found. - * @throws JSONException + * @param referrer Referrer string + * @param clickTime Referrer click time + * @param referrerQueue Referrer queue from shared preferences + * @return Index of referrer information inside of the referrer queue. -1 if not found. + * @throws JSONException JSON exception */ - private int isReferrerContainedInArray(String referrer, long clickTime, JSONArray referrerQueue) throws JSONException { + private int getReferrerIndex(final String referrer, + final long clickTime, + final JSONArray referrerQueue) throws JSONException { for (int i = 0; i < referrerQueue.length(); i += 1) { JSONArray referrerPair = referrerQueue.getJSONArray(i); From ff732e6772055fa2e9232344f2958967ecbbff42 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 21 Jul 2017 09:59:15 +0200 Subject: [PATCH 036/146] Checkystle & linter for SdkClickHandler --- .../java/com/adjust/sdk/ActivityHandler.java | 5 - .../java/com/adjust/sdk/ISdkClickHandler.java | 30 ++- .../java/com/adjust/sdk/SdkClickHandler.java | 195 +++++++++++++----- 3 files changed, 175 insertions(+), 55 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 d715dfd2c..5fa278fc0 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -106,11 +106,6 @@ public void teardown(boolean deleteState) { teardownAllSessionParametersS(deleteState); if (deleteState) { - // SharedPreferences settings = adjustConfig.context.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE); - // SharedPreferences.Editor editor = settings.edit(); - // editor.clear(); - // editor.apply(); - SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(adjustConfig.context); sharedPreferencesManager.clearSharedPreferences(); } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/ISdkClickHandler.java b/Adjust/adjust/src/main/java/com/adjust/sdk/ISdkClickHandler.java index 1a3425797..bdc71a2d3 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ISdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ISdkClickHandler.java @@ -1,12 +1,40 @@ package com.adjust.sdk; /** - * Created by pfms on 31/03/16. + * SdkClickHandler interface. + * + * @author Pedro Silva (nonelse) + * @since 31st March 2016 */ + public interface ISdkClickHandler { + /** + * Initialise SdkClickHandler instance. + * + * @param activityHandler Activity handler instance. + * @param startsSending Is sending paused? + */ void init(IActivityHandler activityHandler, boolean startsSending); + + /** + * Pause sending from SdkClickHandler. + */ void pauseSending(); + + /** + * Resume sending from SdkClickHandler. + */ void resumeSending(); + + /** + * Send sdk_click package. + * + * @param sdkClick sdk_click package to be sent. + */ void sendSdkClick(ActivityPackage sdkClick); + + /** + * Teardown SdkClickHandler instance. + */ void teardown(); } 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 a782484b1..c9d14eb7d 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -1,69 +1,98 @@ package com.adjust.sdk; -import android.content.Context; -import android.content.SharedPreferences; - import java.io.IOException; import java.io.UnsupportedEncodingException; -import java.lang.ref.WeakReference; -import java.net.SocketTimeoutException; -import java.util.ArrayList; + import java.util.List; -import java.util.Map; +import java.util.ArrayList; import java.util.concurrent.TimeUnit; -import javax.net.ssl.HttpsURLConnection; +import java.lang.ref.WeakReference; +import java.net.SocketTimeoutException; /** - * Created by pfms on 31/03/16. + * SdkClickHandler class. + * + * @author Pedro Silva (nonelse) + * @since 31st March 2016 */ + public class SdkClickHandler implements ISdkClickHandler { - private CustomScheduledExecutor scheduledExecutor; - private ILogger logger; + /** + * Divisor for milliseconds -> seconds conversion. + */ + private static final double MILLISECONDS_TO_SECONDS_DIVISOR = 1000.0; + + /** + * SdkClickHandler scheduled executor source. + */ + private static final String SCHEDULED_EXECUTOR_SOURCE = "SdkClickHandler"; + + /** + * Indicates whether SdkClickHandler is paused or not. + */ private boolean paused; - private List packageQueue; + + /** + * Adjust logger. + */ + private ILogger logger; + + /** + * Backoff strategy. + */ private BackoffStrategy backoffStrategy; - private WeakReference activityHandlerWeakRef; - @Override - public void teardown() { - logger.verbose("SdkClickHandler teardown"); - if (scheduledExecutor != null) { - try { - scheduledExecutor.shutdownNow(); - } catch(SecurityException se) {} - } - if (packageQueue != null) { - packageQueue.clear(); - } - if (activityHandlerWeakRef != null) { - activityHandlerWeakRef.clear(); - } - scheduledExecutor = null; - logger = null; - packageQueue = null; - backoffStrategy = null; - } + /** + * Sending queue. + */ + private List packageQueue; - public SdkClickHandler(IActivityHandler activityHandler, boolean startsSending) { + /** + * Custom actions scheduled executor. + */ + private CustomScheduledExecutor scheduledExecutor; + + /** + * ActivityHandler instance. + */ + private WeakReference activityHandlerWeakRef; + + /** + * SdkClickHandler constructor. + * + * @param activityHandler ActivityHandler reference + * @param startsSending Is sending paused? + */ + public SdkClickHandler(final IActivityHandler activityHandler, final boolean startsSending) { init(activityHandler, startsSending); - this.logger = AdjustFactory.getLogger(); - this.scheduledExecutor = new CustomScheduledExecutor("SdkClickHandler", false); - this.backoffStrategy = AdjustFactory.getSdkClickBackoffStrategy(); + + logger = AdjustFactory.getLogger(); + backoffStrategy = AdjustFactory.getSdkClickBackoffStrategy(); + scheduledExecutor = new CustomScheduledExecutor(SCHEDULED_EXECUTOR_SOURCE, false); } + /** + * {@inheritDoc} + */ @Override - public void init(IActivityHandler activityHandler, boolean startsSending) { - this.paused = !startsSending; - this.packageQueue = new ArrayList(); - this.activityHandlerWeakRef = new WeakReference(activityHandler); + public void init(final IActivityHandler activityHandler, final boolean startsSending) { + paused = !startsSending; + packageQueue = new ArrayList(); + activityHandlerWeakRef = new WeakReference(activityHandler); } + /** + * {@inheritDoc} + */ @Override public void pauseSending() { paused = true; } + /** + * {@inheritDoc} + */ @Override public void resumeSending() { paused = false; @@ -71,19 +100,56 @@ public void resumeSending() { sendNextSdkClick(); } + /** + * {@inheritDoc} + */ @Override public void sendSdkClick(final ActivityPackage sdkClick) { scheduledExecutor.submit(new Runnable() { @Override public void run() { packageQueue.add(sdkClick); + logger.debug("Added sdk_click %d", packageQueue.size()); logger.verbose("%s", sdkClick.getExtendedString()); + sendNextSdkClick(); } }); } + /** + * {@inheritDoc} + */ + @Override + public void teardown() { + logger.verbose("SdkClickHandler teardown"); + + if (scheduledExecutor != null) { + try { + scheduledExecutor.shutdownNow(); + } catch (SecurityException e) { + + } + } + + if (packageQueue != null) { + packageQueue.clear(); + } + + if (activityHandlerWeakRef != null) { + activityHandlerWeakRef.clear(); + } + + logger = null; + packageQueue = null; + backoffStrategy = null; + scheduledExecutor = null; + } + + /** + * Send next sdk_click package from the queue. + */ private void sendNextSdkClick() { scheduledExecutor.submit(new Runnable() { @Override @@ -93,6 +159,9 @@ public void run() { }); } + /** + * Send next sdk_click package from the queue (runs within scheduled executor). + */ private void sendNextSdkClickI() { if (paused) { return; @@ -119,19 +188,27 @@ public void run() { } long waitTimeMilliSeconds = Util.getWaitingTime(retries, backoffStrategy); - - double waitTimeSeconds = waitTimeMilliSeconds / 1000.0; + double waitTimeSeconds = waitTimeMilliSeconds / MILLISECONDS_TO_SECONDS_DIVISOR; String secondsString = Util.SecondsDisplayFormat.format(waitTimeSeconds); logger.verbose("Waiting for %s seconds before retrying sdk_click for the %d time", secondsString, retries); + scheduledExecutor.schedule(runnable, waitTimeMilliSeconds, TimeUnit.MILLISECONDS); } - private void sendSdkClickI(ActivityPackage sdkClickPackage) { + /** + * Send sdk_click package passed as the parameter (runs within scheduled executor). + * + * @param sdkClickPackage sdk_click package to be sent. + */ + private void sendSdkClickI(final ActivityPackage sdkClickPackage) { String targetURL = Constants.BASE_URL + sdkClickPackage.getPath(); try { - ResponseData responseData = UtilNetworking.createPOSTHttpsURLConnection(targetURL, sdkClickPackage, packageQueue.size() - 1); + ResponseData responseData = UtilNetworking.createPOSTHttpsURLConnection( + targetURL, + sdkClickPackage, + packageQueue.size() - 1); if (responseData.jsonResponse == null) { retrySendingI(sdkClickPackage); @@ -139,13 +216,17 @@ private void sendSdkClickI(ActivityPackage sdkClickPackage) { } IActivityHandler activityHandler = activityHandlerWeakRef.get(); + if (activityHandler == null) { return; } // Remove referrer from shared preferences after sdk_click is sent. - SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(activityHandler.getContext()); - sharedPreferencesManager.removeReferrerFromSharedPreferences(sdkClickPackage.getParameters().get("referrer"), sdkClickPackage.getClickTime()); + SharedPreferencesManager sharedPreferencesManager + = new SharedPreferencesManager(activityHandler.getContext()); + sharedPreferencesManager.removeReferrerFromSharedPreferences( + sdkClickPackage.getParameters().get("referrer"), + sdkClickPackage.getClickTime()); activityHandler.finishedTrackingActivity(responseData); } catch (UnsupportedEncodingException e) { @@ -161,17 +242,33 @@ private void sendSdkClickI(ActivityPackage sdkClickPackage) { } } - private void retrySendingI(ActivityPackage sdkClickPackage) { + /** + * Retry sending of the sdk_click package passed as the parameter (runs within scheduled executor). + * + * @param sdkClickPackage sdk_click package to be retried. + */ + private void retrySendingI(final ActivityPackage sdkClickPackage) { int retries = sdkClickPackage.increaseRetries(); logger.error("Retrying sdk_click package for the %d time", retries); + sendSdkClick(sdkClickPackage); } - private void logErrorMessageI(ActivityPackage sdkClickPackage, String message, Throwable throwable) { + /** + * Print error log messages (runs within scheduled executor). + * + * @param sdkClickPackage sdk_click package for which error occured. + * @param message Message content. + * @param throwable Throwable to read the reason of the error. + */ + private void logErrorMessageI(final ActivityPackage sdkClickPackage, + final String message, + final Throwable throwable) { final String packageMessage = sdkClickPackage.getFailureMessage(); final String reasonString = Util.getReasonString(message, throwable); - String finalMessage = String.format("%s. (%s)", packageMessage, reasonString); + final String finalMessage = String.format("%s. (%s)", packageMessage, reasonString); + logger.error(finalMessage); } } From e7ec01cfa56c6e32a8070797844c136e251a4cda Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 21 Jul 2017 10:09:47 +0200 Subject: [PATCH 037/146] Gradle update --- Adjust/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 072e693a8..596601301 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.1' + classpath 'com.android.tools.build:gradle:2.3.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 423e8dd7a961210d115cde90d9205bb64b02befe Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 21 Jul 2017 12:00:48 +0200 Subject: [PATCH 038/146] SharedPreferencesManager refactoring and adding of isReferrerMarkedForSending method --- .../java/com/adjust/sdk/ActivityHandler.java | 10 +- .../java/com/adjust/sdk/AdjustInstance.java | 2 +- .../java/com/adjust/sdk/SdkClickHandler.java | 2 +- .../adjust/sdk/SharedPreferencesManager.java | 129 ++++++++++++++---- 4 files changed, 105 insertions(+), 38 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 5fa278fc0..037d6217c 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -107,7 +107,7 @@ public void teardown(boolean deleteState) { if (deleteState) { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(adjustConfig.context); - sharedPreferencesManager.clearSharedPreferences(); + sharedPreferencesManager.clear(); } packageHandler = null; @@ -762,7 +762,7 @@ private void startI() { private void checkReferrerI() { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(adjustConfig.context); - JSONArray referrerQueue = sharedPreferencesManager.getReferrersFromSharedPreferences(); + JSONArray referrerQueue = sharedPreferencesManager.getReferrers(); try { for (int i = 0; i < referrerQueue.length(); i += 1) { @@ -1195,7 +1195,7 @@ private void sendReferrerI(String referrer, long clickTime) { } SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(adjustConfig.context); - sharedPreferencesManager.markReferrerForSendingInSharedPreferences(referrer, clickTime); + sharedPreferencesManager.markReferrerForSending(referrer, clickTime); logger.verbose("Referrer to parse (%s)", referrer); @@ -1214,10 +1214,6 @@ private void sendReferrerI(String referrer, long clickTime) { clickPackageBuilder.clickTime = clickTime; ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.REFTAG, sessionParameters); - logger.debug("Referrer sdk_click package created and is about to be sent."); - logger.debug("Referrer: " + referrer); - logger.debug("Click time: " + clickTime); - sdkClickHandler.sendSdkClick(clickPackage); } 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 d331f3d20..ced67b1aa 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -78,7 +78,7 @@ public void sendReferrer(String referrer, Context context) { } SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); - sharedPreferencesManager.saveReferrerToSharedPreferences(referrer, clickTime); + sharedPreferencesManager.saveReferrer(referrer, clickTime); if (checkActivityHandler("referrer")) { activityHandler.sendReferrer(referrer, clickTime); 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 c9d14eb7d..34d0a71d2 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -224,7 +224,7 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { // Remove referrer from shared preferences after sdk_click is sent. SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(activityHandler.getContext()); - sharedPreferencesManager.removeReferrerFromSharedPreferences( + sharedPreferencesManager.removeReferrer( sdkClickPackage.getParameters().get("referrer"), sdkClickPackage.getClickTime()); 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 4b6483994..41903e5da 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -24,6 +24,11 @@ public class SharedPreferencesManager { */ private static final String PREFS_KEY_REFERRERS = "referrers"; + /** + * Maximal size of referrer entry JSON array in shared preferences. + */ + private static final int PREFS_REFERRER_ENTRY_MAX_SIZE = 3; + /** * Shared preferences of the app. */ @@ -44,10 +49,10 @@ public SharedPreferencesManager(final Context context) { * @param referrer Referrer string * @param clickTime Referrer click time */ - public synchronized void saveReferrerToSharedPreferences(final String referrer, final long clickTime) { + public synchronized void saveReferrer(final String referrer, final long clickTime) { // Check if referrer is null or empty string already done before calling this method. try { - JSONArray referrerQueue = getReferrersFromSharedPreferences(); + JSONArray referrerQueue = getReferrers(); // If referrer is already contained in shared preferences, skip adding it. if (getReferrerIndex(referrer, clickTime, referrerQueue) >= 0) { @@ -55,15 +60,15 @@ public synchronized void saveReferrerToSharedPreferences(final String referrer, } // Add new referrer JSONArray entry to the queue. - JSONArray newReferrerPair = new JSONArray(); + JSONArray newreferrerEntry = new JSONArray(); - newReferrerPair.put(0, referrer); - newReferrerPair.put(1, clickTime); + newreferrerEntry.put(0, referrer); + newreferrerEntry.put(1, clickTime); - referrerQueue.put(newReferrerPair); + referrerQueue.put(newreferrerEntry); // Save JSON array as string back to shared preferences. - saveStringToSharedPreferences(PREFS_KEY_REFERRERS, referrerQueue.toString()); + saveString(PREFS_KEY_REFERRERS, referrerQueue.toString()); } catch (JSONException e) { } @@ -75,7 +80,7 @@ public synchronized void saveReferrerToSharedPreferences(final String referrer, * @param referrer Referrer string * @param clickTime Referrer click time */ - public synchronized void markReferrerForSendingInSharedPreferences(final String referrer, final long clickTime) { + public synchronized void markReferrerForSending(final String referrer, final long clickTime) { // Don't even try to alter null or empty referrers since they shouldn't exist in shared preferences. if (referrer == null || referrer.length() == 0) { return; @@ -83,7 +88,7 @@ public synchronized void markReferrerForSendingInSharedPreferences(final String try { // Try to locate position in queue of the referrer that should be altered. - JSONArray referrerQueue = getReferrersFromSharedPreferences(); + JSONArray referrerQueue = getReferrers(); int index = getReferrerIndex(referrer, clickTime, referrerQueue); // If referrer is not found in the queue, skip the rest. @@ -91,20 +96,20 @@ public synchronized void markReferrerForSendingInSharedPreferences(final String return; } - JSONArray referrerPair = referrerQueue.getJSONArray(index); + JSONArray referrerEntry = referrerQueue.getJSONArray(index); // Rebuild queue and alter the aimed referrer info entry. JSONArray newReferrerQueue = new JSONArray(); for (int i = 0; i < referrerQueue.length(); i += 1) { if (i == index) { - JSONArray alteredReferrerPair = new JSONArray(); + JSONArray alteredreferrerEntry = new JSONArray(); - alteredReferrerPair.put(0, referrerPair.get(0)); - alteredReferrerPair.put(1, referrerPair.get(1)); - alteredReferrerPair.put(2, true); + alteredreferrerEntry.put(0, referrerEntry.get(0)); + alteredreferrerEntry.put(1, referrerEntry.get(1)); + alteredreferrerEntry.put(2, true); - newReferrerQueue.put(alteredReferrerPair); + newReferrerQueue.put(alteredreferrerEntry); continue; } @@ -113,19 +118,54 @@ public synchronized void markReferrerForSendingInSharedPreferences(final String } // Save new referrer queue JSON array as string back to shared preferences. - saveStringToSharedPreferences(PREFS_KEY_REFERRERS, newReferrerQueue.toString()); + saveString(PREFS_KEY_REFERRERS, newReferrerQueue.toString()); } catch (JSONException e) { } } + /** + * Check if referrer entry in shared preferences is already marked for sending. + * + * @param referrer Referrer string + * @param clickTime Referrer click time + * @return Boolean indicating whether referrer is marked for sending or not. If no entry, default to false. + */ + public synchronized boolean isReferrerMarkedForSending(final String referrer, final long clickTime) { + // Don't even try to alter null or empty referrers since they shouldn't exist in shared preferences. + if (referrer == null || referrer.length() == 0) { + return false; + } + + try { + // Try to locate position in queue of the referrer that should be altered. + JSONArray referrerQueue = getReferrers(); + int index = getReferrerIndex(referrer, clickTime, referrerQueue); + + // If referrer is not found in the queue, skip the rest. + if (index == -1) { + return false; + } + + JSONArray referrerEntry = referrerQueue.getJSONArray(index); + + if (referrerEntry.length() != PREFS_REFERRER_ENTRY_MAX_SIZE) { + return false; + } + + return referrerEntry.getBoolean(2); + } catch (JSONException e) { + return false; + } + } + /** * Remove referrer information from shared preferences. * * @param referrer Referrer string * @param clickTime Referrer click time */ - public synchronized void removeReferrerFromSharedPreferences(final String referrer, final long clickTime) { + public synchronized void removeReferrer(final String referrer, final long clickTime) { // Don't even try to remove null or empty referrers since they shouldn't exist in shared preferences. if (referrer == null || referrer.length() == 0) { return; @@ -133,7 +173,7 @@ public synchronized void removeReferrerFromSharedPreferences(final String referr try { // Try to locate position in queue of the referrer that should be deleted. - JSONArray referrerQueue = getReferrersFromSharedPreferences(); + JSONArray referrerQueue = getReferrers(); int index = getReferrerIndex(referrer, clickTime, referrerQueue); // If referrer is not found in the queue, skip the rest. @@ -153,7 +193,7 @@ public synchronized void removeReferrerFromSharedPreferences(final String referr } // Save new referrer queue JSON array as string back to shared preferences. - saveStringToSharedPreferences(PREFS_KEY_REFERRERS, newReferrerQueue.toString()); + saveString(PREFS_KEY_REFERRERS, newReferrerQueue.toString()); } catch (JSONException e) { } @@ -164,9 +204,9 @@ public synchronized void removeReferrerFromSharedPreferences(final String referr * * @return JSONArray with all the saved referrers from shared preferences. Empty array if none available. */ - public synchronized JSONArray getReferrersFromSharedPreferences() { + public synchronized JSONArray getReferrers() { try { - String referrerQueueString = getStringFromSharedPreferences(PREFS_KEY_REFERRERS); + String referrerQueueString = getString(PREFS_KEY_REFERRERS); if (referrerQueueString == null) { return new JSONArray(); @@ -178,11 +218,42 @@ public synchronized JSONArray getReferrersFromSharedPreferences() { } } + /** + * Helper method to print all the referrers from shared preferences. + */ + public synchronized void printAllTheReferrers() { + try { + JSONArray referrerQueue = getReferrers(); + + AdjustFactory.getLogger().debug("List of referrers in shared preferences: "); + + for (int i = 0; i < referrerQueue.length(); i += 1) { + JSONArray referrerEntry = referrerQueue.getJSONArray(i); + + String isBeingSent; + String referrer = referrerEntry.getString(0); + String clickTime = String.valueOf(referrerEntry.getLong(1)); + + if (referrerEntry.length() == PREFS_REFERRER_ENTRY_MAX_SIZE) { + isBeingSent = String.valueOf(referrerEntry.getBoolean(2)); + } else { + isBeingSent = "NA"; + } + + AdjustFactory.getLogger().debug("Referrer: " + referrer); + AdjustFactory.getLogger().debug("Click time: " + clickTime); + AdjustFactory.getLogger().debug("Is being sent: " + isBeingSent); + } + } catch (JSONException e) { + + } + } + /** * Remove all key-value pairs from shared preferences. */ - public synchronized void clearSharedPreferences() { - this.sharedPreferences.edit().clear().apply(); + public synchronized void clear() { + this.sharedPreferences.edit().clear().commit(); } /** @@ -191,8 +262,8 @@ public synchronized void clearSharedPreferences() { * @param key Key to be written to shared preferences * @param value Value to be written to shared preferences */ - private synchronized void saveStringToSharedPreferences(final String key, final String value) { - this.sharedPreferences.edit().putString(key, value).apply(); + private synchronized void saveString(final String key, final String value) { + this.sharedPreferences.edit().putString(key, value).commit(); } /** @@ -201,7 +272,7 @@ private synchronized void saveStringToSharedPreferences(final String key, final * @param key Key for which string value should be retrieved * @return String value for given key saved in shared preferences (null if not found) */ - private synchronized String getStringFromSharedPreferences(final String key) { + private synchronized String getString(final String key) { try { return this.sharedPreferences.getString(key, null); } catch (ClassCastException e) { @@ -222,10 +293,10 @@ private int getReferrerIndex(final String referrer, final long clickTime, final JSONArray referrerQueue) throws JSONException { for (int i = 0; i < referrerQueue.length(); i += 1) { - JSONArray referrerPair = referrerQueue.getJSONArray(i); + JSONArray referrerEntry = referrerQueue.getJSONArray(i); - String savedReferrer = referrerPair.getString(0); - long savedClickTime = referrerPair.getLong(1); + String savedReferrer = referrerEntry.getString(0); + long savedClickTime = referrerEntry.getLong(1); if (savedReferrer.equals(referrer) && savedClickTime == clickTime) { return i; From 3bbab2393f7b1661040a9f44fb5b56e1189e4ede Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 21 Jul 2017 12:05:29 +0200 Subject: [PATCH 039/146] isReferrerMarkedForSending overloading --- .../com/adjust/sdk/SharedPreferencesManager.java | 13 +++++++++++++ 1 file changed, 13 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 41903e5da..2b47e5701 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -149,6 +149,19 @@ public synchronized boolean isReferrerMarkedForSending(final String referrer, fi JSONArray referrerEntry = referrerQueue.getJSONArray(index); + return isReferrerMarkedForSending(referrerEntry); + } catch (JSONException e) { + return false; + } + } + + /** + * Check if referrer entry in shared preferences is already marked for sending. + * @param referrerEntry Referrer entry + * @return Boolean indicating whether referrer entry is marked for sending or not + */ + public synchronized boolean isReferrerMarkedForSending(final JSONArray referrerEntry) { + try { if (referrerEntry.length() != PREFS_REFERRER_ENTRY_MAX_SIZE) { return false; } From 490a0a01a18327537bd8a4a21fac9ce4cbc43e79 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 21 Jul 2017 12:15:03 +0200 Subject: [PATCH 040/146] Check if referrer is marked for sending before trying to send it --- .../java/com/adjust/sdk/ActivityHandler.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 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 037d6217c..76803a462 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -766,14 +766,16 @@ private void checkReferrerI() { try { for (int i = 0; i < referrerQueue.length(); i += 1) { - JSONArray referrerPair = referrerQueue.getJSONArray(i); + JSONArray referrerEntry = referrerQueue.getJSONArray(i); - String savedReferrer = referrerPair.getString(0); - long savedClickTime = referrerPair.getLong(1); - - if (referrerPair.length() == 2) { - sendReferrerI(savedReferrer, savedClickTime); + if (sharedPreferencesManager.isReferrerMarkedForSending(referrerEntry)) { + continue; } + + String savedReferrer = referrerEntry.getString(0); + long savedClickTime = referrerEntry.getLong(1); + + sendReferrerI(savedReferrer, savedClickTime); } } catch (JSONException e) { @@ -1195,6 +1197,13 @@ private void sendReferrerI(String referrer, long clickTime) { } SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(adjustConfig.context); + + // Skip sending of the referrer that is already being sent with SdkClickHandler. + if (sharedPreferencesManager.isReferrerMarkedForSending(referrer, clickTime)) { + return; + } + + // If referrer was not being sent, mark it for sending and ask SdkCLickHandler to send it. sharedPreferencesManager.markReferrerForSending(referrer, clickTime); logger.verbose("Referrer to parse (%s)", referrer); From beeadaec8d1f2eccf8a816b60353faffbdec5d5e Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 21 Jul 2017 14:20:45 +0200 Subject: [PATCH 041/146] Send network info as ints --- .../main/java/com/adjust/sdk/DeviceInfo.java | 85 ------------------- .../java/com/adjust/sdk/PackageBuilder.java | 3 +- .../src/main/java/com/adjust/sdk/Util.java | 31 +++++++ 3 files changed, 33 insertions(+), 86 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java index 97905b750..274e6dd68 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -7,8 +7,6 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.database.Cursor; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; import android.net.Uri; import android.os.Build; import android.telephony.TelephonyManager; @@ -63,7 +61,6 @@ class DeviceInfo { String appUpdateTime; String mcc; String mnc; - String networkType; Map pluginKeys; DeviceInfo(Context context, String sdkPrefix) { @@ -102,7 +99,6 @@ class DeviceInfo { appUpdateTime = getAppUpdateTime(context); mcc = getMcc(context); mnc = getMnc(context); - networkType = NetworkUtil.getNetworkType(context); } void reloadDeviceIds(Context context) { @@ -378,85 +374,4 @@ private String getMnc(Context context) { return null; } } - - private static class NetworkUtil { - private final static String NETWORKTYPE_WIFI = "wifi"; - private final static String NETWORKTYPE_UNKNOWN = "unknown"; - private final static String NETWORKTYPE_NOT_CONNECTED = "not_connected"; - - private NetworkUtil() { - } - - // Returns the network type based as one of the NETWORKTYPE_XX const values. - // Priority goes to 'wifi' even if mobile data is enabled - static String getNetworkType(Context context) { - ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); - if (activeNetwork != null) { // connected to the internet - if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) { - // connected to wifi - return NETWORKTYPE_WIFI; - } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) { - // connected to the mobile provider's data plan - return getMobileNetworkType(context); - } - } - - // not connected to the internet - return NETWORKTYPE_NOT_CONNECTED; - } - - private static String getMobileNetworkType(Context context) { - TelephonyManager teleMan = - (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - int networkType = teleMan.getNetworkType(); - - switch (networkType) { - //- Most network types were determined using the table at the end of this page: - // https://en.wikipedia.org/wiki/List_of_mobile_phone_generations - - case TelephonyManager.NETWORK_TYPE_IDEN: - return "2g@iden"; - case TelephonyManager.NETWORK_TYPE_GPRS: - return "2g@gprs"; - case TelephonyManager.NETWORK_TYPE_EDGE: - return "2g@edge"; - case TelephonyManager.NETWORK_TYPE_GSM: - return "2g@gsm"; - - case TelephonyManager.NETWORK_TYPE_UMTS: - return "3g@umts"; - case TelephonyManager.NETWORK_TYPE_1xRTT: - return "3g@1xrtt"; - case TelephonyManager.NETWORK_TYPE_CDMA: - return "3g@cdma"; - case TelephonyManager.NETWORK_TYPE_EHRPD: - return "3g@ehrpd"; - case TelephonyManager.NETWORK_TYPE_EVDO_0: - return "3g@evdo0"; - case TelephonyManager.NETWORK_TYPE_EVDO_A: - return "3g@evdoa"; - case TelephonyManager.NETWORK_TYPE_EVDO_B: - return "3g@evdob"; - case TelephonyManager.NETWORK_TYPE_HSDPA: - return "3g@hsdpa"; - case TelephonyManager.NETWORK_TYPE_HSPA: - return "3g@hspa"; - case TelephonyManager.NETWORK_TYPE_HSUPA: - return "3g@hsupa"; - case TelephonyManager.NETWORK_TYPE_TD_SCDMA: - return "3g@tdscdma"; - - case TelephonyManager.NETWORK_TYPE_HSPAP: - return "4g@hspap"; - case TelephonyManager.NETWORK_TYPE_LTE: - return "4g@lte"; - - case TelephonyManager.NETWORK_TYPE_IWLAN: - return "unknown@iwlan"; - } - - return NETWORKTYPE_UNKNOWN; - } - } } 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 6350d9c89..80c428a82 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -232,7 +232,8 @@ private void injectDeviceInfo(Map parameters) { PackageBuilder.addString(parameters, "vm_isa", deviceInfo.vmInstructionSet); PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); - PackageBuilder.addString(parameters, "network_type", deviceInfo.networkType); + PackageBuilder.addInt(parameters, "connectivity_type", Util.getConnectivityType(adjustConfig.context)); + PackageBuilder.addInt(parameters, "network_type", Util.getNetworkType(adjustConfig.context)); fillPluginKeys(parameters); } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java index 17ba546a2..26aa6144b 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java @@ -13,9 +13,12 @@ import android.content.Context; import android.content.pm.PackageManager; import android.content.res.Configuration; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; import android.os.AsyncTask; import android.os.Looper; import android.provider.Settings.Secure; +import android.telephony.TelephonyManager; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; @@ -446,4 +449,32 @@ public static Boolean getFireTrackingEnabled(ContentResolver contentResolver) { } return null; } + + public static int getConnectivityType(Context context) { + int connectivityType = -1; // default value that will not be send + + try { + ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); + connectivityType = activeNetwork.getType(); + } catch (Exception e) { + getLogger().warn("Couldn't read connectivity type (%s)", e.getMessage()); + } + + return connectivityType; + } + + 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); + networkType = teleMan.getNetworkType(); + } catch (Exception e) { + getLogger().warn("Couldn't read network type (%s)", e.getMessage()); + } + + return networkType; + } } \ No newline at end of file From 853204b4b170e6da9a83be3f52adc2fed6103ec1 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 21 Jul 2017 16:23:43 +0200 Subject: [PATCH 042/146] Read MMC and MNC with each package --- .../main/java/com/adjust/sdk/DeviceInfo.java | 36 ------------------- .../java/com/adjust/sdk/PackageBuilder.java | 4 +-- .../src/main/java/com/adjust/sdk/Util.java | 33 +++++++++++++++++ 3 files changed, 35 insertions(+), 38 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java b/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java index 274e6dd68..2abb3523a 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/DeviceInfo.java @@ -59,8 +59,6 @@ class DeviceInfo { String vmInstructionSet; String appInstallTime; String appUpdateTime; - String mcc; - String mnc; Map pluginKeys; DeviceInfo(Context context, String sdkPrefix) { @@ -97,8 +95,6 @@ class DeviceInfo { vmInstructionSet = getVmInstructionSet(); appInstallTime = getAppInstallTime(context); appUpdateTime = getAppUpdateTime(context); - mcc = getMcc(context); - mnc = getMnc(context); } void reloadDeviceIds(Context context) { @@ -342,36 +338,4 @@ private String getAppUpdateTime(Context context) { return null; } } - - private String getMcc(Context context) { - try { - TelephonyManager tel = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - String networkOperator = tel.getNetworkOperator(); - - if (TextUtils.isEmpty(networkOperator)) { - AdjustFactory.getLogger().warn("Couldn't receive networkOperator string"); - return null; - } - return networkOperator.substring(0, 3); - } catch (Exception ex) { - AdjustFactory.getLogger().warn("Couldn't return mcc"); - return null; - } - } - - private String getMnc(Context context) { - try { - TelephonyManager tel = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - String networkOperator = tel.getNetworkOperator(); - - if (TextUtils.isEmpty(networkOperator)) { - AdjustFactory.getLogger().warn("Couldn't receive networkOperator string"); - return null; - } - return networkOperator.substring(3); - } catch (Exception ex) { - AdjustFactory.getLogger().warn("Couldn't return mnc"); - return null; - } - } } 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 80c428a82..432b22b52 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -230,8 +230,8 @@ private void injectDeviceInfo(Map parameters) { PackageBuilder.addString(parameters, "cpu_type", deviceInfo.abi); PackageBuilder.addString(parameters, "os_build", deviceInfo.buildName); PackageBuilder.addString(parameters, "vm_isa", deviceInfo.vmInstructionSet); - PackageBuilder.addString(parameters, "mcc", deviceInfo.mcc); - PackageBuilder.addString(parameters, "mnc", deviceInfo.mnc); + PackageBuilder.addString(parameters, "mcc", Util.getMcc(adjustConfig.context)); + PackageBuilder.addString(parameters, "mnc", Util.getMnc(adjustConfig.context)); PackageBuilder.addInt(parameters, "connectivity_type", Util.getConnectivityType(adjustConfig.context)); PackageBuilder.addInt(parameters, "network_type", Util.getNetworkType(adjustConfig.context)); fillPluginKeys(parameters); diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java index 26aa6144b..fe8fda7ae 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java @@ -19,6 +19,7 @@ import android.os.Looper; import android.provider.Settings.Secure; import android.telephony.TelephonyManager; +import android.text.TextUtils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; @@ -477,4 +478,36 @@ public static int getNetworkType(Context context) { return networkType; } + + public static String getMcc(Context context) { + try { + TelephonyManager tel = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + String networkOperator = tel.getNetworkOperator(); + + if (TextUtils.isEmpty(networkOperator)) { + AdjustFactory.getLogger().warn("Couldn't receive networkOperator string"); + return null; + } + return networkOperator.substring(0, 3); + } catch (Exception ex) { + AdjustFactory.getLogger().warn("Couldn't return mcc"); + return null; + } + } + + public static String getMnc(Context context) { + try { + TelephonyManager tel = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + String networkOperator = tel.getNetworkOperator(); + + if (TextUtils.isEmpty(networkOperator)) { + AdjustFactory.getLogger().warn("Couldn't receive networkOperator string"); + return null; + } + return networkOperator.substring(3); + } catch (Exception ex) { + AdjustFactory.getLogger().warn("Couldn't return mnc"); + return null; + } + } } \ No newline at end of file From d8fc98196cb6ea09d01394af79a3e008262386e0 Mon Sep 17 00:00:00 2001 From: nonelse Date: Mon, 24 Jul 2017 16:02:39 +0200 Subject: [PATCH 043/146] New version v4.12.0 --- Adjust/adjust/build.gradle | 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 +- CHANGELOG.md | 3 ++- README.md | 2 +- 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 +- 15 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Adjust/adjust/build.gradle b/Adjust/adjust/build.gradle index 3d002eb03..c26d9ded9 100644 --- a/Adjust/adjust/build.gradle +++ b/Adjust/adjust/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.library' def getVersionName() { - return "4.11.5" + return "4.12.0" } android { 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 1985a3c65..4908d06d5 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java @@ -29,7 +29,7 @@ public interface Constants { String BASE_URL = "https://app.adjust.com"; String SCHEME = "https"; String AUTHORITY = "app.adjust.com"; - String CLIENT_SDK = "android4.11.5"; + String CLIENT_SDK = "android4.12.0"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; String DEEPLINK = "deeplink"; diff --git a/Adjust/example/build.gradle b/Adjust/example/build.gradle index 2739992b0..1afb82931 100644 --- a/Adjust/example/build.gradle +++ b/Adjust/example/build.gradle @@ -28,7 +28,7 @@ dependencies { // running mvn package //compile fileTree(dir: '../target', include: ['*.jar']) // using maven repository - //compile 'com.adjust.sdk:adjust-android:4.11.5' + //compile 'com.adjust.sdk:adjust-android:4.12.0' debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5' diff --git a/Adjust/pom.xml b/Adjust/pom.xml index ccd7242de..9355f76da 100644 --- a/Adjust/pom.xml +++ b/Adjust/pom.xml @@ -5,7 +5,7 @@ 4.0.0 adjust-android com.adjust.sdk - 4.11.5 + 4.12.0 jar Adjust Android SDK https://github.com/adjust/android_sdk diff --git a/Adjust/pom_criteo.xml b/Adjust/pom_criteo.xml index 3fac0f5b9..2997314b4 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.11.5 + 4.12.0 jar Adjust Android SDK https://github.com/adjust/android_sdk diff --git a/Adjust/pom_sociomantic.xml b/Adjust/pom_sociomantic.xml index 27dbd2ff6..3c12538ca 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.11.5 + 4.12.0 jar Adjust Android SDK https://github.com/adjust/android_sdk diff --git a/Adjust/pom_trademob.xml b/Adjust/pom_trademob.xml index eb6340bdb..a8696be21 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.11.5 + 4.12.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 5a2f41759..852b795c7 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.11.5"; + clientSdk = "android4.12.0"; suffix = ""; attribution = new AdjustAttribution(); playServices = true; diff --git a/CHANGELOG.md b/CHANGELOG.md index 986f59464..e6f4e5950 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ -### Version 4.11.5 (Xth July 2017) +### Version 4.12.0 (Xth July 2017) #### Added - Don't send `sdk_click` and `sdk_info` packages when disabled +- Set external device id #### Changed - Setting enable/disable or offline/online is now queued diff --git a/README.md b/README.md index 7e43551d7..563eed1ef 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ compile project(":adjust") If you are using Maven, add this line instead: ``` -compile 'com.adjust.sdk:adjust-android:4.11.5' +compile 'com.adjust.sdk:adjust-android:4.12.0' ``` ### Add Google Play Services diff --git a/VERSION b/VERSION index ad2c17edd..815588ef1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.11.5 +4.12.0 diff --git a/doc/english/criteo_plugin.md b/doc/english/criteo_plugin.md index ecba19142..5a2d2c732 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.11.5' +compile 'com.adjust.sdk:adjust-android-criteo:4.12.0' ``` Or integrate adjust with Criteo events by following these steps: diff --git a/doc/english/migrate.md b/doc/english/migrate.md index f7a6e1694..80c764291 100644 --- a/doc/english/migrate.md +++ b/doc/english/migrate.md @@ -1,4 +1,4 @@ -## Migrate your adjust SDK for Android to 4.11.5 from 3.6.2 +## Migrate your adjust SDK for Android to 4.12.0 from 3.6.2 ### The Application class diff --git a/doc/english/sociomantic_plugin.md b/doc/english/sociomantic_plugin.md index e65afd885..451f712c6 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.11.5' +compile 'com.adjust.sdk:adjust-android-sociomantic:4.12.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 8c1d7018a..11a65acad 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.11.5' +compile 'com.adjust.sdk:adjust-android-trademob:4.12.0' ``` Or integrate adjust with Trademob events by following these steps: From eaae0adca19350df2ca28d9f9421f528c186ec9d Mon Sep 17 00:00:00 2001 From: nonelse Date: Mon, 24 Jul 2017 15:17:33 +0200 Subject: [PATCH 044/146] Add external device id --- .../java/com/adjust/sdk/ActivityHandler.java | 51 ++++++++++++++++++- .../java/com/adjust/sdk/ActivityPackage.java | 13 +++++ .../java/com/adjust/sdk/AdjustConfig.java | 5 ++ .../main/java/com/adjust/sdk/Constants.java | 2 + .../java/com/adjust/sdk/PackageBuilder.java | 8 +++ .../java/com/adjust/sdk/PackageHandler.java | 4 ++ .../com/adjust/sdk/SessionParameters.java | 45 +++++++++++++++- 7 files changed, 126 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 76803a462..1814699bd 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -33,6 +33,7 @@ import static com.adjust.sdk.Constants.ACTIVITY_STATE_FILENAME; import static com.adjust.sdk.Constants.ATTRIBUTION_FILENAME; import static com.adjust.sdk.Constants.SESSION_CALLBACK_PARAMETERS_FILENAME; +import static com.adjust.sdk.Constants.SESSION_PARAMETERS_FILENAME; import static com.adjust.sdk.Constants.SESSION_PARTNER_PARAMETERS_FILENAME; public class ActivityHandler implements IActivityHandler { @@ -50,6 +51,7 @@ public class ActivityHandler implements IActivityHandler { private static final String DELAY_START_TIMER_NAME = "Delay Start timer"; private static final String SESSION_CALLBACK_PARAMETERS_NAME = "Session Callback parameters"; private static final String SESSION_PARTNER_PARAMETERS_NAME = "Session Partner parameters"; + private static final String SESSION_PARAMETERS_NAME = "Session parameters"; private CustomScheduledExecutor scheduledExecutor; private IPackageHandler packageHandler; @@ -600,7 +602,7 @@ private void initI() { readAttributionI(adjustConfig.context); readActivityStateI(adjustConfig.context); - sessionParameters = new SessionParameters(); + readSessionParametersI(adjustConfig.context); readSessionCallbackParametersI(adjustConfig.context); readSessionPartnerParametersI(adjustConfig.context); @@ -702,6 +704,10 @@ public void run() { sdkClickHandler = AdjustFactory.getSdkClickHandler(this, toSendI(true)); + if (adjustConfig.externalDeviceId != null) { + setExternalDeviceIdI(adjustConfig.externalDeviceId); + } + if (isToUpdatePackagesI()) { updatePackagesI(); } @@ -1409,6 +1415,9 @@ public static boolean deleteSessionCallbackParameters(Context context) { public static boolean deleteSessionPartnerParameters(Context context) { return context.deleteFile(SESSION_PARTNER_PARAMETERS_FILENAME); } + public static boolean deleteSessionParameters(Context context) { + return context.deleteFile(SESSION_PARAMETERS_FILENAME); + } private void transferSessionPackageI(long now) { PackageBuilder builder = new PackageBuilder(adjustConfig, deviceInfo, activityState, now); @@ -1662,6 +1671,21 @@ public void resetSessionPartnerParametersI() { writeSessionPartnerParametersI(); } + public void setExternalDeviceIdI(String externalDeviceId) { + if (externalDeviceId == null) { + return; + } + + if (sessionParameters.externalDeviceId != null) { + logger.warn("External device id %s will be overwritten", sessionParameters.externalDeviceId); + } + + sessionParameters.externalDeviceId = externalDeviceId; + + writeSessionParametersI(); + } + + private void setPushTokenI(String token) { if (!checkActivityStateI(activityState)) { return; } if (!isEnabledI()) { return; } @@ -1699,6 +1723,21 @@ private void readAttributionI(Context context) { } } + private void readSessionParametersI(Context context) { + try { + sessionParameters = Util.readObject(context, + SESSION_PARAMETERS_FILENAME, + SESSION_PARAMETERS_NAME, + SessionParameters.class); + } catch (Exception e) { + logger.error("Failed to read %s file (%s)", SESSION_PARAMETERS_NAME, e.getMessage()); + } + + if (sessionParameters == null) { + sessionParameters = new SessionParameters(); + } + } + private void readSessionCallbackParametersI(Context context) { try { sessionParameters.callbackParameters = Util.readObject(context, @@ -1783,6 +1822,15 @@ private void writeSessionPartnerParametersI() { } } + private void writeSessionParametersI() { + synchronized (SessionParameters.class) { + if (sessionParameters == null) { + return; + } + Util.writeObject(sessionParameters, adjustConfig.context, SESSION_PARAMETERS_FILENAME, SESSION_PARAMETERS_NAME); + } + } + private void teardownAllSessionParametersS(boolean toDelete) { synchronized (SessionParameters.class) { if (sessionParameters == null) { @@ -1791,6 +1839,7 @@ private void teardownAllSessionParametersS(boolean toDelete) { if (toDelete && adjustConfig != null && adjustConfig.context != null) { deleteSessionCallbackParameters(adjustConfig.context); deleteSessionPartnerParameters(adjustConfig.context); + deleteSessionParameters(adjustConfig.context); } sessionParameters = null; } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java index 69b944384..e37385e3b 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java @@ -30,6 +30,7 @@ public class ActivityPackage implements Serializable { new ObjectStreamField("suffix", String.class), new ObjectStreamField("callbackParameters", (Class>)(Class)Map.class), new ObjectStreamField("partnerParameters", (Class>)(Class)Map.class), + new ObjectStreamField("sessionParameters", SessionParameters.class), }; private transient int hashCode; @@ -46,6 +47,7 @@ public class ActivityPackage implements Serializable { // delay private Map callbackParameters; private Map partnerParameters; + private SessionParameters sessionParameters; private int retries; private long clickTime; @@ -82,6 +84,10 @@ public void setPartnerParameters(Map partnerParameters) { this.partnerParameters = partnerParameters; } + public void setSessionParameters(SessionParameters sessionParameters) { + this.sessionParameters = sessionParameters; + } + public ActivityKind getActivityKind() { return activityKind; } @@ -118,6 +124,10 @@ public Map getPartnerParameters() { return partnerParameters; } + public SessionParameters getSessionParameters() { + return sessionParameters; + } + public ActivityPackage(ActivityKind activityKind) { this.activityKind = activityKind; } @@ -159,6 +169,7 @@ private void readObject(ObjectInputStream stream) throws ClassNotFoundException, suffix = Util.readStringField(fields, "suffix", null); callbackParameters = Util.readObjectField(fields, "callbackParameters", null); partnerParameters = Util.readObjectField(fields, "partnerParameters", null); + sessionParameters = Util.readObjectField(fields, "sessionParameters", null); } @Override @@ -175,6 +186,7 @@ public boolean equals(Object other) { if (!Util.equalString(suffix, otherActivityPackage.suffix)) return false; if (!Util.equalObject(callbackParameters, otherActivityPackage.callbackParameters)) return false; if (!Util.equalObject(partnerParameters, otherActivityPackage.partnerParameters)) return false; + if (!Util.equalObject(sessionParameters, otherActivityPackage.sessionParameters)) return false; return true; } @@ -189,6 +201,7 @@ public int hashCode() { hashCode = 37 * hashCode + Util.hashString(suffix); hashCode = 37 * hashCode + Util.hashObject(callbackParameters); hashCode = 37 * hashCode + Util.hashObject(partnerParameters); + hashCode = 37 * hashCode + Util.hashObject(sessionParameters); } return hashCode; } 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 3d85db767..2d7b1d74e 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -31,6 +31,7 @@ public class AdjustConfig { String pushToken; Boolean startEnabled; boolean startOffline; + String externalDeviceId; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; @@ -131,6 +132,10 @@ public void setUserAgent(String userAgent) { this.userAgent = userAgent; } + public void setExternalDeviceId(String externalDeviceId) { + this.externalDeviceId = externalDeviceId; + } + public boolean isValid() { return appToken != null; } 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 4908d06d5..95f01701d 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java @@ -40,6 +40,8 @@ public interface Constants { String ATTRIBUTION_FILENAME = "AdjustAttribution"; String SESSION_CALLBACK_PARAMETERS_FILENAME = "AdjustSessionCallbackParameters"; String SESSION_PARTNER_PARAMETERS_FILENAME = "AdjustSessionPartnerParameters"; + String SESSION_PARAMETERS_FILENAME = "AdjustSessionParameters"; + String MALFORMED = "malformed"; String SMALL = "small"; 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 432b22b52..8b449622a 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -103,6 +103,7 @@ public ActivityPackage buildEventPackage(AdjustEvent event, Util.mergeParameters(sessionParameters.callbackParameters, event.callbackParameters, "Callback")); PackageBuilder.addMapJson(parameters, PARTNER_PARAMETERS, Util.mergeParameters(sessionParameters.partnerParameters, event.partnerParameters, "Partner")); + PackageBuilder.addString(parameters, "external_device_id", sessionParameters.externalDeviceId); } ActivityPackage eventPackage = getDefaultActivityPackage(ActivityKind.EVENT); eventPackage.setPath("/event"); @@ -112,6 +113,7 @@ public ActivityPackage buildEventPackage(AdjustEvent event, if (isInDelay) { eventPackage.setCallbackParameters(event.callbackParameters); eventPackage.setPartnerParameters(event.partnerParameters); + eventPackage.setSessionParameters(sessionParameters); } return eventPackage; @@ -177,6 +179,7 @@ private Map getAttributableParameters(SessionParameters sessionP if (sessionParameters != null) { PackageBuilder.addMapJson(parameters, CALLBACK_PARAMETERS, sessionParameters.callbackParameters); PackageBuilder.addMapJson(parameters, PARTNER_PARAMETERS, sessionParameters.partnerParameters); + PackageBuilder.addString(parameters, "external_device_id", sessionParameters.externalDeviceId); } return parameters; @@ -188,6 +191,7 @@ private Map getDefaultParameters() { injectDeviceInfo(parameters); injectConfig(parameters); injectActivityState(parameters); + injectSessionParameters(parameters); injectCommonParameters(parameters); // general @@ -273,6 +277,10 @@ private void injectActivityState(Map parameters) { PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); } + private void injectSessionParameters(Map parameters) { + PackageBuilder.addString(parameters, "external_device_id", sessionParameters.externalDeviceId); + } + private void injectCommonParameters(Map parameters) { PackageBuilder.addDate(parameters, "created_at", createdAt); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); 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 958bc9fcf..9d9b1c424 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageHandler.java @@ -245,6 +245,7 @@ public void updatePackagesI(SessionParameters sessionParameters) { logger.debug("Updating package handler queue"); logger.verbose("Session callback parameters: %s", sessionParameters.callbackParameters); logger.verbose("Session partner parameters: %s", sessionParameters.partnerParameters); + logger.verbose("Session parameters: %s", sessionParameters.toStringSerialized()); for (ActivityPackage activityPackage : packageQueue) { Map parameters = activityPackage.getParameters(); @@ -260,6 +261,9 @@ public void updatePackagesI(SessionParameters sessionParameters) { "Partner"); PackageBuilder.addMapJson(parameters, PARTNER_PARAMETERS, mergedPartnerParameters); + + // remaining session parameters + PackageBuilder.addString(parameters, "external_device_id", sessionParameters.externalDeviceId); } writePackageQueueI(); diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/SessionParameters.java b/Adjust/adjust/src/main/java/com/adjust/sdk/SessionParameters.java index 16610e391..2da72b88f 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SessionParameters.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SessionParameters.java @@ -11,10 +11,39 @@ /** * Created by pfms on 29/07/2016. */ -public class SessionParameters { +public class SessionParameters implements Serializable, Cloneable { Map callbackParameters; Map partnerParameters; + String externalDeviceId; + + private static final ObjectStreamField[] serialPersistentFields = { + new ObjectStreamField("externalDeviceId", String.class), + }; + + @Override + public boolean equals(Object other) { + if (other == this) return true; + if (other == null) return false; + if (getClass() != other.getClass()) return false; + SessionParameters otherSessionParameters = (SessionParameters) other; + + if (!Util.equalString(externalDeviceId, otherSessionParameters.externalDeviceId)) return false; + if (!Util.equalObject(callbackParameters, otherSessionParameters.callbackParameters)) return false; + if (!Util.equalObject(partnerParameters, otherSessionParameters.partnerParameters)) return false; + + return true; + } + + @Override + public int hashCode() { + int hashCode = 17; + hashCode = 37 * hashCode + Util.hashString(externalDeviceId); + hashCode = 37 * hashCode + Util.hashObject(callbackParameters); + hashCode = 37 * hashCode + Util.hashObject(partnerParameters); + return hashCode; + } + public SessionParameters deepCopy() { SessionParameters newSessionParameters = new SessionParameters(); if (this.callbackParameters != null) { @@ -23,6 +52,20 @@ public SessionParameters deepCopy() { if (this.partnerParameters != null) { newSessionParameters.partnerParameters = new HashMap(this.partnerParameters); } + newSessionParameters.externalDeviceId = this.externalDeviceId; return newSessionParameters; } + + public String toStringSerialized() { + return String.format("externalDeviceId %s", externalDeviceId); + } + + private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { + ObjectInputStream.GetField fields = stream.readFields(); + + externalDeviceId = Util.readStringField(fields, "externalDeviceId", null); + } + private void writeObject(ObjectOutputStream stream) throws IOException { + stream.defaultWriteObject(); + } } From 1ed656a9b714e76530d8848b84a6edf75106a463 Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 27 Jul 2017 18:33:43 +0200 Subject: [PATCH 045/146] Inject session parameters to builder --- .../java/com/adjust/sdk/ActivityHandler.java | 19 ++++++----- .../java/com/adjust/sdk/PackageBuilder.java | 33 ++++++++----------- 2 files changed, 25 insertions(+), 27 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 1814699bd..8ab82ddfb 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -582,6 +582,7 @@ public ActivityPackage getAttributionPackageI() { PackageBuilder attributionBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, + sessionParameters, now); return attributionBuilder.buildAttributionPackage(); } @@ -888,8 +889,8 @@ private void trackEventI(AdjustEvent event) { activityState.eventCount++; updateActivityStateI(now); - PackageBuilder eventBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, now); - ActivityPackage eventPackage = eventBuilder.buildEventPackage(event, sessionParameters, internalState.isInDelayedStart()); + PackageBuilder eventBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now); + ActivityPackage eventPackage = eventBuilder.buildEventPackage(event, internalState.isInDelayedStart()); packageHandler.addPackage(eventPackage); if (adjustConfig.eventBufferingEnabled) { @@ -1227,7 +1228,7 @@ private void sendReferrerI(String referrer, long clickTime) { clickPackageBuilder.referrer = referrer; clickPackageBuilder.clickTime = clickTime; - ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.REFTAG, sessionParameters); + ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.REFTAG); sdkClickHandler.sendSdkClick(clickPackage); } @@ -1257,7 +1258,7 @@ private void readOpenUrlI(Uri url, long clickTime) { clickPackageBuilder.deeplink = url.toString(); clickPackageBuilder.clickTime = clickTime; - ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.DEEPLINK, sessionParameters); + ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.DEEPLINK); sdkClickHandler.sendSdkClick(clickPackage); } @@ -1287,7 +1288,8 @@ private PackageBuilder queryStringClickPackageBuilderI( long lastInterval = now - activityState.lastActivity; activityState.lastInterval = lastInterval; } - PackageBuilder builder = new PackageBuilder(adjustConfig, deviceInfo, activityState, now); + PackageBuilder builder = new PackageBuilder(adjustConfig, deviceInfo, + activityState, sessionParameters, now); builder.extraParameters = queryStringParameters; builder.attribution = queryStringAttribution; builder.reftag = reftag; @@ -1420,8 +1422,9 @@ public static boolean deleteSessionParameters(Context context) { } private void transferSessionPackageI(long now) { - PackageBuilder builder = new PackageBuilder(adjustConfig, deviceInfo, activityState, now); - ActivityPackage sessionPackage = builder.buildSessionPackage(sessionParameters, internalState.isInDelayedStart()); + PackageBuilder builder = new PackageBuilder(adjustConfig, deviceInfo, activityState, + sessionParameters, now); + ActivityPackage sessionPackage = builder.buildSessionPackage(internalState.isInDelayedStart()); packageHandler.addPackage(sessionPackage); packageHandler.sendFirstPackage(); } @@ -1698,7 +1701,7 @@ private void setPushTokenI(String token) { writeActivityStateI(); long now = System.currentTimeMillis(); - PackageBuilder infoPackageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, now); + PackageBuilder infoPackageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now); ActivityPackage infoPackage = infoPackageBuilder.buildInfoPackage(Constants.PUSH); packageHandler.addPackage(infoPackage); 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 8b449622a..7ff0016e5 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -25,6 +25,7 @@ class PackageBuilder { private AdjustConfig adjustConfig; private DeviceInfo deviceInfo; private ActivityStateCopy activityStateCopy; + private SessionParameters sessionParameters; private long createdAt; // reattributions @@ -65,21 +66,18 @@ private class ActivityStateCopy { public PackageBuilder(AdjustConfig adjustConfig, DeviceInfo deviceInfo, ActivityState activityState, + SessionParameters sessionParameters, long createdAt) { this.adjustConfig = adjustConfig; this.deviceInfo = deviceInfo; this.activityStateCopy = new ActivityStateCopy(activityState); + this.sessionParameters = sessionParameters; this.createdAt = createdAt; } - public ActivityPackage buildSessionPackage(SessionParameters sessionParameters, boolean isInDelay) { + public ActivityPackage buildSessionPackage(boolean isInDelay) { Map parameters; - - if (!isInDelay) { - parameters = getAttributableParameters(sessionParameters); - } else { - parameters = getAttributableParameters(null); - } + parameters = getAttributableParameters(isInDelay); ActivityPackage sessionPackage = getDefaultActivityPackage(ActivityKind.SESSION); sessionPackage.setPath("/session"); @@ -90,7 +88,6 @@ public ActivityPackage buildSessionPackage(SessionParameters sessionParameters, } public ActivityPackage buildEventPackage(AdjustEvent event, - SessionParameters sessionParameters, boolean isInDelay) { Map parameters = getDefaultParameters(); PackageBuilder.addInt(parameters, "event_count", activityStateCopy.eventCount); @@ -100,10 +97,9 @@ public ActivityPackage buildEventPackage(AdjustEvent event, if (!isInDelay) { PackageBuilder.addMapJson(parameters, CALLBACK_PARAMETERS, - Util.mergeParameters(sessionParameters.callbackParameters, event.callbackParameters, "Callback")); + Util.mergeParameters(this.sessionParameters.callbackParameters, event.callbackParameters, "Callback")); PackageBuilder.addMapJson(parameters, PARTNER_PARAMETERS, - Util.mergeParameters(sessionParameters.partnerParameters, event.partnerParameters, "Partner")); - PackageBuilder.addString(parameters, "external_device_id", sessionParameters.externalDeviceId); + Util.mergeParameters(this.sessionParameters.partnerParameters, event.partnerParameters, "Partner")); } ActivityPackage eventPackage = getDefaultActivityPackage(ActivityKind.EVENT); eventPackage.setPath("/event"); @@ -113,14 +109,14 @@ public ActivityPackage buildEventPackage(AdjustEvent event, if (isInDelay) { eventPackage.setCallbackParameters(event.callbackParameters); eventPackage.setPartnerParameters(event.partnerParameters); - eventPackage.setSessionParameters(sessionParameters); + eventPackage.setSessionParameters(this.sessionParameters); } return eventPackage; } - public ActivityPackage buildClickPackage(String source, SessionParameters sessionParameters) { - Map parameters = getAttributableParameters(sessionParameters); + public ActivityPackage buildClickPackage(String source) { + Map parameters = getAttributableParameters(false); PackageBuilder.addString(parameters, "source", source); PackageBuilder.addDate(parameters, "click_time", clickTime); @@ -169,17 +165,16 @@ private ActivityPackage getDefaultActivityPackage(ActivityKind activityKind) { return activityPackage; } - private Map getAttributableParameters(SessionParameters sessionParameters) { + private Map getAttributableParameters(boolean isInDelay) { Map parameters = getDefaultParameters(); PackageBuilder.addDuration(parameters, "last_interval", activityStateCopy.lastInterval); PackageBuilder.addString(parameters, "default_tracker", adjustConfig.defaultTracker); PackageBuilder.addString(parameters, "installed_at", deviceInfo.appInstallTime); PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime); - if (sessionParameters != null) { - PackageBuilder.addMapJson(parameters, CALLBACK_PARAMETERS, sessionParameters.callbackParameters); - PackageBuilder.addMapJson(parameters, PARTNER_PARAMETERS, sessionParameters.partnerParameters); - PackageBuilder.addString(parameters, "external_device_id", sessionParameters.externalDeviceId); + if (!isInDelay) { + PackageBuilder.addMapJson(parameters, CALLBACK_PARAMETERS, this.sessionParameters.callbackParameters); + PackageBuilder.addMapJson(parameters, PARTNER_PARAMETERS, this.sessionParameters.partnerParameters); } return parameters; From 5a7507dcf826f7f8d652c81c127a36a00cc15523 Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 1 Aug 2017 15:04:42 +0200 Subject: [PATCH 046/146] Disable doesn't save referrer --- .../main/java/com/adjust/sdk/AdjustInstance.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 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 ced67b1aa..c1d4c2e64 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -77,14 +77,24 @@ public void sendReferrer(String referrer, Context context) { return; } - SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); - sharedPreferencesManager.saveReferrer(referrer, clickTime); - + // don't save referrer if it's disabled if (checkActivityHandler("referrer")) { + if (activityHandler.isEnabled()) { + saveReferrer(referrer, context, clickTime); + } activityHandler.sendReferrer(referrer, clickTime); + } else { + if (this.startEnabled) { + saveReferrer(referrer, context, clickTime); + } } } + private void saveReferrer(String referrer, Context context, long clickTime) { + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); + sharedPreferencesManager.saveReferrer(referrer, clickTime); + } + public void setOfflineMode(boolean enabled) { if (!checkActivityHandler(enabled, "offline mode", "online mode")) { this.startOffline = enabled; From 75e3dcc5093437e098c519c3322bf5481edd3449 Mon Sep 17 00:00:00 2001 From: Umay Date: Tue, 1 Aug 2017 18:06:51 +0200 Subject: [PATCH 047/146] add null check to startEnabled in sendReferrer --- Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c1d4c2e64..fb46b7072 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -84,7 +84,7 @@ public void sendReferrer(String referrer, Context context) { } activityHandler.sendReferrer(referrer, clickTime); } else { - if (this.startEnabled) { + if (this.startEnabled != null || this.startEnabled) { saveReferrer(referrer, context, clickTime); } } From dc33a3860664225190a07f17aa8f0730daeb1715 Mon Sep 17 00:00:00 2001 From: Umay Date: Wed, 2 Aug 2017 15:21:37 +0200 Subject: [PATCH 048/146] correct saveReferrer condition when sdk is disabled --- Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 fb46b7072..4d072d1b2 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -84,7 +84,7 @@ public void sendReferrer(String referrer, Context context) { } activityHandler.sendReferrer(referrer, clickTime); } else { - if (this.startEnabled != null || this.startEnabled) { + if (this.startEnabled == null || this.startEnabled) { saveReferrer(referrer, context, clickTime); } } From aa5e32333bb402b290acd8bf72fec19fa1904a50 Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 2 Aug 2017 17:40:00 +0200 Subject: [PATCH 049/146] Variable naming cleanup --- .../adjust/sdk/SharedPreferencesManager.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) 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 2b47e5701..958d4bd0c 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -60,12 +60,12 @@ public synchronized void saveReferrer(final String referrer, final long clickTim } // Add new referrer JSONArray entry to the queue. - JSONArray newreferrerEntry = new JSONArray(); + JSONArray newReferrerEntry = new JSONArray(); - newreferrerEntry.put(0, referrer); - newreferrerEntry.put(1, clickTime); + newReferrerEntry.put(0, referrer); + newReferrerEntry.put(1, clickTime); - referrerQueue.put(newreferrerEntry); + referrerQueue.put(newReferrerEntry); // Save JSON array as string back to shared preferences. saveString(PREFS_KEY_REFERRERS, referrerQueue.toString()); @@ -103,13 +103,13 @@ public synchronized void markReferrerForSending(final String referrer, final lon for (int i = 0; i < referrerQueue.length(); i += 1) { if (i == index) { - JSONArray alteredreferrerEntry = new JSONArray(); + JSONArray alteredReferrerEntry = new JSONArray(); - alteredreferrerEntry.put(0, referrerEntry.get(0)); - alteredreferrerEntry.put(1, referrerEntry.get(1)); - alteredreferrerEntry.put(2, true); + alteredReferrerEntry.put(0, referrerEntry.get(0)); + alteredReferrerEntry.put(1, referrerEntry.get(1)); + alteredReferrerEntry.put(2, true); - newReferrerQueue.put(alteredreferrerEntry); + newReferrerQueue.put(alteredReferrerEntry); continue; } From 9d79d60caf58d2eccf37ed2e18aec7a407167eae Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 3 Aug 2017 11:23:54 +0200 Subject: [PATCH 050/146] Add app secret --- .../java/com/adjust/sdk/AdjustConfig.java | 5 + .../java/com/adjust/sdk/PackageBuilder.java | 3 + .../java/com/adjust/sdk/UtilNetworking.java | 115 ++++++++++++++++++ 3 files changed, 123 insertions(+) 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 2d7b1d74e..a2bbe2d7d 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -32,6 +32,7 @@ public class AdjustConfig { Boolean startEnabled; boolean startOffline; String externalDeviceId; + String appSecret; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; @@ -136,6 +137,10 @@ public void setExternalDeviceId(String externalDeviceId) { this.externalDeviceId = externalDeviceId; } + public void setAppSecret(long info1, long info2, long info3, long info4) { + this.appSecret = String.format("%d%d%d%d", info1, info2, info3, info4); + } + public boolean isValid() { return appToken != null; } 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 7ff0016e5..16bf005fd 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -262,6 +262,9 @@ private void injectConfig(Map parameters) { PackageBuilder.addString(parameters, "fire_adid", fireAdId); Boolean fireTrackingEnabled = Util.getFireTrackingEnabled(contentResolver); PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", fireTrackingEnabled); + + PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); + } private void injectActivityState(Map parameters) { 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 3eb71aa37..30a5b17c6 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java @@ -41,6 +41,10 @@ public static ResponseData createPOSTHttpsURLConnection(String urlString, Activi Map parameters = new HashMap(activityPackage.getParameters()); setDefaultHttpsUrlConnectionProperties(connection, activityPackage.getClientSdk()); + String authorizationHeader = buildAuthorizationHeader(parameters, activityPackage.getClientSdk(), activityPackage.getActivityKind().toString()); + if (authorizationHeader != null) { + connection.setRequestProperty("Authorization", authorizationHeader); + } connection.setRequestMethod("POST"); connection.setUseCaches(false); @@ -74,6 +78,11 @@ public static ResponseData createGETHttpsURLConnection(ActivityPackage activityP setDefaultHttpsUrlConnectionProperties(connection, activityPackage.getClientSdk()); + String authorizationHeader = buildAuthorizationHeader(parameters, activityPackage.getClientSdk(), activityPackage.getActivityKind().toString()); + if (authorizationHeader != null) { + connection.setRequestProperty("Authorization", authorizationHeader); + } + connection.setRequestMethod("GET"); ResponseData responseData = readHttpResponse(connection, activityPackage); @@ -227,4 +236,110 @@ private static Uri buildUri(String path, Map parameters) { return uriBuilder.build(); } + + private static String buildAuthorizationHeader(Map parameters, + String clientSdk, + String activityKind) { + String appSecretName = "app_secret"; + String appSecret = parameters.get(appSecretName); + + // check if the secret exists and it's not empty + if (appSecret == null || appSecret.length() == 0) { + return null; + } + + Map signatureDetails = getSignature(parameters, clientSdk, activityKind, appSecret); + + String algorithm = "md5"; + String signature = Util.md5(signatureDetails.get("clear_signature")); + String fields = signatureDetails.get("fields"); + + parameters.remove("app_secret"); + + String signatureHeader = String.format("signature=\"%s\"", signature); + String algorithmHeader = String.format("algorithm=\"%s\"", algorithm); + String fieldsHeader = String.format("headers=\"%s\"", fields); + + String authorizationHeader = String.format("Signature %s,%s,%s", signatureHeader, algorithmHeader, fieldsHeader); + getLogger().verbose("authorizationHeader clear: %s", authorizationHeader); + + return authorizationHeader; + } + + private static Map getSignature( + final Map parameters, + final String clientSdk, + final String activityKind, + final String appSecret) { + String sdkVersionName = "sdk_version"; + String sdkVersion = clientSdk; + + String appVersionName = "app_version"; + String appVersion = parameters.get(appVersionName); + + String activityKindName = "activity_kind"; + String activityKindValue = activityKind; + + String createdAtName = "created_at"; + String createdAt = parameters.get(createdAtName); + + String deviceIdentifierName = getValidIdentifier(parameters); + String deviceIdentifier = parameters.get(deviceIdentifierName); + + Map signatureParams = new HashMap(); + + signatureParams.put("app_secret", appSecret); + signatureParams.put(sdkVersionName, sdkVersion); + signatureParams.put(appVersionName, appVersion); + signatureParams.put(createdAtName, createdAt); + signatureParams.put(activityKindName, activityKindValue); + signatureParams.put(deviceIdentifierName, deviceIdentifier); + + String fields = ""; + String clearSignature = ""; + + for (Map.Entry entry : signatureParams.entrySet()) { + if (entry.getValue() != null) { + fields += entry.getKey() + " "; + clearSignature += entry.getValue(); + } + } + + // Remove last empty space. + fields = fields.substring(0, fields.length() - 1); + + HashMap signature = new HashMap(); + + signature.put("clear_signature", clearSignature); + signature.put("fields", fields); + + return signature; + } + + private static String getValidIdentifier(final Map parameters) { + String googleAdIdName = "gps_adid"; + String fireAdIdName = "fire_adid"; + String androidIdName = "android_id"; + String macSha1Name = "mac_sha1"; + String macMd5Name = "mac_md5"; + + if (parameters.get(googleAdIdName) != null) { + return googleAdIdName; + } + if (parameters.get(fireAdIdName) != null) { + return fireAdIdName; + } + if (parameters.get(androidIdName) != null) { + return androidIdName; + } + if (parameters.get(macSha1Name) != null) { + return macSha1Name; + } + if (parameters.get(macMd5Name) != null) { + return macMd5Name; + } + + return null; + } + } From caeb038e86027e3c4ba4c8db9ce8a9e17f1cfc67 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 3 Aug 2017 16:59:57 +0200 Subject: [PATCH 051/146] Distinguish between same error messages --- Adjust/adjust/src/main/java/com/adjust/sdk/Util.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java index fe8fda7ae..d31255d15 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java @@ -485,7 +485,7 @@ public static String getMcc(Context context) { String networkOperator = tel.getNetworkOperator(); if (TextUtils.isEmpty(networkOperator)) { - AdjustFactory.getLogger().warn("Couldn't receive networkOperator string"); + AdjustFactory.getLogger().warn("Couldn't receive networkOperator string to read MCC"); return null; } return networkOperator.substring(0, 3); @@ -501,7 +501,7 @@ public static String getMnc(Context context) { String networkOperator = tel.getNetworkOperator(); if (TextUtils.isEmpty(networkOperator)) { - AdjustFactory.getLogger().warn("Couldn't receive networkOperator string"); + AdjustFactory.getLogger().warn("Couldn't receive networkOperator string to read MNC"); return null; } return networkOperator.substring(3); From e7fa2236b5a2119de6151ffe0967529b4becba27 Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 3 Aug 2017 17:09:59 +0200 Subject: [PATCH 052/146] Remove secret from get query --- .../java/com/adjust/sdk/UtilNetworking.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) 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 30a5b17c6..6e6445d1b 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java @@ -40,8 +40,10 @@ public static ResponseData createPOSTHttpsURLConnection(String urlString, Activi HttpsURLConnection connection = AdjustFactory.getHttpsURLConnection(url); Map parameters = new HashMap(activityPackage.getParameters()); + String appSecret = extractAppSecret(parameters); + setDefaultHttpsUrlConnectionProperties(connection, activityPackage.getClientSdk()); - String authorizationHeader = buildAuthorizationHeader(parameters, activityPackage.getClientSdk(), activityPackage.getActivityKind().toString()); + String authorizationHeader = buildAuthorizationHeader(parameters, appSecret, activityPackage.getClientSdk(), activityPackage.getActivityKind().toString()); if (authorizationHeader != null) { connection.setRequestProperty("Authorization", authorizationHeader); } @@ -72,17 +74,19 @@ public static ResponseData createPOSTHttpsURLConnection(String urlString, Activi public static ResponseData createGETHttpsURLConnection(ActivityPackage activityPackage) throws Exception { try { Map parameters = new HashMap(activityPackage.getParameters()); + String appSecret = extractAppSecret(parameters); + Uri uri = buildUri(activityPackage.getPath(), parameters); URL url = new URL(uri.toString()); HttpsURLConnection connection = AdjustFactory.getHttpsURLConnection(url); - setDefaultHttpsUrlConnectionProperties(connection, activityPackage.getClientSdk()); - - String authorizationHeader = buildAuthorizationHeader(parameters, activityPackage.getClientSdk(), activityPackage.getActivityKind().toString()); + String authorizationHeader = buildAuthorizationHeader(parameters, appSecret, activityPackage.getClientSdk(), activityPackage.getActivityKind().toString()); if (authorizationHeader != null) { connection.setRequestProperty("Authorization", authorizationHeader); } + setDefaultHttpsUrlConnectionProperties(connection, activityPackage.getClientSdk()); + connection.setRequestMethod("GET"); ResponseData responseData = readHttpResponse(connection, activityPackage); @@ -237,16 +241,19 @@ private static Uri buildUri(String path, Map parameters) { return uriBuilder.build(); } + private static String extractAppSecret(Map parameters) { + return parameters.remove("app_secret"); + } + private static String buildAuthorizationHeader(Map parameters, + String appSecret, String clientSdk, String activityKind) { - String appSecretName = "app_secret"; - String appSecret = parameters.get(appSecretName); - // check if the secret exists and it's not empty if (appSecret == null || appSecret.length() == 0) { return null; } + String appSecretName = "app_secret"; Map signatureDetails = getSignature(parameters, clientSdk, activityKind, appSecret); @@ -254,8 +261,6 @@ private static String buildAuthorizationHeader(Map parameters, String signature = Util.md5(signatureDetails.get("clear_signature")); String fields = signatureDetails.get("fields"); - parameters.remove("app_secret"); - String signatureHeader = String.format("signature=\"%s\"", signature); String algorithmHeader = String.format("algorithm=\"%s\"", algorithm); String fieldsHeader = String.format("headers=\"%s\"", fields); From 07e23374fc394f512dbb0e44657434f0cbfe2acc Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 3 Aug 2017 18:34:00 +0200 Subject: [PATCH 053/146] Check for referrer on each app foregrounding --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 6 +----- 1 file changed, 1 insertion(+), 5 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 8ab82ddfb..3c5c9470e 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -715,11 +715,7 @@ public void run() { preLaunchActionsI(adjustConfig.preLaunchActionsArray); - // only try to read referrer from init after first launch with success - if (internalState.isNotFirstLaunch()) - { - checkReferrerI(); - } + checkReferrerI(); } private void readConfigFile(Context context) { From fde2db635809fa54790438b5549d6429f324b5ae Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 4 Aug 2017 15:59:41 +0200 Subject: [PATCH 054/146] Referrer logic reloaded attempt --- .../java/com/adjust/sdk/ActivityHandler.java | 18 +-- .../java/com/adjust/sdk/AdjustInstance.java | 2 +- .../adjust/sdk/SharedPreferencesManager.java | 106 ++++-------------- 3 files changed, 24 insertions(+), 102 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 3c5c9470e..4bc84e9ed 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -415,7 +415,8 @@ public void sendReferrer(final String referrer, final long clickTime) { scheduledExecutor.submit(new Runnable() { @Override public void run() { - sendReferrerI(referrer, clickTime); + // sendReferrerI(referrer, clickTime); + checkReferrerI(); } }); } @@ -771,10 +772,6 @@ private void checkReferrerI() { for (int i = 0; i < referrerQueue.length(); i += 1) { JSONArray referrerEntry = referrerQueue.getJSONArray(i); - if (sharedPreferencesManager.isReferrerMarkedForSending(referrerEntry)) { - continue; - } - String savedReferrer = referrerEntry.getString(0); long savedClickTime = referrerEntry.getLong(1); @@ -804,8 +801,6 @@ private void processSessionI() { activityState.updatePackages = internalState.itHasToUpdatePackages(); writeActivityStateI(); - // check referrer after first launch with success - checkReferrerI(); return; } @@ -1201,14 +1196,6 @@ private void sendReferrerI(String referrer, long clickTime) { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(adjustConfig.context); - // Skip sending of the referrer that is already being sent with SdkClickHandler. - if (sharedPreferencesManager.isReferrerMarkedForSending(referrer, clickTime)) { - return; - } - - // If referrer was not being sent, mark it for sending and ask SdkCLickHandler to send it. - sharedPreferencesManager.markReferrerForSending(referrer, clickTime); - logger.verbose("Referrer to parse (%s)", referrer); UrlQuerySanitizer querySanitizer = new UrlQuerySanitizer(); @@ -1227,6 +1214,7 @@ private void sendReferrerI(String referrer, long clickTime) { ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.REFTAG); sdkClickHandler.sendSdkClick(clickPackage); + sharedPreferencesManager.removeReferrer(referrer, clickTime); } private void readOpenUrlI(Uri url, long clickTime) { 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 4d072d1b2..f4dc1dd3f 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -81,8 +81,8 @@ public void sendReferrer(String referrer, Context context) { if (checkActivityHandler("referrer")) { if (activityHandler.isEnabled()) { saveReferrer(referrer, context, clickTime); + activityHandler.sendReferrer(referrer, clickTime); } - activityHandler.sendReferrer(referrer, clickTime); } else { if (this.startEnabled == null || this.startEnabled) { saveReferrer(referrer, context, clickTime); 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 958d4bd0c..5c02d3ae3 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -75,19 +75,19 @@ public synchronized void saveReferrer(final String referrer, final long clickTim } /** - * Mark referrer entry in referrer queue as currently being sent from sdk_click handler. + * Remove referrer information from shared preferences. * * @param referrer Referrer string * @param clickTime Referrer click time */ - public synchronized void markReferrerForSending(final String referrer, final long clickTime) { - // Don't even try to alter null or empty referrers since they shouldn't exist in shared preferences. + public synchronized void removeReferrer(final String referrer, final long clickTime) { + // Don't even try to remove null or empty referrers since they shouldn't exist in shared preferences. if (referrer == null || referrer.length() == 0) { return; } try { - // Try to locate position in queue of the referrer that should be altered. + // Try to locate position in queue of the referrer that should be deleted. JSONArray referrerQueue = getReferrers(); int index = getReferrerIndex(referrer, clickTime, referrerQueue); @@ -96,21 +96,11 @@ public synchronized void markReferrerForSending(final String referrer, final lon return; } - JSONArray referrerEntry = referrerQueue.getJSONArray(index); - - // Rebuild queue and alter the aimed referrer info entry. + // Rebuild queue without referrer that should be removed. JSONArray newReferrerQueue = new JSONArray(); for (int i = 0; i < referrerQueue.length(); i += 1) { if (i == index) { - JSONArray alteredReferrerEntry = new JSONArray(); - - alteredReferrerEntry.put(0, referrerEntry.get(0)); - alteredReferrerEntry.put(1, referrerEntry.get(1)); - alteredReferrerEntry.put(2, true); - - newReferrerQueue.put(alteredReferrerEntry); - continue; } @@ -125,90 +115,34 @@ public synchronized void markReferrerForSending(final String referrer, final lon } /** - * Check if referrer entry in shared preferences is already marked for sending. + * Check if give referrer is saved in shared preferences. * - * @param referrer Referrer string + * @param referrer Referrer string * @param clickTime Referrer click time - * @return Boolean indicating whether referrer is marked for sending or not. If no entry, default to false. - */ - public synchronized boolean isReferrerMarkedForSending(final String referrer, final long clickTime) { - // Don't even try to alter null or empty referrers since they shouldn't exist in shared preferences. - if (referrer == null || referrer.length() == 0) { - return false; - } - - try { - // Try to locate position in queue of the referrer that should be altered. - JSONArray referrerQueue = getReferrers(); - int index = getReferrerIndex(referrer, clickTime, referrerQueue); - - // If referrer is not found in the queue, skip the rest. - if (index == -1) { - return false; - } - - JSONArray referrerEntry = referrerQueue.getJSONArray(index); - - return isReferrerMarkedForSending(referrerEntry); - } catch (JSONException e) { - return false; - } - } - - /** - * Check if referrer entry in shared preferences is already marked for sending. - * @param referrerEntry Referrer entry - * @return Boolean indicating whether referrer entry is marked for sending or not - */ - public synchronized boolean isReferrerMarkedForSending(final JSONArray referrerEntry) { - try { - if (referrerEntry.length() != PREFS_REFERRER_ENTRY_MAX_SIZE) { - return false; - } - - return referrerEntry.getBoolean(2); - } catch (JSONException e) { - return false; - } - } - - /** - * Remove referrer information from shared preferences. * - * @param referrer Referrer string - * @param clickTime Referrer click time + * @return boolean indicating whether given referrer exist in shared preferences or not. + * In case of exception, return false. */ - public synchronized void removeReferrer(final String referrer, final long clickTime) { - // Don't even try to remove null or empty referrers since they shouldn't exist in shared preferences. - if (referrer == null || referrer.length() == 0) { - return; - } - + public synchronized boolean doesReferrerExist(final String referrer, final long clickTime) { try { - // Try to locate position in queue of the referrer that should be deleted. JSONArray referrerQueue = getReferrers(); - int index = getReferrerIndex(referrer, clickTime, referrerQueue); - // If referrer is not found in the queue, skip the rest. - if (index == -1) { - return; - } + for (int i = 0; i < referrerQueue.length(); i += 1) { + JSONArray referrerEntry = referrerQueue.getJSONArray(i); - // Rebuild queue without referrer that should be removed. - JSONArray newReferrerQueue = new JSONArray(); + String savedReferrer = referrerEntry.getString(0); + long savedClickTime = referrerEntry.getLong(1); - for (int i = 0; i < referrerQueue.length(); i += 1) { - if (i == index) { - continue; + if (savedReferrer.equals(referrer)) { + if (savedClickTime == clickTime) { + return true; + } } - - newReferrerQueue.put(referrerQueue.getJSONArray(i)); } - // Save new referrer queue JSON array as string back to shared preferences. - saveString(PREFS_KEY_REFERRERS, newReferrerQueue.toString()); + return false; } catch (JSONException e) { - + return false; } } From e32db152c3b3eb95ca895c47babf0352e4debb87 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 4 Aug 2017 23:48:01 +0200 Subject: [PATCH 055/146] Extract sdk_click package creation from ActivityHandler to PackageFactory --- .../java/com/adjust/sdk/ActivityHandler.java | 140 ++----------- .../java/com/adjust/sdk/PackageFactory.java | 195 ++++++++++++++++++ 2 files changed, 215 insertions(+), 120 deletions(-) create mode 100644 Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java 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 4bc84e9ed..5de4b612e 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1188,143 +1188,43 @@ private void setAskingAttributionI(boolean askingAttribution) { } private void sendReferrerI(String referrer, long clickTime) { - if (!isEnabledI()) { return; } - - if (referrer == null || referrer.length() == 0) { + if (!isEnabledI()) { return; } - SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(adjustConfig.context); - - logger.verbose("Referrer to parse (%s)", referrer); - - UrlQuerySanitizer querySanitizer = new UrlQuerySanitizer(); - querySanitizer.setUnregisteredParameterValueSanitizer(UrlQuerySanitizer.getAllButNulLegal()); - querySanitizer.setAllowUnregisteredParamaters(true); - querySanitizer.parseQuery(referrer); - - PackageBuilder clickPackageBuilder = queryStringClickPackageBuilderI(querySanitizer.getParameterList()); + ActivityPackage sdkClickPackage = PackageFactory.getSdkClickPackage( + referrer, + clickTime, + activityState, + adjustConfig, + deviceInfo, + sessionParameters); - if (clickPackageBuilder == null) { + if (sdkClickPackage == null) { return; } - clickPackageBuilder.referrer = referrer; - clickPackageBuilder.clickTime = clickTime; - ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.REFTAG); - - sdkClickHandler.sendSdkClick(clickPackage); - sharedPreferencesManager.removeReferrer(referrer, clickTime); + sdkClickHandler.sendSdkClick(sdkClickPackage); } private void readOpenUrlI(Uri url, long clickTime) { - if (!isEnabledI()) { return; } - - if (url == null) { - return; - } - - String urlString = url.toString(); - if (urlString == null || urlString.length() == 0) { + if (!isEnabledI()) { return; } - logger.verbose("Url to parse (%s)", url); - UrlQuerySanitizer querySanitizer = new UrlQuerySanitizer(); - querySanitizer.setUnregisteredParameterValueSanitizer(UrlQuerySanitizer.getAllButNulLegal()); - querySanitizer.setAllowUnregisteredParamaters(true); - querySanitizer.parseUrl(urlString); + ActivityPackage sdkClickPackage = PackageFactory.getSdkClickPackage( + url, + clickTime, + activityState, + adjustConfig, + deviceInfo, + sessionParameters); - PackageBuilder clickPackageBuilder = queryStringClickPackageBuilderI(querySanitizer.getParameterList()); - if (clickPackageBuilder == null) { + if (sdkClickPackage == null) { return; } - clickPackageBuilder.deeplink = url.toString(); - clickPackageBuilder.clickTime = clickTime; - ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.DEEPLINK); - - sdkClickHandler.sendSdkClick(clickPackage); - } - - private PackageBuilder queryStringClickPackageBuilderI( - List queryList) - { - if (queryList == null) { - return null; - } - - Map queryStringParameters = new LinkedHashMap(); - AdjustAttribution queryStringAttribution = new AdjustAttribution(); - - for (UrlQuerySanitizer.ParameterValuePair parameterValuePair : queryList) { - readQueryStringI(parameterValuePair.mParameter, - parameterValuePair.mValue, - queryStringParameters, queryStringAttribution); - } - - String reftag = queryStringParameters.remove(Constants.REFTAG); - - long now = System.currentTimeMillis(); - // check of activity state != null - // because referrer can be called before onResume - if (activityState != null) { - long lastInterval = now - activityState.lastActivity; - activityState.lastInterval = lastInterval; - } - PackageBuilder builder = new PackageBuilder(adjustConfig, deviceInfo, - activityState, sessionParameters, now); - builder.extraParameters = queryStringParameters; - builder.attribution = queryStringAttribution; - builder.reftag = reftag; - - return builder; - } - - private boolean readQueryStringI(String key, String value, - Map extraParameters, - AdjustAttribution queryStringAttribution) { - if (key == null || value == null) { return false; } - - // parameter key does not start with "adjust_" - if (!key.startsWith(ADJUST_PREFIX)) { return false; } - - String keyWOutPrefix = key.substring(ADJUST_PREFIX.length()); - if (keyWOutPrefix.length() == 0) { return false; } - - if (value.length() == 0) { return false;} - - if (!trySetAttributionI(queryStringAttribution, keyWOutPrefix, value)) { - extraParameters.put(keyWOutPrefix, value); - } - - return true; - } - - private boolean trySetAttributionI(AdjustAttribution queryStringAttribution, - String key, - String value) { - if (key.equals("tracker")) { - queryStringAttribution.trackerName = value; - return true; - } - - if (key.equals("campaign")) { - queryStringAttribution.campaign = value; - return true; - } - - if (key.equals("adgroup")) { - queryStringAttribution.adgroup = value; - return true; - } - - if (key.equals("creative")) { - queryStringAttribution.creative = value; - return true; - } - - return false; + sdkClickHandler.sendSdkClick(sdkClickPackage); } private void updateHandlersStatusAndSendI() { diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java new file mode 100644 index 000000000..5909f69e7 --- /dev/null +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java @@ -0,0 +1,195 @@ +package com.adjust.sdk; + +import android.net.Uri; +import android.net.UrlQuerySanitizer; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by uerceg on 04.08.17. + */ + +public class PackageFactory { + private static final String ADJUST_PREFIX = "adjust_"; + + public static ActivityPackage getSdkClickPackage(final String referrer, + final long clickTime, + final ActivityState activityState, + final AdjustConfig adjustConfig, + final DeviceInfo deviceInfo, + final SessionParameters sessionParameters) { + if (referrer == null || referrer.length() == 0) { + return null; + } + + AdjustFactory.getLogger().verbose("Referrer to parse (%s)", referrer); + + UrlQuerySanitizer querySanitizer = new UrlQuerySanitizer(); + querySanitizer.setUnregisteredParameterValueSanitizer(UrlQuerySanitizer.getAllButNulLegal()); + querySanitizer.setAllowUnregisteredParamaters(true); + querySanitizer.parseQuery(referrer); + + PackageBuilder clickPackageBuilder = queryStringClickPackageBuilder( + querySanitizer.getParameterList(), + activityState, + adjustConfig, + deviceInfo, + sessionParameters); + + if (clickPackageBuilder == null) { + return null; + } + + clickPackageBuilder.referrer = referrer; + clickPackageBuilder.clickTime = clickTime; + + ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.REFTAG); + + return clickPackage; + } + + public static ActivityPackage getSdkClickPackage(final Uri url, + final long clickTime, + final ActivityState activityState, + final AdjustConfig adjustConfig, + final DeviceInfo deviceInfo, + final SessionParameters sessionParameters) { + if (url == null) { + return null; + } + + String urlString = url.toString(); + + if (urlString == null || urlString.length() == 0) { + return null; + } + + AdjustFactory.getLogger().verbose("Url to parse (%s)", url); + + UrlQuerySanitizer querySanitizer = new UrlQuerySanitizer(); + querySanitizer.setUnregisteredParameterValueSanitizer(UrlQuerySanitizer.getAllButNulLegal()); + querySanitizer.setAllowUnregisteredParamaters(true); + querySanitizer.parseUrl(urlString); + + PackageBuilder clickPackageBuilder = queryStringClickPackageBuilder( + querySanitizer.getParameterList(), + activityState, + adjustConfig, + deviceInfo, + sessionParameters); + + if (clickPackageBuilder == null) { + return null; + } + + clickPackageBuilder.deeplink = url.toString(); + clickPackageBuilder.clickTime = clickTime; + + ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.DEEPLINK); + + return clickPackage; + } + + private static PackageBuilder queryStringClickPackageBuilder( + final List queryList, + final ActivityState activityState, + final AdjustConfig adjustConfig, + final DeviceInfo deviceInfo, + final SessionParameters sessionParameters) { + if (queryList == null) { + return null; + } + + Map queryStringParameters = new LinkedHashMap(); + AdjustAttribution queryStringAttribution = new AdjustAttribution(); + + for (UrlQuerySanitizer.ParameterValuePair parameterValuePair : queryList) { + readQueryString( + parameterValuePair.mParameter, + parameterValuePair.mValue, + queryStringParameters, + queryStringAttribution); + } + + long now = System.currentTimeMillis(); + String reftag = queryStringParameters.remove(Constants.REFTAG); + + // Check if activity state != null + // (referrer can be called before onResume) + if (activityState != null) { + long lastInterval = now - activityState.lastActivity; + activityState.lastInterval = lastInterval; + } + + PackageBuilder builder = new PackageBuilder( + adjustConfig, + deviceInfo, + activityState, + sessionParameters, + now); + + builder.extraParameters = queryStringParameters; + builder.attribution = queryStringAttribution; + builder.reftag = reftag; + + return builder; + } + + private static boolean readQueryString(final String key, + final String value, + final Map extraParameters, + AdjustAttribution queryStringAttribution) { + if (key == null || value == null) { + return false; + } + + // Parameter key does not start with "adjust_" prefix. + if (!key.startsWith(ADJUST_PREFIX)) { + return false; + } + + String keyWOutPrefix = key.substring(ADJUST_PREFIX.length()); + + if (keyWOutPrefix.length() == 0) { + return false; + } + + if (value.length() == 0) { + return false; + } + + if (!tryToSetAttribution(queryStringAttribution, keyWOutPrefix, value)) { + extraParameters.put(keyWOutPrefix, value); + } + + return true; + } + + private static boolean tryToSetAttribution(AdjustAttribution queryStringAttribution, + final String key, + final String value) { + if (key.equals("tracker")) { + queryStringAttribution.trackerName = value; + return true; + } + + if (key.equals("campaign")) { + queryStringAttribution.campaign = value; + return true; + } + + if (key.equals("adgroup")) { + queryStringAttribution.adgroup = value; + return true; + } + + if (key.equals("creative")) { + queryStringAttribution.creative = value; + return true; + } + + return false; + } +} From a71b77c159196aae8c041292783ef22aa4dc146a Mon Sep 17 00:00:00 2001 From: uerceg Date: Sat, 5 Aug 2017 00:31:58 +0200 Subject: [PATCH 056/146] Move referrer sdk_click package read/delete to SdkClickHandler --- .../java/com/adjust/sdk/ActivityHandler.java | 58 +++++++------------ .../java/com/adjust/sdk/AdjustInstance.java | 2 +- .../java/com/adjust/sdk/ISdkClickHandler.java | 5 ++ .../java/com/adjust/sdk/SdkClickHandler.java | 58 +++++++++++++++++-- 4 files changed, 81 insertions(+), 42 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 5de4b612e..b36d24310 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -43,7 +43,6 @@ public class ActivityHandler implements IActivityHandler { private static long SESSION_INTERVAL; private static long SUBSESSION_INTERVAL; private static final String TIME_TRAVEL = "Time travel!"; - private static final String ADJUST_PREFIX = "adjust_"; private static final String ACTIVITY_STATE_NAME = "Activity state"; private static final String ATTRIBUTION_NAME = "Attribution"; private static final String FOREGROUND_TIMER_NAME = "Foreground timer"; @@ -63,7 +62,7 @@ public class ActivityHandler implements IActivityHandler { private InternalState internalState; private DeviceInfo deviceInfo; - AdjustConfig adjustConfig; // always valid after construction + private AdjustConfig adjustConfig; // always valid after construction private AdjustAttribution attribution; private IAttributionHandler attributionHandler; private ISdkClickHandler sdkClickHandler; @@ -216,6 +215,22 @@ public void run() { }); } + public AdjustConfig getAdjustConfig() { + return adjustConfig; + } + + public DeviceInfo getDeviceInfo() { + return deviceInfo; + } + + public ActivityState getActivityState() { + return activityState; + } + + public SessionParameters getSessionParameters() { + return sessionParameters; + } + @Override public void init(AdjustConfig adjustConfig) { this.adjustConfig = adjustConfig; @@ -415,8 +430,7 @@ public void sendReferrer(final String referrer, final long clickTime) { scheduledExecutor.submit(new Runnable() { @Override public void run() { - // sendReferrerI(referrer, clickTime); - checkReferrerI(); + sendReferrerI(); } }); } @@ -716,7 +730,7 @@ public void run() { preLaunchActionsI(adjustConfig.preLaunchActionsArray); - checkReferrerI(); + sendReferrerI(); } private void readConfigFile(Context context) { @@ -764,24 +778,6 @@ private void startI() { checkAttributionStateI(); } - private void checkReferrerI() { - SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(adjustConfig.context); - JSONArray referrerQueue = sharedPreferencesManager.getReferrers(); - - try { - for (int i = 0; i < referrerQueue.length(); i += 1) { - JSONArray referrerEntry = referrerQueue.getJSONArray(i); - - String savedReferrer = referrerEntry.getString(0); - long savedClickTime = referrerEntry.getLong(1); - - sendReferrerI(savedReferrer, savedClickTime); - } - } catch (JSONException e) { - - } - } - private void processSessionI() { long now = System.currentTimeMillis(); @@ -1187,24 +1183,12 @@ private void setAskingAttributionI(boolean askingAttribution) { writeActivityStateI(); } - private void sendReferrerI(String referrer, long clickTime) { + private void sendReferrerI() { if (!isEnabledI()) { return; } - ActivityPackage sdkClickPackage = PackageFactory.getSdkClickPackage( - referrer, - clickTime, - activityState, - adjustConfig, - deviceInfo, - sessionParameters); - - if (sdkClickPackage == null) { - return; - } - - sdkClickHandler.sendSdkClick(sdkClickPackage); + sdkClickHandler.sendSavedReferrers(); } private void readOpenUrlI(Uri url, long clickTime) { 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 f4dc1dd3f..e98014954 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -77,7 +77,7 @@ public void sendReferrer(String referrer, Context context) { return; } - // don't save referrer if it's disabled + // Don't save referrer if SDK is disabled. if (checkActivityHandler("referrer")) { if (activityHandler.isEnabled()) { saveReferrer(referrer, context, clickTime); diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/ISdkClickHandler.java b/Adjust/adjust/src/main/java/com/adjust/sdk/ISdkClickHandler.java index bdc71a2d3..121d670d9 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ISdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ISdkClickHandler.java @@ -33,6 +33,11 @@ public interface ISdkClickHandler { */ void sendSdkClick(ActivityPackage sdkClick); + /** + * Send sdk_click packages made from all the persisted referrers. + */ + void sendSavedReferrers(); + /** * Teardown SdkClickHandler instance. */ 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 34d0a71d2..f46ce4d57 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -1,5 +1,8 @@ package com.adjust.sdk; +import org.json.JSONArray; +import org.json.JSONException; + import java.io.IOException; import java.io.UnsupportedEncodingException; @@ -118,6 +121,46 @@ public void run() { }); } + /** + * {@inheritDoc} + */ + @Override + public void sendSavedReferrers() { + scheduledExecutor.submit(new Runnable() { + @Override + public void run() { + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager( + ((ActivityHandler) activityHandlerWeakRef.get()).getAdjustConfig().context); + JSONArray referrerQueue = sharedPreferencesManager.getReferrers(); + + try { + for (int i = 0; i < referrerQueue.length(); i += 1) { + JSONArray referrerEntry = referrerQueue.getJSONArray(i); + + String savedReferrer = referrerEntry.getString(0); + long savedClickTime = referrerEntry.getLong(1); + + ActivityPackage sdkClickPackage = PackageFactory.getSdkClickPackage( + savedReferrer, + savedClickTime, + ((ActivityHandler) activityHandlerWeakRef.get()).getActivityState(), + ((ActivityHandler) activityHandlerWeakRef.get()).getAdjustConfig(), + ((ActivityHandler) activityHandlerWeakRef.get()).getDeviceInfo(), + ((ActivityHandler) activityHandlerWeakRef.get()).getSessionParameters()); + + if (sdkClickPackage == null) { + return; + } + + sendSdkClick(sdkClickPackage); + } + } catch (JSONException e) { + + } + } + }); + } + /** * {@inheritDoc} */ @@ -202,6 +245,17 @@ public void run() { * @param sdkClickPackage sdk_click package to be sent. */ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { + // Check before sending if referrer was sent and removed already. + ActivityHandler activityHandler = (ActivityHandler) activityHandlerWeakRef.get(); + SharedPreferencesManager sharedPreferencesManager + = new SharedPreferencesManager(activityHandler.getContext()); + + if (!sharedPreferencesManager.doesReferrerExist( + sdkClickPackage.getParameters().get("referrer"), + sdkClickPackage.getClickTime())) { + return; + } + String targetURL = Constants.BASE_URL + sdkClickPackage.getPath(); try { @@ -215,15 +269,11 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { return; } - IActivityHandler activityHandler = activityHandlerWeakRef.get(); - if (activityHandler == null) { return; } // Remove referrer from shared preferences after sdk_click is sent. - SharedPreferencesManager sharedPreferencesManager - = new SharedPreferencesManager(activityHandler.getContext()); sharedPreferencesManager.removeReferrer( sdkClickPackage.getParameters().get("referrer"), sdkClickPackage.getClickTime()); From a5e3a4f23c3fa7984123e612cbb51e450d7127ff Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 7 Aug 2017 10:25:21 +0200 Subject: [PATCH 057/146] Ignore same naming of fields and constructor parameters --- checkstyle/adjust_checks.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/checkstyle/adjust_checks.xml b/checkstyle/adjust_checks.xml index f24044753..913c96432 100644 --- a/checkstyle/adjust_checks.xml +++ b/checkstyle/adjust_checks.xml @@ -151,7 +151,11 @@ - + + + + + From 7b759e38cc31018aab763a698a5f18c9d85e323f Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 7 Aug 2017 14:34:33 +0200 Subject: [PATCH 058/146] Adding referrer class and isBeingSent flag --- .../java/com/adjust/sdk/ActivityHandler.java | 2 +- .../java/com/adjust/sdk/AdjustInstance.java | 22 +- .../main/java/com/adjust/sdk/Referrer.java | 187 +++++++++++++ .../java/com/adjust/sdk/SdkClickHandler.java | 48 ++-- .../adjust/sdk/SharedPreferencesManager.java | 248 ++++++++++++------ 5 files changed, 388 insertions(+), 119 deletions(-) create mode 100644 Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java 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 b36d24310..322d8ddc0 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1208,7 +1208,7 @@ private void readOpenUrlI(Uri url, long clickTime) { return; } - sdkClickHandler.sendSdkClick(sdkClickPackage); + sdkClickHandler.sendSavedReferrers(); } private void updateHandlersStatusAndSendI() { 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 e98014954..14462a571 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -33,6 +33,9 @@ public void onCreate(AdjustConfig adjustConfig) { adjustConfig.startOffline = startOffline; activityHandler = ActivityHandler.getInstance(adjustConfig); + + // Scan for referrers. + scanForReferrers(adjustConfig.context); } public void trackEvent(AdjustEvent event) { @@ -80,21 +83,16 @@ public void sendReferrer(String referrer, Context context) { // Don't save referrer if SDK is disabled. if (checkActivityHandler("referrer")) { if (activityHandler.isEnabled()) { - saveReferrer(referrer, context, clickTime); + saveReferrer(clickTime, referrer, context); activityHandler.sendReferrer(referrer, clickTime); } } else { if (this.startEnabled == null || this.startEnabled) { - saveReferrer(referrer, context, clickTime); + saveReferrer(clickTime, referrer, context); } } } - private void saveReferrer(String referrer, Context context, long clickTime) { - SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); - sharedPreferencesManager.saveReferrer(referrer, clickTime); - } - public void setOfflineMode(boolean enabled) { if (!checkActivityHandler(enabled, "offline mode", "online mode")) { this.startOffline = enabled; @@ -264,4 +262,14 @@ private boolean checkActivityHandler(String savedForLaunchWarningSuffixMessage) return true; } } + + private void saveReferrer(final long clickTime, final String content, final Context context) { + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); + sharedPreferencesManager.saveReferrer(clickTime, content); + } + + private void scanForReferrers(final Context context) { + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); + sharedPreferencesManager.scanForSavedReferrers(); + } } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java new file mode 100644 index 000000000..6c87eedad --- /dev/null +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java @@ -0,0 +1,187 @@ +package com.adjust.sdk; + +import org.json.JSONArray; +import org.json.JSONException; + +/** + * Created by uerceg on 07.08.17. + */ + +public class Referrer { + /** + * Number of referrer fields. + */ + public static final int REFERRER_FIELDS_NUMBER = 3; + + /** + * Referrer click time stamp. + */ + private long clickTime; + + /** + * Referrer content. + */ + private String content; + + /** + * Flag that indicates whether referrer is currently being sent by SdkClickHandler or not. + */ + private boolean isBeingSent; + + /** + * Referrer object constructor. + * + * @param clickTime Referrer click time + * @param content Referrer content + */ + public Referrer(final long clickTime, final String content) { + this.content = content; + this.clickTime = clickTime; + + this.isBeingSent = false; + } + + /** + * Referrer click time getter. + * + * @return Referrer click time + */ + public long getClickTime() { + return clickTime; + } + + /** + * Referrer content getter. + * + * @return Referrer content + */ + public String getContent() { + return content; + } + + /** + * Is referrer being sent flag getter. + * + * @return Is referrer being sent flag's value + */ + public boolean getIsBeingSent() { + return isBeingSent; + } + + /** + * Set info whether referrer is being sent or not. + * + * @param send boolean indicating whether referrer is being sent or not + */ + public void setIsBeingSent(final boolean send) { + isBeingSent = send; + } + + /** + * Convert Referrer object to JSON array. + * [0] - clickTime + * [1] - content + * [2] - isBeingSent + * + * @return JSONArray object with referrer inside + */ + public JSONArray asJSONArray() { + JSONArray array = new JSONArray(); + + array.put(clickTime); + array.put(content); + array.put(isBeingSent); + + return array; + } + + /** + * Convert Referrer object to JSONArray string. + * + * @return JSONArray as string of the current Referrer object + */ + public String asString() { + return asJSONArray().toString(); + } + + /** + * Check if current referrer is equal with given one. + * Equality criteria is equality of: clickTime and content members. + * + * @param referrer Referrer to check equality with + * @return boolean indicating whether two referrers are equal + */ + public boolean isEqual(final Referrer referrer) { + if (referrer == null) { + return false; + } + + if (referrer.getClickTime() != clickTime) { + return false; + } + + if (!referrer.getContent().equals(content)) { + return false; + } + + return true; + } + + /** + * Get Referrer object from given JSONArray object. + * + * @param array JSONArray to convert to Referrer object + * @return Referrer object made from given JSONArray object + */ + public static Referrer getReferrerFromJSONArray(final JSONArray array) { + if (array != null && array.length() != REFERRER_FIELDS_NUMBER) { + return null; + } + + try { + long clickTime = array.getLong(0); + String content = array.getString(1); + boolean isBeingSent = array.getBoolean(2); + + Referrer referrer = new Referrer(clickTime, content); + referrer.setIsBeingSent(isBeingSent); + + return referrer; + } catch (JSONException e) { + return null; + } + } + + /** + * Get Referrer object from given JSONArray object string. + * + * @param arrayString JSONArray string to convert to Referrer object + * @return Referrer object made from given JSONArray object string + */ + public static Referrer getReferrerFromJSONArrayString(final String arrayString) { + JSONArray array; + + try { + if (arrayString == null) { + return null; + } else { + array = new JSONArray(arrayString); + } + + if (array != null && array.length() != REFERRER_FIELDS_NUMBER) { + return null; + } + + long clickTime = array.getLong(0); + String content = array.getString(1); + boolean isBeingSent = array.getBoolean(2); + + Referrer referrer = new Referrer(clickTime, content); + referrer.setIsBeingSent(isBeingSent); + + return referrer; + } catch (JSONException e) { + return null; + } + } +} 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 f46ce4d57..d15cadbd9 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -1,8 +1,5 @@ package com.adjust.sdk; -import org.json.JSONArray; -import org.json.JSONException; - import java.io.IOException; import java.io.UnsupportedEncodingException; @@ -131,31 +128,34 @@ public void sendSavedReferrers() { public void run() { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager( ((ActivityHandler) activityHandlerWeakRef.get()).getAdjustConfig().context); - JSONArray referrerQueue = sharedPreferencesManager.getReferrers(); - - try { - for (int i = 0; i < referrerQueue.length(); i += 1) { - JSONArray referrerEntry = referrerQueue.getJSONArray(i); + // JSONArray referrerQueue = sharedPreferencesManager.getReferrers(); + ArrayList referrers = sharedPreferencesManager.getReferrers(); - String savedReferrer = referrerEntry.getString(0); - long savedClickTime = referrerEntry.getLong(1); + for (int i = 0; i < referrers.size(); i += 1) { + Referrer referrer = referrers.get(i); - ActivityPackage sdkClickPackage = PackageFactory.getSdkClickPackage( - savedReferrer, - savedClickTime, - ((ActivityHandler) activityHandlerWeakRef.get()).getActivityState(), - ((ActivityHandler) activityHandlerWeakRef.get()).getAdjustConfig(), - ((ActivityHandler) activityHandlerWeakRef.get()).getDeviceInfo(), - ((ActivityHandler) activityHandlerWeakRef.get()).getSessionParameters()); + // Don't send the one already flagged for sending. + if (referrer.getIsBeingSent()) { + continue; + } - if (sdkClickPackage == null) { - return; - } + ActivityPackage sdkClickPackage = PackageFactory.getSdkClickPackage( + referrer.getContent(), + referrer.getClickTime(), + ((ActivityHandler) activityHandlerWeakRef.get()).getActivityState(), + ((ActivityHandler) activityHandlerWeakRef.get()).getAdjustConfig(), + ((ActivityHandler) activityHandlerWeakRef.get()).getDeviceInfo(), + ((ActivityHandler) activityHandlerWeakRef.get()).getSessionParameters()); - sendSdkClick(sdkClickPackage); + if (sdkClickPackage == null) { + return; } - } catch (JSONException e) { + // Mark referrer as being sent. + sharedPreferencesManager.markReferrerForSending(referrer); + + // Send referrer sdk_click package. + sendSdkClick(sdkClickPackage); } } }); @@ -275,8 +275,8 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { // Remove referrer from shared preferences after sdk_click is sent. sharedPreferencesManager.removeReferrer( - sdkClickPackage.getParameters().get("referrer"), - sdkClickPackage.getClickTime()); + sdkClickPackage.getClickTime(), + sdkClickPackage.getParameters().get("referrer")); activityHandler.finishedTrackingActivity(responseData); } catch (UnsupportedEncodingException e) { 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 5c02d3ae3..9577c8522 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -6,6 +6,8 @@ import android.content.Context; import android.content.SharedPreferences; +import java.util.ArrayList; + /** * Class used for shared preferences manipulation. * @@ -24,11 +26,6 @@ public class SharedPreferencesManager { */ private static final String PREFS_KEY_REFERRERS = "referrers"; - /** - * Maximal size of referrer entry JSON array in shared preferences. - */ - private static final int PREFS_REFERRER_ENTRY_MAX_SIZE = 3; - /** * Shared preferences of the app. */ @@ -46,104 +43,135 @@ public SharedPreferencesManager(final Context context) { /** * Save referrer information to shared preferences. * - * @param referrer Referrer string * @param clickTime Referrer click time + * @param content Referrer string */ - public synchronized void saveReferrer(final String referrer, final long clickTime) { + public synchronized void saveReferrer(final long clickTime, final String content) { // Check if referrer is null or empty string already done before calling this method. try { - JSONArray referrerQueue = getReferrers(); + ArrayList referrers = getReferrers(); + Referrer referrerToSave = new Referrer(clickTime, content); // If referrer is already contained in shared preferences, skip adding it. - if (getReferrerIndex(referrer, clickTime, referrerQueue) >= 0) { + if (getReferrerIndex(referrerToSave, referrers) >= 0) { return; } + // Recreate new referrers (updated) array. + JSONArray updatedReferrers = new JSONArray(); + + if (referrers != null) { + for (int i = 0; i < referrers.size(); i++) { + updatedReferrers.put(referrers.get(i).asJSONArray()); + } + } + // Add new referrer JSONArray entry to the queue. JSONArray newReferrerEntry = new JSONArray(); - newReferrerEntry.put(0, referrer); - newReferrerEntry.put(1, clickTime); + newReferrerEntry.put(0, referrerToSave.getClickTime()); + newReferrerEntry.put(1, referrerToSave.getContent()); + newReferrerEntry.put(2, referrerToSave.getIsBeingSent()); - referrerQueue.put(newReferrerEntry); + updatedReferrers.put(newReferrerEntry); // Save JSON array as string back to shared preferences. - saveString(PREFS_KEY_REFERRERS, referrerQueue.toString()); + saveString(PREFS_KEY_REFERRERS, updatedReferrers.toString()); } catch (JSONException e) { - } } /** * Remove referrer information from shared preferences. * - * @param referrer Referrer string * @param clickTime Referrer click time + * @param content Referrer string */ - public synchronized void removeReferrer(final String referrer, final long clickTime) { + public synchronized void removeReferrer(final long clickTime, final String content) { // Don't even try to remove null or empty referrers since they shouldn't exist in shared preferences. - if (referrer == null || referrer.length() == 0) { + if (content == null || content.length() == 0) { return; } - try { - // Try to locate position in queue of the referrer that should be deleted. - JSONArray referrerQueue = getReferrers(); - int index = getReferrerIndex(referrer, clickTime, referrerQueue); + Referrer referrerToCheck = new Referrer(clickTime, content); - // If referrer is not found in the queue, skip the rest. - if (index == -1) { - return; - } + // Try to locate position in queue of the referrer that should be deleted. + ArrayList referrers = getReferrers(); + int index = getReferrerIndex(referrerToCheck, referrers); - // Rebuild queue without referrer that should be removed. - JSONArray newReferrerQueue = new JSONArray(); + // If referrer is not found in the queue, skip the rest. + if (index == -1) { + return; + } - for (int i = 0; i < referrerQueue.length(); i += 1) { - if (i == index) { - continue; - } + // Rebuild queue without referrer that should be removed. + JSONArray updatedReferrers = new JSONArray(); - newReferrerQueue.put(referrerQueue.getJSONArray(i)); + for (int i = 0; i < referrers.size(); i += 1) { + if (i == index) { + continue; } - // Save new referrer queue JSON array as string back to shared preferences. - saveString(PREFS_KEY_REFERRERS, newReferrerQueue.toString()); - } catch (JSONException e) { - + updatedReferrers.put(referrers.get(i).asJSONArray()); } + + // Save new referrer queue JSON array as string back to shared preferences. + saveString(PREFS_KEY_REFERRERS, updatedReferrers.toString()); } /** * Check if give referrer is saved in shared preferences. * - * @param referrer Referrer string * @param clickTime Referrer click time - * + * @param content Referrer string * @return boolean indicating whether given referrer exist in shared preferences or not. - * In case of exception, return false. + * In case of exception, return false. */ - public synchronized boolean doesReferrerExist(final String referrer, final long clickTime) { - try { - JSONArray referrerQueue = getReferrers(); + public synchronized boolean doesReferrerExist(final String content, final long clickTime) { + ArrayList referrers = getReferrers(); + Referrer referrerToCheck = new Referrer(clickTime, content); - for (int i = 0; i < referrerQueue.length(); i += 1) { - JSONArray referrerEntry = referrerQueue.getJSONArray(i); + if (referrers == null) { + return false; + } - String savedReferrer = referrerEntry.getString(0); - long savedClickTime = referrerEntry.getLong(1); + for (int i = 0; i < referrers.size(); i += 1) { + Referrer referrerEntry = referrers.get(i); - if (savedReferrer.equals(referrer)) { - if (savedClickTime == clickTime) { - return true; - } - } + if (referrerEntry.isEqual(referrerToCheck)) { + return true; } + } - return false; - } catch (JSONException e) { - return false; + return false; + } + + public synchronized void markReferrerForSending(final Referrer referrer) { + ArrayList referrers = getReferrers(); + + if (referrers == null) { + return; + } + + // If referrer doesn't exist in shared preferences, do nothing. + int index = getReferrerIndex(referrer, referrers); + + if (index < 0) { + return; } + + // Mark referrer for sending. + referrers.get(index).setIsBeingSent(true); + + // Recreate new referrers (updated) array. + JSONArray updatedReferrers = new JSONArray(); + + for (int i = 0; i < referrers.size(); i++) { + updatedReferrers.put(referrers.get(i).asJSONArray()); + } + + // Save JSON array as string back to shared preferences. + saveString(PREFS_KEY_REFERRERS, updatedReferrers.toString()); } /** @@ -151,48 +179,93 @@ public synchronized boolean doesReferrerExist(final String referrer, final long * * @return JSONArray with all the saved referrers from shared preferences. Empty array if none available. */ - public synchronized JSONArray getReferrers() { + public synchronized ArrayList getReferrers() { + ArrayList referrersArray = new ArrayList(); + try { + JSONArray arrayFromPrefs; String referrerQueueString = getString(PREFS_KEY_REFERRERS); if (referrerQueueString == null) { - return new JSONArray(); + arrayFromPrefs = new JSONArray(); } else { - return new JSONArray(referrerQueueString); + arrayFromPrefs = new JSONArray(referrerQueueString); + } + + if (arrayFromPrefs.length() == 0) { + return null; + } + + for (int i = 0; i < arrayFromPrefs.length(); i += 1) { + JSONArray referrerEntry = arrayFromPrefs.getJSONArray(i); + + if (referrerEntry.length() != Referrer.REFERRER_FIELDS_NUMBER) { + continue; + } + + long clickTime = referrerEntry.getLong(0); + String content = referrerEntry.getString(1); + boolean isBeingSent = referrerEntry.getBoolean(2); + + Referrer referrer = new Referrer(clickTime, content); + referrer.setIsBeingSent(isBeingSent); + + referrersArray.add(referrer); } } catch (JSONException e) { - return new JSONArray(); } + + return referrersArray; } /** - * Helper method to print all the referrers from shared preferences. + * Initially called upon ActivityHandler initialisation. + * Used to check if any of the still existing referrers was unsuccessfully being sent before app got killed. + * If such found -> switch it's isBeingSent flag back to "false". */ - public synchronized void printAllTheReferrers() { + public synchronized void scanForSavedReferrers() { + ArrayList referrers = new ArrayList(); + try { - JSONArray referrerQueue = getReferrers(); + JSONArray arrayFromPrefs; + String referrerQueueString = getString(PREFS_KEY_REFERRERS); - AdjustFactory.getLogger().debug("List of referrers in shared preferences: "); + if (referrerQueueString == null) { + arrayFromPrefs = new JSONArray(); + } else { + arrayFromPrefs = new JSONArray(referrerQueueString); + } - for (int i = 0; i < referrerQueue.length(); i += 1) { - JSONArray referrerEntry = referrerQueue.getJSONArray(i); + if (arrayFromPrefs.length() == 0) { + return; + } - String isBeingSent; - String referrer = referrerEntry.getString(0); - String clickTime = String.valueOf(referrerEntry.getLong(1)); + for (int i = 0; i < arrayFromPrefs.length(); i += 1) { + JSONArray referrerEntry = arrayFromPrefs.getJSONArray(i); - if (referrerEntry.length() == PREFS_REFERRER_ENTRY_MAX_SIZE) { - isBeingSent = String.valueOf(referrerEntry.getBoolean(2)); - } else { - isBeingSent = "NA"; + if (referrerEntry.length() != Referrer.REFERRER_FIELDS_NUMBER) { + continue; } - AdjustFactory.getLogger().debug("Referrer: " + referrer); - AdjustFactory.getLogger().debug("Click time: " + clickTime); - AdjustFactory.getLogger().debug("Is being sent: " + isBeingSent); + long clickTime = referrerEntry.getLong(0); + String content = referrerEntry.getString(1); + + Referrer referrer = new Referrer(clickTime, content); + referrer.setIsBeingSent(false); + + referrers.add(referrer); } - } catch (JSONException e) { + // Rebuild queue without referrer that should be removed. + JSONArray updatedReferrers = new JSONArray(); + + for (int i = 0; i < referrers.size(); i += 1) { + updatedReferrers.put(referrers.get(i).asJSONArray()); + } + + // Save new referrer queue JSON array as string back to shared preferences. + saveString(PREFS_KEY_REFERRERS, updatedReferrers.toString()); + } catch (JSONException e) { } } @@ -230,22 +303,23 @@ private synchronized String getString(final String key) { /** * Check if referrer information is contained in referrer queue in shared preferences and get it's index. * - * @param referrer Referrer string - * @param clickTime Referrer click time - * @param referrerQueue Referrer queue from shared preferences + * @param referrerToCheck Referrer to be checked + * @param referrers Referrer queue from shared preferences * @return Index of referrer information inside of the referrer queue. -1 if not found. - * @throws JSONException JSON exception */ - private int getReferrerIndex(final String referrer, - final long clickTime, - final JSONArray referrerQueue) throws JSONException { - for (int i = 0; i < referrerQueue.length(); i += 1) { - JSONArray referrerEntry = referrerQueue.getJSONArray(i); + private int getReferrerIndex(final Referrer referrerToCheck, final ArrayList referrers) { + if (referrerToCheck == null) { + return -1; + } + + if (referrers == null) { + return -1; + } - String savedReferrer = referrerEntry.getString(0); - long savedClickTime = referrerEntry.getLong(1); + for (int i = 0; i < referrers.size(); i += 1) { + Referrer referrer = referrers.get(i); - if (savedReferrer.equals(referrer) && savedClickTime == clickTime) { + if (referrer.isEqual(referrerToCheck)) { return i; } } From 019c05c9854e75d3649201f72d35b495696f4280 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 7 Aug 2017 15:09:37 +0200 Subject: [PATCH 059/146] Ignore same names for method params and class members --- checkstyle/adjust_checks.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/checkstyle/adjust_checks.xml b/checkstyle/adjust_checks.xml index 913c96432..7f9395e95 100644 --- a/checkstyle/adjust_checks.xml +++ b/checkstyle/adjust_checks.xml @@ -153,6 +153,7 @@ + From 908bba09bc410541782b67ab85e0c48347ff0b4d Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 7 Aug 2017 15:10:07 +0200 Subject: [PATCH 060/146] AdjustInstance cleanup --- .../java/com/adjust/sdk/AdjustInstance.java | 243 +++++++++++++++--- 1 file changed, 205 insertions(+), 38 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 14462a571..bc72db545 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -1,29 +1,51 @@ package com.adjust.sdk; -import android.content.Context; -import android.content.SharedPreferences; import android.net.Uri; +import android.content.Context; -import java.util.ArrayList; import java.util.List; +import java.util.ArrayList; /** - * Created by pfms on 04/12/14. + * Class used to forward instructions to SDK which user gives as part of Adjust class interface. + * + * @author Pedro Silva (nonelse) + * @since 12th April 2014 */ public class AdjustInstance { - private ActivityHandler activityHandler; - private List preLaunchActionsArray; + /** + * Push notifications token. + */ private String pushToken; + + /** + * Is SDK enabled or not. + */ private Boolean startEnabled = null; + + /** + * Is SDK offline or not. + */ private boolean startOffline = false; - private static ILogger getLogger() { - return AdjustFactory.getLogger(); - } + /** + * ActivityHandler instance. + */ + private ActivityHandler activityHandler; + + /** + * Array of actions that were requested before SDK initialisation. + */ + private List preLaunchActionsArray; - public void onCreate(AdjustConfig adjustConfig) { + /** + * Called upon SDK initialisation. + * + * @param adjustConfig AdjustConfig object used for SDK initialisation + */ + public void onCreate(final AdjustConfig adjustConfig) { if (activityHandler != null) { - getLogger().error("Adjust already initialized"); + AdjustFactory.getLogger().error("Adjust already initialized"); return; } @@ -38,41 +60,88 @@ public void onCreate(AdjustConfig adjustConfig) { scanForReferrers(adjustConfig.context); } - public void trackEvent(AdjustEvent event) { - if (!checkActivityHandler()) { return; } + /** + * Called to track event. + * + * @param event AdjustEvent object to be tracked + */ + public void trackEvent(final AdjustEvent event) { + if (!checkActivityHandler()) { + return; + } + activityHandler.trackEvent(event); } + /** + * Called upon each Activity's onResume() method call. + */ public void onResume() { - if (!checkActivityHandler()) { return; } + if (!checkActivityHandler()) { + return; + } + activityHandler.onResume(); } + /** + * Called upon each Activity's onPause() method call. + */ public void onPause() { - if (!checkActivityHandler()) { return; } + if (!checkActivityHandler()) { + return; + } + activityHandler.onPause(); } - public void setEnabled(boolean enabled) { - if (!checkActivityHandler(enabled, "enabled mode", "disabled mode")){ + /** + * Called to disable/enable SDK. + * + * @param enabled boolean indicating whether SDK should be enabled or disabled + */ + public void setEnabled(final boolean enabled) { + if (!checkActivityHandler(enabled, "enabled mode", "disabled mode")) { this.startEnabled = enabled; } else { activityHandler.setEnabled(enabled); } } + /** + * Get information if SDK is enabled or not. + * + * @return boolean indicating whether SDK is enabled or not + */ public boolean isEnabled() { - if (!checkActivityHandler()) { return false; } + if (!checkActivityHandler()) { + return false; + } + return activityHandler.isEnabled(); } - public void appWillOpenUrl(Uri url) { - if (!checkActivityHandler()) { return; } + /** + * Called to process deep link. + * + * @param url Deep link URL to process + */ + public void appWillOpenUrl(final Uri url) { + if (!checkActivityHandler()) { + return; + } + long clickTime = System.currentTimeMillis(); activityHandler.readOpenUrl(url, clickTime); } - public void sendReferrer(String referrer, Context context) { + /** + * Called to process referrer information sent with INSTALL_REFERRER intent. + * + * @param referrer Referrer content + * @param context Application context + */ + public void sendReferrer(final String referrer, final Context context) { long clickTime = System.currentTimeMillis(); // Check for referrer validity. If invalid, return. @@ -93,7 +162,12 @@ public void sendReferrer(String referrer, Context context) { } } - public void setOfflineMode(boolean enabled) { + /** + * Called to set SDK to offline or online mode. + * + * @param enabled boolean indicating should SDK be in offline mode (true) or not (false) + */ + public void setOfflineMode(final boolean enabled) { if (!checkActivityHandler(enabled, "offline mode", "online mode")) { this.startOffline = enabled; } else { @@ -101,11 +175,22 @@ public void setOfflineMode(boolean enabled) { } } + /** + * Called if SDK initialisation was delayed and you would like to stop waiting for timer. + */ public void sendFirstPackages() { - if (!checkActivityHandler()) { return; } + if (!checkActivityHandler()) { + return; + } activityHandler.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 void addSessionCallbackParameter(final String key, final String value) { if (checkActivityHandler("adding session callback parameter")) { activityHandler.addSessionCallbackParameter(key, value); @@ -118,12 +203,18 @@ public void addSessionCallbackParameter(final String key, final String value) { preLaunchActionsArray.add(new IRunActivityHandler() { @Override - public void run(ActivityHandler activityHandler) { + public void run(final ActivityHandler activityHandler) { activityHandler.addSessionCallbackParameterI(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 void addSessionPartnerParameter(final String key, final String value) { if (checkActivityHandler("adding session partner parameter")) { activityHandler.addSessionPartnerParameter(key, value); @@ -136,12 +227,17 @@ public void addSessionPartnerParameter(final String key, final String value) { preLaunchActionsArray.add(new IRunActivityHandler() { @Override - public void run(ActivityHandler activityHandler) { + public void run(final ActivityHandler activityHandler) { activityHandler.addSessionPartnerParameterI(key, value); } }); } + /** + * Called to remove global callback parameter from session and event packages. + * + * @param key Global callback parameter key + */ public void removeSessionCallbackParameter(final String key) { if (checkActivityHandler("removing session callback parameter")) { activityHandler.removeSessionCallbackParameter(key); @@ -154,12 +250,17 @@ public void removeSessionCallbackParameter(final String key) { preLaunchActionsArray.add(new IRunActivityHandler() { @Override - public void run(ActivityHandler activityHandler) { + public void run(final ActivityHandler activityHandler) { activityHandler.removeSessionCallbackParameterI(key); } }); } + /** + * Called to remove global partner parameter from session and event packages. + * + * @param key Global partner parameter key + */ public void removeSessionPartnerParameter(final String key) { if (checkActivityHandler("removing session partner parameter")) { activityHandler.removeSessionPartnerParameter(key); @@ -172,12 +273,15 @@ public void removeSessionPartnerParameter(final String key) { preLaunchActionsArray.add(new IRunActivityHandler() { @Override - public void run(ActivityHandler activityHandler) { + public void run(final ActivityHandler activityHandler) { activityHandler.removeSessionPartnerParameterI(key); } }); } + /** + * Called to remove all added global callback parameters. + */ public void resetSessionCallbackParameters() { if (checkActivityHandler("resetting session callback parameters")) { activityHandler.resetSessionCallbackParameters(); @@ -190,12 +294,15 @@ public void resetSessionCallbackParameters() { preLaunchActionsArray.add(new IRunActivityHandler() { @Override - public void run(ActivityHandler activityHandler) { + public void run(final ActivityHandler activityHandler) { activityHandler.resetSessionCallbackParametersI(); } }); } + /** + * Called to remove all added global partner parameters. + */ public void resetSessionPartnerParameters() { if (checkActivityHandler("resetting session partner parameters")) { activityHandler.resetSessionPartnerParameters(); @@ -208,19 +315,32 @@ public void resetSessionPartnerParameters() { preLaunchActionsArray.add(new IRunActivityHandler() { @Override - public void run(ActivityHandler activityHandler) { + public void run(final ActivityHandler activityHandler) { activityHandler.resetSessionPartnerParametersI(); } }); } - public void teardown(boolean deleteState) { - if (!checkActivityHandler()) { return; } + /** + * Called to teardown SDK state. + * Used only for Adjust tests, shouldn't be used in client apps. + * + * @param deleteState boolean indicating should internal Adjust files also be removed or not + */ + public void teardown(final boolean deleteState) { + if (!checkActivityHandler()) { + return; + } activityHandler.teardown(deleteState); activityHandler = null; } - public void setPushToken(String token) { + /** + * Called to set user's push notifications token. + * + * @param token Push notifications token + */ + public void setPushToken(final String token) { if (!checkActivityHandler("push token")) { this.pushToken = token; } else { @@ -228,21 +348,48 @@ public void setPushToken(String token) { } } + /** + * Called to get value of unique Adjust device identifier. + * + * @return Unique Adjust device indetifier + */ public String getAdid() { - if (!checkActivityHandler()) { return null; } + if (!checkActivityHandler()) { + return null; + } return activityHandler.getAdid(); } + /** + * Called to get user's current attribution value. + * + * @return AdjustAttribution object with current attribution value + */ public AdjustAttribution getAttribution() { - if (!checkActivityHandler()) { return null; } + if (!checkActivityHandler()) { + return null; + } return activityHandler.getAttribution(); } + /** + * Check if ActivityHandler instance is set or not. + * + * @return boolean indicating whether ActivityHandler instance is set or not + */ private boolean checkActivityHandler() { return checkActivityHandler(null); } - private boolean checkActivityHandler(boolean status, String trueMessage, String falseMessage) { + /** + * Check if ActivityHandler instance is set or not. + * + * @param status Is SDK enabled or not + * @param trueMessage Log message to display in case SDK is enabled + * @param falseMessage Log message to display in case SDK is disabled + * @return boolean indicating whether ActivityHandler instance is set or not + */ + private boolean checkActivityHandler(final boolean status, final String trueMessage, final String falseMessage) { if (status) { return checkActivityHandler(trueMessage); } else { @@ -250,24 +397,44 @@ private boolean checkActivityHandler(boolean status, String trueMessage, String } } - private boolean checkActivityHandler(String savedForLaunchWarningSuffixMessage) { + /** + * Check if ActivityHandler instance is set or not. + * + * @param savedForLaunchWarningSuffixMessage Log message to indicate action that was asked when SDK was disabled + * @return boolean indicating whether ActivityHandler instance is set or not + */ + private boolean checkActivityHandler(final String savedForLaunchWarningSuffixMessage) { if (activityHandler == null) { if (savedForLaunchWarningSuffixMessage != null) { - getLogger().warn("Adjust not initialized, but %s saved for launch", savedForLaunchWarningSuffixMessage); + AdjustFactory.getLogger().warn("Adjust not initialized, but %s saved for launch", + savedForLaunchWarningSuffixMessage); } else { - getLogger().error("Adjust not initialized correctly"); + AdjustFactory.getLogger().error("Adjust not initialized correctly"); } + return false; } else { return true; } } + /** + * Save referrer to shared preferences. + * + * @param clickTime Referrer click time + * @param content Referrer content + * @param context Application context + */ private void saveReferrer(final long clickTime, final String content, final Context context) { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); sharedPreferencesManager.saveReferrer(clickTime, content); } + /** + * Check saved referrers before app being killed and if any found with isBeingSent set to true, revert it to false. + * + * @param context Application context + */ private void scanForReferrers(final Context context) { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); sharedPreferencesManager.scanForSavedReferrers(); From eab7fd0bf47ac42181ddd5a19c6dd2a8e3fb3d32 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 7 Aug 2017 15:10:34 +0200 Subject: [PATCH 061/146] Adding missing comments to SharedPreferencesManager --- .../main/java/com/adjust/sdk/SharedPreferencesManager.java | 5 +++++ 1 file changed, 5 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 9577c8522..d7a9c0550 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -146,6 +146,11 @@ public synchronized boolean doesReferrerExist(final String content, final long c return false; } + /** + * Mark given referrer as the one being sent by SdkClickHandler. + * + * @param referrer Referrer which is being sent. + */ public synchronized void markReferrerForSending(final Referrer referrer) { ArrayList referrers = getReferrers(); From 88461ff1358ce20c73789cc931d6c9f679960148 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 7 Aug 2017 15:39:30 +0200 Subject: [PATCH 062/146] Minor cleanup --- Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d15cadbd9..1aef0ef89 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -128,7 +128,6 @@ public void sendSavedReferrers() { public void run() { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager( ((ActivityHandler) activityHandlerWeakRef.get()).getAdjustConfig().context); - // JSONArray referrerQueue = sharedPreferencesManager.getReferrers(); ArrayList referrers = sharedPreferencesManager.getReferrers(); for (int i = 0; i < referrers.size(); i += 1) { @@ -250,6 +249,7 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(activityHandler.getContext()); + // Check if referrer meant for sending still exists in shared preferences. if (!sharedPreferencesManager.doesReferrerExist( sdkClickPackage.getParameters().get("referrer"), sdkClickPackage.getClickTime())) { From 28235d2d0584baef4c33cd40efdb962d3b8a00ed Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 7 Aug 2017 17:06:06 +0200 Subject: [PATCH 063/146] Remove referrer logic for deep link sdk_click packages --- .../java/com/adjust/sdk/ActivityHandler.java | 2 +- .../java/com/adjust/sdk/SdkClickHandler.java | 32 ++++++++++++------- 2 files changed, 21 insertions(+), 13 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 322d8ddc0..b36d24310 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1208,7 +1208,7 @@ private void readOpenUrlI(Uri url, long clickTime) { return; } - sdkClickHandler.sendSavedReferrers(); + sdkClickHandler.sendSdkClick(sdkClickPackage); } private void updateHandlersStatusAndSendI() { 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 1aef0ef89..caa038746 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -244,16 +244,19 @@ public void run() { * @param sdkClickPackage sdk_click package to be sent. */ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { - // Check before sending if referrer was sent and removed already. + boolean isReferrer = sdkClickPackage.getParameters().get("referrer") != null; ActivityHandler activityHandler = (ActivityHandler) activityHandlerWeakRef.get(); - SharedPreferencesManager sharedPreferencesManager - = new SharedPreferencesManager(activityHandler.getContext()); - // Check if referrer meant for sending still exists in shared preferences. - if (!sharedPreferencesManager.doesReferrerExist( - sdkClickPackage.getParameters().get("referrer"), - sdkClickPackage.getClickTime())) { - return; + if (isReferrer) { + // Check before sending if referrer was sent and removed already. + SharedPreferencesManager sharedPreferencesManager + = new SharedPreferencesManager(activityHandler.getContext()); + + if (!sharedPreferencesManager.doesReferrerExist( + sdkClickPackage.getParameters().get("referrer"), + sdkClickPackage.getClickTime())) { + return; + } } String targetURL = Constants.BASE_URL + sdkClickPackage.getPath(); @@ -273,10 +276,15 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { return; } - // Remove referrer from shared preferences after sdk_click is sent. - sharedPreferencesManager.removeReferrer( - sdkClickPackage.getClickTime(), - sdkClickPackage.getParameters().get("referrer")); + if (isReferrer) { + // Remove referrer from shared preferences after sdk_click is sent. + SharedPreferencesManager sharedPreferencesManager + = new SharedPreferencesManager(activityHandler.getContext()); + + sharedPreferencesManager.removeReferrer( + sdkClickPackage.getClickTime(), + sdkClickPackage.getParameters().get("referrer")); + } activityHandler.finishedTrackingActivity(responseData); } catch (UnsupportedEncodingException e) { From c9b0b57ff6e3524a8156d17cb1f4febc8243d5e0 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 8 Aug 2017 11:41:57 +0200 Subject: [PATCH 064/146] Check instance enabled state when trying to send referrer --- .../main/java/com/adjust/sdk/AdjustInstance.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 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 bc72db545..f75583ae7 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -101,9 +101,9 @@ public void onPause() { * @param enabled boolean indicating whether SDK should be enabled or disabled */ public void setEnabled(final boolean enabled) { - if (!checkActivityHandler(enabled, "enabled mode", "disabled mode")) { - this.startEnabled = enabled; - } else { + this.startEnabled = enabled; + + if (checkActivityHandler(enabled, "enabled mode", "disabled mode")) { activityHandler.setEnabled(enabled); } } @@ -151,12 +151,12 @@ public void sendReferrer(final String referrer, final Context context) { // Don't save referrer if SDK is disabled. if (checkActivityHandler("referrer")) { - if (activityHandler.isEnabled()) { + if (activityHandler.isEnabled() && isInstanceEnabled()) { saveReferrer(clickTime, referrer, context); activityHandler.sendReferrer(referrer, clickTime); } } else { - if (this.startEnabled == null || this.startEnabled) { + if (isInstanceEnabled()) { saveReferrer(clickTime, referrer, context); } } @@ -439,4 +439,8 @@ private void scanForReferrers(final Context context) { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); sharedPreferencesManager.scanForSavedReferrers(); } + + private boolean isInstanceEnabled() { + return this.startEnabled == null || this.startEnabled; + } } From cef13cf4a273214cba86104e2508c0a62d3e40b6 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 8 Aug 2017 23:12:02 +0200 Subject: [PATCH 065/146] Make mvn package happy --- .../src/main/java/com/adjust/sdk/SharedPreferencesManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d7a9c0550..e30e0bb39 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -226,7 +226,7 @@ public synchronized ArrayList getReferrers() { /** * Initially called upon ActivityHandler initialisation. * Used to check if any of the still existing referrers was unsuccessfully being sent before app got killed. - * If such found -> switch it's isBeingSent flag back to "false". + * If such found - switch it's isBeingSent flag back to "false". */ public synchronized void scanForSavedReferrers() { ArrayList referrers = new ArrayList(); From 5393f5b6b14362d37252ee861d52da884ef57201 Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 9 Aug 2017 15:43:44 +0200 Subject: [PATCH 066/146] AdjustInstance minor cleanup --- .../src/main/java/com/adjust/sdk/AdjustInstance.java | 9 +++++++++ 1 file changed, 9 insertions(+) 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 f75583ae7..352235181 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -182,6 +182,7 @@ public void sendFirstPackages() { if (!checkActivityHandler()) { return; } + activityHandler.sendFirstPackages(); } @@ -331,6 +332,7 @@ public void teardown(final boolean deleteState) { if (!checkActivityHandler()) { return; } + activityHandler.teardown(deleteState); activityHandler = null; } @@ -357,6 +359,7 @@ public String getAdid() { if (!checkActivityHandler()) { return null; } + return activityHandler.getAdid(); } @@ -369,6 +372,7 @@ public AdjustAttribution getAttribution() { if (!checkActivityHandler()) { return null; } + return activityHandler.getAttribution(); } @@ -440,6 +444,11 @@ private void scanForReferrers(final Context context) { sharedPreferencesManager.scanForSavedReferrers(); } + /** + * Check if AdjustInstance enable flag is set or not. + * + * @return boolean indicating whether AdjustInstance is enabled or not + */ private boolean isInstanceEnabled() { return this.startEnabled == null || this.startEnabled; } From c79a95e0433405926b861ca5c6f72de8c1da3c0a Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 9 Aug 2017 16:55:21 +0200 Subject: [PATCH 067/146] Check event buffering state for sdk_info queueing --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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 b36d24310..681f8bd78 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1573,7 +1573,12 @@ private void setPushTokenI(String token) { ActivityPackage infoPackage = infoPackageBuilder.buildInfoPackage(Constants.PUSH); packageHandler.addPackage(infoPackage); - packageHandler.sendFirstPackage(); + + if (adjustConfig.eventBufferingEnabled) { + logger.info("Buffered event %s", infoPackage.getSuffix()); + } else { + packageHandler.sendFirstPackage(); + } } private void readActivityStateI(Context context) { From 37ed9014456455bca901b0e4628cc737f078aea5 Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 10 Aug 2017 15:07:18 +0200 Subject: [PATCH 068/146] If SDK not initialised, persist push token --- .../java/com/adjust/sdk/ActivityHandler.java | 32 ++++++++++++--- .../src/main/java/com/adjust/sdk/Adjust.java | 5 +++ .../java/com/adjust/sdk/AdjustInstance.java | 33 +++++++++++++++- .../java/com/adjust/sdk/IActivityHandler.java | 2 +- .../adjust/sdk/SharedPreferencesManager.java | 39 +++++++++++++++++++ 5 files changed, 103 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 681f8bd78..aab241e78 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -107,7 +107,7 @@ public void teardown(boolean deleteState) { teardownAllSessionParametersS(deleteState); if (deleteState) { - SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(adjustConfig.context); + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext()); sharedPreferencesManager.clear(); } @@ -546,14 +546,22 @@ public void run() { } @Override - public void setPushToken(final String token) { + public void setPushToken(final String token, final boolean preSaved) { scheduledExecutor.submit(new Runnable() { @Override public void run() { + if (!preSaved) { + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext()); + sharedPreferencesManager.savePushToken(token); + } + if (activityState == null) { - startI(); + // No install has been tracked so far. + // Push token is saved, ready for the session package to pick it up. + return; + } else { + setPushTokenI(token); } - setPushTokenI(token); } }); } @@ -669,7 +677,10 @@ public void run(ActivityHandler activityHandler) { if (adjustConfig.pushToken != null) { logger.info("Push token: '%s'", adjustConfig.pushToken); if (activityState != null) { - setPushToken(adjustConfig.pushToken); + setPushToken(adjustConfig.pushToken, false); + } else { + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext()); + sharedPreferencesManager.savePushToken(adjustConfig.pushToken); } } @@ -785,7 +796,10 @@ private void processSessionI() { if (activityState == null) { activityState = new ActivityState(); activityState.sessionCount = 1; // this is the first session - activityState.pushToken = adjustConfig.pushToken; + + // activityState.pushToken = adjustConfig.pushToken; + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext()); + activityState.pushToken = sharedPreferencesManager.getPushToken(); // track the first session package only if it's enabled if (internalState.isEnabled()) { @@ -795,7 +809,9 @@ private void processSessionI() { activityState.resetSessionAttributes(now); activityState.enabled = internalState.isEnabled(); activityState.updatePackages = internalState.itHasToUpdatePackages(); + writeActivityStateI(); + sharedPreferencesManager.removePushToken(); return; } @@ -1574,6 +1590,10 @@ private void setPushTokenI(String token) { ActivityPackage infoPackage = infoPackageBuilder.buildInfoPackage(Constants.PUSH); packageHandler.addPackage(infoPackage); + // If push token was cached, remove it. + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext()); + sharedPreferencesManager.removePushToken(); + if (adjustConfig.eventBufferingEnabled) { logger.info("Buffered event %s", infoPackage.getSuffix()); } else { 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 508739c9c..cac5d2715 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java @@ -116,6 +116,11 @@ public static void setPushToken(String token) { adjustInstance.setPushToken(token); } + public static void setPushToken(final String token, final Context context) { + AdjustInstance adjustInstance = Adjust.getDefaultInstance(); + adjustInstance.setPushToken(token); + } + public static void getGoogleAdId(Context context, OnDeviceIdsRead onDeviceIdRead) { Util.getGoogleAdId(context, onDeviceIdRead); } 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 352235181..2caffa08b 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -346,7 +346,27 @@ public void setPushToken(final String token) { if (!checkActivityHandler("push token")) { this.pushToken = token; } else { - activityHandler.setPushToken(token); + activityHandler.setPushToken(token, false); + } + } + + /** + * Called to set user's push notifications token. + * + * @param token Push notifications token + * @param context Application context + */ + public void setPushToken(final String token, final Context context) { + // Don't save referrer if SDK is disabled. + if (checkActivityHandler("push token")) { + if (activityHandler.isEnabled() && isInstanceEnabled()) { + savePushToken(token, context); + activityHandler.setPushToken(pushToken, true); + } + } else { + if (isInstanceEnabled()) { + savePushToken(token, context); + } } } @@ -434,6 +454,17 @@ private void saveReferrer(final long clickTime, final String content, final Cont sharedPreferencesManager.saveReferrer(clickTime, content); } + /** + * Save push token to shared preferences. + * + * @param pushToken Push notifications token + * @param context Application context + */ + private void savePushToken(final String pushToken, final Context context) { + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); + sharedPreferencesManager.savePushToken(pushToken); + } + /** * Check saved referrers before app being killed and if any found with isBeingSent set to true, revert it to false. * 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 892847b13..524df8344 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -55,7 +55,7 @@ public interface IActivityHandler { void teardown(boolean deleteState); - void setPushToken(String token); + void setPushToken(String token, boolean preSaved); Context getContext(); } 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 e30e0bb39..7ab94abbe 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -26,6 +26,11 @@ public class SharedPreferencesManager { */ private static final String PREFS_KEY_REFERRERS = "referrers"; + /** + * Key name for push token. + */ + private static final String PREFS_KEY_PUSH_TOKEN = "push_token"; + /** * Shared preferences of the app. */ @@ -274,6 +279,31 @@ public synchronized void scanForSavedReferrers() { } } + /** + * Save push token to shared preferences. + * + * @param pushToken Push notifications token + */ + public synchronized void savePushToken(final String pushToken) { + saveString(PREFS_KEY_PUSH_TOKEN, pushToken); + } + + /** + * Get push token from shared preferences. + * + * @return Push token value + */ + public synchronized String getPushToken() { + return getString(PREFS_KEY_PUSH_TOKEN); + } + + /** + * Remove push token from shared preferences. + */ + public synchronized void removePushToken() { + remove(PREFS_KEY_PUSH_TOKEN); + } + /** * Remove all key-value pairs from shared preferences. */ @@ -305,6 +335,15 @@ private synchronized String getString(final String key) { } } + /** + * Remove a value saved with given key from shared preferences. + * + * @param key Key to be removed + */ + private synchronized void remove(final String key) { + this.sharedPreferences.edit().remove(key).commit(); + } + /** * Check if referrer information is contained in referrer queue in shared preferences and get it's index. * From e7548d4e331fde9d9f18111cd1d5afd913bbf64b Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 11 Aug 2017 14:05:53 +0200 Subject: [PATCH 069/146] Add ACCESS_NETWORK_STATE permission to example app --- Adjust/example/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/Adjust/example/src/main/AndroidManifest.xml b/Adjust/example/src/main/AndroidManifest.xml index 64cd67584..aea0cb032 100644 --- a/Adjust/example/src/main/AndroidManifest.xml +++ b/Adjust/example/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ + Date: Mon, 14 Aug 2017 14:11:39 +0200 Subject: [PATCH 070/146] Enable/disable install session logic update --- .../java/com/adjust/sdk/ActivityHandler.java | 35 +++++++++++--- .../adjust/sdk/SharedPreferencesManager.java | 46 +++++++++++++++++++ 2 files changed, 74 insertions(+), 7 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 aab241e78..0e5c36ce9 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -795,7 +795,6 @@ private void processSessionI() { // very first session if (activityState == null) { activityState = new ActivityState(); - activityState.sessionCount = 1; // this is the first session // activityState.pushToken = adjustConfig.pushToken; SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext()); @@ -803,6 +802,7 @@ private void processSessionI() { // track the first session package only if it's enabled if (internalState.isEnabled()) { + activityState.sessionCount = 1; // this is the first session transferSessionPackageI(now); } @@ -827,12 +827,7 @@ private void processSessionI() { // new session if (lastInterval > SESSION_INTERVAL) { - activityState.sessionCount++; - activityState.lastInterval = lastInterval; - - transferSessionPackageI(now); - activityState.resetSessionAttributes(now); - writeActivityStateI(); + trackNewSessionI(now); return; } @@ -851,6 +846,17 @@ private void processSessionI() { logger.verbose("Time span since last activity too short for a new subsession"); } + private void trackNewSessionI(final long now) { + long lastInterval = now - activityState.lastActivity; + + activityState.sessionCount++; + activityState.lastInterval = lastInterval; + + transferSessionPackageI(now); + activityState.resetSessionAttributes(now); + writeActivityStateI(); + } + private void checkAttributionStateI() { if (!checkActivityStateI(activityState)) { return; } @@ -977,6 +983,12 @@ private void launchSessionResponseTasksI(SessionResponseData sessionResponseData launchAttributionListenerI(handler); } + // mark install as tracked on success + if (sessionResponseData.success) { + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext()); + sharedPreferencesManager.setInstallTracked(); + } + // launch Session tracking listener if available launchSessionResponseListenerI(sessionResponseData, handler); @@ -1120,6 +1132,15 @@ private void setEnabledI(boolean enabled) { return; } + if (enabled) { + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext()); + + if (!sharedPreferencesManager.getInstallTracked()) { + long now = System.currentTimeMillis(); + trackNewSessionI(now); + } + } + activityState.enabled = enabled; writeActivityStateI(); 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 7ab94abbe..5eb4d8bac 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -31,6 +31,11 @@ public class SharedPreferencesManager { */ private static final String PREFS_KEY_PUSH_TOKEN = "push_token"; + /** + * Key name for info about whether install has been tracked or not. + */ + private static final String PREFS_KEY_INSTALL_TRACKED = "install_tracked"; + /** * Shared preferences of the app. */ @@ -297,6 +302,22 @@ public synchronized String getPushToken() { return getString(PREFS_KEY_PUSH_TOKEN); } + /** + * Save information that install has been tracked to shared preferences. + */ + public synchronized void setInstallTracked() { + saveBoolean(PREFS_KEY_INSTALL_TRACKED, true); + } + + /** + * Get information if install has been tracked from shared preferences. If no info, default to false. + * + * @return boolean indicating whether install has been tracked or not + */ + public synchronized boolean getInstallTracked() { + return getBoolean(PREFS_KEY_INSTALL_TRACKED, false); + } + /** * Remove push token from shared preferences. */ @@ -321,6 +342,16 @@ private synchronized void saveString(final String key, final String value) { this.sharedPreferences.edit().putString(key, value).commit(); } + /** + * Write a boolean value to shared preferences. + * + * @param key Key to be written to shared preferences + * @param value Value to be written to shared preferences + */ + private synchronized void saveBoolean(final String key, final boolean value) { + this.sharedPreferences.edit().putBoolean(key, value).commit(); + } + /** * Get a string value from shared preferences. * @@ -335,6 +366,21 @@ private synchronized String getString(final String key) { } } + /** + * Get a boolean value from shared preferences. + * + * @param key Key for which boolean value should be retrieved + * @param defaultValue Default value to be returned if nothing found in shared preferences + * @return boolean value for given key saved in shared preferences + */ + private synchronized boolean getBoolean(final String key, final boolean defaultValue) { + try { + return this.sharedPreferences.getBoolean(key, defaultValue); + } catch (ClassCastException e) { + return defaultValue; + } + } + /** * Remove a value saved with given key from shared preferences. * From 6de091294d637f6ca99f0d5425982398be37c434 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 14 Aug 2017 19:31:59 +0200 Subject: [PATCH 071/146] Call proper AdjustInstance method --- Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java | 2 +- 1 file changed, 1 insertion(+), 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 cac5d2715..af90c9cbc 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java @@ -118,7 +118,7 @@ public static void setPushToken(String token) { public static void setPushToken(final String token, final Context context) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.setPushToken(token); + adjustInstance.setPushToken(token, context); } public static void getGoogleAdId(Context context, OnDeviceIdsRead onDeviceIdRead) { From 64d4fae92ac76afde7c209e277b3a320be689005 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 14 Aug 2017 19:38:41 +0200 Subject: [PATCH 072/146] Store referrer and push token --- .../java/com/adjust/sdk/AdjustInstance.java | 29 ++++--------------- 1 file changed, 6 insertions(+), 23 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 2caffa08b..7def01aac 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -149,16 +149,12 @@ public void sendReferrer(final String referrer, final Context context) { return; } - // Don't save referrer if SDK is disabled. + saveReferrer(clickTime, referrer, context); + if (checkActivityHandler("referrer")) { - if (activityHandler.isEnabled() && isInstanceEnabled()) { - saveReferrer(clickTime, referrer, context); + if (activityHandler.isEnabled()) { activityHandler.sendReferrer(referrer, clickTime); } - } else { - if (isInstanceEnabled()) { - saveReferrer(clickTime, referrer, context); - } } } @@ -357,16 +353,12 @@ public void setPushToken(final String token) { * @param context Application context */ public void setPushToken(final String token, final Context context) { - // Don't save referrer if SDK is disabled. + savePushToken(token, context); + if (checkActivityHandler("push token")) { - if (activityHandler.isEnabled() && isInstanceEnabled()) { - savePushToken(token, context); + if (activityHandler.isEnabled()) { activityHandler.setPushToken(pushToken, true); } - } else { - if (isInstanceEnabled()) { - savePushToken(token, context); - } } } @@ -474,13 +466,4 @@ private void scanForReferrers(final Context context) { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); sharedPreferencesManager.scanForSavedReferrers(); } - - /** - * Check if AdjustInstance enable flag is set or not. - * - * @return boolean indicating whether AdjustInstance is enabled or not - */ - private boolean isInstanceEnabled() { - return this.startEnabled == null || this.startEnabled; - } } From 4b19f89331b84039f047836e8b78cd905f6bae51 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 15 Aug 2017 10:16:23 +0200 Subject: [PATCH 073/146] Pass proper parameter to activity handler --- Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7def01aac..168b3a645 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -357,7 +357,7 @@ public void setPushToken(final String token, final Context context) { if (checkActivityHandler("push token")) { if (activityHandler.isEnabled()) { - activityHandler.setPushToken(pushToken, true); + activityHandler.setPushToken(token, true); } } } From f1f5596e712de69a9304507a4a11723275458537 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 15 Aug 2017 10:51:53 +0200 Subject: [PATCH 074/146] Disable check before activity handler initialisation --- .../src/main/java/com/adjust/sdk/AdjustInstance.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) 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 168b3a645..a6b49ef58 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -115,7 +115,7 @@ public void setEnabled(final boolean enabled) { */ public boolean isEnabled() { if (!checkActivityHandler()) { - return false; + return isInstanceEnabled(); } return activityHandler.isEnabled(); @@ -466,4 +466,13 @@ private void scanForReferrers(final Context context) { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); sharedPreferencesManager.scanForSavedReferrers(); } + + /** + * Check if AdjustInstance enable flag is set or not. + * + * @return boolean indicating whether AdjustInstance is enabled or not + */ + private boolean isInstanceEnabled() { + return this.startEnabled == null || this.startEnabled; + } } From dd5b7cb9fb5c718b35d3bbcc99a07a5832cfa9ed Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 15 Aug 2017 11:05:35 +0200 Subject: [PATCH 075/146] Check config enable settings upon internal state creation --- Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 0e5c36ce9..0048d6462 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -195,7 +195,7 @@ private ActivityHandler(AdjustConfig adjustConfig) { internalState = new InternalState(); // enabled by default - internalState.enabled = true; + internalState.enabled = adjustConfig.startEnabled != null ? adjustConfig.startEnabled : true; // online by default internalState.offline = adjustConfig.startOffline; // in the background by default From b0e4bde8c3a60ac1a90273cc8992513f25a6e0a4 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 31 May 2017 16:39:10 +0200 Subject: [PATCH 076/146] Check config and listners in sdk --- .../java/com/adjust/sdk/ActivityHandler.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) 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 0048d6462..0944e9972 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -929,6 +929,12 @@ private void launchEventResponseTasksI(final EventResponseData eventResponseData Runnable runnable = new Runnable() { @Override public void run() { + if (adjustConfig == null) { + return; + } + if (adjustConfig.onEventTrackingSucceededListener == null) { + return; + } adjustConfig.onEventTrackingSucceededListener.onFinishedEventTrackingSucceeded(eventResponseData.getSuccessResponseData()); } }; @@ -943,6 +949,12 @@ public void run() { Runnable runnable = new Runnable() { @Override public void run() { + if (adjustConfig == null) { + return; + } + if (adjustConfig.onEventTrackingFailedListener == null) { + return; + } adjustConfig.onEventTrackingFailedListener.onFinishedEventTrackingFailed(eventResponseData.getFailureResponseData()); } }; @@ -1004,6 +1016,12 @@ private void launchSessionResponseListenerI(final SessionResponseData sessionRes Runnable runnable = new Runnable() { @Override public void run() { + if (adjustConfig == null) { + return; + } + if (adjustConfig.onSessionTrackingSucceededListener == null) { + return; + } adjustConfig.onSessionTrackingSucceededListener.onFinishedSessionTrackingSucceeded(sessionResponseData.getSuccessResponseData()); } }; @@ -1018,6 +1036,12 @@ public void run() { Runnable runnable = new Runnable() { @Override public void run() { + if (adjustConfig == null) { + return; + } + if (adjustConfig.onSessionTrackingFailedListener == null) { + return; + } adjustConfig.onSessionTrackingFailedListener.onFinishedSessionTrackingFailed(sessionResponseData.getFailureResponseData()); } }; @@ -1053,6 +1077,12 @@ private void launchAttributionListenerI(Handler handler) { Runnable runnable = new Runnable() { @Override public void run() { + if (adjustConfig == null) { + return; + } + if (adjustConfig.onAttributionChangedListener == null) { + return; + } adjustConfig.onAttributionChangedListener.onAttributionChanged(attribution); } }; @@ -1071,6 +1101,9 @@ private void prepareDeeplinkI(final Uri deeplink, final Handler handler) { Runnable runnable = new Runnable() { @Override public void run() { + if (adjustConfig == null) { + return; + } boolean toLaunchDeeplink = true; if (adjustConfig.onDeeplinkResponseListener != null) { toLaunchDeeplink = adjustConfig.onDeeplinkResponseListener.launchReceivedDeeplink(deeplink); From 1836b8f316d31838213747571adfdd3d9f203fb7 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 16 Aug 2017 12:47:33 +0200 Subject: [PATCH 077/146] Use sha256 --- Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java | 1 + Adjust/adjust/src/main/java/com/adjust/sdk/Util.java | 5 +++++ .../adjust/src/main/java/com/adjust/sdk/UtilNetworking.java | 4 ++-- 3 files changed, 8 insertions(+), 2 deletions(-) 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 95f01701d..113e58d56 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java @@ -57,6 +57,7 @@ public interface Constants { String ENCODING = "UTF-8"; String MD5 = "MD5"; String SHA1 = "SHA-1"; + String SHA256 = "SHA-256"; String CALLBACK_PARAMETERS = "callback_params"; String PARTNER_PARAMETERS = "partner_params"; diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java index d31255d15..0bb32d53c 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java @@ -45,6 +45,7 @@ import static com.adjust.sdk.Constants.ENCODING; import static com.adjust.sdk.Constants.MD5; import static com.adjust.sdk.Constants.SHA1; +import static com.adjust.sdk.Constants.SHA256; /** * Collects utility functions used by Adjust. @@ -315,6 +316,10 @@ public static String sha1(final String text) { return hash(text, SHA1); } + public static String sha256(final String text) { + return hash(text, SHA256); + } + public static String md5(final String text) { return hash(text, MD5); } 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 6e6445d1b..5393129ce 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java @@ -257,8 +257,8 @@ private static String buildAuthorizationHeader(Map parameters, Map signatureDetails = getSignature(parameters, clientSdk, activityKind, appSecret); - String algorithm = "md5"; - String signature = Util.md5(signatureDetails.get("clear_signature")); + String algorithm = "sha256"; + String signature = Util.sha256(signatureDetails.get("clear_signature")); String fields = signatureDetails.get("fields"); String signatureHeader = String.format("signature=\"%s\"", signature); From 26ddb238da0e81d91f9581584f3a3cde093e0de0 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 16 Aug 2017 13:04:42 +0200 Subject: [PATCH 078/146] Use interface in factory in sdk --- .../adjust/src/main/java/com/adjust/sdk/ActivityHandler.java | 2 ++ Adjust/adjust/src/main/java/com/adjust/sdk/AdjustFactory.java | 2 +- .../adjust/src/main/java/com/adjust/sdk/AdjustInstance.java | 4 ++-- .../adjust/src/main/java/com/adjust/sdk/IActivityHandler.java | 4 ++++ 4 files changed, 9 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 0944e9972..c3eb4f8df 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -589,6 +589,7 @@ public void run() { }); } + @Override public String getAdid() { if (activityState == null) { return null; @@ -596,6 +597,7 @@ public String getAdid() { return activityState.adid; } + @Override public AdjustAttribution getAttribution() { return attribution; } 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 d77131daf..929813c7b 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustFactory.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustFactory.java @@ -33,7 +33,7 @@ public static class URLGetConnection { } } - public static IPackageHandler getPackageHandler(ActivityHandler activityHandler, + public static IPackageHandler getPackageHandler(IActivityHandler activityHandler, Context context, boolean startsSending) { if (packageHandler == null) { 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 a6b49ef58..7a82302fd 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -31,7 +31,7 @@ public class AdjustInstance { /** * ActivityHandler instance. */ - private ActivityHandler activityHandler; + private IActivityHandler activityHandler; /** * Array of actions that were requested before SDK initialisation. @@ -54,7 +54,7 @@ public void onCreate(final AdjustConfig adjustConfig) { adjustConfig.startEnabled = startEnabled; adjustConfig.startOffline = startOffline; - activityHandler = ActivityHandler.getInstance(adjustConfig); + activityHandler = AdjustFactory.getActivityHandler(adjustConfig); // Scan for referrers. scanForReferrers(adjustConfig.context); 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 524df8344..a4efd6bb9 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -58,4 +58,8 @@ public interface IActivityHandler { void setPushToken(String token, boolean preSaved); Context getContext(); + + String getAdid(); + + AdjustAttribution getAttribution(); } From 0324bdd31ca0287cb4f41c796e75b79dcf03bea5 Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 17 Aug 2017 13:49:16 +0200 Subject: [PATCH 079/146] Check push token for following sessions --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 c3eb4f8df..9987fbcba 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -684,6 +684,12 @@ public void run(ActivityHandler activityHandler) { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext()); sharedPreferencesManager.savePushToken(adjustConfig.pushToken); } + } else { + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext()); + String savedPushToken = sharedPreferencesManager.getPushToken(); + if (activityState != null) { + setPushToken(savedPushToken, true); + } } foregroundTimer = new TimerCycle( From 6791a86bf5e30228dba7e7c8a3997a55cb73e124 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 18 Aug 2017 10:09:56 +0200 Subject: [PATCH 080/146] Check if push token changed while SDK was disabled --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 9987fbcba..b2a2a4d59 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1180,6 +1180,12 @@ private void setEnabledI(boolean enabled) { long now = System.currentTimeMillis(); trackNewSessionI(now); } + + String pushToken = sharedPreferencesManager.getPushToken(); + + if (pushToken != null && !pushToken.equals(activityState.pushToken)) { + setPushToken(pushToken, true); + } } activityState.enabled = enabled; From a26992aba663ac3f728094c3d4cd6ee2ed20c8e3 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 21 Aug 2017 14:53:58 +0200 Subject: [PATCH 081/146] Check for push token only when needed --- .../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 b2a2a4d59..33a83aa54 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -685,9 +685,10 @@ public void run(ActivityHandler activityHandler) { sharedPreferencesManager.savePushToken(adjustConfig.pushToken); } } else { - SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext()); - String savedPushToken = sharedPreferencesManager.getPushToken(); if (activityState != null) { + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext()); + String savedPushToken = sharedPreferencesManager.getPushToken(); + setPushToken(savedPushToken, true); } } From ce1690ca9d228afb2ebac8516e6978ea517bfabb Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 24 Aug 2017 10:16:07 +0200 Subject: [PATCH 082/146] Add Amazon Advertising Id accessor method --- Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java | 4 ++++ 1 file changed, 4 insertions(+) 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 af90c9cbc..dd3dbe1fd 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java @@ -125,6 +125,10 @@ public static void getGoogleAdId(Context context, OnDeviceIdsRead onDeviceIdRead Util.getGoogleAdId(context, onDeviceIdRead); } + public static String getAmazonAdId(final Context context) { + return Util.getFireAdvertisingId(context.getContentResolver()); + } + public static String getAdid() { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); return adjustInstance.getAdid(); From 878304ef9e81464e468cbab2e1643e77f8951b44 Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 7 Sep 2017 11:34:52 +0200 Subject: [PATCH 083/146] Change signature parameters --- .../java/com/adjust/sdk/UtilNetworking.java | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) 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 5393129ce..80888c0d3 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java @@ -255,7 +255,7 @@ private static String buildAuthorizationHeader(Map parameters, } String appSecretName = "app_secret"; - Map signatureDetails = getSignature(parameters, clientSdk, activityKind, appSecret); + Map signatureDetails = getSignature(parameters, activityKind, appSecret); String algorithm = "sha256"; String signature = Util.sha256(signatureDetails.get("clear_signature")); @@ -273,15 +273,9 @@ private static String buildAuthorizationHeader(Map parameters, private static Map getSignature( final Map parameters, - final String clientSdk, final String activityKind, - final String appSecret) { - String sdkVersionName = "sdk_version"; - String sdkVersion = clientSdk; - - String appVersionName = "app_version"; - String appVersion = parameters.get(appVersionName); - + final String appSecret) + { String activityKindName = "activity_kind"; String activityKindValue = activityKind; @@ -294,8 +288,6 @@ private static Map getSignature( Map signatureParams = new HashMap(); signatureParams.put("app_secret", appSecret); - signatureParams.put(sdkVersionName, sdkVersion); - signatureParams.put(appVersionName, appVersion); signatureParams.put(createdAtName, createdAt); signatureParams.put(activityKindName, activityKindValue); signatureParams.put(deviceIdentifierName, deviceIdentifier); @@ -327,6 +319,7 @@ private static String getValidIdentifier(final Map parameters) { String androidIdName = "android_id"; String macSha1Name = "mac_sha1"; String macMd5Name = "mac_md5"; + String androidUUIDName= "android_uuid"; if (parameters.get(googleAdIdName) != null) { return googleAdIdName; @@ -343,6 +336,9 @@ private static String getValidIdentifier(final Map parameters) { if (parameters.get(macMd5Name) != null) { return macMd5Name; } + if (parameters.get(androidUUIDName) != null) { + return androidUUIDName; + } return null; } From f6f5ce8e41cf13636a609dd9a2faa75647bc6ad4 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 13 Sep 2017 13:25:41 +0200 Subject: [PATCH 084/146] Remove external device id --- .../java/com/adjust/sdk/ActivityHandler.java | 28 ------------------- .../java/com/adjust/sdk/AdjustConfig.java | 5 ---- .../java/com/adjust/sdk/PackageBuilder.java | 5 ---- .../java/com/adjust/sdk/PackageHandler.java | 4 --- .../com/adjust/sdk/SessionParameters.java | 24 +--------------- 5 files changed, 1 insertion(+), 65 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 33a83aa54..a64e1fac7 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -740,10 +740,6 @@ public void run() { sdkClickHandler = AdjustFactory.getSdkClickHandler(this, toSendI(true)); - if (adjustConfig.externalDeviceId != null) { - setExternalDeviceIdI(adjustConfig.externalDeviceId); - } - if (isToUpdatePackagesI()) { updatePackagesI(); } @@ -1627,21 +1623,6 @@ public void resetSessionPartnerParametersI() { writeSessionPartnerParametersI(); } - public void setExternalDeviceIdI(String externalDeviceId) { - if (externalDeviceId == null) { - return; - } - - if (sessionParameters.externalDeviceId != null) { - logger.warn("External device id %s will be overwritten", sessionParameters.externalDeviceId); - } - - sessionParameters.externalDeviceId = externalDeviceId; - - writeSessionParametersI(); - } - - private void setPushTokenI(String token) { if (!checkActivityStateI(activityState)) { return; } if (!isEnabledI()) { return; } @@ -1787,15 +1768,6 @@ private void writeSessionPartnerParametersI() { } } - private void writeSessionParametersI() { - synchronized (SessionParameters.class) { - if (sessionParameters == null) { - return; - } - Util.writeObject(sessionParameters, adjustConfig.context, SESSION_PARAMETERS_FILENAME, SESSION_PARAMETERS_NAME); - } - } - private void teardownAllSessionParametersS(boolean toDelete) { synchronized (SessionParameters.class) { if (sessionParameters == null) { 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 a2bbe2d7d..4c074a548 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -31,7 +31,6 @@ public class AdjustConfig { String pushToken; Boolean startEnabled; boolean startOffline; - String externalDeviceId; String appSecret; public static final String ENVIRONMENT_SANDBOX = "sandbox"; @@ -133,10 +132,6 @@ public void setUserAgent(String userAgent) { this.userAgent = userAgent; } - public void setExternalDeviceId(String externalDeviceId) { - this.externalDeviceId = externalDeviceId; - } - public void setAppSecret(long info1, long info2, long info3, long info4) { this.appSecret = String.format("%d%d%d%d", info1, info2, info3, info4); } 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 16bf005fd..a84c706e5 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -186,7 +186,6 @@ private Map getDefaultParameters() { injectDeviceInfo(parameters); injectConfig(parameters); injectActivityState(parameters); - injectSessionParameters(parameters); injectCommonParameters(parameters); // general @@ -275,10 +274,6 @@ private void injectActivityState(Map parameters) { PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); } - private void injectSessionParameters(Map parameters) { - PackageBuilder.addString(parameters, "external_device_id", sessionParameters.externalDeviceId); - } - private void injectCommonParameters(Map parameters) { PackageBuilder.addDate(parameters, "created_at", createdAt); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); 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 9d9b1c424..958bc9fcf 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageHandler.java @@ -245,7 +245,6 @@ public void updatePackagesI(SessionParameters sessionParameters) { logger.debug("Updating package handler queue"); logger.verbose("Session callback parameters: %s", sessionParameters.callbackParameters); logger.verbose("Session partner parameters: %s", sessionParameters.partnerParameters); - logger.verbose("Session parameters: %s", sessionParameters.toStringSerialized()); for (ActivityPackage activityPackage : packageQueue) { Map parameters = activityPackage.getParameters(); @@ -261,9 +260,6 @@ public void updatePackagesI(SessionParameters sessionParameters) { "Partner"); PackageBuilder.addMapJson(parameters, PARTNER_PARAMETERS, mergedPartnerParameters); - - // remaining session parameters - PackageBuilder.addString(parameters, "external_device_id", sessionParameters.externalDeviceId); } writePackageQueueI(); diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/SessionParameters.java b/Adjust/adjust/src/main/java/com/adjust/sdk/SessionParameters.java index 2da72b88f..52f9f7beb 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SessionParameters.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SessionParameters.java @@ -11,16 +11,10 @@ /** * Created by pfms on 29/07/2016. */ -public class SessionParameters implements Serializable, Cloneable { +public class SessionParameters { Map callbackParameters; Map partnerParameters; - String externalDeviceId; - - private static final ObjectStreamField[] serialPersistentFields = { - new ObjectStreamField("externalDeviceId", String.class), - }; - @Override public boolean equals(Object other) { if (other == this) return true; @@ -28,7 +22,6 @@ public boolean equals(Object other) { if (getClass() != other.getClass()) return false; SessionParameters otherSessionParameters = (SessionParameters) other; - if (!Util.equalString(externalDeviceId, otherSessionParameters.externalDeviceId)) return false; if (!Util.equalObject(callbackParameters, otherSessionParameters.callbackParameters)) return false; if (!Util.equalObject(partnerParameters, otherSessionParameters.partnerParameters)) return false; @@ -38,7 +31,6 @@ public boolean equals(Object other) { @Override public int hashCode() { int hashCode = 17; - hashCode = 37 * hashCode + Util.hashString(externalDeviceId); hashCode = 37 * hashCode + Util.hashObject(callbackParameters); hashCode = 37 * hashCode + Util.hashObject(partnerParameters); return hashCode; @@ -52,20 +44,6 @@ public SessionParameters deepCopy() { if (this.partnerParameters != null) { newSessionParameters.partnerParameters = new HashMap(this.partnerParameters); } - newSessionParameters.externalDeviceId = this.externalDeviceId; return newSessionParameters; } - - public String toStringSerialized() { - return String.format("externalDeviceId %s", externalDeviceId); - } - - private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { - ObjectInputStream.GetField fields = stream.readFields(); - - externalDeviceId = Util.readStringField(fields, "externalDeviceId", null); - } - private void writeObject(ObjectOutputStream stream) throws IOException { - stream.defaultWriteObject(); - } } From 3a5a547260fe4593f913b25eccf5ff8a06ef3dbf Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 20 Sep 2017 13:07:47 +0200 Subject: [PATCH 085/146] Rename addint to long --- .../main/java/com/adjust/sdk/PackageBuilder.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) 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 a84c706e5..40cb5cf72 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -90,7 +90,7 @@ public ActivityPackage buildSessionPackage(boolean isInDelay) { public ActivityPackage buildEventPackage(AdjustEvent event, boolean isInDelay) { Map parameters = getDefaultParameters(); - PackageBuilder.addInt(parameters, "event_count", activityStateCopy.eventCount); + PackageBuilder.addLong(parameters, "event_count", activityStateCopy.eventCount); PackageBuilder.addString(parameters, "event_token", event.eventToken); PackageBuilder.addDouble(parameters, "revenue", event.revenue); PackageBuilder.addString(parameters, "currency", event.currency); @@ -230,8 +230,8 @@ private void injectDeviceInfo(Map parameters) { PackageBuilder.addString(parameters, "vm_isa", deviceInfo.vmInstructionSet); PackageBuilder.addString(parameters, "mcc", Util.getMcc(adjustConfig.context)); PackageBuilder.addString(parameters, "mnc", Util.getMnc(adjustConfig.context)); - PackageBuilder.addInt(parameters, "connectivity_type", Util.getConnectivityType(adjustConfig.context)); - PackageBuilder.addInt(parameters, "network_type", Util.getNetworkType(adjustConfig.context)); + PackageBuilder.addLong(parameters, "connectivity_type", Util.getConnectivityType(adjustConfig.context)); + PackageBuilder.addLong(parameters, "network_type", Util.getNetworkType(adjustConfig.context)); fillPluginKeys(parameters); } @@ -268,8 +268,8 @@ private void injectConfig(Map parameters) { private void injectActivityState(Map parameters) { PackageBuilder.addString(parameters, "android_uuid", activityStateCopy.uuid); - PackageBuilder.addInt(parameters, "session_count", activityStateCopy.sessionCount); - PackageBuilder.addInt(parameters, "subsession_count", activityStateCopy.subsessionCount); + PackageBuilder.addLong(parameters, "session_count", activityStateCopy.sessionCount); + PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount); PackageBuilder.addDuration(parameters, "session_length", activityStateCopy.sessionLength); PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent); } @@ -324,7 +324,7 @@ public static void addString(Map parameters, String key, String parameters.put(key, value); } - public static void addInt(Map parameters, String key, long value) { + public static void addLong(Map parameters, String key, long value) { if (value < 0) { return; } @@ -348,7 +348,7 @@ public static void addDuration(Map parameters, String key, long } long durationInSeconds = (durationInMilliSeconds + 500) / 1000; - PackageBuilder.addInt(parameters, key, durationInSeconds); + PackageBuilder.addLong(parameters, key, durationInSeconds); } public static void addMapJson(Map parameters, String key, Map map) { @@ -373,7 +373,7 @@ public static void addBoolean(Map parameters, String key, Boolea int intValue = value ? 1 : 0; - PackageBuilder.addInt(parameters, key, intValue); + PackageBuilder.addLong(parameters, key, intValue); } public static void addDouble(Map parameters, String key, Double value) { From a68659a2c3993a1b815b0723484e75d55acb4d64 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 20 Sep 2017 13:10:59 +0200 Subject: [PATCH 086/146] Add secret id --- .../src/main/java/com/adjust/sdk/AdjustConfig.java | 4 +++- .../main/java/com/adjust/sdk/PackageBuilder.java | 10 +++++++++- .../main/java/com/adjust/sdk/UtilNetworking.java | 14 +++++++++++--- 3 files changed, 23 insertions(+), 5 deletions(-) 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 4c074a548..e02fdce8e 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -31,6 +31,7 @@ public class AdjustConfig { String pushToken; Boolean startEnabled; boolean startOffline; + Long secretId; String appSecret; public static final String ENVIRONMENT_SANDBOX = "sandbox"; @@ -132,7 +133,8 @@ public void setUserAgent(String userAgent) { this.userAgent = userAgent; } - public void setAppSecret(long info1, long info2, long info3, long info4) { + public void setAppSecret(long secretId, long info1, long info2, long info3, long info4) { + this.secretId = secretId; this.appSecret = String.format("%d%d%d%d", info1, info2, info3, info4); } 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 40cb5cf72..cb3a6d836 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -263,7 +263,7 @@ private void injectConfig(Map parameters) { PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", fireTrackingEnabled); PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); - + PackageBuilder.addLongObject(parameters, "secret_id", adjustConfig.secretId); } private void injectActivityState(Map parameters) { @@ -324,6 +324,14 @@ public static void addString(Map parameters, String key, String parameters.put(key, value); } + public static void addLongObject(Map parameters, String key, Long value) { + if (value == null) { + return; + } + + PackageBuilder.addLong(parameters, key, value.longValue()); + } + public static void addLong(Map parameters, String key, long value) { if (value < 0) { 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 80888c0d3..54c1e95bf 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java @@ -41,9 +41,10 @@ public static ResponseData createPOSTHttpsURLConnection(String urlString, Activi Map parameters = new HashMap(activityPackage.getParameters()); String appSecret = extractAppSecret(parameters); + String secretId = extractSecretId(parameters); setDefaultHttpsUrlConnectionProperties(connection, activityPackage.getClientSdk()); - String authorizationHeader = buildAuthorizationHeader(parameters, appSecret, activityPackage.getClientSdk(), activityPackage.getActivityKind().toString()); + String authorizationHeader = buildAuthorizationHeader(parameters, appSecret, secretId, activityPackage.getClientSdk(), activityPackage.getActivityKind().toString()); if (authorizationHeader != null) { connection.setRequestProperty("Authorization", authorizationHeader); } @@ -75,12 +76,13 @@ public static ResponseData createGETHttpsURLConnection(ActivityPackage activityP try { Map parameters = new HashMap(activityPackage.getParameters()); String appSecret = extractAppSecret(parameters); + String secretId = extractSecretId(parameters); Uri uri = buildUri(activityPackage.getPath(), parameters); URL url = new URL(uri.toString()); HttpsURLConnection connection = AdjustFactory.getHttpsURLConnection(url); - String authorizationHeader = buildAuthorizationHeader(parameters, appSecret, activityPackage.getClientSdk(), activityPackage.getActivityKind().toString()); + String authorizationHeader = buildAuthorizationHeader(parameters, appSecret, secretId, activityPackage.getClientSdk(), activityPackage.getActivityKind().toString()); if (authorizationHeader != null) { connection.setRequestProperty("Authorization", authorizationHeader); } @@ -245,8 +247,13 @@ private static String extractAppSecret(Map parameters) { return parameters.remove("app_secret"); } + private static String extractSecretId(Map parameters) { + return parameters.remove("secret_id"); + } + private static String buildAuthorizationHeader(Map parameters, String appSecret, + String secretId, String clientSdk, String activityKind) { // check if the secret exists and it's not empty @@ -261,11 +268,12 @@ private static String buildAuthorizationHeader(Map parameters, String signature = Util.sha256(signatureDetails.get("clear_signature")); String fields = signatureDetails.get("fields"); + String secretIdHeader = String.format("secret_id=\"%s\"", secretId); String signatureHeader = String.format("signature=\"%s\"", signature); String algorithmHeader = String.format("algorithm=\"%s\"", algorithm); String fieldsHeader = String.format("headers=\"%s\"", fields); - String authorizationHeader = String.format("Signature %s,%s,%s", signatureHeader, algorithmHeader, fieldsHeader); + String authorizationHeader = String.format("Signature %s,%s,%s,%s", secretIdHeader, signatureHeader, algorithmHeader, fieldsHeader); getLogger().verbose("authorizationHeader clear: %s", authorizationHeader); return authorizationHeader; From 0143960eebeec4efcbfc1faf3dd1ff0b4e51c8a7 Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 5 Oct 2017 16:04:50 +0200 Subject: [PATCH 087/146] Refac secret id --- .../src/main/java/com/adjust/sdk/AdjustConfig.java | 4 ++-- .../src/main/java/com/adjust/sdk/PackageBuilder.java | 10 +--------- .../src/main/java/com/adjust/sdk/UtilNetworking.java | 2 +- 3 files changed, 4 insertions(+), 12 deletions(-) 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 e02fdce8e..539129aac 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -31,7 +31,7 @@ public class AdjustConfig { String pushToken; Boolean startEnabled; boolean startOffline; - Long secretId; + String secretId; String appSecret; public static final String ENVIRONMENT_SANDBOX = "sandbox"; @@ -134,7 +134,7 @@ public void setUserAgent(String userAgent) { } public void setAppSecret(long secretId, long info1, long info2, long info3, long info4) { - this.secretId = secretId; + this.secretId = String.format("%d", secretId); this.appSecret = String.format("%d%d%d%d", info1, info2, info3, info4); } 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 cb3a6d836..34cdfa8ee 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -262,8 +262,8 @@ private void injectConfig(Map parameters) { Boolean fireTrackingEnabled = Util.getFireTrackingEnabled(contentResolver); PackageBuilder.addBoolean(parameters, "fire_tracking_enabled", fireTrackingEnabled); + PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); - PackageBuilder.addLongObject(parameters, "secret_id", adjustConfig.secretId); } private void injectActivityState(Map parameters) { @@ -324,14 +324,6 @@ public static void addString(Map parameters, String key, String parameters.put(key, value); } - public static void addLongObject(Map parameters, String key, Long value) { - if (value == null) { - return; - } - - PackageBuilder.addLong(parameters, key, value.longValue()); - } - public static void addLong(Map parameters, String key, long value) { if (value < 0) { 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 54c1e95bf..ec7d22e89 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java @@ -274,7 +274,7 @@ private static String buildAuthorizationHeader(Map parameters, String fieldsHeader = String.format("headers=\"%s\"", fields); String authorizationHeader = String.format("Signature %s,%s,%s,%s", secretIdHeader, signatureHeader, algorithmHeader, fieldsHeader); - getLogger().verbose("authorizationHeader clear: %s", authorizationHeader); + getLogger().verbose("authorizationHeader: %s", authorizationHeader); return authorizationHeader; } From 4632547abfa335138226c0a142379f9aaf481537 Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 5 Oct 2017 16:05:11 +0200 Subject: [PATCH 088/146] Remove unused client sdk argument --- .../adjust/src/main/java/com/adjust/sdk/UtilNetworking.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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 ec7d22e89..e28939a3c 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/UtilNetworking.java @@ -44,7 +44,7 @@ public static ResponseData createPOSTHttpsURLConnection(String urlString, Activi String secretId = extractSecretId(parameters); setDefaultHttpsUrlConnectionProperties(connection, activityPackage.getClientSdk()); - String authorizationHeader = buildAuthorizationHeader(parameters, appSecret, secretId, activityPackage.getClientSdk(), activityPackage.getActivityKind().toString()); + String authorizationHeader = buildAuthorizationHeader(parameters, appSecret, secretId, activityPackage.getActivityKind().toString()); if (authorizationHeader != null) { connection.setRequestProperty("Authorization", authorizationHeader); } @@ -82,7 +82,7 @@ public static ResponseData createGETHttpsURLConnection(ActivityPackage activityP URL url = new URL(uri.toString()); HttpsURLConnection connection = AdjustFactory.getHttpsURLConnection(url); - String authorizationHeader = buildAuthorizationHeader(parameters, appSecret, secretId, activityPackage.getClientSdk(), activityPackage.getActivityKind().toString()); + String authorizationHeader = buildAuthorizationHeader(parameters, appSecret, secretId, activityPackage.getActivityKind().toString()); if (authorizationHeader != null) { connection.setRequestProperty("Authorization", authorizationHeader); } @@ -254,7 +254,6 @@ private static String extractSecretId(Map parameters) { private static String buildAuthorizationHeader(Map parameters, String appSecret, String secretId, - String clientSdk, String activityKind) { // check if the secret exists and it's not empty if (appSecret == null || appSecret.length() == 0) { From 0cdba4008cb8e9c22e066573e1fa1b1ec2445d0a Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 5 Oct 2017 16:05:37 +0200 Subject: [PATCH 089/146] Move to common parameters --- Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 34cdfa8ee..789a25fb2 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -252,7 +252,6 @@ private void injectConfig(Map parameters) { PackageBuilder.addString(parameters, "app_token", adjustConfig.appToken); PackageBuilder.addString(parameters, "environment", adjustConfig.environment); PackageBuilder.addBoolean(parameters, "device_known", adjustConfig.deviceKnown); - PackageBuilder.addBoolean(parameters, "needs_response_details", true); PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled); PackageBuilder.addString(parameters, "push_token", activityStateCopy.pushToken); @@ -277,6 +276,7 @@ private void injectActivityState(Map parameters) { private void injectCommonParameters(Map parameters) { PackageBuilder.addDate(parameters, "created_at", createdAt); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); + PackageBuilder.addBoolean(parameters, "needs_response_details", true); } private void injectAttribution(Map parameters) { From ffbe614bdf7fe4cde1985e1209c188e201d83c0c Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 5 Oct 2017 16:07:52 +0200 Subject: [PATCH 090/146] Update build tools --- Adjust/adjust/build.gradle | 2 +- Adjust/example/build.gradle | 2 +- Adjust/test/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Adjust/adjust/build.gradle b/Adjust/adjust/build.gradle index c26d9ded9..48fbcc4bf 100644 --- a/Adjust/adjust/build.gradle +++ b/Adjust/adjust/build.gradle @@ -6,7 +6,7 @@ def getVersionName() { android { compileSdkVersion 25 - buildToolsVersion "25.0.2" + buildToolsVersion '26.0.2' defaultConfig { minSdkVersion 9 diff --git a/Adjust/example/build.gradle b/Adjust/example/build.gradle index 1afb82931..15d33d4db 100644 --- a/Adjust/example/build.gradle +++ b/Adjust/example/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 25 - buildToolsVersion "25.0.2" + buildToolsVersion '26.0.2' defaultConfig { applicationId "com.adjust.examples" diff --git a/Adjust/test/build.gradle b/Adjust/test/build.gradle index 187f7dc92..2570c8409 100644 --- a/Adjust/test/build.gradle +++ b/Adjust/test/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion 25 - buildToolsVersion "25.0.2" + buildToolsVersion '26.0.2' defaultConfig { minSdkVersion 9 From e5e35476eb69be20fe992eda3337e4015b994d3f Mon Sep 17 00:00:00 2001 From: Pedro Filipe Date: Fri, 6 Oct 2017 11:44:38 +0200 Subject: [PATCH 091/146] Add amazon fire ad id to Readme --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 563eed1ef..f0fdcd3da 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ our [Android web views SDK guide](doc/english/web_views.md). * [Background tracking](#background-tracking) * [Device IDs](#device-ids) * [Google Play Services advertising identifier](#di-gps-adid) + * [Amazon Fire advertising identifier](#di-amz-adid) * [Adjust device identifier](#di-adid) * [User attribution](#user-attribution) * [Push token](#push-token) @@ -712,6 +713,14 @@ Adjust.getGoogleAdId(this, new OnDeviceIdsRead() { Inside the method `onGoogleAdIdRead` of the `OnDeviceIdsRead` instance, you will have access to Google Advertising ID as the variable `googleAdId`. +### Amazon Fire advertising identifier + +If you need to obtain the Amazon Advertising ID, you can make a call to following method on `Adjust` instance: + +```java +String amazonAdId = Adjust.getAmazonAdId(context); +``` + ### Adjust device identifier For each device with your app installed on it, adjust backend generates unique **adjust device identifier** (**adid**). In order to obtain this identifier, you can make a call to following method on `Adjust` instance: From 4be1d1a3585e8477ab7cc73cd07737cf27afbb05 Mon Sep 17 00:00:00 2001 From: Pedro Filipe Date: Fri, 6 Oct 2017 11:49:03 +0200 Subject: [PATCH 092/146] Update push token documentation --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index f0fdcd3da..116bd1cb3 100644 --- a/README.md +++ b/README.md @@ -749,6 +749,13 @@ AdjustAttribution attribution = Adjust.getAttribution(); To send us the push notification token, add the following call to Adjust once you have obtained your token or when ever it's value is changed: +```java +Adjust.setPushToken(pushNotificationsToken, context); +``` + +This updated signature with the context, allows the sdk to cover more scenarios to make sure the token is send. +We still support the previous signature of the same method: + ```java Adjust.setPushToken(pushNotificationsToken); ``` From 4168d47abfb19c3a1695156940a864d75b120327 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 6 Oct 2017 16:15:21 +0200 Subject: [PATCH 093/146] Exclude string in package log --- .../src/main/java/com/adjust/sdk/ActivityPackage.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java index e37385e3b..483ef5c68 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java @@ -14,6 +14,8 @@ import java.io.ObjectOutputStream; import java.io.ObjectStreamField; import java.io.Serializable; +import java.util.Arrays; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.SortedMap; @@ -144,8 +146,13 @@ public String getExtendedString() { if (parameters != null) { builder.append("Parameters:"); SortedMap sortedParameters = new TreeMap(parameters); + List stringsToExclude = Arrays.asList("app_secret", "secret_id"); for (Map.Entry entry : sortedParameters.entrySet() ) { - builder.append(String.format(Locale.US, "\n\t%-16s %s", entry.getKey(), entry.getValue())); + String key = entry.getKey(); + if (stringsToExclude.contains(key)) { + continue; + } + builder.append(String.format(Locale.US, "\n\t%-16s %s", key, entry.getValue())); } } return builder.toString(); From eb58d686dacfb2dbf4f45f0863914ce8cecdba16 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 24 Oct 2017 12:54:08 +0200 Subject: [PATCH 094/146] Apply instead of commit --- .../java/com/adjust/sdk/SharedPreferencesManager.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 5eb4d8bac..1123b1b20 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -329,7 +329,7 @@ public synchronized void removePushToken() { * Remove all key-value pairs from shared preferences. */ public synchronized void clear() { - this.sharedPreferences.edit().clear().commit(); + this.sharedPreferences.edit().clear().apply(); } /** @@ -339,7 +339,7 @@ public synchronized void clear() { * @param value Value to be written to shared preferences */ private synchronized void saveString(final String key, final String value) { - this.sharedPreferences.edit().putString(key, value).commit(); + this.sharedPreferences.edit().putString(key, value).apply(); } /** @@ -349,7 +349,7 @@ private synchronized void saveString(final String key, final String value) { * @param value Value to be written to shared preferences */ private synchronized void saveBoolean(final String key, final boolean value) { - this.sharedPreferences.edit().putBoolean(key, value).commit(); + this.sharedPreferences.edit().putBoolean(key, value).apply(); } /** @@ -387,7 +387,7 @@ private synchronized boolean getBoolean(final String key, final boolean defaultV * @param key Key to be removed */ private synchronized void remove(final String key) { - this.sharedPreferences.edit().remove(key).commit(); + this.sharedPreferences.edit().remove(key).apply(); } /** From 7f963d00175697f907738bd440ac4a03c9e0f60a Mon Sep 17 00:00:00 2001 From: Obaied Date: Thu, 2 Nov 2017 14:11:52 +0100 Subject: [PATCH 095/146] Update dependencies to API 26 and Gradle 3.0 --- Adjust/adjust/build.gradle | 4 ++-- Adjust/build.gradle | 3 ++- Adjust/example/build.gradle | 17 ++++++++--------- Adjust/gradle/wrapper/gradle-wrapper.properties | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Adjust/adjust/build.gradle b/Adjust/adjust/build.gradle index 48fbcc4bf..5b21d476c 100644 --- a/Adjust/adjust/build.gradle +++ b/Adjust/adjust/build.gradle @@ -5,12 +5,12 @@ def getVersionName() { } android { - compileSdkVersion 25 + compileSdkVersion 26 buildToolsVersion '26.0.2' defaultConfig { minSdkVersion 9 - targetSdkVersion 25 + targetSdkVersion 26 versionCode 1 versionName getVersionName() } diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 596601301..5aa4870fb 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.3' + classpath 'com.android.tools.build:gradle:3.0.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -15,5 +15,6 @@ buildscript { allprojects { repositories { jcenter() + google() } } diff --git a/Adjust/example/build.gradle b/Adjust/example/build.gradle index 15d33d4db..9a4ebea2e 100644 --- a/Adjust/example/build.gradle +++ b/Adjust/example/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 25 + compileSdkVersion 26 buildToolsVersion '26.0.2' defaultConfig { applicationId "com.adjust.examples" minSdkVersion 14 - targetSdkVersion 25 + targetSdkVersion 26 versionCode 1 versionName "1.0" } @@ -20,18 +20,17 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:25.0.1' - compile 'com.google.android.gms:play-services-analytics:10.2.1' + implementation 'com.android.support:appcompat-v7:27.0.0' + implementation 'com.google.android.gms:play-services-analytics:11.4.2' // imported module - compile project(":adjust") + implementation project(":adjust") // running mvn package //compile fileTree(dir: '../target', include: ['*.jar']) // using maven repository //compile 'com.adjust.sdk:adjust-android:4.12.0' - debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5' - releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5' - testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5' + debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.4' + releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4' + testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4' } diff --git a/Adjust/gradle/wrapper/gradle-wrapper.properties b/Adjust/gradle/wrapper/gradle-wrapper.properties index 93fd9d6a2..2e23b91cb 100644 --- a/Adjust/gradle/wrapper/gradle-wrapper.properties +++ b/Adjust/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Mar 04 10:52:52 CET 2017 +#Thu Nov 02 14:01:25 CET 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip From e9b04df3f31d69fe2cb3a2a2981f56963bc6f93b Mon Sep 17 00:00:00 2001 From: Obaied Date: Thu, 2 Nov 2017 14:12:06 +0100 Subject: [PATCH 096/146] Remove penalty dialog with StrictMode --- .../src/main/java/com/adjust/examples/GlobalApplication.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Adjust/example/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example/src/main/java/com/adjust/examples/GlobalApplication.java index 9ee893ef2..809ed6edc 100644 --- a/Adjust/example/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example/src/main/java/com/adjust/examples/GlobalApplication.java @@ -41,7 +41,6 @@ public void onCreate() { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectAll() .penaltyLog() - .penaltyDialog() .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectAll() From d252fe031098c6b54e3c4469ee08f63f550f90d8 Mon Sep 17 00:00:00 2001 From: Obaied Date: Thu, 2 Nov 2017 14:12:27 +0100 Subject: [PATCH 097/146] Reformating --- .../com/adjust/examples/GlobalApplication.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Adjust/example/src/main/java/com/adjust/examples/GlobalApplication.java b/Adjust/example/src/main/java/com/adjust/examples/GlobalApplication.java index 809ed6edc..b69777cf2 100644 --- a/Adjust/example/src/main/java/com/adjust/examples/GlobalApplication.java +++ b/Adjust/example/src/main/java/com/adjust/examples/GlobalApplication.java @@ -180,18 +180,23 @@ public void onActivityPaused(Activity activity) { } @Override - public void onActivityStopped(Activity activity) {} + public void onActivityStopped(Activity activity) { + } @Override - public void onActivitySaveInstanceState(Activity activity, Bundle outState) {} + public void onActivitySaveInstanceState(Activity activity, Bundle outState) { + } @Override - public void onActivityDestroyed(Activity activity) {} + public void onActivityDestroyed(Activity activity) { + } @Override - public void onActivityCreated(Activity activity, Bundle savedInstanceState) {} + public void onActivityCreated(Activity activity, Bundle savedInstanceState) { + } @Override - public void onActivityStarted(Activity activity) {} + public void onActivityStarted(Activity activity) { + } } } From 799c0a90a20e739dbb9de8e05c5c41dfb671fb20 Mon Sep 17 00:00:00 2001 From: Obaied Date: Thu, 2 Nov 2017 14:20:17 +0100 Subject: [PATCH 098/146] Replace 27.0.0 with 26.1.0 appcompat version for better compatibility --- Adjust/example/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/example/build.gradle b/Adjust/example/build.gradle index 9a4ebea2e..ca2e7324f 100644 --- a/Adjust/example/build.gradle +++ b/Adjust/example/build.gradle @@ -20,7 +20,7 @@ android { } dependencies { - implementation 'com.android.support:appcompat-v7:27.0.0' + implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.google.android.gms:play-services-analytics:11.4.2' // imported module implementation project(":adjust") From 78aad629072acf6601615a5dd50dc0211d2f771f Mon Sep 17 00:00:00 2001 From: Obaied Date: Thu, 2 Nov 2017 14:36:29 +0100 Subject: [PATCH 099/146] + using Gradle 3.0 --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 116bd1cb3..6184e8996 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,18 @@ If you are using Maven, add this line instead: ``` compile 'com.adjust.sdk:adjust-android:4.12.0' ``` +** +Note: If you are using Gradle 3.0.x, make sure to use the `implementation` keyword instead of `compile` as follows: + +``` +implementation project(":adjust") + +// OR + +implementation 'com.adjust.sdk:adjust-android:4.12.0' +``` + +The same goes for the step below when adding Google Play Services. ### Add Google Play Services From adad320937b6b3da46c61a60906809090ec99975 Mon Sep 17 00:00:00 2001 From: Obaied Date: Tue, 7 Nov 2017 19:43:15 +0100 Subject: [PATCH 100/146] Append Google's Maven repo to root build.gradle file --- Adjust/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/Adjust/build.gradle b/Adjust/build.gradle index 5aa4870fb..3f4d4321a 100644 --- a/Adjust/build.gradle +++ b/Adjust/build.gradle @@ -3,6 +3,7 @@ buildscript { repositories { jcenter() + google() } dependencies { classpath 'com.android.tools.build:gradle:3.0.0' From 7dca357b4d44e480744d4eb4518559bbb8a15f63 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 8 Nov 2017 14:36:52 +0100 Subject: [PATCH 101/146] Read mobile Equipment identity --- .../java/com/adjust/sdk/AdjustConfig.java | 5 +++ .../java/com/adjust/sdk/PackageBuilder.java | 4 ++ .../main/java/com/adjust/sdk/Reflection.java | 39 +++++++++++++++++++ .../src/main/java/com/adjust/sdk/Util.java | 3 ++ .../plugin/MobileEquipmentIdentityUtil.java | 34 ++++++++++++++++ 5 files changed, 85 insertions(+) create mode 100644 Adjust/adjust/src/main/java/com/adjust/sdk/plugin/MobileEquipmentIdentityUtil.java 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 539129aac..79d595405 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java @@ -33,6 +33,7 @@ public class AdjustConfig { boolean startOffline; String secretId; String appSecret; + boolean readMobileEquipmentIdentity; public static final String ENVIRONMENT_SANDBOX = "sandbox"; public static final String ENVIRONMENT_PRODUCTION = "production"; @@ -138,6 +139,10 @@ public void setAppSecret(long secretId, long info1, long info2, long info3, long this.appSecret = String.format("%d%d%d%d", info1, info2, info3, info4); } + public void setReadMobileEquipmentIdentity(boolean readMobileEquipmentIdentity) { + this.readMobileEquipmentIdentity = readMobileEquipmentIdentity; + } + public boolean isValid() { return appToken != null; } 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 789a25fb2..e5113493b 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -263,6 +263,10 @@ private void injectConfig(Map parameters) { PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); + if (adjustConfig.readMobileEquipmentIdentity) { + String mobileEquipmentId = Util.getMobileEquipmentIdentity(adjustConfig.context); + PackageBuilder.addString(parameters, "mobile_equipment_id", mobileEquipmentId); + } } private void injectActivityState(Map parameters) { diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Reflection.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Reflection.java index 56e60bda9..c58c5d456 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Reflection.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Reflection.java @@ -2,6 +2,7 @@ import android.content.Context; import android.content.res.Configuration; +import android.telephony.TelephonyManager; import com.adjust.sdk.plugin.Plugin; @@ -88,6 +89,44 @@ public static String getAndroidId(Context context) { } } + public static String getMobileEquipmentIdentity(Context context) { + try { + String mobileEquipmentIdentity = (String) invokeStaticMethod("com.adjust.sdk.plugin.MobileEquipmentIdentityUtil", "getMobileEquipmentIdentity" + , new Class[]{Context.class}, context); + + return mobileEquipmentIdentity; + } catch (Throwable t) { + return null; + } + } + + public static String getLinkIMEI(TelephonyManager telephonyManager) { + // return telephonyManager.getImei(); + try { + return (String) invokeInstanceMethod(telephonyManager, "getImei", null); + } catch (Exception e) { + return null; + } + } + + public static String getLinkMEID(TelephonyManager telephonyManager) { + // return telephonyManager.getMeid(); + try { + return (String) invokeInstanceMethod(telephonyManager, "getMeid", null); + } catch (Exception e) { + return null; + } + } + + public static String getTelephonyId(TelephonyManager telephonyManager) { + // return telephonyManager.getDeviceId(); + try { + return (String) invokeInstanceMethod(telephonyManager, "getDeviceId", null); + } catch (Exception e) { + return null; + } + } + private static Object getAdvertisingInfoObject(Context context) throws Exception { return invokeStaticMethod("com.google.android.gms.ads.identifier.AdvertisingIdClient", diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java index 0bb32d53c..bbf722ec0 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java @@ -127,6 +127,9 @@ public static Map getPluginKeys(Context context) { public static String getAndroidId(Context context) { return Reflection.getAndroidId(context); } + public static String getMobileEquipmentIdentity(Context context) { + return Reflection.getMobileEquipmentIdentity(context); + } public static T readObject(Context context, String filename, String objectName, Class type) { Closeable closable = null; diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/plugin/MobileEquipmentIdentityUtil.java b/Adjust/adjust/src/main/java/com/adjust/sdk/plugin/MobileEquipmentIdentityUtil.java new file mode 100644 index 000000000..11a0576d1 --- /dev/null +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/plugin/MobileEquipmentIdentityUtil.java @@ -0,0 +1,34 @@ +package com.adjust.sdk.plugin; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.telephony.TelephonyManager; +import android.util.Log; + +import com.adjust.sdk.Reflection; + +/** + * Created by nonelse on 06.11.17. + */ + +public class MobileEquipmentIdentityUtil { + public static String getMobileEquipmentIdentity(Context context) { + TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); + + String mobileEquipmentIdentity = null; + + mobileEquipmentIdentity = Reflection.getLinkIMEI(telephonyManager); + if (mobileEquipmentIdentity != null) { + return mobileEquipmentIdentity; + } + + mobileEquipmentIdentity = Reflection.getLinkMEID(telephonyManager); + if (mobileEquipmentIdentity != null) { + return mobileEquipmentIdentity; + } + + mobileEquipmentIdentity = Reflection.getTelephonyId(telephonyManager); + + return mobileEquipmentIdentity; + } +} From 97167d0f874796bae4a774ebe9ef96e8219f0701 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 7 Nov 2017 11:42:40 +0100 Subject: [PATCH 102/146] Adding raw_referrer to sdk_click --- .../java/com/adjust/sdk/ActivityHandler.java | 2 +- .../src/main/java/com/adjust/sdk/Adjust.java | 2 +- .../java/com/adjust/sdk/AdjustInstance.java | 22 ++++++++-------- .../adjust/sdk/AdjustReferrerReceiver.java | 4 ++- .../java/com/adjust/sdk/IActivityHandler.java | 2 +- .../java/com/adjust/sdk/PackageBuilder.java | 2 ++ .../java/com/adjust/sdk/PackageFactory.java | 2 ++ .../main/java/com/adjust/sdk/Referrer.java | 25 ++++++++++++++++++- .../java/com/adjust/sdk/SdkClickHandler.java | 1 + .../adjust/sdk/SharedPreferencesManager.java | 13 +++++++--- 10 files changed, 57 insertions(+), 18 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 a64e1fac7..5fcd37bd7 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -426,7 +426,7 @@ public void run() { } @Override - public void sendReferrer(final String referrer, final long clickTime) { + public void sendReferrer(final String referrer, final String rawReferrer, final long clickTime) { scheduledExecutor.submit(new Runnable() { @Override public void run() { 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 dd3dbe1fd..66d89ce0f 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java @@ -68,7 +68,7 @@ public static void appWillOpenUrl(Uri url) { public static void setReferrer(String referrer, Context context) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.sendReferrer(referrer, context); + adjustInstance.sendReferrer(referrer, "", context); } public static void setOfflineMode(boolean enabled) { 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 7a82302fd..3bd3d6147 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -138,10 +138,11 @@ public void appWillOpenUrl(final Uri url) { /** * Called to process referrer information sent with INSTALL_REFERRER intent. * - * @param referrer Referrer content - * @param context Application context + * @param referrer Referrer content + * @param rawReferrer Raw referrer content + * @param context Application context */ - public void sendReferrer(final String referrer, final Context context) { + public void sendReferrer(final String referrer, final String rawReferrer, final Context context) { long clickTime = System.currentTimeMillis(); // Check for referrer validity. If invalid, return. @@ -149,11 +150,11 @@ public void sendReferrer(final String referrer, final Context context) { return; } - saveReferrer(clickTime, referrer, context); + saveReferrer(clickTime, referrer, rawReferrer, context); if (checkActivityHandler("referrer")) { if (activityHandler.isEnabled()) { - activityHandler.sendReferrer(referrer, clickTime); + activityHandler.sendReferrer(referrer, rawReferrer, clickTime); } } } @@ -437,13 +438,14 @@ private boolean checkActivityHandler(final String savedForLaunchWarningSuffixMes /** * Save referrer to shared preferences. * - * @param clickTime Referrer click time - * @param content Referrer content - * @param context Application context + * @param clickTime Referrer click time + * @param content Referrer content + * @param rawContent Raw referrer content + * @param context Application context */ - private void saveReferrer(final long clickTime, final String content, final Context context) { + private void saveReferrer(final long clickTime, final String content, final String rawContent, final Context context) { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); - sharedPreferencesManager.saveReferrer(clickTime, content); + sharedPreferencesManager.saveReferrer(clickTime, content, rawContent); } /** diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java index 313640321..f6d39c56f 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java @@ -18,11 +18,13 @@ public class AdjustReferrerReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String rawReferrer = intent.getStringExtra(REFERRER); + if (null == rawReferrer) { return; } String referrer; + try { referrer = URLDecoder.decode(rawReferrer, ENCODING); } catch (UnsupportedEncodingException e) { @@ -30,6 +32,6 @@ public void onReceive(Context context, Intent intent) { } AdjustInstance adjust = Adjust.getDefaultInstance(); - adjust.sendReferrer(referrer, context); + adjust.sendReferrer(referrer, rawReferrer, context); } } 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 a4efd6bb9..dd435b78a 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -33,7 +33,7 @@ public interface IActivityHandler { void launchAttributionResponseTasks(AttributionResponseData attributionResponseData); - void sendReferrer(String referrer, long clickTime); + void sendReferrer(String referrer, String rawReferrer, long clickTime); void setOfflineMode(boolean enabled); 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 e5113493b..4463c0f47 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -33,6 +33,7 @@ class PackageBuilder { AdjustAttribution attribution; String reftag; String referrer; + String rawReferrer; String deeplink; long clickTime; @@ -123,6 +124,7 @@ public ActivityPackage buildClickPackage(String source) { PackageBuilder.addString(parameters, "reftag", reftag); PackageBuilder.addMapJson(parameters, "params", extraParameters); PackageBuilder.addString(parameters, "referrer", referrer); + PackageBuilder.addString(parameters, "raw_referrer", rawReferrer); PackageBuilder.addString(parameters, "deeplink", deeplink); injectAttribution(parameters); diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java index 5909f69e7..b82741dee 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java @@ -15,6 +15,7 @@ public class PackageFactory { private static final String ADJUST_PREFIX = "adjust_"; public static ActivityPackage getSdkClickPackage(final String referrer, + final String rawReferrer, final long clickTime, final ActivityState activityState, final AdjustConfig adjustConfig, @@ -44,6 +45,7 @@ public static ActivityPackage getSdkClickPackage(final String referrer, clickPackageBuilder.referrer = referrer; clickPackageBuilder.clickTime = clickTime; + clickPackageBuilder.rawReferrer = rawReferrer; ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.REFTAG); diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java index 6c87eedad..30a90f17c 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java @@ -11,7 +11,7 @@ public class Referrer { /** * Number of referrer fields. */ - public static final int REFERRER_FIELDS_NUMBER = 3; + public static final int REFERRER_FIELDS_NUMBER = 4; /** * Referrer click time stamp. @@ -23,6 +23,11 @@ public class Referrer { */ private String content; + /** + * Raw referrer content. + */ + private String rawContent; + /** * Flag that indicates whether referrer is currently being sent by SdkClickHandler or not. */ @@ -59,6 +64,15 @@ public String getContent() { return content; } + /** + * Raw referrer content getter. + * + * @return Raw referrer content + */ + public String getRawContent() { + return rawContent; + } + /** * Is referrer being sent flag getter. * @@ -68,6 +82,15 @@ public boolean getIsBeingSent() { return isBeingSent; } + /** + * Set raw referrer content. + * + * @param rawContent Original referrer string passed into SDK from outside world. + */ + public void setRawContent(final String rawContent) { + this.rawContent = rawContent; + } + /** * Set info whether referrer is being sent or not. * 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 caa038746..4ca8a6541 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -140,6 +140,7 @@ public void run() { ActivityPackage sdkClickPackage = PackageFactory.getSdkClickPackage( referrer.getContent(), + referrer.getRawContent(), referrer.getClickTime(), ((ActivityHandler) activityHandlerWeakRef.get()).getActivityState(), ((ActivityHandler) activityHandlerWeakRef.get()).getAdjustConfig(), 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 1123b1b20..33e9c9e67 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -53,14 +53,16 @@ public SharedPreferencesManager(final Context context) { /** * Save referrer information to shared preferences. * - * @param clickTime Referrer click time - * @param content Referrer string + * @param clickTime Referrer click time + * @param content Referrer string + * @param rawContent Raw referrer string */ - public synchronized void saveReferrer(final long clickTime, final String content) { + public synchronized void saveReferrer(final long clickTime, final String content, final String rawContent) { // Check if referrer is null or empty string already done before calling this method. try { ArrayList referrers = getReferrers(); Referrer referrerToSave = new Referrer(clickTime, content); + referrerToSave.setRawContent(rawContent); // If referrer is already contained in shared preferences, skip adding it. if (getReferrerIndex(referrerToSave, referrers) >= 0) { @@ -82,6 +84,7 @@ public synchronized void saveReferrer(final long clickTime, final String content newReferrerEntry.put(0, referrerToSave.getClickTime()); newReferrerEntry.put(1, referrerToSave.getContent()); newReferrerEntry.put(2, referrerToSave.getIsBeingSent()); + newReferrerEntry.put(3, referrerToSave.getRawContent()); updatedReferrers.put(newReferrerEntry); @@ -221,9 +224,11 @@ public synchronized ArrayList getReferrers() { long clickTime = referrerEntry.getLong(0); String content = referrerEntry.getString(1); boolean isBeingSent = referrerEntry.getBoolean(2); + String rawContent = referrerEntry.getString(3); Referrer referrer = new Referrer(clickTime, content); referrer.setIsBeingSent(isBeingSent); + referrer.setRawContent(rawContent); referrersArray.add(referrer); } @@ -264,9 +269,11 @@ public synchronized void scanForSavedReferrers() { long clickTime = referrerEntry.getLong(0); String content = referrerEntry.getString(1); + String rawContent = referrerEntry.getString(3); Referrer referrer = new Referrer(clickTime, content); referrer.setIsBeingSent(false); + referrer.setRawContent(rawContent); referrers.add(referrer); } From df3e0c3979c9d650823fe842e0130b4d191de1f5 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 7 Nov 2017 12:14:14 +0100 Subject: [PATCH 103/146] Add missing raw_content once reading saved referrers --- Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java index 30a90f17c..29a0800d9 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java @@ -114,6 +114,7 @@ public JSONArray asJSONArray() { array.put(clickTime); array.put(content); array.put(isBeingSent); + array.put(rawContent); return array; } From d125bf8c74a66fd8b6661a69556922349f0970e1 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 10 Nov 2017 12:09:39 +0100 Subject: [PATCH 104/146] Referrer handling logic refactoring --- .../java/com/adjust/sdk/ActivityHandler.java | 2 +- .../src/main/java/com/adjust/sdk/Adjust.java | 2 +- .../java/com/adjust/sdk/AdjustInstance.java | 20 +-- .../adjust/sdk/AdjustReferrerReceiver.java | 11 +- .../java/com/adjust/sdk/IActivityHandler.java | 2 +- .../java/com/adjust/sdk/PackageFactory.java | 18 +- .../main/java/com/adjust/sdk/Referrer.java | 166 ++++++++---------- .../java/com/adjust/sdk/SdkClickHandler.java | 3 +- .../adjust/sdk/SharedPreferencesManager.java | 43 ++--- .../adjust/sdk/MockHttpsURLConnection.java | 4 +- 10 files changed, 120 insertions(+), 151 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 5fcd37bd7..5cd10acb5 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -426,7 +426,7 @@ public void run() { } @Override - public void sendReferrer(final String referrer, final String rawReferrer, final long clickTime) { + public void sendReferrer() { scheduledExecutor.submit(new Runnable() { @Override public void run() { 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 66d89ce0f..dd3dbe1fd 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Adjust.java @@ -68,7 +68,7 @@ public static void appWillOpenUrl(Uri url) { public static void setReferrer(String referrer, Context context) { AdjustInstance adjustInstance = Adjust.getDefaultInstance(); - adjustInstance.sendReferrer(referrer, "", context); + adjustInstance.sendReferrer(referrer, context); } public static void setOfflineMode(boolean enabled) { 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 3bd3d6147..cfc582105 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -138,23 +138,22 @@ public void appWillOpenUrl(final Uri url) { /** * Called to process referrer information sent with INSTALL_REFERRER intent. * - * @param referrer Referrer content * @param rawReferrer Raw referrer content * @param context Application context */ - public void sendReferrer(final String referrer, final String rawReferrer, final Context context) { + public void sendReferrer(final String rawReferrer, final Context context) { long clickTime = System.currentTimeMillis(); // Check for referrer validity. If invalid, return. - if (referrer == null || referrer.length() == 0) { + if (rawReferrer == null || rawReferrer.length() == 0) { return; } - saveReferrer(clickTime, referrer, rawReferrer, context); + saveReferrer(clickTime, rawReferrer, context); if (checkActivityHandler("referrer")) { if (activityHandler.isEnabled()) { - activityHandler.sendReferrer(referrer, rawReferrer, clickTime); + activityHandler.sendReferrer(); } } } @@ -438,14 +437,13 @@ private boolean checkActivityHandler(final String savedForLaunchWarningSuffixMes /** * Save referrer to shared preferences. * - * @param clickTime Referrer click time - * @param content Referrer content - * @param rawContent Raw referrer content - * @param context Application context + * @param clickTime Referrer click time + * @param rawReferrer Raw referrer content + * @param context Application context */ - private void saveReferrer(final long clickTime, final String content, final String rawContent, final Context context) { + private void saveReferrer(final long clickTime, final String rawReferrer, final Context context) { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); - sharedPreferencesManager.saveReferrer(clickTime, content, rawContent); + sharedPreferencesManager.saveReferrer(clickTime, rawReferrer); } /** diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java index f6d39c56f..f9b39a96e 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java @@ -23,15 +23,6 @@ public void onReceive(Context context, Intent intent) { return; } - String referrer; - - try { - referrer = URLDecoder.decode(rawReferrer, ENCODING); - } catch (UnsupportedEncodingException e) { - referrer = MALFORMED; - } - - AdjustInstance adjust = Adjust.getDefaultInstance(); - adjust.sendReferrer(referrer, rawReferrer, context); + Adjust.getDefaultInstance().sendReferrer(rawReferrer, context); } } 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 dd435b78a..5afefd6f5 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -33,7 +33,7 @@ public interface IActivityHandler { void launchAttributionResponseTasks(AttributionResponseData attributionResponseData); - void sendReferrer(String referrer, String rawReferrer, long clickTime); + void sendReferrer(); void setOfflineMode(boolean enabled); diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java index b82741dee..fbf1edfec 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java @@ -3,10 +3,15 @@ import android.net.Uri; import android.net.UrlQuerySanitizer; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import static com.adjust.sdk.Constants.ENCODING; +import static com.adjust.sdk.Constants.MALFORMED; + /** * Created by uerceg on 04.08.17. */ @@ -14,17 +19,24 @@ public class PackageFactory { private static final String ADJUST_PREFIX = "adjust_"; - public static ActivityPackage getSdkClickPackage(final String referrer, - final String rawReferrer, + public static ActivityPackage getSdkClickPackage(final String rawReferrer, final long clickTime, final ActivityState activityState, final AdjustConfig adjustConfig, final DeviceInfo deviceInfo, final SessionParameters sessionParameters) { - if (referrer == null || referrer.length() == 0) { + if (rawReferrer == null || rawReferrer.length() == 0) { return null; } + String referrer; + + try { + referrer = URLDecoder.decode(rawReferrer, ENCODING); + } catch (UnsupportedEncodingException e) { + referrer = MALFORMED; + } + AdjustFactory.getLogger().verbose("Referrer to parse (%s)", referrer); UrlQuerySanitizer querySanitizer = new UrlQuerySanitizer(); diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java index 29a0800d9..90affbc77 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java @@ -11,22 +11,17 @@ public class Referrer { /** * Number of referrer fields. */ - public static final int REFERRER_FIELDS_NUMBER = 4; + public static final int REFERRER_FIELDS_NUMBER = 3; /** * Referrer click time stamp. */ private long clickTime; - /** - * Referrer content. - */ - private String content; - /** * Raw referrer content. */ - private String rawContent; + private String rawReferrer; /** * Flag that indicates whether referrer is currently being sent by SdkClickHandler or not. @@ -36,11 +31,11 @@ public class Referrer { /** * Referrer object constructor. * - * @param clickTime Referrer click time - * @param content Referrer content + * @param clickTime Referrer click time + * @param rawReferrer Raw referrer content */ - public Referrer(final long clickTime, final String content) { - this.content = content; + public Referrer(final long clickTime, final String rawReferrer) { + this.rawReferrer = rawReferrer; this.clickTime = clickTime; this.isBeingSent = false; @@ -56,21 +51,12 @@ public long getClickTime() { } /** - * Referrer content getter. - * - * @return Referrer content - */ - public String getContent() { - return content; - } - - /** - * Raw referrer content getter. + * Raw referrer getter. * - * @return Raw referrer content + * @return Raw referrer */ - public String getRawContent() { - return rawContent; + public String getRawReferrer() { + return rawReferrer; } /** @@ -82,15 +68,6 @@ public boolean getIsBeingSent() { return isBeingSent; } - /** - * Set raw referrer content. - * - * @param rawContent Original referrer string passed into SDK from outside world. - */ - public void setRawContent(final String rawContent) { - this.rawContent = rawContent; - } - /** * Set info whether referrer is being sent or not. * @@ -103,7 +80,7 @@ public void setIsBeingSent(final boolean send) { /** * Convert Referrer object to JSON array. * [0] - clickTime - * [1] - content + * [1] - rawReferrer * [2] - isBeingSent * * @return JSONArray object with referrer inside @@ -112,9 +89,8 @@ public JSONArray asJSONArray() { JSONArray array = new JSONArray(); array.put(clickTime); - array.put(content); + array.put(rawReferrer); array.put(isBeingSent); - array.put(rawContent); return array; } @@ -130,7 +106,7 @@ public String asString() { /** * Check if current referrer is equal with given one. - * Equality criteria is equality of: clickTime and content members. + * Equality criteria is equality of: clickTime and referrer members. * * @param referrer Referrer to check equality with * @return boolean indicating whether two referrers are equal @@ -144,68 +120,68 @@ public boolean isEqual(final Referrer referrer) { return false; } - if (!referrer.getContent().equals(content)) { + if (!referrer.getRawReferrer().equals(this.rawReferrer)) { return false; } return true; } - /** - * Get Referrer object from given JSONArray object. - * - * @param array JSONArray to convert to Referrer object - * @return Referrer object made from given JSONArray object - */ - public static Referrer getReferrerFromJSONArray(final JSONArray array) { - if (array != null && array.length() != REFERRER_FIELDS_NUMBER) { - return null; - } - - try { - long clickTime = array.getLong(0); - String content = array.getString(1); - boolean isBeingSent = array.getBoolean(2); - - Referrer referrer = new Referrer(clickTime, content); - referrer.setIsBeingSent(isBeingSent); - - return referrer; - } catch (JSONException e) { - return null; - } - } - - /** - * Get Referrer object from given JSONArray object string. - * - * @param arrayString JSONArray string to convert to Referrer object - * @return Referrer object made from given JSONArray object string - */ - public static Referrer getReferrerFromJSONArrayString(final String arrayString) { - JSONArray array; - - try { - if (arrayString == null) { - return null; - } else { - array = new JSONArray(arrayString); - } - - if (array != null && array.length() != REFERRER_FIELDS_NUMBER) { - return null; - } - - long clickTime = array.getLong(0); - String content = array.getString(1); - boolean isBeingSent = array.getBoolean(2); - - Referrer referrer = new Referrer(clickTime, content); - referrer.setIsBeingSent(isBeingSent); - - return referrer; - } catch (JSONException e) { - return null; - } - } +// /** +// * Get Referrer object from given JSONArray object. +// * +// * @param array JSONArray to convert to Referrer object +// * @return Referrer object made from given JSONArray object +// */ +// public static Referrer getReferrerFromJSONArray(final JSONArray array) { +// if (array != null && array.length() != REFERRER_FIELDS_NUMBER) { +// return null; +// } +// +// try { +// long clickTime = array.getLong(0); +// String content = array.getString(1); +// boolean isBeingSent = array.getBoolean(2); +// +// Referrer referrer = new Referrer(clickTime, content); +// referrer.setIsBeingSent(isBeingSent); +// +// return referrer; +// } catch (JSONException e) { +// return null; +// } +// } +// +// /** +// * Get Referrer object from given JSONArray object string. +// * +// * @param arrayString JSONArray string to convert to Referrer object +// * @return Referrer object made from given JSONArray object string +// */ +// public static Referrer getReferrerFromJSONArrayString(final String arrayString) { +// JSONArray array; +// +// try { +// if (arrayString == null) { +// return null; +// } else { +// array = new JSONArray(arrayString); +// } +// +// if (array != null && array.length() != REFERRER_FIELDS_NUMBER) { +// return null; +// } +// +// long clickTime = array.getLong(0); +// String content = array.getString(1); +// boolean isBeingSent = array.getBoolean(2); +// +// Referrer referrer = new Referrer(clickTime, content); +// referrer.setIsBeingSent(isBeingSent); +// +// return referrer; +// } catch (JSONException e) { +// return null; +// } +// } } 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 4ca8a6541..99eaf0c6b 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -139,8 +139,7 @@ public void run() { } ActivityPackage sdkClickPackage = PackageFactory.getSdkClickPackage( - referrer.getContent(), - referrer.getRawContent(), + referrer.getRawReferrer(), referrer.getClickTime(), ((ActivityHandler) activityHandlerWeakRef.get()).getActivityState(), ((ActivityHandler) activityHandlerWeakRef.get()).getAdjustConfig(), 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 33e9c9e67..2827bc1c1 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -53,16 +53,14 @@ public SharedPreferencesManager(final Context context) { /** * Save referrer information to shared preferences. * - * @param clickTime Referrer click time - * @param content Referrer string - * @param rawContent Raw referrer string + * @param clickTime Referrer click time + * @param rawReferrer Raw referrer string */ - public synchronized void saveReferrer(final long clickTime, final String content, final String rawContent) { + public synchronized void saveReferrer(final long clickTime, final String rawReferrer) { // Check if referrer is null or empty string already done before calling this method. try { ArrayList referrers = getReferrers(); - Referrer referrerToSave = new Referrer(clickTime, content); - referrerToSave.setRawContent(rawContent); + Referrer referrerToSave = new Referrer(clickTime, rawReferrer); // If referrer is already contained in shared preferences, skip adding it. if (getReferrerIndex(referrerToSave, referrers) >= 0) { @@ -82,9 +80,8 @@ public synchronized void saveReferrer(final long clickTime, final String content JSONArray newReferrerEntry = new JSONArray(); newReferrerEntry.put(0, referrerToSave.getClickTime()); - newReferrerEntry.put(1, referrerToSave.getContent()); + newReferrerEntry.put(1, referrerToSave.getRawReferrer()); newReferrerEntry.put(2, referrerToSave.getIsBeingSent()); - newReferrerEntry.put(3, referrerToSave.getRawContent()); updatedReferrers.put(newReferrerEntry); @@ -97,16 +94,16 @@ public synchronized void saveReferrer(final long clickTime, final String content /** * Remove referrer information from shared preferences. * - * @param clickTime Referrer click time - * @param content Referrer string + * @param clickTime Referrer click time + * @param rawReferrer Referrer string */ - public synchronized void removeReferrer(final long clickTime, final String content) { + public synchronized void removeReferrer(final long clickTime, final String rawReferrer) { // Don't even try to remove null or empty referrers since they shouldn't exist in shared preferences. - if (content == null || content.length() == 0) { + if (rawReferrer == null || rawReferrer.length() == 0) { return; } - Referrer referrerToCheck = new Referrer(clickTime, content); + Referrer referrerToCheck = new Referrer(clickTime, rawReferrer); // Try to locate position in queue of the referrer that should be deleted. ArrayList referrers = getReferrers(); @@ -135,14 +132,14 @@ public synchronized void removeReferrer(final long clickTime, final String conte /** * Check if give referrer is saved in shared preferences. * - * @param clickTime Referrer click time - * @param content Referrer string + * @param clickTime Referrer click time + * @param rawReferrer Referrer string * @return boolean indicating whether given referrer exist in shared preferences or not. * In case of exception, return false. */ - public synchronized boolean doesReferrerExist(final String content, final long clickTime) { + public synchronized boolean doesReferrerExist(final String rawReferrer, final long clickTime) { ArrayList referrers = getReferrers(); - Referrer referrerToCheck = new Referrer(clickTime, content); + Referrer referrerToCheck = new Referrer(clickTime, rawReferrer); if (referrers == null) { return false; @@ -222,13 +219,11 @@ public synchronized ArrayList getReferrers() { } long clickTime = referrerEntry.getLong(0); - String content = referrerEntry.getString(1); + String rawContent = referrerEntry.getString(1); boolean isBeingSent = referrerEntry.getBoolean(2); - String rawContent = referrerEntry.getString(3); - Referrer referrer = new Referrer(clickTime, content); + Referrer referrer = new Referrer(clickTime, rawContent); referrer.setIsBeingSent(isBeingSent); - referrer.setRawContent(rawContent); referrersArray.add(referrer); } @@ -268,12 +263,10 @@ public synchronized void scanForSavedReferrers() { } long clickTime = referrerEntry.getLong(0); - String content = referrerEntry.getString(1); - String rawContent = referrerEntry.getString(3); + String rawContent = referrerEntry.getString(1); - Referrer referrer = new Referrer(clickTime, content); + Referrer referrer = new Referrer(clickTime, rawContent); referrer.setIsBeingSent(false); - referrer.setRawContent(rawContent); referrers.add(referrer); } diff --git a/Adjust/test/src/androidTest/java/com/adjust/sdk/MockHttpsURLConnection.java b/Adjust/test/src/androidTest/java/com/adjust/sdk/MockHttpsURLConnection.java index 8d6910692..bcd512adc 100644 --- a/Adjust/test/src/androidTest/java/com/adjust/sdk/MockHttpsURLConnection.java +++ b/Adjust/test/src/androidTest/java/com/adjust/sdk/MockHttpsURLConnection.java @@ -176,12 +176,12 @@ public boolean getAllowUserInteraction() { } public Object getContent() throws IOException { - testLogger.test(prefix + "getContent"); + testLogger.test(prefix + "getReferrer"); return null; } public Object getContent(Class[] types) throws IOException { - testLogger.test(prefix + "getContent, types " + types); + testLogger.test(prefix + "getReferrer, types " + types); return null; } From d70dcb725720014baeefb8daddcc9c43963279d3 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 15 Nov 2017 14:35:25 +0100 Subject: [PATCH 105/146] Check rawReferrer in click handler sharedPref --- .../src/main/java/com/adjust/sdk/SdkClickHandler.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 99eaf0c6b..de1056ce0 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -244,7 +244,8 @@ public void run() { * @param sdkClickPackage sdk_click package to be sent. */ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { - boolean isReferrer = sdkClickPackage.getParameters().get("referrer") != null; + String rawReferrer = sdkClickPackage.getParameters().get("raw_referrer"); + boolean isReferrer = rawReferrer != null; ActivityHandler activityHandler = (ActivityHandler) activityHandlerWeakRef.get(); if (isReferrer) { @@ -253,7 +254,7 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { = new SharedPreferencesManager(activityHandler.getContext()); if (!sharedPreferencesManager.doesReferrerExist( - sdkClickPackage.getParameters().get("referrer"), + rawReferrer, sdkClickPackage.getClickTime())) { return; } @@ -283,7 +284,7 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { sharedPreferencesManager.removeReferrer( sdkClickPackage.getClickTime(), - sdkClickPackage.getParameters().get("referrer")); + rawReferrer); } activityHandler.finishedTrackingActivity(responseData); From 4130ce849a941a138a5b1c8eec83c5408e5bec0a Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 15 Nov 2017 15:37:15 +0100 Subject: [PATCH 106/146] Remove reading of session parameters --- .../java/com/adjust/sdk/ActivityHandler.java | 22 +------------------ .../java/com/adjust/sdk/ActivityPackage.java | 13 ----------- .../main/java/com/adjust/sdk/Constants.java | 2 -- .../java/com/adjust/sdk/PackageBuilder.java | 1 - 4 files changed, 1 insertion(+), 37 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 5cd10acb5..f85bbc501 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -33,7 +33,6 @@ import static com.adjust.sdk.Constants.ACTIVITY_STATE_FILENAME; import static com.adjust.sdk.Constants.ATTRIBUTION_FILENAME; import static com.adjust.sdk.Constants.SESSION_CALLBACK_PARAMETERS_FILENAME; -import static com.adjust.sdk.Constants.SESSION_PARAMETERS_FILENAME; import static com.adjust.sdk.Constants.SESSION_PARTNER_PARAMETERS_FILENAME; public class ActivityHandler implements IActivityHandler { @@ -628,7 +627,7 @@ private void initI() { readAttributionI(adjustConfig.context); readActivityStateI(adjustConfig.context); - readSessionParametersI(adjustConfig.context); + sessionParameters = new SessionParameters(); readSessionCallbackParametersI(adjustConfig.context); readSessionPartnerParametersI(adjustConfig.context); @@ -1366,9 +1365,6 @@ public static boolean deleteSessionCallbackParameters(Context context) { public static boolean deleteSessionPartnerParameters(Context context) { return context.deleteFile(SESSION_PARTNER_PARAMETERS_FILENAME); } - public static boolean deleteSessionParameters(Context context) { - return context.deleteFile(SESSION_PARAMETERS_FILENAME); - } private void transferSessionPackageI(long now) { PackageBuilder builder = new PackageBuilder(adjustConfig, deviceInfo, activityState, @@ -1669,21 +1665,6 @@ private void readAttributionI(Context context) { } } - private void readSessionParametersI(Context context) { - try { - sessionParameters = Util.readObject(context, - SESSION_PARAMETERS_FILENAME, - SESSION_PARAMETERS_NAME, - SessionParameters.class); - } catch (Exception e) { - logger.error("Failed to read %s file (%s)", SESSION_PARAMETERS_NAME, e.getMessage()); - } - - if (sessionParameters == null) { - sessionParameters = new SessionParameters(); - } - } - private void readSessionCallbackParametersI(Context context) { try { sessionParameters.callbackParameters = Util.readObject(context, @@ -1776,7 +1757,6 @@ private void teardownAllSessionParametersS(boolean toDelete) { if (toDelete && adjustConfig != null && adjustConfig.context != null) { deleteSessionCallbackParameters(adjustConfig.context); deleteSessionPartnerParameters(adjustConfig.context); - deleteSessionParameters(adjustConfig.context); } sessionParameters = null; } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java index 483ef5c68..5bfb4ec9d 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java @@ -32,7 +32,6 @@ public class ActivityPackage implements Serializable { new ObjectStreamField("suffix", String.class), new ObjectStreamField("callbackParameters", (Class>)(Class)Map.class), new ObjectStreamField("partnerParameters", (Class>)(Class)Map.class), - new ObjectStreamField("sessionParameters", SessionParameters.class), }; private transient int hashCode; @@ -49,7 +48,6 @@ public class ActivityPackage implements Serializable { // delay private Map callbackParameters; private Map partnerParameters; - private SessionParameters sessionParameters; private int retries; private long clickTime; @@ -86,10 +84,6 @@ public void setPartnerParameters(Map partnerParameters) { this.partnerParameters = partnerParameters; } - public void setSessionParameters(SessionParameters sessionParameters) { - this.sessionParameters = sessionParameters; - } - public ActivityKind getActivityKind() { return activityKind; } @@ -126,10 +120,6 @@ public Map getPartnerParameters() { return partnerParameters; } - public SessionParameters getSessionParameters() { - return sessionParameters; - } - public ActivityPackage(ActivityKind activityKind) { this.activityKind = activityKind; } @@ -176,7 +166,6 @@ private void readObject(ObjectInputStream stream) throws ClassNotFoundException, suffix = Util.readStringField(fields, "suffix", null); callbackParameters = Util.readObjectField(fields, "callbackParameters", null); partnerParameters = Util.readObjectField(fields, "partnerParameters", null); - sessionParameters = Util.readObjectField(fields, "sessionParameters", null); } @Override @@ -193,7 +182,6 @@ public boolean equals(Object other) { if (!Util.equalString(suffix, otherActivityPackage.suffix)) return false; if (!Util.equalObject(callbackParameters, otherActivityPackage.callbackParameters)) return false; if (!Util.equalObject(partnerParameters, otherActivityPackage.partnerParameters)) return false; - if (!Util.equalObject(sessionParameters, otherActivityPackage.sessionParameters)) return false; return true; } @@ -208,7 +196,6 @@ public int hashCode() { hashCode = 37 * hashCode + Util.hashString(suffix); hashCode = 37 * hashCode + Util.hashObject(callbackParameters); hashCode = 37 * hashCode + Util.hashObject(partnerParameters); - hashCode = 37 * hashCode + Util.hashObject(sessionParameters); } return hashCode; } 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 113e58d56..411e670e9 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java @@ -40,8 +40,6 @@ public interface Constants { String ATTRIBUTION_FILENAME = "AdjustAttribution"; String SESSION_CALLBACK_PARAMETERS_FILENAME = "AdjustSessionCallbackParameters"; String SESSION_PARTNER_PARAMETERS_FILENAME = "AdjustSessionPartnerParameters"; - String SESSION_PARAMETERS_FILENAME = "AdjustSessionParameters"; - String MALFORMED = "malformed"; String SMALL = "small"; 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 4463c0f47..add72bc19 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -110,7 +110,6 @@ public ActivityPackage buildEventPackage(AdjustEvent event, if (isInDelay) { eventPackage.setCallbackParameters(event.callbackParameters); eventPackage.setPartnerParameters(event.partnerParameters); - eventPackage.setSessionParameters(this.sessionParameters); } return eventPackage; From 2cd0cdda1c10bc5488ccf0470819de6e015560a6 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 15 Nov 2017 16:05:37 +0100 Subject: [PATCH 107/146] Remove referrer unused functions --- .../main/java/com/adjust/sdk/Referrer.java | 58 ------------------- 1 file changed, 58 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java index 90affbc77..f7a19ef88 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java @@ -126,62 +126,4 @@ public boolean isEqual(final Referrer referrer) { return true; } - -// /** -// * Get Referrer object from given JSONArray object. -// * -// * @param array JSONArray to convert to Referrer object -// * @return Referrer object made from given JSONArray object -// */ -// public static Referrer getReferrerFromJSONArray(final JSONArray array) { -// if (array != null && array.length() != REFERRER_FIELDS_NUMBER) { -// return null; -// } -// -// try { -// long clickTime = array.getLong(0); -// String content = array.getString(1); -// boolean isBeingSent = array.getBoolean(2); -// -// Referrer referrer = new Referrer(clickTime, content); -// referrer.setIsBeingSent(isBeingSent); -// -// return referrer; -// } catch (JSONException e) { -// return null; -// } -// } -// -// /** -// * Get Referrer object from given JSONArray object string. -// * -// * @param arrayString JSONArray string to convert to Referrer object -// * @return Referrer object made from given JSONArray object string -// */ -// public static Referrer getReferrerFromJSONArrayString(final String arrayString) { -// JSONArray array; -// -// try { -// if (arrayString == null) { -// return null; -// } else { -// array = new JSONArray(arrayString); -// } -// -// if (array != null && array.length() != REFERRER_FIELDS_NUMBER) { -// return null; -// } -// -// long clickTime = array.getLong(0); -// String content = array.getString(1); -// boolean isBeingSent = array.getBoolean(2); -// -// Referrer referrer = new Referrer(clickTime, content); -// referrer.setIsBeingSent(isBeingSent); -// -// return referrer; -// } catch (JSONException e) { -// return null; -// } -// } } From b7264f00dc8078ae27bf59b7f5fcdcb5160ffb11 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 15 Nov 2017 16:10:38 +0100 Subject: [PATCH 108/146] Update changelog --- CHANGELOG.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6f4e5950..0f4e6896d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,12 @@ -### Version 4.12.0 (Xth July 2017) +### Version 4.12.0 (Xth November 2017) #### Added - Don't send `sdk_click` and `sdk_info` packages when disabled - Set external device id +- Get amazon ad id +- Allow to read mobile equipment identity for non-google play store apps +- Use of secret in authorization header +- Sending referrer without previously decoded +- Send mcc, mnc, network and connectivity type #### Changed - Setting enable/disable or offline/online is now queued @@ -9,6 +14,8 @@ - Disable before starting the sdk does not create and send first session package - Reload reading device ids for every package, not just at beginning - Save referrer in local storage and send it only after first session +- Save push token in local storage and send it only after first session +- Log message for saved actions to be done when the sdk starts --- ### Version 4.11.4 (5th May 2017) From 9e863f294e5bc8b8bfda6bcc23ecd259304d23d1 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 15 Nov 2017 16:29:36 +0100 Subject: [PATCH 109/146] Update changelog --- CHANGELOG.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f4e6896d..7021b373b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,14 +1,13 @@ ### Version 4.12.0 (Xth November 2017) #### Added -- Don't send `sdk_click` and `sdk_info` packages when disabled -- Set external device id -- Get amazon ad id +- Get amazon/fire ad id - Allow to read mobile equipment identity for non-google play store apps - Use of secret in authorization header -- Sending referrer without previously decoded +- Sending referrer without previously being decoded - Send mcc, mnc, network and connectivity type #### Changed +- Don't send `sdk_click` and `sdk_info` packages when disabled - Setting enable/disable or offline/online is now queued - Guarantee that first package is send even with buffering - Disable before starting the sdk does not create and send first session package From 11f1fdf4a11b105896f2fbd4ae90455f3749228f Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 23 Nov 2017 20:38:44 +0100 Subject: [PATCH 110/146] Rename sdk click factory methods --- .../java/com/adjust/sdk/ActivityHandler.java | 2 +- .../java/com/adjust/sdk/PackageFactory.java | 24 +++++++++---------- .../java/com/adjust/sdk/SdkClickHandler.java | 2 +- 3 files changed, 14 insertions(+), 14 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 f85bbc501..a776957d0 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1276,7 +1276,7 @@ private void readOpenUrlI(Uri url, long clickTime) { return; } - ActivityPackage sdkClickPackage = PackageFactory.getSdkClickPackage( + ActivityPackage sdkClickPackage = PackageFactory.buildDeeplinkSdkClickPackage( url, clickTime, activityState, diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java index fbf1edfec..25c998b35 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java @@ -19,12 +19,12 @@ public class PackageFactory { private static final String ADJUST_PREFIX = "adjust_"; - public static ActivityPackage getSdkClickPackage(final String rawReferrer, - final long clickTime, - final ActivityState activityState, - final AdjustConfig adjustConfig, - final DeviceInfo deviceInfo, - final SessionParameters sessionParameters) { + public static ActivityPackage buildReftagSdkClickPackage(final String rawReferrer, + final long clickTime, + final ActivityState activityState, + final AdjustConfig adjustConfig, + final DeviceInfo deviceInfo, + final SessionParameters sessionParameters) { if (rawReferrer == null || rawReferrer.length() == 0) { return null; } @@ -64,12 +64,12 @@ public static ActivityPackage getSdkClickPackage(final String rawReferrer, return clickPackage; } - public static ActivityPackage getSdkClickPackage(final Uri url, - final long clickTime, - final ActivityState activityState, - final AdjustConfig adjustConfig, - final DeviceInfo deviceInfo, - final SessionParameters sessionParameters) { + public static ActivityPackage buildDeeplinkSdkClickPackage(final Uri url, + final long clickTime, + final ActivityState activityState, + final AdjustConfig adjustConfig, + final DeviceInfo deviceInfo, + final SessionParameters sessionParameters) { if (url == null) { return null; } 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 de1056ce0..50a203aa6 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -138,7 +138,7 @@ public void run() { continue; } - ActivityPackage sdkClickPackage = PackageFactory.getSdkClickPackage( + ActivityPackage sdkClickPackage = PackageFactory.buildReftagSdkClickPackage( referrer.getRawReferrer(), referrer.getClickTime(), ((ActivityHandler) activityHandlerWeakRef.get()).getActivityState(), From 11ec48686ea70080e24067bf5679310f7205306c Mon Sep 17 00:00:00 2001 From: nonelse Date: Thu, 23 Nov 2017 20:42:54 +0100 Subject: [PATCH 111/146] Add activity handler helper methods to the interface --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 4 ++++ .../main/java/com/adjust/sdk/IActivityHandler.java | 9 +++++++++ .../src/main/java/com/adjust/sdk/SdkClickHandler.java | 11 ++++++----- 3 files changed, 19 insertions(+), 5 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 a776957d0..0362024fb 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -214,18 +214,22 @@ public void run() { }); } + @Override public AdjustConfig getAdjustConfig() { return adjustConfig; } + @Override public DeviceInfo getDeviceInfo() { return deviceInfo; } + @Override public ActivityState getActivityState() { return activityState; } + @Override public SessionParameters getSessionParameters() { return sessionParameters; } 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 5afefd6f5..faeed6205 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -62,4 +62,13 @@ public interface IActivityHandler { String getAdid(); AdjustAttribution getAttribution(); + + AdjustConfig getAdjustConfig(); + + DeviceInfo getDeviceInfo(); + + ActivityState getActivityState(); + + SessionParameters getSessionParameters(); + } 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 50a203aa6..c4b7d136f 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -126,8 +126,9 @@ public void sendSavedReferrers() { scheduledExecutor.submit(new Runnable() { @Override public void run() { + IActivityHandler activityHandler = activityHandlerWeakRef.get(); SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager( - ((ActivityHandler) activityHandlerWeakRef.get()).getAdjustConfig().context); + activityHandler.getContext()); ArrayList referrers = sharedPreferencesManager.getReferrers(); for (int i = 0; i < referrers.size(); i += 1) { @@ -141,10 +142,10 @@ public void run() { ActivityPackage sdkClickPackage = PackageFactory.buildReftagSdkClickPackage( referrer.getRawReferrer(), referrer.getClickTime(), - ((ActivityHandler) activityHandlerWeakRef.get()).getActivityState(), - ((ActivityHandler) activityHandlerWeakRef.get()).getAdjustConfig(), - ((ActivityHandler) activityHandlerWeakRef.get()).getDeviceInfo(), - ((ActivityHandler) activityHandlerWeakRef.get()).getSessionParameters()); + activityHandler.getActivityState(), + activityHandler.getAdjustConfig(), + activityHandler.getDeviceInfo(), + activityHandler.getSessionParameters()); if (sdkClickPackage == null) { return; From 6a766b476ff663b16000d45d10872f7836a2acb0 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 24 Nov 2017 13:50:37 +0100 Subject: [PATCH 112/146] Add install referrer service --- .../java/com/adjust/sdk/ActivityHandler.java | 9 +- .../java/com/adjust/sdk/ActivityPackage.java | 28 +- .../adjust/sdk/AdjustReferrerReceiver.java | 4 - .../main/java/com/adjust/sdk/Constants.java | 3 + .../java/com/adjust/sdk/InstallReferrer.java | 294 ++++++++++++++++++ .../java/com/adjust/sdk/PackageBuilder.java | 36 ++- .../java/com/adjust/sdk/PackageFactory.java | 37 ++- .../java/com/adjust/sdk/SdkClickHandler.java | 92 +++++- .../adjust/sdk/SharedPreferencesManager.java | 71 +++++ .../src/main/java/com/adjust/sdk/Util.java | 1 - 10 files changed, 547 insertions(+), 28 deletions(-) create mode 100644 Adjust/adjust/src/main/java/com/adjust/sdk/InstallReferrer.java 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 0362024fb..241985287 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -12,19 +12,13 @@ import android.app.ActivityManager; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; -import android.net.UrlQuerySanitizer; import android.os.Handler; -import org.json.JSONArray; -import org.json.JSONException; - import java.io.InputStream; import java.util.ArrayList; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -66,6 +60,7 @@ public class ActivityHandler implements IActivityHandler { private IAttributionHandler attributionHandler; private ISdkClickHandler sdkClickHandler; private SessionParameters sessionParameters; + private InstallReferrer installReferrer; @Override public void teardown(boolean deleteState) { @@ -749,6 +744,8 @@ public void run() { preLaunchActionsI(adjustConfig.preLaunchActionsArray); + installReferrer = new InstallReferrer(adjustConfig.context, this); + sendReferrerI(); } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java index 5bfb4ec9d..e0a9eb2a1 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityPackage.java @@ -50,7 +50,9 @@ public class ActivityPackage implements Serializable { private Map partnerParameters; private int retries; - private long clickTime; + private long clickTimeInMilliseconds; + private long clickTimeInSeconds; + private long installBeginTimeInSeconds; public String getPath() { return path; @@ -104,12 +106,28 @@ public int increaseRetries() { return retries; } - public long getClickTime() { - return this.clickTime; + public long getClickTimeInMilliseconds() { + return this.clickTimeInMilliseconds; } - public void setClickTime(long clickTime) { - this.clickTime = clickTime; + public void setClickTimeInMilliseconds(long clickTimeInMilliseconds) { + this.clickTimeInMilliseconds = clickTimeInMilliseconds; + } + + public long getClickTimeInSeconds() { + return this.clickTimeInSeconds; + } + + public void setClickTimeInSeconds(long clickTimeInSeconds) { + this.clickTimeInSeconds = clickTimeInSeconds; + } + + public long getInstallBeginTimeInSeconds() { + return this.installBeginTimeInSeconds; + } + + public void setInstallBeginTimeInSeconds(long installBeginTimeInSeconds) { + this.installBeginTimeInSeconds = installBeginTimeInSeconds; } public Map getCallbackParameters() { diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java index f9b39a96e..c2d4aa1ec 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java @@ -4,11 +4,7 @@ import android.content.Context; import android.content.Intent; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import static com.adjust.sdk.Constants.ENCODING; -import static com.adjust.sdk.Constants.MALFORMED; import static com.adjust.sdk.Constants.REFERRER; // support multiple BroadcastReceivers for the INSTALL_REFERRER: 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 411e670e9..5126f2321 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java @@ -33,6 +33,7 @@ public interface Constants { String LOGTAG = "Adjust"; String REFTAG = "reftag"; String DEEPLINK = "deeplink"; + String INSTALL_REFERRER = "install_referrer"; String PUSH = "push"; String THREAD_PREFIX = "Adjust-"; @@ -60,6 +61,8 @@ public interface Constants { String CALLBACK_PARAMETERS = "callback_params"; String PARTNER_PARAMETERS = "partner_params"; + int MAX_INSTALL_REFERRER_RETRIES = 2; + // List of known plugins, possibly not active List PLUGINS = Arrays.asList(); } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/InstallReferrer.java b/Adjust/adjust/src/main/java/com/adjust/sdk/InstallReferrer.java new file mode 100644 index 000000000..b1b875cfb --- /dev/null +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/InstallReferrer.java @@ -0,0 +1,294 @@ +package com.adjust.sdk; + +import android.content.Context; + +import java.lang.ref.WeakReference; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +import static com.adjust.sdk.Constants.ONE_SECOND; + +/** + * Created by nonelse on 21.11.17. + */ + +public class InstallReferrer implements InvocationHandler { + public static final String packageBaseName = "com.android.installreferrer."; + /** Play Store service is not connected now - potentially transient state */ + private static final int SERVICE_DISCONNECTED = -1; + /** Success. */ + private static final int OK = 0; + /** Could not initiate connection to the Install Referrer service. */ + private static final int SERVICE_UNAVAILABLE = 1; + /** Install Referrer API not supported by the installed Play Store app. */ + private static final int FEATURE_NOT_SUPPORTED = 2; + /** General errors caused by incorrect usage */ + private static final int DEVELOPER_ERROR = 3; + + private ILogger logger; + private Object referrerClient; + private int retries; + private Context context; + private Object flagLock; + private boolean hasInstallReferrerBeenRead; + private TimerOnce retryTimer; + private WeakReference activityHandlerWeakRef; + + private int RETRY_WAIT_TIME = ONE_SECOND * 3; + + public InstallReferrer(Context context, IActivityHandler activityHandler) { + this.logger = AdjustFactory.getLogger(); + this.context = context; + this.flagLock = new Object(); + this.hasInstallReferrerBeenRead = false; + this.retries = 0; + this.retryTimer = new TimerOnce(new Runnable() { + @Override + public void run() { + startConnection(); + } + }, "InstallReferrer"); + activityHandlerWeakRef = new WeakReference(activityHandler); + + startConnection(); + } + + public void startConnection () { + closeReferrerClient(); + + synchronized (flagLock) { + if (hasInstallReferrerBeenRead) { + logger.debug("Install referrer has already been read"); + return; + } + } + + this.referrerClient = createInstallReferrerClient(context); + + Class listenerClass = getInstallReferrerStateListenerClass(); + + Object listenerProxy = createProxyInstallReferrerStateListener(listenerClass); + + try { + Reflection.invokeInstanceMethod(this.referrerClient, "startConnection", + new Class[] {listenerClass}, listenerProxy); + } catch (Exception e) { + logger.error("startConnection error (%s)", e.getMessage()); + } + } + + public Object createInstallReferrerClient(Context context) { + try { + Object builder = Reflection.invokeStaticMethod(packageBaseName + "api.InstallReferrerClient", + "newBuilder", + new Class[]{Context.class}, context); + return Reflection.invokeInstanceMethod(builder, "build", null); + } catch (Exception e) { + logger.warn("Couldn't create instance of referrer client (%s)", e.getMessage()); + } + return null; + } + + public Object createProxyInstallReferrerStateListener(Class installReferrerStateListenerClass) { + if (installReferrerStateListenerClass == null) { + return null; + } + return Proxy.newProxyInstance( + installReferrerStateListenerClass.getClassLoader(), + new Class[]{ installReferrerStateListenerClass }, + this + ); + } + + public Class getInstallReferrerStateListenerClass() { + try{ + return Class.forName(packageBaseName + "api.InstallReferrerStateListener"); + } catch (Exception e) { + logger.error("getInstallReferrerStateListenerClass error (%s)", e.getMessage()); + } + return null; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + try { + String methodName = method.getName(); + // Prints the method being invoked + logger.debug("InstallReferrer invoke method name: %s", methodName); + for (Object arg : args) { + logger.debug("InstallReferrer invoke arg: %s", arg); + } + + // if the method name equals some method's name then call your method + if (methodName.equals("onInstallReferrerSetupFinished")) { + onInstallReferrerSetupFinishedObject(args[0]); + } else if (methodName.equals("onInstallReferrerServiceDisconnected")) { + onInstallReferrerServiceDisconnected(); + } + } catch (Exception e) { + logger.error("InstallReferrer invoke error (%s)", e.getMessage()); + } + return null; + } + + public void onInstallReferrerSetupFinishedObject(Object responseCodeObj) { + logger.debug("InstallReferrer onInstallReferrerSetupFinished"); + try { + logger.debug("onInstallReferrerSetupFinishedObject arg class name: %s", responseCodeObj.getClass().getName()); + logger.debug("onInstallReferrerSetupFinishedObject arg toString: %s", responseCodeObj.toString()); + onInstallReferrerSetupFinishedInt((Integer)responseCodeObj); + } catch (Exception e) { + logger.error("onInstallReferrerSetupFinished error (%s)", e.getMessage()); + } + } + + public void onInstallReferrerSetupFinishedInt(final int responseCode) { + switch (responseCode) { + case OK: + // Connection established + try { + // extract referrer + Object referrerDetails = getInstallReferrer(); + String stringInstallReferrer = getStringInstallReferrer(referrerDetails); + long clickTime = getReferrerClickTimestampSeconds(referrerDetails); + long installBeginTime = getInstallBeginTimestampSeconds(referrerDetails); + logger.debug("installReferrer: %s, clickTime: %d, installBeginTime: %d", + stringInstallReferrer, clickTime, installBeginTime); + // save referrer + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); + sharedPreferencesManager.saveInstallReferrer(stringInstallReferrer, clickTime, installBeginTime); + // send referrer + IActivityHandler activityHandler = activityHandlerWeakRef.get(); + if (activityHandler != null) { + activityHandler.sendReferrer(); + } + } catch (Exception e) { + logger.debug("Couldn't get install referrer from client (%s). Retrying", e.getMessage()); + retry(); + } + break; + case FEATURE_NOT_SUPPORTED: + // API not available on the current Play Store app + logger.debug("Install referrer not available on the current Play Store app"); + break; + case SERVICE_UNAVAILABLE: + // Connection could not be established + logger.debug("Could not initiate connection to the Install Referrer service. Retrying"); + retry(); + break; + case DEVELOPER_ERROR: + logger.debug("Install referrer general errors caused by incorrect usage. Retrying"); + retry(); + break; + case SERVICE_DISCONNECTED: + // Play Store service is not connected now - potentially transient state + logger.debug("Play Store service is not connected now. Retrying"); + retry(); + break; + default: + logger.debug("Unexpected response code of install referrer response: %d", responseCode); + break; + } + closeReferrerClient(); + } + + private Object getInstallReferrer() { + if (this.referrerClient == null) { + return null; + } + try { + return Reflection.invokeInstanceMethod( + this.referrerClient, "getInstallReferrer", null); + } catch (Exception e) { + logger.error("getInstallReferrer error (%s)", e.getMessage()); + } + return null; + } + + private String getStringInstallReferrer(Object referrerDetails) { + if (referrerDetails == null) { + return null; + } + try { + String stringInstallReferrer = (String)Reflection.invokeInstanceMethod( + referrerDetails, "getInstallReferrer", null); + return stringInstallReferrer; + } catch (Exception e) { + logger.error("getStringInstallReferrer error (%s)", e.getMessage()); + } + return null; + } + + private long getReferrerClickTimestampSeconds(Object referrerDetails) { + if (referrerDetails == null) { + return -1; + } + try { + Long clickTime = (Long)Reflection.invokeInstanceMethod( + referrerDetails, "getReferrerClickTimestampSeconds", null); + return clickTime; + } catch (Exception e) { + logger.error("getReferrerClickTimestampSeconds error (%s)", e.getMessage()); + } + return -1; + } + + private long getInstallBeginTimestampSeconds(Object referrerDetails) { + if (referrerDetails == null) { + return -1; + } + try { + Long installBeginTime = (Long)Reflection.invokeInstanceMethod( + referrerDetails, "getInstallBeginTimestampSeconds", null); + return installBeginTime; + } catch (Exception e) { + logger.error("getInstallBeginTimestampSeconds error (%s)", e.getMessage()); + } + return -1; + } + + private void saveInstallReferrer(String installReferrer, long clickTime, long installBeginTime, Context context) { + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); + sharedPreferencesManager.saveInstallReferrer(installReferrer, clickTime, installBeginTime); + } + + public void onInstallReferrerServiceDisconnected() { + logger.debug("InstallReferrer onInstallReferrerServiceDisconnected"); + } + + private void retry() { + synchronized (flagLock) { + if (hasInstallReferrerBeenRead) { + logger.debug("Install referrer has already been read"); + return; + } + } + // increase retry counter + retries++; + if (retries > Constants.MAX_INSTALL_REFERRER_RETRIES) { + logger.debug("Limit number of retry for install referrer surpassed"); + return; + } + + long firingIn = retryTimer.getFireIn(); + if (firingIn > 0) { + logger.debug("Already waiting to retry to read install referrer in %d milliseconds", firingIn); + return; + } + retryTimer.startIn(RETRY_WAIT_TIME); + } + + private void closeReferrerClient() { + if (referrerClient == null) { + return; + } + + try { + Reflection.invokeInstanceMethod(referrerClient, "endConnection", null); + } catch (Exception e) { + logger.error("closeReferrerClient error (%s)", e.getMessage()); + } + referrerClient = null; + } +} 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 add72bc19..3ac2be7bd 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -14,6 +14,7 @@ import org.json.JSONObject; +import java.util.Date; import java.util.HashMap; import java.util.Locale; import java.util.Map; @@ -35,7 +36,10 @@ class PackageBuilder { String referrer; String rawReferrer; String deeplink; - long clickTime; + long clickTimeInMilliseconds = -1; + + long clicktTimeInSeconds = -1; + long installBeginTimeInSeconds = -1; private static ILogger logger = AdjustFactory.getLogger(); @@ -119,18 +123,22 @@ public ActivityPackage buildClickPackage(String source) { Map parameters = getAttributableParameters(false); PackageBuilder.addString(parameters, "source", source); - PackageBuilder.addDate(parameters, "click_time", clickTime); + PackageBuilder.addDateInMilliseconds(parameters, "click_time", clickTimeInMilliseconds); PackageBuilder.addString(parameters, "reftag", reftag); PackageBuilder.addMapJson(parameters, "params", extraParameters); PackageBuilder.addString(parameters, "referrer", referrer); PackageBuilder.addString(parameters, "raw_referrer", rawReferrer); PackageBuilder.addString(parameters, "deeplink", deeplink); + PackageBuilder.addDateInSeconds(parameters, "click_time", clicktTimeInSeconds); + PackageBuilder.addDateInSeconds(parameters, "install_begin_time", installBeginTimeInSeconds); injectAttribution(parameters); ActivityPackage clickPackage = getDefaultActivityPackage(ActivityKind.CLICK); clickPackage.setPath("/sdk_click"); clickPackage.setSuffix(""); - clickPackage.setClickTime(clickTime); + clickPackage.setClickTimeInMilliseconds(clickTimeInMilliseconds); + clickPackage.setClickTimeInSeconds(clicktTimeInSeconds); + clickPackage.setInstallBeginTimeInSeconds(installBeginTimeInSeconds); clickPackage.setParameters(parameters); return clickPackage; @@ -279,7 +287,7 @@ private void injectActivityState(Map parameters) { } private void injectCommonParameters(Map parameters) { - PackageBuilder.addDate(parameters, "created_at", createdAt); + PackageBuilder.addDateInMilliseconds(parameters, "created_at", createdAt); PackageBuilder.addBoolean(parameters, "attribution_deeplink", true); PackageBuilder.addBoolean(parameters, "needs_response_details", true); } @@ -338,11 +346,29 @@ public static void addLong(Map parameters, String key, long valu PackageBuilder.addString(parameters, key, valueString); } - public static void addDate(Map parameters, String key, long value) { + public static void addDateInMilliseconds(Map parameters, String key, long value) { + if (value < 0) { + return; + } + + Date date = new Date(value); + PackageBuilder.addDate(parameters, key, date); + } + + public static void addDateInSeconds(Map parameters, String key, long value) { if (value < 0) { return; } + Date date = new Date(value * 1000); + PackageBuilder.addDate(parameters, key, date); + } + + public static void addDate(Map parameters, String key, Date value) { + if (value == null) { + return; + } + String dateString = Util.dateFormatter.format(value); PackageBuilder.addString(parameters, key, dateString); } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java index 25c998b35..711a3da93 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java @@ -56,7 +56,7 @@ public static ActivityPackage buildReftagSdkClickPackage(final String rawReferre } clickPackageBuilder.referrer = referrer; - clickPackageBuilder.clickTime = clickTime; + clickPackageBuilder.clickTimeInMilliseconds = clickTime; clickPackageBuilder.rawReferrer = rawReferrer; ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.REFTAG); @@ -99,13 +99,46 @@ public static ActivityPackage buildDeeplinkSdkClickPackage(final Uri url, } clickPackageBuilder.deeplink = url.toString(); - clickPackageBuilder.clickTime = clickTime; + clickPackageBuilder.clickTimeInMilliseconds = clickTime; ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.DEEPLINK); return clickPackage; } + public static ActivityPackage buildInstallReferrerSdkClickPackage(final String installReferrer, + final long clickTimeInSeconds, + final long installBeginInSeconds, + final ActivityState activityState, + final AdjustConfig adjustConfig, + final DeviceInfo deviceInfo, + final SessionParameters sessionParameters) { + if (installReferrer == null || installReferrer.length() == 0) { + return null; + } + + long now = System.currentTimeMillis(); + + PackageBuilder clickPackageBuilder = new PackageBuilder( + adjustConfig, + deviceInfo, + activityState, + sessionParameters, + now); + + if (clickPackageBuilder == null) { + return null; + } + + clickPackageBuilder.referrer = installReferrer; + clickPackageBuilder.clicktTimeInSeconds = clickTimeInSeconds; + clickPackageBuilder.installBeginTimeInSeconds = installBeginInSeconds; + + ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.INSTALL_REFERRER); + + return clickPackage; + } + private static PackageBuilder queryStringClickPackageBuilder( final List queryList, final ActivityState activityState, 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 c4b7d136f..ef4fa7111 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -1,5 +1,8 @@ package com.adjust.sdk; +import org.json.JSONArray; +import org.json.JSONException; + import java.io.IOException; import java.io.UnsupportedEncodingException; @@ -157,6 +160,49 @@ public void run() { // Send referrer sdk_click package. sendSdkClick(sdkClickPackage); } + + try { + JSONArray installReferrers = sharedPreferencesManager.getInstallReferrerArray(); + boolean hasInstallReferrersBeenChanged = false; + + for(int i = 0; i < installReferrers.length(); i++) { + JSONArray savedInstallReferrer = installReferrers.getJSONArray(i); + + int savedInstallReferrerState = savedInstallReferrer.optInt(3, -1); + + // Don't send the one already sending or sent. + if (savedInstallReferrerState != 0) { + continue; + } + + String savedInstallReferrerString = savedInstallReferrer.optString(0, null); + long savedClickTime = savedInstallReferrer.optLong(1, -1); + long savedInstalBeginTime = savedInstallReferrer.optLong(2, -1); + + // Mark install referrer as being sent. + savedInstallReferrer.put(3, 1); + hasInstallReferrersBeenChanged = true; + + // Create sdk click + ActivityPackage sdkClickPackage = PackageFactory.buildInstallReferrerSdkClickPackage( + savedInstallReferrerString, + savedClickTime, + savedInstalBeginTime, + activityHandler.getActivityState(), + activityHandler.getAdjustConfig(), + activityHandler.getDeviceInfo(), + activityHandler.getSessionParameters()); + + // Send referrer sdk_click package. + sendSdkClick(sdkClickPackage); + } + + if (hasInstallReferrersBeenChanged) { + sharedPreferencesManager.saveInstallReferrerArray(installReferrers); + } + } catch (JSONException e) { + logger.error("sendSavedReferrers error (%s)", e.getMessage()); + } } }); } @@ -245,18 +291,38 @@ public void run() { * @param sdkClickPackage sdk_click package to be sent. */ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { + String source = sdkClickPackage.getParameters().get("source"); + + boolean isReftag = source != null && source.equals("reftag"); String rawReferrer = sdkClickPackage.getParameters().get("raw_referrer"); - boolean isReferrer = rawReferrer != null; + ActivityHandler activityHandler = (ActivityHandler) activityHandlerWeakRef.get(); - if (isReferrer) { + if (isReftag) { // Check before sending if referrer was sent and removed already. SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(activityHandler.getContext()); if (!sharedPreferencesManager.doesReferrerExist( rawReferrer, - sdkClickPackage.getClickTime())) { + sdkClickPackage.getClickTimeInMilliseconds())) { + return; + } + } + + boolean isInstallReferrer = source != null && source.equals("install_referrer"); + String installReferrerString = sdkClickPackage.getParameters().get("install_referrer"); + + if (isInstallReferrer) { + // Check before sending if install referrer was sent and removed already. + SharedPreferencesManager sharedPreferencesManager + = new SharedPreferencesManager(activityHandler.getContext()); + + JSONArray installReferrer = sharedPreferencesManager.getInstallReferrer( + installReferrerString, + sdkClickPackage.getClickTimeInSeconds(), + sdkClickPackage.getInstallBeginTimeInSeconds()); + if (installReferrer != null) { return; } } @@ -278,16 +344,32 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { return; } - if (isReferrer) { + if (isReftag) { // Remove referrer from shared preferences after sdk_click is sent. SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(activityHandler.getContext()); sharedPreferencesManager.removeReferrer( - sdkClickPackage.getClickTime(), + sdkClickPackage.getClickTimeInMilliseconds(), rawReferrer); } + if (isInstallReferrer) { + SharedPreferencesManager sharedPreferencesManager + = new SharedPreferencesManager(activityHandler.getContext()); + + JSONArray installReferrers = sharedPreferencesManager.getInstallReferrerArray(); + + JSONArray installReferrer = sharedPreferencesManager.getInstallReferrer( + installReferrerString, + sdkClickPackage.getClickTimeInSeconds(), + sdkClickPackage.getInstallBeginTimeInSeconds()); + + installReferrer.put(3, 2); + + sharedPreferencesManager.saveInstallReferrerArray(installReferrers); + } + activityHandler.finishedTrackingActivity(responseData); } catch (UnsupportedEncodingException e) { logErrorMessageI(sdkClickPackage, "Sdk_click failed to encode parameters", e); 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 2827bc1c1..a3f8895bb 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -26,6 +26,7 @@ public class SharedPreferencesManager { */ private static final String PREFS_KEY_REFERRERS = "referrers"; + private static final String PREFS_KEY_INSTALL_REFERRERS = "install_referrers"; /** * Key name for push token. */ @@ -91,6 +92,33 @@ public synchronized void saveReferrer(final long clickTime, final String rawRefe } } + public synchronized void saveInstallReferrer(String installReferrer, long clickTime, long installBeginTime) { + try { + JSONArray installReferrerArray = getInstallReferrerArray(); + + if (getInstallReferrer(installReferrer, clickTime, installBeginTime) != null) { + return; + } + + JSONArray newInstallReferrer = new JSONArray(); + + newInstallReferrer.put(0, installReferrer); + newInstallReferrer.put(1, clickTime); + newInstallReferrer.put(2, installBeginTime); + newInstallReferrer.put(3, 0); + + installReferrerArray.put(newInstallReferrer); + + saveInstallReferrerArray(installReferrerArray); + + } catch (JSONException e) { + } + } + + public synchronized void saveInstallReferrerArray(JSONArray installReferrerArray) { + saveString(PREFS_KEY_INSTALL_REFERRERS, installReferrerArray.toString()); + } + /** * Remove referrer information from shared preferences. * @@ -156,6 +184,36 @@ public synchronized boolean doesReferrerExist(final String rawReferrer, final lo return false; } + public synchronized JSONArray getInstallReferrer(String installReferrer, + long clickTime, + long installBeginTime) { + try { + JSONArray installReferrers = getInstallReferrerArray(); + + for (int i = 0; i < installReferrers.length(); i++) { + JSONArray savedInstallReferrer = installReferrers.getJSONArray(i); + // check if install referrer is already saved + String savedInstallReferrerString = savedInstallReferrer.optString(0, null); + if (savedInstallReferrerString == null || !savedInstallReferrerString.equals(installReferrer)) { + continue; + } + long savedClickTime = savedInstallReferrer.optLong(1, -1); + if (savedClickTime != clickTime) { + continue; + } + long savedInstalBeginTime = savedInstallReferrer.optLong(2, -1); + if (savedInstalBeginTime != installBeginTime) { + continue; + } + // install referrer found, skip adding it + return savedInstallReferrer; + } + } catch (JSONException e) { + } + + return null; + } + /** * Mark given referrer as the one being sent by SdkClickHandler. * @@ -233,6 +291,19 @@ public synchronized ArrayList getReferrers() { return referrersArray; } + public synchronized JSONArray getInstallReferrerArray() { + try { + String referrerQueueString = getString(PREFS_KEY_INSTALL_REFERRERS); + + if (referrerQueueString != null) { + return new JSONArray(referrerQueueString); + } + } catch (JSONException e) { + } + + return new JSONArray(); + } + /** * Initially called upon ActivityHandler initialisation. * Used to check if any of the still existing referrers was unsuccessfully being sent before app got killed. diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java index bbf722ec0..a45eaa41a 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java @@ -56,7 +56,6 @@ public class Util { public static final DecimalFormat SecondsDisplayFormat = new DecimalFormat("0.0"); public static final SimpleDateFormat dateFormatter = new SimpleDateFormat(DATE_FORMAT, Locale.US); - private static ILogger getLogger() { return AdjustFactory.getLogger(); } From d08376328dc999e9e532bbb77de353855d159d9e Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 24 Nov 2017 14:49:43 +0100 Subject: [PATCH 113/146] Refac raw referrer saving and reading --- .../java/com/adjust/sdk/AdjustInstance.java | 18 +- .../java/com/adjust/sdk/PackageBuilder.java | 4 +- .../main/java/com/adjust/sdk/Referrer.java | 129 -------- .../java/com/adjust/sdk/SdkClickHandler.java | 98 ++++--- .../adjust/sdk/SharedPreferencesManager.java | 276 ++++++------------ 5 files changed, 153 insertions(+), 372 deletions(-) delete mode 100644 Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java 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 cfc582105..7e917fd86 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -56,8 +56,7 @@ public void onCreate(final AdjustConfig adjustConfig) { activityHandler = AdjustFactory.getActivityHandler(adjustConfig); - // Scan for referrers. - scanForReferrers(adjustConfig.context); + setSendingReferrersAsUnsend(adjustConfig.context); } /** @@ -149,7 +148,7 @@ public void sendReferrer(final String rawReferrer, final Context context) { return; } - saveReferrer(clickTime, rawReferrer, context); + saveRawReferrer(rawReferrer, clickTime, context); if (checkActivityHandler("referrer")) { if (activityHandler.isEnabled()) { @@ -441,9 +440,9 @@ private boolean checkActivityHandler(final String savedForLaunchWarningSuffixMes * @param rawReferrer Raw referrer content * @param context Application context */ - private void saveReferrer(final long clickTime, final String rawReferrer, final Context context) { + private void saveRawReferrer(final String rawReferrer, final long clickTime, final Context context) { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); - sharedPreferencesManager.saveReferrer(clickTime, rawReferrer); + sharedPreferencesManager.saveRawReferrer(rawReferrer, clickTime); } /** @@ -457,14 +456,9 @@ private void savePushToken(final String pushToken, final Context context) { sharedPreferencesManager.savePushToken(pushToken); } - /** - * Check saved referrers before app being killed and if any found with isBeingSent set to true, revert it to false. - * - * @param context Application context - */ - private void scanForReferrers(final Context context) { + private void setSendingReferrersAsUnsend(final Context context) { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); - sharedPreferencesManager.scanForSavedReferrers(); + sharedPreferencesManager.setSendingReferrersAsUnsend(); } /** 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 3ac2be7bd..73427aea9 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -347,7 +347,7 @@ public static void addLong(Map parameters, String key, long valu } public static void addDateInMilliseconds(Map parameters, String key, long value) { - if (value < 0) { + if (value <= 0) { return; } @@ -356,7 +356,7 @@ public static void addDateInMilliseconds(Map parameters, String } public static void addDateInSeconds(Map parameters, String key, long value) { - if (value < 0) { + if (value <= 0) { return; } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java deleted file mode 100644 index f7a19ef88..000000000 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Referrer.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.adjust.sdk; - -import org.json.JSONArray; -import org.json.JSONException; - -/** - * Created by uerceg on 07.08.17. - */ - -public class Referrer { - /** - * Number of referrer fields. - */ - public static final int REFERRER_FIELDS_NUMBER = 3; - - /** - * Referrer click time stamp. - */ - private long clickTime; - - /** - * Raw referrer content. - */ - private String rawReferrer; - - /** - * Flag that indicates whether referrer is currently being sent by SdkClickHandler or not. - */ - private boolean isBeingSent; - - /** - * Referrer object constructor. - * - * @param clickTime Referrer click time - * @param rawReferrer Raw referrer content - */ - public Referrer(final long clickTime, final String rawReferrer) { - this.rawReferrer = rawReferrer; - this.clickTime = clickTime; - - this.isBeingSent = false; - } - - /** - * Referrer click time getter. - * - * @return Referrer click time - */ - public long getClickTime() { - return clickTime; - } - - /** - * Raw referrer getter. - * - * @return Raw referrer - */ - public String getRawReferrer() { - return rawReferrer; - } - - /** - * Is referrer being sent flag getter. - * - * @return Is referrer being sent flag's value - */ - public boolean getIsBeingSent() { - return isBeingSent; - } - - /** - * Set info whether referrer is being sent or not. - * - * @param send boolean indicating whether referrer is being sent or not - */ - public void setIsBeingSent(final boolean send) { - isBeingSent = send; - } - - /** - * Convert Referrer object to JSON array. - * [0] - clickTime - * [1] - rawReferrer - * [2] - isBeingSent - * - * @return JSONArray object with referrer inside - */ - public JSONArray asJSONArray() { - JSONArray array = new JSONArray(); - - array.put(clickTime); - array.put(rawReferrer); - array.put(isBeingSent); - - return array; - } - - /** - * Convert Referrer object to JSONArray string. - * - * @return JSONArray as string of the current Referrer object - */ - public String asString() { - return asJSONArray().toString(); - } - - /** - * Check if current referrer is equal with given one. - * Equality criteria is equality of: clickTime and referrer members. - * - * @param referrer Referrer to check equality with - * @return boolean indicating whether two referrers are equal - */ - public boolean isEqual(final Referrer referrer) { - if (referrer == null) { - return false; - } - - if (referrer.getClickTime() != clickTime) { - return false; - } - - if (!referrer.getRawReferrer().equals(this.rawReferrer)) { - return false; - } - - return true; - } -} 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 ef4fa7111..5c681470e 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -132,41 +132,53 @@ public void run() { IActivityHandler activityHandler = activityHandlerWeakRef.get(); SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager( activityHandler.getContext()); - ArrayList referrers = sharedPreferencesManager.getReferrers(); + try { + JSONArray rawReferrerArray = sharedPreferencesManager.getRawReferrerArray(); + boolean hasRawReferrersBeenChanged = false; - for (int i = 0; i < referrers.size(); i += 1) { - Referrer referrer = referrers.get(i); + for(int i = 0; i < rawReferrerArray.length(); i++) { + JSONArray savedRawReferrer = rawReferrerArray.getJSONArray(i); - // Don't send the one already flagged for sending. - if (referrer.getIsBeingSent()) { - continue; - } + int savedRawReferrerState = savedRawReferrer.optInt(2, -1); - ActivityPackage sdkClickPackage = PackageFactory.buildReftagSdkClickPackage( - referrer.getRawReferrer(), - referrer.getClickTime(), - activityHandler.getActivityState(), - activityHandler.getAdjustConfig(), - activityHandler.getDeviceInfo(), - activityHandler.getSessionParameters()); + // Don't send the one already sending or sent. + if (savedRawReferrerState != 0) { + continue; + } - if (sdkClickPackage == null) { - return; - } + String savedRawReferrerString = savedRawReferrer.optString(0, null); + long savedClickTime = savedRawReferrer.optLong(1, -1); + // Mark install referrer as being sent. + savedRawReferrer.put(2, 1); + hasRawReferrersBeenChanged = true; - // Mark referrer as being sent. - sharedPreferencesManager.markReferrerForSending(referrer); + // Create sdk click + ActivityPackage sdkClickPackage = PackageFactory.buildReftagSdkClickPackage( + savedRawReferrerString, + savedClickTime, + activityHandler.getActivityState(), + activityHandler.getAdjustConfig(), + activityHandler.getDeviceInfo(), + activityHandler.getSessionParameters()); - // Send referrer sdk_click package. - sendSdkClick(sdkClickPackage); + // Send referrer sdk_click package. + sendSdkClick(sdkClickPackage); + } + + if (hasRawReferrersBeenChanged) { + sharedPreferencesManager.saveRawReferrerArray(rawReferrerArray); + } + } catch (JSONException e) { + logger.error("Send saved raw referrers error (%s)", e.getMessage()); } + try { - JSONArray installReferrers = sharedPreferencesManager.getInstallReferrerArray(); + JSONArray installReferrerArray = sharedPreferencesManager.getInstallReferrerArray(); boolean hasInstallReferrersBeenChanged = false; - for(int i = 0; i < installReferrers.length(); i++) { - JSONArray savedInstallReferrer = installReferrers.getJSONArray(i); + for(int i = 0; i < installReferrerArray.length(); i++) { + JSONArray savedInstallReferrer = installReferrerArray.getJSONArray(i); int savedInstallReferrerState = savedInstallReferrer.optInt(3, -1); @@ -198,10 +210,10 @@ public void run() { } if (hasInstallReferrersBeenChanged) { - sharedPreferencesManager.saveInstallReferrerArray(installReferrers); + sharedPreferencesManager.saveInstallReferrerArray(installReferrerArray); } } catch (JSONException e) { - logger.error("sendSavedReferrers error (%s)", e.getMessage()); + logger.error("Send saved install referrers error (%s)", e.getMessage()); } } }); @@ -294,24 +306,26 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { String source = sdkClickPackage.getParameters().get("source"); boolean isReftag = source != null && source.equals("reftag"); - String rawReferrer = sdkClickPackage.getParameters().get("raw_referrer"); + String rawReferrerString = sdkClickPackage.getParameters().get("raw_referrer"); ActivityHandler activityHandler = (ActivityHandler) activityHandlerWeakRef.get(); if (isReftag) { - // Check before sending if referrer was sent and removed already. + // Check before sending if referrer was removed already. SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(activityHandler.getContext()); - if (!sharedPreferencesManager.doesReferrerExist( - rawReferrer, - sdkClickPackage.getClickTimeInMilliseconds())) { + JSONArray rawReferrer = sharedPreferencesManager.getRawReferrer( + rawReferrerString, + sdkClickPackage.getClickTimeInMilliseconds()); + + if (rawReferrer == null) { return; } } boolean isInstallReferrer = source != null && source.equals("install_referrer"); - String installReferrerString = sdkClickPackage.getParameters().get("install_referrer"); + String referrerString = sdkClickPackage.getParameters().get("referrer"); if (isInstallReferrer) { // Check before sending if install referrer was sent and removed already. @@ -319,10 +333,18 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { = new SharedPreferencesManager(activityHandler.getContext()); JSONArray installReferrer = sharedPreferencesManager.getInstallReferrer( - installReferrerString, + referrerString, sdkClickPackage.getClickTimeInSeconds(), sdkClickPackage.getInstallBeginTimeInSeconds()); - if (installReferrer != null) { + + // Check before sending if referrer was removed already. + if (installReferrer == null) { + return; + } + + // Check before sending if referrer was sent already. + int installReferrerState = installReferrer.optInt(3, -1); + if (installReferrerState == 2) { return; } } @@ -349,9 +371,9 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(activityHandler.getContext()); - sharedPreferencesManager.removeReferrer( - sdkClickPackage.getClickTimeInMilliseconds(), - rawReferrer); + sharedPreferencesManager.removeRawReferrer( + rawReferrerString, + sdkClickPackage.getClickTimeInMilliseconds()); } if (isInstallReferrer) { @@ -361,7 +383,7 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { JSONArray installReferrers = sharedPreferencesManager.getInstallReferrerArray(); JSONArray installReferrer = sharedPreferencesManager.getInstallReferrer( - installReferrerString, + referrerString, sdkClickPackage.getClickTimeInSeconds(), sdkClickPackage.getInstallBeginTimeInSeconds()); 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 a3f8895bb..dff0c9611 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -24,7 +24,7 @@ public class SharedPreferencesManager { /** * Key name for referrers. */ - private static final String PREFS_KEY_REFERRERS = "referrers"; + private static final String PREFS_KEY_RAW_REFERRERS = "raw_referrers"; private static final String PREFS_KEY_INSTALL_REFERRERS = "install_referrers"; /** @@ -51,43 +51,24 @@ public SharedPreferencesManager(final Context context) { this.sharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); } - /** - * Save referrer information to shared preferences. - * - * @param clickTime Referrer click time - * @param rawReferrer Raw referrer string - */ - public synchronized void saveReferrer(final long clickTime, final String rawReferrer) { - // Check if referrer is null or empty string already done before calling this method. + public synchronized void saveRawReferrer(String rawReferrer, long clickTime) { try { - ArrayList referrers = getReferrers(); - Referrer referrerToSave = new Referrer(clickTime, rawReferrer); + JSONArray rawReferrerArray = getRawReferrerArray(); - // If referrer is already contained in shared preferences, skip adding it. - if (getReferrerIndex(referrerToSave, referrers) >= 0) { + if (getRawReferrer(rawReferrer, clickTime) != null) { return; } - // Recreate new referrers (updated) array. - JSONArray updatedReferrers = new JSONArray(); - - if (referrers != null) { - for (int i = 0; i < referrers.size(); i++) { - updatedReferrers.put(referrers.get(i).asJSONArray()); - } - } + JSONArray newInstallReferrer = new JSONArray(); - // Add new referrer JSONArray entry to the queue. - JSONArray newReferrerEntry = new JSONArray(); + newInstallReferrer.put(0, rawReferrer); + newInstallReferrer.put(1, clickTime); + newInstallReferrer.put(2, 0); - newReferrerEntry.put(0, referrerToSave.getClickTime()); - newReferrerEntry.put(1, referrerToSave.getRawReferrer()); - newReferrerEntry.put(2, referrerToSave.getIsBeingSent()); + rawReferrerArray.put(newInstallReferrer); - updatedReferrers.put(newReferrerEntry); + saveRawReferrerArray(rawReferrerArray); - // Save JSON array as string back to shared preferences. - saveString(PREFS_KEY_REFERRERS, updatedReferrers.toString()); } catch (JSONException e) { } } @@ -115,6 +96,10 @@ public synchronized void saveInstallReferrer(String installReferrer, long clickT } } + public synchronized void saveRawReferrerArray(JSONArray rawReferrerArray) { + saveString(PREFS_KEY_RAW_REFERRERS, rawReferrerArray.toString()); + } + public synchronized void saveInstallReferrerArray(JSONArray installReferrerArray) { saveString(PREFS_KEY_INSTALL_REFERRERS, installReferrerArray.toString()); } @@ -125,63 +110,73 @@ public synchronized void saveInstallReferrerArray(JSONArray installReferrerArray * @param clickTime Referrer click time * @param rawReferrer Referrer string */ - public synchronized void removeReferrer(final long clickTime, final String rawReferrer) { + public synchronized void removeRawReferrer(String rawReferrer, long clickTime) { // Don't even try to remove null or empty referrers since they shouldn't exist in shared preferences. if (rawReferrer == null || rawReferrer.length() == 0) { return; } - Referrer referrerToCheck = new Referrer(clickTime, rawReferrer); - - // Try to locate position in queue of the referrer that should be deleted. - ArrayList referrers = getReferrers(); - int index = getReferrerIndex(referrerToCheck, referrers); + int rawReferrerIndex = getRawReferrerIndex(rawReferrer, clickTime); - // If referrer is not found in the queue, skip the rest. - if (index == -1) { + if (rawReferrerIndex < 0) { return; } + JSONArray rawReferrerArray = getRawReferrerArray(); + // Rebuild queue without referrer that should be removed. JSONArray updatedReferrers = new JSONArray(); - for (int i = 0; i < referrers.size(); i += 1) { - if (i == index) { + for (int i = 0; i < rawReferrerArray.length(); i += 1) { + if (i == rawReferrerIndex) { continue; } - updatedReferrers.put(referrers.get(i).asJSONArray()); + try { + updatedReferrers.put(rawReferrerArray.getJSONArray(i)); + } catch (JSONException e) { + } } // Save new referrer queue JSON array as string back to shared preferences. - saveString(PREFS_KEY_REFERRERS, updatedReferrers.toString()); + saveString(PREFS_KEY_RAW_REFERRERS, updatedReferrers.toString()); } - /** - * Check if give referrer is saved in shared preferences. - * - * @param clickTime Referrer click time - * @param rawReferrer Referrer string - * @return boolean indicating whether given referrer exist in shared preferences or not. - * In case of exception, return false. - */ - public synchronized boolean doesReferrerExist(final String rawReferrer, final long clickTime) { - ArrayList referrers = getReferrers(); - Referrer referrerToCheck = new Referrer(clickTime, rawReferrer); + public synchronized int getRawReferrerIndex(String rawReferrer, + long clickTime) { + try { + JSONArray rawReferrers = getRawReferrerArray(); - if (referrers == null) { - return false; + for (int i = 0; i < rawReferrers.length(); i++) { + JSONArray savedRawReferrer = rawReferrers.getJSONArray(i); + // check if raw referrer is already saved + String savedRawReferrerString = savedRawReferrer.optString(0, null); + if (savedRawReferrerString == null || !savedRawReferrerString.equals(rawReferrer)) { + continue; + } + long savedClickTime = savedRawReferrer.optLong(1, -1); + if (savedClickTime != clickTime) { + continue; + } + // install referrer found, skip adding it + return i; + } + } catch (JSONException e) { } - for (int i = 0; i < referrers.size(); i += 1) { - Referrer referrerEntry = referrers.get(i); + return -1; + } - if (referrerEntry.isEqual(referrerToCheck)) { - return true; + public synchronized JSONArray getRawReferrer(String rawReferrer, + long clickTime) { + int rawReferrerIndex = getRawReferrerIndex(rawReferrer, clickTime); + if (rawReferrerIndex >= 0) { + try { + getRawReferrerArray().getJSONArray(rawReferrerIndex); + } catch (JSONException e) { } } - - return false; + return null; } public synchronized JSONArray getInstallReferrer(String installReferrer, @@ -214,81 +209,17 @@ public synchronized JSONArray getInstallReferrer(String installReferrer, return null; } - /** - * Mark given referrer as the one being sent by SdkClickHandler. - * - * @param referrer Referrer which is being sent. - */ - public synchronized void markReferrerForSending(final Referrer referrer) { - ArrayList referrers = getReferrers(); - - if (referrers == null) { - return; - } - - // If referrer doesn't exist in shared preferences, do nothing. - int index = getReferrerIndex(referrer, referrers); - - if (index < 0) { - return; - } - - // Mark referrer for sending. - referrers.get(index).setIsBeingSent(true); - - // Recreate new referrers (updated) array. - JSONArray updatedReferrers = new JSONArray(); - - for (int i = 0; i < referrers.size(); i++) { - updatedReferrers.put(referrers.get(i).asJSONArray()); - } - - // Save JSON array as string back to shared preferences. - saveString(PREFS_KEY_REFERRERS, updatedReferrers.toString()); - } - - /** - * Get all currently saved referrers from shared preferences. - * - * @return JSONArray with all the saved referrers from shared preferences. Empty array if none available. - */ - public synchronized ArrayList getReferrers() { - ArrayList referrersArray = new ArrayList(); - + public synchronized JSONArray getRawReferrerArray() { try { - JSONArray arrayFromPrefs; - String referrerQueueString = getString(PREFS_KEY_REFERRERS); - - if (referrerQueueString == null) { - arrayFromPrefs = new JSONArray(); - } else { - arrayFromPrefs = new JSONArray(referrerQueueString); - } - - if (arrayFromPrefs.length() == 0) { - return null; - } - - for (int i = 0; i < arrayFromPrefs.length(); i += 1) { - JSONArray referrerEntry = arrayFromPrefs.getJSONArray(i); - - if (referrerEntry.length() != Referrer.REFERRER_FIELDS_NUMBER) { - continue; - } + String referrerQueueString = getString(PREFS_KEY_RAW_REFERRERS); - long clickTime = referrerEntry.getLong(0); - String rawContent = referrerEntry.getString(1); - boolean isBeingSent = referrerEntry.getBoolean(2); - - Referrer referrer = new Referrer(clickTime, rawContent); - referrer.setIsBeingSent(isBeingSent); - - referrersArray.add(referrer); + if (referrerQueueString != null) { + return new JSONArray(referrerQueueString); } } catch (JSONException e) { } - return referrersArray; + return new JSONArray(); } public synchronized JSONArray getInstallReferrerArray() { @@ -309,48 +240,38 @@ public synchronized JSONArray getInstallReferrerArray() { * Used to check if any of the still existing referrers was unsuccessfully being sent before app got killed. * If such found - switch it's isBeingSent flag back to "false". */ - public synchronized void scanForSavedReferrers() { - ArrayList referrers = new ArrayList(); - + public synchronized void setSendingReferrersAsUnsend() { try { - JSONArray arrayFromPrefs; - String referrerQueueString = getString(PREFS_KEY_REFERRERS); - - if (referrerQueueString == null) { - arrayFromPrefs = new JSONArray(); - } else { - arrayFromPrefs = new JSONArray(referrerQueueString); + JSONArray rawReferrerArray = getRawReferrerArray(); + boolean hasRawReferrersBeenChanged = false; + for (int i = 0; i < rawReferrerArray.length(); i++) { + JSONArray rawReferrer = rawReferrerArray.getJSONArray(i); + int sendingStatus = rawReferrer.optInt(2, -1); + if (sendingStatus == 1) { + rawReferrer.put(2, 0); + hasRawReferrersBeenChanged = true; + } } - - if (arrayFromPrefs.length() == 0) { - return; + if (hasRawReferrersBeenChanged) { + saveRawReferrerArray(rawReferrerArray); } + } catch (JSONException e) { + } - for (int i = 0; i < arrayFromPrefs.length(); i += 1) { - JSONArray referrerEntry = arrayFromPrefs.getJSONArray(i); - - if (referrerEntry.length() != Referrer.REFERRER_FIELDS_NUMBER) { - continue; + try { + JSONArray installReferrerArray = getInstallReferrerArray(); + boolean hasInstallReferrersBeenChanged = false; + for (int i = 0; i < installReferrerArray.length(); i++) { + JSONArray installReferrer = installReferrerArray.getJSONArray(i); + int sendingStatus = installReferrer.optInt(3, -1); + if (sendingStatus == 1) { + installReferrer.put(3, 0); + hasInstallReferrersBeenChanged = true; } - - long clickTime = referrerEntry.getLong(0); - String rawContent = referrerEntry.getString(1); - - Referrer referrer = new Referrer(clickTime, rawContent); - referrer.setIsBeingSent(false); - - referrers.add(referrer); } - - // Rebuild queue without referrer that should be removed. - JSONArray updatedReferrers = new JSONArray(); - - for (int i = 0; i < referrers.size(); i += 1) { - updatedReferrers.put(referrers.get(i).asJSONArray()); + if (hasInstallReferrersBeenChanged) { + saveInstallReferrerArray(installReferrerArray); } - - // Save new referrer queue JSON array as string back to shared preferences. - saveString(PREFS_KEY_REFERRERS, updatedReferrers.toString()); } catch (JSONException e) { } } @@ -460,31 +381,4 @@ private synchronized boolean getBoolean(final String key, final boolean defaultV private synchronized void remove(final String key) { this.sharedPreferences.edit().remove(key).apply(); } - - /** - * Check if referrer information is contained in referrer queue in shared preferences and get it's index. - * - * @param referrerToCheck Referrer to be checked - * @param referrers Referrer queue from shared preferences - * @return Index of referrer information inside of the referrer queue. -1 if not found. - */ - private int getReferrerIndex(final Referrer referrerToCheck, final ArrayList referrers) { - if (referrerToCheck == null) { - return -1; - } - - if (referrers == null) { - return -1; - } - - for (int i = 0; i < referrers.size(); i += 1) { - Referrer referrer = referrers.get(i); - - if (referrer.isEqual(referrerToCheck)) { - return i; - } - } - - return -1; - } } From 467dfa557257b2f2f930a42dbb2de8938831f1d9 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 24 Nov 2017 15:52:55 +0100 Subject: [PATCH 114/146] Rename referrer source --- Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java | 1 - Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) 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 5126f2321..c506c83f4 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java @@ -33,7 +33,6 @@ public interface Constants { String LOGTAG = "Adjust"; String REFTAG = "reftag"; String DEEPLINK = "deeplink"; - String INSTALL_REFERRER = "install_referrer"; String PUSH = "push"; String THREAD_PREFIX = "Adjust-"; diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java index 711a3da93..45f1a94b9 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java @@ -134,7 +134,7 @@ public static ActivityPackage buildInstallReferrerSdkClickPackage(final String i clickPackageBuilder.clicktTimeInSeconds = clickTimeInSeconds; clickPackageBuilder.installBeginTimeInSeconds = installBeginInSeconds; - ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.INSTALL_REFERRER); + ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.REFERRER); return clickPackage; } From 528f88089404d1545fc07a79b5516e04b3cc4b07 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 24 Nov 2017 16:50:21 +0100 Subject: [PATCH 115/146] Set install referrer flag --- .../src/main/java/com/adjust/sdk/InstallReferrer.java | 8 +++----- .../java/com/adjust/sdk/SharedPreferencesManager.java | 10 +++++----- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/InstallReferrer.java b/Adjust/adjust/src/main/java/com/adjust/sdk/InstallReferrer.java index b1b875cfb..3a6f66322 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/InstallReferrer.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/InstallReferrer.java @@ -163,6 +163,9 @@ public void onInstallReferrerSetupFinishedInt(final int responseCode) { if (activityHandler != null) { activityHandler.sendReferrer(); } + synchronized (flagLock) { + hasInstallReferrerBeenRead = true; + } } catch (Exception e) { logger.debug("Couldn't get install referrer from client (%s). Retrying", e.getMessage()); retry(); @@ -248,11 +251,6 @@ private long getInstallBeginTimestampSeconds(Object referrerDetails) { return -1; } - private void saveInstallReferrer(String installReferrer, long clickTime, long installBeginTime, Context context) { - SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); - sharedPreferencesManager.saveInstallReferrer(installReferrer, clickTime, installBeginTime); - } - public void onInstallReferrerServiceDisconnected() { logger.debug("InstallReferrer onInstallReferrerServiceDisconnected"); } 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 dff0c9611..780344a24 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -59,13 +59,13 @@ public synchronized void saveRawReferrer(String rawReferrer, long clickTime) { return; } - JSONArray newInstallReferrer = new JSONArray(); + JSONArray newRawReferrer = new JSONArray(); - newInstallReferrer.put(0, rawReferrer); - newInstallReferrer.put(1, clickTime); - newInstallReferrer.put(2, 0); + newRawReferrer.put(0, rawReferrer); + newRawReferrer.put(1, clickTime); + newRawReferrer.put(2, 0); - rawReferrerArray.put(newInstallReferrer); + rawReferrerArray.put(newRawReferrer); saveRawReferrerArray(rawReferrerArray); From 7d1998e19960934fbbd3009f3316d9392109b7d3 Mon Sep 17 00:00:00 2001 From: nonelse Date: Mon, 27 Nov 2017 10:42:20 +0100 Subject: [PATCH 116/146] Refactor install referrer functions --- .../java/com/adjust/sdk/InstallReferrer.java | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/InstallReferrer.java b/Adjust/adjust/src/main/java/com/adjust/sdk/InstallReferrer.java index 3a6f66322..d6ccc6133 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/InstallReferrer.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/InstallReferrer.java @@ -70,15 +70,13 @@ public void startConnection () { Object listenerProxy = createProxyInstallReferrerStateListener(listenerClass); - try { - Reflection.invokeInstanceMethod(this.referrerClient, "startConnection", - new Class[] {listenerClass}, listenerProxy); - } catch (Exception e) { - logger.error("startConnection error (%s)", e.getMessage()); - } + startConnection(listenerClass, listenerProxy); } public Object createInstallReferrerClient(Context context) { + if (context == null) { + return null; + } try { Object builder = Reflection.invokeStaticMethod(packageBaseName + "api.InstallReferrerClient", "newBuilder", @@ -90,6 +88,15 @@ public Object createInstallReferrerClient(Context context) { return null; } + public Class getInstallReferrerStateListenerClass() { + try{ + return Class.forName(packageBaseName + "api.InstallReferrerStateListener"); + } catch (Exception e) { + logger.error("getInstallReferrerStateListenerClass error (%s)", e.getMessage()); + } + return null; + } + public Object createProxyInstallReferrerStateListener(Class installReferrerStateListenerClass) { if (installReferrerStateListenerClass == null) { return null; @@ -101,13 +108,19 @@ public Object createProxyInstallReferrerStateListener(Class installReferrerState ); } - public Class getInstallReferrerStateListenerClass() { - try{ - return Class.forName(packageBaseName + "api.InstallReferrerStateListener"); + public void startConnection (Class listenerClass, Object listenerProxy) { + if (referrerClient == null) { + return; + } + if (listenerClass == null || listenerProxy == null) { + return; + } + try { + Reflection.invokeInstanceMethod(this.referrerClient, "startConnection", + new Class[] {listenerClass}, listenerProxy); } catch (Exception e) { - logger.error("getInstallReferrerStateListenerClass error (%s)", e.getMessage()); + logger.error("startConnection error (%s)", e.getMessage()); } - return null; } @Override From 63efc37531a4c9043a46d4c521b38b61376b6603 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 28 Nov 2017 12:15:59 +0100 Subject: [PATCH 117/146] Install referrer refactoring --- .../java/com/adjust/sdk/ActivityHandler.java | 58 +++- .../java/com/adjust/sdk/ActivityState.java | 47 ++-- .../java/com/adjust/sdk/AdjustInstance.java | 8 +- .../main/java/com/adjust/sdk/Constants.java | 1 + .../java/com/adjust/sdk/IActivityHandler.java | 4 +- .../java/com/adjust/sdk/ISdkClickHandler.java | 4 +- .../java/com/adjust/sdk/InstallReferrer.java | 252 +++++++++++++----- .../java/com/adjust/sdk/PackageFactory.java | 2 +- .../java/com/adjust/sdk/SdkClickHandler.java | 114 +++----- .../com/adjust/sdk/SdkClickResponseData.java | 4 + .../adjust/sdk/SharedPreferencesManager.java | 225 ++++++---------- 11 files changed, 395 insertions(+), 324 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 241985287..197a02dd4 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -331,6 +331,7 @@ public void finishedTrackingActivity(ResponseData responseData) { } // redirect sdk click responses to attribution handler to check for attribution information if (responseData instanceof SdkClickResponseData) { + checkForInstallReferrerInfo((SdkClickResponseData) responseData); attributionHandler.checkSdkClickResponse((SdkClickResponseData)responseData); return; } @@ -424,11 +425,21 @@ public void run() { } @Override - public void sendReferrer() { + public void sendReftagReferrer() { scheduledExecutor.submit(new Runnable() { @Override public void run() { - sendReferrerI(); + sendReftagReferrerI(); + } + }); + } + + @Override + public void sendInstallReferrer(final long clickTime, final long installBegin, final String installReferrer) { + scheduledExecutor.submit(new Runnable() { + @Override + public void run() { + sendInstallReferrerI(clickTime, installBegin, installReferrer); } }); } @@ -746,7 +757,7 @@ public void run() { installReferrer = new InstallReferrer(adjustConfig.context, this); - sendReferrerI(); + sendReftagReferrerI(); } private void readConfigFile(Context context) { @@ -1264,12 +1275,37 @@ private void setAskingAttributionI(boolean askingAttribution) { writeActivityStateI(); } - private void sendReferrerI() { + private void sendReftagReferrerI() { if (!isEnabledI()) { return; } - sdkClickHandler.sendSavedReferrers(); + sdkClickHandler.sendReftagReferrers(); + } + + private void sendInstallReferrerI(final long clickTime, final long installBegin, final String installReferrer) { + if (!isEnabledI()) { + return; + } + + if (activityState.clickTime == clickTime + && activityState.installBegin == installBegin + && activityState.installReferrer.equals(installReferrer)) { + // Same click already sent before, nothing to be done. + return; + } + + // Create sdk click + ActivityPackage sdkClickPackage = PackageFactory.buildInstallReferrerSdkClickPackage( + installReferrer, + clickTime, + installBegin, + activityState, + adjustConfig, + deviceInfo, + sessionParameters); + + sdkClickHandler.sendSdkClick(sdkClickPackage); } private void readOpenUrlI(Uri url, long clickTime) { @@ -1835,4 +1871,16 @@ private boolean toSendI(boolean sdkClickHandlerOnly) { // doesn't have the option -> depends on being on the background/foreground return internalState.isInForeground(); } + + private void checkForInstallReferrerInfo(final SdkClickResponseData responseData) { + if (!responseData.isInstallReferrer) { + return; + } + + activityState.clickTime = responseData.clickTime; + activityState.installBegin = responseData.installBegin; + activityState.installReferrer = responseData.installReferrer; + + writeActivityStateI(); + } } 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 1e9b8386d..92b61495c 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityState.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityState.java @@ -17,12 +17,11 @@ import java.io.Serializable; import java.util.Calendar; import java.util.LinkedList; -import java.util.List; import java.util.Locale; public class ActivityState implements Serializable, Cloneable { private static final long serialVersionUID = 9039439291143138148L; - private static int ORDER_ID_MAXCOUNT = 10; + private static final int ORDER_ID_MAXCOUNT = 10; private transient ILogger logger; private static final ObjectStreamField[] serialPersistentFields = { new ObjectStreamField("uuid", String.class), @@ -39,6 +38,9 @@ public class ActivityState implements Serializable, Cloneable { new ObjectStreamField("orderIds", (Class>)(Class) LinkedList.class), new ObjectStreamField("pushToken", String.class), new ObjectStreamField("adid", String.class), + new ObjectStreamField("clickTime", long.class), + new ObjectStreamField("installBegin", long.class), + new ObjectStreamField("installReferrer", String.class), }; // persistent data @@ -65,13 +67,16 @@ public class ActivityState implements Serializable, Cloneable { protected String pushToken; protected String adid; + protected long clickTime; + protected long installBegin; + protected String installReferrer; + protected ActivityState() { logger = AdjustFactory.getLogger(); // create UUID for new devices uuid = Util.createUuid(); enabled = true; askingAttribution = false; - eventCount = 0; // no events yet sessionCount = 0; // the first session just started subsessionCount = -1; // we don't know how many subsessions this first session will have @@ -83,6 +88,9 @@ protected ActivityState() { orderIds = null; pushToken = null; adid = null; + clickTime = 0; + installBegin = 0; + installReferrer = null; } protected void resetSessionAttributes(long now) { @@ -127,19 +135,22 @@ public boolean equals(Object other) { if (getClass() != other.getClass()) return false; ActivityState otherActivityState = (ActivityState) other; - if (!Util.equalString(uuid, otherActivityState.uuid)) return false; - if (!Util.equalBoolean(enabled, otherActivityState.enabled)) 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; - if (!Util.equalInt(subsessionCount, otherActivityState.subsessionCount)) return false; - if (!Util.equalLong(sessionLength, otherActivityState.sessionLength)) return false; - if (!Util.equalLong(timeSpent, otherActivityState.timeSpent)) return false; - if (!Util.equalLong(lastInterval, otherActivityState.lastInterval)) return false; - if (!Util.equalBoolean(updatePackages, otherActivityState.updatePackages)) return false; + if (!Util.equalString(uuid, otherActivityState.uuid)) return false; + if (!Util.equalBoolean(enabled, otherActivityState.enabled)) 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; + if (!Util.equalInt(subsessionCount, otherActivityState.subsessionCount)) return false; + if (!Util.equalLong(sessionLength, otherActivityState.sessionLength)) return false; + if (!Util.equalLong(timeSpent, otherActivityState.timeSpent)) return false; + if (!Util.equalLong(lastInterval, otherActivityState.lastInterval)) return false; + if (!Util.equalBoolean(updatePackages, otherActivityState.updatePackages)) return false; if (!Util.equalObject(orderIds, otherActivityState.orderIds)) return false; if (!Util.equalString(pushToken, otherActivityState.pushToken)) return false; if (!Util.equalString(adid, otherActivityState.adid)) return false; + if (!Util.equalLong(clickTime, otherActivityState.clickTime)) return false; + if (!Util.equalLong(installBegin, otherActivityState.installBegin)) return false; + if (!Util.equalString(installReferrer, otherActivityState.installReferrer)) return false; return true; } @@ -159,6 +170,9 @@ public int hashCode() { hashCode = 37 * hashCode + Util.hashObject(orderIds); hashCode = 37 * hashCode + Util.hashString(pushToken); hashCode = 37 * hashCode + Util.hashString(adid); + hashCode = 37 * hashCode + Util.hashLong(clickTime); + hashCode = 37 * hashCode + Util.hashLong(installBegin); + hashCode = 37 * hashCode + Util.hashString(installReferrer); return hashCode; } @@ -179,13 +193,14 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo askingAttribution = Util.readBooleanField(fields, "askingAttribution", false); updatePackages = Util.readBooleanField(fields, "updatePackages", false); - orderIds = Util.readObjectField(fields, "orderIds", null); - pushToken = Util.readStringField(fields, "pushToken", null); - adid = Util.readStringField(fields, "adid", null); + clickTime = Util.readLongField(fields, "clickTime", -1l); + installBegin = Util.readLongField(fields, "installBegin", -1l); + installReferrer = Util.readStringField(fields, "installReferrer", null); + // create UUID for migrating devices if (uuid == null) { uuid = Util.createUuid(); 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 7e917fd86..aca5e607f 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -56,7 +56,7 @@ public void onCreate(final AdjustConfig adjustConfig) { activityHandler = AdjustFactory.getActivityHandler(adjustConfig); - setSendingReferrersAsUnsend(adjustConfig.context); + setSendingReferrersAsNotSent(adjustConfig.context); } /** @@ -152,7 +152,7 @@ public void sendReferrer(final String rawReferrer, final Context context) { if (checkActivityHandler("referrer")) { if (activityHandler.isEnabled()) { - activityHandler.sendReferrer(); + activityHandler.sendReftagReferrer(); } } } @@ -456,9 +456,9 @@ private void savePushToken(final String pushToken, final Context context) { sharedPreferencesManager.savePushToken(pushToken); } - private void setSendingReferrersAsUnsend(final Context context) { + private void setSendingReferrersAsNotSent(final Context context) { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); - sharedPreferencesManager.setSendingReferrersAsUnsend(); + sharedPreferencesManager.setSendingReferrersAsNotSent(); } /** 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 c506c83f4..be11a4cbf 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java @@ -32,6 +32,7 @@ public interface Constants { String CLIENT_SDK = "android4.12.0"; String LOGTAG = "Adjust"; String REFTAG = "reftag"; + String INSTALL_REFERRER = "install_referrer"; String DEEPLINK = "deeplink"; String PUSH = "push"; String THREAD_PREFIX = "Adjust-"; 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 faeed6205..4b78fe6ef 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/IActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/IActivityHandler.java @@ -33,7 +33,9 @@ public interface IActivityHandler { void launchAttributionResponseTasks(AttributionResponseData attributionResponseData); - void sendReferrer(); + void sendReftagReferrer(); + + void sendInstallReferrer(long clickTime, long installBegin, String installReferrer); void setOfflineMode(boolean enabled); diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/ISdkClickHandler.java b/Adjust/adjust/src/main/java/com/adjust/sdk/ISdkClickHandler.java index 121d670d9..fa2a80156 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ISdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ISdkClickHandler.java @@ -34,9 +34,9 @@ public interface ISdkClickHandler { void sendSdkClick(ActivityPackage sdkClick); /** - * Send sdk_click packages made from all the persisted referrers. + * Send sdk_click packages made from all the persisted intent type referrers. */ - void sendSavedReferrers(); + void sendReftagReferrers(); /** * Teardown SdkClickHandler instance. diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/InstallReferrer.java b/Adjust/adjust/src/main/java/com/adjust/sdk/InstallReferrer.java index d6ccc6133..bdb756ba4 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/InstallReferrer.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/InstallReferrer.java @@ -10,34 +10,94 @@ import static com.adjust.sdk.Constants.ONE_SECOND; /** - * Created by nonelse on 21.11.17. + * Class used for Android install referrer logic. + * + * @author Pedro Silva (nonelse) + * @since 21st November 2017 */ public class InstallReferrer implements InvocationHandler { - public static final String packageBaseName = "com.android.installreferrer."; - /** Play Store service is not connected now - potentially transient state */ - private static final int SERVICE_DISCONNECTED = -1; - /** Success. */ - private static final int OK = 0; - /** Could not initiate connection to the Install Referrer service. */ - private static final int SERVICE_UNAVAILABLE = 1; - /** Install Referrer API not supported by the installed Play Store app. */ - private static final int FEATURE_NOT_SUPPORTED = 2; - /** General errors caused by incorrect usage */ - private static final int DEVELOPER_ERROR = 3; + /** + * Android install referrer library package name. + */ + public static final String PACKAGE_BASE_NAME = "com.android.installreferrer."; + + /** + * Play Store service is not connected now - potentially transient state. + */ + private static final int STATUS_SERVICE_DISCONNECTED = -1; + /** + * Play Store service connection success. + */ + private static final int STATUS_OK = 0; + + /** + * Could not initiate connection to the install referrer service. + */ + private static final int STATUS_SERVICE_UNAVAILABLE = 1; + + /** + * Install Referrer API not supported by the installed Play Store app. + */ + private static final int STATUS_FEATURE_NOT_SUPPORTED = 2; + + /** + * General errors caused by incorrect usage. + */ + private static final int STATUS_DEVELOPER_ERROR = 3; + + /** + * Retry time interval. + */ + private int retryWaitTime = ONE_SECOND * 3; + + /** + * Number of retries attempted to connect to service. + */ + private int retries; + + /** + * Boolean indicating whether service responded with install referrer information. + */ + private boolean hasInstallReferrerBeenRead; + /** + * Adjust logger instance. + */ private ILogger logger; + + /** + * InstallReferrer class instance. + */ private Object referrerClient; - private int retries; + + /** + * Application context. + */ private Context context; + + /** + * Lock. + */ private Object flagLock; - private boolean hasInstallReferrerBeenRead; + + /** + * Timer which fires retry attempts. + */ private TimerOnce retryTimer; - private WeakReference activityHandlerWeakRef; - private int RETRY_WAIT_TIME = ONE_SECOND * 3; + /** + * Weak reference to ActivityHandler instance. + */ + private WeakReference activityHandlerWeakRef; - public InstallReferrer(Context context, IActivityHandler activityHandler) { + /** + * Default constructor. + * + * @param context Application context + * @param activityHandler ActivityHandler reference + */ + public InstallReferrer(final Context context, final IActivityHandler activityHandler) { this.logger = AdjustFactory.getLogger(); this.context = context; this.flagLock = new Object(); @@ -54,7 +114,10 @@ public void run() { startConnection(); } - public void startConnection () { + /** + * Start connection with install referrer service. + */ + public void startConnection() { closeReferrerClient(); synchronized (flagLock) { @@ -67,18 +130,23 @@ public void startConnection () { this.referrerClient = createInstallReferrerClient(context); Class listenerClass = getInstallReferrerStateListenerClass(); - Object listenerProxy = createProxyInstallReferrerStateListener(listenerClass); startConnection(listenerClass, listenerProxy); } - public Object createInstallReferrerClient(Context context) { + /** + * Create InstallReferrerClient object instance. + * + * @param context App context + * @return Instance of InstallReferrerClient. Defaults to null if failed to create one. + */ + public Object createInstallReferrerClient(final Context context) { if (context == null) { return null; } try { - Object builder = Reflection.invokeStaticMethod(packageBaseName + "api.InstallReferrerClient", + Object builder = Reflection.invokeStaticMethod(PACKAGE_BASE_NAME + "api.InstallReferrerClient", "newBuilder", new Class[]{Context.class}, context); return Reflection.invokeInstanceMethod(builder, "build", null); @@ -88,27 +156,44 @@ public Object createInstallReferrerClient(Context context) { return null; } + /** + * Get InstallReferrerStateListener class object. + * + * @return Class object for InstallReferrerStateListener class. + */ public Class getInstallReferrerStateListenerClass() { - try{ - return Class.forName(packageBaseName + "api.InstallReferrerStateListener"); + try { + return Class.forName(PACKAGE_BASE_NAME + "api.InstallReferrerStateListener"); } catch (Exception e) { logger.error("getInstallReferrerStateListenerClass error (%s)", e.getMessage()); } return null; } - public Object createProxyInstallReferrerStateListener(Class installReferrerStateListenerClass) { + /** + * Get object instance for given class (InstallReferrerStateListener in this case). + * + * @param installReferrerStateListenerClass Class object + * @return Instance of Class type object. + */ + public Object createProxyInstallReferrerStateListener(final Class installReferrerStateListenerClass) { if (installReferrerStateListenerClass == null) { return null; } return Proxy.newProxyInstance( installReferrerStateListenerClass.getClassLoader(), - new Class[]{ installReferrerStateListenerClass }, + new Class[]{installReferrerStateListenerClass}, this ); } - public void startConnection (Class listenerClass, Object listenerProxy) { + /** + * Initialise connection with install referrer service. + * + * @param listenerClass Callback listener class type + * @param listenerProxy Callback listener object instance + */ + public void startConnection(final Class listenerClass, final Object listenerProxy) { if (referrerClient == null) { return; } @@ -117,14 +202,17 @@ public void startConnection (Class listenerClass, Object listenerProxy) { } try { Reflection.invokeInstanceMethod(this.referrerClient, "startConnection", - new Class[] {listenerClass}, listenerProxy); + new Class[]{listenerClass}, listenerProxy); } catch (Exception e) { logger.error("startConnection error (%s)", e.getMessage()); } } + /** + * {@inheritDoc} + */ @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { try { String methodName = method.getName(); // Prints the method being invoked @@ -135,71 +223,63 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl // if the method name equals some method's name then call your method if (methodName.equals("onInstallReferrerSetupFinished")) { - onInstallReferrerSetupFinishedObject(args[0]); + onInstallReferrerSetupFinishedInt((Integer) args[0]); } else if (methodName.equals("onInstallReferrerServiceDisconnected")) { - onInstallReferrerServiceDisconnected(); + logger.debug("InstallReferrer onInstallReferrerServiceDisconnected"); } } catch (Exception e) { logger.error("InstallReferrer invoke error (%s)", e.getMessage()); } - return null; - } - - public void onInstallReferrerSetupFinishedObject(Object responseCodeObj) { - logger.debug("InstallReferrer onInstallReferrerSetupFinished"); - try { - logger.debug("onInstallReferrerSetupFinishedObject arg class name: %s", responseCodeObj.getClass().getName()); - logger.debug("onInstallReferrerSetupFinishedObject arg toString: %s", responseCodeObj.toString()); - onInstallReferrerSetupFinishedInt((Integer)responseCodeObj); - } catch (Exception e) { - logger.error("onInstallReferrerSetupFinished error (%s)", e.getMessage()); - } + return null; } + /** + * Check and process response from install referrer service. + * + * @param responseCode Response code from install referrer service + */ public void onInstallReferrerSetupFinishedInt(final int responseCode) { switch (responseCode) { - case OK: + case STATUS_OK: // Connection established try { - // extract referrer + // Extract referrer Object referrerDetails = getInstallReferrer(); - String stringInstallReferrer = getStringInstallReferrer(referrerDetails); + String installReferrer = getStringInstallReferrer(referrerDetails); long clickTime = getReferrerClickTimestampSeconds(referrerDetails); - long installBeginTime = getInstallBeginTimestampSeconds(referrerDetails); + long installBegin = getInstallBeginTimestampSeconds(referrerDetails); logger.debug("installReferrer: %s, clickTime: %d, installBeginTime: %d", - stringInstallReferrer, clickTime, installBeginTime); - // save referrer - SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); - sharedPreferencesManager.saveInstallReferrer(stringInstallReferrer, clickTime, installBeginTime); - // send referrer + installReferrer, clickTime, installBegin); + + // Stuff successfully read, try to send it. IActivityHandler activityHandler = activityHandlerWeakRef.get(); if (activityHandler != null) { - activityHandler.sendReferrer(); + activityHandler.sendInstallReferrer(clickTime, installBegin, installReferrer); } synchronized (flagLock) { hasInstallReferrerBeenRead = true; } } catch (Exception e) { - logger.debug("Couldn't get install referrer from client (%s). Retrying", e.getMessage()); + logger.debug("Couldn't get install referrer from client (%s). Retrying ...", e.getMessage()); retry(); } break; - case FEATURE_NOT_SUPPORTED: + case STATUS_FEATURE_NOT_SUPPORTED: // API not available on the current Play Store app - logger.debug("Install referrer not available on the current Play Store app"); + logger.debug("Install referrer not available on the current Play Store app."); break; - case SERVICE_UNAVAILABLE: + case STATUS_SERVICE_UNAVAILABLE: // Connection could not be established - logger.debug("Could not initiate connection to the Install Referrer service. Retrying"); + logger.debug("Could not initiate connection to the Install Referrer service. Retrying ..."); retry(); break; - case DEVELOPER_ERROR: - logger.debug("Install referrer general errors caused by incorrect usage. Retrying"); + case STATUS_DEVELOPER_ERROR: + logger.debug("Install referrer general errors caused by incorrect usage. Retrying ..."); retry(); break; - case SERVICE_DISCONNECTED: + case STATUS_SERVICE_DISCONNECTED: // Play Store service is not connected now - potentially transient state - logger.debug("Play Store service is not connected now. Retrying"); + logger.debug("Play Store service is not connected now. Retrying ..."); retry(); break; default: @@ -209,6 +289,11 @@ public void onInstallReferrerSetupFinishedInt(final int responseCode) { closeReferrerClient(); } + /** + * Get ReferrerDetails object (response). + * + * @return ReferrerDetails object + */ private Object getInstallReferrer() { if (this.referrerClient == null) { return null; @@ -222,12 +307,18 @@ private Object getInstallReferrer() { return null; } - private String getStringInstallReferrer(Object referrerDetails) { + /** + * Get install referrer string value. + * + * @param referrerDetails ReferrerDetails object + * @return Install referrer string value. + */ + private String getStringInstallReferrer(final Object referrerDetails) { if (referrerDetails == null) { return null; } try { - String stringInstallReferrer = (String)Reflection.invokeInstanceMethod( + String stringInstallReferrer = (String) Reflection.invokeInstanceMethod( referrerDetails, "getInstallReferrer", null); return stringInstallReferrer; } catch (Exception e) { @@ -236,12 +327,18 @@ private String getStringInstallReferrer(Object referrerDetails) { return null; } - private long getReferrerClickTimestampSeconds(Object referrerDetails) { + /** + * Get redirect URL click timestamp. + * + * @param referrerDetails ReferrerDetails object + * @return Redirect URL click timestamp. + */ + private long getReferrerClickTimestampSeconds(final Object referrerDetails) { if (referrerDetails == null) { return -1; } try { - Long clickTime = (Long)Reflection.invokeInstanceMethod( + Long clickTime = (Long) Reflection.invokeInstanceMethod( referrerDetails, "getReferrerClickTimestampSeconds", null); return clickTime; } catch (Exception e) { @@ -250,12 +347,18 @@ private long getReferrerClickTimestampSeconds(Object referrerDetails) { return -1; } - private long getInstallBeginTimestampSeconds(Object referrerDetails) { + /** + * Get Play Store app INSTALL button click timestamp. + * + * @param referrerDetails ReferrerDetails object + * @return Play Store app INSTALL button click timestamp. + */ + private long getInstallBeginTimestampSeconds(final Object referrerDetails) { if (referrerDetails == null) { return -1; } try { - Long installBeginTime = (Long)Reflection.invokeInstanceMethod( + Long installBeginTime = (Long) Reflection.invokeInstanceMethod( referrerDetails, "getInstallBeginTimestampSeconds", null); return installBeginTime; } catch (Exception e) { @@ -264,10 +367,9 @@ private long getInstallBeginTimestampSeconds(Object referrerDetails) { return -1; } - public void onInstallReferrerServiceDisconnected() { - logger.debug("InstallReferrer onInstallReferrerServiceDisconnected"); - } - + /** + * Retry connection to install referrer service. + */ private void retry() { synchronized (flagLock) { if (hasInstallReferrerBeenRead) { @@ -275,7 +377,7 @@ private void retry() { return; } } - // increase retry counter + // Increase retry counter retries++; if (retries > Constants.MAX_INSTALL_REFERRER_RETRIES) { logger.debug("Limit number of retry for install referrer surpassed"); @@ -287,14 +389,16 @@ private void retry() { logger.debug("Already waiting to retry to read install referrer in %d milliseconds", firingIn); return; } - retryTimer.startIn(RETRY_WAIT_TIME); + retryTimer.startIn(retryWaitTime); } + /** + * Terminate connection to install referrer service. + */ private void closeReferrerClient() { if (referrerClient == null) { return; } - try { Reflection.invokeInstanceMethod(referrerClient, "endConnection", null); } catch (Exception e) { diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java index 45f1a94b9..711a3da93 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageFactory.java @@ -134,7 +134,7 @@ public static ActivityPackage buildInstallReferrerSdkClickPackage(final String i clickPackageBuilder.clicktTimeInSeconds = clickTimeInSeconds; clickPackageBuilder.installBeginTimeInSeconds = installBeginInSeconds; - ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.REFERRER); + ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.INSTALL_REFERRER); return clickPackage; } 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 5c681470e..c9d6c1f5d 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java @@ -31,6 +31,16 @@ public class SdkClickHandler implements ISdkClickHandler { */ private static final String SCHEDULED_EXECUTOR_SOURCE = "SdkClickHandler"; + /** + * Intent based referrer source name inside of sdk_click package. + */ + private static final String SOURCE_REFTAG = "reftag"; + + /** + * Install referrer service referrer source name inside of sdk_click package. + */ + private static final String SOURCE_INSTALL_REFERRER = "install_referrer"; + /** * Indicates whether SdkClickHandler is paused or not. */ @@ -125,7 +135,7 @@ public void run() { * {@inheritDoc} */ @Override - public void sendSavedReferrers() { + public void sendReftagReferrers() { scheduledExecutor.submit(new Runnable() { @Override public void run() { @@ -136,7 +146,7 @@ public void run() { JSONArray rawReferrerArray = sharedPreferencesManager.getRawReferrerArray(); boolean hasRawReferrersBeenChanged = false; - for(int i = 0; i < rawReferrerArray.length(); i++) { + for (int i = 0; i < rawReferrerArray.length(); i++) { JSONArray savedRawReferrer = rawReferrerArray.getJSONArray(i); int savedRawReferrerState = savedRawReferrer.optInt(2, -1); @@ -171,50 +181,6 @@ public void run() { } catch (JSONException e) { logger.error("Send saved raw referrers error (%s)", e.getMessage()); } - - - try { - JSONArray installReferrerArray = sharedPreferencesManager.getInstallReferrerArray(); - boolean hasInstallReferrersBeenChanged = false; - - for(int i = 0; i < installReferrerArray.length(); i++) { - JSONArray savedInstallReferrer = installReferrerArray.getJSONArray(i); - - int savedInstallReferrerState = savedInstallReferrer.optInt(3, -1); - - // Don't send the one already sending or sent. - if (savedInstallReferrerState != 0) { - continue; - } - - String savedInstallReferrerString = savedInstallReferrer.optString(0, null); - long savedClickTime = savedInstallReferrer.optLong(1, -1); - long savedInstalBeginTime = savedInstallReferrer.optLong(2, -1); - - // Mark install referrer as being sent. - savedInstallReferrer.put(3, 1); - hasInstallReferrersBeenChanged = true; - - // Create sdk click - ActivityPackage sdkClickPackage = PackageFactory.buildInstallReferrerSdkClickPackage( - savedInstallReferrerString, - savedClickTime, - savedInstalBeginTime, - activityHandler.getActivityState(), - activityHandler.getAdjustConfig(), - activityHandler.getDeviceInfo(), - activityHandler.getSessionParameters()); - - // Send referrer sdk_click package. - sendSdkClick(sdkClickPackage); - } - - if (hasInstallReferrersBeenChanged) { - sharedPreferencesManager.saveInstallReferrerArray(installReferrerArray); - } - } catch (JSONException e) { - logger.error("Send saved install referrers error (%s)", e.getMessage()); - } } }); } @@ -303,13 +269,12 @@ public void run() { * @param sdkClickPackage sdk_click package to be sent. */ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { + IActivityHandler activityHandler = activityHandlerWeakRef.get(); String source = sdkClickPackage.getParameters().get("source"); - boolean isReftag = source != null && source.equals("reftag"); + boolean isReftag = source != null && source.equals(SOURCE_REFTAG); String rawReferrerString = sdkClickPackage.getParameters().get("raw_referrer"); - ActivityHandler activityHandler = (ActivityHandler) activityHandlerWeakRef.get(); - if (isReftag) { // Check before sending if referrer was removed already. SharedPreferencesManager sharedPreferencesManager @@ -324,35 +289,24 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { } } - boolean isInstallReferrer = source != null && source.equals("install_referrer"); - String referrerString = sdkClickPackage.getParameters().get("referrer"); + boolean isInstallReferrer = source != null && source.equals(SOURCE_INSTALL_REFERRER); + long clickTime = -1; + long installBegin = -1; + String installReferrer = null; if (isInstallReferrer) { - // Check before sending if install referrer was sent and removed already. - SharedPreferencesManager sharedPreferencesManager - = new SharedPreferencesManager(activityHandler.getContext()); - - JSONArray installReferrer = sharedPreferencesManager.getInstallReferrer( - referrerString, - sdkClickPackage.getClickTimeInSeconds(), - sdkClickPackage.getInstallBeginTimeInSeconds()); - - // Check before sending if referrer was removed already. - if (installReferrer == null) { - return; - } - - // Check before sending if referrer was sent already. - int installReferrerState = installReferrer.optInt(3, -1); - if (installReferrerState == 2) { - return; - } + // Check if install referrer information is saved to activity state. + // If yes, we have successfully sent it at earlier point and no need to do it again. + // If not, proceed with sending of sdk_click package for install referrer. + clickTime = sdkClickPackage.getClickTimeInSeconds(); + installBegin = sdkClickPackage.getInstallBeginTimeInSeconds(); + installReferrer = sdkClickPackage.getParameters().get("referrer"); } String targetURL = Constants.BASE_URL + sdkClickPackage.getPath(); try { - ResponseData responseData = UtilNetworking.createPOSTHttpsURLConnection( + SdkClickResponseData responseData = (SdkClickResponseData) UtilNetworking.createPOSTHttpsURLConnection( targetURL, sdkClickPackage, packageQueue.size() - 1); @@ -377,19 +331,11 @@ private void sendSdkClickI(final ActivityPackage sdkClickPackage) { } if (isInstallReferrer) { - SharedPreferencesManager sharedPreferencesManager - = new SharedPreferencesManager(activityHandler.getContext()); - - JSONArray installReferrers = sharedPreferencesManager.getInstallReferrerArray(); - - JSONArray installReferrer = sharedPreferencesManager.getInstallReferrer( - referrerString, - sdkClickPackage.getClickTimeInSeconds(), - sdkClickPackage.getInstallBeginTimeInSeconds()); - - installReferrer.put(3, 2); - - sharedPreferencesManager.saveInstallReferrerArray(installReferrers); + // After successfully sending install referrer, store sent values in activity state. + responseData.clickTime = clickTime; + responseData.installBegin = installBegin; + responseData.installReferrer = installReferrer; + responseData.isInstallReferrer = true; } activityHandler.finishedTrackingActivity(responseData); diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickResponseData.java b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickResponseData.java index b81426d2e..4759c207a 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickResponseData.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickResponseData.java @@ -5,4 +5,8 @@ */ public class SdkClickResponseData extends ResponseData { + boolean isInstallReferrer; + long clickTime; + long installBegin; + String installReferrer; } 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 780344a24..fb97f854f 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/SharedPreferencesManager.java @@ -6,8 +6,6 @@ import android.content.Context; import android.content.SharedPreferences; -import java.util.ArrayList; - /** * Class used for shared preferences manipulation. * @@ -26,7 +24,6 @@ public class SharedPreferencesManager { */ private static final String PREFS_KEY_RAW_REFERRERS = "raw_referrers"; - private static final String PREFS_KEY_INSTALL_REFERRERS = "install_referrers"; /** * Key name for push token. */ @@ -37,6 +34,21 @@ public class SharedPreferencesManager { */ private static final String PREFS_KEY_INSTALL_TRACKED = "install_tracked"; + /** + * Index for raw referrer string content in saved JSONArray object. + */ + private static final int INDEX_RAW_REFERRER = 0; + + /** + * Index for click time in saved JSONArray object. + */ + private static final int INDEX_CLICK_TIME = 1; + + /** + * Index for information whether referrer is being sent in saved JSONArray object. + */ + private static final int INDEX_IS_SENDING = 2; + /** * Shared preferences of the app. */ @@ -51,7 +63,13 @@ public SharedPreferencesManager(final Context context) { this.sharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); } - public synchronized void saveRawReferrer(String rawReferrer, long clickTime) { + /** + * Save raw referrer string into shared preferences. + * + * @param rawReferrer Raw referrer string + * @param clickTime Click time + */ + public synchronized void saveRawReferrer(final String rawReferrer, final long clickTime) { try { JSONArray rawReferrerArray = getRawReferrerArray(); @@ -61,56 +79,32 @@ public synchronized void saveRawReferrer(String rawReferrer, long clickTime) { JSONArray newRawReferrer = new JSONArray(); - newRawReferrer.put(0, rawReferrer); - newRawReferrer.put(1, clickTime); - newRawReferrer.put(2, 0); + newRawReferrer.put(INDEX_RAW_REFERRER, rawReferrer); + newRawReferrer.put(INDEX_CLICK_TIME, clickTime); + newRawReferrer.put(INDEX_IS_SENDING, 0); rawReferrerArray.put(newRawReferrer); - saveRawReferrerArray(rawReferrerArray); - } catch (JSONException e) { } } - public synchronized void saveInstallReferrer(String installReferrer, long clickTime, long installBeginTime) { - try { - JSONArray installReferrerArray = getInstallReferrerArray(); - - if (getInstallReferrer(installReferrer, clickTime, installBeginTime) != null) { - return; - } - - JSONArray newInstallReferrer = new JSONArray(); - - newInstallReferrer.put(0, installReferrer); - newInstallReferrer.put(1, clickTime); - newInstallReferrer.put(2, installBeginTime); - newInstallReferrer.put(3, 0); - - installReferrerArray.put(newInstallReferrer); - - saveInstallReferrerArray(installReferrerArray); - - } catch (JSONException e) { - } - } - - public synchronized void saveRawReferrerArray(JSONArray rawReferrerArray) { + /** + * Save referrer array to shared preferences. + * + * @param rawReferrerArray Array of referrers to be saved + */ + public synchronized void saveRawReferrerArray(final JSONArray rawReferrerArray) { saveString(PREFS_KEY_RAW_REFERRERS, rawReferrerArray.toString()); } - public synchronized void saveInstallReferrerArray(JSONArray installReferrerArray) { - saveString(PREFS_KEY_INSTALL_REFERRERS, installReferrerArray.toString()); - } - /** * Remove referrer information from shared preferences. * - * @param clickTime Referrer click time - * @param rawReferrer Referrer string + * @param clickTime Click time + * @param rawReferrer Raw referrer string */ - public synchronized void removeRawReferrer(String rawReferrer, long clickTime) { + public synchronized void removeRawReferrer(final String rawReferrer, final long clickTime) { // Don't even try to remove null or empty referrers since they shouldn't exist in shared preferences. if (rawReferrer == null || rawReferrer.length() == 0) { return; @@ -142,73 +136,29 @@ public synchronized void removeRawReferrer(String rawReferrer, long clickTime) { saveString(PREFS_KEY_RAW_REFERRERS, updatedReferrers.toString()); } - public synchronized int getRawReferrerIndex(String rawReferrer, - long clickTime) { - try { - JSONArray rawReferrers = getRawReferrerArray(); - - for (int i = 0; i < rawReferrers.length(); i++) { - JSONArray savedRawReferrer = rawReferrers.getJSONArray(i); - // check if raw referrer is already saved - String savedRawReferrerString = savedRawReferrer.optString(0, null); - if (savedRawReferrerString == null || !savedRawReferrerString.equals(rawReferrer)) { - continue; - } - long savedClickTime = savedRawReferrer.optLong(1, -1); - if (savedClickTime != clickTime) { - continue; - } - // install referrer found, skip adding it - return i; - } - } catch (JSONException e) { - } - - return -1; - } - - public synchronized JSONArray getRawReferrer(String rawReferrer, - long clickTime) { + /** + * Get saved referrer JSONArray object. + * + * @param rawReferrer Raw referrer string + * @param clickTime Click time + * @return JSONArray object containing referrer information. Defaults to null if not found. + */ + public synchronized JSONArray getRawReferrer(final String rawReferrer, final long clickTime) { int rawReferrerIndex = getRawReferrerIndex(rawReferrer, clickTime); if (rawReferrerIndex >= 0) { try { - getRawReferrerArray().getJSONArray(rawReferrerIndex); + return getRawReferrerArray().getJSONArray(rawReferrerIndex); } catch (JSONException e) { } } return null; } - public synchronized JSONArray getInstallReferrer(String installReferrer, - long clickTime, - long installBeginTime) { - try { - JSONArray installReferrers = getInstallReferrerArray(); - - for (int i = 0; i < installReferrers.length(); i++) { - JSONArray savedInstallReferrer = installReferrers.getJSONArray(i); - // check if install referrer is already saved - String savedInstallReferrerString = savedInstallReferrer.optString(0, null); - if (savedInstallReferrerString == null || !savedInstallReferrerString.equals(installReferrer)) { - continue; - } - long savedClickTime = savedInstallReferrer.optLong(1, -1); - if (savedClickTime != clickTime) { - continue; - } - long savedInstalBeginTime = savedInstallReferrer.optLong(2, -1); - if (savedInstalBeginTime != installBeginTime) { - continue; - } - // install referrer found, skip adding it - return savedInstallReferrer; - } - } catch (JSONException e) { - } - - return null; - } - + /** + * Get array of saved referrer JSONArray objects. + * + * @return JSONArray of saved referrers. Defaults to empty JSONArray if none found. + */ public synchronized JSONArray getRawReferrerArray() { try { String referrerQueueString = getString(PREFS_KEY_RAW_REFERRERS); @@ -222,58 +172,59 @@ public synchronized JSONArray getRawReferrerArray() { return new JSONArray(); } - public synchronized JSONArray getInstallReferrerArray() { - try { - String referrerQueueString = getString(PREFS_KEY_INSTALL_REFERRERS); - - if (referrerQueueString != null) { - return new JSONArray(referrerQueueString); - } - } catch (JSONException e) { - } - - return new JSONArray(); - } - /** * Initially called upon ActivityHandler initialisation. * Used to check if any of the still existing referrers was unsuccessfully being sent before app got killed. * If such found - switch it's isBeingSent flag back to "false". */ - public synchronized void setSendingReferrersAsUnsend() { + public synchronized void setSendingReferrersAsNotSent() { try { JSONArray rawReferrerArray = getRawReferrerArray(); boolean hasRawReferrersBeenChanged = false; for (int i = 0; i < rawReferrerArray.length(); i++) { - JSONArray rawReferrer = rawReferrerArray.getJSONArray(i); - int sendingStatus = rawReferrer.optInt(2, -1); - if (sendingStatus == 1) { - rawReferrer.put(2, 0); - hasRawReferrersBeenChanged = true; - } + JSONArray rawReferrer = rawReferrerArray.getJSONArray(i); + int sendingStatus = rawReferrer.optInt(INDEX_IS_SENDING, -1); + if (sendingStatus == 1) { + rawReferrer.put(INDEX_IS_SENDING, 0); + hasRawReferrersBeenChanged = true; + } } if (hasRawReferrersBeenChanged) { saveRawReferrerArray(rawReferrerArray); } } catch (JSONException e) { } + } + /** + * Get index of saved raw referrer. + * + * @param rawReferrer Raw referrer string + * @param clickTime Click time + * @return Index of saved referrer. Defaults to -1 if referrer not found. + */ + private synchronized int getRawReferrerIndex(final String rawReferrer, final long clickTime) { try { - JSONArray installReferrerArray = getInstallReferrerArray(); - boolean hasInstallReferrersBeenChanged = false; - for (int i = 0; i < installReferrerArray.length(); i++) { - JSONArray installReferrer = installReferrerArray.getJSONArray(i); - int sendingStatus = installReferrer.optInt(3, -1); - if (sendingStatus == 1) { - installReferrer.put(3, 0); - hasInstallReferrersBeenChanged = true; + JSONArray rawReferrers = getRawReferrerArray(); + + for (int i = 0; i < rawReferrers.length(); i++) { + JSONArray savedRawReferrer = rawReferrers.getJSONArray(i); + // Check if raw referrer is already saved. + String savedRawReferrerString = savedRawReferrer.optString(INDEX_RAW_REFERRER, null); + if (savedRawReferrerString == null || !savedRawReferrerString.equals(rawReferrer)) { + continue; } - } - if (hasInstallReferrersBeenChanged) { - saveInstallReferrerArray(installReferrerArray); + long savedClickTime = savedRawReferrer.optLong(INDEX_CLICK_TIME, -1); + if (savedClickTime != clickTime) { + continue; + } + // Install referrer found, skip adding it. + return i; } } catch (JSONException e) { } + + return -1; } /** @@ -294,6 +245,13 @@ public synchronized String getPushToken() { return getString(PREFS_KEY_PUSH_TOKEN); } + /** + * Remove push token from shared preferences. + */ + public synchronized void removePushToken() { + remove(PREFS_KEY_PUSH_TOKEN); + } + /** * Save information that install has been tracked to shared preferences. */ @@ -310,13 +268,6 @@ public synchronized boolean getInstallTracked() { return getBoolean(PREFS_KEY_INSTALL_TRACKED, false); } - /** - * Remove push token from shared preferences. - */ - public synchronized void removePushToken() { - remove(PREFS_KEY_PUSH_TOKEN); - } - /** * Remove all key-value pairs from shared preferences. */ @@ -363,7 +314,7 @@ private synchronized String getString(final String key) { * * @param key Key for which boolean value should be retrieved * @param defaultValue Default value to be returned if nothing found in shared preferences - * @return boolean value for given key saved in shared preferences + * @return Boolean value for given key saved in shared preferences */ private synchronized boolean getBoolean(final String key, final boolean defaultValue) { try { From 1a3b0b53ec67de545bfdaa050b1c0f2ab2c6cc68 Mon Sep 17 00:00:00 2001 From: Obaied Date: Tue, 28 Nov 2017 14:49:31 +0100 Subject: [PATCH 118/146] Update makeJar task --- Adjust/adjust/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/adjust/build.gradle b/Adjust/adjust/build.gradle index 5b21d476c..1681824ec 100644 --- a/Adjust/adjust/build.gradle +++ b/Adjust/adjust/build.gradle @@ -25,7 +25,7 @@ task clearJar(type: Delete) { } task makeJar(type: Copy) { - from('build/intermediates/bundles/default/') + from('build/intermediates/bundles/debug/') into('build/outputs/') include('classes.jar') rename ('classes.jar', "adjust-${getVersionName()}.jar") From c2090eea0d0dbf2c409dab7cbb481a9e44431029 Mon Sep 17 00:00:00 2001 From: Obaied Date: Tue, 28 Nov 2017 15:31:25 +0100 Subject: [PATCH 119/146] add makeDebugJar and makeReleaseJar tasks instead of makeJar --- Adjust/adjust/build.gradle | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Adjust/adjust/build.gradle b/Adjust/adjust/build.gradle index 1681824ec..d1e3f29b6 100644 --- a/Adjust/adjust/build.gradle +++ b/Adjust/adjust/build.gradle @@ -20,19 +20,24 @@ dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) } -task clearJar(type: Delete) { - delete "build/outputs/adjust-${getVersionName()}.jar" +task makeReleaseJar(type: Copy) { + dependsOn 'build' + + from('build/intermediates/bundles/release/') + into('build/outputs/') + include('classes.jar') + rename ('classes.jar', "adjust-${getVersionName()}-release.jar") } -task makeJar(type: Copy) { +task makeDebugJar(type: Copy) { + dependsOn 'build' + from('build/intermediates/bundles/debug/') into('build/outputs/') include('classes.jar') - rename ('classes.jar', "adjust-${getVersionName()}.jar") + rename ('classes.jar', "adjust-${getVersionName()}-debug.jar") } -makeJar.dependsOn(clearJar, build) - task androidJavadocs(type: Javadoc) { source = android.sourceSets.main.java.srcDirs } From 03ab44d69966bfec3b993ddae948b5dcc2e0789f Mon Sep 17 00:00:00 2001 From: easteracrobat Date: Wed, 29 Nov 2017 11:26:30 +0100 Subject: [PATCH 120/146] current-install-to-current-attribution --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 6184e8996..3e684b3d6 100644 --- a/README.md +++ b/README.md @@ -586,13 +586,13 @@ Adjust.onCreate(config); The listener function will be called after the SDK receives the final attribution data. Within the listener function you have access to the `attribution` parameter. Here is a quick summary of its properties: -- `String trackerToken` the tracker token of the current install. -- `String trackerName` the tracker name of the current install. -- `String network` the network grouping level of the current install. -- `String campaign` the campaign grouping level of the current install. -- `String adgroup` the ad group grouping level of the current install. -- `String creative` the creative grouping level of the current install. -- `String clickLabel` the click label of the current install. +- `String trackerToken` the tracker token of the current attribution. +- `String trackerName` the tracker name of the current attribution. +- `String network` the network grouping level of the current attribution. +- `String campaign` the campaign grouping level of the current attribution. +- `String adgroup` the ad group grouping level of the current attribution. +- `String creative` the creative grouping level of the current attribution. +- `String clickLabel` the click label of the current attribution. - `String adid` the adjust device identifier. If any value is unavailable, it will default to `null`. From 4632e6c991a3f6c93f7bd6d314e995c6095d0bc5 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 29 Nov 2017 18:06:31 +0100 Subject: [PATCH 121/146] Check for saved referrers after enabled --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 8 ++++++++ 1 file changed, 8 insertions(+) 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 197a02dd4..9c243e42d 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1184,16 +1184,24 @@ private void setEnabledI(boolean enabled) { if (enabled) { SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext()); + // check if install was tracked if (!sharedPreferencesManager.getInstallTracked()) { long now = System.currentTimeMillis(); trackNewSessionI(now); } + // check if there is a saved push token to send String pushToken = sharedPreferencesManager.getPushToken(); if (pushToken != null && !pushToken.equals(activityState.pushToken)) { setPushToken(pushToken, true); } + + // check if there are token to send + Object referrers = sharedPreferencesManager.getRawReferrerArray(); + if (referrers != null) { + sendReftagReferrer(); + } } activityState.enabled = enabled; From 4410c58220749694a93883ee5ed4dbeede086633 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 1 Dec 2017 17:17:42 +0100 Subject: [PATCH 122/146] Fix install referrer order of compare --- .../src/main/java/com/adjust/sdk/ActivityHandler.java | 10 +++++++--- 1 file changed, 7 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 9c243e42d..bbb6f2fa2 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1296,9 +1296,13 @@ private void sendInstallReferrerI(final long clickTime, final long installBegin, return; } - if (activityState.clickTime == clickTime - && activityState.installBegin == installBegin - && activityState.installReferrer.equals(installReferrer)) { + if (installReferrer == null) { + return; + } + + if (clickTime == activityState.clickTime + && installBegin == activityState.installBegin + && installReferrer == activityState.installReferrer) { // Same click already sent before, nothing to be done. return; } From 182cd47f32cd89a97983282b240b3af04ebaaf0e Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 4 Dec 2017 13:57:02 +0100 Subject: [PATCH 123/146] Add new referrer API dependency to example app --- Adjust/example/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/Adjust/example/build.gradle b/Adjust/example/build.gradle index ca2e7324f..eb8764232 100644 --- a/Adjust/example/build.gradle +++ b/Adjust/example/build.gradle @@ -33,4 +33,5 @@ dependencies { releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4' testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4' + compile 'com.android.installreferrer:installreferrer:1.0' } From f49525c6d52ec6759ea8ec4889d992e556c0625f Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 4 Dec 2017 13:57:17 +0100 Subject: [PATCH 124/146] Referrers comparison change --- Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 bbb6f2fa2..be3097f7c 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java @@ -1302,7 +1302,7 @@ private void sendInstallReferrerI(final long clickTime, final long installBegin, if (clickTime == activityState.clickTime && installBegin == activityState.installBegin - && installReferrer == activityState.installReferrer) { + && installReferrer.equals(activityState.installReferrer)) { // Same click already sent before, nothing to be done. return; } From 34d08cb0e158c2eab6996feead965cf02999ff39 Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 5 Dec 2017 16:10:03 +0100 Subject: [PATCH 125/146] Send Imei separately --- .../java/com/adjust/sdk/PackageBuilder.java | 9 +++-- .../main/java/com/adjust/sdk/Reflection.java | 11 ------ .../src/main/java/com/adjust/sdk/Util.java | 13 +++++-- .../plugin/MobileEquipmentIdentityUtil.java | 34 ------------------- Adjust/example/src/main/AndroidManifest.xml | 5 ++- 5 files changed, 22 insertions(+), 50 deletions(-) delete mode 100644 Adjust/adjust/src/main/java/com/adjust/sdk/plugin/MobileEquipmentIdentityUtil.java 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 73427aea9..28cfc3236 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -10,6 +10,8 @@ package com.adjust.sdk; import android.content.ContentResolver; +import android.content.Context; +import android.telephony.TelephonyManager; import android.text.TextUtils; import org.json.JSONObject; @@ -273,8 +275,11 @@ private void injectConfig(Map parameters) { PackageBuilder.addString(parameters, "secret_id", adjustConfig.secretId); PackageBuilder.addString(parameters, "app_secret", adjustConfig.appSecret); if (adjustConfig.readMobileEquipmentIdentity) { - String mobileEquipmentId = Util.getMobileEquipmentIdentity(adjustConfig.context); - PackageBuilder.addString(parameters, "mobile_equipment_id", mobileEquipmentId); + TelephonyManager telephonyManager = (TelephonyManager)adjustConfig.context.getSystemService(Context.TELEPHONY_SERVICE); + + PackageBuilder.addString(parameters, "device_id", Util.getTelephonyId(telephonyManager)); + PackageBuilder.addString(parameters, "IMEI", Util.getIMEI(telephonyManager)); + PackageBuilder.addString(parameters, "MEID", Util.getMEID(telephonyManager)); } } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Reflection.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Reflection.java index c58c5d456..3d9ae5e3d 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Reflection.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Reflection.java @@ -89,17 +89,6 @@ public static String getAndroidId(Context context) { } } - public static String getMobileEquipmentIdentity(Context context) { - try { - String mobileEquipmentIdentity = (String) invokeStaticMethod("com.adjust.sdk.plugin.MobileEquipmentIdentityUtil", "getMobileEquipmentIdentity" - , new Class[]{Context.class}, context); - - return mobileEquipmentIdentity; - } catch (Throwable t) { - return null; - } - } - public static String getLinkIMEI(TelephonyManager telephonyManager) { // return telephonyManager.getImei(); try { diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java index a45eaa41a..4f0652a3f 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java @@ -126,8 +126,17 @@ public static Map getPluginKeys(Context context) { public static String getAndroidId(Context context) { return Reflection.getAndroidId(context); } - public static String getMobileEquipmentIdentity(Context context) { - return Reflection.getMobileEquipmentIdentity(context); + + public static String getTelephonyId(TelephonyManager telephonyManager) { + return Reflection.getTelephonyId(telephonyManager); + } + + public static String getIMEI(TelephonyManager telephonyManager) { + return Reflection.getLinkIMEI(telephonyManager); + } + + public static String getMEID(TelephonyManager telephonyManager) { + return Reflection.getLinkMEID(telephonyManager); } public static T readObject(Context context, String filename, String objectName, Class type) { diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/plugin/MobileEquipmentIdentityUtil.java b/Adjust/adjust/src/main/java/com/adjust/sdk/plugin/MobileEquipmentIdentityUtil.java deleted file mode 100644 index 11a0576d1..000000000 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/plugin/MobileEquipmentIdentityUtil.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.adjust.sdk.plugin; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.telephony.TelephonyManager; -import android.util.Log; - -import com.adjust.sdk.Reflection; - -/** - * Created by nonelse on 06.11.17. - */ - -public class MobileEquipmentIdentityUtil { - public static String getMobileEquipmentIdentity(Context context) { - TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); - - String mobileEquipmentIdentity = null; - - mobileEquipmentIdentity = Reflection.getLinkIMEI(telephonyManager); - if (mobileEquipmentIdentity != null) { - return mobileEquipmentIdentity; - } - - mobileEquipmentIdentity = Reflection.getLinkMEID(telephonyManager); - if (mobileEquipmentIdentity != null) { - return mobileEquipmentIdentity; - } - - mobileEquipmentIdentity = Reflection.getTelephonyId(telephonyManager); - - return mobileEquipmentIdentity; - } -} diff --git a/Adjust/example/src/main/AndroidManifest.xml b/Adjust/example/src/main/AndroidManifest.xml index aea0cb032..5f8b78ad2 100644 --- a/Adjust/example/src/main/AndroidManifest.xml +++ b/Adjust/example/src/main/AndroidManifest.xml @@ -6,15 +6,18 @@ + + + + android:exported="true" > From 9ce9d8f8c9a1b11686544291f1b53ce5afaea04b Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 5 Dec 2017 16:32:04 +0100 Subject: [PATCH 126/146] Lower the case --- .../adjust/src/main/java/com/adjust/sdk/PackageBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 28cfc3236..4e6b65e86 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -278,8 +278,8 @@ private void injectConfig(Map parameters) { TelephonyManager telephonyManager = (TelephonyManager)adjustConfig.context.getSystemService(Context.TELEPHONY_SERVICE); PackageBuilder.addString(parameters, "device_id", Util.getTelephonyId(telephonyManager)); - PackageBuilder.addString(parameters, "IMEI", Util.getIMEI(telephonyManager)); - PackageBuilder.addString(parameters, "MEID", Util.getMEID(telephonyManager)); + PackageBuilder.addString(parameters, "imei", Util.getIMEI(telephonyManager)); + PackageBuilder.addString(parameters, "meid", Util.getMEID(telephonyManager)); } } From e6ec1ec30e66981ee9282d3bd860b64d409d6d54 Mon Sep 17 00:00:00 2001 From: nonelse Date: Mon, 11 Dec 2017 16:20:10 +0100 Subject: [PATCH 127/146] Send first positions of imei and meid --- .../java/com/adjust/sdk/PackageBuilder.java | 4 ++-- .../main/java/com/adjust/sdk/Reflection.java | 24 +++++++++++++++++-- .../src/main/java/com/adjust/sdk/Util.java | 13 ++++++++-- 3 files changed, 35 insertions(+), 6 deletions(-) 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 4e6b65e86..37182bddc 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -278,8 +278,8 @@ private void injectConfig(Map parameters) { TelephonyManager telephonyManager = (TelephonyManager)adjustConfig.context.getSystemService(Context.TELEPHONY_SERVICE); PackageBuilder.addString(parameters, "device_id", Util.getTelephonyId(telephonyManager)); - PackageBuilder.addString(parameters, "imei", Util.getIMEI(telephonyManager)); - PackageBuilder.addString(parameters, "meid", Util.getMEID(telephonyManager)); + PackageBuilder.addString(parameters, "imei", Util.getIMEI(telephonyManager, 0)); + PackageBuilder.addString(parameters, "meid", Util.getMEID(telephonyManager, 0)); } } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Reflection.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Reflection.java index 3d9ae5e3d..5cd7cb336 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Reflection.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Reflection.java @@ -89,7 +89,7 @@ public static String getAndroidId(Context context) { } } - public static String getLinkIMEI(TelephonyManager telephonyManager) { + public static String getImei(TelephonyManager telephonyManager) { // return telephonyManager.getImei(); try { return (String) invokeInstanceMethod(telephonyManager, "getImei", null); @@ -98,7 +98,17 @@ public static String getLinkIMEI(TelephonyManager telephonyManager) { } } - public static String getLinkMEID(TelephonyManager telephonyManager) { + public static String getImei(TelephonyManager telephonyManager, int index) { + // return telephonyManager.getImei(); + try { + return (String) invokeInstanceMethod(telephonyManager, "getImei", new Class[]{int.class}, index); + } catch (Exception e) { + return null; + } + } + + + public static String getMeid(TelephonyManager telephonyManager) { // return telephonyManager.getMeid(); try { return (String) invokeInstanceMethod(telephonyManager, "getMeid", null); @@ -107,6 +117,16 @@ public static String getLinkMEID(TelephonyManager telephonyManager) { } } + public static String getMeid(TelephonyManager telephonyManager, int index) { + // return telephonyManager.getMeid(); + try { + return (String) invokeInstanceMethod(telephonyManager, "getMeid", new Class[]{int.class}, index); + } catch (Exception e) { + return null; + } + } + + public static String getTelephonyId(TelephonyManager telephonyManager) { // return telephonyManager.getDeviceId(); try { diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java index 4f0652a3f..c7afef081 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java @@ -132,13 +132,22 @@ public static String getTelephonyId(TelephonyManager telephonyManager) { } public static String getIMEI(TelephonyManager telephonyManager) { - return Reflection.getLinkIMEI(telephonyManager); + return Reflection.getImei(telephonyManager); } public static String getMEID(TelephonyManager telephonyManager) { - return Reflection.getLinkMEID(telephonyManager); + return Reflection.getMeid(telephonyManager); } + public static String getIMEI(TelephonyManager telephonyManager, int index) { + return Reflection.getImei(telephonyManager, index); + } + + public static String getMEID(TelephonyManager telephonyManager, int index) { + return Reflection.getMeid(telephonyManager, index); + } + + public static T readObject(Context context, String filename, String objectName, Class type) { Closeable closable = null; T object = null; From 5207892dc4d87669375624cd59dec31d3e783ec9 Mon Sep 17 00:00:00 2001 From: horie1024 Date: Fri, 18 Aug 2017 14:22:54 +0900 Subject: [PATCH 128/146] fix typo --- doc/japanese/pre_install_tracker_tool_ja.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/japanese/pre_install_tracker_tool_ja.md b/doc/japanese/pre_install_tracker_tool_ja.md index f41ca2c71..464e62028 100644 --- a/doc/japanese/pre_install_tracker_tool_ja.md +++ b/doc/japanese/pre_install_tracker_tool_ja.md @@ -79,7 +79,7 @@ Android Studioから署名されたAPKをエクスポートする場合は、カ `adjust-dtt`ツールを使うには、デフォルトのデバッグ署名用キーストアかカスタムキーストアのいずれかにアクセスできる必要があります。`apktool`はAPKの展開に使われた後、APKからすべての署名を完全に消去しますので、APKが再圧縮されても編集や署名は復活しません。そのため、Android端末に転送し端末上で使えるようにするためには、`jarsigner`ツールを使い署名情報を渡してAPKに署名をし直す必要があります。 -すべての設定が済めば、あとはプレインストールのアプリとそのトークンのためのデフォルトととして使うトラッカーをダッシュボード上で生成するのみです。 +すべての設定が済めば、あとはプレインストールのアプリとそのトークンのためのデフォルトとして使うトラッカーをダッシュボード上で生成するのみです。 プレインストールトラッカーの設定には、`adjust-config.yaml`コンフィグファイルを生成し、アプリを公開したいストアごとの設定を記入する必要があります。 From cf12a4d2f8805c18340c83771787f14067a2ce52 Mon Sep 17 00:00:00 2001 From: Juan Date: Fri, 10 Nov 2017 12:35:26 +0100 Subject: [PATCH 129/146] Update AdjustReferrerReceiver.java --- .../src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java index c2d4aa1ec..f5837f303 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustReferrerReceiver.java @@ -8,7 +8,7 @@ import static com.adjust.sdk.Constants.REFERRER; // support multiple BroadcastReceivers for the INSTALL_REFERRER: -// http://blog.appington.com/2012/08/01/giving-credit-for-android-app-installs +// https://appington.wordpress.com/2012/08/01/giving-credit-for-android-app-installs/ public class AdjustReferrerReceiver extends BroadcastReceiver { @Override From 3b1e24432a69c889e17d5369806cdcc711f10896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Mon, 11 Dec 2017 20:21:25 +0100 Subject: [PATCH 130/146] Update CHANGELOG.md --- CHANGELOG.md | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7021b373b..77ca036a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,22 +1,25 @@ -### Version 4.12.0 (Xth November 2017) +### Version 4.12.0 (12th December 2017) #### Added -- Get amazon/fire ad id -- Allow to read mobile equipment identity for non-google play store apps -- Use of secret in authorization header -- Sending referrer without previously being decoded -- Send mcc, mnc, network and connectivity type +- Added `Adjust.getAmazonAdId()` method to obtain value of Amazon Advertising Identifier. +- Added possibility to read Mobile Equipment Identity for non Google Play store apps. +- Added usage of app secret in authorization header. +- Added sending of `raw_referrer` parameter in `sdk_click` package. +- Added reading of MCC. +- Added reading of MNC. +- Added reading of network type. +- Added reading of connectivity type. +- Added log messages for saved actions to be done when the SDK starts. #### Changed -- Don't send `sdk_click` and `sdk_info` packages when disabled -- Setting enable/disable or offline/online is now queued -- Guarantee that first package is send even with buffering -- Disable before starting the sdk does not create and send first session package -- Reload reading device ids for every package, not just at beginning -- Save referrer in local storage and send it only after first session -- Save push token in local storage and send it only after first session -- Log message for saved actions to be done when the sdk starts +- Not sending `sdk_click` and `sdk_info` packages when SDK is disabled. +- Setting enable/disable or offline/online is now queued. +- Guaranteeing that first package is sent even with event buffering turned ON. +- Not creating first session package if SDK is disabled before first launch. +- Saving referrer in local storage and send it only after first session. +- Saving push token in local storage and send it only after first session. --- + ### Version 4.11.4 (5th May 2017) #### Added - Added check if `sdk_click` package response contains attribution information. From 06380d2307350e37b16df1815e38a2b0372e1ab8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Mon, 11 Dec 2017 20:23:23 +0100 Subject: [PATCH 131/146] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77ca036a3..3bb0957d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ### Version 4.12.0 (12th December 2017) #### Added +- Added support for new Google referrer API (https://developer.android.com/google/play/installreferrer/library.html). - Added `Adjust.getAmazonAdId()` method to obtain value of Amazon Advertising Identifier. - Added possibility to read Mobile Equipment Identity for non Google Play store apps. - Added usage of app secret in authorization header. From 895ccc4bb524164c14da2a9139d7b06f12b81520 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Tue, 12 Dec 2017 07:41:15 +0100 Subject: [PATCH 132/146] Update README.md --- README.md | 242 ++++++++++++++++++++++++------------------------------ 1 file changed, 108 insertions(+), 134 deletions(-) diff --git a/README.md b/README.md index 3e684b3d6..0da9e1a10 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,14 @@ ## Summary -This is the Android SDK of adjust™. You can read more about adjust™ at [adjust.com]. +This is the Android SDK of Adjust™. You can read more about Adjust™ at [adjust.com]. -If your app is an app which uses web views and you would like to use adjust tracking from Javascript code, please consult +If your app is an app which uses web views and you would like to use Adjust tracking from Javascript code, please consult our [Android web views SDK guide](doc/english/web_views.md). ## Table of contents * [Example app](#example-app) * [Basic integration](#basic-integration) - * [Get the SDK](#sdk-get) - * [Import the Adjust module](#sdk-import) * [Add the SDK to your project](#sdk-add) * [Add Google Play Services](#sdk-gps) * [Add permissions](#sdk-permissions) @@ -20,7 +18,7 @@ our [Android web views SDK guide](doc/english/web_views.md). * [Basic setup](#basic-setup) * [Session tracking](#session-tracking) * [API level 14 and higher](#session-tracking-api14) - * [API level 9 until 13](#session-tracking-api9) + * [API level between 9 and 13](#session-tracking-api9) * [Adjust logging](#adjust-logging) * [Build your app](#build-the-app) * [Additional features](#additional-features) @@ -42,7 +40,7 @@ our [Android web views SDK guide](doc/english/web_views.md). * [Background tracking](#background-tracking) * [Device IDs](#device-ids) * [Google Play Services advertising identifier](#di-gps-adid) - * [Amazon Fire advertising identifier](#di-amz-adid) + * [Amazon advertising identifier](#di-amz-adid) * [Adjust device identifier](#di-adid) * [User attribution](#user-attribution) * [Push token](#push-token) @@ -59,63 +57,39 @@ our [Android web views SDK guide](doc/english/web_views.md). ## Example app -There is an example app inside the [`example` directory][example]. You can open the Android project to see an example on how the adjust SDK can be integrated. +There is an example app inside the [`example` directory][example]. You can open the Android project to see an example on how the Adjust SDK can be integrated. ## Basic integration -These are the minimal steps required to integrate the adjust SDK into your Android project. We are going to assume that you use Android Studio for your Android development and target an Android API level 9 (Gingerbread) or later. +These are the minimal steps required to integrate the Adjust SDK into your Android project. We are going to assume that you use Android Studio for your Android development and target an Android API level 9 (Gingerbread) or later. If you're using the [Maven Repository][maven] you can start with [this step](#sdk-add). -### Get the SDK - -Download the latest version from our [releases page][releases]. Extract the archive in a folder of your choice. - -### Import the Adjust module - -In the Android Studio menu select `File → Import Module...`. - -![][import_module] - -In the `Source directory` field, locate the folder you extracted in step 1. Select and choose the folder `./android_sdk/Adjust/adjust`. Make sure the module name `:adjust` appears before finishing. - -![][select_module] - -The `adjust` module should be imported into your Android Studio project afterwards. - -![][imported_module] - ### Add the SDK to your project -Open the `build.gradle` file of your app and find the `dependencies` block. Add the following line: +If you are using Maven, add following to yout `build.gradle` file: ``` -compile project(":adjust") +compile 'com.adjust.sdk:adjust-android:4.12.0' +compile 'com.android.installreferrer:installreferrer:1.0' ``` -![][gradle_adjust] +**Note**: If you are using `Gradle 3.0.0 or above`, make sure to use the `implementation` keyword instead of `compile` as follows: -If you are using Maven, add this line instead: - -``` -compile 'com.adjust.sdk:adjust-android:4.12.0' ``` -** -Note: If you are using Gradle 3.0.x, make sure to use the `implementation` keyword instead of `compile` as follows: - +implementation 'com.adjust.sdk:adjust-android:4.12.0' +implementation 'com.android.installreferrer:installreferrer:1.0' ``` -implementation project(":adjust") -// OR +The applies for adding Google Play Services dependency to your `build.gradle` file. -implementation 'com.adjust.sdk:adjust-android:4.12.0' -``` +--- -The same goes for the step below when adding Google Play Services. +You can as well add Adjust SDK to your project as JAR library. Latest SDK version JAR library can be found in our [releases page][releases]. ### Add Google Play Services -Since the 1st of August of 2014, apps in the Google Play Store must use the [Google Advertising ID][google_ad_id] to uniquely identify devices. To allow the adjust SDK to use the Google Advertising ID, you must integrate the [Google Play Services][google_play_services]. If you haven't done this yet, follow these steps: +Since the 1st of August of 2014, apps in the Google Play Store must use the [Google Advertising ID][google_ad_id] to uniquely identify devices. To allow the Adjust SDK to use the Google Advertising ID, you must integrate the [Google Play Services][google_play_services]. If you haven't done this yet, follow these steps: 1. Open the `build.gradle` file of your app and find the `dependencies` block. Add the following line: @@ -124,6 +98,9 @@ Since the 1st of August of 2014, apps in the Google Play Store must use the [Goo ``` ![][gradle_gps] + + **Note**: Adjust SDK is not tied to any specific version of `play-services-analytics` part of Google Play Services + library, so feel free to always use latest version of it (or the one you might specially need for some reason). 2. **Skip this step if you are using version 7 or later of Google Play Services**: In the Package Explorer open the `AndroidManifest.xml` of your Android @@ -135,25 +112,21 @@ Since the 1st of August of 2014, apps in the Google Play Store must use the [Goo android:value="@integer/google_play_services_version" /> ``` - ![][manifest_gps] - ### Add permissions -In the Package Explorer open the `AndroidManifest.xml` of your Android project. Add the `uses-permission` tag for `INTERNET` if it's not present already. +Please add following permissions which Adjust SDK needs if they are not already present in your `AndroidManifest.xml` file: ```xml - + + ``` -If you are **not targeting the Google Play Store**, add both of these permissions instead: +If you are **not targeting the Google Play Store**, please add following permission as well: ```xml - - + ``` -![][manifest_permissions] - ### Proguard settings If you are using Proguard, add these lines to your Proguard file: @@ -208,6 +181,12 @@ We use this broadcast receiver to retrieve the install referrer, in order to imp If you are already using a different broadcast receiver for the `INSTALL_REFERRER` intent, follow [these instructions][referrer] to add the Adjust broadcast receiver. +**Note**: Receiving referrer information via `INSTALL_REFERRER` intent is part of old Google referrer mechanism which got replaced with [new Google referrer API][new-referrer-api]. It is strongly advised to add support for new API which significantly improves security of the referrer information being delivered into the app and also helps attribution providers to fight click injection in more efficient way. In order to have this supported in your app, please make sure that you have followed [Add the SDK to your project][#sdk-add] chapter properly and that you have following line added to your `build.gradle` file: + +``` +compile 'com.android.installreferrer:installreferrer:1.0' +``` + ### Integrate the SDK into your app To start with, we'll set up basic session tracking. @@ -233,7 +212,7 @@ We recommend using a global android [Application][android_application] class to ![][manifest_application] -4. In your `Application` class find or create the `onCreate` method and add the following code to initialize the adjust SDK: +4. In your `Application` class find or create the `onCreate` method and add the following code to initialize the Adjust SDK: ```java import com.adjust.sdk.Adjust; @@ -254,30 +233,26 @@ We recommend using a global android [Application][android_application] class to ![][application_config] - Replace `{YourAppToken}` with your app token. You can find this in your - [dashboard]. + Replace `{YourAppToken}` with your app token. You can find this in your [dashboard]. - Depending on whether you build your app for testing or for production, you must - set `environment` with one of these values: + Depending on whether you build your app for testing or for production, you must set `environment` with one of these + values: ```java String environment = AdjustConfig.ENVIRONMENT_SANDBOX; String environment = AdjustConfig.ENVIRONMENT_PRODUCTION; ``` - **Important:** This value should be set to `AdjustConfig.ENVIRONMENT_SANDBOX` - if and only if you or someone else is testing your app. Make sure to set the - environment to `AdjustConfig.ENVIRONMENT_PRODUCTION` just before you publish - the app. Set it back to `AdjustConfig.ENVIRONMENT_SANDBOX` when you start - developing and testing it again. + **Important:** This value should be set to `AdjustConfig.ENVIRONMENT_SANDBOX` if and only if you or someone else is + testing your app. Make sure to set the environment to `AdjustConfig.ENVIRONMENT_PRODUCTION` just before you publish the + app. Set it back to `AdjustConfig.ENVIRONMENT_SANDBOX` when you start developing and testing it again. - We use this environment to distinguish between real traffic and test traffic - from test devices. It is very important that you keep this value meaningful at - all times! This is especially important if you are tracking revenue. + We use this environment to distinguish between real traffic and test traffic from test devices. It is very important that + you keep this value meaningful at all times! This is especially important if you are tracking revenue. ### Session tracking -**Note**: This step is **really important** and please **make sure that you implement it properly in your app**. By implementing it, you will enable proper session tracking by the adjust SDK in your app. +**Note**: This step is **really important** and please **make sure that you implement it properly in your app**. By implementing it, you will enable proper session tracking by the Adjust SDK in your app. ### API level 14 and higher @@ -290,7 +265,7 @@ We recommend using a global android [Application][android_application] class to ![][activity_lifecycle_methods] -3. Add on the `onCreate()` method where the adjust SDK is configured and add call `registerActivityLifecycleCallbacks` with an instance of the created `ActivityLifecycleCallbacks` class. +3. Add on the `onCreate()` method where the Adjust SDK is configured and add call `registerActivityLifecycleCallbacks` with an instance of the created `ActivityLifecycleCallbacks` class. ```java import com.adjust.sdk.Adjust; @@ -329,16 +304,16 @@ We recommend using a global android [Application][android_application] class to ![][activity_lifecycle_register] -### API level 9 until 13 +### API level between 9 and 13 If your app `minSdkVersion` in gradle is between `9` and `13`, consider updating it to at least `14` to simplify the integration process in the long term. Consult the official Android [dashboard][android-dashboard] to know the latest market share of the major versions. -To provide proper session tracking it is required to call certain adjust SDK methods every time any Activity resumes or pauses. Otherwise the SDK might miss a session start or session end. In order to do so you should **follow these steps for each Activity of your app**: +To provide proper session tracking it is required to call certain Adjust SDK methods every time any Activity resumes or pauses. Otherwise the SDK might miss a session start or session end. In order to do so you should **follow these steps for each Activity of your app**: 1. Open the source file of your Activity. 2. Add the `import` statement at the top of the file. -3. In your Activity's `onResume` method call `Adjust.onResume`. Create the method if needed. -4. In your Activity's `onPause` method call `Adjust.onPause`. Create the method if needed. +3. In your Activity's `onResume` method call `Adjust.onResume()`. Create the method if needed. +4. In your Activity's `onPause` method call `Adjust.onPause()`. Create the method if needed. After these steps your activity should look like this: @@ -396,9 +371,9 @@ Build and run your Android app. In your `LogCat` viewer you can set the filter ` ## Additional Features -Once you have integrated the adjust SDK into your project, you can take advantage of the following features. +Once you have integrated the Adjust SDK into your project, you can take advantage of the following features. -### Event tracking +### Event tracking You can use adjust to track any event in your app. Suppose you want to track every tap on a button. You would have to create a new event token in your [dashboard]. Let's say that event token is `abc123`. In your button's `onClick` method you could then add the following lines to track the click: @@ -407,7 +382,7 @@ AdjustEvent event = new AdjustEvent("abc123"); Adjust.trackEvent(event); ``` -### Revenue tracking +### Revenue tracking If your users can generate revenue by tapping on advertisements or making In-App Purchases you can track those revenues with events. Lets say a tap is worth one Euro cent. You could then track the revenue event like this: @@ -419,17 +394,15 @@ Adjust.trackEvent(event); This can be combined with callback parameters of course. -When you set a currency token, adjust will automatically convert the incoming revenues into a reporting revenue of your choice. Read more about [currency conversion here.][currency-conversion] - -You can read more about revenue and event tracking in the [event tracking guide.][event-tracking] +When you set a currency token, Adjust will automatically convert the incoming revenues into a reporting revenue of your choice. Read more about [currency conversion here][currency-conversion]. -The event instance can be used to configure the event further before tracking it: +You can read more about revenue and event tracking in the [event tracking guide][event-tracking]. -### Revenue deduplication +### Revenue deduplication You can also add an optional order ID to avoid tracking duplicate revenues. The last ten order IDs are remembered, and revenue events with duplicate order IDs are skipped. This is especially useful for In-App Purchase tracking. You can see an example below. -If you want to track in-app purchases, please make sure to call the `trackEvent` only if the purchase is finished and item is purchased. That way you can avoid tracking revenue that is not actually being generated. +If you want to track In-App purchases, please make sure to call the `trackEvent` only if the purchase is finished and item is purchased. That way you can avoid tracking revenue that is not actually being generated. ```java AdjustEvent event = new AdjustEvent("abc123"); @@ -440,11 +413,11 @@ event.setOrderId("{OrderId}"); Adjust.trackEvent(event); ``` -### In-App Purchase verification +### In-App Purchase verification -If you want to check the validity of In-App Purchases made in your app using Purchase Verification, adjust's server side receipt verification tool, then check out our Android purchase SDK to read more about it [here][android-purchase-verification]. +If you want to check the validity of In-App Purchases made in your app using Purchase Verification, Adjust's server side receipt verification tool, then check out our Android purchase SDK to read more about it [here][android-purchase-verification]. -### Callback parameters +### Callback parameters You can register a callback URL for your events in your [dashboard]. We will send a GET request to that URL whenever the event is tracked. You can add callback parameters to that event by calling `addCallbackParameter` to the event instance before tracking it. We will then append these parameters to your callback URL. @@ -465,13 +438,13 @@ In that case we would track the event and send a request to: http://www.adjust.com/callback?key=value&foo=bar ``` -It should be mentioned that we support a variety of placeholders like `{gps_adid}` that can be used as parameter values. In the resulting callback this placeholder would be replaced with the Google Play Services ID of the current device. Also note that we don't store any of your custom parameters, but only append them to your callbacks. If you haven't registered a callback for an event, these parameters won't even be read. +It should be mentioned that we support a variety of placeholders like `{gps_adid}` that can be used as parameter values. In the resulting callback this placeholder would be replaced with the Google Play Services ID of the current device. Also note that we don't store any of your custom parameters, but only append them to your callbacks. If you haven't registered a callback for an event, these parameters won't even be read. You can read more about using URL callbacks, including a full list of available values, in our [callbacks guide][callbacks-guide]. -### Partner parameters +### Partner parameters -You can also add parameters to be transmitted to network partners, which have been activated in your adjust dashboard. +You can also add parameters to be transmitted to network partners, which have been activated in your Adjust dashboard. This works similarly to the callback parameters mentioned above, but can be added by calling the `addPartnerParameter` method on your `AdjustEvent` instance. @@ -486,15 +459,15 @@ Adjust.trackEvent(event); You can read more about special partners and these integrations in our [guide to special partners][special-partners]. -### Set up session parameters +### Set up session parameters -Some parameters are saved to be sent in every event and session of the adjust SDK. Once you have added any of these parameters, you don't need to add them every time, since they will be saved locally. If you add the same parameter twice, there will be no effect. +Some parameters are saved to be sent in every **event** and **session** of the Adjust SDK. Once you have added any of these parameters, you don't need to add them every time, since they will be saved locally. If you add the same parameter twice, there will be no effect. -These session parameters can be called before the adjust SDK is launched to make sure they are sent even on install. If you need to send them with an install, but can only obtain the needed values after launch, it's possible to [delay](#delay-start) the first launch of the adjust SDK to allow this behaviour. +These session parameters can be called before the Adjust SDK is launched to make sure they are sent even on install. If you need to send them with an install, but can only obtain the needed values after launch, it's possible to [delay](#delay-start) the first launch of the Adjust SDK to allow this behaviour. -### Session callback parameters +### Session callback parameters -The same callback parameters that are registered for [events](#callback-parameters) can be also saved to be sent in every event or session of the adjust SDK. +The same callback parameters that are registered for [events](#callback-parameters) can be also saved to be sent in every event or session of the Adjust SDK. The session callback parameters have a similar interface to the event callback parameters. Instead of adding the key and it's value to an event, it's added through a call to `Adjust.addSessionCallbackParameter(String key, String value)`: @@ -516,11 +489,11 @@ If you wish to remove all keys and their corresponding values from the session c Adjust.resetSessionCallbackParameters(); ``` -### Session partner parameters +### Session partner parameters -In the same way that there are [session callback parameters](#session-callback-parameters) sent in every event or session of the adjust SDK, there is also session partner parameters. +In the same way that there are [session callback parameters](#session-callback-parameters) sent in every event or session of the Adjust SDK, there is also session partner parameters. -These will be transmitted to network partners, for the integrations that have been activated in your adjust [dashboard]. +These will be transmitted to network partners, for the integrations that have been activated in your Adjust [dashboard]. The session partner parameters have a similar interface to the event partner parameters. Instead of adding the key and it's value to an event, it's added through a call to `Adjust.addSessionPartnerParameter(String key, String value)`: @@ -542,9 +515,9 @@ If you wish to remove all keys and their corresponding values from the session p Adjust.resetSessionPartnerParameters(); ``` -### Delay start +### Delay start -Delaying the start of the adjust SDK allows your app some time to obtain session parameters, such as unique identifiers, to be sent on install. +Delaying the start of the Adjust SDK allows your app some time to obtain session parameters, such as unique identifiers, to be sent on install. Set the initial delay time in seconds with the method `setDelayStart` in the `AdjustConfig` instance: @@ -552,9 +525,9 @@ Set the initial delay time in seconds with the method `setDelayStart` in the `Ad adjustConfig.setDelayStart(5.5); ``` -In this case, this will make the adjust SDK not send the initial install session and any event created for 5.5 seconds. After this time is expired or if you call `Adjust.sendFirstPackages()` in the meanwhile, every session parameter will be added to the delayed install session and events and the adjust SDK will resume as usual. +In this case, this will make the Adjust SDK not send the initial install session and any event created for 5.5 seconds. After this time is expired or if you call `Adjust.sendFirstPackages()` in the meanwhile, every session parameter will be added to the delayed install session and events and the Adjust SDK will resume as usual. -The maximum delay start time of the adjust SDK is 10 seconds. +**The maximum delay start time of the adjust SDK is 10 seconds**. ### Attribution callback @@ -593,7 +566,7 @@ The listener function will be called after the SDK receives the final attributio - `String adgroup` the ad group grouping level of the current attribution. - `String creative` the creative grouping level of the current attribution. - `String clickLabel` the click label of the current attribution. -- `String adid` the adjust device identifier. +- `String adid` the Adjust device identifier. If any value is unavailable, it will default to `null`. @@ -643,7 +616,7 @@ The listener function will be called after the SDK tries to send a package to th - `String message` the message from the server or the error logged by the SDK. - `String timestamp` timestamp from the server. -- `String adid` a unique device identifier provided by adjust. +- `String adid` a unique device identifier provided by Adjust. - `JSONObject jsonResponse` the JSON object with the reponse from the server. Both event response data objects contain: @@ -658,17 +631,17 @@ And both event and session failed objects also contain: ### Disable tracking -You can disable the adjust SDK from tracking any activities of the current device by calling `setEnabled` with parameter `false`. **This setting is remembered between sessions**. +You can disable the Adjust SDK from tracking any activities of the current device by calling `setEnabled` with parameter `false`. **This setting is remembered between sessions**. ```java Adjust.setEnabled(false); ``` -You can check if the adjust SDK is currently enabled by calling the function `isEnabled`. It is always possible to activatе the adjust SDK by invoking `setEnabled` with the enabled parameter as `true`. +You can check if the Adjust SDK is currently enabled by calling the function `isEnabled`. It is always possible to activatе the Adjust SDK by invoking `setEnabled` with the enabled parameter as `true`. ### Offline mode -You can put the adjust SDK in offline mode to suspend transmission to our servers, while retaining tracked data to be sent later. While in offline mode, all information is saved in a file, so be careful not to trigger too many events while in offline mode. +You can put the Adjust SDK in offline mode to suspend transmission to our servers, while retaining tracked data to be sent later. While in offline mode, all information is saved in a file, so be careful not to trigger too many events while in offline mode. You can activate offline mode by calling `setOfflineMode` with the parameter `true`. @@ -676,7 +649,7 @@ You can activate offline mode by calling `setOfflineMode` with the parameter `tr Adjust.setOfflineMode(true); ``` -Conversely, you can deactivate offline mode by calling `setOfflineMode` with `false`. When the adjust SDK is put back in online mode, all saved information is sent to our servers with the correct time information. +Conversely, you can deactivate offline mode by calling `setOfflineMode` with `false`. When the Adjust SDK is put back in online mode, all saved information is sent to our servers with the correct time information. Unlike disabling tracking, this setting is **not remembered** between sessions. This means that the SDK is in online mode whenever it is started, even if the app was terminated in offline mode. @@ -694,7 +667,7 @@ Adjust.onCreate(config); ### Background tracking -The default behaviour of the adjust SDK is to pause sending HTTP requests while the app is in the background. You can change this in your `AdjustConfig` instance: +The default behaviour of the Adjust SDK is to pause sending HTTP requests while the app is in the background. You can change this in your `AdjustConfig` instance: ```java AdjustConfig config = new AdjustConfig(this, appToken, environment); @@ -706,7 +679,7 @@ Adjust.onCreate(config); ### Device IDs -The adjust SDK offers you possibility to obtain some of the device identifiers. +The Adjust SDK offers you possibility to obtain some of the device identifiers. ### Google Play Services advertising identifier @@ -725,7 +698,7 @@ Adjust.getGoogleAdId(this, new OnDeviceIdsRead() { Inside the method `onGoogleAdIdRead` of the `OnDeviceIdsRead` instance, you will have access to Google Advertising ID as the variable `googleAdId`. -### Amazon Fire advertising identifier +### Amazon advertising identifier If you need to obtain the Amazon Advertising ID, you can make a call to following method on `Adjust` instance: @@ -735,7 +708,7 @@ String amazonAdId = Adjust.getAmazonAdId(context); ### Adjust device identifier -For each device with your app installed on it, adjust backend generates unique **adjust device identifier** (**adid**). In order to obtain this identifier, you can make a call to following method on `Adjust` instance: +For each device with your app installed on it, Adjust backend generates unique **Adjust device identifier** (**adid**). In order to obtain this identifier, you can make a call to following method on `Adjust` instance: ```java String adid = Adjust.getAdid(); @@ -743,7 +716,7 @@ String adid = Adjust.getAdid(); **Note**: You can only make this call in the Adjust SDK v4.11.0 and above. -**Note**: Information about **adid** is available after app installation has been tracked by the adjust backend. From that moment on, adjust SDK has information about your device **adid** and you can access it with this method. So, **it is not possible** to access **adid** value before the SDK has been initialised and installation of your app was tracked successfully. +**Note**: Information about **adid** is available after app installation has been tracked by the Adjust backend. From that moment on, Adjust SDK has information about your device **adid** and you can access it with this method. So, **it is not possible** to access **adid** value before the SDK has been initialised and installation of your app was tracked successfully. ### User attribution @@ -755,7 +728,7 @@ AdjustAttribution attribution = Adjust.getAttribution(); **Note**: You can only make this call in the Adjust SDK v4.11.0 and above. -**Note**: Information about current attribution is available after app installation has been tracked by the adjust backend and attribution callback has been initially triggered. From that moment on, adjust SDK has information about your user's attribution and you can access it with this method. So, **it is not possible** to access user's attribution value before the SDK has been initialised and attribution callback has been initially triggered. +**Note**: Information about current attribution is available after app installation has been tracked by the Adjust backend and attribution callback has been initially triggered. From that moment on, Adjust SDK has information about your user's attribution and you can access it with this method. So, **it is not possible** to access user's attribution value before the SDK has been initialised and attribution callback has been initially triggered. ### Push token @@ -765,14 +738,16 @@ To send us the push notification token, add the following call to Adjust once yo Adjust.setPushToken(pushNotificationsToken, context); ``` -This updated signature with the context, allows the sdk to cover more scenarios to make sure the token is send. +This updated signature with the context, allows the SDK to cover more scenarios to make sure the token is send. We still support the previous signature of the same method: ```java Adjust.setPushToken(pushNotificationsToken); ``` -### Pre-installed trackers +Push token is needed for uninstall tracking feature. + +### Pre-installed trackers If you want to use the Adjust SDK to recognize users that found your app pre-installed on their device, follow these steps. @@ -785,10 +760,9 @@ If you want to use the Adjust SDK to recognize users that found your app pre-ins Adjust.onCreate(config); ``` - Replace `{TrackerToken}` with the tracker token you created in step 2. - Please note that the dashboard displays a tracker URL (including - `http://app.adjust.com/`). In your source code, you should specify only the - six-character token and not the entire URL. + Replace `{TrackerToken}` with the tracker token you created in step 2. Please note that the dashboard displays a tracker + URL (including `http://app.adjust.com/`). In your source code, you should specify only the six-character token and not the + entire URL. 3. Build and run your app. You should see a line like the following in LogCat: @@ -798,11 +772,11 @@ If you want to use the Adjust SDK to recognize users that found your app pre-ins ### Deep linking -If you are using the adjust tracker URL with an option to deep link into your app from the URL, there is the possibility to get info about the deep link URL and its content. Hitting the URL can happen when the user has your app already installed (standard deep linking scenario) or if they don't have the app on their device (deferred deep linking scenario). In the standard deep linking scenario, Android platform natively offers the possibility for you to get the info about the deep link content. Deferred deep linking scenario is something which Android platform doesn't support out of box and for this case, the adjust SDK will offer you the mechanism to get the info about the deep link content. +If you are using the Adjust tracker URL with an option to deep link into your app from the URL, there is the possibility to get info about the deep link URL and its content. Hitting the URL can happen when the user has your app already installed (standard deep linking scenario) or if they don't have the app on their device (deferred deep linking scenario). In the standard deep linking scenario, Android platform natively offers the possibility for you to get the info about the deep link content. Deferred deep linking scenario is something which Android platform doesn't support out of box and for this case, the Adjust SDK will offer you the mechanism to get the info about the deep link content. -### Standard deep linking scenario +### Standard deep linking scenario -If a user has your app installed and you want it to launch after hitting an adjust tracker URL with the `deep_link` parameter in it, you need enable deep linking in your app. This is being done by choosing a desired **unique scheme name** and assigning it to the Activity which you want to launch once the app opens after the user clicked on the link. This is set in the `AndroidManifest.xml`. You need to add the `intent-filter` section to your desired Activity definition in the manifest file and assign `android:scheme` property value with the desired scheme name: +If a user has your app installed and you want it to launch after hitting an Adjust tracker URL with the `deep_link` parameter in it, you need enable deep linking in your app. This is being done by choosing a desired **unique scheme name** and assigning it to the Activity which you want to launch once the app opens after the user clicked on the link. This is set in the `AndroidManifest.xml`. You need to add the `intent-filter` section to your desired Activity definition in the manifest file and assign `android:scheme` property value with the desired scheme name: ```xml ``` -With this being set, you need to use the assigned scheme name in the adjust tracker URL's `deep_link` parameter if you want your app to launch once the tracker URL is clicked. A tracker URL without any information added to the deep link can be built to look something like this: +With this being set, you need to use the assigned scheme name in the Adjust tracker URL's `deep_link` parameter if you want your app to launch once the tracker URL is clicked. A tracker URL without any information added to the deep link can be built to look something like this: ``` https://app.adjust.com/abc123?deep_link=adjustExample%3A%2F%2F @@ -865,11 +839,11 @@ protected void onNewIntent(Intent intent) { } ``` -### Deferred deep linking scenario +### Deferred deep linking scenario -Deferred deep linking scenario happens when a user clicks on the adjust tracker URL with the `deep_link` parameter in it, but does not have the app installed on the device at the moment of click. After that, the user will get redirected to the Play Store to download and install your app. After opening it for the first time, the content of the `deep_link` parameter will be delivered to the app. +Deferred deep linking scenario happens when a user clicks on the Adjust tracker URL with the `deep_link` parameter in it, but does not have the app installed on the device at the moment of click. After that, the user will get redirected to the Play Store to download and install your app. After opening it for the first time, the content of the `deep_link` parameter will be delivered to the app. -In order to get info about the `deep_link` parameter content in a deferred deep linking scenario, you should set a listener method on the `AdjustConfig` object. This will get triggered once the adjust SDK gets the info about the deep link content from the backend. +In order to get info about the `deep_link` parameter content in a deferred deep linking scenario, you should set a listener method on the `AdjustConfig` object. This will get triggered once the Adjust SDK gets the info about the deep link content from the backend. ```java AdjustConfig config = new AdjustConfig(this, appToken, environment); @@ -890,17 +864,17 @@ config.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() { Adjust.onCreate(config); ``` -Once the adjust SDK receives the info about the deep link content from the backend, it will deliver you the info about its content in this listener and expect the `boolean` return value from you. This return value represents your decision on whether the adjust SDK should launch the Activity to which you have assigned the scheme name from the deep link (like in the standard deep linking scenario) or not. +Once the Adjust SDK receives the info about the deep link content from the backend, it will deliver you the info about its content in this listener and expect the `boolean` return value from you. This return value represents your decision on whether the Adjust SDK should launch the Activity to which you have assigned the scheme name from the deep link (like in the standard deep linking scenario) or not. If you return `true`, we will launch it and the exact same scenario which is described in the [Standard deep linking scenario chapter](#deeplinking-standard) will happen. If you do not want the SDK to launch the Activity, you can return `false` from this listener and based on the deep link content decide on your own what to do next in your app. -### Reattribution via deep links +### Reattribution via deep links Adjust enables you to run re-engagement campaigns with usage of deep links. For more information on how to do that, please check our [official docs][reattribution-with-deeplinks]. -If you are using this feature, in order for your user to be properly reattributed, you need to make one additional call to the adjust SDK in your app. +If you are using this feature, in order for your user to be properly reattributed, you need to make one additional call to the Adjust SDK in your app. -Once you have received deep link content information in your app, add a call to `Adjust.appWillOpenUrl` method. By making this call, the adjust SDK will try to find if there is any new attribution info inside of the deep link and if any, it will be sent to the adjust backend. If your user should be reattributed due to a click on the adjust tracker URL with deep link content in it, you will see the [attribution callback](#attribution-callback) in your app being triggered with new attribution info for this user. +Once you have received deep link content information in your app, add a call to `Adjust.appWillOpenUrl` method. By making this call, the Adjust SDK will try to find if there is any new attribution info inside of the deep link and if any, it will be sent to the Adjust backend. If your user should be reattributed due to a click on the adjust tracker URL with deep link content in it, you will see the [attribution callback](#attribution-callback) in your app being triggered with new attribution info for this user. The call to `Adjust.appWillOpenUrl` should be done like this: @@ -928,9 +902,9 @@ protected void onNewIntent(Intent intent) { } ``` -## Troubleshooting +## Troubleshooting -### I'm seeing the "Session failed (Ignoring too frequent session. ...)" error. +### I'm seeing the "Session failed (Ignoring too frequent session. ...)" error. This error typically occurs when testing installs. Uninstalling and reinstalling the app is not enough to trigger a new install. The servers will determine that the SDK has lost its locally aggregated session data and ignore the erroneous message, given the information available on the servers about the device. @@ -960,7 +934,7 @@ http://app.adjust.com/forget_device?app_token={yourAppToken}&android_id={android When the device is forgotten, the link just returns `Forgot device`. If the device was already forgotten or the values were incorrect, the link returns `Device not found`. -### Is my broadcast receiver capturing the install referrer? +### Is my broadcast receiver capturing the install referrer? If you followed the instructions in the [guide](#broadcast_receiver), the broadcast receiver should be configured to send the install referrer to our SDK and to our servers. @@ -1000,13 +974,13 @@ V/Adjust: Path: /sdk_click If you perform this test before launching the app, you won't see the package being sent. The package will be sent once the app is launched. -### Can I trigger an event at application launch? +### Can I trigger an event at application launch? Not how you might intuitively think. The `onCreate` method on the global `Application` class is called not only at application launch, but also when a system or application event is captured by the app. Our SDK is prepared for initialization at this time, but not actually started. This will only happen when an activity is started, i.e., when a user actually launches the app. -That's why triggering an event at this time will not do what you would expect. Such calls will start the adjust SDK and send the events, even when the app was not launched by the user - at a time that depends on external factors of the app. +That's why triggering an event at this time will not do what you would expect. Such calls will start the Adjust SDK and send the events, even when the app was not launched by the user - at a time that depends on external factors of the app. Triggering events at application launch will thus result in inaccuracies in the number of installs and sessions tracked. @@ -1024,6 +998,7 @@ If you want to trigger an event when the app is launched, use the `onCreate` met [google_ad_id]: https://support.google.com/googleplay/android-developer/answer/6048248?hl=en [event-tracking]: https://docs.adjust.com/en/event-tracking [callbacks-guide]: https://docs.adjust.com/en/callbacks +[new-referrer-api]: https://developer.android.com/google/play/installreferrer/library.html [application_name]: http://developer.android.com/guide/topics/manifest/application-element.html#nm [special-partners]: https://docs.adjust.com/en/special-partners [attribution-data]: https://github.com/adjust/sdks/blob/master/doc/attribution-data.md @@ -1056,10 +1031,9 @@ If you want to trigger an event when the app is launched, use the `onCreate` met ## License -The adjust SDK is licensed under the MIT License. +The Adjust SDK is licensed under the MIT License. -Copyright (c) 2012-2017 adjust GmbH, -http://www.adjust.com +Copyright (c) 2012-2017 Adjust GmbH, http://www.adjust.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in From 8afb3d0cc51c7d37a06365a7361ce72b0a2c58f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Tue, 12 Dec 2017 07:41:46 +0100 Subject: [PATCH 133/146] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 0da9e1a10..e5dc4048b 100644 --- a/README.md +++ b/README.md @@ -63,8 +63,6 @@ There is an example app inside the [`example` directory][example]. You can open These are the minimal steps required to integrate the Adjust SDK into your Android project. We are going to assume that you use Android Studio for your Android development and target an Android API level 9 (Gingerbread) or later. -If you're using the [Maven Repository][maven] you can start with [this step](#sdk-add). - ### Add the SDK to your project If you are using Maven, add following to yout `build.gradle` file: From 8c8d33a8a5938ecd29ad5c7e5a60fa3f2be704e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Tue, 12 Dec 2017 07:45:41 +0100 Subject: [PATCH 134/146] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e5dc4048b..124cf479e 100644 --- a/README.md +++ b/README.md @@ -179,7 +179,7 @@ We use this broadcast receiver to retrieve the install referrer, in order to imp If you are already using a different broadcast receiver for the `INSTALL_REFERRER` intent, follow [these instructions][referrer] to add the Adjust broadcast receiver. -**Note**: Receiving referrer information via `INSTALL_REFERRER` intent is part of old Google referrer mechanism which got replaced with [new Google referrer API][new-referrer-api]. It is strongly advised to add support for new API which significantly improves security of the referrer information being delivered into the app and also helps attribution providers to fight click injection in more efficient way. In order to have this supported in your app, please make sure that you have followed [Add the SDK to your project][#sdk-add] chapter properly and that you have following line added to your `build.gradle` file: +**Note**: Receiving referrer information via `INSTALL_REFERRER` intent is part of old Google referrer mechanism which got replaced with [new Google referrer API][new-referrer-api]. It is strongly advised to add support for new API which significantly improves security of the referrer information being delivered into the app and also helps attribution providers to fight click injection in more efficient way. In order to have this supported in your app, please make sure that you have followed [Add the SDK to your project](#sdk-add) chapter properly and that you have following line added to your `build.gradle` file: ``` compile 'com.android.installreferrer:installreferrer:1.0' @@ -736,7 +736,8 @@ To send us the push notification token, add the following call to Adjust once yo Adjust.setPushToken(pushNotificationsToken, context); ``` -This updated signature with the context, allows the SDK to cover more scenarios to make sure the token is send. +This updated signature with the context allows the SDK to cover more scenarios to make sure that the push token is sent and it is advised to use this method signature from above. + We still support the previous signature of the same method: ```java From 8e5b8c0e2569d65788d6a6c171b523a1ee653c77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Tue, 12 Dec 2017 13:11:51 +0100 Subject: [PATCH 135/146] Update README.md --- README.md | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 124cf479e..8cf36fb47 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,7 @@ our [Android web views SDK guide](doc/english/web_views.md). * [Adjust device identifier](#di-adid) * [User attribution](#user-attribution) * [Push token](#push-token) + * [Track additional device identifiers](#track-additional-ids) * [Pre-installed trackers](#pre-installed-trackers) * [Deep linking](#deeplinking) * [Standard deep linking scenario](#deeplinking-standard) @@ -744,7 +745,27 @@ We still support the previous signature of the same method: Adjust.setPushToken(pushNotificationsToken); ``` -Push token is needed for uninstall tracking feature. +Push token is used for Audience Builder and client callbacks and needed for the upcoming uninstall tracking feature. + +### Track additional device identifiers + +If you are distributing your app **outside of Google Play Store** and would like to track additional device identifiers (IMEI and MEID), you need to explicitly instruct Adjust SDK to do so. You can do that by calling `setReadMobileEquipmentIdentity` method of `AdjustConfig` instance and passing `true` parameter to it. **Adjust SDK doesn't collect these identifiers by default**. + +```java +AdjustConfig config = new AdjustConfig(this, appToken, environment); + +config.setReadMobileEquipmentIdentity(true); + +Adjust.onCreate(config); +``` + +You will also need to add `READ_PHONE_STATE` permission to your `AndroidManifest.xml` file: + +```xml + +``` + +In order to use this feature, additional steps in your Adjust dashboard will be required. For more information, please contact your dedicated Account Manager or write an E-Mail to support@adjust.com. ### Pre-installed trackers From f89a3107485c2035c9388f73f97c658a74858c70 Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 12 Dec 2017 13:50:34 +0100 Subject: [PATCH 136/146] Join available imeis --- .../java/com/adjust/sdk/PackageBuilder.java | 6 +- .../main/java/com/adjust/sdk/Reflection.java | 9 +++ .../src/main/java/com/adjust/sdk/Util.java | 62 +++++++++++++++++++ 3 files changed, 74 insertions(+), 3 deletions(-) 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 37182bddc..4a7db2e27 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java @@ -277,9 +277,9 @@ private void injectConfig(Map parameters) { if (adjustConfig.readMobileEquipmentIdentity) { TelephonyManager telephonyManager = (TelephonyManager)adjustConfig.context.getSystemService(Context.TELEPHONY_SERVICE); - PackageBuilder.addString(parameters, "device_id", Util.getTelephonyId(telephonyManager)); - PackageBuilder.addString(parameters, "imei", Util.getIMEI(telephonyManager, 0)); - PackageBuilder.addString(parameters, "meid", Util.getMEID(telephonyManager, 0)); + PackageBuilder.addString(parameters, "device_ids", Util.getTelephonyIds(telephonyManager)); + PackageBuilder.addString(parameters, "imeis", Util.getIMEIs(telephonyManager)); + PackageBuilder.addString(parameters, "meids", Util.getMEIDs(telephonyManager)); } } diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Reflection.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Reflection.java index 5cd7cb336..89a4e9cce 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Reflection.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Reflection.java @@ -136,6 +136,15 @@ public static String getTelephonyId(TelephonyManager telephonyManager) { } } + public static String getTelephonyId(TelephonyManager telephonyManager, int index) { + // return telephonyManager.getDeviceId(); + try { + return (String) invokeInstanceMethod(telephonyManager, "getDeviceId", new Class[]{int.class}, index); + } catch (Exception e) { + return null; + } + } + private static Object getAdvertisingInfoObject(Context context) throws Exception { return invokeStaticMethod("com.google.android.gms.ads.identifier.AdvertisingIdClient", diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java index c7afef081..24464abf9 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java @@ -34,7 +34,9 @@ import java.security.MessageDigest; import java.text.DecimalFormat; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Random; @@ -147,6 +149,66 @@ public static String getMEID(TelephonyManager telephonyManager, int index) { return Reflection.getMeid(telephonyManager, index); } + public static String getTelephonyId(TelephonyManager telephonyManager, int index) { + return Reflection.getTelephonyId(telephonyManager, index); + } + + public static String getTelephonyIds(TelephonyManager telephonyManager) { + List telephonyIds = new ArrayList(); + + String telephonyId0 = getTelephonyId(telephonyManager, 0); + if (telephonyId0 != null) { + telephonyIds.add(telephonyId0); + } + + for (int i = 1; i < 10; i++) { + String telephonyId = getTelephonyId(telephonyManager, i); + if (telephonyId == null) { + break; + } + telephonyIds.add(telephonyId); + } + + return TextUtils.join(",", telephonyIds); + } + + public static String getIMEIs(TelephonyManager telephonyManager) { + List imeis = new ArrayList(); + + String imei0 = getIMEI(telephonyManager, 0); + if (imei0!= null) { + imeis.add(imei0); + } + + for (int i = 1; i < 10; i++) { + String imei = getIMEI(telephonyManager, i); + if (imei == null) { + break; + } + imeis.add(imei); + } + + return TextUtils.join(",", imeis); + } + + public static String getMEIDs(TelephonyManager telephonyManager) { + List meids = new ArrayList(); + + String meid0 = getMEID(telephonyManager, 0); + if (meid0 != null) { + meids.add(meid0); + } + + for (int i = 1; i < 10; i++) { + String meid = getMEID(telephonyManager, i); + if (meid == null) { + break; + } + meids.add(meid); + } + + return TextUtils.join(",", meids); + } public static T readObject(Context context, String filename, String objectName, Class type) { Closeable closable = null; From 59410792cf47da35539b8257d3090207733f09d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Tue, 12 Dec 2017 13:59:29 +0100 Subject: [PATCH 137/146] Update README.md --- README.md | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 8cf36fb47..2b4ddc2d8 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,9 @@ our [Android web views SDK guide](doc/english/web_views.md). * [Add Google Play Services](#sdk-gps) * [Add permissions](#sdk-permissions) * [Proguard settings](#sdk-proguard) - * [Adjust broadcast receiver](#sdk-broadcast-receiver) + * [Install referrer](#install-referrer) + * [Google Play Referrer API](#gpr-api) + * [Google Play Store intent](#gps-intent) * [Integrate the SDK into your app](#sdk-integrate) * [Basic setup](#basic-setup) * [Session tracking](#session-tracking) @@ -160,9 +162,25 @@ If you are using Proguard, add these lines to your Proguard file: If you are **not targeting the Google Play Store**, you can remove the `com.google.android.gms` rules. -### Adjust broadcast receiver +### Install referrer -If you are **not using your own broadcast receiver** to receive `INSTALL_REFERRER` intent, add the following `receiver` tag inside the `application` tag in your `AndroidManifest.xml`. +In order to properly attribute install of your app with it's source, we need to get information about **install referrer**. This can be obtained with usage of **Google Play Referrer API** or with catching **Google Play Store intent** with broadcast receiver. + +**Important**: Google Play Referrer API is newly introduced by Google in order to provide more reliable and secure way of obtaining install referrer information and also to aid attribution providers to fight click injection in more efficient way. It is **strongly recommended** that you have this supported in your application. Google Play Store intent is less secure way of obtaining install referrer information which will exist in parallel with new Google Play Referrer API for a while, but is intended to be deprecated at some point in future. + +#### Google Play Referrer API + +In order to have this supported in your app, please make sure that you have followed [Add the SDK to your project](#sdk-add) chapter properly and that you have following line added to your `build.gradle` file: + +``` +compile 'com.android.installreferrer:installreferrer:1.0' +``` + +In addition to that, this feature is supported if you use **Adjust SDK v4.12.0 or above**. + +#### Google Play Store intent + +Google Play Store `INSTALL_REFERRER` intent should be captured with broadcast receiver. If you are **not using your own broadcast receiver** to receive `INSTALL_REFERRER` intent, add the following `receiver` tag inside the `application` tag in your `AndroidManifest.xml`. ```xml Integrate the SDK into your app To start with, we'll set up basic session tracking. From 57cbc6759a24c37443de4b562579661f2a3398d8 Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 12 Dec 2017 15:10:08 +0100 Subject: [PATCH 138/146] Don't add duplicated imeis --- .../src/main/java/com/adjust/sdk/Util.java | 53 +++++++++++-------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java index 24464abf9..e67a5bb3d 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java @@ -153,61 +153,72 @@ public static String getTelephonyId(TelephonyManager telephonyManager, int index return Reflection.getTelephonyId(telephonyManager, index); } + public static boolean tryAddToStringList(List list, String value) { + if (value == null) { + return false; + } + if (list.contains(value)) { + return false; + } + + return list.add(value); + } + public static String getTelephonyIds(TelephonyManager telephonyManager) { - List telephonyIds = new ArrayList(); + List telephonyIdList = new ArrayList(); String telephonyId0 = getTelephonyId(telephonyManager, 0); - if (telephonyId0 != null) { - telephonyIds.add(telephonyId0); - } + tryAddToStringList(telephonyIdList, telephonyId0); for (int i = 1; i < 10; i++) { String telephonyId = getTelephonyId(telephonyManager, i); - if (telephonyId == null) { + if (!tryAddToStringList(telephonyIdList, telephonyId)) { break; } - telephonyIds.add(telephonyId); } - return TextUtils.join(",", telephonyIds); + String telephonyIdMax = getTelephonyId(telephonyManager, Integer.MAX_VALUE); + tryAddToStringList(telephonyIdList, telephonyIdMax); + + return TextUtils.join(",", telephonyIdList); } public static String getIMEIs(TelephonyManager telephonyManager) { - List imeis = new ArrayList(); + List imeiList = new ArrayList(); String imei0 = getIMEI(telephonyManager, 0); - if (imei0!= null) { - imeis.add(imei0); - } + tryAddToStringList(imeiList, imei0); for (int i = 1; i < 10; i++) { String imei = getIMEI(telephonyManager, i); - if (imei == null) { + if (!tryAddToStringList(imeiList, imei)) { break; } - imeis.add(imei); } - return TextUtils.join(",", imeis); + String imeiMax = getIMEI(telephonyManager, Integer.MAX_VALUE); + tryAddToStringList(imeiList, imeiMax); + + return TextUtils.join(",", imeiList); } public static String getMEIDs(TelephonyManager telephonyManager) { - List meids = new ArrayList(); + List meidList = new ArrayList(); String meid0 = getMEID(telephonyManager, 0); - if (meid0 != null) { - meids.add(meid0); - } + tryAddToStringList(meidList, meid0); for (int i = 1; i < 10; i++) { String meid = getMEID(telephonyManager, i); - if (meid == null) { + if (!tryAddToStringList(meidList, meid)) { break; } - meids.add(meid); } - return TextUtils.join(",", meids); + String meidMax = getMEID(telephonyManager, Integer.MAX_VALUE); + tryAddToStringList(meidList, meidMax); + + return TextUtils.join(",", meidList); } public static T readObject(Context context, String filename, String objectName, Class type) { From 988873c98f73cc7c65306a21dee6c8fbc2892e68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Tue, 12 Dec 2017 16:24:55 +0100 Subject: [PATCH 139/146] Update README.md --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2b4ddc2d8..1adea23ff 100644 --- a/README.md +++ b/README.md @@ -158,6 +158,7 @@ If you are using Proguard, add these lines to your Proguard file: -keep class android.os.LocaledList { java.util.Locale get(int); } +-keep public class com.android.installreferrer.** { *; } ``` If you are **not targeting the Google Play Store**, you can remove the `com.google.android.gms` rules. @@ -176,7 +177,13 @@ In order to have this supported in your app, please make sure that you have foll compile 'com.android.installreferrer:installreferrer:1.0' ``` -In addition to that, this feature is supported if you use **Adjust SDK v4.12.0 or above**. +Also, make sure that you have paid attention to [Proguard settings](#sdk-proguard) chapter and that you have added all the rules mentioned in it, especially the one needed for this feature: + +``` +-keep public class com.android.installreferrer.** { *; } +``` + +This feature is supported if you use **Adjust SDK v4.12.0 or above**. #### Google Play Store intent From 93f3708765b630de3a2582f80504e91031074ec7 Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 12 Dec 2017 16:56:14 +0100 Subject: [PATCH 140/146] Run instance preferences in background --- .../java/com/adjust/sdk/AdjustInstance.java | 31 +++++++++++++++---- .../src/main/java/com/adjust/sdk/Util.java | 15 +++++++++ 2 files changed, 40 insertions(+), 6 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 aca5e607f..599375a27 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/AdjustInstance.java @@ -441,8 +441,14 @@ private boolean checkActivityHandler(final String savedForLaunchWarningSuffixMes * @param context Application context */ private void saveRawReferrer(final String rawReferrer, final long clickTime, final Context context) { - SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); - sharedPreferencesManager.saveRawReferrer(rawReferrer, clickTime); + Runnable command = new Runnable() { + @Override + public void run() { + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); + sharedPreferencesManager.saveRawReferrer(rawReferrer, clickTime); + } + }; + Util.runInBackground(command); } /** @@ -452,13 +458,26 @@ private void saveRawReferrer(final String rawReferrer, final long clickTime, fin * @param context Application context */ private void savePushToken(final String pushToken, final Context context) { - SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); - sharedPreferencesManager.savePushToken(pushToken); + Runnable command = new Runnable() { + @Override + public void run() { + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); + sharedPreferencesManager.savePushToken(pushToken); + } + }; + Util.runInBackground(command); } private void setSendingReferrersAsNotSent(final Context context) { - SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); - sharedPreferencesManager.setSendingReferrersAsNotSent(); + Runnable command = new Runnable() { + @Override + public void run() { + SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context); + sharedPreferencesManager.setSendingReferrersAsNotSent(); + + } + }; + Util.runInBackground(command); } /** diff --git a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java index e67a5bb3d..4abe71247 100644 --- a/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java +++ b/Adjust/adjust/src/main/java/com/adjust/sdk/Util.java @@ -84,6 +84,21 @@ public static String getPlayAdId(Context context) { return Reflection.getPlayAdId(context); } + public static void runInBackground(Runnable command) { + if (Looper.myLooper() != Looper.getMainLooper()) { + command.run(); + return; + } + new AsyncTask() { + @Override + protected Void doInBackground(Object... params) { + Runnable command = (Runnable)params[0]; + command.run(); + return null; + } + }.execute((Object)command); + } + public static void getGoogleAdId(Context context, final OnDeviceIdsRead onDeviceIdRead) { ILogger logger = AdjustFactory.getLogger(); if (Looper.myLooper() != Looper.getMainLooper()) { From 5477c99dd65ee58412b657fd9d5d2fb3ff1f8027 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Wed, 13 Dec 2017 07:17:48 +0100 Subject: [PATCH 141/146] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3bb0957d1..7799674f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### Version 4.12.0 (12th December 2017) +### Version 4.12.0 (13th December 2017) #### Added - Added support for new Google referrer API (https://developer.android.com/google/play/installreferrer/library.html). - Added `Adjust.getAmazonAdId()` method to obtain value of Amazon Advertising Identifier. From 4a7e7c2e7bedebb1859b11d08ebbc53628991c0b Mon Sep 17 00:00:00 2001 From: easteracrobat Date: Wed, 13 Dec 2017 10:43:38 +0100 Subject: [PATCH 142/146] proofing --- README.md | 81 ++++++++++++++++++++++++++----------------------------- 1 file changed, 38 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index 1adea23ff..f599a0f47 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ These are the minimal steps required to integrate the Adjust SDK into your Andro ### Add the SDK to your project -If you are using Maven, add following to yout `build.gradle` file: +If you are using Maven, add the following to your `build.gradle` file: ``` compile 'com.adjust.sdk:adjust-android:4.12.0' @@ -82,11 +82,11 @@ implementation 'com.adjust.sdk:adjust-android:4.12.0' implementation 'com.android.installreferrer:installreferrer:1.0' ``` -The applies for adding Google Play Services dependency to your `build.gradle` file. +This applies when adding the Google Play Services dependency to your `build.gradle` file. --- -You can as well add Adjust SDK to your project as JAR library. Latest SDK version JAR library can be found in our [releases page][releases]. +You can also add the Adjust SDK to your project as a JAR library. The latest SDK version's JAR library can be found on our [releases page][releases]. ### Add Google Play Services @@ -100,8 +100,8 @@ Since the 1st of August of 2014, apps in the Google Play Store must use the [Goo ![][gradle_gps] - **Note**: Adjust SDK is not tied to any specific version of `play-services-analytics` part of Google Play Services - library, so feel free to always use latest version of it (or the one you might specially need for some reason). + **Note**: The Adjust SDK is not tied to any specific version of the `play-services-analytics` part of the Google Play Services + library, so feel free to always use the latest version of it (or whichever you might need) 2. **Skip this step if you are using version 7 or later of Google Play Services**: In the Package Explorer open the `AndroidManifest.xml` of your Android @@ -115,14 +115,14 @@ Since the 1st of August of 2014, apps in the Google Play Store must use the [Goo ### Add permissions -Please add following permissions which Adjust SDK needs if they are not already present in your `AndroidManifest.xml` file: +Please add the following permissions, which the Adjust SDK needs, if they are not already present in your `AndroidManifest.xml` file: ```xml ``` -If you are **not targeting the Google Play Store**, please add following permission as well: +If you are **not targeting the Google Play Store**, please also add the following permission: ```xml @@ -165,29 +165,29 @@ If you are **not targeting the Google Play Store**, you can remove the `com.goog ### Install referrer -In order to properly attribute install of your app with it's source, we need to get information about **install referrer**. This can be obtained with usage of **Google Play Referrer API** or with catching **Google Play Store intent** with broadcast receiver. +In order to correctly attribute an install of your app to its source, Adjust needs information about the **install referrer**. This can be obtained by using the **Google Play Referrer API** or by catching the **Google Play Store intent** with a broadcast receiver. -**Important**: Google Play Referrer API is newly introduced by Google in order to provide more reliable and secure way of obtaining install referrer information and also to aid attribution providers to fight click injection in more efficient way. It is **strongly recommended** that you have this supported in your application. Google Play Store intent is less secure way of obtaining install referrer information which will exist in parallel with new Google Play Referrer API for a while, but is intended to be deprecated at some point in future. +**Important**: The Google Play Referrer API is newly introduced by Google with the express purpose of providing a more reliable and secure way of obtaining install referrer information and to aid attribution providers in the fight against click injection. It is **strongly advised** that you support this in your application. The Google Play Store intent is a less secure way of obtaining install referrer information. It will continue to exist in parallel with the new Google Play Referrer API temporarily, but it is set to be deprecated in future. #### Google Play Referrer API -In order to have this supported in your app, please make sure that you have followed [Add the SDK to your project](#sdk-add) chapter properly and that you have following line added to your `build.gradle` file: +In order to support this in your app, please make sure that you have followed the [Add the SDK to your project](#sdk-add) chapter properly and that you have following line added to your `build.gradle` file: ``` compile 'com.android.installreferrer:installreferrer:1.0' ``` -Also, make sure that you have paid attention to [Proguard settings](#sdk-proguard) chapter and that you have added all the rules mentioned in it, especially the one needed for this feature: +Also, make sure that you have paid attention to the [Proguard settings](#sdk-proguard) chapter and that you have added all the rules mentioned in it, especially the one needed for this feature: ``` -keep public class com.android.installreferrer.** { *; } ``` -This feature is supported if you use **Adjust SDK v4.12.0 or above**. +This feature is supported if you are using **Adjust SDK v4.12.0 or above**. #### Google Play Store intent -Google Play Store `INSTALL_REFERRER` intent should be captured with broadcast receiver. If you are **not using your own broadcast receiver** to receive `INSTALL_REFERRER` intent, add the following `receiver` tag inside the `application` tag in your `AndroidManifest.xml`. +The Google Play Store `INSTALL_REFERRER` intent should be captured with a broadcast receiver. If you are **not using your own broadcast receiver** to receive the `INSTALL_REFERRER` intent, add the following `receiver` tag inside the `application` tag in your `AndroidManifest.xml`. ```xml Session tracking @@ -402,7 +398,7 @@ Adjust.trackEvent(event); ### Revenue tracking -If your users can generate revenue by tapping on advertisements or making In-App Purchases you can track those revenues with events. Lets say a tap is worth one Euro cent. You could then track the revenue event like this: +If your users can generate revenue by tapping on advertisements or making in-app purchases you can track those revenues with events. Lets say a tap is worth one Euro cent. You could then track the revenue event like this: ```java AdjustEvent event = new AdjustEvent("abc123"); @@ -418,9 +414,9 @@ You can read more about revenue and event tracking in the [event tracking guide] ### Revenue deduplication -You can also add an optional order ID to avoid tracking duplicate revenues. The last ten order IDs are remembered, and revenue events with duplicate order IDs are skipped. This is especially useful for In-App Purchase tracking. You can see an example below. +You can also add an optional order ID to avoid tracking duplicate revenues. The last ten order IDs are remembered, and revenue events with duplicate order IDs are skipped. This is especially useful for in-app purchase tracking. You can see an example below. -If you want to track In-App purchases, please make sure to call the `trackEvent` only if the purchase is finished and item is purchased. That way you can avoid tracking revenue that is not actually being generated. +If you want to track in-app purchases, please make sure to call `trackEvent` only if the purchase is finished and item is purchased. That way you can avoid tracking revenue that is not actually being generated. ```java AdjustEvent event = new AdjustEvent("abc123"); @@ -746,7 +742,7 @@ AdjustAttribution attribution = Adjust.getAttribution(); **Note**: You can only make this call in the Adjust SDK v4.11.0 and above. -**Note**: Information about current attribution is available after app installation has been tracked by the Adjust backend and attribution callback has been initially triggered. From that moment on, Adjust SDK has information about your user's attribution and you can access it with this method. So, **it is not possible** to access user's attribution value before the SDK has been initialised and attribution callback has been initially triggered. +**Note**: Information about current attribution is available after app installation has been tracked by the Adjust backend and attribution callback has been initially triggered. From that moment on, Adjust SDK has information about your user's attribution and you can access it with this method. So, **it is not possible** to access user's attribution value before the SDK has been initialized and attribution callback has been initially triggered. ### Push token @@ -756,7 +752,7 @@ To send us the push notification token, add the following call to Adjust once yo Adjust.setPushToken(pushNotificationsToken, context); ``` -This updated signature with the context allows the SDK to cover more scenarios to make sure that the push token is sent and it is advised to use this method signature from above. +This updated signature with `context` added allows the SDK to cover more scenarios to make sure that the push token is sent, and it is advised that you use the signature method above. We still support the previous signature of the same method: @@ -764,11 +760,11 @@ We still support the previous signature of the same method: Adjust.setPushToken(pushNotificationsToken); ``` -Push token is used for Audience Builder and client callbacks and needed for the upcoming uninstall tracking feature. +Push tokens are used for Audience Builder and client callbacks, and they are required for the upcoming uninstall tracking feature. ### Track additional device identifiers -If you are distributing your app **outside of Google Play Store** and would like to track additional device identifiers (IMEI and MEID), you need to explicitly instruct Adjust SDK to do so. You can do that by calling `setReadMobileEquipmentIdentity` method of `AdjustConfig` instance and passing `true` parameter to it. **Adjust SDK doesn't collect these identifiers by default**. +If you are distributing your app **outside of the Google Play Store** and would like to track additional device identifiers (IMEI and MEID), you need to explicitly instruct the Adjust SDK to do so. You can do that by calling the `setReadMobileEquipmentIdentity` method of the `AdjustConfig` instance and passing a `true` parameter to it. **The Adjust SDK does not collect these identifiers by default**. ```java AdjustConfig config = new AdjustConfig(this, appToken, environment); @@ -778,17 +774,17 @@ config.setReadMobileEquipmentIdentity(true); Adjust.onCreate(config); ``` -You will also need to add `READ_PHONE_STATE` permission to your `AndroidManifest.xml` file: +You will also need to add the `READ_PHONE_STATE` permission to your `AndroidManifest.xml` file: ```xml ``` -In order to use this feature, additional steps in your Adjust dashboard will be required. For more information, please contact your dedicated Account Manager or write an E-Mail to support@adjust.com. +In order to use this feature, additional steps are required within your Adjust Dashboard. For more information, please contact your dedicated account manager or write an email to support@adjust.com. ### Pre-installed trackers -If you want to use the Adjust SDK to recognize users that found your app pre-installed on their device, follow these steps. +If you want to use the Adjust SDK to recognize users whose devices came with your app pre-installed, follow these steps. 1. Create a new tracker in your [dashboard]. 2. Open your app delegate and add set the default tracker of your `AdjustConfig`: @@ -799,11 +795,10 @@ If you want to use the Adjust SDK to recognize users that found your app pre-ins Adjust.onCreate(config); ``` - Replace `{TrackerToken}` with the tracker token you created in step 2. Please note that the dashboard displays a tracker - URL (including `http://app.adjust.com/`). In your source code, you should specify only the six-character token and not the + Replace `{TrackerToken}` with the tracker token you created in step 1. Please note that the Dashboard displays a tracker URL (including `http://app.adjust.com/`). In your source code, you should specify only the six-character token and not the entire URL. -3. Build and run your app. You should see a line like the following in LogCat: +3. Build and run your app. You should see a line like the following in your LogCat: ``` Default tracker: 'abc123' @@ -811,11 +806,11 @@ If you want to use the Adjust SDK to recognize users that found your app pre-ins ### Deep linking -If you are using the Adjust tracker URL with an option to deep link into your app from the URL, there is the possibility to get info about the deep link URL and its content. Hitting the URL can happen when the user has your app already installed (standard deep linking scenario) or if they don't have the app on their device (deferred deep linking scenario). In the standard deep linking scenario, Android platform natively offers the possibility for you to get the info about the deep link content. Deferred deep linking scenario is something which Android platform doesn't support out of box and for this case, the Adjust SDK will offer you the mechanism to get the info about the deep link content. +If you are using an Adjust tracker URL with the option to deep link into your app, there is the possibility to get information about the deep link URL and its content. Hitting the URL can happen when the user has your app already installed (standard deep linking scenario) or if they don't have the app on their device (deferred deep linking scenario). In the standard deep linking scenario, the Android platform natively offers the possibility for you to get the information about the deep link content. The deferred deep linking scenario is something which the Android platform doesn't support out of the box, and, in this case, the Adjust SDK will offer you the mechanism you need to get the information about the deep link content. ### Standard deep linking scenario -If a user has your app installed and you want it to launch after hitting an Adjust tracker URL with the `deep_link` parameter in it, you need enable deep linking in your app. This is being done by choosing a desired **unique scheme name** and assigning it to the Activity which you want to launch once the app opens after the user clicked on the link. This is set in the `AndroidManifest.xml`. You need to add the `intent-filter` section to your desired Activity definition in the manifest file and assign `android:scheme` property value with the desired scheme name: +If a user has your app installed and you want it to launch after hitting an Adjust tracker URL with the `deep_link` parameter in it, you need to enable deep linking in your app. This is done by choosing a desired **unique scheme name** and assigning it to the Activity you want to launch once your app opens following a user clicking on the tracker URL. This is set in the `AndroidManifest.xml`. You need to add the `intent-filter` section to your desired Activity definition in the manifest file and assign an `android:scheme` property value with the desired scheme name: ```xml ``` -With this being set, you need to use the assigned scheme name in the Adjust tracker URL's `deep_link` parameter if you want your app to launch once the tracker URL is clicked. A tracker URL without any information added to the deep link can be built to look something like this: +With this now set, you need to use the assigned scheme name in the Adjust tracker URL's `deep_link` parameter if you want your app to launch once the tracker URL is clicked. A tracker URL without any information added to the deep link can be built to look something like this: ``` https://app.adjust.com/abc123?deep_link=adjustExample%3A%2F%2F @@ -850,7 +845,7 @@ After clicking this tracker URL, and with the app set as described above, your a Depending on the `android:launchMode` setting of your Activity in the `AndroidManifest.xml` file, information about the `deep_link` parameter content will be delivered to the appropriate place in the Activity file. For more information about the possible values of the `android:launchMode` property, check [the official Android documentation][android-launch-modes]. -There are two possible places in which information about the deep link content will be delivered to your desired Activity via `Intent` object - either in the Activity's `onCreate` or `onNewIntent` method. After the app has launched and one of these methods is triggered, you will be able to get the actual deeplink passed in the `deep_link` parameter in the click URL. You can then use this information to do some additional logic in your app. +There are two places within your desired Activity where information about the deep link content will be delivered via the `Intent` object--either in the Activity's `onCreate` or `onNewIntent` methods. Once your app has launched and one of these methods has been triggered, you will be able to get the actual deep link passed in the `deep_link` parameter in the click URL. You can then use this information to conduct some additional logic in your app. You can extract the deep link content from these two methods like this: @@ -880,9 +875,9 @@ protected void onNewIntent(Intent intent) { ### Deferred deep linking scenario -Deferred deep linking scenario happens when a user clicks on the Adjust tracker URL with the `deep_link` parameter in it, but does not have the app installed on the device at the moment of click. After that, the user will get redirected to the Play Store to download and install your app. After opening it for the first time, the content of the `deep_link` parameter will be delivered to the app. +The deferred deep linking scenario occurs when a user clicks on an Adjust tracker URL with a `deep_link` parameter in it, but does not have the app installed on the device at click time. After that, the user will be redirected to the Play Store to download and install your app. After opening it for the first time, the `deep_link` parameter content will be delivered to your app. -In order to get info about the `deep_link` parameter content in a deferred deep linking scenario, you should set a listener method on the `AdjustConfig` object. This will get triggered once the Adjust SDK gets the info about the deep link content from the backend. +In order to get information about the `deep_link` parameter content in a deferred deep linking scenario, you should set a listener method on the `AdjustConfig` object. This will be triggered once the Adjust SDK gets the information about the deep link content from the Adjust backend. ```java AdjustConfig config = new AdjustConfig(this, appToken, environment); @@ -903,17 +898,17 @@ config.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() { Adjust.onCreate(config); ``` -Once the Adjust SDK receives the info about the deep link content from the backend, it will deliver you the info about its content in this listener and expect the `boolean` return value from you. This return value represents your decision on whether the Adjust SDK should launch the Activity to which you have assigned the scheme name from the deep link (like in the standard deep linking scenario) or not. +Once the Adjust SDK receives the information about the deep link content from the Adjust backend, it will deliver you the information about its content in this listener and expect the `boolean` return value from you. This return value represents your decision on whether the Adjust SDK should launch the Activity to which you have assigned the scheme name from the deep link (like in the standard deep linking scenario) or not. -If you return `true`, we will launch it and the exact same scenario which is described in the [Standard deep linking scenario chapter](#deeplinking-standard) will happen. If you do not want the SDK to launch the Activity, you can return `false` from this listener and based on the deep link content decide on your own what to do next in your app. +If you return `true`, we will launch it and the exact same scenario which is described in the [Standard deep linking scenario chapter](#deeplinking-standard) will happen. If you do not want the SDK to launch the Activity, you can return `false` from this listener, and, based on the deep link content, decide on your own what to do next in your app. ### Reattribution via deep links -Adjust enables you to run re-engagement campaigns with usage of deep links. For more information on how to do that, please check our [official docs][reattribution-with-deeplinks]. +Adjust enables you to run re-engagement campaigns through deep links. For more information on how to do that, please check our [official docs][reattribution-with-deeplinks]. If you are using this feature, in order for your user to be properly reattributed, you need to make one additional call to the Adjust SDK in your app. -Once you have received deep link content information in your app, add a call to `Adjust.appWillOpenUrl` method. By making this call, the Adjust SDK will try to find if there is any new attribution info inside of the deep link and if any, it will be sent to the Adjust backend. If your user should be reattributed due to a click on the adjust tracker URL with deep link content in it, you will see the [attribution callback](#attribution-callback) in your app being triggered with new attribution info for this user. +Once you have received deep link content information in your app, add a call to the `Adjust.appWillOpenUrl` method. By making this call, the Adjust SDK will try to find if there is any new attribution information inside of the deep link. If there is any, it will be sent to the Adjust backend. If your user should be reattributed due to a click on the adjust tracker URL with deep link content, you will see the [attribution callback](#attribution-callback) in your app being triggered with new attribution info for this user. The call to `Adjust.appWillOpenUrl` should be done like this: From cdcea053163395ffb30fc83611bc49fcd8b0c51b Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 26 May 2017 18:19:14 +0200 Subject: [PATCH 143/146] Adding Adjust proguard rules --- Adjust/adjust/adjust-proguard-rules.txt | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 Adjust/adjust/adjust-proguard-rules.txt diff --git a/Adjust/adjust/adjust-proguard-rules.txt b/Adjust/adjust/adjust-proguard-rules.txt new file mode 100644 index 000000000..bee679bbe --- /dev/null +++ b/Adjust/adjust/adjust-proguard-rules.txt @@ -0,0 +1,22 @@ +-keep public class com.adjust.sdk.** { *; } +-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient { + com.google.android.gms.ads.identifier.AdvertisingIdClient$Info getAdvertisingIdInfo(android.content.Context); +} +-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient$Info { + java.lang.String getId(); + boolean isLimitAdTrackingEnabled(); +} +-keep class dalvik.system.VMRuntime { + java.lang.String getRuntime(); +} +-keep class android.os.Build { + java.lang.String[] SUPPORTED_ABIS; + java.lang.String CPU_ABI; +} +-keep class android.content.res.Configuration { + android.os.LocaledList getLocales(); + java.util.Locale locale; +} +-keep class android.os.LocaledList { + java.util.Locale get(int); +} \ No newline at end of file From 463b9c24f90c724a97cfffe64c59bb206f17cfbf Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 26 May 2017 18:19:49 +0200 Subject: [PATCH 144/146] Assigning Adjust proguard rules to resulting AAR library --- Adjust/adjust/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/Adjust/adjust/build.gradle b/Adjust/adjust/build.gradle index d1e3f29b6..cfc9e9a06 100644 --- a/Adjust/adjust/build.gradle +++ b/Adjust/adjust/build.gradle @@ -13,6 +13,7 @@ android { targetSdkVersion 26 versionCode 1 versionName getVersionName() + consumerProguardFiles 'adjust-proguard-rules.txt' } } From f7834e8635291d2d2792d8686ac473805ce505b2 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 26 May 2017 18:20:09 +0200 Subject: [PATCH 145/146] Configuring Adjust AndroidManifest.xml --- Adjust/adjust/src/main/AndroidManifest.xml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Adjust/adjust/src/main/AndroidManifest.xml b/Adjust/adjust/src/main/AndroidManifest.xml index 91069a33a..9bc8d378e 100644 --- a/Adjust/adjust/src/main/AndroidManifest.xml +++ b/Adjust/adjust/src/main/AndroidManifest.xml @@ -1,11 +1,14 @@ - + + - - + + + + + + + From 029a0ffdb33e528bf457ee5add98540df0207233 Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 13 Dec 2017 16:06:57 +0100 Subject: [PATCH 146/146] Updating adjust-proguard-rules.txt --- Adjust/adjust/adjust-proguard-rules.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Adjust/adjust/adjust-proguard-rules.txt b/Adjust/adjust/adjust-proguard-rules.txt index bee679bbe..c7ecab901 100644 --- a/Adjust/adjust/adjust-proguard-rules.txt +++ b/Adjust/adjust/adjust-proguard-rules.txt @@ -1,4 +1,7 @@ -keep public class com.adjust.sdk.** { *; } +-keep class com.google.android.gms.common.ConnectionResult { + int SUCCESS; +} -keep class com.google.android.gms.ads.identifier.AdvertisingIdClient { com.google.android.gms.ads.identifier.AdvertisingIdClient$Info getAdvertisingIdInfo(android.content.Context); } @@ -19,4 +22,5 @@ } -keep class android.os.LocaledList { java.util.Locale get(int); -} \ No newline at end of file +} +-keep public class com.android.installreferrer.** { *; } \ No newline at end of file