- Removed PIN module
- Removed PIN Notifications module
- Removed Advertising module
- Removed PIN API key from
BVConfig.BuilderandBVSDK.Builder.
This are all technically breaking changes, but no one is using them, nor do they do function, so it should not affect anyone.
Added a new AuthenticationProvider interface that should be implemented, and provided to each submission
request. e.g.
val submitReq = ReviewSubmissionReq.Builder(Action.Submit, "testProd")
.authenticationProvider(authProvider)
.build()
client.prepareCall(submitReq).loadAsync({
(resp) -> {
// all good, change Action to Submit to actually send
},
(convSubmitException) -> {
val bvErrors = convSubmitException.getErrors()
val bvFieldErrors = convSubmitException.getFieldErrors()
for (fieldError in bvFieldErrors) {
val submissionErrorCode = fieldError.getSubmissionErrorCode()
val relevantFormField = fieldError.getFormField() // gets the form field info
}
}
})- If you are configured for BV Hosted Authentication then you should use
BVHostedAuthenticationProvider. - If you are configured for Site Authentication then you should use
SiteAuthenticationProvider.
For more info on how to use/create these providers, and how to check which one you are configured for,
refer to the Conversations > Content Submission page in the docs.
Previously fetching form data and parsing form errors was difficult. Not all paths of Action routed to the same callback, and most error paths did not have the required data to parse programmatically. All of the previous APIs for doing these things remains in the 6.x SDK for now, but has been marked as deprecated in favor of these new APIs.
val submitReq = ReviewSubmissionReq.Builder(Action.Form, "testProd") // NEW ACTION TYPE
.build()
client.prepareCall(submitReq).loadAsync({
(resp) -> {
val hasErrors = resp.getHasErrors() // not required to check anymore, always false in success
val formFields = resp.getFormFields() // null-safe list of available form options
for (formField in formFields) {
val isRequired = formField.isRequired() // indicates you must send this field
}
},
(convSubmitException) -> {
val bvErrors = convSubmitException.getErrors() // null-safe list of generic errors
val bvFormErrors = convSubmitException.getFieldErrors() // null-safe list of form errors
}
})val submitReq = ReviewSubmissionReq.Builder(Action.Preview, "testProd")
.build()
client.prepareCall(submitReq).loadAsync({
(resp) -> {
// all good, change Action to Submit to actually send
},
(convSubmitException) -> {
val bvErrors = convSubmitException.getErrors()
val bvFieldErrors = convSubmitException.getFieldErrors()
for (fieldError in bvFieldErrors) {
val submissionErrorCode = fieldError.getSubmissionErrorCode()
val relevantFormField = fieldError.getFormField() // gets the form field info
}
}
})Same as Test Submission, except use Action.Submit and it actually sends.
- Added
Action.Formfor submission to route to success without required form fields.Action.PreviewandAction.Submitwill always route to failure if all required form fields are not provided - Added
ConversationsDisplayCallback - Added
ConversationsSubmissionCallback - Added
ConversationsExceptionwhich has#getErrors() - Added
ConversationsSubmissionExceptionwhich has#getFieldErrors() - Added
LoadCallDisplay#loadDisplaySync() - Deprecated
LoadCallDisplay#loadSync()in favor ofLoadCallDisplay#loadDisplaySync() - Added
LoadCallDisplay#loadAsync(conversationsDisplayCallback) - Deprecated
LoadCallDisplay#loadAsync(conversationsCallback)in favor ofLoadCallDisplay#loadAsync(conversationsDisplayCallback) - Added
LoadCallSubmission#loadSubmissionSync() - Deprecated
LoadCallSubmission#loadSync()in favor ofLoadCallSubmission#loadSubmissionSync() - Added
LoadCallSubmission#loadAsync(conversationsSubmissionCallback) - Deprecated
LoadCallSubmission#loadAsync(conversationsCallback)in favor ofLoadCallSubmission#loadAsync(conversationsSubmissionCallback)
- Update
BazaarRuntimeExceptionto not cause StackOverflowException - Update JSON parse failure message
- Update
BVErrorsexist message - Added
BVConversationsClientTestto test all routes - Updated Robolectric version for testing
- Added testing shadow for network security
- Added
ErrorCodeenum to parse the code strings from theErrorsJSON field - Added
Error#getErrorCode()method for getting the enum - Added unit tests for invalid error code parsing, valid error code parsing, and generic error list parsing
- Added
SubmissionErrorCodeenum to parse the code strings from theFieldErrorsJSON field for submission - Added
FieldError#getErrorCode()method for getting the enum - Added unit tests for invalid field error code parsing, valid field error code parsing, and generic field error list parsing
- Add
Author#getSecondaryRatingList() - Add
BaseReview#getSecondaryRatingList() - Add
IncludeContentBase#getBadgeList() - Add
IncludeContentBase#getContextDataValueList() - Fix
BaseReviewBuilder#addContextDataValueString(String dataValueName, boolean value)to be namedBaseReviewBuilder#addContextDataValueBoolean(String dataValueName, boolean value) - Remove empty
ReviewSubmissionRequest#newBuilder()method - Add
ConversationsSubmissionRequest.Builder#addCustomSubmissionParameter(String key, String value) - Add internal FormPair class to store user custom form parameters
- Add
ConversationsDisplayRequest.Builder#ConversationsDisplayRequest.Builder#addCustomDisplayParameter(String key, String value) - Deprecated
ConversationsDisplayRequest.Builder#addAdditionalField(String key, String value)in favor ofaddCustomDisplayParameter - Added
FormInputTypeenum to introduce a strongly typed version ofString type = FormField#getType(). The possible values were taken from the conversations docs on input types. This will allow for easier parsing of which form fields have many options. e.g.
final FormInputType formInputType = formField.getFormInputType();
switch(formInputType) {
case FormInputType.SELECT: {
List<FormFieldOption> options = formField.getFormFieldOptions();
// present options to user
break;
}
}- Added tests for all of the endpoints to verify they are what we expect them to be
- Updated
BulkRatingsRequestto send with endpointstatistics.jsonlike it should and was before, instead ofreviews.json
- Added okhttp3 logging-interceptor
- Updated TextView to have maxLines of 5 so it won't take up the entire screen on the DemoBulkRatingsActivity screen
- Updated okhttp3 to version 3.8.0
- Added
BVConversationsClient.Builder#fingerprintProvider(fpProvider)as an optional builder parameter
- Added
IovationFingerprintas a class to pass to thefingerprintProvider(fpProvider)method
- Fixed expected behavior of
ConversationsDisplayRequest.Builder#addAdditionalField(key, val)to support one-to-many relationships of key-value pairs.
- Added multi-config support to the
BVConversationsClient. To use it, use the newBVConversationsClient.Builderto construct an instance, and use theBVConversationsClient.Builder#bvConfig(bvConfig)method to provide a different config than the default provided by theBVSDKsingleton. More info available on the docs for Conversations. - Deprecated the default
BVConversationsClientconstructor. - Add multiple value support to review display filtering
- Added an additional API to optionally send an analytics event with a different
clientIdthan the default provided to theBVPixelsingleton instance. More info available on the docs for BVPixel.
- Added back
ReviewStatisticsfor the Products in the Includes section ofReviewsRequests
- Added
Question#getSyndicatedSource(),Answer#getSyndicatedSource(), andComment#getSyndicatedSource()
- Added
ReviewSubmissionRequest.Builder#addVideoUrl(videoUrl, optionalVideoCaption) - Added
Question#isSyndicated()andReview#isSyndicated
- Added
CommentSubmissionRequestandCommentSubmissionResponse - Added ability to include
Comments inAuthorsRequests - Added
AuthorIncludeTypeto be used for includes inAuthorsRequests instead ofPDPContentType
- Added
CommentsRequestandCommentsResponse - Added
ReviewIncludeType.COMMENTSforReviewsRequests
- Added
FormDatato parse form fields inConversationsCallback#onSuccess(response) - Now routing
FormErrortoConversationsCallback#onSuccess(response)
- Added
SyndicationSourceto theBaseReviewobject for whenIsSyndicatedis true - Added
LoadCall#cancel()to be able to cancel a network request - Updated
ConversationsRecyclerViewto retain a strong reference to the passed inLoadCallDisplayobject, making sure to cancel the network request, and null out theLoadCallDisplayreference inView#onDetachedFromWindow(). This will ensure that anonymousConversationsCallbacksare not GC'ed before the request ends
- Fixed an issue where the results were still being used by the background thread after delivering them to the user on the UI thread, which could cause a
ConcurrentModificationException. - Added
getSyndicated()to theBaseReviewobject so that theIsSyndicatedflag will now be parsed for reviews
- Added defaulting to Conversations Product Catalog on homepage of BV Demo app if Recommendations keys are not available
- Updated theme in both apps
BulkProductRequestandBulkProductResponseclasses added. They are the same asProductDisplayPageRequestandProductDisplayPageResponse, but do not require a product id to construct.
- Added
BVSDK.builder(application, bazaarEnvironment)static factory to build the sdk with which uses Bazaarvoice generated config files to configure the BVSDK instance for you - Deprecated
BVSDK.builder(application, clientId)
- Fixed Issue #26 - Now correctly parsing Bazaarvoice API response date fields as UTC timezone rather than local timezone
- Added analytics module with
BVPixelinterface. Now allow a simple interface to build and send analytic events without having to get into the nitty gritty of each required field - Added BVPixel under the hood for Curations analytics
- Deprecated
include=answerswhich our sdk allows, but does nothing forProductDisplayPageRequests - Added
ConversationsDisplayRequest#addAdditionalField(String key, String value)to matchBaseReviewBuilder#addAdditionalField(String key, String value) - Added
ReviewIncludeTypewhich only containsproductsat the moment - Added
ReviewDisplayRequestBuilder#addIncludeContent(ReviewIncludeType reviewIncludeType)
- Added Curations UI module which depends on the Curations Module
- Added
CurationsInfiniteRecyclerViewwidget which manages paging network requests, as well as analytic events - Removed all old unused Curations UI Widgets
- Updated Code Sample App and Demo App to use the new
CurationsInfiniteRecyclerView
- Added
AuthorsRequestandAuthorsResponseto retrieve a Conversations Author Profile - Deprecated the
QuestionAndAnswerRequest.Builder#addSort(...)in favor of the more explicitQuestionAndAnswerRequest.Builder#addQuestionSort(...) - Added ability to sort included
Answers withQuestionAndAnswerRequest.Builder#addAnswerSort(...) - Added new Code Sample App and Demo App ability to view an author by id
- Removed deprecated Conversations classes
- Fixed URL Encoding of Submission request parameters
- Added new API wrapper for
BVPixeland removed the relevant calls fromBVSDK
- Added
PinClientto get a list of products that have been purchased, and need to be reviewed
- Added a
PinNotificationManagerto queue a Post Interaction Notification based on a product id. These notifications are remotely configurable on our backend
- Removed notifications from the Location module itself, so that this is a stand alone dependency
- Added a new module for the base code to fetch remote notification configuration, and manage queueing
- Added new preferred way to subscribe to events, by listening to intents with an action of
com.bazaarvoice.bvandroidsdk.action.GEOFENCE_VISIT
- Added demo and code sample apps to have a cart to test
BVPixel
- Fix
FeedbackSubmissionRequestconstructor to not requireActionparameter
- Added support for submitting feedback. You may now send helpfulness or flag inappropriate content for reviews, questions, or answers
- Fix
BrandImageLogoURLcorrectly moved to Answer model - Fix
DateUtilparsing error that occurs on Android API 16-23, and add better catching around it
- Fix
BrandImageLogoURLmissing from Question response - Fix sort parameter for
QuestionAndAnswerRequest - Fix typo in
RatingDistributionclass - Fix
DateUtilparser
- Make Recommendations constructor public. Recommendations was and still is available through the android View based methods, but this allows View independent access
- Added support to geo-tag custom content submission with the Curations Submission API.
This release provides a refresh to the Conversations API as well new features for geofence events.
- Added Conversations for Stores support
- Added Rich Push notification support for requesting store reviews
- Fixed some max limit bugs in Conversations Display requests for Reviews and Bulk Ratings
- Added
CurationsFeedRequest.Builder#location(latitude, longitude)parameter to allow searching for Curations feed items by location
This release provides a new module for adding location awareness to your app. This module facilitates knowing when your shoppers are entering and exiting your physical retail locations. You will be provided a very valuable opportunity to present a shopper with your location aware content. Perhaps you have a simple greeting or coupon? Aside from the value you add within your mobile experience, Bazaarvoice can use this location context to enhance our existing products. Rating and Reviews filtered down to the city level, recommended products for nearby people like you, local social media content (Curations), and more are all possible by using the Location module.
For more information, please refer to the location documentation https://bazaarvoice.github.io/bv-android-sdk/location.html
- Fixed visibility of methods that should be public
- Fixed NPE in ConversationsAnalyticsManager for response with no products
- Fixed AnswerOptions.Sort visibility from package-private to public
- Fixed Review response parsing, and updated unit tests to cover all expected response parsing
This release provides a vast improvement over the current display and submission API for Conversations. The following improvements will:
- decrease implementation time
- provide deserialized responses returned in P.O.J.O (plain old java objects), as opposed to returning a raw json response string
- make error handling much simpler, (e.g. wrapping legacy conversations API implementation details so you don't have to worry about it
- provide View container objects, which makes ROI reporting much simpler
We have deprecated the BazaarRequest class as well as any related classes to implement
Conversation the old way. For any clients migrating from the BazaarRequest API, please refer to
the upgrade guide: https://bazaarvoice.github.io/bv-android-sdk/upgrading_conversations.html
- Fixed the implementation of the
DisplayParams#addLimitOnIncludedType(type, limitVal)method to correctly add thetypeto thelimitTypelist
- Updated root dependencies.gradle to distinguish BVSDK artifact depndencies versus Demo App dependencies
- Fix BVSDK to enforce singleton pattern
- Remove Scheduled Profile updates
- Fix version number sending for Analytics
- Sending Embedded-Pageview with prod/category id
- No more pending for advertising id in Recommendations requests
- Updated Robolectric and relevant tests
- Added
BVProduct#getPrice() - Expose the
Profileclass - Expose the
ShopperProfileclass which contains aProfileobject
- Expose the
CurationsFeedResponseclass - Added
CurationsProduct#getId()
- Added
AndroidManifest.xmlto each module with theandroid.permission.INTERNETpermission, so gradle manifest merger should handle implicitly requesting it for users instead of needing to explicitly request it - Updated docs with instructions for the new Demo App for best practices, as well as the Code Example App. Also updated typos, etc.
- New changes to the BVAds class that require some minor code changes to migrate from 3.x to 4.x
- Ads interface removed, instead simply use the BVAds class directly
Map<String, String> getCustomTargeting()is the only method available now throughBVAds.getCustomTargeting()\- The methods creating Google DFP ad objects can now just be called by directly invoking the Google DFP API,
e.g.
getTargetedInterstitialAd(Context context, String adUnitId)becomesPublisherInterstitialAd interstitialAd = new PublisherInterstitialAd(context); interstitialAd.setAdUnitId(adUnitId);
- New Support for Bazaarvoice Curations: Ability to display custom social media feeds and post photos from your mobile app. Checkout the example project
- New BVPixel - Analytics for tracking purchase and non-transaction events for ROI reporting and omnichannel profile
- Added usage pattern for BVRecommendations for fetching and displaying product recommendations
- Removed SDK dependency on Google DFP SDK. Existing clients can now more easily add 1st party data to DFP add requests.
- Fix for closing out all OkHttp ResponseBody objects
- Added
RecommendationViewto wrap a view displaying a singleBVProductand provide better ROI reporting and recommendations without the need to manually send off analytic events to Bazaarvoice - Added
RecommendationsContainerView,RecommendationsListView,RecommendationsGridView, andRecommendationsRecyclerViewto display manyRecommendationViews, and provide additional ROI reporting and better recommendations
- Added iovation support to BazaarRequest#postSubmission(RequestType type, BazaarParams params, OnBazaarResponse listener)
- New Module - In BETA, provides targeted shopper recommendations
- New Module - Targeted Google DFP Ads with Bazaarvoice profiles. Replaces the deprecated bv-android-ads-sdk
- Deprecated BazaarRequest constructor requiring parameters, in favor of
new no parameter constructor
- Support for Hosted Auth has been added. In SubmissionParams.java see,
- SubmissionParams#setHostedAuthCallbackUrl(String hostedAuthCallbackUrl)
- SubmissionParams#setHostedAuthEmail(String hostedAuthEmail)
- Support for Hosted Auth has been added. In SubmissionParams.java see,
- Added sample app to demonstrate the 3 different modules
- Can now install artifacts from Maven Central