Skip to content

Commit 39ef25b

Browse files
author
Ivan Garza
committed
Fix userId cache
1 parent 7c50575 commit 39ef25b

File tree

5 files changed

+64
-9
lines changed

5 files changed

+64
-9
lines changed

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

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
public class AppboyIntegrationOptionsAndroidTest {
3030

3131
private static final String USER_ID = "testUser";
32+
private static final String OTHER_USER_ID = "testUser2";
3233
private static final String TRANSFORMED_USER_ID = "transformedUser";
3334
private static final String TRAIT_EMAIL = "test@segment.com";
3435
private static final String TRAIT_EMAIL_UPDATED = "updated@segment.com";
@@ -117,6 +118,46 @@ public void testShouldTriggerUpdateIfTraitChanges() {
117118
inOrder.verify(appboyUser, times(1)).setEmail(TRAIT_EMAIL_UPDATED);
118119
}
119120

121+
@Test
122+
public void testAvoidTriggeringRepeatedUserIdUpdates() {
123+
Traits traits = createTraits(USER_ID);
124+
traits.putEmail(TRAIT_EMAIL);
125+
126+
callIdentifyWithTraits(traits);
127+
callIdentifyWithTraits(traits);
128+
129+
verify(appboyUser, times(1)).setEmail(TRAIT_EMAIL);
130+
verify(appboy, times(1)).changeUser(TRANSFORMED_USER_ID);
131+
}
132+
133+
@Test
134+
public void clearCacheIfUserIdChanges() {
135+
Traits traits = createTraits(USER_ID);
136+
traits.putEmail(TRAIT_EMAIL);
137+
138+
Traits traitsUpdate = createTraits(OTHER_USER_ID);
139+
traitsUpdate.putEmail(TRAIT_EMAIL);
140+
141+
callIdentifyWithTraits(traits);
142+
callIdentifyWithTraits(traitsUpdate);
143+
144+
verify(appboyUser, times(2)).setEmail(TRAIT_EMAIL);
145+
}
146+
147+
@Test
148+
public void clearCacheOnReset() {
149+
Traits traits = createTraits(USER_ID);
150+
traits.putEmail(TRAIT_EMAIL);
151+
152+
callIdentifyWithTraits(traits);
153+
154+
appboyIntegration.reset();
155+
156+
callIdentifyWithTraits(traits);
157+
158+
verify(appboyUser, times(2)).setEmail(TRAIT_EMAIL);
159+
}
160+
120161
public void callIdentifyWithTraits(Traits traits) {
121162
IdentifyPayload identifyPayload = new IdentifyPayloadBuilder().traits(traits).build();
122163

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

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,13 +128,17 @@ public Appboy getUnderlyingInstance() {
128128
public void identify(IdentifyPayload identify) {
129129
super.identify(identify);
130130

131-
132131
String userId = identify.userId();
133132
if (!StringUtils.isNullOrBlank(userId)) {
134-
mAppboy.changeUser(mUserIdMapper.transformUserId(userId));
135133

136-
if (mTraitsCache != null) {
137-
mTraitsCache.clear();
134+
String cachedUserId = mTraitsCache.load().userId();
135+
136+
if (!userId.equals(cachedUserId)) {
137+
mAppboy.changeUser(mUserIdMapper.transformUserId(userId));
138+
139+
if (mTraitsCache != null) {
140+
mTraitsCache.clear();
141+
}
138142
}
139143
}
140144

@@ -307,6 +311,15 @@ public void track(TrackPayload track) {
307311
}
308312
}
309313

314+
@Override
315+
public void reset() {
316+
super.reset();
317+
318+
if (mTraitsCache != null) {
319+
mTraitsCache.clear();
320+
}
321+
}
322+
310323
@Override
311324
public void onActivityStarted(Activity activity) {
312325
super.onActivityStarted(activity);

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.segment.analytics.Cartographer;
66
import com.segment.analytics.Traits;
77
import java.io.IOException;
8+
import java.util.Collections;
89
import java.util.Map;
910

1011
import static android.content.Context.MODE_PRIVATE;
@@ -36,13 +37,13 @@ public void save(Traits traits) {
3637
public Traits load() {
3738
String json = preferences.getString(PREFS_KEY, null);
3839

39-
if (isNullOrEmpty(json)) return null;
40+
if (isNullOrEmpty(json)) return new Traits();
4041

4142
try {
4243
Map<String, Object> map = cartographer.fromJson(json);
4344
return buildTraits(map);
4445
} catch (IOException ignored) {
45-
return null;
46+
return new Traits();
4647
}
4748
}
4849

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
@@ -215,7 +215,7 @@ public void testIdentifyGenderOnBadInputs() {
215215
traits.putGender("female_1");
216216
identifyPayload = new IdentifyPayloadBuilder().traits(traits).build();
217217
mIntegration.identify(identifyPayload);
218-
verify(mAppboy, Mockito.times(2)).changeUser("userId");
218+
verify(mAppboy, Mockito.times(1)).changeUser("userId");
219219
//verifyNoMoreAppboyUserInteractions();
220220
//verifyNoMoreAppboyInteractions();
221221
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
public class InMemoryTraitsCache implements TraitsCache {
66

7-
private Traits traits;
7+
private Traits traits = new Traits();
88

99
@Override
1010
public void save(Traits traits) {
@@ -18,6 +18,6 @@ public Traits load() {
1818

1919
@Override
2020
public void clear() {
21-
traits = null;
21+
traits = new Traits();
2222
}
2323
}

0 commit comments

Comments
 (0)