October 10th, 2018
This is the alpha release of the 3.0 SDK, which includes a number of improvements to audience targeting along with a few bug fixes.
- Support for number-valued and boolean-valued attributes. (#213)
- Support for audiences with new match conditions for attribute values, including “substring” and “exists” matches for strings; “greater than”, “less than”, exact, and “exists” matches for numbers; and “exact”, and “exists” matches for booleans.
- Built-in datafile version compatibility checks so that SDKs will not initialize with a newer datafile it is not compatible with. (#209)
- Previously, notification listeners filtered non-string attribute values from the data passed to registered listeners. To support our growing list of supported attribute values, we’ve changed this behavior. Notification listeners will now post any value type passed as an attribute. Therefore, the interface of the notification listeners has changed to accept a
Map<String, ?>
. - Update to use Java 1.7 (#208)
- refactor: Performance improvements for JacksonConfigParser (#209)
September 21st, 2018
- fix(attributes): Filters out attributes with null values from the event payload (#204)
August 1st, 2018
- Move serialization to LogEvent.getBody() to improve performance of API calls (#201)
June 19th, 2018
This is a patch release of the Optimizely SDK for 2.1.0 which is a major release.
- Send impression event for Feature Test with Feature disabled (#193)
June 19th, 2018
This is a patch release of the Optimizely SDK for 2.0.0 which is a major release.
- Send impression event for Feature Test with Feature disabled (#193)
June 15th, 2018
- Introduces support for bot filtering.
April 25th, 2018
This is a patch release of the Optimizely SDK for 2.0.0 which is a major release.
- Checking for invalid variables passed into getEnabledFeature, Activate, getVariation and track.
April 12th, 2018
This major release of the Optimizely SDK introduces APIs for Feature Management. It also introduces some breaking changes listed below.
- Introduces the
isFeatureEnabled
API to determine whether to show a feature to a user or not.
Boolean enabled = optimizelyClient.isFeatureEnabled("my_feature_key", "user_1", userAttributes);
- You can also get all the enabled features for the user by calling the following method which returns a list of strings representing the feature keys:
ArrayList<String> enabledFeatures = optimizelyClient.getEnabledFeatures("user_1", userAttributes);
- Introduces Feature Variables to configure or parameterize your feature. There are four variable types:
Integer
,String
,Double
,Boolean
.
String stringVariable = optimizelyClient.getFeatureVariableString("my_feature_key", "string_variable_key", "user_1");
Integer integerVariable = optimizelyClient.getFeatureVariableInteger("my_feature_key", "integer_variable_key", "user_1");
Double doubleVariable = optimizelyClient.getFeatureVariableDouble("my_feature_key", "double_variable_key", "user_1");
Boolean booleanVariable = optimizelyClient.getFeatureVariableBoolean("my_feature_key", "boolean_variable_key", "user_1");
- The
track
API with revenue value as a stand-alone parameter has been removed. The revenue value should be passed in as an entry of the event tags map. The key for the revenue tag isrevenue
and will be treated by Optimizely as the key for analyzing revenue data in results.
Map<String, Object> eventTags = new HashMap<String, Object>();
// reserved "revenue" tag
eventTags.put("revenue", 6432);
optimizelyClient.track("event_key", "user_id", userAttributes, eventTags);
- We have removed deprecated classes with the
NotificationBroadcaster
in favor of the new API with theNotificationCenter
. We have streamlined the API so that it is easily usable with Java Lambdas in Java 1.8+. We have also added some convenience methods to add these listeners. Finally, some of the API names have changed slightly (e.g.clearAllNotifications()
is nowclearAllNotificationListeners()
)
March 29th, 2018
This major release of the Optimizely SDK introduces APIs for Feature Management. It also introduces some breaking changes listed below.
- Introduces the
isFeatureEnabled
API to determine whether to show a feature to a user or not.
Boolean enabled = optimizelyClient.isFeatureEnabled("my_feature_key", "user_1", userAttributes);
- You can also get all the enabled features for the user by calling the following method which returns a list of strings representing the feature keys:
ArrayList<String> enabledFeatures = optimizelyClient.getEnabledFeatures("user_1", userAttributes);
- Introduces Feature Variables to configure or parameterize your feature. There are four variable types:
Integer
,String
,Double
,Boolean
.
String stringVariable = optimizelyClient.getFeatureVariableString("my_feature_key", "string_variable_key", "user_1");
Integer integerVariable = optimizelyClient.getFeatureVariableInteger("my_feature_key", "integer_variable_key", "user_1");
Double doubleVariable = optimizelyClient.getFeatureVariableDouble("my_feature_key", "double_variable_key", "user_1");
Boolean booleanVariable = optimizelyClient.getFeatureVariableBoolean("my_feature_key", "boolean_variable_key", "user_1");
- The
track
API with revenue value as a stand-alone parameter has been removed. The revenue value should be passed in as an entry of the event tags map. The key for the revenue tag isrevenue
and will be treated by Optimizely as the key for analyzing revenue data in results.
Map<String, Object> eventTags = new HashMap<String, Object>();
// reserved "revenue" tag
eventTags.put("revenue", 6432);
optimizelyClient.track("event_key", "user_id", userAttributes, eventTags);
January 30, 2018
This release adds support for bucketing id (By passing in $opt_bucketing_id
in the attribute map to override the user id as the bucketing variable. This is useful when wanting a set of users to share the same experience such as two players in a game).
This release also depricates the old notification broadcaster in favor of a notification center that supports a wide range of notifications. The notification listener is now registered for the specific notification type such as ACTIVATE and TRACK. This is accomplished by allowing for a variable argument call to notify (a new var arg method added to the NotificationListener). Specific abstract classes exist for the associated notification type (ActivateNotification and TrackNotification). These abstract classes enforce the strong typing that exists in Java. You may also add custom notification types and fire them through the notification center. The notification center is implemented using this var arg approach in all Optimizely SDKs.
- Added
$opt_bucketing_id
in the attribute map for overriding bucketing using the user id. It is available as a static string in DecisionService.ATTRIBUTE_BUCKETING_ID - Optimizely notification center for activate and track notifications.
January 5, 2018
This is a patch release for 2.0.0 Beta. It contains a minor bug fix.
SDK checks for null values in the Feature API parameters.
- If
isFeatureEnabled
is called with a null featureKey or a null userId, it will return false immediately. - If any of
getFeatureVariable<Type>
are called with a null featureKey, variableKey, or userId, null will be returned immediately.
December 12, 2017
This is a patch release for 1.8.0. It contains two bug fixes mentioned below.
SDK returns NullPointerException when activating with unknown attribute.
Pooled connection times out if it is idle for a long time (AsyncEventHandler's HttpClient uses PoolingHttpClientConnectionManager setting a validate interval).
October 5, 2017
This release is a second beta release supporting feature flags and rollouts. It includes all the same new features and breaking changes as the last beta release.
Fall back to default feature variable value when there is no variable usage in the variation a user is bucketed into. For more information see PR #149.
September 29, 2017
This release is a beta release supporting feature flags and rollouts.
You can now use feature flags in the Java SDK. You can experiment on features and rollout features through the Optimizely UI.
isFeatureEnabled
getFeatureVariableBoolean
getFeatureVariableDouble
getFeatureVariableInteger
getFeatureVariableString
- Remove Live Variables accessors
getVariableString
getVariableBoolean
getVariableInteger
getVariableDouble
- Remove track with revenue as a parameter. Pass the revenue value as an event tag instead
track(String, String, long)
track(String, String, Map<String, String>, long)
- We will no longer run all unit tests in travis-ci against Java 7.
We will still continue to set
sourceCompatibility
andtargetCompatibility
to 1.6 so that we build for Java 6.
August 29, 2017
This release adds support for numeric metrics and forced bucketing (in code as opposed to whitelisting via project file).
- Added
setForcedVariation
andgetForcedVariation
- Added any numeric metric to event metrics.
- Nothing breaking from 1.7.0
July 12, 2017
This release will support Android SDK release 1.4.0
- Added
UserProfileService
interface to allow for sticky bucketing
- Removed
UserProfile
interface. Replaced withUserProfileService
interface. - Removed support for v1 datafiles.
May 19, 2017
- Added
UserProfileService
interface to allow for sticky bucketing
- Removed
UserProfile
interface. Replaced withUserProfileService
interface. - Removed support for v1 datafiles.
March 17, 2017
- Add event tags to
track
API and include in the event payload - Deprecates the
eventValue
parameter from thetrack
method. Should use event tags to pass in event value instead - Gracefully handle a null attributes parameter
- Gracefully handle a null/empty datafile when using the Gson parser
February 16, 2017
- Support Android TV SDK client engine
February 1, 2017
- Default
null
status in datafile toNot started
January 31, 2017
- Add
sessionId
parameter toactivate
andtrack
and include in event payload - Append datafile
revision
to event payload - Add support for "Launched" experiment status
January 17, 2017
- Add
onEventTracked
listener - Change
getVariableFloat
togetVariableDouble
- Persist experiment and variation IDs instead of keys in the
UserProfile
December 15, 2016
- Change position of
activateExperiment
parameter in the method signatures ofgetVariableString
,getVariableBoolean
,getVariableInteger
, andgetVariableFloat
- Change
UserExperimentRecord
toUserProfile
- Add support for IP anonymization
- Add
NotificationListener
for SDK events
December 8, 2016
- Add support for live variables
November 28, 2016
- Remove extraneous log message in
AsyncEventHandler
- Add
jackson-annotations
as a compiled dependency
October 5, 2016
- Gracefully handle datafile that doesn't contain required fields
October 5, 2016
- Allow for configurability of
clientEngine
andclientVersion
throughOptimizely.Builder
- Remove ppid query string from V1 events
October 3, 2016
- Introduce support for Full Stack projects in Optimizely X with no breaking changes from previous version
- Update whitelisting to take precedence over audience condition evaluation
- Introduce more graceful exception handling in instantiation and core methods
September 19, 2016
- Add support for v2 backend endpoint and datafile
August 29, 2016
- Add a
UserExperimentRecord
interface- Implementors will get a chance to save and restore activations during bucketing
- Can be used to make bucketing persistent or to keep a bucketing history
- Pass implementations to
Optimizely.Builder#withUserExperimentRecord(UserExperimentRecord)
when creatingOptimizely
instances
July 26, 2016
- Beta release of the Java SDK for server-side testing