3535
3636import com .fasterxml .jackson .databind .ObjectMapper ;
3737import com .optimizely .ab .android .sdk .OptimizelyManager ;
38+ import com .optimizely .ab .android .shared .DatafileConfig ;
3839import com .optimizely .ab .error .RaiseExceptionErrorHandler ;
3940import com .optimizely .ab .event .BatchEventProcessor ;
4041import com .optimizely .ab .event .EventProcessor ;
4748import com .optimizely .ab .optimizelydecision .OptimizelyDecideOption ;
4849import com .optimizely .ab .optimizelydecision .OptimizelyDecision ;
4950import com .optimizely .optimizely_flutter_sdk .helper_classes .ArgumentsParser ;
51+ import com .optimizely .optimizely_flutter_sdk .helper_classes .Utils ;
5052
5153import static com .optimizely .optimizely_flutter_sdk .helper_classes .Constants .*;
5254
5355import java .util .Collections ;
5456import java .util .LinkedHashMap ;
5557import java .util .List ;
58+ import java .util .Objects ;
5659import java .util .concurrent .ArrayBlockingQueue ;
5760import java .util .concurrent .TimeUnit ;
5861
@@ -61,7 +64,7 @@ public class OptimizelyFlutterClient {
6164 protected Activity activity ;
6265
6366 protected static final Map <String , OptimizelyManager > optimizelyManagerTracker = new HashMap <>();
64- protected static final Map <String , OptimizelyUserContext > userContextsTracker = new HashMap <>();
67+ protected static final Map <String , Map < String , OptimizelyUserContext > > userContextsTracker = new HashMap <>();
6568 protected static final Map <Integer , Integer > notificationIdsTracker = new HashMap <>();
6669
6770
@@ -105,6 +108,14 @@ protected void initializeOptimizely(@NonNull ArgumentsParser argumentsParser, @N
105108 if (argumentsParser .getDatafilePeriodicDownloadInterval () != null ) {
106109 datafilePeriodicDownloadInterval = argumentsParser .getDatafilePeriodicDownloadInterval ();
107110 }
111+
112+ // String default datafile host
113+ String defaultDatafileHost = "https://cdn.optimizely.com" ;
114+ String environmentUrlSuffix = "/datafiles/%s.json" ;
115+
116+ DatafileConfig .defaultHost = argumentsParser .getDatafileHostPrefix () != null ? argumentsParser .getDatafileHostPrefix () : defaultDatafileHost ;
117+ DatafileConfig .environmentUrlSuffix = argumentsParser .getDatafileHostSuffix () != null ? argumentsParser .getDatafileHostSuffix () : environmentUrlSuffix ;
118+
108119 // Delete old user context
109120 userContextsTracker .remove (sdkKey );
110121 if (getOptimizelyClient (sdkKey ) != null ) {
@@ -152,18 +163,21 @@ protected void createUserContext(ArgumentsParser argumentsParser, @NonNull Resul
152163 return ;
153164 }
154165 try {
155- OptimizelyUserContext optlyUserContext = null ;
156- if (attributes != null ) {
157- optlyUserContext = optimizelyClient .createUserContext (userId , attributes );
158- 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 ));
159178 } else {
160- optlyUserContext = optimizelyClient .createUserContext (userId );
161- userContextsTracker .put (sdkKey , optlyUserContext );
162- }
163- if (optlyUserContext != null )
164- result .success (createResponse (true , SuccessMessage .USER_CONTEXT_CREATED ));
165- else
166179 result .success (createResponse (false , "User context not created " ));
180+ }
167181 } catch (Exception ex ) {
168182 result .success (createResponse (false , ex .getMessage ()));
169183 }
@@ -176,7 +190,7 @@ protected void decide(ArgumentsParser argumentsParser, @NonNull Result result) {
176190 return ;
177191 }
178192
179- OptimizelyUserContext userContext = getUserContext (sdkKey );
193+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
180194 if (userContext == null ) {
181195 result .success (createResponse (false , ErrorMessage .USER_CONTEXT_NOT_FOUND ));
182196 return ;
@@ -210,7 +224,7 @@ protected void setForcedDecision(ArgumentsParser argumentsParser, @NonNull Resul
210224 result .success (createResponse (false , ErrorMessage .INVALID_PARAMS ));
211225 return ;
212226 }
213- OptimizelyUserContext userContext = getUserContext (sdkKey );
227+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
214228 if (userContext == null ) {
215229 result .success (createResponse (false , ErrorMessage .USER_CONTEXT_NOT_FOUND ));
216230 return ;
@@ -240,7 +254,7 @@ protected void getForcedDecision(ArgumentsParser argumentsParser, @NonNull Resul
240254 result .success (createResponse (false , ErrorMessage .INVALID_PARAMS ));
241255 return ;
242256 }
243- OptimizelyUserContext userContext = getUserContext (sdkKey );
257+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
244258 if (userContext == null ) {
245259 result .success (createResponse (false , ErrorMessage .USER_CONTEXT_NOT_FOUND ));
246260 return ;
@@ -267,7 +281,7 @@ protected void removeForcedDecision(ArgumentsParser argumentsParser, @NonNull Re
267281 result .success (createResponse (false , ErrorMessage .INVALID_PARAMS ));
268282 return ;
269283 }
270- OptimizelyUserContext userContext = getUserContext (sdkKey );
284+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
271285 if (userContext == null ) {
272286 result .success (createResponse (false , ErrorMessage .USER_CONTEXT_NOT_FOUND ));
273287 return ;
@@ -295,7 +309,7 @@ protected void removeAllForcedDecisions(ArgumentsParser argumentsParser, @NonNul
295309 result .success (createResponse (false , ErrorMessage .INVALID_PARAMS ));
296310 return ;
297311 }
298- OptimizelyUserContext userContext = getUserContext (sdkKey );
312+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
299313 if (userContext == null ) {
300314 result .success (createResponse (false , ErrorMessage .USER_CONTEXT_NOT_FOUND ));
301315 return ;
@@ -333,7 +347,7 @@ protected void trackEvent(ArgumentsParser argumentsParser, @NonNull Result resul
333347 result .success (createResponse (false , ErrorMessage .INVALID_PARAMS ));
334348 return ;
335349 }
336- OptimizelyUserContext userContext = getUserContext (sdkKey );
350+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
337351
338352 String eventKey = argumentsParser .getEventKey ();
339353 Map <String , Object > eventTags = argumentsParser .getEventTags ();
@@ -357,13 +371,31 @@ protected void trackEvent(ArgumentsParser argumentsParser, @NonNull Result resul
357371 }
358372 }
359373
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+
360392 protected void setAttribute (ArgumentsParser argumentsParser , @ NonNull Result result ) {
361393 String sdkKey = argumentsParser .getSdkKey ();
362394 if (sdkKey == null ) {
363395 result .success (createResponse (false , ErrorMessage .INVALID_PARAMS ));
364396 return ;
365397 }
366- OptimizelyUserContext userContext = getUserContext (sdkKey );
398+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
367399
368400 Map <String , Object > attributes = argumentsParser .getAttributes ();
369401 if (userContext == null ) {
@@ -377,7 +409,7 @@ protected void setAttribute(ArgumentsParser argumentsParser, @NonNull Result res
377409 for (String attributeKey : attributes .keySet ()) {
378410 userContext .setAttribute (attributeKey , attributes .get (attributeKey ));
379411 }
380- userContextsTracker .put (sdkKey , userContext );
412+ userContextsTracker .get (sdkKey ). put ( argumentsParser . getUserContextId () , userContext );
381413 result .success (createResponse (true , userContext .getAttributes (), SuccessMessage .ATTRIBUTES_ADDED ));
382414 }
383415
@@ -446,8 +478,13 @@ public OptimizelyClient getOptimizelyClient(String SDKKey) {
446478 return optimizelyManagerTracker .get (SDKKey ) == null ? null : optimizelyManagerTracker .get (SDKKey ).getOptimizely ();
447479 }
448480
449- public OptimizelyUserContext getUserContext (String SDKKey ) {
450- 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 );
451488 }
452489
453490 protected void addNotificationListener (ArgumentsParser argumentsParser , @ NonNull Result result ) {
0 commit comments