Skip to content

Commit ed6d738

Browse files
committed
Updated code of android side to provide support of multiple user context with same sdk key
1 parent 9f9e2b7 commit ed6d738

File tree

4 files changed

+42
-21
lines changed

4 files changed

+42
-21
lines changed

android/src/main/java/com/optimizely/optimizely_flutter_sdk/OptimizelyFlutterClient.java

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,14 @@
4848
import com.optimizely.ab.optimizelydecision.OptimizelyDecideOption;
4949
import com.optimizely.ab.optimizelydecision.OptimizelyDecision;
5050
import com.optimizely.optimizely_flutter_sdk.helper_classes.ArgumentsParser;
51+
import com.optimizely.optimizely_flutter_sdk.helper_classes.Utils;
5152

5253
import static com.optimizely.optimizely_flutter_sdk.helper_classes.Constants.*;
5354

5455
import java.util.Collections;
5556
import java.util.LinkedHashMap;
5657
import java.util.List;
58+
import java.util.Objects;
5759
import java.util.concurrent.ArrayBlockingQueue;
5860
import java.util.concurrent.TimeUnit;
5961

@@ -62,7 +64,7 @@ public class OptimizelyFlutterClient {
6264
protected Activity activity;
6365

6466
protected static final Map<String, OptimizelyManager> optimizelyManagerTracker = new HashMap<>();
65-
protected static final Map<String, OptimizelyUserContext> userContextsTracker = new HashMap<>();
67+
protected static final Map<String, Map<String, OptimizelyUserContext>> userContextsTracker = new HashMap<>();
6668
protected static final Map<Integer, Integer> notificationIdsTracker = new HashMap<>();
6769

6870

@@ -161,18 +163,21 @@ protected void createUserContext(ArgumentsParser argumentsParser, @NonNull Resul
161163
return;
162164
}
163165
try {
164-
OptimizelyUserContext optlyUserContext = null;
165-
if (attributes != null) {
166-
optlyUserContext = optimizelyClient.createUserContext(userId, attributes);
167-
userContextsTracker.put(sdkKey, optlyUserContext);
166+
String userContextId = Utils.getRandomUUID();
167+
168+
OptimizelyUserContext optlyUserContext = optimizelyClient.createUserContext(userId, attributes);
169+
if (optlyUserContext != null) {
170+
if (userContextsTracker.containsKey(sdkKey)) {
171+
userContextsTracker.get(sdkKey).put(userContextId, optlyUserContext);
172+
} else {
173+
userContextsTracker.put(sdkKey, Collections.singletonMap(userContextId, optlyUserContext));
174+
}
175+
result.success(createResponse(true,
176+
Collections.singletonMap(RequestParameterKey.USER_CONTEXT_ID, optlyUserContext),
177+
SuccessMessage.USER_CONTEXT_CREATED));
168178
} else {
169-
optlyUserContext = optimizelyClient.createUserContext(userId);
170-
userContextsTracker.put(sdkKey, optlyUserContext);
171-
}
172-
if (optlyUserContext != null)
173-
result.success(createResponse(true, SuccessMessage.USER_CONTEXT_CREATED));
174-
else
175179
result.success(createResponse(false, "User context not created "));
180+
}
176181
} catch (Exception ex) {
177182
result.success(createResponse(false, ex.getMessage()));
178183
}
@@ -185,7 +190,7 @@ protected void decide(ArgumentsParser argumentsParser, @NonNull Result result) {
185190
return;
186191
}
187192

188-
OptimizelyUserContext userContext = getUserContext(sdkKey);
193+
OptimizelyUserContext userContext = getUserContext(argumentsParser);
189194
if (userContext == null) {
190195
result.success(createResponse(false, ErrorMessage.USER_CONTEXT_NOT_FOUND));
191196
return;
@@ -219,7 +224,7 @@ protected void setForcedDecision(ArgumentsParser argumentsParser, @NonNull Resul
219224
result.success(createResponse(false, ErrorMessage.INVALID_PARAMS));
220225
return;
221226
}
222-
OptimizelyUserContext userContext = getUserContext(sdkKey);
227+
OptimizelyUserContext userContext = getUserContext(argumentsParser);
223228
if (userContext == null) {
224229
result.success(createResponse(false, ErrorMessage.USER_CONTEXT_NOT_FOUND));
225230
return;
@@ -249,7 +254,7 @@ protected void getForcedDecision(ArgumentsParser argumentsParser, @NonNull Resul
249254
result.success(createResponse(false, ErrorMessage.INVALID_PARAMS));
250255
return;
251256
}
252-
OptimizelyUserContext userContext = getUserContext(sdkKey);
257+
OptimizelyUserContext userContext = getUserContext(argumentsParser);
253258
if (userContext == null) {
254259
result.success(createResponse(false, ErrorMessage.USER_CONTEXT_NOT_FOUND));
255260
return;
@@ -276,7 +281,7 @@ protected void removeForcedDecision(ArgumentsParser argumentsParser, @NonNull Re
276281
result.success(createResponse(false, ErrorMessage.INVALID_PARAMS));
277282
return;
278283
}
279-
OptimizelyUserContext userContext = getUserContext(sdkKey);
284+
OptimizelyUserContext userContext = getUserContext(argumentsParser);
280285
if (userContext == null) {
281286
result.success(createResponse(false, ErrorMessage.USER_CONTEXT_NOT_FOUND));
282287
return;
@@ -304,7 +309,7 @@ protected void removeAllForcedDecisions(ArgumentsParser argumentsParser, @NonNul
304309
result.success(createResponse(false, ErrorMessage.INVALID_PARAMS));
305310
return;
306311
}
307-
OptimizelyUserContext userContext = getUserContext(sdkKey);
312+
OptimizelyUserContext userContext = getUserContext(argumentsParser);
308313
if (userContext == null) {
309314
result.success(createResponse(false, ErrorMessage.USER_CONTEXT_NOT_FOUND));
310315
return;
@@ -342,7 +347,7 @@ protected void trackEvent(ArgumentsParser argumentsParser, @NonNull Result resul
342347
result.success(createResponse(false, ErrorMessage.INVALID_PARAMS));
343348
return;
344349
}
345-
OptimizelyUserContext userContext = getUserContext(sdkKey);
350+
OptimizelyUserContext userContext = getUserContext(argumentsParser);
346351

347352
String eventKey = argumentsParser.getEventKey();
348353
Map<String, Object> eventTags = argumentsParser.getEventTags();
@@ -372,7 +377,7 @@ protected void setAttribute(ArgumentsParser argumentsParser, @NonNull Result res
372377
result.success(createResponse(false, ErrorMessage.INVALID_PARAMS));
373378
return;
374379
}
375-
OptimizelyUserContext userContext = getUserContext(sdkKey);
380+
OptimizelyUserContext userContext = getUserContext(argumentsParser);
376381

377382
Map<String, Object> attributes = argumentsParser.getAttributes();
378383
if (userContext == null) {
@@ -386,7 +391,7 @@ protected void setAttribute(ArgumentsParser argumentsParser, @NonNull Result res
386391
for (String attributeKey : attributes.keySet()) {
387392
userContext.setAttribute(attributeKey, attributes.get(attributeKey));
388393
}
389-
userContextsTracker.put(sdkKey, userContext);
394+
userContextsTracker.get(sdkKey).put(argumentsParser.getUserContextId(), userContext);
390395
result.success(createResponse(true, userContext.getAttributes(), SuccessMessage.ATTRIBUTES_ADDED));
391396
}
392397

@@ -455,8 +460,13 @@ public OptimizelyClient getOptimizelyClient(String SDKKey) {
455460
return optimizelyManagerTracker.get(SDKKey) == null? null : optimizelyManagerTracker.get(SDKKey).getOptimizely();
456461
}
457462

458-
public OptimizelyUserContext getUserContext(String SDKKey) {
459-
return userContextsTracker.get(SDKKey);
463+
public OptimizelyUserContext getUserContext(ArgumentsParser argumentsParser) {
464+
String SDKKey = argumentsParser.getSdkKey();
465+
String userContextId = argumentsParser.getUserContextId();
466+
if (userContextId == null || !userContextsTracker.get(SDKKey).containsKey(userContextId)) {
467+
return null;
468+
}
469+
return userContextsTracker.get(SDKKey).get(userContextId);
460470
}
461471

462472
protected void addNotificationListener(ArgumentsParser argumentsParser, @NonNull Result result) {

android/src/main/java/com/optimizely/optimizely_flutter_sdk/helper_classes/ArgumentsParser.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ public String getUserID() {
4343
return (String) arguments.get(Constants.RequestParameterKey.USER_ID);
4444
}
4545

46+
public String getUserContextId() {
47+
return (String) arguments.get(Constants.RequestParameterKey.USER_CONTEXT_ID);
48+
}
49+
4650
public Map<String, Object> getAttributes() {
4751
return (Map<String, Object>) arguments.get(Constants.RequestParameterKey.ATTRIBUTES);
4852
}

android/src/main/java/com/optimizely/optimizely_flutter_sdk/helper_classes/Constants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public static class NotificationType {
4242
public static class RequestParameterKey {
4343
public static final String SDK_KEY = "sdkKey";
4444
public static final String USER_ID = "userID";
45+
public static final String USER_CONTEXT_ID = "userContextId";
4546
public static final String NOTIFICATION_ID = "id";
4647
public static final String NOTIFICATION_TYPE = "type";
4748
public static final String NOTIFICATION_PAYLOAD = "payload";

android/src/main/java/com/optimizely/optimizely_flutter_sdk/helper_classes/Utils.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,19 @@
1919
import java.util.HashMap;
2020
import java.util.List;
2121
import java.util.Map;
22+
import java.util.UUID;
23+
2224
import static com.optimizely.ab.notification.DecisionNotification.FeatureVariableDecisionNotificationBuilder.SOURCE_INFO;
2325

2426
import com.google.common.base.CaseFormat;
2527
import com.optimizely.ab.optimizelydecision.OptimizelyDecideOption;
2628

2729
public class Utils {
2830

31+
public static String getRandomUUID() {
32+
return UUID.randomUUID().toString();
33+
}
34+
2935
public static List<OptimizelyDecideOption> getDecideOptions(List<String> options) {
3036
if(options == null || options.isEmpty()) {
3137
return null;

0 commit comments

Comments
 (0)