diff --git a/pom.xml b/pom.xml
index a7301882..57c1a392 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
com.facebook.business.sdk
facebook-java-business-sdk
jar
- 18.0.3
+ 18.0.4
${project.groupId}:${project.artifactId}
Facebook Business Solutions SDK for Java
https://developers.facebook.com/docs/marketing-api/sdks
diff --git a/src/main/java/com/facebook/ads/sdk/APIConfig.java b/src/main/java/com/facebook/ads/sdk/APIConfig.java
index e392baa8..1c8c3281 100644
--- a/src/main/java/com/facebook/ads/sdk/APIConfig.java
+++ b/src/main/java/com/facebook/ads/sdk/APIConfig.java
@@ -27,5 +27,5 @@ public class APIConfig {
public static final String DEFAULT_API_VERSION = "v18.0";
public static final String DEFAULT_API_BASE = "https://graph.facebook.com";
public static final String DEFAULT_VIDEO_API_BASE = "https://graph-video.facebook.com";
- public static final String USER_AGENT = "fbbizsdk-java-v18.0.3";
+ public static final String USER_AGENT = "fbbizsdk-java-v18.0.4";
};
diff --git a/src/main/java/com/facebook/ads/sdk/AdAccount.java b/src/main/java/com/facebook/ads/sdk/AdAccount.java
index d09c2431..26f9eace 100644
--- a/src/main/java/com/facebook/ads/sdk/AdAccount.java
+++ b/src/main/java/com/facebook/ads/sdk/AdAccount.java
@@ -9913,6 +9913,8 @@ public APINodeList getLastResponse() {
"auto_event_mapping_android",
"auto_event_mapping_ios",
"auto_event_setup_enabled",
+ "auto_log_app_events_default",
+ "auto_log_app_events_enabled",
"business",
"canvas_fluid_height",
"canvas_fluid_width",
@@ -9970,8 +9972,6 @@ public APINodeList getLastResponse() {
"restrictions",
"restrictive_data_filter_params",
"restrictive_data_filter_rules",
- "sdk_auto_logging_default_value",
- "sdk_auto_logging_override_value",
"sdk_update_message",
"seamless_login",
"secure_canvas_url",
@@ -10269,6 +10269,20 @@ public APIRequestGetAdvertisableApplications requestAutoEventSetupEnabledField (
this.requestField("auto_event_setup_enabled", value);
return this;
}
+ public APIRequestGetAdvertisableApplications requestAutoLogAppEventsDefaultField () {
+ return this.requestAutoLogAppEventsDefaultField(true);
+ }
+ public APIRequestGetAdvertisableApplications requestAutoLogAppEventsDefaultField (boolean value) {
+ this.requestField("auto_log_app_events_default", value);
+ return this;
+ }
+ public APIRequestGetAdvertisableApplications requestAutoLogAppEventsEnabledField () {
+ return this.requestAutoLogAppEventsEnabledField(true);
+ }
+ public APIRequestGetAdvertisableApplications requestAutoLogAppEventsEnabledField (boolean value) {
+ this.requestField("auto_log_app_events_enabled", value);
+ return this;
+ }
public APIRequestGetAdvertisableApplications requestBusinessField () {
return this.requestBusinessField(true);
}
@@ -10668,20 +10682,6 @@ public APIRequestGetAdvertisableApplications requestRestrictiveDataFilterRulesFi
this.requestField("restrictive_data_filter_rules", value);
return this;
}
- public APIRequestGetAdvertisableApplications requestSdkAutoLoggingDefaultValueField () {
- return this.requestSdkAutoLoggingDefaultValueField(true);
- }
- public APIRequestGetAdvertisableApplications requestSdkAutoLoggingDefaultValueField (boolean value) {
- this.requestField("sdk_auto_logging_default_value", value);
- return this;
- }
- public APIRequestGetAdvertisableApplications requestSdkAutoLoggingOverrideValueField () {
- return this.requestSdkAutoLoggingOverrideValueField(true);
- }
- public APIRequestGetAdvertisableApplications requestSdkAutoLoggingOverrideValueField (boolean value) {
- this.requestField("sdk_auto_logging_override_value", value);
- return this;
- }
public APIRequestGetAdvertisableApplications requestSdkUpdateMessageField () {
return this.requestSdkUpdateMessageField(true);
}
@@ -13206,6 +13206,8 @@ public APINodeList getLastResponse() {
"auto_event_mapping_android",
"auto_event_mapping_ios",
"auto_event_setup_enabled",
+ "auto_log_app_events_default",
+ "auto_log_app_events_enabled",
"business",
"canvas_fluid_height",
"canvas_fluid_width",
@@ -13263,8 +13265,6 @@ public APINodeList getLastResponse() {
"restrictions",
"restrictive_data_filter_params",
"restrictive_data_filter_rules",
- "sdk_auto_logging_default_value",
- "sdk_auto_logging_override_value",
"sdk_update_message",
"seamless_login",
"secure_canvas_url",
@@ -13552,6 +13552,20 @@ public APIRequestGetApplications requestAutoEventSetupEnabledField (boolean valu
this.requestField("auto_event_setup_enabled", value);
return this;
}
+ public APIRequestGetApplications requestAutoLogAppEventsDefaultField () {
+ return this.requestAutoLogAppEventsDefaultField(true);
+ }
+ public APIRequestGetApplications requestAutoLogAppEventsDefaultField (boolean value) {
+ this.requestField("auto_log_app_events_default", value);
+ return this;
+ }
+ public APIRequestGetApplications requestAutoLogAppEventsEnabledField () {
+ return this.requestAutoLogAppEventsEnabledField(true);
+ }
+ public APIRequestGetApplications requestAutoLogAppEventsEnabledField (boolean value) {
+ this.requestField("auto_log_app_events_enabled", value);
+ return this;
+ }
public APIRequestGetApplications requestBusinessField () {
return this.requestBusinessField(true);
}
@@ -13951,20 +13965,6 @@ public APIRequestGetApplications requestRestrictiveDataFilterRulesField (boolean
this.requestField("restrictive_data_filter_rules", value);
return this;
}
- public APIRequestGetApplications requestSdkAutoLoggingDefaultValueField () {
- return this.requestSdkAutoLoggingDefaultValueField(true);
- }
- public APIRequestGetApplications requestSdkAutoLoggingDefaultValueField (boolean value) {
- this.requestField("sdk_auto_logging_default_value", value);
- return this;
- }
- public APIRequestGetApplications requestSdkAutoLoggingOverrideValueField () {
- return this.requestSdkAutoLoggingOverrideValueField(true);
- }
- public APIRequestGetApplications requestSdkAutoLoggingOverrideValueField (boolean value) {
- this.requestField("sdk_auto_logging_override_value", value);
- return this;
- }
public APIRequestGetApplications requestSdkUpdateMessageField () {
return this.requestSdkUpdateMessageField(true);
}
diff --git a/src/main/java/com/facebook/ads/sdk/AdAssetFeedAdditionalData.java b/src/main/java/com/facebook/ads/sdk/AdAssetFeedAdditionalData.java
new file mode 100644
index 00000000..7ea3b7a2
--- /dev/null
+++ b/src/main/java/com/facebook/ads/sdk/AdAssetFeedAdditionalData.java
@@ -0,0 +1,283 @@
+/*
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ * All rights reserved.
+ *
+ * This source code is licensed under the license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+package com.facebook.ads.sdk;
+
+import java.io.File;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.Type;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.base.Function;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonArray;
+import com.google.gson.annotations.SerializedName;
+import com.google.gson.reflect.TypeToken;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
+
+import com.facebook.ads.sdk.APIException.MalformedResponseException;
+
+/**
+ * This class is auto-generated.
+ *
+ * For any issues or feature requests related to this class, please let us know
+ * on github and we'll fix in our codegen framework. We'll not be able to accept
+ * pull request for this class.
+ *
+ */
+public class AdAssetFeedAdditionalData extends APINode {
+ @SerializedName("automated_product_tags")
+ private Boolean mAutomatedProductTags = null;
+ @SerializedName("brand_page_id")
+ private String mBrandPageId = null;
+ @SerializedName("is_click_to_message")
+ private Boolean mIsClickToMessage = null;
+ @SerializedName("multi_share_end_card")
+ private Boolean mMultiShareEndCard = null;
+ @SerializedName("page_welcome_message")
+ private String mPageWelcomeMessage = null;
+ protected static Gson gson = null;
+
+ public AdAssetFeedAdditionalData() {
+ }
+
+ public String getId() {
+ return null;
+ }
+ public static AdAssetFeedAdditionalData loadJSON(String json, APIContext context, String header) {
+ AdAssetFeedAdditionalData adAssetFeedAdditionalData = getGson().fromJson(json, AdAssetFeedAdditionalData.class);
+ if (context.isDebug()) {
+ JsonParser parser = new JsonParser();
+ JsonElement o1 = parser.parse(json);
+ JsonElement o2 = parser.parse(adAssetFeedAdditionalData.toString());
+ if (o1.getAsJsonObject().get("__fb_trace_id__") != null) {
+ o2.getAsJsonObject().add("__fb_trace_id__", o1.getAsJsonObject().get("__fb_trace_id__"));
+ }
+ if (!o1.equals(o2)) {
+ context.log("[Warning] When parsing response, object is not consistent with JSON:");
+ context.log("[JSON]" + o1);
+ context.log("[Object]" + o2);
+ }
+ }
+ adAssetFeedAdditionalData.context = context;
+ adAssetFeedAdditionalData.rawValue = json;
+ adAssetFeedAdditionalData.header = header;
+ return adAssetFeedAdditionalData;
+ }
+
+ public static APINodeList parseResponse(String json, APIContext context, APIRequest request, String header) throws MalformedResponseException {
+ APINodeList adAssetFeedAdditionalDatas = new APINodeList(request, json, header);
+ JsonArray arr;
+ JsonObject obj;
+ JsonParser parser = new JsonParser();
+ Exception exception = null;
+ try{
+ JsonElement result = parser.parse(json);
+ if (result.isJsonArray()) {
+ // First, check if it's a pure JSON Array
+ arr = result.getAsJsonArray();
+ for (int i = 0; i < arr.size(); i++) {
+ adAssetFeedAdditionalDatas.add(loadJSON(arr.get(i).getAsJsonObject().toString(), context, header));
+ };
+ return adAssetFeedAdditionalDatas;
+ } else if (result.isJsonObject()) {
+ obj = result.getAsJsonObject();
+ if (obj.has("data")) {
+ if (obj.has("paging")) {
+ JsonObject paging = obj.get("paging").getAsJsonObject();
+ if (paging.has("cursors")) {
+ JsonObject cursors = paging.get("cursors").getAsJsonObject();
+ String before = cursors.has("before") ? cursors.get("before").getAsString() : null;
+ String after = cursors.has("after") ? cursors.get("after").getAsString() : null;
+ adAssetFeedAdditionalDatas.setCursors(before, after);
+ }
+ String previous = paging.has("previous") ? paging.get("previous").getAsString() : null;
+ String next = paging.has("next") ? paging.get("next").getAsString() : null;
+ adAssetFeedAdditionalDatas.setPaging(previous, next);
+ if (context.hasAppSecret()) {
+ adAssetFeedAdditionalDatas.setAppSecret(context.getAppSecretProof());
+ }
+ }
+ if (obj.get("data").isJsonArray()) {
+ // Second, check if it's a JSON array with "data"
+ arr = obj.get("data").getAsJsonArray();
+ for (int i = 0; i < arr.size(); i++) {
+ adAssetFeedAdditionalDatas.add(loadJSON(arr.get(i).getAsJsonObject().toString(), context, header));
+ };
+ } else if (obj.get("data").isJsonObject()) {
+ // Third, check if it's a JSON object with "data"
+ obj = obj.get("data").getAsJsonObject();
+ boolean isRedownload = false;
+ for (String s : new String[]{"campaigns", "adsets", "ads"}) {
+ if (obj.has(s)) {
+ isRedownload = true;
+ obj = obj.getAsJsonObject(s);
+ for (Map.Entry entry : obj.entrySet()) {
+ adAssetFeedAdditionalDatas.add(loadJSON(entry.getValue().toString(), context, header));
+ }
+ break;
+ }
+ }
+ if (!isRedownload) {
+ adAssetFeedAdditionalDatas.add(loadJSON(obj.toString(), context, header));
+ }
+ }
+ return adAssetFeedAdditionalDatas;
+ } else if (obj.has("images")) {
+ // Fourth, check if it's a map of image objects
+ obj = obj.get("images").getAsJsonObject();
+ for (Map.Entry entry : obj.entrySet()) {
+ adAssetFeedAdditionalDatas.add(loadJSON(entry.getValue().toString(), context, header));
+ }
+ return adAssetFeedAdditionalDatas;
+ } else {
+ // Fifth, check if it's an array of objects indexed by id
+ boolean isIdIndexedArray = true;
+ for (Map.Entry entry : obj.entrySet()) {
+ String key = (String) entry.getKey();
+ if (key.equals("__fb_trace_id__")) {
+ continue;
+ }
+ JsonElement value = (JsonElement) entry.getValue();
+ if (
+ value != null &&
+ value.isJsonObject() &&
+ value.getAsJsonObject().has("id") &&
+ value.getAsJsonObject().get("id") != null &&
+ value.getAsJsonObject().get("id").getAsString().equals(key)
+ ) {
+ adAssetFeedAdditionalDatas.add(loadJSON(value.toString(), context, header));
+ } else {
+ isIdIndexedArray = false;
+ break;
+ }
+ }
+ if (isIdIndexedArray) {
+ return adAssetFeedAdditionalDatas;
+ }
+
+ // Sixth, check if it's pure JsonObject
+ adAssetFeedAdditionalDatas.clear();
+ adAssetFeedAdditionalDatas.add(loadJSON(json, context, header));
+ return adAssetFeedAdditionalDatas;
+ }
+ }
+ } catch (Exception e) {
+ exception = e;
+ }
+ throw new MalformedResponseException(
+ "Invalid response string: " + json,
+ exception
+ );
+ }
+
+ @Override
+ public APIContext getContext() {
+ return context;
+ }
+
+ @Override
+ public void setContext(APIContext context) {
+ this.context = context;
+ }
+
+ @Override
+ public String toString() {
+ return getGson().toJson(this);
+ }
+
+
+ public Boolean getFieldAutomatedProductTags() {
+ return mAutomatedProductTags;
+ }
+
+ public AdAssetFeedAdditionalData setFieldAutomatedProductTags(Boolean value) {
+ this.mAutomatedProductTags = value;
+ return this;
+ }
+
+ public String getFieldBrandPageId() {
+ return mBrandPageId;
+ }
+
+ public AdAssetFeedAdditionalData setFieldBrandPageId(String value) {
+ this.mBrandPageId = value;
+ return this;
+ }
+
+ public Boolean getFieldIsClickToMessage() {
+ return mIsClickToMessage;
+ }
+
+ public AdAssetFeedAdditionalData setFieldIsClickToMessage(Boolean value) {
+ this.mIsClickToMessage = value;
+ return this;
+ }
+
+ public Boolean getFieldMultiShareEndCard() {
+ return mMultiShareEndCard;
+ }
+
+ public AdAssetFeedAdditionalData setFieldMultiShareEndCard(Boolean value) {
+ this.mMultiShareEndCard = value;
+ return this;
+ }
+
+ public String getFieldPageWelcomeMessage() {
+ return mPageWelcomeMessage;
+ }
+
+ public AdAssetFeedAdditionalData setFieldPageWelcomeMessage(String value) {
+ this.mPageWelcomeMessage = value;
+ return this;
+ }
+
+
+
+
+ synchronized /*package*/ static Gson getGson() {
+ if (gson != null) {
+ return gson;
+ } else {
+ gson = new GsonBuilder()
+ .excludeFieldsWithModifiers(Modifier.STATIC)
+ .excludeFieldsWithModifiers(Modifier.PROTECTED)
+ .disableHtmlEscaping()
+ .create();
+ }
+ return gson;
+ }
+
+ public AdAssetFeedAdditionalData copyFrom(AdAssetFeedAdditionalData instance) {
+ this.mAutomatedProductTags = instance.mAutomatedProductTags;
+ this.mBrandPageId = instance.mBrandPageId;
+ this.mIsClickToMessage = instance.mIsClickToMessage;
+ this.mMultiShareEndCard = instance.mMultiShareEndCard;
+ this.mPageWelcomeMessage = instance.mPageWelcomeMessage;
+ this.context = instance.context;
+ this.rawValue = instance.rawValue;
+ return this;
+ }
+
+ public static APIRequest.ResponseParser getParser() {
+ return new APIRequest.ResponseParser() {
+ public APINodeList parseResponse(String response, APIContext context, APIRequest request, String header) throws MalformedResponseException {
+ return AdAssetFeedAdditionalData.parseResponse(response, context, request, header);
+ }
+ };
+ }
+}
diff --git a/src/main/java/com/facebook/ads/sdk/AdAssetFeedSpec.java b/src/main/java/com/facebook/ads/sdk/AdAssetFeedSpec.java
index 98393ffd..166b575a 100644
--- a/src/main/java/com/facebook/ads/sdk/AdAssetFeedSpec.java
+++ b/src/main/java/com/facebook/ads/sdk/AdAssetFeedSpec.java
@@ -43,7 +43,7 @@ public class AdAssetFeedSpec extends APINode {
@SerializedName("ad_formats")
private List mAdFormats = null;
@SerializedName("additional_data")
- private Object mAdditionalData = null;
+ private AdAssetFeedAdditionalData mAdditionalData = null;
@SerializedName("app_product_page_id")
private String mAppProductPageId = null;
@SerializedName("asset_customization_rules")
@@ -55,15 +55,15 @@ public class AdAssetFeedSpec extends APINode {
@SerializedName("call_to_action_types")
private List mCallToActionTypes = null;
@SerializedName("call_to_actions")
- private List