Skip to content

Commit fea27f8

Browse files
committed
Merge pull request #69 from adjust/mail_sha1
Vulcun
2 parents f5662b9 + c39becd commit fea27f8

File tree

12 files changed

+307
-43
lines changed

12 files changed

+307
-43
lines changed

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

Lines changed: 20 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,19 @@
99

1010
package com.adjust.sdk;
1111

12-
import static com.adjust.sdk.Constants.LOGTAG;
13-
import static com.adjust.sdk.Constants.SESSION_STATE_FILENAME;
14-
import static com.adjust.sdk.Constants.UNKNOWN;
12+
import android.app.Activity;
13+
import android.content.Context;
14+
import android.content.Intent;
15+
import android.content.SharedPreferences;
16+
import android.content.pm.PackageManager;
17+
import android.content.pm.ResolveInfo;
18+
import android.net.Uri;
19+
import android.os.Bundle;
20+
import android.os.Handler;
21+
import android.os.HandlerThread;
22+
import android.os.Looper;
23+
import android.os.Message;
24+
import android.preference.PreferenceManager;
1525

1626
import java.io.BufferedInputStream;
1727
import java.io.BufferedOutputStream;
@@ -31,21 +41,9 @@
3141
import java.util.concurrent.ScheduledExecutorService;
3242
import java.util.concurrent.TimeUnit;
3343

34-
import android.app.Activity;
35-
import android.content.Context;
36-
import android.content.Intent;
37-
import android.content.SharedPreferences;
38-
import android.content.pm.ApplicationInfo;
39-
import android.content.pm.PackageManager;
40-
import android.content.pm.PackageManager.NameNotFoundException;
41-
import android.content.pm.ResolveInfo;
42-
import android.net.Uri;
43-
import android.os.Bundle;
44-
import android.os.Handler;
45-
import android.os.HandlerThread;
46-
import android.os.Looper;
47-
import android.os.Message;
48-
import android.preference.PreferenceManager;
44+
import static com.adjust.sdk.Constants.LOGTAG;
45+
import static com.adjust.sdk.Constants.SESSION_STATE_FILENAME;
46+
import static com.adjust.sdk.Constants.UNKNOWN;
4947

5048
public class ActivityHandler extends HandlerThread {
5149

@@ -75,6 +73,7 @@ public class ActivityHandler extends HandlerThread {
7573
private String fbAttributionId;
7674
private String userAgent; // changes, should be updated periodically
7775
private String clientSdk;
76+
private Map<String,String> pluginKeys;
7877

7978
public ActivityHandler(Activity activity) {
8079
super(LOGTAG, MIN_PRIORITY);
@@ -112,6 +111,7 @@ private void initActivityHandler(Activity activity) {
112111
sessionHandler = new SessionHandler(getLooper(), this);
113112
context = activity.getApplicationContext();
114113
clientSdk = Constants.CLIENT_SDK;
114+
pluginKeys = Util.getPluginKeys(context);
115115
enabled = true;
116116

117117
logger = AdjustFactory.getLogger();
@@ -615,6 +615,7 @@ private void injectGeneralAttributes(PackageBuilder builder) {
615615
builder.setClientSdk(clientSdk);
616616
builder.setEnvironment(environment);
617617
builder.setDefaultTracker(defaultTracker);
618+
builder.setPluginKeys(pluginKeys);
618619
}
619620

620621
private void injectReferrer(PackageBuilder builder) {
@@ -675,7 +676,7 @@ private boolean checkPermissions(Context context) {
675676
}
676677

677678
private String processApplicationBundle() {
678-
Bundle bundle = getApplicationBundle();
679+
Bundle bundle = Util.getApplicationBundle(this.context, logger);
679680
if (null == bundle) {
680681
return null;
681682
}
@@ -731,20 +732,6 @@ private void setDropOfflineActivities(boolean drop) {
731732
}
732733
}
733734

734-
private Bundle getApplicationBundle() {
735-
final ApplicationInfo applicationInfo;
736-
try {
737-
String packageName = context.getPackageName();
738-
applicationInfo = context.getPackageManager().getApplicationInfo(packageName, PackageManager.GET_META_DATA);
739-
return applicationInfo.metaData;
740-
} catch (NameNotFoundException e) {
741-
logger.error("ApplicationInfo not found");
742-
} catch (Exception e) {
743-
logger.error("Failed to get ApplicationBundle (%s)", e);
744-
}
745-
return null;
746-
}
747-
748735
private boolean checkContext(Context context) {
749736
if (null == context) {
750737
logger.error("Missing context");

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99

1010
package com.adjust.sdk;
1111

12+
import java.util.ArrayList;
13+
import java.util.Arrays;
14+
import java.util.List;
15+
1216
/**
1317
* @author keyboardsurfer
1418
* @since 8.11.13
@@ -40,4 +44,7 @@ public interface Constants {
4044
String ENCODING = "UTF-8";
4145
String MD5 = "MD5";
4246
String SHA1 = "SHA-1";
47+
48+
// List of known plugins, possibly not active
49+
List<String> PLUGINS = Arrays.asList("com.adjust.sdk.plugin.Vulcun");
4350
}

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public class PackageBuilder {
3333
private String clientSdk;
3434
private String uuid;
3535
private String environment;
36+
private Map<String, String> pluginsKeys;
3637

3738
// sessions
3839
private int sessionCount;
@@ -154,6 +155,10 @@ public void setDeepLinkParameters(Map<String, String> deepLinkParameters) {
154155
this.deepLinkParameters = deepLinkParameters;
155156
}
156157

158+
public void setPluginKeys(Map<String, String> pluginKeys) {
159+
this.pluginsKeys = pluginKeys;
160+
}
161+
157162
public boolean isValidForEvent() {
158163
if (null == eventToken) {
159164
Logger logger = AdjustFactory.getLogger();
@@ -262,6 +267,8 @@ private Map<String, String> getDefaultParameters() {
262267
addString(parameters, "gps_adid", playAdId);
263268
Boolean isTrackingEnabled = Util.isPlayTrackingEnabled(context);
264269
addBoolean(parameters, "tracking_enabled", isTrackingEnabled);
270+
fillPluginKeys(parameters);
271+
checkDeviceIds(parameters);
265272

266273
// session related (used for events as well)
267274
addInt(parameters, "session_count", sessionCount);
@@ -272,6 +279,27 @@ private Map<String, String> getDefaultParameters() {
272279
return parameters;
273280
}
274281

282+
private void checkDeviceIds(Map<String, String> parameters) {
283+
if (!parameters.containsKey("mac_sha1")
284+
&& !parameters.containsKey("mac_md5")
285+
&& !parameters.containsKey("android_id")
286+
&& !parameters.containsKey("gps_adid"))
287+
{
288+
Logger logger = AdjustFactory.getLogger();
289+
logger.error("Missing device id's. Please check if Proguard is correctly set with Adjust SDK");
290+
}
291+
}
292+
293+
private void fillPluginKeys(Map<String, String> parameters) {
294+
if (pluginsKeys == null) {
295+
return;
296+
}
297+
298+
for (Map.Entry<String, String> pluginEntry : pluginsKeys.entrySet()) {
299+
addString(parameters, pluginEntry.getKey(), pluginEntry.getValue());
300+
}
301+
}
302+
275303
private void injectEventParameters(Map<String, String> parameters) {
276304
addInt(parameters, "event_count", eventCount);
277305
addString(parameters, "event_token", eventToken);

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

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.adjust.sdk;
22

3+
import java.lang.reflect.Constructor;
34
import java.lang.reflect.Field;
45
import java.lang.reflect.Method;
56

@@ -53,7 +54,7 @@ public static boolean isGooglePlayServicesAvailable(Context context) {
5354
public static String getMacAddress(Context context) {
5455
try {
5556
String macSha1 = (String) invokeStaticMethod(
56-
"com.adjust.sdk.deviceIds.MacAddressUtil",
57+
"com.adjust.sdk.plugin.MacAddressUtil",
5758
"getMacAddress",
5859
new Class[] {Context.class}, context
5960
);
@@ -67,7 +68,7 @@ public static String getMacAddress(Context context) {
6768

6869
public static String getAndroidId(Context context) {
6970
try {
70-
String androidId = (String) invokeStaticMethod("com.adjust.sdk.deviceIds.AndroidIdUtil", "getAndroidId"
71+
String androidId = (String) invokeStaticMethod("com.adjust.sdk.plugin.AndroidIdUtil", "getAndroidId"
7172
,new Class[] {Context.class}, context);
7273

7374
return androidId;
@@ -77,6 +78,18 @@ public static String getAndroidId(Context context) {
7778
}
7879
}
7980

81+
public static String getSha1EmailAddress(Context context, String key) {
82+
try {
83+
String sha1EmailAddress = (String) invokeStaticMethod("com.adjust.sdk.plugin.EmailUtil", "getSha1EmailAddress"
84+
,new Class[] {Context.class, String.class}, context, key);
85+
86+
return sha1EmailAddress;
87+
}
88+
catch (Throwable t) {
89+
return null;
90+
}
91+
}
92+
8093
private static Object getAdvertisingInfoObject(Context context)
8194
throws Exception {
8295
return invokeStaticMethod("com.google.android.gms.ads.identifier.AdvertisingIdClient",
@@ -104,21 +117,56 @@ private static boolean isConnectionResultSuccess(Integer statusCode) {
104117
}
105118
}
106119

107-
private static Object invokeStaticMethod(String className, String methodName, Class[] cArgs, Object... args)
120+
public static Class forName(String className) {
121+
try {
122+
Class classObject = Class.forName(className);
123+
return classObject;
124+
} catch (Throwable t) {
125+
return null;
126+
}
127+
}
128+
129+
public static Object createDefaultInstance(String className) {
130+
Class classObject = forName(className);
131+
Object instance = createDefaultInstance(classObject);
132+
return instance;
133+
}
134+
135+
public static Object createDefaultInstance(Class classObject) {
136+
try {
137+
Object instance = classObject.newInstance();
138+
return instance;
139+
}catch (Throwable t) {
140+
return null;
141+
}
142+
}
143+
144+
public static Object createInstance(String className, Class[] cArgs, Object... args) {
145+
try {
146+
Class classObject = Class.forName(className);
147+
Constructor constructor = classObject.getConstructor(cArgs);
148+
Object instance = constructor.newInstance(args);
149+
return instance;
150+
}catch (Throwable t) {
151+
return null;
152+
}
153+
}
154+
155+
public static Object invokeStaticMethod(String className, String methodName, Class[] cArgs, Object... args)
108156
throws Exception {
109157
Class classObject = Class.forName(className);
110158

111159
return invokeMethod(classObject, methodName, null, cArgs, args);
112160
}
113161

114-
private static Object invokeInstanceMethod(Object instance, String methodName, Class[] cArgs, Object... args)
162+
public static Object invokeInstanceMethod(Object instance, String methodName, Class[] cArgs, Object... args)
115163
throws Exception {
116164
Class classObject = instance.getClass();
117165

118166
return invokeMethod(classObject, methodName, instance, cArgs, args);
119167
}
120168

121-
private static Object invokeMethod(Class classObject, String methodName, Object instance, Class[] cArgs, Object... args)
169+
public static Object invokeMethod(Class classObject, String methodName, Object instance, Class[] cArgs, Object... args)
122170
throws Exception {
123171
Method methodObject = classObject.getMethod(methodName, cArgs);
124172

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

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import static com.adjust.sdk.Constants.MD5;
1818
import static com.adjust.sdk.Constants.MEDIUM;
1919
import static com.adjust.sdk.Constants.NORMAL;
20+
import static com.adjust.sdk.Constants.PLUGINS;
2021
import static com.adjust.sdk.Constants.SHA1;
2122
import static com.adjust.sdk.Constants.SMALL;
2223
import static com.adjust.sdk.Constants.UNKNOWN;
@@ -25,7 +26,11 @@
2526
import java.math.BigInteger;
2627
import java.security.MessageDigest;
2728
import java.text.SimpleDateFormat;
29+
import java.util.ArrayList;
30+
import java.util.HashMap;
31+
import java.util.List;
2832
import java.util.Locale;
33+
import java.util.Map;
2934
import java.util.UUID;
3035
import java.util.regex.Matcher;
3136
import java.util.regex.Pattern;
@@ -35,6 +40,7 @@
3540

3641
import android.content.ContentResolver;
3742
import android.content.Context;
43+
import android.content.pm.ApplicationInfo;
3844
import android.content.pm.PackageInfo;
3945
import android.content.pm.PackageManager;
4046
import android.content.pm.PackageManager.NameNotFoundException;
@@ -43,9 +49,12 @@
4349
import android.database.Cursor;
4450
import android.net.Uri;
4551
import android.os.Build;
52+
import android.os.Bundle;
4653
import android.text.TextUtils;
4754
import android.util.DisplayMetrics;
4855

56+
import com.adjust.sdk.plugin.Plugin;
57+
4958
/**
5059
* Collects utility functions used by Adjust.
5160
*/
@@ -313,7 +322,7 @@ public static String getAndroidId(Context context) {
313322
return Reflection.getAndroidId(context);
314323
}
315324

316-
private static String sha1(final String text) {
325+
public static String sha1(final String text) {
317326
return hash(text, SHA1);
318327
}
319328

@@ -322,20 +331,65 @@ private static String md5(final String text) {
322331
}
323332

324333
private static String hash(final String text, final String method) {
334+
String hashString = null;
325335
try {
326336
final byte[] bytes = text.getBytes(ENCODING);
327337
final MessageDigest mesd = MessageDigest.getInstance(method);
328338
mesd.update(bytes, 0, bytes.length);
329339
final byte[] hash = mesd.digest();
330-
return convertToHex(hash);
340+
hashString = convertToHex(hash);
331341
} catch (Exception e) {
332-
return null;
333342
}
343+
return hashString;
334344
}
335345

336346
private static String convertToHex(final byte[] bytes) {
337347
final BigInteger bigInt = new BigInteger(1, bytes);
338348
final String formatString = "%0" + (bytes.length << 1) + "x";
339349
return String.format(formatString, bigInt);
340350
}
351+
352+
public static Map<String, String> getPluginKeys(Context context) {
353+
Map<String, String> pluginKeys = new HashMap<String, String>();
354+
355+
for (Plugin plugin : getPlugins()) {
356+
Map.Entry<String, String> pluginEntry = plugin.getParameter(context);
357+
if (pluginEntry != null) {
358+
pluginKeys.put(pluginEntry.getKey(), pluginEntry.getValue());
359+
}
360+
}
361+
362+
if (pluginKeys.size() == 0) {
363+
return null;
364+
} else {
365+
return pluginKeys;
366+
}
367+
}
368+
369+
private static List<Plugin> getPlugins() {
370+
List<Plugin> plugins = new ArrayList<Plugin>(PLUGINS.size());
371+
372+
for (String pluginName : PLUGINS) {
373+
Object pluginObject = Reflection.createDefaultInstance(pluginName);
374+
if (pluginObject != null && pluginObject instanceof Plugin) {
375+
plugins.add((Plugin) pluginObject);
376+
}
377+
}
378+
379+
return plugins;
380+
}
381+
382+
public static Bundle getApplicationBundle(Context context, Logger logger) {
383+
final ApplicationInfo applicationInfo;
384+
try {
385+
String packageName = context.getPackageName();
386+
applicationInfo = context.getPackageManager().getApplicationInfo(packageName, PackageManager.GET_META_DATA);
387+
return applicationInfo.metaData;
388+
} catch (NameNotFoundException e) {
389+
logger.error("ApplicationInfo not found");
390+
} catch (Exception e) {
391+
logger.error("Failed to get ApplicationBundle (%s)", e);
392+
}
393+
return null;
394+
}
341395
}

0 commit comments

Comments
 (0)