Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import io.flutter.plugin.common.MethodChannel.Result;

import com.optimizely.ab.OptimizelyUserContext;
import com.optimizely.ab.OptimizelyDecisionContext;
import com.optimizely.ab.OptimizelyForcedDecision;
import com.optimizely.ab.android.sdk.OptimizelyClient;

import java.util.HashMap;
Expand Down Expand Up @@ -123,6 +125,82 @@ protected void decide(String sdkKey, List<String> decideKeys, List<OptimizelyDec
result.success(createResponse(true, s, ""));
}

protected void setForcedDecision(String sdkKey, String flagKey, String ruleKey, String variationKey, @NonNull Result result) {
OptimizelyUserContext userContext = getUserContext(sdkKey);
if (userContext == null) {
result.success(createResponse(false, ErrorMessage.USER_CONTEXT_NOT_FOUND));
return;
}

if (flagKey == null || variationKey == null) {
result.success(createResponse(false, ErrorMessage.INVALID_PARAMS));
return;
}

OptimizelyDecisionContext optimizelyDecisionContext = new OptimizelyDecisionContext(flagKey, ruleKey);
OptimizelyForcedDecision optimizelyForcedDecision = new OptimizelyForcedDecision(variationKey);
if (userContext.setForcedDecision(optimizelyDecisionContext, optimizelyForcedDecision)) {
result.success(createResponse(true, SuccessMessage.FORCED_DECISION_SET));
}

result.success(createResponse(false, ""));
}

protected void getForcedDecision(String sdkKey, String flagKey, String ruleKey, @NonNull Result result) {
OptimizelyUserContext userContext = getUserContext(sdkKey);
if (userContext == null) {
result.success(createResponse(false, ErrorMessage.USER_CONTEXT_NOT_FOUND));
return;
}

if (flagKey == null) {
result.success(createResponse(false, ErrorMessage.INVALID_PARAMS));
return;
}

OptimizelyDecisionContext optimizelyDecisionContext = new OptimizelyDecisionContext(flagKey, ruleKey);
OptimizelyForcedDecision forcedDecision = userContext.getForcedDecision(optimizelyDecisionContext);
if (forcedDecision != null) {
result.success(createResponse(true, forcedDecision.getVariationKey(), ""));
}

result.success(createResponse(false, ""));
}

protected void removeForcedDecision(String sdkKey, String flagKey, String ruleKey, @NonNull Result result) {
OptimizelyUserContext userContext = getUserContext(sdkKey);
if (userContext == null) {
result.success(createResponse(false, ErrorMessage.USER_CONTEXT_NOT_FOUND));
return;
}

if (flagKey == null) {
result.success(createResponse(false, ErrorMessage.INVALID_PARAMS));
return;
}

OptimizelyDecisionContext optimizelyDecisionContext = new OptimizelyDecisionContext(flagKey, ruleKey);
if (userContext.removeForcedDecision(optimizelyDecisionContext)) {
result.success(createResponse(true, SuccessMessage.REMOVED_FORCED_DECISION));
}

result.success(createResponse(false, ""));
}

protected void removeAllForcedDecisions(String sdkKey, @NonNull Result result) {
OptimizelyUserContext userContext = getUserContext(sdkKey);
if (userContext == null) {
result.success(createResponse(false, ErrorMessage.USER_CONTEXT_NOT_FOUND));
return;
}

if (userContext.removeAllForcedDecisions()) {
result.success(createResponse(true, SuccessMessage.REMOVED_ALL_FORCED_DECISION));
}

result.success(createResponse(false, ""));
}

protected void trackEvent(String sdkKey, String eventKey, Map<String, Object> eventTags, @NonNull Result result) {
OptimizelyUserContext userContext = getUserContext(sdkKey);
if (userContext == null) {
Expand Down Expand Up @@ -193,9 +271,9 @@ protected void getOptimizelyConfig(String sdkKey, @NonNull Result result) {

public Map<String, ?> createResponse(Boolean success, Object result, String reason) {
Map<String, Object> response = new HashMap<>();
response.put("success", success);
response.put("result", result);
response.put("reason", reason);
response.put(ResponseKey.SUCCESS, success);
response.put(ResponseKey.RESULT, result);
response.put(ResponseKey.REASON, reason);

return response;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,32 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
decide(sdkKey, decideKeys, decideOptions, result);
break;
}
case APIs.SET_FORCED_DECISION: {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please revise this whole thing. We should parse parameters in their respective functions.

Or i would say, create methods getFlagKey, getRuleKey etc... pass arguments in those methods. and then call these methods from their respective function.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks, looks cleaner.

String flagKey = (String) arguments.get(RequestParameterKey.FLAG_KEY);
String ruleKey = (String) arguments.get(RequestParameterKey.RULE_KEY);
String variationKey = (String) arguments.get(RequestParameterKey.VARIATION_KEY);

setForcedDecision(sdkKey, flagKey, ruleKey, variationKey, result);
break;
}
case APIs.GET_FORCED_DECISION: {
String flagKey = (String) arguments.get(RequestParameterKey.FLAG_KEY);
String ruleKey = (String) arguments.get(RequestParameterKey.RULE_KEY);

getForcedDecision(sdkKey, flagKey, ruleKey, result);
break;
}
case APIs.REMOVE_FORCED_DECISION: {
String flagKey = (String) arguments.get(RequestParameterKey.FLAG_KEY);
String ruleKey = (String) arguments.get(RequestParameterKey.RULE_KEY);

removeForcedDecision(sdkKey, flagKey, ruleKey, result);
break;
}
case APIs.REMOVE_ALL_FORCED_DECISIONS: {
removeAllForcedDecisions(sdkKey, result);
break;
}
default:
result.notImplemented();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,16 @@ public class Constants {
public static class APIs {
public static final String INITIALIZE = "initialize";
public static final String GET_OPTIMIZELY_CONFIG = "getOptimizelyConfig";
public static final String CREATE_USER_CONTEXT="createUserContext";
public static final String CREATE_USER_CONTEXT = "createUserContext";
public static final String SET_ATTRIBUTES="setAttributes";
public static final String TRACK_EVENT="trackEvent";
public static final String DECIDE="decide";
public static final String ADD_NOTIFICATION_LISTENER="addNotificationListener";
public static final String REMOVE_NOTIFICATION_LISTENER ="removeNotificationListener";
public static final String GET_FORCED_DECISION = "getForcedDecision";
public static final String REMOVE_FORCED_DECISION = "removeForcedDecision";
public static final String REMOVE_ALL_FORCED_DECISIONS = "removeAllForcedDecisions";
public static final String SET_FORCED_DECISION = "setForcedDecision";
public static final String TRACK_EVENT = "trackEvent";
public static final String DECIDE = "decide";
public static final String ADD_NOTIFICATION_LISTENER = "addNotificationListener";
public static final String REMOVE_NOTIFICATION_LISTENER = "removeNotificationListener";
}

public static class NotificationType {
Expand All @@ -43,8 +47,11 @@ public static class RequestParameterKey {
public static final String ATTRIBUTES = "attributes";
public static final String DECIDE_KEYS = "keys";
public static final String DECIDE_OPTIONS = "optimizely_decide_option";
public static final String EVENT_KEY= "event_key";
public static final String EVENT_TAGS= "event_tags";
public static final String EVENT_KEY = "event_key";
public static final String EVENT_TAGS = "event_tags";
public static final String FLAG_KEY = "flag_key";
public static final String RULE_KEY = "rule_key";
public static final String VARIATION_KEY = "variation_key";
}

public static class ErrorMessage {
Expand All @@ -62,6 +69,9 @@ public static class SuccessMessage {
public static final String LISTENER_ADDED = "Listener added successfully.";
public static final String ATTRIBUTES_ADDED = "Attributes added successfully.";
public static final String EVENT_TRACKED = "Event Tracked successfully.";
public static final String FORCED_DECISION_SET = "Forced decision set successfully.";
public static final String REMOVED_FORCED_DECISION = "Forced decision removed successfully.";
public static final String REMOVED_ALL_FORCED_DECISION = "All Forced decisions removed successfully.";
}

public static class DecisionListenerKeys {
Expand All @@ -83,4 +93,10 @@ public static class LogEventListenerKeys {
public static final String HTTP_VERB = "http_verb";
public static final String PARAMS = "params";
}

public static class ResponseKey {
public static final String RESULT = "result";
public static final String REASON = "reason";
public static final String SUCCESS = "success";
}
}