4848import com .optimizely .ab .optimizelydecision .OptimizelyDecideOption ;
4949import com .optimizely .ab .optimizelydecision .OptimizelyDecision ;
5050import com .optimizely .optimizely_flutter_sdk .helper_classes .ArgumentsParser ;
51+ import com .optimizely .optimizely_flutter_sdk .helper_classes .Utils ;
5152
5253import static com .optimizely .optimizely_flutter_sdk .helper_classes .Constants .*;
5354
5455import java .util .Collections ;
5556import java .util .LinkedHashMap ;
5657import java .util .List ;
58+ import java .util .Objects ;
5759import java .util .concurrent .ArrayBlockingQueue ;
5860import 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 ();
@@ -366,13 +371,31 @@ protected void trackEvent(ArgumentsParser argumentsParser, @NonNull Result resul
366371 }
367372 }
368373
374+ protected void getUserId (ArgumentsParser argumentsParser , @ NonNull Result result ) {
375+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
376+ if (userContext == null ) {
377+ result .success (createResponse (false , ErrorMessage .USER_CONTEXT_NOT_FOUND ));
378+ return ;
379+ }
380+ result .success (createResponse (true , Collections .singletonMap (RequestParameterKey .USER_ID , userContext .getUserId ()), "" ));
381+ }
382+
383+ protected void getAttributes (ArgumentsParser argumentsParser , @ NonNull Result result ) {
384+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
385+ if (userContext == null ) {
386+ result .success (createResponse (false , ErrorMessage .USER_CONTEXT_NOT_FOUND ));
387+ return ;
388+ }
389+ result .success (createResponse (true , Collections .singletonMap (RequestParameterKey .ATTRIBUTES , userContext .getAttributes ()), "" ));
390+ }
391+
369392 protected void setAttribute (ArgumentsParser argumentsParser , @ NonNull Result result ) {
370393 String sdkKey = argumentsParser .getSdkKey ();
371394 if (sdkKey == null ) {
372395 result .success (createResponse (false , ErrorMessage .INVALID_PARAMS ));
373396 return ;
374397 }
375- OptimizelyUserContext userContext = getUserContext (sdkKey );
398+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
376399
377400 Map <String , Object > attributes = argumentsParser .getAttributes ();
378401 if (userContext == null ) {
@@ -386,7 +409,7 @@ protected void setAttribute(ArgumentsParser argumentsParser, @NonNull Result res
386409 for (String attributeKey : attributes .keySet ()) {
387410 userContext .setAttribute (attributeKey , attributes .get (attributeKey ));
388411 }
389- userContextsTracker .put (sdkKey , userContext );
412+ userContextsTracker .get (sdkKey ). put ( argumentsParser . getUserContextId () , userContext );
390413 result .success (createResponse (true , userContext .getAttributes (), SuccessMessage .ATTRIBUTES_ADDED ));
391414 }
392415
@@ -455,8 +478,13 @@ public OptimizelyClient getOptimizelyClient(String SDKKey) {
455478 return optimizelyManagerTracker .get (SDKKey ) == null ? null : optimizelyManagerTracker .get (SDKKey ).getOptimizely ();
456479 }
457480
458- public OptimizelyUserContext getUserContext (String SDKKey ) {
459- return userContextsTracker .get (SDKKey );
481+ public OptimizelyUserContext getUserContext (ArgumentsParser argumentsParser ) {
482+ String SDKKey = argumentsParser .getSdkKey ();
483+ String userContextId = argumentsParser .getUserContextId ();
484+ if (userContextId == null || !userContextsTracker .get (SDKKey ).containsKey (userContextId )) {
485+ return null ;
486+ }
487+ return userContextsTracker .get (SDKKey ).get (userContextId );
460488 }
461489
462490 protected void addNotificationListener (ArgumentsParser argumentsParser , @ NonNull Result result ) {
0 commit comments