11/****************************************************************************
2- * Copyright 2022, Optimizely, Inc. and contributors *
2+ * Copyright 2022-2023 , Optimizely, Inc. and contributors *
33 * *
44 * Licensed under the Apache License, Version 2.0 (the "License"); *
55 * you may not use this file except in compliance with the License. *
4646import com .optimizely .ab .notification .NotificationCenter ;
4747import com .optimizely .ab .notification .TrackNotification ;
4848import com .optimizely .ab .notification .UpdateConfigNotification ;
49+ import com .optimizely .ab .odp .ODPSegmentOption ;
4950import com .optimizely .ab .optimizelyconfig .OptimizelyConfig ;
5051import com .optimizely .ab .optimizelydecision .OptimizelyDecideOption ;
5152import com .optimizely .ab .optimizelydecision .OptimizelyDecision ;
5253import com .optimizely .optimizely_flutter_sdk .helper_classes .ArgumentsParser ;
5354import com .optimizely .optimizely_flutter_sdk .helper_classes .Utils ;
5455
5556import static com .optimizely .optimizely_flutter_sdk .helper_classes .Constants .*;
57+ import static com .optimizely .optimizely_flutter_sdk .helper_classes .Constants .RequestParameterKey .DISABLE_ODP ;
58+ import static com .optimizely .optimizely_flutter_sdk .helper_classes .Constants .RequestParameterKey .SEGMENTS_CACHE_SIZE ;
59+ import static com .optimizely .optimizely_flutter_sdk .helper_classes .Constants .RequestParameterKey .SEGMENTS_CACHE_TIMEOUT_IN_SECONDS ;
60+ import static com .optimizely .optimizely_flutter_sdk .helper_classes .Constants .RequestParameterKey .TIMEOUT_FOR_ODP_EVENT_IN_SECONDS ;
61+ import static com .optimizely .optimizely_flutter_sdk .helper_classes .Constants .RequestParameterKey .TIMEOUT_FOR_SEGMENT_FETCH_IN_SECONDS ;
5662import static com .optimizely .optimizely_flutter_sdk .helper_classes .Utils .getNotificationListenerType ;
5763
5864import java .util .Collections ;
@@ -127,16 +133,48 @@ protected void initializeOptimizely(@NonNull ArgumentsParser argumentsParser, @N
127133 notificationIdsTracker .remove (sdkKey );
128134
129135 List <OptimizelyDecideOption > defaultDecideOptions = argumentsParser .getDecideOptions ();
136+
137+ // SDK Settings Default Values
138+ int segmentsCacheSize = 100 ;
139+ int segmentsCacheTimeoutInSecs = 600 ;
140+ int timeoutForSegmentFetchInSecs = 10 ;
141+ int timeoutForOdpEventInSecs = 10 ;
142+ boolean disableOdp = false ;
143+ Map <String , Object > sdkSettings = argumentsParser .getOptimizelySdkSettings ();
144+ if (sdkSettings != null ) {
145+ if (sdkSettings .containsKey (SEGMENTS_CACHE_SIZE )) {
146+ segmentsCacheSize = (Integer ) sdkSettings .get (SEGMENTS_CACHE_SIZE );
147+ }
148+ if (sdkSettings .containsKey (SEGMENTS_CACHE_TIMEOUT_IN_SECONDS )) {
149+ segmentsCacheTimeoutInSecs = (Integer ) sdkSettings .get (SEGMENTS_CACHE_TIMEOUT_IN_SECONDS );
150+ }
151+ if (sdkSettings .containsKey (TIMEOUT_FOR_SEGMENT_FETCH_IN_SECONDS )) {
152+ timeoutForSegmentFetchInSecs = (Integer ) sdkSettings .get (TIMEOUT_FOR_SEGMENT_FETCH_IN_SECONDS );
153+ }
154+ if (sdkSettings .containsKey (TIMEOUT_FOR_ODP_EVENT_IN_SECONDS )) {
155+ timeoutForOdpEventInSecs = (Integer ) sdkSettings .get (TIMEOUT_FOR_ODP_EVENT_IN_SECONDS );
156+ }
157+ if (sdkSettings .containsKey (DISABLE_ODP )) {
158+ disableOdp = (boolean ) sdkSettings .get (DISABLE_ODP );
159+ }
160+ }
130161 // Creating new instance
131- OptimizelyManager optimizelyManager = OptimizelyManager .builder ()
162+ OptimizelyManager . Builder optimizelyManagerBuilder = OptimizelyManager .builder ()
132163 .withEventProcessor (batchProcessor )
133164 .withEventHandler (eventHandler )
134165 .withNotificationCenter (notificationCenter )
135166 .withDatafileDownloadInterval (datafilePeriodicDownloadInterval , TimeUnit .SECONDS )
136167 .withErrorHandler (new RaiseExceptionErrorHandler ())
137168 .withDefaultDecideOptions (defaultDecideOptions )
138- .withSDKKey (sdkKey )
139- .build (context );
169+ .withODPSegmentCacheSize (segmentsCacheSize )
170+ .withODPSegmentCacheTimeout (segmentsCacheTimeoutInSecs , TimeUnit .SECONDS )
171+ .withTimeoutForODPSegmentFetch (timeoutForSegmentFetchInSecs )
172+ .withTimeoutForODPEventDispatch (timeoutForOdpEventInSecs )
173+ .withSDKKey (sdkKey );
174+ if (disableOdp ) {
175+ optimizelyManagerBuilder .withODPDisabled ();
176+ }
177+ OptimizelyManager optimizelyManager = optimizelyManagerBuilder .build (context );
140178
141179 optimizelyManager .initialize (context , null , (OptimizelyClient client ) -> {
142180 if (client .isValid ()) {
@@ -158,14 +196,14 @@ protected void createUserContext(ArgumentsParser argumentsParser, @NonNull Resul
158196
159197 String userId = argumentsParser .getUserId ();
160198 Map <String , Object > attributes = argumentsParser .getAttributes ();
161- if (userId == null ) {
162- result .success (createResponse (ErrorMessage .INVALID_PARAMS ));
163- return ;
164- }
165199 try {
166200 String userContextId = Utils .getRandomUUID ();
167-
168- OptimizelyUserContext optlyUserContext = optimizelyClient .createUserContext (userId , attributes );
201+ OptimizelyUserContext optlyUserContext ;
202+ if (userId != null ) {
203+ optlyUserContext = optimizelyClient .createUserContext (userId , attributes );
204+ } else {
205+ optlyUserContext = optimizelyClient .createUserContext (attributes );
206+ }
169207 if (optlyUserContext != null ) {
170208 if (userContextsTracker .containsKey (sdkKey )) {
171209 userContextsTracker .get (sdkKey ).put (userContextId , optlyUserContext );
@@ -390,6 +428,109 @@ protected void removeAllForcedDecisions(ArgumentsParser argumentsParser, @NonNul
390428 result .success (createResponse ());
391429 }
392430
431+ /// Returns an array of segments that the user is qualified for.
432+ protected void getQualifiedSegments (ArgumentsParser argumentsParser , @ NonNull Result result ) {
433+ String sdkKey = argumentsParser .getSdkKey ();
434+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
435+ if (!isUserContextValid (sdkKey , userContext , result )) {
436+ return ;
437+ }
438+ List <String > qualifiedSegments = userContext .getQualifiedSegments ();
439+ if (qualifiedSegments != null ) {
440+ result .success (createResponse (Collections .singletonMap (RequestParameterKey .QUALIFIED_SEGMENTS , qualifiedSegments )));
441+ } else {
442+ result .success (createResponse (ErrorMessage .QUALIFIED_SEGMENTS_NOT_FOUND ));
443+ }
444+ }
445+
446+ /// Sets qualified segments for the user context.
447+ protected void setQualifiedSegments (ArgumentsParser argumentsParser , @ NonNull Result result ) {
448+ String sdkKey = argumentsParser .getSdkKey ();
449+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
450+ if (!isUserContextValid (sdkKey , userContext , result )) {
451+ return ;
452+ }
453+ List <String > qualifiedSegments = argumentsParser .getQualifiedSegments ();
454+ if (qualifiedSegments == null ) {
455+ result .success (createResponse (ErrorMessage .INVALID_PARAMS ));
456+ return ;
457+ }
458+ userContext .setQualifiedSegments (qualifiedSegments );
459+ result .success (createResponse ());
460+ }
461+
462+ /// Returns the device vuid.
463+ protected void getVuid (ArgumentsParser argumentsParser , @ NonNull Result result ) {
464+ String sdkKey = argumentsParser .getSdkKey ();
465+ OptimizelyClient optimizelyClient = getOptimizelyClient (sdkKey );
466+ if (!isOptimizelyClientValid (sdkKey , optimizelyClient , result )) {
467+ return ;
468+ }
469+ result .success (createResponse (true , Collections .singletonMap (RequestParameterKey .VUID , optimizelyClient .getVuid ()), "" ));
470+ }
471+
472+ /// Checks if the user is qualified for the given segment.
473+ protected void isQualifiedFor (ArgumentsParser argumentsParser , @ NonNull Result result ) {
474+ String sdkKey = argumentsParser .getSdkKey ();
475+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
476+ if (!isUserContextValid (sdkKey , userContext , result )) {
477+ return ;
478+ }
479+ String segment = argumentsParser .getSegment ();
480+ if (segment == null ) {
481+ result .success (createResponse (ErrorMessage .INVALID_PARAMS ));
482+ return ;
483+ }
484+
485+ result .success (createResponse (userContext .isQualifiedFor (segment )));
486+ }
487+
488+ /// Send an event to the ODP server.
489+ protected void sendODPEvent (ArgumentsParser argumentsParser , @ NonNull Result result ) {
490+ String sdkKey = argumentsParser .getSdkKey ();
491+ OptimizelyClient optimizelyClient = getOptimizelyClient (sdkKey );
492+ if (!isOptimizelyClientValid (sdkKey , optimizelyClient , result )) {
493+ return ;
494+ }
495+ String action = argumentsParser .getAction ();
496+ if (action == null || action .isEmpty ()) {
497+ result .success (createResponse (ErrorMessage .INVALID_PARAMS ));
498+ return ;
499+ }
500+
501+ String type = argumentsParser .getType ();
502+ Map <String , String > identifiers = argumentsParser .getIdentifiers ();
503+ if (identifiers == null ) {
504+ identifiers = new HashMap <>();
505+ }
506+ Map <String , Object > data = argumentsParser .getData ();
507+ if (data == null ) {
508+ data = new HashMap <>();
509+ }
510+
511+ optimizelyClient .sendODPEvent (type , action , identifiers , data );
512+ result .success (createResponse ());
513+ }
514+
515+ /// Fetch all qualified segments for the user context.
516+ protected void fetchQualifiedSegments (ArgumentsParser argumentsParser , @ NonNull Result result ) {
517+ String sdkKey = argumentsParser .getSdkKey ();
518+ OptimizelyUserContext userContext = getUserContext (argumentsParser );
519+ if (!isUserContextValid (sdkKey , userContext , result )) {
520+ return ;
521+ }
522+ List <ODPSegmentOption > segmentOptions = argumentsParser .getSegmentOptions ();
523+
524+ try {
525+ userContext .fetchQualifiedSegments ((fetchQualifiedResult ) -> {
526+ result .success (createResponse (fetchQualifiedResult ));
527+ },segmentOptions );
528+
529+ } catch (Exception ex ) {
530+ result .success (createResponse (ex .getMessage ()));
531+ }
532+ }
533+
393534 protected void close (ArgumentsParser argumentsParser , @ NonNull Result result ) {
394535 String sdkKey = argumentsParser .getSdkKey ();
395536 OptimizelyClient optimizelyClient = getOptimizelyClient (sdkKey );
0 commit comments