Skip to content

Commit

Permalink
Merge pull request #331 from adjust/v4130
Browse files Browse the repository at this point in the history
Version 4.13.0
  • Loading branch information
uerceg authored Apr 27, 2018
2 parents f199d24 + 51b8ea7 commit 2602ae6
Show file tree
Hide file tree
Showing 39 changed files with 527 additions and 92 deletions.
4 changes: 2 additions & 2 deletions Adjust/adjust/adjust-proguard-rules.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@
java.lang.String CPU_ABI;
}
-keep class android.content.res.Configuration {
android.os.LocaledList getLocales();
android.os.LocaleList getLocales();
java.util.Locale locale;
}
-keep class android.os.LocaledList {
-keep class android.os.LocaleList {
java.util.Locale get(int);
}
-keep public class com.android.installreferrer.** { *; }
2 changes: 1 addition & 1 deletion Adjust/adjust/build.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
apply plugin: 'com.android.library'

def getVersionName() {
return "4.12.4"
return "4.13.0"
}

android {
Expand Down
108 changes: 98 additions & 10 deletions Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ public class ActivityHandler implements IActivityHandler {
private TimerOnce delayStartTimer;
private InternalState internalState;
private String basePath;
private String gdprPath;

private DeviceInfo deviceInfo;
private AdjustConfig adjustConfig; // always valid after construction
Expand Down Expand Up @@ -592,6 +593,26 @@ public void run() {
});
}

@Override
public void gdprForgetMe() {
scheduledExecutor.submit(new Runnable() {
@Override
public void run() {
gdprForgetMeI();
}
});
}

@Override
public void gotOptOutResponse() {
scheduledExecutor.submit(new Runnable() {
@Override
public void run() {
gotOptOutResponseI();
}
});
}

@Override
public Context getContext() {
return adjustConfig.context;
Expand Down Expand Up @@ -633,6 +654,11 @@ public String getBasePath() {
return this.basePath;
}

@Override
public String getGdprPath() {
return this.gdprPath;
}

public ActivityPackage getAttributionPackageI() {
long now = System.currentTimeMillis();
PackageBuilder attributionBuilder = new PackageBuilder(adjustConfig,
Expand Down Expand Up @@ -727,6 +753,14 @@ public void run(ActivityHandler activityHandler) {
}
}

// GDPR
if (internalState.hasFirstSdkStartOcurred()) {
SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext());
if (sharedPreferencesManager.getGdprForgetMe()) {
gdprForgetMe();
}
}

foregroundTimer = new TimerCycle(
new Runnable() {
@Override
Expand Down Expand Up @@ -765,6 +799,7 @@ public void run() {
UtilNetworking.setUserAgent(adjustConfig.userAgent);

this.basePath = adjustConfig.basePath;
this.gdprPath = adjustConfig.gdprPath;

packageHandler = AdjustFactory.getPackageHandler(this, adjustConfig.context, toSendI(false));

Expand All @@ -780,10 +815,8 @@ public void run() {
updatePackagesI();
}

preLaunchActionsI(adjustConfig.preLaunchActionsArray);

installReferrer = new InstallReferrer(adjustConfig.context, this);

preLaunchActionsI(adjustConfig.preLaunchActionsArray);
sendReftagReferrerI();
}

Expand Down Expand Up @@ -848,13 +881,17 @@ private void startFirstSessionI() {

SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext());
activityState.pushToken = sharedPreferencesManager.getPushToken();
// activityState.isGdprForgotten = sharedPreferencesManager.getGdprForgetMe();

// track the first session package only if it's enabled
if (internalState.isEnabled()) {
activityState.sessionCount = 1; // this is the first session
transferSessionPackageI(now);

checkAfterNewStartI(sharedPreferencesManager);
if (!sharedPreferencesManager.getGdprForgetMe()) {
activityState.sessionCount = 1; // this is the first session
transferSessionPackageI(now);
checkAfterNewStartI(sharedPreferencesManager);
} else {
gdprForgetMeI();
}
}

activityState.resetSessionAttributes(now);
Expand All @@ -863,11 +900,16 @@ private void startFirstSessionI() {

writeActivityStateI();
sharedPreferencesManager.removePushToken();
sharedPreferencesManager.removeGdprForgetMe();

// don't check attribution right after first sdk start
}

private void processSessionI() {
if (activityState.isGdprForgotten) {
return;
}

long now = System.currentTimeMillis();

long lastInterval = now - activityState.lastActivity;
Expand Down Expand Up @@ -951,6 +993,7 @@ private void trackEventI(AdjustEvent event) {
if (!isEnabledI()) return;
if (!checkEventI(event)) return;
if (!checkOrderIdI(event.orderId)) return;
if (activityState.isGdprForgotten) return;

long now = System.currentTimeMillis();

Expand Down Expand Up @@ -1213,6 +1256,13 @@ private void setEnabledI(boolean enabled) {
return;
}

if (enabled) {
if (activityState.isGdprForgotten) {
logger.error("Re-enabling SDK not possible for forgotten user");
return;
}
}

// save new enabled state in internal state
internalState.enabled = enabled;

Expand All @@ -1224,9 +1274,16 @@ private void setEnabledI(boolean enabled) {
return;
}

activityState.enabled = enabled;
writeActivityStateI();

if (enabled) {
SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext());

if (sharedPreferencesManager.getGdprForgetMe()) {
gdprForgetMeI();
}

// check if install was tracked
if (!sharedPreferencesManager.getInstallTracked()) {
long now = System.currentTimeMillis();
Expand All @@ -1235,9 +1292,6 @@ private void setEnabledI(boolean enabled) {
checkAfterNewStartI(sharedPreferencesManager);
}

activityState.enabled = enabled;
writeActivityStateI();

updateStatusI(!enabled,
"Pausing handlers due to SDK being disabled",
"Handlers remain paused",
Expand Down Expand Up @@ -1729,6 +1783,7 @@ public void resetSessionPartnerParametersI() {
private void setPushTokenI(String token) {
if (!checkActivityStateI(activityState)) { return; }
if (!isEnabledI()) { return; }
if (activityState.isGdprForgotten) { return; }

if (token == null) { return; }
if (token.equals(activityState.pushToken)) { return; }
Expand All @@ -1754,6 +1809,39 @@ private void setPushTokenI(String token) {
}
}

private void gdprForgetMeI() {
if (!checkActivityStateI(activityState)) { return; }
if (!isEnabledI()) { return; }
if (activityState.isGdprForgotten) { return; }

activityState.isGdprForgotten = true;
writeActivityStateI();

long now = System.currentTimeMillis();
PackageBuilder gdprPackageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now);

ActivityPackage gdprPackage = gdprPackageBuilder.buildGdprPackage();
packageHandler.addPackage(gdprPackage);

// If GDPR choice was cached, remove it.
SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(getContext());
sharedPreferencesManager.removeGdprForgetMe();

if (adjustConfig.eventBufferingEnabled) {
logger.info("Buffered event %s", gdprPackage.getSuffix());
} else {
packageHandler.sendFirstPackage();
}
}

private void gotOptOutResponseI() {
activityState.isGdprForgotten = true;
writeActivityStateI();

packageHandler.flush();
setEnabledI(false);
}

private void readActivityStateI(Context context) {
try {
activityState = Util.readObject(context, ACTIVITY_STATE_FILENAME, ACTIVITY_STATE_NAME, ActivityState.class);
Expand Down
6 changes: 5 additions & 1 deletion Adjust/adjust/src/main/java/com/adjust/sdk/ActivityKind.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.adjust.sdk;

public enum ActivityKind {
UNKNOWN, SESSION, EVENT, CLICK, ATTRIBUTION, REVENUE, REATTRIBUTION, INFO;
UNKNOWN, SESSION, EVENT, CLICK, ATTRIBUTION, REVENUE, REATTRIBUTION, INFO, GDPR;

public static ActivityKind fromString(String string) {
if ("session".equals(string)) {
Expand All @@ -14,6 +14,8 @@ public static ActivityKind fromString(String string) {
return ATTRIBUTION;
} else if ("info".equals(string)) {
return INFO;
} else if ("gdpr".equals(string)) {
return GDPR;
} else {
return UNKNOWN;
}
Expand All @@ -32,6 +34,8 @@ public String toString() {
return "attribution";
case INFO:
return "info";
case GDPR:
return "gdpr";
default:
return "unknown";
}
Expand Down
6 changes: 6 additions & 0 deletions Adjust/adjust/src/main/java/com/adjust/sdk/ActivityState.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ public class ActivityState implements Serializable, Cloneable {
private static final ObjectStreamField[] serialPersistentFields = {
new ObjectStreamField("uuid", String.class),
new ObjectStreamField("enabled", boolean.class),
new ObjectStreamField("isGdprForgotten", boolean.class),
new ObjectStreamField("askingAttribution", boolean.class),
new ObjectStreamField("eventCount", int.class),
new ObjectStreamField("sessionCount", int.class),
Expand All @@ -46,6 +47,7 @@ public class ActivityState implements Serializable, Cloneable {
// persistent data
protected String uuid;
protected boolean enabled;
protected boolean isGdprForgotten;
protected boolean askingAttribution;

// global counters
Expand Down Expand Up @@ -76,6 +78,7 @@ protected ActivityState() {
// create UUID for new devices
uuid = Util.createUuid();
enabled = true;
isGdprForgotten = false;
askingAttribution = false;
eventCount = 0; // no events yet
sessionCount = 0; // the first session just started
Expand Down Expand Up @@ -136,6 +139,7 @@ public boolean equals(Object other) {

if (!Util.equalString(uuid, otherActivityState.uuid)) return false;
if (!Util.equalBoolean(enabled, otherActivityState.enabled)) return false;
if (!Util.equalBoolean(isGdprForgotten, otherActivityState.isGdprForgotten)) return false;
if (!Util.equalBoolean(askingAttribution, otherActivityState.askingAttribution)) return false;
if (!Util.equalInt(eventCount, otherActivityState.eventCount)) return false;
if (!Util.equalInt(sessionCount, otherActivityState.sessionCount)) return false;
Expand All @@ -158,6 +162,7 @@ public int hashCode() {
int hashCode = 17;
hashCode = 37 * hashCode + Util.hashString(uuid);
hashCode = 37 * hashCode + Util.hashBoolean(enabled);
hashCode = 37 * hashCode + Util.hashBoolean(isGdprForgotten);
hashCode = 37 * hashCode + Util.hashBoolean(askingAttribution);
hashCode = 37 * hashCode + eventCount;
hashCode = 37 * hashCode + sessionCount;
Expand Down Expand Up @@ -189,6 +194,7 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo
// new fields
uuid = Util.readStringField(fields, "uuid", null);
enabled = Util.readBooleanField(fields, "enabled", true);
isGdprForgotten = Util.readBooleanField(fields, "isGdprForgotten", false);
askingAttribution = Util.readBooleanField(fields, "askingAttribution", false);

updatePackages = Util.readBooleanField(fields, "updatePackages", false);
Expand Down
Loading

0 comments on commit 2602ae6

Please sign in to comment.