Skip to content

Commit e18376a

Browse files
authored
Merge pull request #1 from AdevintaSpain/user_id_mapper
[IntegrationOptions] UserId mapper
2 parents d5777ce + 973bf75 commit e18376a

File tree

7 files changed

+157
-34
lines changed

7 files changed

+157
-34
lines changed

src/androidTest/java/com/segment/analytics/android/integrations/appboy/AppboyAndroidTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public void testIdentifyCallsChangeUser() {
3333
Traits traits = createTraits(testUserId);
3434
IdentifyPayload identifyPayload = new IdentifyPayloadBuilder().traits(traits).build();
3535
Logger logger = Logger.with(Analytics.LogLevel.DEBUG);
36-
AppboyIntegration integration = new AppboyIntegration(Appboy.getInstance(getContext()), "foo", logger, true);
36+
AppboyIntegration integration = new AppboyIntegration(Appboy.getInstance(getContext()), "foo", logger, true, new DefaultUserIdMapper());
3737
integration.identify(identifyPayload);
3838

3939
assertEquals(testUserId, Appboy.getInstance(getContext()).getCurrentUser().getUserId());
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.segment.analytics.android.integrations.appboy;
2+
3+
import android.support.test.runner.AndroidJUnit4;
4+
import com.appboy.Appboy;
5+
import com.appboy.configuration.AppboyConfig;
6+
import com.segment.analytics.Analytics;
7+
import com.segment.analytics.Traits;
8+
import com.segment.analytics.integrations.IdentifyPayload;
9+
import com.segment.analytics.integrations.Logger;
10+
import com.segment.analytics.test.IdentifyPayloadBuilder;
11+
import org.junit.BeforeClass;
12+
import org.junit.Test;
13+
import org.junit.runner.RunWith;
14+
15+
import static android.support.test.InstrumentationRegistry.getContext;
16+
import static com.segment.analytics.Utils.createTraits;
17+
import static org.junit.Assert.assertEquals;
18+
19+
@RunWith(AndroidJUnit4.class)
20+
public class AppboyIntegrationOptionsAndroidTest {
21+
22+
private static final String ORIGINAL_USER_ID = "testUser";
23+
private static final String TRANSFORMED_USER_ID = "transformedUser";
24+
25+
@BeforeClass
26+
public static void beforeClass() {
27+
AppboyConfig appboyConfig = new AppboyConfig.Builder().setApiKey("testkey").build();
28+
Appboy.configure(getContext(), appboyConfig);
29+
}
30+
31+
@Test
32+
public void testUserIdMapperTransformsAppboyUserId() {
33+
Traits traits = createTraits(ORIGINAL_USER_ID);
34+
IdentifyPayload identifyPayload = new IdentifyPayloadBuilder().traits(traits).build();
35+
36+
Logger logger = Logger.with(Analytics.LogLevel.DEBUG);
37+
38+
AppboyIntegration integration = new AppboyIntegration(Appboy.getInstance(getContext()), "foo", logger, true, new ReplaceUserIdMapper());
39+
40+
integration.identify(identifyPayload);
41+
42+
assertEquals(TRANSFORMED_USER_ID, Appboy.getInstance(getContext()).getCurrentUser().getUserId());
43+
}
44+
45+
class ReplaceUserIdMapper implements UserIdMapper {
46+
@Override
47+
public String transformUserId(String segmentUserId) {
48+
return segmentUserId.replaceFirst(ORIGINAL_USER_ID, TRANSFORMED_USER_ID);
49+
}
50+
}
51+
}
52+

src/main/java/com/segment/analytics/android/integrations/appboy/AppboyIntegration.java

Lines changed: 45 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -47,50 +47,63 @@ public class AppboyIntegration extends Integration<Appboy> {
4747
private static final List<String> RESERVED_KEYS = Arrays.asList("birthday", "email", "firstName",
4848
"lastName", "gender", "phone", "address");
4949

50-
public static final Factory FACTORY = new Factory() {
51-
@Override
52-
public Integration<?> create(ValueMap settings, Analytics analytics) {
53-
Logger logger = analytics.logger(APPBOY_KEY);
54-
String apiKey = settings.getString(API_KEY_KEY);
55-
SdkFlavor flavor = SdkFlavor.SEGMENT;
56-
boolean inAppMessageRegistrationEnabled =
57-
settings.getBoolean(AUTOMATIC_IN_APP_MESSAGE_REGISTRATION_ENABLED, true);
58-
59-
if (StringUtils.isNullOrBlank(API_KEY_KEY)) {
60-
logger.info("Appboy+Segment integration attempted to initialize without api key.");
61-
return null;
62-
}
63-
String customEndpoint = settings.getString(CUSTOM_ENDPOINT_KEY);
64-
AppboyConfig.Builder builder = new AppboyConfig.Builder()
65-
.setApiKey(apiKey)
66-
.setSdkFlavor(flavor);
67-
if (!StringUtils.isNullOrBlank(customEndpoint)) {
68-
builder.setCustomEndpoint(customEndpoint);
69-
}
50+
public static final Factory FACTORY = factory(AppboyIntegrationOptions.builder().build());
7051

71-
Appboy.configure(analytics.getApplication().getApplicationContext(), builder.build());
72-
Appboy appboy = Appboy.getInstance(analytics.getApplication());
73-
logger.verbose("Configured Appboy+Segment integration and initialized Appboy.");
74-
return new AppboyIntegration(appboy, apiKey, logger, inAppMessageRegistrationEnabled);
75-
}
52+
public static Factory factory(final AppboyIntegrationOptions options) {
53+
return new Factory() {
54+
@Override
55+
public Integration<?> create(ValueMap settings, Analytics analytics) {
56+
Logger logger = analytics.logger(APPBOY_KEY);
57+
String apiKey = settings.getString(API_KEY_KEY);
58+
SdkFlavor flavor = SdkFlavor.SEGMENT;
59+
boolean inAppMessageRegistrationEnabled =
60+
settings.getBoolean(AUTOMATIC_IN_APP_MESSAGE_REGISTRATION_ENABLED, true);
7661

77-
@Override
78-
public String key() {
79-
return APPBOY_KEY;
80-
}
81-
};
62+
if (StringUtils.isNullOrBlank(API_KEY_KEY)) {
63+
logger.info("Appboy+Segment integration attempted to initialize without api key.");
64+
return null;
65+
}
66+
67+
String customEndpoint = settings.getString(CUSTOM_ENDPOINT_KEY);
68+
AppboyConfig.Builder builder = new AppboyConfig.Builder()
69+
.setApiKey(apiKey)
70+
.setSdkFlavor(flavor);
71+
if (!StringUtils.isNullOrBlank(customEndpoint)) {
72+
builder.setCustomEndpoint(customEndpoint);
73+
}
74+
75+
UserIdMapper userIdMapper = options.getUserIdMapper();
76+
if (userIdMapper == null) {
77+
userIdMapper = new DefaultUserIdMapper();
78+
}
79+
80+
Appboy.configure(analytics.getApplication().getApplicationContext(), builder.build());
81+
Appboy appboy = Appboy.getInstance(analytics.getApplication());
82+
logger.verbose("Configured Appboy+Segment integration and initialized Appboy.");
83+
return new AppboyIntegration(appboy, apiKey, logger, inAppMessageRegistrationEnabled, userIdMapper);
84+
}
85+
86+
@Override
87+
public String key() {
88+
return APPBOY_KEY;
89+
}
90+
};
91+
}
8292

8393
private final Appboy mAppboy;
8494
private final String mToken;
8595
private final Logger mLogger;
8696
private final boolean mAutomaticInAppMessageRegistrationEnabled;
97+
private final UserIdMapper mUserIdMapper;
8798

8899
public AppboyIntegration(Appboy appboy, String token, Logger logger,
89-
boolean automaticInAppMessageRegistrationEnabled) {
100+
boolean automaticInAppMessageRegistrationEnabled,
101+
UserIdMapper userIdMapper) {
90102
mAppboy = appboy;
91103
mToken = token;
92104
mLogger = logger;
93105
mAutomaticInAppMessageRegistrationEnabled = automaticInAppMessageRegistrationEnabled;
106+
mUserIdMapper = userIdMapper;
94107
}
95108

96109
public String getToken() {
@@ -108,7 +121,7 @@ public void identify(IdentifyPayload identify) {
108121

109122
String userId = identify.userId();
110123
if (!StringUtils.isNullOrBlank(userId)) {
111-
mAppboy.changeUser(identify.userId());
124+
mAppboy.changeUser(mUserIdMapper.transformUserId(userId));
112125
}
113126

114127
Traits traits = identify.traits();
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.segment.analytics.android.integrations.appboy;
2+
3+
public class AppboyIntegrationOptions {
4+
5+
private UserIdMapper userIdMapper;
6+
7+
public static Builder builder() {
8+
return new Builder();
9+
}
10+
11+
UserIdMapper getUserIdMapper() {
12+
return userIdMapper;
13+
}
14+
15+
private AppboyIntegrationOptions(UserIdMapper userIdMapper) {
16+
this.userIdMapper = userIdMapper;
17+
}
18+
19+
public static class Builder {
20+
private UserIdMapper userIdMapper;
21+
22+
public Builder userIdMapper(UserIdMapper userIdMapper) {
23+
this.userIdMapper = userIdMapper;
24+
return this;
25+
}
26+
27+
public AppboyIntegrationOptions build() {
28+
return new AppboyIntegrationOptions(userIdMapper);
29+
}
30+
}
31+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.segment.analytics.android.integrations.appboy;
2+
3+
import android.support.annotation.Nullable;
4+
5+
public class DefaultUserIdMapper implements UserIdMapper {
6+
7+
@Override
8+
@Nullable
9+
public String transformUserId(@Nullable String segmentUserId) {
10+
return segmentUserId;
11+
}
12+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.segment.analytics.android.integrations.appboy;
2+
3+
import android.support.annotation.NonNull;
4+
import com.appboy.Appboy;
5+
6+
public interface UserIdMapper {
7+
8+
/**
9+
* Defines a transformation for all userIds before being reported to the Braze SDK
10+
*
11+
* @param segmentUserId user id reported to segment in identify calls
12+
* @return userId as should be reported to Braze in the {@link Appboy#changeUser(String)} method.
13+
*/
14+
@NonNull String transformUserId(@NonNull String segmentUserId);
15+
}

src/test/java/com/segment/analytics/android/integrations/appboy/AppboyTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public void setUp() {
7373
mLogger = Logger.with(Analytics.LogLevel.DEBUG);
7474
when(mAnalytics.logger("Appboy")).thenReturn(mLogger);
7575
when(mAnalytics.getApplication()).thenReturn(mContext);
76-
mIntegration = new AppboyIntegration(mAppboy, "foo", mLogger, true);
76+
mIntegration = new AppboyIntegration(mAppboy, "foo", mLogger, true, new DefaultUserIdMapper());
7777
}
7878

7979
@Test

0 commit comments

Comments
 (0)