Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AMP-30334 - IdentityManager #254

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/main/java/com/amplitude/api/AmplitudeLog.java
Original file line number Diff line number Diff line change
Expand Up @@ -76,17 +76,17 @@ int v(String tag, String msg, Throwable tr) {
return 0;
}

int w(String tag, String msg) {
public int w(String tag, String msg) {
if (enableLogging && logLevel <= Log.WARN) return Log.w(tag, msg);
return 0;
}

int w(String tag, Throwable tr) {
public int w(String tag, Throwable tr) {
if (enableLogging && logLevel <= Log.WARN) return Log.w(tag, tr);
return 0;
}

int w(String tag, String msg, Throwable tr) {
public int w(String tag, String msg, Throwable tr) {
if (enableLogging && logLevel <= Log.WARN) return Log.w(tag, msg, tr);
return 0;
}
Expand Down
84 changes: 84 additions & 0 deletions src/main/java/com/amplitude/identitymanager/Identity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package com.amplitude.identitymanager;

import com.amplitude.api.AmplitudeLog;

public class Identity {
private String userId;
private String deviceId;
private boolean shouldUseAdvertisingIdForDeviceId = false;
private IdentityListener listener;

public interface IdentityListener {
void onUserIdChanged(String userId);
void onDeviceIdChanged(String deviceId);
}

public Identity() {
this(false, null);
}

public Identity(boolean useAdvertisingId) {
this(useAdvertisingId, null);
}

public Identity(boolean useAdvertisingId, String userId) {
this.userId = userId;
this.shouldUseAdvertisingIdForDeviceId = useAdvertisingId;

initializeDeviceId();
}

public String initializeDeviceId(String deviceId) {
if (this.deviceId == null) {
String deviceIdToUse = "";
if (shouldUseAdvertisingIdForDeviceId) {
deviceIdToUse = IdentityDeviceInfo.getAdvertisingId();
} else {
if (deviceId.length() > 0) {
deviceIdToUse = deviceId;
} else {
deviceIdToUse = IdentityUtils.generateBase36Id();
}
}
this.deviceId = deviceIdToUse;
} else {
AmplitudeLog.getLogger().w(Identity.class.getName(), "Cannot set device ID twice for same identity. Skipping operation.");
}
return this.deviceId;
}

public String initializeDeviceId() {
return initializeDeviceId(null);
}

public String getDeviceId() {
return deviceId;
}

// Should this exist? Otherwise, when would we call the onDeviceIdChanged listener?
public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
if (listener != null) {
listener.onDeviceIdChanged(deviceId);
}
}

public String getUserId() {
return userId;
}

public void setUserId(String userId) {
this.userId = userId;
if (listener != null) {
listener.onUserIdChanged(userId);
}
}

public void addIdentityChangedListener(IdentityListener listener){
this.listener = listener;
}

public void useAdvertisingIdForDeviceId() {
shouldUseAdvertisingIdForDeviceId = true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.amplitude.identitymanager;

import android.os.Build;

public class IdentityDeviceInfo {
public static String getAdvertisingId() {
// This should not be called on the main thread.
if ("Amazon".equals(getManufacturer())) {
return getAndCacheAmazonAdvertisingId();
} else {
return getAndCacheGoogleAdvertisingId();
}
}

private static String getManufacturer() {
return Build.MANUFACTURER;
}

private static String getAndCacheAmazonAdvertisingId() {
return "amazonadvertisingid";
}

private static String getAndCacheGoogleAdvertisingId() {
return "advertisingid";
}
}

23 changes: 23 additions & 0 deletions src/main/java/com/amplitude/identitymanager/IdentityManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.amplitude.identitymanager;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class IdentityManager {
static final Map<String, Identity> instanceMap = new ConcurrentHashMap<String, Identity>();
private final static String DEFAULT_INSTANCE = "$default_instance";

public Identity getInstance(String instanceName) {
if (instanceMap.containsKey(instanceName)) {
return instanceMap.get(instanceName);
} else {
Identity identityToSet = new Identity();
instanceMap.put(instanceName, identityToSet);
return identityToSet;
}
}

public Identity getInstance() {
return getInstance(DEFAULT_INSTANCE);
}
}
21 changes: 21 additions & 0 deletions src/main/java/com/amplitude/identitymanager/IdentityUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.amplitude.identitymanager;

import java.util.Random;

public class IdentityUtils {
static private final int device_id_length = 25;
static private final String base_36_char_set = "abcdefghijklmnopqrstuvwxyz0123456789";
static private final int base_36_radix = 36;

static String generateBase36Id() {
String stringBuilder = "";
Random rand = new Random();
for (int idx = 0; idx < device_id_length; idx++) {
int randomIdx = rand.nextInt(base_36_radix);
char nextChar = base_36_char_set.charAt(randomIdx);
stringBuilder += nextChar;
}

return stringBuilder;
}
}