Skip to content

Commit 297acea

Browse files
committed
Merge pull request #43 from adjust/development
Added deep link parameters Fixed new fields in migrating devices
2 parents c012aad + 2d1b273 commit 297acea

File tree

13 files changed

+268
-53
lines changed

13 files changed

+268
-53
lines changed

Adjust/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ android {
2424
compileSdkVersion 19
2525
defaultConfig {
2626
versionCode 11
27-
versionName '3.2.0'
27+
versionName '3.3.0'
2828
minSdkVersion 8
2929
targetSdkVersion 19
3030
}

Adjust/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<modelVersion>4.0.0</modelVersion>
66
<artifactId>adjust-android</artifactId>
77
<groupId>com.adjust.sdk</groupId>
8-
<version>3.2.0</version>
8+
<version>3.3.0</version>
99
<packaging>jar</packaging>
1010
<properties>
1111
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

Adjust/src/com/adjust/sdk/ActivityHandler.java

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.io.ObjectOutputStream;
2525
import java.io.OptionalDataException;
2626
import java.lang.ref.WeakReference;
27+
import java.util.HashMap;
2728
import java.util.Locale;
2829
import java.util.Map;
2930
import java.util.concurrent.Executors;
@@ -36,6 +37,7 @@
3637
import android.content.pm.ApplicationInfo;
3738
import android.content.pm.PackageManager;
3839
import android.content.pm.PackageManager.NameNotFoundException;
40+
import android.net.Uri;
3941
import android.os.Bundle;
4042
import android.os.Handler;
4143
import android.os.HandlerThread;
@@ -49,6 +51,7 @@ public class ActivityHandler extends HandlerThread {
4951
private static long SESSION_INTERVAL;
5052
private static long SUBSESSION_INTERVAL;
5153
private static final String TIME_TRAVEL = "Time travel!";
54+
private static final String ADJUST_PREFIX = "adjust_";
5255

5356
private final SessionHandler sessionHandler;
5457
private IPackageHandler packageHandler;
@@ -195,13 +198,22 @@ public Boolean isEnabled() {
195198
}
196199
}
197200

201+
public void readOpenUrl(Uri url) {
202+
Message message = Message.obtain();
203+
message.arg1 = SessionHandler.DEEP_LINK;
204+
message.obj = url;
205+
sessionHandler.sendMessage(message);
206+
}
207+
198208
private static final class SessionHandler extends Handler {
199209
private static final int INIT_BUNDLE = 72630;
200210
private static final int INIT_PRESET = 72633;
201211
private static final int START = 72640;
202212
private static final int END = 72650;
203213
private static final int EVENT = 72660;
204214
private static final int REVENUE = 72670;
215+
private static final int DEEP_LINK = 72680;
216+
205217

206218
private final WeakReference<ActivityHandler> sessionHandlerReference;
207219

@@ -240,6 +252,10 @@ public void handleMessage(Message message) {
240252
PackageBuilder revenueBuilder = (PackageBuilder) message.obj;
241253
sessionHandler.trackRevenueInternal(revenueBuilder);
242254
break;
255+
case DEEP_LINK:
256+
Uri url = (Uri) message.obj;
257+
sessionHandler.readOpenUrlInternal(url);
258+
break;
243259
}
244260
}
245261
}
@@ -412,6 +428,49 @@ private void trackRevenueInternal(PackageBuilder revenueBuilder) {
412428
logger.debug(String.format(Locale.US, "Event %d (revenue)", activityState.eventCount));
413429
}
414430

431+
private void readOpenUrlInternal(Uri url) {
432+
if (url == null) {
433+
return;
434+
}
435+
436+
String queryString = url.getQuery();
437+
if (queryString == null) {
438+
return;
439+
}
440+
441+
Map<String, String> adjustDeepLinks = new HashMap<String, String>();
442+
443+
String[] queryPairs = queryString.split("&");
444+
for (String pair : queryPairs) {
445+
String[] pairComponents = pair.split("=");
446+
if (pairComponents.length != 2) continue;
447+
448+
String key = pairComponents[0];
449+
if (!key.startsWith(ADJUST_PREFIX)) continue;
450+
451+
String value = pairComponents[1];
452+
if (value.length() == 0) continue;
453+
454+
String keyWOutPrefix = key.substring(ADJUST_PREFIX.length());
455+
if (keyWOutPrefix.length() == 0) continue;
456+
457+
adjustDeepLinks.put(keyWOutPrefix, value);
458+
}
459+
460+
if (adjustDeepLinks.size() == 0) {
461+
return;
462+
}
463+
464+
PackageBuilder builder = new PackageBuilder(context);
465+
builder.setDeepLinkParameters(adjustDeepLinks);
466+
injectGeneralAttributes(builder);
467+
ActivityPackage reattributionPackage = builder.buildReattributionPackage();
468+
packageHandler.addPackage(reattributionPackage);
469+
packageHandler.sendFirstPackage();
470+
471+
logger.debug(String.format("Reattribution %s", adjustDeepLinks.toString()));
472+
}
473+
415474
private boolean canTrackEvent(PackageBuilder revenueBuilder) {
416475
return checkAppTokenNotNull(appToken)
417476
&& checkActivityState(activityState)
@@ -486,7 +545,7 @@ private void writeActivityState() {
486545

487546
try {
488547
objectStream.writeObject(activityState);
489-
logger.verbose(String.format("Wrote activity state: %s", activityState));
548+
logger.debug(String.format("Wrote activity state: %s", activityState));
490549
} catch (NotSerializableException e) {
491550
logger.error("Failed to serialize activity state");
492551
} finally {
Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.adjust.sdk;
22

33
public enum ActivityKind {
4-
UNKNOWN, SESSION, EVENT, REVENUE;
4+
UNKNOWN, SESSION, EVENT, REVENUE, REATTRIBUTION;
55

66
public static ActivityKind fromString(String string) {
77
if ("session".equals(string)) {
@@ -10,17 +10,21 @@ public static ActivityKind fromString(String string) {
1010
return EVENT;
1111
} else if ("revenue".equals(string)) {
1212
return REVENUE;
13+
} else if ("reattribution".equals(string)) {
14+
return REATTRIBUTION;
1315
} else {
1416
return UNKNOWN;
1517
}
1618
}
1719

20+
@Override
1821
public String toString() {
1922
switch(this) {
20-
case SESSION: return "session";
21-
case EVENT: return "event";
22-
case REVENUE: return "revenue";
23-
default: return "unknown";
23+
case SESSION: return "session";
24+
case EVENT: return "event";
25+
case REVENUE: return "revenue";
26+
case REATTRIBUTION: return "reattribution";
27+
default: return "unknown";
2428
}
2529
}
2630
}

Adjust/src/com/adjust/sdk/ActivityState.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,20 @@ private void readObject(ObjectInputStream stream) throws NotActiveException, IOE
9393
lastActivity = fields.get("lastActivity", -1l);
9494
createdAt = fields.get("createdAt", -1l);
9595
lastInterval = fields.get("lastInterval", -1l);
96-
uuid = (String)fields.get("uuid", null);
97-
enabled = fields.get("enabled", true);
96+
97+
// default values for migrating devices
98+
uuid = null;
99+
enabled = true;
100+
// try to read in order of less recent new fields
101+
try {
102+
uuid = (String)fields.get("uuid", null);
103+
enabled = fields.get("enabled", true);
104+
// add new fields here
105+
} catch (Exception e) {
106+
Logger logger = AdjustFactory.getLogger();
107+
logger.debug(String.format("Unable to read new field in migration device with error (%s)",
108+
e.getMessage()));
109+
}
98110

99111
// create UUID for migrating devices
100112
if (uuid == null) {

Adjust/src/com/adjust/sdk/Adjust.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.Map;
1515

1616
import android.app.Activity;
17+
import android.net.Uri;
1718

1819
/**
1920
* The main interface to Adjust.
@@ -148,6 +149,16 @@ public static Boolean isEnabled() {
148149
return false;
149150
}
150151

152+
public static void appWillOpenUrl(Uri url) {
153+
try {
154+
activityHandler.readOpenUrl(url);
155+
} catch (NullPointerException e) {
156+
if (logger != null)
157+
logger.error(NO_ACTIVITY_HANDLER_FOUND);
158+
}
159+
160+
}
161+
151162

152163
// Special appDidLaunch method used by SDK wrappers such as our Adobe Air SDK.
153164
protected static void appDidLaunch(Activity activity, String appToken, String environment, String logLevel, boolean eventBuffering) {

Adjust/src/com/adjust/sdk/Constants.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public interface Constants {
1919
int THIRTY_MINUTES = 30 * ONE_MINUTE;
2020

2121
String BASE_URL = "https://app.adjust.io";
22-
String CLIENT_SDK = "android3.2.0";
22+
String CLIENT_SDK = "android3.3.0";
2323
String LOGTAG = "Adjust";
2424

2525
String SESSION_STATE_FILENAME = "AdjustIoActivityState";

Adjust/src/com/adjust/sdk/PackageBuilder.java

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
public class PackageBuilder {
2323

24-
private Context context;
24+
private Context context;
2525

2626
// general
2727
private String appToken;
@@ -50,6 +50,9 @@ public class PackageBuilder {
5050
private double amountInCents;
5151
private Map<String, String> callbackParameters;
5252

53+
// reattributions
54+
private Map<String, String> deepLinkParameters;
55+
5356
public PackageBuilder(Context context)
5457
{
5558
this.context = context;
@@ -147,6 +150,10 @@ public void setCallbackParameters(Map<String, String> callbackParameters) {
147150
this.callbackParameters = callbackParameters;
148151
}
149152

153+
public void setDeepLinkParameters(Map<String, String> deepLinkParameters) {
154+
this.deepLinkParameters = deepLinkParameters;
155+
}
156+
150157
public boolean isValidForEvent() {
151158
if (null == eventToken) {
152159
Logger logger = AdjustFactory.getLogger();
@@ -210,6 +217,19 @@ public ActivityPackage buildRevenuePackage() {
210217
return revenuePackage;
211218
}
212219

220+
public ActivityPackage buildReattributionPackage() {
221+
Map<String, String> parameters = getDefaultParameters();
222+
addMapJson(parameters, "deeplink_parameters", deepLinkParameters);
223+
224+
ActivityPackage reattributionPackage = getDefaultActivityPackage();
225+
reattributionPackage.setPath("/reattribute");
226+
reattributionPackage.setActivityKind(ActivityKind.REATTRIBUTION);
227+
reattributionPackage.setSuffix("");
228+
reattributionPackage.setParameters(parameters);
229+
230+
return reattributionPackage;
231+
}
232+
213233
private boolean isEventTokenValid() {
214234
if (6 != eventToken.length()) {
215235
Logger logger = AdjustFactory.getLogger();
@@ -253,7 +273,7 @@ private Map<String, String> getDefaultParameters() {
253273
private void injectEventParameters(Map<String, String> parameters) {
254274
addInt(parameters, "event_count", eventCount);
255275
addString(parameters, "event_token", eventToken);
256-
addMap(parameters, "params", callbackParameters);
276+
addMapBase64(parameters, "params", callbackParameters);
257277
}
258278

259279
private String getAmountString() {
@@ -309,7 +329,7 @@ private void addDuration(Map<String, String> parameters, String key, long durati
309329
addInt(parameters, key, durationInSeconds);
310330
}
311331

312-
private void addMap(Map<String, String> parameters, String key, Map<String, String> map) {
332+
private void addMapBase64(Map<String, String> parameters, String key, Map<String, String> map) {
313333
if (null == map) {
314334
return;
315335
}
@@ -320,4 +340,15 @@ private void addMap(Map<String, String> parameters, String key, Map<String, Stri
320340

321341
addString(parameters, key, encodedMap);
322342
}
343+
344+
private void addMapJson(Map<String, String> parameters, String key, Map<String, String> map) {
345+
if (null == map) {
346+
return;
347+
}
348+
349+
JSONObject jsonObject = new JSONObject(map);
350+
String jsonString = jsonObject.toString();
351+
352+
addString(parameters, key, jsonString);
353+
}
323354
}

Adjust/src/com/adjust/sdk/Util.java

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -67,19 +67,19 @@ protected static String getUserAgent(final Context context) {
6767
final int screenLayout = configuration.screenLayout;
6868

6969
final String[] parts = {
70-
getPackageName(context),
71-
getAppVersion(context),
72-
getDeviceType(screenLayout),
73-
getDeviceName(),
74-
getOsName(),
75-
getOsVersion(),
76-
getLanguage(locale),
77-
getCountry(locale),
78-
getScreenSize(screenLayout),
79-
getScreenFormat(screenLayout),
80-
getScreenDensity(displayMetrics),
81-
getDisplayWidth(displayMetrics),
82-
getDisplayHeight(displayMetrics)
70+
getPackageName(context),
71+
getAppVersion(context),
72+
getDeviceType(screenLayout),
73+
getDeviceName(),
74+
getOsName(),
75+
getOsVersion(),
76+
getLanguage(locale),
77+
getCountry(locale),
78+
getScreenSize(screenLayout),
79+
getScreenFormat(screenLayout),
80+
getScreenDensity(displayMetrics),
81+
getDisplayWidth(displayMetrics),
82+
getDisplayHeight(displayMetrics)
8383
};
8484
return TextUtils.join(" ", parts);
8585
}
@@ -351,18 +351,18 @@ public static String dateFormat(long date) {
351351
return dateFormat.format(date);
352352
}
353353

354-
public static String getGpsAdid(Context context) {
355-
String gpsAdid = null;
356-
try {
357-
AdvertisingIdClient.Info info = AdvertisingIdClient.getAdvertisingIdInfo(context);
358-
if (!info.isLimitAdTrackingEnabled()) {
354+
public static String getGpsAdid(Context context) {
355+
String gpsAdid = null;
356+
try {
357+
AdvertisingIdClient.Info info = AdvertisingIdClient.getAdvertisingIdInfo(context);
358+
if (!info.isLimitAdTrackingEnabled()) {
359359
gpsAdid = info.getId();
360-
}
361-
} catch (Exception e) {
360+
}
361+
} catch (Exception e) {
362362
Logger logger = AdjustFactory.getLogger();
363-
logger.error(String.format("Error getting Google Play Services advertising ID, (%s)", e.getMessage()));
364-
}
363+
logger.error(String.format("Error getting Google Play Services advertising ID, (%s)", e.getMessage()));
364+
}
365365

366-
return gpsAdid;
367-
}
366+
return gpsAdid;
367+
}
368368
}

0 commit comments

Comments
 (0)