4949import com .optimizely .ab .optimizelydecision .OptimizelyDecideOption ;
5050import com .optimizely .ab .optimizelydecision .OptimizelyDecision ;
5151import com .optimizely .optimizely_flutter_sdk .helper_classes .ArgumentsParser ;
52+ import com .optimizely .optimizely_flutter_sdk .helper_classes .Utils ;
5253
5354import static com .optimizely .optimizely_flutter_sdk .helper_classes .Constants .*;
5455
5556import java .util .Collections ;
5657import java .util .LinkedHashMap ;
5758import java .util .List ;
59+ import java .util .Objects ;
5860import java .util .concurrent .ArrayBlockingQueue ;
5961import java .util .concurrent .TimeUnit ;
6062
@@ -63,7 +65,7 @@ public class OptimizelyFlutterClient {
6365 protected Activity activity ;
6466
6567 protected static final Map <String , OptimizelyManager > optimizelyManagerTracker = new HashMap <>();
66- protected static final Map <String , OptimizelyUserContext > userContextsTracker = new HashMap <>();
68+ protected static final Map <String , Map < String , OptimizelyUserContext > > userContextsTracker = new HashMap <>();
6769 protected static final Map <Integer , Integer > notificationIdsTracker = new HashMap <>();
6870
6971
@@ -162,18 +164,21 @@ protected void createUserContext(ArgumentsParser argumentsParser, @NonNull Resul
162164 return ;
163165 }
164166 try {
165- OptimizelyUserContext optlyUserContext = null ;
166- if (attributes != null ) {
167- optlyUserContext = optimizelyClient .createUserContext (userId , attributes );
168- userContextsTracker .put (sdkKey , optlyUserContext );
167+ String userContextId = Utils .getRandomUUID ();
168+
169+ OptimizelyUserContext optlyUserContext = optimizelyClient .createUserContext (userId , attributes );
170+ if (optlyUserContext != null ) {
171+ if (userContextsTracker .containsKey (sdkKey )) {
172+ userContextsTracker .get (sdkKey ).put (userContextId , optlyUserContext );
173+ } else {
174+ userContextsTracker .put (sdkKey , Collections .singletonMap (userContextId , optlyUserContext ));
175+ }
176+ result .success (createResponse (true ,
177+ Collections .singletonMap (RequestParameterKey .USER_CONTEXT_ID , optlyUserContext ),
178+ SuccessMessage .USER_CONTEXT_CREATED ));
169179 } else {
170- optlyUserContext = optimizelyClient .createUserContext (userId );
171- userContextsTracker .put (sdkKey , optlyUserContext );
172- }
173- if (optlyUserContext != null )
174- result .success (createResponse (true , SuccessMessage .USER_CONTEXT_CREATED ));
175- else
176180 result .success (createResponse (false , "User context not created " ));
181+ }
177182 } catch (Exception ex ) {
178183 result .success (createResponse (false , ex .getMessage ()));
179184 }
@@ -249,7 +254,7 @@ protected void decide(ArgumentsParser argumentsParser, @NonNull Result result) {
249254 return ;
250255 }
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 ;
@@ -283,7 +288,7 @@ protected void setForcedDecision(ArgumentsParser argumentsParser, @NonNull Resul
283288 result .success (createResponse (false , ErrorMessage .INVALID_PARAMS ));
284289 return ;
285290 }
286- OptimizelyUserContext userContext = getUserContext (sdkKey );
291+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
287292 if (userContext == null ) {
288293 result .success (createResponse (false , ErrorMessage .USER_CONTEXT_NOT_FOUND ));
289294 return ;
@@ -313,7 +318,7 @@ protected void getForcedDecision(ArgumentsParser argumentsParser, @NonNull Resul
313318 result .success (createResponse (false , ErrorMessage .INVALID_PARAMS ));
314319 return ;
315320 }
316- OptimizelyUserContext userContext = getUserContext (sdkKey );
321+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
317322 if (userContext == null ) {
318323 result .success (createResponse (false , ErrorMessage .USER_CONTEXT_NOT_FOUND ));
319324 return ;
@@ -340,7 +345,7 @@ protected void removeForcedDecision(ArgumentsParser argumentsParser, @NonNull Re
340345 result .success (createResponse (false , ErrorMessage .INVALID_PARAMS ));
341346 return ;
342347 }
343- OptimizelyUserContext userContext = getUserContext (sdkKey );
348+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
344349 if (userContext == null ) {
345350 result .success (createResponse (false , ErrorMessage .USER_CONTEXT_NOT_FOUND ));
346351 return ;
@@ -368,7 +373,7 @@ protected void removeAllForcedDecisions(ArgumentsParser argumentsParser, @NonNul
368373 result .success (createResponse (false , ErrorMessage .INVALID_PARAMS ));
369374 return ;
370375 }
371- OptimizelyUserContext userContext = getUserContext (sdkKey );
376+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
372377 if (userContext == null ) {
373378 result .success (createResponse (false , ErrorMessage .USER_CONTEXT_NOT_FOUND ));
374379 return ;
@@ -406,7 +411,7 @@ protected void trackEvent(ArgumentsParser argumentsParser, @NonNull Result resul
406411 result .success (createResponse (false , ErrorMessage .INVALID_PARAMS ));
407412 return ;
408413 }
409- OptimizelyUserContext userContext = getUserContext (sdkKey );
414+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
410415
411416 String eventKey = argumentsParser .getEventKey ();
412417 Map <String , Object > eventTags = argumentsParser .getEventTags ();
@@ -430,13 +435,31 @@ protected void trackEvent(ArgumentsParser argumentsParser, @NonNull Result resul
430435 }
431436 }
432437
438+ protected void getUserId (ArgumentsParser argumentsParser , @ NonNull Result result ) {
439+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
440+ if (userContext == null ) {
441+ result .success (createResponse (false , ErrorMessage .USER_CONTEXT_NOT_FOUND ));
442+ return ;
443+ }
444+ result .success (createResponse (true , Collections .singletonMap (RequestParameterKey .USER_ID , userContext .getUserId ()), "" ));
445+ }
446+
447+ protected void getAttributes (ArgumentsParser argumentsParser , @ NonNull Result result ) {
448+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
449+ if (userContext == null ) {
450+ result .success (createResponse (false , ErrorMessage .USER_CONTEXT_NOT_FOUND ));
451+ return ;
452+ }
453+ result .success (createResponse (true , Collections .singletonMap (RequestParameterKey .ATTRIBUTES , userContext .getAttributes ()), "" ));
454+ }
455+
433456 protected void setAttribute (ArgumentsParser argumentsParser , @ NonNull Result result ) {
434457 String sdkKey = argumentsParser .getSdkKey ();
435458 if (sdkKey == null ) {
436459 result .success (createResponse (false , ErrorMessage .INVALID_PARAMS ));
437460 return ;
438461 }
439- OptimizelyUserContext userContext = getUserContext (sdkKey );
462+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
440463
441464 Map <String , Object > attributes = argumentsParser .getAttributes ();
442465 if (userContext == null ) {
@@ -450,7 +473,7 @@ protected void setAttribute(ArgumentsParser argumentsParser, @NonNull Result res
450473 for (String attributeKey : attributes .keySet ()) {
451474 userContext .setAttribute (attributeKey , attributes .get (attributeKey ));
452475 }
453- userContextsTracker .put (sdkKey , userContext );
476+ userContextsTracker .get (sdkKey ). put ( argumentsParser . getUserContextId () , userContext );
454477 result .success (createResponse (true , userContext .getAttributes (), SuccessMessage .ATTRIBUTES_ADDED ));
455478 }
456479
@@ -519,8 +542,13 @@ public OptimizelyClient getOptimizelyClient(String SDKKey) {
519542 return optimizelyManagerTracker .get (SDKKey ) == null ? null : optimizelyManagerTracker .get (SDKKey ).getOptimizely ();
520543 }
521544
522- public OptimizelyUserContext getUserContext (String SDKKey ) {
523- return userContextsTracker .get (SDKKey );
545+ public OptimizelyUserContext getUserContext (ArgumentsParser argumentsParser ) {
546+ String SDKKey = argumentsParser .getSdkKey ();
547+ String userContextId = argumentsParser .getUserContextId ();
548+ if (userContextId == null || !userContextsTracker .get (SDKKey ).containsKey (userContextId )) {
549+ return null ;
550+ }
551+ return userContextsTracker .get (SDKKey ).get (userContextId );
524552 }
525553
526554 protected void addNotificationListener (ArgumentsParser argumentsParser , @ NonNull Result result ) {
0 commit comments