Skip to content

Commit

Permalink
Support for Seller-Defined Audiences for First Party Data (#366)
Browse files Browse the repository at this point in the history
* feat(user data): add ability to add user data objects #358

* feat(user data): rename methods, return user.ext.data keywords functionality #358

* feat(user data): naming convention #358
  • Loading branch information
ValentinPostindustria authored Mar 1, 2022
1 parent 6e6af4b commit bc5f8ab
Show file tree
Hide file tree
Showing 27 changed files with 479 additions and 278 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ public abstract class AdUnit {
private final Map<String, Set<String>> contextDataDictionary;
private final Set<String> contextKeywordsSet;
private ContentObject content;
private final ArrayList<DataObject> userDataObjects = new ArrayList<>();

private String pbAdSlot;

Expand Down Expand Up @@ -173,7 +174,7 @@ public void fetchDemand(@NonNull Object adObj, @NonNull OnCompleteListener liste

if (Util.supportedAdObject(adObj)) {
fetcher = new DemandFetcher(adObj);
RequestParams requestParams = new RequestParams(configId, adType, sizes, contextDataDictionary, contextKeywordsSet, minSizePerc, pbAdSlot, bannerParameters, videoParameters, content);
RequestParams requestParams = new RequestParams(configId, adType, sizes, contextDataDictionary, contextKeywordsSet, minSizePerc, pbAdSlot, bannerParameters, videoParameters, content, userDataObjects);
if (this.adType.equals(AdType.NATIVE)) {
requestParams.setNativeRequestParams(((NativeAdUnit) this).params);
}
Expand Down Expand Up @@ -249,11 +250,26 @@ public void addContextKeywords(Set<String> keywords) {
/**
* This method obtains the content for adunit, content, in which impression will appear
*/
// TODO: Rename to set
public void addContent(ContentObject content) {
public void setAppContent(ContentObject content) {
this.content = content;
}

public ContentObject getAppContent() {
return content;
}

public void addUserData(DataObject dataObject) {
userDataObjects.add(dataObject);
}

public ArrayList<DataObject> getUserData() {
return userDataObjects;
}

public void clearUserData() {
userDataObjects.clear();
}

/**
* This method allows to remove specific context keyword from adunit context targeting
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.prebid.mobile;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.json.JSONArray;
import org.json.JSONException;
Expand Down Expand Up @@ -73,7 +74,7 @@ public class ContentObject {
/**
* Array of IAB content categories that describe the content producer.
*/
@Nullable
@NonNull
private ArrayList<String> categories = new ArrayList<>();

/**
Expand Down Expand Up @@ -145,14 +146,14 @@ public class ContentObject {
/**
* Additional content data.
*/
@Nullable
private ArrayList<ContentDataObject> contentDataObjects = new ArrayList<>();
@NonNull
private ArrayList<DataObject> dataObjects = new ArrayList<>();

/**
* This object defines the producer of the content in which the ad will be shown.
*/
@Nullable
private ContentProducerObject contentProducerObject;
private ProducerObject producerObject;

/**
* @return JSONObject if at least one parameter was set; otherwise null.
Expand Down Expand Up @@ -183,21 +184,21 @@ public JSONObject getJsonObject() {
result.putOpt("language", language);
result.putOpt("embeddable", embeddable);

if (contentProducerObject != null) {
result.putOpt("producer", contentProducerObject.getJsonObject());
if (producerObject != null) {
result.putOpt("producer", producerObject.getJsonObject());
}

if (categories != null && !categories.isEmpty()) {
if (!categories.isEmpty()) {
JSONArray jsonCategories = new JSONArray();
for (String category : categories) {
jsonCategories.put(category);
}
result.putOpt("cat", jsonCategories);
}

if (contentDataObjects != null && !contentDataObjects.isEmpty()) {
if (!dataObjects.isEmpty()) {
JSONArray dataJson = new JSONArray();
for (ContentDataObject dataObject : contentDataObjects) {
for (DataObject dataObject : dataObjects) {
dataJson.put(dataObject.getJsonObject());
}
result.put("data", dataJson);
Expand Down Expand Up @@ -303,18 +304,16 @@ public void setUrl(@Nullable String url) {
this.url = url;
}

public void addCategory(@Nullable String category) {
if (categories != null && category != null) {
categories.add(category);
}
public void addCategory(@NonNull String category) {
categories.add(category);
}

@Nullable
@NonNull
public ArrayList<String> getCategories() {
return categories;
}

public void setCategories(@Nullable ArrayList<String> categories) {
public void setCategories(@NonNull ArrayList<String> categories) {
this.categories = categories;
}

Expand Down Expand Up @@ -417,106 +416,33 @@ public void setEmbeddable(@Nullable Integer embeddable) {
this.embeddable = embeddable;
}

public void addContentDataObject(@Nullable ContentDataObject contentDataObject) {
if (contentDataObjects != null && contentDataObject != null) {
contentDataObjects.add(contentDataObject);
}
public void addData(@NonNull DataObject dataObject) {
dataObjects.add(dataObject);
}

@Nullable
public ArrayList<ContentDataObject> getContentDataObjects() {
return contentDataObjects;
@NonNull
public ArrayList<DataObject> getDataList() {
return dataObjects;
}

public void setContentDataObjects(@Nullable ArrayList<ContentDataObject> contentDataObjects) {
this.contentDataObjects = contentDataObjects;
public void setDataList(@NonNull ArrayList<DataObject> dataObjects) {
this.dataObjects = dataObjects;
}

@Nullable
public ContentProducerObject getContentProducerObject() {
return contentProducerObject;
public void clearDataList() {
dataObjects.clear();
}

public void setContentProducerObject(@Nullable ContentProducerObject contentProducerObject) {
this.contentProducerObject = contentProducerObject;
@Nullable
public ProducerObject getProducer() {
return producerObject;
}

public static class ContentDataObject {

/**
* Exchange-specific ID for the data provider.
*/
@Nullable
private String id;

/**
* Exchange-specific name for the data provider.
*/
@Nullable
private String name;

/**
* Segment objects are essentially key-value pairs that convey specific units of data.
*/
@Nullable
private ArrayList<ContentSegmentObject> segments = new ArrayList<>();

public JSONObject getJsonObject() {
JSONObject result = new JSONObject();

try {
result.putOpt("id", id);
result.putOpt("name", name);

if (segments != null && !segments.isEmpty()) {
JSONArray segmentsJson = new JSONArray();
for (ContentSegmentObject segment : segments) {
segmentsJson.put(segment.getJsonObject());
}
result.put("segment", segmentsJson);
}
} catch (JSONException exception) {
LogUtil.e("ContentObject", "Can't create json data content object.");
}

return result;
}

@Nullable
public String getId() {
return id;
}

public void setId(@Nullable String id) {
this.id = id;
}

@Nullable
public String getName() {
return name;
}

public void setName(@Nullable String name) {
this.name = name;
}

public void addSegment(ContentSegmentObject contentSegmentObject) {
if (segments != null) {
segments.add(contentSegmentObject);
}
}

@Nullable
public ArrayList<ContentSegmentObject> getSegments() {
return segments;
}

public void setSegments(@Nullable ArrayList<ContentSegmentObject> segments) {
this.segments = segments;
}
public void setProducer(@Nullable ProducerObject producerObject) {
this.producerObject = producerObject;
}

public static class ContentProducerObject {
public static class ProducerObject {

/**
* Content producer or originator ID.
Expand All @@ -533,8 +459,8 @@ public static class ContentProducerObject {
/**
* Array of IAB content categories that describe the content producer.
*/
@Nullable
private List<String> categories;
@NonNull
private ArrayList<String> categories = new ArrayList<>();

/**
* Highest level domain of the content producer (e.g., “producer.com”).
Expand All @@ -551,7 +477,7 @@ public JSONObject getJsonObject() {
result.putOpt("name", name);
result.putOpt("domain", domain);

if (categories != null && !categories.isEmpty()) {
if (!categories.isEmpty()) {
JSONArray categoriesJson = new JSONArray();
for (String category : categories) {
categoriesJson.put(category);
Expand Down Expand Up @@ -584,18 +510,16 @@ public void setName(@Nullable String name) {
this.name = name;
}

public void addCategory(@Nullable String category) {
if (category != null && categories != null) {
categories.add(category);
}
public void addCategory(@NonNull String category) {
categories.add(category);
}

@Nullable
@NonNull
public List<String> getCategories() {
return categories;
}

public void setCategories(@Nullable List<String> categories) {
public void setCategories(@NonNull ArrayList<String> categories) {
this.categories = categories;
}

Expand All @@ -610,67 +534,4 @@ public void setDomain(@Nullable String domain) {

}

public static class ContentSegmentObject {

/**
* ID of the data segment specific to the data provider.
*/
@Nullable
private String id;

/**
* Name of the data segment specific to the data provider.
*/
@Nullable
private String name;

/**
* String representation of the data segment value.
*/
@Nullable
private String value;

@Nullable
public JSONObject getJsonObject() {
JSONObject result = new JSONObject();

try {
result.putOpt("id", id);
result.putOpt("name", name);
result.putOpt("value", value);
} catch (JSONException exception) {
LogUtil.e("ContentObject", "Can't create json segment content object.");
}

return result;
}

@Nullable
public String getId() {
return id;
}

public void setId(@Nullable String id) {
this.id = id;
}

@Nullable
public String getName() {
return name;
}

public void setName(@Nullable String name) {
this.name = name;
}

@Nullable
public String getValue() {
return value;
}

public void setValue(@Nullable String value) {
this.value = value;
}
}

}
Loading

0 comments on commit bc5f8ab

Please sign in to comment.