diff --git a/android-sdk/src/main/java/com/optimizely/ab/android/sdk/OptimizelyManager.java b/android-sdk/src/main/java/com/optimizely/ab/android/sdk/OptimizelyManager.java index 5b24df6f..b830a931 100644 --- a/android-sdk/src/main/java/com/optimizely/ab/android/sdk/OptimizelyManager.java +++ b/android-sdk/src/main/java/com/optimizely/ab/android/sdk/OptimizelyManager.java @@ -54,7 +54,9 @@ import com.optimizely.ab.notification.NotificationCenter; import com.optimizely.ab.notification.UpdateConfigNotification; import com.optimizely.ab.odp.ODPApiManager; +import com.optimizely.ab.odp.ODPEventManager; import com.optimizely.ab.odp.ODPManager; +import com.optimizely.ab.odp.ODPSegmentManager; import com.optimizely.ab.optimizelydecision.OptimizelyDecideOption; import org.slf4j.Logger; @@ -740,6 +742,8 @@ public static class Builder { @Nullable private String sdkKey = null; @Nullable private DatafileConfig datafileConfig = null; @Nullable private List defaultDecideOptions = null; + @Nullable private ODPEventManager odpEventManager; + @Nullable private ODPSegmentManager odpSegmentManager; private int odpSegmentCacheSize = 100; private int odpSegmentCacheTimeoutInSecs = 600; @@ -947,6 +951,32 @@ public Builder withTimeoutForODPEventDispatch(int interval) { return this; } + /** + * Provide an optional custom {@link ODPEventManager} instance. + * + * A Default {@link ODPEventManager} implementation is automatically used if none provided. + * + * @param odpEventManager The implementation of {@link ODPEventManager} + * @return ODPManager builder + */ + public Builder withODPEventManager(ODPEventManager odpEventManager) { + this.odpEventManager = odpEventManager; + return this; + } + + /** + * Provide an optional custom {@link ODPSegmentManager} instance. + * + * A Default {@link ODPSegmentManager} implementation is automatically used if none provided. + * + * @param odpSegmentManager The implementation of {@link ODPSegmentManager} + * @return this {@link Builder} instance + */ + public Builder withODPSegmentManager(ODPSegmentManager odpSegmentManager) { + this.odpSegmentManager = odpSegmentManager; + return this; + } + /** * Disable ODP integration. * @return this {@link Builder} instance @@ -1059,6 +1089,8 @@ public OptimizelyManager build(Context context) { .withSegmentCacheSize(odpSegmentCacheSize) .withSegmentCacheTimeout(odpSegmentCacheTimeoutInSecs) .withUserCommonData(commonData) + .withSegmentManager(odpSegmentManager) + .withEventManager(odpEventManager) .withUserCommonIdentifiers(commonIdentifiers) .build(); } diff --git a/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DefaultDatafileHandler.java b/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DefaultDatafileHandler.java index 3a94ec5d..212ef2be 100644 --- a/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DefaultDatafileHandler.java +++ b/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DefaultDatafileHandler.java @@ -308,4 +308,17 @@ public void setDatafile(String datafile) { public ProjectConfig getConfig() { return currentProjectConfig; } + + @Override + public ProjectConfig getCachedConfig() { + return currentProjectConfig; + } + + @Override + public String getSDKKey() { + if (currentProjectConfig != null) { + return currentProjectConfig.getSdkKey(); + } + return null; + } } diff --git a/odp/src/main/java/com/optimizely/ab/android/odp/DefaultODPApiManager.kt b/odp/src/main/java/com/optimizely/ab/android/odp/DefaultODPApiManager.kt index 8b146e8b..46f2df93 100644 --- a/odp/src/main/java/com/optimizely/ab/android/odp/DefaultODPApiManager.kt +++ b/odp/src/main/java/com/optimizely/ab/android/odp/DefaultODPApiManager.kt @@ -43,7 +43,7 @@ class DefaultODPApiManager(private val context: Context, timeoutForSegmentFetch: userKey: String, userValue: String, segmentsToCheck: Set, - ): String? { + ): List? { return segmentClient.fetchQualifiedSegments( apiKey, apiEndpoint, diff --git a/odp/src/main/java/com/optimizely/ab/android/odp/ODPSegmentClient.kt b/odp/src/main/java/com/optimizely/ab/android/odp/ODPSegmentClient.kt index 095f7317..5cc1b64b 100644 --- a/odp/src/main/java/com/optimizely/ab/android/odp/ODPSegmentClient.kt +++ b/odp/src/main/java/com/optimizely/ab/android/odp/ODPSegmentClient.kt @@ -16,7 +16,10 @@ package com.optimizely.ab.android.odp import androidx.annotation.VisibleForTesting import com.optimizely.ab.android.shared.Client +import com.optimizely.ab.odp.parser.ResponseJsonParser +import com.optimizely.ab.odp.parser.ResponseJsonParserFactory import org.slf4j.Logger +import java.io.IOException import java.net.HttpURLConnection import java.net.URL @@ -28,7 +31,7 @@ open class ODPSegmentClient(private val client: Client, private val logger: Logg apiKey: String, apiEndpoint: String, payload: String - ): String? { + ): List? { val request: Client.Request = Client.Request { var urlConnection: HttpURLConnection? = null @@ -74,8 +77,15 @@ open class ODPSegmentClient(private val client: Client, private val logger: Logg } } } - - return client.execute(request, REQUEST_BACKOFF_TIMEOUT, REQUEST_RETRIES_POWER) + val response = client.execute(request, REQUEST_BACKOFF_TIMEOUT, REQUEST_RETRIES_POWER) + val parser: ResponseJsonParser = ResponseJsonParserFactory.getParser() + try { + return parser.parseQualifiedSegments(response) + } catch (e: java.lang.Exception) { + logger.error("Audience segments fetch failed (Error Parsing Response)") + logger.debug(e.message) + } + return null } companion object {